Benchmark
Compare Claude Code output with full config vs minimal config using standardized tasks per stack.From its SKILL.md
npx -y skills add luiseiman/dotforge --skill benchmarkAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 8 stars8 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 4 commands, including `git worktree add /tmp/bench-full-{{slug}} HEAD` and 3 more.
SKILL.md
4.2 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it
Benchmark
Compare the effectiveness of a project's full dotforge configuration against a minimal baseline by executing the same standardized task in two isolated worktrees.
Cost warning: Each benchmark runs Claude Code twice (full + minimal). Use sparingly and only after Fases 0-2 are working.
Prerequisites
- Project must have
.claude/settings.jsonandCLAUDE.md - Project must be a git repository with a clean working tree
- Task definitions must exist in
$DOTFORGE_DIR/tests/benchmark-tasks/
Step 1: Select task
- Detect project stacks from
.claude/.forge-manifest.jsonor infer from project files - Load matching task from
$DOTFORGE_DIR/tests/benchmark-tasks/{stack}.yml - If multiple stacks match, let user choose or run the first match
- If no stack matches, use
generic.yml
Display:
═══ BENCHMARK SETUP ═══
Project: {{name}}
Stack detected: {{stack}}
Task: {{task title}}
Description: {{task description}}
⚠ This will run Claude Code twice in isolated worktrees.
Proceed? (yes/no)
Step 2: Prepare worktrees
Create two git worktrees from the current HEAD:
-
Full config —
git worktree add /tmp/bench-full-{{slug}} HEAD- Copy entire
.claude/directory as-is - Copy
CLAUDE.mdas-is
- Copy entire
-
Minimal config —
git worktree add /tmp/bench-minimal-{{slug}} HEAD- Create minimal
CLAUDE.mdwith only project name and "Build & Test" section - Create minimal
.claude/settings.jsonwith onlyallowedTools(no hooks, no deny list) - No
.claude/rules/, no hooks, no agents
- Create minimal
Step 3: Execute task
For each worktree, run the task prompt using Claude Code in non-interactive mode:
cd /tmp/bench-full-{{slug}}
claude --print "{{task prompt}}" --allowedTools "Bash,Read,Write,Edit,Glob,Grep"
Same for minimal worktree.
Capture for each run:
- files_created: count of new files (git diff --name-only --diff-filter=A)
- files_modified: count of modified files
- tests_passing: run the test command from task definition, count pass/fail
- lint_issues: run lint command from task definition, count issues
- errors: grep stderr for error patterns
- has_test: boolean — did Claude create a test file?
Step 4: Compare and report
═══ BENCHMARK RESULTS — {{project}} ═══
Task: {{task title}}
Stack: {{stack}}
Date: {{YYYY-MM-DD}}
Full Config Minimal Config Delta
Files created: {{N}} {{N}} {{+/-N}}
Tests created: {{yes/no}} {{yes/no}} —
Tests passing: {{N/M}} {{N/M}} {{+/-N}}
Lint issues: {{N}} {{N}} {{+/-N}}
Errors: {{N}} {{N}} {{+/-N}}
── ANALYSIS ──
{{if full is better across metrics:
"Full config prevented {{N}} lint issues and {{N}} errors.
ROI: rules + hooks justified for this project."}}
{{if similar:
"Minimal difference detected. Consider simplifying configuration
or running /forge rule-check to identify inert rules."}}
{{if minimal is better:
"⚠ Full config may be adding overhead without benefit.
Review rules for contradictions or excessive constraints."}}
Step 5: Cleanup
- Remove worktrees:
git worktree remove /tmp/bench-full-{{slug}}and minimal - Optionally save results to
~/.claude/metrics/{{slug}}/benchmark-{{date}}.json
Results JSON schema:
{
"project": "{{slug}}",
"date": "{{YYYY-MM-DD}}",
"stack": "{{stack}}",
"task": "{{task id}}",
"full": {
"files_created": 0,
"tests_passing": 0,
"lint_issues": 0,
"errors": 0,
"has_test": false
},
"minimal": {
"files_created": 0,
"tests_passing": 0,
"lint_issues": 0,
"errors": 0,
"has_test": false
}
}
Important constraints
- NEVER run benchmark automatically — always require explicit user confirmation
- NEVER push or commit from worktrees — they are disposable
- If Claude Code execution fails in either worktree, report the failure and still show partial results
- Timeout each run at 5 minutes — if Claude hasn't finished, capture partial state
- Clean up worktrees even on failure
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most evals benchmarks skills give in ~1.1k tokens
Counted across 499 of the 513 authors here whose files we hold, read 2026-09-06
- Spawn with-skill and baseline runs in the same turnin 31 of 499, across 24 files
- Keep SKILL.md under 500 linesin 31 of 499, across 24 files
- Draft assertions while test runs are in progressin 31 of 499, across 24 files
- Compare against the baseline after changesin 31 of 499, across 13 files
- Define evals before codingin 26 of 499, across 17 files
- Run evals frequently during developmentin 25 of 499, across 16 files
- Keep evals fastin 24 of 499, across 15 files
- Version evals with codein 24 of 499, across 15 files
- Generate the eval viewer before evaluating outputs yourselfin 24 of 499, across 17 files
- Generate an eval report after runsin 24 of 499, across 15 files
- Track pass@k metrics over timein 22 of 499, across 14 files
- Save a baseline before making changesin 21 of 499, across 9 files
Said here and by no other author read
- Detect project stacks from manifest or project files
- Load matching benchmark task for detected stack
- Use generic task when no stack matches
- Create two git worktrees from current HEAD
- Copy full configuration into one worktree
- Build minimal config with only name and allowedTools
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.