About Night Desk

Night Desk stamps a hold receipt. Why. Present. Missing. It never closes money.

A wallet can dump a review pile overnight — refunds, loyalty farms, card testing, a traveler. The failure mode is closing that pile because a model felt sure.

Gemini writes the note. A deterministic decide() stamps HOLD or ESCALATE. That is the whole vocabulary. There is no close path. If Gemini, Vertex, or Pub/Sub is down, everything holds. No silent deny.

Receipts are write-once: why, present, missing. First-open stamps persist even after rails come back. The public desk shows seeded hold receipts and does not call Vertex. A live shift is a token-gated POST. Without the token it is rejected. Shifts stay off.

Built during this hackathon on Gemini 3.5 Flash, Google ADK, Cloud Run, Firestore, and Pub/Sub. Project night-desk-507002. Live service: nightdesk on Cloud Run, us-central1.

Features and functionality

Technologies used

  • Gemini 3.5 Flash (Vertex AI + ADC)
  • Google Agent Development Kit (ADK)
  • Google Cloud Run, Cloud Firestore, Cloud Pub/Sub
  • FastAPI, Next.js, TypeScript
  • Python 3.12

Other data sources used

Synthetic wallet cases in sample_data/cases.json. No production customer data.

Findings and learnings

  • The valuable overnight move is stamping a hold receipt the desk can still see.
  • A write-once receipt is how fail-closed stays honest when rails come back.
  • The public demo must not call Vertex. Seeded receipts plus a token-gated shift is the proof.

Google SDK used

Google ADK (google-adk) + Gemini via Vertex (google-genai). Firestore and Pub/Sub clients.

Date started

29 August 2026

Architecture

Night Desk architecture

Architecture diagram: https://github.com/pamu512/night-desk/blob/main/docs/architecture.svg

Pre-existing / third-party code

Google ADK, google-cloud-firestore, google-cloud-pubsub, FastAPI, Next.js. New repo. No copied product source.

Team

Anoop Pamu ([email protected], GitHub pamu512)

  • Two-way decide() only: HOLD or ESCALATE. Close verbs remap to HOLD.
  • Fail-closed when Gemini, Vertex, or Pub/Sub is missing.
  • Write-once receipts (why / present / missing). GET does not restamp.
  • Gemini drafts the note; policy disposition wins.
  • Public Cloud Run desk with seeded HOLD receipts. Live shifts off. POST /api/shifts is 403 without SHIFT_TOKEN.
  • Sample 10-case queue. First-open: HOLD 10, ESCALATE 0. Nobody disappears.
  • Cloud Run + Firestore + Pub/Sub. Min instances zero.

Built With

Share this project:

Updates

Submission history