Contextfulv0.23.0

Docs / Specification

A-connector — Connectors and credentials decisions

Status: accepted

executables-content-pinned — Executables are content-pinned and replay uses the recorded artifact

Cited byrun.own.pinned-plan-changedrun.own.admission-pinrun.exec.missing-binaryrun.exec.unpinned-pathrun.exec.digest-mismatchconnector.package.remote-cacheconnector.package.insecure-artifactconnector.package.digest-mismatchconnector.package.local-unpinned

A live run completes against the digest its record names; a changed connector reaches new runs only.

OptionLost onCost
Pin by digest, hold the pin while work is pending (chosen)—Pinning needs a container runtime; an urgent fix waits for in-flight runs.
Trust version tagsReview bindingReviewed and running programs match only while the publisher behaves.
Reload in place, or adopt the new build on resumeReplay fidelityRecorded output replays into code that never produced it.
Digest every command, including bare namesRunnabilityEach package upgrade refuses every derive pipeline until re-pinned.

Revisit: production runs unpinned local artifacts, arguing for inverting the default; the toolchain stops embedding the host triple.

remote-artifacts-use — Remote artifacts use one verified component blob

Cited byconnector.package.remote-transportconnector.package.remote-cache

A damaged cache entry refuses rather than replacing the bytes of a recorded run.

OptionLost onCost
One pinned blob over mediated HTTP or one-layer OCI, cached by digest (chosen)—Multi-layer packages and registry token exchanges need another contract.
Resolve every run from the remote referenceReplay availabilityAn outage stops replay of bytes once admitted locally.
Reuse the guest’s grant and headers for retrievalCredential containmentRegistry material reaches guest endpoints, and vendor material reaches the registry.
Trust an OCI tag and descriptor aloneReview bindingA moved tag changes executable bytes under an unchanged pin.

Revisit: a required registry exposes no directly bound bearer; a package needs several blobs or an OCI index.

content-pin-trust — The content pin is the only trust root

Cited byconnector.package.oci-component-layerconnector.package.oci-registry-bearerconnector.package.remote-unpinnedconnector.package.component-load

A reviewer binds review to bytes by rebuilding with connector pin --verify and comparing digests.

OptionLost onCost
Pin plus reproducible rebuild (chosen)—An operator who neither builds nor reviews trusts whoever handed over the pin.
Publisher signature plus transparency logReplay availabilityAdmission depends on a key custodian, a log operator and a network round trip.
Signature without a log, or trust on first useReview bindingA stolen or rotated key signs bytes no reviewer saw.
Optional signature checked when presentFailure directionAn absent signature reads like a valid one.

Revisit: a public registry distributes connectors to operators who neither build nor review them.

pin-builder-runs — The pin builder runs one fixed platform

Cited byconnector.package.oci-layer-integrityconnector.package.build-sourceconnector.package.pin-verbconnector.package.host-built-pinconnector.package.component-grant

PLATFORM in contextful-core::connector::package defines the platform once.

OptionLost onCost
One fixed platform, one manifest build input (chosen)—A toolchain bump re-pins every connector at once.
Per-manifest image and argvReproducibilityEach digest reproduces only on its own image.
Per-manifest toolchain version fieldsOne home per factThe manifest and the image both state the toolchain.
Per-connector DockerfileReviewabilityBuild inputs hide in a second file a reviewer reads as code.

Revisit: a guest language other than Rust needs first-class pinning.

precompiled-components-reuse — Precompiled components reuse only compatible host output

Cited byconnector.package.artifact-cache

Precompiled output never travels with a pin.

OptionLost onCost
Private cache with compatibility key and integrity check (chosen)—A hardened host still links a compiler for cache misses.
Recompile on every process startStartup latencyEvery guest pays compilation again.
Deserialize any file named by the artifact digestInput integrityA stale engine build or altered file reaches unsafe deserialization.

Revisit: a pinned precompile artifact and a compiler-free host build exist for every deployment target.

guest-world-targets — The guest world targets synchronous WASI 0.2

Cited byconnector.export.authoring-pathconnector.import.config-shape

The call deadline, the session budget and the absent wait primitive each hold because a guest call runs to completion on one stack. Adopting 0.3 changes all three and is a major world bump.

OptionLost onCost
WASI 0.2 with synchronous exports (chosen)—A guest overlaps requests only through outgoing-handler futures.
WASI 0.3 native asyncRuntime maturityThe host runtime gates the 0.3 interfaces as experimental.
Both worlds side by sideOne implementation per capabilityDispatch branches on the world.

Revisit: the host runtime ships the 0.3 interfaces without an experimental gate.

untrusted-input-decodes — Untrusted input decodes off-process and fails whole

Cited bytopology.package.decode-network-freerun.land.unreadable-inputrun.land.dead-letterrun.land.partial-parserun.land.parse-boundaryrun.land.parse-crashedrun.fetch.charsetrun.fetch.not-utf8connector.source.parse-containmentconnector.source.office-part-selectionconnector.source.decompression-budgetconnector.source.cell-out-of-rangeconnector.source.workbook-cell-typingconnector.source.frontmatter-shapeconnector.source.conversion-requiredconnector.source.image-headerconnector.source.marker-body-pairing

An input lands whole and faithful or refuses by name. A native decoder is neither interruptible nor memory-bounded in process.

OptionLost onCost
Process boundary, whole-input refusal per table (chosen)—Every input pays a boundary crossing; one damaged page discards a readable document.
In-process unwind guard or watchdog threadEffectivenessA native decoder crash or runaway allocation ends the process.
Land the parsed parts with a truncation flagDistinguishabilityNo reader consults the flag, so a fragment is quoted as the document.
Lossy or statistical decodingHonesty of landed valuesReplacement characters land as publisher text.

Revisit: crossing overhead exceeds decode time on small inputs; a memory-safe compound-binary reader exists.

unreadable-objects-files — Unreadable objects and files dead-letter while the read lands the rest

Cited byconnector.source.object-unreadableconnector.source.file-unreadable

One damaged input refusing a prefix or folder read would hold back every other input. The dead-letter table names each input a collection lacks; a replacing table still refuses, since a partial inventory cannot replace it.

OptionLost onCost
Dead-letter table, position past the input (chosen)—A sibling table per table; a fixed decoder waits on a replay.
Refuse the whole readProgressOne damaged object stalls thousands.
Skip and tally under a ceilingAnswerabilityA count names no input.
Audit entries on the run recordQueryabilityCapped per run; joins no table.

host-access-quota — Host access and quota are declared and fail closed

Cited byrun.select.unmetered-grantrun.select.metered-clientrun.bind.reach-clientrun.bind.reach-grantconnector.declare-capability.declared-grantconnector.declare-capability.undeclared-accessconnector.declare-capability.allowlist-shapeconnector.declare-capability.scope-exceededconnector.meter.quota-unboundconnector.meter.unreadable-answerconnector.meter.unmetered-request

The operator reads every host access and quota draw in a file before anything runs; a degraded answer is a denial.

OptionLost onCost
Grants decided at load, fail closed (chosen)—A second host needs an edit, review and reload; each permit batch costs a round trip.
A run-time permission requestReviewabilityThe grant set is a union over code paths.
Fail open on an unreachable limiterFailure directionAn unmetered burst lands during the outage.
A local token bucket in the engineVisibilityIt caps the engine with no view of other traffic.

Revisit: a connector class whose reachable hosts are data-dependent; permit round trips become a measurable share of read time.

outbound-transport-origin — Outbound transport is origin-pinned and never downgrades

Cited byrun.fetch.schemerun.fetch.address-literalconnector.source.next-link-originconnector.source.external-referenceconnector.source.provider-originconnector.lease.mint-transportconnector.lease.redirectconnector.attach.no-material-to-a-guestconnector.attach.unpermitted-requestconnector.attach.transport-portconnector.attach.resolve-onceconnector.attach.bound-hostconnector.attach.redirect-pinningconnector.attach.weakened-hopconnector.attach.cleartext-endpointconnector.attach.mediation-covers-every-egress

The origin answering any outbound request equals the declared origin, over the same or a stronger transport.

OptionLost onCost
Pin origin at declaration and every hop (chosen)—A vendor moving to a www or CDN host refuses until the declaration changes.
Pin only credential-bearing sourcesLanded-content provenanceA redirected source lands another party’s body in a trusted column.
Warn and send, or follow and recordIrreversibilityThe record follows a disclosure it cannot undo.
Vet the host name, not the resolved addressInternal-range containmentA name whose DNS points inward reaches the machine’s network.

Revisit: the declaration grammar gains a per-vendor allowed-origin set; proxy-only egress is the sole path for a class of deployments.

credentials-references-workload — Credentials are references, workload identity is the default, and leases lead

Cited byconnector.source.http-headersconnector.reference.foreign-placeholderconnector.reference.environment-is-a-missconnector.reference.material-in-a-declarationconnector.resolve.provider-chainconnector.resolve.hydration-is-just-in-timeconnector.lease.leaseconnector.lease.unknown-scopeconnector.lease.bootstrap-credentialconnector.lease.bootstrap-unservedconnector.lease.bootstrap-declared-leased

The engine holds the shortest-lived material the deployment mints.

OptionLost onCost
References only, workload identity, lease first (chosen)—Material sits in engine memory for a request.
Inline material or environment templatesPlaintext at restThe committed file or environment becomes the secret.
A broker sidecar as the defaultOperabilityEvery deployment runs a second failure domain.
Lease provider last, first hit winsPrecedenceA leftover environment variable wins unnoticed.

Revisit: workload identity becomes unattestable on a needed runtime; a broker becomes near-free to operate.

credential-custody-stays — Credential custody stays with the provider and inventory labels its evidence

Cited byconnector.record.operator-recordconnector.record.provider-custodyconnector.record.record-tableconnector.record.observe-port

Configured adapters and observed runtime attribution answer different questions, so inventory labels each. A missing expiry stays unknown.

OptionLost onCost
Provider custody, optional descriptive records (chosen)—Metadata completeness varies by adapter.
Mandatory encrypted entries in GitBackend independenceExternal managers need duplicate ciphertext; rotation needs commits.
Provider enumeration as the whole inventoryBinding coverageUnresolvable configured names disappear.

Revisit: a shared provider metadata protocol supplies complete observations without value access.

rotation-writes-forward — Rotation writes forward to the answering adapter

Cited byconnector.lease.head-of-chainconnector.rotate.division-of-laborconnector.rotate.oauth-credentialconnector.rotate.write-back-deniedconnector.rotate.conditional-putconnector.rotate.access-tokenconnector.rotate.refresh-answer

The environment, keychain and lease adapters have none, so operator-entered and leased credentials never write back.

OptionLost onCost
Conditional put to the attributed adapter (chosen)—A read-only manager fails the run on every refresh.
First writable adapter in the chainName joinA shadowing adapter in front hides the stored version.
Serve the token from memory on a refused putProvider custodyA rotated refresh token leaves the manager’s copy dead, unrecorded.
Unconditional putAtomic turnoverA slower replica overwrites a newer token.

Revisit: a manager offers no conditional write; two resolvers share one cache across runs.

egress-passes-transport — Egress passes one transport port and one pre-send hook ahead of resolution

Cited bytopology.package.transport-optionalconnector.meter.binding-transportconnector.meter.pre-send-hookconnector.meter.hook-compositionconnector.meter.hook-settleconnector.infer.mediated-call

Allowlist precedence decided the hook’s position: no host lookup precedes a refusal, and one attachment point serves every hop.

OptionLost onCost
Allowlist, one intent hook, port-owned resolution (chosen)—Each adapter re-implements proxy choice, timeout and body ceiling.
Hook ahead of the allowlistAllowlist precedenceAn undeclared host reaches the operator hook and the limiter.
An egress gate beside the meterOne attachment pointThree pre-send hooks, each a call site to miss.
A send-only port, system resolutionLookup containmentA refused hop has already sent its host name to a resolver.

Revisit: a transport that resolves remotely, such as a proxy-only deployment.

exec-egress-proxied — An exec step’s vendor traffic passes a host loopback proxy

Cited byrun.exec.env-credentialconnector.attach.exec-environmentconnector.attach.exec-proxyconnector.attach.exec-proxy-attach

A child process holds no credential: the host attaches it per request, under the same allowlist, address check, hook and meter as every other request.

OptionLost onCost
Loopback proxy attaching per request (chosen)—A step speaks plain HTTP to the proxy, and a step dialing the vendor itself bypasses it with no credential to send; no kernel filter stops the dial.
Hydrate the credential into the step’s environmentCustodyThe child copies the material past redaction, per-request hydration and the bound host.
A forward proxy through HTTPS_PROXYAttachmentA CONNECT tunnel carries TLS end to end, so the host cannot add a header.
A network namespace with a socket bridgePortabilityLinux user namespaces alone provide it, and a vendor tool must speak to a Unix socket.

Revisit: a portable kernel egress filter; a vendor serving on a port other than 443.

manifest-widening-binds — Manifest widening binds approval to both declarations

Cited byconnector.widen.host-inclusionconnector.widen.host-witness

The comparison makes no claim about vendor scope implications, DNS or credential bytes.

OptionLost onCost
Compare grants, bind approval to both digests (chosen)—Opaque scope strings over-report semantic widening.
Treat every reload as approvalReview bindingA program update silently gains access.
Compare textual entries aloneSemantic inclusionA covering wildcard hides the newly reachable hosts.
Solve the host grammar with SMTDependency budgetA solver adds a second trusted interpretation.

Revisit: host grants gain ports, methods, paths or address ranges.

drive-capture-binds — Drive capture binds bounded roots and mode to the position

Cited byconnector.source.drive-root-setconnector.source.drive-root-validationconnector.source.drive-root-walkconnector.source.drive-overlapconnector.source.drive-modeconnector.source.drive-metadata-onlyconnector.source.drive-selection-positionconnector.source.drive-selection-removals

Native exports carry no checksum for the exported representation, so capture hashes the bytes.

OptionLost onCost
Bounded roots and explicit capture mode (chosen)—A changed selection rewalks its roots; metadata-only still downloads each body.
One pipeline per rootOverlap identityOne file lands in several tables.
Arbitrary roots and shortcutsScope reviewOne declaration reaches unrelated drives.
Drive’s checksum aloneByte identityNative exports lack a checksum.

Revisit: Drive offers a verifiable export digest without reading bytes, or a tenant needs more roots than the ceiling.

picker-files-bind — Picker files bind selection and principal to one position

Cited byconnector.principal-secrets.write-serializationconnector.drive-picks.file-selectionconnector.drive-picks.file-withdrawnconnector.drive-picks.file-position

Under drive.file, a selected folder may not grant its children’s bytes, so a selection admits individual files.

OptionLost onCost
Explicit files, versioned credential names (chosen)—Selection changes reread retained files.
A picked folder grants its descendantsProven accessA child’s bytes may sit outside the grant.
One global refresh lockDistributed correctnessAnother process still rotates the same credential.