Open source · Go CLI

AnvilHotline

When agents need a human

Agents hoist one narrow question to an authorized human on Discord, wait for the reply — typed or an emoji — and proceed only on that answer.

The night line — four acts

ASKROUTEWAITSEAL
ACT 1 / 4

One narrow question

one sentenceAgents ask exactly what they need — with run context, never a conversation.01
allowed verbsproceed · abort · retry — the verbs you define, nothing loose.02
forbidden scopeNo browsing, no guessing, no unsafe defaults when evidence isn't enough.03
more ▸
ACT 2 / 4

Authorization gate

allowlistANVIL_HOTLINE_ALLOWED_USER_IDS — only authorized Discord users may answer.01
private roomANVIL_HOTLINE_ALLOW_ANY_USER=true — any member, private channels only.02
scope tokensThe question carries context: run id, target, and what the agent already knows.03
more ▸
ACT 3 / 4

The wait

queuedThe question is posted to the channel. The line is open.01
ringingAn authorized human is online. The handset glows.02
typingA reply is forming — typed, or a signal flag on the message.03
more ▸
ACT 4 / 4

Seal & audit

canonicalStdout carries only the mapped reply — yes, no, retry. Nothing else.01
auditEvery ask, responder, and answer is logged. The loop stays observable.02
non-zeroTimeout means exit non-zero. The agent never defaults.03
more ▸
Policy appendix — engineering spec
retentionAsk/answer pairs are log lines — append-only, no secrets in stdout, no tokens in messages.
who can be pagedThe allowlist is the only roster. Private channels may permit any non-bot member.
timeout SLAANVIL_HOTLINE_TIMEOUT=30m default. On timeout the run fails closed, loudly.
transportDiscord is the first transport. The ask-and-wait contract is transport-agnostic.

Open source · Apache-2.0

Open the channel

One bot token, one channel, an allowlist. Your agents get a safe line to the people who matter.