Skip to content

2026-08-17 · 3 min read

Eight detectors was the wrong cap

The memo that started this project capped v1 at eight detectors. The library ships 29, and the discipline the cap was protecting moved somewhere that holds better.

tiersT0T1T2T3one crossingone verdict

What the memo said

The memo that started this project capped v1 at 8 detectors. The point was never the number. It was scope discipline: a checking library that keeps adding checks becomes a platform, and a platform is a different product with a different maintenance bill. The same memo made ongoing maintenance funding a precondition of starting at all. Both concerns were right, and the cap was the wrong instrument for them.

What actually grew

The catalogue ships 29 detectors today and 28 run after an install. What grew past the cap was the cheap end: 17 of the 29 are rule-based checks. At the 87-token reference input, invisible_text measures 0.038 ms p95, secrets 0.048 ms, output_format 0.001 ms. Holding a deterministic check that costs a fraction of a millisecond outside the set, to protect a count, would have been absurd. Each one is exactly the kind of thing the memo wanted more of: small, exact, maintainable.

The expensive end is where a cap would have meant something, and it stayed close to the original scope. 12 detectors are model-backed, and they are served by 9 published models: eight classifiers sharing one 278M base model, plus the PII tagger. The count that the memo was actually worried about, the number of models somebody has to retrain, re-evaluate and re-export, grew from the original scope by roughly the PII tagger.

Where the discipline moved

A cap on the count was a proxy for cost. What replaced it is a control over the cost itself, in two parts. The tier system decides when anything runs at all:

  • T0: Always runs. Cannot be disabled.
  • T1: Runs on the standard path.
  • T2: Runs on the standard path. Can be disabled by policy.
  • T3: Runs only when a lower tier flags, or when the policy asks for it.

And every detector carries a millisecond budget that the library's CI enforces: a measurement that crosses its ceiling fails the build. That is the control that held. A scan on the common path costs what the tiers admit to it, however many detectors exist in the catalogue, and the budget suite is the reason a new rule can join the set without a meeting about scope.

Why say this at all

Because attentive readers of the launch story will pull on it, and they would be right to. A project that argues for evidence over headline numbers does not get to quietly outgrow its own founding constraint. The cap was wrong; the things it protected, a bounded maintenance bill and a bounded scan cost, are still protected, by mechanisms that measure them directly. The whole set, with what each detector costs, is on the detectors page.

References

  1. [1]The v1 scoping memoInternal. It capped the set at eight detectors and made ongoing maintenance funding a precondition of starting; this post quotes its intent rather than its text.
  2. [2]The full detector set, with each cost
  3. [3]The budget suitetests/test_budgets.py in the library. Every detector carries a millisecond ceiling, and CI fails when a measurement crosses it.
  4. [4]Measured p95 per detector
All posts