Day 90 of 92 · Friday · Learning

models.env - one file, four model slots, and where Sonnet 5.5 would goConcept

One file, _config/models.env, now names the model for every unattended job in four slots. Reading it tells you what each class of job costs; editing one line changes a whole class at once — which is exactly what D2-A on the 10-4 Weekly Review proposes.

Catch-up progress
90/92
Why this matters to you

Until 9-28 the model name lived inside each wrapper script (${PDB_MODEL:-fable}) and the 9-27 weekly asked you to flip three of them by hand. Audit session 6 moved them into one shared file. The work slot still runs Sonnet 4.6 at $3 in / $15 out per million tokens; Sonnet 5.5 shipped 9-28 at $2 / $10. The decision is one line.

A shared env file is a list of KEY=value lines. The shell wrappers read it with `set -a; . models.env; set +a` (every line becomes an environment variable for the job). Python reads the same file through JARBUS/scripts/models.py, whose model(name) function resolves in a fixed order: an environment variable of that name wins, then the file, then a built-in default. That order is the whole lesson — a stray exported variable silently beats the file.

Four slots and who uses them. CLAUDE_NIGHTLY_MODEL (claude-opus-5-5): the JobHunt nightly content leg and the pursuit builds. CLAUDE_JOB_MODEL (fable): plan-day and this weekly review. CLAUDE_WORK_MODEL (claude-sonnet-4-6): the standards-checker that gates every paper doc, media digest, build dispatch and the media garden. CLAUDE_FAST_MODEL (claude-haiku-4-5): narrative, rubric fills and context packs. CLAUDE_FALLBACK_MODELS (sonnet,haiku) is the chain claude --fallback-model walks when the primary is capped.

The same precedence gives you a free trial switch. A one-run override such as `PDB_MODEL=claude-opus-5-5 bash run_plan_day.sh` tests a model without touching the file; the standards-checker also honors STANDARDS_CHECKER_MODEL. Sonnet 5.5 differs from 5 in two ways that could break a caller — thinking cannot be switched off and forced tool choice is rejected — and the JARBUS client sets neither (checked 10-4), so the work-slot switch is a rename.

Worked example

Read the file, resolve every slot the way the code does, then prove an override wins without editing anything.

cat /Users/tom/Claude/_config/models.env

cd /Users/tom/Claude/JARBUS/scripts && python3 -c "
from models import model
for k in ('CLAUDE_NIGHTLY_MODEL','CLAUDE_JOB_MODEL','CLAUDE_WORK_MODEL',
          'CLAUDE_FAST_MODEL','CLAUDE_FALLBACK_MODELS'):
    print(f'{k:24} {model(k)}')"

grep -rl CLAUDE_WORK_MODEL /Users/tom/Claude/JARBUS/scripts /Users/tom/Claude/PDB/scripts

CLAUDE_WORK_MODEL=claude-sonnet-5-5 python3 -c "
import sys; sys.path.insert(0,'/Users/tom/Claude/JARBUS/scripts')
from models import model; print(model('CLAUDE_WORK_MODEL'))"
▶ Do it now
  1. Run the cat and the loop; confirm the four slots match the table above.
  2. Run `env | grep CLAUDE_` in your own terminal. Anything printed there is an override that beats the file in every job started from that shell.
  3. Run the override line and see claude-sonnet-5-5 printed with the file unchanged. Then decide D2-A on the 10-4 Weekly Review knowing exactly what the edit touches.

Gotchas

Go deeper: _config/models.env · Claude models overview (pricing, context)
One-card takeaway

Configuration you can read in one place is configuration you can reason about — one file, four slots, one line per decision.