<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>The Harness</title><description>Notes on harness engineering. Harness engineering, agentic AI evaluation, and the practical work of making AI agents reliable in architecture, engineering, and construction (AEC).</description><link>https://theharness.blog/</link><item><title>Mediation, Not Intermediation</title><link>https://theharness.blog/blog/mediation-not-intermediation/</link><guid isPermaLink="true">https://theharness.blog/blog/mediation-not-intermediation/</guid><description>Why the &apos;fix your foundations before AI&apos; message has it backwards: agentic workflows are the way out of legacy data, and governance worth having is co-designed from practice, not committees.</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Figure from &apos;../../components/Figure.astro&apos;;
import Pullquote from &apos;../../components/Pullquote.astro&apos;;
import taskWorldKnot from &apos;../../assets/blog/mediation-not-intermediation/task-world-knot-tension-loom-labelled.png&apos;;&lt;/p&gt;
&lt;p&gt;Estimated reading time: 3 minutes&lt;/p&gt;
&lt;p&gt;I have seen many posts the last few weeks on the &quot;work on the foundations of [aspect] first before AI&quot; message. I thought I&apos;d write a few words on why I think this is wrong.&lt;/p&gt;
&lt;p&gt;First, let&apos;s discuss these aspects. The most popular, by far, are data and governance. The idea is simple: first solve the issues in these, to prepare the ground for efficient and responsible AI deployment. Let&apos;s go through them one by one since the reasons for each are different.&lt;/p&gt;
&lt;h2&gt;Data: The Sisyphean Foundation&lt;/h2&gt;
&lt;p&gt;Anyone who has worked with AI knows that data are very important. As we moved to agentic orchestration and harness engineering importance shifted to context, which is (ideally) structured representations of fit-for-task data. The call for action, or pause, is the following: without the right data foundations, AI deployment will suffer.&lt;/p&gt;
&lt;p&gt;Why is this wrong? Not because data are not foundational to AI. It is. But because that imaginary foundation of pristine data is unattainable. Like a modern Sisyphus, it is an uphill battle that never ends.&lt;/p&gt;
&lt;p&gt;AI allows us to build extremely valuable workflows and agents on top of partially structured or unstructured data, with great return on investment. In fact, agentic workflows are the way out of legacy data in both directions: the best tool for structuring the messy data we already have, and the way to prevent future legacy data, by creating data at the source. This is the conceptual inversion that needs to happen:&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
Harness engineering means developing agentic workflows that create high quality, structured, annotated, task specific data, at the source.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/blog/where-capability-actually-lives-in-agentic-engineering/&quot;&gt;I wrote about this previously&lt;/a&gt;: harness, benchmark, models, data, they are all parts of the same knot. Doing one, means doing all others. Developing agentic AI therefore is the best proactive approach to data engineering, that sets a solid foundation for what is coming.&lt;/p&gt;
&lt;p&gt;&amp;lt;Figure
src={taskWorldKnot}
alt=&quot;A dark diagram showing colored strands tied into a central knot between Harness, Recipes, Data Generator, Benchmark / Eval, and RL Environment labels.&quot;
caption=&quot;The knot is the point: harness, recipes, data generation, evaluation, and environment are not separate stages. Pull on one strand and the rest of the system moves.&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;Governance: Intermediation by Committee&lt;/h2&gt;
&lt;p&gt;I have, for some time now, said that one of the biggest benefits of AI is its ability to replace and remove unnecessary intermediation. All that extra layer of friction that adds hard to measure cost in almost everything we do today. I think, a lot of the work in the governance space today falls in this intermediation layer. This is obvious in every organisation that, even before they&apos;ve designed a single agent, experimented with a single harness, evaluated a single task, deployed a single product, they immerse themselves in frameworks, policies, and committees. Intermediation, aimed towards inaction.&lt;/p&gt;
&lt;p&gt;Now, this doesn&apos;t mean that governance is not important. In fact, it is not just a core layer of AI deployment but also a core design principle for agentic systems themselves. I&apos;m not referring to governance embedded in risk practice, production controls, evaluations, and accountable ownership. That is infrastructure. I&apos;m referring to governance as a separate approval theatre that delays contact with real systems. Nor does it start from a blank slate: industry domains already carry a long history of policies, governance frameworks, and risk frameworks, embedded in everything they do. These are assets, ready to be drawn on and extended for AI deployment from day one, not replaced by a parallel apparatus. Governance should be part of how AI systems are designed, how experimentation happens, how harnesses are built and agents are deployed. And that means, that it should be informed by practice and practitioners, benchmarks and evaluations, and not by committees and frameworks. Once again, the same pattern emerges: proactive not reactive. Build the systems, learn from them, and then (co-)design new governance around that experience.&lt;/p&gt;
&lt;h2&gt;High-Level Principles, Low-Level Infrastructure&lt;/h2&gt;
&lt;p&gt;High level principles and &lt;a href=&quot;/blog/executable-standards/&quot;&gt;low level infrastructure&lt;/a&gt;. That is all you really need, not just to get started but build successful, scalable, and responsible AI systems. Both should be grounded in practice and domain expertise, in access to real problems, and in the ability to iterate and learn from real-world deployments. That has been my job for as long as I can remember in this space, to bring those two together and clear the noise in between them. Mediation, not intermediation.&lt;/p&gt;
</content:encoded><author>Theodoros Galanos</author></item><item><title>Task Worlds and Meta-Harnesses</title><link>https://theharness.blog/blog/task-worlds-meta-harness/</link><guid isPermaLink="true">https://theharness.blog/blog/task-worlds-meta-harness/</guid><description>How task worlds, Badiou, Plasticity, and the AEC-Bench meta-harness turn task prose, evidence, review, governance, and repair into runnable machinery.</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import CertificateStackDiagram from &apos;../../components/charts/CertificateStackDiagram.astro&apos;;
import BearingCapacityConventionFigure from &apos;../../components/charts/BearingCapacityConventionFigure.astro&apos;;
import MetaHarnessFlowDiagram from &apos;../../components/charts/MetaHarnessFlowDiagram.astro&apos;;
import MissingWalkingSpeedFigure from &apos;../../components/charts/MissingWalkingSpeedFigure.astro&apos;;
import {
metaHarnessCertificateStack,
metaHarnessFlowSteps,
} from &apos;../../data/meta-harness-diagrams&apos;;
import {
bearingCapacityFigure,
missingWalkingSpeedFigure,
} from &apos;../../data/task-world-figures&apos;;&lt;/p&gt;
&lt;p&gt;Estimated reading time: 15 minutes&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;This essay argues that agent tasks in domains like engineering are not just
prompts or dataset rows. They are worlds: they decide what the agent can see,
which rules have authority, what counts as evidence, which failures can be
named, and what can be repaired.&lt;/p&gt;
&lt;p&gt;In order to generalise across complex engineering tasks, we need a meta-harness:
a harness that knows how to construct other harness runs. Given a new, messy
task, it can produce a problem brief and task-world profile, plan operations over
that world, run reviewer and governance layers, materialise a recipe, bind
execution evidence back through sandbox execution, and use failures to improve future world
designs.&lt;/p&gt;
&lt;p&gt;This gives us operational plasticity. Instead of hand-building a new harness for
every domain, or letting an agent improvise invisibly, the system can adapt while
keeping its decisions reviewable.&lt;/p&gt;
&lt;p&gt;In aec-bench terms, this points toward a contract-driven pipeline:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;task prose -&amp;gt; problem brief -&amp;gt; task-world profile -&amp;gt; operation/reviewer plan -&amp;gt; governed run evidence -&amp;gt; comparison ledger -&amp;gt; repair loop&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The philosophical frame of this work is based on Alain Badiou&apos;s work and
philosophical framework, but the engineering focus is concrete: make task worlds
legible enough that agents can run, fail, be audited, and reshape the harness
itself.&lt;/p&gt;
&lt;h2&gt;Tasks Are Worlds, Not Prompts&lt;/h2&gt;
&lt;p&gt;In domains where work is tied to standards, units, evidence, tools,
conventions, approvals, and liability, an agent task is more than text sent to a
model. It is a world.&lt;/p&gt;
&lt;p&gt;A task world decides what appears to the agent, which actions exist, what counts
as evidence, what counts as success, which contradictions are tolerated, which
artifacts survive review, and which failures are repairable. The score is an
output of that world. It is not the world itself.&lt;/p&gt;
&lt;p&gt;This matters most in non-IID domains. Engineering tasks, legal workflows,
clinical protocols, enterprise operations, security work, and scientific
experiments do not arrive as neat draws from one stable distribution. They come
with local conventions, partial information, conflicting sources, hidden
authority chains, and different meanings of &quot;done.&quot;&lt;/p&gt;
&lt;p&gt;Two small engineering examples make the point.&lt;/p&gt;
&lt;p&gt;In one shallow-foundation task, every numeric input was provided. A strong model
still failed because it reached for a familiar textbook formula instead of the
project-specific table the task required. The arithmetic was not the failure.
The model chose the wrong engineering convention.&lt;/p&gt;
&lt;p&gt;&amp;lt;BearingCapacityConventionFigure
title=&quot;Complete inputs, wrong convention&quot;
data={bearingCapacityFigure}
caption=&quot;The task gave every scalar input. The failure came from choosing the wrong authority for the bearing-capacity factors.&quot;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;In a pedestrian-clearance task, the distance was given but walking speed was not.
The model supplied its own walking speed, calculated a precise answer, and never
treated the missing scalar as missing. Across repeated runs it invented
different speeds. Again, the issue was not arithmetic. The issue was the
relationship between the model and the world&apos;s authority structure.&lt;/p&gt;
&lt;p&gt;&amp;lt;MissingWalkingSpeedFigure
title=&quot;Missing scalar, invented constant&quot;
data={missingWalkingSpeedFigure}
caption=&quot;The prompt omitted walking speed. Across repeated runs, the model supplied its own speed and produced confident but inconsistent crossing times.&quot;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;Those failures are small, but they expose the larger issue. Put plainly: the
model needed to know which rulebook to trust, whether it was allowed to fill in
missing facts, what answer shape mattered, and what evidence a reviewer would
need later.&lt;/p&gt;
&lt;p&gt;That is why benchmark design cannot stop at task text and expected answer.&lt;/p&gt;
&lt;p&gt;The practical thesis is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Agents operate inside worlds. If we want them to work across new problem
spaces, we need a way to describe, compose, validate, and repair those worlds.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Two ideas follow.&lt;/p&gt;
&lt;p&gt;Badiou&apos;s philosophical vocabulary gives us a sharper way to think about task
worlds: a world is not a container, but a regime of counting and appearing. The
main references here are Alain Badiou&apos;s &lt;em&gt;Being and Event&lt;/em&gt;, translated by Oliver
Feltham, and
&lt;a href=&quot;https://www.bloomsbury.com/us/logics-of-worlds-9780826494702/&quot;&gt;&lt;em&gt;Logics of Worlds&lt;/em&gt;&lt;/a&gt;,
translated by Alberto Toscano.&lt;/p&gt;
&lt;h2&gt;Eighteen Years Later&lt;/h2&gt;
&lt;p&gt;Around eighteen years ago, when I was a much younger researcher at TU Delft, I
found philosophy. I do not remember the exact path in. I only remember what
happened after: for a while, it became almost everything I did.&lt;/p&gt;
&lt;p&gt;I read Kierkegaard, Freud, Lacan, Zizek, and eventually Badiou. Zizek likes to
call Badiou &quot;the Master,&quot; usually after assigning himself the part of the
jester. The joke stuck with me, but so did the philosophy.&lt;/p&gt;
&lt;p&gt;Badiou gave me a center. His work offered a way to think about what a world is,
what it means for something to exist in that world, how change happens, how an
event breaks the old language, and how fidelity to that event can make a new
truth possible.&lt;/p&gt;
&lt;p&gt;That machinery changed how I think. It taught me to work with contradiction
rather than rush to dissolve it. It shaped the way I read systems, institutions,
technical claims, and failures. Of all the side trips of knowledge I have taken,
philosophy is probably the one that did the most damage, in the best possible
sense.&lt;/p&gt;
&lt;p&gt;So it is a strange pleasure to come back to it here, eighteen years later, for a
practical problem in agent infrastructure.&lt;/p&gt;
&lt;p&gt;The idea is simple enough to say plainly:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Harness design for novel tasks is a way to structure and reconfigure their
worlds.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is the personal reason Badiou is here. The technical reason is that his
language helps name what harnesses already do: they structure worlds.&lt;/p&gt;
&lt;p&gt;A meta-harness makes that theory operational. It composes harness layers on
demand so agents can act in new worlds without pretending every task belongs to
the same distribution.&lt;/p&gt;
&lt;h2&gt;Making Worlds Strange Again&lt;/h2&gt;
&lt;p&gt;That theory needs a careful hand. Badiou does not give us a ready-made formal
theory of agent benchmarks. Instead, he makes the word &quot;world&quot; strange again.&lt;/p&gt;
&lt;p&gt;Badiou&apos;s formalisms do not produce agent benchmarks directly. I am using his
vocabulary as a way to think about meta-harness design.&lt;/p&gt;
&lt;p&gt;Specifically, I will be leaning on &lt;em&gt;Being and Event&lt;/em&gt; for
situation[^badiou-situation], multiplicity[^badiou-multiplicity],
count-as-one[^badiou-count-as-one], event[^badiou-event], and
fidelity[^badiou-fidelity]; and on
&lt;a href=&quot;https://www.bloomsbury.com/us/logics-of-worlds-9780826494702/&quot;&gt;&lt;em&gt;Logics of Worlds&lt;/em&gt;&lt;/a&gt;
for the shift toward appearance[^badiou-appearance],
object[^badiou-object], relation[^badiou-relation],
world logic[^badiou-world-logic], and forms of
change[^badiou-forms-of-change].&lt;/p&gt;
&lt;p&gt;In a typical benchmark vocabulary, a world is a container. Put an agent in a repo,
a browser, a terminal, a spreadsheet, a simulated API, or a workplace sandbox,
and call that the world. Badiou&apos;s theory makes the question more demanding:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What operation counted this multiplicity as one world?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For agent tasks, that means asking what has been admitted into the world and
under what authority:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;which files, messages, database rows, standards, policies, logs, tools, and
traces belong;&lt;/li&gt;
&lt;li&gt;which affordances let the agent perceive or alter them;&lt;/li&gt;
&lt;li&gt;which side effects count as real;&lt;/li&gt;
&lt;li&gt;which artifacts count as proof;&lt;/li&gt;
&lt;li&gt;which failures are nameable by the current taxonomy;&lt;/li&gt;
&lt;li&gt;which parts of the work exist but do not appear to the agent, verifier,
reviewer, or generator.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A task world is more than state. It is appearance.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;agent-visible world&lt;/strong&gt; is what the model can perceive: prompt context, files,
tool outputs, shell results, browser pixels, DOM state, connector responses,
memory, logs, and schemas.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;verifier-visible world&lt;/strong&gt; is what tests, state diffs, validators, artifact
checks, policy checks, and scoring code can inspect.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;reviewer-visible world&lt;/strong&gt; is what a person can reconstruct from the retained
evidence: traces, screenshots, diffs, transcripts, output files, and
explanations.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;generator-visible world&lt;/strong&gt; is what the meta-harness can use later to mutate,
combine, restrict, repair, or retire task worlds.&lt;/p&gt;
&lt;p&gt;Badly designed worlds collapse these surfaces. The agent sees one thing, the verifier
checks another, the reviewer receives a thin final answer, and the generator
learns almost nothing from the failed run.&lt;/p&gt;
&lt;p&gt;Well designed worlds keep the visibility surfaces distinct enough that mismatches become
objects. If the agent could not see the clause, say that. If the verifier could
not inspect the artifact, say that. If the reviewer cannot reconstruct why the
field failed, say that. If the generator cannot tell which part of the world
caused the failure, the world is not yet generative.&lt;/p&gt;
&lt;p&gt;The better question for benchmark design is therefore not:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What task should we ask?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What must appear, to which authority, for this world to make a trustworthy
claim?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That sounds philosophical. It is also a harness requirement.&lt;/p&gt;
&lt;h2&gt;The Logic Of A Task World&lt;/h2&gt;
&lt;p&gt;Once a task world is treated as a regime of appearance, the next question is how
statements inside that world become accepted. The agent says an artifact was
created. The verifier says a field passed. A reviewer says the answer follows
the right method. The run certificate says a result can be trusted. A task world
needs rules for how those statements become valid enough to act on.&lt;/p&gt;
&lt;p&gt;Appearance alone is not enough. The world must know when a statement is
settled, when it needs a witness, when it is only partially supported, and when
contradictory evidence can be held without corrupting the run.&lt;/p&gt;
&lt;p&gt;The harness name for that translation is a logic profile.&lt;/p&gt;
&lt;p&gt;A realistic task world needs three kinds of logical gates.&lt;/p&gt;
&lt;p&gt;The first is &lt;strong&gt;closure&lt;/strong&gt;. Closure borrows from
&lt;a href=&quot;https://plato.stanford.edu/entries/logic-classical/&quot;&gt;classical logic&lt;/a&gt;: the
world asks for a clean decision about a proposition. Some propositions should
be decidable inside the world:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the file exists or it does not;&lt;/li&gt;
&lt;li&gt;the schema validates or it does not;&lt;/li&gt;
&lt;li&gt;the test passes or it fails;&lt;/li&gt;
&lt;li&gt;the required approval exists or it does not;&lt;/li&gt;
&lt;li&gt;the forbidden side effect occurred or it did not.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Closure gates end ambiguity. They are right for machine-verifiable invariants,
exact artifacts, permission boundaries, and state assertions. This is where the
argument from &lt;a href=&quot;/blog/executable-standards/&quot;&gt;Executable Standards&lt;/a&gt; enters the
world layer: obligations become more useful to agents when they stop living
only as prose and become predicates a verifier can run.&lt;/p&gt;
&lt;p&gt;The second is &lt;strong&gt;construction&lt;/strong&gt;. Construction borrows from
&lt;a href=&quot;https://plato.stanford.edu/entries/logic-intuitionistic/&quot;&gt;intuitionistic logic&lt;/a&gt;
in the practical sense that a statement counts only when the run can produce a
witness for it. Before the witness exists, the useful state may be
not-yet-proven rather than true or false.&lt;/p&gt;
&lt;p&gt;&quot;No failing test was found&quot; is not the same as &quot;the required artifact was
produced.&quot; &quot;The model described a JSON object&quot; is not the same as &quot;the JSON file
exists where the verifier can inspect it.&quot; &quot;No reviewer objected&quot; is not the
same as &quot;review evidence exists.&quot;&lt;/p&gt;
&lt;p&gt;Badiou&apos;s intensities of appearance matter here. Some things in a task world do
not simply exist or not exist. They appear weakly, partially, or fully. A rubric
item can be absent, weakly evidenced, partly satisfied, or satisfied. An LLM
judge is a practical version of this graded appearance if its score, rubric,
model, cited evidence, and rationale are preserved as witness material. It is
not an oracle. It is an evidence-producing component inside the world.&lt;/p&gt;
&lt;p&gt;Construction gates are right for reports, patches, manifests, validator output,
durable run records, review approvals, generated datasets, and any claim that
should not pass by absence of disproof.&lt;/p&gt;
&lt;p&gt;The third is &lt;strong&gt;containment&lt;/strong&gt;. Containment borrows from
&lt;a href=&quot;https://plato.stanford.edu/entries/logic-paraconsistent/&quot;&gt;paraconsistent logic&lt;/a&gt;
in the practical sense that contradiction is treated as local evidence to be
scoped, not a reason for the whole run to collapse. Real task worlds contain
contradictions. Source documents conflict. Runtime behavior disagrees with docs.
Two agents diagnose different harness layers. A score says failure because the
verifier did not find &lt;code&gt;report.json&lt;/code&gt;, while the filesystem trace shows the agent
wrote the required report to a different output path. A policy blocks mutation
through one channel while another channel permits an equivalent state change.&lt;/p&gt;
&lt;p&gt;Containment gates localize contradiction. The world records it with scope,
source, affected claims, and allowed next actions.&lt;/p&gt;
&lt;p&gt;This is the compact logic profile:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;closure: what can be decided cleanly?
construction: what must be witnessed, and with what strength, before it counts?
containment: what contradictions can be held without corrupting the run?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That profile is not decorative metadata. It changes the run.&lt;/p&gt;
&lt;p&gt;If a task world has no closure gates, it is too vague to score. If it has no
construction gates, it rewards unsupported claims. If it has no containment
gates, every contradiction gets flattened into pass, fail, or confusion.&lt;/p&gt;
&lt;p&gt;A world card should therefore declare its logic profile:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;logic_profile:
  closure_gates:
    - proposition: &quot;required artifact exists&quot;
      authority: &quot;filesystem&quot;
      failure_effect: &quot;run_invalid&quot;
    - proposition: &quot;schema validates&quot;
      authority: &quot;schema_validator&quot;
      failure_effect: &quot;run_invalid&quot;
  construction_gates:
    - proposition: &quot;answer is supported by preserved evidence&quot;
      required_witnesses: [&quot;artifact&quot;, &quot;trace_pointer&quot;, &quot;source_span&quot;]
      acceptance: &quot;all required witnesses present&quot;
      failure_effect: &quot;claim_unproven&quot;
    - proposition: &quot;rubric item is satisfied&quot;
      required_witnesses: [&quot;rubric_score&quot;, &quot;judge_rationale&quot;, &quot;cited_evidence&quot;]
      acceptance: &quot;score &amp;gt;= threshold with preserved rationale&quot;
      failure_effect: &quot;review_required&quot;
  containment_gates:
    - contradiction: &quot;source and verifier disagree&quot;
      required_record: [&quot;sources&quot;, &quot;affected_claims&quot;, &quot;allowed_next_actions&quot;]
      failure_effect: &quot;world_needs_repair_if_unscoped&quot;
    - contradiction: &quot;trace and score disagree&quot;
      required_record: [&quot;trace_pointer&quot;, &quot;score_field&quot;, &quot;diagnosis&quot;]
      failure_effect: &quot;world_needs_repair_if_unscoped&quot;
  event_triggers:
    - &quot;unclassifiable failure mode&quot;
    - &quot;score artifact contradiction&quot;
    - &quot;side effect through unmodeled channel&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those entries are not merely prompts to an agent. They are declarations that
split responsibility. In aec-bench terms, a richer world description would carry
this profile beside the task-world profile: closure gates become verifier or artifact
checks, construction gates become required evidence and review packets,
containment gates become contradiction-ledger records, and event triggers become
candidates for schema, verifier, evidence, governance, or generator repair.&lt;/p&gt;
&lt;p&gt;In code, this deliberately uses plain field names rather than philosophical
labels. The contract is a &lt;code&gt;TaskWorldProfile&lt;/code&gt; with &lt;code&gt;logic_profile&lt;/code&gt; fields such as
&lt;code&gt;closure_gates&lt;/code&gt;, &lt;code&gt;construction_gates&lt;/code&gt;, &lt;code&gt;containment_gates&lt;/code&gt;, &lt;code&gt;event_triggers&lt;/code&gt;, and
&lt;code&gt;agentic_review&lt;/code&gt;. The same profile also carries an &lt;code&gt;operation_profile&lt;/code&gt; for
subset, difference, projection, and product handles. The conceptual terms stay
in the essay. The execution contract stays reviewable.&lt;/p&gt;
&lt;p&gt;Deterministic code should own the parts that can be made mechanical: contract
validation, hard artifact checks, schema checks, required witness collection,
ledger recording, and target emission. Agentic orchestration should own the
parts that remain open-world: interpreting weak evidence, reading judge
rationales, deciding whether a contradiction matters, proposing a repair, and
choosing which harness reconfiguration to attempt next.&lt;/p&gt;
&lt;p&gt;That is the meta-harness boundary. Code makes the admissible moves explicit but
agents reason over the evidence and decide which move to try. The goal is not
to cover every case with heuristics, but to preserve enough structure and
evidence that open-world judgement can act without becoming invisible.&lt;/p&gt;
&lt;p&gt;A task world is not merely a bundle of files and tests. It is structured by
logic. It says how the world decides, how it proves, how it survives
contradiction, and how it knows when its own language has failed.&lt;/p&gt;
&lt;h2&gt;Failure Is A World Relation&lt;/h2&gt;
&lt;p&gt;Once the world has logic, failure stops being a single category.&lt;/p&gt;
&lt;p&gt;A low score is not automatically a model defect. The same score can come from
many failures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the model used the wrong method;&lt;/li&gt;
&lt;li&gt;retrieval exposed the wrong source;&lt;/li&gt;
&lt;li&gt;a unit binding failed;&lt;/li&gt;
&lt;li&gt;the output contract rejected the shape;&lt;/li&gt;
&lt;li&gt;the verifier checked the wrong proposition;&lt;/li&gt;
&lt;li&gt;the task hid a required assumption;&lt;/li&gt;
&lt;li&gt;the harness failed to preserve the needed evidence;&lt;/li&gt;
&lt;li&gt;governance blocked a necessary action;&lt;/li&gt;
&lt;li&gt;the world contained a contradiction the schema failed to represent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those failures need different repairs. Model weakness is only one possibility.
Sometimes the agent needs a better tool. Sometimes the verifier needs a new
field. Sometimes the task wording needs to expose missing information. Sometimes
the output contract is too brittle. Sometimes the world itself counted the wrong
multiplicity.&lt;/p&gt;
&lt;p&gt;This is why provenance belongs inside the harness.&lt;/p&gt;
&lt;p&gt;Observability is often treated as something added after the run. For task
worlds, observability is part of the world. The world decides which traces
exist, which artifacts are durable, which side effects are visible, which claims
have witnesses, and which authorities inspect which evidence.&lt;/p&gt;
&lt;p&gt;Reward has the same problem. A scalar score looks clean, but reward is an
engineering artifact. It contains assumptions, tolerances, field bindings,
authority choices, and blind spots.&lt;/p&gt;
&lt;p&gt;The diagnostic triangle is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;raw output: what the model actually wrote;&lt;/li&gt;
&lt;li&gt;verifier rule: what the scoring code expected;&lt;/li&gt;
&lt;li&gt;semantic behavior: what the answer means in context.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When those disagree, the repair target is not obvious. Evidence determines
whether the fault lives in the prompt, task, verifier, schema, evidence rule,
governance policy, or world shape. Without preserved evidence, every diagnosis
becomes a story told after the fact.&lt;/p&gt;
&lt;p&gt;Task worlds therefore need evidence contracts: rules for what must survive
before a result can be trusted, debugged, or repaired.&lt;/p&gt;
&lt;h2&gt;Events Force New World Language&lt;/h2&gt;
&lt;p&gt;Ordinary failure is nameable inside the current world.&lt;/p&gt;
&lt;p&gt;The schema was malformed. The required file was missing. The test failed. The
wrong unit was used. The reviewer rejected the output. These failures can be
serious, but the world already knows how to classify them.&lt;/p&gt;
&lt;p&gt;An Event, in this engineering translation of Badiou, is different. A harness
Event is a trace that the current world cannot adequately name, but that is
important enough to force a new distinction into the world generator.&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the benchmark score says failure because an expected output was missing, but
durable artifacts show the agent created the required file in an unmodeled
location;&lt;/li&gt;
&lt;li&gt;the model appears incapable until raw output shows it was trapped by an
invisible protocol mismatch;&lt;/li&gt;
&lt;li&gt;a permission policy forbids shell mutation, but equivalent mutation happens
through file-edit affordances;&lt;/li&gt;
&lt;li&gt;a generated task passes tests while damaging a state dimension the verifier
never inspected;&lt;/li&gt;
&lt;li&gt;a reward rule rejects an answer a domain reviewer would accept, or accepts an
answer a domain reviewer would reject.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each case shows a world whose evaluative language was inadequate.&lt;/p&gt;
&lt;p&gt;Fidelity is the repair discipline after such a trace. Do not smooth it away. Do
not file it under generic model failure. Name the anomaly, decide which layer
failed, add the missing distinction, rerun the affected world and nearby
regression worlds, and preserve the lineage.&lt;/p&gt;
&lt;p&gt;That gives a stronger interpretation of harness evolution:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Evental traces force new distinctions into the world generator.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The same trace should also change downstream agentic action. Once the anomaly
has a name, an agent is not merely asked to try again inside the old world. It
gets a revised action space: gather missing evidence, route to reviewer, patch a
verifier, rebind an output path, tighten a permission model, compose a different
evidence rule, or rerun nearby worlds.&lt;/p&gt;
&lt;p&gt;That is a higher bar than &quot;let an agent improve the harness.&quot; Fidelity becomes
an action policy: preserve the trace, act through named repair moves, and make
the next run test whether the new distinction holds. This protects against the
lazy improvement loop where every failure becomes a broader prompt, a looser
verifier, or a special case.&lt;/p&gt;
&lt;p&gt;The harder repair question is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What did this failure make visible that the previous world could not name?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That question is the beginning of innovation. Not novelty as decoration, but a
new distinction that changes what future worlds can see, decide, prove, and
repair.&lt;/p&gt;
&lt;h2&gt;Static Harnesses Are Too Rigid&lt;/h2&gt;
&lt;p&gt;If task worlds vary this much, static harnesses become a bottleneck.&lt;/p&gt;
&lt;p&gt;A fixed harness assumes the important parts of the world are already known:
the input form, tool surface, context policy, output contract, verifier,
evidence rules, permission model, and repair path. That is fine for a stable
benchmark family. It is brittle when new problem spaces keep arriving.&lt;/p&gt;
&lt;p&gt;Non-IID domains need Plasticity.[^malabou-plasticity] Not chaos. Plasticity.&lt;/p&gt;
&lt;p&gt;New problem spaces often need different context loaders, decomposition
patterns, verifier families, evidence contracts, permission boundaries,
construction gates, or contradiction policies.&lt;/p&gt;
&lt;p&gt;If those choices are hand-built every time, the system does not scale. If those
choices are hidden inside an agent&apos;s free-form reasoning, the system cannot be
trusted. We need a layer between those extremes: a meta-harness.&lt;/p&gt;
&lt;p&gt;A meta-harness does not treat the harness as fixed background machinery. It
treats harness composition as the task.&lt;/p&gt;
&lt;p&gt;Given a new problem space, it asks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what kind of world is this?&lt;/li&gt;
&lt;li&gt;what must appear, and to whom?&lt;/li&gt;
&lt;li&gt;what can be decided by closure?&lt;/li&gt;
&lt;li&gt;what requires constructed evidence?&lt;/li&gt;
&lt;li&gt;what contradictions must be contained?&lt;/li&gt;
&lt;li&gt;which operations over the world are allowed?&lt;/li&gt;
&lt;li&gt;which reviewer, governance, and evidence layers are needed?&lt;/li&gt;
&lt;li&gt;which run surface should materialise the result?&lt;/li&gt;
&lt;li&gt;which approvals are needed?&lt;/li&gt;
&lt;li&gt;what evidence must survive for repair?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the layer of operational plasticity agents need. It lets the system
adapt to new worlds while keeping the adaptation legible.&lt;/p&gt;
&lt;h2&gt;Meta-Harness As Operational Plasticity&lt;/h2&gt;
&lt;p&gt;The meta-harness operating principle is compact: AI proposes; contracts
structure; validators check; diagnostics explain; governance gates;
emitters write artifacts; execution is explicit; and the ledger remembers.&lt;/p&gt;
&lt;p&gt;AI is useful where the world is open-ended: interpreting a messy problem
brief, finding similar worlds, choosing candidate operation paths, proposing a
workflow, explaining a compatibility failure, or drafting a scoped repair.&lt;/p&gt;
&lt;p&gt;The deterministic layer is useful where the system must not improvise:
contract validation, schema checks, operation-handle application, evidence
collection, governance gates, artifact emission, and ledger recording.&lt;/p&gt;
&lt;p&gt;The agent and harness have different jobs.&lt;/p&gt;
&lt;p&gt;Agents search. Contracts make proposals writable. Harness-owned code checks
whether the proposed process fits. Diagnostics tell the agent or reviewer why it
did not fit. Governance decides whether the run can proceed. Emitters produce
concrete artifacts. Execution happens as a separate act. The ledger preserves
what happened so failures can become repair material.&lt;/p&gt;
&lt;p&gt;The result is a controlled way to compose and configure harness layers on
demand.&lt;/p&gt;
&lt;p&gt;&amp;lt;MetaHarnessFlowDiagram
title=&quot;Meta-harness composition loop&quot;
steps={metaHarnessFlowSteps}
caption=&quot;The meta-harness turns a problem description into a composed, checked, governed, and recorded harness run. Repair evidence feeds back into future compositions.&quot;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;That diagram is the practical form of the philosophical argument. Worlds are not
static containers. They are structures that can be described, assembled,
tested, contradicted, repaired, and reused.&lt;/p&gt;
&lt;h2&gt;What This Looks Like In aec-bench&lt;/h2&gt;
&lt;p&gt;The current AEC-Bench implementation is still early, but it is no longer only a
sketch. The contracts are specific enough to review, and the workflow can be
driven from the library or CLI.&lt;/p&gt;
&lt;p&gt;The core translation is now:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;task prose -&amp;gt; ProblemSpaceBrief -&amp;gt; TaskWorldProfile -&amp;gt; logic and operation profiles -&amp;gt; reviewer/governance packets -&amp;gt; recipe workspace -&amp;gt; run evidence and ledger&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The input is what someone asks for. The brief names the objective, task request,
evidence requirements, pressure points, and governance constraints. The
&lt;code&gt;TaskWorldProfile&lt;/code&gt; keeps the task unit, logic profile, and operation profile
together. The reviewer layer inspects run evidence after the verifier. The
operation orchestrator plans deterministic operations where handles exist and
records agentic proposals where they do not. Governance decides whether a
proposal is run-only, a world-schema change, or a world-generator change.&lt;/p&gt;
&lt;p&gt;The main recipe command is deliberately script-shaped:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;aec-bench meta-harness recipe \
  --task-file task.md \
  --baseline-world baseline-world.json \
  --baseline-run baseline-run.json \
  --candidate-world candidate-world.json \
  --candidate-run candidate-run.json \
  --output artefacts/meta-harness/demo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It writes &lt;code&gt;recipe.json&lt;/code&gt;, &lt;code&gt;run_recipe.sh&lt;/code&gt;, &lt;code&gt;compare_candidate.py&lt;/code&gt;, and a README.
Once baseline and candidate evidence exist, the generated comparison script
writes &lt;code&gt;comparison/comparison.json&lt;/code&gt; and &lt;code&gt;comparison/comparison.md&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here is one concrete case. A benchmark run fails. The model may have used the
wrong method, or the verifier may have looked for &lt;code&gt;report.json&lt;/code&gt; while the agent
wrote the required evidence somewhere else. The meta-harness needs a small
diagnosis world around that run: what evidence can be inspected, what actions
are allowed, what result should be produced, and what repair evidence must
survive.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;task_world:
  world_id: benchmark-operations.diagnosis
  name: Harbor trial diagnosis
  task_unit: harbor_trial
  logic_profile:
    closure_gates:
      - id: required_agent_output_exists
        evidence_key: artifacts.agent/output.md
        authority: filesystem
        failure_effect: run_invalid
    construction_gates:
      - id: repair_plan_has_witnesses
        construction_required:
          - trial_record
          - verifier_artifact
          - trace_pointer
        failure_effect: claim_unproven
    containment_gates:
      - id: verifier_artifact_disagreement
        contradiction: &quot;verifier failed but durable artifact exists&quot;
        required_record:
          - trace_pointer
          - score_field
          - diagnosis
        failure_effect: governance_review
    event_triggers:
      - id: verifier_language_gap
        repair_targets:
          - verifier
          - schema
          - evidence
    agentic_review:
      required: true
      review_modes:
        - verifier_result
        - output_artifacts
        - trace
        - contradiction_ledger
  operation_profile:
    projection_axes:
      - artifact_evidence
      - governance
    difference_axes:
      - verifier_surface
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In plain terms: this is not &quot;ask a model to debug the run.&quot; It is a reusable
harness for a specific kind of post-run work. It gives an agent the trial
records and verifier evidence, asks for a failure classification and a scoped
repair plan, and requires durable artifacts so a reviewer can see why the repair
was proposed.&lt;/p&gt;
&lt;p&gt;The operation orchestrator makes the autonomous part explicit. It gives an agent
an environment, principles, tools, expected artifacts, and examples. The agent
may propose a plan, but harness-owned code applies deterministic operations or
records proposals. If a projection, difference, subset, or product operation
cannot be applied from declared handles, the result is not hidden mutation. It is
an orchestration request or a bounded proposal with evidence references.&lt;/p&gt;
&lt;p&gt;There is an important negative space here: this is not yet a universal component
catalogue or harness compiler. The implemented surface is narrower and more
useful: typed world profiles, deterministic operation handles, reviewer
artifacts, governance decisions, Harbor import, recipe materialisation, bounded
autonomy, and a ledger.&lt;/p&gt;
&lt;p&gt;A public API can stay small: send task prose, optional attachments, existing
baseline and candidate evidence, and model endpoint configs; get back a problem
brief, task-world profile request, reviewer packet, operation plan, governance
outcome, recipe workspace, comparison result, and ledger reference.&lt;/p&gt;
&lt;p&gt;This is what keeps Plasticity from becoming ad hoc generation. The system can
change shape while preserving a structure that someone can review.&lt;/p&gt;
&lt;p&gt;Good diagnostics are what let agents participate without hiding the decision.&lt;/p&gt;
&lt;h2&gt;From Run To Certificate&lt;/h2&gt;
&lt;p&gt;The trusted output of this system is not a leaderboard row.&lt;/p&gt;
&lt;p&gt;It is a certificate.&lt;/p&gt;
&lt;p&gt;A certificate is a bounded record of what survived the run. It binds three things:
what was attempted, what evidence was preserved, and what result can be trusted.&lt;/p&gt;
&lt;p&gt;For an ordinary task world, that means binding four things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;task and inputs;&lt;/li&gt;
&lt;li&gt;agent and tools;&lt;/li&gt;
&lt;li&gt;output and verifier result;&lt;/li&gt;
&lt;li&gt;traces, hashes, and review evidence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A meta-harness run needs a larger certificate because the harness itself was
composed during the run.&lt;/p&gt;
&lt;p&gt;&amp;lt;CertificateStackDiagram
title=&quot;Meta-harness certificate stack&quot;
stack={metaHarnessCertificateStack}
caption=&quot;A meta-harness certificate records the composition and governance of the harness, then wraps the ordinary task-run evidence produced by the executed or imported run.&quot;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;Using the existing Harbor machinery, aec-bench can take a natural-language input
and stage a problem-space brief task. It can generate or review a task-world
profile, run post-verifier reviewer layers over workspace or Harbor evidence,
ask the operation orchestrator for a plan, apply governance, materialise a
comparison recipe, and import Harbor trial records back into a &lt;code&gt;task_run&lt;/code&gt;
evidence object.&lt;/p&gt;
&lt;p&gt;The autonomous runner is bounded rather than magical. It stops on max
iterations, cost, stagnation, governance gates, or missing artifacts. Missing
inputs pause the process instead of being invented.&lt;/p&gt;
&lt;p&gt;This is what makes harness composition reviewable.&lt;/p&gt;
&lt;p&gt;The certificate can be a sidecar file, ledger entry, manifest, report, or bundle
of linked artifacts. The format matters less than reconstruction. A reviewer
should be able to see what world was built, which harness was composed, why it
was allowed to run, what happened, and what evidence supports the result.&lt;/p&gt;
&lt;p&gt;That evidence can then be reused. A run can become a verifier result, audit
label, dataset row, training example, recipe update, or repair target. The model
is not the only thing that learns. The world generator, operation profiles,
reviewer layer, and ledger also accumulate distinctions that future runs can
use.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Put simply:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Agents need worlds, and worlds need harnesses that can change.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In domains such as engineering and design, this becomes more specific:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In non-IID domains, capability depends on whether
we can compose the right world around the task.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That does not make the model unimportant. The model still matters enormously.
But the model acts through a world: what it can see, what it can touch, what it
must prove, what contradictions it can hold, which failures can be named, and
which evidence survives.&lt;/p&gt;
&lt;p&gt;Badiou helps us stop treating &quot;world&quot; as a container. A task world counts a
multiplicity, regulates appearance, creates decision points, requires witness
artifacts, contains contradictions, and sometimes encounters traces its current
language cannot name.&lt;/p&gt;
&lt;p&gt;The meta-harness turns that into machinery. It describes the world, evaluates
profiles, runs review and governance loops, materialises comparison recipes,
records what happened, and feeds repair evidence back into the next composition.&lt;/p&gt;
&lt;p&gt;That is the layer of plasticity I think agent systems need.&lt;/p&gt;
&lt;p&gt;Not infinite autonomy. Not static evals. A compositional layer where new task
worlds can be made legible enough to run, inspect, trust, and change.&lt;/p&gt;
&lt;p&gt;The model is not the only thing learning.&lt;/p&gt;
&lt;p&gt;The harness now has a place to remember.&lt;/p&gt;
&lt;p&gt;[^badiou-situation]: A situation is a structured presentation: a way in which a
multiplicity is gathered and made intelligible as a domain. In this essay, a
task world is situation-like because it gathers files, tools, rules, traces,
evidence, and success criteria into one operational setting.&lt;/p&gt;
&lt;p&gt;[^badiou-multiplicity]: Multiplicity names Badiou&apos;s refusal to begin from a
pre-given One. A task world begins the same way: as many heterogeneous
things before the harness gives them boundary, order, and relevance.&lt;/p&gt;
&lt;p&gt;[^badiou-count-as-one]: The count-as-one is the operation that lets a
multiplicity appear as one situation. For harness design, this is the
boundary-making act that says which artifacts, affordances, authorities, and
claims belong to this task world.&lt;/p&gt;
&lt;p&gt;[^badiou-event]: An event is a rupture that the existing situation cannot fully
name using its old categories. In meta-harness terms, an event is the kind
of failure or trace that exposes a missing distinction in the world itself,
not merely a mistake by the agent.&lt;/p&gt;
&lt;p&gt;[^badiou-fidelity]: Fidelity is the continued work of drawing consequences from
an event rather than treating it as noise. In this article, fidelity becomes
repair discipline: preserving the trace, naming the new distinction, and
changing the harness so the world can account for it next time.&lt;/p&gt;
&lt;p&gt;[^badiou-appearance]: Appearance is the question of how something shows up in a
world, and with what force or consequence. For task worlds, this becomes the
split between what appears to the agent, the verifier, the reviewer, and the
generator.&lt;/p&gt;
&lt;p&gt;[^badiou-object]: An object is not an isolated thing; it appears within a world
with identity, difference, and relations. In a harness, an object may be a
file, claim, tool, artifact, side effect, or evidence record whose meaning
depends on the world that presents it.&lt;/p&gt;
&lt;p&gt;[^badiou-relation]: Relation names how objects are connected, compared,
distinguished, or made consequential inside a world. In a task world, this
includes dependencies, permissions, provenance, authority chains, and the
links between evidence and claims.&lt;/p&gt;
&lt;p&gt;[^badiou-world-logic]: World logic is the local order that governs appearing:
what can show up, how strongly it counts, and how differences matter. In
meta-harness terms, it becomes the run logic that decides what can be
closed, what must be witnessed, and what contradiction can be contained.&lt;/p&gt;
&lt;p&gt;[^badiou-forms-of-change]: Forms of change refer to different ways a world can
be modified, from ordinary variation to stronger transformations that alter
what the world can recognize. For harnesses, this is the difference between
adjusting parameters, repairing a verifier, adding a missing evidence
relation, or composing a new world shape.&lt;/p&gt;
&lt;p&gt;[^malabou-plasticity]: I am borrowing the capital-P sense of Plasticity from
Catherine Malabou&apos;s work, especially &lt;em&gt;The Future of Hegel&lt;/em&gt;, &lt;em&gt;What Should We
Do with Our Brain?&lt;/em&gt;, &lt;em&gt;The Ontology of the Accident&lt;/em&gt;, and
&lt;a href=&quot;https://cup.columbia.edu/book/plasticity-at-the-dusk-of-writing/9780231145244&quot;&gt;&lt;em&gt;Plasticity at the Dusk of Writing&lt;/em&gt;&lt;/a&gt;.
Malabou&apos;s plasticity is not mere flexibility. It is the capacity to receive
form, give form, and sometimes break or destroy form. In this essay,
meta-harness Plasticity means a harness layer that can be shaped by a new
task world, actively reshape its own composition, and abandon an old form
when an Event shows that the old world language no longer works.&lt;/p&gt;
</content:encoded><author>Theodoros Galanos</author></item><item><title>Plausible Answers, Failed Workflows</title><link>https://theharness.blog/blog/plausible-answers-failed-workflows/</link><guid isPermaLink="true">https://theharness.blog/blog/plausible-answers-failed-workflows/</guid><description>An AEC-Bench release evaluation read as workflow reliability, not prose quality. Chapter by chapter: why a model can produce a plausible answer and still fail the durable record a project has to audit.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import ModelScoreStrip from &apos;../../components/charts/ModelScoreStrip.astro&apos;;
import RewardHeatmap from &apos;../../components/charts/RewardHeatmap.astro&apos;;
import FailureBars from &apos;../../components/charts/FailureBars.astro&apos;;
import FlowDiagram from &apos;../../components/charts/FlowDiagram.astro&apos;;
import Pullquote from &apos;../../components/Pullquote.astro&apos;;
import Sidenote from &apos;../../components/Sidenote.astro&apos;;
import {
readbackPipelineData,
readbackModelStripData,
readbackHeatmapData,
readbackFailureData,
governancePipelineData,
governanceModelStripData,
governancePairData,
toolResultHeatmapData,
monitoringHeatmapData,
toolResultFailureData,
monitoringFailureData,
closeoutPipelineData,
closeoutModelStripData,
closeoutPairData,
shardHeatmapData,
migrationHeatmapData,
shardFailureData,
migrationFailureData,
groundingPipelineData,
citationDrawingPairData,
drawingModelStripData,
citationTaskHeatmapData,
drawingTaskHeatmapData,
citationFailureData,
drawingFailureData,
styleTransferPipelineData,
styleRecordRepairPairData,
styleModelStripData,
recordTaskHeatmapData,
repairTaskHeatmapData,
recordFailureData,
repairFailureData,
retryArtifactPipelineData,
scaffoldLadderData,
scaffoldMatrixData,
scaffoldSplitData,
verifierRetryFailureData,
scaffoldReductionFailureData,
} from &apos;../../data/aec-bench-release-charts&apos;;&lt;/p&gt;
&lt;p&gt;Estimated reading time: 36 minutes&lt;/p&gt;
&lt;p&gt;The simplest way to read a model evaluation is to ask which model won.&lt;/p&gt;
&lt;p&gt;For engineering agents, that is not enough.&lt;/p&gt;
&lt;p&gt;Engineering work is not only a question-answering problem. An agent has to read a brief, find the right quantities, decide whether to reach for a tool, preserve the source it was given, write something durable, and return an answer another system can check. The score at the end is a compression of all of that. Read only the score and you lose the part that actually predicts whether the agent is safe to put in a workflow.&lt;/p&gt;
&lt;p&gt;This post reads one such evaluation the other way around. It draws on a recent release sweep across the benchmark, organised as a sequence of chapters. Each chapter takes one group of related tasks, looks past the single reward number, and asks a narrower question: not &lt;em&gt;was the answer right&lt;/em&gt;, but &lt;em&gt;did the workflow survive the model&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
A model can produce a plausible answer and still fail the workflow.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;p&gt;That sentence is the recurring distinction across every chapter. The hard part is rarely whether the model knows the right answer. It is whether the model preserves source truth, writes durable artifacts, follows control boundaries, keeps state aligned, and produces evidence that another system can verify.&lt;/p&gt;
&lt;p&gt;This is a quality-assurance lens, not an intelligence test. We start where the gap is widest.&lt;/p&gt;
&lt;h2&gt;What&apos;s coming&lt;/h2&gt;
&lt;p&gt;Six chapters, one moving question — &lt;em&gt;did the workflow survive the model?&lt;/em&gt; — asked at six escalating points in an engineering agent&apos;s job:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Readback Is Not a Receipt&lt;/strong&gt; — can the model leave a durable, self-consistent record at all? Mostly not: the best model sits at 0.70 on tasks that are not, on paper, hard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evidence Is Not Authority&lt;/strong&gt; — can it decide which signal is allowed to govern a decision, and record why? The judgment is usually fine; the provenance fields are where it slips.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Closeout Is a Dependency Claim&lt;/strong&gt; — can it keep a whole dependency graph straight when many required items must clear at once? It gets the verdict and drops the lineage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evidence Has Coordinates&lt;/strong&gt; — can it bind an answer to the exact source or coordinate frame? The first place the strong models simply pass — a clean floor test.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Style Is Not a Waiver&lt;/strong&gt; — can it rewrite a document for a new audience without quietly laundering the risk inside it? Yes for the prose; the audit artifact is the hard part.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feedback Is Not Execution&lt;/strong&gt; — when the workflow says a file is missing, does it write the file or just claim it did? Retry helps only when execution is made observable.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The thread through all six: a plausible answer is cheap, and the models that lead this benchmark are the ones that treat the durable artifact — not the chat reply — as the real deliverable. The conclusion pulls the cross-cutting findings together.&lt;/p&gt;
&lt;h2&gt;Chapter 1 — Readback Is Not a Receipt&lt;/h2&gt;
&lt;p&gt;The first task group is deliberately small: an anomaly-review exercise built around readback&amp;lt;Sidenote&amp;gt;Readback means re-opening a record you just wrote and confirming, field by field, that it matches what you decided — the audit equivalent of a control-room operator repeating an instruction back to prove it landed.&amp;lt;/Sidenote&amp;gt;. Six models, six review tasks, thirty-six trials in total.&lt;/p&gt;
&lt;p&gt;Each model receives a small review packet[^packet] — a policy, the underlying source records, a draft analysis, a review request, and a note applying pressure to just approve it — and has to decide whether the draft can be released. That decision is the easy part. The actual test is what happens after it.&lt;/p&gt;
&lt;p&gt;The model has to write a structured review record, then read that record back into a separate check, and finish with a short quality-assurance note whose fields agree with both. The answer has to survive as files on disk, not just as text in the reply.&lt;/p&gt;
&lt;p&gt;&amp;lt;FlowDiagram {...readbackPipelineData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;There are three places to lose credit, and only the first is about engineering judgment. The other two are about whether the judgment became governed project state: a record with exact IDs, an owner, a fingerprint, and a readback that genuinely matches the record it claims to check.&lt;/p&gt;
&lt;h3&gt;Result snapshot&lt;/h3&gt;
&lt;p&gt;Across 36 trials the mean reward was 0.412. The strongest model, &lt;code&gt;gpt-5-3-chat&lt;/code&gt;, averaged 0.695. No model came close to topping out a group of tasks that, on paper, is not hard.&lt;/p&gt;
&lt;p&gt;&amp;lt;ModelScoreStrip {...readbackModelStripData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The strong models all entered the right workflow shape: a compact final answer, a record file, a readback file. Their misses were dull — owners, fingerprints, exact evidence IDs. The interesting rows are at the bottom.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gpt-oss-120b&lt;/code&gt; mostly failed at runtime: five of six trials never completed, so there was nothing to audit. That is a harness failure, and it is worth keeping separate from a reasoning failure.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;deepseek-v3-2&lt;/code&gt; is the more instructive negative example. It completed all six tasks and scored zero on all six. Its outputs were enormous — a mean of roughly 116 KB against the ~400 bytes the strong models emitted — full of planning text, pseudo-tool calls, and narrated file-writing. The verifier found no preserved artifacts. A great deal of text was produced. The project state never changed.[^contract]&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
A transcript can look like work while failing to leave project state.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;h3&gt;Where the credit lands&lt;/h3&gt;
&lt;p&gt;Breaking the same trials out by task shows that the failures are both model-specific and task-specific, and that almost everything lives in the partial band&amp;lt;Sidenote&amp;gt;Each trial scores between 0 and 1. A few near the top mean the record was almost complete; zeros mean nothing usable survived. The “partial band” is the wide middle — here roughly 0.4 to 0.7 — where the output has the right structure but enough wrong or missing fields that no downstream system could safely consume it.&amp;lt;/Sidenote&amp;gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...readbackHeatmapData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;There is exactly one full pass in the whole group — &lt;code&gt;gpt-5-3-chat&lt;/code&gt; on the case where the draft total conflicts with the source — and one strong partial, the same model on the clean, releasable case. Everything else for the competent models sits between 0.5 and 0.61: the right shape, but not accurate enough to be a record another system could trust and ingest. &lt;code&gt;deepseek-v3-2&lt;/code&gt; is a solid block of zeros despite completing every run.&lt;/p&gt;
&lt;p&gt;That partial band is the whole point. The grading is punishing almost-correct project state, which is exactly the right thing to punish for audit work. A record that is 90% right is not 90% useful to the system that ingests it.&lt;/p&gt;
&lt;h3&gt;Failure fingerprint&lt;/h3&gt;
&lt;p&gt;Sorting the checks by how often they were lost makes the failure family obvious.&lt;/p&gt;
&lt;p&gt;&amp;lt;FailureBars {...readbackFailureData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Almost every lost check is about readback equality and provenance, not the engineering call itself. The check that the readback actually matches the record failed in 35 of 36 trials — the readback step almost never became the receipt it was supposed to be. Owners, fingerprints, evidence IDs, and issue IDs follow right behind.&lt;/p&gt;
&lt;h3&gt;What this chapter teaches&lt;/h3&gt;
&lt;p&gt;Readback is a control surface, not a guarantee: re-reading a record only becomes a receipt when the record and the readback carry exact, matching fields — and here they almost never did. Writing the files is necessary but not sufficient; the strong models reached the right shape and still lost credit on owners, fingerprints, and exact IDs, which is why even the best sits at 0.695 rather than near 1.0. The remaining gap is not dramatic reasoning — it is exactness, the boring fields a downstream system actually ingests. Downstream systems do not ingest vibes; they ingest fields.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
An answer convinces a reader. An artifact survives an audit.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;p&gt;That is the interpretive key for everything that follows. Chapter 2 moves from generic audit state into operational decision records, and asks a question prior to &lt;em&gt;can you record it&lt;/em&gt;: which evidence is even allowed to govern the decision?&lt;/p&gt;
&lt;h2&gt;Chapter 2 — Evidence Is Not Authority&lt;/h2&gt;
&lt;p&gt;Chapter 1 asked whether a model could leave a durable record behind. Chapter 2 asks something prior to that: can the model decide which evidence is even allowed to govern a decision?&lt;/p&gt;
&lt;p&gt;Operational systems rarely fail because a signal is missing. They fail because the wrong signal is handed authority. A stale dashboard looks reassuring. A cached tool pass looks finished. A retry quietly supersedes the failed attempt before it. A warning permits limited progress but not clean release. A current breach should override a green summary. A maintenance window changes whether a reading even counts.&lt;/p&gt;
&lt;p&gt;This chapter uses two related task groups from the same sweep, both built around that authority boundary.&lt;/p&gt;
&lt;p&gt;In the first group, the governing evidence comes from &lt;strong&gt;tool outputs&lt;/strong&gt; — a timeout, a failed-then-retried check, a stale cached pass, a pass carrying a warning, a clean pass, an unsupported-tool gap. The model has to decide which result may govern closeout and write a decision record that matches its visible summary.&lt;/p&gt;
&lt;p&gt;In the second group, the evidence comes from &lt;strong&gt;monitoring telemetry&lt;/strong&gt;[^telemetry] — stale dashboards, current samples, active thresholds, sensor faults, maintenance windows, and live breaches. The model has to settle on an operational status and preserve the fields that made that status valid.&lt;/p&gt;
&lt;p&gt;In both, being cautious is not the same as being correct. The decision has to name the right status, cite the exact evidence that governs, reject the exact evidence that does not, and record an owner and action a later workflow can audit.&lt;/p&gt;
&lt;p&gt;&amp;lt;FlowDiagram {...governancePipelineData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
A system fails when the wrong signal is handed authority.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;h3&gt;Result snapshot&lt;/h3&gt;
&lt;p&gt;Across both groups the strong models look healthy. The four GPT and Grok models complete every run and sit near 0.85–0.90. The interesting rows are, again, at the bottom — and they fail in two completely different ways.&lt;/p&gt;
&lt;p&gt;&amp;lt;ModelScoreStrip {...governanceModelStripData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;deepseek-v3-2&lt;/code&gt; repeats its Chapter 1 signature: it finishes every run, emits tens of kilobytes of narration, and leaves almost no verifier-visible record. &lt;code&gt;gpt-oss-120b&lt;/code&gt; is the opposite failure — it writes clean records when it finishes, but four of its twelve runs never complete at all.&lt;/p&gt;
&lt;p&gt;That split is worth holding onto, because a single leaderboard number would blur it. Two different questions are in play: does the model finish the run, and when it finishes does it satisfy the record contract? A model can be good at one and bad at the other.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
Finishing the run and satisfying the record are different competencies.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;p&gt;The two evidence sources are not equally hard. Tool-result decisions average 0.71; monitoring averages 0.67.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...governancePairData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The gap is intuitive once you look at the inputs. A tool output arrives pre-labelled — it already says &quot;timeout&quot; or &quot;stale cache&quot; or &quot;unsupported.&quot; The model still has to apply policy, but the input carries a decision vocabulary. A monitoring status has to be synthesised: the model has to weigh freshness, threshold authority, sensor validity, maintenance context, and breach state before it can name a status at all. More synthesis, more ways to be partly right.&lt;/p&gt;
&lt;h3&gt;Where the hard cases are&lt;/h3&gt;
&lt;p&gt;Breaking each group out by task shows that the hard cells are not scattered randomly. They sit exactly where authority has to be taken away from the signal that looks safest — the green dashboard, the cached pass that already reads as finished, the result that says the work is done — and given instead to a less convenient one: a fresher sample, a current breach, a threshold that has since changed.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...toolResultHeatmapData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;In the tool-result group, the standout is the stale cached pass: &lt;code&gt;gpt-5-3-chat&lt;/code&gt; takes the only full pass on it, correctly refusing a cached result that was computed against a superseded demand. The hardest column is the unsupported-tool gap, where the model has to fall back to a manual source &lt;em&gt;and&lt;/em&gt; disclose that the tool never ran — the one place &lt;code&gt;gpt-oss-120b&lt;/code&gt; fails outright.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...monitoringHeatmapData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Monitoring tells the same story more sharply. The healthy-current and stale-dashboard controls are handled well; the difficulty concentrates on the superseded threshold, the maintenance window, and the current breach over a green summary — the three cases where the reassuring signal is the wrong one to trust. &lt;code&gt;gpt-oss-120b&lt;/code&gt; is the cautionary row: a perfect stale-dashboard record sitting next to three runs that never completed.&lt;/p&gt;
&lt;h3&gt;Failure fingerprint&lt;/h3&gt;
&lt;p&gt;Sorting the lost checks makes the failure family obvious, and it is the same family in both groups: governance fields, not judgment.&lt;/p&gt;
&lt;p&gt;&amp;lt;FailureBars {...toolResultFailureData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;FailureBars {...monitoringFailureData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The single check that tops both panels is &lt;em&gt;policy followed&lt;/em&gt; — failed in 28 of 36 tool-result trials and 34 of 36 monitoring trials. That sounds damning until you read why it failed. It is almost never failing because a model cleared an asset it should have held. It fails because a policy-required field underneath it is missing, imprecise, or contradicted by the final summary: an evidence ID that does not match, a threshold not preserved exactly, an owner name that drifts, a status code that disagrees with the prose.&lt;/p&gt;
&lt;p&gt;A small but sharp example sits inside the monitoring group. On the stale-dashboard task, one model correctly refused to certify the asset as healthy — the dashboard was green but stale, and the latest sample was outside the freshness window. It still lost credit, because it recorded the status as &lt;em&gt;limited / inconclusive&lt;/em&gt; rather than &lt;em&gt;hold / not clear&lt;/em&gt;.[^status] In language those sound equally cautious. In the record they are different operational states, and they route to different downstream handling.&lt;/p&gt;
&lt;h3&gt;What this chapter teaches&lt;/h3&gt;
&lt;p&gt;Caution in prose is not caution in the record: the strong models say the stale dashboard or cached pass cannot govern, then fail to preserve the exact rejected evidence, governing evidence, or threshold that proves it, and a reviewer inspects the record rather than the intent. Status codes are part of that proof, not wording preferences; &lt;em&gt;hold&lt;/em&gt; and &lt;em&gt;limited&lt;/em&gt; sound equally careful and route to different downstream handling. Governance fields (evidence IDs, thresholds, owners, action and status codes) are first-class outputs rather than formatting details: the policy was not followed unless the record says why.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
Evidence becomes governing evidence only when the record says so.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;p&gt;Chapter 3 raises the difficulty again: closeout under dependency constraints, where authority is no longer one packet but spread across required shards, gate results, stale replacements, and waivers the model has to keep straight at once.&lt;/p&gt;
&lt;h2&gt;Chapter 3 — Closeout Is a Dependency Claim&lt;/h2&gt;
&lt;p&gt;Chapter 2 asked which single signal may govern a decision. Chapter 3 asks a harder version of the same question: when a decision depends on &lt;em&gt;many&lt;/em&gt; required items at once, can the model keep the whole dependency graph intact?&lt;/p&gt;
&lt;p&gt;Closeout&amp;lt;Sidenote&amp;gt;Closeout is the moment a package is formally declared finished — signed off as complete and cleared to move to the next stage. It is the gate every dependency has to clear before downstream work is allowed to begin, which is what makes it an audit point rather than a status update.&amp;lt;/Sidenote&amp;gt; is the obvious place to test it. Percent complete is not closeout. A dashboard can say most shards passed; a migration table can show most gates green; a waiver can look administratively convenient. None of those facts close the package on their own. Closeout is a claim that &lt;em&gt;every&lt;/em&gt; required dependency has current, valid, auditable evidence — and the record has to carry that whole trail.&lt;/p&gt;
&lt;p&gt;This chapter uses two closeout task groups from the same sweep.&lt;/p&gt;
&lt;p&gt;The first splits a package review into &lt;strong&gt;parallel discipline shards&lt;/strong&gt;&amp;lt;Sidenote&amp;gt;A shard is one slice of a larger job run on its own — here, one discipline&apos;s checks (say, all the structural ones) processed as a separate unit. The package only closes when every required shard has come back complete and passing, so a shard that was never run, cancelled, or left stale is a hole in the dependency graph, not a rounding error.&amp;lt;/Sidenote&amp;gt; — separate checks running in parallel across disciplines like mechanical, electrical, and structural. The model sees the manifest of required shards (the authoritative list of which slices must come back), the shard results, an aggregate dashboard, and pressure, and has to decide whether the batch is ready, held, incomplete, or ready-with-warning.[^closeoutstatus]&lt;/p&gt;
&lt;p&gt;The second is a &lt;strong&gt;standards migration&lt;/strong&gt; — moving a project from an old set of design standards onto a new one, which is only permitted once a fixed set of checks has passed. Each of those required checks is a &lt;em&gt;gate&lt;/em&gt;. The model sees the gate manifest (the authoritative list of which gates must pass), the gate results, and a &lt;em&gt;waiver register&lt;/em&gt; — the log of formally authorised exceptions, where someone with the right authority has signed off on skipping a specific gate. Its job is to decide whether the migration can close: accepting current passes, rejecting stale or failed results, and honouring only the waivers that are genuinely authorised.&lt;/p&gt;
&lt;p&gt;&amp;lt;FlowDiagram {...closeoutPipelineData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
A package does not close because most of its checks passed. It closes when every required one is accounted for.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;h3&gt;Result snapshot&lt;/h3&gt;
&lt;p&gt;The two groups average almost identically — 0.64 each — but that number is misleading, and worth taking apart.&lt;/p&gt;
&lt;p&gt;&amp;lt;ModelScoreStrip {...closeoutModelStripData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;For the four artifact-producing models, closeout is largely a solved problem: they complete every run and sit between 0.89 and 0.96. The suite mean is dragged down by the same two failures from earlier chapters, now in sharper relief. &lt;code&gt;deepseek-v3-2&lt;/code&gt; completes all twelve runs and scores zero on every one — it leaves no closeout record. &lt;code&gt;gpt-oss-120b&lt;/code&gt; is the mirror image: eleven of its twelve runs never complete, but the single run that did was a flawless shard record.&lt;/p&gt;
&lt;p&gt;That is the cleanest illustration yet of why one number is not enough. &quot;Can produce a perfect closeout record&quot; and &quot;reliably finishes the task&quot; are different claims, and &lt;code&gt;gpt-oss-120b&lt;/code&gt; satisfies the first while failing the second.&lt;/p&gt;
&lt;p&gt;The two settings are not equally clean for the strong models. Per model, migration gates run slightly ahead of shard closeout.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...closeoutPairData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The gap is small and the direction is intuitive: a migration gate is a single named check with a pass, a fail, or a waiver, whereas a shard batch forces the model to reconcile a manifest against partial dashboards, cancellations, and stale runs before it can even name a status.&lt;/p&gt;
&lt;h3&gt;Where the hard cases are&lt;/h3&gt;
&lt;p&gt;Breaking each group out by task shows the difficulty sitting exactly where a dependency has to be &lt;em&gt;rejected&lt;/em&gt; in favour of a less convenient truth.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...shardHeatmapData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The encouraging result is the partial-dashboard task, the highest-scoring shard case. The dashboard sampled only part of the manifest and looked comfortable, but two required shards were never run. Every artifact-producing model held the line — marking the batch incomplete, citing the passes it did have, and naming the missing shards rather than trusting the summary. The hardest task is the cancelled shard, where a cancelled dependency is simultaneously a rejected result &lt;em&gt;and&lt;/em&gt; a missing required completion, and the record has to carry it as both.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...migrationHeatmapData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Migration tells the same story. Clean closeouts and unrun-gate cases are handled well; the difficulty concentrates on the unauthorized waiver, where a convenient-looking waiver attached to a failed gate has to be rejected while the blocker and the failed result both survive into the record.&lt;/p&gt;
&lt;h3&gt;Failure fingerprint&lt;/h3&gt;
&lt;p&gt;Sorting the lost checks shows the same family failing in both groups, and it is not the headline decision. The models almost always get the ready-or-hold call right. What they drop is the bookkeeping underneath it: the &lt;em&gt;dependency lineage&lt;/em&gt; (exactly which results were used, which were rejected, which were missing) and the &lt;em&gt;status code&lt;/em&gt;, the machine-readable outcome a downstream system actually routes on.&lt;/p&gt;
&lt;p&gt;&amp;lt;FailureBars {...shardFailureData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;FailureBars {...migrationFailureData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Policy followed&lt;/em&gt; tops both panels, and for the same reason as Chapter 2: it almost never fails because a model closed a package it should have held. It fails because the lineage underneath it is incomplete — a result that was used or rejected but not recorded exactly, a missing shard left off the list, a blocker that did not survive into the record, a status code that disagrees with the prose decision.&lt;/p&gt;
&lt;p&gt;The recurring pattern is that dependency &lt;em&gt;categories are not interchangeable&lt;/em&gt;. A cancelled shard can be rejected evidence and still leave a required shard incomplete. A failed gate can be listed as failed and still need to appear as a rejected result. An unauthorized waiver can be rejected while the failed gate remains the blocker. These are small differences in a written explanation and large differences in a workflow state machine.&lt;/p&gt;
&lt;h3&gt;What this chapter teaches&lt;/h3&gt;
&lt;p&gt;A summary is context, not authority: the partial-dashboard result is the good news — the strong models reliably refused to let an aggregate dashboard stand in for shards it never sampled, the authority boundary holding under load. But closeout can be correct and still unauditable. The models almost always get the ready-or-hold verdict right; what they drop is the trail underneath it — which required dependency failed, which result was used, which was rejected, which blocker applies. That trail is the proof, not the verdict.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
The record that closes a package has to carry every dependency it cleared — not just the word &lt;em&gt;done&lt;/em&gt;.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;p&gt;Chapter 4 changes the kind of evidence entirely — from dependency bookkeeping to grounded text and spatial geometry — to ask whether the same record discipline holds when the truth lives in a source span or a coordinate frame.&lt;/p&gt;
&lt;h2&gt;Chapter 4 — Evidence Has Coordinates&lt;/h2&gt;
&lt;p&gt;The first three chapters were all about records: what a result says, which signal may govern, which dependencies have to clear. This chapter changes the &lt;em&gt;kind&lt;/em&gt; of evidence and asks a more basic question underneath all of them — can the model bind its answer to the right evidence in the first place?&lt;/p&gt;
&lt;p&gt;Evidence can live in a paragraph. It can also live in a coordinate system. This chapter uses two task groups that test each.&lt;/p&gt;
&lt;p&gt;The first is &lt;strong&gt;textual&lt;/strong&gt;. Each task carries three engineering claims — a required bearing capacity, a commissioning pressure, a voltage drop — and six nearby source files, some of which are superseded revisions or scope-adjacent distractors. The model has to return, for every claim, the exact source it came from and the exact value, while refusing to cite a distractor or invent an unsupported claim.&lt;/p&gt;
&lt;p&gt;The second is &lt;strong&gt;spatial&lt;/strong&gt;. Each task gives the model a current drawing and a superseded one, both as machine-readable vector geometry,[^vector] plus a transform (a scale, a translation, a rotation), a schedule of required clearances, and a policy. The model has to apply the transform &lt;em&gt;before&lt;/em&gt; it measures anything, reject the superseded drawing, decide whether the geometry clears the requirement, and write a geometry record that matches its own visible summary.&lt;/p&gt;
&lt;p&gt;&amp;lt;FlowDiagram {...groundingPipelineData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
An answer is only as good as the evidence it is bound to — the right source, or the right coordinate frame.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;h3&gt;Result snapshot&lt;/h3&gt;
&lt;p&gt;This is the first chapter where the strong models simply pass. Putting the two surfaces side by side shows it clearly.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...citationDrawingPairData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The four strongest models bind text and geometry exactly — a clean ceiling that the earlier chapters never produced. That is worth stating plainly: in this controlled setting, exact source-and-value citation and text-visible transformed geometry are &lt;em&gt;solved&lt;/em&gt; for the top tier. It is also worth bounding carefully, which the closing of this chapter does.&lt;/p&gt;
&lt;p&gt;The interesting structure is at the bottom, and it is the same split as Chapter 3 wearing different clothes. &lt;code&gt;gpt-oss-120b&lt;/code&gt; fails citation outright — every run failed to produce a usable claim map — yet turns in partial competence on drawing when its runs complete. &lt;code&gt;deepseek-v3-2&lt;/code&gt; is the mirror image: it produces a few citation partials but leaves no geometry record at all.&lt;/p&gt;
&lt;p&gt;The record contract only bites on the drawing side — a citation answer is a final-answer JSON map with no separate artifact, whereas a drawing task demands a written geometry record — so the per-model record detail is worth looking at there.&lt;/p&gt;
&lt;p&gt;&amp;lt;ModelScoreStrip {...drawingModelStripData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The same two tells from earlier chapters reappear in the output column: &lt;code&gt;deepseek-v3-2&lt;/code&gt; emits a long narration (tens of kilobytes) and produces no record; &lt;code&gt;gpt-oss-120b&lt;/code&gt; completes only half its runs. Above them, the GPT and Grok outputs are compact and exact.&lt;/p&gt;
&lt;h3&gt;Where the hard cases are&lt;/h3&gt;
&lt;p&gt;Because the strong models saturate, the task grids read differently from the earlier chapters: the colour now lives almost entirely in the bottom two rows.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...citationTaskHeatmapData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Citation barely varies by discipline. Every strong model is perfect on bridge bearings, commissioning pressures, egress methods, and geotechnical limits alike. The only variation is whether the weaker models can produce an exact map at all — and largely they cannot.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...drawingTaskHeatmapData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Drawing has one genuinely hard case: the rotated drain arrow. It is the single task that trips an otherwise-perfect model — Grok — because the direction relation only flips &lt;em&gt;after&lt;/em&gt; the 180° rotation is applied. Read the geometry in the original frame and the arrow looks fine; read it in the transformed frame and it conflicts. Translations and scales are far more forgiving, because they move a point without changing what &quot;which way does it point&quot; means.&lt;/p&gt;
&lt;h3&gt;Failure fingerprint&lt;/h3&gt;
&lt;p&gt;The two surfaces fail in shapes that match their structure — and the contrast is the point.&lt;/p&gt;
&lt;p&gt;&amp;lt;FailureBars {...citationFailureData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;FailureBars {...drawingFailureData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Citation failures are concentrated: a single cluster of five, which is simply the two models that could not produce an exact map. Drawing failures are broad and &lt;em&gt;coupled&lt;/em&gt;. A wrong transformed measure does not fail alone — it drags the threshold comparison, the conflict flag, the decision code, and the record that summarises them all down with it. Spatial grounding has more fields that have to agree at once, so a single measurement error shows up as a row of red.&lt;/p&gt;
&lt;p&gt;That coupling is the most useful thing the drawing panel says. The misses are not &quot;the model could not produce a record.&quot; They are &quot;the record exists, the schema is mostly right, and one transformed number is wrong&quot; — which then propagates. Grok&apos;s rotated-arrow miss is exactly this: correct drawing IDs, correct transform ID, correct rejected-evidence trail, and a wrong relation after the rotation.&lt;/p&gt;
&lt;h3&gt;What this chapter teaches&lt;/h3&gt;
&lt;p&gt;Grounding is not one skill: text grounding binds a claim to a source-and-value pair, spatial grounding binds geometry to a transformed coordinate frame, and a model can be excellent at one surface and fail the other on completion alone. Where the strong models do fail spatially, it is a higher-quality failure than the no-record collapse of earlier chapters — the record exists and one transformed number is wrong, which a benchmark can isolate and drive down. And saturation is itself a finding: when the top tier sits on the ceiling the suite stops discriminating between them, which makes it a clean floor test for everything messier that follows.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
In compact, text-visible settings, the strong models align evidence exactly. The open question is whether that survives messier retrieval and richer drawings.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;p&gt;Chapter 5 applies pressure of a different kind: not whether a model can find the right evidence, but whether it can &lt;em&gt;rewrite&lt;/em&gt; a document for a new audience without quietly dropping the material risk inside it.&lt;/p&gt;
&lt;h2&gt;Chapter 5 — Style Is Not a Waiver&lt;/h2&gt;
&lt;p&gt;Chapter 4 asked whether a model could bind its answer to the right evidence. This chapter keeps the evidence fixed and changes the &lt;em&gt;output&lt;/em&gt;: rewrite this technical note for a different audience. It is one of the most ordinary requests a model gets — and a quietly dangerous one.&lt;/p&gt;
&lt;p&gt;The rule is simple to state. Change the style; do not change the engineering truth. The difficulty is that the requested styles are exactly the ones that create pressure to move it. &quot;Client-positive&quot; leans on you to soften a hold. &quot;Marketing brief&quot; leans on you to omit a blocker. &quot;Plain language&quot; leans on you to drop the caveat that made the original sentence true. A rewrite can be clearer, friendlier, more polished — and launder material risk on the way through.[^laundering]&lt;/p&gt;
&lt;p&gt;These tasks do not score prose quality. They score whether status, numeric values, caveats, issue IDs, and source IDs survive the rewrite &lt;em&gt;and&lt;/em&gt; a structured integrity report. This chapter uses two groups: a first-pass rewrite, and a repair group that hands the model an already-laundered draft to fix.&lt;/p&gt;
&lt;p&gt;&amp;lt;FlowDiagram {...styleTransferPipelineData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
A style request can change the wording. It must not change the status.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;h3&gt;Result snapshot&lt;/h3&gt;
&lt;p&gt;The headline result is not the suite means — 0.61 and 0.64, barely apart. It is what happens to the strong models when you give them a draft to repair.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...styleRecordRepairPairData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;On the first pass, the four artifact-producing models cluster around 0.85–0.89. Show them a laundered draft and require a readback, and three of them jump toward the ceiling — &lt;code&gt;gpt-5-3-chat&lt;/code&gt; to 0.9955, &lt;code&gt;gpt-5-2&lt;/code&gt; to 0.982, Grok to 0.96. The exception is &lt;code&gt;gpt-5-1&lt;/code&gt;, flat across the two, for a reason worth holding onto: its repair residuals are not in the prose but in the readback artifact.&lt;/p&gt;
&lt;p&gt;The bottom of the table is the familiar split. &lt;code&gt;gpt-oss-120b&lt;/code&gt; manages one decent first-pass record, then fails every repair run outright — the rewrite-report-readback chain is simply too many artifacts. &lt;code&gt;deepseek-v3-2&lt;/code&gt; completes everything and scores near-zero on both: it leaves no integrity report to grade.&lt;/p&gt;
&lt;p&gt;&amp;lt;ModelScoreStrip {...styleModelStripData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Both groups demand written artifacts, so the record contract bites on both sides. The output column shows the same two tells from earlier chapters — deepseek-v3-2&apos;s tens-of-kilobytes narration with nothing to audit, and gpt-oss-120b&apos;s incompletion.&lt;/p&gt;
&lt;h3&gt;Where the hard cases are&lt;/h3&gt;
&lt;p&gt;Splitting each group by style shows where the pressure actually lands.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...recordTaskHeatmapData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The encouraging first-pass result is that the &lt;em&gt;prose&lt;/em&gt; stays risk-honest across every style — the strong models do not uplift a hold to please a client-positive brief or drop a blocker for a marketing one. What separates the styles is report exactness. The risk-register and plain-language tasks, which carry the most fields to preserve, sit lowest, because that is where an exact-evidence-ID or caveat-preservation field is most likely to slip.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...repairTaskHeatmapData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Repair lifts almost everything. With a laundered draft to react to, even the marketing-omission and blocker cases — the hardest first-pass tasks — become tractable, because the model is now correcting a concrete error rather than guarding against an abstract one. The clean control matters here too: one draft is &lt;em&gt;not&lt;/em&gt; laundered, and a good model has to leave it alone rather than invent a repair.&lt;/p&gt;
&lt;h3&gt;Failure fingerprint&lt;/h3&gt;
&lt;p&gt;The two groups fail in different places, and the shift is the whole point of adding repair.&lt;/p&gt;
&lt;p&gt;&amp;lt;FailureBars {...recordFailureData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;FailureBars {...repairFailureData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The first pass fails in the report, not the prose: &lt;em&gt;evidence IDs listed exactly&lt;/em&gt; fails in 34 of 36 trials. The visible rewrite can say exactly the right thing while the integrity report loses the linkage that would let an auditor trace it back to source. Repair moves the failures downstream — into whether the draft was actually repaired, whether unsupported softening was flagged, and whether the readback confirms the report. That readback is, once again, a separate competence: &lt;code&gt;gpt-5-1&lt;/code&gt; repairs every rewrite cleanly and still loses points because its readback artifact has the wrong shape — the Chapter 1 lesson returning in a new setting.&lt;/p&gt;
&lt;h3&gt;What this chapter teaches&lt;/h3&gt;
&lt;p&gt;Style transfer is not the hard part: the models write good audience-appropriate prose and largely keep it risk-honest, not uplifting a hold to please a client-positive brief or dropping a blocker for a marketing one. The hard part is the audit artifact — a rewrite that &lt;em&gt;reads&lt;/em&gt; safe is not a report that proves it stayed safe, and the recurring first-pass miss is the exact evidence ID that makes it traceable back to source. Repair turns out to be a control surface in its own right: handing the model a laundered draft and demanding a readback recovered risk the first pass had blurred, and lifted the strongest models toward the ceiling. And a clean control keeps repair honest — one draft is not laundered, and &quot;repairing&quot; it anyway distorts the source just as surely as laundering does.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
The right control for a rewrite is not to forbid it — it is to make it prove the risk survived.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;p&gt;The final chapter closes the loop. Every chapter so far has leaned on the model producing the right artifact; the last asks what happens when the workflow tells the model an artifact is missing — whether it can recover under retry, or whether the record discipline breaks the moment the runtime pushes back.&lt;/p&gt;
&lt;h2&gt;Chapter 6 — Feedback Is Not Execution&lt;/h2&gt;
&lt;p&gt;Every chapter so far has assumed the model gets one clean shot at the artifact. This one removes that assumption. The workflow now pushes back — &lt;em&gt;the required file is missing&lt;/em&gt; — and the question is what the model does next. Does it create the file, or does it write a sentence claiming the file exists?&lt;/p&gt;
&lt;p&gt;The distinction is trivial in a chat window and decisive in a workflow. &quot;I wrote the integrity report&quot; and an actual integrity report sitting in the workspace look identical in the transcript. Only one of them can be audited. A downstream system cannot read a claim that lives in the final answer; it needs durable files, the right schema, and a way to prove the files are the ones the workflow expects.&lt;/p&gt;
&lt;p&gt;To pull those concerns apart, this chapter walks a &lt;em&gt;scaffold ladder&lt;/em&gt; — four retry suites over the same style-transfer repair task, each giving the model more workflow support than the last. The first offers only a fixed &quot;file missing&quot; note. The second adds a real second turn after the verifier rejects the first attempt. The third makes a helper step mandatory and requires it to stamp an execution marker.[^marker] The fourth pulls half of that scaffold back out. The point of the ladder is not that more support is always better — it is to find which rung actually makes execution observable.&lt;/p&gt;
&lt;p&gt;&amp;lt;FlowDiagram {...retryArtifactPipelineData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
Saying a file was written is not the same as writing it.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;h3&gt;Result snapshot&lt;/h3&gt;
&lt;p&gt;The suite means barely move — 0.70, 0.63, 0.69, 0.67 — and they hide the story rather than tell it, because two models complete almost every run while leaving nothing durable behind.&amp;lt;Sidenote&amp;gt;&lt;code&gt;deepseek-v3-2&lt;/code&gt; finishes its runs and scores near-zero because it writes no verifier-visible artifacts; &lt;code&gt;gpt-oss-120b&lt;/code&gt; mostly fails to complete the artifact stack at all. Averaging them in flattens the ladder.&amp;lt;/Sidenote&amp;gt; The four artifact-producing models tell it clearly.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...scaffoldLadderData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Read top to bottom, the strong-model column climbs and then steps back. Static feedback already lands at 0.9977 — capable models treat writing the file as part of the job, no live loop required. A real retry turn actually drops the strong mean to 0.8935, because a second turn is stricter about proving the side effects happened. The mandatory helper is the one rung where every strong model hits a clean 1.00. Then the reduced scaffold pulls it back to 0.9087.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...scaffoldMatrixData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The per-model grid shows where the movement comes from. The four strong models are near-saturated everywhere except two places: &lt;code&gt;gpt-5-2&lt;/code&gt;&apos;s live-retry trough at 0.67, and the shared dip on the reduced scaffold. The mandatory-helper column is the only one where all four hit 1.00 — and, tellingly, the only column where &lt;code&gt;gpt-oss-120b&lt;/code&gt; falls to zero, because being &lt;em&gt;required&lt;/em&gt; to run the helper is harder for it than being allowed to skip it.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gpt-5-2&lt;/code&gt;&apos;s trough is the cleanest single result in the chapter. On a marketing-noise retry it writes the integrity report and the readback check correctly, and the visible rewrite preserves the exceedance — 62 dB against a 55 dB limit, mitigation unapproved, activity on hold. The files are right. What it omits is the compact final summary, so the workflow has no proof to credit. The side effects happened; the final contract did not say so. Nothing is wrong with the engineering — the failure is entirely about proving the work.&lt;/p&gt;
&lt;h3&gt;Where the hard cases are&lt;/h3&gt;
&lt;p&gt;The reduced-scaffold suite is the one worth splitting, because it is built to isolate which part of the scaffold was load-bearing. Half its tasks hand the model a malformed helper payload to repair and then run; the other half take the helper away and make the model write the execution marker by hand.&lt;/p&gt;
&lt;p&gt;&amp;lt;RewardHeatmap {...scaffoldSplitData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The split is stark and consistent. Every strong model holds a perfect 1.00 when it only has to fix a malformed payload and let the helper run — and every one of them drops to about 0.81 when it has to produce the marker itself. The misses are not in the prose or the source evidence; they are in the execution metadata. In one plain-language flood case &lt;code&gt;gpt-5-1&lt;/code&gt; preserves the 0.35 m freeboard and the provisional tailwater caveat, writes the report and readback correctly, then marks the payload as repaired when manual mode required the opposite. A small field, exactly wrong, and the marker fails.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gpt-oss-120b&lt;/code&gt; inverts the pattern in a way that confirms it: forced to repair the malformed helper it scores zero, but left to write the marker by hand it reaches a partial 0.54. Repairing a structure that already exists is a different skill from producing the proof-of-execution from scratch, and the durable boundary is the second one.&lt;/p&gt;
&lt;h3&gt;Failure fingerprint&lt;/h3&gt;
&lt;p&gt;The whole chapter is in how the failures move as you climb the ladder.&lt;/p&gt;
&lt;p&gt;&amp;lt;FailureBars {...verifierRetryFailureData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;FailureBars {...scaffoldReductionFailureData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;In the live-retry suite the failures still cluster on the files and the final contract: the report and readback go unwritten, and the distinctively retry-shaped miss is the side-effect JSON, which either floods the final answer or vanishes from it entirely.&amp;lt;Sidenote&amp;gt;The contract is deliberately narrow: the durable files are the evidence, and the final answer is only a compact status surface. Pasting the full side-effect JSON into the answer is a leak; omitting it is a missing proof. Both fail.&amp;lt;/Sidenote&amp;gt; Pull the scaffold and the surface shifts. The file-and-report checks that dominated earlier fall to ten; the new top of the list is the marker and the repaired payload — proving the step ran, in the exact shape, without a helper to lean on.&lt;/p&gt;
&lt;h3&gt;What this chapter teaches&lt;/h3&gt;
&lt;p&gt;A retry loop is not a recovery loop: the live-retry suite has a genuine second turn and still scores below the static one — 0.8935 against 0.9977 — because it asks for harder proof after the turn. Feedback hands the model another chance; it does not perform the fix on the model&apos;s behalf. The mandatory helper earns its place by making execution observable (run the helper, write the report and readback, stamp the marker, emit the summary), and that is the one rung where every strong model saturates. Pull the helper and the last boundary shifts to the metadata: the models keep writing good rewrites and lose points on marker exactness. The fix is not less scaffold but &lt;em&gt;targeted&lt;/em&gt; scaffold, aimed only at the field still slipping.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
A model has not repaired the workflow until the files, markers, and final contract all agree.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;h2&gt;What the six chapters add up to&lt;/h2&gt;
&lt;p&gt;Read end to end, the six task groups are one escalating question — &lt;em&gt;did the workflow survive the model?&lt;/em&gt; — and they share one answer. The hard part is almost never the engineering judgment. The models name the right status, hold the right line, preserve the visible risk. What they drop, over and over, is the part that makes the judgment usable to another system: the exact field, the matching readback, the dependency trail, the proof that a file was actually written.&lt;/p&gt;
&lt;p&gt;Four patterns hold across every chapter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trust has two axes, and one number hides them.&lt;/strong&gt; Whether a model finishes the run and whether it satisfies the record contract are different competencies. &lt;code&gt;deepseek-v3-2&lt;/code&gt; finishes everything and leaves nothing durable; &lt;code&gt;gpt-oss-120b&lt;/code&gt; writes clean records but often never completes. A single leaderboard mean blurs two opposite failures into one mediocre row.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The failures live in provenance, not the verdict.&lt;/strong&gt; &lt;em&gt;Policy followed&lt;/em&gt; is the most-failed check in chapter after chapter — and it almost never fails because a model cleared something it should have held. It fails because the field underneath it is missing or imprecise: an evidence ID that does not match, a threshold not preserved, a status code that disagrees with the prose. The reasoning is sound; the record cannot be audited.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Proof is a separate skill from the work.&lt;/strong&gt; The readback that has to equal the record, the integrity report that has to trace to source, the marker that has to prove the step ran — every chapter has a version of this, and it is consistently where the strong models lose their last points. Doing the work and proving the work are not the same competence, and a workflow depends on the second.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verbosity is not execution.&lt;/strong&gt; The recurring negative example, &lt;code&gt;deepseek-v3-2&lt;/code&gt;, produces the most text and the least durable state across every chapter it appears in — though in its case that is partly an interaction-contract failure rather than a pure behavioural one.[^contract] Either way, long, fluent narration about writing files is the failure mode to watch for in any agent put near a real workflow.&lt;/p&gt;
&lt;p&gt;The practical takeaway is narrow and useful. The model that tops a prose leaderboard is not automatically the model you can put in an engineering workflow. The one you can trust is the one that treats the durable artifact — not the chat reply — as the real deliverable: it leaves exact records, binds answers to exact evidence, preserves risk through a rewrite, and proves that the side effects happened. A plausible answer is cheap. A workflow that survives the model is the thing worth measuring — and the thing these six chapters were built to measure.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;[^packet]: Concretely: the policy might be &quot;do not release if any quantity disagrees with the source by more than 2%&quot;; the source records are the original measured values; the draft analysis is a write-up claiming the design is clean; the review request is &quot;approve for release&quot;; and the pressure note is a line like &quot;the client needs this signed off today.&quot;&lt;/p&gt;
&lt;p&gt;[^contract]: One caveat about &lt;code&gt;deepseek-v3-2&lt;/code&gt; specifically. Reading its raw outputs, most of its zero scores look like an &lt;em&gt;interaction-contract&lt;/em&gt; failure rather than a clean capability measurement: nearly all of its runs were captured as raw output instead of adapter-written results, with reasoning markers and textual tool-call plans standing in for actual tool calls and verifier-visible files. Those runs are valid failures under the harness — the durable artifact genuinely never lands — but they are better read as adapter/protocol misalignment than as evidence about the model&apos;s domain reasoning. The clean test would be a small control rerun under a stricter &quot;final JSON only&quot; contract or a provider-specific tool-call shim; until then, treat this model&apos;s rows as contract-contaminated, and read it throughout as an illustration of the &lt;em&gt;workflow&lt;/em&gt; failure mode, not a verdict on the model.
[^telemetry]: Telemetry just means the live readings a system emits about itself — sensor samples, dashboard summaries, threshold alarms, trend logs. The catch is that not all of it is current or authoritative: a dashboard can be green but hours stale, or a green reading can sit under a threshold that has since been superseded.&lt;/p&gt;
&lt;p&gt;[^status]: In a governed workflow these are codes, not adjectives. &lt;em&gt;Hold / not clear&lt;/em&gt; says the asset cannot proceed; &lt;em&gt;limited / inconclusive&lt;/em&gt; says it can proceed under caveats. A downstream system reads the code, not the surrounding sentence, so a cautious-sounding paragraph attached to the wrong code still routes the asset the wrong way.&lt;/p&gt;
&lt;p&gt;[^closeoutstatus]: Each closeout resolves to one status code, not a sentence: &lt;em&gt;ready&lt;/em&gt; (proceed), &lt;em&gt;hold&lt;/em&gt; (a required item failed), &lt;em&gt;incomplete&lt;/em&gt; (a required item is missing or cancelled), or &lt;em&gt;ready-with-warning&lt;/em&gt; / &lt;em&gt;ready-with-authorised-waiver&lt;/em&gt; (proceed under a recorded caveat). As in Chapter 2, the downstream system routes on the code, so the right code matters as much as the right reasoning.&lt;/p&gt;
&lt;p&gt;[^vector]: Vector geometry means the drawing is stored as shapes and coordinates — points, lines, transforms — in text the model can read directly, rather than as a flat image of pixels. That distinction matters: it means these results show the model reasoning about geometry it can already parse, not recovering geometry from a picture. Pixel-based drawing review is a harder, separate problem.&lt;/p&gt;
&lt;p&gt;[^laundering]: &lt;em&gt;Risk laundering&lt;/em&gt; is the quiet version of the problem: not lying about the engineering state outright, but rewriting around it until it reads as acceptable — a hold described as &quot;progressing,&quot; a failed limit dropped from the summary, a caveat simplified away. The status never formally changes; it just stops being visible. That is what makes a polished rewrite a genuine control point rather than cosmetic work.&lt;/p&gt;
&lt;p&gt;[^marker]: An &lt;em&gt;execution marker&lt;/em&gt; is a small file the workflow step stamps when it actually runs — recording which operation wrote the artifacts and, often, a hash of what it wrote. It exists precisely so that &quot;the side-effect step ran&quot; is something a verifier can check directly, rather than something it has to take the model&apos;s word for. The &lt;em&gt;helper&lt;/em&gt; is the scripted writer the model invokes to produce that marker and the integrity files in one observable operation.&lt;/p&gt;
</content:encoded><author>Theodoros Galanos</author></item><item><title>Making aec-bench Trainable with Prime Lab</title><link>https://theharness.blog/blog/making-aec-bench-trainable/</link><guid isPermaLink="true">https://theharness.blog/blog/making-aec-bench-trainable/</guid><description>How aec-bench and Prime Intellect&apos;s Lab turn engineering benchmarks into verifier-backed RL environments, adapter training runs, and inspectable traces.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import GroupedBars from &apos;../../components/charts/GroupedBars.astro&apos;;
import LabCouplingSwimlanes from &apos;../../components/charts/LabCouplingSwimlanes.astro&apos;;
import LineTrajectory from &apos;../../components/charts/LineTrajectory.astro&apos;;
import PrimeRunFlowDiagram from &apos;../../components/charts/PrimeRunFlowDiagram.astro&apos;;
import TrainableLoopDiagram from &apos;../../components/charts/TrainableLoopDiagram.astro&apos;;
import {
adapterComparisonData,
trainingTrajectoryData,
} from &apos;../../data/prime-rl-charts&apos;;
import { labCouplingFlowSteps } from &apos;../../data/lab-coupling-flow&apos;;
import { primeRunFlowSteps } from &apos;../../data/prime-run-flow&apos;;
import { trainableLoopRows } from &apos;../../data/trainable-loop-flow&apos;;&lt;/p&gt;
&lt;p&gt;Estimated reading time: 9 minutes&lt;/p&gt;
&lt;p&gt;aec-bench can train now.&lt;/p&gt;
&lt;p&gt;The first integration with Prime Intellect&apos;s (PI) &lt;a href=&quot;https://www.primeintellect.ai/blog/lab&quot;&gt;Prime Lab&lt;/a&gt; proves a practical point:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;with the right infrastructure, real engineering tasks can become RL environments without losing the verifier that made them meaningful in the first place.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is the step I have been circling in the previous articles. In &lt;a href=&quot;/blog/where-capability-actually-lives-in-agentic-engineering/&quot;&gt;Where Capability Actually Lives in Agentic Engineering&lt;/a&gt;, the claim was that capability in engineering is not a property of the model alone. It lives across the model, tools, verifiers, output contracts, and operating environment. In &lt;a href=&quot;/blog/benchmarking-agents-on-real-engineering-work/&quot;&gt;Benchmarking Agents on Real Engineering Work&lt;/a&gt;, that showed up empirically: remove the right harness support and performance did not degrade gracefully. It collapsed. In &lt;a href=&quot;/blog/the-harness-is-all-you-need/&quot;&gt;The Harness Is All You Need&lt;/a&gt;, aec-bench became the benchmark layer for making that claim measurable.&lt;/p&gt;
&lt;p&gt;This post is the next step in that chain.&lt;/p&gt;
&lt;p&gt;If the out-of-distribution gap in engineering is partly an environment gap, then benchmarks are not enough. We also need a way to train models inside those environments.&lt;/p&gt;
&lt;p&gt;PI&apos;s Lab gives us that path.&lt;/p&gt;
&lt;h2&gt;TL;DR: Trainable aec-bench Tasks&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;aec-bench tasks can now be exported as Lab-compatible Verifiers environments.&lt;/li&gt;
&lt;li&gt;The task-local verifier remains the source of truth, so training optimizes against the same check used for evaluation.&lt;/li&gt;
&lt;li&gt;Lab handles the hosted RL loop: rollout collection, training, checkpoints, adapter deployment, and evals.&lt;/li&gt;
&lt;li&gt;aec-bench can import the hosted eval samples back into its ledger, turning the result into inspectable traces instead of a dashboard number.&lt;/li&gt;
&lt;li&gt;In the first small adapter check, reward moved from &lt;strong&gt;0.333&lt;/strong&gt; to &lt;strong&gt;0.800&lt;/strong&gt;, final environment responses rose from &lt;strong&gt;2/15&lt;/strong&gt; to &lt;strong&gt;8/15&lt;/strong&gt;, and empty model responses fell from &lt;strong&gt;13/15&lt;/strong&gt; to &lt;strong&gt;3/15&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The claim is deliberately narrow: this adapter became better at completing a small range of workflows. That is already a useful thing to be able to train.&lt;/p&gt;
&lt;h2&gt;From Benchmark Score to RL Environment&lt;/h2&gt;
&lt;p&gt;Most benchmark work stops at measurement.&lt;/p&gt;
&lt;p&gt;That is necessary. It tells us where models fail, which harness choices matter, and how much of the work is still out of distribution for general-purpose systems. But if all we can do is score failures, the loop is incomplete.&lt;/p&gt;
&lt;p&gt;The more interesting loop is:&lt;/p&gt;
&lt;p&gt;&amp;lt;TrainableLoopDiagram
title=&quot;Real task to trainable loop&quot;
rows={trainableLoopRows}
caption=&quot;The verifier stays attached as the task moves from benchmark instance to RL environment, then returns as inspectable traces after held-out evaluation.&quot;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;That is what the aec-bench and Lab integration now gives us.&lt;/p&gt;
&lt;p&gt;aec-bench supplies the work definition: the prompt, files, tools, expected output, and verifier. Lab supplies the training substrate: environment packaging, hosted execution, RL training, checkpoints, and adapter evaluation.&lt;/p&gt;
&lt;p&gt;The clean separation matters. Lab does not need to know what makes a retaining-wall check, short-circuit calculation, or bracket-load task meaningful. It just needs a Verifiers environment with a reward. aec-bench does not need to become an RL platform. It just needs to expose its tasks in the right shape.&lt;/p&gt;
&lt;p&gt;This is why the right infrastructure is so important: the benchmark keeps the meaning of the work; the Lab turns that work into a trainable environment.[^pi-lab]&lt;/p&gt;
&lt;p&gt;[^pi-lab]: I can&apos;t stress enough how blessed we are to have something like PI&apos;s Lab in our disposal. It opens up a myriad of opportunities otherwise unattainable outside of big labs. Huge kudos to the team!&lt;/p&gt;
&lt;p&gt;It is also the practical version of the argument in &lt;a href=&quot;/blog/executable-standards/&quot;&gt;Executable Standards&lt;/a&gt;: obligations become more useful to agents when they stop living only as prose and start becoming checks, predicates, certificates, and rewards.&lt;/p&gt;
&lt;h2&gt;Why RL Environments Matter for Engineering OOD Failures&lt;/h2&gt;
&lt;p&gt;In engineering, the hard failure is often not the model becoming incoherent but really when it becomes plausibly generic.&lt;/p&gt;
&lt;p&gt;It uses the wrong table. It applies the wrong assumption. It answers the nearby problem instead of this problem. It performs a calculation but never submits the artifact in the required form. This is what I meant in the earlier benchmark work by out-of-distribution behaviour: the model is not useless, but it is not reliably attached to the task world, or to the specific instance cut from that world.[^task-world]&lt;/p&gt;
&lt;p&gt;[^task-world]: The task world is the problem space. The instance is one concrete instantiation of part of that space.&lt;/p&gt;
&lt;p&gt;Evaluation tells us when that happens.&lt;/p&gt;
&lt;p&gt;RL environments let us put pressure on the behaviour itself.&lt;/p&gt;
&lt;p&gt;The question moves from appearance to behaviour:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;did the model inspect the assigned files?&lt;/li&gt;
&lt;li&gt;did it use the available tools?&lt;/li&gt;
&lt;li&gt;did it recover after tool friction?&lt;/li&gt;
&lt;li&gt;did it write the required output?&lt;/li&gt;
&lt;li&gt;did it actually submit?&lt;/li&gt;
&lt;li&gt;did the verifier accept the artifact?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those are workflow behaviours. They are exactly the behaviours that matter when a domain is not already solved by the base model&apos;s priors.&lt;/p&gt;
&lt;h2&gt;Exporting aec-bench Tasks to Prime Lab&lt;/h2&gt;
&lt;p&gt;We exported an aec-bench task suite into a Prime-compatible Verifiers environment and ran a short hosted RL experiment on &lt;code&gt;Qwen/Qwen3.5-4B&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The mechanics were refreshingly direct:&lt;/p&gt;
&lt;p&gt;&amp;lt;PrimeRunFlowDiagram
title=&quot;Hosted run path&quot;
steps={primeRunFlowSteps}
caption=&quot;The task suite leaves aec-bench as a Prime-compatible environment, trains in Lab, then returns as comparable base-vs-adapter traces inside the aec-bench ledger.&quot;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;The training run was intentionally small. It was not meant to establish a production-quality adapter but more so to understand whether the loop works end to end on real benchmark tasks?&lt;/p&gt;
&lt;p&gt;And it did!&lt;/p&gt;
&lt;p&gt;&amp;lt;LineTrajectory {...trainingTrajectoryData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;During the run, mean reward rose from &lt;strong&gt;0.281&lt;/strong&gt; to &lt;strong&gt;0.979&lt;/strong&gt;, and mean &lt;code&gt;submit_answer&lt;/code&gt; calls rose from &lt;strong&gt;0.099&lt;/strong&gt; to &lt;strong&gt;0.917&lt;/strong&gt;. That second number is the more interesting one. It suggests the model was not merely producing better-looking text; it was more often reaching the part of the workflow where the verifier could evaluate the submitted artifact.&lt;/p&gt;
&lt;p&gt;The caveat is simple: this was a small training slice, probably helped by task-slice simplicity, and it was a loop proof rather than a benchmark-grade result. For this first pass, the point was to prove that the evaluation harness could become a training harness without changing the task&apos;s definition of success.&lt;/p&gt;
&lt;h2&gt;First Adapter Check: Base vs Adapter&lt;/h2&gt;
&lt;p&gt;After training, we ran a small medium-difficulty stateful comparison and imported the Prime eval samples back into the aec-bench ledger.&lt;/p&gt;
&lt;p&gt;&amp;lt;GroupedBars {...adapterComparisonData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The headline result:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Base&lt;/th&gt;
&lt;th&gt;Adapter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reward mean&lt;/td&gt;
&lt;td&gt;0.333&lt;/td&gt;
&lt;td&gt;0.800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nonzero rollouts&lt;/td&gt;
&lt;td&gt;5/15&lt;/td&gt;
&lt;td&gt;12/15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final environment response&lt;/td&gt;
&lt;td&gt;2/15&lt;/td&gt;
&lt;td&gt;8/15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Empty response errors&lt;/td&gt;
&lt;td&gt;13/15&lt;/td&gt;
&lt;td&gt;3/15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mean tool calls&lt;/td&gt;
&lt;td&gt;2.67&lt;/td&gt;
&lt;td&gt;4.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mean &lt;code&gt;submit_answer&lt;/code&gt; calls&lt;/td&gt;
&lt;td&gt;0.13&lt;/td&gt;
&lt;td&gt;0.53&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The adapter did more of the work. It read more, wrote more, submitted more, and failed with empty responses less often. I think it what happened was workflow learning rather than general engineering competence.&lt;/p&gt;
&lt;p&gt;It became more likely for the model to stay inside the environment (task world) long enough to produce something the verifier could judge.&lt;/p&gt;
&lt;p&gt;Trace analysis supports that interpretation. Both base and adapter runs were mostly execution-heavy. The adapter did not become wildly more exploratory or magically more intelligent. It became better at execution-through-recovery: use the workspace, repair small tool friction, write the artifact, and submit it.&lt;/p&gt;
&lt;p&gt;Modest result, but a useful one.&lt;/p&gt;
&lt;h2&gt;Why Imported Traces Matter&lt;/h2&gt;
&lt;p&gt;Hosted training dashboards are useful, but they are not enough for the kind of work aec-bench is trying to do.&lt;/p&gt;
&lt;p&gt;The important move is that the Lab&apos;s eval samples can easily come back into the aec-bench ledger. Once they are there, they can be inspected with the same reporting tools we use for normal benchmark runs: reward, stop condition, tool calls, error type, submission behaviour, and representative conversations.&lt;/p&gt;
&lt;p&gt;That turns the adapter check from an anecdote into an artifact.&lt;/p&gt;
&lt;p&gt;It also connects this work to &lt;a href=&quot;/blog/what-if-the-harness-could-improve-itself/&quot;&gt;What If the Harness Could Improve Itself?&lt;/a&gt;. That article looked at automated improvement of one harness surface: the prompt. This integration makes a stronger version possible. We can now improve the policy itself while keeping the task, verifier, and trace analysis in the same experimental frame.&lt;/p&gt;
&lt;p&gt;This is also adjacent to &lt;a href=&quot;/blog/the-third-axis/&quot;&gt;The Third Axis&lt;/a&gt;. The third axis was about improving the environment around the model, alongside model size and inference-time reasoning. Prime Lab gives that idea a concrete RL path: once a task environment is explicit and verifiable, the policy can adapt to it.&lt;/p&gt;
&lt;h2&gt;What the First Adapter Result Does and Does Not Show&lt;/h2&gt;
&lt;p&gt;The result is narrow, but real. aec-bench can now expose engineering tasks as trainable environments, Lab can run hosted RL against them without replacing the verifier, and the resulting samples can come back into the aec-bench ledger for local inspection. In this first adapter check, that produced measurable movement in workflow completion.&lt;/p&gt;
&lt;p&gt;It does not mean the adapter has general engineering competence, or that the task family is solved. The eval was only 15 samples, and one task family stayed stubborn: retaining-wall stability remained &lt;strong&gt;0/3&lt;/strong&gt; nonzero for both base and adapter. That is useful information, not an embarrassment. Some behaviours may be learnable from the current environment. Others may need better task design, better tools, stronger verifiers, or simply a larger and more varied training slice.&lt;/p&gt;
&lt;h2&gt;The Larger Point: Benchmark, Train, Inspect&lt;/h2&gt;
&lt;p&gt;This is why the integration feels important.&lt;/p&gt;
&lt;p&gt;The path from real task to trainable environment is becoming short:&lt;/p&gt;
&lt;p&gt;&amp;lt;LabCouplingSwimlanes
title=&quot;aec-bench / Lab coupling&quot;
steps={labCouplingFlowSteps}
caption=&quot;aec-bench owns the task, verifier, environment export, and trace inspection. Lab owns the hosted training and evaluation loop. The useful part is the handoff: the verifier goes out with the environment, and the traces come back for inspection.&quot;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;That used to be a research project. With aec-bench and Prime Lab, it starts to look like normal infrastructure.&lt;/p&gt;
&lt;p&gt;And that matters because closing the out-of-distribution gap in engineering will not come from one lever. Base models, tools, verifiers, environments, and training pressure all have to feed the same loop. And they all have to be accessible to domain expertise.&lt;/p&gt;
&lt;p&gt;We can define real work, measure real failures, train against those failures, and inspect whether the behaviour actually changed.&lt;/p&gt;
&lt;p&gt;For aec-bench, that is a real promotion.&lt;/p&gt;
&lt;p&gt;It stops being only a test.&lt;/p&gt;
&lt;p&gt;It is slowly becoming a lab.&lt;/p&gt;
</content:encoded><author>Theodoros Galanos</author></item><item><title>Executable Standards</title><link>https://theharness.blog/blog/executable-standards/</link><guid isPermaLink="true">https://theharness.blog/blog/executable-standards/</guid><description>Better tools and verifiers are not enough. The next harness boundary is the clause itself — turning standards, briefs, and codes into versioned predicates and replayable certificates.</description><pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import TransformationLadder from &apos;../../components/charts/TransformationLadder.astro&apos;;
import PredicateCorpusExplorer from &apos;../../components/charts/PredicateCorpusExplorer.astro&apos;;
import CertificateBinding from &apos;../../components/charts/CertificateBinding.astro&apos;;
import DocumentPipeline from &apos;../../components/charts/DocumentPipeline.astro&apos;;
import Pullquote from &apos;../../components/Pullquote.astro&apos;;
import {
transformationLadderData,
predicateCorpusData,
certificateBindingData,
documentsToRequirementsData,
autoformPipelinePreviewData,
} from &apos;../../data/executable-standards-charts&apos;;&lt;/p&gt;
&lt;p&gt;Estimated reading time: 11 minutes&lt;/p&gt;
&lt;h2&gt;The Failures We Keep Seeing&lt;/h2&gt;
&lt;p&gt;The recurring failure in agentic engineering is not that the model cannot write a convincing answer.&lt;/p&gt;
&lt;p&gt;It can.&lt;/p&gt;
&lt;p&gt;That is often the problem.&lt;/p&gt;
&lt;p&gt;Across the previous Harness posts, the same pattern keeps appearing under different names. The model retrieves the wrong table but writes as if it has found the right one. It performs the calculation but does not notice the unit mismatch. It gives a plausible compliance statement without pinning the standard version. It explains the reasoning path, but the reasoning path is not the artefact we can audit.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;/blog/the-third-axis/&quot;&gt;The Third Axis&lt;/a&gt;, the visible failure was a tool habit. One executor would inspect the environment before calculating; another would deliberate from memory about tables it did not have. In &lt;a href=&quot;/blog/where-capability-actually-lives-in-agentic-engineering/&quot;&gt;Where Capability Actually Lives&lt;/a&gt;, the larger point was that model capability is only one part of the system. The harness — tools, interfaces, constraints, verifiers, task design — carries a large part of what we call capability. In &lt;a href=&quot;/blog/the-harness-is-all-you-need/&quot;&gt;The Harness Is All You Need&lt;/a&gt;, the claim was even sharper: as agentic systems get longer-running, the surrounding structure matters more, not less.&lt;/p&gt;
&lt;p&gt;This post is about the next boundary.&lt;/p&gt;
&lt;p&gt;At some point, a better tool loop is not enough. A better retrieval system is not enough. A better verifier around the final answer is not enough. The obligation itself has to stop living only as prose.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
The next harness boundary is not another tool call. It is the clause itself.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;h2&gt;From Documents To Requirements&lt;/h2&gt;
&lt;p&gt;This is also a quality-assurance story.&lt;/p&gt;
&lt;p&gt;Traditional QA asks whether the review process has evidence: requirements traced, checks performed, assumptions recorded, comments closed, approvals captured. AI does not remove that need. It makes the evidence problem sharper. If an agent says &lt;em&gt;&quot;the design complies&quot;&lt;/em&gt;, what did it actually check? Which clause? Which amendment? Which jurisdictional override? Which source span? Which interpretation of an ambiguous &lt;em&gt;&quot;shall&quot;&lt;/em&gt;? Which assumptions? Which calculation witness? Which verifier?&lt;/p&gt;
&lt;p&gt;Engineering already has a mature instinct for the first move.&lt;/p&gt;
&lt;p&gt;No one who has worked with specifications, codes, project briefs, employer&apos;s requirements, design criteria, or contract schedules believes that the source document is naturally shaped for computation. The source document is written for humans: committees, clients, reviewers, engineers of record, contractors, auditors. It carries context, authority, convention, exceptions, and the scar tissue of previous projects.&lt;/p&gt;
&lt;p&gt;So the first transformation is familiar:&lt;/p&gt;
&lt;p&gt;&amp;lt;DocumentPipeline {...documentsToRequirementsData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;It is requirements engineering. &lt;a href=&quot;https://research.manchester.ac.uk/en/publications/easy-approach-to-requirements-syntax-ears&quot;&gt;EARS, the Easy Approach to Requirements Syntax&lt;/a&gt;, is a way to constrain natural-language requirements so they become less ambiguous, less vague, and easier to test. &lt;a href=&quot;https://people.cs.ksu.edu/~dwyer/spec-patterns.ORIGINAL&quot;&gt;Dwyer, Avrunin, and Corbett&apos;s specification patterns&lt;/a&gt; gave software and systems engineers a catalogue of common temporal property shapes.[^patterns] &lt;a href=&quot;https://www.omg.org/spec/SysML/1.7/About-SysML&quot;&gt;SysML&lt;/a&gt; and INCOSE-style requirements practice gave engineering teams a way to type and trace requirements through complex systems.&lt;/p&gt;
&lt;p&gt;The exact framework matters less than the shared instinct: free-form prose has to be decomposed before it can be managed.&lt;/p&gt;
&lt;p&gt;We have already been building this kind of pipeline for ordinary engineering AI work. In our requirement segmentation workflows, large specification documents are split into atomic, traceable, classified records. Each record preserves source spans, section references, related standards, applicable equipment or areas, verification methods, priorities, confidence scores, and quality signals.&lt;/p&gt;
&lt;p&gt;The same shift is visible in geometry: drawings became models, and &lt;a href=&quot;https://www.iso.org/cms/%20render/live/en/sites/isoorg/contents/data/standard/06/80/68078.html&quot;&gt;ISO 19650&lt;/a&gt; and &lt;a href=&quot;https://www.buildingsmart.org/standards/bsi-standards/industry-foundation-classes/&quot;&gt;IFC&lt;/a&gt; exist precisely because building information needs to be exchanged in a machine-interpretable form. Documents become requirements; drawings become models; tacit coordination becomes structured data. Autoformalisation extends the pattern to obligations.&lt;/p&gt;
&lt;p&gt;A requirements register helps. It gives the agent smaller, named obligations instead of one large textual fog. But a register still leaves the most important step unresolved: the agent can still read a structured requirement and interpret it incorrectly at runtime. That is where autoformalisation starts.&lt;/p&gt;
&lt;h2&gt;From Requirements To Predicates&lt;/h2&gt;
&lt;p&gt;Autoformalisation is a heavy word for a simple ambition: turn human-authored requirements into machine-checkable obligations.&lt;/p&gt;
&lt;p&gt;In the version we are building for AEC, the pipeline looks like this:&lt;/p&gt;
&lt;p&gt;&amp;lt;DocumentPipeline {...autoformPipelinePreviewData} dense /&amp;gt;&lt;/p&gt;
&lt;p&gt;The goal is not to prove every engineering judgement in &lt;a href=&quot;https://lean-lang.org/&quot;&gt;Lean&lt;/a&gt;.[^lean] That would be a lovely way to never ship anything.&lt;/p&gt;
&lt;p&gt;The pragmatic target is narrower. Take requirements that can be made checkable, lift them into typed predicates over design state, preserve provenance, attach discharge tests and witnesses, and store the result in a versioned corpus that can be queried by a verifier.&lt;/p&gt;
&lt;p&gt;Four pieces of vocabulary, in plain terms. A &lt;strong&gt;predicate&lt;/strong&gt; is a small function that takes a design and returns pass or fail along with the numbers it used to decide. &lt;strong&gt;Discharge tests&lt;/strong&gt; are canonical examples that should pass and others that should fail — the sanity check that the predicate actually encodes the clause. A &lt;strong&gt;witness&lt;/strong&gt; is the evidence a predicate emits when it answers, so a reviewer can see what the check looked at. A &lt;strong&gt;verifier&lt;/strong&gt; is the program that runs predicates against a design and emits the certificate.&lt;/p&gt;
&lt;p&gt;For a fabricated cable-sizing example, the source might begin as natural-language prose:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The voltage drop for a final subcircuit shall not exceed 5 percent of the
nominal voltage under the stated design load.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That clause becomes a typed predicate over design state:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@requirement(&quot;AS3000-3.4.3&quot;)
def voltage_drop_within_limit(design: CableDesign) -&amp;gt; PredicateResult:
    percent = 100 * design.voltage_drop_v / design.nominal_voltage_v
    return PredicateResult.bounded(
        percent &amp;lt;= 5.0,
        witness={&quot;actual_percent&quot;: percent, &quot;limit_percent&quot;: 5.0},
    )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The atomic-requirement record and the corpus entry that wrap this predicate — &lt;code&gt;requirement_id&lt;/code&gt;, &lt;code&gt;scope_tags&lt;/code&gt;, &lt;code&gt;standard_version&lt;/code&gt;, &lt;code&gt;source_hash&lt;/code&gt;, &lt;code&gt;predicate_hash&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt; — are shown in Figure 1.&lt;/p&gt;
&lt;p&gt;The source clause is still authoritative. The human-readable requirement still exists. But the thing the verifier consumes is no longer a paragraph. It is an executable predicate with identity, provenance, tests, metadata, and a lifecycle.&lt;/p&gt;
&lt;p&gt;This is where the formal-methods literature becomes useful, but not as theatre.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://arxiv.org/abs/2405.06624&quot;&gt;Guaranteed Safe AI&lt;/a&gt; and &lt;a href=&quot;https://www.aria.org.uk/programme-safeguarded-ai/&quot;&gt;Safeguarded AI&lt;/a&gt; framing describes a triple: world model, specification, verifier. The world model says what can happen — the regime of physical situations the predicates were validated against. The specification says what is acceptable. The verifier produces an auditable certificate that the design satisfies the specification within the validated regime.[^gsa] In our setting, AEC standards and project requirements are the specification source. Autoformalisation is the machinery that turns that source into something a verifier can use.&lt;/p&gt;
&lt;p&gt;It is &lt;em&gt;AI4FV&lt;/em&gt; before &lt;em&gt;FV4AI&lt;/em&gt;: use AI to help perform formal verification of engineering outputs before attempting the harder problem of formally verifying the internals of the AI system itself.[^ai4fv]&lt;/p&gt;
&lt;p&gt;The engineer still matters. In fact, the engineer matters more visibly. The human task moves from repeatedly interpreting prose at runtime to auditing the lifted predicate, reviewing its tests, checking its provenance, and deciding when a requirement is too ambiguous to sharpen safely.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
Auditing is cheaper than authoring. It is also a better place to put scarce expert attention.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;TransformationLadder {...transformationLadderData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Autoformalisation should feel like a sequence of increasingly constrained artefacts, not a mystical leap.&lt;/p&gt;
&lt;h2&gt;The Corpus Is Infrastructure&lt;/h2&gt;
&lt;p&gt;Once predicates exist, the hard problem becomes governance.&lt;/p&gt;
&lt;p&gt;Where do they live? Who can change them? What does a patch look like? How do we know which standard version a certificate used? What happens when a code amendment changes a clause? How do jurisdictions override each other — say, an AS/NZS clause overridden by a state-level Service &amp;amp; Installation Rule? How do we prevent a verifier from accidentally consuming half-built work?&lt;/p&gt;
&lt;p&gt;Our current answer is deliberately boring: a git-tracked filesystem. Predicate source is code. Tests are code. Metadata and provenance are JSON. Indexes are generated and checked in. Review happens through ordinary code review.&lt;/p&gt;
&lt;p&gt;Databases are not the issue. The review surface matters — and the filesystem is also the operating surface of AI agents. Agents read, write, diff, and review files. They open pull requests, not rows. A corpus that lives as files is a corpus the harness, the auditor, and the agent can all reason about with the same tools.&lt;/p&gt;
&lt;p&gt;If a standard changes, I want a patch that shows: the old predicate and the new predicate; the discharge tests that changed; the source requirement hashes; the provenance record; the generated index diff; the explicit supersession edge.&lt;/p&gt;
&lt;p&gt;I do not want &lt;em&gt;&quot;the compliance database was updated&quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The corpus design also draws a hard lifecycle boundary. Public queries return released predicates by default. Draft, staged, audited, deprecated, and rejected material remains visible for review and traceability, but it is not consumed by certification unless a caller deliberately asks for development mode.&lt;/p&gt;
&lt;p&gt;That default is small but important. In compliance settings, &lt;em&gt;&quot;latest wins&quot;&lt;/em&gt; is too magical. A verifier should not infer authority from file modification time, semantic version number, or whichever predicate happened to appear first in a search result. Released obligations need explicit status. Replacements need explicit &lt;code&gt;supersedes&lt;/code&gt; and &lt;code&gt;replaces&lt;/code&gt; edges. Jurisdictions need caller-supplied precedence, not a hidden ontology pretending to know every legal override.&lt;/p&gt;
&lt;p&gt;The corpus is the specification layer of the harness.&lt;/p&gt;
&lt;p&gt;&amp;lt;PredicateCorpusExplorer {...predicateCorpusData} /&amp;gt;&lt;/p&gt;
&lt;h2&gt;Certificates, Not Explanations&lt;/h2&gt;
&lt;p&gt;The final artefact is not the agent&apos;s explanation.&lt;/p&gt;
&lt;p&gt;The distinction matters because a design agent may be useful, eloquent, and wrong. It may produce a chain of thought that sounds like engineering reasoning. It may cite a standard, calculate a margin, and conclude compliance. None of that is the trusted artefact.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
The trusted artefact is a certificate accepted by a small checker.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;p&gt;That makes the certificate a QA object as much as a technical one. It is the thing a reviewer, auditor, or engineer of record can inspect without trusting the agent&apos;s narration. The question changes from &lt;em&gt;&quot;do I believe this answer?&quot;&lt;/em&gt; to &lt;em&gt;&quot;does this certificate bind the right design, predicates, witnesses, assumptions, and policy?&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For the same fabricated cable run, the design input might be:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;design_id&quot;: &quot;cable-run-A17&quot;,
  &quot;load_current_a&quot;: 63,
  &quot;route_length_m&quot;: 42,
  &quot;nominal_voltage_v&quot;: 230,
  &quot;voltage_drop_v&quot;: 8.7
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The verifier result binds that design to a released predicate, and the certificate then records the design hash, predicate hashes, standard versions, the &lt;strong&gt;assumption ledger&lt;/strong&gt; (a frozen record of the inputs, exclusions, and conservative choices the design was made under), the world-model reference, the witness bundle, the verifier policy, and the per-layer results. Figure 3 makes the binding explicit.&lt;/p&gt;
&lt;p&gt;That is a very different object from &lt;em&gt;&quot;the model says it complies&quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It can be replayed and re-checked. A predicate change invalidates it. A bounded layer downgrades it. Open items travel with it. The certificate says: &lt;em&gt;valid under these assumptions, against these predicates, with these witnesses, under this policy&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The verifier portfolio is the piece that keeps this honest. We do not need one giant verifier that does everything. We need complementary layers with explicit failure semantics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;algebraic checks for calculation correctness;&lt;/li&gt;
&lt;li&gt;physical invariant checks for impossible design states;&lt;/li&gt;
&lt;li&gt;clause compliance against released predicates;&lt;/li&gt;
&lt;li&gt;cross-discipline checks where one discipline&apos;s conclusion becomes another&apos;s premise;&lt;/li&gt;
&lt;li&gt;assumption-ledger checks for source and scope discipline;&lt;/li&gt;
&lt;li&gt;out-of-distribution checks against the world-model envelope.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some layers pass. Some produce bounded results. Some are deferred by policy. Some create open items. Failures and verifier errors block the certificate.&lt;/p&gt;
&lt;p&gt;The important thing is that the status is explicit.&lt;/p&gt;
&lt;p&gt;The harness should not need to trust the model&apos;s confidence. It should inspect the certificate.&lt;/p&gt;
&lt;p&gt;&amp;lt;CertificateBinding {...certificateBindingData} /&amp;gt;&lt;/p&gt;
&lt;h2&gt;What We Have Built So Far&lt;/h2&gt;
&lt;p&gt;Harness engineering is the discipline of deciding what the model should not be trusted to do unaided. First it meant tools, then evaluation, now specification. Calculation went that way. Retrieval went that way. Standards are next.&lt;/p&gt;
&lt;p&gt;This is not a production assurance system yet. But it is past sketch.&lt;/p&gt;
&lt;p&gt;Inside &lt;code&gt;aec-bench&lt;/code&gt;, we have started splitting the work into &lt;code&gt;aec-autoform&lt;/code&gt;: a package for the autoformalisation pipeline rather than another benchmark module. That boundary matters. &lt;code&gt;aec-bench&lt;/code&gt; is a measurement instrument. &lt;code&gt;aec-autoform&lt;/code&gt; is infrastructure that produces predicates and certificates. The benchmark can consume it, but should not own it.&lt;/p&gt;
&lt;p&gt;Where each stage stands today:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Document → atomic requirements&lt;/td&gt;
&lt;td&gt;existing data-pipeline work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Atomic requirements → typed predicates&lt;/td&gt;
&lt;td&gt;cookbook implemented: triage, decomposition, type binding, predicate authoring, discharge tests, self-check, audit, tier-up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Predicate corpus&lt;/td&gt;
&lt;td&gt;scaffold with predicate directories, manifest and provenance contracts, deterministic hashes, generated indexes, released-only queries, validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificates&lt;/td&gt;
&lt;td&gt;contracts taking shape: frozen records for design references, corpus references, world-model references, assumption ledgers, policies, layer results, witnesses, signatures, identifiers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The first serious forcing example is cable sizing.&lt;/p&gt;
&lt;p&gt;It is concrete enough to keep us honest and general enough to expose the real architecture. Cable sizing has standards, clauses, tables, calculations, assumptions, jurisdictions, amendments, and verifier-friendly outputs. It is not the whole of engineering. Good. The first version should not pretend to be.&lt;/p&gt;
&lt;p&gt;The project can fail in useful ways. A requirement may be too ambiguous to lift. A predicate may encode the clause too narrowly. A test may fail. A jurisdiction conflict may require explicit human judgement. A source document may not be licensable for inclusion. A world-model envelope may be too weak. A certificate may be invalid.&lt;/p&gt;
&lt;p&gt;Those are not embarrassments. Those are the point. The harness should make the failure explicit before the design gets trusted.&lt;/p&gt;
&lt;p&gt;If this path works, the shift that matters is not better AI answers. It is that an engineering obligation becomes something the harness can inspect.&lt;/p&gt;
&lt;p&gt;Benchmarks tell us where agents fail. Harnesses give agents tools and structure. Autoformalisation turns the standard itself into part of the harness, and turns quality assurance from a retrospective document review into a replayable check over explicit artefacts.&lt;/p&gt;
&lt;p&gt;The standard has to become executable because the alternative is asking the model to keep re-reading the law of the task from scratch.&lt;/p&gt;
&lt;p&gt;And we have seen how that goes.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;[^patterns]: The point of the Dwyer patterns here is not that every AEC requirement is temporal logic. It is that many requirements have recurring semantic shapes: absence, existence, response, precedence, bounded existence, and so on. Pattern libraries give the lift process a vocabulary before it reaches for a theorem prover.&lt;/p&gt;
&lt;p&gt;[^lean]: Lean is a programming language and interactive theorem prover. It matters because some obligations eventually deserve proof-assistant rigour — high-consequence clauses, safety-critical interlocks, regulatory submissions where the cost of being wrong justifies the ceremony. It should not become the default hammer. For v1, typed Python predicates, deterministic tests, and auditable certificates are the shipping path; Lean is a tier-up option.&lt;/p&gt;
&lt;p&gt;[^gsa]: In the Guaranteed Safe AI framing, the verifier does not certify the model&apos;s inner thoughts. It certifies a claim relative to a world model and specification. That distinction is why the certificate can be smaller and more trustworthy than the agent that produced the candidate design.&lt;/p&gt;
&lt;p&gt;[^ai4fv]: AI4FV means &quot;AI for formal verification&quot;: using AI to help produce predicates, witnesses, proofs, tests, and counterexamples. FV4AI means &quot;formal verification for AI&quot;: proving properties of the AI system itself. The latter is the bigger research mountain. The former is already useful for engineering workflows.&lt;/p&gt;
</content:encoded><author>Theodoros Galanos</author></item><item><title>The Third Axis</title><link>https://theharness.blog/blog/the-third-axis/</link><guid isPermaLink="true">https://theharness.blog/blog/the-third-axis/</guid><description>What happens when you let the harness improve itself — two experiments in feedback-driven harness evolution, and an honest look at how rough the trajectory actually is.</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import AdvisorHeatmap from &apos;../../components/charts/AdvisorHeatmap.astro&apos;;
import BarsWithBaseline from &apos;../../components/charts/BarsWithBaseline.astro&apos;;
import HorizontalStackedBars from &apos;../../components/charts/HorizontalStackedBars.astro&apos;;
import LineTrajectory from &apos;../../components/charts/LineTrajectory.astro&apos;;
import Pullquote from &apos;../../components/Pullquote.astro&apos;;
import {
advisorGridData,
bondDistributionData,
experiment1TrajectoryData,
experiment2TrajectoryData,
frontierDotData,
} from &apos;../../data/third-axis-charts&apos;;&lt;/p&gt;
&lt;p&gt;Estimated reading time: 14 minutes&lt;/p&gt;
&lt;h2&gt;Three Ways to Make an Agent Better&lt;/h2&gt;
&lt;p&gt;There are two scaling stories the industry tells.&lt;/p&gt;
&lt;p&gt;The first is &lt;strong&gt;training-time compute&lt;/strong&gt;: make the model bigger, feed it more data, let the next generation carry you further. The second is &lt;strong&gt;inference-time compute&lt;/strong&gt;: give the model more room to think — reasoning traces, tool loops, longer context.&lt;/p&gt;
&lt;p&gt;Anthropic&apos;s own engineering posts have been quietly building out a third. &lt;a href=&quot;https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents&quot;&gt;Effective harnesses for long-running agents&lt;/a&gt; argues that &lt;em&gt;&quot;model capability alone is insufficient&quot;&lt;/em&gt; — capability emerges from harness maturity. &lt;a href=&quot;https://www.anthropic.com/engineering/managed-agents&quot;&gt;Managed agents&lt;/a&gt; describes harnesses as &lt;strong&gt;disposable infrastructure&lt;/strong&gt;, OS-like abstractions that outlast the models they host. &lt;a href=&quot;https://www.anthropic.com/engineering/harness-design-long-running-apps&quot;&gt;Harness design for long-running apps&lt;/a&gt; puts it plainly:&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote attribution=&quot;Anthropic, Harness design for long-running apps&quot;&amp;gt;
Every component in a harness encodes an assumption about what the model can&apos;t do on its own.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;p&gt;As models improve, those assumptions decay, and the harness needs pruning.&lt;/p&gt;
&lt;p&gt;The logical next step is to let the model improve its own harness. Not prompt engineering by hand — automated, with real task feedback, a diagnosis agent that reads its own failures and proposes mutations. In &lt;a href=&quot;/blog/recursive-by-design/&quot;&gt;Recursive by Design&lt;/a&gt; I laid out the architecture the rest of this work sits on top of — Recursive Language Models and Lambda-RLM as building blocks for harnesses that can carry long-running engineering tasks. This post is about what happens when you point the same pattern at the harness itself.&lt;/p&gt;
&lt;p&gt;These are a handful of early experiments, on a small collection of tasks. But they still tell us something.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
The third axis is real, but the trajectory is rougher than the tidy story suggests.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Loop&lt;/h2&gt;
&lt;p&gt;A harness improvement loop sounds obvious in the abstract. Run the harness. See what it got wrong. Change something. Run it again. The detail hiding inside &quot;change something&quot; is where every wrong turn lives.&lt;/p&gt;
&lt;p&gt;Three questions have to be answered before the loop produces anything other than noise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How does the agent know what the run actually did?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A failing reward score tells you the answer was wrong. It doesn&apos;t tell you &lt;em&gt;why&lt;/em&gt;. Was the model missing a fact? Did it call the wrong tool? Did it spin on the problem without committing? Did it charge forward without checking its own work?&lt;/p&gt;
&lt;p&gt;Every assistant turn in a trajectory is labelled with one of four behaviours — what I call &lt;a href=&quot;https://arxiv.org/abs/2601.06002&quot;&gt;&lt;em&gt;bonds&lt;/em&gt;&lt;/a&gt;, following the agent-behaviour taxonomies literature. &lt;strong&gt;Execution&lt;/strong&gt;: the obvious forward motion — tool calls, code runs, formatting an answer. &lt;strong&gt;Verification&lt;/strong&gt;: looking backward at your own work, comparing output to expectations, catching errors. &lt;strong&gt;Deliberation&lt;/strong&gt;: committed multi-step reasoning along a single path. e&lt;strong&gt;X&lt;/strong&gt;ploration: branching, considering alternatives, hedging, forming hypotheses. The classifier is itself an LLM, prompted with definitions, indicators, and tie-break rules — verification wins over exploration wins over deliberation wins over execution, because the quieter behaviours are the easier ones to under-count.&lt;/p&gt;
&lt;p&gt;From the labelled sequence I build a transition matrix: the probability of going from Exploration to Deliberation, from Execution to Verification, and so on. Aggregate the matrices across many high-reward trials and you get an &lt;em&gt;ideal pattern&lt;/em&gt; — the shape of thinking that tends to succeed. Compare a new run&apos;s matrix to the ideal and you get a structural score: not &quot;did this answer land&quot; but &quot;did this agent think in a shape that usually lands.&quot;&lt;/p&gt;
&lt;p&gt;Bonds describe the &lt;em&gt;shape&lt;/em&gt; of the reasoning. Separately, a &lt;strong&gt;field-score&lt;/strong&gt; enrichment carries the per-output diagnosis straight from the verifier — not &quot;wrong&quot; but &quot;vc was within 3%, Vd was 18% off, compliance flipped because Vd crossed the threshold.&quot; The evolver reads both. Bonds tell it how the agent thought. Field scores tell it where the answer fell short.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How does it decide what to change?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The first version of the evolver did everything in one LLM call: &quot;here&apos;s the trajectory, propose a mutation.&quot; It generated confident nonsense. Beautiful prose, arbitrary edits, no grounding.&lt;/p&gt;
&lt;p&gt;I had to split it in two. Phase one is an &lt;strong&gt;investigator&lt;/strong&gt; — an agent with tools that can query the trace, read the current skills, inspect the graveyard of past mutations, and write a report. [^aggagent] It&apos;s not asked to propose anything; it&apos;s asked to look. Phase two is a &lt;strong&gt;proposer&lt;/strong&gt; — a constrained call that takes the investigation report plus the field scores and returns a structured mutation object. Add a skill, edit the system prompt, change a worked example. One thing at a time. Separating the two kept the proposer grounded: it had to cite the investigation, not vibe-propose.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;graveyard&lt;/strong&gt; feeds the proposer&apos;s prompt. Every mutation that regressed or failed is kept, with its reason. You don&apos;t relearn the same lessons across cycles.&lt;/p&gt;
&lt;p&gt;[^aggagent]: A couple of weeks after I&apos;d built the investigator, a &lt;a href=&quot;https://arxiv.org/abs/2604.11753&quot;&gt;paper on the same pattern&lt;/a&gt; landed. Independent convergence, not influence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do you know it&apos;s not overfitting?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is the question that makes harness evolution different from gradient descent. You can&apos;t just crank down the loss.&lt;/p&gt;
&lt;p&gt;Three guardrails. &lt;strong&gt;Masked feedback&lt;/strong&gt;: the evolver sees &quot;vc was 18% too high&quot; but never the correct value. This keeps it from memorising test answers into the system prompt. &lt;strong&gt;Graduated scope&lt;/strong&gt;: early mutations are quiet (small prompt tweaks); later ones can be structural (new skills, tool changes). You earn the right to larger edits. &lt;strong&gt;Structural scoring&lt;/strong&gt;: rewards are computed per-field against an engine, not LLM-judged. The verifier is deterministic code, not a model you could flatter. [^catch]&lt;/p&gt;
&lt;p&gt;Is it bulletproof? No. A sufficiently clever evolver can still triangulate the masked signal. I haven&apos;t caught it doing so. I&apos;m watching.&lt;/p&gt;
&lt;p&gt;[^catch]: Of course, this is only possible in verifiable domains where explicit verification happens numerically. Rubric design, and in some cases evolution, replaces this approach in more qualitative tasks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The whole loop, in one file.&lt;/strong&gt; One of the pleasant surprises of building this was how terse the runner ended up. Once the bonds classifier, the two-phase evolver, the graveyard, and the guardrails are their own modules, starting a full harness-evolution experiment compresses to a config plus a three-line workspace scaffold. The launcher for Experiment 2 was this: [^aec-bench]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# evolution.yaml
workspace_path: ./my-harness
models:
  classifier: env:AWS_HAIKU_MODEL_ID
  evolver:    env:AWS_SONNET_MODEL_ID
solver:
  name: first-evolution
  adapter: tool_loop
  model: env:AWS_HAIKU_MODEL_ID
  client: {kind: bedrock}
generate:
  template: voltage-drop
  count: 10
  seed: 42
  difficulties: [easy, medium]
tasks:
  domains: [electrical]
backend: local
batch_size: 5
max_cycles: 10
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# One-time workspace scaffold
mkdir -p my-harness/prompts my-harness/skills
echo &quot;You are an expert electrical engineer.&quot; &amp;gt; my-harness/prompts/system.md
printf &apos;agent_adapter: tool_loop\nevolvable_layers: [prompts, skills]\nname: first-evolution\n&apos; &amp;gt; my-harness/manifest.yaml

# Run the evolution loop
aec-bench evolve run -c evolution.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[^aec-bench]: aec-bench is an open-source library for benchmarking agents on engineering tasks. Link when it ships.&lt;/p&gt;
&lt;p&gt;Thirty minutes later you have &lt;code&gt;trials/cycle_*.jsonl&lt;/code&gt; with the same bond-sequence data analysed below. aec-bench isn&apos;t open yet — but the configuration surface is fixed, so this is a fair preview of the ergonomics when it ships.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Experiment 1 — Proof of Life&lt;/h2&gt;
&lt;p&gt;The question was narrow on purpose: can the loop, starting from nothing, improve a harness that I already know how to write by hand?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setup.&lt;/strong&gt; A voltage-drop task with ten instances — the kind of AS/NZS 3008 cable-sizing problem an electrical engineer would solve in their sleep. Haiku 4.5 as the agent. The starting system prompt was one line: &lt;em&gt;&quot;You are an expert electrical engineer.&quot;&lt;/em&gt; No skills. No worked examples. Just the task instruction and a calculator tool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Baseline: 0.85.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That surprised me. A 1-line prompt shouldn&apos;t solve 85% of a benchmark — but the task instruction carried most of the signal. It spells out the procedure (look up voltage-drop coefficient, adjust for single-phase, multiply by power factor, compute drop) and ships with a Python calc tool wrapping the exact engine the verifier uses. Haiku read the instruction, used the tool, and got four of five tasks right. The fifth — a 35mm² three-phase copper run at power factor 0.81 — was failing on the numerical fields by a small margin.&lt;/p&gt;
&lt;p&gt;So: evolution had to close a 15-point gap, on one stubborn task, without the benefit of seeing correct answers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cycles 1 through 5: plateau.&lt;/strong&gt; The evolver kept proposing the obvious thing — inject a voltage-drop coefficient skill. It did that. The skill grew over five cycles into a serious piece of reference material: AS/NZS Table 30 lookup values for both 75°C PVC and 90°C XLPE insulation, cable sizes from 1.5mm² to 300mm², worked examples for single-phase and three-phase. The score didn&apos;t move. Task 3 kept failing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cycle 6: 1.00.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The breakthrough mutation did something different. It &lt;strong&gt;removed&lt;/strong&gt; content. The 90°C XLPE table got dropped — the tasks weren&apos;t using it. Cable sizes above 150mm² got trimmed. The worked examples shrank. And one line was added: &lt;em&gt;&quot;Single-phase: Vc accounts for both conductors.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Task 3 passed. All five tasks passed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cycle 7: 0.70.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The evolver tried one more mutation on top of the peak. It broke two previously-working tasks. Cycles 8–10 returned to the 0.85 plateau. The run never re-hit 1.00.&lt;/p&gt;
&lt;p&gt;&amp;lt;LineTrajectory {...experiment1TrajectoryData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Hill-climb search does not owe you monotonicity. Every search that can find a peak can walk off one. What saves you is that the peak is tagged in git — &lt;code&gt;evo-20260412-0317-6&lt;/code&gt; in this case — and you can roll back. The loop&apos;s job is to &lt;em&gt;find&lt;/em&gt; good harnesses; preserving them is a separate concern, and one aec-bench got right mostly because I borrowed the convention from deployment, not from ML.&lt;/p&gt;
&lt;p&gt;The unexpected lesson is the breakthrough itself. &lt;strong&gt;Less + clearer &amp;gt; more + exhaustive.&lt;/strong&gt; The five-cycle plateau was spent building bigger reference material. The peak was reached by cutting half of it and adding one clarifying sentence. If a human harness engineer had proposed the cycle-6 mutation over coffee, it would have looked obvious. Evolution had to earn it.&lt;/p&gt;
&lt;p&gt;That&apos;s a +15 point autonomous gain, a 30-point swing within a two-cycle window, and a +15 net if you preserve the peak.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Experiment 2 — The Habit Ceiling&lt;/h2&gt;
&lt;p&gt;If prompts-and-skills evolution can close a 15-point gap on Haiku, the next question is whether it can unstick a weaker executor given a stronger lever: a sub-inference tool the agent can call when it hits a wall. Anthropic&apos;s playbook for their &lt;a href=&quot;https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool&quot;&gt;advisor tool&lt;/a&gt; is clean — call at the start, call before declaring done, call when stuck. Does evolution discover that pattern on its own? And does advisor access let GPT-4.1-mini close the gap to Haiku?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setup.&lt;/strong&gt; Six arms, crossing executor (Haiku 4.5 via Bedrock / GPT-4.1-mini via Azure) with prompt strength (a one-line system prompt, a 400-character &quot;call when stuck&quot; hint, and Anthropic&apos;s verbatim 2,300-character recommended advisor-timing block). Three seeds per arm on the main four; two N=1 anchors on the stock-prompt arms. Same ten voltage-drop instances per seed. Advisor backed by Sonnet 4.6, max five calls per trial. Evolution runs for up to ten cycles, stopping early on stagnation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Baselines.&lt;/strong&gt; Before any evolution, on cycle 1:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Executor&lt;/th&gt;
&lt;th&gt;Prompt&lt;/th&gt;
&lt;th&gt;Cycle-1 mean&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Haiku&lt;/td&gt;
&lt;td&gt;hint&lt;/td&gt;
&lt;td&gt;0.88&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haiku&lt;/td&gt;
&lt;td&gt;Anthropic verbatim&lt;/td&gt;
&lt;td&gt;0.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4.1-mini&lt;/td&gt;
&lt;td&gt;hint&lt;/td&gt;
&lt;td&gt;0.47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4.1-mini&lt;/td&gt;
&lt;td&gt;Anthropic verbatim&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Haiku is already roughly where evolution took it in Experiment 1. GPT-4.1-mini is the genuine stuck executor — the arm where a strategic-reasoning escalation tool should matter most. If evolution-plus-advisor works for anyone, it should work here.&lt;/p&gt;
&lt;p&gt;Ten cycles later, the by-arm trajectory is the cleanest summary of the run:&lt;/p&gt;
&lt;p&gt;&amp;lt;LineTrajectory {...experiment2TrajectoryData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The bond distributions tell the first story.&lt;/strong&gt; Aggregated across every trial in the experiment, the four 4.1-mini arms and the two Haiku arms form two disjoint clusters.&lt;/p&gt;
&lt;p&gt;&amp;lt;HorizontalStackedBars {...bondDistributionData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;GPT-4.1-mini does approximately zero exploration. It does not check the environment, run &lt;code&gt;--help&lt;/code&gt;, or inspect the tool before committing to a calculation. It spends roughly a fifth of its turns deliberating — reasoning internally about tables it doesn&apos;t have, &quot;recalling&quot; &lt;code&gt;Vc = 14.6 mV/A/m&lt;/code&gt; from AS/NZS 3008 and running the calc on that, even when the Python tool wrapping the actual engine is sitting in the workspace. The D bonds correlate directly with hallucinated-table failures in the trace.&lt;/p&gt;
&lt;p&gt;Haiku does the opposite. X runs consistently at 12–13% — the first turn is almost always an orientation step, typically &lt;code&gt;--help&lt;/code&gt;. D runs under 1.5% — the model almost never reasons about values it hasn&apos;t looked up. Reward follows the bond shape: Haiku between 0.85 and 1.00, 4.1-mini between 0.40 and 0.60.&lt;/p&gt;
&lt;p&gt;These aren&apos;t intermediate findings that evolution closes over ten cycles. &lt;strong&gt;These are the per-arm distributions after ten cycles of evolution trying to nudge them.&lt;/strong&gt; The evolver correctly diagnosed the 4.1-mini runs as &lt;em&gt;no_exploration&lt;/em&gt; (X = 0% triggers the anti-pattern), rewrote the system prompt with read-tables-first instructions, added a cable-sizing skill with worked examples, and in arm 8 started the run with Anthropic&apos;s 2,300-character call-when-stuck block already installed. The distributions barely moved.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The advisor story is sharper.&lt;/strong&gt; Five calls, across 585 trials. All on Haiku.&lt;/p&gt;
&lt;p&gt;&amp;lt;AdvisorHeatmap {...advisorGridData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Every Haiku seed that called the advisor ended &lt;em&gt;below&lt;/em&gt; the arm mean. The seeds that cruised at 1.00 never pulled it. The seeds that landed at 0.85 pulled it once or twice. That is Anthropic&apos;s own &quot;call when stuck&quot; clause firing exactly on its preconditions — used correctly, used sparingly, used by the model that barely needed it.&lt;/p&gt;
&lt;p&gt;GPT-4.1-mini called the advisor zero times across nine seeds and three prompt variants. Three hundred trials. Zero escalations. One trial&apos;s log from arm 8 puts the refusal starkly. The assistant&apos;s internal calc and the tool output disagree by roughly three-fold on the voltage-drop coefficient:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Assistant: &quot;From AS/NZS 3008 tables, Vc = 14.6 mV/A/m for 6mm² Cu
             → Vd = 4.44 V → 1.93%, compliant&quot;
Tool:      vc_mv_per_a_m: 5.77, voltage_drop_v: 1.97, voltage_drop_percent: 0.86
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Anthropic&apos;s verbatim prompt — the system prompt for this exact trial — says: &lt;em&gt;&quot;if you&apos;ve already retrieved data pointing one way and the advisor points another, don&apos;t silently switch. Surface the conflict in one more advisor call.&quot;&lt;/em&gt; The assistant didn&apos;t. It silently reconciled, sometimes taking the tool value, sometimes keeping its own.&lt;/p&gt;
&lt;p&gt;One negative control makes this feel structural rather than stochastic. &lt;strong&gt;Arm 6 and arm 7 are the same Haiku executor, on the same task, under the same evolver. The only variable is advisor-guidance prompt length&lt;/strong&gt; — 400 characters vs Anthropic&apos;s 2,300. The final reward: 0.93 ± 0.06 vs 0.93 ± 0.06. Neither better nor worse. The strongest available prompt is not a lever on this task for this model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Evolution did try.&lt;/strong&gt; In arm 4 cycle 8 the evolver proposed rewriting the prompt and adding a &lt;code&gt;read-before-act&lt;/code&gt; skill plus a &lt;code&gt;cable-sizing&lt;/code&gt; skill — the score jumped from 0.20 to 0.60, then regressed over the following cycles. In arm 5 seed 42 cycle 2, a proposed mutation went the other direction: batch reward 0.00. An independent instance of the peak-walkoff I saw at cycle 7 of Experiment 1, on a different executor, a different seed, a different mutation target. The search behaves the same.&lt;/p&gt;
&lt;p&gt;One small positive signal at the other end of the distribution. On cycle 10 of arm 6, advisor calls jumped to 0.20 per trial — the evolver had finally surfaced the advisor tool through a prompt mutation, on a Haiku run that was already near-perfect. Evolution &lt;em&gt;can&lt;/em&gt; teach advisor-calling. Just not reliably, and not to the executor that needed it.&lt;/p&gt;
&lt;p&gt;The frame I&apos;d pre-registered — does evolution rediscover Anthropic&apos;s early-call-and-final-call pattern — turned out to be the wrong question. The cleaner finding, which the full matrix makes unavoidable:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prompt evolution can tune what the agent says. It can&apos;t rewire what the agent habitually does.&lt;/strong&gt; 4.1-mini has a deliberation habit — about 21% of its turns — that produces hallucinated table lookups. Haiku has an exploration habit — about 13% — that prevents them. Both habits survive ten cycles of evolver mutation. Both survive Anthropic&apos;s verbatim directive. The advisor tool, which was the exact antidote to 4.1-mini&apos;s problem, was reached for by the model that didn&apos;t need it and refused by the model that did.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
You don&apos;t fix a habit with a hint.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Economic Case, In One Paragraph&lt;/h2&gt;
&lt;p&gt;A third experiment was planned — a full cost/quality frontier across Sonnet, evolved Haiku, and evolved Haiku + advisor. Experiment 2 made the curve unnecessary. Stock Haiku on the voltage-drop task lands at 0.88 before any evolution. Evolved Haiku lands at 0.93 ± 0.06, with some seeds spiking to 1.00. Stock GPT-4.1-mini runs around 0.60. Evolved GPT-4.1-mini, with the strongest available prompt-and-advisor scaffold, lands at 0.53 ± 0.09. &lt;strong&gt;On this task, model choice swamps the gains from prompt evolution — stock Haiku beats evolved GPT-4.1-mini by roughly 35 points on the mean.&lt;/strong&gt; On the frontier that matters — cost per &lt;em&gt;correct&lt;/em&gt; answer, not cost per token — the cheaper-per-token executor stops being the cheaper option. The frontier is a dot, not a curve.&lt;/p&gt;
&lt;p&gt;&amp;lt;BarsWithBaseline {...frontierDotData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;I&apos;ll return to the full cost comparison when I have a task set where the match is actually close.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What I Learned&lt;/h2&gt;
&lt;p&gt;Seven things, ranked by how much they changed how I build.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Evolution quality-audits the benchmark.&lt;/strong&gt; The first three runs stagnated at 0.80 on a different task set — same score, every cycle, different configurations. I assumed the evolver was hitting a reasoning ceiling. It wasn&apos;t. Evolution was achieving 100% on every solvable task and correctly failing on a single unsolvable one — a task whose &quot;hard&quot; difficulty hid a parameter (conductor material) that couldn&apos;t be inferred from the remaining context. A coin flip dressed up as engineering inference. The 0.80 wall wasn&apos;t evolution&apos;s limit; it was the benchmark&apos;s flaw. I audited all 82 templates. Twelve had the same issue. All twelve are now fixed. An evolver that can&apos;t cheat is a more honest auditor than any human review would have been.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hill-climb is not monotonic.&lt;/strong&gt; Cycle 7 broke what cycle 6 had won. I knew this in principle — every stochastic search has this property — but knowing it and watching your 1.00 collapse to 0.70 are different experiences. Experiment 2 gave me a second, independent instance: arm 5 seed 42 cycle 2 regressed to 0.00 on a batch that cycle 1 had handled at 0.40. Different executor, different seed, same shape. The right instinct isn&apos;t &quot;add safeguards to prevent regression&quot;; it&apos;s &quot;preserve peaks cheaply, let the search breathe.&quot; Git tags cost nothing. Use them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;There is a habit ceiling, and prompt evolution sits under it.&lt;/strong&gt; Haiku has a 13% exploration habit; GPT-4.1-mini has a 21% deliberation habit. Both survive ten cycles of mutation and Anthropic&apos;s verbatim 2,300-character advisor-timing block. Evolution of prompts and skills can lift a model that&apos;s close to the answer; it can&apos;t lift one that systematically misreads the situation. The lever that changes habits lives in the model weights (training, fine-tune) or in the architectural scaffolding (structural harnesses that force tool orderings before the model has a chance to deliberate). Prompts ride on top of those, not against them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A 95%-right skill can override correct instinct.&lt;/strong&gt; One of the runs had a skill with worked examples that omitted the power-factor multiplication step. Haiku, left to its own devices, applied power factor correctly from training knowledge. Given the skill, it followed the skill — worked examples and all — and got the answer wrong on 20% of tasks. A skill doesn&apos;t just add knowledge; it &lt;em&gt;displaces&lt;/em&gt; the model&apos;s own. Small omissions in the skill become systematic bugs in the agent. &lt;a href=&quot;/blog/the-harness-is-all-you-need/&quot;&gt;Harness is all you need&lt;/a&gt; — and all it takes to lead the model astray.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Infrastructure constraints compound.&lt;/strong&gt; The turn limit (15) and the skill compaction budget (2000 chars) were both defensible defaults. Together they produced a failure mode — skills truncated mid-example, agents running out of turns on the truncated skills — that looked like a reasoning problem. It wasn&apos;t. It was arithmetic. Two reference tables at AS/NZS precision are ~2000 characters of pure data before any prose. The budget must respect the irreducible size of the domain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trust the model&apos;s judgement on content.&lt;/strong&gt; My first compaction strategy had a hard truncation fallback: if the LLM&apos;s compacted skill exceeded budget, chop the excess. That fallback produced more bugs than the thing it was guarding against. The replacement trusts the model: if it says the skill needs to be this large, the skill is that large. No ceiling. Zero regressions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &quot;third axis&quot; is real, but rougher than the tidy story.&lt;/strong&gt; Evolution did improve the harness. It did so autonomously, with real signal, against a task set where the gap wasn&apos;t closable by prompting alone. It also regressed, plateaued, and mis-diagnosed. None of those are failure modes of the idea; they&apos;re failure modes of any search. The question isn&apos;t whether the axis works. It&apos;s how much of your engineering effort moves into designing the &lt;em&gt;search&lt;/em&gt; — the bonds, the guardrails, the graveyard — versus the harness itself.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;One Strategy Isn&apos;t Enough&lt;/h2&gt;
&lt;p&gt;Hill-climb finds the best single strategy for a task. That&apos;s the shape of the bet in this post: one harness gets better.&lt;/p&gt;
&lt;p&gt;But a benchmark isn&apos;t one task, and a benchmark isn&apos;t one executor. An electrical voltage-drop problem and a structural seismic check reward different behaviours, different skills, different scaffolds. And — the Experiment 2 lesson — a harness that cannot unstick GPT-4.1-mini is not a failed harness in general; it may be exactly the scaffolding that unlocks a different class of executor altogether. Habits don&apos;t bend to prompts, but different habits find home in different harnesses. Hill-climb, by construction, forgets the alternatives it passed on the way up.&lt;/p&gt;
&lt;p&gt;The next post is about what happens when you stop climbing and start archiving — keeping diverse harnesses indexed by behaviour, so the right one can be recalled when the task, and the executor, call for it. Quality over one axis becomes quality across many.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
One strategy isn&apos;t enough.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
</content:encoded><author>Theodoros Galanos</author></item><item><title>Recursive by Design</title><link>https://theharness.blog/blog/recursive-by-design/</link><guid isPermaLink="true">https://theharness.blog/blog/recursive-by-design/</guid><description>Building Recursive Language Model agents for real engineering tasks — from 1.5M tokens to 53K with Lambda-RLM, and what we learned about agent harness design along the way.</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import ProcessComparison from &apos;../../components/charts/ProcessComparison.astro&apos;;
import Pullquote from &apos;../../components/Pullquote.astro&apos;;
import Sidenote from &apos;../../components/Sidenote.astro&apos;;
import { rlmArchitectureShiftData } from &apos;../../data/recursive-by-design-charts&apos;;&lt;/p&gt;
&lt;p&gt;Estimated reading time: 13 minutes&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;/blog/the-harness-is-all-you-need/&quot;&gt;The Harness Is All You Need&lt;/a&gt;, I argued that domain-specific tooling around the model matters more than the model itself. AEC-Bench showed this empirically: the biggest performance gains came from better retrieval and document parsing, not model upgrades. Earlier, in &lt;a href=&quot;/blog/benchmarking-agents-on-real-engineering-work/&quot;&gt;Benchmarking Agents on Real Engineering Work&lt;/a&gt;, we&apos;d seen the same pattern from the other direction — when harness support was stripped away, performance didn&apos;t degrade gracefully. It collapsed.&lt;/p&gt;
&lt;p&gt;These arguments seem to draw a line. Model on one side. Harness on the other. My goal in this article is to discuss with you how that is..more complex than it sounds.&lt;/p&gt;
&lt;p&gt;&amp;lt;Pullquote&amp;gt;
The agent&apos;s reasoning architecture is itself a harness design choice. Agent design and harness design are the same problem.
&amp;lt;/Pullquote&amp;gt;&lt;/p&gt;
&lt;p&gt;When &lt;a href=&quot;https://arxiv.org/abs/2512.24601&quot;&gt;Zhang and Khattab&lt;/a&gt; published the RLM paper&amp;lt;Sidenote&amp;gt;Now accepted at ICML.&amp;lt;/Sidenote&amp;gt; I had the same reaction most people did: &quot;So... this is Claude Code?&quot;, I asked. A model with a persistent REPL. We&apos;ve had that. The performance gains were there, and reported independently. For example, &lt;a href=&quot;https://www.primeintellect.ai/blog/rlm&quot;&gt;Prime Intellect&lt;/a&gt; explored it further, and showed how a smaller model with RLM scaffolding outperforms a larger model without it — but I was still skeptical. What was new here?&lt;/p&gt;
&lt;p&gt;The answer to the question was the same it always is: I had to build one to fully understand it. And as it turns out, the difference is architectural, and it&apos;s easy to miss.&lt;/p&gt;
&lt;p&gt;Claude Code and Codex are powerful systems. But they still put the full context: the conversation, the documents, the task, all of it into the model&apos;s context window. The model attends over all of it, and as the window fills, capability degrades. This is &quot;context rot,&quot; and every long-running agent session hits it eventually.&lt;/p&gt;
&lt;p&gt;RLMs do something fundamentally different. The context lives &lt;em&gt;outside&lt;/em&gt; the model, as a variable in a persistent Python environment. The model never sees the full input. Instead, it writes code to programmatically interact with it — peeking at slices, filtering with regex, chunking and dispatching sub-LLM calls over pieces, accumulating results in variables. The model&apos;s context window stays compact. The work happens in the symbolic environment.&lt;/p&gt;
&lt;p&gt;Three conditions separate an RLM from &quot;a model with a REPL&quot;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Symbolic input&lt;/strong&gt; — the context is a variable in the REPL, not tokens in the window&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persistent execution&lt;/strong&gt; — REPL state persists across turns, variables are memory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recursive LLM invocation&lt;/strong&gt; — code can invoke LLMs inside loops, not as discrete tool calls&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That third condition is the key. It means the model can do O(n) or O(n²) semantic work over an input of length n, something that&apos;s impossible when the entire input has to fit in a fixed-size attention window. The decomposition happens in code, not in the model&apos;s reasoning. And that decomposition strategy — how the model breaks context apart, what it delegates to sub-calls, how it reassembles results — is a design choice. A harness choice.&lt;/p&gt;
&lt;p&gt;This is where the line dissolves. The agent&apos;s recursive strategy &lt;em&gt;is&lt;/em&gt; in fact the harness.&lt;/p&gt;
&lt;h2&gt;Report Generation: Where Recursion Is the Structure of the Work&lt;/h2&gt;
&lt;p&gt;Report generation is one of the most common tasks in AEC, or any industry really, where agentic AI can deliver real value — if the harness is right. The agent receives source documents — project briefs, technical specifications, reference drawings, supplementary material — and must produce a structured deliverable: a fee proposal, a scope of works, a design report. These tasks share a common shape:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;template with a dependency tree&lt;/strong&gt; — some sections depend on other sections being written first&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-document source material&lt;/strong&gt; — often too large for a single context window&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domain-specific writing rules&lt;/strong&gt; per section — construction idioms, discipline conventions, contractual phrasing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured extraction → composition&lt;/strong&gt; — extract facts from sources, then compose prose from those facts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The intuition that led me to RLMs was simple: that output template is a symbolic object with structure — a dependency tree. And the RLM paradigm is built for recursion over symbolic representations. Generating a report &lt;em&gt;is&lt;/em&gt; recursive template filling. Decompose the document into sections. Decompose each section into source extractions. Extract from bounded chunks. Compose results back up the dependency tree. The recursion is the structure of the work.&lt;/p&gt;
&lt;h2&gt;Stage 1: Giving the Model a REPL — Power Without Predictability&lt;/h2&gt;
&lt;p&gt;The first version gave the model a persistent Python REPL with tools for the job: &lt;code&gt;extract()&lt;/code&gt; to pull structured data from documents, &lt;code&gt;summarise()&lt;/code&gt; to compress text, &lt;code&gt;llm_query()&lt;/code&gt; to compose sections from extracted facts, a &lt;code&gt;NOTE()&lt;/code&gt;/&lt;code&gt;RECALL()&lt;/code&gt; scratchpad for persistent memory, and a &lt;code&gt;ReportTemplate&lt;/code&gt; object with dependency-aware section filling. The model generated code in &lt;code&gt;```repl&lt;/code&gt; blocks, executed it, stored results in variables, and composed sections by passing extracted data to sub-LLM calls.&lt;/p&gt;
&lt;p&gt;It worked! And it was also wildly unpredictable.&lt;/p&gt;
&lt;p&gt;Over a dozen experimental runs on the same task with the same model, input token usage ranged from 732K to 1.54M — a 2.1x spread for identical inputs. Some runs completed in 48 turns. Others hit a 150-turn limit and produced nothing useful. The model spent substantial capacity generating control code — Python loops, error handling, variable management — instead of reasoning about the actual engineering content. What the λ-RLM paper later formalised as the &quot;coding tax.&quot;&lt;/p&gt;
&lt;p&gt;The most surprising run was the first one. The REPL commands were broken due to an injection bug — none of the scaffolding loaded. The model, with nothing but a raw REPL and the source documents, produced an excellent 30KB output in 7 turns and 10K tokens. Fully scaffolded runs with 50+ turns produced worse output at 100x the cost.&lt;/p&gt;
&lt;p&gt;That accidental result brought back visions of the bitter lesson. If the model performs better when you get out of its way, why are we building scaffolding at all?&lt;/p&gt;
&lt;p&gt;The answer, in this case at least, is that a single good run isn&apos;t a strategy. The model got lucky. On the next run it might burn a million tokens looping over documents it&apos;s already read. Without structure, you get high variance. Some runs are brilliant. Some are catastrophic. And while that can be a fun process, it isn&apos;t something you can deploy.&lt;/p&gt;
&lt;h2&gt;Stage 2: Context Compaction — Treating the Symptom&lt;/h2&gt;
&lt;p&gt;The second version added intelligent history compaction. When the conversation approached 85% of the context window, a separate model summarised the trajectory — what was read, what was extracted, what sections were filled — and the conversation restarted from that summary. The scratchpad persisted on disk, so critical facts survived the reset. REPL variables persisted in memory.&lt;/p&gt;
&lt;p&gt;With prompt caching on top, the token economics went down to $0.56 per 9-section report (from $3.50 without caching), at a 96% cache hit rate. Fifty turns, every section filled, zero wasted turns.&lt;/p&gt;
&lt;p&gt;But the underlying problem remained. The agent still decided its own decomposition strategy on every run. Different runs still took different paths through the source material. Token usage was lower but still variable. We&apos;d managed the symptom (context window pressure) without addressing the cause: unbounded decomposition.&lt;/p&gt;
&lt;p&gt;What if we computed the decomposition strategy upfront? What if we put domain expertise at use?&lt;/p&gt;
&lt;h2&gt;Stage 3: Lambda-RLM — When the Task Structure Is the Plan&lt;/h2&gt;
&lt;p&gt;The key architectural decision was to stop letting the model decide how to decompose the work.&lt;/p&gt;
&lt;p&gt;Think about what the open REPL actually asks the model to do. It gets a pile of source documents and a template, and has to figure out: which documents feed which sections, how to chunk things that don&apos;t fit in context, when to extract vs summarise, how to handle dependencies between sections, and when it&apos;s done. That&apos;s a planning problem. And the model was solving it differently every run — which is why we got 2.1x token variance on identical inputs.&lt;/p&gt;
&lt;p&gt;But the structure of the task &lt;em&gt;already contains the plan&lt;/em&gt;. The template is a dependency tree. The sources have measurable sizes. The composition operators follow from the section types. Why ask the model to rediscover this every run when you can compute it from the task definition?&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://arxiv.org/abs/2603.20105&quot;&gt;λ-RLM paper&lt;/a&gt; formalised this insight. Replace the open-ended loop with a deterministic pipeline. Confine the model to bounded leaf operations — the part it&apos;s actually good at: understanding and synthesising domain content. Handle the decomposition with pure Python.&lt;/p&gt;
&lt;p&gt;&amp;lt;ProcessComparison {...rlmArchitectureShiftData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;λ-RLM has four phases.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Plan&lt;/strong&gt; reads the template dependency tree, measures source documents, and computes the optimal decomposition — branching factor, leaf chunk sizes, composition operators — with zero LLM calls. Total cost is estimated before the first API call is made.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extract&lt;/strong&gt; walks the plan in dependency order, pulling structured key-value pairs from bounded chunks. The model chooses &lt;em&gt;what&lt;/em&gt; to extract (field names are model-inferred) but the decomposition is fixed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review&lt;/strong&gt; runs a contract alignment check per section: does the extracted data cover the requirements? Are the values specific enough? Sections that fail get a targeted re-extraction pass.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate&lt;/strong&gt; composes each section from extracted data plus dependency context, fills the template, and assembles the final document.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the answer to Stage 1&apos;s scaffolding paradox. The &quot;broken run&quot; wasn&apos;t evidence that models don&apos;t need structure, only that having the &lt;em&gt;wrong kind&lt;/em&gt; of structure — teaching the model a workflow via scaffolding commands — is worse than no structure at all. The right kind of structure matches the shape of the work. The template &lt;em&gt;is&lt;/em&gt; the plan. The recursion is designed in, not left to emerge.&lt;/p&gt;
&lt;p&gt;The configuration is compact:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[template]
tier = &quot;dependency_tree&quot;
definition = &quot;report_template.toml&quot;

[planner]
context_window_chars = 100_000
accuracy_target = 0.80
max_branching_factor = 20

[review]
enabled = true
max_retries_per_source = 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And swapping between the open REPL and the deterministic pipeline is a single flag in aec-bench:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Open-ended REPL — the model decides how to decompose
aec-bench run-local tasks/my-task --adapter rlm --model claude-sonnet-4-6

# Deterministic pipeline — decomposition computed upfront
aec-bench run-local tasks/my-task --adapter lambda-rlm --model claude-sonnet-4-6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The results on the same report generation task:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Open REPL (best run)&lt;/th&gt;
&lt;th&gt;Lambda-RLM&lt;/th&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input tokens&lt;/td&gt;
&lt;td&gt;732K&lt;/td&gt;
&lt;td&gt;33K&lt;/td&gt;
&lt;td&gt;22x less&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total tokens&lt;/td&gt;
&lt;td&gt;740K&lt;/td&gt;
&lt;td&gt;53K&lt;/td&gt;
&lt;td&gt;14x less&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API calls&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;1.8x fewer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calls vs estimate&lt;/td&gt;
&lt;td&gt;unknown&lt;/td&gt;
&lt;td&gt;27/27&lt;/td&gt;
&lt;td&gt;exact match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quality (reward)&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;td&gt;0.73&lt;/td&gt;
&lt;td&gt;+8.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The plan&apos;s call estimate matched the actual execution exactly — deterministic cost, no surprises. And the review phase caught genuine issues: 6 of 8 sections were flagged for extraction gaps. Extractions too vague where the writing guidance demanded specificity, provenance gaps where data couldn&apos;t be traced to source documents. Even when re-extraction couldn&apos;t fix the gap (you can&apos;t extract data from a document that doesn&apos;t exist in the workspace), the review output told us exactly what was missing and why.&lt;/p&gt;
&lt;h2&gt;The Expert Feedback Loop&lt;/h2&gt;
&lt;p&gt;While these numbers tell us something about performance and whether the output improved, they don&apos;t tell us whether a domain professional would sign off on it. Like any other AI workflow, building a task specific harness is something you do alongside domain experts.&lt;/p&gt;
&lt;p&gt;So, after the initial lambda-RLM runs I put the output in front of experts and asked them to review and compare it against their own human-authored equivalent. Section by section. With a focus on &quot;what&apos;s wrong, what&apos;s missing, what would you change?&quot;&lt;/p&gt;
&lt;p&gt;The feedback was specific, and each piece became a concrete change to the harness:&lt;/p&gt;
&lt;p&gt;The agent used &quot;fee proposal&quot; language in a scope of works document — a terminology confusion traced back to an earlier task&apos;s prompts, fixed at the template level. Client-specific construction idioms were absent. These are conventions that live in the heads of discipline leads who&apos;ve written dozens of these documents. No model would learn them from training data because most of this data were never in the training to begin with. So instead, we added them to the writing guidance rules.&lt;/p&gt;
&lt;p&gt;Both agent variants skipped a project objectives subsection. It was in the source brief. The template just didn&apos;t require it — added as a mandatory subsection, along with a contractual definitions section (a standard task feature neither agent generated).&lt;/p&gt;
&lt;p&gt;One reviewer caught a specification contradiction between two sections — the type of cabling specified in one place, was explicitly excluded in another. The human team had caught the same issue in their own review process. That finding inspired a cross-section consistency check: &quot;does section X.XX (Security) contradict section X.XX (Electrical)?&quot;&lt;/p&gt;
&lt;p&gt;Discipline leads noted that their workflow involved tagging sections by discipline lead, with each lead referencing the &lt;em&gt;specific&lt;/em&gt; discipline specification. So we added discipline-specific extraction passes, routing each section&apos;s prompts through the relevant discipline spec summary rather than the whole document.&lt;/p&gt;
&lt;p&gt;The result: v2 output with 20+ properly placed, task-specific idioms (v1 had zero), project objectives, definitions, fewer terminology errors. Measurable improvement on the rubric — and output that a discipline lead would recognise as structurally correct, &lt;em&gt;right&lt;/em&gt; in the ways that matter for the domain.&lt;/p&gt;
&lt;p&gt;This loop — build, evaluate against expert output, collect feedback, feed improvements back into the harness — is how the gap closes. And it depends on having the infrastructure to do it systematically. A rubric that scores specific dimensions. Trajectory data that shows what the agent extracted and how it composed each section. A comparison framework that puts agent output next to human output at the section level. All of which are embedded in aec-bench.&lt;/p&gt;
&lt;h2&gt;Practitioner&apos;s Notes: Designing for Agent Consumers&lt;/h2&gt;
&lt;p&gt;Building the RLM adapters surfaced a set of lessons that apply beyond this specific paradigm. They all share a common thread: when your consumer is a model, the design rules change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agents guess method names.&lt;/strong&gt; The model called &lt;code&gt;get_section_context()&lt;/code&gt; instead of &lt;code&gt;get_context()&lt;/code&gt;, tried &lt;code&gt;.success&lt;/code&gt; on plain dicts, passed wrong argument counts. Each fumble wasted 2-3 turns. By adding &lt;code&gt;__getattr__&lt;/code&gt; with suggestion mappings to the report template — twenty redirects like &quot;did you mean CONTEXT(section_id)?&quot; — the fumbles stopped. If you&apos;re building tools for agents, the API surface needs to be &lt;em&gt;guessable&lt;/em&gt;, not just documented.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HELP() is your API contract.&lt;/strong&gt; The original HELP function was 9 flat lines with no return types and no grouping. The agent couldn&apos;t discover the API. We restructured it into sections (Memory, Sub-Calls, Report Template) with return type annotations on every function. For a human developer, you write docs. For an agent, the docs need to be &lt;em&gt;inside the environment&lt;/em&gt;, callable and complete. And progressive disclosure is essential.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The scratchpad is the real memory.&lt;/strong&gt; Conversation history gets compacted. Variables persist in memory but only until the process ends. The scratchpad — &lt;code&gt;NOTE(key, value)&lt;/code&gt; writing to a JSON file, &lt;code&gt;RECALL(key)&lt;/code&gt; reading it back — survives everything. Agents that NOTE after every extraction can survive unlimited compaction cycles without losing their place. A simple change to the system prompt to say &quot;your scratchpad IS your memory&quot; and the agent&apos;s behaviour adapted immediately. This is the RLM insight in microcosm: durable state lives outside the model&apos;s context window, and the model accesses it symbolically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make sub-calls visible to each other.&lt;/strong&gt; In multi-section reports, section 5&apos;s extraction often needs facts that section 3 already pulled. Without shared history, the agent either re-extracts (wasting tokens) or tries to remember from context (unreliable after compaction). We added a SUBCALL_LOG — an ordered record of every sub-call invocation, queryable by type. Later calls can see what earlier ones returned: &lt;code&gt;SUBCALL_LOG.by_type(&quot;extract&quot;)&lt;/code&gt;. The scratchpad principle applied to tool results.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parallelise at the right layer.&lt;/strong&gt; We built two parallel primitives: &lt;code&gt;parallel()&lt;/code&gt; for general concurrent execution, and &lt;code&gt;fill_parallel()&lt;/code&gt; that understands the template&apos;s dependency graph. The general one runs any list of lambdas via ThreadPoolExecutor. The template-aware one identifies which sections are unlocked, generates them concurrently, then fills sequentially. Generation is embarrassingly parallel (independent LLM calls), but filling is sequential (template state mutation). Separate the I/O-bound work from the state mutation and you get concurrency without locks on your domain objects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your test suite will lie to you.&lt;/strong&gt; All our unit tests used simple source labels: &lt;code&gt;&quot;brief:Description&quot;&lt;/code&gt; mapping to a document key &lt;code&gt;&quot;brief&quot;&lt;/code&gt;. The real task template used &lt;code&gt;&quot;brief:Description/Background&quot;&lt;/code&gt;. The tests passed. The real run failed silently — the extraction prompt received an empty string instead of the document content. We only caught it by running against a real task with real documents. Synthetic test data hides the gaps that matter most.&lt;/p&gt;
&lt;h2&gt;Benchmarks as the Improvement Engine&lt;/h2&gt;
&lt;p&gt;Each stage was driven by measured evaluation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stage 1 → Stage 2&lt;/strong&gt;: Token variance and latency drove the compaction work. We could measure the 2.1x spread. We could see runs hitting 1.5M tokens for identical inputs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stage 2 → Stage 3&lt;/strong&gt;: The insight that unbounded decomposition was the root cause, not context growth. The compacted runs were cheaper but still variable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stage 3 → v2&lt;/strong&gt;: Expert comparison and rubric scoring drove specific harness improvements. Every missing idiom, every skipped subsection, every terminology error mapped to a template or prompt change.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The point of this is obvious: anecdotes don&apos;t really compound. But benchmarks do. The RLM paradigm makes this especially concrete because every phase is inspectable — you can see what the plan was, what was extracted, what the review flagged, what was generated. The trajectory &lt;em&gt;is&lt;/em&gt; the explanation.&lt;/p&gt;
&lt;p&gt;This is what aec-bench is built to support: evaluation-driven improvement as a workflow, not a philosophy. A handful of commands close the loop from &quot;I have a task idea&quot; to &quot;I know which
harness works best&quot;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Generate 50 voltage-drop variants from a single template
aec-bench generate task templates/electrical/voltage-drop --count 50

# Bundle them into a versioned, immutable dataset
aec-bench dataset create --name voltage-drop-v2 --source tasks/electrical/voltage-drop/

# Run the dataset across two reasoning architectures
aec-bench run --config experiment.yaml   # rlm vs lambda-rlm, claude code vs codex, etc., same tasks, same models

# Compare: which harness scored higher, and where did each fail?
aec-bench evaluate compare run-A run-B
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The experiment config is where you express the hypothesis:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tasks:
  dataset: &quot;voltage-drop-v2@1.0.0&quot;
agents:
  - adapter: rlm
    model: claude-sonnet-4-6
  - adapter: lambda-rlm
    model: claude-sonnet-4-6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Same tasks. Same model. Different reasoning architecture. The rubric scores on dimensions that matter to domain experts — not just &quot;did you get the number right&quot; but &quot;did you cite the correct standard, use the right cable table, show your working.&quot; And the trajectory viewer shows how each agent worked: what it planned, what it extracted, what the review phase flagged, what it generated.&lt;/p&gt;
&lt;p&gt;A lot more to share on aec-bench soon!&lt;/p&gt;
&lt;h2&gt;Agent Design Is Harness Design&lt;/h2&gt;
&lt;p&gt;We started this whole experiment with a model and a REPL. We ended with a deterministic pipeline that costs 14x less, runs at half the time, produces higher-quality output, and tells you what it will cost before it starts. And all we had to do is change the harness.&lt;/p&gt;
&lt;p&gt;But &quot;harness&quot; undersells it. What changed in this case was the &lt;em&gt;reasoning architecture&lt;/em&gt; — how context is managed, how work is decomposed, where the model is and isn&apos;t asked to make decisions. That&apos;s agent design. It&apos;s also harness design. The two are the same discipline, and the line between them was always artificial.&lt;/p&gt;
&lt;p&gt;The previous post said: stop collecting demos, start building benchmarks. This post is the worked example. Benchmarks show us variance. Expert reviews show us the domain gaps. Iteration narrows both of them. None of that required a better model. All of it required better engineering around the model.&lt;/p&gt;
&lt;p&gt;If you&apos;re building AI systems for engineering or construction, that loop — measure, review, iterate — is the work. The model is the easy part.&lt;/p&gt;
</content:encoded><author>Theodoros Galanos</author></item><item><title>The Harness Is All You Need</title><link>https://theharness.blog/blog/the-harness-is-all-you-need/</link><guid isPermaLink="true">https://theharness.blog/blog/the-harness-is-all-you-need/</guid><description>Why domain-specific agent harnesses, not bigger models, are what close the AI performance gap on real engineering tasks — and why the AEC industry needs proper benchmarks to prove it.</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Estimated reading time: 5 minutes&lt;/p&gt;
&lt;p&gt;There is a genre of LinkedIn post that goes something like this: &quot;I gave GPT my floor plan and it produced a schedule in 30 seconds. The industry will never be the same.&quot;&lt;/p&gt;
&lt;p&gt;It&apos;s a compelling demo but not much more than anecdotal evidence.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The gap between a model producing a plausible-looking answer on a single prompt and actually performing reliably across a wide range of real engineering tasks is enormous. But we don&apos;t have the means to measure it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have written about this before. In &lt;a href=&quot;/blog/where-capability-actually-lives-in-agentic-engineering/&quot;&gt;Where Capability Actually Lives&lt;/a&gt;, the argument was that in domain-specific work, performance is not a property of the model alone — it is distributed across the model, the tools, the verification, the orchestration, and the output contracts around it. In &lt;a href=&quot;/blog/benchmarking-agents-on-real-engineering-work/&quot;&gt;Benchmarking Agents on Real Engineering Work&lt;/a&gt;, early empirical results supported that claim: when harness support was removed, capability didn&apos;t degrade gracefully. It collapsed. And in &lt;a href=&quot;/blog/what-if-the-harness-could-improve-itself/&quot;&gt;What If the Harness Could Improve Itself?&lt;/a&gt;, we showed that automated improvement of the harness environment compounds in ways that model upgrades alone don&apos;t.&lt;/p&gt;
&lt;p&gt;Those were arguments and early experiments. What we didn&apos;t have was a proper benchmark — one broad enough, multimodal enough, and rigorous enough to make the case at scale.&lt;/p&gt;
&lt;p&gt;Now we do. Or at least a solid start at it.&lt;/p&gt;
&lt;h2&gt;AEC-Bench&lt;/h2&gt;
&lt;p&gt;Together with &lt;a href=&quot;https://www.nomic.ai/news/aec-bench-a-multimodal-benchmark-for-agentic-systems-in-architecture-engineering-and-construction&quot;&gt;Nomic AI&lt;/a&gt;, we have released &lt;a href=&quot;https://github.com/nomic-ai/aec-bench&quot;&gt;&lt;strong&gt;AEC-Bench&lt;/strong&gt;&lt;/a&gt;: the first multimodal benchmark for evaluating AI agents on real-world architecture, engineering, and construction tasks. It is open source under Apache 2.0, and it covers 196 task instances across three complexity levels, from single-sheet understanding to cross-document coordination across drawings, specifications, and RFIs.&lt;/p&gt;
&lt;p&gt;Real documents, real decisions. The kind AEC professionals deal with every day: reading construction drawings, cross-referencing detail callouts, navigating sheet indices, reconciling specs with RFIs. Work where getting the gist doesn&apos;t cut it.&lt;/p&gt;
&lt;p&gt;We evaluated multiple frontier agent configurations — including Claude Code (Opus 4.6, Sonnet 4.6), OpenAI Codex (GPT-5.2, GPT-5.4), and Nomic&apos;s domain-specific agent — across all three complexity tiers. The full results are in the paper, and they are worth reading. But the headline finding has nothing to do with which model scored highest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The headline finding is that the harness matters more than the model.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Retrieval Is the Bottleneck, Not Reasoning&lt;/h2&gt;
&lt;p&gt;Agents frequently fail before they get to the hard part — before any engineering judgment is required — because they cannot reliably locate the right sheet or the right cross-reference within a complex multimodal document set. Retrieval has to be embedded in the agent&apos;s logic and reasoning approach. Without the right harness, agents defaulted to treating rich construction drawings as flat text files via pdftotext, a fundamental mismatch with the structure and visual density of real AEC documents.&lt;/p&gt;
&lt;p&gt;The model was fine. The harness was wrong.&lt;/p&gt;
&lt;p&gt;But when equipped with domain-specific document parsing and retrieval, performance jumped dramatically. Gains of twenty to thirty points on the hardest task families, far exceeding what any model upgrade alone could deliver.&lt;/p&gt;
&lt;p&gt;That&apos;s the empirical version of the claim I have been making for months: &lt;strong&gt;in domain-specific work, the operating environment is part of the capability.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Benchmarks Are Not Leaderboards&lt;/h2&gt;
&lt;p&gt;This matters because it changes what benchmarks are for.&lt;/p&gt;
&lt;p&gt;If you think a benchmark is a leaderboard — a place to crown a winner — then AEC-Bench tells you which agent configuration scored highest. Fine. But that is the least interesting thing it does.&lt;/p&gt;
&lt;p&gt;The more important function of a benchmark like this is diagnostic. It tells you &lt;em&gt;where&lt;/em&gt; the system breaks, &lt;em&gt;why&lt;/em&gt; it breaks, and &lt;em&gt;what kind of intervention&lt;/em&gt; would fix it. Retrieval matters more than reasoning on these tasks. Document understanding is a harder unsolved problem than calculation or code generation. And the difference between a model that scores 40% and a model that scores 70% might not be the model at all — it might be the tools it was given.&lt;/p&gt;
&lt;p&gt;That diagnostic function is why the &quot;it works on my example&quot; style of evaluation is so dangerous. An anecdote has no control group. It has no complexity tiers. It does not distinguish between a model that got lucky on a simple case and a system that performs reliably across difficulty levels and task types. The anecdote tells you what happened once. The benchmark tells you what to expect, and more importantly, what to fix.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you want AI to work in engineering, stop collecting demos and start building benchmarks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Benchmarks can ossify. They can reward gaming over genuine capability. But they&apos;re still the only tool that separates signal from anecdote.&lt;/p&gt;
&lt;p&gt;For anyone building AI systems for AEC, or for any domain where the work is artifact-bound and intolerant of plausibly generic answers: rigorous evaluation on real documents at real complexity is the minimum. And the full system has to be in scope — that&apos;s where the capability actually lives.&lt;/p&gt;
&lt;h2&gt;What Comes Next&lt;/h2&gt;
&lt;p&gt;AEC-Bench is a start, but it is only a start. The industry needs benchmarks that evolve — that grow with more task families, more disciplines, and document types the current set doesn&apos;t cover. It needs evaluation infrastructure that supports reproducibility, trajectory analysis, and systematic comparison of harness designs. Tooling that lets you understand &lt;em&gt;how&lt;/em&gt; an agent succeeded or failed, and what that means for the next iteration.&lt;/p&gt;
&lt;p&gt;This is what &lt;strong&gt;aec-bench&lt;/strong&gt; is supposed to be — an open platform for AEC agent evaluation — and we will have more to share soon.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/blog/aec-bench/aec-bench-tui.png&quot; alt=&quot;aec-bench: from task templates and instance generation to experiment orchestration, evaluation, and comparison across harness designs — all from the terminal.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In the meantime, the &lt;a href=&quot;https://arxiv.org/abs/2603.29199&quot;&gt;paper&lt;/a&gt; and benchmark &lt;a href=&quot;https://huggingface.co/datasets/nomic-ai/aec-bench&quot;&gt;dataset&lt;/a&gt; are available now. If you&apos;re interested making AI work in the built environment, take a look and share your thoughts! And if you&apos;re still relying on anecdotes to judge what these systems can do, consider that you might be optimising for demos when you should be optimising for deployment.&lt;/p&gt;
</content:encoded><author>Theodoros Galanos</author></item><item><title>What If the Harness Could Improve Itself?</title><link>https://theharness.blog/blog/what-if-the-harness-could-improve-itself/</link><guid isPermaLink="true">https://theharness.blog/blog/what-if-the-harness-could-improve-itself/</guid><description>Applying the autoresearch pattern to self-improve an engineering agent harness. Automated prompt optimisation across HVAC audit tasks on Claude and GPT-4.1-mini, showing how harness engineering compounds when the improvement loop runs itself.</description><pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import BarsWithBaseline from &apos;../../components/charts/BarsWithBaseline.astro&apos;;
import ConceptGrid from &apos;../../components/charts/ConceptGrid.astro&apos;;
import FlowDiagram from &apos;../../components/charts/FlowDiagram.astro&apos;;
import GroupedBars from &apos;../../components/charts/GroupedBars.astro&apos;;
import {
architectureData,
bondsComparisonData,
crossModelBondsL0Data,
crossmodelL0Data,
session2TrajectoryData,
session3L0TrajectoryData,
session4Gpt41miniTrajectoryData,
strategyContrastData,
} from &apos;../../data/autoresearch-charts&apos;;&lt;/p&gt;
&lt;p&gt;Estimated reading time: 25 minutes&lt;/p&gt;
&lt;p&gt;About a week ago, Andrej Karpathy released &lt;a href=&quot;https://github.com/karpathy/autoresearch&quot;&gt;autoresearch&lt;/a&gt;: a system where an LLM agent improves a model training pipeline overnight. The agent edits code, trains for five minutes, checks whether the result improved, and keeps or discards the change. Over roughly 700 experiments, it found around 20 real improvements and cut GPT-2 training time by 11%.&lt;/p&gt;
&lt;p&gt;The design is compact: one markdown file, one editable target (&lt;code&gt;train.py&lt;/code&gt;), one metric (&lt;code&gt;val_bpb&lt;/code&gt;), and a greedy keep-or-revert loop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But training code is not the only thing that determines how well an AI system performs.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;/blog/where-capability-actually-lives-in-agentic-engineering/&quot;&gt;Where Capability Actually Lives in Agentic Engineering&lt;/a&gt;, I argued that in domain-specific work, performance is distributed across the whole system: model, tools, prompts, verification, and output contracts. In &lt;a href=&quot;/blog/benchmarking-agents-on-real-engineering-work/&quot;&gt;Benchmarking Agents on Real Engineering Work&lt;/a&gt;, initial results supported that claim. When workflow support was removed, capability did not degrade gracefully. It collapsed.&lt;/p&gt;
&lt;p&gt;That finding raises a question this article tries to answer: &lt;strong&gt;if the environment around the model carries a meaningful share of the capability, can part of that environment begin improving itself?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the operating environment carries capability, then improving the environment is improving the capability. And if the improvement loop can be automated, it compounds.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article applies that pattern to only one part of an engineering evaluation harness: the system prompt that guides audit behaviour. It lays out the design, reports four early experiment blocks on HVAC audit tasks, and examines what this kind of recursive improvement actually surfaces.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;We applied the autoresearch pattern to one surface of our harness: the system prompt that guides audit behaviour.&lt;/li&gt;
&lt;li&gt;The system uses an information barrier so the autoresearcher agent sees patterns in outcomes, not task answers.&lt;/li&gt;
&lt;li&gt;Behavioural feedback from an agentic-bonds classifier gives a richer signal than reward alone by showing how the agent distributed effort across execution, deliberation, exploration, and verification.&lt;/li&gt;
&lt;li&gt;Across the Claude full-reference runs, one prompt change improved mean reward from 0.94 to 0.98 across five task instances. The entire change was two sentences: an explicit per-room verification checklist.&lt;/li&gt;
&lt;li&gt;On Claude at &lt;code&gt;L0&lt;/code&gt;, that full-reference winner backfired. Confidence thresholds and cross-room consistency instead improved reward from 0.73 to 1.0 on one instance.&lt;/li&gt;
&lt;li&gt;On GPT-4.1-mini at &lt;code&gt;L0&lt;/code&gt;, the same high-level strategy transferred, but the wording had to become a hard verification gate, and the model still topped out at 0.83.&lt;/li&gt;
&lt;li&gt;For Claude, perfect runs were &lt;em&gt;more&lt;/em&gt; execution-heavy and &lt;em&gt;less&lt;/em&gt; verification-heavy than partial ones. The difference was timing, not quantity: the strongest runs executed first and verified later in concentrated blocks.&lt;/li&gt;
&lt;li&gt;The main lesson is conditional. Prompt strategy depends both on the information available and on the model receiving the prompt.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why Autoresearch Works&lt;/h2&gt;
&lt;p&gt;Karpathy&apos;s design works because it fixes the evaluation loop into a form that can run unattended.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fixed time budget.&lt;/strong&gt; Every experiment runs for exactly five minutes. Scores are comparable because improvements cannot hide behind longer training.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single artefact.&lt;/strong&gt; The agent edits one file. That constrains the search space and keeps diffs reviewable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Binary keep/discard.&lt;/strong&gt; The metric improved or it did not. No subjective judgement required.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git as memory.&lt;/strong&gt; Every experiment is a commit, so the branch tip stays at the best known configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As &lt;a href=&quot;https://delip.github.io/mini-apps/annotated-autoresearch/&quot;&gt;Delip Rao&apos;s prompt anatomy&lt;/a&gt; notes, &lt;code&gt;program.md&lt;/code&gt; is not a loose prompt but an operating procedure: context, constraints, target, audit trail, loop, and safety valves. That is why the system works.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;https://www.philschmid.de/autoresearch&quot;&gt;Philipp Schmid&lt;/a&gt; notes, when experiments run far faster than a human can manage, the bottleneck becomes the evaluation system. If the harness is a bottleneck, improving the harness becomes a high-leverage move.&lt;/p&gt;
&lt;h2&gt;Why Engineering Harnesses Are Different from Software Agent Harnesses&lt;/h2&gt;
&lt;p&gt;Translating the autoresearch pattern to engineering harnesses requires three design changes.&lt;/p&gt;
&lt;h3&gt;The information barrier&lt;/h3&gt;
&lt;p&gt;In autoresearch, the autoresearcher agent sees everything: full training logs, exact loss curves, model weights. In our case, the artefact is a system prompt. If the autoresearcher could see the task content or planted errors, it could bake that knowledge into the prompt and overfit the benchmark.&lt;/p&gt;
&lt;p&gt;So we need an information barrier between raw trial outputs and the autoresearcher. The autoresearcher sees &lt;em&gt;patterns&lt;/em&gt; — &quot;3 of the last 5 runs had incomplete coverage&quot; — but never &lt;em&gt;answers&lt;/em&gt;. That is the key structural difference from autoresearch.&lt;/p&gt;
&lt;h3&gt;More Than One Score&lt;/h3&gt;
&lt;p&gt;Autoresearch has one scalar: &lt;code&gt;val_bpb&lt;/code&gt;. Engineering harnesses need more. A score of 0.7 could mean missed findings, formatting errors, or a timeout. The autoresearcher needs to know not just how well the agent scored, but &lt;em&gt;how it behaved&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We address this with three feedback channels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reward&lt;/strong&gt; — a float between 0.0 and 1.0 produced by a deterministic verifier that scores how completely and correctly the agent completed the audit task.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Failure categories&lt;/strong&gt; — abstracted failure modes without task-specific details: &lt;code&gt;incomplete_coverage&lt;/code&gt;, &lt;code&gt;incorrect_values&lt;/code&gt;, &lt;code&gt;format_error&lt;/code&gt;, &lt;code&gt;timeout&lt;/code&gt;, &lt;code&gt;false_positives&lt;/code&gt;, &lt;code&gt;clean_miss&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Behavioural profile&lt;/strong&gt; — a classification of each turn in the trace using our &lt;a href=&quot;https://arxiv.org/abs/2601.06002&quot;&gt;agentic-bonds classifier&lt;/a&gt;. It labels turns as execution, deliberation, exploration, or verification, and returns the distribution, temporal sequence, and a short narrative summary.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That gives the autoresearcher more than a score drop. It can tell whether the agent stopped verifying, front-loaded execution, or spent too long deliberating.&lt;/p&gt;
&lt;h3&gt;The Target Is the Workflow Prompt&lt;/h3&gt;
&lt;p&gt;Autoresearch optimises model architecture and hyperparameters. The artefact is code that defines how a neural network trains. In our case, the artefact is a system prompt: workflow instructions for audit work. It changes how the agent works, not what it knows. Prompts were the easiest surface to start with: easy to isolate, easy to diff, and easy to evaluate. As the harness becomes more structured, other surfaces like task generation, scoring rubrics, and tool workflows become plausible optimisation targets too.&lt;/p&gt;
&lt;p&gt;This is closer to optimising an organisation&apos;s operating procedure than to optimising code. The question is not &quot;what parameters produce the lowest loss?&quot; but &quot;what workflow instructions produce the most reliable engineering review?&quot;&lt;/p&gt;
&lt;h2&gt;The Design: Automated Prompt Optimisation for HVAC Audit Tasks&lt;/h2&gt;
&lt;p&gt;The system has three layers with a strict information flow.&lt;/p&gt;
&lt;p&gt;&amp;lt;FlowDiagram {...architectureData} /&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The autoresearcher agent&lt;/strong&gt; runs locally, driven by Claude Code following a &lt;code&gt;program.md&lt;/code&gt; — the same pattern as autoresearch. It edits system prompts, makes git commits, reads sanitised feedback, and decides whether to keep or revert each change. It never sees task content, verifier code, or raw conversation transcripts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support scripts&lt;/strong&gt; handle the structured mechanics. &lt;code&gt;run_experiment.py&lt;/code&gt; triggers a Harbor job in a Docker sandbox with the current system prompt. &lt;code&gt;feedback.py&lt;/code&gt; enforces the information barrier: it reads the raw trial outputs, strips task-specific content, runs the bonds classifier, and returns a sanitised JSON summary. &lt;code&gt;results.py&lt;/code&gt; manages the TSV audit trail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The experiment sandbox&lt;/strong&gt; is unchanged from the existing evaluation harness — the same Docker containers, agents, verifiers, and output contracts used in the benchmark work from the previous article. The only thing that changes between iterations is the system prompt file mounted into the container.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The loop mirrors autoresearch exactly:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Edit the system prompt&lt;/li&gt;
&lt;li&gt;Git commit&lt;/li&gt;
&lt;li&gt;Run experiment in sandbox&lt;/li&gt;
&lt;li&gt;Read sanitised feedback&lt;/li&gt;
&lt;li&gt;Keep if reward improved, revert if not&lt;/li&gt;
&lt;li&gt;Repeat&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;code&gt;program.md&lt;/code&gt; is organised into eleven sections: purpose, setup, scope constraints, artefact definition, experiment execution, feedback reading, optimisation targets, the loop itself, logging, autonomy mandate, and information discipline. The information discipline section is the one that has no analogue in Karpathy&apos;s version: it explicitly instructs the autoresearcher not to attempt reading task files or verifier code, and frames any desire to know specific task details as a signal to focus on process guidance instead.&lt;/p&gt;
&lt;h2&gt;What Behavioural Feedback Adds to Agent Evaluation&lt;/h2&gt;
&lt;p&gt;The agentic-bonds classifier gives the autoresearcher something autoresearch does not have: a temporal view of how the agent distributed its effort across the trace.&lt;/p&gt;
&lt;p&gt;Each assistant turn in the conversation trace is classified as one of four types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Execution&lt;/strong&gt; — doing the obvious next step: calling tools, formatting output, writing results&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deliberation&lt;/strong&gt; — committed reasoning about &lt;em&gt;how&lt;/em&gt; to solve a problem, step by step&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exploration&lt;/strong&gt; — comparing alternatives, deciding &lt;em&gt;what&lt;/em&gt; to do&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verification&lt;/strong&gt; — checking backward at its own work, comparing results against expectations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The autoresearcher sees this at three levels: the &lt;strong&gt;bond profile&lt;/strong&gt; (distribution), the &lt;strong&gt;bond sequence&lt;/strong&gt; (temporal pattern), and a short &lt;strong&gt;bond narrative&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;What the classifier actually found&lt;/h3&gt;
&lt;p&gt;We classified all 30 Claude Sonnet 4.6 traces from these runs — 12 perfect (reward 1.0) and 18 partial (reward 0.9). The classifier should be read as a behavioural lens rather than ground truth about cognition, but even on that basis the headline finding was counterintuitive.&lt;/p&gt;
&lt;p&gt;&amp;lt;GroupedBars {...bondsComparisonData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perfect traces are more execution-heavy, not more verification-heavy.&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Execution&lt;/th&gt;
&lt;th&gt;Verification&lt;/th&gt;
&lt;th&gt;Deliberation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Perfect (1.0)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;55.5%&lt;/td&gt;
&lt;td&gt;41.9%&lt;/td&gt;
&lt;td&gt;2.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Partial (0.9)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;45.3%&lt;/td&gt;
&lt;td&gt;49.0%&lt;/td&gt;
&lt;td&gt;5.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Exploration was effectively absent in this set of traces, which is why it does not appear as a meaningful part of the comparison.&lt;/p&gt;
&lt;p&gt;The agents that scored perfectly spent &lt;em&gt;less&lt;/em&gt; time verifying than the ones that missed an error. The execution-to-verification ratio shows the same pattern: 1.71 for perfect traces versus 1.06 for partial ones. This does not mean verification is unhelpful. It means badly timed verification correlates with worse performance.&lt;/p&gt;
&lt;p&gt;Other patterns we see in the data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Perfect traces execute first, verify later.&lt;/strong&gt; In the first half of the trace, perfect agents spent only 28% of turns on verification, compared to 41% for partial agents. By the second half, both groups converged around 55%. Perfect agents front-loaded decisive execution, then verified in concentrated blocks. Partial agents hedged earlier — which appears to reflect uncertainty rather than thoroughness.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perfect traces build momentum.&lt;/strong&gt; The average longest uninterrupted execution streak was 3.8 turns for perfect traces, compared to 2.4 for partial. Perfect agents commit to a direction and sustain it. Partial agents interrupt themselves to verify before they have built enough context for verification to be useful.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deliberation correlates with imperfection.&lt;/strong&gt; Only 25% of perfect traces contained any deliberation turns, compared to 56% of partial traces. When the agent pauses to reason about &lt;em&gt;how&lt;/em&gt; to proceed, it is more likely to miss something. This suggests that deliberation in these traces signals uncertainty or confusion, not carefulness.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start patterns diverge.&lt;/strong&gt; 58% of perfect traces opened with three consecutive execution turns (&lt;code&gt;exec | exec | exec&lt;/code&gt;). Only 28% of partial traces did the same — most interrupted with verification or deliberation by the third turn.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What this means for prompt design&lt;/h3&gt;
&lt;p&gt;The behavioural data sharpens the prompt improvement story. The successful change — adding a systematic checklist &lt;code&gt;(a) inputs, (b) components, (c) ventilation, (d) totals&lt;/code&gt; — did not add verification. It structured the execution phase so the agent could work systematically before verifying.&lt;/p&gt;
&lt;p&gt;In other words, the checklist made the agent behave more like the perfect traces already did: decisive execution, then concentrated verification.&lt;/p&gt;
&lt;h2&gt;Early Results: How Small Harness Changes Moved HVAC Audit Performance&lt;/h2&gt;
&lt;p&gt;We ran four experiment blocks on the system prompt that guides HVAC schedule audit tasks. One established the single-instance trap, one found a prompt improvement across five full-reference instances, one showed that the best strategy changes at &lt;code&gt;L0&lt;/code&gt;, and one repeated the &lt;code&gt;L0&lt;/code&gt; setup on a weaker model.&lt;/p&gt;
&lt;h3&gt;Claude on One Full-Reference Task&lt;/h3&gt;
&lt;p&gt;The first Claude Sonnet 4.6 run tested five prompt modifications against a single task instance (adelaide-15rm). The baseline scored 0.9 — four of five planted errors detected.&lt;/p&gt;
&lt;p&gt;Five strategies were tried: a planning step, cascade-error reporting, field-by-field verification, larger batches, and a re-verification pass. None moved the reward.&lt;/p&gt;
&lt;p&gt;The autoresearcher reasonably concluded that the fifth error looked like a model capability boundary rather than a prompt issue. The one useful finding was about efficiency: the larger-batch approach achieved the same accuracy with fewer turns and tokens — 9 turns and 98k tokens versus the baseline&apos;s 10 turns and 105k.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;That conclusion turned out to be wrong.&lt;/strong&gt; Not because the reasoning was poor, but because the evidence was insufficient. Single-instance evaluation made a task-specific ceiling look like a universal one.&lt;/p&gt;
&lt;h3&gt;Claude on Five Full-Reference Tasks&lt;/h3&gt;
&lt;p&gt;The second Claude Sonnet 4.6 run tested four modifications against five instances simultaneously (Adelaide, Brisbane, Darwin, Melbourne, Perth). The baseline mean reward was 0.94: three instances at 0.9 and two at 1.0.&lt;/p&gt;
&lt;p&gt;&amp;lt;BarsWithBaseline {...session2TrajectoryData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Three approaches failed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Iteration 1&lt;/strong&gt; added a completeness rule: &quot;verify every room, do not skip rooms, a missed error costs more than an extra turn.&quot; No reward change. The instruction was redundant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iteration 2&lt;/strong&gt; added zero tolerance for numerical mismatches: &quot;report ANY difference, do not dismiss as rounding.&quot; No reward change, but efficiency degraded sharply — 64 turns and 685k tokens versus the baseline&apos;s 52 turns and 553k. The agent re-checked more and found nothing new.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iteration 3&lt;/strong&gt; restructured the workflow to a two-pass approach: sweep all totals first, then deep-dive flagged rooms. No reward improvement, and efficiency nearly doubled — 79 turns and 1.08 million tokens. It mostly shuffled which errors were caught without improving overall coverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Iteration 4 worked.&lt;/strong&gt; The change was small: two sentences extended. The orient step added design conditions. The verify step added an explicit per-room checklist: (a) input parameters, (b) each heat gain component, (c) ventilation terms, (d) totals. Mean reward rose from 0.94 to 0.98. Adelaide and Melbourne both jumped from 0.9 to 1.0. Only Darwin remained at 0.9. The efficiency cost was modest: 55 turns and 613k tokens, an 11% increase over baseline.&lt;/p&gt;
&lt;p&gt;Here is the actual diff — the entire improvement:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-1. **Orient (1 turn):** Read the schedule and identify the number of rooms
-   and available tools. Count your rooms — this determines your turn budget.
-2. **Verify (1 turn per 2-3 rooms):** For each batch of rooms, call the
-   calculation tool, then compare results against the schedule values.
-   Note discrepancies immediately.
+1. **Orient (1 turn):** Read the schedule and identify the number of rooms
+   and available tools. Count your rooms — this determines your turn budget.
+   Before proceeding, note the design conditions: outdoor temperature,
+   humidity, and any building-level parameters.
+2. **Verify (1 turn per 2-3 rooms):** For each batch of rooms, call the
+   calculation tool, then compare results against the schedule values.
+   For each room, systematically check: (a) input parameters (occupancy,
+   area, volume), (b) each heat gain component, (c) ventilation terms,
+   (d) totals. Note discrepancies immediately.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The improvement came from making an implicit checking procedure explicit.&lt;/p&gt;
&lt;h3&gt;What the failed approaches have in common&lt;/h3&gt;
&lt;p&gt;The three failed approaches all tried to &lt;strong&gt;add more work&lt;/strong&gt;. The successful one &lt;strong&gt;structured the existing work differently&lt;/strong&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Iteration&lt;/th&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Reward&lt;/th&gt;
&lt;th&gt;Token cost vs baseline&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;0.94&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Add completeness rule&lt;/td&gt;
&lt;td&gt;0.94&lt;/td&gt;
&lt;td&gt;-1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Zero tolerance&lt;/td&gt;
&lt;td&gt;0.94&lt;/td&gt;
&lt;td&gt;+24%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Two-pass restructure&lt;/td&gt;
&lt;td&gt;0.94&lt;/td&gt;
&lt;td&gt;+95%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Systematic checklist&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.98&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+11%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;That pattern — structure matters more than volume — echoes the previous article&apos;s result that the strongest models did not simply verify more; they verified as part of a structured workflow.&lt;/p&gt;
&lt;p&gt;&amp;lt;ConceptGrid {...strategyContrastData} /&amp;gt;&lt;/p&gt;
&lt;h3&gt;Claude at L0&lt;/h3&gt;
&lt;p&gt;The Claude &lt;code&gt;L0&lt;/code&gt; run targeted the hardest reference level: &lt;code&gt;audit-office-building-L0&lt;/code&gt;. Here the agent receives only room type, floor area, ceiling height, and location. It does not receive design conditions, formulas, or lookup tables. The prompt is operating in a much thinner information environment.&lt;/p&gt;
&lt;p&gt;The baseline reward on the Adelaide &lt;code&gt;L0&lt;/code&gt; instance was 0.73. The agent found 2 of 3 issues, but it also produced false positives.&lt;/p&gt;
&lt;p&gt;&amp;lt;BarsWithBaseline {...session3L0TrajectoryData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The first useful change was not a better checking procedure. It was a confidence threshold: &lt;strong&gt;only report an error if the model can identify the specific assumption, parameter, or formula that appears to be wrong&lt;/strong&gt;. That lifted reward from 0.73 to 0.83 by eliminating false positives.&lt;/p&gt;
&lt;p&gt;The next result was the important one. The full-reference winner — the systematic per-room checklist — did not generalise. It backfired. Reward dropped from 0.83 to 0.53, and false positives returned. At full-reference levels, granular checks help because the agent can anchor them against formulas and tables. At &lt;code&gt;L0&lt;/code&gt;, the same granularity forces the agent to compare schedule values against assumptions it is partly reconstructing from memory.&lt;/p&gt;
&lt;p&gt;The winning change was different in kind. Adding a cross-room consistency rule — compare similar rooms against one another and investigate large relative differences — lifted reward from 0.83 to 1.0 on this instance, while also reducing token usage sharply.&lt;/p&gt;
&lt;p&gt;That is a strong result, but it is still single-instance. It shows that the strategy can change sharply when reference material is removed. It does not yet prove that we have the generally best &lt;code&gt;L0&lt;/code&gt; prompt.&lt;/p&gt;
&lt;p&gt;What it does show is that prompt optimisation is reference-level-specific. At high reference levels, the prompt benefited from explicit granular verification. At &lt;code&gt;L0&lt;/code&gt;, the better strategy was uncertainty management plus relative comparison.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;L0 Iteration&lt;/th&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Reward&lt;/th&gt;
&lt;th&gt;Tokens In&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;Original prompt&lt;/td&gt;
&lt;td&gt;0.73&lt;/td&gt;
&lt;td&gt;304k&lt;/td&gt;
&lt;td&gt;2/3 findings + false positives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Confidence threshold&lt;/td&gt;
&lt;td&gt;0.83&lt;/td&gt;
&lt;td&gt;248k&lt;/td&gt;
&lt;td&gt;False positives removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Systematic checklist&lt;/td&gt;
&lt;td&gt;0.53&lt;/td&gt;
&lt;td&gt;407k&lt;/td&gt;
&lt;td&gt;Backfired&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Cross-room consistency&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;104k&lt;/td&gt;
&lt;td&gt;3/3 findings, no false positives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Add design-conditions note&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;258k&lt;/td&gt;
&lt;td&gt;Same reward, worse efficiency&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;GPT-4.1-mini at L0&lt;/h3&gt;
&lt;p&gt;The GPT-4.1-mini &lt;code&gt;L0&lt;/code&gt; run repeated the same task on the weakest model from the earlier benchmark. The baseline was much worse than Claude&apos;s: reward 0.37, only 1 of 3 planted errors found, and 18 false positives.&lt;/p&gt;
&lt;p&gt;&amp;lt;BarsWithBaseline {...session4Gpt41miniTrajectoryData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;What transferred was the strategy, not the exact wording. The soft confidence-threshold language that helped Claude did not work here. But once &lt;strong&gt;the instruction was rewritten as a hard verification gate&lt;/strong&gt; — do not report a discrepancy unless the tool confirms it — false positives disappeared and reward jumped to 0.83.&lt;/p&gt;
&lt;p&gt;That shows two things at once. First, the underlying prompt idea generalises across model families: reduce unsupported claims, rely on internal consistency, and force the model to ground discrepancies. Second, the wording still has to match the model&apos;s instruction-following style.&lt;/p&gt;
&lt;p&gt;The ceiling also remained model-specific. GPT-4.1-mini improved dramatically, but it did not reach Claude&apos;s &lt;code&gt;L0&lt;/code&gt; result. The best run found 2 of 3 issues with no false positives.&lt;/p&gt;
&lt;p&gt;&amp;lt;ConceptGrid {...crossmodelL0Data} /&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Baseline&lt;/th&gt;
&lt;th&gt;Best&lt;/th&gt;
&lt;th&gt;Winning strategy&lt;/th&gt;
&lt;th&gt;Constraint style&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.6&lt;/td&gt;
&lt;td&gt;0.73&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;Confidence threshold + cross-room consistency&lt;/td&gt;
&lt;td&gt;Advisory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4.1-mini&lt;/td&gt;
&lt;td&gt;0.37&lt;/td&gt;
&lt;td&gt;0.83&lt;/td&gt;
&lt;td&gt;Verification gate + cross-room consistency&lt;/td&gt;
&lt;td&gt;Prohibitive&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The early behavioural picture suggests the two wins differ not only in wording, but also in how the models stabilise. Claude&apos;s successful &lt;code&gt;L0&lt;/code&gt; run remained relatively execution-compatible. GPT-4.1-mini&apos;s best run was much more verification-heavy.&lt;/p&gt;
&lt;h2&gt;What the Results Suggest for Harness Engineering in AEC&lt;/h2&gt;
&lt;h3&gt;Self-improving harnesses are feasible&lt;/h3&gt;
&lt;p&gt;The system worked. The autoresearcher agent formed hypotheses from sanitised feedback, made targeted prompt changes, measured their effect, and advanced the branch when something improved. The information barrier appeared to hold, and some improvements generalised across instances.&lt;/p&gt;
&lt;p&gt;This is obviously a small result, but it validates the basic mechanism.&lt;/p&gt;
&lt;h3&gt;The environment is improvable, not just measurable&lt;/h3&gt;
&lt;p&gt;The previous two articles established that the operating environment carries capability and that this dependence is measurable. This article adds a narrower claim: at least one important part of that environment, the workflow prompt, is improvable through automated search. &lt;strong&gt;If harness improvement can be partially automated, investment in evaluation infrastructure compounds&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Single-instance evaluation misleads&lt;/h3&gt;
&lt;p&gt;The single-instance Claude run concluded that the reward ceiling was a model capability boundary. The five-instance Claude run proved that wrong. The ceiling was instance-specific. Multi-instance evaluation was necessary to discover that the prompt could improve, and which prompt changes actually generalised.&lt;/p&gt;
&lt;p&gt;This point travels beyond this setup. Evaluating on a single test case can make genuine improvement opportunities look like hard limits.&lt;/p&gt;
&lt;h3&gt;Structure beats volume&lt;/h3&gt;
&lt;p&gt;The most expensive failed approach cost nearly twice the baseline in tokens and produced no improvement. The successful approach cost 11% more and raised reward by 4 percentage points. It is possible that, in engineering review work, telling an agent &lt;em&gt;how&lt;/em&gt; to check is more effective than telling it to check &lt;em&gt;more&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That said, the Claude &lt;code&gt;L0&lt;/code&gt; run adds an important qualifier. The right structure depends on the reference level. On full-reference tasks, structure meant explicit component-by-component verification. On &lt;code&gt;L0&lt;/code&gt;, structure meant constraining when the agent should trust its own judgement and shifting toward relative comparisons inside the schedule itself.&lt;/p&gt;
&lt;h3&gt;Prompt optimisation is reference-level-specific&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;L0&lt;/code&gt; run is the strongest evidence in the whole set that there may be no single best workflow prompt. The same checklist that helped at full reference actively hurt at &lt;code&gt;L0&lt;/code&gt;. Removing reference material changed what kind of prompt guidance was useful.&lt;/p&gt;
&lt;p&gt;That suggests a more general rule: prompt quality is conditional on information availability. A prompt that works well when the environment supplies formulas, tables, and design conditions may fail when the model has to reconstruct too much of that context from memory.&lt;/p&gt;
&lt;h3&gt;Strategy transfers across models, wording does not&lt;/h3&gt;
&lt;p&gt;The GPT-4.1-mini run adds a second qualifier. The high-level idea that worked at &lt;code&gt;L0&lt;/code&gt; transferred across model families: suppress unsupported discrepancies and use relative comparisons when absolute references are weak. But the wording had to change. GPT-4.1-mini did not respond reliably to soft advisory language. It improved only when the same idea was expressed as a hard gate.&lt;/p&gt;
&lt;p&gt;That suggests prompt portability has two layers. Strategy may travel. Surface phrasing may not. It also suggests that prompt optimisation has a ceiling. GPT-4.1-mini improved much more in relative terms than Claude, but it still stopped well short of Claude&apos;s absolute result.&lt;/p&gt;
&lt;p&gt;&amp;lt;GroupedBars {...crossModelBondsL0Data} /&amp;gt;&lt;/p&gt;
&lt;h3&gt;Behavioural analysis inverted our assumptions&lt;/h3&gt;
&lt;p&gt;Before classifying the traces, we assumed that more verification would correlate with better performance. The data showed the opposite: perfect traces were execution-dominant, while partial traces were roughly balanced. The goal is not to maximise verification. It is to make execution decisive enough that verification can happen in concentrated blocks rather than as reactive interruptions.&lt;/p&gt;
&lt;h2&gt;Honest Limitations&lt;/h2&gt;
&lt;p&gt;This is early work. The scope is narrow and the results are preliminary.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single task type, single domain.&lt;/strong&gt; All experiments targeted HVAC audit tasks. We do not know whether the checklist approach generalises to other engineering task types.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small iteration count.&lt;/strong&gt; Four experiment blocks are enough to validate the mechanism and expose two important conditionalities, but not enough to map the full improvement frontier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bonds data is still thin outside the Claude run and has no human-annotated validation set here.&lt;/strong&gt; The 30-trace behavioural analysis is for Claude Sonnet 4.6 on one task family. The GPT-4.1-mini read is directionally useful, but much smaller.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The information barrier is untested against adversarial pressure.&lt;/strong&gt; The autoresearcher followed the information discipline in these runs, but we have not stress-tested whether a sufficiently capable autoresearcher agent might infer task-specific content from the feedback patterns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The &lt;code&gt;L0&lt;/code&gt; result is still single-instance.&lt;/strong&gt; The 1.0 score is encouraging, and it was reproduced once with a slightly more expensive prompt variant, but we have not yet tested the &lt;code&gt;L0&lt;/code&gt;-optimised prompt across multiple cities. The five-instance Claude run already showed how misleading single-instance conclusions can be.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The GPT-4.1-mini comparison is also single-instance.&lt;/strong&gt; We do not yet know whether the 0.83 ceiling or the prompt fragility pattern will hold across other cities or adjacent task families.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Darwin remains at 0.9.&lt;/strong&gt; One instance did not improve across any prompt change. This may be a genuine model capability limit for that specific error type, but we would need to break the information barrier to investigate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stochastic variance is bounded but real.&lt;/strong&gt; Iteration 3 showed Brisbane and Melbourne swapping scores, suggesting approximately 5-10% variance per instance. Larger sample sizes would help distinguish signal from noise.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What Comes Next&lt;/h2&gt;
&lt;p&gt;The system currently optimises one surface: system prompts. Two obvious new surfaces remain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Task generation&lt;/strong&gt; — using the loop to generate new task instances that produce useful signal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scoring rubrics&lt;/strong&gt; — iterating on how agent output is evaluated, especially for tasks with qualitative judgement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The prompt surface itself can also become more adaptive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Level-adaptive prompts&lt;/strong&gt; — switching workflow strategy based on how much reference material is available. The contrast between the five-instance full-reference Claude run and the Claude &lt;code&gt;L0&lt;/code&gt; run suggests that prompt selection may need to be conditional rather than global.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model-adaptive prompts&lt;/strong&gt; — varying the instruction style as well as the workflow strategy. The GPT-4.1-mini run suggests that the same conceptual rule may need different wording for different models.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The longer-term question is whether prompts, tasks, and rubrics can be improved jointly. That is where recursive harness improvement starts to look more like a research programme.&lt;/p&gt;
&lt;p&gt;For now, the result is small and specific: an autonomous loop, an information barrier, behavioural feedback that inverted our assumptions about verification, one prompt change that helped at full reference, another that worked for a very different reason at &lt;code&gt;L0&lt;/code&gt;, and a cross-model comparison showing that prompt ideas can transfer even when prompt wording does not. The environment was improvable in each case, but the successful strategy depended on what information the environment already supplied and which model was inside it. The agents that scored best were not simply the ones that checked the most. They were the ones whose workflow matched the structure of the task, the information available, and the model&apos;s own behavioural constraints.&lt;/p&gt;
&lt;p&gt;That, at least, is consistent with everything we have been learning about where capability actually lives.&lt;/p&gt;
</content:encoded><author>Theodoros Galanos</author></item><item><title>Benchmarking Agents on Real Engineering Work Is Already Teaching Us Something Important</title><link>https://theharness.blog/blog/benchmarking-agents-on-real-engineering-work/</link><guid isPermaLink="true">https://theharness.blog/blog/benchmarking-agents-on-real-engineering-work/</guid><description>Benchmarking AI agents on real HVAC engineering tasks across Claude and GPT models. Results on harness-dependent capability, agent evaluation design, and why AEC-domain benchmarks reveal what general benchmarks miss.</description><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import BarsWithBaseline from &apos;../../components/charts/BarsWithBaseline.astro&apos;;
import BondTypes from &apos;../../components/charts/BondTypes.astro&apos;;
import GroupedBars from &apos;../../components/charts/GroupedBars.astro&apos;;
import OutcomeDistribution from &apos;../../components/charts/OutcomeDistribution.astro&apos;;
import QualityVsCost from &apos;../../components/charts/QualityVsCost.astro&apos;;
import StackedBars from &apos;../../components/charts/StackedBars.astro&apos;;
import {
ablationData,
auditMixedUseFrontierData,
bondTypesData,
heroRewardData,
outcomeDistributionData,
qualityVsCostData,
verificationGradientData,
} from &apos;../../data/benchmarking-charts&apos;;&lt;/p&gt;
&lt;p&gt;Estimated reading time: 15 minutes&lt;/p&gt;
&lt;p&gt;Current frontier model performance is still heavily concentrated in a narrow band of well-covered domains, especially code, math, and adjacent text-heavy tasks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Engineering is not one of them.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is the starting point for this work.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;/blog/where-capability-actually-lives-in-agentic-engineering/&quot;&gt;Where Capability Actually Lives in Agentic Engineering&lt;/a&gt;, I argued that progress in this domain will not come from better models alone. It will come from better operating conditions: better tools, better harnesses, and better environments for reliable work. This article is a first empirical step in that direction.&lt;/p&gt;
&lt;p&gt;That earlier piece made a conceptual claim about where capability lives. &lt;strong&gt;This one asks whether that claim survives contact with measured performance.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In domain-specific work, the environments agents operate in are part of the capability.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The aim here is to start measuring that claim on real engineering tasks. The longer-term goal is a benchmark, but this piece reports an early run toward one: a single task, from a single discipline, using one agent harness setup, tested across a small set of models.&lt;/p&gt;
&lt;p&gt;Concretely, the work focuses on &lt;strong&gt;HVAC heat load calculations and schedule audits&lt;/strong&gt;, grounded in the kinds of structured documents that show up in actual AEC workflows, and includes nearly 480 trials with the same harness, the same tools, and the same output contract. The harness was a tool-using agent, and the tool itself was deliberately strong: the calculation procedure was reverse engineered into code, the relevant lookup values were exposed, and the models were given something close to an oracle calculator rather than being asked to derive the whole method from scratch.&lt;/p&gt;
&lt;p&gt;That is narrow by design, and still early. But it is already enough to surface useful patterns. The point of sharing it now is not to pretend the benchmark is finished. It is to put the initial results and the early methodology in the open, get feedback, and sharpen the next iterations while the benchmark is still taking shape.&lt;/p&gt;
&lt;p&gt;What follows is a first look at what current agents are good at, where they still break, and why evaluation design matters almost as much as model quality. It is also an early step in turning a vague domain gap into a concrete improvement programme.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;This benchmark is best read as evidence about conditional capability.&lt;/strong&gt; Inside a strong harness, current frontier agents can do meaningful engineering review work. Once guidance and tool support are stripped away, performance often collapses rather than degrading gracefully.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The model ranking is clear, but it is not the deepest result.&lt;/strong&gt; Sonnet 4.6 is strongest overall, and Haiku 4.5 is the most attractive quality-per-dollar option in this setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The most informative tasks were audit tasks, not calculation tasks.&lt;/strong&gt; Once the harness supplied something close to an oracle calculator, the real separation moved into checking, discrepancy detection, and reliable completion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verification behaviour appears to matter a lot.&lt;/strong&gt; The strongest model did not just verify when it was in trouble. It verified as part of its default workflow, which looks like part of the mechanism behind its recall advantage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;This is an empirical counterpart to the argument in the previous article, and the beginning of a broader benchmark effort.&lt;/strong&gt; It supports the claim that in engineering, capability is not just a model property. It is distributed across the model, the harness, the tools, the verifiers, and the output contract. The longer-term goal is to build high-quality benchmarks with enough coverage to support meaningful progress in agentic engineering.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;GroupedBars {...heroRewardData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;That is the core result in compressed form: &lt;strong&gt;the benchmark ranks models, but more importantly, it makes the system dependence visible.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;The Benchmark Was Simple on Purpose: HVAC Heat Load Tasks as a Starting Point&lt;/h2&gt;
&lt;p&gt;That narrow setup matters because it tells us something specific.&lt;/p&gt;
&lt;p&gt;Within this first experiment, the focus was one meaningful slice of engineering work: mechanical heat-load tasks. Even inside that small scope, two task families behaved very differently.&lt;/p&gt;
&lt;p&gt;Calculation tasks ask the agent to compute loads correctly from structured room inputs.&lt;/p&gt;
&lt;p&gt;Audit tasks ask the agent to inspect schedules, identify discrepancies, and propose the correct fixes.&lt;/p&gt;
&lt;p&gt;That distinction ended up being crucial.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The calculation tasks were close to saturated for the Anthropic models.&lt;/strong&gt; They are useful as a baseline, but they do not separate strong agents from stronger ones.&lt;/p&gt;
&lt;p&gt;That result is even more telling once you know the setup. The method was not hidden inside the task and left for the model to rediscover. The calculation approach was encoded directly into the harness as a near-oracle tool: a coded procedure plus the relevant lookup table values and calculator logic. Even with that help, not every model was perfect, and the harder audit tasks still separated the field clearly.&lt;/p&gt;
&lt;p&gt;That is where the real spread appears: &lt;strong&gt;systematic checking, consistency across many rows, and enough discipline to finish with the correct structured output.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;StackedBars {...auditMixedUseFrontierData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;They also give us a useful improvement gradient. When an agent fails, the failure is usually legible. It missed a discrepancy, checked too shallowly, used the tools badly, ran out of turns, or never made it cleanly into the required output format. That is exactly what you want from a benchmark aimed at building better agent environments around real domain tasks.&lt;/p&gt;
&lt;p&gt;For AEC practitioners, that should feel familiar. The painful mistakes in practice are often not a single wrong formula. They are missed discrepancies, skipped checks, and brittle review processes.&lt;/p&gt;
&lt;p&gt;For agent evaluation people, it is a reminder that task design determines what you learn. If the task is too easy, you are mostly benchmarking formatting and latency. If it is too synthetic, you may learn very little about deployed usefulness.&lt;/p&gt;
&lt;h2&gt;The Model Ranking Is Clear, but It Is Not the Whole Story&lt;/h2&gt;
&lt;p&gt;At the headline level, the ranking is straightforward.&lt;/p&gt;
&lt;p&gt;&amp;lt;OutcomeDistribution {...outcomeDistributionData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Sonnet 4.6 was best overall. It was the only model to clear both near-perfect calculation performance and clearly best-in-class audit recall. It also had zero zero-score trials.&lt;/p&gt;
&lt;p&gt;Haiku 4.5 came second on accuracy and first on value. Its overall reward was 96.3%, and while it trailed Sonnet 4.6 on audit recall, it stayed strong enough that its much lower per-trial cost changes the deployment conversation.&lt;/p&gt;
&lt;p&gt;Sonnet 4 remains solid. It is cheaper than 4.6 and more accurate than GPT-4.1-mini by a wide margin, but the newer generation models have moved the frontier.&lt;/p&gt;
&lt;p&gt;GPT-4.1-mini was not competitive for this workload. Its overall reward was 34.1%, with a 64% zero-rate. The issue was broader than engineering reasoning. A large share of failures were format failures, truncated outputs, or prose that never turned into the required JSON result.&lt;/p&gt;
&lt;p&gt;That last detail matters. In an eval setting, people sometimes treat format failures as a nuisance variable. In deployed agent systems, they are part of the failure surface. &lt;strong&gt;If an agent can reason but cannot reliably finish the job in the required structure, it still failed.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If your eval is shallow, your conclusions will be shallow too.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;The Biggest Lesson Was About the System, Not the Model&lt;/h2&gt;
&lt;p&gt;One of the clearest findings in this benchmark is that harness choices materially change measured capability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is the most direct continuity with the previous article.&lt;/strong&gt; There, the claim was conceptual: the harness is part of the capability story. Here, the same point shows up empirically in the numbers.&lt;/p&gt;
&lt;p&gt;Even simple harness changes moved results. In the early setup, a 10-turn cap made one audit workload look almost impossible for an otherwise capable model, but turn budget was only part of the problem. With weaker guidance, the default strategy was to decompose the audit room by room and spend roughly two turns per room in an execute-then-verify rhythm. That produced real work, but it was the wrong workflow for the budget. The fix combined a higher cap with guidance that pushed the agent toward batching rather than treating every room as its own mini-loop.&lt;/p&gt;
&lt;p&gt;The same pattern showed up elsewhere. Verifier fixes mattered. Prompt refinements mattered. Prompt caching mattered for cost. Better output instructions reduced avoidable formatting zeros for the Anthropic models. And the tool design mattered too: even when the harness provides something close to an oracle for the core calculation, model differences do not disappear. They move into disciplined checking, orchestration, and reliable completion.&lt;/p&gt;
&lt;p&gt;The ablation results make the point more sharply. Reducing the turn budget from 20 to 10 is one kind of degradation. Removing guidance and tool support is another. The first makes the task harder. The second starts to expose the capability boundary. On this task family, the gap between strong-harness performance and low-guidance performance is larger than many of the model-to-model differences people usually focus on.&lt;/p&gt;
&lt;p&gt;Those are not side details. They are part of the measured system. &lt;strong&gt;The harness is not neutral background. It is an active ingredient in whether a model can express the capability it already has.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For practitioners, this means you should be skeptical of any claim that a model simply can or cannot do a workflow based on a weak first-pass eval.&lt;/p&gt;
&lt;p&gt;For evaluation researchers, it means benchmark design has to be treated with the same rigor as model comparison itself.&lt;/p&gt;
&lt;h2&gt;What Happened When We Removed Harness Guidance&lt;/h2&gt;
&lt;p&gt;This is also where the setup gets more interesting.&lt;/p&gt;
&lt;p&gt;From the beginning, one of the key questions was how much of the measured capability depended on the operating conditions around the model, not just which model performed best inside the strongest harness.&lt;/p&gt;
&lt;p&gt;So after the main tool-enabled runs, a small guidance-ablation ladder was set up around the same office-building audit family.&lt;/p&gt;
&lt;p&gt;The idea was simple. Keep the underlying task family fixed, then remove support in stages.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Support removed or added&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;L0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bare problem statement, no embedded formulas or lookup table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;L1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;effectively the same as &lt;code&gt;L0&lt;/code&gt; in the current task set, which turned out to be informative in its own right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;L2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;adds the psychrometric constants and explicit outside-air rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;L3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;replaces that with a compact AS 1668.2 reference table and general calculation guidance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;no-tool&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;removes the calculation tool entirely and asks the model to do the audit directly from the prompt context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This was not meant to be a polished benchmark surface. It was a probe. The point was to see how quickly the task collapses once the environment starts losing structure.&lt;/p&gt;
&lt;p&gt;The results were blunt.&lt;/p&gt;
&lt;p&gt;On the tool-enabled baseline, Sonnet 4.6 averaged 0.966 reward on the office-building audit set. Dropping the turn budget from 20 to 10 lowered that to 0.943. That is a real degradation, but it still leaves the task clearly inside the model&apos;s workable envelope.&lt;/p&gt;
&lt;p&gt;The guidance ladder was a different story.&lt;/p&gt;
&lt;p&gt;In the direct no-tool reference run, the current partial results look like this:&lt;/p&gt;
&lt;p&gt;&amp;lt;BarsWithBaseline {...ablationData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;That tells us a few things. The cleanest way to read it is as three different regimes: a workable strong-harness regime, a mildly degraded budget-constrained regime, and a collapse regime once the environment stops carrying enough of the method.&lt;/p&gt;
&lt;p&gt;First, the budget ablation and the guidance ablation are not the same phenomenon. Reducing turns hurts, but the agent still basically knows what kind of work it is doing. Removing guidance and tool support is much harsher. &lt;strong&gt;Most of those conditions do not degrade gracefully. They collapse.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Second, this is exactly the kind of out-of-distribution behaviour we were worried about.&lt;/p&gt;
&lt;p&gt;In-distribution domains are the places where models have already seen enough adjacent structure that they can interpolate their way through the task even when the scaffold is weak. Engineering audit work did not behave like that here. Once the environment stopped carrying key pieces of the method, performance did not taper off a little. It mostly went to zero.&lt;/p&gt;
&lt;p&gt;Third, the surviving &lt;code&gt;no-tool&lt;/code&gt; signal matters precisely because it is weak. There was a small amount of non-zero performance there. That suggests the capability is not entirely absent. But it is nowhere near robust enough to treat the task as natively solved. In other words, the environment is still doing real cognitive work for the model.&lt;/p&gt;
&lt;p&gt;That is the larger point.&lt;/p&gt;
&lt;p&gt;When people say a model can do engineering, they often leave unspoken how much hidden structure is being provided by the harness, the tools, the prompt, or the reference data. Our ablation run makes that visible. In this task family, capability is highly conditional on the operating environment. &lt;strong&gt;Remove the support and the system does not simply get a bit worse. It often stops functioning in a useful way.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is not a failure of evaluation. It is exactly what good evaluation is supposed to reveal.&lt;/p&gt;
&lt;p&gt;It is also why the out-of-distribution framing matters so much. If the domain were already well-covered by the model&apos;s native priors, these ablations would look like inconvenience tests. Instead they look like capability boundary tests. &lt;strong&gt;That is a strong sign that for real engineering work, at least today, the harness is not a wrapper around the capability. It is part of the capability.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;What the Strongest Model Did Differently&lt;/h2&gt;
&lt;p&gt;The cleanest behavioural finding in this work is about verification.&lt;/p&gt;
&lt;p&gt;All models increased checking when they were struggling. But Sonnet 4.6 did something more interesting: it verified even when it was succeeding.&lt;/p&gt;
&lt;p&gt;In our behavioural analysis, Sonnet 4.6 spent 23% of its successful traces in verification behaviour. The other strong models were much lower. Haiku showed the steepest verification gradient between success and failure, which makes it interesting for runtime monitoring, but Sonnet 4.6 made verification part of its default operating mode.&lt;/p&gt;
&lt;p&gt;&amp;lt;GroupedBars {...verificationGradientData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;That appears to be the mechanism behind its recall lead.&lt;/p&gt;
&lt;p&gt;In plain engineering terms, it behaved less like a model that checked at the end and more like one that treated review as part of execution. It did not only check when it sensed danger. It checked because checking was built into the workflow.&lt;/p&gt;
&lt;p&gt;That matters in both practical engineering terms and evaluation terms.&lt;/p&gt;
&lt;p&gt;For SMEs, it matches a familiar truth: good review practice is not a panic move. It is routine.&lt;/p&gt;
&lt;p&gt;For agentic-eval people, it suggests that model quality may show up less in raw chain-of-thought style reasoning and more in when and how an agent decides to revisit earlier work. Reliability here depends on whether verification is part of the default workflow before failure starts to accumulate.&lt;/p&gt;
&lt;h2&gt;A Behavioural Lens From Reasoning Research&lt;/h2&gt;
&lt;p&gt;To get beyond simple success rates, we adapted the Agentic Bonds framework from &lt;a href=&quot;https://arxiv.org/abs/2601.06002&quot;&gt;Du et al.&apos;s work on the molecular structure of thought&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;BondTypes {...bondTypesData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;The basic idea is that quality does not come only from individual steps. It comes from the pattern of transitions between types of steps.&lt;/p&gt;
&lt;p&gt;We classified agent turns into four categories: execution, verification, deliberation, and exploration.&lt;/p&gt;
&lt;p&gt;That gave us a behavioural fingerprint for each model.&lt;/p&gt;
&lt;p&gt;Sonnet 4 looked like a rigid workhorse: high execution share, low exploration, highly predictable structure.&lt;/p&gt;
&lt;p&gt;Haiku looked more adaptive, but also more verbose. It often spent more turns and generated a stronger distress signal when things were going badly.&lt;/p&gt;
&lt;p&gt;GPT-4.1-mini produced the strangest result: success and failure were behaviourally almost indistinguishable. It did not seem to have a readable internal signal that it was in trouble.&lt;/p&gt;
&lt;p&gt;That is a serious limitation if you want runtime monitoring or intervention. You cannot reliably rescue a model that does not behaviourally reveal when it is failing.&lt;/p&gt;
&lt;p&gt;This kind of analysis complements task-level scoring. Accuracy tells you what happened. Behavioural structure starts to tell you why.&lt;/p&gt;
&lt;p&gt;That framing came from the tool-loop traces. The no-tool runs exposed a different but complementary failure surface.&lt;/p&gt;
&lt;h2&gt;What The No-Tool Traces Revealed&lt;/h2&gt;
&lt;p&gt;The tool-loop traces gave us one kind of behavioural visibility: turn-by-turn structure. The no-tool and low-guidance runs gave us a different one. There we often only had the final written artefact, so the analysis had to be more forensic. We were no longer asking which turn type came next. We were asking a simpler and harsher question: did the model stay attached to the instance at all?&lt;/p&gt;
&lt;p&gt;That ended up being one of the clearest behavioural signals in the whole project.&lt;/p&gt;
&lt;p&gt;Once we read a broader sample of the direct no-tool and guidance-ladder traces, the main split was not simply success versus failure. It was anchored audit behaviour versus free-running domain narration.&lt;/p&gt;
&lt;p&gt;The successful no-tool traces stayed tightly locked to the assigned schedule. They rebuilt the formulas from the prompt, carried the instance-specific constants through the arithmetic, and converged toward compact findings. Even without the calculator tool, they still behaved like audits. The single perfect Sydney no-tool trace is the clearest example of that pattern: it stayed on the given schedule, reconstructed the formulas locally, and still landed a verifier-clean result.&lt;/p&gt;
&lt;p&gt;The failed traces were more interesting than simple arithmetic misses. They often looked superficially impressive. They used the right vocabulary. They wrote long engineering-sounding explanations. They sometimes did coherent local arithmetic. But many of them had already slipped off the actual task. They started substituting room programmes, changing climate conditions, inventing alternate schedules, or confidently asserting standard lookups that were not stably grounded in the prompt.&lt;/p&gt;
&lt;p&gt;One Adelaide &lt;code&gt;L3&lt;/code&gt; trace, for example, stopped auditing the office-building schedule and began analyzing hotel rooms and hotel suites instead. A Brisbane no-tool failure turned into a different classroom-and-library schedule with its own invented occupancy logic. Both traces remained fluent. Neither stayed on the job.&lt;/p&gt;
&lt;p&gt;That is the important distinction. &lt;strong&gt;The failure mode was often not &quot;cannot calculate.&quot; It was &quot;cannot stay on the instance.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That gave us a simple rubric for reading these traces. The key dimensions were instance fidelity, standards grounding, formula grounding, causal compression, and output discipline. The strongest traces stayed close to the presented schedule and compressed toward verifier-relevant findings. The weakest traces did the opposite: they drifted into generic HVAC explanation, expanded in length, and lost the contract.&lt;/p&gt;
&lt;p&gt;From that manual read, a few recurring failure labels stood out.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instance substitution:&lt;/strong&gt; the model silently stopped auditing the presented office-building schedule and solved a different problem.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic-domain takeover:&lt;/strong&gt; the trace remained fluent and domain-aware, but it had turned into an HVAC essay rather than an audit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standard hallucination:&lt;/strong&gt; the model introduced confident but weakly grounded claims about AS 1668.2 lookups, occupant densities, or OA rates to justify a path it had invented.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verbosity runaway:&lt;/strong&gt; the trace expanded toward the output-token ceiling without improving task fidelity or output quality.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failure shape&lt;/th&gt;
&lt;th&gt;What it looks like in practice&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instance substitution&lt;/td&gt;
&lt;td&gt;The trace silently swaps in a different schedule, room mix, or city conditions&lt;/td&gt;
&lt;td&gt;The model is no longer auditing the assigned artefact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generic-domain takeover&lt;/td&gt;
&lt;td&gt;The writing stays fluent and technical but turns into generic HVAC explanation&lt;/td&gt;
&lt;td&gt;Domain fluency masks loss of task control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standard hallucination&lt;/td&gt;
&lt;td&gt;The trace confidently asserts unsupported lookup values or code interpretations&lt;/td&gt;
&lt;td&gt;It manufactures justification for the wrong path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verbosity runaway&lt;/td&gt;
&lt;td&gt;The trace expands toward the token ceiling without converging toward findings&lt;/td&gt;
&lt;td&gt;Length substitutes for control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A few lines from the traces make the pattern obvious.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;### Room 1 — Hotel Room A (Hotel Bedrooms, 30 m²)&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That line came from an Adelaide &lt;code&gt;L3&lt;/code&gt; run that was supposed to be auditing an office-building schedule. By that point the trace was no longer on the assigned task at all.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;### Room 1 — Classroom A&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That came from a Brisbane no-tool failure. The model remained fluent and organized, but it had drifted into a classroom-and-library problem that was never in the prompt.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Room 3 Errors: - Conduction W: given 4320, correct = 1600&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That comes from the successful Sydney no-tool trace. It is much less ornate, but it stays attached to the actual schedule and compresses toward the discrepancies that matter.&lt;/p&gt;
&lt;p&gt;That pattern matters because it changes how to read the weak positive signal in the no-tool condition. The surviving no-tool traces suggest something specific: the model can sometimes reconstruct enough of the method to succeed, but only when it keeps a very tight lock on the actual instance. Once that lock breaks, domain fluency is not enough to rescue the audit.&lt;/p&gt;
&lt;p&gt;This is exactly the kind of behaviour you would expect in an out-of-distribution domain. The model does not fail by becoming incoherent. It fails by becoming plausibly generic.&lt;/p&gt;
&lt;p&gt;That matters for cost too, because these are not always short failures. Some of them are long, fluent, and expensive failures.&lt;/p&gt;
&lt;h2&gt;Time and Cost Need To Be Measured Together&lt;/h2&gt;
&lt;p&gt;The cheapest model per trial is not automatically the best value.&lt;/p&gt;
&lt;p&gt;&amp;lt;QualityVsCost {...qualityVsCostData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;GPT-4.1-mini was cheapest in raw dollar terms, but too much of that spend was wasted because the outputs were unusable or incomplete.&lt;/p&gt;
&lt;p&gt;Sonnet 4.6 was the most expensive, and part of that cost came from output verbosity. It generated much more output than the other Anthropic models, which limits how much prompt caching can save. The no-tool traces make the broader point clearly: a long failing trace is also a cost event.&lt;/p&gt;
&lt;p&gt;Haiku 4.5 hit the most interesting middle ground. It was fast, much cheaper than Sonnet 4.6, and accurate enough that it dominated on reward-squared-per-dollar.&lt;/p&gt;
&lt;p&gt;That metric matters because it punishes low accuracy sharply. &lt;strong&gt;A cheap wrong answer is not a bargain in review-heavy engineering workflows.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That matters especially in AEC, where the near-term deployment shape is often low request volume and very high task value. These are usually not million-QPS workloads. They are bounded but complex tasks that take skilled people real time to complete, and where the cost of a bad result can easily dominate the cost of the model run itself. In that setting, quality comes first.&lt;/p&gt;
&lt;p&gt;The practical sequence is usually two-stage. First, you pay for quality in order to discover which tasks agents can actually do well enough to be useful. Only later, once those workflows are stable and you start scaling them across teams or organisations, does cost become the main optimisation target. At that point the question changes from can this task be done well to how broadly can we deploy it without losing quality or blowing up spend.&lt;/p&gt;
&lt;p&gt;In this small experiment, if you want the highest ceiling, Sonnet 4.6 is the answer.&lt;/p&gt;
&lt;p&gt;In the same narrow setting, if you want the strongest quality-per-dollar tradeoff, Haiku 4.5 is hard to ignore.&lt;/p&gt;
&lt;p&gt;If you want a deployable system, the right answer probably depends on where in the workflow the agent sits and how much review coverage a human still provides.&lt;/p&gt;
&lt;h2&gt;What This Means for AI Agents in AEC&lt;/h2&gt;
&lt;p&gt;The practical takeaway is not that AI can now replace engineering judgement. That would be the wrong lesson.&lt;/p&gt;
&lt;p&gt;The stronger result is narrower and more useful: &lt;strong&gt;on bounded, well-instrumented tasks, evaluation quality already matters as much as model selection.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The models were not most differentiated by calculation. They were differentiated by disciplined checking, completeness, and reliable finish behaviour. Those are exactly the traits that matter in real QA workflows.&lt;/p&gt;
&lt;p&gt;So if you are trying to bring agents into AEC practice, one sensible near-term path is not full autonomy. It is scoped, auditable assistance on tasks where you can define the inputs, the expected outputs, and the failure modes clearly.&lt;/p&gt;
&lt;p&gt;That is also where benchmarks can be genuinely useful: as a way to test whether an agent is ready for a specific class of work.&lt;/p&gt;
&lt;h2&gt;What This Means for Agentic Evaluation and Benchmarks&lt;/h2&gt;
&lt;p&gt;What this benchmark suggests is that three parts of the eval design matter especially strongly.&lt;/p&gt;
&lt;p&gt;First, real task grounding. The benchmark should represent work that people actually care about getting right.&lt;/p&gt;
&lt;p&gt;Second, harness transparency. &lt;strong&gt;Turn limits, verifier design, tool affordances, and output contracts are not implementation trivia. They are part of the measured system.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Third, behavioural instrumentation. If two agents get similar scores but fail in different ways, that difference matters. If one model exposes a strong distress signal and another does not, that matters too.&lt;/p&gt;
&lt;p&gt;This is why benchmarks are most useful when those layers are visible together: domain realism, outcome quality, and agent behaviour. In that sense, AEC is a good stress case. It can be highly digitised in important workflow slices, it is economically important, and it is awkward enough to expose real capability gaps.&lt;/p&gt;
&lt;h2&gt;What Comes Next&lt;/h2&gt;
&lt;p&gt;The obvious next step is scale. One task in one discipline is enough to surface a potential pattern, but not enough to define a field. If this work is going to mature into a useful benchmark, it needs to grow into thousands of task instances across multiple disciplines, with enough breadth to distinguish narrow task skill from more general domain competence.&lt;/p&gt;
&lt;p&gt;It also needs multimodality much earlier than many evals do. Design and engineering work are not purely text workflows. Drawings, schedules, details, markups, diagrams, and spatial context are central to the job. A serious benchmark for this domain will need multimodal inputs and multimodal tool use as part of the core design, not as an optional extension added later.&lt;/p&gt;
&lt;p&gt;Then there is the harder evaluation problem: &lt;strong&gt;tasks where there is no single clean quantitative answer&lt;/strong&gt;. A lot of real engineering work is about adequacy, judgement, prioritisation, and review quality rather than one exact number. That is where expert-authored rubrics, and eventually rubric-driven reward systems, become crucial. Recent work such as &lt;a href=&quot;https://arxiv.org/abs/2507.17746&quot;&gt;Rubrics as Rewards: Reinforcement Learning Beyond Verifiable Domains&lt;/a&gt; points in that direction. If we want to benchmark useful domain work rather than only easily scored work, we will need much better machinery for structured qualitative evaluation.&lt;/p&gt;
&lt;p&gt;And beyond single tasks, there is process. Many real workflows are long-horizon and compositional: they are made of many smaller tasks chained together across time, artefacts, and decisions. That is part of why starting with sharply scoped task instances still makes sense. They are the building blocks. Over time, the harder benchmark will be the composition problem: whether agents can string those capabilities together reliably across longer processes without losing quality, context, or control.&lt;/p&gt;
&lt;h2&gt;The Current Bottom Line&lt;/h2&gt;
&lt;p&gt;If you force a one-line conclusion, it is this:&lt;/p&gt;
&lt;p&gt;Current agent capability on real engineering tasks is still highly conditional on the operating environment: the best systems verify better, finish more reliably, and look much weaker once the scaffold is removed.&lt;/p&gt;
&lt;p&gt;That is encouraging, but it is also a warning.&lt;/p&gt;
&lt;p&gt;You can learn the wrong lesson from a bad eval.&lt;/p&gt;
&lt;p&gt;And you can misunderstand both strength and weakness if you are only looking at model names instead of the full system around them.&lt;/p&gt;
&lt;p&gt;This work is still in its early phases and still narrow. But it is already telling us something useful: &lt;strong&gt;the next layer of progress will not come from bigger scoreboards alone. It will come from better tasks, better harnesses, and a clearer view of how much of domain capability is native to the model and how much is being supplied by the environment around it.&lt;/strong&gt;&lt;/p&gt;
</content:encoded><author>Theodoros Galanos</author></item><item><title>Where Capability Actually Lives in Agentic Engineering</title><link>https://theharness.blog/blog/where-capability-actually-lives-in-agentic-engineering/</link><guid isPermaLink="true">https://theharness.blog/blog/where-capability-actually-lives-in-agentic-engineering/</guid><description>In AEC and domain-specific engineering, AI agent capability lives not in the model alone but in harness engineering — the tools, verifiers, orchestration, and process design that make agentic work reliable.</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import ConceptGrid from &apos;../../components/charts/ConceptGrid.astro&apos;;
import {
harnessLayersData,
openQuestionsData,
taskProcessData,
} from &apos;../../data/where-capability-charts&apos;;&lt;/p&gt;
&lt;p&gt;Estimated reading time: 16 minutes&lt;/p&gt;
&lt;p&gt;Engineering is a useful stress test for agentic systems because it exposes a kind of weakness that general demos often hide. The problem is not that the domain is technical in the abstract. &lt;strong&gt;It is that the work is instance-bound, constraint-heavy, and intolerant of plausibly generic answers.&lt;/strong&gt; To be useful here, an agent has to do more than sound competent. It has to stay attached to the artifact, preserve the method, survive verification, and finish in a form that another system or person can trust.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To be useful here, an agent has to do more than sound competent. It has to stay attached to the artifact, preserve the method, survive verification, and finish in a form that another system or person can trust.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That changes the way we should think about progress. &lt;strong&gt;In domains like engineering, capability cannot be understood as a property of the base model alone.&lt;/strong&gt; What matters is whether the full system can remain faithful to the specific document, drawing, assumptions, standards, and constraints that define the task in front of it. The question is not just whether a model can reason in the neighborhood of the work. It is whether the operating environment lets reliable work happen at all.&lt;/p&gt;
&lt;p&gt;This broader shift is already visible across AI development. State-of-the-art behaviour increasingly comes from &lt;a href=&quot;https://bair.berkeley.edu/blog/2024/02/18/compound-ai-systems/&quot;&gt;compound systems (BAIR, 2024)&lt;/a&gt; rather than single model calls, and actual work-related use still occupies a much narrower space than theoretical capability would suggest, which is part of why deployment questions matter so much &lt;a href=&quot;https://www.anthropic.com/research/labor-market-impacts&quot;&gt;Anthropic, 2026&lt;/a&gt;. Engineering sharpens that pattern. It forces a harder question than many benchmark settings do: where does reliable capability actually live? How much is native to the model, how much is supplied by tools and verifiers, and how much emerges only when the environment is designed correctly, especially in a landscape where &lt;a href=&quot;https://arxiv.org/html/2603.01203&quot;&gt;benchmark coverage is still skewed toward more convenient task domains&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That is the question this essay is really about.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;In engineering, useful agent performance depends less on generic fluency than on staying attached to the specific artifact, assumptions, constraints, and output format of the task at hand.&lt;/li&gt;
&lt;li&gt;That means capability does not live in the base model alone. It is distributed across the full system: tools, verifiers, control flow, output contracts, interfaces, and human review structure.&lt;/li&gt;
&lt;li&gt;The real design problem is therefore not just model selection. It is harness design: deciding what the agent should infer, what should be externalised into tools, what should be checked, and how the work should remain controllable.&lt;/li&gt;
&lt;li&gt;Many important engineering workflows are better understood as processes rather than isolated tasks, which makes orchestration, UX, visibility, and intervention part of the capability story too.&lt;/li&gt;
&lt;li&gt;If we want meaningful progress in engineering and AEC, we need better experimental environments and benchmarks that reflect real artifacts, real failure modes, and the actual conditions required for reliable work.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why AEC Engineering Breaks Most AI Agent Approaches&lt;/h2&gt;
&lt;p&gt;It is tempting to treat engineering as one more expert domain that large models will gradually absorb as they become smarter and better trained. There is some truth in that. Engineering work is full of technical language, quantitative reasoning, standards, and procedural knowledge, all of which are at least partially representable in text, math, and code. But that description misses the thing that makes the domain difficult in practice.&lt;/p&gt;
&lt;p&gt;Engineering is not hard only because it contains specialized knowledge. It is hard because the work is tied to particular artifacts and particular consequences. A calculation is not just a calculation. It belongs to a drawing set, a schedule, a climate zone, a standard, a collection of assumptions, and a downstream chain of decisions that may depend on it being right for this case and not some nearby case. In that environment, generic competence is not enough. A system can sound perfectly fluent and still fail the job by drifting away from the assigned instance.&lt;/p&gt;
&lt;p&gt;That is why instance fidelity matters so much. In many tasks, being approximately in the right conceptual neighborhood is enough to be useful. In engineering, that can be the beginning of failure rather than the end of it. A model that substitutes a different design scenario, silently shifts a governing assumption, applies the wrong interpretation of a standard, or answers in a way that cannot be checked by another party has not produced a near miss. It has broken attachment to the artifact. That kind of failure is especially dangerous because it can still look competent on a casual read.&lt;/p&gt;
&lt;p&gt;This is also why engineering is a more interesting challenge than a simple test of mathematical or coding ability. The hard part is often not deriving a formula. It is staying inside the bounds of the real task while carrying the correct assumptions all the way through to a legible output. That starts to look less like raw problem solving and more like a problem of task control: can the system monitor what object it is operating on, track which assumptions still govern the case, notice when more checking is needed, and converge on a form of completion that another party can actually use? General-purpose capability does not automatically guarantee that kind of discipline, and one of the open questions is how much of it is native to the model versus supplied by the surrounding harness.&lt;/p&gt;
&lt;p&gt;Seen that way, the question is not whether models can do engineering in some broad, promotional sense. The question is what conditions make engineering work stay controllable. That is a narrower question, but it is also the one that matters if the goal is not spectacle but dependable use.&lt;/p&gt;
&lt;h2&gt;The Harness Is Where Engineering Capability Gets Made&lt;/h2&gt;
&lt;p&gt;Once engineering is framed as artifact-bound and verification-sensitive work, the role of the harness looks different. It is no longer reasonable to think of the harness as a thin wrapper around model capability. The harness determines what the system can see, what method it can invoke, what constraints are explicit, what gets checked, what counts as a recoverable error, and what form the final answer must take. In other words, it helps determine not just how the system runs, but what kind of cognition the system is able to express.&lt;/p&gt;
&lt;p&gt;That matters because many of the hardest parts of engineering workflows live in precisely those layers. Tools can carry method that would otherwise need to be reconstructed unreliably from prompt context. &lt;strong&gt;More than that, many tools are artifacts of accumulated domain expertise.&lt;/strong&gt; They are places where a field has already embedded procedures, assumptions, checks, tolerances, and accepted ways of doing work. In some cases that expertise is explicit and executable, as in calculations, lookups, and verification routines. In other cases it is more qualitative, showing up as workflows, review habits, and best-practice sequences. Verifiers can enforce habits of checking that a model may not apply consistently on its own. Output contracts can force the system to conclude in a format that is inspectable, comparable, and operationally usable. Turn budgets and control flow can decide whether an agent has enough room to complete a careful review or whether it will collapse into partial work and malformed output.&lt;/p&gt;
&lt;p&gt;&amp;lt;ConceptGrid {...harnessLayersData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;In that sense, the harness is not just infrastructure. It is part of the cognitive system. It allocates where reasoning happens, where discipline comes from, and how failure is surfaced. Recent work from OpenAI on &lt;a href=&quot;https://openai.com/index/harness-engineering/&quot;&gt;harness engineering&lt;/a&gt; makes the same point from another angle: once agents are doing real work, progress depends heavily on the legibility of the environment, the structure of the feedback loops, and the extent to which knowledge has been made accessible and enforceable inside the system. A calculator tool is not merely a convenience. It is a decision about which parts of the method should be made stable and externalised. A verifier is not just a quality filter. It is a decision to make certain forms of checking structurally available to the agent. Even the shape of the prompt matters less as isolated wording than as one part of a larger control architecture.&lt;/p&gt;
&lt;p&gt;This is why questions about orchestration in engineering cannot be reduced to prompt engineering. The meaningful design problem is architectural. What should the agent infer versus look up? What should be encoded in tools versus policy? Which checks should happen during reasoning and which should happen after? When should the system stop and ask for clarification instead of filling gaps with plausible narration? These are not implementation details to be cleaned up after capability arrives. They are part of how capability is built.&lt;/p&gt;
&lt;p&gt;Once you see that clearly, a lot of standard debates start to look underspecified. Asking which model is best without asking what environment it is operating in is often the wrong question. In engineering, the more useful question is where the capability actually lives. Some of it lives in the model. Some of it lives in the tools, verifiers, and control policies around it. And some of it may only emerge when those pieces are composed in the right way. If that is true, then progress in this domain will depend not only on better models, but on better harness engineering for engineering.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If that is true, then progress in this domain will depend not only on better models, but on better harness engineering for engineering.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Open Questions for AI Agents in Engineering and AEC&lt;/h2&gt;
&lt;p&gt;This is where the real research agenda begins. If we are serious about agentic engineering, there are several questions that still look underexplored and experimentally open. They are not small implementation questions. They are structural questions about where competence comes from, how reliability is made, and what exactly we are trying to optimise for.&lt;/p&gt;
&lt;p&gt;The first question is where domain knowledge should live. Some engineering method can be carried in the prompt, some in retrieved standards, some in dedicated tools, and some in verifier logic or decomposition policy. Those choices are not equivalent. A method embedded in prose instructions is available in a very different way from a method embedded in a tool or a structured reference. One of the central design problems in this domain is deciding which knowledge should remain internal to the model&apos;s reasoning and which should be stabilised outside it.&lt;/p&gt;
&lt;p&gt;The second question is the unit of work. We still do not know the right granularity for engineering agents. Some tasks may be small enough to support reliable execution but too narrow to create useful leverage. Others may be large enough to matter operationally but so broad that the agent starts drifting, skipping checks, or losing attachment to the governing artifact. The choice is not between tiny tasks and ambitious autonomy as abstract ideals. It is about finding the span of work within which an agent can still remain controllable. &lt;strong&gt;And once the relevant unit turns out not to be a task but a process, questions of decomposition, review structure, and interaction design move from the margins to the centre.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The third question is what actually predicts reliability. Final scores matter, but they are not enough. A system that arrives at a good answer through a fragile process may be much less useful than a system that exposes when it is uncertain, revisits questionable steps, compresses toward clear findings, and behaves differently when it is in trouble. We do not yet know which trace-level signals are robust enough to support runtime monitoring or intervention, but that is exactly the kind of question that becomes important once you care about real workflows instead of static evaluation alone. Recent work on reasoning structure and agent behaviour is starting to point in this direction, treating intermediate behaviour as something analysable rather than just an opaque path to the final score, as in &lt;a href=&quot;https://arxiv.org/abs/2601.06002&quot;&gt;Du et al.&apos;s Agentic Bonds framework&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The fourth question is how failure should be described. It is too coarse to talk about engineering failures as if they were all reasoning failures. In practice, the failure may be loss of task attachment, substitution of the instance, unsupported use of standards, malformed completion, or verbose but weakly grounded narration. Those are different breakdowns, and they imply different remedies. If we do not distinguish them, we will end up measuring systems in ways that hide the mechanisms we most need to improve.&lt;/p&gt;
&lt;p&gt;The fifth question is how much capability a well-designed environment can supply. This is one of the most important and most delicate unknowns. A good harness can clearly unlock behaviour that would not reliably appear in a weak setup. But that raises a harder interpretive problem. When does scaffolding help a model express real competence, and when does it effectively perform too much of the task on the model&apos;s behalf? We need to know that boundary, because it affects how we read both benchmark results and deployment claims.&lt;/p&gt;
&lt;p&gt;&amp;lt;ConceptGrid {...openQuestionsData} columns={1} /&amp;gt;&lt;/p&gt;
&lt;p&gt;Each question changes what we should build, what we should measure, and how we should interpret success. Taken together, they suggest that the real frontier in agentic engineering is not just model improvement. It is experimental clarity about how capability is distributed across the whole system.&lt;/p&gt;
&lt;h2&gt;From Tasks to Processes: Why Engineering Workflows Need More Than Single-Step Agents&lt;/h2&gt;
&lt;p&gt;One reason this design space is easy to misunderstand is that we often talk about work as if it arrives in neatly bounded tasks. Sometimes it does. But many of the workflows that matter most in engineering are not really tasks in that sense. They are processes: longer-horizon structures with multiple artifacts, multiple experts, natural gates of review and control, and repeated moments where uncertainty has to be managed rather than ignored.&lt;/p&gt;
&lt;p&gt;That distinction matters because a process creates a different design problem from a task. A task invites a question like: can the system complete this unit of work correctly? A process invites harder questions. How should work be decomposed across time? Where should evidence accumulate? When should one expert intervene directly, and when should the system continue on its own? What kind of intermediate state has to be visible for redirection, challenge, or sign-off to be meaningful? The moment you move from tasks to processes, orchestration stops being a thin implementation layer and becomes part of the substance of the work.&lt;/p&gt;
&lt;p&gt;&amp;lt;ConceptGrid {...taskProcessData} /&amp;gt;&lt;/p&gt;
&lt;p&gt;This is especially visible in workflows that look simple when described at a distance. A due diligence engagement can sound like one task: review the available material and produce a judgment. In practice it is nothing like a single bounded action. It is a process of evidence gathering, interpretation, cross-checking, escalation, synthesis, and review, often with several experts working in parallel and stepping in at different moments for different reasons. The important problem is not just whether an agent can perform one inference. It is whether the overall system can support the sequence of inferences, checks, and interventions that make the result trustworthy.&lt;/p&gt;
&lt;p&gt;That is also why LLM UX becomes more important, not less, once agents enter the picture. If the real unit of work is a process, then the interaction pattern between humans and the system becomes part of the capability. We need to know what it means for an expert to drive the loop rather than merely appear in the loop at pre-specified checkpoints. We need to know how a system should request judgment, how it should expose uncertainty, and how it should allow redirection without forcing the human to reconstruct the entire state of the process from scratch.&lt;/p&gt;
&lt;p&gt;This is not just a matter of convenience. It is a cognitive issue. These systems can already accumulate more intermediate state, more branching hypotheses, and more raw evidence than any single human can comfortably keep in working memory. So the question becomes: what is the control surface for a process like that? What is the communication layer that abstracts complexity without hiding the very evidence a reviewer may need to inspect? What kinds of summaries, provenance views, exception queues, and escalation mechanisms let a human meaningfully steer a process they cannot fully replay in their head?&lt;/p&gt;
&lt;p&gt;Seen this way, agentic engineering is not only about building systems that can do tasks. It is about building systems that can participate in processes without dissolving the human capacity to understand, direct, and verify what is happening. That may be one of the deepest reasons harness design matters so much in engineering. The harness is not just coordinating tools around a model. It is helping define the structure through which work, judgment, and control move over time.&lt;/p&gt;
&lt;h2&gt;AEC Needs Better Benchmarks, Not Better Demos&lt;/h2&gt;
&lt;p&gt;If capability is environmentally expressed, then environment design has to become an empirical science rather than a collection of intuitions. In engineering, and especially in AEC, that point still has not been fully absorbed. Too much of the current conversation remains stuck at the level of demos, generic prompting claims, or isolated examples of model fluency. What the field needs instead is controlled experimentation on engineering task environments. Instead of asking whether a model can solve a cherry-picked problem, we need task families that let us vary conditions deliberately, observe what changes, and learn which combinations of tools, constraints, interfaces, and verification loops actually produce dependable work.&lt;/p&gt;
&lt;p&gt;That starts with grounding. The tasks have to come from artifacts people actually use, and they have to reflect the problem spaces and value spaces that matter in practice. Every benchmark task is not just an isolated prompt. It is an instance of a broader problem class, and part of the job is identifying those classes deliberately rather than sampling whatever happens to be easy to score. From there, the environment itself has to become legible to experimentation: harness variants, tool access, verifier behaviour, output constraints, turn budgets, and other control variables need to be adjustable so we can see what is actually driving performance. And the measurements cannot stop at end scores. We need outcome metrics, but also trace-level analysis and explicit failure taxonomies that tell us what kind of process the system used and what kind of breakdown occurred when it failed.&lt;/p&gt;
&lt;p&gt;The evaluation target also has to expand beyond isolated tasks. In many real settings, the important object is a process: a longer-horizon workflow with multiple artifacts, multiple actors, parallel workstreams, and repeated gates of review and redirection. The benchmark surface therefore cannot stop at correctness on a single step. It has to ask how control is handed off, how intermediate state is exposed, how uncertainty is surfaced, and how the system behaves when a human expert needs to redirect the work without redoing it from scratch.&lt;/p&gt;
&lt;p&gt;That pushes evaluation toward a more realistic style. Engineering work is not purely textual, rarely single-step, and often only partly verifiable by one exact answer. Drawings, schedules, specifications, details, markups, diagrams, and spatial context are part of the task, not decorative extras. A serious research program in this space will need multimodal inputs much earlier than many current evals do. It will also need better machinery for tasks where adequacy, prioritisation, and review quality matter more than one final number.&lt;/p&gt;
&lt;p&gt;It also raises a cognitive problem as well as a technical one. Once these systems are processing more state, more evidence, and more branching intermediate work than any human can comfortably hold in mind, the design challenge shifts again. What is the communication layer between the system and the expert? How should complexity be abstracted without hiding the very evidence a reviewer may need to see? What summaries, state representations, provenance trails, and escalation patterns let a human steer a process they cannot fully replay in their head? Those questions sit at the boundary between interface design, cognition, and control, and they are likely to matter just as much as the underlying model or toolchain.&lt;/p&gt;
&lt;p&gt;The point is not to make benchmarks larger for their own sake. The point is to make them shaped enough like the work that they can teach us something real. If the benchmark is too convenient, it will mainly reward convenience. If the environment is too unlike practice, it will tell us very little about what systems can actually be trusted to do.&lt;/p&gt;
&lt;h2&gt;Reliability Before Autonomy: What AEC Firms Actually Need from AI Agents&lt;/h2&gt;
&lt;p&gt;The most useful near-term goal is probably not full engineering autonomy. It is reliable leverage on bounded tasks. Systems that can assist with scoped review, structured checking, discrepancy detection, and well-instrumented analysis may already create value long before end-to-end automation becomes plausible.&lt;/p&gt;
&lt;p&gt;That is also a more useful way to think about autonomy itself. &lt;strong&gt;In practice, autonomy is not just a property of the model. It is an achievement of the system.&lt;/strong&gt; A workflow becomes more autonomous when the surrounding environment makes the task legible, encodes the relevant constraints, exposes the right tools, and provides enough feedback for the agent to act with bounded independence rather than uncontrolled freedom.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In practice, autonomy is not just a property of the model. It is an achievement of the system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That framing matters because it keeps the work tied to real workflow value instead of speculative theatre. Engineering organisations do not need a general claim that an agent is intelligent. They need to know whether a system can reduce time on a defined task while preserving reviewability and limiting failure cost. In many cases, the right near-term design is not autonomy but disciplined assistance inside a human-controlled process.&lt;/p&gt;
&lt;p&gt;That is also why reliability has to come before ambition. A narrower system that stays attached to the artifact, exposes its work clearly, and fails in legible ways is often more valuable than a broader one that produces impressive but weakly controllable outputs. &lt;strong&gt;In engineering, trust is not a cosmetic feature added after the fact. It is part of the product.&lt;/strong&gt; If a system cannot show why it acted, preserve the assumptions it relied on, and support meaningful intervention when things go wrong, then the path to autonomy runs through fragility rather than leverage.&lt;/p&gt;
&lt;p&gt;This is especially important in domains like AEC, where the work is high consequence, low volume, and deeply review-shaped. The near-term question is not whether a system can replace expertise wholesale. It is whether it can make expert time more powerful without dissolving accountability. The prize is not a machine that replaces engineering judgment in the abstract. It is a system that can participate in engineering workflows in ways that are inspectable, recoverable, and worth trusting on defined slices of the job.&lt;/p&gt;
&lt;h2&gt;Why Harness Engineering for AEC Matters Now&lt;/h2&gt;
&lt;p&gt;This is the kind of work that matters if we want progress in engineering AI to be meaningful rather than theatrical. The glamorous parts of this field are easy to spot. The &lt;a href=&quot;https://www.linkedin.com/pulse/when-expert-systems-need-coordination-building-workflow-galanos-zrudc/&quot;&gt;boring middle&lt;/a&gt; is not. &lt;strong&gt;But the boring middle is where much of the real leverage lives: task selection, workflow design, harness construction, interface design, verification, and evaluation.&lt;/strong&gt; If we skip that layer, we do not get reliable systems. We get better demos.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If we skip that layer, we do not get reliable systems. We get better demos.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The interesting frontier is not another round of vague claims that models are getting smarter. It is the slower and more consequential work of identifying valuable problem spaces, building task environments around them, designing the right control surfaces, and learning how capability is distributed across models, tools, interfaces, and human judgment.&lt;/p&gt;
&lt;p&gt;That is also what makes this an unusually exciting moment to work on these problems. The design space is still open. The operational patterns are not settled. The important domains are still underexplored. That means there is real room to shape the field: not just by building better models, but by building better harnesses, better evaluations, better interfaces, and better ways for experts and autonomous systems to work together on real tasks and real processes.&lt;/p&gt;
&lt;p&gt;If engineering and AEC are going to benefit meaningfully from these systems, that work cannot be left to benchmark convenience or generic product abstractions. It will require people who understand the domains, the artifacts, the review practices, and the economics of real workflows to help define what good looks like. Before this becomes a field of grand claims, it should become a field of good experiments, good environments, and good judgment about where these systems can actually be trusted.&lt;/p&gt;
</content:encoded><author>Theodoros Galanos</author></item></channel></rss>