Your coding agent builds fast.
Arnold makes sure it builds what you asked for.

Write requirements in plain English. Build with any AI coding agent. Arnold checks whether what got built matches what you asked for, and shows you exactly where docs and code have drifted apart.

Open-source. Works inside Claude Code, Cursor, Windsurf, and 30+ agents.

arnold · interactive demo
>

The problem with AI-generated code

You describe a product. A coding agent builds it. But it doesn't build everything you described, or it builds things you didn't ask for, or your spec goes stale the moment someone makes a manual edit.

The gap between what you said to build and what actually got built grows quietly. Documentation drifts. Requirements rot. Nobody notices until something breaks in production.

AI coding agents make it worse. They're fast, but they don't remember what you asked for last week. They don't check whether what they built actually satisfies your requirements. They just build, and move on.

That's documentation drift. Arnold exists to detect it.

Week 1: project starts clean...
REQUIREMENTS WRITTEN 100%
CODE MATCHES SPEC 95%
UNTRACKED CHANGES 5%
SPEC DRIFT 2%
CRITICAL: Spec drift at 80%. Code no longer matches requirements.
All requirements validated. Spec and code are in sync.

How It Works

1

Describe your product

Tell Arnold what you're building. It scaffolds structured docs organized by feature. Not a flat spec, a living wiki. /arnold:init

2

Arnold writes the docs

Feature overviews, core rules, acceptance criteria, and open questions. Plain English. Organized by what the feature IS, not what it does. /arnold:plan

3

Build with any coding agent

Use Claude Code, Cursor, Windsurf, or whatever you like. Or let /arnold:build guide construction straight from your docs.

4

Arnold checks for drift

/arnold:check reads every doc and every source file, then tells you exactly where they disagree. File paths, line numbers, specific values.

5

Fix and repeat

/arnold:resolve walks you through each mismatch. You choose: fix the code, update the docs, or skip. The gap stays visible until you decide.

What Arnold Does

Structured docs. Drift detection. Build guidance.

Scaffold Docs from Anything

New project, existing codebase, or a PRD someone emailed you.

Arnold generates structured docs organized by feature, not by document type. /arnold:init scans existing code and extracts what's already built. /arnold:spec decomposes an existing spec into Arnold's format. Greenfield or brownfield, Arnold meets you where you are.

Detect Documentation Drift

The feature nobody else has.

Run /arnold:check and Arnold reads every doc and every source file, then shows you where they disagree. "Docs say sessions expire after 24 hours. Code has SESSION_TTL = 72 hours. Which is right?" Snapshots make future checks instant. This is the one.

Build from Docs

Acceptance criteria drive the code.

Run /arnold:build and Arnold reads your feature docs, enumerates every acceptance criterion, builds code to satisfy them, then verifies each one with a code citation before marking it complete. The docs are the blueprint. The code proves it.

Full Lifecycle Commands

From 'what are we building' to 'is it still what we said.'

Init, plan, check, resolve, update, build, review, decide, bug, milestone, feature, diff, recap, status, spec, archive, help. From project kickoff to ongoing maintenance, Arnold covers the full development loop.

See Drift Detection in Action

Docs on the left. Code on the right. Arnold finds the gap.

docs/booking/booking-overview.md
## Capacity Rules
 
Each class has a maximum capacity.
 
- Maximum 20 spots per class
- Users cannot book if class is full
- Waitlist available when full
 
## Session Rules
 
- Sessions expire after 24 hours
- Rate limit: 5 attempts per minute
src/models/booking.rb
class Booking < ApplicationRecord
  belongs_to :user
  belongs_to :fitness_class
 
  MAX_CAPACITY = 3020
 
  validate :class_not_full
  validate :no_duplicate_booking
 
  SESSION_TTL = 72 * 60 * 6024 * 60 * 60
 
  RATE_LIMIT = 5 # per minute
end
🦕 Arnold Check Report

How Arnold Is Different

vs Claude Code Alone

CLAUDE.md persists context. Arnold structures it.

CLAUDE.md is great for general project context, but it's freeform. Arnold gives you a structured docs/ folder organized by feature, with overviews, flows, edge cases, and acceptance criteria. Then it checks whether the code actually matches those docs. Structure plus verification.

vs Spec Tools & Static Docs

Traditional specs are write-once, drift-forever.

Arnold keeps specs alive. /arnold:check compares your docs to your code and tells you where they've diverged. That's the feature nobody else has in an open-source coding agent extension.

vs Jira, Notion & Trackers

Those tools live outside your codebase.

Arnold puts docs next to your code as markdown files you version-control with Git. When docs and code drift, Arnold sees it. No syncing between systems. No stale tickets. One source of truth.

Get Started

1
Install (run from your project directory)
curl -fsSL ...Arnold/install.sh | bash
Run from your project root. Copies commands into .claude/commands/arnold/ and sets up CLAUDE.md.
2
Initialize your project
/arnold:init
Arnold asks what you're building, then scaffolds docs. For existing codebases, it scans your code first.
3
Build, then check
/arnold:check
After writing code, run check. Arnold reads docs and code, reports what's aligned and what's drifted.
4
Fix and repeat
/arnold:resolve
Walk through each drift item. Fix the code, update the docs, or skip. That's the loop.
Other install methods

Claude Code plugin:

/install ArtifactHQ/Arnold

Other agents: Arnold follows the Agent Skills standard. Copy the skills/ folders into your project:

  • Cursor: .cursor/rules/arnold.md
  • Windsurf: .windsurf/rules/arnold.md
  • Gemini CLI: GEMINI.md
  • Codex: AGENTS.md
ACCESS DENIED
"Ah ah ah, you didn't
say the magic word."
Ah ah ah! You didn't say the magic word.
Ah ah ah! You didn't say the magic word.
Ah ah ah! You didn't say the magic word.
NEDRY_PROTOCOL // ACTIVE
click anywhere or press esc to dismiss