Decision Gate Docs

Deterministic, replayable gate evaluation with auditable decisions.

Asset Core docs

decision-gate.toml Configuration

Overview

decision-gate.toml configures the MCP server, trust policies, evidence disclosure defaults, and provider registry. All inputs are validated and fail closed on errors.

Top-Level Sections

[server]

Server transport, auth, limits, and audit settings.

FieldTypeDefaultNotes
transport”stdio” | “http” | “sse”stdioTransport protocol for MCP.
mode”strict” | “dev_permissive”strictOperational mode for MCP (dev_permissive is legacy).
tls_termination”server” | “upstream”serverWhere TLS is terminated for HTTP/SSE transport.
bindstringnullBind address for HTTP/SSE transport.
max_body_bytesinteger1048576Maximum JSON-RPC request size in bytes.
limitstable{ max_inflight = 256 }Request limits for MCP server.
authtablenullInbound authentication configuration for MCP tool calls.
tlstablenullTLS configuration for HTTP/SSE transports.
audittable{ enabled = true }Structured audit logging configuration.
feedbacktablen/aFeedback disclosure configuration for tool responses.
toolstable{ mode = “filter”, allowlist = [], denylist = [] }Tool visibility configuration for MCP tool listings.

HTTP/SSE require bind; non-loopback requires explicit CLI opt-in plus TLS or tls_termination = "upstream" + non-local auth.

[server.auth]

Inbound authn/authz for MCP tool calls.

FieldTypeDefaultNotes
mode”local_only” | “bearer_token” | “mtls”local_onlyInbound auth mode for MCP tool calls.
bearer_tokensarray[]Allowed bearer tokens.
mtls_subjectsarray[]Allowed mTLS subjects (via trusted proxy header).
allowed_toolsarray[]Optional tool allowlist for inbound calls.
principalsarray[]Optional principal-to-role mappings.

Bearer token example:

[server.auth]
mode = "bearer_token"
bearer_tokens = ["token-1", "token-2"]
allowed_tools = ["scenario_define", "scenario_start", "scenario_next"]

mTLS subject example (via trusted proxy header):

[server.auth]
mode = "mtls"
mtls_subjects = ["CN=decision-gate-client,O=Example Corp"]

When using mtls mode, the server expects the x-decision-gate-client-subject header from a trusted TLS-terminating proxy.

Principal mapping example (registry ACL):

[[server.auth.principals]]
subject = "loopback"
policy_class = "prod"

[[server.auth.principals.roles]]
name = "TenantAdmin"
tenant_id = 1
namespace_id = 1

Built-in registry ACL expects policy_class values like prod, project, or scratch (case-insensitive). Unknown values are treated as prod.

[server.audit]

Structured audit logging configuration.

FieldTypeDefaultNotes
enabledbooltrueEnable structured audit logging (JSON lines).
pathstringnullAudit log path (JSON lines).
log_precheck_payloadsboolfalseLog raw precheck payloads (explicit opt-in).

[server.feedback]

Feedback disclosure controls for tool responses.

FieldTypeDefaultNotes
scenario_nexttable{ default = “summary”, local_only_default = “trace”, max = “trace” }Feedback policy for scenario_next responses.

Feedback levels: summary (unmet gates only), trace (gate + condition status), evidence (includes evidence records, subject to disclosure policy).

[server.feedback.scenario_next]

Feedback policy for scenario_next responses.

FieldTypeDefaultNotes
default”summary” | “trace” | “evidence”summaryDefault feedback level for non-local requests.
local_only_default”summary” | “trace” | “evidence”traceDefault feedback level for local-only requests.
max”summary” | “trace” | “evidence”traceMaximum feedback level permitted.
trace_subjectsarray[“loopback”, “stdio”]Subject identifiers allowed to request trace feedback.
trace_rolesarray[]Role names allowed to request trace feedback.
evidence_subjectsarray[]Subject identifiers allowed to request evidence feedback.
evidence_rolesarray[]Role names allowed to request evidence feedback.

Local-only defaults apply to loopback/stdio. Subjects and roles are resolved from server.auth.principals.

[server.tools]

Tool visibility configuration for tools/list output.

FieldTypeDefaultNotes
mode”filter” | “passthrough”filterVisibility mode for tools/list output.
allowlistarray[]
denylistarray[]

Visibility is separate from auth: hidden tools are omitted from tools/list and treated as unknown when called.

[server.limits]

Request concurrency and rate limits.

FieldTypeDefaultNotes
max_inflightinteger256Maximum concurrent MCP requests.
rate_limittablenullOptional rate limit configuration.

[server.limits.rate_limit]

Optional token-bucket style rate limit configuration.

FieldTypeDefaultNotes
max_requestsinteger1000Maximum requests per rate limit window.
window_msinteger1000Rate limit window in milliseconds.
max_entriesinteger4096Maximum distinct rate limit entries.

[server.tls]

TLS configuration for HTTP/SSE transports.

FieldTypeDefaultNotes
cert_pathstringn/aServer TLS certificate (PEM).
key_pathstringn/aServer TLS private key (PEM).
client_ca_pathstringnullOptional client CA bundle for mTLS.
require_client_certbooltrueRequire client certificate for mTLS.

[dev]

Explicit dev-permissive overrides (opt-in only).

FieldTypeDefaultNotes
permissiveboolfalseEnable dev-permissive mode (explicit opt-in).
permissive_scope”asserted_evidence_only”asserted_evidence_onlyDev-permissive scope selection.
permissive_ttl_daysintegernullOptional TTL for dev-permissive warnings (days).
permissive_warnbooltrueEmit warnings when dev-permissive enabled/expired.
permissive_exempt_providersarray[“assetcore_read”, “assetcore”]Providers exempt from dev-permissive relaxations.

Dev-permissive is rejected when namespace.authority.mode = "assetcore_http".

[namespace]

Namespace allowlist and authority selection.

FieldTypeDefaultNotes
allow_defaultboolfalseAllow the default namespace ID (1).
default_tenantsarray[]Tenant allowlist required when allow_default is true.
authoritytable{ mode = “none” }Namespace authority backend selection.

[namespace.authority]

Namespace authority backend configuration.

FieldTypeDefaultNotes
mode”none” | “assetcore_http”noneNamespace authority backend selection.
assetcoretablenullAsset Core namespace authority settings.

[namespace.authority.assetcore]

Asset Core namespace authority settings.

FieldTypeDefaultNotes
base_urlstringn/aAsset Core write-daemon base URL.
auth_tokenstringnullOptional bearer token for namespace lookup.
connect_timeout_msinteger500HTTP connect timeout (ms).
request_timeout_msinteger2000HTTP request timeout (ms).

Asset Core authority example:

[namespace.authority]
mode = "assetcore_http"

[namespace.authority.assetcore]
base_url = "http://127.0.0.1:9001"
auth_token = "token"
connect_timeout_ms = 500
request_timeout_ms = 2000

[trust]

Trust lane defaults and provider signature enforcement.

FieldTypeDefaultNotes
default_policy”audit”auditDefault trust policy for providers.
min_lane”verified” | “asserted”verifiedMinimum evidence trust lane accepted.

require_signature form:

[trust]
default_policy = { require_signature = { keys = ["key1.pub"] } }

[evidence]

Evidence disclosure policy defaults.

FieldTypeDefaultNotes
allow_raw_valuesboolfalseAllow raw evidence values to be disclosed.
require_provider_opt_inbooltrueRequire provider opt-in for raw disclosure.

[provider_discovery]

Provider contract/schema disclosure controls.

FieldTypeDefaultNotes
allowlistarray[]Optional allowlist for provider disclosure.
denylistarray[]Provider identifiers denied for disclosure.
max_response_bytesinteger1048576Maximum response size for provider discovery tools.

[anchors]

Evidence anchor policy configuration.

FieldTypeDefaultNotes
providersarray[]Provider-specific anchor requirements.

[[anchors.providers]]

Provider-specific anchor requirements.

FieldTypeRequiredDefaultNotes
provider_idstringyesn/aProvider identifier requiring anchors.
anchor_typestringyesn/aAnchor type identifier expected in results.
required_fieldsarrayyesn/aRequired fields in anchor_value.

Anchor policy example (Asset Core):

[anchors]
[[anchors.providers]]
provider_id = "assetcore_read"
anchor_type = "assetcore.anchor_set"
required_fields = ["assetcore.namespace_id", "assetcore.commit_id", "assetcore.world_seq"]

[policy]

Dispatch policy engine selection.

FieldTypeDefaultNotes
engine”permit_all” | “deny_all” | “static”permit_allDispatch policy engine selection.
statictablenullStatic dispatch policy rules.

Static policy example:

[policy]
engine = "static"

[policy.static]
default = "deny"

[[policy.static.rules]]
effect = "permit"
target_kinds = ["agent"]
require_labels = ["public"]

[policy.static]

Static dispatch policy rules.

FieldTypeDefaultNotes
default”permit” | “deny”denyDefault decision when no rules match.
rulesarray[]Ordered list of static policy rules.

[[policy.static.rules]]

Static policy rule fields.

FieldTypeDefaultNotes
effect”permit” | “deny” | “error”n/aRule effect.
error_messagestringnullError message when effect is ‘error’.
target_kindsarray[]Target kinds that may receive the packet.
targetsarray[]Specific target selectors.
require_labelsarray[]Visibility labels required to match.
forbid_labelsarray[]Visibility labels that block a match.
require_policy_tagsarray[]Policy tags required to match.
forbid_policy_tagsarray[]Policy tags that block a match.
content_typesarray[]Allowed content types.
schema_idsarray[]Allowed schema identifiers.
packet_idsarray[]Allowed packet identifiers.
stage_idsarray[]Allowed stage identifiers.
scenario_idsarray[]Allowed scenario identifiers.

Target selector fields (policy.static.rules.targets):

FieldTypeNotes
target_kind”agent” | “session” | “external” | “channel”Target kind.
target_idstringAgent/session/channel identifier.
systemstringExternal system name (external only).
targetstringExternal target identifier (external only).

[validation]

Comparator validation policy for scenarios and prechecks.

FieldTypeDefaultNotes
strictbooltrueEnforce strict comparator validation.
profile”strict_core_v1”strict_core_v1Strict comparator profile identifier.
allow_permissiveboolfalseExplicit opt-in for permissive validation.
enable_lexicographicboolfalseEnable lexicographic comparators (opt-in per schema).
enable_deep_equalsboolfalseEnable deep equality comparators (opt-in per schema).

Strict validation (default):

[validation]
strict = true
profile = "strict_core_v1"

Permissive validation (explicit opt-in):

[validation]
strict = false
allow_permissive = true

Optional comparator families:

[validation]
enable_lexicographic = true
enable_deep_equals = true

[runpack_storage]

Runpack storage configuration.

FieldTypeRequiredDefaultNotes
type”object_store”yesn/aRunpack storage backend selection.
provider”s3”yesn/aObject-store provider.
bucketstringyesn/aBucket name for runpack storage.
regionstringnonullOptional S3 region override.
endpointstringnonullOptional S3-compatible endpoint.
prefixstringnonullOptional key prefix inside the bucket.
force_path_styleboolnofalseForce path-style addressing (S3-compatible).
allow_httpboolnofalseAllow non-TLS endpoints (explicit opt-in).

[run_state_store]

Run state persistence settings.

FieldTypeDefaultNotes
type”memory” | “sqlite”memoryRun state store backend selection.
pathstringnullSQLite database path.
busy_timeout_msinteger5000SQLite busy timeout (ms).
journal_mode”wal” | “delete”walSQLite journal mode.
sync_mode”full” | “normal”fullSQLite sync mode.
max_versionsintegernullOptional max versions retained per run.

SQLite example:

[run_state_store]
type = "sqlite"
path = "decision-gate.db"
journal_mode = "wal"
sync_mode = "full"
busy_timeout_ms = 5000
max_versions = 1000

[schema_registry]

Schema registry persistence and limits.

FieldTypeDefaultNotes
type”memory” | “sqlite”memorySchema registry backend selection.
pathstringnullSQLite database path.
busy_timeout_msinteger5000SQLite busy timeout (ms).
journal_mode”wal” | “delete”walSQLite journal mode.
sync_mode”full” | “normal”fullSQLite sync mode.
max_schema_bytesinteger1048576Maximum schema payload size in bytes.
max_entriesintegernullOptional max schemas per tenant + namespace.
acltable{ mode = “builtin” }Schema registry ACL configuration.

[schema_registry.acl]

Schema registry ACL configuration.

FieldTypeDefaultNotes
mode”builtin” | “custom”builtinBuilt-in role rules or custom ACL rules.
default”deny” | “allow”denyDefault decision when no rules match (custom only).
allow_local_onlyboolfalseAllow local-only subjects to access the registry when using the built-in ACL.
require_signingboolfalseRequire schema signing metadata on writes.
rulesarray[]Custom ACL rules (mode = custom).

Built-in ACL relies on server.auth.principals for role and policy_class resolution. Without principals, registry access defaults to deny unless allow_local_only is enabled (loopback/stdio only). Enable allow_local_only for dev-only convenience; it bypasses principal mapping for local-only callers.

Custom ACL example:

[schema_registry.acl]
mode = "custom"
default = "deny"

[[schema_registry.acl.rules]]
effect = "allow"
actions = ["register", "list", "get"]
tenants = [1]
namespaces = [1]
roles = ["TenantAdmin", "NamespaceAdmin"]

[[schema_registry.acl.rules]]

Custom ACL rule fields.

FieldTypeDefaultNotes
effect”allow” | “deny”n/aRule effect.
actionsarray[]Registry actions covered by the rule.
tenantsarray[]Tenant identifier scope.
namespacesarray[]Namespace identifier scope.
subjectsarray[]Principal subjects in scope.
rolesarray[]Role names in scope.
policy_classesarray[]Policy class labels in scope.

[docs]

Documentation search and resources configuration.

FieldTypeDefaultNotes
enabledbooltrueEnable docs surfaces globally.
enable_searchbooltrueEnable docs search tool.
enable_resourcesbooltrueEnable MCP resources list/read.
include_default_docsbooltrueInclude the embedded default docs set.
extra_pathsarray[]Extra doc paths to ingest (files or directories).
max_doc_bytesinteger262144Maximum size for a single doc entry in bytes.
max_total_bytesinteger1048576Maximum total docs bytes for the catalog.
max_docsinteger32Maximum number of docs in the catalog.
max_sectionsinteger10Maximum sections returned by docs search.

Docs search and resources are deterministic and local-only by default. Use extra_paths to ingest local markdown files or directories.

[[providers]]

Provider entries register built-in or MCP providers.

FieldTypeRequiredDefaultNotes
namestringyesn/aProvider identifier.
type”builtin” | “mcp”yesn/aProvider kind.
commandarrayno[]
urlstringnonullProvider HTTP URL.
allow_insecure_httpboolnofalseAllow http:// URLs for MCP providers.
capabilities_pathstringnonullPath to provider capability contract JSON.
authtablenonull
trustunknownnonullDefault trust policy for providers.
allow_rawboolnofalseAllow raw evidence disclosure for this provider.
timeoutstableno{ connect_timeout_ms = 2000, request_timeout_ms = 10000 }HTTP timeout overrides for MCP providers.
configjsonnonullProvider-specific config blob.

auth form:

auth = { bearer_token = "token" }

trust override form:

trust = { require_signature = { keys = ["provider.pub"] } }

capabilities_path example for MCP providers:

[[providers]]
name = "mongo"
type = "mcp"
command = ["mongo-provider", "--stdio"]
capabilities_path = "contracts/mongo_provider.json"

timeouts form (HTTP MCP providers):

timeouts = { connect_timeout_ms = 2000, request_timeout_ms = 10000 }

HTTP provider example with timeouts:

[[providers]]
name = "ci"
type = "mcp"
url = "https://ci.example.com/rpc"
capabilities_path = "contracts/ci_provider.json"
timeouts = { connect_timeout_ms = 2000, request_timeout_ms = 10000 }

Timeout constraints:

  • connect_timeout_ms must be between 100 and 10000.
  • request_timeout_ms must be between 500 and 30000 and >= connect_timeout_ms.

[providers.timeouts]

Timeout overrides for HTTP MCP providers.

FieldTypeDefaultNotes
connect_timeout_msinteger2000TCP/TLS connect timeout (ms).
request_timeout_msinteger10000Total request timeout (ms).

Built-In Provider Config

Built-in providers accept optional config blocks:

  • time:
    • allow_logical (bool, default true)
  • env:
    • allowlist (array)
    • denylist (array)
    • max_value_bytes (integer)
    • max_key_bytes (integer)
    • overrides (table)
  • json:
    • root (string)
    • root_id (string)
    • max_bytes (integer)
    • allow_yaml (bool)
  • http:
    • allow_http (bool)
    • timeout_ms (integer)
    • max_response_bytes (integer)
    • allowed_hosts (array)
    • user_agent (string)
    • hash_algorithm (string)