Safe Scribe

# Safe Scribe by TrustEdge AI **A clinical handoff scribe where the agents argue before they commit, and nothing identifiable leaves the room.** Built in one day at The AI Conference Hack Day 2026 by Erik Jones and Jaiven Spence (TrustEdge AI / Jacobian Engineering) with their agent teams. Repo: https://github.com/erikdj/ai-hackday-2026 ## The problem Clinics want AI scribes. Compliance officers say no, twice: patient data would leave for a hyperscaler LLM API, and afterwards nobody can prove…

Live demoGitHub0

Overview

# Safe Scribe by TrustEdge AI

**A clinical handoff scribe where the agents argue before they commit, and nothing identifiable leaves the room.**

Built in one day at The AI Conference Hack Day 2026 by Erik Jones and Jaiven Spence (TrustEdge AI / Jacobian Engineering) with their agent teams. Repo: https://github.com/erikdj/ai-hackday-2026

## The problem

Clinics want AI scribes. Compliance officers say no, twice: patient data would leave for a hyperscaler LLM API, and afterwards nobody can prove which system saw which field. Safe Scribe is the version of an AI scribe that a compliance officer can say yes to.

## What it does, in two minutes

1. A nurse-to-nurse shift handoff recording is dropped on a local upload page. It is transcribed **on the laptop** with faster-whisper. Zero bytes of audio leave the machine. 2. A **Band** case room opens. **Scribe**, thinking on **Crusoe** Managed Inference, extracts a structured brief: patient, meds, allergies, pending results, findings, follow-ups. Every item carries a verbatim quote from the transcript. 3. A **Critic** on a different model family (also on Crusoe) reviews. It vetoes anything unsupported: a quote that is not in the transcript, a follow-up with no owner, and, the beat that matters, **any patient identifier in the outbound brief** (name, date of birth, record number, phone, address). 4. The unowned follow-up is not guessed. The charge nurse in the room types `I'll own it`, and that human message becomes the provenance for the owner. The identifier gate scans the outbound brief; Scribe works from a pseudonymous id, so in the live run it passes, and the tests show it vetoing any brief that carries a name, a spoken date of birth or a record number. The Critic approves an exact brief revision. 5. Only then are the downstream agents let in, and only into a separate **approved room** that has never contained the transcript. **Grapher** writes the brief to **Neo4j** as a pseudonymous patient record plus an access-lineage graph. (A Closer that drafts the discharge follow-up from the redacted brief is the next agent for that room; not built today.) 6. The dashboard answers the compliance question live: *which agents saw identifiers?* The answer is Desk, Scribe, Critic. Nothing downstream. A Crusoe model then writes the three-sentence statement a privacy officer reads, from agent names, field names and counts only, with the exact payload shown beside it. Both are MCP tools in the DuploCloud studio, called under human approval.

Delete Band and there is no room, no roster, no gate, no veto. Delete Crusoe and no agent has a brain. Delete Neo4j and there is no memory across encounters and no proof of who saw what.

## Architecture

``` laptop Band (coordination) Crusoe (inference) ┌──────────────────────┐ text ┌──────────────────────────┐ ┌──────────────────┐ │ upload page │ ────────► │ case room │ ◄────► │ GLM-5.3 (Scribe)│ │ faster-whisper (local)│ │ Desk → Scribe → Critic │ │ Qwen3.8 (Desk) │ │ pseudo_id salt (local)│ │ human: "I'll own it" │ │ Qwen3.8 (Critic)│ └──────────────────────┘ │ VETO / APPROVE rev N │ └──────────────────┘ └────────────┬─────────────┘ redacted brief + access manifest only ┌────────────▼─────────────┐ ┌──────────────────┐ │ approved room │ ─────► │ Neo4j Aura │ │ Grapher (Closer: next) │ │ patient (pseudo) │ └──────────────────────────┘ │ ACCESSED lineage │ └──────────────────┘ ```

## Sponsor tools and what breaks without them

| Tool | Job in Safe Scribe | Delete test | Status | | --- | --- | --- | --- | | **Crusoe** | Every agent's inference. Two model families pinned from a live tool-calling probe of the whole catalog and two live runs. | No agent has a brain | verified live | | **Band** | Case room, runtime roster, veto gate, human owner in the room, approved-room boundary | No room, no gate, no veto | verified live (VETO, owner reply, APPROVE, approved room) | | **Neo4j** | Pseudonymous patient memory across encounters; `(Agent)-[:ACCESSED]->(Field)` lineage | No memory, no proof of who saw what | verified (Aura writes + lineage query) | | **DuploCloud** | The lineage question exposed as an MCP tool, registered in the studio; a compliance agent asks it | Lineage answer not reachable by other agents | verified (wired; tool call after human approval in the studio) | | Brave Search | Researcher fact for a named drug, one sourced URL | Critic cannot verify enrichment | verified live (fact); room recruitment built, gated off for the demo | | Similarweb | Legitimacy fact for a referral organization spoken in the visit | Spoken referral cannot be checked | verified live | | Nebius | Embeddings that *suggest* a prior encounter for a human to confirm | Duplicate patients | attempted, not integrated | | Vultr | Hosts the cloud agents; Desk and audio stay on the laptop | Demo rides on a laptop | attempted, compose ready, no host |

faster-whisper (open source) transcribes on the laptop; it is not a sponsor. xAI text-to-speech was used to synthesize the demo recordings from written scripts (synthetic patients). It is development tooling, not part of the product, and is not claimed as an integration.

## What we are careful to say

Full compliance posture, vendor terms and gaps: `docs/compliance/hipaa.md`. Pitch and directory: the root `README.md`.

- Every patient in the demo is synthetic. Names, dates of birth, record numbers, and phone numbers are invented. - The identifier gate is a programmatic check plus model judgment on the outbound brief. It is a boundary control, not a de-identification certification. - Vendor terms as read on 2026-09-29: Crusoe's self-serve Managed Inference terms do not store inputs or outputs and do not train on them, but prohibit HIPAA-regulated health information and offer no BAA; Band's public terms are silent on HIPAA. Real PHI would need negotiated agreements neither vendor publicly offers today. The demo runs on synthetic patients only. - Inference for anything that holds the transcript fails closed. If Crusoe is unavailable the case pauses; it never silently routes to another provider.

## Run it

```bash doppler setup # project ai-hackday-2026, config dev doppler run -- .venv/bin/python scripts/check_crusoe_tools.py --max 20 doppler run -- make demo FIXTURE=handoff_2 # live: veto on the unowned follow-up, human owner, approve, approved room, graph write ```

Fixtures: `hallway/fixtures/handoff_{1,2,3}` and `visit_1` (`.txt`, `.wav`; synthetic voices; the dialogue scripts are `scripts/fixtures/*.script`). `handoff_2` is the demo: a spoken name and date of birth, a warfarin plus ciprofloxacin interaction, and one follow-up nobody owns. Every step ran live today on case `19ecdb31`.

## How it was built

Two humans, several agents, one rule set (`CLAUDE.md`). Every task is a Linear issue, every change is a pull request, every PR gets an independent local AI review before it opens, humans merge. Erik's side: Claude Code orchestrating, Grok writing code, Astra (Codex) reviewing. Jaiven's side: Astra building, Claude Code reviewing, Grok second-reading. A third Claude session acted as overseer: merged reviewed PRs, held the clock, and challenged claims that were not yet backed by a live run.

Note: the demo URL is substituted with the GitHub repository link.

Tech stack

No comments yet

Be the first to comment on this project.