Campaign 011 forensic analysis and preparation requirements — 2026-10-02¶
This audit supersedes the efficacy and correctness interpretation in the initial results report. It reads the frozen records, complete event streams, protected traces, source fixtures and runner implementation. No model turn was started and no original campaign record was changed. Additional offline checks are explicitly retrospective, rather than replacements for frozen results.
Results and comparison¶
All 48 scheduled attempts finished and have immutable records and complete
usage. The final runner status is complete; this describes schedule completion,
not correctness. The runner recorded 44 operational passes, four post-turn token
classification failures, ten grading failures and 34 answers requiring semantic
review. None of the four operational failures was a provider quota rejection.
| Measurement | Baseline, 24 attempts | MCP-configured, 24 attempts |
|---|---|---|
| Operational passes | 21 | 23 |
| Post-turn token-ceiling failures | 3 | 1 |
| Frozen grading failures | 5 | 5 |
| Frozen semantic review pending | 16 | 18 |
| Input + output tokens | 10,873,076 | 8,419,785 |
| Cached input tokens, already included above | 9,806,848 | 7,547,648 |
| Uncached input tokens | 952,569 | 763,189 |
| Native container execution, summed seconds | 3,033.00 | 3,070.16 |
| Index preparation, summed seconds | 0 | 3,207.31 |
| Export + environment + grading, summed seconds | 258.89 | 295.42 |
| All measured attempt phases, summed seconds | 3,291.89 | 6,572.89 |
| Attempted / successful MCP calls | 0 / 0 | 15 / 0 |
The MCP-configured arm used 2,453,291 fewer reported tokens, a 22.56% reduction. Uncached input fell 19.88%. Its native turns took 1.23% longer; adding recorded preparation and grading phases makes its measured attempt duration about twice baseline. These sums exclude inter-attempt admission, checkpoints and operator recovery, and are not campaign wall time. Cached tokens are repeated model input, not additional uncached tokens or a dollar/quota conversion.
There is no successful MCP exposure in this campaign. All 15 calls, across
seven assisted attempts (E1, E2, E3, F1, I1, I2, T2), failed with
MCP tool call requires approval, but approval policy is never. The remaining
17 assisted attempts made no MCP call. Both arms had Codira CLI access by design;
some assisted attempts fell back to it or source inspection. Consequently these
numbers compare the realized configurations, including failed tool access and
preindexing, and cannot establish an MCP treatment benefit.
The all-pair mean token difference is -102,220, median -2,619, with the existing task-bootstrap 95% interval [-333,970, 60,081]. The interval crosses zero. E3 alone accounts for 2,223,086 tokens, 90.62% of the aggregate reduction. Removing that pair as a sensitivity check leaves a 230,205-token reduction (2.89% of the remaining baseline total). This exclusion is diagnostic, not a new primary analysis. One repetition per task cannot resolve model variability. The earlier 16-pair subset excluded grader failures as well as cap classifications and must not be described as a correctness-matched efficacy comparison.
Start snapshots showed the Codex quota bucket at 79–82% used, with no exhaustion flag. They are dated observations, not an attributable campaign quota debit: provider windows and other account activity are not controlled here. Recorded usage totals 19,292,861 tokens. Subscription dollar accounting is not applicable.
Failure diagnosis¶
MCP permissions: the treatment was advertised but unusable¶
The preserved assisted configuration registers the Codira MCP server, requires
startup, trusts /workspace, and sets approval_policy="never". Native tool
execution nevertheless asks for approval for every observed MCP call and rejects
it. Server registration, discovery, direct MCP qualification and index readiness
did not prove that the native agent could execute the tool under its actual
permissions profile. The event streams prove the dispatch failure; this audit
does not assert an untested configuration key will repair it.
The qualifier must exercise the actual native client's tool authorization and successful dispatch with the campaign configuration. Test the exact permission setting offline through the native protocol when possible. If that does not exercise model-triggered dispatch, a separately identified, explicitly authorized minimal canary is needed; a no-turn account/model preflight cannot substitute. Do not solve this by exposing credentials or disabling the task sandbox.
Optional tool use permits an agent to choose source inspection. It must not permit an unavailable configured tool to pass treatment qualification. A systemic authorization failure should stop new attempts before consuming the full panel.
Eight oracle-contract failures: a composite grader defect¶
All six patch tasks declare result_format="workspace-diff". In
scripts/agent_efficiency/oracles.py, _result_artifact verifies the patch exists
and returns None for that format. Their complete oracle is an all_of combining
protected patch behavior with quality_rubric. _quality_check requires text,
so it raises ContractError: quality_rubric requires a rubric object and text
artifact. Composite evaluation eagerly evaluates every child; that exception
also masks a preceding behavioral failure and discards accumulated public
subcheck results.
A credential-free direct reproduction of the real artifact loader and quality branch produced that exact exception. Frozen traces show:
| Task | Baseline protected command | MCP-configured protected command | Frozen terminal classification |
|---|---|---|---|
| F2: optional plugin capabilities | exit 0 | exit 0 | oracle_contract, both |
| F3: suffix forwarding | exit 0 | exit 1 | oracle_contract, both |
| P1: sentinel pickling | exit 0 | exit 0 | oracle_contract, both |
| P3: zero means unlimited | exit 0 | exit 0 | oracle_contract, both |
Every patch in this table passed git apply --check and application. Seven
passed their protected behavioral command. Those are bounded behavioral results,
not full correctness passes; semantic coverage was never evaluated successfully.
Calling all eight incorrect patches in the initial report was wrong.
F3 assisted has a genuine behavioral defect in addition to the grader bug:
transform returns immediately when enabled === false, before appending the
suffix. The protected probe observed abc where abcend was required. Added
agent tests checked default/lowercase suffix behavior but missed the disabled
implementation path. The public wrapper still has its seeded false-defaulting
behavior, which further hides this path in public-only examples.
The 18 patch calibrations did not exercise the complete oracle: the calibration
helper selects definition['all_of'][0] and evaluates only patch behavior. The
72 rubric probes separately adjudicate curated text. Neither qualification
crossed the real workspace-diff/composite-quality boundary. Successful component
calibrations therefore did not establish campaign grading qualification.
P2: capture rejected installed dependency symlinks¶
Both P2 attempts finished and wrote their own patch, but the runner failed before
protected grading. capture_workspace_patch traverses the workspace, excludes
Python environments/caches and runner metadata, but does not exclude
node_modules. It rejects symlinks anywhere in its included tree.
Each preserved agent tree has 23 symlinks under node_modules/.bin. The
pre-turn snapshot contains no symlinks because shutil.copytree dereferences them
by default. Capture thus compares incompatible representations of prepared
dependencies and rejects a normal offline environment. Direct read-only capture
replays reproduced workspace patch capture rejects symlinks in both arms.
The transcript does not show an agent dependency-install command causing this;
the dependencies were prepared by the runner.
This is a capture defect, not evidence that the ignore repair was wrong. Calibration generated patches through Git instead of campaign snapshot capture, so it could not detect this boundary failure. Capture should operate on the admitted source/test inventory and explicit allowed additions, ignore prepared dependencies consistently, and retain precise failure class/stage in evidence. Source-path escapes, unexpected source symlinks and binary changes should still be rejected; a blanket acceptance of symlinks would weaken the wrong control.
Four token-ceiling classifications: complete turns, not interruptions¶
| Attempt | Reported total | Commands / nonzero exits | First file-change event | Native duration |
|---|---|---|---|---|
| F1 baseline | 1,717,792 | 30 / 5 | 42 | 302.69 s |
| F1 assisted | 1,074,856 | 26 / 7 | 42 | 241.96 s |
| I2 baseline | 1,138,788 | 47 / 6 | 80 | 279.61 s |
| E3 baseline | 2,921,387 | 52 / 12 | 88 | 441.53 s |
All four reached native return code 0, recorded full usage and produced their requested output artifact. The native route checks the token ceiling after the turn. It neither interrupted these turns at one million tokens nor graded their outputs afterward. The ceiling therefore currently acts as a terminal classification/checkpoint rule, not an effective live runaway stop.
F1 produced code and regression tests in both arms. The assisted attempt also encountered two denied MCP calls, denied uv-cache/global configuration paths, a read-only Git index and a missing output directory, and worked around them. The baseline patch changed more files, including core paging-related code and tests, despite the fixture retaining core paging; assess that scope against the protected task rather than presuming the larger trajectory was necessary. I2 did broad contract/caller/test inspection and wrote a substantial assessment; initial Codira commands hit denied configuration and unavailable ONNX artifacts. These are progressing trajectories, not evidence of simple endless loops.
E3 baseline spent many commands repairing its execution environment: denied user configuration, absent repository config, unavailable default embedding plugin, unconfigured ONNX model, then inconsistent query/index configuration. It eventually used disabled embeddings with placeholder model paths, performed index/cursor experiments and wrote an answer. Its very high cumulative input is substantially confounded by runner/environment recovery. Raising the ceiling would relabel the completed turn but would not repair that cause.
Nonzero command counts also include expected argparse rejection tests, stale
cursor rejection, failed search matches, and git diff --no-index returning 1
when differences exist. They are not all infrastructure or model errors.
The operator's intended policy is a generous runaway safeguard. A future native runner should separate soft usage warning/classification from live cancellation, retain available output grading as a separate axis, and use wall time plus observed lack of progress to stop actual runaway behavior. Any new thresholds or stop semantics require a fresh qualified campaign; 011 remains frozen.
Semantic review: the earlier 32/34 pass rate is unsupported¶
The original review packets used opaque IDs, but the preserved adjudication
script sets every criterion to supported except grounding for two hard-coded
packet IDs. It uses generic reasons and heuristically selected answer quotes.
The receipt validator checks digests, decisions and quote membership; it cannot
verify that a quoted claim is true. This is not a defensible source-grounded
semantic adjudication, even though the receipt format is valid.
Source and event spot checks expose concrete missed problems:
- I1 baseline says the warm-proxy parity test includes
symbol_evidence. The frozen test's call map omits it. I1 assisted correctly identifies that gap. - E3 assisted was asked to edit
transform; its preservedimpl.tsremains unchanged while it fixeswrapper.tsand adds a disabled-format regression. Cursor-generation observations are useful, but they do not cover the requested implementation edit. The answer was incorrectly accepted for full coverage. - N3 assisted changes
wrapper.tsto pass options unchanged during a navigation task and describes the resulting behavior. It identifies the alias chain, but part of the answer concerns its modified fixture rather than the frozen behavior. The earlier review did not identify this deviation. - Both N2 answers lack the source-location/reproducible-check grounding required by the rubric; the original review did notice this narrower issue.
These checks are an unblinded forensic audit, not replacement blinded scores. Withdraw the aggregate 32/34 semantic pass claim. Preserve its packets and receipts for audit, and rerate all applicable outputs using frozen source, execution observations, explicit criterion reasons and treatment-blind review. No final task-success percentage or correctness-matched efficacy estimate is supported until that work is completed.
Conversation and runner-preparation failures¶
The recurring errors cross different execution boundaries and require different checks. Treating all of them as container problems leads to ineffective fixes.
| Failure | Boundary and cause | Required prevention |
|---|---|---|
| Podman mkdir/sticky-bit error | Host rootless Podman cannot write /run/user/1000/libpod from the outer agent sandbox; before any task container/model turn |
Qualify Podman from the actual authorized host execution context once; route runtime operations there consistently |
| tmux socket operation denied | Outer sandbox cannot access the host tmux server | Validate tmux access in the same host context as launch and full gate |
| Frozen source mismatch | Prepared image uses 0ee458; active checkout serves newer d4ec49; session did not receive the frozen source binding |
Pin interpreter/product artifact and verify imports in generated tmux child before authenticated execution |
Python types import crash |
Manual PYTHONPATH pointed to the codira package directory, shadowing stdlib types.py |
Bind an isolated package environment/archive parent through a receipt; test import types and source fingerprint in child; avoid tmux-global environment mutation |
| Relative fixture binding / wrong client path | Manually re-entered already prepared paths | Resolve/check paths once, load exact bindings from immutable local receipt; verify client digest, not just version |
| Native HOME denied | Tools inherit HOME under credential-denied /codex-state, causing bash startup, Git config, uv and Codira config errors |
Separate client credential state from writable tool home/config/cache; exercise real tool commands under actual sandbox |
| CLI profile / model / index mismatch | Fallback CLI doesn't consistently receive the qualified profile, model assets and index/output-root conventions | Bake wrapper/profile/assets and use the same qualified CLI contract in both arms |
| MCP approval denial | Server exposed but native agent dispatch not qualified | Verify successful native MCP execution; count denied/successful calls, not merely attempted calls |
| Patch capture / composite grade | Calibrations bypassed campaign boundaries | Replay full export→prepare→snapshot→edits→capture→complete oracle→record/report path for every task family |
| Weak semantic adjudication | Quote-valid receipts accepted unsupported assertions | Source-grounded reviews; quote/digest validity is only evidence integrity |
The first five are pre-turn failures: they cost operator time, but their traces do not establish model/quota consumption. Tool-home, CLI and MCP failures occur inside model trajectories and cause additional commands and cumulative input. The initial full gate did not prevent these because the end-to-end boundaries were not covered. Repeating the entire gate after merely recording its success adds delay without testing a new failure condition.
Refinement of the preparation checklist¶
The factory already separates specification, generation, qualification, preflight and paid launch. Retain those stages and strengthen their contracts. The desired outcome is one deterministic assembly pass over qualified components, with failures reported before model execution. It cannot promise zero mistakes; it can eliminate hand-entered launch state and require proof at each boundary. These are requirements for the next runner revision, not a claim that those features are implemented today.
Use a versioned reusable runtime recipe for Podman isolation, native credentials and tunnel, tool home/cache, offline ecosystems, CLI/MCP bindings, source snapshot capture, protected grading and evidence/checkpoint handling. Resolve new campaign inputs through the factory: exact product checkout/package, tasks/fixtures/tests, model/effort/provider, repetitions/seed and guardrails. A model change should not rebuild a qualified dependency image unless runtime requirements change.
The intake should summarize all resolved parameters and their provenance. Ask only for genuinely missing experiment choices: route/account, model/effort, task selection/repetitions, stop policy or material environment changes. Derive fixture paths, image/client/source digests, schedule, execution root and commands from admitted artifacts. Campaign 011 already specified its material inputs; asking the operator to repeat them would not prevent these failures.
Require the following evidence before generating a new campaign:
- Host boundary: runtime and tmux probes pass in the actual launch context; scratch path/socket lengths and required writable host runtime directories are checked. Preserve the execution-context requirement; do not retry a known forbidden sandbox operation as though it might succeed.
- Component identities: isolated host product interpreter/package and image product match; source/profile/client/harness/task/fixture/oracle digests are pinned. Smoke-test imports and stdlib resolution in the generated child. Qualification receipts include commands/configuration actually exercised.
- Tool contract: credential-read and network denial still pass; writable tool home/cache and exact ordinary shell, Git, uv, CLI and test commands pass. Prove usable native MCP dispatch separately from tool listing or direct MCP. A tool-choice protocol must distinguish non-use from denial/unavailability.
- Task pipeline: replay correct, incomplete and wrong cases through campaign export, environment preparation, snapshot/capture, complete composite oracle, serialization and report. Include npm symlinks, new tests, read-only synthetic Git, text versus diff rubric inputs, and partial failure trace preservation. Component-only calibration cannot satisfy this gate.
- Ready receipt: persist a resolved local binding receipt and generated launch environment; no manually reconstructed path list or tmux-global PYTHONPATH. Reject stale receipts when any binding/configuration/harness identity changes. Existing campaign artifacts remain immutable.
- Repository and authenticated gates: run one full gate for the coherent revision with durable log/exit status, then repeat account/model/effort/quota admission through the exact isolated route. Subscription receipts use quota units; request/output planning values must not imply enforcement.
- Execution and closure: launch only through the official launcher with campaign authorization. Retain complete events, diagnostics and distinct scheduled/model-terminal/usage/behavior/semantic statuses. Monitor systemic tool/grade failures and progress; investigate unmatched starts before resume. Stop-policy semantics are frozen campaign inputs. Keep completed sessions and durable terminal evidence; do not confuse exit 0 checkpoint with completion.
Correctness of the future assembly process should be demonstrated by these replays rather than another long checklist completed manually. Keep one parameter record, one generator, one qualification receipt and one launcher. Changed component recipes invalidate dependent qualification; changed experiment inputs produce a fresh campaign identity without rebuilding unrelated pieces.
Evidence and validation¶
Original evidence remains under
.artifacts/agent-efficiency/executions/codira-efficacy-campaign-011-20261002/.
The additional forensic-review-20261002/audit.json records all 48 record/event
digests, arm totals, protected-stage statuses, native MCP failures and direct
contract/capture reproductions. The former disposable adjudication script was
copied there as audit evidence. Raw private paths and outputs stay ignored.
Retrospective protected patch checks are under the separate
forensic-review-20261002/retrospective-patches/ identity and are discussed in
its addendum below. They cannot retroactively change admission or attempt status.
Retrospective behavioral addendum¶
All 12 preserved patch artifacts were checked without credentials or model turns in the exact frozen image. Eleven passed the frozen protected behavioral branch: both F1, F2, P1, P2 and P3 attempts, plus F3 baseline. F3 assisted again failed the disabled-conversion suffix assertion. Both over-ceiling F1 attempts therefore have positive retrospective behavioral evidence, and both P2 repairs pass when evaluated without the defective runner capture. These checks bypass the broken semantic branch and use the preserved model patch for P2; they do not prove successful runner capture or full semantic correctness.
Complete task-by-task audit¶
B/M usage is input plus output. Operations are frozen; retrospective patch behavior and text spot checks are separate. Unverified review means a final semantic correctness decision remains outstanding.
| Task | B tokens | M tokens | M − B | Frozen operations B / M | Forensic correctness evidence |
|---|---|---|---|---|---|
| panel-d1 | 218,973 | 222,652 | +3,679 | pass / pass | Text review unverified |
| panel-d2 | 285,880 | 165,715 | -120,165 | pass / pass | Text review unverified |
| panel-d3 | 85,976 | 107,361 | +21,385 | pass / pass | Text review unverified |
| panel-e1 | 473,544 | 378,078 | -95,466 | pass / pass | Text review unverified |
| panel-e2 | 146,501 | 313,047 | +166,546 | pass / pass | Text review unverified |
| panel-e3 | 2,921,387 | 698,301 | -2,223,086 | post-turn cap / pass | Text review unverified; assisted edits wrapper instead of transform |
| panel-f1 | 1,717,792 | 1,074,856 | -642,936 | post-turn cap / post-turn cap | Retrospective protected behavior pass / pass; full semantic grade unavailable |
| panel-f2 | 198,629 | 207,567 | +8,938 | pass / pass | Retrospective protected behavior pass / pass; full semantic grade unavailable |
| panel-f3 | 102,751 | 142,922 | +40,171 | pass / pass | Retrospective protected behavior pass / fail (disabled suffix); full semantic grade unavailable |
| panel-i1 | 350,675 | 966,468 | +615,793 | pass / pass | Text review unverified; baseline parity-test claim contradicted |
| panel-i2 | 1,138,788 | 972,000 | -166,788 | post-turn cap / pass | Text review unverified |
| panel-i3 | 130,489 | 218,937 | +88,448 | pass / pass | Text review unverified |
| panel-n1 | 130,788 | 157,170 | +26,382 | pass / pass | Text review unverified |
| panel-n2 | 133,798 | 122,752 | -11,046 | pass / pass | Text review unverified; grounding deficient in both |
| panel-n3 | 133,365 | 108,879 | -24,486 | pass / pass | Text review unverified; assisted alters fixture during navigation |
| panel-p1 | 680,511 | 408,916 | -271,595 | pass / pass | Retrospective protected behavior pass / pass; full semantic grade unavailable |
| panel-p2 | 164,426 | 297,133 | +132,707 | pass / pass | Retrospective protected behavior pass / pass; full semantic grade unavailable |
| panel-p3 | 165,680 | 177,634 | +11,954 | pass / pass | Retrospective protected behavior pass / pass; full semantic grade unavailable |
| panel-t1 | 175,180 | 143,326 | -31,854 | pass / pass | Text review unverified |
| panel-t2 | 745,914 | 482,613 | -263,301 | pass / pass | Text review unverified |
| panel-t3 | 138,387 | 354,752 | +216,365 | pass / pass | Text review unverified |
| panel-u1 | 232,769 | 223,852 | -8,917 | pass / pass | Text review unverified |
| panel-u2 | 199,914 | 162,170 | -37,744 | pass / pass | Text review unverified |
| panel-u3 | 200,959 | 312,684 | +111,725 | pass / pass | Text review unverified |
Repository validation and retention¶
uv run python scripts/validate_repo.py passed with exit 0: 1,227 tests passed,
three skipped, 86% coverage, and zero local Semgrep findings. The durable log
and exit file are under
.artifacts/validation/repo-gates/campaign011-forensic-20261002/.
The tmux session campaign011-forensic-gate-20261002 is retained with
remain-on-exit; its completed pane reports dead=1, status=0.
Local documentation links and git diff --check also passed. All 96 original
record/event digests recorded by this audit still match after retrospective
checks. Changes are documentation only; runner repairs and a new campaign have
not been implemented or launched. This paragraph records validation and does
not require rerunning the completed gate.