All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Orchestrator prompt-cache fix, SDK termination edge cases, marketplace expansion, and broad workflow fixes.
- New marketplace workflow
archon-idea-to-wo: interactive 8-node workflow that turns a raw idea into BKM-format Work Orders through four AI phases with approval gates between each. Authored by @lamachine, published via the community marketplace registry (closes #1647).
maintainer-review-pr: dropped the direction/scope gate node. The gate used Pi/Minimax to return a structured JSON verdict that the DAG branched on, but Pi intermittently wrapped the JSON in markdown fences or preamble prose, silently skipping every downstream review. In practice the gate returned "review" on every hand-picked PR (13/13 runs over two days), adding no signal. Workflow now reviews all PRs directly (#1675).
- Claude
stop_sequenceterminations no longer fail as "SDK returned success": the Claude Agent SDK'sSDKResultSuccessdeclaresis_error: boolean(not literalfalse), and stop-sequence terminations carryis_error: truealongsidesubtype: 'success'— its encoding of "non-default termination, not a failure". The Claude provider now normalises this pair to a clean success at the provider boundary, with defense-in-depth guards indag-executor(main + loop branches) andorchestrator-agent(direct chat) so a third-partyIAgentProviderforwarding the raw SDK pair can't reintroduce the bug. Workflows usingoutput_format(which implies a stop sequence) — including thearchon-fix-github-issueclassify→synthesizepipeline — now complete cleanly instead of throwingNode 'X' failed: SDK returned success. Closes #1425 (#1662). - Orchestrator prompt caching restored: static system context (projects, workflows, routing rules) was embedded in the per-turn
prompt, forcing the Anthropic API to rebuild the cache prefix on every request (highcache_creation_input_tokens, zerocache_read_input_tokens). Moved intosystemPrompt.append, which extends the Claude Code preset and is part of the cacheable system prefix. Fixes #1591 (#1634). - Native Claude tools no longer stripped when
skills:is set withoutallowed_tools:: the AgentDefinition wrapper previously defaultedtoolsto['Skill']only, removing Read/Bash/Write/etc. Now omitstoolswhen not explicitly set, letting the SDK provide its full default tool set;Skillis still appended whenallowed_toolsis explicit (#1605, #1661). - SSH repo URLs from non-GitHub hosts: the SSH-to-HTTPS converter only matched
git@github.com:literally, so custom SSH host aliases, GitHub Enterprise, Gitea, GitLab, and Bitbucket SSH URLs produced workspace paths containing literalgit@<host>:segments —ENOTDIRon Windows, malformed owner extraction on Unix. Now uses a genericgit@([^:]+):(.+)regex at both call sites. Closes #1614 (#1656). $node.output.fieldfor Pi/Minimax structured output: provider-parsed fence-wrapped or preamble-prefixed JSON was captured locally but never persisted ontoNodeOutput. DownstreamsubstituteNodeOutputRefsandcondition-evaluatorconsumers thenJSON.parsed the original prose-prefixed text, threw, and resolved$node.output.fieldto empty.structuredOutputis now persisted onNodeOutput(single-shot + loop-terminal-iteration success paths) and both consumers prefer the parsed object. Closes #1571 (#1654).- Marketplace auto-review CI: workflow now triggers on
ready_for_review(was missed by defaultpull_request_targetevent list);gh pr review --approvefalls back togh pr commentwhen GitHub Actions lacks approve permission, so PR authors still receive the review even without "Allow GitHub Actions to create and approve pull requests" enabled.
Workflow marketplace, expanded setup wizard, and broad Pi/workflow engine fixes.
- Workflow marketplace v0: browse and install community workflows via
archon workflow search [query]andarchon workflow install <slug>(#1624). Includes an automated marketplace PR review-and-merge workflow that runs schema validation, security scanning, and AI review on submissions (#1638), plus avideo-genericentry as the first published workflow. archon setupoverhaul: full interactive credential and config wizard, plusarchon doctorto verify Claude binary, gh auth, DB, and adapters end-to-end (#1566). Pi is now a first-class provider option in the wizard (#1609).archon skill install: install the bundled Archon skill into.claude/skills/archonfrom the CLI without needing the source tree (#1445).- Pi/Minimax variants of the maintainer workflows:
repo-triage-minimax(#1562) joinsmaintainer-standup-minimaxfor daily triage when nested-Claude-Code sessions block the Claude variants. - Public roadmap page at
/roadmapon the docs site (#1570). - Docker:
/home/appuseris now persisted by default via thearchon_user_homenamed volume, so user-installed Claude Code skills/commands/agents/hooks, Codex/Pi auth,~/.gitconfig, and shell history survive container rebuilds. SetARCHON_USER_HOME=/host/pathin.envto bind-mount a host path instead (#1517, #1518).
- Claude provider default
settingSourceschanged from['project']to['project', 'user'], so skills, commands, agents, andCLAUDE.mdfrom~/.claude/are now loaded by default in all environments — not just Docker. Without this, the new/home/appuserpersistence would not actually surface user-installed Claude resources. Setassistants.claude.settingSources: ['project']in.archon/config.yamlto restore the previous project-only behavior (#1518). .env.example,docker-compose.yml,deploy/docker-compose.yml, andreference/configuration.mdnow document thatARCHON_HOMEis silently overridden inside Docker andARCHON_DATAis a Compose-only host token never read by source. The Docker entrypoint emits a one-line stderr warning when either is set in the container env (#1517).- Bump
honoto ^4.12.16 and@hono/node-serverto ^1.19.13 (closes #1484, #1499). - Pi provider now loads user settings files (
~/.pi/agent/auth.jsonetc.) as the session baseline (#1559).
- Resume is now explicit:
archon workflow runno longer silently auto-resumes the previous failed run for the same(workflow_name, cwd)pair. The implicitfindResumableRuncall insideexecuteWorkflowwas the cause of cross-invocation state leaks — completed-node outputs from a prior failed run would bleed into the next invocation of the same workflow at the same path. Usearchon workflow run --resume,archon workflow resume <id>, or the web UI resume button to opt in.executeWorkflow's trailing positional args are consolidated into an options bag and a newprepareResumedRun/hydrateResumableRunpair handles resume preparation at call sites. Closes #1392 (#1646). - Pi multi-chunk slash commands: Pi agent can now successfully use
/invoke-workflowand/register-projectwhen the assistant streams the command across multiple chunks. The orchestrator continues accumulating assistant text past prefix detection until the full command is parsed (#1581). - Pi concurrency + error surfacing: SDK error messages now surface to the user instead of being masked, and Pi concurrency is capped to prevent cascade failures (#1572).
- Chat hydration shows newest messages instead of oldest (#1532).
GET /api/workflows/:namenow resolves home-scoped (~/.archon/workflows/) workflows that were previously invisible to the Web UI builder (#1405).GET /api/workflowsno longer returns an empty array when nocwdquery param is provided and no codebases are registered — bundled and home-scoped workflows now surface correctly on first run, making the workflow picker functional on first launch before any project is registered (#1173).archon workflow runpropagates$ARTIFACTS_DIR,$LOG_DIR,$BASE_BRANCHto script-node subprocesses (#1640).archon-assistnow runs in the live checkout (worktree.enabled: false) — closes #1546 (#1555).- Bundled
opus[1m]implement nodes now setprovider: claudeexplicitly (#1622). - DAG executor no longer leaves zombie workflow runs behind when Pi cleanup hangs (#1563).
- Workflow runs no longer sweep scratch artifacts from
git add -Asites in the live checkout (#1506). $nodeId.outputsubstitution stringifies array/object fields as JSON (#1482).archon doctorandarchon setupno longer interleave[archon] loaded N keysboot lines and Pino info JSON with their checklist output. SetARCHON_VERBOSE_BOOT=1orLOG_LEVEL=debugto restore the boot lines; pass--verboseto re-enable structured Pino logs for those commands (#1608).archon --version,-V,-version, and lone-vare now all treated as version requests (#1444).- Docker: resolve Claude binary to the glibc variant on Debian images (#1521).
- Docker:
git config --global --add safe.directoryin the entrypoint now de-duplicates entries before adding, preventing unbounded growth of~/.gitconfignow that/home/appuseris persisted (#1518). - Docker:
setup-authnow warns at startup whenCODEX_*env vars are absent but a persisted~/.codex/auth.jsonfrom a previous run still exists, so operators don't accidentally use stale or revoked credentials (#1518). - Orchestrator creates
~/.archon/workspacesbefore spawning an AI provider (#1529). - Marketplace auto-review pipeline hardening: pin glibc Claude binary in CI and handle multi-line diff values (#1641), import
@archon/workflows/loaderby relative path (#1642), validate-schema exits 0 so decide can route invalid submissions (#1643), silence loader Pino logs (#1644), and only validate workflow-shaped YAMLs while registering providers (#1645).
Maintainer workflow suite, loop output variables, and broad workflow engine fixes
- Bundled maintainer workflow suite:
maintainer-standupfor daily PR/issue triage (#1428), contributor-reply surfacing (#1457),maintainer-review-prfor automated code review (#1430), cross-workflow review memory (#1458), and a Pi/Minimax variant of standup (#1480). $LOOP_PREV_OUTPUTsubstitution variable in loop node prompts, giving each iteration access to the cleaned output of the previous pass (#1367).mutates_checkoutflag on workflow nodes to permit concurrent runs against a live checkout without requiring worktree isolation (#1438).- Explicit
tagsfield in workflow YAML for categorization and filtering (#1190). - Pi provider
ModelRegistrysupport for custom model slugs and automatic auth bypass for unmapped providers (#1284). - Autodetection of canonical Claude and Codex binary install paths so explicit config is not required on standard installations (#1361).
- Model validation delegated entirely to provider SDKs; Archon no longer rejects unknown model strings at workflow load time, so new vendor models work immediately without an Archon update (#1463).
- Claude Agent SDK updated to 0.2.121 and Codex SDK to 0.125.0 (#1460).
- Default Opus model pin switched to the
opus[1m]alias (#1395).
- PR-creating workflows now correctly target
$BASE_BRANCHinstead of a hardcoded branch name (#1479). - Markdown code blocks inside
$nodeId.outputvalues no longer trigger false DAG validation errors (#1478). CLAUDE_BIN_PATHenvironment variable now honoured in dev mode on hosts with libc mismatches (#1481).- Orchestrator clears stale session IDs on
error_during_executionto prevent infinite failure loops (#1294). - Bash and script node failure messages shortened and made more actionable (#1393).
- Pi provider structured-output parser now tolerates prose preamble before the JSON payload (#1440).
- Docker bind-mount restarts now register
safe.directoryfor all repos, not only the primary one (#1307). - CLI commands such as
--versionand--helpno longer crash when bundled skill source files are absent (#1394). --no-env-fileflag no longer incorrectly passed to the native Claude binary in dev mode (#1461).$nodeId.outputreferences now substituted correctly inside approval gate messages (#1426).ARTIFACTS_DIR,LOG_DIR, andBASE_BRANCHnow exported into bash node subprocess environments (#1387).- Approval gate no longer bypassed after a reject-with-redraft on workflow resume (#1435).
- Discord login failure now contained so it does not crash the server process (#1365).
- Pi provider package-directory shim installed in compiled binary so Pi workflows run correctly outside a source checkout (#1360).
$LOOP_PREV_OUTPUTworkflow variable (loop nodes only) — exposes the previous iteration's cleaned output (after<promise>tag stripping) to the current iteration's prompt. Empty on the first iteration and on the first iteration after resuming from an interactive approval gate. Enablesfresh_context: trueloops to reference what the prior pass said or did without carrying full session history. (#1367)
- Provider/model resolution: trust the SDK, drop allow-lists. Removed
inferProviderFromModelandisModelCompatibleentirely. Provider is now resolved via a flat explicit chain —node.provider ?? workflow.provider ?? config.assistant— and never inferred from the model string. Model strings pass through to the SDK unchanged; the SDK validates them at request time. Codex's stream loop now matches Claude's contract (every terminal close emits exactly oneresultchunk;errorevents without a recoveringturn.completedsynthesizeresult.isErrorwith subtypecodex_stream_incomplete;turn.failedbecomescodex_turn_failed). AI nodes that exit the streaming loop with empty assistant text and no structured output now fail loudly withdag.node_empty_outputinstead of completing as silent zero-output successes. Provider-id typos (workflow-level and per-node) are caught at YAML load time. Migration: workflows that previously relied on cross-provider model inference (e.g.model: gpt-5.2-codexwith noprovider:, expecting Archon to pickcodexbecause Claude's allow-list rejected the string) must now setprovider:explicitly. Workflows that already set bothprovider:andmodel:— and workflows that set onlymodel:matchingconfig.assistant— keep working unchanged. (#1463)
- Bash and script node failures no longer leak the inline script body into user-visible errors and logs. When a
bash:orscript:DAG node failed, the error string interpolatederr.messagefrom Node'sExecFileException, which begins withCommand failed: bash -c <body>(orbun -e <body>) — embedding the entire substituted script body. Pino's default error serializer compounded this by writingerr.message,err.stack, anderr.cmdseparately, producing three copies of the body per failure across the CLI, Web UI, andnode_failedevent payload. Diagnostic output (e.g.Expected ")" but found "x" at [eval]:4:241) was buried at the end. A newformatSubprocessFailure()helper now strips theCommand failed:prefix line, prefersstderrover the message body, tail-caps at 2 KB, and exposes a controlled{exitCode, killed, stderrTail}log subset — never the raw error. Timeout / ENOENT / EACCES branches now also log through the sanitized helper, so the body cannot leak via the timeout path either. (#1389) - Claude provider crashed in dev mode with
error: unknown option '--no-env-file'. The Claude Agent SDK switched from shippingcli.jsto per-platform native binaries (via optional deps) in the 0.2.x series. Archon'sshouldPassNoEnvFilepredicate kept emitting the Bun-only--no-env-fileflag in dev mode (when the SDK resolves its bundled binary), which the native binary rejects. Tightened the predicate to only emit the flag for explicitly-configured Bun-runnable JS entry points (.js/.mjs/.cjs). Target-repo.envisolation is unchanged —stripCwdEnv()at process boot remains the primary guard, and the native Claude binary does not auto-load.envfrom its cwd. (#1461) - Pi structured-output now tolerates reasoning-model prose preamble.
tryParseStructuredOutputpreviously returnedundefinedwhenever the assistant text wasn't pure JSON, even when the JSON object was clearly emitted at the end of a "Let me evaluate..." preamble. Reasoning models — observed on Minimax M2.7 — routinely "think out loud" before emitting structured output despite explicit JSON-only prompts. The parser now falls back to a forward-scan from the first{when the clean parse fails, recovering the structured output without changing the success path for fully compliant models. (#1440) CLAUDE_BIN_PATHis now honored in dev mode. Previously the env var was silently ignored when running from source (BUNDLED_IS_BINARY=false) —resolveClaudeBinaryPath()early-returnedundefinedbefore reading it, leaving glibc Linux contributors with no working escape hatch when the Claude SDK's bundled-binary auto-resolution picked the musl variant first. The env-var check now runs in both modes; config-file path (assistants.claude.claudeBinaryPath) remains binary-mode-only since it's a per-repo, not per-machine setting. Env-loading and target-repo.envisolation are unchanged — samestripCwdEnv()boot-time guard and sameshouldPassNoEnvFile()predicate run downstream. (#1481)
First release with working compiled binaries since v0.3.6. Both v0.3.7 and v0.3.8 were tagged but neither shipped release assets — v0.3.7 was blocked by two genuine binary-runtime bugs (Pi SDK's module-init crash + Bun --bytecode producing broken output), and v0.3.8 was blocked by an unrelated CI smoke-test regression where release.yml's Claude resolver test required an origin remote that the fresh git init test repo didn't have. Both superseded tags remain for history; their GitHub Releases were deleted at the time of tagging so releases/latest fell back to v0.3.6 throughout, keeping install.sh and Homebrew safe. v0.3.9 is what users actually install.
- Release binary smoke test no longer fails on the fresh
git inittest repo. The Claude resolver smoke inrelease.ymlranarchon workflow run archon-assistagainst a tempdir with nooriginremote; as of #1310's worktree auto-sync logic this fails with "neither origin/HEAD nor origin/main exist" before the resolver is reached, so the CI assertion ("Claude Code not found"in output) never matched and the linux-x64 build aborted — taking the entire release matrix down via fail-fast. Adding--no-worktreeto both the negative and positive resolver tests skips isolation, which is what the tests actually want: they exercise the Claude resolver path, not worktree setup. (#1357)
Tagged but never released. Intended as the hotfix for v0.3.7's binary-runtime crashes; the code fixes shipped in v0.3.9 actually originated here (Pi SDK module-init lazy-load, Bun --bytecode removal). v0.3.8's own release CI aborted on an unrelated smoke-test assertion in release.yml and no binaries were uploaded. The GitHub Release was deleted; the tag remains for history. See v0.3.9 for the release users actually install.
- Compiled archon binaries no longer crash at startup when the Pi provider is bundled.
@mariozechner/pi-coding-agent/dist/config.jsrunsreadFileSync(getPackageJsonPath(), 'utf-8')at module top-level, which inside a compiled binary resolves todirname(process.execPath) + '/package.json'— a path that doesn't exist next to/usr/local/bin/archon, making every archon command (includingarchon version) crash with ENOENT before it ran. The Pi SDK and all Pi-dependent helper modules are now dynamically imported insidePiProvider.sendQuery(); registering Pi and instantiating the provider no longer touches Pi's module-init side effects. A regression test (provider-lazy-load.test.ts) walks the sameregisterCommunityProviders()+getAgentProvider('pi')path the CLI and server take and asserts neither SDK package was resolved. Claude and Codex providers keep their static import style — their SDKs have no equivalent module-init side effect. Unblocks the v0.3.7 release binaries that could not ship because of this bug. (#1355) - Release binary compile no longer silently produces broken bytecode.
scripts/build-binaries.shdropped the--bytecodeflag: Bun 1.3.11's bytecode step failed withFailed to generate bytecode for ./cli.jsagainst the 0.3.7 module graph and fell through to producing a binary that crashed at module instantiation with "Expected CommonJS module to have a function wrapper". Windows was already excluded; this removes the flag everywhere. Release parity preserved via--minify. (#1354)
Pi community provider, home-scoped workflows/commands/scripts, worktree policy, Web UI approval-gate auto-resume, three-path env model, and a breaking change to Claude Code binary resolution for compiled binary users.
- Pi community provider (
@mariozechner/pi-coding-agent). First community provider under the Phase 2 registry (builtIn: false). One adapter exposes ~20 LLM backends (Anthropic, OpenAI, Google, Groq, Mistral, Cerebras, xAI, OpenRouter, Hugging Face, and more) via a<pi-provider-id>/<model-id>model format. Reads credentials from~/.pi/agent/auth.json(populated by runningpi /loginfor OAuth subscriptions like Claude Pro/Max, ChatGPT Plus, GitHub Copilot) AND from env vars (env vars take priority per-request). Per-node workflow options supported:effort/thinking→ PithinkingLevel;allowed_tools/denied_tools→ filter Pi's 7 built-in coding tools;skills→ resolved against.agents/skills,.claude/skills(project + user-global);systemPrompt; codebase env vars; session resume viasessionIdround-trip. Unsupported fields (MCP, hooks, structured output, cost limits, fallback model, sandbox) trigger an explicit dag-executor warning rather than silently dropping. Use in workflow YAML:provider: pi+model: anthropic/claude-haiku-4-5. (#1270) - Inline sub-agent definitions on DAG nodes (
agents:). Define Claude Agent SDKAgentDefinitions directly in workflow YAML, keyed by kebab-case agent ID. The main agent can spawn them in parallel via theTasktool — useful for map-reduce patterns where a cheap model (e.g. Haiku) briefs items and a stronger model reduces. Removes the need to author.claude/agents/*.mdfiles for workflow-scoped helpers. Claude only; Codex and community providers that don't support inline agents emit a capability warning and ignore the field. Merges with the internaldag-node-skillswrapper set byskills:on the same node — user-defined agents win on ID collision (a warning is logged). (#1276) - Home-scoped commands at
~/.archon/commands/— personal command helpers now reusable across every repo. Resolution precedence:<repoRoot>/.archon/commands/>~/.archon/commands/> bundled defaults. Surfaced in the Web UI workflow-builder node palette under a dedicated "Global (~/.archon/commands/)" section. - Home-scoped scripts at
~/.archon/scripts/— personal Bun/uv scripts now reusable across every repo. Script nodes (script: my-helper) resolve via<repoRoot>/.archon/scripts/first, then~/.archon/scripts/. Repo-scoped scripts with the same name override home-scoped ones silently; within a single scope, duplicate basenames across extensions still throw (unchanged from prior behavior). - 1-level subfolder support for workflows, commands, and scripts. Files can live one folder deep under their respective
.archon/root (e.g..archon/workflows/triage/foo.yaml) and resolve by name or filename regardless of subfolder. Matches the existingdefaults/convention. Deeper nesting is ignored silently — see docs for the full convention. 'global'variant onWorkflowSource— workflows at~/.archon/workflows/and commands at~/.archon/commands/now render with a distinct source label (no longer coerced to'project'). Web UI badges updated.getHomeWorkflowsPath(),getHomeCommandsPath(),getHomeScriptsPath(),getLegacyHomeWorkflowsPath()helpers in@archon/paths, exported for both internal discovery and external callers that want to target the home scope directly.discoverScriptsForCwd(cwd)in@archon/workflows/script-discovery— merges home-scoped + repo-scoped scripts with repo winning on name collisions. Used by the DAG executor and validator; callers no longer need to know about the two-scope shape.- Workflow-level worktree policy (
worktree.enabledin workflow YAML). A workflow can now pin whether its runs use isolation regardless of how they were invoked:worktree.enabled: falsealways runs in the live checkout (CLI--branch/--fromhard-error; web/chat/orchestrator short-circuitsvalidateAndResolveIsolation),worktree.enabled: truerequires isolation (CLI--no-worktreehard-errors). Omit the block to let the caller decide (current default). First consumer:.archon/workflows/repo-triage.yamlpinned toenabled: falsesince it's read-only. - Per-project worktree path (
worktree.pathin.archon/config.yaml). Opt-in repo-relative directory (e.g..worktrees) where Archon places worktrees for that repo, instead of the default~/.archon/workspaces/<owner>/<repo>/worktrees/. Co-locates worktrees with the project so they appear in the IDE file tree. Validated as a safe relative path (no absolute, no..); malformed values fail loudly at worktree creation. Users opting in are responsible for.gitignoreing the directory themselves — no automatic file mutation. Credits @joelsb for surfacing the need in #1117. - Three-path env model with operator-visible log lines. The CLI and server now load env vars from
~/.archon/.env(user scope) and<cwd>/.archon/.env(repo scope, overrides user) at boot, both withoverride: true. A new[archon] loaded N keys from <path>line is emitted per source (only when N > 0).[archon] stripped N keys from <cwd> (...)now also prints when stripCwdEnv removes target-repo env keys, replacing the misleading[dotenv@17.3.1] injecting env (0) from .envpreamble that always reported 0. Thequiet: trueflag suppresses dotenv's own output. (#1302) archon setup --scope home|projectand--forceflags. Default is--scope home(writes~/.archon/.env).--scope projecttargets<cwd>/.archon/.envinstead.--forceoverwrites the target wholesale rather than merging; a timestamped backup is still written. (#1303)- Merge-only setup writes with timestamped backups.
archon setupnow reads the existing target file, preserves non-empty values, carries user-added custom keys forward, and writes a<target>.archon-backup-<ISO-ts>before every rewrite. Fixes silent PostgreSQL→SQLite downgrade and silent token loss on re-run. (#1303) getArchonEnvPath()andgetRepoArchonEnvPath(cwd)helpers in@archon/paths, plus a new@archon/paths/env-loadersubpath exportingloadArchonEnv(cwd)shared by the CLI and server entry points.registerCommunityProviders()aggregator in@archon/providers. Process entrypoints (CLI, server, config-loader) now call one function to register every bundled community provider. Adding a new community provider is a single-line edit to this aggregator rather than touching each entrypoint — makes the Phase 2 "community providers are a localized addition" promise real.contributing/adding-a-community-provider.mdguide — contributor-facing walkthrough of the Phase 2 registry pattern using Pi as the reference implementation.CLAUDE_BIN_PATHenvironment variable — highest-precedence override for the Claude Code SDKcli.jspath (#1176)assistants.claude.claudeBinaryPathconfig option — durable config-file alternative to the env var (#1176)- Release-workflow Claude subprocess smoke test — the release CI now installs Claude Code on the Linux runner and exercises the resolver + subprocess spawn, catching binary-resolution regressions before they ship
- Claude Code binary resolution (breaking for compiled binary users): Archon no longer embeds the Claude Code SDK into compiled binaries. In compiled builds, you must install Claude Code separately (
curl -fsSL https://claude.ai/install.sh | bashon macOS/Linux,irm https://claude.ai/install.ps1 | iexon Windows, ornpm install -g @anthropic-ai/claude-code) and point Archon at the executable viaCLAUDE_BIN_PATHenv var orassistants.claude.claudeBinaryPathin.archon/config.yaml. The Claude Agent SDK accepts either the native compiled binary (from the curl/PowerShell installer at~/.local/bin/claude) or a JScli.js(from the npm install). Dev mode (bun run) is unaffected — the SDK resolves vianode_modulesas before. The Docker image ships Claude Code pre-installed withCLAUDE_BIN_PATHpre-set, sodocker runstill works out of the box. Resolves silent "Module not found /Users/runner/..." failures on macOS (#1210) and Windows (#1087). - Home-scoped workflow location moved to
~/.archon/workflows/(was~/.archon/.archon/workflows/— a double-nested path left over from reusing the repo-relative discovery helper for home scope). The new path sits next to~/.archon/workspaces/,archon.db, andconfig.yaml, matching the rest of the~/.archon/convention. If Archon detects workflows at the old location, it emits a one-time WARN per process with the exact migration command:mv ~/.archon/.archon/workflows ~/.archon/workflows && rmdir ~/.archon/.archon. The old path is no longer read — users must migrate manually (clean cut, no deprecation window). Rollback caveat: if you downgrade after migrating, move the directory back to the old location. - Workflow discovery no longer takes a
globalSearchPathoption.discoverWorkflows()anddiscoverWorkflowsWithConfig()now consult~/.archon/workflows/automatically — every caller gets home-scoped discovery for free. Previously-missed call sites in the chat command handler (command-handler.ts), the Web UI workflow picker (api.ts GET /api/workflows), and the orchestrator's single-codebase resolve path now see home-scoped workflows without needing a maintainer patch at every new call site. Closes #1136; supersedes that PR (credits @jonasvanderhaegen for surfacing the bug class). - Dashboard nav tab now shows a numeric count of running workflows instead of a binary pulse dot. Reads from the existing
/api/dashboard/runscounts.runningfield; same 10s polling interval. - Workflow run destructive actions (Abandon, Cancel, Delete, Reject) now use a proper confirmation dialog matching the codebase-delete UX, replacing the browser's native
window.confirm()popups. Each dialog includes context-appropriate copy describing what the action does to the run record.
- Web UI approval gates now auto-resume. Previously, clicking Approve or Reject on a paused workflow from the Web UI only recorded the decision — the workflow never continued, and the user had to send a follow-up chat message (or use the CLI) to resume. Three fixes: (1) orchestrator-agent now threads
parentConversationIdthroughexecuteWorkflowfor every web dispatch, (2) thePOST /approveandPOST /rejectAPI handlers dispatch/workflow run <name> <userMessage>back through the orchestrator whenparent_conversation_idis set and points at a web-platform parent (mirrorsworkflowApproveCommand/workflowRejectCommandon the CLI; non-web parents skip the auto-resume to prevent cross-adapter misrouting), and (3) the during-streaming status check in the DAG executor tolerates thepausedstate so a concurrent AI node in the same topological layer finishes its own stream rather than being aborted when a sibling approval node pauses the run. The Web UI reject button uses the properConfirmRunActionDialogwith an optional reason textarea (waswindow.confirmin the chat card, and lacked a reason input on the dashboard) — the trimmed reason propagates to$REJECTION_REASONin the workflow'son_rejectprompt. Credits @jonasvanderhaegen for surfacing and diagnosing the bug in #1147 (that PR was 87 commits stale on a dev that had since refactored the reject UX; this is a fresh re-do on currentdev). Closes #1131. - Server startup no longer marks actively-running workflows as failed. The
failOrphanedRuns()call has been removed frompackages/server/src/index.tsto match the CLI precedent (packages/cli/src/cli.ts:256-258). Per the new CLAUDE.md principle "No Autonomous Lifecycle Mutation Across Process Boundaries", a stuckrunningrow is now transitioned explicitly by the user: via the per-row Cancel/Abandon buttons on the dashboard workflow card, orarchon workflow abandon <run-id>from the CLI. (archon workflow cleanupis a separate command that deletes OLD terminal runs for disk hygiene — it does not handle stuckrunningrows.) Closes #1216. MCP server connection failed: <plugin>noise no longer surfaces in workflow runs. The dag-executor now loads the workflow node'smcp:config file once and filters the SDK's failure message to only the servers the workflow actually configured. User-level Claude plugin MCPs (e.g.telegraminherited from~/.claude/) that fail to connect in the headless subprocess are debug-logged asdag.mcp_plugin_connection_suppressedinstead of being forwarded to the conversation. Other provider warnings (⚠️ ) surface unchanged. Credits @MrFadiAi for reporting the issue in #1134 (that PR was 9 days stale and conflicting; this is a fresh re-do on currentdev).archon setupno longer writes to<repo>/.env. Prior versions unconditionally wrote the generated config to both~/.archon/.envand<repo>/.env, destroying user-added secrets and silently downgrading PostgreSQL configs to SQLite when re-run in "Add" mode. The write side now targets exactly one archon-owned file (home or project scope via--scope), merges into existing content by default, and writes a timestamped backup.<repo>/.envis never touched — it belongs to the user's target project. (#1303)- CLI and server no longer silently lose repo-local env vars. Previously, env vars in
<repo>/.envwere parsed, deleted fromprocess.envbystripCwdEnv(), and the only output operators saw was[dotenv@17.3.1] injecting env (0) from .env— which read as "file was empty." Workflows that neededSLACK_WEBHOOKor similar had no way to recover without knowing to use~/.archon/.env. The new<cwd>/.archon/.envpath + archon-owned log lines make the load state observable and recoverable. (#1302) - Bumped transitive
axiosto^1.15.0via rootoverridesto clear CVE-2025-62718 (NO_PROXY bypass via hostname normalization → potential SSRF). Archon pullsaxiostransitively through@slack/boltand@slack/web-api; both semver ranges (^1.12.0and^1.13.5) accept the override cleanly, so no API surface changes. Credits @stefans71 for identifying and reporting the vulnerability in #1153. Closes #1053. - Stale workspace symlink no longer reported as "not in a git repository" by the CLI. When
archon workflow run(or--resume) is invoked from a valid git repo whose~/.archon/workspaces/<owner>/<repo>/sourcesymlink points somewhere else (common after moving/renaming the checkout), auto-registration fails but the repo is fine. Previously both the worktree-creation and resume paths fell through to the genericCannot create worktree: not in a git repository/Cannot resume: Not in a git repositoryerrors — a lie that sent users down the wrong diagnostic path. Both sites now preserve the registration error and throwCannot {create worktree,resume}: repository registration failed.with the original cause and a concrete cleanup hint (Remove the stale workspace entry at <path> and retry) when the failure matches thecreateProjectSourceSymlink()shape. Credits @Bortlesboat for identifying the root cause and the parser approach in #1157. Closes #1146. - Cross-clone worktree isolation: prevent workflows in one local clone from silently adopting worktrees or DB state owned by another local clone of the same remote. Two clones sharing a remote previously resolved to the same
codebase_id, causing the isolation resolver's DB-driven paths (findReusable,findLinkedIssueEnv,tryBranchAdoption) to return the other clone's environment. All adoption paths now verify the worktree's.gitpointer matches the requesting clone and throw a classified error on mismatch.archon-implementprompt was also tightened to stop AI agents from adopting unrelated branches they see viagit branch. Thanks to @halindrome for the three-issue root-cause mapping. (#1193, #1188, #1183, #1198, #1206)
globalSearchPathoption fromdiscoverWorkflows()anddiscoverWorkflowsWithConfig(). Callers that previously passed{ globalSearchPath: getArchonHome() }should drop the argument; home-scoped discovery is now automatic.@anthropic-ai/claude-agent-sdk/embedimport — the Bunwith { type: 'file' }asset-embedding path and its$bunfsextraction logic. The embed was a bundler-dependent optimization that failed silently when Bun couldn't produce a usable virtual FS path (#1210, #1087); it is replaced by explicit binary-path resolution.
Web UI workflow experience improvements, CWD environment leak protection, and bug fixes.
- Workflow result card now shows status, duration, node count, and artifact links in chat (#1015)
- Loop iteration progress display in the workflow execution view (#1014)
- Artifact file paths in chat messages are now clickable (#1023)
- CWD
.envvariables are now stripped from AI subprocess environments at the@archon/pathslayer, replacing the oldSUBPROCESS_ENV_ALLOWLISTapproach. Prevents accidental credential leaks from target repo.envfiles (#1067, #1030, #1098, #1070) - Update check cache TTL reduced from 24 hours to 1 hour
- Duplicate text and tool calls appearing in workflow execution view
workflow_stepSSE events not handled correctly, causing missing progress updates- Nested interactive elements in workflow UI causing React warnings
- Workflow status messages not splitting correctly in WorkflowLogs
- Incorrect
remainingMessagesuppression in stream mode causing lost output - Binary builds now use
BUNDLED_VERSIONfor the app version instead of readingpackage.json
Fixes for archon serve process lifecycle and static file serving.
archon serveprocess exits immediately: the CLI calledprocess.exit(0)afterstartServer()returned, killing the server. Now blocks on SIGINT/SIGTERM so the server stays running (#1047)- Web dist path existence check: server logs a warning at startup if the web dist directory is missing, instead of silently serving 404s
- Favicon route: added explicit
/favicon.pngroute for the web UI
Binary env loading fix and release infrastructure improvements.
- Docs site redesign: logo, dark theme, feature cards, and enhanced CSS (#1022)
- Server env loading for binary support: removed redundant CWD
.envstripping —SUBPROCESS_ENV_ALLOWLISTand the env-leak gate already prevent target repo credentials from reaching AI subprocesses. Server now loads~/.archon/.envwithoverride: truefor all keys (not justDATABASE_URL), skips theimport.meta.dir.envpath in binary mode, and defaultsCLAUDE_USE_GLOBAL_AUTH=truewhen no explicit credentials are set (#1045) - Workspace version sync: all
packages/*/package.jsonversions now sync from the rootpackage.jsonduring releases viascripts/sync-versions.sh
archon servecrash in compiled binaries: the CWD env stripping + bakedimport.meta.dirpath caused all credentials to be lost, triggeringno_ai_credentialsexit on every startup- CLI
versioncommand reading stale version: dev mode now reads from the monorepo rootpackage.jsoninstead of the CLI package's own version field - Release CI web build: fixed
bun --filtersyntax and added missingremark-gfmtransitive dependencies for Bun hoisting
Binary distribution improvements, new workflow node type, and a batch of bug fixes.
archon servecommand: one-command way for compiled binary users to start the web UI server. Downloads a pre-built web UI tarball from GitHub releases on first run, verifies SHA-256 checksum, caches locally, then starts the full server (#1011)- Automatic update check: binary users see a notification when a newer version is available on GitHub. Non-blocking, cached for 24 hours (#1039)
- Script node type for DAG workflows:
script:nodes run inline TypeScript/Python or named scripts from.archon/scripts/viabunoruvruntimes. Supportsdeps:for dependency installation andtimeout:in milliseconds (#999) - Codex native binary auto-resolution: compiled builds now locate the Codex CLI binary automatically instead of requiring a manual
CODEX_CLI_PATHoverride (#995, #1012)
- Workflow reject ignores positional reason:
archon workflow reject <id> <reason>now correctly passes the reason argument to the rejection handler - Windows script path separators: normalize backslashes to forward slashes in script node paths for cross-platform compatibility
- PowerShell
Add-ToUserPathcorruption: installer no longer corruptsPATHwhen only a single entry exists (#1000) - Validator
Promise.anyrace condition: script runtime checks no longer fail intermittently due to aPromise.anyedge case (#1007, #1010) - Interactive-prd workflow bugs: fixes to loop gate handling, variable substitution, and node ordering (#1001, #1002, #1003, #1005)
- Community forge adapter exports: added explicit export entries for Gitea and GitLab adapters so they resolve correctly in compiled builds (#1041)
- Workflow graph view without codebase: the web UI workflow graph now loads correctly even when no codebase is selected (#958)
Critical hotfix: compiled binaries could not spawn Claude. Also fixes an env-leak gate false-positive for unregistered working directories.
- Claude SDK spawn in compiled binaries: the Claude Agent SDK was resolving its
cli.jsviaimport.meta.urlof the bundled module, whichbun build --compilefreezes at build time to the build host's absolutenode_modulespath. Every binary shipped from CI carried a/Users/runner/work/Archon/...path that existed only on the GitHub Actions runner, and everyworkflow runhitModule not foundafter three retries. Now imports@anthropic-ai/claude-agent-sdk/embedsocli.jsis embedded into the binary's$bunfsand extracted to a real temp path at runtime (#990). - Env-leak gate false-positive for unregistered cwd: pre-spawn scan now skips cwd paths that aren't registered as codebases instead of blocking the workflow (#991, #992).
Patch release: SQLite migration fix for existing databases and release build pipeline fix.
- SQLite migration for
allow_env_keys: add the missingallow_env_keyscolumn to thecodebasesschema and a migration so databases created before v0.3.0 upgrade cleanly instead of erroring on first query (#988). - Release workflow binary builds: wire
.github/workflows/release.ymlback toscripts/build-binaries.shso tagged releases actually produce platform binaries andchecksums.txt(#986, #987).
Env-leak gate hardening, SSE reliability fixes, isolation cleanup smarter merge detection, build/version improvements, and deploy hardening.
- Env-leak gate (target repo
.envkeys): scan auto-loaded.envfilenames for 7 sensitive keys (ANTHROPIC_API_KEY,OPENAI_API_KEY, etc.) and refuse to register or spawn into a codebase whose.envwould silently re-inject keys into Claude/Codex subprocesses. Default is fail-closed (allow_env_keys = false). Includes a per-codebase consent column, registration gate, pre-spawn check in both Claude and Codex clients, and a 422 API error with web UI checkbox (#1036). - CLI
--allow-env-keysflag forarchon workflow run— grant env-leak-gate consent during auto-registration without needing the Web UI. Audit-logged asenv_leak_consent_grantedwithactor: 'user-cli'(#973, #983). - Global
allow_target_repo_keysflag in~/.archon/config.yaml— bypass the env-leak gate for all codebases on this machine. Per-repo.archon/config.yamlallow_target_repo_keys: falsere-enables the gate for that repo. The server emitsenv_leak_gate_disabledonce per process per source the first timeloadConfigresolves the bypass as active (#973, #983). PATCH /api/codebases/:idendpoint to flipallow_env_keyson existing codebases without delete/re-add. Audit-logged atwarnlevel on every grant and revoke, including ascanStatusfield that distinguishes "scanned" from "scan failed" so audit reviewers can tell empty key lists apart (#973, #983).- Settings → Projects per-row toggle to grant or revoke env-key consent retroactively, with an "env keys allowed" badge and inline error feedback if the PATCH fails (#973, #983).
- Startup env-leak scan: when
allow_target_repo_keysis not set, the server emits onestartup_env_leak_gate_will_blockwarn per registered codebase whose.envwould block the next spawn. Skipped entirely when the global bypass is active (#973, #983). - Squash-merge and PR-merge detection for
isolation cleanup --merged. Unions three signals (ancestry viagit branch --merged, patch equivalence viagit cherry, and PR state viagh) to safely clean up worktrees whose branches were squash-merged. Adds--include-closedflag to also remove worktrees whose PRs were closed without merging (#1027). - Git commit hash in
archon versionoutput. Read at runtime viagit rev-parsein dev or from a build-time constant in compiled binaries; falls back tounknown(#1035).
- Env-leak gate error messages are now context-aware: separate remediation copy for Web Add-Project, CLI auto-register, and pre-spawn-of-existing-codebase paths. Previously every error pointed at the Web UI checkbox even from the CLI (#973, #983).
- SSE event buffer TTL raised from 3s to 60s and capacity from 50 to 500 events, fixing dropped
tool_resultevents during the 5s reconnect grace window that left tool cards perpetually spinning. Cleanup timer now resets on each new event so the buffer is held for TTL past the most recent event, not the first one. Buffer overflow and TTL expiration now log atwarnlevel for observability (#1037). - Binary build detection moved from runtime env sniffing (
import.meta.dir/process.execPath) to a build-timeBUNDLED_IS_BINARYconstant in@archon/paths. Logger usespino-prettyas a destination stream on the main thread instead of a worker-thread transport, eliminating therequire.resolve('pino-pretty')lookup that crashed inside Bun's$bunfsvirtual filesystem in compiled binaries. Same code path runs in dev and binaries — no environment detection (#982). - Cloud-init deployment script hardened: dedicated
archonuser (docker group, no sudo) with SSH keys copied from the default cloud user, 2GB swapfile to prevent OOM during docker build on small VPSes,ufw allow 443/tcpand443/udpfor HTTP/3 QUIC, fail-fast on network errors, and clearer setup-complete messaging (#981).
- Env-leak gate worktree path lookup: pre-spawn consent check now falls back to
findCodebaseByPathPrefix()when the exact path lookup misses, so workflow runs in.../worktrees/feature-branchcorrectly inherit consent from the source codebase (#1036). EnvLeakErrorFATAL classification in the workflow executor now checkserror.name === 'EnvLeakError'directly instead of pattern-matching the message, immune to message rewording (#1036).- Scanner unreadable-file handling: distinguishes
ENOENT(skip) fromEACCESand other errors so unreadable.envfiles surface as findings instead of silently bypassing the gate (#1036).
- The default
allow_env_keysper codebase isfalse(fail-closed). Codebases with sensitive keys in their auto-loaded.envfiles (ANTHROPIC_API_KEY,OPENAI_API_KEY, etc.) are blocked at the next workflow run. Remediation paths (any one): (1) remove the key from.env, (2) rename to.env.secrets, (3) toggle "Allow env keys" in Settings → Projects, (4)archon workflow run --allow-env-keys ..., (5) setallow_target_repo_keys: truein~/.archon/config.yaml. Seedocs/reference/security.mdfor full details (#1036, #973, #983).
Chat-first navigation redesign, DAG graph viewer, per-node MCP and skills, and extensive bug fixes across the web UI and workflow engine.
- Chat-first layout redesign with top-level tab navigation replacing sidebar nav (#666, #673)
- DAG workflow graph viewer with split-panel layout for visual workflow inspection (#712)
- Per-node MCP servers for DAG workflows — configure MCP server files per node with env var expansion (#688)
- Per-node skills for DAG workflows — preload skills via AgentDefinition wrapping (#689)
- Default worktree isolation for CLI workflows with auto-detected base branch (#692)
- Mission Control cards with richer grouping by parent chat (#673)
- Tool result capture via PostToolUse hook streamed live to Web UI
- Zustand state management for workflow store, replacing manual state (#693)
- Welcoming empty chat state with suppressed disconnected/no-project noise (#670)
- Issue context details in workflow startup log events (#737)
- Running workflow count in health endpoint (#718, #719)
- Prerequisites section added to README quickstart
- README restructured with content extracted to
/docsdirectory - Shared executor infrastructure extracted from monolithic executor (#685)
- Workflow discovery split into its own module for cleaner loading
- Duplicated helpers extracted across executor, command-handler, and cleanup-service (#633)
- Worktree-per-codebase limit removed
- Deduplicated
setConversationDbIdpattern across adapters (#651)
- SSE race condition causing loading indicators to break after first workflow invocation
- Tool call cards not rendering during live SSE streaming in chat (#754)
- Standalone active workflows not grouped into shared grid (#755)
- Conversation list not scrollable in sidebar (#747, #750)
- Duplicate tool calls in WorkflowLogs from SSE+DB merge conflicts (#705, #720, #721)
- Ghost DB entries in CLI isolation commands
- Tool output lost across periodic flush in workflow logs
conversationIdnot URL-encoded in SSE EventSource for forge adapters (#658)- Claude SDK crash when invoked as root (#733)
- Worktree sharing across conversations and web workers (#716)
- Orphan conversation cleanup and rename error surfacing (#726)
- Query error states missing from sidebar and context components (#727)
- localStorage guard and background polling issues (#725)
- Workflow builder black screen and DAG log filtering (#675)
- Idle timeout not detecting stuck tool calls during execution (#649)
commitAllChangesfailing on empty commits (#745)- Explicit base branch config now required for worktree creation (#686)
- Subprocess-level retry added to CodexProvider (#641)
- Validate
cwdquery param against registered codebases (#630) - Server-internal paths redacted from
/api/configresponse (#632) - SQLite conversations index missing
WHERE deleted_at IS NULL(#629)
Git workflow and release automation.
- Dev branch workflow —
devis now the working branch;mainis the release branch. All feature work branches offdev(#684) /releaseskill — stack-agnostic release automation that generates changelog entries, bumps version, and creates a PR to main
- GitHub default branch changed from
maintodev
CLI-Web observability overhaul, comprehensive test coverage, and per-node hooks.
- CLI-Web observability overhaul — DAG visualization, cancel support, metadata display, and progress tracking across CLI and Web UI
- Per-node SDK hooks for DAG workflows — attach static hook callbacks to individual Claude nodes for tool control and context injection (#634)
- Multi-layer transient error retry for SDK subprocess crashes with exponential backoff (#639)
- Comprehensive test coverage across all packages — postgres adapter, clone handler, orchestrator agent, error formatter, API routes (#645)
- Windows test compatibility — resolved 33 Windows-specific test failures (#644)
- Tool call persistence decoupled from web adapter for cleaner architecture (#642, #652)
- Loop and DAG executors now emit structured SSE events for live tool cards (#656)
- Loading indicator race condition and workflow tool call duration display (#654, #655, #657)
- DAG node cancel detection during streaming and UTC timestamp elapsed time
- Idle timeout excluded from post-loop cancel classification
- Flaky message-cache test caused by
Date.now()drift
DAG hardening, security fixes, validate-pr workflow, and worktree lifecycle management.
archon complete <branch>command for worktree lifecycle cleanup — removes worktree + local/remote branches (#601)--jsonflag forworkflow list— machine-readable workflow output (#594)archon-validate-prworkflow with per-node idle timeout support (#635)- Typed SessionMetadata with Zod validation for safer metadata handling (#600)
persistSession: falsein ClaudeProvider to avoid disk pollution from session transcripts (#626)- DAG workflow for GitHub issue resolution with structured node pipeline
- Claude Agent SDK updated to v0.2.74 (#625)
- Shell injection via
$nodeId.outputin bash nodes — output is now properly escaped (#591) - DAG
when:parse errors now fail-closed (skip node) instead of fail-open (#590) - Unknown
$nodeId.outputrefs warn instead of silently returning empty string (#593) - Isolation resolver no longer swallows errors or leaks partial state (#597)
extractOwnerRepono longer silently producesundefinedpath segments (#592)- Chat stuck states after failed message send (#578, #589)
- DAG node events properly wired to frontend (#577, #602)
- Worktree creation no longer moves canonical repo HEAD (#572)
- Conversation DELETE/PATCH now use platform ID instead of internal DB ID (#575)
- DAG workflow duration computed once for consistency (#570, #573)
- SSE gaps from ordered lock events and retract preserving tool calls (#581)
- Sidebar delete now clears selection and guards localStorage (#582)
- Git fetch errors classified in syncRepository (#574)
DATABASE_URLloaded from~/.archon/.envfor CLI/server parity- API returns 400 when
conversationIdis provided in POST/api/conversations(#595)
Skills system overhaul and workshop documentation.
- Archon-dev skill with routing to 10 specialized cookbooks (research, plan, implement, review, debug, commit, PR, issue)
- Rulecheck skill — autonomous agent that scans for CLAUDE.md rule violations, creates PRs with fixes, and notifies via Slack
- Triage skill — upgraded from command to skill with custom agent for GitHub issue labeling
- Save-task-list skill — upgraded from command to skill with SessionStart hook for task restoration
- Replicate-issue skill for systematic GitHub issue reproduction
- Workshop documentation — part 1 and part 2 guides, combined rundown, and feature coverage matrix
- Default AI assistant switched from Codex to Claude
- Skills upgraded from
.claude/commandsto.claude/skillswith dedicated directories
Monorepo deep extraction and visual workflow builder.
- Visual workflow builder with React Flow for drag-and-drop workflow creation (#471)
- AI-generated conversation titles + CLI-to-Web UI integration (#515)
- Workflow Command Center — unified dashboard for cross-project workflow observability with pagination and filtering
@archon/pathspackage extracted from@archon/core— path resolution and logger with zero internal deps (#483)@archon/gitpackage extracted from@archon/core— git operations with branded types (#492)@archon/isolationpackage extracted from@archon/core— worktree isolation with provider abstraction (#492)@archon/adapterspackage extracted from@archon/server— platform adapters for Slack, Telegram, GitHub, Discord (#499)@archon/workflowspackage extracted from@archon/core— workflow engine with loader, router, executor, DAG (#507)
- Backward-compat re-exports removed from
@archon/core— use direct package imports (#512)
- Workflow dispatch history loss, cancel, and streaming UX (#475, #480)
- Workflow summary duplicate on chat navigation (#490)
- Text buffer flushed before workflow_dispatch SSE events (#491, #498)
- SQLite adapter RETURNING test fixture (#508)
- Mock restoration in 3 test files to prevent cross-file pollution (#509, #510)
- Windows path fixes for Archon directories
DAG workflow engine, orchestrator agent, and per-node tool restrictions.
- DAG workflow engine with parallel execution, conditional branching, and
$nodeId.outputsubstitution (#450) - Orchestrator agent that routes natural language to workflows and passes prompts through (#452)
- Per-node and per-step tool restrictions —
allowed_toolsanddenied_toolsfor Claude nodes (#454) - Workflow builder backend APIs (Phase A) — validate, fetch, save, and delete workflows (#471)
- Session retention policy for automatic cleanup of old sessions (#306)
- Failed workflow resume from prior artifacts on same branch (#440)
- Claude Agent SDK upgraded to 0.2.45 and Codex SDK to 0.104.0 (#448)
- Workflow step lifecycle logs promoted from debug to info (#469)
- Router bypass when AI uses tools instead of
/invoke-workflow(#449) - Cancelled workflow status handled in frontend (#458)
- Workflows always run in isolated worktree regardless of registration method (#457)
--branchand--no-worktreeconflict in CLI (#545)/invoke-workflowchunk suppressed before streaming to frontend (#486)- Idle timeout added to streaming loops to prevent executor hang (#552)
- Codex model access errors surfaced with actionable guidance (#438)
Web UI launch, structured logging, and major stabilization.
- Archon Web UI — React frontend with SSE streaming, workflow events, and conversation management
- Pino structured logging replacing console.log across all packages (#388)
- Project-centric
~/.archon/layout — workspaces organized byowner/repo(#382) - Session deactivation reasons stored in database for audit trail (#303, #385)
- Remote branch cleanup when PR is merged
- Workflow log duration, tokens, and validation events (#417)
- Save-task-list command for persisting task lists across sessions
~/.archon/restructured to project-centric layout (#382)- Database command templates deprecated in favor of filesystem commands (#425)
- SQLite-first documentation with Postgres as optional (#418)
transitionSessionwrapped in database transaction for atomicity (#408)- Codex SDK bumped to 0.101.0
.envresolution in worktrees with credential error guidance (#404)- CLI picking up
DATABASE_URLfrom target repo.env(#389) - PRs targeting wrong base branch instead of configured one (#387)
- Client error handling and GitHub self-triggering (#223, #240, #407)
- Handler bugs: JSON parsing, dotenv worktree, error messages (#392-#395, #406)
- Model selection and Codex options wiring (#428)
- SQLite busy timeout to prevent database locks (#418, #420)
- Workflow load errors and router failures surfaced to users (#410)
- WorkflowInvoker crash from workflows API type mismatch (#436)
getCodebaseCommands()returning mutable reference (#379, #384)
SQLite as default database and simplified CLI setup.
- SQLite as default database — zero-config setup with
~/.archon/archon.db, no PostgreSQL required - Simplified CLI setup — streamlined first-run experience on macOS/Linux
- Combined SQL schema syntax error (extra comma)
- Post-install configuration for Ubuntu VPS deployments
Archon CLI skill, workflow routing improvements, and configuration fixes.
- Archon CLI skill for Claude Code — run workflows from within Claude Code sessions (#331, #332, #333)
- Interactive setup wizard and config editor for the Archon skill
/workflow runcommand for direct workflow invocation from CLIarchon-plan-to-mergeworkflow for end-to-end plan execution (#346)- Workflow error visibility —
/workflow listand/workflow reloadshow per-file load errors (#260, #263, #264) - Case-insensitive workflow routing — router falls back to case-insensitive match (#263)
- Workflow artifacts standardized with workflow-scoped paths (#352)
- Resilient workflow loading — one broken YAML no longer aborts loading all workflows (#260)
baseBranchconfig option wired up for worktree creation (#330, #334)
- Config parse errors surfaced to users instead of silently failing (#284, #286)
- Workflow router prioritizes user intent over context (#365)
- Issue context passed to workflows for non-slash commands (#215)
- Cross-platform path splitting for worktree isolation (#245)
- WorktreeProvider error handling and silent failures (#276)
- Router error feedback with available workflow names (#263)
- Metadata serialization failure when
github_contextpresent (#262) - Consecutive unknown errors tracked in workflow executor (#259)
- Thread inheritance error handling with logging and tests (#269)
- Isolation environments partial index replaces full unique constraint (#239)
Documentation improvements and bug fixes.
- CLI documentation - User guide and developer guide with architecture diagrams (#326)
- Private repo installation guide using
ghCLI for authenticated cloning - Manual release process documentation for when GitHub Actions unavailable
- Repository ownership migrated from
raswonderstodynamous-community
- Dockerfile monorepo workspace structure for proper package resolution
Server migration to Hono and CLI binary distribution infrastructure.
- CLI binary distribution - Standalone binaries for macOS/Linux with curl install and Homebrew formula (#325)
- Bundled defaults - Commands and workflows embedded at compile time for binary builds (#325)
- Runtime default loading - Load default commands/workflows at runtime instead of copying on clone (#324)
- Default opt-out - Config options
loadDefaultCommandsandloadDefaultWorkflows(#324) - Version command enhancements - Shows platform, build type (binary/source), and database type (#325)
- Express to Hono migration - Replaced Express with Hono for improved performance and Bun integration (#318)
- Default port changed from 3000 to 3090
- ESLint zero-warnings policy enforced in CI (#316)
- CLAUDE.md consolidation - Removed duplications and streamlined documentation (#317)
Monorepo restructure introducing the CLI package for local workflow execution.
- Monorepo structure with
@archon/core,@archon/server, and@archon/clipackages (#311) - CLI entry point with
workflow list,workflow run, andversioncommands (#313) - Database abstraction layer supporting both PostgreSQL and SQLite (#314)
- SQLite auto-detection - uses
~/.archon/archon.dbwhenDATABASE_URLnot set (#314) - Isolation commands -
isolation listandisolation cleanupfor worktree management (#313)
- Surface git utility errors instead of swallowing silently (#292)
Provider selection and session audit trail.
- Config-based provider selection for workflows - choose Claude or Codex per workflow (#283)
- Session state machine with immutable sessions for full audit trail (#302)
- Workflow status visibility - track running workflows per conversation (#256)
- Codex sandbox/network settings and progress logging (#290)
- Comprehensive isolation module code review (#274)
- Stale workspace: sync before worktree creation (#287)
- Add defaults subdirectory to command search paths (#289)
Major stability release with comprehensive bug fixes and test coverage.
- Worktree-aware automatic port allocation for parallel development (#178)
- GitHub thread history - fetch previous PR/issue comments as context (#185)
- Cloud deployment support for
with-dbprofile (#134) - Integration tests for orchestrator workflow routing (#181)
- Concurrent workflow detection tests (#179)
- Comprehensive AI error handling tests for workflow executor (#176)
- Deep orchestrator code review refactor (#265)
- Improve error handling and code clarity in server entry point (#257)
- Workflows should only load from
.archon/workflows/(#200) - PR worktrees use actual branch for same-repo PRs (#238)
- GitHub adapter parameter bug causes clone failures (#209)
- Auto-detect Claude auth when
CLAUDE_USE_GLOBAL_AUTHnot set (#236) - Worktree provider cleans up branches when worktrees are deleted (#222)
- Extract port utilities to prevent test conflicts with running server (#251)
- Workflows ensure artifacts committed before completing (#203)
- Worktree creation fails when orphan directory exists (#208)
- Add logging to detect silent updateConversation failures (#235)
- Auto-sync
.archonfolder to worktrees before workflow discovery (#219) - Consolidate startup messages into single workflow start comment (#177)
- Show repo identifier instead of server filesystem path (#175)
- Check for existing PR before creating new one (#195)
- Use empty Slack token placeholders in .env.example (#249)
Developer experience improvements and worktree stability.
- Auto-copy default commands/workflows on
/clone(#243) - Pre-commit hook to prevent formatting drift (#229)
- Claude global auth -
CLAUDE_USE_GLOBAL_AUTHfor SDK built-in authentication (#228)
- Update README with accurate command reference and new features (#242)
- Copy
.archondirectory to worktrees by default (#210) - Stale workflow cleanup and defense-in-depth error handling (#237)
- Cleanup service handles missing worktree directories gracefully (#207)
- Worktree limit blocks workflow execution instead of falling back to main (#197)
- Bot self-triggering on own comments (#202)
- Remove unnecessary String() calls in workflow db operations (#182)
Workflow engine improvements with autonomous execution and parallel steps.
- Ralph-style autonomous iteration loops for plan-until-done execution (#168)
- Parallel block execution for workflows - run multiple steps concurrently (#217)
- Workflow router with platform context for intelligent intent detection (#170)
- Emoji status indicators for workflow messages (#160)
- Tests for logger filesystem error handling (#133)
- Make
WorkflowDefinition.stepsreadonly for immutability (#136)
- Detect and block concurrent workflow execution (#196)
- RouterContext not populated for non-slash commands on GitHub (#173)
- Workflow executor missing GitHub issue context (#212)
- Skip step notification for single-step workflows (#159)
- Remove redundant workflow completion message on GitHub (#162)
- Add message length handling for GitHub adapter (#163)
- Use code formatting for workflow/command names (#161)
Introduction of the YAML-based workflow engine.
- Workflow engine for multi-step AI orchestration with YAML definitions (#108)
- Improve workflow router to always invoke a workflow (#135)
- Improve error handling in workflow engine (#150)
- Add ConversationLock to GitHub webhook handler (#142)
- Bot no longer responds to @mentions in issue/PR descriptions (#143)
- Copy git-ignored files to worktrees (#145)
/repo <name>fails due to owner/repo folder structure mismatch (#148)- Load workflows from conversation.cwd instead of server cwd (#149)
- Revert to Bun native YAML parser and add Windows CI (#141)
- Wrap platform.sendMessage calls in try-catch in executor (#132)
- Cloud database pooler idle disconnects gracefully (#118)
Isolation architecture overhaul and Bun runtime migration.
- Bun runtime migration - replaced Node.js/npm/Jest with Bun (#85)
- Unified isolation environment architecture with provider abstraction (#87, #92)
- Scheduled cleanup service for stale worktree environments (#94)
- Worktree limits with user feedback (#98)
- Force-thread response model for Discord (#93)
- Archon distribution config and
~/.archon/directory structure (#101) - User feedback messages for GitHub worktree operations (#90)
- Required SDK options for permissions and system prompt (#91)
- Test coverage for PR worktree creation (#77)
- Drop legacy isolation columns in favor of new architecture (#99)
- Use
isolation_env_idwith fallback toworktree_path(#88)
- Fork PR support in worktree creation (#76)
- Multi-repository path collision bug (#78)
- Status command displays
isolation_env_id(#89) - Worktree path collision for repos with same name (#106)
Initial release of the Remote Agentic Coding Platform.
-
Platform Adapters
- Telegram adapter with streaming support and markdown formatting
- Slack adapter with Socket Mode for real-time messaging (#73)
- Discord adapter with thread support
- GitHub adapter with webhook integration for issues and PRs (#43)
- Test adapter for HTTP-based integration testing
-
AI Assistant Clients
- Claude Code SDK integration with session persistence
- Codex SDK integration as alternative AI assistant
-
Core Features
- PostgreSQL persistence for conversations, codebases, and sessions
- Generic command system with user-defined markdown commands
- Variable substitution ($1, $2, $ARGUMENTS, $PLAN)
- Worktree isolation per conversation for parallel development (#43)
- Session resume capability across restarts
-
Workflow Commands (exp-piv-loop)
/plan- Deep implementation planning with codebase analysis/implement- Execute implementation plans/commit- Quick commits with natural language targeting/create-pr- Create PRs from current branch/merge-pr- Merge PRs with rebase handling/review-pr- Comprehensive PR code review/rca- Root cause analysis for issues/fix-rca- Implement fixes from RCA reports/prd- Product requirements documents/worktree- Parallel branch development/worktree-cleanup- Clean up merged worktrees/router- Natural language intent detection (#59)
-
Platform Features
- Configurable streaming modes (stream/batch) per platform
- Platform-specific authorization (whitelist users)
- Configurable GitHub bot mention via environment variable (#66)
-
Developer Experience
- ESLint 9 with flat config and Prettier integration
- Jest test framework with mocks
- Docker Compose for local development
- Builtin command templates (configurable via LOAD_BUILTIN_COMMANDS)
- Shared worktree cleanup preventing duplicate removal errors (#72)
- Case-sensitive bot mention detection in GitHub adapter
- PR review to checkout actual PR branch instead of creating new branch (#48)
- Template commands treated as documentation (#35, #63)
- Auto-load commands in /clone like /repo does (#55)
- /status and /repos codebase active state inconsistency (#60)
- WORKSPACE_PATH configuration to avoid nested repos (#37, #54)
- Shorten displayed paths in worktree and status messages (#33, #45)
- Create worktrees retroactively for legacy conversations (#56)
- Use commit SHA for reproducible PR reviews (#52, #75)
- Add retry logic to GitHub API calls for transient network failures (#64)