Catch the contradictions in your AGENTS.md before your agents do.

agentlint reviews every pull request for contradictions, vague rules, broken pointers, and hook/file mismatches across your CLAUDE.md, AGENTS.md, Cursor rules, and harness scripts. Two-click install. First repo free, forever.

What it catches

The seven failure modes only a careful reader catches

P0

Cross-rule contradictions

Two rules that both load and disagree. Your AGENTS.md says "never call wrangler deploy"; the cloudflare skill quietly tells the agent to run it under "Manual deploy". Whichever fires first wins.

P0

Broken pointers

A rules file references ./ideas/README.md; a PR moves the file. The agent following the link hits a dead end. Caught deterministically — verbatim file:line, not LLM speculation.

P1

Hook ↔ rule disagreement

Your SessionStart hook injects "use pnpm"; CLAUDE.md says bun. The dynamic content silently wins; a careful reader of the static files would never see it.

P1

Vague instructions

Rules an agent can't act on. "Be thoughtful". "Use good judgement." Surfaced with the exact quoted text and a concrete rewrite that says what to do.

P1

Description drift in skills

A skill's description under-claims (the skill never triggers, dead code) or over-claims (it triggers on the wrong queries and pollutes context).

nit

Always-on bloat

An always-loaded rule so long it crowds out everything else. Token estimate per audit, with concrete tighten-without-changing-meaning rewrites.

What it looks like in your PR

One inline comment per finding. Severity-prefixed. Quiet on clean PRs.

A agentlint bot commented on .claude/skills/cloudflare/SKILL.md · line 47
[P0] Cloudflare skill permits direct deploy while AGENTS.md forbids it
### Manual deploy (out-of-band)

If you need to push a build without going through git:

npx wrangler deploy

The Cloudflare skill (conditionally loaded) tells the agent to run npx wrangler deploy. AGENTS.md (always-loaded) explicitly states "Never publish straight to Cloudflare — never call wrangler deploy." The skill is conditionally loaded, the AGENTS rule is always-loaded, so under any deploy-related query the contradiction is live.

Suggested change
Remove the "Manual deploy (out-of-band)" section from
.claude/skills/cloudflare/SKILL.md, or replace it with a
note directing the agent to push to git instead of using
wrangler deploy.
agentlint.net · React 👎 to flag false positive · Reply @agentlint dismiss to suppress

See the full audit on this repo →

Different from CodeRabbit / Greptile

CodeRabbit and Greptile review your code. agentlint reviews the rules your agents follow.

If your team agrees with itself in CLAUDE.md and AGENTS.md, your agent can stay focused. If those files contradict each other, no amount of code review will catch it — the agent already followed the wrong half.

Pricing

Per repo, not per seat. Cancel anytime.

Free

$0
  • 1 private repo (unlimited audits)
  • All checks
  • Public read-only reports
  • 30-day audit history
Install on GitHub

Free forever for OSS, on any number of repos.

Team

$99/mo
  • Up to 25 repos
  • SSO and audit log
  • Org-wide rule library
  • Slack digest
  • Priority support
Talk to Dom

For DX/platform teams shipping rules across many repos.

FAQ

What does agentlint actually read?

The agent-rules surface only — CLAUDE.md, AGENTS.md, GEMINI.md, .cursor/rules/*.mdc, .cursorrules, .clinerules, .windsurfrules, .aider.conf.yml, every .claude/skills/<name>/SKILL.md, every .claude/agents/*.md subagent, the harness configs (settings.json, .cursor/hooks.json), and every hook script in .claude/hooks/. We follow markdown-link cross-references one level deep so the auditor can compare a rule against the file it points at.

Will it block my CI?

No. We post a status check that's informational only. Branch-protection rules are yours to set; agentlint doesn't ship merge gates by default.

What if I disagree with a finding?

React 👎 to flag a false positive, or reply @agentlint dismiss to suppress that finding on this PR. Suppressions can be made permanent via a # agentlint: ignore comment in the offending file.

How do you decide which findings matter?

Every finding must quote actual text from the file. Speculation ("this could be improved") gets dropped at runtime. The deterministic broken-pointer check runs in code, not via the LLM, so we don't hallucinate dead links. Severity prefixes (P0 / P1 / nit) tell you whether to act now or queue for later.

Where's my data stored?

Bundle contents are sent to Cloudflare Workers AI (Mistral via the agentlint AI Gateway) for the audit, then discarded. The findings JSON is stored in Cloudflare KV with a 30-day TTL. Nothing is retained beyond that. We never train on your code or your rules.

Why not just use CodeRabbit / Greptile?

Use both. CodeRabbit and Greptile review your code; agentlint reviews the rules your agents follow. They are not the same surface area: a contradicting rule in AGENTS.md is invisible to a code reviewer, but it changes what your agent does on every turn.

Who built this?

Dom Vinyard. Source lives in the dom.vin repo; the build log is on dom.vin.