Reviewing before you push
Anyone can ask an assistant to review a diff. What redline review adds is the bound — only the rules that apply to the files you touched — and a finding contract the model cannot free-type.
Why bounding matters more than the model
Hand a model the composed standard for a sixteen-stack profile and it spends most of its attention on rules for languages your change never touched. The findings get worse, not better. redline review resolves the applicable stacks from the changed files and the prompt carries only those.
$ redline review # working tree vs the merge base $ redline review --staged # before you commit $ redline review --engine api --model qwen2.5-coder:14b
Two engines, and the default calls no model
- embedded (default) — emits the bounded prompt for the assistant already running the command. That is the design, not a stub: the CLI is usually being run by an assistant that already has a model and a context, and calling a second one from inside that session pays twice for a worse answer.
- api — the CLI calls an endpoint itself, in either the OpenAI-compatible or the Anthropic dialect. The OpenAI-compatible half covers the fully local case for free: Ollama, LM Studio and vLLM all expose it, and a local endpoint needs no key. That matters — a review that must send a diff to a third party is one several markets cannot run at all.
The model returns data, not comments
The model returns JSON against a published schema. The CLI validates it and writes the Redline/<SEVERITY> [rule-id]: line itself. A model that writes that prefix will eventually write a severity that does not exist or an id it invented, and every aggregate keyed on that line becomes fiction. A finding citing a rule the prompt did not carry is discarded, and the reason is said out loud rather than swallowed.
The honest limitation
A local review is opt-in and therefore enforces nothing. The pull request review remains the system of record, and redline review always exits 0 — a non-zero exit would invite someone to wire it into CI as a second gate, where it would enforce nothing while looking like it did.
Local findings are excluded from rule-tuning telemetry, and the command says so on every run. A local run has no thread to resolve, no reviewer to attribute, and no way to tell a finding that was fixed from one the author never read — counting it would compute acted-on rate partly from runs nobody can verify.
It tells you what the standard does not cover
A changed file that matches no stack is reported rather than dropped. That is a gap in the standard, and reviewing it against the core rules alone while saying nothing hides it. See Profiles & stacks for how the matching works.