Your senior reviewer workflow is rationed by one float nobody writes about

The Claude Code community has converged on a good pattern. One agent writes code, usually on Sonnet. A second agent reviews it, usually on Opus. The existing playbooks cover the prompts carefully and the wiring carefully and never mention the budget. That budget is a single number on Anthropic's /usage response, seven_day_opus.utilization, and it decides when your Thursday reviewer pass stops coming back with anything useful. This page is about reading that number before every review and gating the invocation on it.

M
Matthew Diakonov
10 min read
4.9from Verified from the open-source ClaudeMeter client
seven_day_opus declared at src/models.rs line 23
CLI prints it as 7-day Opus on src/format.rs line 19
One jq line against claude-meter --json gates every reviewer call

One week of a Sonnet-worker / Opus-reviewer team

01 / 05

Day 1: Monday

Opus reviewer runs on every PR. seven_day_opus rises from 0 toward the gate threshold.

The pattern the community converged on

The two-agent split is the only senior-reviewer pattern anyone has found that consistently catches things a solo model misses. One agent codes, the other reviews. The reviewer sees the full diff with no session memory of the coding decisions, which is the property that makes it useful. Because the reviewer should be the strongest available model, almost every write-up uses Opus on that side of the split.

That choice has a consequence most guides skip. Opus has its own per-week quota. Your reviewer invocations fill it. If the team ships a normal rate of PRs, the reviewer floats will pin mid-week every week. When that happens, the reviewer either 429s or silently falls back to whatever Claude Code's default-model logic does, which is not always what you want and is never visible to the PR author.

/review slash command/agents senior-reviewer roleGitHub Actions on PR open.claude/hooks/pre-mergeCI step: claude reviewpre-commit + review.md promptClaude Code + custom reviewer agentinline reviewer on /commit

Every one of these calling conventions hits the same per-week Opus float. It does not matter how you invoke the reviewer; the gate is upstream of the prompt.

How a review fans into three quota checks

The reviewer pass is a single POST from Claude Code's perspective. From the rate limiter's perspective it is three floats evaluated in parallel.

One /review call, three rate-limit gates

1

Claude Code runs /review on a PR

The /review slash command or a CI wrapper shells claude with the senior-reviewer system prompt, the full diff, and the reviewer model explicitly set to Opus.

2

Request lands on Anthropic's rate limiter

Before the model sees the prompt, the server checks five_hour, seven_day, and seven_day_opus. Any float at 1.0 returns 429 with a resets_at timestamp.

3

seven_day_opus increments

The reviewer pass contributes to the Opus-only weekly float. Sonnet work done earlier in the day does not share this bucket, so even a Sonnet-heavy team can pin it.

4

Review returns or 429s

If every float is green, the review comes back. If seven_day_opus hit 1.0 on this call, the request is rejected and the Settings UI shows a generic weekly bar close to full.

The anchor fact: every reviewer budget lives on one line of Rust

The reviewer's weekly budget is not a computed number. It is returned by Anthropic directly on the /usage endpoint and deserialized into seven_day_opus. One optional Window. No aggregation, no heuristic:

claude-meter/src/models.rs

And the one-line print that surfaces it on the CLI:

claude-meter/src/format.rs

An ungated reviewer script next to a gated one

Same reviewer prompt, same diff, same everything. The right-hand script reads seven_day_opus from ClaudeMeter before it picks the model.

The diff between a workflow that breaks mid-week and one that does not

#!/usr/bin/env bash
# runs the senior-reviewer agent on whatever PR is checked out
# PROBLEM: will 429 at 3pm on Thursday with no warning

git diff origin/main...HEAD > /tmp/pr.diff

claude \
  --model claude-opus-4-7 \
  --system-prompt-file .claude/senior-reviewer.md \
  --input /tmp/pr.diff \
  > review.md

cat review.md
-85% extra lines to read server truth

Reading seven_day_opus from a shell, two ways

The CLI that ships next to the menu-bar app prints the full parsed snapshot when called with --json. One jq filter gives you the reviewer float:

option one: one-shot CLI

The menu-bar app also persists every tick's snapshot to disk under ~/Library/Application Support/ClaudeMeter/snapshots.json. If you want to avoid spawning the CLI on every invocation, read the file directly:

option two: the persisted snapshot

What Thursday afternoon looks like, with and without the gate

Same team, same PR rate, same prompts. Toggle between the ungated and gated versions of the week.

Thursday afternoon on an Opus-heavy reviewer workflow

Thursday 2pm. Opus reviewer returns 429 on PR #41. PR author pings the channel. Someone retries, 429 again. Someone opens claude.ai/settings/usage, sees a weekly bar that looks close to full, shrugs. Opus is out for the next 60 hours. Reviews pause or switch to ad-hoc humans until the UTC rollover.

  • 429 with no fallback
  • Settings UI shows one bar, not seven_day_opus specifically
  • Team discovers the limit by tripping it
  • No graceful degradation path written down

What a gated reviewer wrapper actually does, tick by tick

Plays automatically when it scrolls into view. Each frame is one real output of claude-meter --json | jq '.usage.seven_day_opus.utilization' over a week.

Monday through Monday on one account
mk0r preview

$ claude-meter --json | jq '.usage.seven_day_opus.utilization'

1/6Shell asks ClaudeMeter for the live reviewer float

Wiring the gate into a real workflow

Four steps from a fresh machine to a reviewer pattern that survives Thursday.

Senior-reviewer gate setup

  1. 1

    1. Install ClaudeMeter

    brew install --cask m13v/tap/claude-meter. The menu-bar app and the claude-meter CLI land in /Applications/ClaudeMeter.app.

  2. 2

    2. Load the extension

    Chrome or Arc, chrome://extensions, Load unpacked on the repo's extension/ folder. Removes the cookie-paste step entirely.

  3. 3

    3. Add the gate to your reviewer wrapper

    In the script or hook that calls claude with --model opus, shell to claude-meter --json first and pick the model from the float.

  4. 4

    4. Wire it into /review or CI

    For a slash command, read the model choice into the same claude call. For GitHub Actions, export the model choice from a preceding step and pass it into your reviewer step's inputs.

The numbers behind the reviewer budget

Line numbers from the ClaudeMeter source, poll cadence from the extension, and the single jq filter that turns the float into a model choice.

0
src/models.rs line where seven_day_opus lives
0
src/format.rs line that prints "7-day Opus"
0s
extension poll cadence
0
jq filter that turns the float into a model choice

What a gated reviewer should check before every invocation

Reviewer pre-flight, in order of how often it will block

  • seven_day_opus.utilization under the gate threshold (default 0.85) before invoking the reviewer on Opus.
  • five_hour.utilization under 0.90 before any model call. This float is shared, so it can pin before Opus-specifically does.
  • Fallback model chosen explicitly (Sonnet 4.7). Not an empty string, not a panic, not a default that silently reverts to Haiku.
  • extra_usage.utilization checked if overage is enabled. That is a second gate the Settings bar does not draw.
  • subscription.status is active. A past_due state collapses every float's denominator server-side and a 429 follows.
  • Review output tags which model produced it. A Sonnet fallback review is worth reading differently than an Opus review.
  • resets_at logged alongside the decision. When a reviewer call flips to Sonnet, log the UTC reset time so the next PR knows when Opus is back.

Token-based monitors vs server-truth monitors for this workflow

Token counters do a fine job on cost. They can not do this job, because the thing that stops your Thursday reviewer is not a token total. It is a server-side float.

Featureccusage / Claude-Code-Usage-MonitorClaudeMeter
Reads seven_day_opus directlyNo (not in local JSONL logs)Yes, from the /usage response every 60 seconds
Works before any request is sentPartial (estimates based on past tokens)Yes, pre-flight float value on every invocation
Separate weekly float for the reviewer modelNo (aggregates by token class)Yes, Opus-only via seven_day_opus
Returns a resets_at per floatNoYes, on every Window struct
Shell-scriptable from a reviewer wrapperYes, but not against server truthYes, one jq line against CLI --json
Free and open sourceYesYes, MIT
Removes the claude.ai cookie-paste stepNot applicable (no cookies needed)Yes, via the browser extension

The part that is not a prompt pattern

Every article about this topic puts its energy into the reviewer prompt. The prompt matters. The prompt is also not the thing that determines whether the workflow lasts the week. The thing that determines that is whether your wrapper reads seven_day_opus before it picks a model. One Rust field, one jq filter, one threshold. That is the whole implementation.

Keep your reviewer working on Thursday

ClaudeMeter polls the server-truth /usage payload every 60 seconds, parses every float, and exposes them on a CLI your reviewer wrapper can read with one jq line. Free, MIT, and the browser extension removes the cookie-paste step entirely.

Install ClaudeMeter

Frequently asked questions

What is the Claude Code senior reviewer workflow?

A two-agent pattern. One agent, usually Sonnet, writes or refactors code. A second agent, usually Opus, reads the diff and returns a structured review before anything lands on main. In Claude Code this is most often wired through /agents with a senior-reviewer role, a slash command like /review, or a CI step that shells claude with a review system prompt. The division of labour is what people write about. The thing nobody writes about is that the reviewer pass is Opus-rationed on a weekly budget, and that budget is a single float on the usage endpoint.

Why does a senior-reviewer workflow burn Opus faster than normal coding?

Because every review is a full re-read of the diff plus the review system prompt plus any project context the reviewer agent pulls in. A Sonnet-only coding session can skate through five hours without touching Opus at all. A two-agent workflow touches Opus on every PR even when the code itself was Sonnet-written. If your team does 6 PRs a day, that is 6 Opus invocations a day that would not exist without the reviewer pass, and each one is larger than a typical chat turn because the entire diff is in the prompt.

What is seven_day_opus and where does ClaudeMeter read it?

seven_day_opus is a weekly utilization float scoped to Opus requests on your subscription. ClaudeMeter declares it as pub seven_day_opus: Option<Window> on src/models.rs line 23. The menu-bar formatter prints it as '7-day Opus' on src/format.rs line 19. It is populated verbatim from the /api/organizations/{org}/usage response that claude.ai/settings/usage also consumes, so the number you read from ClaudeMeter is the same number the rate limiter checks on your next Opus request.

How do I read seven_day_opus from a shell so I can gate my reviewer calls?

Two ways. The CLI: /Applications/ClaudeMeter.app/Contents/MacOS/claude-meter --json | jq '.usage.seven_day_opus.utilization'. The persisted snapshot file: jq '.[0].usage.seven_day_opus.utilization' ~/Library/Application\ Support/ClaudeMeter/snapshots.json. Both return a single float. Either one is one line in a pre-commit hook, a GitHub Action, or a wrapper script that calls claude review. Local-log tools like ccusage have nothing to read here because the float is server-side.

Can I use ccusage or Claude-Code-Usage-Monitor to budget a senior-reviewer workflow?

Not for this. Both tools parse ~/.claude/projects/**/*.jsonl and count tokens client-side. Token counts are a cost signal, not a quota signal. The rate limiter does not read your JSONL; it reads its own server-side weekly float. You can spend a lot of tokens and still have headroom, or spend few tokens and still hit the gate. The only way to budget a reviewer workflow on server truth is to read the live seven_day_opus float, which ClaudeMeter surfaces and the local-log tools do not.

Does the five-hour float matter for the reviewer role?

Yes, on bursty days. five_hour is shared across every model and every request, so a morning of heavy Sonnet coding followed by an afternoon of reviews can pin it before seven_day_opus does. In practice the five-hour gate is the one that stops a single marathon session; the seven_day_opus gate is the one that kills the workflow mid-week. A well-designed reviewer wrapper checks both before every invocation.

What happens when seven_day_opus hits 1.0 in the middle of a review?

The next Opus request returns 429 with a resets_at timestamp that matches the Window struct at src/models.rs lines 3 to 7. Claude Code then surfaces the failure to whatever invoked it. In a /review slash command you will see the error inline. In a CI step shelling to claude it will exit nonzero. The review itself does not partially complete; the server rejects the request before the model sees the prompt.

What is a reasonable fallback when Opus is pinned?

Run the reviewer prompt on Sonnet 4.7 and explicitly note in the review output that it is a Sonnet pass, not an Opus pass. Humans reading the review can calibrate accordingly. Sonnet still catches the structural and correctness issues; the classes of feedback it misses are architectural comparisons that benefit from Opus's longer effective context reasoning. A shell wrapper that reads seven_day_opus and picks the model is the cleanest implementation.

Does the extra_usage overage block save me?

Partly. If your account has overage billing enabled, Opus requests can continue past seven_day_opus by consuming extra_usage credits. Those have their own utilization float, extra_usage.utilization on the ExtraUsage struct at src/models.rs lines 10 to 16, and when that reaches 1.0 new requests stop even with the weekly float green. ClaudeMeter prints the extra-usage state next to the windows so you can see both limits at once.

Why do so many senior-reviewer guides skip the budget question?

Because the question is invisible to anyone who is not reading the /usage response directly. Settings renders a single 'weekly Opus' bar with no arithmetic for 'how many more reviews do I get this week.' And because token-based tools do not see the weekly Opus float at all, the writers using those tools do not know the float exists. The result is a genre of write-ups that describe the prompt pattern carefully and never mention that the pattern has a sustainability cliff.

Does this workflow differ on Max 20x versus Pro?

Yes. Max 20x has a roughly twentyfold larger seven_day_opus denominator than Pro, which is the difference between running a reviewer pattern sustainably on a small team and running it for two days a week on a solo plan. Neither denominator is printed in the Settings page; both are read from the /usage response on every tick. ClaudeMeter does not care which plan you have; it reads the float and renders it at whatever scale the server returned.

Is the reviewer budget the same across Claude Code, claude.ai chat, and third-party IDE clients?

If all three authenticate with your claude.ai cookies, yes. They share seven_day_opus and the rest of the weekly floats. If one of them authenticates via an OAuth app, its traffic lands in seven_day_oauth_apps instead, which is a separate hidden float declared at src/models.rs line 24. A reviewer workflow that runs through an OAuth-authorized IDE extension can trip a float the Settings UI does not draw at all.

Running the reviewer pattern on a team and want a sanity check?

If your reviewer wrapper is tripping 429s mid-week and the Settings bar looks ambiguous, send the CLI output over. I will tell you which float is actually pinning your Opus invocations.