diff --git a/frontend/index.html b/frontend/index.html
index c4e41b9..5e8ff43 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -9948,6 +9948,92 @@
);
};
+ 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.
+