Contextfulv0.23.0

Docs / Specification

A-authority — Authority and enforcement decisions

Status: accepted

redaction-no-copy — Redacted material leaves no derived copy

Cited bystore.encrypt.redacted-indexrun.emit.unredacted-errorconnector.attach.url-scrubbingconnector.attach.credential-in-a-url

Redaction holds only when no derived artifact carries the pre-redaction value.

OptionLost onCost
Prepare before recording or refuse the copy path (chosen)—A redacted column is reachable only by full scan.
Encrypt the index or journal and permit itAt-rest completenessThe guarantee rests on key custody for content redaction exists to remove.
Build locally, strip at the sync edgeFailure pointsThe local tree is itself a copy target.
Redact in each adapter, or at read timeUniformityThe guarantee is as strong as the least careful adapter.

Revisit: an index structure provably independent of the indexed values.

body-projection — A closed body projection records canonical opaque groups

Cited byrun.journal.body-projectionrun.own.body-parentrun.guard-secrets.recorded-bodyauthority.redact.prepared-effectsauthority.redact.effect-scope

Removal protects designated row values, not arbitrary schema labels.

OptionLost onCost
Closed projection and canonical opaque groups (chosen)—Authority changes refuse pending owners.
Record raw results, then rewrite outputsAt-rest completenessThe paid journal retains values removed from landed rows.
Accept caller-labelled prepared bytesAuthorityA caller claims preparation without canonical admission.
Rewrite recorded values on replayIdempotenceA keyed digest becomes a digest of its own output.

prepared-record — A prepared source record binds canonical authority before execution

Cited byrun.journal.redacting-sourcerun.journal.prepared-ownerrun.journal.prepared-replayrun.select.journaled-pullauthority.redact.write-timeauthority.redact.before-the-recordauthority.redact.every-land-entryauthority.redact.relational-journal

The recorded wire differs from the source wire, and replay re-admits it without repeating transforms, so keyed hashes and source resumption stay stable.

OptionLost onCost
Canonical preparation and authority-bound replay (chosen)—Unrelated manifest edits also refuse a pending owner.
Repeat removal on replayIdempotenceKeyed hashes change when applied to their own output.
Accept a source-supplied prepared flagAuthorityA connector labels raw rows as already protected.
Record raw rows, then rewrite partsAt-rest completenessThe journal retains the value its parts remove.

span-union — Span iteration rewrites the union of all matches

Cited byauthority.redact.in-valueauthority.redact.rewritten-identities

One forward pass over a bounded Thompson NFA keeps the leftmost start per state, so work stays linear in the value’s length and no matched byte remains beside its substitute.

OptionLost onCost
Union of all matches in one pass (chosen)—Per-byte work grows with NFA states.
Earliest-ending searchCompletenesspassword=\S+ rewrites password=h and stores the rest of the secret.
Leftmost-first iterator searchBoundingRepeated suffix searches have quadratic worst-case work.
Infer lineage from child namesAuthorityA matching name establishes no source-column relationship.

row-classes — Per-row classes resolve through registered masks

Cited byauthority.mask.row-classauthority.mask.row-class-dependency

Every branch compiles through the static policy’s mask checks, so a per-row class adds no weaker path.

OptionLost onCost
Registered strategy map with strict drop fallback (chosen)—Unknown classes lose their text.
One table per classUtilityOne heterogeneous value list becomes several reads.
Caller-chosen masksUniformityOne adapter omission exposes the original value.
Unknown classes left unmaskedFailure directionA source-side typo grants weaker protection.

acting-principal — The acting principal is provider-verified, normalized once, fixed per chain

Cited byauthority.identify.subject-tupleauthority.identify.attestationauthority.identify.on-behalf-ofauthority.identify.value-hygieneauthority.identify.malformed-valueauthority.identify.normalizationauthority.identify.identity-linkauthority.identify.unverified-linkauthority.identify.directory-linkauthority.identify.agent-ceilingauthority.identify.incognitoauthority.identify.subject-reboundauthority.issue.principal-requiredauthority.issue.default-read

Only an identity provider makes a principal. A false identity match is a silent source-wide disclosure, so confidence relaxes no check.

OptionLost onCost
Verify at the provider, normalize at the mint, fix per chain (chosen)—Unprovisioned accounts read nothing.
Normalize at each point of useConsistencyOne padded identity behaves as two principals.
Authorize heuristic or operator-asserted linksFailure asymmetryA false match discloses a whole source silently.
Rebinding within a parent-carried setOffline forgeryThe parent’s mint chooses whom every descendant impersonates.

Revisit: a directory’s identifiers exceed 256 B; provisioning latency dominates why subjects read nothing.

delegation-profile — Delegation is a versioned profile over an attenuable-credential library

Cited byauthority.profile.delegation-profileauthority.profile.owner-claimauthority.profile.reserved-factauthority.profile.evaluator-boundauthority.profile.fact-ceilingauthority.profile.iteration-ceilingauthority.profile.appended-blockauthority.profile.declared-scopeauthority.profile.scoped-sessionauthority.attenuate.truncation

The library is Biscuit; the engine owns only the profile. No wall-clock timeout enters admission, so slow hardware refuses nothing fast hardware admits.

OptionLost onCost
Library format, owned profile, evaluation ceilings (chosen)—The wire format tracks an upstream project.
A custom envelope beside the library tokenChain depthGrandchildren are inexpressible; two formats need review.
A hand-rolled N-block formatReview costIts failure mode is silent forgery reviewed by nobody outside the project.
The library’s full language, unprofiledBoundingEvaluation cost and reachable facts are holder-controlled.

Revisit: chain verification cost becomes measurable at real delegation depths.

offline-narrowing — Grants narrow offline, and admission re-checks the whole chain

Cited byauthority.grant.fieldsauthority.grant.actionsauthority.grant.pattern-formsauthority.grant.malformed-patternauthority.grant.starauthority.grant.tenant-scopeauthority.grant.tenant-bytesauthority.grant.tenant-unbindableauthority.grant.tenant-child-lifetimeauthority.grant.aggregateauthority.attenuate.offlineauthority.attenuate.narrowingauthority.attenuate.widensauthority.attenuate.expiry-extendedauthority.attenuate.tenant-droppedauthority.attenuate.bearerauthority.attenuate.per-sub-agentauthority.revoke.denylistauthority.revoke.revocation-idauthority.revoke.revoked

Three pattern forms keep containment decidable offline.

OptionLost onCost
Three-form patterns, double check, per-derivation revocation id (chosen)—Admission compares the whole chain per request.
Full glob or regular-expression patternsContainment decidabilityDerivation cannot decide offline whether a child lies within its parent.
Check at derivation alone, or the last block aloneTrustA widened intermediate block passes unexamined.
One revocation id per rootBlast radiusStopping one sub-agent stops every sibling.

Revisit: chain comparison becomes measurable against request latency; a grant dimension carries a tenant set.

query-templates — Query templates are deny-by-default capabilities

Cited byauthority.grant.template-allowlistauthority.grant.template-tablesauthority.grant.template-not-allowedauthority.grant.row-ceilingauthority.grant.group-ceilingauthority.redact.after-normalizationdisclosure.template.single-statement

A template runs exactly the reviewed statement, so identifier confinement is the sole protection on that surface.

OptionLost onCost
Deny-by-default allowlist, strict binding (chosen)—A parameter rename breaks callers with no window.
Restriction polarity like other dimensionsBlast radiusLong-lived credentials silently gain every later template.
Hidden from the listing, invocable by nameEnumerationA guessed identifier reaches the read.
Templates through the statement guardExpressivenessThe guard refuses exactly the reads templates exist for.

Revisit: operators routinely grant star; a needed store feature requires a non-plain identifier.

issuance-ceiling — One persisted issuance ceiling bounds every lifetime

Cited byauthority.issue.ceilingauthority.issue.above-ceilingauthority.issue.ceiling-loweringauthority.issue.out-of-tree-mintauthority.issue.bearer-cap-fixedauthority.revoke.short-lifetimeauthority.revoke.epochauthority.revoke.compromiseauthority.revoke.rotation-graceauthority.revoke.short-graceauthority.revoke.immediate-retireauthority.revoke.format-withdrawnauthority.exchange.policyauthority.exchange.minted-grantsauthority.exchange.lifetime-defaultauthority.exchange.lifetime-ceiling

One number, versioned with the project, sets the longest lifetime any mint path produces, and every other window derives from it. Format withdrawal is therefore never immediate.

OptionLost onCost
One persisted ceiling; refuse explicit excess, clamp configured excess (chosen)—A ceiling change is a commit and deploy.
Per-mint flag or environment variableUniformityThe ceiling differs per host, invisible in review.
A policy service consulted at mintOffline mintingIssuance inherits a network availability requirement.
Refuse a configured lifetime above the ceilingAvailabilityA stale policy value becomes a total sign-in outage.

Revisit: a verified need for lifetimes above 24 h; operators surprised by clamped exchange sessions.

pinned-keys — Verification trusts only pinned or injected keys

Cited byauthority.issue.signing-portauthority.issue.oracle-custodyauthority.issue.algorithmauthority.issue.algorithm-mismatchauthority.issue.key-rotationauthority.verify.public-key-onlyauthority.verify.key-setauthority.verify.key-set-refreshauthority.verify.key-set-unavailableauthority.verify.key-set-staleauthority.exchange.injected-material

The deployment, never the credential, chooses the verifying key, and an absent answer about keys refuses. Retiring a key is an action, not an omission.

OptionLost onCost
Deployment-chosen keys (chosen)—Key-route availability is admission availability.
Dispatch on the credential’s algorithm claimDowngradeEvery weaker supported routine is reachable by asking.
Fall back to static pins or last-known-goodFrozen keysA retired key verifies while the route is down.
Provider discovery inside the exchangeReproducibilityVerification depends on a remote document at that instant.

Revisit: the port cannot express a needed adapter capability such as batch signing.

one-credential — A face admits one verified credential and carries authority as a value

Cited byauthority.issue.absent-authorauthority.issue.authoring-postureauthority.issue.posture-keyauthority.issue.session-credentialauthority.issue.one-credentialauthority.verify.admitted-authorityauthority.verify.no-bypass-constructorauthority.verify.effect-boundaryauthority.verify.format-interfaceauthority.verify.expiredauthority.exchange.per-readerauthority.exchange.no-cross-readerauthority.refuse.drifted-scope

Authority enters through one verification and flows as an explicit value, never ambient state. A wrong authoring posture mis-authors silently, so the posture argument is the one review point.

OptionLost onCost
One admission path, authority as an argument (chosen)—Every embedding application needs an identity provider.
An opt-in perimeter secret or owner pathAttributionA subjectless owner-equivalent path stands beside the credential.
Ambient environment or task-local authorityAttributionTwo callers through one daemon both take the process’s principal.
One application credential plus application-side filteringEnforcement boundaryA filter bug is a disclosure, not a failed check.

Revisit: per-request mint latency dominates reads.

sender-constrained — Credentials are sender-constrained, with a nonce replay window

Cited byauthority.verify.possession-bindingauthority.verify.possession-invalidauthority.verify.replay-windowauthority.verify.clock-skewauthority.verify.replayed-nonce

Holding a key-bound credential admits nothing without proof of its key. The proof establishes key possession and claims nothing about what the client is.

OptionLost onCost
Confirmation thumbprint, per-request signature, local nonce window (chosen)—Every client signs each request.
Mutual TLS instead of a carried proofReach across intermediariesThe engine behind the gateway receives an unbound credential.
A monotonic counter per clientConcurrencyParallel honest requests arrive out of order and refuse.
A replay store shared across checkpointsLocalityAdmission calls a shared service per request.

Revisit: cross-checkpoint replay observed within a credential’s lifetime.

network-bearer — A network face admits a short-lived audience-bound bearer, and a key-bound credential only under proof

Cited byauthority.verify.write-verbsauthority.verify.write-commitauthority.verify.timestampsauthority.verify.malformed-timestampauthority.verify.network-bearerauthority.verify.bearer-lifetimeauthority.verify.connection-scoped

MCP clients speaking Streamable HTTP send Authorization: Bearer and sign nothing, so a key-only network face serves none of them. Compatibility decided it over theft yield.

OptionLost onCost
Short-lived audience-bound bearer; proof when a confirmation claim is present (chosen)—A captured bearer replays against its audience until expiry.
A proof on every network requestMCP-client compatibilityA client holding no signing key reaches no network face.
A bearer at any lifetime under the issuance ceilingTheft yieldA captured bearer replays for up to 24 h.

Revisit: mainstream MCP clients sign per-request proofs; bearer replay is observed within a lifetime.

exchange-renewal — The exchange renews a credential, binding it to a proven holder key

Cited byauthority.exchange.surfaceauthority.exchange.tenantauthority.exchange.audienceauthority.exchange.material-missingauthority.exchange.holder-bindingauthority.exchange.bearer-mintauthority.exchange.refreshauthority.exchange.no-extension

Theft yield decided the fixed cap. Identity-provider availability therefore bounds a bearer session past one hour.

OptionLost onCost
Bind on proof, bearer otherwise, fixed cap (chosen)—A bearer client re-exchanges hourly with a live assertion.
A face setting raising the bearer capTheft yieldA captured bearer admits for up to the 24 h ceiling.
A refresh token beside the credentialSurfaceA second secret class to store, rotate and revoke.
Server-side expiry extension on useOffline verificationThe checkpoint writes state per request.

Revisit: clients report hourly exchange as a sign-in outage.

exhaustible-digest — A digest over an exhaustible class needs generalizing truncation

Cited byauthority.mask.column-policyauthority.mask.class-registryauthority.mask.unknown-classauthority.mask.strategiesauthority.mask.dropauthority.mask.one-valueauthority.mask.digest-aloneauthority.mask.high-entropyauthority.mask.combine-generalizesauthority.mask.in-placeauthority.mask.equalityauthority.mask.aggregatesauthority.mask.summarize-onlyauthority.mask.hash-widthauthority.mask.token-widthauthority.mask.cuts-nothingauthority.mask.crowdauthority.mask.truncation-ceilingauthority.mask.pepperauthority.mask.development-pepperauthority.mask.pseudonymousauthority.mask.native-digestauthority.mask.key-material

Anyone computing a digest over an enumerable value space recovers identities by enumeration, so the digest ships only where exhaustive search returns a crowd. Sufficient narrowness stays unverified.

OptionLost onCost
Refuse a bare digest; admit it behind truncation (chosen)—A join on the column matches a crowd.
A bare digest relying on key secrecyRecovery costEnumeration recovers every identity.
Refuse hashing for these classesUtilityEquality filters and joins disappear.
A fixed width thresholdHonestyOne threshold fits one domain.

Revisit: a per-person join over an exhaustible class becomes a requirement.

placement-breadth — Placement breadth is declared data-side, and resolution fails narrow

Cited byauthority.issue.zone-wildcardauthority.redact.pipeline-wideauthority.place.zone-stringauthority.place.allow-set-entryauthority.place.disjunctiveauthority.place.undeclaredauthority.place.caller-zoneauthority.place.fail-closedauthority.place.protected-floorauthority.place.floor-widenedauthority.place.narrowest-grainauthority.place.excluded-rowauthority.place.excluded-cellauthority.place.per-principalauthority.place.evidence-floorauthority.place.incognitoauthority.place.incognito-wideningauthority.place.team-defaultauthority.place.serve-outcomeauthority.place.envelopeauthority.place.symbolic-inclusionauthority.place.allow-set-entriesauthority.place.identifier-length

Only the data side widens inference placement, every widening shows in the manifest diff, and ambiguity resolves narrowest.

OptionLost onCost
Data-side breadth, intersection for synthesis (chosen)—A multi-zone batch mints per zone.
Subject-side wildcard as every zoneWidening sideA credential grants itself every zone.
Trust a synthesized row’s declared setLaunderingThe constrained path enforces its own constraint.
A vendor client behind a feature flagVerifiabilityThe placement claim depends on a build the reader cannot see.

Revisit: fragment-level provenance through synthesis becomes observable; per-zone minting dominates issuance.

redistribution — Redistribution ships an allowlist and never reaches backwards

Cited byauthority.redact.ruleauthority.bound-redistribution.withholdauthority.bound-redistribution.before-diffauthority.bound-redistribution.outranks-grantsauthority.bound-redistribution.envelopesauthority.bound-redistribution.root-allowlistauthority.bound-redistribution.root-not-allowlistedauthority.bound-redistribution.left-behindauthority.bound-redistribution.manifest-is-an-indexauthority.bound-redistribution.reportauthority.bound-redistribution.two-checksauthority.bound-redistribution.edge-filter

Redistribution fails toward not shipping, and a withheld table’s left-behind objects are the operator’s to delete.

OptionLost onCost
Enumerate what ships; name left-behind objects (chosen)—An operator deletes a withheld table’s left-behind objects by hand.
Name the objects that stay behindFailure directionA new object ships by default carrying withheld rows.
Inspect each root object at pushSoundnessRecord-blob contents are not statically decidable.
Delete left-behind objects automaticallyBucket authorityDeletion is irreversible and can cut a replica from its readers.

local-transport — Local transports bind possession to the holder key, then to the OS peer

Cited byauthority.verify.local-transportauthority.verify.local-holder-proofauthority.verify.local-peer-fallbackauthority.verify.peer-mismatch

MCP hosts spawn a server over stdio or relay to a Unix socket, and many sign nothing. Theft yield decided the order.

OptionLost onCost
Holder proof first, peer uid otherwise (chosen)—Two local admission paths, one per-platform peer call.
Peer uid aloneTheft yieldA key-holding client gains nothing from its key.
Per-request proof on every transportHost compatibilityEvery local client needs a signing shim.
Peer process identity by pidPortabilityA pid is reusable.

Revisit: stdio hosts sign per request; a portable call names the peer process.

horizon — The horizon is a grant dimension enforced through the existing egress hook

Cited byauthority.grant.horizonauthority.attenuate.horizon-widens

A cutoff the agent passes per call is one it can omit or widen, so the horizon rides the credential. Tools beyond the read face reach the outside through one attachment point, so the horizon feeds the pre-send hook.

OptionLost onCost
Grant dimension, read face and pre-send hook (chosen)—A provider-hosted tool is unavailable under a horizon.
A per-call available_as_ofEnforcementThe agent omits or widens it.
A per-tool horizon listOne homeA new tool slips past it.
A prompt instruction naming the cutoffEnforcementModels recall facts they are told to ignore.

Revisit: a provider exposing hosted search through a client-side hook.