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.
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.
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.
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.
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.
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.
A skill's description under-claims (the skill never triggers, dead code) or over-claims (it triggers on the wrong queries and pollutes context).
An always-loaded rule so long it crowds out everything else. Token estimate per audit, with concrete tighten-without-changing-meaning rewrites.
.claude/skills/cloudflare/SKILL.md · line 47
### 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.
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 dismiss to suppress
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.
Free forever for OSS, on any number of repos.
Bills monthly. Annual: $190/repo/yr (2 months free).
For DX/platform teams shipping rules across many repos.
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.
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.
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.
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.
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.
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.
Dom Vinyard. Source lives in the dom.vin repo; the build log is on dom.vin.