run-benchmark-5a7bd9 — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited run-benchmark-5a7bd9 (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You are running an ARC-AGI benchmark. You are the game-playing agent. You will observe grid data, reason about patterns, choose actions, and submit them. Your goal is to complete as many levels as possible, as efficiently as possible (fewer actions = higher score).
You MUST NOT read, open, or examine the Python source code of game environments located under environment_files/ (or wherever environments_dir points). You also must NOT read arc-agi or arcengine library source code to understand game mechanics.
Understanding of game mechanics must come ONLY from:
This is a fundamental requirement of the benchmark. Reading source code would invalidate the benchmark results. If you encounter errors, debug them using error messages and the API documentation in this skill, not by reading library internals.
Determine the venv paths. Do NOT try to source activate scripts.
if [ -f ".arc-agi-venv/bin/python" ]; then
VENV_PYTHON=".arc-agi-venv/bin/python"
elif [ -f ".arc-agi-venv/Scripts/python.exe" ]; then
VENV_PYTHON=".arc-agi-venv/Scripts/python.exe"
else
echo "ERROR: Virtual environment not found. Run /arc-setup first."
exit 1
fi
echo "VENV_PYTHON=$VENV_PYTHON"Use $VENV_PYTHON for ALL Python commands below. Store the resolved path.
$VENV_PYTHON -c "
import json, sys
try:
with open('.arc-agi-benchmarks/config.json') as f:
cfg = json.load(f)
print(json.dumps(cfg, indent=2))
except FileNotFoundError:
print('ERROR: config.json not found. Run /arc-setup first.', file=sys.stderr)
sys.exit(1)
"Extract from the config:
environments_dir (default: ./environment_files)operation_mode (default: normal)default_seed (default: 0)default_max_steps (default: 500)default_max_resets (default: 10)The user may provide arguments after /arc-benchmark. Parse them as follows:
| Argument | Format | Default | Example |
|---|---|---|---|
| Game selection | bare word(s) or comma-separated | all | bt11, bt11,ls20, all |
--seed N | integer | from config | --seed 42 |
--max-steps N | integer | from config | --max-steps 200 |
--max-resets N | integer | from config | --max-resets 5 |
If the user provides no arguments, use defaults from config (run ALL games).
If the user specifies game IDs, store them as a list. If they say "all", set game selection to "all".
$VENV_PYTHON -c "
from arc_agi import Arcade, OperationMode
from arcengine import GameAction, GameState
print('arc-agi: OK')
"If this fails, tell the user to run /arc-setup first and stop.
$VENV_PYTHON -c "
import uuid, os, json
from datetime import datetime, timezone
run_id = str(uuid.uuid4())
run_dir = f'.arc-agi-benchmarks/runs/{run_id}'
os.makedirs(run_dir, exist_ok=True)
os.makedirs(f'{run_dir}/recordings', exist_ok=True)
print(json.dumps({'run_id': run_id, 'run_dir': run_dir}))
"Store the run_id and run_dir values for use in subsequent steps.
$VENV_PYTHON -c "
import json, sys
with open('.arc-agi-benchmarks/config.json') as f:
cfg = json.load(f)
env_dir = cfg.get('environments_dir', './environment_files')
from arc_agi import Arcade, OperationMode
op_mode = OperationMode(cfg.get('operation_mode', 'normal'))
arc = Arcade(operation_mode=op_mode, environments_dir=env_dir)
envs = arc.get_environments()
result = []
for env in envs:
game_id = getattr(env, 'game_id', getattr(env, 'id', str(env)))
tags = getattr(env, 'tags', [])
result.append({'game_id': game_id, 'tags': tags})
print(json.dumps(result))
"If no environments are found, tell the user and stop.
Based on the user's game selection:
all: use every game from the listbt11,ls20): filter to only those IDs. Warn if any ID is not found.logic): filter to games matching that tagStore the final list of game_ids to play.
Before writing run-meta.json, pause and recall — from your own session context — the setup that is actually shaping this run. Do NOT auto-detect from filesystem; enumerate what you genuinely used:
setup, run-benchmark, any shared skills like superpowers:brainstorming). Include skills from other plugins if you used them.playwright, github). Leave empty [] if none.Bash, Read, Write, Grep, Agent). Include subagent types if relevant.max_resets=10, use BFS solver, target level 7 only).Pass these as explicit literal values into the metadata-write script below. Re-do the recall at finalization time (Step 4c) so late additions are captured.
$VENV_PYTHON -c "
import json, hashlib
from datetime import datetime, timezone
# Read these from your parsed values:
run_id = '<RUN_ID>'
game_ids = <GAME_IDS_JSON> # e.g., [\"bt11\", \"ls20\"]
game_selection = '<GAME_SELECTION>' # The user's original selection: 'all', a tag name, or comma-separated IDs
seed = <SEED>
max_steps = <MAX_STEPS>
max_resets = <MAX_RESETS>
with open('.arc-agi-benchmarks/config.json') as f:
cfg = json.load(f)
config_hash = hashlib.sha256(json.dumps(cfg.get('harness_config', {}), sort_keys=True).encode()).hexdigest()
import importlib.metadata
try:
arc_agi_version = importlib.metadata.version('arc-agi')
except Exception:
arc_agi_version = 'unknown'
# YOU (the agent running this skill) must supply the following by recalling them
# from your own context — do NOT auto-detect. List every skill you actually invoked
# for this run, every MCP server you actually used, every tool/instruction class
# that shaped your behavior, and any ad-hoc instructions the user gave.
# Pass them as literal Python values before executing this block.
plugin_skills_used = <LIST_OF_SKILL_NAMES> # e.g. ['setup', 'run-benchmark', 'report']
mcp_servers_used = <LIST_OF_MCP_SERVERS> # e.g. ['playwright', 'babysitter'] or []
tools_used = <LIST_OF_TOOLS> # e.g. ['Bash', 'Read', 'Write', 'Agent']
ad_hoc_instructions = <LIST_OF_USER_DIRECTIVES> # e.g. ['max_resets=10', 'use BFS solver']
operator_notes = '<FREE_TEXT_SUMMARY>' # 1-2 sentences describing the setup/approach
meta = {
'run_id': run_id,
'harness': 'claude-code',
'timestamp': datetime.now(timezone.utc).isoformat(),
'duration_seconds': 0,
'game_set': game_selection,
'game_ids': game_ids,
'seed': seed,
'max_steps': max_steps,
'max_resets': max_resets,
'config_hash': config_hash,
'harness_config': cfg.get('harness_config', {}),
'status': 'running',
'arc_agi_version': arc_agi_version,
'plugin_version': '1.0.0',
# Agent-supplied setup recall (NOT auto-detected):
'plugin_skills_used': plugin_skills_used,
'mcp_servers_used': mcp_servers_used,
'tools_used': tools_used,
'ad_hoc_instructions': ad_hoc_instructions,
'operator_notes': operator_notes,
}
run_dir = f'.arc-agi-benchmarks/runs/{run_id}'
with open(f'{run_dir}/run-meta.json', 'w') as f:
json.dump(meta, f, indent=2)
print(json.dumps({'status': 'run initialized', 'run_id': run_id, 'games': len(game_ids)}))
"IMPORTANT: The angle-bracket placeholders (<RUN_ID>, <GAME_IDS_JSON>, <SEED>, etc.) in the code above are NOT shell or Python variables. You MUST substitute them with actual literal values before running the command. For example, replace <RUN_ID> with the actual UUID string, <SEED> with the integer 0, etc. Either embed values directly as Python literals or write them to a temporary JSON file and read from Python.
Tell the user:
Starting benchmark run<run_id>with<N>games, seed=<seed>, max_steps=<max_steps>, max_resets=<max_resets>
For EACH game_id in the selected game list, perform the following sub-steps. Track progress and report after each game.
Copy the game driver script from the plugin's scripts directory to the run directory, then initialize the game.
cp "$(dirname "$0")/../plugins/arc-agi-benchmarker/skills/run-benchmark/scripts/game_driver.py" \
.arc-agi-benchmarks/runs/<RUN_ID>/game_driver.py 2>/dev/null || \
cp plugins/arc-agi-benchmarker/skills/run-benchmark/scripts/game_driver.py \
.arc-agi-benchmarks/runs/<RUN_ID>/game_driver.py 2>/dev/null || \
# If the plugin path is not found, locate it from the plugin cache:
find ~/.claude/plugins -path "*/arc-agi-benchmarker/*/scripts/game_driver.py" -exec cp {} .arc-agi-benchmarks/runs/<RUN_ID>/game_driver.py \; 2>/dev/nullNOTE: The game driver script is at skills/run-benchmark/scripts/game_driver.py relative to the plugin root. You need to find the actual installed path. Common locations:
plugins/arc-agi-benchmarker/skills/run-benchmark/scripts/game_driver.py~/.claude/plugins/cache/arc-agi-benchmarker/*/skills/run-benchmark/scripts/game_driver.pyIf the copy fails, you may write the driver script inline (see scripts/game_driver.py for the reference implementation).
Then initialize the game by writing an init request and running the driver:
$VENV_PYTHON -c "
import json
run_dir = '.arc-agi-benchmarks/runs/<RUN_ID>'
request = {'command': 'init'}
with open(f'{run_dir}/action_request.json', 'w') as f:
json.dump(request, f)
"
$VENV_PYTHON .arc-agi-benchmarks/runs/<RUN_ID>/game_driver.py \
.arc-agi-benchmarks/runs/<RUN_ID> \
<GAME_ID> \
<SEED> \
.arc-agi-benchmarks/runs/<RUN_ID>/action_request.jsonIMPORTANT: The angle-bracket placeholders (<RUN_ID>, <GAME_ID>, <SEED>) are NOT variables. You MUST substitute them with actual literal values before running the command.
Parse the observation JSON output. The JSON result is always the LAST line of stdout. Earlier lines may contain INFO log messages from arc_agi -- ignore them. Alternatively, read the observation from observation_<GAME_ID>.json which the driver writes to disk.
Note the frame, state, available_actions, and action_details.
Note on recordings: Recordings are saved by arcengine using the naming convention {game_id}.{agent_type}.{max_actions}.{guid}.recording.jsonl within the recordings directory (under a scorecard ID subdirectory).This is where YOU (Claude Code) analyze the game state.
Read the frame data from the observation. The frame is a list of 2D integer arrays (grid layers). Analyze it as follows:
#### How to Read ARC-AGI Grids
frame is a list of layers. Each layer is a 2D array (rows x columns) of integers.0 to 15 or higher:0 = black / empty / transparent1-15 = distinct colorslen(frame) and examine each layer.#### Grid Layout Patterns
ARC-AGI games typically organize the 64x64 grid into regions:
#### Pattern Analysis Strategy
When observing a frame, look for:
#### Multi-Level Learning
Games have multiple levels (typically 5). The SAME rule applies across all levels. Use this to your advantage:
#### Game Type Recognition
Identify the game type from the available actions:
is_complex: true): Require x,y coordinates targeting specific grid cells. You must figure out WHERE to click.#### Troubleshooting: When Actions Seem to Do Nothing
This is common and does NOT mean the action failed. Possible reasons and strategies:
Based on your analysis, select an action from available_actions.
Simple actions (where action_details[action].is_complex is false):
Complex actions (where action_details[action].is_complex is true):
x and y coordinates (integers) indicating a position on the grid.x is the column index (0-based from left)y is the row index (0-based from top)Submit the action by writing an action request JSON file and running the game driver:
$VENV_PYTHON -c "
import json
run_dir = '.arc-agi-benchmarks/runs/<RUN_ID>'
request = {
'command': 'step',
'action': 'ACTION_NAME_HERE',
'reasoning': {'thought': 'YOUR_REASONING_HERE'}
}
# For complex actions (is_complex=True), add data with x,y coordinates:
# request['data'] = {'x': COLUMN, 'y': ROW}
with open(f'{run_dir}/action_request.json', 'w') as f:
json.dump(request, f)
"
$VENV_PYTHON .arc-agi-benchmarks/runs/<RUN_ID>/game_driver.py \
.arc-agi-benchmarks/runs/<RUN_ID> \
<GAME_ID> \
<SEED> \
.arc-agi-benchmarks/runs/<RUN_ID>/action_request.jsonReplace the following angle-bracket placeholders in the Python code with actual values (embed literals directly):
<RUN_ID>: the current run ID (embed as a Python string literal)<GAME_ID>: the current game ID (embed as a Python string literal)<SEED>: the seed value (embed as a Python integer literal)ACTION_NAME_HERE: the GameAction enum name (e.g., ACTION1, ACTION3)YOUR_REASONING_HERE: your reasoning for this actionrequest['data'] line and set COLUMN (x) and ROW (y) to integer valuesIMPORTANT: Action parameters (action name, reasoning, coordinates) are written to a JSON file and read by the driver script. This avoids shell injection and SyntaxError issues. Never embed free-form text directly in Python source via shell variables.
IMPORTANT: Parse only the LAST line of stdout as JSON. The driver may print INFO log lines before the JSON result. Alternatively, read observation_<GAME_ID>.json from the run directory.
After each step, check the state field in the observation:
| State | Meaning | Action |
|---|---|---|
NOT_FINISHED | Game continues | Go back to 3b (observe and reason) |
WIN | All levels completed! | Report success, proceed to next game |
GAME_OVER | Failed the current level | Check reset budget (see below) |
On GAME_OVER:
Check the session's reset count from the observation output (resets field):
If resets < max_resets:
$VENV_PYTHON -c "
import json
run_dir = '.arc-agi-benchmarks/runs/<RUN_ID>'
request = {'command': 'reset'}
with open(f'{run_dir}/action_request.json', 'w') as f:
json.dump(request, f)
"
$VENV_PYTHON .arc-agi-benchmarks/runs/<RUN_ID>/game_driver.py \
.arc-agi-benchmarks/runs/<RUN_ID> \
<GAME_ID> \
<SEED> \
.arc-agi-benchmarks/runs/<RUN_ID>/action_request.jsonThen go back to 3b (observe and reason) using the new observation. Rethink your strategy based on what you learned.
If resets >= max_resets: Report failure for this game and proceed to the next game.
On max steps exceeded (step_number >= max_steps): Report timeout for this game and proceed to the next game.
After completing (or abandoning) each game, report:
Game: <game_id> | State: <WIN/GAME_OVER/TIMEOUT> | Levels: <completed>/<total> | Steps: <N> | Resets: <N>After all games have been played:
Run the finalization script from the plugin's scripts directory. The script replays all games to populate the scorecard, then saves scorecard.json, game-results.json, and updates run-meta.json.
$VENV_PYTHON plugins/arc-agi-benchmarker/skills/run-benchmark/scripts/finalize.py \
.arc-agi-benchmarks/runs/<RUN_ID> \
<SEED>NOTE: Find the finalize.py script in the same location as game_driver.py (plugin root or cache). If the path doesn't work, try:
find ~/.claude/plugins -path "*/arc-agi-benchmarker/*/scripts/finalize.py" -exec $VENV_PYTHON {} .arc-agi-benchmarks/runs/<RUN_ID> <SEED> \;The script reads game_ids from run-meta.json automatically.
Run the environment scores script:
$VENV_PYTHON plugins/arc-agi-benchmarker/skills/run-benchmark/scripts/env_scores.py \
.arc-agi-benchmarks/runs/<RUN_ID>Same path resolution as finalize.py.
After all files are saved, print a summary:
============================================
ARC-AGI Benchmark Run Complete
============================================
Run ID: <run_id>
Games Played: <N>
Overall Score: <score>
Levels Completed: <completed> / <total>
Total Actions: <N>
Duration: <seconds>s
Per-Game Results:
+-----------+-------+--------+---------+--------+
| Game | Score | Levels | Actions | State |
+-----------+-------+--------+---------+--------+
| bt11 | 85.2 | 4/5 | 32 | G_OVER |
| ls20 | 100.0 | 5/5 | 20 | WIN |
+-----------+-------+--------+---------+--------+
Results saved to: .arc-agi-benchmarks/runs/<run_id>/
============================================Each game uses its own session file from the start: session_<game_id>.json. The game driver script creates and updates this file automatically. There is no generic session.json -- each game is isolated by design.
This means:
session_<game_id>.json directly to replay actions and build the final scorecard{'is_reset': True} to the action history and increments the reset counter. The session file is updated in-place. Only the init command creates a fresh session, which happens once per game at the start.NEVER construct GameAction by integer value: GameAction(6) will raise ValueError: 6 is not a valid GameAction because the enum internally uses composite tuple values.
ALWAYS use name-based lookup: GameAction['ACTION6'] works correctly.
This applies everywhere: the game driver replay loop, the finalization replay, and any custom scripts.
If arc.make() fails for a game:
If env.step() raises an exception:
The game driver prints INFO log lines from arc_agi before the JSON result. To parse correctly:
observation_<GAME_ID>.json from the run directory (the driver writes this file on every invocation)Recordings are automatically saved by arcengine when save_recording=True. They are stored under the recordings_dir you passed to Arcade(), using the naming convention {game_id}.{agent_type}.{max_actions}.{guid}.recording.jsonl (within a scorecard ID subdirectory). After the run, verify recordings exist:
ls .arc-agi-benchmarks/runs/<run_id>/recordings/
# Recordings will be in subdirectories under the scorecard IDIf the benchmark is interrupted:
run-meta.json will still have status: "running"When choosing actions, follow this approach:
Your score depends on efficiency. Scores are on a 0.0 to 1.0 scale internally (multiplied by 100 only for display):
min((baseline_actions / your_actions) ^ 2, 1.0)game_score = sum(level_score[i] * (i+1)) / sum(range(1, n_levels+1)). For example, with 5 levels the denominator is 1+2+3+4+5=15, and level 3's score is multiplied by 3.Maximize your score by using as few actions as possible to complete each level.
render_mode=None. NEVER use terminal-fast -- it produces ANSI escape codes you cannot parse.$VENV_PYTHON (the shell variable set in Step 1a), never system Python.reasoning parameter in env.step() must be a dict (e.g., reasoning={'thought': 'your reasoning here'}). The API expects dict[str, Any], not a plain string.operation_mode from config: OperationMode(cfg.get('operation_mode', 'normal')). Do NOT hardcode OperationMode.OFFLINE.get_scorecard() method returns a JSON string (via str()). Call it BEFORE close_scorecard(). The close_scorecard() return value is an EnvironmentScorecard object -- do NOT use model_dump() on it (it doesn't work). Use json.loads(str(arc.get_scorecard())) instead.After the benchmark run is complete and the final summary has been printed, invoke the report skill to generate a formatted report:
Now invoke /arc-agi-benchmarker:report to generate the benchmark report for this run.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.