Skip to main content
Version: 0.1.0-alpha.4 (alpha)

Configure standalone providers

The opt-in providers object installs the existing bounded HTTP and immutable local-blob providers in the standalone node. Explicit clockMonotonic, clockWall and random installations also enable the maintained activation-clock and OS-entropy providers. Explicit secrets installs the protected local guest-secret provider. metrics shares the node's telemetry exporter, and localService selects a bounded local caller/callee binding. events installs the maintained TLS NATS immediate publisher. Streaming HTTP and S3 have no installation entry here. The configuration schema describes the closed input. This example is the provider section of a protected node file:

{
"providers": {
"formatVersion": 1,
"blob": {
"identity": {"id": "blob", "tenant": "tests", "service": "blob-host", "epoch": 1},
"namespace": "workflow"
},
"bindings": [
{"name": "blob-binding", "tenant": "tests", "consumerService": "generic",
"providerService": "blob-host", "contract": "latent:blob/blob@0.2.0",
"providerBinding": "blob-installed", "route": "guest-blob"}
]
}
}

Each scalar installation takes only identity (the same closed fields as the blob example). The corresponding contracts are latent:clock/monotonic@0.1.0, latent:clock/wall@0.1.0, and latent:random/random@0.1.0. Installation does not grant access: an explicit binding, provider-binding policy, capability policy and deployment grant are still required for each consumer. Clock profiles charge 100 fuel per call. Entropy uses the existing nonblocking OS provider, with at most 4096 bytes per call and 65536 per activation; no seeded test source or fallback entropy can be configured. Registrations are shared node-owned objects, with no per-service worker, timer, listener or persistent guest heap.

Installation requires Linux x86_64, a protected configuration file, phase3 budgets, capabilityPolicies, and durable audit. Omission disables installation; explicit null and unsupported fields fail closed. check-config validates the configuration without installing providers or opening credential/blob storage. Actual startup separately verifies protected credential storage and may fail.

HTTP configuration is the existing latent_http::HttpProviderConfig: explicit origins, address policy, static or bounded DNS resolution, redirects, roots and finite request/response/header limits. Credentials are file references under an explicit protected credentialDirectory, relative to the node file if not absolute. Each reference binds one configured destination, tenant, provider ID and approved credential header. Secret bytes are neither configuration values nor public configuration digests, CLI outputs, guest imports, or diagnostics. The shared workflow writes a clearly public test-only credential, not a real credential. Production credentials must be supplied by the operator.

Guest secrets use a separate secrets entry with identity, a protected directory and one to eight references. Each reference contains a public reference, a relative single-file file name and optional unsigned expiresAtUnixMillis. Relative directories anchor to the node configuration file; parent traversal and duplicate reference/file selections are rejected. Inline values, environment sources and provider-credential purposes are not accepted. Startup checks private storage and loads file bytes through the existing local-secret store before readiness. check-config never reads them.

Bind latent:secrets/reader@0.1.0 to the configured service and use the actual protected-local-secrets-v1 descriptor in the public provider-binding policy. Guest disclosure still requires explicit reference-scoped policy and deployment grants. Files are limited to 4096 bytes, eight references and 32768 reserved bytes per generation, with at most two retained generations. Expiry uses the system clock. Values and value digests are excluded from the provider identity. This entry adds no separate listener, background refresh or ambient credential discovery. Reload requires explicit node lifecycle management.

Custom metrics use a metrics entry containing identity and one to sixteen descriptors. Each descriptor declares name, kind (counter, up-down-counter, gauge or histogram), unit, bounded labels (each with key and allowed values) and histogramUpperBounds. The ordinary registry rejects reserved names, duplicate descriptors/labels/values and nonfinite or unordered histogram bounds. check-config validates this data without starting an exporter. Bind latent:telemetry/custom@0.1.0 with the actual custom-metrics-v1 provider descriptor and explicit metric-name policies.

The provider shares the node's existing telemetry owner. It adds no exporter thread or remote destination. Its one configured tenant is limited to 32 series, 128 observations per second and 65536 queued bytes; each activation is limited to 32 observations, 16 series and 1 MiB of record bytes, further restricted by its policy and fuel budget. Source identities accept the node's canonical revision-v1:sha256:... values without changing guest metric-name rules.

After provider retirement and exporter shutdown, the bounded stopped report includes metric attempt/outcome counters, queue bytes, sink loss counters and up to sixteen captured records containing only exported name, unit and exact floating-point value bits. Exported names retain the latent.application. prefix. Source/guest labels and other diagnostics are omitted. Truncation and sink loss are explicit; a finite retained series catalog is not a live exporter.

The optional localService entry selects one local deployment through the existing lsf-local-service-invocation-v1 dispatcher. It contains identity (whose service is the callee), deployment and the callee's exported contract. An explicit consumer binding uses latent:service/invoke@0.1.0; its configured provider service must match the entry. This compiles an isolated-local binding to the exact configured deployment and contract. Self-bindings, foreign binding tenants, ambiguous provider identities and remote endpoints are rejected.

Only configured consumer services acquire their canonical node-derived service subjects in tenant admission. Child calls carry service identity without the operator's administrator claims. The binding compiler verifies the caller ABI, callee exports, exact publication eligibility and current route; policies and deployment grants still have to permit the selected callee publication. No per-capsule worker, listener, VM or persistent guest instance is installed. Configure a nonzero maximumChildCalls and enough cell capacity for parent and child; delegation remains bounded by the existing depth, descendant and parent budget rules. Startup does not publish or deploy either component.

An events entry contains identity, configuration, credentialDirectory, credentialReference and credentialFile. Configuration uses the maintained latent_nats::NatsConfig: one explicit IPv4 peer and TLS server name, approved roots, one to sixteen exact tenant/topic/subject/stream mappings, a stable idempotency namespace and finite payload/timeout limits. Every mapping must belong to the configured tenant. Nonpublic peers require explicit approval; wildcards, discovered servers and ambient credentials are unavailable.

The protected local-secret store binds token authentication to the exact tenant, provider ID, TLS server name and port. Neither the token nor its value digest enters the provider descriptor. Bind latent:events/publisher@0.2.0 and the actual nats-jetstream-publish-v1 descriptor, then grant only approved logical topics. Installation grants no publish authority. A missing or invalid reply after a possible publish is uncertain and is never automatically replayed. The existing shared provider pool owns connections and work; shutdown closes the credential generation and checks that live resource counters are zero.

The node's bounded ready record includes actual installed descriptors: id, tenant, service, capability, profile, configurationDigest, and decimal-string configurationEpoch. Use those exact descriptors when applying the typed provider-binding policy record; do not manufacture a matching digest. Installation alone grants no consumer authority. Deployment grants, current policy, binding restrictions, publication admission, budgets and provider currentness still apply independently.

Configured bindings are durably established once. Restart requires the exact same definitions and reattaches live providers without changing catalog bytes, deployment revisions or route generations. Changed or missing bootstrap definitions fail closed; this profile does not silently migrate bindings. Shutdown retires capabilities and reports actual pool, broker, I/O, blob and retained secret-generation/reference reclamation counters. A failed or incomplete cleanup is not reported as clean.

Combining the resident rollout worker with capability policy/provider work requires two bounded control blocking slots, not one. The CLI derives this fixed node-wide ceiling; embedders can use NodeSettings::control_blocking_threads. Otherwise the rollout worker would occupy the only slot and starve protected credential reads, blob work and policy operations. This adds no per-service thread, pool or listener.

Validate a configured node​

Use the capability guide for allowed and denied operations, and provider diagnostics when a request fails. The node reference describes complete configuration, startup and authenticated management.

The maintained test fixture, exported package format and startup regression history belong to the contributor validation reference.