From 0943aeb2dff56a4b7960bf9ca78d9f4921633590 Mon Sep 17 00:00:00 2001 From: Keysat Date: Mon, 8 Jun 2026 19:09:58 -0500 Subject: [PATCH] =?UTF-8?q?architect:=20remove=20LP=20Objections=20page=20?= =?UTF-8?q?=E2=80=94=20generic/unverifiable=20output=20(v0.1.0:67)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The summarize-historical-email grounding produced generic, boilerplate objections with no quotes and no source traceability (the minimize step abstracts away the actual email text; the newest-N corpus carries little real objection signal, so the model pattern-completes). Pulled the page (ObjectionsPage component + nav + dispatch). The redaction boundary is kept (reusable for proactive outreach); the dormant /api/architect/ground route is left in place but has no UI trigger. Pivoting to proactive outreach / messaging. Co-Authored-By: Claude Opus 4.8 --- frontend/index.html | 93 ------------------------ start9/0.4/startos/utils.ts | 5 +- start9/0.4/startos/versions/index.ts | 5 +- start9/0.4/startos/versions/v0.1.0.67.ts | 17 +++++ 4 files changed, 23 insertions(+), 97 deletions(-) create mode 100644 start9/0.4/startos/versions/v0.1.0.67.ts diff --git a/frontend/index.html b/frontend/index.html index 5e8ff43..c4e41b9 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -9948,92 +9948,6 @@ ); }; - const ObjectionsPage = ({ token, user, onShowToast }) => { - const isAdmin = user?.role === 'admin'; - const [segment, setSegment] = useState(''); - const [running, setRunning] = useState(false); - const [result, setResult] = useState(null); - const SEGMENTS = [ - ['', 'All LPs'], - ['btc_native_hnwi', 'Bitcoin-native HNWIs'], - ['institution', 'Institutions'], - ['family_office', 'Family offices'], - ['smaller_accredited', 'Smaller accredited ($100k)'], - ['ai_energy_operator', 'AI & energy operators'], - ]; - const FAIL = { - local_model_unavailable: 'The local model (Spark) is unavailable, so nothing was sent to Claude. Try again once it is reachable.', - scrub_unavailable: 'The redaction boundary could not be prepared, so nothing was sent to Claude.', - claude_not_configured: 'The Architect (Claude) is not configured on the server.', - rehydrate_failed: 'Claude returned an unexpected placeholder; the draft was quarantined for safety. Nothing de-anonymized was shown.', - }; - - const run = async () => { - if (running) return; - try { - setRunning(true); - setResult(null); - const res = await api('/api/architect/ground', { - method: 'POST', - body: JSON.stringify(segment ? { segment_key: segment } : {}), - }, token); - setResult(res.data || res); - } catch (err) { - const msg = getErrorMessage(err, 'Grounding failed'); - setResult({ status: 'error', reason: msg }); - onShowToast(msg, 'error'); - } finally { - setRunning(false); - } - }; - - if (!isAdmin) return
Admin only.
; - const ok = result && result.status === 'ok'; - - return ( -
-

LP Objections

-
-
- The Architect reads your matched LP emails and notes on the local model, removes every identifier through the redaction boundary, and asks Claude for the recurring objections and the strongest honest rebuttals. Only de-identified themes ever leave Ten31 — no names, firms, amounts, or addresses. Results are a draft for your review. -
-
- - -
-
- - {running &&
} - - {result && !running && ( -
- {ok ? ( - <> -
- Recurring objections & rebuttals - {result.scrub_stats && result.scrub_stats.tokens != null - ? {result.scrub_stats.tokens} identifiers protected : null} -
-
{result.draft}
-
- Draft for review. Use these to pressure-test the thesis in the Workshop. -
- - ) : ( -
- {FAIL[result.status] || result.reason || 'Grounding did not complete.'} -
- )} -
- )} -
- ); - }; - const EmailCapturePage = ({ token, user, onShowToast }) => { const isAdmin = user?.role === 'admin'; const [status, setStatus] = useState(null); @@ -10837,11 +10751,6 @@ - {user?.role === 'admin' && ( - - )} @@ -10877,7 +10786,6 @@ {page === 'communications' && 'Communications'} {page === 'thesis' && 'Thesis'} {page === 'thesis-workshop' && 'Thesis Workshop'} - {page === 'objections' && 'LP Objections'} {page === 'system-status' && 'System Status'} {page === 'email-capture' && 'Email Capture'} {page === 'feature-requests' && 'Feature Requests'} @@ -10910,7 +10818,6 @@ {page === 'communications' && } {page === 'thesis' && } {page === 'thesis-workshop' && } - {page === 'objections' && } {page === 'system-status' && } {page === 'email-capture' && } {page === 'feature-requests' && } diff --git a/start9/0.4/startos/utils.ts b/start9/0.4/startos/utils.ts index 5a5a3f2..965a9aa 100644 --- a/start9/0.4/startos/utils.ts +++ b/start9/0.4/startos/utils.ts @@ -31,8 +31,9 @@ export const PACKAGE_TITLE = 'Ten31 Database' // * 0.1.0:63 (System Status: storage usage — DB, attachments, backups, disk free) // * 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) -// * Current: 0.1.0:66 (LP Objections page: UI trigger for the Architect grounding pass) -export const PACKAGE_VERSION = '0.1.0:66' +// * 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' export const DATA_MOUNT_PATH = '/data' export const WEB_PORT = 8080 diff --git a/start9/0.4/startos/versions/index.ts b/start9/0.4/startos/versions/index.ts index e36858d..2cdc139 100644 --- a/start9/0.4/startos/versions/index.ts +++ b/start9/0.4/startos/versions/index.ts @@ -27,8 +27,9 @@ import { v_0_1_0_63 } from './v0.1.0.63' 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' export const versionGraph = VersionGraph.of({ - current: v_0_1_0_66, - 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], + 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], }) diff --git a/start9/0.4/startos/versions/v0.1.0.67.ts b/start9/0.4/startos/versions/v0.1.0.67.ts new file mode 100644 index 0000000..ff0612b --- /dev/null +++ b/start9/0.4/startos/versions/v0.1.0.67.ts @@ -0,0 +1,17 @@ +import { VersionInfo } from '@start9labs/start-sdk' + +// Remove the LP Objections page. The summarize-historical-email grounding it ran +// produced generic, unverifiable output with no quotes or source traceability, so it +// is pulled from the UI. The redaction boundary it used is kept (reusable for the +// proactive-outreach work); the backend /api/architect/ground route is left dormant +// (no UI trigger). No schema change. +export const v_0_1_0_67 = VersionInfo.of({ + version: '0.1.0:67', + releaseNotes: { + en_US: [ + 'Removed the LP Objections page — its historical email summary produced generic,', + 'unverifiable output. We are pivoting to proactive outreach and messaging instead.', + ].join(' '), + }, + migrations: { up: async () => {}, down: async () => {} }, +})