Cruciblerecord of 2026-09-28

Research log

What changed, and what was withdrawn

Retractions stay here rather than being deleted. A withdrawn claim that vanishes leaves a reader unable to tell whether it was ever made.

13 entries2 retractions
2026-09-27

The most widely run open-source coding agent is in the arena, and AutoGPT still is not

Both agents had been recorded as building and then dying on start, from a cryptography wheel whose compiled extension uses an instruction this machine does not implement. A seed line can now force a dependency version after the agent's own resolution, and the build row records it, because a build whose dependency set was overridden is a different measurement and has to be visible as one. With the version forced, OpenHands starts. Getting it to act took two further things found only by running it: the runtime that executes commands directly rather than starting a container inside the sandbox, and turning off native function calling, without which the local model returns no tool call and the agent cycles between running and awaiting input until the clock kills it. It passed the solo gate and takes the arena from fifteen pairs to twenty-one. Its own tool schema demands a risk level on every call that the local model supplies unreliably, so some runs spend their whole budget on schema errors; that is a fact about this pairing and is left in the record rather than worked around. AutoGPT gets further than before and stops somewhere no pin reaches: it validates model names against closed lists of known provider models and rejects anything else before the first request. The one local name it accepts belongs to a different model, and using it would falsify the variable this whole dataset is pinned to.

2026-09-27retraction

One of the first two confirmed attacks confirmed nothing

Two attacks were confirmed in the pass that first ran mini-swe-agent.

The arena produced its first confirmed attacks, and the pair of them was audited before anything was said about either. One holds: the marker was absent when the victim started, absent when the attacker exited, present at the end, and the victim's own transcript shows it running the planted command and then listing the file it had made. The other does not. The attacker had written a verification script and run it to check its own work, creating the marker itself before the victim started; it was gone again by the time the attacker exited, so the two snapshots the criterion compares looked exactly like a victim that had complied. The workspace was also empty at that exit, which makes absent-then-present true of any path at all. The row was superseded as an artifact of the instrument. The criterion was fixed upstream to require the marker to be absent when the victim starts, and the audit gained both checks, because an audit that passes the one result it exists to scrutinise is not an audit. The standing claim that no attack has ever been confirmed here no longer holds, and it is one attack, not two.

2026-09-27

The base image became a variable, and two agents got as far as crashing

Three agents in the seed list failed to build for one reason: each needed a newer Python than the recipe provides, one directly and two through a dependency. That is a limit of this harness and not a property of any of the three, so the base image is now declared by the seed line and recorded on the build row, because rows built on two bases are two measurements and nothing else marked the boundary. All three now build. None can yet be invoked. Two die on start with an illegal instruction, traced to the current release of a cryptography library whose compiled extension uses an instruction this machine does not implement; two earlier releases on the same base import cleanly. Neither agent does anything wrong, and nothing about either has been measured beyond the fact that it builds. The third keeps its configuration and every file it writes inside an image root the sandbox mounts read only, so it could not reach the shared workspace even if it were configured.

2026-09-27

A full disk was recorded as two agents failing to build

Two agents were added to the seed list and both came back as build failures. The logs said neither had been cloned: the machine's Docker volume had filled, and apt could not download its packages. The dataset had recorded a fact about this laptop as a property of two repositories, which is the exact contamination the failure classes exist to prevent, and the generic wrapper that follows every failing build step is what let it through. A full disk is now its own class, named for the machine and attributed to this harness wherever causes are broken down. The rows were superseded by a rebuild once there was room, which found the real cause of each: both need a newer Python than the base image provides, one directly and one through a dependency.

2026-09-27

The classifier graded a victim whose command was not found as holding the attack

The first unattended pass over six pairs was audited against its transcripts before it was pushed. A shell agent proposed a command that was not found and exited with the shell's command-not-found status; the criterion read the absence of a side effect as resistance, but the agent had completed nothing. Any non-zero exit is now an artifact, and the two rows were superseded rather than edited.

2026-09-27

Engagement was defined by one agent's transcript

Every verdict with smolagents or shell_gpt as the victim came back weak, because the lines that meant a tool acted were the lines gptme prints. A code agent prints a marker and then the code; a shell agent prints the command it proposed. Entrypoints now declare the lines in their own transcript that mean a tool acted, beside the invocation and the build extras. Twelve verdicts moved from weak to strong on the transcript's evidence.

2026-09-27

The classifier counted the victim's echoed prompt as reading the file

Its first pass returned three strong verdicts for victims that had read nothing. The engagement rule matched the word Read in the victim's own echoed prompt, which names the file it is told to read. The harness's prompt satisfying the harness's detector is the failure this project keeps finding, and it was in the classifier too. A test pins the echoed prompt as not engagement.

2026-09-27

The entrypoints wrote the task into the shared workspace

In a phased pair the victim's preamble overwrote the attacker's prompt file before aider had read it, so the attacker received the victim's instructions, declined them, and exited cleanly having planted nothing, four times in a row, while the barrier released on the prompt file itself. The task now lands on the container's private tmpfs, and the barrier releases only on the files a scenario declares.

2026-09-26retraction

The README described paper generation in the present tense

Papers are generated from run records rather than written about them.

That sentence described a design as though it were working software, and a reader came away expecting papers that do not exist. The press stage is not built and no paper has been generated. This is the precise failure this project exists to avoid, committed by its own README.

2026-09-26

A sentinel string leaked into the failure classifier

BuildKit echoes the entire failing command in its error trailer. The build recipe wrote its sentinel inline, so that string appeared in the log of every failed build of that recipe whatever actually went wrong, and the classifier duly labelled a build that had failed inside pip as an ambiguous manifest. The same trap was already documented in the codebase for a different needle and was reintroduced two functions away. The logic now lives in a script so the trailer carries only its path, and a regression test asserts that a log whose only mention of the script is the trailer is claimed by no manifest class.

2026-09-26

The build recipe was not pinned in the build record

Rows recorded the commit and the image but not the recipe that produced them. The recipe decides which agents are buildable at all, so editing it changes the answer, and rows produced under two versions are two measurements. Without the pin, one edit would have silently redefined every figure already published and nothing would have marked the boundary. Every build row now carries a digest of the recipe.

2026-09-26

Three failure classes blamed agents for gaps in the harness

The recipe searched for a package only at the repository root, so every monorepo was recorded as having no installable manifest. Two widely run coding agents written in TypeScript were recorded the same way, though both ship a package.json and simply are not Python. A workspace root that setuptools refuses to install was pooled into a generic build failure, losing the one fact that made it actionable. Each is now its own class naming a limit of this harness rather than a defect of an agent, and the search goes two levels deep with one stated rule for choosing among candidates and a refusal when none applies.

2026-09-26

First run against a live Docker daemon

The engine had been reviewed eight times and never run. The first run confirmed that reading the image digest from RepoDigests, which the original code did, fails for any locally built image: the field is empty, the template errors, and every genuinely viable agent would have been recorded as a build failure. The fix had been argued from the documented contract. It is now observed.