惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security Archives - TechRepublic
T
Tor Project blog
Project Zero
Project Zero
S
SegmentFault 最新的问题
月光博客
月光博客
P
Palo Alto Networks Blog
H
Help Net Security
美团技术团队
Spread Privacy
Spread Privacy
Cyberwarzone
Cyberwarzone
T
Threatpost
Jina AI
Jina AI
S
Securelist
S
Schneier on Security
有赞技术团队
有赞技术团队
T
The Exploit Database - CXSecurity.com
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy International News Feed
The Hacker News
The Hacker News
AWS News Blog
AWS News Blog
J
Java Code Geeks
Hugging Face - Blog
Hugging Face - Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Simon Willison's Weblog
Simon Willison's Weblog
T
Threat Research - Cisco Blogs
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
T
The Blog of Author Tim Ferriss
Google Online Security Blog
Google Online Security Blog
aimingoo的专栏
aimingoo的专栏
T
Troy Hunt's Blog
Hacker News: Ask HN
Hacker News: Ask HN
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
G
Google Developers Blog
爱范儿
爱范儿
AI
AI
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
云风的 BLOG
云风的 BLOG
MongoDB | Blog
MongoDB | Blog
H
Hacker News: Front Page
C
Cybersecurity and Infrastructure Security Agency CISA
Engineering at Meta
Engineering at Meta
The GitHub Blog
The GitHub Blog
L
LangChain Blog
博客园 - 【当耐特】
Microsoft Security Blog
Microsoft Security Blog
N
News and Events Feed by Topic

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Coding Agents over Telegram, Part 2: From Zero to an Agent That Answers
Jeril · 2026-06-14 · via DEV Community

This is the one post in the series you do, not just read. By the end you'll have a single Telegram topic where you type a message and a coding agent answers and drives a tmux pane on your own box. That's the entire goal, nothing more. Memory, monitors, tool servers, and the supervisor all come later; none of them are needed to get an agent answering you.

Budget ~30–45 minutes. If you only do one thing, do the Fast path, then prove it with the readiness gate. Everything below the gate is manual explanation and debugging you can skip until you need it.

Prerequisites (where solo setups die)

The Telegram wiring is the mechanical part; the real failures hide in local state. Confirm every line before you start:

  • A box you control with tmux, and shell access that survives disconnects (you'll leave a gateway running).
  • A coding agent already working in a tmux pane (opencode, Codex, or Claude Code) that you can drive by hand right now. If it isn't installed and authenticated yet, stop and fix that first; OpenClaw drives it, it doesn't replace it.
  • A known, stable pane target for that agent (for example, mybox:1.1). Write it down; you'll hard-code it into the agent's instructions.
  • Your agent's launch command: the exact command (or wrapper script) that starts the coding agent in the pane, including how it resumes a session. OpenClaw's restart flow needs this verbatim.
  • The OpenClaw runtime, pinned (see the matrix below). Wrong Node version is the single most common silent failure.
  • A Telegram account and the Telegram app on your phone.

Version matrix

Pin these. "It runs on Node" is not enough; the gateway is sensitive to the runtime.

Component Pinned version Notes
Node.js 24.11.1 The gateway is built against Node 24; newer majors can fail the native build.
Package manager pnpm 11.2.2 OpenClaw's packageManager field. corepack fetches it for you.
OpenClaw github.com/openclaw/openclaw, pinned commit (tested on 2026.5.27) Pin a commit or tag; don't track main for a setup everyone must reproduce.
Coding agent opencode, installed and authenticated Pin the version your team standardizes on.
Node manager nvm This guide assumes nvm; adapt the commands if you use asdf or system Node.

Fast path

Two scripts do the whole local setup. Grab them from the gist, then run them around the Telegram steps:

# Download the bootstrap + readiness scripts
curl -fsSL "https://gist.githubusercontent.com/jerilkuriakose/cd0f8353aac74e47c591111b758943e9/raw/setup-openclaw.sh" -o setup-openclaw.sh
curl -fsSL "https://gist.githubusercontent.com/jerilkuriakose/7cf94af3e96526f9f14d0c28b6c26b69/raw/ready-check.sh" -o ready-check.sh
chmod +x setup-openclaw.sh ready-check.sh

# 1. Pin the runtime, fetch + build OpenClaw, and launch the gateway.
#    Pass your bot token to also write a minimal config in one shot:
OPENCLAW_BOT_TOKEN="<BOT_TOKEN>" OPENCLAW_BOT_ACCOUNT="my-bot" ./setup-openclaw.sh

# 2. Do the Telegram steps in "Telegram side" below (BotFather + group + topic),
#    then add the allowlist + topic route from "Wire them together".

# 3. Prove it works:
AGENT_ID=my-agent PANE=mybox:1.1 ./ready-check.sh

setup-openclaw.sh pins Node 24.11.1 and pnpm 11.2.2 (via nvm and corepack), clones and builds github.com/openclaw/openclaw, and launches the gateway. ready-check.sh runs the readiness gate for you. Prefer to understand each step, or hit a snag? Follow the manual path.


Manual path

Three parts: the Telegram side, the box side, then wiring them together.

Telegram side

You must be the group's creator, so do these from your own Telegram account:

  1. Create a bot. Message @BotFather/newbot → name it → save the bot token it gives you. Treat the token like a password (see Secrets).
  2. Create a group, give it a name, and add your bot to it.
  3. Promote the bot to admin (Group → Edit → Administrators). This is required: Telegram's privacy mode hides normal group messages from non-admin bots, so without this the bot never sees what you type.
  4. Turn Topics on (Group → Edit → Topics). This converts the group to a forum supergroup.
  5. Create your first topic and name it for the project the agent will drive (for example, project-a).
  6. Send one message in that topic (anything). This makes the group and topic show up in the gateway log so you can grab their IDs.

You also need your own numeric Telegram user ID for the allowlist. Easiest: message @userinfobot and it replies with your ID. (Alternatively, it appears in the gateway log as the sender once messages start flowing in the next step.)

Box side: minimal config, then start the gateway

The gateway has to know about your bot before it can poll Telegram, so write a minimal valid config first. Create ~/.openclaw/openclaw.json with just the bot account. Use strict JSON (no comments, no trailing commas) because that's exactly what the gateway parses and what you'll validate against:

{
  "channels": {
    "telegram": {
      "enabled": true,
      "accounts": {
        "<your-bot-account>": {
          "botToken": "<BOT_TOKEN>"
        }
      }
    }
  }
}

Lock it down and validate before launching:

chmod 600 ~/.openclaw/openclaw.json
python3 -c "import json; json.load(open('$HOME/.openclaw/openclaw.json')); print('JSON OK')"

Get OpenClaw and build it. It's open source. Pin the runtime, clone, install with the corepack-provided pnpm, and build:

nvm install 24.11.1 && nvm use 24.11.1
corepack enable && corepack prepare pnpm@11.2.2 --activate

git clone https://github.com/openclaw/openclaw.git ~/repos/openclaw
cd ~/repos/openclaw
# Optional: pin a tested commit/tag for reproducibility (tested on 2026.5.27)
# git checkout <commit-or-tag>
pnpm install
pnpm build                  # takes a few minutes

Now launch the gateway in its own tmux session so it survives your disconnect:

pnpm gateway:watch          # launches the gateway and manages its own tmux session

Find your log path (it differs by config), then confirm the gateway came up and the bot is polling:

# If logging.file is set, use ~/.openclaw/logs/openclaw.log. Otherwise the dated default:
ls -t /tmp/openclaw/openclaw-*.log | tail -1          # default location
grep -a 'gateway ready' <your-log-path> | tail -1     # expect a recent line

The log directory is locked down (0700), so read it from the shell, not an editor's file browser. This initial launch, and any later logging or plugins.load change, needs a gateway (re)start. The group/topic/routing edits in the next section hot-reload, no restart needed.

Wire them together

Config lives in ~/.openclaw/openclaw.json. The gateway hot-reloads routing/topic/channel edits; no restart needed for these. We do this in two phases because you need the chat and topic IDs from the log, and the only way to make them appear is to let messages through first.

Phase 1: find the chat ID and open the group temporarily.

With the gateway now polling, send a message in your topic. It gets blocked (the group isn't configured yet), which conveniently logs the chat ID:

grep -a 'not-allowed' <your-log-path> | tail -1
# → {"chatId":<CHAT_ID>,"title":"<your group>","reason":"not-allowed"}

Add a groups block to your account so messages flow and topic IDs get logged. This is a fragment; merge the groups key into the account you already created, keeping the file strict JSON:

"groups": {
  "<CHAT_ID>": { "groupPolicy": "open", "requireMention": false }
}

Save. The gateway hot-reloads (no restart).

Keep the open window tiny. groupPolicy: "open" lets anyone in the group drive a shell-capable agent. The group must be private with only you in it, and this is a momentary bootstrap step: switch to allowlist (Phase 2) as soon as you've harvested the topic IDs, before adding anyone else or doing real work.

Phase 1b: harvest topic thread IDs. Send a message in each topic (label them by text so you can tell them apart, since topic IDs are not sequential by creation order), then:

grep -ao 'Inbound message telegram:group[^"]*' <your-log-path> | sort -u
# → ...:topic:<TOPIC_THREAD_ID>

Phase 2: lock it down and route the topic to an agent. Now switch the group to an allowlist (owner-only), add yourself, map the topic to an agent, and declare that agent. Strict JSON, merged into your config:

"channels": {
  "telegram": {
    "enabled": true,
    "accounts": {
      "<your-bot-account>": {
        "botToken": "<BOT_TOKEN>",
        "groups": {
          "<CHAT_ID>": {
            "groupPolicy": "allowlist",
            "allowFrom": ["<YOUR_TELEGRAM_USER_ID>"],
            "requireMention": false,
            "topics": {
              "<TOPIC_THREAD_ID>": { "agentId": "<your-agent-id>" }
            }
          }
        }
      }
    }
  }
},
"agents": {
  "list": [
    {
      "id": "<your-agent-id>",
      "workspace": "~/.openclaw/workspace-<name>",
      "agentDir": "~/.openclaw/agents/<name>"
    }
  ]
}

requireMention: false lets you type naturally instead of prefixing every message with an @mention. allowFrom with only your user ID is what stops anyone else in the group from driving a shell-capable agent. It's your numeric Telegram ID, kept as a quoted string as the config expects (for example, ["123456789"]).

Give the agent its instructions. This is the step that makes status, send, and restart work; the agent's behavior comes entirely from the files in its workspace. Create the workspace directory first (the agentDir must be unique per agent; the gateway creates it on first run):

mkdir -p ~/.openclaw/workspace-<name>

Then put this in ~/.openclaw/workspace-<name>/AGENTS.md, a minimal command contract:

# <your-agent-id>

You are bound to tmux pane `<PANE>`, an interactive coding-agent session.

## Hard rules
- ALL tmux operations target `<PANE>`. Never touch any other session.
- Read with `tmux capture-pane -t <PANE> -p`; write with `tmux send-keys -t <PANE> ...`.
- Strip ANSI codes before relaying pane output to Telegram.
- After send-keys, wait a few seconds before re-capturing; replies aren't instant.
- Confirm before any destructive action EXCEPT the explicit "restart" command below.

## Common phrasings → actions
| User says | You do |
|---|---|
| "status" / "what's in tmux?" | capture `<PANE>`, strip ANSI, summarize the last ~60 lines |
| "send `<msg>`" | `send-keys -t <PANE> -l -- "<msg>"`, then Enter, wait, capture |
| "compact" / "new session" | send `/compact` or `/new` to the pane |
| "interrupt" / "stop it" | confirm, then send `C-c` |
| "restart" | run the restart sequence below (no confirmation) |

## Decision / option routing
You are a relay, not the owner of the work in the pane. If your previous reply
summarized options/questions from the agent (e.g. "A/B", "yes/no", "Proceed?"),
then short replies like `A`, `B`, `yes`, `no`, `do it`, `sorry A` are answers
**for the pane**: forward them verbatim; do not act on them yourself. Only act
locally when explicitly addressed ("you do option A").

## Restart sequence (no confirmation)
1. Resolve the exact session id first (do not blindly "continue", which can reopen the wrong session).
2. Exit the agent's UI cleanly and wait until you actually see a shell prompt.
3. Relaunch with EXACTLY this command, resuming that session id: `<your-launch-command> --resume <session_id>`
4. Capture and report whether it came back up.

## Safety rails (applied to anything you relay)
- Production: strict read-only. Never relay mutations.
- Never relay pushes/merges to shared branches.
- Shared infra (gateways, API gateways): never mutate without explicit human approval.

Replace <PANE> and the restart command with your exact values; leave them vague and the agent will improvise and can lose your session. This single file is your agent; the workspace can contain just AGENTS.md to start.

Required: validate before you trust the save. An invalid openclaw.json is dangerous: on a restart the gateway rejects it, auto-restores the last-known-good, and the watch process exits (that is, an outage). Editing a running gateway is safer (a bad edit is reverted with no downtime), but never restart on an unvalidated config. Every time:

# 1. JSON is parseable
python3 -c "import json; json.load(open('$HOME/.openclaw/openclaw.json')); print('JSON OK')"

# 2. Dry-run the config against a temp copy (never touches the live gateway).
#    The copy holds your bot token; keep it 0600 and delete it after.
cp ~/.openclaw/openclaw.json /tmp/oc-check.json && chmod 600 /tmp/oc-check.json
OPENCLAW_CONFIG_PATH=/tmp/oc-check.json pnpm openclaw doctor --non-interactive   # expect Errors: 0
rm -f /tmp/oc-check.json

# 3. Confirm the hot reload landed
grep -a 'config hot reload applied' <your-log-path> | tail -3


Readiness gate

You are not done when the config saves. You're done when you have evidence the whole path works. Verify all five; this is exactly what you'll confirm to the session organizer:

  1. The bot replies in the topic. Type status in your topic; you get a response (not silence).
  2. A prompt reaches the pane. Send a real instruction, then check the pane received it:
   tmux capture-pane -t <PANE> -p | tail -n 40

You should see your text injected into the coding agent.

  1. The pane actually moved: concretely, the coding agent picked up the prompt and started a turn (you see it thinking/streaming, or a new command running), not just your text sitting at an input line.
  2. Routing is correct. A session/log artifact proves your agent handled your topic:
   ls -t ~/.openclaw/agents/<name>/sessions/*topic-<TOPIC_THREAD_ID>* 2>/dev/null

  1. It's locked down. Final config shows groupPolicy: "allowlist", your ID in allowFrom, and requireMention: false; you're no longer in open mode from Phase 1.

If all five hold, you're ready for the session. Capture a redacted screenshot/log snippet of #1–#2 as your "I'm ready" artifact, and redact the log excerpt too (it carries chat IDs, thread IDs, your user ID, and message text), not just the screenshot.

If it breaks

Recovery first. If a restart took the gateway down, your edit wasn't lost; the gateway auto-restored the last-known-good and saved your version alongside it. Recover from ~/.openclaw/openclaw.json.clobbered.* (also check .last-good / .bak), fix the cause, validate (above), then restart:

nvm use 24.11.1
tmux kill-session -t openclaw-gateway-watch-main
cd ~/repos/openclaw && pnpm gateway:watch
grep -a 'gateway ready' <your-log-path> | tail -1

Symptom Cause Fix
Bot silent; log shows "reason":"not-allowed" Group not configured, or you're not in allowFrom Add the group; put your numeric ID in allowFrom (or use open while testing)
Bot only replies when @mentioned requireMention defaulting to true Set requireMention: false
Bot doesn't see messages at all Telegram privacy mode on a non-admin bot Make the bot a group admin
Topic IDs never appear in the log Messages blocked before topic resolution Open the group (Phase 1) first, then re-send
getUpdates 409 Conflict Same bot token polled by two gateways One gateway per token; kill the duplicate poller
Config edit "vanished" / gateway down after restart Invalid JSON at startup → auto-restore → watch exits Recover from .clobbered.*; validate; restart
Agent replies but the pane does nothing Wrong <PANE>, or the coding agent isn't running there Fix the pane target; relaunch the agent in that pane

Secrets

This is a public-internet bot with shell reach. Treat it that way:

  • The bot token lives in openclaw.json. chmod 600 it, never commit it, never screenshot it. If a token leaks, rotate it via @BotFather.
  • Keep the group private: just you and the bot. The owner-only allowlist is the gate; anyone you add to the group still can't drive the bot unless their ID is in allowFrom.
  • When you blog/screenshot/share: redact bot handles, chat IDs, your user ID, hostnames, and paths, including log excerpts, which carry all of those plus raw message text.
  • Credentials (cloud, registry) are an ops-agent concern, not this relay's. Never paste secrets into this topic, and never let an agent echo or relay them.

Out of scope (deliberately deferred)

You do not need any of this to finish the readiness gate; it all comes in Part 4 / the session:

  • Per-topic semantic memory and any native embedding build
  • Progress/completion notification daemons
  • Tool servers (MCP) for the agent
  • Loadable skills
  • The fast deterministic intent router (your AGENTS.md already handles status/send/restart/option replies prompt-driven; the router just makes it faster and stricter)
  • The ops agent (box-wide shell). One relay + one pane is the whole assignment.

Before the session

24 hours out, confirm you can tick all five readiness items and post your redacted "ready" artifact. If you're blocked, send your symptom plus your Node/pnpm versions and the last few gateway log lines (redacted) so it can be sorted before we're all in the room.

Part 3 is the operating contract: what to type, what not to type, and how to supervise the agent safely once it's answering you.