A full shelter-management system for a no-kill shelter, built solo and pro bono. Claude is woven in only where judgment helps — and deliberately kept out of everything deterministic. Four diagrams on the line between the two.
A shelter runs on shifts, so some work is genuinely periodic — and the honest tool for periodic work is a clock. Two of the scheduled jobs fire from one token-protected endpoint, then split completely: the briefings fan out across the staff roster and ask Claude to write each one; the 4AM triage sweep runs six pure-SQL checks and emails the morning exception report. Same trigger, opposite engines — one leans on the model, the other never touches it.
The thing the whole app is built around. A staff member scans a kennel's QR, the animal's care card loads, they log an action, and chain straight into the next kennel. The loop is entirely deterministic — except one amber detour: speak the note, and Claude turns speech into a pre-filled form for a human to confirm.
Every call to a model goes through one method. Ai::call() is a single, provider-pluggable chokepoint — swap Anthropic for OpenAI or Gemini from settings, or mock it entirely in demo mode. Six AI touchpoints funnel through it — briefings, voice-to-care-log, social captions, lost-and-found matching, exceptions ranking, and clinical summaries. The deterministic features — length-of-stay math, hold-release prediction, the 4AM triage sweep, and the vet hub's Animals to Watch ranking — are deliberately routed around it.
Every animal's journey is a state machine advanced only by code, never a model. Strays clear a mandatory hold, holds estimate their own release, and every legal outcome is void-only: a reversal returns the animal to the floor, but the record is never deleted. The shelter's system of record is deterministic by design — so this whole diagram is steel. No amber anywhere.