ADR-0021: The command line with the agent reporter is the primary agent surface; MCP and LSP are additive
- Status: Accepted
- Date: 2026-09-20
- Derives from: design.md § Rules an agent can implement and follow, § Where it would be ignored (MCP over CLI), § Two front-ends that will matter more than the MCP server, § Where each lands, § How to know, rather than believe
- Constrains: architecture.md § Agent surface
- Implemented by: Wave 1 plan, Wave 2 plan, Wave 3 plan
Context
Agents in Claude Code reach for Bash first and use an MCP server when it is the only door. They live in compiler and linter output. A separate ritual beside tsc, eslint, vitest and dotnet build is skipped.
Decision
- Wave 1: the
agentreporter (token-budgeted, fix-cost ordered, with member references and decision links),fix,examples,expires, line and column, stable ids, receipts,test,explainandexplain --plain,can-import,config lint,hooks install --claude-code(SessionStart brief, PreToolUseimpact, Stop affected cruise),attest, and--require-comment-token. - Wave 2:
docs(agents-md,contributing,skill),propose,impact,place,test --generate,decisions, the test adapters,sarifandjunit, andeslint-plugin-rulebearing. - Wave 3:
serve --mcp,serve --lsp, the Roslyn analyzer,guard --watch,--mode sourcefor .NET. All are thin loops over the same commands and the same cached graph; none has its own rule file. - Adoption is measured from wave 1 by the six signals in the design (first-run pass rate above 90%, one-turn median to green, authoring guardrails catching rules, Stop-hook p95 under 2 s,
fixon above 80% of rules, zero merged budget raises). If the first two do not move, the agent surface is cut back to theagentreporter and the hook.
Consequences
- Nothing in the agent surface may disagree with the gate, because it reads the same config and graph.
- The Stop hook's two-second budget is a performance requirement on
--affectedand the cache, not a nice-to-have.