Your 05:15 job-hunt run is six legs in a row, and only ONE of them is an LLM. Reading nightly_wrapper.sh top to bottom is the clearest picture of how your system splits judgment from verification.
The job search restarted 8-24 and now runs unattended every morning as app.zorc.jobhunt-nightly. When it works you see a briefing on the reMarkable before you wake; when it doesn't, the design decides whether you find out. nightly_wrapper.sh is the cleanest embodiment of automation-hygiene rule 5 in your whole workspace: LLM does content, deterministic scripts do everything you can check.
Six legs fire in order. (0) Network settle — up to 5 minutes waiting for DNS/WiFi after sleep, because roughly half the pre-dawn failures used to be ConnectionRefused before the wait existed. (1) Content — `claude -p /jobhunt-nightly` under a 30-minute watchdog: it sweeps listings, selects 3–5 leads, and writes leads/briefings/YYYY-MM-DD.md. This is the ONLY leg that needs judgment. (2) Render/send — brief_render.py --send turns that markdown into the paper doc and pushes it to the reMarkable 'Job Applications' folder. (3) Verify — verify_nightly.py, which ALWAYS runs. (4) Watch — lead lifecycle alarms. (5) Pursuit — pursuit.py --max 2 drains the GO-inked queue into staged application packages, each under its own 40-minute watchdog.
The load-bearing detail is which exit code the wrapper returns. The content leg's result is captured as RC, but the script ends with `exit $VRC` — the VERIFY leg's code. That's deliberate: a morning where the LLM ran fine but the briefing never reached the device is still a failed morning, and only the verify leg, checking the artifact and the cloud manifest, can tell. Trust the leg that inspects the side-effect, not the leg that did the work.
One more rule worth internalizing: ink_apply.py is the ONLY writer of your briefing decisions. When you mark a lead GO or NO on paper and tag it done, ink_apply is the single door that updates the pursuit queue, the refinements file, the lead record, and the seen-state. One writer per piece of state is why the three JobHunt ledgers don't drift into contradiction the way the reMarkable manifests did.
The wrapper documents itself — read the leg map and last night's exit codes.
sed -n '1,20p' /Users/tom/Claude/JobHunt/scripts/nightly_wrapper.sh
grep -nE 'RC=|VRC=|exit \$VRC' /Users/tom/Claude/JobHunt/scripts/nightly_wrapper.sh
tail -20 /Users/tom/Claude/JobHunt/logs/nightly.log
One LLM leg for judgment, five deterministic legs for send/verify/state — and the exit code you trust is always the one that inspected the artifact, never the one that did the work.