Manage model risk governance in Domino using policies, bundles, and evidence. Covers creating governance bundles, attaching model artifacts and MLflow results as evidence, progressing through policy stages, and documenting findings. Use when the user mentions governance, compliance, bundles, policies, model risk management, SR 11-7, NIST AI RMF, or audit trails.
68
82%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Passed
No known issues
This skill provides knowledge for managing model risk governance in Domino Data Lab using the Governance API.
TOKEN=$(curl -s http://localhost:8899/access-token)
# Governance is NOT routed through $DOMINO_API_HOST (internal Kubernetes).
# Derive the external cluster URL from the JWT iss claim — works in any workspace type.
CLUSTER_URL=$(echo $TOKEN | cut -d'.' -f2 | python3 -c "
import sys, base64, json, re
p = sys.stdin.read().strip()
p += '=' * (-len(p) % 4)
print(re.sub(r'/auth/realms/.*', '', json.loads(base64.b64decode(p))['iss']))
")
BASE="$CLUSTER_URL/api/governance/v1"A policy is a reusable governance template that defines the stages, evidence requirements, and approval gates a model must pass through. Examples: SR 11-7, NIST AI RMF, internal model risk frameworks. Policies are created by administrators in the Domino UI.
A bundle is the compliance document for a specific model in a specific project. It follows a policy and accumulates evidence as the model progresses through development, validation, and approval. One project can have multiple bundles (e.g., one per model version).
Evidence comes in two forms:
A finding documents a problem, risk, or concern discovered during review. Findings have severity levels and are tracked as part of the audit trail.
All endpoints are under $BASE (/api/governance/v1). Authenticate with Authorization: Bearer $TOKEN.
| Endpoint | Method | Purpose |
|---|---|---|
/policy-overviews | GET | List available policy templates |
/bundles | POST | Create a new governance bundle |
/bundles/{bundleId} | GET | Inspect bundle: stages, attachments, status |
/bundles | GET | List all bundles (filter by projectId) |
/bundles/{bundleId}/attachments | POST | Attach evidence (model versions, reports) |
/rpc/submit-result-to-policy | POST | Answer policy evidence questions |
/bundles/{bundleId}/stages/{stageId} | PATCH | Update stage status (In Progress, Complete) |
/policies/{policyId} | GET | Get full policy with evidenceSet IDs |
/findings | POST | Create a finding (issue) during review |
Follow these steps when setting up governance for a model:
curl -s "$BASE/policy-overviews" \
-H "Authorization: Bearer $TOKEN"Review available templates. Note the id of the policy you want to use.
The project ID is needed to create a bundle. Use the DOMINO_PROJECT_ID environment variable (available inside Domino) or look it up via the gateway API.
curl -X POST "$BASE/bundles" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"projectId": "your-project-id",
"name": "My Model v1.0",
"description": "Description of the model being governed",
"policyId": "policy-uuid"
}'Save the returned id as your BUNDLE_ID.
curl -s "$BASE/bundles/$BUNDLE_ID" \
-H "Authorization: Bearer $TOKEN"This reveals the policy's stage structure, attachments, and approval status. Note: This does NOT return evidenceSet IDs — see Step 6 for how to discover those.
See EVIDENCE-WORKFLOW.md for full details. Two attachment types are supported:
# Attach a registered model version
curl -X POST "$BASE/bundles/$BUNDLE_ID/attachments" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"type":"ModelVersion","identifier":{"name":"model-name","version":5},"name":"Display Name"}'
# Attach a project file (notebook, report, etc.)
curl -X POST "$BASE/bundles/$BUNDLE_ID/attachments" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"type":"Report","identifier":{"branch":"main","commit":"abc...","source":"git","filename":"path/to/file"},"name":"Display Name"}'Evidence questions are the interactive forms shown in the Domino UI under each stage's "Evidence" tab. They are defined in the policy YAML as evidenceSet items.
EvidenceSet IDs are NOT in the bundle response. Fetch them from the policy endpoint:
curl -s "$BASE/policies/$POLICY_ID" \
-H "Authorization: Bearer $TOKEN"The response contains stages[] → evidenceSet[] → artifacts[] with full UUIDs for each evidence item and artifact.
curl -X POST "$BASE/rpc/submit-result-to-policy" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"bundleId": "bundle-uuid",
"policyId": "policy-uuid",
"evidenceId": "evidence-uuid",
"content": {
"artifact-uuid": "value"
}
}'Key details:
policyId (NOT policyVersionId)evidenceId is the evidence set item UUID (from policy response)content is a map of {artifactId: value}As evidence is collected and approvals obtained:
curl -X PATCH "$BASE/bundles/$BUNDLE_ID/stages/$STAGE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"status": "Complete"}'curl -X POST "$BASE/findings" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"bundleId": "bundle-uuid",
"policyVersionId": "policy-version-uuid",
"name": "Finding title",
"title": "Finding title",
"description": "Detailed description...",
"severity": "High",
"approver": {"id": "org-uuid", "name": "model-gov-org"},
"assignee": {"id": "user-uuid", "name": "username"}
}'Get the policyVersionId and user/org IDs from the bundle response (Step 4).
After creating a bundle and attaching evidence, the bundle is visible in the Domino UI: Project > Govern > Bundles > click the bundle name
The UI shows:
Before writing or verifying any API call, use the cluster swagger to confirm current endpoint paths and field names. Use public docs for workflow context and field explanations.
Governance API base: External cluster URL only — $DOMINO_API_HOST (internal Kubernetes) does not route to this service. Derive the URL from the JWT iss claim (works in any workspace type).
Fetch the governance swagger spec (requires bearer token):
TOKEN=$(curl -s http://localhost:8899/access-token)
CLUSTER_URL=$(echo $TOKEN | cut -d'.' -f2 | python3 -c "
import sys, base64, json, re
p = sys.stdin.read().strip()
p += '=' * (-len(p) % 4)
print(re.sub(r'/auth/realms/.*', '', json.loads(base64.b64decode(p))['iss']))
")
curl -H "Authorization: Bearer $TOKEN" "$CLUSTER_URL/api/governance/swagger/doc.json"
# Browser UI (must be logged in): $CLUSTER_URL/api/governance/swagger/index.htmlPublic docs (workflow context and field explanations):
47c6e0a
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.