amplifthq / opentag
Deploy or operate OpenTag's supported paired setup when a user needs to bootstrap the self-hosted Docker Compose Control Plane and Slack Source App, configure or pair a local ACP Runner with a GitHub Project Target, start the Runner service, verify readiness, or diagnose a Slack mention that did not complete.
OpenTag
Supported route
Slack Source App
-> self-hosted Control Plane
-> paired local Runner
-> ACP Agent in one local checkout
-> GitHub Project Target/publication
-> truthful result in the originating Slack threadSlack is the only Source App. GitHub is the Project Target and
publication/evidence provider. The Control Plane owns Slack ingress, custody,
and projection; the Runner owns local execution.
Load the needed reference
Compose deployment, Slack bootstrap, TLS, or pairing authority:
references/control-plane.mdSlack app URLs, events, scopes, channel binding, or missing mentions:
references/slack-setup.mdGitHub target, local checkout, publication, or readback:
references/github-setup.mdCodex or another supported ACP executor:
references/codex-runner.mdAny failed readiness, pairing, Run, or delivery step:
references/troubleshooting.md
Load only the references whose branch applies.
Guardrails
Pair only with the exact HTTPS Control Plane origin the user operates or
explicitly trusts.Keep Slack signing and bot secrets in Control Plane secret files. Its
.env
contains only their host-side file paths and non-secret Slack identifiers.Enter the bootstrap pairing authority and GitHub token through local secret
input. Keep them out of chat, command arguments, logs, screenshots, and git.The ACP Agent edits only the assigned local checkout. OpenTag performs Slack
delivery and GitHub publication through governed provider boundaries.Preserve unrelated working-tree changes. Confirm the checkout and target
before enabling write-capable work.Run completion, enqueue, approval, and provider acceptance are separate
facts. Preserveoutcome_unknownuntil the original provider operation is
reconciled.
Paired workflow
Bootstrap the Control Plane and Slack installation from
deploy/compose/.env.example, using file-backed Slack secrets, then start
Compose behind TLS.
Completion: the Compose project reports healthy,/readyzsucceeds, and
bootstrap logs show the intended Slack binding without secret plaintext.Install the reviewed CLI and verify the local checkout and ACP login.
npm install -g @opentag/cli@0.11.0 opentag --version git -C /absolute/path/to/checkout status --shortCompletion: the CLI reports
0.11.0, the user has accepted the checkout
state, and the chosen ACP executor is locally authenticated.Configure the Runner, trusted relay, checkout, ACP executor, and GitHub
Project Target. Omit secret flags so the CLI prompts locally.opentag setup \ --relay https://control.example.com \ --project /absolute/path/to/checkout \ --executor codex \ --github-repository owner/repo \ --project-target-id target_teamReplace
target_teamwith the active Slack binding's Project Target ID from
Compose. Do not require a duplicate Runner environment variable for it.Setup performs the initial pair. For an existing configuration that is
still unpaired, complete that same pairing with:opentag pair \ --relay https://control.example.com \ --trust-relay-origin https://control.example.comCompletion: redacted config shows
paired_relay, the exact trusted origin,
a paired Runner registration, and the intended GitHub target ID; pairing has
registered that target through the active Slack binding and verified exact
Control Plane readback. The bootstrap token is not retained in Runner config.Keep the Runner active in one supported mode.
opentag start # or, after a global install: opentag service install opentag service start opentag service statusCompletion: the service reports running and ready, the runtime credential
is accepted by the Runner Control Context endpoint, and the configured ACP
executor is ready.Verify before inviting work.
opentag doctor opentag status opentag config showCompletion: required checks pass, the relay and Runner identities match,
the checkout maps to the intended GitHub target, and displayed secrets are
redacted.Mention the installed OpenTag app in the bootstrapped Slack channel with one
bounded task.
Completion: the signed Slack event creates one WorkThread and Run, the
paired Runner claims one fenced Attempt, and the originating thread receives
a concise result or an explicit actionable failure.
The setup is complete only when every completion criterion above holds on the
paired route. A local process exit, queued delivery, generated pull-request URL,
or Slack acknowledgement alone is insufficient.