The hourly scheduler fires at 2:14 a.m. From a thread in a private Slack workspace, an internal cron job picks one of three AI agents — each running on its own Linux host, each with its own Slack identity — and sends it a single instruction: continue the work. The agent reads the active project's state, runs whichever tools it needs to make one bounded slice of forward progress, and posts both the prompt and the full result back to the operator's Slack DM. Nine minutes later, the agent finishes a working migration script. It writes a paragraph explaining what it did, then signs off. The operator's phone is dark. The scheduler queues the next slice for 3:14 a.m.
That sequence is not a thought experiment. It is the day-to-day operational pattern of an internal system that ITECS Founder Brian Desmot built to turn Slack into the command surface for autonomous coding work — a system where the same chat application the team already uses for human collaboration becomes the dispatcher, log stream, status board, and approval queue for a small fleet of AI coding agents. This article walks through the architecture, the design decisions behind it, and what it suggests about how mid-market and enterprise teams will operate AI coding agents over the next two years.
✓ Key Takeaways
- ITECS operates three production AI coding agents — one running Anthropic's Claude Code, two running OpenAI's Codex CLI — each with its own Slack identity and dedicated Linux host.
- Operators dispatch work via Slack mention, DM, or slash command. Each agent executes shell commands or coding tasks on its host and posts results inline.
- An internal hourly scheduler sends a "continue the work" instruction to one of the agents, autonomously completing a bounded slice of the active project and posting the full transcript to the operator's DM.
- The system's safety pattern is a blocker phrase trigger: if an agent's report contains language like "Attention required" or "needs review," the scheduler disables itself, posts a notification explaining what is blocked, and waits for the operator to resume with a single Slack command.
- Because the dispatcher is a thin layer over whichever CLI is installed on the host, the same architecture works interchangeably with Claude Code or Codex CLI — a deliberate hedge against vendor lock-in in a fast-moving model market.
Why Slack Is the Right Operating Surface
The default place to host an autonomous AI coding agent is a tab in a browser, a panel in an IDE, or a dedicated agent dashboard. Each of those choices has the same fundamental weakness: they are surfaces the operator has to remember to visit. They are out of band from the rest of the team's day. They produce another inbox, another notification stream, another place where context lives.
Slack — for any team that already runs on it — is the opposite. It is where humans already coordinate, where engineers already paste logs and ask questions, where on-call already fires alerts. Putting the AI agent into the same surface as the rest of the workflow does three useful things at once. It removes the cognitive cost of "going somewhere else" to talk to the agent. It makes the agent visible to the rest of the team — every dispatch, every result, every blocker is naturally auditable in the same channels the team already reads. And it lets the agent inherit Slack's existing primitives: identities, threads, DMs, channels, permissions, and the history that comes with all of them.
The ITECS implementation leans into all three. Each agent has a real Slack identity with its own name, avatar, and DM history. Operators can mention an agent in a channel, DM it directly, or fire a slash command from anywhere — including a phone, away from a workstation. The agent's responses appear inline as Slack messages, with code blocks formatted natively, and stay in the conversation history as a record of what was asked and what was done. There is no separate UI to learn and no separate place to look.
The broader Slack ecosystem is moving in the same direction. Salesforce has positioned Slack as the conversational interface where people, data, apps, and AI agents come together [Slack], with leading model labs — OpenAI, Anthropic, Google, Perplexity, Vercel, Cursor — building agent experiences directly on the platform. The ITECS system is an internally-built version of the same architectural bet: chat as the operating surface, agents as first-class participants.
The Architecture: Three Agents, Three Hosts, Three Dispatchers
The system runs three production agents today. One uses Anthropic's Claude Code, the agentic coding tool that lives in the terminal and reads, edits, and executes code through natural-language commands [Anthropic]. Two use OpenAI's Codex CLI, the open-source coding agent built in Rust that runs locally and works against GPT-5.x family models [OpenAI]. Each agent is hosted on a dedicated Linux server. Each agent has its own Slack identity. Each agent runs its own dispatcher — a thin Python service that listens for Slack events, executes commands on the host, and posts results back into the conversation.
ITECS Slack-to-Agent Architecture
Operator Surface — Slack Workspace
@mention
In any channel
Direct Message
1:1 with agent
Slash Command
Anywhere in Slack
↓
Per-Agent Dispatcher Layer (Linux host)
Agent A
Claude Code CLI
Agent B
Codex CLI
Agent C
Codex CLI
↓
Execution Layer — Per-Host Shell + Project Workspace
Shell commands
git, build, test, deploy
Coding tasks
Read, edit, refactor, generate
Figure: Each agent has its own identity, host, and dispatcher — Slack is the shared operating surface.
Three agents, three hosts, one shared chat surface. Each agent has an isolated execution environment; Slack is the place all of them report into.
The choice to give each agent its own host matters more than it sounds. Coding agents are not abstract entities — they are processes that need access to git checkouts, package caches, build toolchains, and credentials. Running each agent on a dedicated machine produces three operationally important properties. Each agent has an isolated execution environment, so a runaway script on Agent A cannot interfere with work in progress on Agent B or C. Each agent can hold its own version of toolchains, dependencies, and project state — useful when you need one agent on a stable Node version and another on a bleeding-edge build. And each host can be sized, restarted, or reimaged independently, making the fleet trivial to scale or recover.
The dispatcher itself is intentionally thin. It exists to translate Slack events into shell commands and shell output back into Slack messages. It does not contain agent logic. It does not embed model calls. It does not maintain its own conversational state beyond what is needed to forward a message into the agent's CLI and stream the response back out. The agent's "intelligence" lives entirely in whichever CLI is installed on the host. This is the design choice that makes the system CLI-agnostic — and the one that makes the most strategic sense in today's model market.
How Operators Actually Use It
Three interaction patterns cover almost all real usage.
1. Mention an agent in a channel
Mentioning the agent inside a channel context — for example, a project channel where the team is already discussing a migration — turns the agent into a participant in the conversation. The team can ask it to summarize the current state of a branch, run a build, search for a function across the codebase, or kick off a longer task. Because the agent's responses appear inline, the entire team sees the reasoning and the outputs in the same place they are already discussing the work.
2. Direct message an agent
For more focused work, operators DM the agent directly. The DM becomes a private workspace where they can iterate on a task, ask for clarifications, request rewrites, or simply talk through a problem. The DM history is the operator's own audit log of what they asked, what the agent did, and what the result was — searchable in Slack like any other thread.
3. Fire a slash command
Slash commands are the fastest path. From any channel, any DM, or even on a phone, an operator can type a slash command — for example, to dispatch a one-line instruction to a specific agent — and the agent executes the work on its host. This pattern is particularly useful for short tasks ("run the test suite," "deploy the staging branch," "show me the last 50 lines of the API log") where the operator does not need a conversation, just a fast result.
Why three patterns matter:
Different task shapes need different surfaces. Mentions are for collaborative work where the team should see the agent's output. DMs are for focused iteration. Slash commands are for fast, scriptable, single-shot operations. The ITECS system supports all three because real engineering work moves between them constantly — and forcing one interaction model would slow every other one down.
The Hourly Scheduler: Continue the Work
The most distinctive part of the system is not the interactive surface. It is the autonomous one. An internal cron job runs once an hour. When it fires, it dispatches a single instruction — continue the work — to one of the agents on a chosen project. The agent reads the project's current state, identifies the next bounded slice of work, executes it, and posts both the prompt it received and the full transcript of what it did into the operator's Slack DM. The operator's phone may light up with a notification. Or, if they have it set to do-not-disturb, they can read the result the next time they open Slack.
The design intention behind this loop is precise. Coding agents are most valuable when they can make incremental forward progress on real projects without requiring a human to sit in front of them. A cron-driven "continue the work" instruction lets an in-progress project advance through bounded slices — one slice per hour — while the operator does anything else. Over the course of a workday, that produces eight to ten autonomous slices of forward progress per active project. Over a week, dozens.
The hourly scheduler runs unattended through the night — agents make bounded forward progress while operators sleep, with full transcripts waiting in Slack the next morning.
This pattern aligns directly with where Anthropic and OpenAI are pushing the frontier of agentic coding. Anthropic's Claude Code now ships an auto mode for multi-step development workflows with reduced manual intervention, layered with input filtering, action evaluation, and human approval checkpoints for sensitive operations [InfoQ]. OpenAI's Codex CLI is built for agentic terminal sessions and is now used by roughly four million weekly active developers, with subagents that parallelize complex tasks [OpenAI Developers]. The ITECS scheduler is an internal expression of the same architectural pattern: let the agent run; let it make progress; let it pause when it should.
The Blocker Mechanic — A Safety Pattern That Actually Works
An autonomous scheduler that runs every hour, on real projects, on real production servers, sounds dangerous on its face. It is not — because of one specific, deliberate piece of the design.
When the agent finishes a slice of work, it posts a structured report back to Slack. The scheduler scans that report for a small set of blocker phrases — language like "Attention required," "needs review," "blocked," and a handful of others. If any of those phrases appear, the scheduler does three things, in order. It disables itself, so no further hourly slices will fire. It posts a clear notification to the operator's DM explaining what is blocked, what the agent reported, and what the next-step decision needs to be. And it waits — quietly, indefinitely — until the operator resolves the issue and resumes the loop with a single Slack command.
Cron fires the hourly instruction
A scheduled job dispatches "continue the work" to the chosen agent on the active project.
Agent completes a bounded slice
The agent reads project state, runs the next sensible slice of work, and writes a structured report.
Report posted to operator DM
Both the prompt and the full transcript appear in Slack — searchable, auditable, time-stamped.
Scheduler scans for blocker phrases
If "Attention required," "needs review," or similar language appears, the loop pauses immediately.
Operator resolves and resumes
A single Slack command unblocks the loop after the operator confirms the issue is handled.
This is a state-managed interruption — the same architectural pattern recommended for agentic AI systems generally [Permit.io]. When an agent's pipeline is intentionally halted, its variables, context, and planned next actions are preserved while it waits for an external trigger. The ITECS implementation is deliberately simple: the trigger is a Slack command, the state is the project workspace on the host, and the gate is a phrase check. Simple is the point. A complex gate is a gate that fails silently. A phrase check fails loudly: if the agent says "needs review," everything stops and the operator gets a clear DM.
This pattern is what allows the loop to run unattended at 2:14 a.m. without producing the kind of incident that ends up on the front of an internal post-mortem. The agent is allowed to proceed only when its own self-report indicates the slice was complete, clean, and safe. The moment its self-report says otherwise, a human is in the loop again — without the operator having to remember to check.
"Autonomy is not 'no review.' Autonomy is 'review only when it matters.' The blocker pattern is what turns an hourly cron job into a safe operating posture instead of a liability."
— Brian Desmot, Founder, ITECS
CLI-Agnostic by Design: Claude or Codex, Interchangeably
The fact that the same architecture supports both Anthropic's Claude Code and OpenAI's Codex CLI without modification is not an implementation detail — it is the strategic point of the design.
The dispatcher does not know or care which model is running underneath. It receives a Slack event, forwards an instruction into whichever CLI is installed on the host, captures the output, and posts it back. Replacing one CLI with another — or adding a third — is a host-level change, not an architectural one. New agents come online by provisioning a new Linux host, installing the desired CLI, and registering a new Slack identity with the dispatcher. The blocker logic, the scheduler, the slash commands, and the operator interface stay identical.
| Capability | Claude Code | Codex CLI |
|---|---|---|
| Vendor | Anthropic | OpenAI |
| Underlying model family | Claude (Opus / Sonnet / Haiku) | GPT-5.x family (incl. Codex variants) |
| Surface | Terminal, IDE, browser, desktop | Terminal (Rust-based) |
| Strengths in this fleet | Long-form reasoning, complex multi-file refactors | Fast iteration loops, MCP tool integration, parallel subagents |
| ITECS deployment | 1 dedicated host | 2 dedicated hosts |
The mix is deliberate. The two CLIs have meaningfully different operating characteristics today. Claude Code is the more mature option for long, multi-file tasks where deep context-holding matters. Codex CLI is faster, leaner, and pairs well with the Model Context Protocol (MCP) for tool-rich workflows. By running both side by side on the same dispatch infrastructure, ITECS can route work to whichever agent is best suited for it on a given day — without paying the integration cost of running two completely different systems.
The strategic logic is straightforward. The frontier model market is moving fast. Capabilities that lead the field this quarter may not lead it next quarter. A dispatcher that is bound to a single CLI is a system whose performance ceiling is the performance ceiling of that vendor. A dispatcher that is CLI-agnostic is a system whose ceiling is the best of whichever CLIs are installed on the fleet at any given moment. That is a much better long-term position to operate from.
What This Pattern Means for ITECS Clients
This system is not a product ITECS sells. It is internal infrastructure that ITECS engineers use to do client work faster, with better records, and under better safety properties than a single-developer-and-an-IDE configuration could ever provide. But the pattern itself is highly relevant to clients of ITECS AI consulting and strategy — and to readers exploring the firm's AI-only practice at ITECS.ai consulting — particularly any organization considering how to operationalize agentic AI inside its own engineering, IT, or operations function.
Three lessons from the ITECS implementation translate directly to client environments. First, chat is the right operational surface for AI agents inside any team that already lives in Slack, Teams, or a similar platform. The cost of building a separate UI is rarely worth the friction of forcing operators to use it. Meeting the team where the team already works produces dramatically higher adoption and dramatically better visibility. Second, per-agent isolation matters. Giving each agent its own host, identity, and credentials produces clean blast-radius properties — a misbehaving agent on one host cannot corrupt the others, and audit trails are clean by construction. Third, and most importantly, the safety pattern is the autonomy pattern. The ability to let an agent run unattended for hours is entirely a function of having a clear, simple, deterministic mechanism for the agent to signal "I need a human" — and for the system to respond by stopping rather than pushing through.
For clients of ITECS as a Managed Intelligence Provider, this is the operating model that ITECS brings to AI engagements: agentic systems built on top of the surfaces clients already use, isolated for safety, and engineered with explicit blocker patterns rather than implicit "we'll watch it" hand-waving. The same logic applies whether the agent is writing code, drafting compliance documentation, triaging tickets, or summarizing security telemetry. The operating surface, the isolation model, and the safety pattern do not change.
The Broader Trend: Agentic Productivity Is Moving Fast
What ITECS built internally reflects a much larger industry shift. McKinsey's research on AI in software development finds that the highest-performing AI-driven engineering organizations are seeing 16–30 percent improvements in team productivity and 31–45 percent improvements in software quality, with more than 90 percent of surveyed software teams now using AI for core engineering tasks like refactoring, modernization, and testing — saving an average of six hours per developer per week [McKinsey]. One large financial services firm McKinsey profiled has implemented an agent-driven greenfield payment system and is improving productivity by 40–70 percent.
90%+
Of software teams use AI for core engineering tasks
6 hrs
Average weekly time saved per developer using AI tools
40–70%
Productivity gain on agent-driven greenfield projects
Source: McKinsey, AI in Software Development research
The Slack-side of the same trend is just as visible. Salesforce reports that some employees at customer organizations are saving up to 90 minutes per day with the latest generation of Slack-native AI features, with the new agentic Slackbot positioned to become the fastest-adopted product in Salesforce's 27-year history [Slack]. Slack's own platform updates — the Real-Time Search API, the Slack MCP server, and the explicit goal of treating Slack as the surface where humans, data, apps, and AI agents converge — make it clear that chat-as-operating-surface is not an idiosyncratic ITECS choice. It is where the broader ecosystem is heading.
The interesting question for any technology leader is not whether their team will operate AI agents from inside chat tools by 2027. It is how thoughtfully their team will design the architecture that makes that operation safe, productive, and reversible. The ITECS implementation is one answer to that question — built and battle-tested on real client work, with all three of the design properties most internal teams skip: identity isolation, deliberate safety gates, and CLI-agnostic plumbing.
Building Toward Production-Grade AI Operations
The hardest thing about deploying AI agents is not getting them to do something useful in a demo. It is getting them to keep doing useful work, on real projects, without producing the kinds of failures that make a CTO ban them by mid-quarter. The ITECS Slack-to-agent system is a small case study in how that production posture is actually built — chat surface, isolated hosts, autonomous loop, explicit blocker pattern, vendor-agnostic plumbing.
None of those design choices are exotic. They are the kind of decisions that compound. Each one looks small on its own and collectively defines whether an organization can run AI agents as part of normal operations or whether agents stay stuck in pilot purgatory. ITECS has invested in this pattern internally because the same investments translate directly into how the firm helps its clients deploy AI consulting and strategy programs and how it operates as a Managed Intelligence Provider: the operating model has to come first, and the model choice has to come second.
Considering an autonomous AI agent program of your own?
ITECS designs and operates AI agent systems built on the surfaces your team already uses — with explicit safety patterns and vendor-agnostic plumbing. Talk to our AI consulting team about scoping the right architecture for your environment.
Talk to ITECS AI Consulting →Looking for the AI-only resource hub? Visit ITECS.ai — our sister site for AI consulting, custom agents, and adoption playbooks.
Sources
- Anthropic — Claude Code, agentic coding system
- InfoQ — Inside Claude Code Auto Mode: Anthropic's Autonomous Coding System with Human Approval Gates
- OpenAI — Codex CLI: Lightweight coding agent that runs in your terminal
- OpenAI Developers — Codex CLI documentation
- Slack — How Slack's new platform is fueling the agentic era
- Permit.io — Human-in-the-Loop for AI Agents: Best Practices and Frameworks
- McKinsey — The AI Revolution in Software Development
