10. Privilege

In plain words: Design rule 10: Host privileges

Operator validation 5 min read 4 glossary terms 6 connected pages
The short version written for the Snayu team

Defines how actions that change the host (starting services, writing units) are requested and performed. The server never gets a shell, root or the Podman socket; it hands typed requests to a host-side helper (Host Reactor).

Why read it: Read this before writing code that touches systemd, Podman or host files, or anything needing elevated rights.
  1. 1Initialization refuses to run as root; host changes belong to the invoking user and rootless Podman.
  2. 2Host tools are trusted only if safely owned and unwritable; all mutating actions share one lifecycle lock.
  3. 3State is rechecked under the lock right before change; partial failure triggers one bounded undo.

Operator validation The mediated protocol passes isolated tests; real host transitions still need proof.

Words on this page, decoded click one for its card

The original text Underlined words open their plain-English card.

Context

The VesselEngine Room does not receive a shell, Podman socket, user-systemd bus, or general root authority. The managed VesselEngine Room crosses the Host Reactor boundary for privileged effects. The typed direct systemd adapter remains a host-side mechanism exercised by explicit OCI tests, not a host-native VesselEngine Room deployment. Both accept the same closed transition word; trusted construction selects the effect owner without granting the container host control authority.

Decision: authority before effect

Effectful initialization refuses effective UID 0; root may inspect a zero-effect dry run but does not acquire initialization authority. Host mutation belongs to the invoking user, its user manager, and rootless Podman/Quadlet. Layout owns which paths may exist or be retired.

Host tools are never trusted from spelling alone. Discovery accepts only an executable regular file that is UID-0-owned or lies on a kernel-reported read-only filesystem. Neither the file nor any ancestor may be group/other-writable or writable by the caller; the resolved absolute path, device, and inode remain in the authority token. The systemd user-generator search follows directory priority: the first matching entry wins, and an unsafe, empty, non-executable, or /dev/null-linked entry masks every lower-priority copy.

Binding sites are real non-symlink, invoking-user-owned safe directories. All real initialization, binding, deletion, direct-systemd actuation, and Host Reactor consumption share one non-blocking lifecycle lock under /tmp. It is opened without following symlinks and must be a regular caller-owned 0600 file. Dry runs do not acquire or create it; contention is a no-effect refusal.

Foundation, desired bytes, source and secret generation, tool/site identities, and live configuration are revalidated under that lock immediately before mutation. A state mismatch is a no-effect refusal.

TransitionIntent is frozen, extra="forbid" data: a 32-hex correlation ID, forward or exact compensation operation, configuration digest, canonical AnimatorModel Runtime and capability, ordered evict/launch sets, and exact expected active world. It carries no command, unit name, path, environment, or arbitrary payload. A host consumer or extension escalation needs an equally closed typed class, trusted producer and consumer, configuration owner, recovery states, and boundary tests; extension import grants no host authority.

The physical transaction

Physical truth comes from observed state. For an admissible transition, the actuator first validates the word and policy, preflights and attests the loaded Scribe-owned topology, rejects relevant pending jobs, and compares the exact observed pre-world. It records intent before actuating generated AnimatorModel Runtime targets, then obtains terminal readback and attests the result. Client exit status cannot supply that proof: a successful receipt requires the observed desired state, making the effect accountable.

The direct systemd actuator uses only the injected, attested absolute systemctl under the lifecycle lock. It submits only generated target identities and observes both target reservations and services. Cancellation and partial failure obtain one bounded inverse transaction. The prior world reopens admission only when exact readback proves it.

The caged host-reactor default gives the VesselEngine Room a write-only owner-mode inbox and a read-only host journal. It publishes one bounded typed JSON intent; the host claims it before parsing through a no-follow descriptor, independently rechecks schema, ownership, topology, policy, digest, and world, then acts. The journal distinguishes no-effect decline, completed desired state, proved restoration, malformed rejection, processing uncertainty, and containment. Claimed work and containment keep admission closed; terminal filenames never form a writable reply command. This local file boundary is not remote authentication.

Claim first moves producer bytes into .acquiring.json, which never authorizes an effect or recovery. The host captures a bounded no-follow read into a new private 0600 inode and writes a separate host-owned, versioned custody companion binding its exact content digest. Both are durable before .processing.json can authorize actuation. A producer-held descriptor or hard link therefore cannot rewrite admitted or completed evidence. Processing and compensation reads require matching custody; a marker inside producer-supplied JSON is not custody proof. Interrupted acquisition without processing is rejected without effect. Missing, legacy, or mismatched processing custody remains fenced for operator reconciliation; old completed files without proof cannot authorize compensation and are never automatically certified or replayed.

Receipt Meaning Admission result
.acquiring.json producer bytes claimed, host custody not yet established remain closed; reject interrupted acquisition without effect unless durable processing already exists
.processing.json claimed work without a terminal physical observation remain closed
.completed.json exact desired world observed proceed to separate readiness
.declined.json / .rejected.json no-effect precondition refusal / invalid delivery fail closed; only a decline may reopen the initial barrier
.restored.json exact prior world observed after failure or cancellation reopen with a typed restored result
.contained.json neither desired nor prior world proved latch containment

Materialization and retirement

Scribe's ownership receipt bounds every Quadlet/plain user-unit file that binding may write. Under the lifecycle lock, binding stages and validates the full generation, rechecks foundation/sites/secrets/generations, replaces exactly the declared set, and reloads systemd. Failure restores the previous set. Foreign units, ambiguous ownership, unsafe names, changed identities, and unknown files cause refusal rather than deletion.

Deletion is a separately fingerprinted, revalidated sequence—quiesce, runtime, storage, unbind, secrets, filesystem, package, verify. It stops only exact owned units and recursively retires only init-attested dedicated roots through pinned no-follow descriptors. An exact, init-created PhylacteryMemory Vault Btrfs subvolume may need root; LychD proves mount/device/filesystem/subvolume identity, prints a narrow trusted root handoff, writes a protected continuation receipt, and never invokes sudo itself. Any ambiguous mount, replacement, interruption, or root outcome preserves evidence and blocks continuation.

Containment rule and delivery boundary

Compensation can reopen the prior world only after exact proof of its restoration. When the physical result remains indeterminate, containment latches and recovery is required; another retry cannot supply that recovery. Signal authority stays equally narrow: the trusted VesselEngine Room alone writes the Reactor inbox, and the host consumer alone claims it. Tombs, SoulstonesLocal Models, and untrusted extensions receive neither inbox nor journal.

The mediated protocol and its isolated receipts are available within their stated boundary, but no repository test proves an operator's Quadlet/Podman/GPU host. State of Work and its systemd/Podman embodiment record own that delivery distinction.

Consequences

Host mutation remains attributable and recoverable, but an uncertain physical outcome deliberately costs availability until an operator establishes a safe recovery boundary.