Turn one real AI feature into two governance artifacts an auditor will accept: a risk register that maps each risk to the NIST AI RMF GenAI Profile and the OWASP LLM Top 10, and a one-page acceptable-use policy that is ISO/IEC 42001-aligned and India-DPDP-aware.
This is pure GRC — no exploit, no scan — because the skill it trains is the one that closes the loop on every other lab in this track: translating technical AI risk into governance language that leadership signs, auditors verify, and legal defends. You will optionally use Claude to draft register entries into a schema-enforced structure, but every mapping and control is your judgment call.
~90 minutes, no exploitation · Core tier (maps to module M8 — AI governance, risk & compliance). Runs at ₹0: the frameworks (NIST AI 600-1, OWASP LLM Top 10, DPDP Act/Rules) are free to read; the optional draft step uses Claude at a few paise, or you can write the register by hand.
No install required for the paper artifact. For the optional AI-assisted drafting step:
pip install anthropic pydantic
Pick one real AI feature to govern — ideally one from an earlier lab so the risks are concrete. A good default: the "internal help-desk assistant over a private KB" (the RAG app from Lab 10, or the support copilot from Lab 09). Write its one-paragraph description in feature.md: what it does, what data it touches (KB contents, user queries, any PII), who uses it, and what it can act on. That description is the input to both artifacts.
India currently has no standalone AI law — governance is policy-driven and sector-specific. So the practical control frameworks Indian enterprises adopt (often driven by Fortune-500 client requirements) are NIST AI RMF and ISO 42001, layered over DPDP obligations for personal data. Your AUP therefore cites those, not a nonexistent "AI Act."
Frame the register columns. A register entry auditors accept has, at minimum: risk_id, description, the NIST AI RMF function it falls under (Govern / Map / Measure / Manage), the OWASP LLM Top-10 category it corresponds to, likelihood, impact, a concrete mitigation, and an owner. Lay these as columns in risk-register.md.
Enumerate risks from the actual attack surface. Don't invent generic risks — derive them from what the earlier labs proved. For the help-desk assistant you should capture at least six: indirect prompt injection via KB/ticket content (LLM01), sensitive-information disclosure of KB PII (LLM02), insecure output handling into a downstream sink (LLM05), RAG data poisoning (LLM04), system-prompt leakage (LLM07), and excessive agency if it can act (LLM06). Each is a lab you've done — the register is where you record that you tested it.
Map each risk to NIST AI RMF and score it. For every entry, assign the NIST function (most technical controls are Manage; establishing the policy itself is Govern; identifying the risk is Map; the red-team metric is Measure) and rate likelihood/impact Low/Medium/High with a one-line justification. A prompt-injection risk on a KB fed by user-editable content is High/High; a leakage risk behind strong output filtering might be Low/Medium.
Write real mitigations that point at your controls. The mitigation column is where governance meets the rest of the track: for prompt injection, cite the trust-zone split and taint gates from Lab 09; for poisoning, the provenance filter from Lab 10; for output handling, the encoding + egress allowlist from Lab 11; for excessive agency, the permission matrix from Lab 12; for the whole set, the CI-gated red-team suite from Labs 13–14. A register whose mitigations are real, tested controls is worth ten times one full of "we will monitor."
Optional — draft entries with schema-enforced structure. To accelerate (and to demonstrate structured outputs to auditors), have Claude draft register entries into a Pydantic schema so the output is validated, not free prose. Save draft_register.py:
import anthropic
from pydantic import BaseModel
from typing import Literal
class RiskEntry(BaseModel):
risk_id: str
description: str
nist_ai_rmf: Literal["Govern", "Map", "Measure", "Manage"]
owasp_llm: str # e.g. "LLM01:2025 Prompt Injection"
likelihood: Literal["Low", "Medium", "High"]
impact: Literal["Low", "Medium", "High"]
mitigation: str
owner: str
class RiskRegister(BaseModel):
feature: str
entries: list[RiskEntry]
feature = open("feature.md").read()
client = anthropic.Anthropic()
resp = client.messages.parse(
model="claude-opus-4-8",
max_tokens=2000,
thinking={"type": "adaptive"},
system=("You are a GRC analyst. Draft an AI risk register for the feature. "
"Map each risk to a NIST AI RMF function and an OWASP LLM Top-10 "
"category. Propose concrete, testable mitigations — never 'monitor'. "
"You draft; the human owner approves every entry."),
messages=[{"role": "user", "content": feature}],
output_format=RiskRegister)
reg = resp.parsed_output
for e in reg.entries:
print(f"{e.risk_id} {e.owasp_llm:32} {e.nist_ai_rmf:7} "
f"{e.likelihood}/{e.impact} owner={e.owner}")
The Literal enums make "the model invented a NIST function" an impossible state — the response is schema-valid or it errors. Treat the draft as a first pass you correct, never as the final register; you own every entry.
Write the one-page AUP. In acceptable-use-policy.md, keep it to a page a non-lawyer will actually read, with these sections: (a) Scope — which AI tools and which data classes; (b) Permitted use — approved endpoints only, e.g. client-sanctioned tenancy or local models for sensitive data; (c) Prohibited use — no pasting client PII/secrets/source into unapproved public tools; (d) Data handling — data-minimization and redaction before prompting, tied to DPDP purpose-limitation and security-safeguard duties; (e) Human accountability — a named human owns every AI-assisted decision and every agent action; (f) Incident reporting — reconcile the two India clocks explicitly: CERT-In's 6-hour reporting rule and the DPDP Board's 72-hour rule; (g) Review cadence — the policy is reviewed on a schedule and after any incident. Note the ISO 42001 alignment: the AUP is one control artifact of an AI Management System, referenced by your register's Govern entries.
Close the governance loop. Add a final risk-register.md note stating how the register stays live: each mitigation links to a lab/control and its CI test (Labs 13–14), so a failing red-team build is also a risk-register status change. That link — technical test to governance record — is what makes the register a living control rather than a document written once for an audit.
A risk register earns its keep when every entry maps to a framework an auditor recognizes and to a real, tested control — and an AUP earns its keep when it's short enough to be read and specific enough to be enforced. Governance is where the technical labs become defensible to leadership, auditors, and, under DPDP, regulators.
risk-register.md has ≥6 entries, each with a NIST function, an OWASP LLM category, likelihood/impact with justification, a concrete mitigation, and a named owner.acceptable-use-policy.md fits one page and covers all seven sections, including both the CERT-In 6-hour and DPDP 72-hour clocks.The governance pack: feature.md, risk-register.md, acceptable-use-policy.md, and optionally draft_register.py. Self-grading rubric (pass = 8/10):
Map; the control that reduces it is Manage; the metric that tracks it (bypass rate, poisoning rate) is Measure; the policy/ownership around it is Govern.This lab is inherently client-safe — no data, no live system, only governance documents you can fully anonymize. On a services engagement it is often the billable deliverable: map the client's real AI feature to NIST AI RMF and OWASP LLM Top 10, and produce a DPDP-aware, ISO-42001-aligned AUP their legal and security teams adopt. Redact client identifiers in feature.md, and if you use the AI-draft step, route it through the client's sanctioned endpoint rather than the public API so even the feature description never leaves their boundary. The register-plus-AUP pack is exactly what a client's AI-governance owner (the "Elena" persona) needs to satisfy auditors and Fortune-500 vendor-security requirements.
messages.parse call and Pydantic schema were validated for shape (model claude-opus-4-8, adaptive thinking, no forbidden sampling params); the register content itself is your judgment, which is exactly the point of a GRC exercise.