name: mechinterp-runner description: Execute mechanistic interpretability experiments from JSON specs - family sweeps, itemsets, interactions, minimal cores, validation
MechInterp Runner
Execute experiment specifications for mechanistic interpretability analysis. This skill takes JSON spec files and runs the appropriate analysis, producing structured result files.
Purpose
The runner skill:
- Loads experiment specs from JSON files
- Routes to the appropriate experiment runner
- Executes the analysis with constraint enforcement
- Produces structured JSON results with diagnostics
When to Use
Use this skill after:
- The planner has generated experiment specs
- You have manually created an experiment spec
- You need to re-run an experiment with different parameters
Supported Experiment Types
| Type | Description |
|---|---|
family_1d_sweep | Test one ability family across AP rungs |
family_2d_heatmap | Test two families in a 2D grid (e.g., SCU × ISS) |
frequent_itemsets | Mine co-occurring token patterns |
minimal_cores | Find irreducible activating token sets |
pairwise_interactions | Compute token-pair synergy/redundancy |
conditional_interactions | How a third token modulates interactions |
split_half | Validation: correlation across random splits |
shuffle_null | Validation: null distribution via shuffling |
weapon_sweep | ⚠️ CORRELATIONAL: Analyze activation by weapon (observational grouping) |
kit_sweep | ⚠️ CORRELATIONAL: Analyze activation by sub/special weapon |
Usage
Subcommand Interface (Recommended)
Run experiments directly without writing JSON spec files:
cd /root/dev/SplatNLP
# 1D family sweep
poetry run python -m splatnlp.mechinterp.cli.runner_cli family-sweep \
--feature-id 6235 --family quick_respawn --model ultra
# 2D heatmap
poetry run python -m splatnlp.mechinterp.cli.runner_cli heatmap \
--feature-id 6235 --family-x special_charge_up --family-y quick_respawn
# Weapon sweep (correlational)
poetry run python -m splatnlp.mechinterp.cli.runner_cli weapon-sweep \
--feature-id 6235 --model ultra --top-k 20
# Kit sweep (correlational)
poetry run python -m splatnlp.mechinterp.cli.runner_cli kit-sweep \
--feature-id 6235 --model ultra --analyze-combinations
# Binary ability presence analysis
poetry run python -m splatnlp.mechinterp.cli.runner_cli binary \
--feature-id 6235 --model ultra
# Core coverage analysis
poetry run python -m splatnlp.mechinterp.cli.runner_cli coverage \
--feature-id 6235 --tokens comeback,stealth_jump,respawn_punisher
# Token influence analysis
poetry run python -m splatnlp.mechinterp.cli.runner_cli token-influence \
--feature-id 6235 --model ultra
Subcommand Reference
| Subcommand | Required Args | Optional Args |
|---|---|---|
family-sweep | --feature-id, --family | --model, --rungs |
heatmap | --feature-id, --family-x, --family-y | --model, --rungs-x, --rungs-y |
weapon-sweep | --feature-id | --model, --top-k, --min-examples |
kit-sweep | --feature-id | --model, --top-k, --analyze-combinations |
binary | --feature-id | --model, --tokens |
coverage | --feature-id | --model, --tokens, --threshold |
token-influence | --feature-id | --model, --high-percentile |
JSON Spec Mode (Legacy/Advanced)
For complex experiments or batch processing, use JSON spec files:
cd /root/dev/SplatNLP
# Run an experiment spec
poetry run python -m splatnlp.mechinterp.cli.runner_cli \
--spec-path /mnt/e/mechinterp_runs/specs/20250607__f18712__family-1d-sweep.json
# With custom output directory
poetry run python -m splatnlp.mechinterp.cli.runner_cli \
--spec-path my_spec.json \
--output-dir ./my_results/
# Dry run (validate spec only)
poetry run python -m splatnlp.mechinterp.cli.runner_cli \
--spec-path my_spec.json \
--dry-run
# List available experiment types
poetry run python -m splatnlp.mechinterp.cli.runner_cli --list-types
When to Use Subcommands vs JSON Specs
| Use Subcommands When | Use JSON Specs When |
|---|---|
| Quick one-off experiments | Batch processing multiple specs |
| Standard experiment configs | Custom dataset slices needed |
| Interactive investigation | Need to track experiment provenance |
| You want to avoid writing JSON | Complex constraint configurations |
Programmatic
from splatnlp.mechinterp.schemas import ExperimentSpec, ExperimentType
from splatnlp.mechinterp.experiments import get_runner_for_type
from splatnlp.mechinterp.skill_helpers import load_context
# Create spec
spec = ExperimentSpec(
type=ExperimentType.FAMILY_1D_SWEEP,
feature_id=18712,
model_type="ultra",
variables={"family": "special_charge_up"},
)
# Load context and run
ctx = load_context("ultra")
runner = get_runner_for_type(spec.type)
result = runner.run(spec, ctx)
# Check result
print(result.get_summary())
if result.success:
print(f"Mean delta: {result.aggregates.mean_delta}")
Spec File Format
{
"id": "20250607_142531",
"type": "family_1d_sweep",
"feature_id": 18712,
"model_type": "ultra",
"dataset_slice": {
"percentile_min": 10.0,
"percentile_max": 90.0,
"sample_size": 500
},
"variables": {
"family": "special_charge_up",
"rungs": [3, 12, 29, 41, 57],
"include_absent": true
},
"constraints": ["one_rung_per_family"],
"outputs": {
"aggregates": true,
"tables": true,
"diagnostics": true,
"figures": false
},
"description": "Test SCU response across rungs",
"parent_hypothesis": "h001"
}
Result File Format
{
"spec_id": "20250607_142531",
"spec_path": "20250607_142531__f18712__family-1d-sweep.json",
"feature_id": 18712,
"experiment_type": "family_1d_sweep",
"aggregates": {
"mean_delta": 0.35,
"std_delta": 0.12,
"n_samples": 500,
"custom": {
"threshold_rung": 41,
"max_rung_delta": 0.52
}
},
"tables": {
"rung_deltas": {
"name": "rung_deltas",
"columns": ["rung", "mean_delta", "std_error", "n"],
"rows": [
{"rung": 3, "mean_delta": 0.05, "std_error": 0.02, "n": 100},
{"rung": 12, "mean_delta": 0.12, "std_error": 0.03, "n": 100}
]
}
},
"diagnostics": {
"relu_floor_detected": false,
"relu_floor_rate": 0.02,
"n_contexts_tested": 500,
"warnings": []
},
"success": true,
"duration_seconds": 45.3
}
File Locations
- Specs:
/mnt/e/mechinterp_runs/specs/ - Results:
/mnt/e/mechinterp_runs/results/ - Figures:
/mnt/e/mechinterp_runs/figures/
Constraint Enforcement
The runner enforces constraints specified in the spec:
- one_rung_per_family: Prevents invalid multi-rung builds
- no_weapon_gating_if_relu_floor: Warns/skips if base activation too low
Violations are logged in diagnostics.constraint_violations and diagnostics.warnings.
Error Handling
If an experiment fails:
result.successisFalseresult.error_messagecontains the error- Partial results may still be available in
aggregates/tables
Weapon Analysis Workflow: weapon_sweep → kit_sweep
⚠️ IMPORTANT: Both weapon_sweep and kit_sweep are CORRELATIONAL analyses.
They show which weapons/kits are associated with high activation through observational grouping, NOT through counterfactual intervention. High activation for a weapon may be because:
- The weapon itself drives the feature
- Players of that weapon tend to use certain abilities
- The weapon's kit (sub/special) is the actual driver
Always cross-reference with ability analysis to distinguish weapon effects from ability effects.
When analyzing weapon-specific patterns, follow this workflow:
Step 1: Run weapon_sweep
{
"type": "weapon_sweep",
"feature_id": 18712,
"model_type": "ultra",
"variables": {"min_examples": 10, "top_k_weapons": 20}
}
Check result diagnostics for dominant weapon warning:
- If
diagnostics.warningscontains "DOMINANT WEAPON", one weapon has >2x delta aggregates.custom.dominant_weapon_detectedwill betrueaggregates.custom.recommended_followupwill be"kit_sweep"
Step 2: Run kit_sweep (if dominant weapon detected)
{
"type": "kit_sweep",
"feature_id": 18712,
"model_type": "ultra",
"variables": {
"min_examples": 10,
"top_k": 10,
"analyze_combinations": true
}
}
Output tables:
sub_stats: Activation statistics by sub weapon (mean, std, n, delta_from_global)special_stats: Activation statistics by special weaponcombo_stats: (if analyze_combinations=true) Statistics by sub+special pairs
Aggregates:
top_sub,top_sub_mean,top_sub_deltatop_special,top_special_mean,top_special_delta
Step 3: Cross-reference with splatoon3-meta
Use the splatoon3-meta skill to look up weapon kits:
- Read
.claude/skills/splatoon3-meta/references/weapons.md - Compare dominant weapon's kit with kit_sweep results
- Check if high-activation weapons share sub or special
Example: Feature 18712
weapon_sweep results:
- Octobrush Nouveau: +0.22 delta (DOMINANT - 2.4x second weapon)
- Rapid Blaster: +0.09 delta
kit_sweep results:
- Top special: Ink Storm (+0.18 delta)
- Top sub: Squid Beakon (+0.08 delta)
splatoon3-meta lookup:
- Octobrush Nouveau: Squid Beakon + Ink Storm
Conclusion: Feature encodes "Ink Storm spam builds" not "Octobrush Nouveau builds"
Known Limitations
Binary Tokens in family_2d_heatmap
LIMITATION: The family_2d_heatmap experiment type does NOT correctly handle binary abilities (comeback, stealth_jump, haunt, etc.).
The runner uses parse_token() which expects tokens in family_name_AP format (e.g., swim_speed_up_21), but binary abilities appear as just the token name without an AP suffix (e.g., comeback not comeback_10).
Workaround: Use manual 2D analysis code for binary abilities. See the Binary Ability Analysis Protocol in mechinterp-investigator.
Future Enhancement: Stable Tokens
A useful enhancement would be adding "stable tokens" to sweep experiments - tokens that are held constant across all conditions in the sweep. This would allow testing questions like:
- "How does SCU affect activation when Comeback is present?"
- "How does ISM scale on Stamper builds?"
Proposed spec format:
{
"type": "family_1d_sweep",
"variables": {
"family": "special_charge_up",
"stable_tokens": ["comeback", "stealth_jump"] // Hold these constant
}
}
This is not currently implemented.
See Also
- mechinterp-next-step-planner: Generate experiment specs
- mechinterp-state: Track research progress
- mechinterp-summarizer: Convert results to notes
- mechinterp-glossary-and-constraints: Domain reference
- splatoon3-meta: Weapon kit lookups and meta knowledge