Skip to content

Deploy the LangGraph release

This is the canonical clean install and operations path for Zeroth 0.25.7.3. The tested compatibility matrix is LangGraph 1.2.9, Agent Server 0.11.1, and Zeroth adapter 1.0.

Warning

Gateway-only mode cannot enforce internal Agent Server tool calls. The gateway enforces admission and records observed traffic. Tool-body allow, deny, and approval enforcement requires the in-process adapter.

Clean install

Use Python 3.12 and install only the deployment surface you operate, from a checkout at the release tag (PyPI currently serves a stale 0.1.0 placeholder, so the documented version is installed from source):

git clone https://github.com/rrrozhd/zeroth.git
cd zeroth
git checkout v0.25.7.3
uv sync --extra langgraph --extra langgraph-gateway

For managed Agent Server deployments, put the Zeroth gateway in front of the managed endpoint, configure the upstream URL and authentication, and install ZerothMiddleware or govern_tools inside the application when enforced tool calls are required. Managed availability does not change the gateway-only limit.

For self-hosted deployment, build the release image and use Compose:

export ZEROTH_SERVICE_API_KEYS_JSON='[{"credential_id":"release-smoke","secret":"release-smoke-key","subject":"release-operator","roles":["operator"]}]'
export SIGNING_DEPLOYMENT="$(python -c 'import secrets; print(secrets.token_hex(32))')"
uv build --wheel
docker compose build
docker compose run --rm zeroth zeroth-core seed-demo
docker compose up --wait
python release/langgraph/harness.py smoke --require-gateway
python release/langgraph/harness.py gateway-smoke --api-key release-smoke-key

The Compose file includes a bounded, test-only Agent Server fixture so this release smoke is deterministic and needs no proprietary Agent Server image. For a real self-hosted or managed upstream, set ZEROTH_LANGGRAPH_GATEWAY__UPSTREAM_URL and ZEROTH_LANGGRAPH_GATEWAY__UPSTREAM_AUDIENCE; keep the gateway deployment ref equal to the seeded or imported deployment.

The image runs as UID 10001; /health/ready checks configured dependencies. Invalid environment configuration fails startup. Compose gives shutdown 30 seconds so the existing runtime drain can finish in-flight work and flush audit delivery before exit.

Environment variables

Variable Purpose
ZEROTH_LANGGRAPH_GATEWAY__ENABLED Enable the Agent Server gateway.
ZEROTH_LANGGRAPH_GATEWAY__UPSTREAM_URL Managed or self-hosted Agent Server URL.
ZEROTH_DATABASE__BACKEND sqlite or postgres.
ZEROTH_DATABASE__POSTGRES_DSN Postgres connection string for self-hosted use.
ZEROTH_SERVICE_API_KEYS_JSON Service credentials; keep secrets outside manifests.

See the generated configuration reference for the full canonical names and defaults. Allocate at least 1 CPU and 1 GiB memory for the gateway, then size workers and connection pools from measured concurrency; the synthetic benchmark does not predict model or network resources.

Interrupts, retries, and outages

Approval interrupts need a durable LangGraph checkpointer and stable thread_id. Resume only through the original thread. The approval lifecycle fences approval delivery. Configure SQLiteActionExecutionRepository as the separate execution fence when side-effecting tool calls must tolerate runtime redelivery and require execution idempotency; without it, an allowed call has the runtime's normal retry behavior. Arbitrary interrupts that do not use the Zeroth approval payload and durable coordinator are outside the supported resume contract.

Upstream outages and unsupported compatibility fail gateway admission closed; readiness reports the dependency state. Audit delivery is bounded and drains on shutdown. Never log request bodies, approval arguments, credentials, or upstream error text: Zeroth redaction preserves fixed reason codes and compacts terminal approval arguments.

Release evidence

Run the real governance demo, repeated benchmark, and fail-closed checklist:

uv run pytest tests/integrations/langgraph/test_upstream_issue_scenarios.py -q
python examples/27_langgraph_release.py --json
python release/langgraph/harness.py benchmark --samples 20 --output /tmp/benchmark.json
python release/langgraph/harness.py validate --phase source --manifest release/langgraph/release-manifest.json
# After the image, JUnit, SPDX, package inventory, attestation bundle, and
# verification receipt exist:
python release/langgraph/harness.py validate --phase final --manifest release/langgraph/release-manifest.json

release-manifest.json is validated, not followed. The set of artifacts the gate demands is hardcoded in release/langgraph/release_evidence.py; the manifest is a committed declaration that must agree with it, so editing the manifest can only cause a failure and can never change what is checked. That is the point — a manifest that drove resolution would let a candidate choose which evidence it is judged on. Adding a new artifact means changing REQUIRED_EVIDENCE and the manifest together.

Final validation is the CLI default and the only publishable checklist result; --phase source is an explicit pre-build check of committed evidence only. The final gate cross-checks the expected release tests, installed image packages, image-bound SPDX document, and the GitHub CLI verification receipt for the exported image archive instead of accepting unrelated files with similar shapes.

The benchmark executes one deterministic public govern_tools StateGraph locally and through HttpToolDecisionClient over a real loopback HTTP sidecar. Its report records the sample distribution, hardware, variance, ordering, a measured 0.16.1.7 baseline, and derived thresholds. It excludes model latency, an external network, and the Agent Server runtime.