The "HiFi" Benchmark for Reliable AI Automation

The "HiFi" Benchmark for Reliable AI Automation

AI Reliability for Customer Service Agents: the τ²-bench Retail Benchmark

AI Reliability for Customer Service Agents: the τ²-bench Retail Benchmark

Highlights

This benchmark measures how much an application platform adds to the reliability of an LLM on a public, widely used agent benchmark: the retail customer service domain of τ²-bench (tau2-bench), run on gpt-5.1, a capable but non-frontier LLM.

The platform made the same LLM markedly more consistent. On 69 held-out tasks, run four times each, gpt-5.1 on its own passed every trial of a task 32% of the time (pass^4 0.32). On Thunk.AI, with the modular design, it did so 49% of the time (pass^4 0.49), and its single-trial success rose from 0.63 to 0.73.


τ²-bench retail, 69 held-out tasks × 4 trials; details in section 5.

τ²-bench retail, 69 held-out tasks × 4 trials; details in section 5.

  1. Prompting an LLM is the least reliable way to build an agent. Given the policy as a prompt and the store's tools, gpt-5.1 never solved 9 of the 69 tasks in any of its four trials, and solved only 22 every time. With the modular thunk, 5 were never solved and 34 always were.

  2. A simple mapping to the platform helps; a structured one helps more. Moving the policy into a single-step thunk with policy-checked tools raised pass^4 from 0.32 to 0.43. Decomposing it into steps, typed state, code for the deterministic rules and AI tools for the judgments raised it to 0.49.

  3. The fixable failures came from the specification, not from LLM weakness. The failures the platform removed traced to two causes: ambiguity in the written policy, and exact rules left for the LLM to apply in its head. Some failures remain that are plain LLM errors; no platform can remove those, but it can give the LLM fewer chances to make them.

  4. The tuning itself was automated. Thunk.AI's Forward Deployed Agent derived the specification, built the thunks, ran the benchmark, analyzed every failure and built the fixes, over eight iterations. A person only steered. This is the iterative process every enterprise agent needs, and it can be almost entirely automated.

τ²-bench was not built by Thunk.AI: some of its expected results disagree with its own policy, and its customers are simulated by an LLM, so no implementation scores 100%. The measure that matters is the relative improvement over the same LLM, on the same tasks, under the same noise.

Resources:
Benchmark definition site
Benchmark results on Thunk.AI
Thunk.AI Website

Highlights

This benchmark measures how much an application platform adds to the reliability of an LLM on a public, widely used agent benchmark: the retail customer service domain of τ²-bench (tau2-bench), run on gpt-5.1, a capable but non-frontier LLM.

The platform made the same LLM markedly more consistent. On 69 held-out tasks, run four times each, gpt-5.1 on its own passed every trial of a task 32% of the time (pass^4 0.32). On Thunk.AI, with the modular design, it did so 49% of the time (pass^4 0.49), and its single-trial success rose from 0.63 to 0.73.


τ²-bench retail, 69 held-out tasks × 4 trials; details in section 5.

τ²-bench retail, 69 held-out tasks × 4 trials; details in section 5.

  1. Prompting an LLM is the least reliable way to build an agent. Given the policy as a prompt and the store's tools, gpt-5.1 never solved 9 of the 69 tasks in any of its four trials, and solved only 22 every time. With the modular thunk, 5 were never solved and 34 always were.

  2. A simple mapping to the platform helps; a structured one helps more. Moving the policy into a single-step thunk with policy-checked tools raised pass^4 from 0.32 to 0.43. Decomposing it into steps, typed state, code for the deterministic rules and AI tools for the judgments raised it to 0.49.

  3. The fixable failures came from the specification, not from LLM weakness. The failures the platform removed traced to two causes: ambiguity in the written policy, and exact rules left for the LLM to apply in its head. Some failures remain that are plain LLM errors; no platform can remove those, but it can give the LLM fewer chances to make them.

  4. The tuning itself was automated. Thunk.AI's Forward Deployed Agent derived the specification, built the thunks, ran the benchmark, analyzed every failure and built the fixes, over eight iterations. A person only steered. This is the iterative process every enterprise agent needs, and it can be almost entirely automated.

τ²-bench was not built by Thunk.AI: some of its expected results disagree with its own policy, and its customers are simulated by an LLM, so no implementation scores 100%. The measure that matters is the relative improvement over the same LLM, on the same tasks, under the same noise.

Resources:
Benchmark definition site
Benchmark results on Thunk.AI
Thunk.AI Website

This article describes how the benchmark was run, the three implementations compared, their results on the 30 iteration tasks and the 69 held-out tasks, and how the Forward Deployed Agent tuned the design.

1: Why this benchmark

Benchmarks like τ²-bench were built to show how LLMs compare on an enterprise-like workload. Each domain gives the LLM a written policy (a prompt) and a set of tools, then runs many randomized customer conversations that are expected to be handled under that policy. A simulated customer plays each scenario, and the conversation passes only if the store's database ends in exactly the expected state.

A central part of the measurement is consistency. τ²-bench reports pass^k: the probability that a task passes in all of k independent trials. A business process that works in three conversations out of four is not one an enterprise can rely on, and pass^k exposes exactly that gap.

In practice, this is not how agentic applications are built for the enterprise, or for any repetitive use. Sending a prompt to an LLM is the naive way to use agentic AI, and it minimizes consistency. Nothing analyzes the prompt in advance, finds where it is ambiguous, or separates its exact rules from its judgment calls, because a bare LLM has no application model beyond the prompt.

An application platform like Thunk.AI does have one: steps with defined inputs and outputs, typed state, code tools, AI tools with their own instructions and tools, and checks on what the AI records. This benchmark sets out to measure how much reliability that application model adds, on the same tasks, the same simulated customers and the same LLM.

What the numbers mean. τ²-bench was not created by Thunk.AI, and it is not a perfect yardstick. In places its expected results disagree with its own written policy, and its customers are played by an LLM, which introduces inconsistencies of its own: a simulated customer may misremember its scenario, stop early, or answer differently from one trial to the next. No implementation can score 100% on it. What matters here is the relative improvement over the same LLM on its own, measured on the same tasks under the same noise.

This is the latest in Thunk.AI's "HiFi" series, which measures AI agents doing enterprise business processes. Earlier benchmarks in the series covered document workflows, IT service management, drug safety case intake and AML alert triage. Unlike those, this one uses a public benchmark that Thunk.AI did not design.

2: The retail customer service domain

In the retail domain, the agent is an online store's customer service representative. It must authenticate each customer by email, or by name and zip code, and can then help them with their own orders and profile. The policy allows six kinds of action, each with its own rules:

Action

Allowed when

Key rules

Cancel an order

The order is pending

Whole order only; one of two accepted reasons

Modify an order's address or payment

The order is pending

Payment: a single method, different from the original; a gift card must cover the amount

Modify an order's items

The order is pending

Same product, different options; once per order, after which nothing else can change

Return items

The order is delivered

Refund to the original method or a gift card

Exchange items

The order is delivered

Same product, different options; a return and an exchange exclude each other

Change the default address

Always, once authenticated

Any complete address

The agent must list the details of every change and get an explicit yes before making it, must not make up information or procedures, and must transfer to a human agent "if and only if the request cannot be handled within the scope of your actions".

The work is exacting. Customers describe what they want loosely ("the cheapest one in blue", "the same colour as my other bottle", "my New York address, it's on my other order"), change their minds, combine several requests, and sometimes misremember their own orders. Each conversation passes only if the final database matches the expected one exactly: the right items, the right new variants, the right payment method, and no extra changes.

Scoring. Every task is run k times; pass^1 is the average success rate over all conversations, and pass^4 is the probability that all four trials of a task pass. The customer is simulated by gpt-4.1 at temperature 0, as in the public benchmark. The agent LLM is gpt-5.1 throughout.

3: Benchmark methodology

3.1. Three implementations

All three use the same LLM, gpt-5.1 with thinking off, temperature 0 and top_p 0, and the same policy, store tools and simulated customers. The standalone LLM is also reported at the benchmark's default settings, for reference.

Implementation

What it is

Standalone gpt-5.1

τ²-bench's own reference agent: the policy as the system prompt, the store's tools, one LLM call per turn

Single-step thunk (v8)

One chat step holding the whole process, with the policy's write rules moved into checked code tools and a typed request ledger (Appendix A)

Modular thunk (v9)

Two steps bound by typed properties, one AI tool per kind of request, typed read tools, code for every deterministic rule, and a separate judge for transfers (Appendix B). The iteration set reports its v9g version; the held-out set its final version, v9h

The modular thunk is the design best suited to an enterprise. Each part is small enough to test on its own, each AI tool sees only the tools and policy it needs, every write goes through a checked tool that cites the rule it enforces, and every decision is recorded in typed state that can be audited.

3.2. Data sets

The retail domain has 114 tasks: a 40-task test split and a 74-task train split.

  • The iteration set: 30 tasks from the test split. Every design change was made by reading failed conversations on these tasks. Ten further test tasks were used to debug the first modular build and are left out of the comparison.

  • The held-out set: 69 tasks from the train split. Nobody looked at these tasks, their conversations or their expected results while the thunks were built. Each implementation ran on them once, at the end. (The other 5 train tasks were used to test the connection between τ²-bench and Thunk.AI.)

Every task ran four times per implementation: 120 conversations per run on the iteration set and 276 on the held-out set.

3.3. The tuning was done by Thunk.AI's Forward Deployed Agent

The thunks were designed, built, tested and refined by Thunk.AI's Forward Deployed Agent, an AI agent that builds and tunes thunks through the platform's builder interface. It derived the specification from the policy, mapped it onto the platform, ran the benchmark, read every failed conversation, classified each failure, proposed and built the fixes, and ran the next iteration. A person steered at a high level: choosing between the alternatives it proposed, deciding the clarifications of the policy, and rejecting any fix that was specific to a test rather than general. Section 6 describes the loop. This matters because it is exactly the iterative process every enterprise application needs, and it can be almost entirely automated.

3.4. The rule every change followed

Every change came from the written policy or from a platform mechanism, never from knowledge of a particular task. An ambiguity was settled by a written clarification, decided by the process owner (the policy's author, in a real deployment) and recorded in the specification. An agent error was fixed by moving more of the work into a platform mechanism: a smaller step, a code check, a typed field. Every proposed fix was reviewed for being general, and any that only fitted the test at hand was dropped.

3.5. Evaluation harness

Thunk.AI built a bridge so that a thunk can be measured exactly as τ²-bench measures its own agent. Each simulated conversation is one Thunk.AI chat conversation. Every store tool call the thunk makes, including those made inside its code and AI tools, is relayed back through τ²-bench and executed there, so the benchmark's own evaluator replays and scores the trajectory unchanged.

4: Results on the 30 iteration tasks

On the tasks it was tuned on, the modular thunk raised pass^1 from 0.63 to 0.83 and more than doubled pass^4, from 0.27 to 0.60. The single-step thunk captured most of the single-trial gain; the modular design added consistency, solving 18 of the 30 tasks in every trial against 8 for the LLM on its own.

τ²-bench retail, 30 iteration tasks × 4 trials. Standalone rerun at temperature 0; single-step thunk = v8, modular thunk = v9g.

τ²-bench retail, 30 iteration tasks × 4 trials. Standalone rerun at temperature 0; single-step thunk = v8, modular thunk = v9g.

These are the tasks the design was refined on, so they show what the process can reach, not what to expect on new work. Section 5 gives the results on tasks it never saw.

5: Results on the 69 held-out tasks

On tasks never seen during development, the modular thunk beat the standalone LLM at every level of consistency: pass^1 0.73 against 0.63, and pass^4 0.49 against 0.32, a 53% relative gain in the share of tasks handled correctly every time.

τ²-bench retail, 69 held-out train-split tasks × 4 trials (276 conversations per implementation). Standalone at temperature 0; single-step thunk = v8, modular thunk = v9h.

τ²-bench retail, 69 held-out train-split tasks × 4 trials (276 conversations per implementation). Standalone at temperature 0; single-step thunk = v8, modular thunk = v9h.

The gap widens as k grows. Each extra trial a task must pass costs the standalone LLM more than it costs the thunk, which is the signature of a more consistent system rather than a more capable one. The modular design nearly halved the tasks never solved (9 to 5) and moved 12 more tasks to always solved (22 to 34). The single-step thunk captured most of the single-trial gain; the modular design added the larger part of the consistency gain, and is the design an enterprise can test and audit piece by piece.

Every trial of every task, in every configuration, is listed in the detailed results.

Two cautions. With 276 conversations per run, pass^1 differences of about ±0.05 are within run-to-run noise, so the modular thunk's pass^1 lead over the single-step thunk (0.04) is suggestive, not conclusive; its pass^4 lead (0.06) and its halving of never-solved tasks are clearer. And the held-out gains are smaller than on the iteration set (pass^1 0.83 there), the expected cost of measuring on tasks the design never saw, and the reason these are the figures to quote.

The standalone LLM at two settings. Every comparison in this report uses the standalone LLM at the thunk's settings (thinking off, temperature 0, top_p 0). It was also run at the benchmark's default settings (temperature 1.0), on both task sets. Temperature barely moved it, and neither setting comes close to the thunk. On the 30 iteration tasks its pass^4 was 0.37 at temperature 1.0 and 0.27 at temperature 0, but that gap is 3 tasks out of 30 and within run-to-run noise (a resampling test puts a gap that large at about a 1-in-4 chance), and it did not recur here.

Standalone gpt-5.1 settings

pass^1

pass^2

pass^3

pass^4

Tasks 4 of 4

Tasks 0 of 4

Benchmark defaults (temperature 1.0)

0.61

0.46

0.38

0.33

23

10

Thinking off, temperature 0, top_p 0

0.63

0.48

0.38

0.32

22

9

6: Iterative tuning by the Forward Deployed Agent

The Forward Deployed Agent built the thunk in eight iterations, each one a full turn of the loop below. The person steering it never edited the thunk: they chose among the options it proposed, decided how to clarify the policy, and turned down fixes that only fitted a test.

the tuning loop · 5 automated stages, human steering, one held-out validation

the tuning loop · 5 automated stages, human steering, one held-out validation

Each turn of the loop ran the iteration set, read every failed conversation and classified it (a misreading of the policy, an ambiguity it leaves open, a mechanical fault, an agent error, or simulator noise), then built the fixes that the policy or the platform justified. The chart shows the result of each iteration.

τ²-bench retail, 30 iteration tasks × 4 trials. Standalone rerun at temperature 0; v4, v7 and v8 ran on the 40-task test split and are re-scored here on the same 30 tasks.

τ²-bench retail, 30 iteration tasks × 4 trials. Standalone rerun at temperature 0; v4, v7 and v8 ran on the 40-task test split and are re-scored here on the same 30 tasks.

Version

What changed

Standalone

τ²-bench's own agent: the policy as a prompt

v4

The policy in one Thunk.AI step, with a few checked tools

v7

A specification derived sentence by sentence from the policy; every write rule enforced in a code tool; the customer's choices left open

v8

Rules that span actions (an item change ends all other changes to an order; a return excludes an exchange), clarifications of the policy, an AI guard on transfers

v9d

The modular redesign: two steps, one AI tool per kind of request, typed state, query-based variant search

v9e

Constraints at the module boundaries: identifiers normalized, AI tools that cannot fail their caller, a list type for requests covering several orders

v9f

Transfer judged separately from the transfer itself; ranked, typed search criteria; orders checked against the customer's description; addresses on file

v9g

The calling step reports each result and moves on to the next request; stated conditions reported

Modularity needs constraints at its boundaries. The first modular build (v9d) scored below the single step it replaced. Breaking the work into smaller units has real benefits, but it also encapsulates information at each boundary, which removes the LLM's chance to fix up an error later. In the single step, an order id typed as "W5061109" without its "#" would fail a lookup, and the LLM could see the error, look back at the conversation and try again. Inside the modular design, the same id passed into an AI tool failed there; the tool ended the step, the customer saw "There was an error handling your message", and nothing could go back to correct it. Modularity therefore has to come with more constraints and checks that make sure each module is set up correctly: identifiers normalized and typed at every tool boundary, multi-valued facts as lists, and AI tools that always return an outcome, even when they could not finish. With those in place (v9e), the modular design overtook the single step on pass^4, and two further iterations (v9f, v9g) brought pass^1 to 0.83 to 0.86.

The final version, v9h, revised one clarification (CL-1, Appendix B) after the v9g review and was measured only on the held-out set.

7: What made the difference

The failures the platform could fix traced to two causes, neither of them a basic weakness of the LLM: the policy was ambiguous, or an exact rule was left for the LLM to apply in its head. Some failures remain that are plain LLM errors, such as a customer's request misread or a step skipped. No platform can remove those, but it can leave the LLM fewer chances to make them, by giving it smaller, well-defined jobs and checking what it records.

7.1. Ambiguity in the specification

The retail policy is short and reads clearly, but it leaves real decisions open, and in places it disagrees with the benchmark's own tool descriptions. An LLM reading it fresh in every conversation resolves each gap differently from one conversation to the next, which is exactly what lowers pass^k. The analysis found and settled these, among others:

Ambiguity

Decision recorded

Mechanism

The transfer tool says "transfer if the user asks"; the policy says "if and only if the request cannot be handled"

The policy wins over a tool's own description

A transfer is judged, then made, by separate tools

Is a request the policy denies "one that cannot be handled"?

A denied, insisted-on or escalated request is still in scope; it is handled by being denied

The transfer judge reads the customer's own words, not the agent's reasons

What happens to options the customer did not mention in an item change?

Variants that meet everything asked for are all shown, the one keeping current options marked; the customer chooses (CL-1)

A query tool returns every qualifying variant

A request outside the agent's actions

Decline it plainly first; transfer only if the customer still wants it (CL-2)

The transfer tool requires that the customer was told

May the agent suggest actions?

Never offer an action the customer did not request (CL-3)

Every write must cite a request the customer made

A payment method named for a price difference

A parameter of that change, not a separate payment change

The request ledger

In the first full review (v7), 12 of 40 failed conversations were misreadings of the policy that the first specification had missed, all traced to gaps like these.

7.2. Deterministic logic mixed with AI logic

The policy mixes judgment (what does the customer want?) with exact rules (is the order pending? does this gift card cover the difference? is this variant the cheapest?). Left in the prompt, the LLM applies the exact rules unreliably. In the review of the first modular build (v9d), the 40 failed conversations broke down like this:

Cause

Failed conversations

What the platform does now

Mechanical: identifiers typed without their "#", a failing AI tool ending the step, several orders in one text field

11

Identifiers normalized by every tool; AI tools return an outcome instead of failing; a list type for multi-valued facts

A ranked or referenced requirement ("the cheapest", "the highest resolution", "the same colour as my other one") worked out by the LLM

9

A query tool computes it in code: ranked criteria, a value order the LLM supplies, the current item compared, referenced items matched

A transfer allowed for an in-scope request (the old guard approved 19 of 19 requests it saw)

7

Judging split from acting: an AI tool decides, a code tool transfers only on its decision

A payment method recorded as a request of its own

5

Typed request ledger and a recorded clarification

An order or item not checked against the customer's description

3

The order lookup itself reports products the customer named that are not on the order, and which orders have them

A capability the specification named but the build lacked (addresses on other orders)

2

A typed address lookup

Simulator or benchmark noise

4

None

The pattern held across every round: once a rule was moved out of the prompt and into code, a type or a checked tool, the failures it caused stopped. The AI was left with what only AI can do: understand the customer, map their words onto the query, and hold the conversation.

8: Takeaways

This benchmark ran a non-frontier LLM on a workload with inherent ambiguity, so the absolute numbers are modest. The public τ²-bench leaderboard shows the latest frontier LLMs with much stronger baseline results, at 85% to 88% pass^1 across its domains (as of October 2026). What this benchmark shows is different: on the same LLM, the same tasks and the same simulated customers, an enterprise automation platform markedly improves reliability, by means that apply to any LLM.

Three lessons carry beyond this benchmark:

  • Most fixable failures start in the specification. A written policy that reads clearly still leaves decisions open, and an LLM resolves them differently from one run to the next. A platform that analyzes the intent, surfaces each ambiguity and records a decision on it turns inconsistency into a rule.

  • Exact rules belong in exact mechanisms. When deterministic logic is extracted into code tools and the type system, and constraints are enforced on what the AI records, the LLM is left with the judgment it is good at, and the rules are applied the same way every time. Modularity multiplies the benefit, but only with constraints and checks at every module boundary.

  • The tuning loop can be automated. Deriving the specification, building, testing and analyzing every failure was done by the Forward Deployed Agent, with a person steering. That makes this level of rigor practical for every enterprise agent, not only for a benchmark.

Summary of key findings

  1. On 69 held-out tasks, gpt-5.1 on Thunk.AI (modular thunk) reached pass^1 0.73 and pass^4 0.49, against 0.63 and 0.32 on its own at the same settings.

  2. The tasks it never solved fell from 9 to 5; the tasks it always solved rose from 22 to 34.

  3. A single-step thunk captured most of the single-trial gain; the modular thunk added most of the consistency gain.

  4. The bare LLM's results barely changed between temperature 1.0 and 0: sampling settings do not buy consistency; structure does.

  5. The gains came from policy clarifications and platform mechanisms, not from prompting: every change restates or settles the written policy, and none is specific to a task.

Notes on method

  • Agent LLM gpt-5.1 with thinking off, temperature 0 and top_p 0 in every comparison; the standalone LLM is also reported at the benchmark's default settings. The simulated customer is gpt-4.1 at temperature 0. Each held-out run was made once, after development ended.

  • Every task ran four trials. A turn on which the thunk sent no reply was scored as an empty reply, and failed conversations were never restarted, so no failure was hidden.

  • The iteration set is the 30 test-split tasks the modular design was developed on. Earlier designs were developed on the whole 40-task test split; their scores are re-computed on the same 30.

  • Where the benchmark's expected result disagreed with a clarification grounded in the policy, the clarification stood: the thunk was not tuned to pass such tasks (for example, a task whose expected result transfers a customer who insists on a refund method the policy forbids).

  • Cost and latency were not measured in this round.

Appendix A: The single-step thunk (v8)

The single-step thunk (v8) keeps the shape of the original prompt: one chat step, "Serve the retail customer", holds the whole conversation. Its directions are a numbered process followed by the full retail policy, verbatim. What the platform adds is around that step.

  • Typed state. AuthenticatedUserId, recorded only from a successful lookup, and CustomerRequests, a list of a CustomerRequest structure type (kind, order, the customer's own words, status). Every change must cite an open request of the matching kind.

  • Checked write tools. Six code tools wrap the store's writes: cancel_order_checked, change_address, change_item_options, change_order_payment, return_items_checked, and the transfer. Each enforces the policy's rules in code (pending or delivered status, allowed reasons, a gift card covering the amount, once per order, a return excluding an exchange, an item change ending all other changes) and runs in two calls: a preview, then the write after the customer's explicit yes. The raw write tools are disabled in the step.

  • Read helpers. find_orders, search_variants, product_variant_summary and find_customer_addresses compute what the LLM would otherwise work out from raw records.

  • A transfer guard. transfer_to_human_checked, an AI tool, decides whether a request is outside the agent's actions before transferring.

  • Enforced conversation. All messages go through message_customer, which sends and waits for the reply; the step cannot finish itself, so it cannot end the conversation early.

v8 was built from a specification derived from the policy, sentence by sentence, with three rounds of clarifications from reviewing every failed conversation on the test split.

Appendix B: The modular thunk (v9h)

v9h decomposes the same policy into parts that each do one job, share context only through typed properties, and can be tested on their own.

Part

Kind

What it does

Authenticate the customer

Step (New → Authenticated)

Only the two lookups, messaging and the transfer; must record AuthenticatedUserId to finish, and records the requests made so far

Serve the customer's requests

Step (Authenticated → Done)

Records requests, identifies orders, routes each request to its AI tool, reports results and moves on; no write tools at all

handle_item_change, handle_return, handle_cancellation, handle_address_change, handle_payment_change

AI tools

Each owns one kind of request with the customer, carries only its own section of the policy and its own tools, and returns a typed outcome (done, not allowed, withdrawn, blocked by another request, could not complete)

change_item_options, return_items_checked, cancel_order_checked, change_address, change_order_payment

Code tools

Every write rule in code, preview then write on an explicit yes; each refuses a write that does not cite an open request the customer made

get_order, find_orders, get_customer_profile, find_customer_addresses

Code tools

Typed reads returning structure types (Order, CustomerProfile, PostalAddress); get_order checks an order against the products the customer named

search_variants

Code tool

A query over a product's variants: requested options, options copied from a referenced item, ranked criteria with an LLM-supplied value order, price limits, the current item compared but never offered

judge_transfer + transfer_to_human_checked

AI tool + code tool

The judge decides from the customer's own words and has no tools; the code tool transfers only on its decision

ConversationKey, AuthenticatedUserId, CustomerRequests

Typed properties

A constrained routing key; the verified user; a list of CustomerRequest records whose order ids are a list

Clarifications log. Each entry settles a point the policy leaves open or contradicts, and is recorded in the specification with the rule it rests on.

Id

Clarification

Grounded in

Precedence

Where the policy and a tool's description disagree, the policy wins

The policy is the source of truth

R6'

A request that is one of the agent's actions stays in scope whatever happened to it; insisting or asking for a human does not change it

"Transfer if and only if the request cannot be handled within the scope of your actions"

CL-1

Stated requirements and selections are query constraints; when several variants meet them, all are shown, the one keeping current options marked, and the customer chooses

"The user must provide" the choice; the policy leaves unmentioned options open

CL-2

A request outside the agent's actions is declined plainly first; transfer only if the customer still wants it

The transfer rule and "no procedures not provided by the tools"

CL-3

Never offer an action the customer did not request

"No subjective recommendations"

R5'

A payment method named for a difference or a refund is part of that request

"The user must provide a payment method" for each change

R17

Identifying the order is the agent's job; an order the customer names is checked against what they describe

"Help the user look up order id"

R18

The current item is never offered as its own replacement, but is compared

"A new item of the same product but of different product option"

R19

Every price, comparison and completed action stated to the customer comes from a tool result

"Do not make up any information"

Appendix C: Benchmark details

C.1. The benchmark. τ²-bench is an open benchmark of conversational agents in dual-control environments, published by Sierra Research (tau2-bench on GitHub). This report uses its retail domain unchanged: the policy, the store database, the tools, the tasks, the user simulator and the evaluator.

C.2. Data sets used.

Set

Split

Tasks

Use

Iteration set

test

30

Every design change; results in section 4

Design debugging

test

10

Debugging the first modular build; not reported

Held-out set

train

69

Measured once per implementation at the end; results in section 5

Harness testing

train

5

Testing the connection between τ²-bench and Thunk.AI

C.3. Rules followed for a valid implementation.

  • The policy, the tools and the tasks were not changed. The policy may be restated, divided among steps and tools, and clarified where it is open, provided every clarification is recorded and grounded in the policy's own words.

  • Tools may apply the policy's rules; they must not contain knowledge of any task or its expected result.

  • No instruction, example or tool description may quote or paraphrase a task. Examples in instructions use neutral cases.

  • A clarification that disagreed with a task's expected result was kept, and the task left to fail.

  • The held-out tasks were not examined until every implementation had run on them.

C.4. Guidance on use. The method applies to any agent built from a written policy: derive a specification, settle its ambiguities with the policy's owner, move its exact rules into code and types, and give the AI only the judgments that need it. Other LLMs can be run through the same harness to see how far the platform narrows the differences between them.

Learn more

This article describes how the benchmark was run, the three implementations compared, their results on the 30 iteration tasks and the 69 held-out tasks, and how the Forward Deployed Agent tuned the design.

1: Why this benchmark

Benchmarks like τ²-bench were built to show how LLMs compare on an enterprise-like workload. Each domain gives the LLM a written policy (a prompt) and a set of tools, then runs many randomized customer conversations that are expected to be handled under that policy. A simulated customer plays each scenario, and the conversation passes only if the store's database ends in exactly the expected state.

A central part of the measurement is consistency. τ²-bench reports pass^k: the probability that a task passes in all of k independent trials. A business process that works in three conversations out of four is not one an enterprise can rely on, and pass^k exposes exactly that gap.

In practice, this is not how agentic applications are built for the enterprise, or for any repetitive use. Sending a prompt to an LLM is the naive way to use agentic AI, and it minimizes consistency. Nothing analyzes the prompt in advance, finds where it is ambiguous, or separates its exact rules from its judgment calls, because a bare LLM has no application model beyond the prompt.

An application platform like Thunk.AI does have one: steps with defined inputs and outputs, typed state, code tools, AI tools with their own instructions and tools, and checks on what the AI records. This benchmark sets out to measure how much reliability that application model adds, on the same tasks, the same simulated customers and the same LLM.

What the numbers mean. τ²-bench was not created by Thunk.AI, and it is not a perfect yardstick. In places its expected results disagree with its own written policy, and its customers are played by an LLM, which introduces inconsistencies of its own: a simulated customer may misremember its scenario, stop early, or answer differently from one trial to the next. No implementation can score 100% on it. What matters here is the relative improvement over the same LLM on its own, measured on the same tasks under the same noise.

This is the latest in Thunk.AI's "HiFi" series, which measures AI agents doing enterprise business processes. Earlier benchmarks in the series covered document workflows, IT service management, drug safety case intake and AML alert triage. Unlike those, this one uses a public benchmark that Thunk.AI did not design.

2: The retail customer service domain

In the retail domain, the agent is an online store's customer service representative. It must authenticate each customer by email, or by name and zip code, and can then help them with their own orders and profile. The policy allows six kinds of action, each with its own rules:

Action

Allowed when

Key rules

Cancel an order

The order is pending

Whole order only; one of two accepted reasons

Modify an order's address or payment

The order is pending

Payment: a single method, different from the original; a gift card must cover the amount

Modify an order's items

The order is pending

Same product, different options; once per order, after which nothing else can change

Return items

The order is delivered

Refund to the original method or a gift card

Exchange items

The order is delivered

Same product, different options; a return and an exchange exclude each other

Change the default address

Always, once authenticated

Any complete address

The agent must list the details of every change and get an explicit yes before making it, must not make up information or procedures, and must transfer to a human agent "if and only if the request cannot be handled within the scope of your actions".

The work is exacting. Customers describe what they want loosely ("the cheapest one in blue", "the same colour as my other bottle", "my New York address, it's on my other order"), change their minds, combine several requests, and sometimes misremember their own orders. Each conversation passes only if the final database matches the expected one exactly: the right items, the right new variants, the right payment method, and no extra changes.

Scoring. Every task is run k times; pass^1 is the average success rate over all conversations, and pass^4 is the probability that all four trials of a task pass. The customer is simulated by gpt-4.1 at temperature 0, as in the public benchmark. The agent LLM is gpt-5.1 throughout.

3: Benchmark methodology

3.1. Three implementations

All three use the same LLM, gpt-5.1 with thinking off, temperature 0 and top_p 0, and the same policy, store tools and simulated customers. The standalone LLM is also reported at the benchmark's default settings, for reference.

Implementation

What it is

Standalone gpt-5.1

τ²-bench's own reference agent: the policy as the system prompt, the store's tools, one LLM call per turn

Single-step thunk (v8)

One chat step holding the whole process, with the policy's write rules moved into checked code tools and a typed request ledger (Appendix A)

Modular thunk (v9)

Two steps bound by typed properties, one AI tool per kind of request, typed read tools, code for every deterministic rule, and a separate judge for transfers (Appendix B). The iteration set reports its v9g version; the held-out set its final version, v9h

The modular thunk is the design best suited to an enterprise. Each part is small enough to test on its own, each AI tool sees only the tools and policy it needs, every write goes through a checked tool that cites the rule it enforces, and every decision is recorded in typed state that can be audited.

3.2. Data sets

The retail domain has 114 tasks: a 40-task test split and a 74-task train split.

  • The iteration set: 30 tasks from the test split. Every design change was made by reading failed conversations on these tasks. Ten further test tasks were used to debug the first modular build and are left out of the comparison.

  • The held-out set: 69 tasks from the train split. Nobody looked at these tasks, their conversations or their expected results while the thunks were built. Each implementation ran on them once, at the end. (The other 5 train tasks were used to test the connection between τ²-bench and Thunk.AI.)

Every task ran four times per implementation: 120 conversations per run on the iteration set and 276 on the held-out set.

3.3. The tuning was done by Thunk.AI's Forward Deployed Agent

The thunks were designed, built, tested and refined by Thunk.AI's Forward Deployed Agent, an AI agent that builds and tunes thunks through the platform's builder interface. It derived the specification from the policy, mapped it onto the platform, ran the benchmark, read every failed conversation, classified each failure, proposed and built the fixes, and ran the next iteration. A person steered at a high level: choosing between the alternatives it proposed, deciding the clarifications of the policy, and rejecting any fix that was specific to a test rather than general. Section 6 describes the loop. This matters because it is exactly the iterative process every enterprise application needs, and it can be almost entirely automated.

3.4. The rule every change followed

Every change came from the written policy or from a platform mechanism, never from knowledge of a particular task. An ambiguity was settled by a written clarification, decided by the process owner (the policy's author, in a real deployment) and recorded in the specification. An agent error was fixed by moving more of the work into a platform mechanism: a smaller step, a code check, a typed field. Every proposed fix was reviewed for being general, and any that only fitted the test at hand was dropped.

3.5. Evaluation harness

Thunk.AI built a bridge so that a thunk can be measured exactly as τ²-bench measures its own agent. Each simulated conversation is one Thunk.AI chat conversation. Every store tool call the thunk makes, including those made inside its code and AI tools, is relayed back through τ²-bench and executed there, so the benchmark's own evaluator replays and scores the trajectory unchanged.

4: Results on the 30 iteration tasks

On the tasks it was tuned on, the modular thunk raised pass^1 from 0.63 to 0.83 and more than doubled pass^4, from 0.27 to 0.60. The single-step thunk captured most of the single-trial gain; the modular design added consistency, solving 18 of the 30 tasks in every trial against 8 for the LLM on its own.

τ²-bench retail, 30 iteration tasks × 4 trials. Standalone rerun at temperature 0; single-step thunk = v8, modular thunk = v9g.

τ²-bench retail, 30 iteration tasks × 4 trials. Standalone rerun at temperature 0; single-step thunk = v8, modular thunk = v9g.

These are the tasks the design was refined on, so they show what the process can reach, not what to expect on new work. Section 5 gives the results on tasks it never saw.

5: Results on the 69 held-out tasks

On tasks never seen during development, the modular thunk beat the standalone LLM at every level of consistency: pass^1 0.73 against 0.63, and pass^4 0.49 against 0.32, a 53% relative gain in the share of tasks handled correctly every time.

τ²-bench retail, 69 held-out train-split tasks × 4 trials (276 conversations per implementation). Standalone at temperature 0; single-step thunk = v8, modular thunk = v9h.

τ²-bench retail, 69 held-out train-split tasks × 4 trials (276 conversations per implementation). Standalone at temperature 0; single-step thunk = v8, modular thunk = v9h.

The gap widens as k grows. Each extra trial a task must pass costs the standalone LLM more than it costs the thunk, which is the signature of a more consistent system rather than a more capable one. The modular design nearly halved the tasks never solved (9 to 5) and moved 12 more tasks to always solved (22 to 34). The single-step thunk captured most of the single-trial gain; the modular design added the larger part of the consistency gain, and is the design an enterprise can test and audit piece by piece.

Every trial of every task, in every configuration, is listed in the detailed results.

Two cautions. With 276 conversations per run, pass^1 differences of about ±0.05 are within run-to-run noise, so the modular thunk's pass^1 lead over the single-step thunk (0.04) is suggestive, not conclusive; its pass^4 lead (0.06) and its halving of never-solved tasks are clearer. And the held-out gains are smaller than on the iteration set (pass^1 0.83 there), the expected cost of measuring on tasks the design never saw, and the reason these are the figures to quote.

The standalone LLM at two settings. Every comparison in this report uses the standalone LLM at the thunk's settings (thinking off, temperature 0, top_p 0). It was also run at the benchmark's default settings (temperature 1.0), on both task sets. Temperature barely moved it, and neither setting comes close to the thunk. On the 30 iteration tasks its pass^4 was 0.37 at temperature 1.0 and 0.27 at temperature 0, but that gap is 3 tasks out of 30 and within run-to-run noise (a resampling test puts a gap that large at about a 1-in-4 chance), and it did not recur here.

Standalone gpt-5.1 settings

pass^1

pass^2

pass^3

pass^4

Tasks 4 of 4

Tasks 0 of 4

Benchmark defaults (temperature 1.0)

0.61

0.46

0.38

0.33

23

10

Thinking off, temperature 0, top_p 0

0.63

0.48

0.38

0.32

22

9

6: Iterative tuning by the Forward Deployed Agent

The Forward Deployed Agent built the thunk in eight iterations, each one a full turn of the loop below. The person steering it never edited the thunk: they chose among the options it proposed, decided how to clarify the policy, and turned down fixes that only fitted a test.

the tuning loop · 5 automated stages, human steering, one held-out validation

the tuning loop · 5 automated stages, human steering, one held-out validation

Each turn of the loop ran the iteration set, read every failed conversation and classified it (a misreading of the policy, an ambiguity it leaves open, a mechanical fault, an agent error, or simulator noise), then built the fixes that the policy or the platform justified. The chart shows the result of each iteration.

τ²-bench retail, 30 iteration tasks × 4 trials. Standalone rerun at temperature 0; v4, v7 and v8 ran on the 40-task test split and are re-scored here on the same 30 tasks.

τ²-bench retail, 30 iteration tasks × 4 trials. Standalone rerun at temperature 0; v4, v7 and v8 ran on the 40-task test split and are re-scored here on the same 30 tasks.

Version

What changed

Standalone

τ²-bench's own agent: the policy as a prompt

v4

The policy in one Thunk.AI step, with a few checked tools

v7

A specification derived sentence by sentence from the policy; every write rule enforced in a code tool; the customer's choices left open

v8

Rules that span actions (an item change ends all other changes to an order; a return excludes an exchange), clarifications of the policy, an AI guard on transfers

v9d

The modular redesign: two steps, one AI tool per kind of request, typed state, query-based variant search

v9e

Constraints at the module boundaries: identifiers normalized, AI tools that cannot fail their caller, a list type for requests covering several orders

v9f

Transfer judged separately from the transfer itself; ranked, typed search criteria; orders checked against the customer's description; addresses on file

v9g

The calling step reports each result and moves on to the next request; stated conditions reported

Modularity needs constraints at its boundaries. The first modular build (v9d) scored below the single step it replaced. Breaking the work into smaller units has real benefits, but it also encapsulates information at each boundary, which removes the LLM's chance to fix up an error later. In the single step, an order id typed as "W5061109" without its "#" would fail a lookup, and the LLM could see the error, look back at the conversation and try again. Inside the modular design, the same id passed into an AI tool failed there; the tool ended the step, the customer saw "There was an error handling your message", and nothing could go back to correct it. Modularity therefore has to come with more constraints and checks that make sure each module is set up correctly: identifiers normalized and typed at every tool boundary, multi-valued facts as lists, and AI tools that always return an outcome, even when they could not finish. With those in place (v9e), the modular design overtook the single step on pass^4, and two further iterations (v9f, v9g) brought pass^1 to 0.83 to 0.86.

The final version, v9h, revised one clarification (CL-1, Appendix B) after the v9g review and was measured only on the held-out set.

7: What made the difference

The failures the platform could fix traced to two causes, neither of them a basic weakness of the LLM: the policy was ambiguous, or an exact rule was left for the LLM to apply in its head. Some failures remain that are plain LLM errors, such as a customer's request misread or a step skipped. No platform can remove those, but it can leave the LLM fewer chances to make them, by giving it smaller, well-defined jobs and checking what it records.

7.1. Ambiguity in the specification

The retail policy is short and reads clearly, but it leaves real decisions open, and in places it disagrees with the benchmark's own tool descriptions. An LLM reading it fresh in every conversation resolves each gap differently from one conversation to the next, which is exactly what lowers pass^k. The analysis found and settled these, among others:

Ambiguity

Decision recorded

Mechanism

The transfer tool says "transfer if the user asks"; the policy says "if and only if the request cannot be handled"

The policy wins over a tool's own description

A transfer is judged, then made, by separate tools

Is a request the policy denies "one that cannot be handled"?

A denied, insisted-on or escalated request is still in scope; it is handled by being denied

The transfer judge reads the customer's own words, not the agent's reasons

What happens to options the customer did not mention in an item change?

Variants that meet everything asked for are all shown, the one keeping current options marked; the customer chooses (CL-1)

A query tool returns every qualifying variant

A request outside the agent's actions

Decline it plainly first; transfer only if the customer still wants it (CL-2)

The transfer tool requires that the customer was told

May the agent suggest actions?

Never offer an action the customer did not request (CL-3)

Every write must cite a request the customer made

A payment method named for a price difference

A parameter of that change, not a separate payment change

The request ledger

In the first full review (v7), 12 of 40 failed conversations were misreadings of the policy that the first specification had missed, all traced to gaps like these.

7.2. Deterministic logic mixed with AI logic

The policy mixes judgment (what does the customer want?) with exact rules (is the order pending? does this gift card cover the difference? is this variant the cheapest?). Left in the prompt, the LLM applies the exact rules unreliably. In the review of the first modular build (v9d), the 40 failed conversations broke down like this:

Cause

Failed conversations

What the platform does now

Mechanical: identifiers typed without their "#", a failing AI tool ending the step, several orders in one text field

11

Identifiers normalized by every tool; AI tools return an outcome instead of failing; a list type for multi-valued facts

A ranked or referenced requirement ("the cheapest", "the highest resolution", "the same colour as my other one") worked out by the LLM

9

A query tool computes it in code: ranked criteria, a value order the LLM supplies, the current item compared, referenced items matched

A transfer allowed for an in-scope request (the old guard approved 19 of 19 requests it saw)

7

Judging split from acting: an AI tool decides, a code tool transfers only on its decision

A payment method recorded as a request of its own

5

Typed request ledger and a recorded clarification

An order or item not checked against the customer's description

3

The order lookup itself reports products the customer named that are not on the order, and which orders have them

A capability the specification named but the build lacked (addresses on other orders)

2

A typed address lookup

Simulator or benchmark noise

4

None

The pattern held across every round: once a rule was moved out of the prompt and into code, a type or a checked tool, the failures it caused stopped. The AI was left with what only AI can do: understand the customer, map their words onto the query, and hold the conversation.

8: Takeaways

This benchmark ran a non-frontier LLM on a workload with inherent ambiguity, so the absolute numbers are modest. The public τ²-bench leaderboard shows the latest frontier LLMs with much stronger baseline results, at 85% to 88% pass^1 across its domains (as of October 2026). What this benchmark shows is different: on the same LLM, the same tasks and the same simulated customers, an enterprise automation platform markedly improves reliability, by means that apply to any LLM.

Three lessons carry beyond this benchmark:

  • Most fixable failures start in the specification. A written policy that reads clearly still leaves decisions open, and an LLM resolves them differently from one run to the next. A platform that analyzes the intent, surfaces each ambiguity and records a decision on it turns inconsistency into a rule.

  • Exact rules belong in exact mechanisms. When deterministic logic is extracted into code tools and the type system, and constraints are enforced on what the AI records, the LLM is left with the judgment it is good at, and the rules are applied the same way every time. Modularity multiplies the benefit, but only with constraints and checks at every module boundary.

  • The tuning loop can be automated. Deriving the specification, building, testing and analyzing every failure was done by the Forward Deployed Agent, with a person steering. That makes this level of rigor practical for every enterprise agent, not only for a benchmark.

Summary of key findings

  1. On 69 held-out tasks, gpt-5.1 on Thunk.AI (modular thunk) reached pass^1 0.73 and pass^4 0.49, against 0.63 and 0.32 on its own at the same settings.

  2. The tasks it never solved fell from 9 to 5; the tasks it always solved rose from 22 to 34.

  3. A single-step thunk captured most of the single-trial gain; the modular thunk added most of the consistency gain.

  4. The bare LLM's results barely changed between temperature 1.0 and 0: sampling settings do not buy consistency; structure does.

  5. The gains came from policy clarifications and platform mechanisms, not from prompting: every change restates or settles the written policy, and none is specific to a task.

Notes on method

  • Agent LLM gpt-5.1 with thinking off, temperature 0 and top_p 0 in every comparison; the standalone LLM is also reported at the benchmark's default settings. The simulated customer is gpt-4.1 at temperature 0. Each held-out run was made once, after development ended.

  • Every task ran four trials. A turn on which the thunk sent no reply was scored as an empty reply, and failed conversations were never restarted, so no failure was hidden.

  • The iteration set is the 30 test-split tasks the modular design was developed on. Earlier designs were developed on the whole 40-task test split; their scores are re-computed on the same 30.

  • Where the benchmark's expected result disagreed with a clarification grounded in the policy, the clarification stood: the thunk was not tuned to pass such tasks (for example, a task whose expected result transfers a customer who insists on a refund method the policy forbids).

  • Cost and latency were not measured in this round.

Appendix A: The single-step thunk (v8)

The single-step thunk (v8) keeps the shape of the original prompt: one chat step, "Serve the retail customer", holds the whole conversation. Its directions are a numbered process followed by the full retail policy, verbatim. What the platform adds is around that step.

  • Typed state. AuthenticatedUserId, recorded only from a successful lookup, and CustomerRequests, a list of a CustomerRequest structure type (kind, order, the customer's own words, status). Every change must cite an open request of the matching kind.

  • Checked write tools. Six code tools wrap the store's writes: cancel_order_checked, change_address, change_item_options, change_order_payment, return_items_checked, and the transfer. Each enforces the policy's rules in code (pending or delivered status, allowed reasons, a gift card covering the amount, once per order, a return excluding an exchange, an item change ending all other changes) and runs in two calls: a preview, then the write after the customer's explicit yes. The raw write tools are disabled in the step.

  • Read helpers. find_orders, search_variants, product_variant_summary and find_customer_addresses compute what the LLM would otherwise work out from raw records.

  • A transfer guard. transfer_to_human_checked, an AI tool, decides whether a request is outside the agent's actions before transferring.

  • Enforced conversation. All messages go through message_customer, which sends and waits for the reply; the step cannot finish itself, so it cannot end the conversation early.

v8 was built from a specification derived from the policy, sentence by sentence, with three rounds of clarifications from reviewing every failed conversation on the test split.

Appendix B: The modular thunk (v9h)

v9h decomposes the same policy into parts that each do one job, share context only through typed properties, and can be tested on their own.

Part

Kind

What it does

Authenticate the customer

Step (New → Authenticated)

Only the two lookups, messaging and the transfer; must record AuthenticatedUserId to finish, and records the requests made so far

Serve the customer's requests

Step (Authenticated → Done)

Records requests, identifies orders, routes each request to its AI tool, reports results and moves on; no write tools at all

handle_item_change, handle_return, handle_cancellation, handle_address_change, handle_payment_change

AI tools

Each owns one kind of request with the customer, carries only its own section of the policy and its own tools, and returns a typed outcome (done, not allowed, withdrawn, blocked by another request, could not complete)

change_item_options, return_items_checked, cancel_order_checked, change_address, change_order_payment

Code tools

Every write rule in code, preview then write on an explicit yes; each refuses a write that does not cite an open request the customer made

get_order, find_orders, get_customer_profile, find_customer_addresses

Code tools

Typed reads returning structure types (Order, CustomerProfile, PostalAddress); get_order checks an order against the products the customer named

search_variants

Code tool

A query over a product's variants: requested options, options copied from a referenced item, ranked criteria with an LLM-supplied value order, price limits, the current item compared but never offered

judge_transfer + transfer_to_human_checked

AI tool + code tool

The judge decides from the customer's own words and has no tools; the code tool transfers only on its decision

ConversationKey, AuthenticatedUserId, CustomerRequests

Typed properties

A constrained routing key; the verified user; a list of CustomerRequest records whose order ids are a list

Clarifications log. Each entry settles a point the policy leaves open or contradicts, and is recorded in the specification with the rule it rests on.

Id

Clarification

Grounded in

Precedence

Where the policy and a tool's description disagree, the policy wins

The policy is the source of truth

R6'

A request that is one of the agent's actions stays in scope whatever happened to it; insisting or asking for a human does not change it

"Transfer if and only if the request cannot be handled within the scope of your actions"

CL-1

Stated requirements and selections are query constraints; when several variants meet them, all are shown, the one keeping current options marked, and the customer chooses

"The user must provide" the choice; the policy leaves unmentioned options open

CL-2

A request outside the agent's actions is declined plainly first; transfer only if the customer still wants it

The transfer rule and "no procedures not provided by the tools"

CL-3

Never offer an action the customer did not request

"No subjective recommendations"

R5'

A payment method named for a difference or a refund is part of that request

"The user must provide a payment method" for each change

R17

Identifying the order is the agent's job; an order the customer names is checked against what they describe

"Help the user look up order id"

R18

The current item is never offered as its own replacement, but is compared

"A new item of the same product but of different product option"

R19

Every price, comparison and completed action stated to the customer comes from a tool result

"Do not make up any information"

Appendix C: Benchmark details

C.1. The benchmark. τ²-bench is an open benchmark of conversational agents in dual-control environments, published by Sierra Research (tau2-bench on GitHub). This report uses its retail domain unchanged: the policy, the store database, the tools, the tasks, the user simulator and the evaluator.

C.2. Data sets used.

Set

Split

Tasks

Use

Iteration set

test

30

Every design change; results in section 4

Design debugging

test

10

Debugging the first modular build; not reported

Held-out set

train

69

Measured once per implementation at the end; results in section 5

Harness testing

train

5

Testing the connection between τ²-bench and Thunk.AI

C.3. Rules followed for a valid implementation.

  • The policy, the tools and the tasks were not changed. The policy may be restated, divided among steps and tools, and clarified where it is open, provided every clarification is recorded and grounded in the policy's own words.

  • Tools may apply the policy's rules; they must not contain knowledge of any task or its expected result.

  • No instruction, example or tool description may quote or paraphrase a task. Examples in instructions use neutral cases.

  • A clarification that disagreed with a task's expected result was kept, and the task left to fail.

  • The held-out tasks were not examined until every implementation had run on them.

C.4. Guidance on use. The method applies to any agent built from a written policy: derive a specification, settle its ambiguities with the policy's owner, move its exact rules into code and types, and give the AI only the judgments that need it. Other LLMs can be run through the same harness to see how far the platform narrows the differences between them.

Learn more