OWASP LLM Top 10 — Policy Pack
Why
Two c16 surfaces sit on either side of the same risk model but never touch:
- Policy & Enforcement decides what agents are allowed to do (capability/action; the Audit → Assist → Enforce ladder; tool allow-lists, approval gates, spend ceilings, kill switch).
- Compliance & Frameworks reports what the fleet's behavior means against external standards (OWASP LLM Top 10, MITRE ATLAS, NIST AI RMF…), auto-mapping each finding to the control it touches.
The missing connective tissue is an org opinion on a standard. OWASP LLM Top 10 is purely descriptive — 10 risk categories, no stance on how strict you should be. To act on it you assign, per control, a posture (Accept / Audit / Assist / Enforce) and wire it to the rules that enforce that posture. That object — a policy pack — closes the loop: applying it populates Policy & Enforcement, and the same control tags light up Compliance with stated posture vs. observed reality.
Objective
A single hi-fi mockup of the OWASP LLM Top 10 pack that demonstrates:
- The 10 controls, each with runtime-reach (Strong / Partial / Not instrumented), the shared rules that satisfy it, live findings mapped to it, and an interactive posture selector.
- The shared-rules panel — one rule, many controls (the many-to-many made visible).
- The stated-vs-actual gap — the hero number: controls where you set Assist/Enforce but, because the live system mode is Audit, the mapped findings were only observed.
- Apply-pack affordance that cross-links to the real c16 Policy & Enforcement and Compliance surfaces.
Scope
The modeling decision (the point of the prototype)
A pack is not a monolithic policy that owns its own rules. Control↔rule is many-to-many (LLM06 needs tool-allow-list + approval-gate + kill-switch; egress-allow-list serves both LLM02 and LLM03), and frameworks overlap (OWASP / NIST / ATLAS all touch excessive agency). So:
- Rules are atomic and reusable —
tool-allow-list,approval-gate,dlp-deny,egress-allow-list,spend-ceiling, … own their enforcement logic once. - A pack references rules and maps them to controls + a posture — never duplicates them.
This keeps rules reusable across every future framework pack (SOC 2, NIST AI RMF…) and avoids two packs fighting to enforce the same lever.
Data
Reuses app/data/c16-fleet.ts (qcontrol /api shape) — findings (framework strings
carry LLM02 / LLM06 / LLM10), agents. The pack model itself lives inline in the
page as a prototype (no new fixture).
Status
- Pack mockup
m1—pack.vue(interactive posture per control, shared-rules reuse panel, stated-vs-actual gap, apply-pack cross-links to c16 Policy & Compliance) - Refactor onto the locked governance model (
policy-controls-v1/governance.vue) — supersedes the pack pass. The model: a Policy owns a disjoint set of Controls + one response (alert / human-approval / block); a Control is the atomic enforceable check (owned by exactly one policy) and is satisfied by many Frameworks (read-only views, coverage % = active ÷ referenced); a Control violation fires its owning policy's response. Two linked views (Policies | Frameworks) over one shared reactive activation set — toggling a control recomputes framework coverage live. Model inapp/data/c17-governance.ts; violations derived fromc16-fleetfindings.
Model (locked)
Policy --owns--> Control (1-to-many, disjoint — sets the response)
Framework --satisfied by-> Control (many-to-many, read-only — coverage %)
Control --violated--> its owning policy's response fires
A control is owned by one policy, satisfies many frameworks. Activation drives coverage; a control set once (no policy overlap); framework coverage is coverage, not conformance.
Visual record
6 captures — heroes, page slices, and full-page renders. Click to view.





