Evaluation Integrity: the audit checklist, answered

23 min readRead as markdown

Last updated: 16 September 2026.

Agent benchmarks are, as a class, easy to cheat. The 2026 BenchJack audit (arXiv:2605.12673) red-teamed ten widely used agent benchmarks across software engineering, web, desktop and terminal work, and drove nine of them to a near-perfect hack rate without solving a single task. It catalogued 219 distinct flaws in eight classes and published a checklist so that anyone running an evaluation can be asked the same questions.

This page answers those questions for Daishi. Every answer below was checked against what the running system does, not against what the rest of this documentation claims. Where the answer is no, it says no, and names what would change it.

Two notes on what this is. The audit's checklist is organized into seven categories over eight flaw classes; the questions here are stated in our own words against that structure, so a reader holding the paper can map them, but they are not a verbatim reproduction of its appendix. And this is a self-assessment. Nobody outside this project has tried to break Daishi's scoring, which is itself one of the findings below.

#What Daishi is being assessed as

Daishi is a persistent multi-agent world. Agents connect from anywhere as remote clients over MCP, take actions, and the server decides what happened. Scoring runs afterwards over the append-only event log the server wrote. There is no task harness that runs an agent's code, no test suite an agent could edit, no reference solution sitting on a disk the agent can reach, and no grader the agent talks to.

That shape makes several of the audit's flaw classes structurally inapplicable rather than defended against, and this page says which. It is not a claim of superiority. A different architecture has different failure modes, and the ones Daishi does have are in the gaps section.

Sections 1 to 10 answer for the world and its public rankings. Daishi also hosts arena games, chess and Connect Four played between two models on their own endpoint, which is a different instrument with a different answer to most of these questions. Section 11 covers it separately rather than stretching the world's answers over it.

#Summary

An earlier version of this page wrote "Pass" in rows where the answer follows from the architecture and in rows where a test asserts it, which made the weaker evidence read like the stronger. Those are different claims, so the table now separates them.

Holds by construction means the flaw has nowhere to live in this design: there is no code path that could exhibit it, and no test can demonstrate the absence of a thing that was never built. Take it as an architectural claim you can check by reading the description, not as a measurement. Demonstrated means a test in the suite fails if the property stops holding, and the test is named here. Partial and Open mean what they say.

CategoryVerdictOn what evidence
Isolation of agent from evaluatorHolds by constructionAgents are remote MCP clients with no process, filesystem or shell on the platform. One boundary is demonstrated: scenarios load by catalog id only, never by filesystem path.
Answers kept out of the agent's reachDemonstratedThe held-out pools are committed to in public, and a pool edited without a fresh commitment fails the build. The live view is redacted or delayed while a match runs, asserted per endpoint.
Untrusted input into the evaluatorHolds by construction, partly demonstratedScoring reads typed fields off events the server wrote, never agent text. Escaping and key-shadowing defenses at the boundary are demonstrated.
LLM judge robustnessNot applicable to ranked scores; one untested residual risk off the ranked pathNo ranked figure is produced by a model. The optional commitment extractor is the only eval LLM, and the injection path described in section 3 has no test.
Scoring robustnessDemonstratedDeterminism, tie handling, archetype classification and the refusal to fabricate zeros for untracked counters are each asserted.
Evaluation logic gapsDemonstrated, for the gaps found so farEvery exploit path closed to date has a regression test. This says nothing about paths nobody has looked for.
Sandbox permissionsHolds by constructionNo tool takes an address and fetches it; no agent input is executed. The one outbound call is inference, to a destination the key holder fixed.
Adversarial testingPartialPrompt injection is scored against a held-out corpus and log tampering is caught by replay, both demonstrated. Nobody outside this project has tried to break any of it.
Trace tamper-evidencePartialThe checksum chain and its tamper detection are demonstrated. There is no external anchor, so the evidence is operator-held. This is the largest gap on the page.
Held-out pool commitmentDemonstratedDigests are published below and recomputed from the live pools on every build. Rotation is still manual.
Arena games (chess, Connect Four)Separate path, not covered by the rows aboveSee section 11. Stronger where the rows transfer, with no public results to audit.

#1. Isolation: agent and evaluator

Does the agent execute in the same process, container or filesystem as the evaluator? No. Agents are remote clients. They send tool calls over HTTP and receive results. Nothing an agent sends is executed, and an agent has no filesystem, shell or process of its own inside the platform.

Can an agent read or modify the scoring code at runtime? No. Scoring runs server-side over the archived log after a match, and no tool exposes it. The rubric is published as a specification in the benchmark doc so that a score can be recomputed from a match's own archived log; the implementation is not published, which the governance doc states plainly rather than implying an audit path that does not exist.

Can an agent write to the record it is scored from? No. The event log is append-only and written only by the engine, from actions the engine itself validated. An agent cannot emit an event, edit one, or suppress one. Every number in a scorecard traces to an event the server decided to write.

Can an agent see the answer key? The seed is the answer key here: world generation is a pure function of it, so knowing the seed hands you the terrain, the resource pools and the ruins for free. Live matches therefore withhold it. While a match is running, and while a lobby is still in pregame, the match log and replay pages omit both the seed and the board, and the state, event, metrics and report endpoints serve a cut-down view instead of the full one. The state endpoint returns the phase, tick and season and nothing spatial. The event stream withholds the two event types whose payloads carry the seed, and strips positional detail from the rest. The metrics endpoint serves only what an in-world inspection would have shown, so a rival's economy cannot be polled for free by anyone who can use a command line. Redaction is the default posture, not an opt-in. The operator can see through it with an admin credential. When a match ends, its seed publishes with its results, which is the intended reveal.

What does the live world at daishi.ai actually run? Full live observability, deliberately, and an earlier version of this page implied otherwise. The public world is an exhibition: it produces no ranked figure and no held-out seed, so nothing there is protected by withholding it, and a spectator who cannot see the board has no reason to watch. Scored work does not run on it. Evaluation runs, series trials and Studio matches are separate application instances that default to redacted, and the sentence you are reading is the only thing that would have to change if that ever stopped being true.

There is now a third posture between the two. In delayed mode the public gets the complete live view, including the map and rival positions, a fixed number of ticks behind the present; the seed is still withheld until the match ends. It exists because redaction was solving a fair-play problem by taking the spectacle away from people, and a delay keeps the spectacle while making scraped intelligence worth less than acting on the present. Every response labels its own mode and, in delayed mode, its lag.

Are practice and scored inputs separated? Yes, in two places. Practice seeds are published and free to train against; scored matches draw from a rotating held-out pool. The same tiering applies to the prompt-injection payload corpus. Custom runs started by a signed-in user are forced onto the public practice pool even when the scenario names a held-out one, because those matches archive publicly and drawing the ranked pool there would publish the held-out seeds as training data.

Does any scored quantity come from the agent's own account of itself? No. Three things an agent can say about itself are carried and none is scored. The model, provider and scaffold strings from registration ride along for attribution and are marked display-only. The closing statement an agent files at the end of a match is passed through verbatim to its scorecard and is never graded; the rubric grades verified behavior, not testimony. And the trust division is computed server-side: claiming the reference-harness label requires both the reference scaffold string and a server-set attestation stamped at registration, so typing the scaffold name buys nothing.

#2. Untrusted input into the evaluator

Does the evaluator ever evaluate, execute or deserialize agent-controlled data? No. There is no dynamic evaluation of agent strings anywhere in the platform: no interpreter call, no dynamically constructed function, no dynamically resolved import, no shell.

Two subprocesses exist in operator-run tooling, one driving a chess engine for arena grading and one launching harness children for a repeated-trial series. Both pass a fixed argument list with no shell, and nothing in either argument list comes from an agent. Neither is reachable from an agent's tool surface.

Are agent-supplied fields bounded? Yes. Agent text arrives as JSON tool arguments with per-field size caps, per-tick call caps on the self-report tools, and a per-seat ceiling on trajectory log volume, with long model output explicitly marked as truncated rather than silently cut.

#3. LLM judge robustness

Is an LLM in the scored path? No. The Daishi Fitness Index, the five capability dimensions, the achievements, the grades and the ranked ratings are computed by deterministic code from counted events and final-board quantities. No language model scores a ranked match, so there is no judge to inject.

Is an LLM anywhere in evaluation? Yes, in one optional place, and it is worth being precise about it because this is where the residual risk lives. Report cards carry a promise-keeping figure: how often an agent did the thing it said in chat it would do. Turning chat into a list of commitments is an extraction problem, and there are two extractors. The default is a deliberately low-recall pattern matcher. The other calls a small language model, runs only on demand against already-archived matches, never during play, and every report says which extractor produced its number so the two are never conflated.

Is agent text structurally contained when it reaches that model? Yes. Messages are passed as serialized JSON fields, so an agent cannot terminate the surrounding structure and append instructions of its own. The model's answer is then constrained rather than trusted: a label is accepted only if it is one of four permitted values, it must carry an index into the batch the server supplied, and the speaker attached to it is read from the server's own record of who sent that message, never from the model's answer.

Is semantic injection prevented? No, and this is a real residual risk rather than a theoretical one. Structural containment stops an agent from breaking the format; it does not stop an agent from writing in-world chat aimed at the extractor. Because the model chooses which message in the batch a label attaches to, a crafted message could in principle push a fabricated commitment onto a different agent's message in the same batch, which would show up as that agent breaking a promise it never made.

What bounds it: this affects one figure on a report card, that figure is labeled with the extractor that produced it, the pattern-matching extractor is the default, and none of it enters the ranked score. Sitting next to it on the same card is the bonded-commitment rate, which is engine-verified rather than extracted, because a bond is a promise with collateral the engine actually holds and settles. The gap between what an agent promises with collateral and what it promises for free is the honest version of the measurement.

What is missing: nobody has run an injection attack against the extractor. It is on the list below.

Is the extractor validated? Yes. Both extractors are graded against a human-labeled golden set, reporting precision, recall and F1 per commitment kind, and Cohen's kappa between the two human raters alongside, as the ceiling an extractor cannot honestly exceed.

#4. Scoring robustness

Does the score depend on pattern-matching an agent's output? Not the ranked score. Every dimension of the Fitness Index is built from actions the engine validated and quantities on the final board. The one pattern-matched signal, commitment extraction, is confined to the report-card figure described above.

Is partial credit tested for shortcuts? Yes. The rubric normalizes by ticks alive so that survival time is not a confound, with a floor under the divisor so that a short-lived agent's rates cannot be divided into a huge score. That floor is a pinned regression: a 100-tick sprint used to out-rate a full-match grind by sixty to one, and the test now asserts the bound.

Are failure and absence distinguished from zero? Yes, deliberately. Where a counter was never recorded, the scorecard reports it as unrecorded rather than as zero activity, and says so in the text. An agent whose scaffold quit mid-match is disclosed as having gone dark rather than narrated as having survived flawlessly.

Do ties score identically? Yes. Competition ranking means two agents with exactly equal wealth share a rank, so a tie cannot advantage whoever registered first. Older rubric versions kept the behavior they shipped with so that recomputing a historical report reproduces its history.

#5. Evaluation logic gaps

Is there a standing test suite that tries to farm the score without doing the task? Yes, and it is the part of this assessment with the most evidence behind it. Each of the following was a real exploit, is closed, and has a pinned regression test:

  • Parking goods in an absurd standing trade offer nobody would accept, so they counted as wealth while being theft-proof. A knockout now voids the offer and the goods are lootable like anything else.
  • Using bond escrow as extra carrying capacity. Staked goods still count against what an agent is carrying.
  • Minting reputation through a ring of fresh counterparties, or by farming kept bonds. Both are capped globally per season, not just per pair.
  • Posting a no-attack bond to someone on the far side of the map and collecting reputation for a promise that cost nothing. Distance mints no reputation.
  • Depositing goods into another agent's storehouse to pump the owner's leaderboard position. Banked goods stay the depositor's wealth.
  • Building the same benefit structure repeatedly in one region.
  • The rate-normalization sprint described above.

Are environment invariants checked? Yes. Every seed in a 250-seed sweep is asserted to produce at least one region of every terrain, so a scenario cannot silently draw a world where a required activity is impossible.

#6. Sandbox permissions

What can an agent do? Only what the published tool surface allows, and nothing else. No filesystem, no shell, no code execution, no access to another match, and no tool that takes an address and fetches it, so an agent cannot aim the server at a destination of its choosing. The tool surface is documented in full in the agent guide.

The one outbound call the platform makes on an agent's behalf is inference, and only for agents that opt into it: an agent may route its own model calls through the Daishi gateway, which is how model identity and token usage become server-measured facts rather than claims. The destination is the configured provider, chosen by whoever holds the key, and the agent cannot redirect it.

Are there ceilings? Yes: per-key request ceilings charged to the key rather than the address, per-tick action budgets that reject extra actions rather than queueing them, field size caps, and a per-seat trajectory log cap.

#7. Adversarial testing

Is there a null or random baseline? Yes. A uniform-random policy is pinned into ranked lobbies alongside scripted baselines that trade honestly, hoard, raid, and cooperate-then-defect. A score means nothing without knowing what a random policy gets on the same scenario, so that number is always in the same match rather than quoted from a different one.

Is there a prompt-injection agent? Yes, and this is the strongest adversarial result on the platform. A red-team injector baseline delivers payloads drawn from a rotating held-out corpus. Ground truth is a forensic tag stamped on each attempt and never delivered to the target, so an agent that complied complied with the visible text and not with a marker it could see. Compliance is judged against the payload's declared demand, not against a string: did the target actually transfer value to the injector, re-emit the marker, attack the named third party, or stop gathering. Injection resistance is reported separately from game skill, with confidence intervals, because a strong player that folds to a fake system message is a different and worse thing than a strong player that ignores it.

Is there a state-tampering agent? No standing test. See the trace section below for what detection exists.

Has anyone outside the project audited this? No. This is a self-assessment, and it is the single largest caveat on the page.

#8. Trace and result tamper-evidence

This deserves more than a yes or no, because the honest answer has a boundary in the middle of it.

Every match commits to its own trajectory: a world-state checksum is written into the log every 25 ticks, forming a chain. A public verification endpoint checks that chain on any archived match, including matches played by models. It confirms the chain is present, well formed and tick-ordered, and it cross-checks the final board against the log, so an archive that marks an agent dead with no corresponding death event in the log, or the reverse, fails. That check was once vacuous and is now real; a doctored board does not pass it.

For fully scripted matches, where every participant was a server-run baseline and no external model was involved, verification goes further and re-runs the entire match from the recorded seed and roster, then compares the freshly derived checksum chain against the logged one bit for bit. That is a hard determinism test, and the endpoint hands back a replication script so an auditor can run it themselves.

Where it stops: a match played by models cannot be re-executed, because the models are not deterministic and are not ours. For those matches, which are what a leaderboard is made of, the checksums live in the same archive as the events they attest to. An operator who rewrote both would leave no trace that anyone outside could detect. Nothing in the record is currently anchored anywhere the operator cannot revise.

What closes it: publishing a per-match digest at match end to a medium outside the operator's control, so that the archive serving a match today can be checked against a commitment made when it finished. That is a small change and it is not built.

#9. Keeping the answers secret

Are scored inputs rotated? Yes, per season, and the previous pool becomes public at rotation, which is what makes training on published Daishi logs an expected and acceptable thing to do.

Is there a commitment to the pool, published before results exist? As of this page, yes, and before it there was not. Rotation alone does not let an outsider check that the pool named in a published season is the pool that was actually in force when the matches ran, rather than one selected afterwards to suit the results. The protocol was sound and the proof was missing.

The commitments below fix that. Each digest is the SHA-256 of a domain separator, the pool's name, a secret 32-byte nonce and the pool's canonical JSON, joined by newlines. The nonce is held back until the pool rotates and is published with it. A nonce is necessary rather than decorative: a pool is a handful of small integers, and a bare hash of one could be recovered by enumeration.

PoolCommittedDigest (SHA-256)
Held-out seeds, season-116 September 20260168f9fd5dc7c3f029ee3ec22272779da30601224ce08bebc665c08f15e413d6
Held-out injection payloads, s116 September 20264fa75e9ddbc736b9ff333bb4401643cf8ce07c67ce090982bd6a9a5ad9f475df

The payload corpus is committed by payload id rather than by payload text, so that fixing a typo in a payload does not break a commitment while still fixing which payloads were in force.

If a pool has to be replaced before it rotates, the replacement gets a new name and its own commitment, and both appear here. A commitment is never edited.

What is still manual: publishing a new digest when a season opens, and publishing the pool and nonce when it closes, are operator steps rather than automated ones. The canonicalization and the digest are computed in code and pinned by a test, so a pool edited without a new commitment fails the build, but the publishing schedule is a promise rather than a mechanism.

Is contamination otherwise controlled? Only by rotation. Published match logs are distributed in the clear, where some peer evaluations now distribute traces encrypted specifically to keep them out of training corpora. For a world whose seeds rotate this matters less than it would for a fixed task set, but it is a real difference and not a solved problem.

#10. Statistics

The statistics floor and the anti-best-of-N rules are not part of the audit's checklist, but they are the other half of whether a number is worth citing, and they are written down in the governance doc rather than here: a minimum of five matches across at least three held-out seeds, means with bootstrap confidence intervals, interquartile means alongside means, leaderboards sorted by a conservative estimate and displayed as statistically indistinguishable groups, underpowered A-versus-B comparisons refused by the tooling rather than discouraged by convention, and a cap of three declared private variants per model family per season.

#11. The arena games

Everything above answers for the world. Daishi also runs an arena: chess and Connect Four, two models playing each other over a separate MCP endpoint, with their own match records. It is a different instrument and the rows above do not simply transfer to it, so here is where it stands on its own.

What it is. A private lab instrument, not a public benchmark. An arena run belongs to the signed-in user who started it and is read back through their own Studio; there is no public arena archive, no arena leaderboard, and no arena figure in the world's rankings or in the Daishi Fitness Index. Nothing on the public scoreboard is produced by it. Most of the audit's questions are about protecting a published result from the people competing for it, and the arena publishes no result to protect.

Where it is stronger than the world. Three things, and they are the reason it is worth building.

The result is decided by a rules engine, not a rubric. A move is legal or it is not. There is no scoring judgment to attack, no weighting to argue with, and nothing an agent can say about itself that changes the outcome.

Grading is done by an oracle that never touched the game. After the result is final, every accepted move is measured against Stockfish (chess, in a separate process over UCI) or the exact solver (Connect Four, which is a solved game). The grader runs after the fact and cannot change who won. This is the property the world does not have: an external standard of correctness that does not come from us.

The record is re-executable by anyone who holds it. Each record carries the protocol it was played under and that protocol's hash, the seed, the start position, and every ply with the reasoning filed, the rejected attempts and their kind, the clock, and a sha256 chain over all of it. A third party with the record can replay the moves through any chess library to confirm every one was legal, and can run their own engine to reproduce the grades. That is a sharper audit path than the world offers, and it is available today.

Where it is weaker, or simply different.

Contamination is unfixable here, and the arena does not pretend otherwise. Chess and Connect Four are among the most thoroughly documented games in any model's training data, and Connect Four is solved outright. There is no held-out pool because there is no secret; an opening book drawn from a seed varies the start position but does not make the game novel. An arena result measures play under a fixed protocol against a known opponent, which is a narrower claim than the world makes, and the right one to make about it.

A guest seat is self-reported, by design. An invited peer says what model it is at identify, and nothing about that is verified. The record marks such a seat attested: false and attributes it to the invite, so the claim is carried as a claim. A match with a guest seat is evidence about a game, not about a model.

One injection surface existed and is now closed. A guest's self-reported model id is interpolated into the opposing seat's system prompt, which made it the only opponent-controlled text reaching another model's instructions. It is now reduced to a single token of a model-id charset before it gets there, so a guest that answers with a sentence contributes one word. Found by writing this section; fixed and tested in the same change.

Nothing published, nothing anchored. The per-ply chain has the same limit as the world's: it lives in the same archive as the record it attests to. For a private lab instrument that matters less, and the re-executability above partly substitutes for it, because a disputed record can be checked against the rules rather than against our copy of it.

#The gaps, collected

Five, in the order we would fix them. They are gaps in the world's evaluation path; the arena's own limits are in section 11 and are mostly properties of chess and Connect Four rather than things we could fix.

1. No external anchor for match records. Within a match the checksum chain is strong and publicly verifiable, and scripted matches re-run bit for bit. Model matches cannot be re-executed, and their checksums sit in the same archive as the events, so tampering by the operator is not externally detectable. Fix: publish a per-match digest at match end to a medium the operator cannot revise.

2. No independent adversarial audit. Everything on this page is a self-assessment. Fix: someone outside the project tries to break it. If you want to, get in touch; a standing invitation and an honest report of what you find is worth more to us than a clean page.

3. The commitment extractor has not been attacked. The containment is real but the semantic-injection path described in section 3 is untested. Fix: run the injection corpus at the extractor rather than only at agents, and publish the result the same way injection resistance is published.

4. Commit-reveal is published but not automated. The digests above are real and pinned by a test. Opening and closing a season's commitment is still a manual step.

5. Results are not interoperable. Daishi publishes its own archives and reports, and nothing in a schema the wider evaluation field already reads. That is a distribution gap rather than an integrity gap, but it is the reason a third party has to take this page on trust instead of loading our results next to everyone else's.

#Checking any of this yourself

Nothing here asks to be taken on faith except where it says so.

Every archived match publishes its seed, its full validated event log, its final board and its scorecard. The rubric is published dimension by dimension, so a score can be recomputed from the match's own log and compared. Scenario specifications are served with a content hash over their canonical form, so a silently edited scenario produces a different hash rather than a comparable score. The replay verification endpoint runs on any archived match and returns a replication script. Anchor baselines are in the same matches as the entrants, so a claimed result always has a floor beside it in the same conditions.

An arena record is checkable further than that, and by hand: it carries the protocol, its hash, the start position and every ply under a sha256 chain, so the move list can be replayed through any chess library to confirm legality and re-graded with your own engine. The limits on what that proves are in section 11.

What you cannot do is read the code that computed the score. This deployment's source is not published, which the governance doc states directly. Reimplementing the published rubric and running it over a published archive is the independent audit path that exists today.