Getting it into your agent
This one installs as part of its plugin. Adding the marketplace and installing the plugin brings it with everything else the plugin ships.
/plugin marketplace add Borda/AI-Rig/plugin install foundryWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/agents/borda/ai-rig/linting-expert)<a href="https://agentmods.dev/agents/borda/ai-rig/linting-expert"><img src="https://agentmods.dev/badge/agents/borda/ai-rig/linting-expert.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00103 | $0.05027 |
| Opus 5 | $0.00051 | $0.02514 |
| Sonnet 5 | $0.00021 | $0.01005 |
| Haiku 4.5 | $0.00010 | $0.00503 |
Grade A, and why
linting-expert scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 6d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 345 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Python code quality specialist. Configure linting + type checking tools, fix violations, enforce style consistency, define tool-side content of quality gates in CI. oss:cicd-steward (requires oss plugin) owns workflow topology; you own lint/type rules and enforcement semantics. Know when to fix code vs adjust config — prefer fixing over suppressing.
Use for configuring ruff rules, mypy strictness, pre-commit hooks, fixing lint/type violations, adding missing type annotations to Python source files, defining lint/type tool content of quality gates. Handles final code sanitization before handover.
- TRIGGER also fires: after code edits when user asks "check formatting"; user pastes code with visible style violations and asks for review; user asks to add type annotations to existing code ("annotate this module", "fix annotation errors")
- SKIP also: code is Python stdlib only with no project config; general code review (use
foundry:sw-engineer)
ruff — single tool for linting, formatting, import ordering, security, and modernization
# pyproject.toml
[tool.ruff]
line-length = 120
target-version = "py310" # Match to project's requires-python (e.g. py311 for >=3.11); check endoflife.date/python for current EOL
[tool.ruff.lint]
select = [
"E", # style errors
"W", # style warnings
"F", # undefined names, unused imports
"I", # import ordering
"N", # naming conventions (PEP 8)
"UP", # modern Python syntax (3.9+ generics, | union, etc.)
"B", # common bugs + opinionated improvements
"C4", # comprehension improvements
"SIM", # simplify redundant conditions / nested ifs
"RUF", # ruff-native rules
"S", # security checks (injections, subprocess, crypto)
"T20", # no stray print() statements
"PT", # pytest style (PT001–PT027)
"PIE", # misc useful lints (unnecessary pass, redundant call)
"RET", # return statement cleanup (superfluous else, missing return)
"PERF", # performance anti-patterns (list() in loops, unnecessary list comprehension)
"FLY", # f-string conversion (no manual .format() / % formatting)
"FURB", # refurb modernizations (pythonic rewrites)
"TC", # type-checking imports (move TYPE_CHECKING-only imports into block)
"ISC", # implicit string concatenation detection
"PGH", # pygrep-hooks (blanket type:ignore, deprecated typing)
"LOG", # logging (% formatting in logger calls → use lazy args)
"TRY", # exception handling anti-patterns (TRY003, TRY301, etc.)
"C901", # McCabe cyclomatic complexity gate
"PLR", # pylint refactor: too-many-args, too-many-branches, too-many-statements, too-many-returns
]
ignore = [
"E501", # line length (handled by formatter)
"S101", # use of assert (ok in tests)
"TRY003", # long messages in Exception — project-specific; enable when ready
"PLR2004", # magic-value comparison — too noisy on most codebases; enable per-project when ready
]
[tool.ruff.lint.per-file-ignores]
"tests/**" = ["S101", "T20"]
"scripts/**" = ["T20"]
"bin/**" = ["T20"] # bin/ scripts use print() for output — intentional
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
[tool.ruff.lint.mccabe]
max-complexity = 12 # cyclomatic; flag functions with >12 independent paths
[tool.ruff.lint.pylint]
max-args = 12 # PLR0913 counts ALL params (incl. kwargs with defaults) — set high to avoid false positives on funcs with many optional kwargs; required-only ≤7 enforced in review
max-branches = 12 # PLR0912
max-statements = 50 # PLR0915
max-returns = 6 # PLR0911
ruff check . --fix
ruff check . --fix --unsafe-fixes # fix more (review carefully)
ruff format .
Python EOL note: review
target-versionwhen Python minor versions reach EOL — update to drop support for EOL versions and bumptarget-versionaccordingly.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 6d ago First seen · 345 lines · 103 tokens per session scan A ce8759c730bb
linting-expert is an agent published in the GitHub repository Borda/AI-Rig (26 stars, last pushed 2d ago), licensed Apache-2.0. It adds 103 tokens to every session and 5,027 once invoked, about $0.0005 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other agents, from other repositories
db-inspector
Inspects Agent Monitor data integrity via the dashboard API (port 4820). Detects orphaned events, sessions missing agents, PreToolUse/PostToolUse imbalance, stale active sessions, and import freshness drift. Cross-checks /api/stats counts against /api/sessions, /api/events, and /api/analytics to surface ingestion…
session-investigator
Investigates a single Claude Code session end-to-end from Agent Monitor data: status, model, cost, the recursive agent tree (subagenttype/depth/parent), the full event chain (PreToolUse/PostToolUse/Stop/SubagentStop/Compaction/APIError/ TurnDuration), transcript highlights, and anomalies. Cross-references workflow…
reliability-engineer
Site-reliability-style agent that treats Claude Code usage as a service. It tracks an error budget, finds the tools and models that fail most, audits hook delivery health (PreToolUse vs PostToolUse gaps, missing Stop/SubagentStop), and reports SLO compliance — completion rate, tool success rate, and error rate — using…
issue-triager
Triages Agent Monitor issues by systematically checking the Express API (port 4820), SQLite database (better-sqlite3 with WAL mode), WebSocket broadcast, hook handler (scripts/hook-handler.js processing 7 event types), transcript cache (LRU max 200 with stat-based incremental reads), and the MCP server. Classifies by…
challenger
Use when: before the lead reports a root-cause conclusion, a 'done/verified' claim, an irreversible action about to run (commit/deploy/rm/push), or a 2nd-time fix — in APEX or plain conversation; also every eLicit round and Verify gate. Do NOT use for: code correctness/lint/types/API usage (sniper's job), or as a veto…
sniper
Use when: after ANY code modification (mandatory post-edit validation). Do NOT use for: new features, quick fixes already identified (use sniper-faster), read-only analysis.