Skip to main content

Local applications

Install a separately compiled application into a trusted local Linux neighborhood. The server implements the language-neutral installation contract. The supervisor hosts Zig workers; other language hosts and distributed placement are unsupported. See the test guide for executed evidence.

Start and install​

Use the version-1 configuration and executable paths in server configuration. For a new application-capable installation, add:

"applications": { "port": 19106, "max_applications": 8, "max_roles": 32 }

The five service ports, application management port and Board port must differ. Start with transit server --config transit.yaml for both first startup and restarts. The ready record includes management_config. Application management uses the shared client library's Application.Request, Application.sign and Application.Client.call with the installation contract. There is no application-management command in transit. The caller loads the private management profile, constructs a typed request and retains its exact signed bytes before submission. The server returns typed status or connection values. This is not an in-place conversion of an existing installation: neighborhood configuration and Transit/provider artifact hashes remain pinned. Application replacement is a separate operation.

Build the work-item consumer through its own package manifest:

cd examples/work-items
zig build -Doptimize=ReleaseSafe
./zig-out/bin/work-items manifest "$PWD/zig-out/bin/transit-work-items" > application.json

Build with the repository’s pinned Zig toolchain. The separately built package depends on public Transit packages, not private CLI/server code. The server executes the artifact directly, without a compiler, shell, Python, source checkout or downstream supervisor. It starts roles in declared dependency order. installed means all native provisioning receipts have been checkpointed; ready is an observed worker activation. Neither proves domain initialization or a completed application command. Poll status until installed is true and all roles are ready before continuing with the connection-export steps.

Application-enabled neighborhoods configure their dedicated courier to deliver all pending recorded outputs in the realm. This includes application self-messages and inter-role messages after new PIDs are installed. It walks bounded native output pages and retains an exact uncertain delivery request; worker and resource grants remain separate. Neighborhoods without application hosting use the built-in query owner/requester destination list.

A declaration names roles, executable artifacts, compatibility contracts, configuration, resources, named associations, explicit grants, callers and initial domain frames. The caller resolves artifact paths and computes their SHA-256 hashes before freezing the signed request. Install again with the same complete declaration to attach to the retained IDs. A changed declaration fails; it cannot silently change topology or broaden grants. Admission also reserves checkpoint space for the next native request. A replacement that exceeds the remaining encoded checkpoint budget fails before acceptance, without disturbing installed workers.

Caller connections and domain commands​

The management connect request selects an application and a declared caller. Its Application.Connection response references that caller's private seed file; it does not export the installer key. Save the response privately for the application's own client. The work-item example accepts this neutral JSON connection and exposes its own domain commands. See its local guide.

Installation acceptance, worker readiness and domain initialization are distinct. Use management status for deployment observations and the application's own inspection operation for domain progress.

Replace a worker​

Build the new executable to a separate immutable path. Obtain the current role revision from a management status response. Write a replacement JSON object with application, role, that expected_revision, the unchanged contract, artifact (path and sha256) and configuration. Sign a management replace request with a fresh operation identity, persist it, and submit it through Application.Client.call. Observe the resulting deployment with status.

The manager atomically fences the old worker before stopping its dependent roles. The new process generates its own key, and native rotation installs it with fresh ownership while preserving the worker's principal, permission epoch, resource grants, PID, resources, input history and request sequence. Replacement cannot renew revoked permissions. Unrelated applications and neighborhood roles continue running. A matching contract string is a declared compatibility promise; Transit cannot prove an application's transform or computation is correct.

Rewriting the old artifact in place makes its recorded digest stale. The manager refuses to start a changed artifact under an old revision. Deploy a distinct path and an explicit replacement instead. Automatic watch/rebuild, hot code loading, rollback to older data contracts and Transit upgrades are outside v1.

Recovery and limits​

On a lost management response, resubmit the original frozen signed request. A returned status is the current observed state, not a new provisioning receipt. Reusing an operation ID for changed intent fails. A pending native request is recovered before any fresh root operation, including activation of built-in neighborhood workers. Application receipt floors also detect rollback across an interrupted local checkpoint. Ordinary startup never deletes history, resets grants, or creates replacement resources.

SIGINT/SIGTERM stop and join owned children; manager SIGKILL triggers the Linux parent-death contract. Restart with the same server command and configuration. Worker-only interruption restarts its required dependency closure. Storage/authority interruption restarts the pinned neighborhood on retained disk. Temporary authority liveness-read failures require three consecutive failed observations before restarting live roles; current denials fail immediately. An explicitly denied app is reported failed; automatic recovery does not restore its rights. Inspect the named failure and retained evidence before an operator repair. v1 has no automatic permission-repair or history-reset command.

Boundv1 limit
One declaration8 roles, 16 resources, 8 callers, 16 initialization frames
Deployment quotaDefault 8 applications / 32 roles; configurable up to 64 / 256
Management request/reply64 KiB; names 64 bytes, association names 32 bytes, paths 4096 bytes, role configuration 8192 UTF-8 bytes
Resident checkpoint readOne application record, at most 256 KiB; retained requests/receipts are separate files
Receipt status page8 receipts; the request's after field accepts the previous next cursor
ReconciliationOne application step per 100 ms; one frozen native operation at a time
Management HTTP6 sockets, 2 data requests plus 1 health request; 500 ms headers, 4 s whole request
Worker lifecycle10 s registration, 30 s activation; 3 exit restarts per manager invocation; 1 s graceful shutdown per child
Child diagnosticsTwo drained 64 KiB prefixes per active child; payloads/keys are not manager diagnostics

The public status is an authorized, sampled deployment observation. Read domain state through the caller's current native/resource grants. Repeated operation history grows on disk, with unlimited retention by default; active quotas and bounded record/page reads do not turn that history into a resident queue.

Board inspection​

A version-1 server starts Board by default. A declaration with version: 1 may include "inspection": [{"resource":"data","permissions":3}], where data is one of its declared resource names. Permission 1 allows metadata; 3 also allows bounded entry/framework inspection. Write bits, unknown resources and duplicates reject before provisioning. Omitting this list grants no resources. The installation, management and bootstrap contracts all use v1. Incompatible definitions require a new installation; version labels alone do not prove compatibility.

The trusted installer authorizes this declaration; Board receives its own inspection-only principal, never a caller's signing seed. Accepted resource grants have exact pending requests and retained receipts in the application's existing journal. Headless installation may precede Board's first enablement. Subsequent restart, replacement and re-enablement do not repeat completed grants or restore revoked access. Board's realm-wide process metadata remains visible; resource visibility is independently filtered by its current grants.