Optional ReadonlyfilesFiles written on top of the base fixture for this arm.
Optional ReadonlyinterceptTools to intercept for this arm (the tool-call spy). Each
ToolIntercept is denied its real execution by an auto-wired PreToolUse
hook — the model still emits the tool_use (so its arguments land in the
Trace for toolWith / notTool), but the side effect (a paid API call, a
git push, a paid subagent) never happens: the call is intercepted
(prevented), NOT executed. This makes a real-model eval side-effect-free and
safe (it does NOT cut the model-call cost); and because CC surfaces the
denial as a blocked call, it's for asserting the agent's ATTEMPT, not for
stubbing a tool to continue a multi-step flow. See src/tool-intercept.ts.
Optional ReadonlymodelModel alias/id for THIS arm, overriding the eval-level model. A model
comparison IS a harness A/B — arms: { sonnet: { model: "claude-sonnet-4-6" }, opus: { model: "claude-opus-4-8" } } — so model-as-an-arm answers "does my
harness still hold on the cheaper tier / after a model upgrade?" through the
same significance machinery, with no separate model-matrix runner. Omit to
use the eval-level model. See docs/eval-architecture.md (model strategy).
Optional ReadonlypluginPath to a real plugin/repo to load for this arm (hooks + CLAUDE.md + skills). Lets an arm be "the whole plugin on" vs "off". See src/plugin-loader.ts.
Optional ReadonlypluginPath to a plugin dir to install NATIVELY (claude --plugin-dir) for this
arm, so its skills/commands/agents activate the real way — the real model
can trigger a skill by its description (vs. plugin, which materializes a
file subset that does not register skills). Point at a COMPLETE plugin. Lets
an arm be "skill installed" vs "off" to measure real activation.
Optional Readonlysettings.claude/settings.json (hooks/permissions) for this arm; omit for none.
One arm of the comparison: fixture overrides + settings (hooks) for this arm.