---
title: Voiceprint Studio
---

# Voiceprint Studio

## What it is

A first-party Omniscio sidebar panel that builds and sharpens an **email style guide** — the document you paste into any AI so it drafts email in _your_ voice. "Voiceprint" here means your **writing** voice, NOT audio / TTS / spoken responses. In-development; gated via the `voiceprint-studio` unreleased feature (default off — reveal via **Settings → Lab** toggle or `AMC_SHOW_VOICEPRINT_STUDIO=1`). Renders as a native built-in virtual project beside the projects sidebar (NON-spawnable — it hosts no Claude session).

## Where to find it

It renders as a native built-in project beside the projects sidebar, so you open it like any other panel and it hosts no Claude session of its own. Because the feature is still in development it stays hidden until you reveal it, from the **Settings → Lab** toggle or the launch switch named in the paragraph above.

## How it behaves

### What it's for

Capturing a person's email voice well enough that an AI can pass for them takes a calibration loop: show the AI a real email you sent, have it try to write that same email _blind_, compare, and turn each "that's not how I'd say it" into a rule. Voiceprint Studio is that loop as an app. Two levers make it converge: the AI **grounds** each draft in the person's REAL sent emails (few-shot), not the guide text alone; and it can **self-train** — draft a held-out test set, grade itself against the real replies, refine the guide from the worst miss, iterate a few rounds under a budget, and only then surface the hard cases to you.

### The four tabs

- **Corpus** — Pull your Gmail **Sent** folder (paginated/resumable, configurable size). Each email gets an auto-guess — **You** (hand-typed, ground truth) or **AI** (Claude-drafted / skip) — with the plain-English reason shown; confirm or flip with one click. The corpus splits into a **training** pool (grounds drafts) and a held-out **test** set (the self-grade eval — never used as an exemplar). AI-suggested **chain exclusions** drop automated / newsletter / no-reply mail so it never trains the voice. **Personas** (Personal vs Work) are separate profiles, each its own corpus/guide/training.
- **Interview** (Calibrate) — Pick a real **You** email. The AI drafts it **blind** and **grounded in your real training emails** — it sees the prior context + guide + a few of your most similar real sends, **never the target's real reply**. Side-by-side: the incoming context · what you sent · what the AI wrote, with a **5-point "how close?"** rating and the AI's own **judge score**. **Blind mode** hides which pane is which (server-fixed order) until **Reveal**. On a miss, a short clickable **interview** (the app's QuestionWidget format) turns the gap into an approved guide rule. A **self-training** panel starts an autonomous run (test-set size / rounds / budget) and shows the score trajectory.
- **Style Guide** — The living guide: editable, versioned, with history. Approved fixes append here, each traced to the comparison that produced it.
- **Progress** — Pass rate + the objective **average judge/closeness score**. When it climbs and stays high, the guide has captured the voice.

### Requirements & graceful states

Pulling the corpus needs **Gmail connected** in Omniscio; generating a blind draft or a rule needs an **Anthropic API key** configured. If either is missing the panel shows a plain message ("Add an Anthropic API key in Omniscio to generate drafts", "make sure Gmail is connected") rather than failing. Each blind draft / rule proposal is a small metered Claude call.

### Privacy / data

Your sent emails are stored locally in Omniscio's SQLite DB only (your machine — nothing new goes external beyond the Gmail read and the metered draft calls). The blind-draft context is built to **exclude your real reply** (a unit test locks this), so the model is never shown the answer it's being compared against.

## For agents

### Where the guide lives

The default profile mirrors the canonical **`~/Claude/default-email-voiceprint.md`**: Studio _seeds_ its first version from that existing file (so it starts from the real guide, not a blank), and every approved fix or manual save _writes back_ to it so the paste-into-any-AI workflow stays current. Writes are atomic with a one-keep `.bak`; opening the panel only **reads** the file — it writes only on explicit **Save** / **Approve**. The DB is the source of truth; the `.md` is the mirror. If the `.md` is hand-edited between sessions, the change is imported as a new version on next open (never clobbered).

### Under the hood (for agents)

- **DB**: base tables in migration `20260623231430-voiceprint-studio-tables.ts`; the interview/self-training redesign adds (migration `20260731020000-voiceprint-selftrain-persona-curation.ts`, additive) `closeness_score` / `judge_score` / `judge_rationale` / `interview_json` / `run_id` on `voiceprint_comparisons`, `split_role` + `excluded` on `voiceprint_corpus`, and a new `voiceprint_runs` table (self-training runs + per-round trajectory). All keyed by `profile_id` (a persona IS a profile). Queries: `src/main/db/queries-voiceprint.ts`.
- **Services** (`src/main/services/voiceprint/`): `heuristic.ts` (you/AI guess), `blind-context.ts` (no-leak context + few-shot grounding + judge prompt), `draft-service.ts` (grounded blind draft + LLM-judge self-grade + rule proposal), `rule-proposal.ts`, `guide-service.ts` (seed / reconcile / atomic mirror / cascade erasure incl. runs), `corpus-pull-service.ts`, `self-training-service.ts` (the autonomous draft→grade→refine loop, budget-bounded), `curation-service.ts` (automated-chain exclusion), `persona-classifier.ts` (personal vs work routing).
- **IPC**: channels in `src/shared/ipc-channels/voiceprint-studio.ts` (self-train / get-run / set-closeness / save-interview / assign-split / estimate-run / ensure-personas / suggest-exclusions / set-excluded added), handlers in `src/main/ipc/voiceprint-studio-handlers.ts`, response types in `src/shared/ipc-response-map/voiceprint-studio.ts`. New renderer invokes are classified in the web-access-ws-invoke baseline (start-self-train BLOCKED as a spending channel) + cli-parity exemptions.
- **UI** (`src/renderer/src/features/voiceprint-studio/`): `voiceprint-studio-store.ts` (zustand) + `VoiceprintStudioView.tsx` shell + `CorpusTab` / `CalibrateTab` / `GuideTab` / `ProgressTab`.
- **Invariants**: see `.claude/memory/contracts/voiceprint-studio-contract.md`.

This is the guide _builder_ only — it never sends email.

## Related

The corpus this panel trains on comes from Gmail, which [Gmail Integration](gmail-integration.md) covers, and what the finished guide is for is set out in [Agent Email](agent-email.md). If your interest is drafting with AI rather than capturing a voice, [AI Writer](ai-writer.md) is the sibling surface.
