Rules
Every rule, with its source.
73 rules in version 0.3.0, each resting on a vendor's documentation or a documented attack, read on a stated date. Every page says what the rule catches and why it matters, shows a bad and a good example, and tells you how to fix it and how to configure it in .asitisrc.json.
Each rule's doc, code and tests are open source: the rules on GitHub.
error 21 fail the build by default warning 39 note 13
Rule ids are what you see in every finding, in SARIF and in .asitisrc.json. Severities are the defaults; the config file can raise, lower or switch off any rule, and the strict preset turns notes into warnings. Security rules can be switched off in the config file or a baseline only, never with a comment in the file.
Hidden content and security
Content an agent reads but a reviewer does not see, and scripts or settings that put the machine at risk. These rules cannot be silenced with a comment in the file.
- bidi-control
Bidirectional control characters
error - hidden-comment
Comments hidden in rendered views
note - hidden-instruction
Hidden comment that reads like an instruction to the agent
error - hidden-styled-text
Inline style or the hidden attribute hides text
warning - invisible-char
Invisible Unicode characters
error - sec-encoded-blob
Decodes base64 or hex and runs the result, or hides a command in an encoding
warning - sec-hook-config
Project hook or settings command fetches remote code, calls the network or redirects the API
error - sec-mcp-inline-secret
A key or token is written in plain text in an MCP server or settings env block
error - sec-mcp-launcher
MCP server runs an unpinned package or image, a downloaded script, or connects over plain http
warning - sec-no-secret-deny
The folder has a .env file but no permissions.deny rule keeps Claude Code out of it
note - sec-permission-allow
Allow rule or trust flag skips the prompt for any shell command, network tool or interpreter
error - sec-permission-mode
Settings turn on bypassPermissions or skip its confirmation
warning - sec-remote-exec
Downloads code and runs it (curl or wget piped to a shell, and similar)
error - sec-safety-off
Turns off the agent's permission checks
warning - sec-script-instruction
A script's comment or string gives the agent covert instructions
warning - sec-script-invisible
Invisible or bidirectional characters in a skill script
warning - sec-secret-egress
Reads a secret and sends data over the network in the same script or block
error - sec-skill-allowed-tools
allowed-tools grants unscoped Bash, all tools, any interpreter or unscoped WebFetch
warning - sec-skill-arg-injection
Skill argument is pasted into a !command that runs when the skill loads
warning - sec-skill-binary
Executable binary inside a skill folder
warning - sec-skill-network
Skill script makes network calls
note - unclosed-comment
HTML comment never closes
warning - unsafe-path
File path contains control, bidi or invisible characters
warning
Format and vendor rules
The file is not read the way its author expects: frontmatter, required fields, values a tool rejects, links and imports that go nowhere, bytes that are not UTF-8.
- broken-import
@import names a file that does not exist
warning - broken-link
Relative link or anchor points to nothing
warning - compatibility-too-long
compatibility is longer than 500 characters
warning - description-too-long
Skill description is longer than 1,024 characters
error - encoding
File is not UTF-8
warning - field-type
A frontmatter field has the wrong type
error - final-newline
File with line breaks does not end with one
note - frontmatter-bom
A byte order mark comes before the frontmatter
warning - frontmatter-not-line-1
Frontmatter does not start on line 1
error - frontmatter-not-mapping
Frontmatter is valid YAML but not a key: value mapping
error - frontmatter-too-large
Frontmatter is too large to parse safely
error - frontmatter-unclosed
Frontmatter opens with --- and never closes
error - frontmatter-value-cut
An unquoted value is cut short at " #"
warning - frontmatter-yaml
Frontmatter is not valid YAML
error - import-outside-root
@import reaches outside the project
warning - invalid-utf8
File contains invalid UTF-8 bytes
warning - link-outside-root
Link points outside the project and was not checked
note - memory-type
Memory file type is not user, feedback, project or reference
warning - missing-applyto
Copilot instructions file has neither applyTo nor description
warning - missing-description
Required description field is missing
error - missing-frontmatter
A file that needs frontmatter has none
error - missing-name
Required name field is missing
error - mixed-eol
File mixes CRLF, LF or CR line endings
note - name-dir-mismatch
Skill name does not match its folder name
warning - name-format
Skill name is not lowercase letters, digits and single hyphens
error - name-reserved-word
Skill name contains anthropic or claude
note - name-too-long
Skill name is longer than 64 characters
error - never-applied
Cursor rule has no alwaysApply, globs or description
warning - nul-bytes
File contains NUL bytes
warning - orphan-memory
Memory topic file is not linked from MEMORY.md
warning - trailing-whitespace
Lines end in spaces or tabs that change nothing when rendered
note - unknown-key
A frontmatter key the reading tool ignores
note - xml-tag
Skill name or description contains an XML tag
warning
Context budget
What a file costs in context every session, and the vendor limits past which it is cut off or followed less reliably.
- body-tokens
SKILL.md body is over about 5,000 tokens
warning - codex-chain-over-budget
AGENTS.md files from the root down exceed Codex's 32 KiB
warning - context-cost
Over 5,000 tokens load every session from this file
note - description-truncated
description plus whentouse is cut in the skill listing
warning - duplicate-across-files
The same rule is in two files one tool loads every session
warning - duplicate-rule
The same rule appears twice in one file
warning - length
File is longer than the vendor recommends or reads
warning
Drift between files
Two files that should agree and do not, or a file one agent reads and another silently skips.
- agents-md-shadowed
Claude Code reads CLAUDE.md here and skips AGENTS.md
warning - agents-md-unread-variant
AGENTS.override.md, AGENTS.local.md or .agents/*.md is read by some agents only, or by none
note - claude-local-hides-agents-md
A CLAUDE.local.md switches off the AGENTS.md fallback
warning - contradiction
Two lines in one file say opposite things
warning - cross-file-contradiction
Two files loaded for the same agent, or mirrored for different agents, contradict
warning - instruction-drift
Mirrored instruction files share most rules but not all
note
Configuration
.asitisrc.json, suppression comments and the agent config files the opt-in audit reads.
- config-json-invalid
Agent config file is not valid JSON
error - suppression-not-allowed
Inline suppression of a security rule
warning - unknown-suppression
asitis-disable names a rule that does not exist, or no rule at all
warning - unused-suppression
asitis-disable comment suppresses nothing
note
Reserved for later releases
These ids are in the registry so config files and later work agree on them, but no code emits them in 0.3.0. They are listed so a link from a config hint lands somewhere useful, and they are not part of the 73 above.
63 reserved ids
- agent-enum
Subagent permissionMode, memory, isolation, color or effort has an unknown value
planned - agent-model
model is not inherit, a Claude alias or a Claude model id
planned - agent-name-format
Subagent name contains a colon, starts with a hyphen or is too long
planned - agent-plugin-ignored-key
Plugin subagent uses a field plugins ignore
planned - agent-skills-limit
Subagent lists more than 32 skills
planned - bypass-permissions
Subagent sets permissionMode: bypassPermissions
planned - chatmode-renamed
*.chatmode.md file
planned - claude-local-misplaced
CLAUDE.local.md inside .claude/
planned - claude-md-too-large
CLAUDE.md is larger than 4 MiB
planned - cline-paths-empty
Cline rule has paths: []
planned - cline-paths-type
Cline rule paths is not a list of strings
planned - copilot-exclude-agent
excludeAgent is not code-review or cloud-agent
planned - copilot-instructions-location
*.instructions.md outside .github/instructions/
planned - copilot-review-length
Copilot instructions longer than 1,000 lines
planned - cursor-ignored-fields
alwaysApply: true together with globs or description
planned - cursor-legacy-deprecated
.cursorrules is the legacy format
planned - cursor-rule-md-ignored
Plain .md file under .cursor/rules
planned - custom-agent-description
Custom agent has no description
planned - custom-agent-github-ignored
argument-hint or handoffs on an agent GitHub.com runs
planned - custom-agent-infer
Custom agent uses infer
planned - custom-agent-prompt-size
Custom agent body longer than 30,000 characters
planned - custom-agent-target
Custom agent target is not vscode or github-copilot
planned - empty-instructions
Instruction file is empty or whitespace
planned - gemini-import-depth
GEMINI.md import chain deeper than 5
planned - gemini-import-outside
GEMINI.md import resolves outside the project
planned - generated-file-edited
A rulesync or Ruler output file differs from its source
planned - hook-event-unknown
Hook event name is not a documented event
planned - hook-once-ignored
once on a subagent hook
planned - hook-type-unknown
Hook handler type is not command, http, mcp_tool, prompt or agent
planned - memory-modified-format
Memory file modified is not an ISO 8601 timestamp
planned - output-style-field
Output style keep-coding-instructions or force-for-plugin is not a boolean
planned - plugin-claude-md-ignored
CLAUDE.md at a plugin root
planned - portable-boolean
Skill boolean written as yes, no, on, off, 1 or 0
planned - prompt-agent-value
Prompt file agent is not ask, agent, plan or a custom agent in the repo
planned - prompt-mode-deprecated
Prompt file uses mode
planned - rule-paths-bracket
Rule paths glob has an unescaped [
planned - rule-paths-budget
Rule paths expand to more than 1,000 patterns
planned - sec-agent-workflow
CI workflow runs an agent on untrusted input with shell or write access
planned - sec-config-drift
An approved MCP server, hook, skill or steering file changed
planned - sec-covert-instruction
Visible text tells the agent to hide something from the user or act covertly
planned - sec-hidden-markup-ext
Text hidden in picture, alt, title, off-screen or collapsed markup
planned - sec-image-exfil
External image URL built from data, or an instruction to render one
planned - sec-invisible-ext
Variation selectors, interlinear annotations or Private Use runs
planned - sec-mixed-script
A word or host mixes Latin with look-alike letters
planned - sec-nested-override
A nested instruction file overrides its parents
planned - sec-skill-typosquat
Skill name is one or two edits from a well-known skill or vendor
planned - sec-smuggled-text
Hidden characters decode to readable text
planned - secret-in-steering
Steering file contains something shaped like an API key or private key
planned - skill-arguments-type
arguments is neither a string nor a list of strings
planned - skill-compat-empty
compatibility is present but empty
planned - skill-enum
effort, context or shell has a value Claude Code does not accept
planned - skill-filename-case
SKILL.md is not spelled in upper case
planned - skill-fork-only
agent or background set without context: fork
planned - skill-listing-budget
Skill listings exceed the listing budget
planned - skill-metadata-type
metadata is not a map of strings to strings
planned - skill-nested-reference
A file SKILL.md links to links to another local file
planned - skill-nonstandard-key
SKILL.md key outside the Agent Skills spec
planned - skill-reserved-name
Skill uses a reserved name
planned - skill-shadowed-command
A command and a skill share a name
planned - skill-shell-injection
Skill runs a shell command before the prompt is sent
planned - windsurf-legacy-file
.windsurfrules is the legacy single file
planned - windsurf-trigger
Windsurf trigger is not always_on, model_decision, glob or manual
planned - windsurf-trigger-incomplete
glob trigger without globs, or model_decision without description
planned
Missing a rule, or found a false positive?
Zero tolerance for noise is the goal: a rule that fires on a good file is a bug. Open an issue with the line it fired on, or read the plugin page for how the linter runs in Claude Code, in CI and in your browser.