Deployment
The reference deployment splits Enoch across two machines:- Control VM — runs the FastAPI control plane, the professional operator dashboard, bounded read models, publication automation APIs, timers, and optional corpus/export tooling.
- Worker machine — runs the worker-gate API used by Codex jobs, tracks processes and telemetry, and stores project workspaces and evidence.
Prerequisites
Control VM:- Linux with systemd
- Python 3.11+
uvgit- network access to the worker API
- Linux with systemd or an equivalent process manager
- Python 3.11+
uvgit- the Codex stack used by your dispatch script
- NVIDIA telemetry libraries if you want GPU visibility
Install the control plane
/opt, create config and state directories, install dependencies, and write systemd units when run as root:
/etc/enoch-control-plane/config.json before enabling the service. Replace every placeholder token and URL.
Configure required secrets
Generate distinct values forcontrol_api_bearer_token, completion_callback_token, and worker_wake_gate_bearer_token:
Run the control service
/control/dashboard 307-redirects to /control/dashboard-v2. The shorter /dashboard legacy worker-gate shell also redirects to V2. The dashboard uses bounded /control/api/v1/* read models by default, so the first screen stays focused on operator questions rather than raw JSON.
Configure the worker
On the worker host:Optional timers
The repo includes systemd units for optional workflows:enoch-queue-alert-check.timer— periodically checks queue health and can send Pushover alerts when configured.enoch-notion-sync.timer— legacy compatibility only; syncs Notion intake/projection data when those environment variables are configured.enoch-paper-draft-next.timer— legacy unattended paper drafting path. Keep disabled unless you intentionally run a controlled, bounded drain and have verified the decision gate.
Smoke-test before live dispatch
/control/api/v1/overview by default. That keeps the test bounded and aligned with the operator dashboard. If you need the broader compatibility payload, set ENOCH_STATUS_ENDPOINT=/control/api/status explicitly.
Then test worker preflight:
Paper artifact workflow
Paper generation is optional and depends on evidence and paper rows. The defaultpaper_writer_provider is deterministic. The code also supports an OpenAI-compatible synthetic.new provider with paper_writer_base_url, paper_writer_model, and paper_writer_api_key settings.
Do not publish generated artifacts until corpus import, packaging/provenance checks, and strict claim/evidence audit status are explicit. Human review or replication may still be needed before treating claims as reliable science, but paper finalization itself is automated.
The public paper counts should stay gate-aware:
paper_pipeline.write_neededis actionable positive work only.paper_pipeline.raw_completed_no_paper_candidatesis informational/debug only.paper_pipeline.publish_readymeans finalized drafts still missing corpus import.
Review the dispatch flow
Every live dispatch request passes through the following checks in order. Understanding this sequence helps you diagnose failures at each stage:- No conflicting active GPU lane exists.
- A queue item exists.
- Live dispatch is enabled (
live_dispatch_enabledmust betruein config). - The control plane is not paused and maintenance mode is not active.
- Worker preflight is healthy.
- The dispatch script launches the agent run.
- The worker gate tracks process and telemetry truth.
- The completion callback or status update is emitted only after the gate is satisfied.