Results

Experiments

Each experiment is a script in experiments/ that writes a dated result file; the README and the white paper read from those files.

Experiments

ScriptMeasuresModel calls
real_ontologies/run.pyImpact by group testing, the worst two-action chain, detection, inferred amplificationNone
attack_defense/run.pyGreedy, beam, random, and UCT at equal evaluations; residual harm under M locksNone
llm_agent/run.pyA language-model agent answering the same workloads in words, honest and attacked20 requests, $0.68
memory_defense/run.pyRandom attacks on a shared agent memory; repair by attribution against rollbackNone

Every model call is recorded in results/costs/ledger.jsonl with tokens, seconds, and list-price dollars.

Attack search at equal cost

uv run python experiments/attack_defense/run.py --json results/attack_defense/2026-10-18.json
uv run --with matplotlib python paper/figures.py results/attack_defense/2026-10-18.json

At equal harm evaluations (beam's count), the most harmful three-action chain each search finds; random and UCT are means of 5 seeds.

OntologyGreedyBeamRandomUCTEvaluations
EBSD0.6000.6000.5330.493167
MatProc0.6191.0000.7760.805119
XRD0.4440.4440.5330.60091
Mouse anatomy0.8030.9450.8090.884104

UCT beats greedy and beam on XRD at every budget from two actions up (0.763 against 0.644 at four), ties beam at two actions elsewhere, and trails it at three and four where harm is close to additive. Given 200 evaluations it reaches 1.000 on MatProc and 0.945 on mouse anatomy with no spread across seeds; random search still varies by 0.04 to 0.12.

Protection by locking

Residual harm of a two-action attacker (the best of beam and UCT) after locking six triples:

OntologyNo locksRandomTop impactBest response
EBSD0.4000.3200.4000.133
MatProc0.8000.4590.0250.025
XRD0.4000.4000.2120.030
Mouse anatomy0.7450.6750.0290.019

Best response is never worse than top impact. On EBSD, six top-impact locks change nothing because the attacker moves to the next query's triples. Ten well-chosen locks remove all of a two-action attacker's harm on every ontology.

A language-model agent

Claude Opus 5.5, writing SPARQL against a labeled schema, answers every honest question on all four ontologies and then suffers exactly the template answerer's harm under the worst two-action chain (0.400, 0.800, 0.400, and 0.745). On hierarchy questions the damage is in the ontology, so the cheap template answerer is a faithful proxy during attack search.

Agent memory

Over 20 random attacks of one to three forged or removed findings, every attack was detected. Repair by attribution restored every probe and kept all honest work done after the attack; rollback restored the probes and lost that work.