Documentation preview. These pages target Registryctl v0.15.0, which is not published yet. Public download commands will not work until that release exists. For runnable released instructions, use v0.13.0.
Registry Notary configuration describes caller authentication, service policy, claims, disclosure, issuance, state, and operations. Registry-backed source access is represented only by one Relay connection plus compiler-produced consultation expectations. Direct registry connections and adapter runtimes are not valid Notary configuration.
The complete deserialization-oriented Draft 2020-12 schema is committed at
schemas/registry-notary.config.schema.json.
Reproduce it with just config-schema-generate, verify drift with just config-schema-check, or print the exact same bytes with registry-notary schema. The schema checks document structure, closed objects, tagged
variants, scalar types, and key paths. JSON Schema deliberately leaves custom
duration, socket-address, CIDR, and consultation-input grammars to the same
runtime parsers that deserialize them, avoiding a narrower duplicate grammar.
registry-notary doctor remains authoritative for environment and secret
availability, filesystem and Relay access, deployment gates, and cross-field
runtime validation.
Bounded batch settings
Section titled “Bounded batch settings”The batch platform ceiling is 100 items and cannot be raised. Set
evidence.inline_batch_limit to lower the service-wide limit, then use
evidence.claims[].operations.batch_evaluate.max_subjects to lower it for an
individual claim. Both fields accept only integers from 1 through 100. Notary
rejects zero or values above 100 at configuration load.
For a request, the effective limit is the lowest of 100, the global value, and the value of every selected claim. A request above that limit is rejected before quota, idempotency, Relay, source, or retained-state side effects.
evidence.concurrency.subjects controls parallel member work and defaults to
16. Relay concurrency is independently bounded by the Relay client and
defaults to 8. Keep the outer server.request_timeout at least five seconds
above the 25 second Relay operation deadline for registry-backed evaluation;
the default is 30 seconds. These controls compose with the 1 MiB inbound body,
64 KiB per-Relay-result, and 256 consultation-group limits. They do not replace
the 100-member ceiling.
OID4VCI 1.0 profile
Section titled “OID4VCI 1.0 profile”Enabled OID4VCI configuration requires
oid4vci.pre_authorized_code.enabled: true. The only wallet-facing grant is
issuer-initiated pre-authorized code. oid4vci.nonce.enabled controls the
transaction-bound proof nonce returned by the token response; it does not mount
a public nonce route. oid4vci.nonce_endpoint must be omitted, and
oid4vci.offer_endpoint has no route effect in the 1.0 profile.
oid4vci.pre_authorized_code.tx_code.required defaults to true. An explicit
false setting, including the Walt compatibility profile, requires
pre_authorized_code_ttl_seconds of no more than 300. The no-PIN offer is
single-use bearer credential material until redemption and must remain covered
by rate limits and disclosure controls.
CEL worker lifecycle
Section titled “CEL worker lifecycle”Registry Notary starts a CEL worker pool only when at least one configured
claim uses CEL. Before listener binding, every initial worker must answer one
fixed, value-free CEL protocol probe and remain live through activation. One
10-second wall-clock deadline covers the complete concurrent spawn-and-probe
batch; it is not a separate allowance for each worker. The bound is
product-owned and is not a configuration field. A missing, non-executable,
sleeping, resource-constrained, exited, or wrong-protocol worker fails
activation with notary.cel.worker_unavailable. Timed-out or rejected worker
process groups are terminated before they can be admitted.
Only workers that pass the probe count toward readiness. A replacement starts in the background and does not receive work until the same probe passes. A healthy replacement is installed even when another worker in its concurrent replacement batch fails; initial activation still requires the complete configured capacity. Readiness remains false while required capacity is missing or warming. The failed evaluation is not retried and does not wait for replacement startup.
cel.eval_timeout_ms applies only after a proven worker receives an
evaluation. Its default is 2,000 ms and its accepted range is 1 through
30,000 ms. The startup wall-clock deadline and evaluation deadline are
independent; neither consumes or multiplies the other.
The remaining CEL controls have these defaults and accepted bounds:
| Field | Default | Accepted values |
|---|---|---|
cel.worker_count | 2 | 1 through 16 |
cel.allow_regex | false | Boolean |
cel.max_expression_bytes | 8,192 | 1 through 262,144 |
cel.max_binding_json_bytes | 65,536 | 1 through 1,048,576 |
cel.max_result_json_bytes | 16,384 | 1 through 1,048,576 |
cel.max_string_bytes | 16,384 | 1 through 262,144 |
cel.max_list_items | 1,024 | 1 through 100,000 |
cel.max_object_depth | 16 | 1 through 64 |
cel.max_object_keys | 256 | 1 through 2,048 |
cel.worker_memory_bytes | 134,217,728 | 33,554,432 through 1,073,741,824 |
cel.worker_stderr_bytes | 1,024 | 1 through 65,536 |
The worker subprocess receives a cleared environment plus the platform’s minimal process environment. Registry Notary does not expose probe requests, responses, CEL expressions, bindings, stderr, paths, or environment values through readiness or the public activation failure.
auditaudit.hash_secret_envaudit.max_filesaudit.max_size_mbaudit.pathaudit.sinkaudit.syslog_socket_pathauthauth.access_token_signingauth.access_token_signing.access_token_ttl_secondsauth.access_token_signing.allowed_algorithmsauth.access_token_signing.allowed_algorithms[]auth.access_token_signing.audiencesauth.access_token_signing.audiences[]auth.access_token_signing.enabledauth.access_token_signing.issuerauth.access_token_signing.signing_key_idauth.access_token_signing.token_typauth.access_token_signing.verification_key_idsauth.access_token_signing.verification_key_ids[]auth.api_keysauth.api_keys[]auth.api_keys[].authorization_detailsauth.api_keys[].authorization_details.access_modeauth.api_keys[].authorization_details.actionsauth.api_keys[].authorization_details.actions[]auth.api_keys[].authorization_details.assisted_access_contextauth.api_keys[].authorization_details.assisted_access_context.channelauth.api_keys[].authorization_details.assurance_levelauth.api_keys[].authorization_details.claimsauth.api_keys[].authorization_details.claims[]auth.api_keys[].authorization_details.claims[].idauth.api_keys[].authorization_details.claims[].versionauth.api_keys[].authorization_details.consent_refauth.api_keys[].authorization_details.disclosureauth.api_keys[].authorization_details.formatauth.api_keys[].authorization_details.jurisdictionauth.api_keys[].authorization_details.legal_basis_refauth.api_keys[].authorization_details.locationsauth.api_keys[].authorization_details.locations[]auth.api_keys[].authorization_details.purposeauth.api_keys[].authorization_details.relationshipauth.api_keys[].authorization_details.relationship.proof_claimauth.api_keys[].authorization_details.relationship.relationship_typeauth.api_keys[].authorization_details.schema_versionauth.api_keys[].authorization_details.subjectauth.api_keys[].authorization_details.subject.binding_claimauth.api_keys[].authorization_details.subject.id_typeauth.api_keys[].authorization_details.targetauth.api_keys[].authorization_details.target.idauth.api_keys[].authorization_details.target.id_typeauth.api_keys[].authorization_details.typeauth.api_keys[].fingerprintauth.api_keys[].fingerprint.nameauth.api_keys[].fingerprint.pathauth.api_keys[].fingerprint.providerauth.api_keys[].idauth.api_keys[].scopesauth.api_keys[].scopes[]auth.bearer_tokensauth.bearer_tokens[]auth.bearer_tokens[].authorization_detailsauth.bearer_tokens[].authorization_details.access_modeauth.bearer_tokens[].authorization_details.actionsauth.bearer_tokens[].authorization_details.actions[]auth.bearer_tokens[].authorization_details.assisted_access_contextauth.bearer_tokens[].authorization_details.assisted_access_context.channelauth.bearer_tokens[].authorization_details.assurance_levelauth.bearer_tokens[].authorization_details.claimsauth.bearer_tokens[].authorization_details.claims[]auth.bearer_tokens[].authorization_details.claims[].idauth.bearer_tokens[].authorization_details.claims[].versionauth.bearer_tokens[].authorization_details.consent_refauth.bearer_tokens[].authorization_details.disclosureauth.bearer_tokens[].authorization_details.formatauth.bearer_tokens[].authorization_details.jurisdictionauth.bearer_tokens[].authorization_details.legal_basis_refauth.bearer_tokens[].authorization_details.locationsauth.bearer_tokens[].authorization_details.locations[]auth.bearer_tokens[].authorization_details.purposeauth.bearer_tokens[].authorization_details.relationshipauth.bearer_tokens[].authorization_details.relationship.proof_claimauth.bearer_tokens[].authorization_details.relationship.relationship_typeauth.bearer_tokens[].authorization_details.schema_versionauth.bearer_tokens[].authorization_details.subjectauth.bearer_tokens[].authorization_details.subject.binding_claimauth.bearer_tokens[].authorization_details.subject.id_typeauth.bearer_tokens[].authorization_details.targetauth.bearer_tokens[].authorization_details.target.idauth.bearer_tokens[].authorization_details.target.id_typeauth.bearer_tokens[].authorization_details.typeauth.bearer_tokens[].fingerprintauth.bearer_tokens[].fingerprint.nameauth.bearer_tokens[].fingerprint.pathauth.bearer_tokens[].fingerprint.providerauth.bearer_tokens[].idauth.bearer_tokens[].scopesauth.bearer_tokens[].scopes[]auth.oidcauth.oidc.allow_insecure_localhostauth.oidc.allowed_algorithmsauth.oidc.allowed_algorithms[]auth.oidc.allowed_clientsauth.oidc.allowed_clients[]auth.oidc.allowed_token_typesauth.oidc.allowed_token_types[]auth.oidc.audiencesauth.oidc.audiences[]auth.oidc.issuerauth.oidc.jwks_urlauth.oidc.leewayauth.oidc.principal_claimauth.oidc.scope_claimauth.oidc.scope_mapauth.oidc.scope_map.*auth.oidc.scope_map.*[]auth.oidc.scope_separatorauth.oidc.userinfo_endpointauth.oidc.userinfo_issuersauth.oidc.userinfo_issuers[]celcel.allow_regexcel.eval_timeout_mscel.max_binding_json_bytescel.max_expression_bytescel.max_list_itemscel.max_object_depthcel.max_object_keyscel.max_result_json_bytescel.max_string_bytescel.modecel.worker_countcel.worker_memory_bytescel.worker_stderr_bytesconfig_trustconfig_trust.antirollback_state_pathconfig_trust.break_glass_override_pathconfig_trust.bundle_pathconfig_trust.trust_anchor_pathcredential_statuscredential_status.base_urlcredential_status.enabledcredential_status.retention_secondsdeploymentdeployment.evidencedeployment.evidence.audit_ack_cursor_pathdeployment.evidence.audit_ack_max_age_secsdeployment.evidence.audit_offhost_shippingdeployment.evidence.signer_custody_approveddeployment.multi_instancedeployment.profiledeployment.waiversdeployment.waivers[]deployment.waivers[].expiresdeployment.waivers[].findingdeployment.waivers[].referencedeployment.waivers[].summaryevidenceevidence.allowed_purposesevidence.allowed_purposes[]evidence.api_base_urlevidence.api_versionevidence.claimsevidence.claims[]evidence.claims[].cccevevidence.claims[].cccev.evidence_typeevidence.claims[].cccev.evidence_type_irievidence.claims[].cccev.requirement_typeevidence.claims[].credential_profilesevidence.claims[].credential_profiles[]evidence.claims[].depends_onevidence.claims[].depends_on[]evidence.claims[].disclosureevidence.claims[].disclosure.allowedevidence.claims[].disclosure.allowed[]evidence.claims[].disclosure.defaultevidence.claims[].disclosure.downgradeevidence.claims[].evidence_modeevidence.claims[].evidence_mode.consultationsevidence.claims[].evidence_mode.consultations.*evidence.claims[].evidence_mode.consultations.*.inputsevidence.claims[].evidence_mode.consultations.*.inputs.*evidence.claims[].evidence_mode.consultations.*.outputsevidence.claims[].evidence_mode.consultations.*.outputs.*evidence.claims[].evidence_mode.consultations.*.outputs.*.max_bytesevidence.claims[].evidence_mode.consultations.*.outputs.*.maximumevidence.claims[].evidence_mode.consultations.*.outputs.*.minimumevidence.claims[].evidence_mode.consultations.*.outputs.*.nullableevidence.claims[].evidence_mode.consultations.*.outputs.*.typeevidence.claims[].evidence_mode.consultations.*.profileevidence.claims[].evidence_mode.consultations.*.profile.contract_hashevidence.claims[].evidence_mode.consultations.*.profile.idevidence.claims[].evidence_mode.typeevidence.claims[].formatsevidence.claims[].formats[]evidence.claims[].idevidence.claims[].inputsevidence.claims[].inputs[]evidence.claims[].inputs[].nameevidence.claims[].inputs[].typeevidence.claims[].ootsevidence.claims[].oots.authentication_level_of_assuranceevidence.claims[].oots.enabledevidence.claims[].oots.evidence_type_classificationevidence.claims[].oots.evidence_type_listevidence.claims[].oots.languagesevidence.claims[].oots.languages[]evidence.claims[].oots.reference_frameworkevidence.claims[].oots.requirementevidence.claims[].operationsevidence.claims[].operations.batch_evaluateevidence.claims[].operations.batch_evaluate.enabledevidence.claims[].operations.batch_evaluate.max_subjectsevidence.claims[].operations.evaluateevidence.claims[].operations.evaluate.enabledevidence.claims[].purposeevidence.claims[].required_scopesevidence.claims[].required_scopes[]evidence.claims[].ruleevidence.claims[].rule.bindingsevidence.claims[].rule.bindings.claimsevidence.claims[].rule.bindings.claims.*evidence.claims[].rule.bindings.claims.*.binding_typeevidence.claims[].rule.bindings.claims.*.claimevidence.claims[].rule.bindings.varsevidence.claims[].rule.consultationevidence.claims[].rule.expressionevidence.claims[].rule.outputevidence.claims[].rule.typeevidence.claims[].semanticsevidence.claims[].semantics.conceptevidence.claims[].semantics.derived_fromevidence.claims[].semantics.derived_from[]evidence.claims[].semantics.predicateevidence.claims[].semantics.propertyevidence.claims[].semantics.value_mappingevidence.claims[].semantics.vocabularyevidence.claims[].subject_typeevidence.claims[].titleevidence.claims[].valueevidence.claims[].value.max_bytesevidence.claims[].value.nullableevidence.claims[].value.typeevidence.claims[].value.unitevidence.claims[].versionevidence.claims_urlevidence.concurrencyevidence.concurrency.subjectsevidence.credential_profilesevidence.credential_profiles.*evidence.credential_profiles.*.allowed_claimsevidence.credential_profiles.*.allowed_claims[]evidence.credential_profiles.*.disclosureevidence.credential_profiles.*.disclosure.allowedevidence.credential_profiles.*.disclosure.allowed[]evidence.credential_profiles.*.formatevidence.credential_profiles.*.holder_bindingevidence.credential_profiles.*.holder_binding.allowed_did_methodsevidence.credential_profiles.*.holder_binding.allowed_did_methods[]evidence.credential_profiles.*.holder_binding.modeevidence.credential_profiles.*.holder_binding.proof_of_possessionevidence.credential_profiles.*.issuerevidence.credential_profiles.*.signing_keyevidence.credential_profiles.*.validity_secondsevidence.credential_profiles.*.vctevidence.enabledevidence.formats_urlevidence.inline_batch_limitevidence.machine_quotaevidence.machine_quota.enabledevidence.machine_quota.subjects_per_minuteevidence.max_credential_validity_secondsevidence.relayevidence.relay.allow_insecure_localhostevidence.relay.allowed_private_cidrsevidence.relay.allowed_private_cidrs[]evidence.relay.base_urlevidence.relay.max_in_flightevidence.relay.token_fileevidence.relay.workload_client_idevidence.service_idevidence.signing_keysevidence.signing_keys.*evidence.signing_keys.*.algevidence.signing_keys.*.key_id_hexevidence.signing_keys.*.key_labelevidence.signing_keys.*.kidevidence.signing_keys.*.module_pathevidence.signing_keys.*.password_envevidence.signing_keys.*.pathevidence.signing_keys.*.pin_envevidence.signing_keys.*.private_jwk_envevidence.signing_keys.*.providerevidence.signing_keys.*.public_jwk_envevidence.signing_keys.*.publish_until_unix_secondsevidence.signing_keys.*.statusevidence.signing_keys.*.token_labelevidence.variablesevidence.variables.*evidence.variables.*.fromevidence.variables.*.typefederationfederation.clock_leeway_secondsfederation.emergency_denylistfederation.emergency_denylist.kidsfederation.emergency_denylist.kids[]federation.emergency_denylist.node_idsfederation.emergency_denylist.node_ids[]federation.enabledfederation.evaluation_profilesfederation.evaluation_profiles[]federation.evaluation_profiles[].assurance_levelfederation.evaluation_profiles[].claim_idfederation.evaluation_profiles[].consent_reffederation.evaluation_profiles[].disclosurefederation.evaluation_profiles[].idfederation.evaluation_profiles[].jurisdictionfederation.evaluation_profiles[].legal_basis_reffederation.evaluation_profiles[].max_claim_result_age_secondsfederation.evaluation_profiles[].rulesetfederation.evaluation_profiles[].subject_id_typefederation.federation_apifederation.inbound_body_limit_bytesfederation.issuerfederation.jwks_urifederation.max_request_lifetime_secondsfederation.node_idfederation.pairwise_subject_hashfederation.pairwise_subject_hash.secret_envfederation.peersfederation.peers[]federation.peers[].allow_insecure_localhostfederation.peers[].allow_insecure_private_networkfederation.peers[].allowed_profilesfederation.peers[].allowed_profiles[]federation.peers[].allowed_protocol_versionsfederation.peers[].allowed_protocol_versions[]federation.peers[].allowed_purposesfederation.peers[].allowed_purposes[]federation.peers[].evaluation_scopesfederation.peers[].evaluation_scopes[]federation.peers[].issuerfederation.peers[].jwks_urifederation.peers[].node_idfederation.response_shapingfederation.response_shaping.minimum_denial_latency_msfederation.signingfederation.signing.signing_keyfederation.supported_protocol_versionsfederation.supported_protocol_versions[]instanceinstance.environmentinstance.idinstance.jurisdictioninstance.ownerinstance.public_base_urloid4vcioid4vci.accepted_token_audiencesoid4vci.accepted_token_audiences[]oid4vci.authorizationoid4vci.authorization.require_pkce_methodoid4vci.authorization_serversoid4vci.authorization_servers[]oid4vci.credential_configurationsoid4vci.credential_configurations.*oid4vci.credential_configurations.*.claim_idoid4vci.credential_configurations.*.claimsoid4vci.credential_configurations.*.claims[]oid4vci.credential_configurations.*.claims[].display_nameoid4vci.credential_configurations.*.claims[].idoid4vci.credential_configurations.*.claims[].output_pathoid4vci.credential_configurations.*.claims[].output_path[]oid4vci.credential_configurations.*.claims[].sdoid4vci.credential_configurations.*.credential_profileoid4vci.credential_configurations.*.cryptographic_binding_methods_supportedoid4vci.credential_configurations.*.cryptographic_binding_methods_supported[]oid4vci.credential_configurations.*.displayoid4vci.credential_configurations.*.display.background_coloroid4vci.credential_configurations.*.display.background_imageoid4vci.credential_configurations.*.display.background_image.alt_textoid4vci.credential_configurations.*.display.background_image.urioid4vci.credential_configurations.*.display.background_image.urloid4vci.credential_configurations.*.display.descriptionoid4vci.credential_configurations.*.display.localeoid4vci.credential_configurations.*.display.logooid4vci.credential_configurations.*.display.logo.alt_textoid4vci.credential_configurations.*.display.logo.urioid4vci.credential_configurations.*.display.logo.urloid4vci.credential_configurations.*.display.secondary_imageoid4vci.credential_configurations.*.display.secondary_image.alt_textoid4vci.credential_configurations.*.display.secondary_image.urioid4vci.credential_configurations.*.display.secondary_image.urloid4vci.credential_configurations.*.display.text_coloroid4vci.credential_configurations.*.display_nameoid4vci.credential_configurations.*.formatoid4vci.credential_configurations.*.proof_signing_alg_values_supportedoid4vci.credential_configurations.*.proof_signing_alg_values_supported[]oid4vci.credential_configurations.*.scopeoid4vci.credential_configurations.*.vctoid4vci.credential_endpointoid4vci.credential_issueroid4vci.displayoid4vci.display[]oid4vci.display[].localeoid4vci.display[].logooid4vci.display[].logo.alt_textoid4vci.display[].logo.urioid4vci.display[].logo.urloid4vci.display[].nameoid4vci.enabledoid4vci.nonceoid4vci.nonce.enabledoid4vci.nonce.ttl_secondsoid4vci.nonce_endpointoid4vci.offer_endpointoid4vci.pre_authorized_codeoid4vci.pre_authorized_code.enabledoid4vci.pre_authorized_code.esignetoid4vci.pre_authorized_code.esignet.allow_insecure_localhostoid4vci.pre_authorized_code.esignet.authorize_urloid4vci.pre_authorized_code.esignet.client_idoid4vci.pre_authorized_code.esignet.client_signing_key_idoid4vci.pre_authorized_code.esignet.issueroid4vci.pre_authorized_code.esignet.jwks_urioid4vci.pre_authorized_code.esignet.login_state_ttl_secondsoid4vci.pre_authorized_code.esignet.redirect_urioid4vci.pre_authorized_code.esignet.scopesoid4vci.pre_authorized_code.esignet.scopes[]oid4vci.pre_authorized_code.esignet.token_urloid4vci.pre_authorized_code.esignet.userinfo_urloid4vci.pre_authorized_code.pre_authorized_code_ttl_secondsoid4vci.pre_authorized_code.tx_codeoid4vci.pre_authorized_code.tx_code.input_modeoid4vci.pre_authorized_code.tx_code.lengthoid4vci.pre_authorized_code.tx_code.requiredoid4vci.proofoid4vci.proof.max_age_secondsoid4vci.proof.max_clock_skew_secondsserverserver.admin_listenerserver.admin_listener.bindserver.admin_listener.modeserver.bindserver.corsserver.cors.allowed_originsserver.cors.allowed_origins[]server.http1_header_read_timeoutserver.max_connectionsserver.openapi_requires_authserver.request_body_timeoutserver.request_timeoutserver.trusted_proxy_ipsserver.trusted_proxy_ips[]statestate.postgresqlstate.postgresql.connect_timeout_msstate.postgresql.max_connectionsstate.postgresql.operation_timeout_msstate.postgresql.root_certificate_pathstate.postgresql.sensitive_state_key_envstate.postgresql.url_envstate.storagesubject_accesssubject_access.allowed_claimssubject_access.allowed_claims[]subject_access.allowed_disclosuressubject_access.allowed_disclosures[]subject_access.allowed_formatssubject_access.allowed_formats[]subject_access.allowed_operationssubject_access.allowed_operations.batch_evaluatesubject_access.allowed_operations.evaluatesubject_access.allowed_operations.issue_credentialsubject_access.allowed_operations.rendersubject_access.allowed_purposessubject_access.allowed_purposes[]subject_access.allowed_wallet_originssubject_access.allowed_wallet_origins[]subject_access.citizen_clientssubject_access.citizen_clients.allowed_audiencessubject_access.citizen_clients.allowed_audiences[]subject_access.citizen_clients.allowed_client_idssubject_access.citizen_clients.allowed_client_ids[]subject_access.credential_profilessubject_access.credential_profiles[]subject_access.delegationsubject_access.delegation.allowed_relationshipssubject_access.delegation.allowed_relationships[]subject_access.delegation.allowed_relationships[].allowed_claimssubject_access.delegation.allowed_relationships[].allowed_claims[]subject_access.delegation.allowed_relationships[].allowed_disclosuressubject_access.delegation.allowed_relationships[].allowed_disclosures[]subject_access.delegation.allowed_relationships[].allowed_formatssubject_access.delegation.allowed_relationships[].allowed_formats[]subject_access.delegation.allowed_relationships[].allowed_purposessubject_access.delegation.allowed_relationships[].allowed_purposes[]subject_access.delegation.allowed_relationships[].credential_profilessubject_access.delegation.allowed_relationships[].credential_profiles[]subject_access.delegation.allowed_relationships[].proof_claimsubject_access.delegation.allowed_relationships[].relationship_typesubject_access.delegation.allowed_relationships[].target_id_typesubject_access.delegation.enabledsubject_access.enabledsubject_access.rate_limitssubject_access.rate_limits.credential_issuance_per_principal_per_hoursubject_access.rate_limits.invalid_token_per_client_address_per_minutesubject_access.rate_limits.per_holder_per_hoursubject_access.rate_limits.per_principal_per_minutesubject_access.rate_limits.subject_mismatch_per_principal_per_hoursubject_access.rate_limits.tx_code_attempts_per_code_per_minutesubject_access.required_scopessubject_access.required_scopes[]subject_access.scope_policysubject_access.subject_bindingsubject_access.subject_binding.allow_sub_as_civil_idsubject_access.subject_binding.claim_sourcesubject_access.subject_binding.id_typesubject_access.subject_binding.normalizesubject_access.subject_binding.request_fieldsubject_access.subject_binding.token_claimsubject_access.token_policysubject_access.token_policy.assurance_claim_sourcesubject_access.token_policy.max_access_token_lifetime_secondssubject_access.token_policy.max_auth_age_secondssubject_access.token_policy.max_clock_leeway_secondssubject_access.token_policy.max_credential_validity_secondssubject_access.token_policy.max_evaluation_age_secondssubject_access.token_policy.required_acr_valuessubject_access.token_policy.required_acr_values[]Top-level areas
Section titled “Top-level areas”| Area | Responsibility |
|---|---|
server | Public and optional dedicated admin listeners and HTTP bounds |
auth | Configured API-key, static bearer, and OIDC authentication and scope mapping |
deployment | Deployment profile and assurance evidence |
audit | Notary-owned redacted audit sink and keyed chain |
config_trust | Product bundle verification and anti-rollback state |
evidence | Service identity, Relay connection, claims, signing keys, and credential profiles |
cel | Isolated claim-policy worker limits |
state | PostgreSQL or explicit local in-memory correctness state |
credential_status | Optional credential lifecycle state |
subject_access | OIDC-bound direct and delegated subject-access policy |
oid4vci | Wallet-facing issuance facade |
federation | Static-peer delegated evaluation |
Unknown configuration fields are rejected except forward-compatible metadata
inside authorization_details, as described under Authentication and
delegation. Use the generated configuration from Registry Stack project
authoring as the source of truth rather than maintaining a second handwritten
example.
Environment expansion
Section titled “Environment expansion”Notary expands ${VAR} expressions before YAML parsing. ${VAR} requires
VAR to be set to a non-empty value. ${VAR:-fallback} uses fallback when
VAR is unset or empty, including ${VAR:-} for an explicit empty result.
${VAR:?message} fails with message when VAR is unset or empty.
Whitespace-only values are non-empty. Diagnostics name the variable or use the
supplied message; they never include the variable value.
Evidence modes
Section titled “Evidence modes”Every claim uses one sealed evidence mode:
registry_backednames a compiler-produced consultation expectation. It requires the project’s Relay connection.self_attestedperforms no Relay or source I/O and may depend only on other source-free claims.
A configuration may contain claims for the topology generated by the project.
A Notary-only project must not configure Relay. A combined project has exactly
one logical Relay connection. Source-free claims are evaluation-only. Every
credential-capable claim in subject_access.allowed_claims, every claim in a
credential profile, and every OID4VCI projection must resolve through mutually
consistent credential-profile bindings to registry_backed claims.
Configuration load rejects mixed or source-free credential surfaces.
Relay connection
Section titled “Relay connection”The Relay connection contains the Relay origin and an owner-readable workload token file. Exact private CIDRs may be admitted when required. Notary does not configure source origins, OAuth token endpoints, source credentials, protocol keys, source request limits, or adapter scripts.
Notary validates each expected consultation’s identity, purpose, input roles
and schemas, outcome union, output schemas, provenance, runtime requirements,
and contract_hash before serving. Startup and readiness fail closed on a
semantic or hash mismatch. Every execute request carries the exact hash.
Rotate the workload credential by atomically replacing its regular, owner-readable file. Do not rewrite it in place. Diagnostics must report only bounded status and never the token, its path, selectors, Relay response body, or source details.
Claims and disclosure
Section titled “Claims and disclosure”Claims may directly reference a consultation output or use CEL over allowed
consultation outcome, outputs, and bounded request variables. Direct output
claims become null on no_match in the evaluation view and are not issuable
as null credential claims. Ambiguity or failure evaluates no claims from that
consultation.
value.max_bytes is an optional UTF-8 byte ceiling for a string claim result.
When present, it must be between 1 and 65536 and value.type must be string.
Notary accepts a result exactly at the bound, rejects an over-bound result as a
value-free rule-evaluation failure, and preserves null for nullable claims.
Omitting the field preserves the absence of a per-claim ceiling in older direct
Notary configurations; the global CEL and response safety limits still apply.
Registry Stack project authoring requires and emits the field for source-free
string claims.
Disclosure remains a Notary decision. Credential profiles own ordered claim membership, issuance format, holder binding, validity, and allowed disclosure. Relay outputs are never credentials or public claims by themselves.
formats is optional for each claim. When omitted, Notary uses
application/vnd.registry-notary.claim-result+json, the canonical evaluation
response format. An explicit list must include that format and may otherwise
contain only application/ld+json; profile="cccev". Do not set formats: [],
an unknown format, or application/dc+sd-jwt: all are invalid configuration.
SD-JWT VC belongs in a credential profile’s issuance format, not a claim’s
evaluation response-format list. The same separation applies to
subject_access.allowed_formats: list evaluation renderers there and select
the credential output through credential_profiles.
Authentication and delegation
Section titled “Authentication and delegation”Authentication has no mode selector. The configured methods define the
accepted callers. API keys may be configured alongside OIDC so service callers
and citizen or wallet flows can use one Notary instance. Each request must
present exactly one credential type; presenting an API key and a bearer token
together fails before either credential is authenticated. Static bearer tokens
cannot be configured alongside OIDC because both use the Authorization: Bearer transport.
authorization_details is a versioned interoperability object shared by
static configuration and token or OIDC JSON. Known authorization fields,
including subject, target, relationship, assisted access, and exact claim
references, are enforced by the authorization checks. Future metadata fields
at those object levels are accepted and ignored so an additive producer does
not break an older Notary. Unrecognized metadata never grants authority.
ClaimRef objects remain closed because an extra field there could conceal a
misspelled claim or version selector.
Citizen and wallet flows use the self-attestation subject-binding policy. Delegated access must bind requester, target, relationship, purpose, and authorization details before evaluation. A delegated Relay proof consultation proves only its exact compiled edge and does not grant scopes.
Credential issuance additionally requires the stored evaluation to contain one exact compiler pin for every registry-backed claim in each selected root’s dependency closure, plus one normalized execution record for every unique Relay consultation ULID. Claim/version, Relay profile and contract hash, canonical purpose, ULID, acquisition time, and each root’s public unique-consultation count must match the active configuration and evaluation. A deterministic SHA-256 execution binding cross-binds each claim pin, execution, and exact claim provenance. Missing, duplicated, extra, legacy, or modified provenance is denied before signer, credential-id, or status side effects. Direct issuance checks before holder-proof replay mutation. OID4VCI rejects a source-free credential configuration, creates and evaluates the registry transaction before rendering an offer, consumes the transaction-bound proof nonce at the credential endpoint, and checks stored provenance before signer access. Delegated self-attestation is evaluation-only; delegated relationship and claim credential-profile bindings are rejected at configuration load.
Notary persists these private Relay identifiers only when every selected root shares a mutually validated credential profile. Registry-backed evaluation-only claims store no private issuance provenance. The execution binding detects partial mutation, not a store operator who can rewrite all fields and recompute an unkeyed digest; database and audit controls remain the authenticity boundary.
State and operations
Section titled “State and operations”Deployment waivers name one finding, a required operator reference, and a mandatory expiry date.
The reference is 1 to 128 bytes, has no surrounding whitespace, uses only letters, digits, .,
_, :, and -, and cannot contain ...
References cannot start, case-insensitively, with Bearer:<value> or Basic:<value>, directly or
after Authorization:.
Use a ticket-style reference such as OPS-2026-0042.
An optional summary is 1 to 256 Unicode characters, already trimmed, contains no control
characters, and cannot be an authorization value or contain a private-key begin marker.
Omit summary when it is not needed; explicit null is invalid.
Keep credentials and private keys out of both fields.
These rules implement
RS-OP-POSTURE (REQ-OP-POSTURE-011).
deployment: profile: hosted_lab waivers: - finding: notary.openapi.public reference: OPS-2026-0042 summary: Public API catalog is approved for the lab expires: 2026-09-30Expired waivers stop suppressing their finding and raise deployment.waiver_expired.
startup_fail and readiness_fail gates are not waivable. The default posture tier omits waiver
metadata; the restricted tier can report only the validated reference, optional summary, and
expiry. Boot warnings use the same metadata. Audit records remain minimized to finding IDs.
Use the typed Notary-owned PostgreSQL state schema for multi-instance or production deployments. The schema holds replay, nonce, evaluation, idempotency, credential-status, quota, and preauthorization state. Explicit in-memory state is limited to local, single-instance development. Keep Notary and Relay state, audit keys, and chains separate. Protect admin routes with their dedicated listener and required operator scopes.
Validation workflow
Section titled “Validation workflow”Run checks in increasing order of network effect:
registry-notary explain-config --config generated-notary.yamlregistry-notary doctor --config generated-notary.yamlregistry-notary --config generated-notary.yaml state doctorregistry-notary doctor --config generated-notary.yaml --liveThe live check contacts only the approved Relay dependency. Run a controlled project journey separately to exercise source acquisition, claim evaluation, disclosure, and issuance. Keep all credentials in process environments or mounted secret files and out of command lines and retained logs.
Rollout
Section titled “Rollout”Relay and Notary use separately built, signed, verified, anti-rollback-tracked, and boot-activated product bundles. A combined rollout is compatible staged activation, not atomic project activation; current source has no signed project-root bundle or activation coordinator.
Verify both product bundles first. Start or stage Relay without admitting caller traffic and require its health, readiness, audit, and deployment-posture checks to pass. Then start or stage Notary, require startup and readiness to validate its Relay contract, and require Notary health, audit, and posture checks to pass. Admit caller traffic only when both products are ready and the contract check succeeds. An execute-time contract mismatch fails at Relay before source access.
The complete generated schema, runtime diagnostics, and OpenAPI are authoritative for exact field syntax.