Catalog
The coverage model is 21 security families by 26 verification lenses, producing 546 explicit hypothesis records with stable IDs. Each record is a review question, not a claim.
The coverage model
The catalog is a cross product: 21 security families multiplied by 26 verification lenses gives 546 explicit hypothesis records with stable IDs. Families identify where a security property lives. Lenses identify how an invariant can fail.
The structure means a new family or a new lens can be added without copying hundreds of near-identical checks, and it means every hypothesis has a predictable ID such as SHX-AUTHZ-L02.
21 families
| ID | Family |
|---|---|
AUTH | Authentication |
SESS | Sessions |
AUTHZ | Authorization / BOLA / BFLA |
INJ | Injection |
API | API Security |
FILE | Files / Uploads |
SSRF | SSRF / URL Fetching |
WEB | Browser / Client |
BIZ | Business Logic |
MONEY | Payments / Accounting |
RACE | Race / Idempotency |
DB | Database / Migrations / RPC |
CRYPTO | Cryptography / Secrets |
SUPPLY | Supply Chain |
CI | CI / CD |
CLOUD | Cloud / Configuration |
PRIV | Privacy / Logging |
AI | AI / Agent / MCP |
OPS | Operational Security |
REL | Release Security |
MAP | Attack Surface Mapping |
26 lenses
The lens list is the more distinctive half. It encodes the ways a control fails rather than the technologies it fails in, which is why the same lens applies across authentication, payments, and agent tooling.
| ID | Lens |
|---|---|
L01 | missing canonical guard |
L02 | null or missing identity |
L03 | lookup/read error |
L04 | alternate endpoint |
L05 | direct-object access |
L06 | bulk operation |
L07 | search/export/list |
L08 | client/server trust |
L09 | stale state |
L10 | retry/replay |
L11 | concurrency |
L12 | process crash |
L13 | timeout/outcome unknown |
L14 | partial success |
L15 | terminal-state transition |
L16 | default/coercion |
L17 | normalization mismatch |
L18 | stored/second-order input |
L19 | boundary mismatch |
L20 | secret/PII exposure |
L21 | configuration drift |
L22 | migration/version drift |
L23 | supply-chain substitution |
L24 | browser/runtime-only failure |
L25 | agent/tool confusion |
L26 | observability honesty |
Inside a record
Each record carries the family, the lens, a review question, the capability tags that drive applicability, the evidence the reviewer needs, and the known false-positive traps for that combination.
{
"id": "SHX-AUTH-L01",
"family_id": "AUTH",
"lens_id": "L01",
"claim_status": "HYPOTHESIS",
"applicability": {
"capability_tags": ["authentication", "identity_lifecycle", "mfa"],
"rule": "ANY_CAPABILITY_PRESENT"
},
"evidence_requirements": [ ... ],
"false_positive_traps": [ ... ]
}The full catalog is catalog/checks.json, with the frozen ID manifest in catalog/hypothesis-ids.txt.
python scripts/validate_catalog.pyClaim policy
The catalog declares its own selection rule and claim policy, and both are enforced downstream.
- Selection rule: evaluate every record with the deterministic four-state applicability engine before review. Missing evidence is UNKNOWN, and only explicit absence is NOT_APPLICABLE.
- Claim policy: every catalog record is an unverified hypothesis. Findings require an evidence chain and, for High and Critical, independent verification.
- Records are review questions selected by architecture applicability, never vulnerability or exploit claims.
- The 21 by 26 shape is a repository invariant. Changing it requires a versioned catalog change and updated validation.