SpecSheriff
rule · _guidelines/tools/10 · s-xr5xxa9cxf2mq5u

Who runs the reviewer

Checkedconfirmed by its owner

sheriff review hands the reviewer's input to a runner, and the runner hands back its answer as JSON: a verdict, pass or refuse, and the findings, each naming the rule, the file, the line and the problem.

A runner is started with none of the user's settings, memory or hooks, a system prompt of its own, an empty working directory and every tool its command line can turn off turned off, so that nothing of the session that wrote the code reaches it.

The runner claude is the Claude Code CLI in print mode, asking for the model and the reasoning effort the settings below give, and falling back to the fallback model they give where the first is overloaded or not offered.

The runner codex is the Codex CLI in codex exec, with a Codex home of its own, made in a temporary directory for the run and deleted after it, that holds a copy of the user's sign-in and nothing else; its sandbox is read-only, its session is not kept, no skill is offered, and its answer is held to the schema of the verdict. It asks for the model and the reasoning effort the settings below give, and for no model where the model is empty.

sheriff review reads the settings of each runner from the git configuration of the user who commits: specsheriff.review.claudeModel, specsheriff.review.claudeFallbackModel and specsheriff.review.claudeEffort for the runner claude, and specsheriff.review.codexModel and specsheriff.review.codexEffort for the runner codex, where an empty codexModel stands for the model Codex chooses for the signed-in account. A setting the configuration holds, empty or not, is confirmed. The hooks and the skills of either plugin write a setting only as the user whose configuration it is answers, the default written as any other value, and ask for none the configuration holds; the session start (§s-477gtdrkw34dzxw) and the skill spec-init (§s-zh2vcr3xjumppg5, §s-2pdy9gw2jrjvfb4) say when each is asked for. The defaults are, for the runner claude, the model opus at the reasoning effort high, falling back to sonnet, and, for the runner codex, the model Codex chooses at the reasoning effort high. Where the configuration lacks a setting of the runner that runs, sheriff review takes that setting's default and, with every review it holds so, names each setting it took a default for and how the user confirms it.

The settings of the reviewer in sheriff.config.json are review.runner and review.minutes, the time after which a run is ended, twenty minutes unless set; sheriff review takes no model and no effort from it. Unless review.runner is set, the runner is that of the plugin whose tools run sheriff review, which the agent file the build writes beside release names: claude for the plugin for Claude Code and codex for the plugin for Codex CLI; tools holding no such file take claude.

Why

Print mode and codex exec answer once and exit, with no session around them to carry anything over.

A run of the reviewer is paid for by the user who commits, from their own account, so it runs at the models and the efforts that user has confirmed, kept on their machine rather than in the project, which every clone shares. The git configuration is read by the git hooks with no agent running and outlives an update or a removal of either plugin, and its global scope serves every project of the user, so one answer on each machine holds wherever they commit. A confirmed setting holds its value, so that a release of the SpecSheriff tools offering other defaults changes nothing a user has confirmed.

Where a setting is not confirmed the review still runs, at its default, since a commit whose review cannot be held is refused (§s-nyh9yk22ba6g77q), and refusing would hold every commit of a user nobody has asked yet, as one committing from a terminal or in CI; the default is named with every review it runs, so that nobody pays long without knowing at what.

Whether code does only what its rules say is the one judgement among the checks, so it is asked at high effort: with Codex, high was the lowest effort tried at which the reviewer refused, in every run, a change it must refuse, which at lower efforts it passed in some runs or in all. Nothing was measured with Claude, whose runner is asked the same effort so that the two runners judge alike. The default of the runner claude is opus, the model Anthropic names as its default, rather than its most capable model, which costs the user more for each review; it falls back to sonnet so that a review is held where opus is overloaded or not offered. Which models Codex offers depends on how its user signs in, so the default of the runner codex is the one Codex chooses for that account. Codex offers no run without tools, so its runner turns off every one a setting reaches, and its sandbox lets nothing be written.

The runner follows the plugin a user has, since a user with one agent has no other to run; a project wanting one reviewer for everyone names it. The limit on a run's time ends a run that hangs rather than hurrying one that reads a large change, which is why it is long.

The links it makes

The links made to it

The decisions taken on it

2026-10-27 · textual
Problem

The reviewer was one agent's command line.

Ruling

The owner: a runner carries the review out, the Claude Code CLI first, then the Codex and Gemini CLIs, then any service speaking the OpenAI-compatible API, which covers models run locally.

2026-10-31 · procedural
Problem

The todo on this rule asks for the Codex and Gemini CLIs as runners, then any service speaking the OpenAI-compatible API.

Ruling

Following the order of work the owner agreed, it waits past the first release, 0.1.0, and the todo stays. That release is the plugin for Claude Code alone, whose every user has the runner described; the runner of Codex CLI comes with the plugin for Codex CLI, and whether Gemini CLI gets a package of its own is being studied.

2026-11-02 · textual
Problem

No runner served a project whose agent is Codex CLI.

Ruling

The runner codex comes with the plugin for Codex CLI, and the runner follows the plugin whose tools run the review unless the project names one.

2026-11-02 · textual
Problem

The reviewer ran at the models the tools or the project's settings chose, the same for every clone, though each run is paid for by the user who commits; and at the effort Codex takes by default its verdicts on one and the same change differed from run to run: with Codex CLI 0.166.0, a ChatGPT sign-in and gpt-6-luna, a function no named rule states passed in one run of four at the default effort and in three of three at medium, and was refused in three of three at high and at max.

Ruling

The owner: no choice that costs a user tokens is made without their consent. The skills work at the model and the effort the user has chosen in their session; every run outside it, now the reviewer's, at the model and the effort the user has confirmed on their machine, offered first at defaults, one model for each agent at an effort set by the task: opus at high falling back to sonnet, since a model above opus is not worth its cost to the user here and Anthropic itself now recommends opus over fable, and the model Codex chooses at high. Each user confirms on their own machine; where they have not, the defaults run with a notice at every commit.

The work deferred on it

2026-10-27 · the owner

Describe the Gemini CLI as a runner, then any service speaking the OpenAI-compatible API, which covers models run locally.

The tests bound to it

  • skills/tools/test/e2e/codex.test.ts · s-xr5xxa9cxf2mq5u the build writes beside each plugin's release the agent whose runner its tools take
  • skills/tools/test/unit/config.test.ts · s-xr5xxa9cxf2mq5u reads the reviewer's runner and time limit from the project's settings, twenty minutes unless set, and no model or effort
  • skills/tools/test/unit/config.test.ts · s-xr5xxa9cxf2mq5u takes the runner of the plugin whose tools run unless the settings name one, and claude for tools naming no agent
  • skills/tools/test/unit/gates.test.ts · s-xr5xxa9cxf2mq5u reads each runner's settings from the user's git configuration, an empty one confirmed, and takes the default of each it lacks
  • skills/tools/test/unit/gates.test.ts · s-xr5xxa9cxf2mq5u runs the Codex CLI in an empty directory with a Codex home of its own holding a copy of the user's sign-in and nothing else, deleted after the run
  • skills/tools/test/unit/gates.test.ts · s-xr5xxa9cxf2mq5u runs the reviewer at the settings read, and with every review held at a default names each setting it took and how the user confirms it
  • skills/tools/test/unit/gates.test.ts · s-xr5xxa9cxf2mq5u starts the Claude Code CLI in print mode with no tools, settings, memory or session, at the model, the effort and the fallback model given
  • skills/tools/test/unit/gates.test.ts · s-xr5xxa9cxf2mq5u starts the Codex CLI in codex exec, read-only and unkept, with no skill and every tool a setting reaches turned off, its answer held to the verdict's schema