Skip to content

v1.3.0 — track Juror's spend separately

Choose a tag to compare

@cderinbogaz cderinbogaz released this 07 Aug 11:31
· 29 commits to main since this release
cee93c6

Juror now reads its own provider keys

Until now Juror read the same OPENAI_API_KEY everything else on your runner uses, so its spend was indistinguishable from the rest of that account's usage.

It now reads JUROR_-prefixed variables, so you can issue Juror a dedicated provider key that bills, rotates, and caps on its own:

env:
  JUROR_OPENAI_API_KEY:    ${{ secrets.JUROR_OPENAI_API_KEY }}
  JUROR_ANTHROPIC_API_KEY: ${{ secrets.JUROR_ANTHROPIC_API_KEY }}
  JUROR_XAI_API_KEY:       ${{ secrets.JUROR_XAI_API_KEY }}
  JUROR_FIREWORKS_API_KEY: ${{ secrets.JUROR_FIREWORKS_API_KEY }}

Review cost then shows up as its own line in provider billing instead of being mixed into whatever else that key does.

Nothing breaks

This is not a breaking change. The unprefixed names still work as a fallback, so existing installs keep running untouched and can migrate whenever they like. A prefixed key wins when both are set.

Only the variable you set is renamed. Each vendor CLI is still handed the credential under the name it expects — Claude Code, opencode, and Grok authenticate from their own environment, so renaming what they receive would leave them unauthenticated with no visible error.

Verified live, not just in tests

The last bug in this code path typechecked and unit-tested cleanly while disabling every OpenAI model, so this was exercised end-to-end on a real PR:

  • Prefixed only, bare names unset — both harnesses authenticated and billed real tokens (Codex 7.8M in, opencode 1.8M in), 6 findings published
  • Bare only, prefixed unset — both models still selected

334 tests, 5 of them new: precedence, blank-key shadowing, custom secret names, and an assertion that no harness is ever handed a prefixed name.

Full changelog: v1.2.1...v1.3.0