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.
- AWS CodeCommit as a third supported git platform alongside GitHub and GitLab. Auths via AWS access keys or IRSA/instance profile on EKS; PR ops go through
@aws-sdk/client-codecommit. CI checks return[](auto-merge fires onchecksStatus="none");reviewTrigger="on_pr"is recommended over the defaulton_ci_pass(#529). - Ruby and Dart agent image presets — new language-specific base images available in the agent image picker (#470).
- Live model discovery — agent model lists are now fetched directly from provider APIs at runtime rather than being hard-coded, so newly released models appear automatically (#543).
- Claude Fable 5 and GitHub Copilot added as supported agent vendors (#542).
- Git token resolution in repo pods is now more resilient against transient credential lookup failures (#525).
scope='global'secrets now correctly enforceworkspace_id IS NULLin the database, preventing a constraint mismatch that could cause secret lookups to fail (#509).- Missing
auth.oidcblock validation added to the Helm chart, preventing silent misconfiguration when using generic OIDC login (#528).
- Persistent Agents — a third Task tier alongside Repo Tasks and Standalone Tasks. Long-lived, named, message-driven agents that wake on user messages, agent messages, webhooks, cron ticks, or ticket events. Each agent has a stable slug, addressable by other agents in the same workspace via an inter-agent HTTP API. Three configurable pod lifecycle modes:
always-on,sticky(default, with idle warm window), andon-demand. Cyclic state machine reconciled by the existing K8s-style control plane (now a fourthRunKind:persistent-agent). New/agentsUI with chat, turn history, live activity stream, and pause/resume/restart/archive controls (#510). See docs/persistent-agents.md and the four-agent demo in demos/the-forge. - Issues as a top-level nav item — the GitHub Issues queue is now its own page at
/issues, fanning out across multiple configured ticket providers. - Reviews as a top-level nav item — code-review subtasks plus external PR reviews now live at
/reviews(and/reviews/:id), with their own reconcilerRunKind(pr-review). - Workspace member management UI — invite, list, and remove workspace members by email with a server-side duplicate-member 409 guard (#496, #499).
- Agent-aware review configuration — pick the review agent type per repo so reviews can run on a different vendor than the authoring agent (#504).
- Skills marketplace — install skills from any git URL, with agent-typed scoping and a multi-file skill-directory layout so a single skill can target one or many agent types.
- Persistent Agents and Sessions stats bars on the overview page (#521).
- Persisted session chat history — re-opening a session now shows the prior conversation (#517).
- Rich rendering in the agent log viewer — markdown tables and rich blocks render in agent text output (#520).
- Examples directory — runnable, self-contained agent configurations under
examples/, starting with two Persistent Agent setups (Forge and Mars Mission Control). Each example is idempotent — re-runningsetup.shis safe.
- Sidebar nav reorganized. The hub-and-tabs
/taskspage is gone. Each tier has its own dedicated route, grouped into Run (Tasks · Jobs · Reviews · Issues · Scheduled) and Live (Agents · Sessions). The Library group renamed "Templates" to Prompts to free that label. Legacy/tasks?tab=…URLs redirect to the dedicated pages. - User-facing names finalised. Repo Tasks → Tasks; Standalone Tasks → Jobs (matching the existing
/api/jobsURL); PR Reviews → Reviews; Persistent Agents → Agents; Templates (in the Library) → Prompts. Backend table names (tasks,task_configs,workflows,prompt_templates) are unchanged. - Setup wizard defaults agent secrets to global scope with an explicit scope toggle, reducing per-user secret sprawl for the common case (#503).
- README leads with differentiation — self-hosted, BYO-K8s, multi-vendor — to better orient first-time readers (#519).
- Sessions: stop echoing the agent's final line in the chat view (#516).
- Auth:
/menow returns the enriched user object with the caller's workspace role attached (#508).
Upgrading from 0.3.x — there are no required user actions. URL/nav changes:
/tasks?tab=standalone→/jobs(auto-redirected)/tasks?tab=issues→/issues(auto-redirected)/tasks?tab=prs→/reviews(auto-redirected)- The "Templates" sidebar item is now labeled Prompts but still points to
/templates.- The new
/agentsroute requires the v0.4 schema migration (1777200001_persistent_agents.sql) — applied automatically on API startup.No data migration is needed. Existing tasks, workflows, triggers, and templates continue to work unchanged.
- External PR auto-review — review agent for PRs on external repos with chat + one-click merge, lifted into its own primitive alongside task-generated reviews.
- Google Vertex AI authentication mode for Claude Code — route Claude through GCP Vertex AI using
CLAUDE_VERTEX_PROJECT_ID/CLAUDE_VERTEX_REGIONand an optional (encrypted, global-scope) service account key, with workload-identity fallback (#478). - Workload identity support for agent pods, plus fixes to repo pod lifecycle (#486).
- User-scoped secrets — keep identity tokens out of the pod env and scope them per user (#474).
- Secrets injected into pod env for setup commands (#471), and an OAuth refresh widget on
/secretsthat hides the banner when visible. - Resume stopped agents on chat message — sending a chat message to a stopped task resumes the agent (#488).
- Multi-repo + multi-tracker ticket integration — redesigned setup flow (#489).
- Dynamic per-provider model & options picker with a refresh button for agent settings (#493).
- Gemini model options updated with new preview models (#490).
- GKE & Gateway deployment enhancements in the Helm chart (#461).
- Diagnostic logging for raw error detection in agent adapters (#467).
- PR reviews folded into the Tasks page — removed the sidebar duplicate; task and PR-review detail views now share primitives (#494, #485, f1a6da4).
- Repo settings page — split external PR review out and tabified agent settings (#487).
- Standalone Tasks pipeline stats bar restored on the overview page.
- Opus model option bumped from 4.6 to 4.7 (#491).
- Reconciler: guard PR-reactive actions (auto-merge, complete-on-merge, review launch) to coding tasks only so external PR reviews don't trip them (#480).
- Reviews: stop writing external PR URLs to
pr_reviewtask rows (#481). - Secrets: downgrade
scope='user'to'global'when auth is disabled. - API: derive Claude/Codex/Gemini mode from secret names on public
/setup/status(#477). - Auth: add OIDC routes to public auth routes so login works before a session exists (#479).
- Helm: restore
chowncapabilities in postgres init containers (#482); fix postgres volume permissions and decoupleisSetUpfrom runtime health (#472). - Images: change agent user UID from 1000 to 1001 to avoid conflicts on managed node images (#466).
- Gemini agent: settings validation, parser crash, and exit-code inference (#463).
- Correct sub-hour timezone drift in
getETDate(#462).
- Ticket sync: fall back to the configured GitHub App (or
GITHUB_TOKENPAT) when a GitHub ticket provider has no inline token or provider-specific secret. Previously sync hard-failed with"GitHub provider requires token, owner, and repo in config"even when a GitHub App was fully configured (#458).
- Pooled standalone-task pods — runs within a workflow now share pods, scaling out to
workflows.maxPodInstancesreplicas each hosting up toworkflows.maxAgentsPerPodconcurrent runs (mirrors repo pod scaling). Runs track assigned pods viaworkflow_runs.pod_idwithlast_pod_idfor retry affinity, and pool selection follows preferred → least-loaded → scale-up → overflow. Fixes a leak where a burst of triggers would spawn one pod per run even though only a few ran at once.
- Reconciliation control plane is now authoritative — the K8s-style reconciler (shadow mode in 0.2.0) now owns PR-driven transitions, auto-merge, complete-on-merge, fail-on-close, auto-resume, review launch, stall detection, pod-death detection, and control intent (cancel/retry/resume/restart) for both Repo Tasks and Standalone Tasks.
- Shared auth banner, state badge, and metadata card across task pages for a consistent UX.
- Reconciler: clear stale
finishedAtwhen retrying a standalone run. - Reconciler: use unique jobIds for executor enqueues to prevent BullMQ dedup collisions.
- Agent adapters: include
cache_readandcache_creationtokens in input totals (#457). - API: trigger auth banner when the usage endpoint detects an expired OAuth token (#455).
- API: detect Claude auth failures mid-run in standalone task runs and override nominally-successful exit codes.
- Document the unified reconciler and the Repo vs Standalone Task model.
- Unified Task model — single polymorphic
/api/tasksHTTP resource covering Repo Tasks, Repo Task blueprints, and Standalone Tasks; unified resolver acrosstasks,task_configs, andworkflows - Standalone Tasks (Agent Workflows) — agent runs with no repo checkout,
{{PARAM}}prompt templates, four trigger types (manual / schedule / webhook / ticket), isolated pod execution, WebSocket log streaming, auto-retry with exponential backoff, clone, visual editors, search and filters - Connections — external service integrations via MCP with built-in providers (Notion, GitHub, Slack, Linear, PostgreSQL, Sentry, Filesystem) plus custom MCP servers and HTTP APIs; three-layer model of providers → connections → per-repo/agent-type assignments
- Reconciliation control plane (shadow mode) — K8s-style reconciler for task and pod state, running in observe-only mode
- StatefulSets for repo pods, Jobs for workflow pods — native K8s controllers replace ad-hoc pod management
- Generic OIDC OAuth provider — self-hosted SSO via
OIDC_ISSUER_URL+OIDC_CLIENT_ID+OIDC_CLIENT_SECRET - OpenTelemetry instrumentation — Fastify HTTP metrics plugin and wired-up callsites
- OpenAPI + Swagger UI at
/docs— Zod type-provider migration across all routes (10-phase rollout covering tasks, workflows, repos, sessions, PR reviews, issues, workspaces, notifications, analytics, setup, secrets, optio, cluster, auth, GitHub) - Workspace-level audit log and activity feed
- Outbound webhooks — fire on workflow run events with UI management
- Expanded dashboard analytics — performance, agents, and failure insights
- Planning mode and message bar improvements for agent interaction
- OpenClaw agent runtime adapter
- OpenCode custom OpenAI-compatible endpoints
- Multi-arch image publishing — amd64 + arm64 for all service and agent images
- Ticket trigger UI in TriggerSelector and task forms
- Ticket-provider auth failure handling — surfaced in UI with auto-disable
- Stale Claude OAuth token detection — surface before 401s
- nodeSelector and tolerations for api, web, optio, postgres, redis, and agent pods
OPTIO_ALLOW_PRIVATE_URLS— SSRF-check bypass for private network integrations
- Overview panel redesign — reordered sections, side-by-side recent tasks and pods, responsive multi-column / masonry grid with auto-fit minmax
- Replaced connections modal with inline form
- Renamed "Workflows" to "Agent Workflows" in UI; docs consolidate Schedules + Workflows into a unified Tasks section
- Removed redundant templates and schedules — superseded by agent workflows
- Workflow tables replaced with new Workflows data model
- Top Failures and Performance dashboard panels
- "N tasks failed today" dashboard banner
- Classify agent auth failures as run failures rather than global failures
- Escalate repo tasks to
needs_attentionwhen the agent completes without opening a PR - Prevent false task failures when agent creates a PR but exits non-zero
- Detect and clean up zombie
workflow_runswith terminated pods - Six K8s infra bugs blocking standalone/scheduled runs and repo pods
- Pod
securityContextand explicit UID for PVC permissions on GKE - Re-read task state before orphan reconciliation transitions
- Use
KubernetesObjectApifor merge-patch annotations; fix scale API - Persist workflow run logs and publish to per-run channel
- Allow access to workflows with null
workspaceId - Treat empty-string env vars as missing in
parseIntparsing - JSON.parse error handling for agent scheduling env vars
- Health check passes when ClusterRole is not deployed
- Record GitHub 401s to
auth_eventsfor banner detection - Dismiss GitHub/Claude token banners immediately after save
- Clear stale auth-failure banner when token is updated
- Scope auth failure detection to distinguish provider vs global token failures
- Replace Drizzle
migrate()with hash-based runner; add missing 0046 migration entry to Drizzle journal - Merge new chart defaults on
update-localupgrade - Rename
/docs/guides/workflowsroute to/docs/guides/standalone-tasks
- Pod-per-repo architecture — long-lived Kubernetes pods with git worktrees for concurrent task execution per repository
- Task orchestration — full task lifecycle with state machine (pending, queued, provisioning, running, pr_opened, completed, failed, cancelled, needs_attention)
- Priority queue with concurrency limits — global and per-repo concurrency controls, priority-based scheduling, and task reordering
- Subtask system — child, step, and review subtask types with parent blocking and completion tracking
- Code review agent — automatic PR review as a blocking subtask, configurable triggers (on CI pass or PR open), and dedicated review prompts
- PR watcher — polls GitHub PRs for CI status, review status, merge/close events; auto-completes on merge, auto-fails on close
- Auto-resume on review — re-queues tasks with reviewer comments when changes are requested
- Auto-resume on CI failure and merge conflicts — detects failures and re-queues the agent to fix them
- Auto-merge — merges PRs automatically when CI passes and reviews are approved
- Auto-close linked GitHub issues — closes the originating GitHub issue when a task completes
- GitHub Issues integration — browse issues across repos, one-click assign to create tasks, bulk assign all
- Linear ticket provider — sync tasks from Linear projects
- Structured log streaming — real-time NDJSON parsing of Claude Code output with typed log entries (text, tool_use, tool_result, thinking, system, error, info)
- WebSocket event streaming — live task state and log updates pushed to the web UI via Redis pub/sub
- Web UI — Next.js 15 app with task list, task detail with log viewer, repo management, cluster health, secrets management, and setup wizard
- Cluster health dashboard — expandable resource usage graphs, pod health monitoring, and stale task detection
- Pod health monitoring — automatic detection of crashed/OOM-killed pods, auto-restart, orphan worktree cleanup, and idle pod cleanup
- Secrets management — AES-256-GCM encrypted secrets with global and repo-scoped support
- Prompt templates — configurable system prompts with template variables and conditional blocks; per-repo overrides
- Per-repo agent settings — configurable Claude model, context window, thinking mode, effort level, and max turns
- Auto-detect image preset — detects project language (Node, Python, Go, Rust) from repo files and selects the appropriate container image
- Agent adapters — pluggable adapter interface with Claude Code and OpenAI Codex implementations
- Container runtimes — Docker and Kubernetes runtime backends
- Authentication — API key and Max Subscription (OAuth) modes for Claude Code
- Error classification — pattern-matching error classifier with human-readable titles, descriptions, and remediation suggestions
- Helm chart — full Kubernetes deployment with configurable Postgres, Redis, ingress, RBAC, and secrets
- Pre-commit hooks — Husky with lint-staged, Prettier formatting, ESLint, typecheck, and conventional commit enforcement
- CI pipeline — GitHub Actions for format checking, typechecking, testing, web build, and Docker image build