Skip to main content

get_decision_context

get_decision_context returns the full decision picture for one governed asset: every deployed instruction decision from the current deployment publication that applies to the asset (optionally narrowed to one canonical scenario), ranked with the winning instruction first, plus the effective decision and structured business context. It is read-only and advisory — it describes published decisions, it never performs them. Clients that present hyphenated tool names can call it as get-decision-context.

When to useDirect link to When to use

  • You want everything that governs an asset — every applicable instruction with its decision, reason, and provenance — not just one verdict.
  • You want the published business ownership facts (owner, steward, domain, purpose) for an asset as structured fields.
  • For a verdict on one specific proposed use, prefer authorize_use; for the rule list without a verdict, use inspect_governance_rules.

InputDirect link to Input

At least one of asset or proposed_use must be provided.

ParameterTypeRequiredDescription
assetobjectNo*Reference to a governed table or column (shape below).
proposed_usestringNo*Free-text description of an intended use, 1–2000 characters. Without an asset, this answers with a not_supported error today (see below).
scenario_keystringNoA canonical scenario key (for example ai.training) to narrow the read to one scenario. Non-canonical values are rejected with invalid_parameters.

The asset reference is a strict object — exactly these keys, no others:

FieldTypeRequiredDescription
asset.databasestringYesNormalized database name, as shown in the catalog.
asset.schemastringYesNormalized schema name.
asset.tablestringYesNormalized table name.
asset.columnstringNoNormalized column name. Omit it for a table-level reference.

A table-level reference returns decisions scoped to the table and to its columns; column-scoped instructions outrank table-scoped ones in the ranking.

OutputDirect link to Output

A successful call returns one JSON payload discriminated by state. When the state is answered:

FieldDescription
state"answered".
assetThe resolved asset scope; column is always present and null for table-level.
scenario_keyThe scenario filter that was applied, or null for all scenarios.
decisionsEvery applicable instruction record (at least one), in rank order with the winner first: column-level before table-level, then more explicit resolution (selector over collection over taxonomy), then higher priority, then the more restrictive decision.
effective_decisionThe single effective verdict over decisions — one of allow, deny, mask_full, mask_partial, conditional, log_only, retain. An effective require_review is returned as the review_required state instead.
business_contextStructured facts from the asset's published business-context instruction: owner, steward, domain, purpose (each null when not declared), or null when no business-context instruction governs the asset. These are served as fields — you never parse them out of reason prose.
publicationCurrent-publication provenance: publication_id, published_at.

Each entry in decisions is an instruction record citing one deployed instruction decision:

  • decision_id — the cited serving row's UUID; pass it to explain_why to explain this exact record.
  • instruction_key, instruction_family — the stable instruction identity and its family (for example masking, ai_governance, usage_guidance, business_context).
  • scenario_key, scenario_lane — the canonical scenario and its lane (platform, agent, or human).
  • category (enforceable or advisory), priority (integer 0–3, low to critical), weight, enforcement_mode (enforce, monitor, or advisory).
  • decision, decision_reason — the instruction decision value and its bounded reason text.
  • parameters — the instruction's extracted policy parameters, served verbatim; keys inside follow the policy YAML authoring convention rather than the snake_case wire convention.
  • scope, provenance — the resolved asset scope and the policy provenance (policy_id, policy_version_id, policy_name, version_number).
  • primary_resolution_source and resolution_paths — how the asset entered the instruction's scope (selector, collection, or taxonomy; every matching path is kept, with the collection ID or taxonomy type key as ref).
  • conflict_status, conflict_group_id, conflicts_with — the typed conflict state.

Answer statesDirect link to Answer states

All three typed states are possible:

  • answered — as above.
  • review_required — published rows exist but the answer needs review. reason_code is decision_requires_review (the effective decision is an explicit require_review) or conflicted_published_state (applicable rows conflict). The payload keeps decisions, adds next_actions, and — only for conflicts — a conflict group carrying every opposing source, never just the winner.
  • not_enough_published_statereason_code is no_current_publication, no_published_instruction_state, or unresolved_published_target (the latter with unresolved_targets details: policy_name, instruction_key, kind, ref, reason). Missing state is a typed answer, never a fabricated decision.

ExampleDirect link to Example

Request arguments:

{
"asset": {
"database": "acmecloud_demo",
"schema": "public",
"table": "customers"
}
}

Response (trimmed to two of the applicable instructions):

{
"state": "answered",
"asset": {
"database": "acmecloud_demo",
"schema": "public",
"table": "customers",
"column": null
},
"scenario_key": null,
"decisions": [
{
"decision_id": "accef000-0000-4000-8000-000000000008",
"instruction_key": "usage_guidance:spec.usage.prohibitedUses:prohibited",
"instruction_family": "usage_guidance",
"scenario_key": "purpose.prohibited_use",
"scenario_lane": "human",
"category": "advisory",
"priority": 2,
"weight": 1,
"enforcement_mode": "enforce",
"decision": "deny",
"decision_reason": "acme-customer-use v1 usage_guidance:spec.usage.prohibitedUses:prohibited -> deny on acmecloud_demo.public.customers",
"parameters": {
"kind": "prohibited",
"uses": ["marketing", "advertising", "personalization", "ml_training"]
},
"scope": {
"database": "acmecloud_demo",
"schema": "public",
"table": "customers",
"column": null
},
"provenance": {
"policy_id": "accef000-0000-4000-8000-000000000006",
"policy_version_id": "accef000-0000-4000-8000-000000000007",
"policy_name": "AcmeCloud customer use guardrails",
"version_number": 1
},
"primary_resolution_source": "selector",
"resolution_paths": [{ "source": "selector", "ref": null }],
"conflict_status": "none",
"conflict_group_id": null,
"conflicts_with": []
},
{
"decision_id": "accef000-0000-4000-8000-000000000013",
"instruction_key": "business_context:metadata.businessContext",
"instruction_family": "business_context",
"scenario_key": "metadata.domain",
"scenario_lane": "platform",
"category": "advisory",
"priority": 2,
"weight": 1,
"enforcement_mode": "enforce",
"decision": "log_only",
"decision_reason": "acme-customer-use v1 business_context:metadata.businessContext -> log_only on acmecloud_demo.public.customers",
"parameters": {
"owner": "Revenue Operations",
"steward": "privacy-review@example.com",
"domain": "Customer Data",
"purpose": "Customer master data used for approved reporting, analytics, support, and controlled operational exports."
},
"scope": {
"database": "acmecloud_demo",
"schema": "public",
"table": "customers",
"column": null
},
"provenance": {
"policy_id": "accef000-0000-4000-8000-000000000006",
"policy_version_id": "accef000-0000-4000-8000-000000000007",
"policy_name": "AcmeCloud customer use guardrails",
"version_number": 1
},
"primary_resolution_source": "selector",
"resolution_paths": [{ "source": "selector", "ref": null }],
"conflict_status": "none",
"conflict_group_id": null,
"conflicts_with": []
}
],
"effective_decision": "deny",
"business_context": {
"owner": "Revenue Operations",
"steward": "privacy-review@example.com",
"domain": "Customer Data",
"purpose": "Customer master data used for approved reporting, analytics, support, and controlled operational exports."
},
"publication": {
"publication_id": "accef000-0000-4000-8000-000000000001",
"published_at": "2026-07-16T00:00:00.000Z"
}
}

Limits and notesDirect link to Limits and notes

  • proposed_use alone is refused. Without an asset, the call returns a not_supported error — there is no deterministic way to resolve free text to an asset, and the tool never guesses. Resolve the asset first with discover_context.
  • scenario_key must be canonical. Values outside the canonical scenario vocabulary are rejected with invalid_parameters; see Scenarios.
  • business_context follows scope. It is derived from the asset's published business-context instruction row; when a scenario_key filter excludes that row, business_context is null.
  • Metering. Every call that passes input validation consumes one MCP call before any read; over quota, the call fails with quota_exceeded. Calls rejected with invalid_parameters are not metered.
  • Error codes. asset_not_found (the reference does not resolve in this workspace's catalog; cross-workspace references are indistinguishable from not found), invalid_parameters, not_supported, read_failed, plus the shared unauthorized, auth_unavailable, rate_limited, quota_exceeded.