Skip to main content

Build (CI on every push)

The Containerfile is a stagex multi-stage build, chosen specifically so the result is reproducible — this is the prerequisite for the Nautilus claim that anyone can rebuild the source and get the same PCRs:
Rebuilding the same source tree produces the same coordinator.pcrs byte-for-byte. Those PCRs are what EnclaveConfig<ENCLAVE> is updated to via update_pcrs before the first register_enclave succeeds — see On-chain contracts.

EC2 deployment

Triggered by every push to main. Workflow: .github/workflows/deploy.yml.

Inside the enclave at boot

From src/init/src/main.rs:

~/.env.runtime vs ~/.env.runtime.dynamic

  • ~/.env.runtime is overwritten on every deploy from the PINAIVU_ENV_FILE GitHub Actions secret. Static config.
  • ~/.env.runtime.dynamic is written by post-boot host scripts (e.g. register-coordinator.sh). Holds values discovered after enclave start — currently just PINAIVU_ENCLAVE_OBJECT_ID. Survives across deploys.
  • The VSOCK:7000 push concatenates both with awk 1 so every line ends in \n — a plain cat A B can glue the last line of A onto the first line of B, silently corrupting whichever variable sits at that boundary.

Local dev

Running the coordinator outside an enclave still works (mock NSM attestation):
Skip the sidecar in dev — registration just logs a warning and the HTTP server keeps serving. The inference flow doesn’t depend on it.

Smoke testing prod

Environment variables

Required env vars for the coordinator, gateway, chat-relayer, and explorer-indexer

Full E2E smoke test

Reproduce a real settled inference, with troubleshooting for common failures