source
Mission Declaration (MD) v0.1
This document defines version `v0.1` of the Mission Declaration (MD)
Public-import note. This document was authored against the private research repo’s
docs/spec/layout. In the public ardur tree, migrated specs live underdocs/specs/. Anydocs/spec/...path reference in the body refers to the original private layout; the public-tree mapping is indocs/specs/README.md.
Status
This document defines version v0.1 of the Mission Declaration (MD)
claims-set format for the Ardur runtime-governance protocol.
This document is written in an RFC-style normative form.
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”,
“SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and
“OPTIONAL” in this document are to be interpreted as described in
RFC 2119 and RFC 8174 when, and only when, they appear in all capitals.
1. Introduction
The Ardur runtime-governance protocol separates delegated authority, mission policy, and execution evidence into three distinct artifacts:
- Mission Declaration (MD)
- Delegation Grant (DG)
- Execution Receipt (ER) The Mission Declaration is the issuer-signed, human-reviewable policy envelope for a mission. The Delegation Grant is carried by the Attenuating Authorization Token (AAT) wire format. The Execution Receipt is the per-hop signed evidence record emitted by verifiers and, in stronger profiles, by execution environments. The MD is intentionally responsible for semantics that AAT explicitly does not carry, including:
- cumulative lineage budgets
- typed side-effect policy
- mission-scoped delegation policy
- required telemetry obligations
- conformance profile selection
- revocation pointer
- approval-fatigue controls
- governed memory-store policy This document defines:
- the MD JSON claims-set
- required and optional members
- issuer and verifier processing rules
- hashing and canonicalization rules
- the companion JSON Schema This document does not define:
- the
mission_refAAT profile claim - the Execution Receipt schema
- the full Token Status List profile for mission revocation
- the tool manifest schema
- the full verifier state machine Those topics are defined by companion documents.
2. Representation Model
An MD is represented as a JWT payload encoded as a JSON object.
The JSON object defined by this document is the authoritative data model.
The JOSE wrapper is transport and integrity metadata around that object.
The examples in docs/spec/examples/*.json are payload objects only.
The examples are not signed JWTs.
The JSON Schema in
docs/spec/mission-declaration-v0.1.schema.json
validates the payload object only.
An implementation that accepts a compact JWT serialization:
- MUST verify the JOSE signature first
- MUST decode the payload to a JSON object
- MUST validate the decoded payload against this specification
- MUST reject the token if the payload object violates this specification An implementation that stores or exchanges detached payload objects:
- MUST preserve the exact semantic content of the JSON object
- MUST apply RFC 8785 canonicalization before any hashing step defined by this document
- MUST bind the payload object to an ES256 signature before treating it as authoritative policy
3. Design Goals
The MD format has the following goals:
- human reviewability
- strict fail-closed parsing
- offline verifier compatibility
- composability with AAT
- reuse of existing cryptographic primitives
- deterministic hashing
- unambiguous claim semantics The MD format is intentionally conservative. This version prioritizes deterministic parsing and predictable security properties over extensibility. Unknown top-level claims are therefore forbidden.
4. Relationship to DG and ER
The MD is mission-scoped. The DG is delegation-hop-scoped. The ER is execution-hop-scoped. The following relationships apply:
- Every DG that participates in this protocol profile MUST reference one
MD by
mission_ref. - Every ER emitted for a governed action MUST be attributable to exactly one DG and, through that DG, to exactly one MD.
- A verifier MAY cache MDs offline.
- A verifier that uses a cached MD MUST still validate the MD signature, temporal validity, and revocation status before use.
- An MD MUST be usable by a verifier that has no online connectivity at evaluation time, provided the verifier has a cached MD, the issuer key, and a cached status list. The MD is therefore a policy root for a mission. It is not a running state ledger. Live budget consumption, live descendant reservations, and live receipt tracking belong to verifier state and DG / ER processing, not to the MD payload itself.
5. Serialization and Signing
5.1. JWT Envelope
An MD MUST be signed as a JWT using JWS compact serialization.
The JWS alg header parameter MUST be ES256.
No other signing algorithm is permitted by this version.
The MD format defined by this document MUST NOT be signed with a symmetric
algorithm.
The MD format defined by this document MUST NOT be signed with alg: "none".
An issuer MUST maintain an explicit algorithm allowlist.
A verifier MUST reject any MD whose JWS header uses an algorithm other than
ES256.
An issuer SHOULD set typ to JWT.
A verifier MUST NOT treat the absence of typ as a signature failure if
the signature and payload otherwise validate.
This document does not define encrypted MD payloads.
Deployments that store or transport MDs over untrusted channels SHOULD rely
on transport confidentiality in addition to JWS integrity protection.
5.2. JWT Claim-Set Scope
This document defines the MD payload object. The JOSE header is out of scope except for the signing requirements in this section. All normative claim requirements in this document apply to the decoded JSON payload.
5.3. NumericDate Claims
The iat and exp claims MUST be encoded as JWT NumericDate integer
values.
Fractional seconds MUST NOT be used.
An issuer MUST ensure:
iatis not in the future relative to the issuer clockexpis strictly greater thaniat- the mission validity interval is consistent with local policy A verifier MUST reject an MD if:
exp <= iatexpis in the past at verification time, subject to local clock-skew policyiatcannot be parsed as an integer NumericDate This document does not definenbf. Issuers and verifiers operating under this version MUST NOT addnbfas an unregistered top-level claim in the MD payload.
5.4. Fail-Closed Unknown Fields
The MD payload has a closed top-level schema.
An issuer MUST reject any payload object that contains a top-level member
not defined by this specification.
This requirement is normative and fail-closed.
A verifier MUST reject any MD payload that contains a top-level member not
defined by this specification.
This requirement intentionally mirrors the current fail-closed constructor
behavior in vibap-prototype/vibap/passport.py.
Forward-compatible extension in this protocol family MUST occur through a
new versioned schema, not through silent acceptance of unknown top-level
members.
5.5. Nested Objects
Every nested object defined by this specification is also closed. An issuer MUST reject any nested object that contains a member not defined for that object. A verifier MUST reject any nested object that contains a member not defined for that object.
5.6. Arrays and Ordering
Array element order is not semantically significant unless this document states otherwise. Implementations MUST NOT assign semantic meaning to array order for:
allowed_tool_classesresource_policieseffect_policiesallowed_child_subjectsattenuation_rulesflow_policiesrequired_telemetrygoverned_memory_storesImplementations MAY preserve source order for display. Hashing defined by this document operates on RFC 8785 canonicalized JSON, not on source formatting or source property order.
6. Canonicalization and Hashing
6.1. General Rule
Any hashing step defined by this document MUST be applied to the RFC 8785 JCS canonical form of the relevant JSON value. The canonicalized bytes MUST be UTF-8 encoded before hashing.
6.2. JCS Preconditions
Before canonicalization, the producer and consumer MUST parse the JSON value as JSON data, not as a raw byte string. The parsed JSON value MUST satisfy the I-JSON constraints required by RFC 8785. If canonicalization fails, the operation in progress MUST fail.
6.3. Hash Algorithm
All hashes defined by this document use SHA-256. This version introduces no new cryptographic primitive beyond:
- ES256 signatures
- SHA-256 hashing
6.4. Digest String Encoding
Unless another companion specification says otherwise, a SHA-256 digest
carried as an MD claim MUST be encoded as:
sha-256: followed by exactly 64 lowercase hexadecimal characters.
Uppercase hexadecimal characters MUST NOT be used.
Base64url encoding MUST NOT be used for MD digest claims defined by this
version.
6.5. Example Hash Procedure
To compute a digest under this document:
- parse the relevant JSON value
- verify that it is valid JSON for the intended object type
- canonicalize it with RFC 8785
- UTF-8 encode the canonical result
- compute SHA-256 over those bytes
- encode the result as
sha-256:plus lowercase hex
7. Core Data Model
7.1. Top-Level Claims
An MD payload object in version v0.1 contains the following top-level
claims:
isssubaudiatexpjtimission_idallowed_tool_classesresource_policieseffect_policieslineage_budgetsdelegation_policyflow_policiesrequired_telemetryreceipt_policyconformance_profiletool_manifest_digestrevocation_refapproval_policygoverned_memory_storesprobing_rate_limitidm_extension(OPTIONAL) All claims other thanidm_extensionare REQUIRED. An MD without every required claim is invalid.
7.2. Common Claim Rules
Every string claim defined by this document:
- MUST be encoded as a JSON string
- MUST NOT be the empty string
- MUST NOT be whitespace-only Every integer claim defined by this document:
- MUST be encoded as a JSON number with integer value
- MUST be greater than or equal to zero unless a stricter bound is given Every array claim defined by this document:
- MUST be encoded as a JSON array
- MUST contain only elements of the defined type
- MUST NOT contain
nullEvery object claim defined by this document: - MUST be encoded as a JSON object
- MUST conform to the closed member set defined for that object
8. Claim Definitions
8.1. iss
The iss claim identifies the MD issuer.
iss MUST be present.
iss MUST be a non-empty string.
iss SHOULD be a stable issuer identifier.
iss SHOULD be an HTTPS URI or another StringOrURI value that is stable
within the deployment.
If the issuer rotates signing keys, the iss value SHOULD remain stable.
The issuer key lookup procedure is out of scope for this document.
8.2. sub
The sub claim identifies the primary mission subject.
sub MUST be present.
sub MUST be a non-empty string.
sub MAY identify:
- a single root agent
- an agent workload class
- a service principal
- a user-delegated agent identity
The exact identity namespace is deployment-specific.
The value carried in
subSHOULD be compatible with the subject namespace used by DGs and ObservedEvents in the same deployment.
8.3. aud
The aud claim identifies the intended verifier audience.
aud MUST be present.
aud MUST be a non-empty string in this version.
This version does not permit the JSON-array form of JWT aud.
An issuer MUST mint MDs with a single audience string.
A verifier MUST compare the MD aud claim against its configured audience
identifier.
If the audience does not match, the verifier MUST reject the MD.
8.4. iat
The iat claim records the issuance time of the MD.
iat MUST be present.
iat MUST be a NumericDate integer.
The issuer clock used for iat SHOULD be synchronized.
8.5. exp
The exp claim records the expiration time of the MD.
exp MUST be present.
exp MUST be a NumericDate integer.
exp MUST be strictly greater than iat.
An issuer SHOULD prefer short validity windows when mission policy is
short-lived.
A verifier MUST reject an expired MD.
8.6. jti
The jti claim identifies the specific signed MD instance.
jti MUST be present.
jti MUST be globally unique within the issuer namespace for the lifetime
of the token and any relevant audit retention window.
jti SHOULD be a UUID or other collision-resistant identifier.
jti identifies the signed instance.
It is not the same thing as mission_id.
8.7. mission_id
The mission_id claim identifies the mission itself.
mission_id MUST be present.
mission_id MUST be a non-empty string.
mission_id SHOULD be a URI or URN.
mission_id SHOULD remain stable across re-signing or re-issuance of the
same mission policy.
If the issuer rotates an MD instance without changing the mission policy,
the issuer SHOULD mint a new jti and SHOULD preserve mission_id.
If the issuer changes mission semantics in a materially incompatible way,
the issuer SHOULD mint a new mission_id.
mission_id and jti SHOULD NOT be identical except in trivial
single-instance deployments.
8.8. allowed_tool_classes
The allowed_tool_classes claim enumerates the tool classes permitted by
the mission.
allowed_tool_classes MUST be present.
allowed_tool_classes MUST be an array of one or more strings.
Each element MUST be an absolute URI.
Each element SHOULD be authority-scoped in the sense of AAT Section 3.3.1.
Each element SHOULD use a URI authority corresponding to:
- the workload identity of the tool provider, or
- a domain controlled by the tool operator Each element SHOULD include either:
- a version component, or
- a content-hash component This requirement ensures that all parties reason about the same tool schema. Issuers MUST reject duplicate tool-class URIs. Verifiers MUST treat tool-class URI comparison as exact string equality. This version does not define URI normalization beyond ordinary JSON string comparison. Examples of valid tool-class URIs:
https://billing-agent.example.com/tools/charge/v2https://gitops.example.net/tools/apply@sha256-0f4c...
8.9. resource_policies
The resource_policies claim enumerates governed resource families and
matching patterns.
resource_policies MUST be present.
resource_policies MUST be a non-empty array.
Each array member MUST be an object with exactly these members:
familypatternsensitivity
8.9.1. resource_policies[].family
family identifies a resource namespace.
family MUST be a non-empty string.
Examples include:
filesystemhttpdatabaseemailartifactmemoryThis version does not create an IANA registry for resource families. Deployments SHOULD use stable, documented family identifiers.
8.9.2. resource_policies[].pattern
pattern identifies which resources in the family are governed by the
policy entry.
pattern MUST be a non-empty string.
pattern MUST use one of these two prefix forms:
exact:glob:If the prefix isexact:, the remainder of the string is matched by exact string equality after any family-specific normalization defined by the deployment. If the prefix isglob:, the remainder of the string is matched with a deterministic glob procedure. Forglob:patterns:*matches zero or more characters?matches exactly one character**MAY cross separator boundaries The separator notion is family-specific. If a family does not define a separator,*and**are equivalent. An issuer MUST reject any pattern that does not use the required prefix. A verifier MUST reject any MD that carries a malformed resource pattern.
8.9.3. resource_policies[].sensitivity
sensitivity is the issuer-defined sensitivity label associated with the
matching resource set.
sensitivity MUST be a non-empty string.
This version does not constrain the label vocabulary.
For interoperability, issuers SHOULD use a stable sensitivity taxonomy.
A deployment MAY use values such as:
publicinternalconfidentialrestrictedVerifiers MUST compare sensitivity labels by exact string equality.
8.9.4. Overlap and Specificity
This version permits overlapping resource-policy entries. Issuers SHOULD avoid ambiguous overlap. If multiple resource-policy entries match the same observed resource, the verifier SHOULD apply the most specific match. If the verifier cannot determine specificity deterministically, the verifier MUST fail closed.
8.10. effect_policies
The effect_policies claim constrains per-event budget deltas by
side-effect class.
effect_policies MUST be present.
effect_policies MUST contain exactly one entry for each side-effect class
defined by this version.
The defined side-effect classes are:
readwritenetworkexecexternal_sendEach array member MUST be an object with exactly these members:side_effect_classlimitside_effect_classMUST be one of the five values above.limitMUST be a non-negative integer.limitdefines the maximumbudget_deltaa single observed action of that side-effect class MAY consume. This makeseffect_policiesa per-event guardrail. The cumulative, lineage-wide ceiling is carried separately bylineage_budgets. Iflimitis0, the side-effect class is denied for event execution. Issuers SHOULD keepeffect_policiesandlineage_budgetsaligned. For example, issuers SHOULD NOT assign a positive lineage ceiling to a side-effect class whose per-event limit is zero unless the mission is being pre-provisioned for later re-issuance.
8.11. lineage_budgets
The lineage_budgets claim defines mission-wide escrow-rights ceilings by
side-effect class.
lineage_budgets MUST be present.
lineage_budgets MUST be an object with exactly one member:
per_effect_classper_effect_classMUST be an object with exactly these five members:readwritenetworkexecexternal_sendEach side-effect-class member MUST be an object with exactly these members:reservedceilingreservedMUST be a non-negative integer.ceilingMUST be a non-negative integer.reservedMUST be less than or equal toceiling.ceilingis the mission-wide maximum cumulative spend permitted for that side-effect class across the full delegation tree.reservedis the amount already encumbered at MD issuance time.reservedis not the live running spend total.reservedis not the verifier’s live descendant-reservation map. For a newly issued root mission with no pre-existing descendants, issuers SHOULD setreservedto0for every side-effect class. If an issuer mints an MD for a mission that already has active descendant allocations, the issuer MAY set a non-zeroreservedvalue to encode the encumbered starting state. Verifiers MUST initialize live lineage state fromreservedandceiling. Verifiers MUST reject any MD in whichreserved > ceilingfor any side-effect class.
8.12. delegation_policy
The delegation_policy claim constrains how DGs may be minted under the
mission.
delegation_policy MUST be present.
delegation_policy MUST be an object with exactly these members:
max_depthallowed_child_subjectsattenuation_rules
8.12.1. delegation_policy.max_depth
max_depth MUST be a non-negative integer.
max_depth = 0 means no child DG may be minted under the mission.
max_depth = 1 means the root subject may mint direct children, but those
children may not mint grandchildren.
Issuers SHOULD set max_depth to the minimum value that supports the
intended workflow.
8.12.2. delegation_policy.allowed_child_subjects
allowed_child_subjects MUST be an array.
Each element MUST be a non-empty string.
Each element MUST use one of these two prefix forms:
exact:glob:The match target is the child DGsubvalue. Ifmax_depth > 0, issuers SHOULD provide at least one matching rule. Ifallowed_child_subjectsis empty andmax_depth > 0, the issuer is declaring that delegation is structurally allowed but no child subjects are currently authorized. Verifiers MUST treat an emptyallowed_child_subjectsarray as “match no subjects”.
8.12.3. delegation_policy.attenuation_rules
attenuation_rules MUST be a non-empty array of rule identifiers.
This version defines these rule identifiers:
tool_subsetresource_subseteffect_subsetbudget_nonincreasetelemetry_nonweakeningreceipt_level_nonweakeningprofile_nonweakeningmemory_store_subsetTheir semantics are:tool_subsetA child DG MUST authorize a subset of the parent’s tool classes.resource_subsetA child DG MUST authorize a subset of the parent mission’s resource patterns.effect_subsetA child DG MUST authorize a subset of the parent mission’s effect classes.budget_nonincreaseA child DG MUST NOT increase any lineage ceiling or any active reserved share.telemetry_nonweakeningA child DG MUST NOT weaken telemetry obligations below the mission’s required telemetry set.receipt_level_nonweakeningA child DG MUST NOT require a weaker receipt level than the mission.profile_nonweakeningA child DG MUST NOT claim a weaker conformance profile than the mission.memory_store_subsetA child DG MUST NOT introduce governed memory stores outside the mission set. Issuers SHOULD include every rule identifier whose invariant they expect downstream verifiers to enforce. Verifiers MUST reject unknown attenuation-rule identifiers.
8.13. flow_policies
The flow_policies claim encodes IFC-compatible source-to-sink flow rules.
flow_policies MUST be present.
flow_policies MAY be an empty array.
Each array member MUST be an object with exactly these members:
from_classto_classactionfrom_classMUST be a non-empty string.to_classMUST be a non-empty string.actionMUST be one of:allowdenyThis version keeps flow-policy actions intentionally binary. Deployments that require richer declassification workflows MUST version the schema rather than overloading theactionfield. Issuers SHOULD align flow classes with the deployment’s content and sensitivity taxonomies. Verifiers MUST compare flow classes by exact string equality. If multiple flow rules match the same transition and disagree, the verifier MUST fail closed. If no flow rule matches a transition, the verifier SHOULD apply local default-deny behavior unless the conformance profile explicitly treats flow policy as advisory.
8.14. required_telemetry
The required_telemetry claim enumerates the observation fields the
verifier MUST see for every governed action.
required_telemetry MUST be present.
required_telemetry MUST be a non-empty array.
Duplicate telemetry field identifiers are not permitted.
This version defines the following telemetry field identifiers:
event_idsession_idtimestampactoraction_classtool_nametargetresource_familycontent_classcontent_provenancesummaryside_effect_classvisibilityparent_event_iddelegation_fromdelegation_toconfidence_hintsensitivityinstruction_bearingbudget_deltagrant_idIf a field named inrequired_telemetryis absent, null, empty when a non-empty value is required, or structurally invalid in an observed action, the verifier MUST returninsufficient_evidence. The verifier MUST NOT silently synthesize a default value for a missing required telemetry field. Ifvisibilityis listed inrequired_telemetryand the observation indicates partial or missing visibility, the verifier SHOULD treat the action asinsufficient_evidenceunless a stronger local evidence model can prove that the missing data is irrelevant to the mission predicate.
8.15. receipt_policy
The receipt_policy claim defines the minimum evidence level the verifier
must require for governed actions.
receipt_policy MUST be present.
receipt_policy MUST be an object with exactly one member:
levellevelMUST be one of:minimalcounter_signedtransparency_loggedThe levels are ordered from weakest to strongest. Their semantics are:minimalThe verifier MUST emit an ER signed by the verifier or enforcement point.counter_signedIn addition to the verifier signature, the execution environment, tool adapter, or equivalent downstream component MUST counter-sign the ER or equivalent evidence record.transparency_loggedThe ER MUST satisfy thecounter_signedrequirements and MUST be logged in an append-only transparency system with an inclusion reference that the verifier can check or cache. A child artifact MUST NOT weaken the receipt level below the mission’s declared level.
8.16. conformance_profile
The conformance_profile claim identifies the minimum protocol profile the
deployment claims for the mission.
conformance_profile MUST be present.
conformance_profile MUST be one of:
Delegation-CoreMIC-StateMIC-EvidenceThe profiles are ordered from weakest to strongest. Their semantics are:Delegation-CoreRequires signed MD validation, DG linkage, delegation-policy evaluation, revocation checking, and basic receipt emission.MIC-StateRequiresDelegation-Coreplus stateful lineage-budget accounting and required-telemetry enforcement.MIC-EvidenceRequiresMIC-Stateplus receipt completeness sufficient to fail closed when required evidence is missing. Ifconformance_profileisMIC-Evidence,receipt_policy.levelMUST NOT beminimal.
8.17. tool_manifest_digest
The tool_manifest_digest claim binds the mission to a specific tool
manifest snapshot.
tool_manifest_digest MUST be present.
tool_manifest_digest MUST be encoded as sha-256: plus 64 lowercase
hexadecimal characters.
The digest input MUST be the RFC 8785 canonical UTF-8 encoding of the tool
manifest JSON object.
The tool manifest itself is out of scope for this document.
However, issuer and verifier MUST use byte-equivalent semantic JSON objects
for hashing.
The verifier MUST compare the digest by exact string equality.
If the currently loaded tool manifest hashes to a different digest, the
verifier MUST treat the mission as non-conformant.
The verifier MAY distinguish this case as a manifest_drift finding in a
companion error vocabulary.
8.18. revocation_ref
The revocation_ref claim points to the Token Status List resource used for
mission revocation checks.
revocation_ref MUST be present.
revocation_ref MUST be an HTTPS URI.
revocation_ref MUST identify a Token Status List resource and MUST carry a
status-list index in the URI fragment as #idx=<non-negative-decimal>.
Example:
https://status.example.com/mission/2026-04/statuslist.jwt#idx=418
The fragment-based encoding is used because this version defines only a
single string claim, while the underlying status-list design conceptually
uses a (uri, idx) tuple.
The fragment MUST NOT be transmitted when fetching the status list.
The verifier MUST:
- remove the fragment before performing the HTTP fetch
- parse the decimal
idxfragment value - use that index against the fetched status list Issuers MUST NOT encode the index in the query component. Issuers MUST NOT encode the index in a unique path segment when a shared status-list URI can be used instead. These rules reduce avoidable privacy leakage and preserve herd-privacy properties of shared status lists. If the fragment is missing or malformed, the MD is invalid.
8.19. approval_policy
The approval_policy claim constrains operator approval throughput.
approval_policy MUST be present.
approval_policy MUST be an object with exactly one member:
max_approvals_per_hour_per_operatormax_approvals_per_hour_per_operatorMUST be a positive integer. This claim limits approval rate per operator per rolling hour. If the verifier or approval service cannot establish whether the operator is within the allowed approval budget, it SHOULD fail closed toinsufficient_evidence. If the operator exceeds the approval budget, the verifier SHOULD fail closed rather than treating subsequent approvals as automatically valid.
8.20. governed_memory_stores
The governed_memory_stores claim enumerates memory-like stores whose
contents are mission-governed.
governed_memory_stores MUST be present.
governed_memory_stores MAY be an empty array.
Each member MUST be an object with exactly these members:
store_idresource_familyttl_sintegrity_policy
8.20.1. store_id
store_id MUST be a non-empty string.
store_id SHOULD be stable within the mission lifetime.
store_id MAY be a URI, URN, path-like identifier, or other deployment
identifier.
8.20.2. resource_family
resource_family MUST be a non-empty string.
resource_family SHOULD correspond to a resource_policies[].family value
when applicable.
8.20.3. ttl_s
ttl_s MUST be a non-negative integer number of seconds.
ttl_s = 0 means the store is non-persistent across turns or sessions.
Issuers SHOULD set ttl_s to the shortest operationally feasible value.
8.20.4. integrity_policy
integrity_policy MUST be one of:
digest_boundentry_signedtransparency_loggedThe values mean:digest_boundThe store content or entries are bound to stable content digests.entry_signedStore entries are individually signed by an authorized producer.transparency_loggedStore writes are transparency logged or equivalently witnessed in an append-only integrity system. If a governed memory store fails its declared integrity policy, the verifier SHOULD emit a mission violation for that store and SHOULD treat later reads from the same store asinsufficient_evidenceunless stronger local recovery logic exists.
8.21. probing_rate_limit
The probing_rate_limit claim limits repeated denied probes against the
policy boundary.
probing_rate_limit MUST be present.
probing_rate_limit MUST be a positive integer.
The semantic unit is:
distinct denied attempts per five minutes per agent
The RECOMMENDED default value is 10.
If a local authoring tool omits this field before signing, the issuer MUST
inject 10 before producing the signed MD.
The signed MD payload itself MUST contain an explicit integer value.
Verifiers SHOULD track denied probes in a rolling five-minute window keyed
at least by agent subject.
If the probing-rate limit is exceeded, the verifier SHOULD treat subsequent
governed actions as insufficient_evidence or violation according to
local incident policy.
8.22. idm_extension
The idm_extension claim is OPTIONAL.
If present, it enables an Intent Declaration Message extension profile.
idm_extension MUST be an object with exactly these members:
enabledintent_schema_refenabledMUST be a boolean. Ifenabledistrue,intent_schema_refMUST be a non-empty absolute URI. Ifenabledisfalse,intent_schema_refMAY be omitted. Ifenabledisfalseandintent_schema_refis present, verifiers MAY ignore the reference. This document does not define the IDM schema itself.
9. Processing Rules
9.1. Issuer Processing
Before signing an MD, an issuer MUST:
- construct the full payload object
- validate it against the closed schema for this version
- reject unknown top-level or nested members
- verify
exp > iat - verify
reserved <= ceilingfor each lineage budget entry - verify there is exactly one
effect_policiesentry per defined side-effect class - verify
tool_manifest_digestmatches the issuer’s intended tool manifest - verify
revocation_refuses HTTPS and includes a valid#idx=fragment - inject
probing_rate_limit = 10if the authoring layer omitted it - sign the payload with ES256 An issuer SHOULD:
- minimize mission validity windows
- minimize
max_depth - minimize positive budgets
- prefer shared status-list URIs over unique per-mission URIs
- document family and sensitivity taxonomies
9.2. Verifier Processing
Before using an MD for authorization, a verifier MUST:
- verify the ES256 signature
- decode the payload JSON
- validate the payload against this specification
- verify temporal validity
- verify audience match
- resolve or consult revocation status
- verify the locally loaded tool manifest digest if a tool manifest is in scope for the action being evaluated If any required step fails, the verifier MUST reject the MD.
9.3. Offline Use
An offline verifier MAY cache:
- issuer public keys
- signed MD payloads
- status-list resources
- tool manifests
An offline verifier using cached data MUST apply local freshness policy.
If freshness cannot be established for data required by the selected
conformance profile, the verifier SHOULD return
insufficient_evidencerather than silently permitting the action.
9.4. Telemetry Failure
When evaluating a governed action against an MD:
- if any field named in
required_telemetryis missing, the verifier MUST returninsufficient_evidence - if required telemetry is structurally present but malformed, the verifier
MUST return
insufficient_evidence - if the selected conformance profile requires receipts and the receipt is
missing, the verifier MUST return
insufficient_evidence
9.5. Budget Failure
When evaluating cumulative spend:
- the verifier MUST initialize mission state from
lineage_budgets.per_effect_class - the verifier MUST ensure cumulative consumed plus active descendant
reservations never exceed
ceiling - the verifier MUST NOT treat
reservedas the live consumed total - a child grant MUST NOT widen any mission ceiling If an action would exceed the allowed cumulative ceiling, the verifier MUST fail closed.
9.6. Manifest Failure
If the tool manifest digest comparison fails:
- the verifier MUST treat the action as non-conformant
- the verifier MUST NOT silently continue on the assumption that the tool metadata is equivalent
9.7. Revocation Failure
If the verifier cannot retrieve or validate the referenced status list and
the selected conformance profile requires revocation checking for permit
decisions, the verifier SHOULD return insufficient_evidence.
If the status list indicates the mission is revoked, the verifier MUST
reject the mission.
9.8. Denial-Output Leakage
This document recognizes that denial and evidence-failure responses can themselves become an oracle. Deployments SHOULD minimize externally visible denial detail for:
violationinsufficient_evidenceDetailed reason codes SHOULD be sent to an audit channel rather than to the requesting agent when such detail could leak protected information.
10. Conformance Requirements
10.1. Issuer Conformance
An issuer conforms to MD v0.1 if it:
- emits only payloads that satisfy this document
- signs payloads with ES256
- rejects unknown members
- applies RFC 8785 before any hash defined by this document
10.2. Verifier Conformance
A verifier conforms to MD v0.1 if it:
- verifies ES256 signatures
- rejects unknown members
- enforces required telemetry fail-closed behavior
- enforces mission-level revocation checks
- enforces tool-manifest digest checks when a tool manifest is available
10.3. Profile Conformance
A deployment claiming:
Delegation-CoreMUST implement Sections 5, 8, and 9.1 through 9.3.MIC-StateMUST implementDelegation-Coreand Section 9.5.MIC-EvidenceMUST implementMIC-Stateand Section 9.4, plus receipt completeness checks consistent withreceipt_policy.level.
11. Claim Registry Compatibility
11.1. AAT Compatibility
The MD is designed to compose with AAT, not to replace it. This document does not redefine any AAT JWT claim registered in AAT Section 9.1. The AAT Section 9.1 registered JWT claims are:
aat_typedel_depthdel_max_depthpar_hashThe AAT Section 9.1 registered PoP JWT claims are:aat_idaat_toolhtaNo MD top-level claim in this document uses any of those names.
11.2. Standard JWT Claims
This document intentionally reuses these standard JWT claim names:
isssubaudiatexpjtiThat reuse is deliberate and required.
11.3. Future Registration
This version does not create a new IANA registry. If a future standards-track submission registers MD-specific JWT claim names, that registration SHOULD preserve the semantics defined here or issue a new version.
12. Security Considerations
12.1. Tool Metadata Poisoning
The mission is not adequately bound if only tool names are authorized while
tool metadata remains mutable.
tool_manifest_digest therefore exists to bind the mission to a specific
manifest snapshot.
Issuers MUST hash the canonical manifest.
Verifiers MUST compare that hash to the live manifest.
12.2. Memory Poisoning
Persistent stores can carry adversarial content across turns, sessions, or
delegation hops.
governed_memory_stores exists so those stores become first-class governed
resources rather than ambient state.
Issuers SHOULD keep the governed store set small.
Verifiers SHOULD treat failed store-integrity checks as high-severity
findings.
12.3. Approval Fatigue
Frequent human approvals can degrade operator judgment and become an attack
surface.
approval_policy therefore encodes a mission-level approval-rate ceiling.
Deployments SHOULD couple this claim with operator-identity logging.
12.4. Boundary Probing
Repeated denied requests can reveal policy boundaries.
probing_rate_limit therefore exists to cap repeated denied probes.
Verifiers SHOULD track semantically distinct denied attempts, not merely raw
request count, to avoid trivial evasion through exact replay.
12.5. Revocation Privacy
The Token Status List design uses shared lists to reduce per-token
observability.
This document therefore forbids encoding the status-list index in a query
parameter and requires fragment-based encoding in revocation_ref.
12.6. Algorithm Confusion
An MD is a signed JWT and is therefore exposed to generic JWT validation
risks.
Issuers and verifiers MUST maintain an explicit algorithm allowlist and MUST
reject alg: "none".
12.7. Offline Cache Staleness
Offline-capable verifiers can become stale.
If freshness of required artifacts cannot be established for the selected
profile, the verifier SHOULD return insufficient_evidence.
12.8. Forward Compatibility
Silent acceptance of unknown fields is dangerous in governance policy artifacts. This version therefore forbids unknown top-level and nested members.
13. Operational Considerations
13.1. Authoring Tools
Authoring tools SHOULD:
- expose the closed schema to operators before signing
- inject explicit defaults before signature generation
- render
reservedandceilingdistinctly so operators do not confuse them
13.2. Caching
Caches SHOULD key MDs by both iss and jti.
Caches SHOULD index missions by mission_id as a stable lookup key.
Caches MAY retain multiple MD instances with the same mission_id and
different jti values.
13.3. Rotation
If an issuer rotates an MD instance without changing mission semantics:
jtiMUST changemission_idSHOULD remain stabletool_manifest_digestSHOULD remain stable if the tool manifest is unchanged
13.4. Transport
Although payload integrity is provided by JWS, transport confidentiality is still important because MD contents expose mission structure, tool identifiers, and resource patterns. Deployments SHOULD use TLS or equivalent transport protection.
14. JSON Schema
The normative JSON Schema for this version is:
docs/spec/mission-declaration-v0.1.schema.json
The schema is part of the deliverable set for this version.
The schema and this prose specification are intended to agree.
If they diverge, this prose specification takes precedence.
15. Examples
This version provides these example payloads:
docs/spec/examples/minimal-md.jsondocs/spec/examples/full-md.jsonThe minimal example is intended to show the smallest practical valid MD. The full example is intended to exercise every optional or extensible surface, includingidm_extension. The full example file is expected to be stored in RFC 8785 canonical byte form so round-trip checks can compare bytes directly.
16. References
16.1. Normative References
- RFC 2119, Key words for use in RFCs to Indicate Requirement Levels
- RFC 7519, JSON Web Token (JWT)
- RFC 8174, Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words
- RFC 8785, JSON Canonicalization Scheme (JCS)
- draft-niyikiza-oauth-attenuating-agent-tokens-00
- draft-ietf-oauth-status-list
16.2. Informative References
- arXiv:2508.02110, Attractive Metadata Attack
- arXiv:2503.03704, MINJA
vibap-prototype/vibap/passport.pydocs/session-2026-04-14/05-cpo-call-prep/unified-steps-final.md
Appendix A. Summary Tables
A.1. Required Top-Level Claims
| Claim | Type | Required |
|---|---|---|
iss | string | yes |
sub | string | yes |
aud | string | yes |
iat | integer NumericDate | yes |
exp | integer NumericDate | yes |
jti | string | yes |
mission_id | string | yes |
allowed_tool_classes | array | yes |
resource_policies | array | yes |
effect_policies | array | yes |
lineage_budgets | object | yes |
delegation_policy | object | yes |
flow_policies | array | yes |
required_telemetry | array | yes |
receipt_policy | object | yes |
conformance_profile | string | yes |
tool_manifest_digest | string | yes |
revocation_ref | string | yes |
approval_policy | object | yes |
governed_memory_stores | array | yes |
probing_rate_limit | integer | yes |
idm_extension | object | no |
A.2. Side-Effect Classes
The side-effect classes for this version are fixed:
readwritenetworkexecexternal_send
A.3. Receipt Levels
The receipt levels for this version are fixed:
minimalcounter_signedtransparency_logged
A.4. Conformance Profiles
The conformance profiles for this version are fixed:
Delegation-CoreMIC-StateMIC-Evidence
Appendix B. Rationale Notes
B.1. Why reserved Appears in MD
The MD is a policy artifact, not a live ledger.
However, the mission may begin in a partially encumbered state.
The reserved field exists to encode that initial encumbrance without
forcing the verifier to guess.
In ordinary root issuance, reserved SHOULD be zero.
B.2. Why effect_policies and lineage_budgets Are Separate
They govern different failure modes.
effect_policies.limit constrains per-event spend.
lineage_budgets.per_effect_class.* constrains cumulative spend across the
delegation tree.
Both are required because either one alone is insufficient.
B.3. Why revocation_ref Uses a Fragment
The user requirement for this version is a single revocation_ref claim.
The underlying Token Status List design conceptually carries both a URI and
an index.
The fragment preserves a single-string claim while avoiding index leakage in
HTTP query parameters.
B.4. Why Unknown Fields Are Rejected
Mission policy is a security envelope. Silent acceptance of unknown fields turns schema drift into ambient authority. This version therefore chooses strict versioning over permissive parsing.
Appendix C. Implementation Checklist
An implementation is ready to interoperate with MD v0.1 if it can answer
“yes” to all of the following:
- Does it reject unknown top-level members?
- Does it reject unknown nested members?
- Does it sign only with ES256?
- Does it reject
alg: "none"? - Does it canonicalize with RFC 8785 before hashing?
- Does it encode digests as
sha-256:plus lowercase hex? - Does it enforce
reserved <= ceiling? - Does it enforce exact coverage of all five side-effect classes?
- Does it parse
revocation_reffragments of the form#idx=<n>? - Does it fail closed to
insufficient_evidencewhen required telemetry is missing? - Does it prevent receipt-level weakening under
MIC-Evidence? - Does it compare tool-manifest digests by exact string equality?
Appendix D. Non-Goals
This version does not attempt to:
- define a global resource-family registry
- define a global sensitivity-label registry
- define tool manifest contents
- define ER error codes
- define historical revocation semantics
- define encrypted MD payloads
These are deliberate exclusions from
v0.1.