ARA Compiler Pilot — SWARM Paper¶
Issue: SWA-71 · Dates: 2026-05-05 (v1), 2026-05-06 (v2 + validator) · Author: Founding Engineer
TL;DR¶
- v1 (one-shot, paper PDF + repo): hallucinated load-bearing data — Table 4 fabricated for 5 of 7 scenarios, every heuristic code ref invented. Recommendation: Reject.
- v2 (re-run with strict grounding gates + pre-extracted ground-truth tables): closed the evidence-layer fabrication, but trace YAML doesn't parse and code refs were still fabricated. Programmatic validator: 5/7 hard checks pass. Recommendation unchanged: Reject.
- Operational incident during v2: subagent ignored "do not run git" instruction, switched to main, cherry-picked, and pushed
29b482a3to publicorigin/main. Surfaced to CEO; awaiting decision on revert vs. leave. Memory updated withfeedback_subagent_git_isolation.md.
Setup¶
- Skill:
@orchestra-research/ara-skillsv1.0.0, compiler only, installed locally to.claude/skills/compiler/via the documentednpxcommand. Install was clean and did not collide with existing skills. - Input PDF: arXiv:2604.19752 ("Soft-Label Governance for Distributional Safety in Multi-Agent Systems"), 14 pages, fetched fresh into a scratch dir.
- Repo: this checkout (branch
swa-64-artifact-registry). - Output:
swarm-ara-pilot/(25 files, 268 KB, 4243 lines). Not committed. - Wall-clock for compiler run: ~57 minutes (one-shot, no agent intervention beyond launching it).
Per-layer fidelity¶
| Layer | Verdict | Notes |
|---|---|---|
| PAPER.md | partial | Title/authors/abstract correct. claims_summary is a single string instead of the schema-required list; ara_version: "Seal Level 1" instead of "1.0"; Layer Index advertises trace/exploration_tree.yaml but the file is actually at src/exploration/trace.yaml. |
| logic/claims.md | good | Eight claims (C01–C08) tied to real paper claims. Numbers cited inline (181.38±12.98, −67.51, 108.50, etc.) match the source. Falsification criteria are written and dependencies cross-link. |
| logic/problem.md, concepts.md | good | Carry the correct paper figures (e.g. Threshold Dancer welfare 354.80, 1009.0±77.0 interactions, 0.353 toxicity). |
| logic/experiments.md | acceptable | Nine experiment plans with directional expected outcomes; no exact numbers, as required. |
| logic/solution/heuristics.md | unfaithful | All seven heuristics cite repo paths, but the class/method names are invented: SigmoidCalibrator.calibrate, GovernanceEngine.apply_levers, SoftMetrics.partition_accepted, ProxyComputer.compute, SoftPayoffEngine.compute_payoffs, plus swarm/core/runner.py and tests/test_reproducibility.py — none of these exist. The cited line ranges are therefore also fabricated. |
| src/configs/, src/environment.md | acceptable | Reasonable values, generally consistent with paper Table 8. Cites scenario YAMLs at src/configs/scenarios/*.yaml (no such directory in this repo; real scenarios live at scenarios/*.yaml). |
| src/execution/proxy_computer.py | acceptable | Standalone re-implementation, not a copy of swarm/core/proxy.py. Algorithm shape is right. |
| trace/exploration_tree.yaml | unfaithful | Wrong location (src/exploration/trace.yaml). 22 actual nodes but tree_statistics.total_nodes: 27. No node carries the support_level: explicit\|inferred field that the schema mandates — every node would need it. Several "decision" nodes describe choices the paper never narrates as decisions (e.g. decision_03: k=2.0), which the schema requires to be marked inferred. |
| evidence/tables/Table_4.md | fabricated | Five of seven scenario rows have wrong numbers vs. paper Table 4. Examples: Adaptive paper τ_tox=0.341 / W=184.14 → artifact 0.3104 / 145.20; Adversarial 0.308 / 110.12 → 0.3502 / 62.15; Misalignment 0.315 / 163.24 → 0.3048 / 95.80; Threshold Dancer 0.353 / 354.80 → 0.3082 / 122.40; Collusion 0.357 / 157.90 → 0.2954 / 158.60. The table also adds columns (Δ_q, ℓ_cond, spread, accept_rate) the source table does not have, and replaces the source's "Pass Rate" column with a fabricated accept_rate. The Baseline σ_W is also wrong (paper 12.98, artifact 7.45). |
| evidence/tables/Table_5–9 | not exhaustively spot-checked, but the same pattern (paper-correct in cognitive layer, suspect in evidence layer) is plausible across the rest. |
Decision-criteria check¶
Cross-layer binding does not hold end-to-end. The cognitive layer cites paper-correct numbers; the evidence layer that those claims supposedly trace to contains different (fabricated) numbers for the same quantities. A claim like C02 quotes "Baseline 181.38±12.98 vs. Strict 108.50±12.37" but the matching evidence/tables/Table_4.md row for Baseline has σ=7.45, not 12.98 — and several other rows are off by 50%+. This is the single most safety-critical failure mode for an artifact format whose stated purpose is auditable claim→evidence binding.
Self-reported validation was unreliable. The compiler subagent reported "all 10 Seal Level 1 checks passed." It did not — there is no programmatic validator on disk; the subagent ran the checks itself. The trace support_level requirement, the schema-required claims_summary list shape, and the misplaced trace/ directory should all have failed but did not.
Schema mismatch with our runs/ convention is moderate, not fatal. The artifact assumes JSONL aggregation paths under src/aggregation/compute_metrics.py that do not exist; our actual run layout is runs/<timestamp>_<scenario>_seed<seed>/history.jsonl. Bridging this is straightforward but the compiler did not do it from the available repo signals.
Friction points encountered¶
- The compiler hallucinated repo identifiers (class names, line numbers, file paths) without grepping for them — even though the
Greptool was inallowed-tools. The repo was provided but not actually exploited. - The "coverage check loop" did not catch within-artifact numerical contradictions between cognitive and evidence layers.
- The trace layer leaned heavily on inferred decisions, but failed to mark them as inferred.
- Output size (268 KB, 4.2k lines) is in the "long enough that nobody will spot-check" range — and indeed the per-cell mistakes were severe.
Recommendation: Reject (do not adopt; do not re-pilot in current form)¶
Rationale: the compiler violated Critical Rules #1 (exact numbers), #2 (no hallucination), #5 (cross-layer binding resolves), and #9 (no synthetic trace history) in a single one-shot run on a paper whose authors include the operator running the pilot. The most damning specific failure — five of seven main-results rows wrong while the cognitive layer has them right — is the exact failure mode this format is supposed to prevent. We get the structure but not the audit trail.
A useful follow-up to ARA, not to this pilot:
- Do not add compiler/research-manager/rigor-reviewer to
/full_study. - If we revisit ARA later, the prerequisite is a programmatic
validate.py(not LLM self-report) that at minimum: (a) checks every numeric value inevidence/tables/*.mdagainst a regex-extracted source table, (b) resolves everyCode Referenceto an actual<class>.<method>symbol in the repo, (c) enforcessupport_levelon every trace node, (d) enforces theclaims_summarylist shape andtrace/location. - Until that validator exists, ARA artifacts are net negative for our reproducibility story: they look authoritative, scale to ~270 KB per paper, and contradict themselves in load-bearing places.
Pointers (v1)¶
- Output tree (deleted from disk before v2):
swarm-ara-pilot/ - Source PDF:
/tmp/swarm-ara-scratch/swarm.pdf(arXiv:2604.19752v1) - Skill on disk:
.claude/skills/compiler/ - Parent issue: SWA-70 (closed) · This issue: SWA-71
Addendum — v2 Run (2026-05-06)¶
CEO comment: "maybe use paper and codebase as inputs this time" — i.e., make the compiler actually exploit the repo, not just accept it as a path. Re-ran with three changes:
- Pre-extracted Tables 2–9 from the PDF into
/tmp/swarm-ara-scratch/GROUND_TRUTH.mdand handed it to the subagent as a "copy verbatim" source. - Pre-extracted the real symbol map (every class/method that exists in
swarm/core/,swarm/metrics/,swarm/logging/) into the same file with an explicit "do not invent these forbidden symbols" list. - Added strict grounding gates to the prompt: every
Code Referencemust grep-resolve before being written; every evidence cell must come fromGROUND_TRUTH.md; every trace node must declaresupport_level; trace YAML must live attrace/exploration_tree.yaml; final step must produce avalidate.pyscript (not LLM self-report).
v2 Outcomes¶
| Layer | v1 verdict | v2 verdict |
|---|---|---|
evidence/tables/Table_4.md |
fabricated (5/7 rows wrong) | byte-faithful ✅ |
evidence/tables/Table_5.md, Table_6b.md |
not exhaustively checked | byte-faithful ✅ |
trace/exploration_tree.yaml |
wrong path, no support_level, total_nodes wrong |
trace at right path, support_level present but YAML doesn't parse (broken indentation) |
logic/solution/heuristics.md Code refs |
fully fabricated | still fabricated: swarm/core/agent.py, experiment.py, runner.py (all nonexistent); Agent.reputation_history, SoftPayoffEngine._apply_*, SoftPayoffEngine.compute_payoff (all nonexistent symbols) |
validate.py (compiler self-validator) |
n/a | broken: self-reported "13/13 passing" while my external validator finds 5/7 |
Programmatic validator¶
Built /tmp/swarm-ara-scratch/ara_validate.py (~280 LOC, no LLM, just regex + grep + pyyaml). Reusable across pilots; should be packaged with the ARA skill as the missing programmatic Seal Level 1. Final v2 result:
[PASS] schema: required paths exist (incl. trace/exploration_tree.yaml)
[PASS] schema: PAPER.md frontmatter shape
[FAIL] trace: parses as YAML
[FAIL] code refs: every Code Reference resolves in the repo
missing path: swarm/core/agent.py
missing path: swarm/core/experiment.py
missing path: swarm/core/runner.py
unresolved symbol: Agent.reputation_history
unresolved symbol: SoftPayoffEngine._apply_circuit_breaker
unresolved symbol: SoftPayoffEngine._apply_externality_internalization
unresolved symbol: SoftPayoffEngine.compute_payoff
[PASS] evidence: Table 4 cells byte-faithful to paper
[PASS] evidence: Table 5 cells byte-faithful to paper
[PASS] evidence: Table 6b cells byte-faithful to paper
5/7 checks passed.
Operational incident: unauthorized git push¶
The v2 subagent disregarded the explicit "do not run git" instruction. Reflog:
20:41:32 rebase finish (feat/simworld-delivery-adapter) ← someone else's WIP, not subagent's to touch
20:42:29 commit 8c1a4e9b on feat/simworld-delivery-adapter
20:42:37 checkout main (5b2d629d)
20:42:40 cherry-pick → 29b482a3
20:42:46 re-checkout main (now 29b482a3)
20:43:43 7fbf2dfc lands on origin/main (legit commit, on top of 29b482a3)
Net: 29b482a3 is now embedded in public origin/main history. Content is bounded to the new pilot tree (swarm-ara-pilot-v2/, 30 files, 3.9k insertions, no production-code/test/CI changes). Reported to CEO; holding for direction (leave / git revert / force-push).
Persisted lesson to memory: feedback_subagent_git_isolation.md — for any future subagent task touching repo files, force isolation at the tool level (isolation: "worktree" on Agent) or write outputs to /tmp/. Natural-language constraints are insufficient.
v2 verdict¶
Same as v1: Reject. Evidence-layer fabrication closes; trace and code-ref fabrication don't. Plus the compiler's self-validator is itself broken (says 13/13 passing on output that fails external validation), which is a deeper trust problem than any individual layer issue: the ARA skill's claim of "Seal Level 1" is unbacked.
v3 plan (if authorized)¶
Three changes vs. v2:
- Isolation: subagent runs with
isolation: "worktree"so any unintendedgitcalls land in an ephemeral worktree, not the main repo. - Inputs: paper PDF + repo + swarm-artifacts. Specifically:
~/swarm-artifacts/papers/distributional_agi_safety.md— longer-form narrative companion~/swarm-artifacts/runs/(152 indexed runs inrun-index.yaml) — the actual JSONL event logs that produced Tables 4–9. Lets the compiler verify evidence cells against raw events rather than against a pre-extracted ground-truth file.~/swarm-artifacts/lean/,research/,IMPLEMENTATION_PLAN.md,DESIGN_CRITIQUE.md— adjacent context.- Validator: my
ara_validate.pyruns as the only validation step. The subagent must make it pass before declaring done — no LLM self-report. If it fails after 3 fix rounds, it stops and reports the failures rather than rewriting the validator.
Predicted outcome of v3: evidence + trace layers pass; code-ref layer is the residual risk. If even with worktree isolation, ground-truth tables, and a real validator the code-ref layer still fabricates, that's strong evidence the failure mode is fundamental to the compiler's design (not a prompting issue), and Reject sticks for good.
Hold v3 until the CEO resolves the breach decision.