Sixty Days - judge evidence

The Taskmaster · Deployed on Google Cloud

A deadline keeper, not an appeal decider.

Sixty Days reads a synthetic disaster-assistance decision letter, preserves the exact stated reason, organizes supporting evidence, prepares applicant-controlled requests, tracks the deadline, and builds a reviewable draft packet. It never sends or submits.

24 / 24live acceptance flow
365standalone tests
20 / 20recorded letter fields
6 / 6recorded evidence checks

Public proof: the shared-substrate exit test passes 10/10, separately from the product-specific 24-step flow. Open the live product or inspect the public repository.

If you have sixty seconds

Start the guided preset, inspect its eight registered wakes, compare the close and wide evidence fixtures, then advance time and watch the scheduled safeguard build a visibly partial packet automatically. Open the conformance map for the official-source-to-code-to-test chain.

Evaluation map

Where each scoring claim is proven

Claims below point to executable behavior, measured recordings, or an explicit boundary.

CriterionWhat is distinctiveEvidence
InnovationA standing 60-day watch converts one letter into an eight-wake plan and evidence routes. When the packet safeguard becomes due, it executes PacketBuilder against current accepted evidence and stores a partial-safe snapshot without sending it.Run the four-stage console; inspect sixty_days/wake_actions.py, deadline.py, and packet.py.
Taskmaster fitThe workflow completes connected work: understand, gather, track, and review, while preserving applicant control.The public acceptance script verifies 23 linked behaviors.
ArchitectureGemini readers and evidence checks sit behind typed routes, deterministic clocks, durable Firestore state, redaction, and independent verification.Architecture below, conformance report, and standalone test suite.
Production readinessDeployed service, bounded autoscaling, health endpoint, structured observability, measured fixtures, accessibility gate, and replayable demo.Live URL, Cloud Run facts, recording reports, and reproduction commands.

Mandatory technology

Requirements are visible in the execution path

Gemini 3.5 Flash

Vertex AI powers decision-letter transcription and observable evidence-photo checks. Four letter calls and two evidence calls are recorded and graded against adjacent truth.

Google GenAI SDK

One of the four accepted agent frameworks (ADK, GenAI SDK, Antigravity SDK, GenKit). The reader, evidence checker, and recording scripts call it with schema-constrained structured outputs at temperature zero. Deterministic fixture replay keeps public judging repeatable.

Google Cloud

Cloud Run serves the application and scales to zero; Firestore holds structured cases, wakes, and durable counters; a dedicated sixty-days-wake-scan Cloud Scheduler job drives this service’s own worker over OIDC; Secret Manager holds key hashes; Cloud Trace and Cloud Logging receive OpenTelemetry spans; Cloud Build and Artifact Registry produce the image. Live scheduler proof.

Model Armor: the de-identified API screens untrusted letter text for prompt injection before any model call, in front of the deterministic redaction and quarantine rather than instead of them. Measured live it blocked a bare injection and missed the same injection diluted inside a long letter, which the quarantine caught. An unavailable screen is recorded as unavailable, never as a pass.

Prove the model is live: the console replays recordings so judging is repeatable, and also carries one button that calls Gemini 3.5 Flash on Vertex AI for real, on a letter image with no transcript supplied, graded against the same truth file by the same fields as the published run. Bounded per visitor and per day.

Three additional Google models: Gemma 4 reviews already-pattern-redacted text for remaining person names; Gemini 3.1 Flash Image creates the non-data-bearing first-use illustration; and Veo 3.1 Fast creates the optional four-second motion briefing. Media prompts, model IDs, byte counts, and hashes are public in the provenance manifest. Generated media never becomes case evidence, enters a packet, or predicts an outcome.

Deployment proof

What is live, and what is shared

This service now owns its scheduler job outright. It claims only the wakes it can execute, so a worker on the shared Firestore substrate cannot retire this project's safeguards.

  • Service: sixty-days in us-central1, bounded to three instances and running as sa-reason.
  • Scheduler: sixty-days-wake-scan posts to /internal/scan-due every minute with an OIDC token scoped to this service. The worker claims only wakes owned by sixty-days and sixty-days-beta, so a neighbouring worker on the shared Firestore substrate cannot retire this project's safeguards. Anonymous calls to the worker route return 401.
  • Acceptance: scripts/sixty_days_demo_flow.py performs 23 public HTTP checks; /exit-test exercises the shared 10-stage substrate.
  • Measured fixtures: truth sits next to every synthetic input. Reports record 20/20 extracted fields and 6/6 evidence decisions.

Open the machine-checkable conformance report.

Verify it yourself

Check these claims without trusting this page

Every button below runs against the deployed service, right now, in this browser. Nothing is pre-recorded and no terminal is required.

The durable workflow, end to end

Creates a run, registers a reminder sixty days out, proves nothing fires early, advances a simulated clock, and checks that the agent wakes, records its action, and completes. Then it tries to break it: hidden instructions inside a document, a fabricated number, a worker that dies mid-run.

The published claims, re-checked live

Runs the appeal workflow against the public API from this browser and checks what the README claims: reasons quoted from the letter, eight reminders registered, a bad photo refused, a request prepared but never sent, a draft that still lists its gaps, and no send or submission route anywhere.

The scheduler that wakes it

The demo clock is simulated and says so. This is the wall clock: a Cloud Scheduler job calls this service every minute whether or not anyone has the page open.

Policy against code

Each published rule, the source it came from, the module that implements it, and the test that holds it. Read as data rather than as prose.

Prefer to run it on your own machine?
cd app
python -m venv .venv
.venv/bin/pip install -e ".[dev]"
python -m pytest -q
python scripts/check_a11y.py
python scripts/sixty_days_demo_flow.py --url https://SERVICE_URL
python scripts/verify_rules_compliance.py --url https://SERVICE_URL

The expected standalone baseline is 365 tests. Deployment and credentials are documented in the repository README and deploy.sh.

Findings and learnings

The hard parts were trust boundaries, not prose generation

Quote before reasoning

Keeping the exact decision reason beside every action prevents a polished packet from drifting away from what the letter actually said.

Audit the redaction artifact

An audit found all-caps applicant names and FEMA registration references missing from an older pattern set. Regression tests now enforce PERSON and CASE_REF coverage.

Partial is safer than false-complete

A packet may be generated with missing items visibly listed. The verifier refuses to turn absence into a confident claim.

Test the two demos together

A parallel rehearsal exposed a shared simulation clock: one submission could move the other's timeline. Demo clocks are now namespaced, simulated wake claims check run ownership, and the production wall-clock worker remains shared.

Research-to-design trace

Each source changes a guardrail

Official examples are treated as routing options, never as a promise that one document will change an outcome.

Official findingImplemented decisionBoundary
The decision letter identifies the documents relevant to that determination.Every requirement begins with an exact quoted reason; unknown reasons stop for caseworker review.The catalogue cannot override the applicant's letter.
FEMA lists several ownership and occupancy records, including alternatives when public-record matching fails.The planner names multiple accepted examples and their date context instead of prescribing one rigid document.No listed record is called sufficient or outcome-determinative.
FEMA's insurance guide distinguishes settlements, denials, and policy evidence of exclusions or missing coverage.The insurer route requests those records and no longer treats an unsupported signed statement as equivalent.The applicant sends the request; no insurer is contacted by the service.
A September 2025 FEMA IHP explainer tells applicants to put application and disaster numbers on every submitted page.The PDF repeats synthetic application and disaster references in every page footer and asks the applicant to verify them.The PDF remains optional, unofficial, and not submitted.

FEMA ownership and occupancy fact sheet · FEMA insurance quick reference · FEMA IHP application, eligibility, registration, and appeals explainer

Limits

Deliberate non-capabilities

  • Synthetic, unbranded fixtures only; no real survivor data is used.
  • No legal advice, eligibility prediction, appeal strategy, or outcome forecast.
  • No insurer, agency, records office, or other third party is contacted.
  • No send or submission endpoint exists. The applicant reviews and controls every external action.
  • Photo checks are limited to observable framing and legibility, never damage valuation.
  • The generated PDF is an organizing draft, explicitly marked not submitted.

Policy basis: FEMA appeal quick reference and GAO-20-503.

Validation without invented testimonials

No practitioner or applicant study is claimed. Public research establishes the workflow context; executable tests, recorded fixtures, adversarial probes, live acceptance, and explicit limitations establish what this build actually does. Legal accuracy, eligibility, and applicant usability remain unproven.