Files
gstack/browse
Garry Tan 750161bbbe feat(security): wire TestSavantAI + ensemble into sidebar-agent pre-spawn scan
The sidebar-agent now runs a ML security check on the user message BEFORE
spawning claude. If the content classifier and (gated) transcript classifier
ensemble returns BLOCK, the session is refused with a security_event +
agent_error — the sidepanel renders the approved banner.

Two pieces:

  1. On agent startup, loadTestsavant() warms the classifier in the background.
     First run triggers a 112MB model download from HuggingFace (~30s on
     average broadband). Non-blocking — sidebar stays functional during
     cold-start, shield just reports 'off' until warmed.

  2. preSpawnSecurityCheck() runs the ensemble against the user message:
       - L4 (testsavant_content) always runs
       - L4b (transcript_classifier via Haiku) runs only if L4 flagged at
         >= LOG_ONLY — plan §E1 gating optimization, saves ~70% of Haiku spend
     combineVerdict() applies the BLOCK-requires-both-layers rule, which
     downgrades any single-layer high confidence to WARN. Stack Overflow-style
     instruction-heavy writing false-positives on TestSavantAI alone are
     caught by this degrade — Haiku corrects them when called.

Fail-open everywhere: any subprocess/load/inference error returns confidence=0
so the sidebar keeps working on architectural controls alone. Shield icon
reflects degraded state via getClassifierStatus().

BLOCK path emits both:
  - security_event {verdict, reason, layer, confidence, domain}  (for the
    approved canary-leak banner UX mockup — variant A)
  - agent_error "Session blocked — prompt injection detected..."
    (backward-compat with existing error surface)

Regression test suite still passes (12/12 sidebar-security tests).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 19:05:37 +08:00
..