mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-02 11:45:20 +02:00
07745e046d
10 tests pinning the defense-in-depth contract between the existing
content-security.ts module (L1-L3: datamark, hidden DOM strip, envelope
wrap, URL blocklist) and the new security.ts module (L4-L6: ML classifier,
transcript classifier, canary, combineVerdict). Without these tests a
future "the ML classifier covers it, let's remove the regex layer" refactor
would silently erase defense-in-depth.
Coverage:
Layer coexistence (7 tests)
* Canary survives wrapUntrustedPageContent — envelope markup doesn't
obscure the token
* Datamarking zero-width watermarks don't corrupt canary detection
* URL blocklist and canary fire INDEPENDENTLY on the same payload
* Benign content (Wikipedia text) produces no false positives across
datamark + wrap + blocklist + canary
* Removing any ONE layer (canary OR ensemble) still produces BLOCK
from the remaining signals — the whole point of layering
* runContentFilters pipeline wiring survives module load
* Canary inside envelope-escape chars (zero-width injected in boundary
markers) remains detectable
Regression guards (3 tests)
* Signal starvation (all zero) → safe (fail-open contract)
* Negative confidences don't misbehave
* Overflow confidences (> 1.0) still resolve to BLOCK, not crash
All 10 tests pass in 16ms. Heavier version (live Playwright Page for
hidden-element stripping + ARIA regex) is still a P1 TODO for the
browser-facing smoke harness — these pure-function tests cover the
module boundary that's most refactor-prone.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>