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:
@@ -32,8 +32,9 @@ export const PACKAGE_TITLE = 'Ten31 Database'
|
||||
// * 0.1.0:64 (email-activity agent: propose->review->approve grid notes; sync ~15 min)
|
||||
// * 0.1.0:65 (Email Capture: per-mailbox captured/matched counts)
|
||||
// * 0.1.0:66 (LP Objections page: UI trigger for the Architect grounding pass)
|
||||
// * Current: 0.1.0:67 (remove LP Objections page — generic/unverifiable; pivot to proactive outreach)
|
||||
export const PACKAGE_VERSION = '0.1.0:67'
|
||||
// * 0.1.0:67 (remove LP Objections page — generic/unverifiable; pivot to proactive outreach)
|
||||
// * Current: 0.1.0:68 (Outreach Draft Assistant — tailored LP drafts via thesis + redaction boundary)
|
||||
export const PACKAGE_VERSION = '0.1.0:68'
|
||||
|
||||
export const DATA_MOUNT_PATH = '/data'
|
||||
export const WEB_PORT = 8080
|
||||
|
||||
@@ -28,8 +28,9 @@ import { v_0_1_0_64 } from './v0.1.0.64'
|
||||
import { v_0_1_0_65 } from './v0.1.0.65'
|
||||
import { v_0_1_0_66 } from './v0.1.0.66'
|
||||
import { v_0_1_0_67 } from './v0.1.0.67'
|
||||
import { v_0_1_0_68 } from './v0.1.0.68'
|
||||
|
||||
export const versionGraph = VersionGraph.of({
|
||||
current: v_0_1_0_67,
|
||||
other: [v_0_1_0_39, v_0_1_0_40, v_0_1_0_41, v_0_1_0_42, v_0_1_0_43, v_0_1_0_44, v_0_1_0_45, v_0_1_0_46, v_0_1_0_47, v_0_1_0_48, v_0_1_0_49, v_0_1_0_50, v_0_1_0_51, v_0_1_0_52, v_0_1_0_53, v_0_1_0_54, v_0_1_0_55, v_0_1_0_56, v_0_1_0_57, v_0_1_0_58, v_0_1_0_59, v_0_1_0_60, v_0_1_0_61, v_0_1_0_62, v_0_1_0_63, v_0_1_0_64, v_0_1_0_65, v_0_1_0_66],
|
||||
current: v_0_1_0_68,
|
||||
other: [v_0_1_0_39, v_0_1_0_40, v_0_1_0_41, v_0_1_0_42, v_0_1_0_43, v_0_1_0_44, v_0_1_0_45, v_0_1_0_46, v_0_1_0_47, v_0_1_0_48, v_0_1_0_49, v_0_1_0_50, v_0_1_0_51, v_0_1_0_52, v_0_1_0_53, v_0_1_0_54, v_0_1_0_55, v_0_1_0_56, v_0_1_0_57, v_0_1_0_58, v_0_1_0_59, v_0_1_0_60, v_0_1_0_61, v_0_1_0_62, v_0_1_0_63, v_0_1_0_64, v_0_1_0_65, v_0_1_0_66, v_0_1_0_67],
|
||||
})
|
||||
|
||||
@@ -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 Ten31’s voice using the thesis + that investor’s 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 () => {} },
|
||||
})
|
||||
Reference in New Issue
Block a user