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.
TailTracker routes model access through one method by design. Ai::call() is a provider-pluggable gateway — swap Anthropic for OpenAI or Gemini from settings, or mock it entirely in demo mode. The newer AI features call it directly — briefings, voice-to-care-log, social captions, lost-and-found matching, and clinical summaries; a few older controllers still hold their own client and are being consolidated onto it. 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.