maintainability-agent docs
Help

What the analyzer pool runs

The validated analyzer pool is the primary evidence source. Built-in detectors always run as the fallback for concepts the selected analyzers cannot measure. The report names the evidence tier used for its estimate; missing evidence is not a clean result.

Configuration selects tools by concern, depth, license policy, language, and explicit allow/deny rules. analyzers.run controls whether the pool runs; explicit per-call choices override it. Tool acquisition remains opt-in: a user may enable analyzers.acquire_tools in user-tier configuration, but the audited tree cannot enable it.

Every selected tool records an outcome and version or an unavailable reason. When a selected analyzer cannot run, the top-level environment_work_order names the tool, an install command, and the concepts installation would restore. The chat host surfaces that order rather than hiding it inside a JSON report body.

Language decides which tools are eligible, so the pool a repository gets is not the pool the catalog holds. A tool is offered only for languages it declares. That cuts both ways: a language the built-in scanner cannot parse may still be measured by an adapter, and a language the scanner parses may still have no adapter available — Fortran gained one in 1.5.0 (fortitude), but it emits verdicts and cannot supply a declaration population, so the built-in scanner remains the only path to one there. Where neither layer can measure a concept, the report withholds rather than estimates.

Selection filters the catalog by the configured policy. Source-read and artifact-read adapters compose in one report without manufacturing agreement across unlike findings (tests/test_d15_composition.py; D15 in the chat-surface defect register).

Analyzers your own pipeline runs

This tool runs a pinned handful of the analyzers it catalogs. The rest run where you already run them — a .NET build runs the Roslyn analyzers, and executes code from the repository it builds, which this tool never does — and it reads what they wrote (Decision 17). Declare each SARIF file in maintainability-agent.json, or answer declare at first-run setup:

"analyzers": {"pipeline_results": [
  {"path": "artifacts/roslyn.sarif", "covers": ["style", "documentation", "dead-code"]}
]}

covers is yours to state, from the same concerns analyzers.concerns takes, because one file can mix rule families. A declared file turns those concerns from unexamined to examined for the languages its results name — add "languages": ["C#"] for a clean run that names no file. Its findings are listed and, for now, do not move the grade. The report says when the file is older than the last commit, and when a declared file cannot be read.