An agent-native computational-biology workspace — one honest, human-supervised turn of a lab-in-the-loop. Built for the Google Cloud Rapid Agent Hackathon (Fivetran track).
Live: https://dry-lab-124593837272.us-central1.run.app · open it, approve the plan, and watch a full supervised research turn run end to end (add
?live=1to drive a fresh live run; the bare URL replays the last green run).
A plain-English research goal → a plan you approve → Fivetran lands & transforms data in BigQuery (operated by the agent, human-approved on every write) → a code-writing @Investigator runs a vetted skill in a persistent in-container sandbox → @Critic reviews it (incl. a figure-vision + gene-grounding check) → a cited report + figures + tamper-evident provenance → a structured next-experiment proposal → you approve → it's emitted.
@Planner → (you approve the plan) → @Pipeline → @Investigator ⇄ @Critic → @Proposer → (you approve) → emit
human gate Fivetran analysis + cited report next experiment human gate
- Generalize via skills, not schema. A new use case is one
SKILL.md— no new tables/endpoints. - Artifacts are the provenance. Outputs are pinned to immutable GCS objects (generation + crc32c); BigQuery holds
a thin
runs/evidenceindex; Dataplex draws lineage. - Honesty is a hard constraint. Numbers come from a computed evidence row + the code cell that made them; gene
symbols are a grounded lookup (GPL13158
probe_gene), never model-asserted; citations are scholarly only; thresholds are never tuned. On GSE206285 the honest result is 32 differentially expressed genes (CKB, SLC11A1, MMP1, PYY, …) between ustekinumab responders and non-responders in ulcerative colitis. - Human approval is real. Plan approval, Fivetran writes (schema change / transformation run), and the final experiment emit each pause for a human.
ADK 2.x (planner → SequentialAgent[pipeline, LoopAgent(investigator, critic), proposer]) · Vertex Gemini ·
BigQuery (read-only reductions + thin index) · GCS (immutable artifacts) · a persistent in-container Jupyter kernel
for analysis · the Fivetran MCP (baked into the image) for ingest → transform → activate · a Vite/React audit-
surface UI served same-origin. Deployed on Cloud Run.
# backend (needs gcloud ADC + a .env from .env.example)
cd backend && uv pip install -e . && uvicorn dry_lab.server:app --reload
# frontend
cd frontend && npm install && npm run dev # ?live=1 drives a live run; default replays the fixture
# end-to-end gate (live): python -m eval.run_case --case 0Data spine: scripts/process_geo.py (GSE206285) → Fivetran GCS→BigQuery → dbt marts; scripts/build_probe_annotation.py
builds the grounded probe_gene map. See docs/ for architecture, patterns, and the data spine.