Roadmap
This page summarizes what has shipped recently, what is known open work, and the longer-term direction for herdctl. Forward-looking items may change as the project evolves. For the full history of shipped features, see What’s New.
Recently Shipped
Section titled “Recently Shipped”The library surface has grown substantially through the @herdctl/core 5.13–5.18 releases:
- Streaming chat sessions —
FleetManager.openChatSession()returns a live multi-turnRuntimeSessionwithsend(),interrupt(),listCommands(), andsetModel()(core 5.14.0). See Sessions. - Real job cancellation —
cancelJob()actually interrupts the running agent process instead of only rewriting the job’s status file (core 5.14.1). - Session forking —
trigger('agent', undefined, { fork: sessionId })branches an existing conversation into an independent child session (core 5.15.0). - Slash command discovery —
listAgentCommands()returns an agent’s available slash commands in one call (core 5.16.0). - Claude Agent SDK 0.3 + Zod 4 — upgraded to the SDK line that runs the native Claude Code binary with the current agentic toolset (core 5.17.0).
- Session reaper and durable wakes — managed sessions are reaped when idle, and in-session
ScheduleWakeup/CronCreatetimers are captured and re-fired through the fleet scheduler, giving agents real cross-turn autonomy (core 5.18.0). - Agent distribution —
herdctl agent add <source>installs agents from GitHub repositories or local paths, withherdctl.jsonmetadata (core 5.6.0). - Persistent agent memory — the
context.mdpattern for memory that survives across jobs is documented in the Persistent Memory Guide and used by the bundled examples.
Known Open Work
Section titled “Known Open Work”Tracked in the issue tracker:
- Event gaps for manual triggers —
job:createdis emitted only after a manually triggered job finishes, andjob:outputis never emitted for manualtrigger()runs (only scheduled runs). Use theonMessage/onJobCreatedcallbacks in the meantime. #328 - Declared-but-unemitted events —
agent:startedandagent:stoppedare declared and documented but never fired. #323 denied_toolson the SDK runtime — silently ignored due to adeniedToolsvsdisallowedToolsmismatch. #322- Fleet-level chat config — accepted by the schema but unused at runtime. #329
- Default toolset — provide a first-class default/standard toolset and clarify headless
allowed_toolssemantics. #281 - Per-agent chat verbosity — verbosity control across Discord, Slack, and Web frontends. #181
- Session attribution — assign unattributed Claude Code sessions to agents. #143
- File transfer — inbound file/image transfer from Discord and Slack to agents (#59) and agent-to-Discord file sending (#55).
- MCP bridge auth — per-request bearer token authentication for the MCP HTTP bridge. #54
Longer-Term Direction
Section titled “Longer-Term Direction”These are ideas under consideration, not committed work:
- Dynamic scheduling for jobs — let scheduled agents request their own next run time via an injected MCP tool. Session-based agents already get this through durable wakes (
ScheduleWakeup); config-defined job schedules are still static. - Agent-to-agent communication — injected MCP tools for agents to delegate tasks to and share results with other agents in their fleet.
- Pluggable chat connectors — allow anyone to write their own chat integration without changes to herdctl itself, building on the shared
@herdctl/chatlayer. - Agent marketplace — a place to publish and discover reusable agent definitions, building on the shipped
herdctl agent adddistribution system.