How Verdict works
Each layer is a Bob custom mode that emits structured JSON. The next layer reads it. The synthesis at the end calls a deterministic MCP tool to find the cross-layer match — guaranteeing the killer line fires when it should.
Six sequential layers
Semantic Diff
What changed in meaning. Function signatures, return types, invariants, lifecycle. Ignores whitespace, formatting, and renames.
Blast Radius
What else in the full repository depends on what changed. Uses @file references to read every potentially affected file.
Mutation Audit
Which surviving mutations represent real bugs. Classifies by type and severity. CRITICAL = auth, payment, data integrity.
Incident Mining
What broke here before. Parses INCIDENTS.md and git log for fix:, hotfix:, revert:, rollback:, INC- commits.
Reviewer Questions
Exactly three specific risk questions. Each must reference a finding from a prior layer. No style, no 'have you considered'.
Synthesis
Killer line fires hereOne GitHub comment. TL;DR + Verdict + 5 sections. If cross-layer match exists, TL;DR sentence 1 is the killer line — non-negotiable.
Three tools, one moment.
The verdict-tools MCP server is FastMCP-based and exposes 3 tools to Bob. The third is the one that fires the killer line.
{
"mcpServers": {
"verdict-tools": {
"command": "python",
"args": ["packages/mcp-server/server.py"]
},
"mutmut": {
"command": "uvx",
"args": ["mutmut-mcp"]
}
}
}Each layer is just JSON in, JSON out.
The 6-layer split means every step is independently testable, swappable, and observable. The Python harness orchestrates Bob Shell calls; the MCP server provides deterministic tools; the cross-layer match is computed in Python before synthesis — so the killer line cannot be hallucinated.
Bob plans the pipeline. Bob runs the pipeline. The pipeline produces the killer line.