Public operations tooling for JI TECH AI runtime accounts.
This repository owns the operator-facing tools, runtime profiles, canonical runtime recipes, wrapper
image contract, MCP server, and runbooks. It does not store customer documents, passwords, API keys,
gateway tokens, or mutable production state. Private state lives on the server under
/srv/openclaw-ops.
First install or bootstrap from a full commit SHA:
OPS_REF="FULL_40_CHARACTER_COMMIT_SHA"
sudo -v
curl -fsSL "https://raw.githubusercontent.com/Epicevent/agent-runtime-ops/$OPS_REF/go" \
| sudo bash -s -- "$OPS_REF"The normal update flow is:
commit/push -> root approve full SHA -> svcops self-update -> status/check/live verification
Root approval command:
sudo /usr/local/bin/opsctl update approve FULL_40_CHARACTER_COMMIT_SHAInstall the approved SHA:
ssh svcops "sudo /usr/local/bin/opsctl self-update"The server keeps only the active release as a code directory. Older installed tool releases are pruned
after a successful install, leaving hash/summary history under /opt/agent-runtime-ops/release-history.
Verify after install:
ssh svcops "/usr/local/bin/opsctl update status"
ssh svcops "/usr/local/bin/opsctl profile list"
ssh svcops "/usr/local/bin/opsctl binding list"Image rollout truth is not releases.yaml or a rollout ledger. The public rollout path is:
digest-pinned wrapper image + digest-pinned product image
wrapper image labels
runtime binding
runtime manifest
live container image labels
The routing registry stays intentionally small. It owns the Apache-facing contract only:
linux_account, public_host, gateway_port, bridge_port, enabled
It must not become the source of image, runtime profile, canonical recipe, or applied-result truth.
Read-only orientation:
ssh svcops "/usr/local/bin/opsctl status SLOT"
ssh svcops "/usr/local/bin/opsctl plan SLOT"
ssh svcops "/usr/local/bin/opsctl check SLOT"
ssh svcops "sudo /usr/local/bin/opsctl check --live SLOT"
ssh svcops "sudo /usr/local/bin/opsctl runtime truth SLOT"
ssh svcops "sudo /usr/local/bin/opsctl runtime truth --all"
ssh svcops "/usr/local/bin/opsctl binding status TARGET"
ssh svcops "/usr/local/bin/opsctl apache status TARGET"Bounded protected-host artifact observation:
ssh svcops "sudo /usr/local/bin/opsctl artifact probe kwrag-product --revision FULL_40_CHARACTER_SOURCE_SHA"This command derives its host path and candidate image tag from the fixed scope and revision. It reads only allowlisted build artifacts plus local Docker image metadata, emits a capped redacted JSON observation, and writes no receipt or server state. It does not qualify, attach, canary, or promote an artifact. Arbitrary paths, tags, process IDs, ports, GPU probes, shell commands, and environment dumps are intentionally not accepted.
Single-slot re-apply and rollback:
ssh svcops "sudo /usr/local/bin/opsctl apply SLOT"
ssh svcops "sudo /usr/local/bin/opsctl apply SLOT --allow-first-apply"
ssh svcops "sudo /usr/local/bin/opsctl rollback SLOT"Normal product rollout uses only image rollout commands:
ssh svcops "sudo /usr/local/bin/opsctl rollout status --family hermes"
ssh svcops "sudo /usr/local/bin/opsctl rollout image-plan --wrapper-image WRAP@sha256:... --product-image PROD@sha256:..."
ssh svcops "sudo /usr/local/bin/opsctl rollout image-dev-apply --slot dev-oc --wrapper-image WRAP@sha256:... --product-image PROD@sha256:..."
ssh svcops "sudo /usr/local/bin/opsctl rollout image-canary --slot oc3 --wrapper-image WRAP@sha256:... --product-image PROD@sha256:..."
ssh svcops "sudo /usr/local/bin/opsctl rollout image-promote --from-slot oc3 --slots oc1,oc2,oc4"The old release command group and release-state rollout flow are absent from the public CLI.
Never pass raw secrets through MCP JSON arguments or chat. Use terminal stdin or a restricted secret file path.
Runtime provider secret example:
ssh svcops
read -rsp "GEMINI_API_KEY for dev-oc: " GEMINI_API_KEY
printf '\n'
printf '%s' "$GEMINI_API_KEY" | sudo /usr/local/bin/opsctl runtime-secret set dev-oc --key GEMINI_API_KEY --value-stdin --check
unset GEMINI_API_KEY
sudo /usr/local/bin/opsctl runtime-secret status dev-ocHandoff credentials are different from runtime provider secrets:
ssh svcops "sudo /usr/local/bin/opsctl handoff status SLOT"If value retrieval is explicitly authorized, use only the exact manual command printed by
handoff status. Do not paste the secret value back into chat.
NAS requests and managed mounts:
ssh svcops "sudo /usr/local/bin/opsctl nas requests"
ssh svcops "/usr/local/bin/opsctl nas mounted SLOT"
ssh svcops "sudo /usr/local/bin/opsctl nas approve-auto"
ssh svcops "sudo /usr/local/bin/opsctl nas mount SLOT //HOST/SHARE"
ssh svcops "sudo /usr/local/bin/opsctl nas unmount SLOT //HOST/SHARE"
ssh svcops "sudo /usr/local/bin/opsctl nas remove SLOT //HOST/SHARE"Manual credential injection uses stdin:
printf '%s' "$NAS_PASSWORD" | ssh svcops "sudo /usr/local/bin/opsctl nas mount SLOT //HOST/SHARE --username NAS_USER --password-stdin"Install activates:
/usr/local/bin/opsctl
/usr/local/bin/agent-runtime-ops-mcp
/home/svcops/AGENTS.md
/home/svcops/GEMINI.md
/home/svcops/.codex/skills/agent-runtime-ops
The MCP server wraps opsctl with structured tools for agents. It does not approve updates and does
not accept raw secret values. Its typed root-action tools may submit an exact registry-validated
manifest and recover the bound sanitized projection/receipt, but they cannot authenticate, enroll a
credential, approve, dispatch an arbitrary shell, or bypass OPS WebAuthn review.
Smoke checks:
ssh svcops "codex mcp list"
ssh svcops "printf '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-06-18\",\"capabilities\":{},\"clientInfo\":{\"name\":\"smoke\",\"version\":\"0\"}}}\n' | /usr/local/bin/agent-runtime-ops-mcp"