VacantAn accountability layer for AIGitHub

Architecture · L3 / L4 / main path ·

Executable acceptance layer

The visible tests V decide release; the hidden tests GT are used only for scoring afterwards. The sandbox makes the test code structurally invisible to the candidate program. The acceptance suite is data, not code — otherwise an attacker can make the gauge score perfectly in both directions while delivering garbage.

#L3 Separating visible from hidden

Each task's requirement has three parts: the task statement, the public input contract, and the acceptance tests.

The acceptance tests are split into two sets:

Who can see itUsed for
Visible VThe agent can read itThe system uses it to decide release or refused delivery; the revision flow also only gets its failure messages
Hidden GTOnly scoring afterwardsMust not enter generation, selection, revision prompts or stopping conditions

A program that passes visible but fails hidden is a false delivery. This is the operational form of the problem "the output looks like the requirement, but isn't the requirement."

#Dynamic audit: did hidden tests leak in?

VersionApproachResult
v1Keyword matching90 false positives
v2Criterion changed to "who wrote this text"R460R and R529, all 67 blocks with zero violations; an independent process scanned 2,497 submitted texts and 164,963 comparison items with zero hits (with a positive control)
Retroactive rescan of all arms (2026-09-18)179 records, about 349 × 10⁴ comparison items165 with no violation, 10 unverifiable, 4 judged violations (all 4 belong to R530, which was never closed out)

#Sandbox

The candidate program runs in a separate process:

LimitValue
Time10 seconds
Memory128 MiB
Working directoryA temporary directory
Environment variablesNot inherited

The test program and the candidate program run in two separate processes, communicating through remote calls that carry a random marker and allow only literal values, so that the candidate program structurally cannot see the test code.

Measured latency (2026-07-09, 24 calls, thinking mode on): median 9.1 seconds, p95 40.0 seconds, max 41.7 seconds, 5.4 minutes in total; Hermes end to end about 78 seconds.

#L4 The acceptance suite is data

#The problem: the gauge can be fed into uselessness

The attack experiment of 2026-09-06 (R451) showed that as long as the acceptance suite is a piece of "trusted code," an attacker can write a stateful variant that defeats the gauge: the gauge scores perfectly in both directions, yet the delivery rate drops −75.20 pp, and the gauge still reports ok.

In a batch of 371 tasks, after the suite was bound into the commit, the plain suite got 371/371 all refused (normal); but the stateful variant made the delivery rate drop 75 percentage points, and the gauge reported ok.

#The fix: SuiteSpec

A suite contains only three things:

  1. The dialect
  2. The entry-point name
  3. A literal list of "input — expected value" pairs

The executor runs only its own deterministic renderer to generate the test code from this data, and the hash of the rendered result can be compared across machines.

AttackBefore the fixAfter the fix
exec smuggling368 / 3710 / 371
Residual: generic_gauged—+2.72 pp
Residual upper bound: weak_oracle—+4.35 pp

After turning the acceptance suite from code into data

#Gauge check: a one-sided guarantee

Before use, a suite must also pass a gauge check: the reference solution must pass, and every known wrong sample must be stopped.

#CONFORM and H-MIX

The two rules share the same gate semantics; they differ in what happens after a failure.

#CONFORM (resample)

Generate candidates in sequence → run visible acceptance on each → let the first one that passes through → at most five → if none pass, refuse delivery. A refused delivery counts as a failure, and the denominator is all tasks.

#H-MIX (revise)

  1. The first-round prompt contains the original task text, the list of standard-library modules allowed for import, and one line: "First check your function by hand against the examples in the task."
  2. After extracting the code, it first runs a zero-sandbox static precheck (syntax, forbidden imports and attributes, whether the entry point exists); if that fails, it replies with the reason the code couldn't load.
  3. Visible acceptance runs in the sandbox; on a pass, it is let through.
  4. On a failure it computes a failure signature (failure kind, exception type, message hash). If it matches the previous round, the first time it appends a "try a different approach" prompt; the second time it refuses delivery outright.
  5. Per-task cap: 5 calls, 32,000 tokens, 900 seconds.
  6. Feedback is presented in the fixed format AssertionError: args=… got=… want=…, truncated if too long.
  7. The context keeps only the first user message, the previous model reply and the current feedback.

See the verdict of the five replications

#False delivery rate

The R532 larger-model experiment (836 tasks, 43 blocks, 0 voided):

ArmAcceptedFalse deliveriesRate (of all)Of accepted
CONFORM81112014.4%14.8%
OFF62521125.2%—

The gate cut false delivery by roughly 40%, not by half. The thesis originally wrote "halved," which the fact check ruled ERROR E6 — the two rates used different denominators.

#Next

Last updated: · about 3 min read

Shih Hsin UniversityDepartment of Information and Communications, Shih Hsin UniversityVacant

Department of Information and Communications, Shih Hsin University · 2026 capstone project · on-site exhibition