v2.8.12 — agentic coding harness · subscription-backed coding agents · master daemon

An agentic coding harness for the coding agents you already pay for.

A master daemon for your Claude Code / Codex dev team — no API tokens, no SaaS. Spawn parallel coding agents in tmux on the healthiest of your subscription accounts, watch every pane on a 2 Hz camera grid, gate every claim with a runtime verifier, and talk to it from the dashboard, Telegram, the CLI, or any /mcp client. Your laptop closes. The work keeps shipping.

$curl -fsSL https://subctl.com/install | bash
★ GitHub
1 master daemonN parallel coding agents in tmuxtiered memory · verifier · watchdogMCP server · 14 tools · bearer authMIT · no telemetry · no SaaS
50+tools on the master
13dashboard tabs
5memory tiers · profile → vault
14MCP tools · /mcp + /.well-known/mcp
MITopen source, no upsell
first-party ROI · this month

$25,912.95 saved this month by running coding agents on subscriptions instead of API keys.

Operator setup: 5 paid coding-agent accounts — 3 Claude Max + 2 OpenAI Codex. The harness drives them via the official claude and codex CLIs. Same work, OAuth instead of metered API.
$25,912.95
saved · 30-day window
equivalent API spend$26,512.95
subscription spend (3 Max + 2 Codex)− $600.00
saved$25,912.95
“Six paid coding agents in parallel” is the feature. This number is the result. The dispatcher picks the greenest of your subscription accounts at spawn time; the master daemon keeps every pane productive; the verifier + watchdog stop the wasted-cycles failure modes that ate your time when you ran the same setup by hand.
Before subctl

You've already solved these problems. Three times. Badly.

subctl consolidates the tribal knowledge you accumulated running parallel coding agents into one persistent coding harness.
— overnight

"My coding agents work overnight. I have no idea what they're doing."

Long-running coding agents disappear into tmux. You leave the room, miss the prompt, come back to find a Claude Code blocked on a yes/no question for six hours. No camera. No memory. No supervision.

— after /clear

"Every new session, I'm introducing myself again."

Context evaporates at compaction. Skills documents help, but you still re-explain the project, the constraints, the naming-conventions, the in-flight roadmap. Tiered memory — profile facts always injected, curated recall hydrated at turn start — fixes this across /clear and across machines.

— 2:00 PM

"I hit my rate limit and lost the rest of the day."

Anthropic's 5-hour and weekly windows aren't visible until you're already blocked. The subctl dispatcher routes new coding work to the greenest of your subscription accounts and runs the supervisor on local LM Studio so it never eats your weekly cap.

what only subctl does

Three things no other coding harness gives you.

Not another agent framework that burns API tokens. A master daemon that drives the Claude Code and Codex CLIs you already have — and adds the three pieces nothing else does.
01 · SUBSCRIPTIONS

Drives the coding agents you already pay for

No API tokens. No reimplementation. subctl shells out to your installed claude and codex CLIs and lets them drive their own OAuth into sandboxed per-account config dirs. If you already pay for Claude Pro / Max and ChatGPT Pro, subctl is free leverage on what you already bought.

“subctl is the control plane for OAuth-via-subscription, not API-key auth.”
— providers/openai/auth.sh:6 (subctl source)
02 · VERIFIER

Runtime claim verifier

Every assistant turn is gated by verifier.ts— five rules that catch unbacked check-in promises, fake team-status claims, host facts, send-message claims, and decision-logged claims. When a coding agent says "I'll check in 15 min" without scheduling it, subctl re-prompts the model the same turn. Gaps land in decisions.jsonl. Nothing in Cursor or raw Claude Code does this.

03 · PARALLEL

Parallel coding agents, first-class

NVR-style 2 Hz camera grid over every coding-agent tmux pane. Name-addressed dispatch from CLI, HTTP, master tool, MCP client, or Telegram. A team-staleness watchdog runs on a 30 min cadence with a 15 min staleness threshold; a separate idle-pane watchdog ticks every 30 s and is notify-only by default. An account-aware dispatcher picks the greenest of your paid accounts at spawn time. Six paid coding agents in parallel — and you see all six at once.

127.0.0.1:8787 — chat + camera

One control plane. Every coding agent. Live.

A persistent Bun service reads filesystem state directly and broadcasts updates over SSE. Make it your new-tab page.
🔒 http://127.0.0.1:8787/
sse · master ● · idle · watchdog armed
subctl dashboard — multi-account dispatcher showing rate-limit headroom across 5 OAuth accounts, active tmux sessions, and dev-team status

live capture · 127.0.0.1:8787 · Dashboard tab

subctl orchestration cockpit — master daemon panel, watchdog state, live activity stream, and camera grid tiles
Orchestration · master daemon + watchdog + camera grid
subctl Claude Sessions browser — cross-account search across 13 sessions on 4 accounts with per-row preview text and resume actions
Claude Sessions · cross-account search & resume
What's in the harness

Ten things subctl does to keep parallel coding agents productive.

Master daemon + worker teams + tiered memory + verifier + watchdog + dispatcher + MCP server. One Bun process, one tmux server, N coding agents on the provider accounts you already pay for.
01 · MASTER DAEMON

Persistent under launchd

subctl master runs as a launchd daemon on your machine. The supervisor talks to a local LM Studio model by default (qwen, gpt-oss) — so it never eats your Claude Pro / Max weekly window. Cloud is escalation only. Always-on. Survives laptop close. Answers from dashboard chat, Telegram, CLI, MCP, or scheduled self-prompts.

$subctl master prompt "spawn coding agents on foothold-v3 and billing in parallel"
→ master: picked claude-jason + claude-personal · spawned 2 coding agents
→ scheduler: follow-up at 20:00 · watchdog 15m
reply on dashboard chat, Telegram, CLI, or MCP — same conversation
02 · WORKERS / TEAMS

Parallel Claude Codes & Codexes in tmux

The master picks the healthiest provider account you already pay for and spawns a real coding agent in tmux against your repo. The baseline subctl, autonomy, and orchestrator-mode skills are symlinked into every config dir — every worker boots with doctrine baked in.

03 · MEMORY (TIERED)

Tiered memory, persistent across sessions

Five layers, named by what they do. Profile: always-injected operator facts (~3.5k char budget). Observation: raw turn-by-turn capture with FTS recall. Curated: hydrated into the supervisor prompt at turn start; survives /clear. Graph: multi-hop reasoning over your operator history. Vault: long-form decisions, specs, and RESUME files rendered in-page with wikilinks and embeds.

profile: [memory.md] 1.6k · [user.md] 1.2k · [budget] 2.8k / 3.5k
curated: hydrated at turn start · 60s cache · longest-first truncation
vault: 412 notes · 38 canvases · last edit 11m
04 · VERIFIER

Runtime claim verifier

After every assistant turn the runtime scans for claim triggers — future check-in times, asserted team statuses, sent messages, decision-logged claims. Anything not backed by a tool call this turn fires a synthetic [verifier] correction prompt. Capped at 2 corrections; on giveup the gap lands in decisions.jsonl.

[verifier] master asserted "I'll check in 15 minutes" but did not call schedule_followup. Correcting...
schedule_followup(at=20:00, topic="foothold-v3 status") — backed
05 · TOOLS

The tools you'd write to babysit parallel coding agents.

50+ master tools across 13 families — spawn / message / kill coding agents, read transcripts, schedule follow-ups, write to memory and the vault, capture pane screenshots, run radar, send to Telegram, ask yes/no, attach documents, swap personality. Every tool call is logged to decisions.jsonl with rationale.

tools.spawn_teamtools.msg_teamtools.kill_teamtools.read_panetools.screenshot_panetools.schedule_followuptools.write_memorytools.read_attachmenttools.vault_writetools.vault_searchtools.memory_searchtools.telegram_sendtools.ask_yesnotools.ask_choicetools.radartools.doctortools.personality_settools.version_bump
06 · PERSONALITY

Hot-swap voice. Same persona contract.

Seven presets out of the box — straight-shooter, witty, sarcastic, robotic, arnold, elon, hilarious. Adjusts tone without touching the master's contract or tool-use protocol. CLI + dashboard tile + Telegram command.

$ subctl master personality set sarcastic
hot-reloaded into system prompt · next reply uses new voice
07 · CAMERA

NVR-style grid over every parallel coding agent

Every active coding-agent tmux pane shown as a live tile, polling at 2 Hz. Click a tile to expand to a full pane with the last 500 lines. No coding agent works in the dark, no daemonized work you can't see.

[02:41] tile grid · 3 tiles · 2 Hz refresh
Foothold-v3 · editing tools/spawn.ts
marketing-site · waiting on user reply
eval-loop · stale 23m · watchdog fired
08 · WATCHDOG

Two-watchdog supervision

The team-staleness watchdog runs on a 30 min cadence with a 15 min staleness threshold; on detection it nudges via HMAC-signed directive, holds 30 min, then escalates. The idle-pane watchdog ticks every 30 s and is notify-only by default. Auto-compact runs every 5 min, compacting the transcript when it crosses 90% of context.

09 · CHANNELS

One conversation, many surfaces

Dashboard chat (SSE), Telegram (bidirectional with auto-relay), CLI prompt, the MCP server at /mcp, scheduled self-prompts, inbox events from worker teams. All routed through the same supervisor loop.

10 · YOURS

Zero telemetry. Zero SaaS.

Bound to 127.0.0.1:8787. No phone-home. No account creation. Your bot token, your inbox, your vault, your data, your machine. ./uninstall.sh restores everything it touched.

cli

Type subctl. Pick from a menu. No flags to learn.

Each line shows live state on the right — repainted from filesystem state on entry. Nothing stale.
subctl 2026-05-20 19:42 Agentic Harness 1. Master daemon ● running · LM Studio · qwen3-coder-30b 2. Worker teams (orchestration) 3 active · 1 stale (watchdog fired) 3. Provider accounts 3 claude · 2 codex · 0 gemini 4. Sessions (radar) ⚡ 4 active · ⚠ 0 RL today 5. Memory (tiered) profile · observation · curated · graph · vault 6. Vault 412 notes · 38 canvases 7. Web service / dashboard ● running on :8787 8. MCP server ● /mcp · 14 tools 9. Settings & config a. Doctor / health check b. Logs ─ c. About q. Quit ↑↓ navigate · enter select · q quit · ? help
architecture

One master daemon. N parallel coding agents. One shared repo.

Four input channels feed one persistent supervisor loop. The master spawns and supervises worker teams in tmux — never the other way around. A worker can never accidentally spawn its own supervisor.
channel · dashboardDashboard chatSSE → master loop
channel · phoneTelegram botbidirectional · auto-relay
channel · mcpMCP server/mcp · 14 tools · bearer
subctl master  persistent Bun daemon · supervisor loop · verifier · watchdog · scheduler · dispatcherLM Studio first · cloud on escalation · launchd-managed
worker teams · parallel tmux sessions
claude-foothold-v3 · claude-marketing-site · codex-eval-loop
provider accounts · ~/.claude-<alias>/
per-subscription isolation · baseline skills symlinked
tiered memory + Obsidian vault
profile · observation · curated · graph · vault
built for

Three workflows. Same coding harness.

Solo developer

Your coding agents do the work. You answer the questions.

Master spawns the right coding agent on the right Claude Code or Codex account, watches it, escalates a yes/no question to your phone when it needs you, and resumes when you tap. The transcript and decision log survive every /clear and compaction.

Agent operator

Seven parallel coding agents. One supervisor. No babysitting.

The verifier catches unbacked promises. The watchdog catches silent panes and prunes dead ones. The auto-compact catches context bloat. You watch the camera grid and intervene on demand — the harness handles the rest.

MSP / agency

One Claude Code per client. Zero credential mixing.

Each client gets a coding agent on a dedicated Claude Code account, with its own vault folder, its own RESUME file, and its own decision log. All driven from one master with one phone-as-pager.

quick start

Three commands. Five minutes. Done.

LM Studio + Telegram are optional and prompted later. The master daemon, dashboard, multi-account, orchestration, and MCP server all work without them.
— STEP 01

Install

$ git clone https://github.com/
   webdevtodayjason/subctl.git
$cd subctl && bash install.sh

Symlinks bin/subctl into PATH, wires the Claude statusline + Stop hook, symlinks baseline skills, drops launchd plists for master + dashboard, mints an MCP bearer token.

— STEP 02

Bring up the master

$ subctl auth claude personal
$ subctl master enable
$ subctl install

One-time browser login per account. Master comes up under launchd. Dashboard service is installed alongside.

— STEP 03

Talk to it

$ open http://127.0.0.1:8787
$subctl master prompt "hello"
→ master: hello — what are we shipping?

Open the dashboard chat or talk from the CLI. Same conversation, same memory. Pair the Telegram bot for phone access, or point Claude Desktop at /mcp.

changelog

v1.x was the multi-account dispatch substrate. v2.x is the agentic coding harness on top.

v1.x was multi-account dispatch + radar — the plumbing for running paid coding-agent subscriptions on one machine. v2.x is the master daemon, tiered memory, the verifier, the two watchdogs, the personality system, the voice layer, and the MCP server layered on top. Latest tag: v2.8.0 → v2.8.12.
v2.0

Master daemon + memory

phase 3a–3j · 50+ tools● shipping
v2.2

Personality presets

phase 3k · 7 voices● shipping
v2.3

Multi-team camera view

phase 3m · NVR grid● shipping
v2.4

Chat attachments

phase 3l · drag-drop● shipping
v2.5

Vault viewer in-page

phase 3n · wikilinks● shipping
v2.6

Watchdog prune + update safety

v2.6.0 → v2.6.2● shipping
v2.7

Policy engine + diag + HMAC directives + voice kickoff

v2.7.0 → v2.7.31 · gated bash · Linear/web tools · JIT compaction · HMAC trust marker · voice layer kickoff● shipping
v2.8

Voice GA + MCP server + memory kernel + WEB-216

v2.8.0 → v2.8.12 · voice layer GA · plan-approval · dynamic provider catalog · Codex OAuth · dashboard decomposition · MCP server · memory kernel · WEB-216 watchdog classifier● shipping
v2.8 headline · model context protocol

Connect Claude Desktop, ArgentOS, or any MCP client to your master daemon.

The master daemon ships a first-party MCP server at /mcp with discovery at /.well-known/mcp. 14 tools across four tiers — talk to the supervisor, read state, supervise worker teams, recall tiered memory. Bearer auth + X-Caller-Id. Multi-client coexistence by design.
endpoint
POST /mcp

Streamable HTTP transport. Per-session McpServer + transport pair — Claude Desktop, claude.ai-web, and a dev curl smoke-test can all attach at the same time without stepping on each other.

discovery
GET /.well-known/mcp

Standards-compliant discovery document so MCP clients auto-configure. Drop the URL into Claude Desktop's remote-MCP picker; the bearer token is minted by subctl install.

auth
Bearer + X-Caller-Id

Bearer authenticates the client. The X-Caller-Idheader tags each request so the master's decision log records which external client made the call.

writes
HMAC-signed directives

Write-side ops (send a message to a worker team, kill a team) flow through the same HMAC-signed directive contract the dashboard and CLI use. External clients get the same authentication discipline workers expect.

14 tools · four tiers

Talk · read · supervise · recall

tools.pingtools.state_snapshottools.notifytools.send_messagetools.recent_messagestools.recent_decisionstools.list_notificationstools.watchdog_statetools.list_teamstools.team_inboxtools.team_msgtools.team_killtools.memory_searchtools.memory_timeline

ping · state_snapshot · notify (tier 1 — protocol probes) · send_message · recent_messages · recent_decisions · list_notifications · watchdog_state (tier 2 — talk + read) · list_teams · team_inbox · team_msg · team_kill (tier 3 — supervise) · memory_search · memory_timeline (tier 4 — recall).

vs. raw Claude Code

Raw Claude Code / Codex vs. subctl coding harness.

Raw Claude / Codexsubctl harness
Persistent orchestratornone subctl master daemon
Memory across /clearskills file only tiered memory: profile / observation / curated / graph / vault
Multi-account isolationenv vars by hand automatic per-alias · dispatcher picks greenest
Worker supervisiontail tmux yourself watchdog + camera view
Claim verificationtrust the model runtime verifier
Self-schedulingyou remember schedule_followup tool
Mobile escalationnone bidirectional Telegram
MCP servernone /mcp + /.well-known/mcp · 14 tools · bearer auth
Local model firstno LM Studio default
Costyour time free, MIT
FAQ

Questions you'd ask before installing.

What does "agentic coding harness" mean, concretely?+
subctl is a master daemon — bash, Bun, tmux, launchd — that drives the Claude Code and Codex CLIs you already have installed. It spawns parallel worker teams in tmux on the healthiest of your subscription accounts, supervises them with a team-staleness watchdog (30 min cadence, 15 min threshold) and an NVR-style camera grid, gates its own claims with a runtime verifier, remembers things across /clear via tiered memory, and reaches you on dashboard chat, Telegram, CLI, or any MCP client. No API tokens, no SaaS. The v1.x multi-account dispatch substrate is still in there — v2.x just adds the persistent coding harness on top.
Can I connect Claude Desktop or another MCP client to subctl?+
Yes. The master daemon ships a first-party MCP server at /mcp with discovery at /.well-known/mcp and 14 tools across four tiers (protocol probes, talk + read, supervise worker teams, recall tiered memory). Auth is Bearer + X-Caller-Id. Multi-client coexistence is built in — each session gets its own McpServer + transport, so Claude Desktop, claude.ai-web, and a dev curl smoke-test can all attach at the same time. The bearer token is minted automatically by subctl install.
Where does the master run? Cloud or local?+
On your machine, under launchd. By default it talks to a local LM Studio model (qwen3-coder-30b is the recommended default). Cloud models are an escalation path you can wire in — they aren't required to run subctl.
Does subctl store my Anthropic / OpenAI credentials?+
No. Credentials live in each account's existing ~/.claude-<alias>/ (or ~/.codex-<alias>/) — exactly where the official CLIs put them. subctl just points the right *_CONFIG_DIR env var at the right one.
What's the runtime claim verifier and why do I want it?+
After every assistant turn the runtime scans for "claim triggers" — future check-in times, asserted team statuses, sent messages, decision-logged claims. Any claim not backed by a tool call this turn fires a synthetic [verifier]correction. It's how the master stops making unbacked promises like "I'll check in 15 minutes" without actually scheduling a follow-up. Capped at 2 corrections per turn.
Can I use this without Telegram?+
Yes. Telegram is opt-in. Dashboard chat, MCP, multi-account, orchestration, vault, memory, and the master all work without it. Pair a Telegram bot only if you want to talk to the master from your phone.
What runs in the dashboard at 127.0.0.1:8787?+
A single Bun process serving 13 tabs: Chat, Orchestration, Dashboard, Projects, Teams, Claude Sessions, Models, Providers, Memory, Vault, Skills, Live Logs, Settings. SSE for live updates. Auto-proxies /api/master/* to the master daemon. Binds to 127.0.0.1 only — SSH-tunnel for remote access.
Will it conflict with my existing Claude Code setup?+
No. Your default ~/.claude/ is treated as just another account. Existing sessions, projects, and credentials are untouched. Baseline skills are symlinked in, not copied — so updating subctl updates them.
What does it cost?+
$0. MIT license. No SaaS, no upsell, no premium tier. You bring the Claude Code and Codex subscriptions you already pay for; subctl gives them a master daemon on top. See the ROI section — first-party run-rate this month was $25,912.95 saved against an equivalent API spend, on $600 of subscriptions.
install

Stop babysitting coding agents. Start supervising them.

One command. Five minutes. The coding agents you already pay for, on one agentic coding harness.

$curl -fsSL https://subctl.com/install | bash
★ Star on GitHub
v2.8.12 · MIT · no telemetry · public source