AI Coding Agent Detection — Rules Reference

Rules verified: 2026-08-01 (panopticas 0.0.17). Unchanged since — 0.0.18 and 0.0.19 added no AI rules, and the inventory below matches AI_RULES as shipped in 0.0.19. Inventory below generated from: AI_RULES in src/panopticas/constants.py

Panopticas detects the file and directory artifacts of AI coding agents and tags each with three tags: AI, the product brand, and the kind of artifact.

CLAUDE.md                       -> ['AI', 'Claude', 'instructions']
.cursor/rules/style.mdc         -> ['AI', 'Cursor', 'rules']
.github/copilot-instructions.md -> ['GitHub', 'Git', 'AI', 'Copilot', 'instructions']

This document is the reference and evidence base: what is detected, the source that confirms each convention, and — equally important — what was rejected and why.

For the principles governing additions, see CLAUDE.mdAI Agent Detection. For the original design rationale, see changes/design/specs/2026-07-31-ai-agent-detection-design.md — but note its proposed rule table predates verification and contains entries that were subsequently rejected. This document supersedes that table.

How matching works

Three match modes, resolved in this precedence order. First hit wins; exactly one (product, kind) per path.

Order Mode Matched against
1 exact_filename the lowercased basename
2 path_contains a substring of the lowercased path — longest match wins
3 filename_suffix the end of the lowercased basename — longest wins

Detection is path-based only. A file is never opened to determine AI metadata.

Products are brand-level: Claude covers both Claude Code and Claude Desktop, Gemini covers the CLI and Code Assist. Files owned by no vendor use a pseudo-product — Agents, MCP, llms.txt.

The rejected list

This is the most important section for anyone extending the rules. Each entry below was proposed, investigated, and rejected. Re-adding one would mislabel repositories.

Candidate Proposed as Rejected because Source
.goose/ Goose config directory User-level, not a repository artifact. Goose stores global config at ~/.config/goose; the docs describe no repo-local .goose/ directory. Only .goosehints is repo-local, and that is detected. https://goose-docs.ai/docs/guides/context-engineering/using-goosehints/
.qodo/ Qodo config directory User-level, not a repository artifact — a home-directory cache. Qodo is the only candidate product rejected entirely; it contributes no rules. Qodo docs
.clinerules (single file) Cline rules file Current Cline docs describe only the .clinerules/ directory form at the project root. The single-file variant could not be confirmed as still read. The directory form is detected. https://docs.cline.bot/customization/cline-rules
amazonq.md Amazon Q instructions file Could not be confirmed against current AWS documentation. .amazonq/rules/ is documented and is detected. https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/context-project-rules.html

tests/test_ai_detection.py contains negative tests asserting these return None, so re-adding one fails the suite rather than shipping silently.

The user-level trap

Two of the four rejections share a cause worth naming. A path like ~/.config/<tool>/ or ~/.<tool>/ is not a repository artifact — panopticas scans repositories, so such a rule would essentially never fire, and if it did the match would mean something different from what the tag claims.

Several detected products have a user-level twin (~/.junie/AGENTS.md, ~/.augment/rules/, ~/.codeium/.codeiumignore, ~/.config/goose/.goosehints). Those rules are sound because the repository-level form is separately and explicitly documented. Check for that before adding.

Sources by product

Every rule was checked against the product’s own current documentation before being added. Weak evidence — a blog post, a third-party listicle — was treated as a lead to confirm elsewhere, never as confirmation.

Product Source
Aider https://aider.chat/docs/config/aider_conf.html
Amazon Q https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/context-project-rules.html
Augment https://docs.augmentcode.com/setup-augment/guidelines
Cline https://docs.cline.bot/customization/cline-rules
Continue https://docs.continue.dev/customize/deep-dives/rules
Gemini https://github.com/google-gemini/gemini-cli — docs/gemini-ignore.md
Goose https://goose-docs.ai/docs/guides/context-engineering/using-goosehints/
Junie https://junie.jetbrains.com/docs/guidelines-and-memory.html
Kilo Code https://github.com/Kilo-Org/kilocode — custom-rules.md
OpenHands https://docs.openhands.dev/usage/prompting/microagents-overview
Roo Code https://roocodeinc.github.io/Roo-Code/features/custom-instructions
Trae https://docs.trae.cn/ide/rules
Windsurf https://docs.devin.ai/desktop/cascade/memories

Claude, Copilot, Cursor, Codex and the vendor-neutral pseudo-products were treated as well-established and not individually cited.

Vendors that have moved or rebranded

Documentation hosts change more often than file conventions do. Confirmed during the 0.0.17 verification pass:

Product Docs moved Note
Windsurf docs.windsurf.comdocs.devin.ai Cognition/Devin. .windsurfrules is described as legacy but still read; .devin/rules/ is preferred. Brand name kept as Windsurf — the filenames belong to that era.
Kilo Code kilocode.aikilo.ai .kilocode/rules/ retained for backward compatibility; .kilo/rules/ is current. Only the former is detected.
OpenHands docs.all-hands.devdocs.openhands.dev .openhands/microagents/ supported; .agents/skills/ is preferred for new work.
Roo Code docs.roocode.com → GitHub Pages

A rebrand is not a reason to rename the product tag. The tag names the convention’s origin, and repositories still contain the old files.

Known limitation: unanchored path matching

path_contains is a plain substring test, so a directory whose name ends with a fragment matches it: notes.claude/config.json tags as Claude. Every fragment begins with a dot, so ordinary paths cannot trip this, and it is consistent with how METADATA_RULES has always matched .github. Accepted deliberately; noted here so it is not rediscovered as a bug.

Re-verifying

AI_RULES encodes 20 vendors’ conventions, which change without notice. Two of the four rejections above were candidates that had already gone stale when proposed.

To re-verify: work down Sources by product, confirm each indicator still appears in current documentation, and check the rejected list in case a rejection has become valid. Record the outcome by updating this document’s Rules verified date.

The governing rule, from CLAUDE.md: a missing rule is better than a wrong one. A wrong rule mislabels a repository, and the label flows downstream into kospex where someone will act on it. Drop what cannot be confirmed.

Inventory

60 rules across 20 products. Generated from AI_RULES; regenerate rather than hand-edit.

Agents

Match Indicator Kind
filename .aiignore ignore
filename agents.md instructions

Aider

Match Indicator Kind
filename .aider.chat.history.md history
filename .aider.conf.yml config
filename .aider.input.history history
filename .aiderignore ignore

Amazon Q

Match Indicator Kind
path .amazonq/ config
path .amazonq/rules/ rules

Augment

Match Indicator Kind
filename .augment-guidelines instructions
path .augment/ config
path .augment/rules/ rules

Claude

Match Indicator Kind
filename claude.local.md instructions
filename claude.md instructions
filename claude_desktop_config.json config
path .claude/ config
path .claude/agents/ agent
path .claude/commands/ command
path .claude/hooks/ hook
path .claude/plugins/ plugin
path .claude/skills/ skill

Cline

Match Indicator Kind
path .clinerules/ rules

Codex

Match Indicator Kind
path .codex/ config

Continue

Match Indicator Kind
filename .continuerc.json config
path .continue/ config

Copilot

Match Indicator Kind
filename copilot-instructions.md instructions
path .github/chatmodes/ chatmode
path .github/instructions/ instructions
path .github/prompts/ prompt
suffix .chatmode.md chatmode
suffix .instructions.md instructions
suffix .prompt.md prompt

Cursor

Match Indicator Kind
filename .cursorignore ignore
filename .cursorindexingignore ignore
filename .cursorrules rules
path .cursor/ config
path .cursor/rules/ rules
suffix .mdc rules

Gemini

Match Indicator Kind
filename .aiexclude ignore
filename .geminiignore ignore
filename gemini.md instructions
path .gemini/ config

Goose

Match Indicator Kind
filename .goosehints instructions

Junie

Match Indicator Kind
path .junie/ config

Kilo Code

Match Indicator Kind
path .kilocode/ config
path .kilocode/rules/ rules

llms.txt

Match Indicator Kind
filename llms-full.txt docs
filename llms.txt docs

MCP

Match Indicator Kind
filename .mcp.json config
path .vscode/mcp.json config

OpenHands

Match Indicator Kind
path .openhands/ config
path .openhands/microagents/ skill

Roo Code

Match Indicator Kind
filename .roorules rules
path .roo/ config
path .roo/rules/ rules

Trae

Match Indicator Kind
path .trae/ config
path .trae/rules/ rules

Windsurf

Match Indicator Kind
filename .codeiumignore ignore
filename .windsurfrules rules
path .windsurf/ config
path .windsurf/rules/ rules