Numbered edges trace a single request, from pressing Run now (or Cloud Scheduler firing) through to results on the dashboard.
Everything inside the blue boundary is one Google Cloud project. The dashed box above it holds the two things outside our control: the visitor’s browser and Greenhouse’s public API.
The four tiers run top to bottom — trigger, ingest & detect, reason, state. Firestore spans the full width because every tier touches it, which is exactly why it is drawn as a shared substrate rather than another box in the chain.
The green block is not a separate service — it is ordinary Python running inside the Collector, drawn separately because it is where the architectural decision lives. Change detection is a SHA-256 comparison and the relevance gate is string matching. Neither involves a model, and both run in about two seconds across 2752 postings.
The obvious design is a loop: for each change, call the agent. If Gemini times out on the fourteenth posting, postings fifteen through forty never run, and you are left half-finished with no record of what completed.
One message per change fixes it. Each retries independently with backoff, and they process in parallel — three changes finish in about 48 seconds rather than three sequential 35-second runs. The ack deadline is set to 600s because a 35-second job under the 10-second default would be redelivered three times mid-flight, quadrupling model spend while looking perfectly healthy.
Only edge 6 reaches Gemini. Everything before it is deterministic. That boundary is the central design decision: the model is spent on judgement — does this change matter to this candidate, and what would they say about it — never on comparison.