outreach: Outreach Draft Assistant — tailored LP drafts (v0.1.0:68)

First proactive-messaging build. New "Outreach" page (all authenticated users): pick an
investor + type (intro / follow-up / fund update / meeting follow-up / nurture) + optional
guidance; the agent drafts a tailored LP email in Ten31's voice, grounded in the thesis +
that investor's CRM notes and matched email history. The draft is editable + copyable;
nothing is sent (draft-only — guardrails #4, #6).

Sovereignty: the thesis is Ten31's own non-sensitive messaging (to Claude as-is); the LP
context is scrubbed through the redaction boundary before Claude, drafted with placeholders,
and re-hydrated locally — the LP list never reaches the API. Fails closed (scrub_unavailable /
claude_not_configured / rehydrate_failed quarantines a hallucinated-token draft).

Backend: mcp/outreach_agent.py (context assembly + scrub + Claude + rehydrate, reusing
architect_agent's client/thesis/voice + the Boundary); routes GET /api/outreach/investors,
POST /api/outreach/draft; logged. Test mcp/test_outreach.py (context assembly). Verified in
preview: page/selector/types/guidance render, fail-closed at the key-less Claude step (scrub
ran locally first), success rendering verified with a mocked ok draft.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Keysat
2026-06-08 20:06:46 -05:00
parent 0943aeb2df
commit b5619d61e1
7 changed files with 378 additions and 4 deletions
+21
View File
@@ -0,0 +1,21 @@
import { VersionInfo } from '@start9labs/start-sdk'
// Outreach Draft Assistant. Pick an investor + an outreach type (intro / follow-up /
// fund update / meeting follow-up / nurture) + optional guidance, and the agent drafts
// a tailored LP email in Ten31's voice, grounded in the thesis + that investor's CRM
// notes and email history. The investor's context is de-identified through the redaction
// boundary before Claude sees it and restored locally — the LP list never leaves Ten31.
// Draft-only: a human reviews, edits, and sends (no auto-send; guardrails #4, #6). New
// backend mcp/outreach_agent.py + routes GET /api/outreach/investors, POST /api/outreach/draft.
export const v_0_1_0_68 = VersionInfo.of({
version: '0.1.0:68',
releaseNotes: {
en_US: [
'New Outreach page: pick an investor and a type, and the Architect drafts a tailored',
'email in Ten31s voice using the thesis + that investors notes and email history. Their',
'details are de-identified before Claude sees them and restored locally. Drafts only —',
'you review, edit, and send. Nothing is sent automatically.',
].join(' '),
},
migrations: { up: async () => {}, down: async () => {} },
})