{
  "note": "The normative statement audit. Every sentence of the normative pages (core/, bindings/ and vocabulary/README.md) that carries MUST, MUST NOT, SHOULD or SHOULD NOT, every requirement they state in the imperative, and every sentence that uses a lower-case must or should, has one entry here: the conformance checks that test it, or the reason no suite can. Some requirements stated without a modal also have hand-chosen entries of kind declarative: none is required, but each must quote its sentence, and a sentence the audit extracts takes the extracted kind. Hand-reviewed; pnpm check:statements fails when a sentence has no entry, an entry (declarative or not) no longer matches the text or appears twice, or an entry names a check missing from profiles.json or not cited by its page.",
  "statements": [
    {
      "file": "bindings/B1-pdpp.md",
      "section": "B1.2",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "The PDPP endpoints form their own protected resource with their own identifier, distinct from the B4 resource; `source.id` MUST equal that identifier (section 5, Declaration acceptance).",
      "checks": ["BINDING-01"]
    },
    {
      "file": "bindings/B1-pdpp.md",
      "section": "B1.3",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Stream names MUST NOT be generated per request (section 12).",
      "checks": ["BINDING-01"]
    },
    {
      "file": "bindings/B1-pdpp.md",
      "section": "B1.7",
      "kind": "imperative",
      "text": "It runs the A5.2 transaction in full: lock and recheck the stored grant and the B1.5 restrictions, compile, create and sign the A5 envelope, append the A9 receipt with surface `pdpp` and increment the read counter, then commit.",
      "checks": ["CORE-01"]
    },
    {
      "file": "bindings/B1-pdpp.md",
      "section": "B1.10",
      "kind": "keyword",
      "keywords": ["SHOULD"],
      "text": "Resource Server item 13, a SHOULD, is not supported.",
      "reason": "Records that this binding declines PDPP Core's own SHOULD (B1-D8); it adds no requirement of this specification. The refusal it implies is checked by BINDING-01 under B1.11."
    },
    {
      "file": "bindings/B1-pdpp.md",
      "section": "B1.10",
      "kind": "keyword",
      "keywords": ["SHOULD"],
      "text": "SHOULD support owner-token self-export through the record endpoints",
      "reason": "Quotes PDPP Core section 9 Resource Server item 13, which this binding declines (B1-D8). PDPP Core conformance is traced by role and item number, not by a manifest id."
    },
    {
      "file": "bindings/B1-pdpp.md",
      "section": "B1.11",
      "kind": "keyword",
      "keywords": ["SHOULD"],
      "text": "The owner record endpoints, including owner-authenticated delete (Resource Server item 1) and self-export (item 13, a SHOULD), refuse every token; the person uses the app and A11 instead.",
      "checks": ["BINDING-01"]
    },
    {
      "file": "bindings/B3-mcp.md",
      "section": "B3.1",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "The server is stateless, with no initialise/initialized handshake or `Mcp-Session-Id`, and MUST implement server/discover.",
      "checks": ["TRANSPORT-01"]
    },
    {
      "file": "bindings/B3-mcp.md",
      "section": "B3.1",
      "kind": "imperative",
      "text": "Require `Mcp-Method` on every request and `Mcp-Name` on `tools/call`, `resources/read` and `prompts/get`.",
      "checks": ["TRANSPORT-01"]
    },
    {
      "file": "bindings/B3-mcp.md",
      "section": "B3.1",
      "kind": "imperative",
      "text": "Decode and validate headers against the body under the transport rules; mismatches fail.",
      "checks": ["TRANSPORT-01"]
    },
    {
      "file": "bindings/B3-mcp.md",
      "section": "B3.2",
      "kind": "imperative",
      "text": "Use the revision's list-cache fields.",
      "checks": ["TRANSPORT-01"]
    },
    {
      "file": "bindings/B3-mcp.md",
      "section": "B3.4",
      "kind": "declarative",
      "text": "A token that fails verification at the MCP endpoint fails RFC 6750 `invalid_token` as A6.3 says, before any JSON-RPC processing: status `401` with the A6.1 challenge carrying that code.",
      "checks": ["TRANSPORT-01"]
    },
    {
      "file": "bindings/B4-rest.md",
      "section": "B4.1",
      "kind": "imperative",
      "text": "Use HTTPS, exact `<origin>/v1` audience, and `Autonym-Version:1.0` on protocol responses.",
      "checks": ["TRANSPORT-01", "CORE-01"]
    },
    {
      "file": "bindings/B4-rest.md",
      "section": "B4.1",
      "kind": "imperative",
      "text": "Reject repeated scalar query parameters, malformed values, unknown fields and unknown protocol versions with `invalid_request`.",
      "checks": ["TRANSPORT-01", "WIRE-01"]
    },
    {
      "file": "bindings/B4-rest.md",
      "section": "B4.1",
      "kind": "imperative",
      "text": "A context response has at most 1,000 entries; reject an over-limit request without a partial unmarked disclosure.",
      "checks": ["TRANSPORT-01"]
    },
    {
      "file": "bindings/B4-rest.md",
      "section": "B4.1",
      "kind": "lowercase",
      "text": "The path ID and body ID must match wherever both occur.",
      "checks": ["TRANSPORT-01"]
    },
    {
      "file": "bindings/B4-rest.md",
      "section": "B4.2",
      "kind": "imperative",
      "text": "Store its association with that exact signed envelope and response hash.",
      "checks": ["TEMP-03", "LOG-01"]
    },
    {
      "file": "bindings/B4-rest.md",
      "section": "B4.2",
      "kind": "imperative",
      "text": "Never use a content-only ETag.",
      "checks": ["TEMP-03", "TRANSPORT-01"]
    },
    {
      "file": "core/a01-scope-and-layering.md",
      "section": "A1",
      "kind": "keyword",
      "keywords": ["MUST", "MUST NOT", "SHOULD"],
      "text": "RFC 2119 and RFC 8174 capitalised MUST, MUST NOT, SHOULD and MAY identify requirements.",
      "reason": "Defines how the keywords are used; it states no requirement of its own."
    },
    {
      "file": "core/a01-scope-and-layering.md",
      "section": "A1.1",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "An implementation MUST satisfy both.",
      "reason": "States that the JSON Schemas and the prose invariants both bind. Every check in the manifest tests one or both, so the sentence needs no check of its own."
    },
    {
      "file": "core/a01-scope-and-layering.md",
      "section": "A1.1",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Unknown fields at a defined wire boundary MUST be rejected.",
      "checks": ["WIRE-01"]
    },
    {
      "file": "core/a01-scope-and-layering.md",
      "section": "A1.1",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Keys absent from the released core vocabulary MUST be rejected unless a separately versioned future extension is negotiated; there is no permissive arbitrary-JSON entry lane.",
      "checks": ["WIRE-01"]
    },
    {
      "file": "core/a01-scope-and-layering.md",
      "section": "A1.2",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Implementations MUST NOT advertise those reserved capabilities as conforming v1 features.",
      "checks": ["CLAIM-01"]
    },
    {
      "file": "core/a02-actors-and-trust.md",
      "section": "A2",
      "kind": "lowercase",
      "text": "Operators must have no routine decrypt-arbitrary-records interface.",
      "reason": "Operator interfaces are outside the protocol surface, so a suite cannot exercise them. Organisational: covered by implementation review and the security assessment, not by a conformance suite."
    },
    {
      "file": "core/a02-actors-and-trust.md",
      "section": "A2",
      "kind": "declarative",
      "text": "A client is `assistant` when the operator's assistant allowlist names the host of its Client ID Metadata Document or, for a client registered without one, names exactly every redirect URI it registers.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a02-actors-and-trust.md",
      "section": "A2",
      "kind": "declarative",
      "text": "A client that registers or publishes a loopback redirect URI is never `assistant`, by either path and whatever the allowlist names, because any program on the person's device can receive a redirect there, so the client's identity cannot be assured (RFC 8252 section 8.6).",
      "checks": ["OAUTH-01", "CONSENT-01"]
    },
    {
      "file": "core/a02-actors-and-trust.md",
      "section": "A2",
      "kind": "declarative",
      "text": "A redirect URI is a loopback URI when its host, as a URL parser reads it, is `localhost`, a name ending in `.localhost` or a loopback address, whatever its scheme.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a02-actors-and-trust.md",
      "section": "A2",
      "kind": "declarative",
      "text": "A client's class limits the grants it may hold (A6.2), and a request beyond them fails OAuth `invalid_scope`:",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a02-actors-and-trust.md",
      "section": "A2",
      "kind": "declarative",
      "text": "An `assistant_unverified`, `connector` or `self` client never holds `autonym:persist` or `autonym:delegate`; whether an `assistant` or `service` client may hold either is the provider's policy for that client.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a02-actors-and-trust.md",
      "section": "A2",
      "kind": "declarative",
      "text": "Every client that is not `assistant` and that the operator has not classified appears at consent with a warning that it is unverified, whatever its class.",
      "checks": ["CONSENT-01"]
    },
    {
      "file": "core/a03-identifiers-and-resolution.md",
      "section": "A3.1",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Recipients MUST NOT receive a record DID, canonical entry ID, owner identifier, another client's handle or another client's grant identifier through ordinary reads.",
      "checks": ["PAIR-01"]
    },
    {
      "file": "core/a03-identifiers-and-resolution.md",
      "section": "A3.2",
      "kind": "declarative",
      "text": "An IP address is never an authority, and neither is a name whose last label is all digits or `0x` followed by hexadecimal digits, since URL parsers read such a name as an IPv4 address.",
      "checks": ["PAIR-01"]
    },
    {
      "file": "core/a03-identifiers-and-resolution.md",
      "section": "A3.2",
      "kind": "imperative",
      "text": "Generate the local part as the first 32 characters of lower-case, unpadded RFC 4648 base32 of HMAC-SHA256 over UTF-8 RFC 8785 canonical JSON:",
      "checks": ["PAIR-01"]
    },
    {
      "file": "core/a03-identifiers-and-resolution.md",
      "section": "A3.2",
      "kind": "imperative",
      "text": "Check uniqueness before committing issuance.",
      "checks": ["PAIR-01"]
    },
    {
      "file": "core/a03-identifiers-and-resolution.md",
      "section": "A3.2",
      "kind": "imperative",
      "text": "Never expose canonical IDs through provenance, dependencies, errors, ETags or diagnostic counts.",
      "checks": ["PAIR-01"]
    },
    {
      "file": "core/a03-identifiers-and-resolution.md",
      "section": "A3.2",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "A public name provides a provider address for consent; it MUST NOT yield record contents, a DID or evidence that the person exists to unauthenticated enumeration.",
      "checks": ["HANDLE-01"]
    },
    {
      "file": "core/a03-identifiers-and-resolution.md",
      "section": "A3.3",
      "kind": "lowercase",
      "text": "Every fetch of an untrusted client/provider URL must use SSRF-safe retrieval with DNS/address checks, size/time limits and revalidation at each allowed redirect.",
      "checks": ["FETCH-01"]
    },
    {
      "file": "core/a03-identifiers-and-resolution.md",
      "section": "A3.4",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "The old provider MUST NOT redirect authenticated API or token requests to a different origin, forward credentials, or reveal the destination to contributors.",
      "checks": ["MIGRATE-01"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.1",
      "kind": "lowercase",
      "text": "`value_type` must match the key definition, and `value` must pass that key's closed schema.",
      "checks": ["WIRE-01"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.1",
      "kind": "declarative",
      "text": "A tombstone's version is one more than the last version of the entry it deletes, so no ID and version name both a version and a tombstone, and an earlier version keeps the status it was written with.",
      "checks": ["PORT-01"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.1",
      "kind": "declarative",
      "text": "A partition holds at most 10,000 entries that have not been deleted, which bounds what one read compiles; a write that would add another fails with `entry_limit_reached` and changes nothing.",
      "checks": ["PORT-01"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.1",
      "kind": "declarative",
      "text": "No agent operation adds an entry: a contribution is acknowledged as a proposal whatever the partition holds (A14), so only the person's own operations, such as accepting a proposal in the first-party app or an import, meet the limit.",
      "checks": ["CONTRIB-02"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.2",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "`attested` is reserved for future credential verification and MUST be withheld from v1 recipient disclosure unless the person separately confirms a declared entry.",
      "checks": ["DISC-01"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.2",
      "kind": "imperative",
      "text": "Preserve source event identity and evidence after confirmation; never disclose that evidence merely because the confirmed preference is shareable.",
      "checks": ["CONTRIB-02", "DISC-01"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.2",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Special-category and safety-critical keys MUST NOT be observed or inferred.",
      "checks": ["INFER-01"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.3",
      "kind": "imperative",
      "text": "Use one provider `Clock` instant for the entire read transaction.",
      "checks": ["TEMP-01"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.3",
      "kind": "imperative",
      "text": "Reject equal or reversed finite bounds.",
      "checks": ["TEMP-01"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.3",
      "kind": "imperative",
      "text": "Never infer that a stale allergy has ceased.",
      "checks": ["TEMP-02"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.4",
      "kind": "lowercase",
      "text": "The target must be an active baseline in the same partition/domain/key.",
      "checks": ["TEMP-02"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.4",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Overlay creation or expiry MUST NOT supersede or alter the baseline.",
      "checks": ["TEMP-02"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.4",
      "kind": "imperative",
      "text": "If several are eligible without one selection, or several of them are marked selected, apply none and use the eligible baseline until the person resolves the conflict.",
      "checks": ["TEMP-02"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.4",
      "kind": "imperative",
      "text": "Do not resolve these conflicts using insertion order or confidence.",
      "checks": ["TEMP-02"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.5",
      "kind": "imperative",
      "text": "At disclosure, recursively validate every dependency's current version, validity, purpose, grant rights and actual fields/level used.",
      "checks": ["TEMP-03", "CONTRIB-03"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.5",
      "kind": "imperative",
      "text": "Reject cycles, depth above 16, more than 256 dependency references, absent inputs and stale versions.",
      "checks": ["TEMP-03"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.5",
      "kind": "imperative",
      "text": "Recompute or withhold on any change or expiry.",
      "checks": ["TEMP-03"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.5",
      "kind": "imperative",
      "text": "Never disclose dependency identifiers or raw source history through a preference read.",
      "checks": ["CONTRIB-03", "DISC-01"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Nested paths, array indexes, wildcards, metadata and unknown members are unsupported and MUST be withheld.",
      "checks": ["TEMP-03", "CONTRIB-03"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.5",
      "kind": "lowercase",
      "text": "The required level must support the actual referenced field: a category or approved text override does not authorise its raw source value; a first-name rendering authorises `value.first`, not `value.full` or the whole name.",
      "checks": ["TEMP-03", "CONTRIB-03"]
    },
    {
      "file": "core/a04-data-model.md",
      "section": "A4.5",
      "kind": "lowercase",
      "text": "The request's output domains and keys need not name an input, but the stored grant must permit it.",
      "checks": ["TEMP-03"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.1",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Names, exact dates of birth, detailed addresses, phone/email, account/loyalty numbers, employer and institution names MUST NOT appear at L1.",
      "checks": ["DISC-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.1",
      "kind": "imperative",
      "text": "Free text at L1 or L2 requires the person's identifier-safe approved rendering; omit it if absent.",
      "checks": ["DISC-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.2",
      "kind": "imperative",
      "text": "For each requested domain, select the highest vocabulary-supported level at or below both ceilings.",
      "checks": ["DISC-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.2",
      "kind": "imperative",
      "text": "If none exists, omit the entry.",
      "checks": ["DISC-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.2",
      "kind": "imperative",
      "text": "Restrict provenance evidence separately.",
      "checks": ["DISC-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.2",
      "kind": "imperative",
      "text": "Within one transaction: authenticate the client, validate token audience/sender proof, lock and recheck the grant and counters, capture trusted time, select eligible baselines/overlays, enforce dependencies, render, create and sign the envelope, append its receipt, increment the counter, commit, then return.",
      "checks": ["CORE-01", "LOG-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.2",
      "kind": "imperative",
      "text": "Always include currently eligible safety-critical entries even when older.",
      "checks": ["TEMP-02", "DISC-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.2",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Implementations MAY conservatively include otherwise eligible entries when their selection group or dependency group changed; they MUST NOT omit restored eligibility because the baseline's stored value was unchanged.",
      "checks": ["TEMP-02"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.2",
      "kind": "lowercase",
      "text": "A client must obtain a full fresh read after a previous envelope expires; a partial response does not renew missing entries.",
      "checks": ["TEMP-03"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.3",
      "kind": "imperative",
      "text": "Use `Cache-Control:no-store`; recipients may retain transient context only until this deadline unless a separate persistence right exists.",
      "checks": ["TEMP-03"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.3",
      "kind": "lowercase",
      "text": "A recipient must stop treating an entry as current at the signed deadline and refresh through a new authorised read.",
      "checks": ["TEMP-03"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "Sign UTF-8 RFC 8785 canonical JSON of the complete object without `proof`.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "Use ordinary base64url payload mode with RFC 7515 Appendix F detached compact JWS: `protected..signature`, each part in unpadded base64url and in no other spelling of the same bytes.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "A provider's signing key belongs to that provider alone and MUST NOT appear in another provider's key set, so that a valid signature identifies one provider whatever the signed object names (KEY-01).",
      "checks": ["KEY-01", "SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "Parse the received text strictly before canonicalisation: reject duplicate members, with names compared after escapes are decoded, and anything that is not I-JSON, including a lone surrogate or noncharacter and a number written with more magnitude or precision than an IEEE 754 binary64 value provides: one whose decimal value differs from that of the shortest decimal identifying the binary64 value it parses to, such as `1E400` or `3.141592653589793238462643383279`, while `0.1` and `1e23` are accepted.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "Verify the signature over the canonical form of the parsed object without `proof`.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "Accept only ES256 and a key from the trusted, configured key set of the issuer: the configured provider for a disclosure, receipt, export or purge instruction, and the recipient's registered keys for an acknowledgement.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "Select the one key whose `kid` equals the protected header's, never a key or key URL that the object or its header supplies, and recompute its thumbprint.",
      "checks": ["SIGN-01", "KEY-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "Reject:",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "any protected header member other than `alg`, `kid` and `typ`, including `crit`, `jwk`, `jku`, `x5u` and `b64`, and any duplicate header member;",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "`alg:none` and every algorithm other than ES256;",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "a `typ` that differs from the expected value, compared exactly;",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "proof metadata whose `alg` or `kid` disagrees with the protected header;",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "a key ID that is not in the trusted set, appears in it more than once, or is not the thumbprint of its key;",
      "checks": ["SIGN-01", "KEY-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "a matching key that does not follow key-set.json, such as one with a private member, `key_ops` or a lifetime member other than `exp`;",
      "checks": ["SIGN-01", "KEY-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "a signed object whose signed time is at or after the instant the matching key's `exp` denotes (A9, KEY-01);",
      "checks": ["KEY-01", "SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "a disclosure or receipt whose `provider`, or an export whose `origin_host`, is not the trusted issuer, compared as exact strings;",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "a receipt whose `hash` is not the A9 hash of its own content;",
      "checks": ["SIGN-01", "LOG-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "a disclosure whose `valid_until` is not after `issued_at`, is more than five minutes after it, or disagrees with `ttl_seconds`; one whose `issued_at` is more than 60 seconds after the verifier's trusted current time, the most the two clocks may differ; and one whose `valid_until` is not after the verifier's trusted current time.",
      "checks": ["SIGN-01", "TEMP-03"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "imperative",
      "text": "Check every other signed binding as well, such as the client, audience, handle and grant of a disclosure.",
      "checks": ["SIGN-01", "CORE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.1",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Providers MUST serve a path-specific RFC 9728 metadata document for each protected resource they serve, at the location RFC 9728 section 3 derives from its resource identifier, such as `/.well-known/oauth-protected-resource/mcp` and `/.well-known/oauth-protected-resource/v1`, and authorisation-server metadata under RFC 8414.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.1",
      "kind": "declarative",
      "text": "There is no document at `/.well-known/oauth-protected-resource` itself: its `resource` would be the origin, which is not an audience.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.1",
      "kind": "declarative",
      "text": "`jwks_uri`, `sector_identifier_uri`, `application_type`, a software statement, a registry attestation and any member the schema does not list are refused, so a registration is never accepted with members silently dropped; whether a client may use the loopback-port exception is decided from its redirect URIs (A6.3).",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.1",
      "kind": "declarative",
      "text": "`private_key_jwt` needs `jwks`; `client_credentials` is only for a client that authenticates with `private_key_jwt`; `refresh_token` comes only with `authorization_code`, which goes with the `code` response type and at least one redirect URI; and redirect URIs, grant types and key IDs are each unique.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.1",
      "kind": "declarative",
      "text": "A client that uses the A6.4 token exchange lists `urn:ietf:params:oauth:grant-type:token-exchange` in `grant_types`, and one that redeems a grant offer lists `urn:autonym:params:oauth:grant-type:grant-offer`; a grant type the provider does not offer is refused.",
      "checks": ["OAUTH-01", "DELEGATE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.1",
      "kind": "declarative",
      "text": "A client that lists the grant offer grant type authenticates with `private_key_jwt`, as one that lists `client_credentials` does, because only its registered key shows that it is the client a grant offer names (A6.4); a public client may still use the token exchange as a delegate.",
      "checks": ["OAUTH-01", "DELEGATE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.1",
      "kind": "declarative",
      "text": "A Client Identifier URL has no `.` or `..` path segment, written plainly or percent-encoded, and its host is a name whose last label is neither all digits nor `0x` followed by hexadecimal digits, which URL parsers read as an IPv4 address.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.1",
      "kind": "declarative",
      "text": "`client_name`, `contacts`, `software_id` and `software_version` carry only characters of the Basic Multilingual Plane, and no control character, bidirectional formatting character, line or paragraph separator, interlinear annotation character or default-ignorable character, one that renders as nothing, such as a zero-width space, a soft hyphen, a Hangul filler or a variation selector.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.1",
      "kind": "declarative",
      "text": "Characters outside the Basic Multilingual Plane are refused because they include the tag characters, which can carry hidden text, and a regular expression that reads text in 16-bit code units, as JavaScript's does, cannot tell those from the rest.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.2",
      "kind": "imperative",
      "text": "Any accepted `:declared` modifier makes the entire stored grant declared-only, including wildcard combinations; use separate grants for different declaration restrictions.",
      "checks": ["SCOPE-05", "DISC-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.2",
      "kind": "lowercase",
      "text": "`expires_at` must be after issuance; read/event counts cannot exceed their maximum.",
      "checks": ["CORE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.2",
      "kind": "declarative",
      "text": "A contribution grant is requested with `autonym:propose`, exactly one purpose scope and one RFC 9396 `authorization_details` entry of type `urn:autonym:authorization-details:contribute` (contribution-detail.json), which names the domain and key allowlist, `max_events` and `allow_confirmation`.",
      "checks": ["CONSENT-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.2",
      "kind": "declarative",
      "text": "`allow_confirmation` is true exactly when `autonym:confirm` is requested; a detail that says otherwise fails RFC 9396 `invalid_authorization_details`, so the class limits on `autonym:confirm` (A2) also bound the detail.",
      "checks": ["CONSENT-01", "OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.2",
      "kind": "declarative",
      "text": "Every grant has exactly one audience, the resource it was requested for, and its tokens are valid only there.",
      "checks": ["CORE-01", "OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.3",
      "kind": "imperative",
      "text": "Use authorisation code with PKCE S256 only; reject plain/downgrade.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.3",
      "kind": "imperative",
      "text": "Require exact registered redirect-URI matching, with only the RFC 8252 loopback-port exception, which applies only to a client whose registered redirect URIs are all `http` loopback URIs: a redirect to one of them may name any port.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.3",
      "kind": "imperative",
      "text": "Use session-bound state, unframeable consent pages and rotating refresh tokens with replay detection.",
      "checks": ["OAUTH-01", "CONSENT-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.3",
      "kind": "imperative",
      "text": "Check issuer, audience, signature, expiry and server-side grant on every authorised action.",
      "checks": ["CORE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.3",
      "kind": "imperative",
      "text": "Never accept a bound token as Bearer.",
      "checks": ["TRANSPORT-01", "OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.3",
      "kind": "declarative",
      "text": "A second use of an authorisation code or of a spent refresh token revokes the grant it belongs to, and that request fails OAuth `invalid_grant`.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.3",
      "kind": "declarative",
      "text": "Access tokens last at most one hour and never beyond grant expiry.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.3",
      "kind": "declarative",
      "text": "Every access token, for every client class and every resource, is bound to the client's DPoP key under RFC 9449: no Bearer token is issued or accepted.",
      "checks": ["TRANSPORT-01", "OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.3",
      "kind": "declarative",
      "text": "A proof is accepted only once, and only within 60 seconds of its `iat`.",
      "checks": ["TRANSPORT-01", "OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.3",
      "kind": "declarative",
      "text": "At a resource, a bound token is sent as `Authorization: DPoP` with a proof that binds the method, the URL and the access token, signed by the key whose RFC 7638 thumbprint is the token's `cnf.jkt`; a proof signed by any other key fails `dpop_invalid`.",
      "checks": ["TRANSPORT-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.3",
      "kind": "declarative",
      "text": "At a resource, a token whose signature, issuer, audience, type, lifetime or claims fail verification fails RFC 6750 `invalid_token` with status 401 and the A6.1 challenge.",
      "checks": ["TRANSPORT-01", "OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.3",
      "kind": "declarative",
      "text": "A verified token whose grant has ended, or whose client is suspended, fails that registered code instead (A5.2, A6.8).",
      "checks": ["CORE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.4",
      "kind": "imperative",
      "text": "Authenticate the delegate and recheck its current grant.",
      "checks": ["DELEGATE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.4",
      "kind": "declarative",
      "text": "The request's DPoP proof is signed by the key whose thumbprint is the `subject_token`'s `cnf.jkt`, or the request fails OAuth `invalid_grant`.",
      "checks": ["DELEGATE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.4",
      "kind": "declarative",
      "text": "`autonym_recipient` names a client registered with the grant offer grant type, which therefore authenticates with `private_key_jwt` (A6.1); naming any other client fails, as a missing parameter does.",
      "checks": ["DELEGATE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.4",
      "kind": "declarative",
      "text": "The recipient redeems it through the RFC 6749 extension grant `grant_type=urn:autonym:params:oauth:grant-type:grant-offer`, `grant_code` and exact `resource`, authenticated as the target client with `private_key_jwt` and presenting its own DPoP key.",
      "checks": ["DELEGATE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.4",
      "kind": "declarative",
      "text": "Holding the offer is never enough to redeem it.",
      "checks": ["DELEGATE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.4",
      "kind": "imperative",
      "text": "Bind offer to target, audience and proposed child restrictions.",
      "checks": ["DELEGATE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.4",
      "kind": "imperative",
      "text": "Check parent, budget and one-use state again atomically at redemption.",
      "checks": ["DELEGATE-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.6",
      "kind": "declarative",
      "text": "This is a client lifecycle token, not a record grant: its JWT (lifecycle-token-claims.json) has `autonym_token_kind:lifecycle`, `sub` and `client_id`, both the client's ID as RFC 9068 asks of a client credentials token, `scope` `autonym:lifecycle:purge`, issuer/audience, `cnf.jkt`, `iat`, `exp` and `jti`, but no handle or grant ID.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.7",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Recommendation/personalisation permission MUST NOT be repurposed for advertising.",
      "checks": ["CONSENT-01", "SCOPE-10"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.7",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Declining advertising MUST leave independent non-advertising permissions intact.",
      "checks": ["CONSENT-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.7",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Providers MUST require the person to choose the offered ordinary preference directly and prohibit sensitive targeting/inference by recipient policy.",
      "checks": ["ADS-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.7",
      "kind": "imperative",
      "text": "If adult/self-directed eligibility cannot be established, deny the feature; do not collect extra identity documents simply to enable advertising.",
      "checks": ["ADS-01", "PRIVACY-05"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.7",
      "kind": "imperative",
      "text": "Retain context only for the current interaction and never past the signed five-minute maximum; a new interaction needs fresh permission.",
      "checks": ["ADS-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.5",
      "kind": "declarative",
      "text": "`POST /oauth/revoke` follows RFC 7009 for refresh tokens, and revoking a refresh token revokes the grant it belongs to.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.5",
      "kind": "declarative",
      "text": "A public client's refresh token is bound to its DPoP key (RFC 9449 section 5), so revoking one needs proof of possession, as using one does: a public client's revocation request carries a DPoP proof of that request, checked as at the token endpoint (A6.3), and without a valid one it fails RFC 9449 `invalid_dpop_proof`, or fails `use_dpop_nonce` with a fresh nonce when its nonce is stale, and revokes nothing.",
      "checks": ["OAUTH-01", "TRANSPORT-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.5",
      "kind": "declarative",
      "text": "A refresh token bound to a key other than the proof's is not revoked, and the request is answered as RFC 7009 answers an invalid token, so the answer does not tell the holder of a stolen refresh token whether it is live.",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.5",
      "kind": "declarative",
      "text": "A confidential client's revocation request is authenticated with `private_key_jwt` (A6.1).",
      "checks": ["OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.5",
      "kind": "declarative",
      "text": "An access token is not revoked on its own: the endpoint answers RFC 7009 `unsupported_token_type` for one, and it ends with its grant, because every authorised action checks the stored grant (A6.3).",
      "checks": ["CORE-01", "OAUTH-01"]
    },
    {
      "file": "core/a06-authorisation.md",
      "section": "A6.8",
      "kind": "declarative",
      "text": "A suspended client takes no recipient action, even with an otherwise active grant, except at the A6.6 purge routes: it is not authorised, obtains and refreshes no token, and its request to a resource fails `client_suspended`.",
      "checks": ["CORE-01", "OAUTH-01"]
    },
    {
      "file": "core/a07-agent-surface.md",
      "section": "A7.1",
      "kind": "lowercase",
      "text": "It must not produce an unsigned alternative value.",
      "checks": ["TRANSPORT-01", "SIGN-01"]
    },
    {
      "file": "core/a07-agent-surface.md",
      "section": "A7.3",
      "kind": "lowercase",
      "text": "Both domains must be granted; no fallback ambient read exists.",
      "checks": ["CORE-01", "TRANSPORT-01"]
    },
    {
      "file": "core/a07-agent-surface.md",
      "section": "A7.3",
      "kind": "lowercase",
      "text": "The recipient must apply normal instruction/safety boundaries to contributed text; context is data, not authority to override system or tool policy.",
      "reason": "Whether a recipient treats contributed text as data inside its own model is not observable through the protocol, so no suite can test it; it is an implementation and threat-model obligation, as in A15."
    },
    {
      "file": "core/a08-recipient-api.md",
      "section": "A8",
      "kind": "imperative",
      "text": "Always recheck authority before replaying a stored response; a retry after revocation cannot retrieve protected results.",
      "checks": ["CORE-01", "CONTRIB-02"]
    },
    {
      "file": "core/a08-recipient-api.md",
      "section": "A8",
      "kind": "lowercase",
      "text": "Owner management must support reviewing entries/proposals/grants/history, temporal activation, correction, revocation, export/import and deletion with re-authentication for sensitive changes.",
      "reason": "First-party owner management is outside the recipient interoperability surface, as the same paragraph says, so a recipient-facing suite cannot reach it. The rights it serves are evidenced under A16.5."
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "imperative",
      "text": "Sign the complete receipt excluding `proof` using the A5.4 method and protected `typ:autonym-receipt+jws`; its signed time is `at`.",
      "checks": ["LOG-01", "SIGN-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "lowercase",
      "text": "Owners should be able to export signed checkpoints.",
      "checks": ["LOG-02", "PORT-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Receipts MUST stay verifiable after the signing key changes.",
      "checks": ["LOG-02"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "A key ID is the RFC 7638 thumbprint of its public key (A5.4), so one key ID cannot name two keys, and a provider MUST NOT reuse a key ID.",
      "checks": ["KEY-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "A retired signing key MUST NOT sign anything at or after its retirement.",
      "checks": ["KEY-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "keyword",
      "keywords": ["MUST", "MUST NOT"],
      "text": "Its public key MUST stay in the provider's key set, with `exp` giving the time of its retirement (A5.4), for as long as any receipt or log event it signed is retained, and a published `exp` MUST NOT be removed or changed.",
      "checks": ["KEY-01", "LOG-02"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Log retention and compaction MUST keep everything an old receipt needs to verify independently: the receipt, the hash-chain events it links to, any checkpoint it is anchored to and the public key that signed it.",
      "checks": ["LOG-02"]
    },
    {
      "file": "core/a10-revocation-and-purge.md",
      "section": "A10",
      "kind": "imperative",
      "text": "Retry after 1 minute, 5 minutes, 30 minutes, 2 hours, 12 hours and then daily until acknowledgement or 30 days.",
      "checks": ["PURGE-01"]
    },
    {
      "file": "core/a10-revocation-and-purge.md",
      "section": "A10",
      "kind": "imperative",
      "text": "Do not drop a notice merely because the triggering grant expired.",
      "checks": ["PURGE-01"]
    },
    {
      "file": "core/a10-revocation-and-purge.md",
      "section": "A10",
      "kind": "imperative",
      "text": "Validate client/instruction binding.",
      "checks": ["PURGE-01"]
    },
    {
      "file": "core/a10-revocation-and-purge.md",
      "section": "A10",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "A provider MUST NOT present an acknowledgement, to the person or anywhere else, as proof of erasure or as evidence that no copy remains (PURGE-01).",
      "checks": ["PURGE-01"]
    },
    {
      "file": "core/a10-revocation-and-purge.md",
      "section": "A10",
      "kind": "imperative",
      "text": "Do not expose it to other recipients.",
      "checks": ["PURGE-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.1",
      "kind": "imperative",
      "text": "Owner-only wrappers bind every historical grant, receipt, log event, proposal and policy to its partition ID; validate those IDs against the partition list.",
      "checks": ["PORT-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.1",
      "kind": "imperative",
      "text": "Preserve canonical IDs, temporal intervals, overlay targets, semantic kinds, provenance, evidence references and original origin.",
      "checks": ["PORT-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.1",
      "kind": "imperative",
      "text": "Evidence references may be unavailable at the new host; report that explicitly, never treat missing evidence as verified.",
      "checks": ["PORT-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.1",
      "kind": "imperative",
      "text": "Sign the JCS export excluding `proof` by the A5.4 method with the originating provider's ES256 key and protected `typ:autonym-export+jws`; its signed time is `exported_at`.",
      "checks": ["PORT-01", "SIGN-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.1",
      "kind": "imperative",
      "text": "Do not follow arbitrary key URLs from the file.",
      "checks": ["PORT-01", "SIGN-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.1",
      "kind": "imperative",
      "text": "Never export private keys, access/refresh tokens, passkeys, client secrets or executable credentials.",
      "checks": ["PORT-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.1",
      "kind": "declarative",
      "text": "The importer validates size, schema, signatures, vocabulary, IDs, versions, temporal constraints, dependency cycles, relationships and each partition's A4.1 entry limit before changing the destination.",
      "checks": ["PORT-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.1",
      "kind": "imperative",
      "text": "Reject duplicate IDs/versions with differing content.",
      "checks": ["PORT-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.1",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "An old token MUST fail at the new provider.",
      "checks": ["PORT-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.2",
      "kind": "imperative",
      "text": "Use compact JWE with `alg:dir`, `enc:A256GCM`, `typ:autonym-export+jwe` and `cty:application/autonym-export+json`.",
      "checks": ["ENCRYPT-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.2",
      "kind": "imperative",
      "text": "Use a new random 96-bit GCM IV and 128-bit authentication tag as required by JWE.",
      "checks": ["ENCRYPT-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.2",
      "kind": "imperative",
      "text": "Derive a 32-byte key with Argon2id RFC 9106, version 19, memory 65,536 KiB, three iterations, four lanes and a fresh random 16-byte salt.",
      "checks": ["ENCRYPT-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.2",
      "kind": "imperative",
      "text": "Reject unsupported/missing KDF fields, salt size, algorithms, duplicate JSON members and excess encrypted size before allocating Argon2 memory.",
      "checks": ["ENCRYPT-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.2",
      "kind": "imperative",
      "text": "Limit concurrent derivations.",
      "checks": ["ENCRYPT-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.2",
      "kind": "imperative",
      "text": "Verify GCM before parsing or exposing plaintext, then verify export signatures and semantics.",
      "checks": ["ENCRYPT-01", "SIGN-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.2",
      "kind": "imperative",
      "text": "Use maintained Argon2/JWE libraries; do not implement these primitives in application code.",
      "reason": "Implementation practice: which library produced a correct result is not observable through the protocol, so no suite can test it. ENCRYPT-01 tests the outcomes."
    },
    {
      "file": "core/a14-contributions.md",
      "section": "A14.2",
      "kind": "imperative",
      "text": "Record the authenticated client as source; reject a body-supplied source client or ingestion time.",
      "checks": ["CONTRIB-02"]
    },
    {
      "file": "core/a14-contributions.md",
      "section": "A14.2",
      "kind": "lowercase",
      "text": "Occurrence time can describe past activity but must not exceed ingestion by more than five minutes; it does not backdate authority.",
      "checks": ["CONTRIB-02"]
    },
    {
      "file": "core/a14-contributions.md",
      "section": "A14.2",
      "kind": "imperative",
      "text": "Hash the canonical submitted payload with SHA-256 for comparison.",
      "checks": ["CONTRIB-02"]
    },
    {
      "file": "core/a14-contributions.md",
      "section": "A14.2",
      "kind": "imperative",
      "text": "Accept and acknowledge transactionally, after rechecking current grant activity and limits.",
      "checks": ["CONTRIB-02"]
    },
    {
      "file": "core/a14-contributions.md",
      "section": "A14.2",
      "kind": "imperative",
      "text": "Retain deduplication identities and payload digests for the stream lifetime plus 30 days.",
      "checks": ["CONTRIB-02"]
    },
    {
      "file": "core/a14-contributions.md",
      "section": "A14.3",
      "kind": "lowercase",
      "text": "The full predecessor chain is bounded to 100 and cannot branch silently: a correction must reference the current head or fail `proposal_decided`.",
      "checks": ["CONTRIB-02"]
    },
    {
      "file": "core/a14-contributions.md",
      "section": "A14.3",
      "kind": "imperative",
      "text": "It cannot delete the person's independently confirmed declaration; instead flag the changed evidence for the person's review.",
      "checks": ["CONTRIB-02"]
    },
    {
      "file": "core/a14-contributions.md",
      "section": "A14.3",
      "kind": "imperative",
      "text": "Preserve it even after acceptance.",
      "checks": ["CONTRIB-02"]
    },
    {
      "file": "core/a14-contributions.md",
      "section": "A14.3",
      "kind": "imperative",
      "text": "Rejected suggestions must not repeatedly resurface: suppress identical `(client,domain,key,canonical value digest)` proposals for 90 days unless the person explicitly reopens the suggestion or supplies a new declaration.",
      "checks": ["CONTRIB-02"]
    },
    {
      "file": "core/a14-contributions.md",
      "section": "A14.5",
      "kind": "imperative",
      "text": "Distinguish user-supplied preferences, activity, observations and inference.",
      "checks": ["CONTRIB-02", "INFER-01"]
    },
    {
      "file": "core/a15-security.md",
      "section": "A15",
      "kind": "imperative",
      "text": "Treat record contents and contributor text as untrusted data.",
      "reason": "Whether text is handled as data inside a recipient's model or a provider's templates is not observable through the protocol, so no suite can test it; it is an implementation and threat-model obligation."
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.1",
      "kind": "imperative",
      "text": "Enforce issuer, exact audience, client binding, expiry, the DPoP proof, grant revision, domain/key/level constraints, purpose, temporal validity and limits.",
      "checks": ["CORE-01", "TRANSPORT-01"]
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.1",
      "kind": "imperative",
      "text": "Recheck inside the transaction.",
      "checks": ["CORE-01", "LOG-01"]
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.1",
      "kind": "imperative",
      "text": "Deny missing, unknown or incompatible state.",
      "checks": ["CORE-01"]
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.1",
      "kind": "imperative",
      "text": "Use client-bound handles and entry aliases.",
      "checks": ["PAIR-01"]
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.1",
      "kind": "keyword",
      "keywords": ["SHOULD"],
      "text": "Providers SHOULD refuse a wildcard L0 grant to a client already holding L2 or higher in any domain, and explain its actual grant selection to the person.",
      "checks": ["WILDCARD-01"]
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.2",
      "kind": "lowercase",
      "text": "Reserved future host-binding formats must define their own signed object before use.",
      "reason": "Addressed to future specifications of reserved formats, not to a version 1 implementation; there is no version 1 behaviour to test."
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.3",
      "kind": "imperative",
      "text": "Use maintained cryptographic libraries and secure platform primitives.",
      "reason": "Implementation practice: which library produced a correct result is not observable through the protocol, so no suite can test it. SIGN-01 and ENCRYPT-01 test the outcomes."
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.3",
      "kind": "lowercase",
      "text": "Private keys and encrypted record contents must be isolated from operational support access.",
      "reason": "Isolation from operational support access is a property of the deployment, not of any protocol exchange. Organisational: covered by implementation review and the security assessment, not by a conformance suite."
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.3",
      "kind": "imperative",
      "text": "Rate-limit by client, grant and unauthenticated origin.",
      "checks": ["TRANSPORT-01"]
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.3",
      "kind": "imperative",
      "text": "Bound nested JSON, body size, dependency depth, exports, cryptographic work and retries.",
      "checks": ["TRANSPORT-01", "TEMP-03", "PORT-01"]
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.3",
      "kind": "imperative",
      "text": "Fetch client-supplied URLs only through SSRF-safe retrieval, checking resolved addresses and redirects and blocking private/link-local destinations unless an explicitly isolated local mode is configured.",
      "checks": ["FETCH-01"]
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.3",
      "kind": "imperative",
      "text": "Keep values, renderings, utterances, evidence, uploads, credentials and tokens out of operational logs, traces, metrics, emails and job payloads.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.3",
      "kind": "imperative",
      "text": "Protect first-party changes with authenticated sessions, CSRF controls, fresh re-authentication for sensitive actions and visible audit history.",
      "reason": "First-party session controls sit outside the recipient interoperability surface (A1.2, A8), so a conformance suite cannot reach them. Organisational: covered by implementation review and the security assessment."
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.3",
      "kind": "imperative",
      "text": "Never expose a route that decrypts arbitrary records for operators.",
      "reason": "Operator interfaces are outside the protocol surface, so a conformance suite cannot exercise them. Organisational: covered by implementation review and the security assessment."
    },
    {
      "file": "core/a15-security.md",
      "section": "A15.3",
      "kind": "lowercase",
      "text": "A plausible-looking “duress record” is not a security guarantee and must not be claimed from this draft.",
      "checks": ["CLAIM-01"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.1",
      "kind": "lowercase",
      "text": "UK applicability must be evaluated separately using current legislation and ICO consent guidance; it is not assumed identical to EU rules.",
      "reason": "In A16.1, which the text marks informative; the deployment requirement it points to is A16.2, checked by PRIVACY-01."
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.2",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Before collecting, storing, accepting a contribution, deriving or disclosing personal data, each deploying provider and recipient MUST document the applicable jurisdictions, its actual legal roles, purposes, data categories and lawful conditions for those operations.",
      "checks": ["PRIVACY-01"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.2",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "The assessment MUST consider the people served, establishment, targeting, sector and actual processing, rather than relying solely on nationality, IP address or hosting location.",
      "checks": ["PRIVACY-01"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.2",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Where a required condition is absent or unresolved, the affected operation MUST remain disabled.",
      "checks": ["PRIVACY-01"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.2",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "The assessment MUST distinguish independent, joint and processor relationships where applicable, including account administration, security logs, hosting and recipient use.",
      "checks": ["PRIVACY-01"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.2",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Required notices, agreements and evidence of the selected lawful conditions MUST be in place before the relevant processing.",
      "checks": ["PRIVACY-01"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.2",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Where consent is relied on, the implementation MUST retain proportionate evidence of the actual notice and version, language, purposes, parties, categories, affirmative action, time and withdrawal route.",
      "checks": ["PRIVACY-01"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.2",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "It MUST satisfy any applicable explicit, separate, written or representative-consent formality and permit refusal and withdrawal without prohibited detriment.",
      "checks": ["PRIVACY-01"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.2",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Withdrawal MUST be as easy as giving consent where the law requires it.",
      "checks": ["PRIVACY-01"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.2",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Grant acceptance MUST NOT waive statutory rights or authorise a purpose that the protocol prohibits.",
      "checks": ["PRIVACY-01"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.2",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Required indirect-collection notices MUST be handled at the legally required time.",
      "checks": ["PRIVACY-01"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.2",
      "kind": "keyword",
      "keywords": ["MUST", "MUST NOT"],
      "text": "Compliance records MUST remain protected and MUST NOT expand discovery or disclose additional personal data to recipients.",
      "checks": ["PRIVACY-01"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.3",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "The provider and recipient MUST assess legal sensitivity for the actual data, source, inference and combination in each applicable jurisdiction.",
      "checks": ["PRIVACY-02"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.3",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Implementations MUST NOT relabel data, lower its disclosure level or describe it as a preference to evade a legal restriction.",
      "checks": ["PRIVACY-02"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.3",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Collection, storage and disclosure MUST be limited to the purpose and necessity permitted by applicable law.",
      "checks": ["PRIVACY-02"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.3",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Operations governed by a grant MUST also remain within that grant’s purpose and authority.",
      "checks": ["PRIVACY-02"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.3",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Where processing requires a special condition, that condition MUST be established before the affected data is accepted or used.",
      "checks": ["PRIVACY-02"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.3",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Consent MUST NOT be treated as overriding a statutory prohibition or strict necessity requirement.",
      "checks": ["PRIVACY-02"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.3",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Unsupported categories and uses MUST remain disabled for the affected deployment.",
      "checks": ["PRIVACY-02"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.3",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Model training, advertising, enrichment and other further uses MUST NOT be inferred from permission to read, contribute or host a record.",
      "checks": ["PRIVACY-02"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.3",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Any further use MUST satisfy its own applicable legal conditions and the protocol's purpose and authority limits; fresh consent cannot override a protocol prohibition.",
      "checks": ["PRIVACY-02"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.4",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Before an international flow begins, the deploying parties MUST document its source, destination, parties, purposes and data categories, including hosting, backups, remote access, subprocessors and onward disclosure.",
      "checks": ["PRIVACY-03"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.4",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "They MUST establish any required transfer mechanism, assessment, contract, notice, separate permission, filing, representation or localisation arrangement for that flow.",
      "checks": ["PRIVACY-03"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.4",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "The assessment MUST record which flows an instrument covers, applicable conditions and a review point.",
      "checks": ["PRIVACY-03"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.4",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "A material change of destination, recipient, access arrangement or legal protection MUST trigger reassessment before the changed flow proceeds.",
      "checks": ["PRIVACY-03"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.4",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "A flow whose required safeguards are no longer satisfied MUST be suspended without silently selecting a different destination.",
      "checks": ["PRIVACY-03"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Each deploying party MUST provide an accessible route for applicable access, correction, deletion, restriction, objection and portability requests, authorised representatives, complaints and appeals.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Identity verification MUST be proportionate.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "It MUST NOT require a new account where applicable law prohibits doing so.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "The party MUST track the applicable deadline, any permitted extension, outcome, reasons and challenge route.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "A protocol export or read log alone MUST NOT be represented as a complete statutory response.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Correction MUST stop superseded information from being presented as current and communicate corrections or restrictions to recipients where required.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Disputed or restricted data MUST be prevented from entering uses that the restriction prohibits.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Retention rules MUST cover entries, history, contributions, receipts, logs, caches, exports and backups.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Grant expiry and revocation MUST NOT be treated as deletion.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Append-only audit design MUST NOT imply indefinite personal-data retention.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Implementations MUST use bounded history and proportionate evidence, with a tested deletion or effective cryptographic-erasure process where appropriate.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Restoring a backup MUST reapply deletions and restrictions before restored data becomes available for processing.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Revocation, consent withdrawal, restriction and erasure MUST be handled as distinct actions with their actual effects explained.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "A recipient's purge acknowledgement MUST be described as its assertion, not proof that every copy has disappeared.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Missing acknowledgements and incomplete deletion MUST have a tracked follow-up process.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Any retained data under a legal exception or hold MUST have a specific documented ground, restricted access and use, a review or end condition, and any legally required explanation and challenge route.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.5",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Such retention MUST NOT be reported as erasure or become an implicit new grant.",
      "checks": ["PRIVACY-04"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.6",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Before enabling that optional capability, the deploying parties MUST assess whether the arrangement constitutes regulated sale, sharing, targeted advertising or another restricted use, including non-monetary consideration.",
      "checks": ["PRIVACY-05"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.6",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "The capability MUST remain disabled wherever a required condition cannot be met.",
      "checks": ["PRIVACY-05"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.6",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Implementations MUST honour applicable objections, opt-outs and recognised preference signals, including signals received after a grant was issued, before the next affected disclosure or use.",
      "checks": ["PRIVACY-05"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.6",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "A grant MUST NOT silently override a valid opt-out.",
      "checks": ["PRIVACY-05"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.6",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Any legally permitted later opt-in MUST be handled through the required informed process.",
      "checks": ["PRIVACY-05"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.6",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Version 1 defines no universal transport for these signals; an implementation without a reliable way to receive and enforce applicable choices MUST keep the affected advertising use disabled.",
      "checks": ["PRIVACY-05"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.6",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "A deployment directed to children, or otherwise within applicable child-protection duties, MUST establish the required age, capacity, representative authority and child-specific safeguards through a separately specified and verified process before enabling affected processing.",
      "checks": ["PRIVACY-05"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.6",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Until that process exists, the deployment MUST restrict its supported audience and affected functions accordingly, using proportionate measures.",
      "checks": ["PRIVACY-05"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.6",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "It MUST NOT claim that a generic checkbox establishes parental authority.",
      "checks": ["PRIVACY-05"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.7",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Each deploying party MUST establish the impact assessments, security measures, contracts, records, registrations, permits, licences, prior authorisations, officers and representatives required for its actual activity.",
      "checks": ["PRIVACY-06"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.7",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Where an approval is required before processing or a transfer, the party MUST establish that it has been granted and covers the intended activity, rather than treating an application or personal consent as approval.",
      "checks": ["PRIVACY-06"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.7",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "It MUST track conditions, expiry and renewal, and stop the affected operation when required permission is absent or expires.",
      "checks": ["PRIVACY-06"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.7",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "It MUST maintain and exercise an incident process with jurisdiction-specific triggers, reporting routes and deadlines.",
      "checks": ["PRIVACY-06"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.7",
      "kind": "keyword",
      "keywords": ["MUST", "MUST NOT"],
      "text": "Unauthorised disclosures, including misuse by an authorised recipient, MUST be assessed; incident handling MUST NOT assume that every law uses the same threshold or a 72-hour deadline.",
      "checks": ["PRIVACY-06"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.7",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "A recipient using data for a decision subject to explanation, objection, review or human-intervention rights MUST provide the applicable process and information.",
      "checks": ["PRIVACY-06"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.7",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Parties MUST assess any activity-specific regime, including data intermediation, registered consent-management services and sector health or financial rules, before claiming that status.",
      "checks": ["PRIVACY-06"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.7",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "A technical provider, consent screen or registry entry MUST NOT be described as a legally registered or certified service without the required legal conditions, registration and any structural safeguards.",
      "checks": ["PRIVACY-06"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.8",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "A deployment claiming conformance MUST hold evidence for PRIVACY-01 to PRIVACY-06 identifying the tested build, jurisdictions, supported uses and categories, assessment date, responsible reviewer, restrictions, operational procedures and observed results.",
      "checks": [
        "PRIVACY-01",
        "PRIVACY-02",
        "PRIVACY-03",
        "PRIVACY-04",
        "PRIVACY-05",
        "PRIVACY-06"
      ]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.8",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Evidence MUST include representative exercises of the relevant consent, rights, transfer, retention, opt-out and incident processes.",
      "checks": [
        "PRIVACY-01",
        "PRIVACY-02",
        "PRIVACY-03",
        "PRIVACY-04",
        "PRIVACY-05",
        "PRIVACY-06"
      ]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.8",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "The deployment MUST reassess material changes in law, purpose, audience, data or flows.",
      "checks": [
        "PRIVACY-01",
        "PRIVACY-02",
        "PRIVACY-03",
        "PRIVACY-04",
        "PRIVACY-05",
        "PRIVACY-06"
      ]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.8",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Public claims MUST state their scope and limitations without publishing personal data, privileged advice or confidential security details.",
      "checks": ["CLAIM-01", "PRIVACY-06"]
    },
    {
      "file": "core/a16-privacy-mapping.md",
      "section": "A16.8",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "A checklist, pending test or published contract MUST NOT be presented as an operating safeguard.",
      "checks": ["CLAIM-01"]
    },
    {
      "file": "core/a17-conformance-and-change.md",
      "section": "A17.2",
      "kind": "imperative",
      "text": "Use capability-claim.json: role, wire/document version, capabilities, exact domain/key categories, directions, limitations, evidence URLs/timestamps and `assurance:self-declared`.",
      "checks": ["CLAIM-01"]
    },
    {
      "file": "core/a17-conformance-and-change.md",
      "section": "A17.2",
      "kind": "lowercase",
      "text": "Directions must match actual behaviour and the declared capabilities.",
      "checks": ["CLAIM-01"]
    },
    {
      "file": "core/a17-conformance-and-change.md",
      "section": "A17.2",
      "kind": "lowercase",
      "text": "Full runtime checks in the manifest remain pending and must pass before a conforming implementation is claimed.",
      "checks": ["CLAIM-01"]
    },
    {
      "file": "core/a17-conformance-and-change.md",
      "section": "A17.2",
      "kind": "lowercase",
      "text": "Failure reports must identify check ID, expected behaviour and observed behaviour without exposing personal values.",
      "checks": ["CLAIM-01"]
    },
    {
      "file": "core/a17-conformance-and-change.md",
      "section": "A17.6",
      "kind": "lowercase",
      "text": "A provider must not turn self-declaration into a verified/certified badge or trusted client class.",
      "checks": ["CLAIM-01"]
    },
    {
      "file": "core/a17-conformance-and-change.md",
      "section": "A17.6",
      "kind": "lowercase",
      "text": "An implementation offering a separate experimental emergency card must clearly distinguish it from v1 conformance.",
      "checks": ["CLAIM-01"]
    },
    {
      "file": "core/a17-conformance-and-change.md",
      "section": "A17.6",
      "kind": "lowercase",
      "text": "Offline scans cannot reliably be logged or remotely revoked, and the person must be told before creating one.",
      "reason": "Applies only to an experimental emergency card, which is outside version 1 conformance (A17.6), so no version 1 suite exercises it."
    },
    {
      "file": "core/a17-conformance-and-change.md",
      "section": "A17.6",
      "kind": "imperative",
      "text": "Never label an offline disclosure as a logged Autonym read or make an emergency-care reliability claim from this protocol.",
      "checks": ["CLAIM-01"]
    },
    {
      "file": "core/identifiers.md",
      "section": "identifiers",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "The generated schema accepts any supported type; callers MUST use `idSchemaFor(prefix)` at a boundary that expects one particular type.",
      "reason": "Binds callers of the reference library, which this implementation note says adds no requirement for other implementations. Enforced by review of the reference code; a conformance suite cannot observe which validator a caller used."
    },
    {
      "file": "core/identifiers.md",
      "section": "identifiers",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "The wire representation MUST use the exact lower-case prefix and underscore followed by 26 upper-case Crockford Base32 characters.",
      "checks": ["ID-01"]
    },
    {
      "file": "core/identifiers.md",
      "section": "identifiers",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "The first ULID character MUST be 0-7; the remaining alphabet excludes I, L, O and U.",
      "checks": ["ID-01"]
    },
    {
      "file": "core/identifiers.md",
      "section": "identifiers",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "A service supplies its Clock reading as whole milliseconds, with any finer digits dropped rather than rounded (`epochMilliseconds(clock.now())`); the helper MUST NOT use ambient time, Math.random or a custom PRNG.",
      "checks": ["ID-02", "ID-05"]
    },
    {
      "file": "core/scopes.md",
      "section": "scopes",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "Scopes from a token MUST NOT replace the stored grant as authority (A6.2; read-path verification remains pending).",
      "reason": "Restates the A6.2 rule that the stored grant, not token scope, is authoritative, which CORE-01 checks; the scope parser this page describes cannot test authority."
    },
    {
      "file": "core/scopes.md",
      "section": "scopes",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Complete sets MUST pass the semantic checks below.",
      "checks": ["SCOPE-03", "SCOPE-04", "SCOPE-05"]
    },
    {
      "file": "core/scopes.md",
      "section": "scopes",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Both MUST reject unknown tokens, trailing content, invalid case and malformed boundaries with `invalid_scope`.",
      "checks": ["SCOPE-02", "SCOPE-06"]
    },
    {
      "file": "core/scopes.md",
      "section": "scopes",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Exactly one purpose token MUST occur before deduplication.",
      "checks": ["SCOPE-03"]
    },
    {
      "file": "core/scopes.md",
      "section": "scopes",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "`*` MUST appear only on L0 read scopes.",
      "checks": ["SCOPE-04"]
    },
    {
      "file": "core/scopes.md",
      "section": "scopes",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Read duplicates for the same exact domain and the same declared-only mode MUST collapse to their highest level at the first occurrence's position.",
      "checks": ["SCOPE-05"]
    },
    {
      "file": "core/scopes.md",
      "section": "scopes",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "Mixed unrestricted and `:declared` reads for the same domain MUST be rejected in this implementation.",
      "checks": ["SCOPE-05"]
    },
    {
      "file": "core/scopes.md",
      "section": "scopes",
      "kind": "keyword",
      "keywords": ["MUST", "MUST NOT"],
      "text": "The parser MUST preserve that distinction and MUST NOT add read, proposal or persistence capabilities from a purpose alone.",
      "checks": ["SCOPE-10"]
    },
    {
      "file": "core/scopes.md",
      "section": "scopes",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "A combined advertising and personalisation set MUST be rejected by the one-purpose rule; separate consent requires separate grants.",
      "checks": ["SCOPE-10", "SCOPE-03"]
    },
    {
      "file": "vocabulary/README.md",
      "section": "vocabulary",
      "kind": "lowercase",
      "text": "Import must report unsupported values before committing.",
      "checks": ["PORT-01"]
    },
    {
      "file": "vocabulary/README.md",
      "section": "vocabulary",
      "kind": "keyword",
      "keywords": ["MUST NOT"],
      "text": "A provider MUST NOT widen an existing grant merely because its vocabulary catalogue gains keys.",
      "checks": ["VOCAB-1.1-01", "VOCAB-1.1-03"]
    },
    {
      "file": "vocabulary/README.md",
      "section": "vocabulary",
      "kind": "keyword",
      "keywords": ["MUST"],
      "text": "It MUST retain the vocabulary version approved for that grant and the version supported by the recipient, and expose only their supported, authorised intersection.",
      "checks": ["VOCAB-1.1-03", "VOCAB-1.1-07", "VOCAB-1.1-09"]
    },
    {
      "file": "vocabulary/README.md",
      "section": "vocabulary",
      "kind": "lowercase",
      "text": "Grant approval and recipient support for 1.1 must both be established before returning a new key.",
      "checks": ["VOCAB-1.1-03"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.3",
      "kind": "declarative",
      "text": "The signature binds provider (the issuer URL discovery publishes, A3.3), protected-resource audience, client, handle, grant ID/revision, purpose, read ID, issue time and absolute `valid_until`.",
      "checks": ["SIGN-01", "CORE-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "The protected header has exactly three members: `alg:ES256`, `kid` and `typ`, which is `autonym-disclosure+jws` for a disclosure and the value the signing section names for any other object.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "Receipts (A9), purge acknowledgements (A10) and exports (A11) are signed the same way.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "Each signed object has one signed time: `issued_at` for a disclosure, `at` for a receipt or purge acknowledgement, `exported_at` for an export, and `iat` for the purge instruction token (A10).",
      "checks": ["SIGN-01", "KEY-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "A `kid` is the RFC 7638 JWK thumbprint of the public key: SHA-256 over its required members `crv`, `kty`, `x` and `y`, in canonical unpadded base64url: 43 characters, the last of which carries two unused bits that are zero.",
      "checks": ["KEY-01", "SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "A key ID therefore names exactly one key and cannot be reused for a different key.",
      "checks": ["KEY-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "A provider publishes its verification keys at the discovery `jwks_uri` as an RFC 7517 JWK set following key-set.json.",
      "checks": ["KEY-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "Each key has `kty:EC`, `crv:P-256`, `x` and `y` (each 32 bytes in canonical unpadded base64url, so one key has one key ID), `kid`, `alg:ES256` and `use:sig`, and no private member.",
      "checks": ["KEY-01", "SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "A retired key also has `exp`, the JWK parameter registered by OpenID Federation 1.0 section 8.7.2: a whole number of seconds since 1970-01-01T00:00:00Z, the first instant at which the key signs nothing.",
      "checks": ["KEY-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "It stays in the set, with the same `exp`, so that what it signed earlier still verifies (A9).",
      "checks": ["KEY-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "No other key lifetime member is used: a key that carries `nbf`, `iat` or `revoked` is not used to verify anything.",
      "checks": ["KEY-01", "SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "The keys a recipient registers to sign purge acknowledgements follow the same rules.",
      "checks": ["KEY-01", "SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "Every instant a provider writes into an object it signs or hashes has one spelling: UTC with `Z`, seconds always present, and fractional seconds only when they are not zero, without trailing zeros, for example `2026-10-02T19:00:00Z` or `2026-10-02T19:00:00.25Z`.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "Precision is never reduced.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "Instants compare by the time they denote; a verifier does not reject an instant for its spelling.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "A verifier bounds the size and nesting of what it parses (A15.3), and may refuse a member named `__proto__`, which no object here defines and which common JSON libraries handle inconsistently.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "Once an export verifies against the configured key set of the provider it came from, its `public_keys` are the trusted key set, and its `origin_host` the trusted issuer, for the receipts it carries (A11), which is how a receipt signed before a key rotation verifies from the export alone (A9).",
      "checks": ["SIGN-01", "LOG-02"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "A carried receipt that names another provider is verified only against that provider's own configured key set, or reported as unverified history.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "A trusted issuer is never taken from the object being verified.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "Unencoded-payload mode is not used.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "A signature is not an identifier: ECDSA admits more than one valid signature over the same bytes, so signed objects are compared without `proof`.",
      "reason": "Says why signed objects are compared without `proof`. A suite sees the rule only where an implementation compares signed objects, as when an import meets a receipt it already holds (A11.1, PORT-01); A5 makes no comparison of its own to test."
    },
    {
      "file": "core/a05-disclosure.md",
      "section": "A5.4",
      "kind": "declarative",
      "text": "A valid signature alone does not establish current grant authority.",
      "checks": ["CORE-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "It records the provider, grant, client, purpose, trusted time, surface, canonical request, internal entry/version/level references and response hash.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "`provider` is the provider's HTTPS issuer URL as discovery publishes it (A3.3), the same value as the signed disclosure's `provider`; it is part of the signed bytes, and a verifier binds the receipt to that provider's key set through it (A5.4).",
      "checks": ["SIGN-01", "LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "The canonical request, the receipt's `request`, is the validated context request with its A5.2 defaults written out.",
      "checks": ["LOG-01", "SIGN-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "`max_level` (L3 when omitted), `declared_only` (false when omitted) and `min_confidence` (0 when omitted) are always present.",
      "checks": ["LOG-01", "SIGN-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "`domains`, and `keys` when the request has them, are in ascending order without repeats.",
      "checks": ["LOG-01", "SIGN-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "`keys` and `since` are present only when the request has them, and `since` uses the canonical instant spelling (A5.4).",
      "checks": ["LOG-01", "SIGN-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "Requests that differ only in list order, repeated names or omitted defaults therefore have the same canonical request, and its JCS form is what the receipt's `hash` and signature cover.",
      "checks": ["LOG-01", "SIGN-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "Writing the canonical form is the provider's duty; a verifier checks the signature over the request the receipt carries and does not reject it for its order or spelling.",
      "checks": ["LOG-01", "SIGN-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "A verifier rejects an object whose signed time is at or after its key's retirement (A5.4, KEY-01).",
      "checks": ["KEY-01", "SIGN-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "`response_hash` is `sha256:` plus lower-case hexadecimal SHA-256 of the exact JCS UTF-8 envelope without `proof`, the same bytes signed in A5.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "The receipt's `hash` covers its JCS form excluding `hash` and `proof`, including `prev_hash`.",
      "checks": ["LOG-01", "SIGN-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "A receipt signed before a key rotation therefore verifies afterwards from the provider's published keys and the owner's export alone (LOG-02).",
      "checks": ["LOG-02"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "Retirement is not a response to key compromise: whoever holds a retired private key can still produce an object dated before its retirement.",
      "reason": "Informative consequence of KEY-01: it says what retirement does not protect against, so there is nothing to test."
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "`grant_created`: `subject_id` is the new grant's ID, `actor_client_id` the client it is issued to and `details.decision` `approved`.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "`grant_revoked`: `subject_id` and `details.ids` name the grant.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "When the person revokes it, `actor_client_id` is null and the decision is `completed`.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "When its client revokes it through the revocation endpoint, with the proof of possession A6.5 asks of a public client, the actor is that client and the decision is `completed`.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "When the provider revokes it because its client used an authorisation code or a spent refresh token a second time (A6.3), the actor is that client and the decision is `failed`.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "When the operator deregisters the client (A6.8), the actor is null, the decision is `disabled` and an `operator_action` is appended in the same transaction.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "`grant_expired`: `subject_id` and `details.ids` name the grant, and the actor and the decision are null.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "`read_not_modified`: `subject_id` names the grant, `actor_client_id` the reading client and the decision is `unchanged`.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "`operator_action`: `subject_id` is the record partition's ID, the actor is null, and `details.ids` says what the action concerned.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "A verification of the partition's log names the event IDs it reports, with the decision `completed` when the log verified, `failed` when it found a divergence and null when verification could not run.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "An action on a client names the client's grants in the partition that were active when the action began, with the decision `disabled` for a suspension or a deregistration, `enabled` for a resumption and `completed` for a change of class; the `grant_revoked` events a deregistration appends in the same transaction tell it apart from a suspension.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a09-receipts-and-log.md",
      "section": "A9",
      "kind": "declarative",
      "text": "One event names at most 32 IDs (log-event.json), so an action on a client with more grants in the partition appends further `operator_action` events with the same decision, in the same transaction, until every grant is named.",
      "checks": ["LOG-01"]
    },
    {
      "file": "core/a10-revocation-and-purge.md",
      "section": "A10",
      "kind": "declarative",
      "text": "The payload follows purge-instruction.json, signed as compact JWT with ES256, protected `typ:autonym-purge+jwt` and, as `kid`, the A5.4 key ID of a key in the provider's trusted key set.",
      "checks": ["PURGE-01", "SIGN-01", "KEY-01"]
    },
    {
      "file": "core/a10-revocation-and-purge.md",
      "section": "A10",
      "kind": "declarative",
      "text": "Its signed time is `iat`, so a recipient rejects a token whose `iat` is at or after that key's `exp` (A5.4).",
      "checks": ["KEY-01", "SIGN-01", "PURGE-01"]
    },
    {
      "file": "core/a10-revocation-and-purge.md",
      "section": "A10",
      "kind": "declarative",
      "text": "Where the recipient has a registered key, it signs the acknowledgement by the A5.4 method: a detached JWS over the UTF-8 RFC 8785 canonical JSON of the complete acknowledgement without `proof`, with protected `alg:ES256`, `typ:autonym-purge-ack+jws` and the registered key's A5.4 key ID as `kid`, carried in `proof`.",
      "checks": ["PURGE-01", "SIGN-01"]
    },
    {
      "file": "core/a10-revocation-and-purge.md",
      "section": "A10",
      "kind": "declarative",
      "text": "Its signed time is `at`.",
      "checks": ["SIGN-01"]
    },
    {
      "file": "core/a10-revocation-and-purge.md",
      "section": "A10",
      "kind": "declarative",
      "text": "The provider verifies it as A5.4 describes, against that recipient's registered keys only.",
      "checks": ["SIGN-01", "PURGE-01"]
    },
    {
      "file": "core/a10-revocation-and-purge.md",
      "section": "A10",
      "kind": "declarative",
      "text": "Without a registered key, `proof` is null and the provider records the authenticated but unsigned assurance explicitly.",
      "checks": ["PURGE-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.1",
      "kind": "declarative",
      "text": "Exported public keys preserve verifiability of historical artefacts, keeping any `exp` (A5.4); they do not become trusted active signing keys at the destination.",
      "checks": ["PORT-01", "SIGN-01", "LOG-02", "KEY-01"]
    },
    {
      "file": "core/a11-portability.md",
      "section": "A11.1",
      "kind": "declarative",
      "text": "Once the export verifies, its `public_keys` and `origin_host` are the trusted key set and issuer for the receipts it carries, and a carried receipt naming another provider is verified against that provider's own key set or reported as unverified history (A5.4).",
      "checks": ["PORT-01", "SIGN-01", "LOG-02"]
    },
    {
      "file": "bindings/B4-rest.md",
      "section": "B4.2",
      "kind": "declarative",
      "text": "An ETag is a quoted opaque HMAC under a dedicated provider key of JCS containing the client, grant ID/revision, the A9 canonical request, sorted selected alias/version/level triples, temporal selection epoch and the previous envelope deadline.",
      "checks": ["TEMP-03", "TRANSPORT-01"]
    }
  ]
}
