diff --git a/releases/beta/v2026.1110.0-beta.0.md b/releases/beta/v2026.1110.0-beta.0.md new file mode 100644 index 00000000000..4d5e0acd45c --- /dev/null +++ b/releases/beta/v2026.1110.0-beta.0.md @@ -0,0 +1,77 @@ +# Paperclip v2026.1113.0 + +> Released: 2026-11-13 + +Paperclip v2026.1113.0 carries 1,586 commits, promoted from `2026.1110.0-beta.0`. The headline is a new default workspace: the Coordinator layout and Agent Chat are now standard, and task chat shows what a Runner agent actually did — its plan, inline diffs, tool calls, subagents, and a plan you can approve. Around that: agents that can set up connections within delegated authority, a full YAML editor for agent configuration, context-window and usage-limit readouts with a one-click Compact, proactive chat messages and automatic mid-turn steering for Codex and Pi, Codex image generation, and 1Password, Supabase, Vercel, and boxd in the catalog. Underneath, Runner runs continue through restarts, crashes, and container redeploys in far more cases, local Codex and OpenCode agents stay warm for much faster follow-ups, sandbox workspaces can survive a server replacement on S3-backed installs, the board keeps working through dropped connections, and run logs and skill packages move out of PostgreSQL into your configured storage. + +## Breaking Changes + +- **The built-in Google Workspace connector is off by default.** While Paperclip's Google app verification is pending, the unified Google Workspace connection introduced in v2026.1106.0 is gated behind a new experimental setting: with it off, the connector is hidden from Apps and its setup, discovery, and tool execution are blocked — including connections saved on v2026.1106.0 — and the Composio and Arcade Google apps appear instead. To keep a Google Workspace connection working, turn on **Settings → Experimental → Google Workspace connector (Paperclip)** (`enableGoogleWorkspaceConnector`). ([#19247](https://github.com/paperclipai/paperclip/pull/19247)) +- **Every subtask gets its own execution workspace.** Child tasks no longer share the parent's checkout, branch, or unmerged changes, on every creation path (API, `create_task`, chat suggestions, plugins, and the New sub-task dialog); `inheritExecutionWorkspaceFromIssueId` now copies only the project and workspace strategy, and an ancestor's `executionWorkspaceId` passed on create is dropped. A child an older release bound to its parent's workspace moves to its own workspace on its next run. Work that relied on a child editing the parent's checkout must merge or push through Git; unrelated tasks can still share a workspace through an explicit `existing` selection. ([#19860](https://github.com/paperclipai/paperclip/pull/19860)) +- **Agent-created task trees stop at parent → child.** When an agent asks for a grandchild, the server creates the task beside the requester under the requester's parent and returns `parentAdjusted: true` instead of nesting deeper; board users can still nest to any depth and existing trees stay valid. Scripts that expect `parentId` to match the request should read `parentAdjusted`. ([#19312](https://github.com/paperclipai/paperclip/pull/19312)) +- **Native agents report task status through `paperclip_finish`/`paperclip_block`.** While a native run holds its task, the assigned agent's own `PATCH /api/issues/{id}` status change returns `409 native_run_status_reported_by_finish`, and the same applies to the recovery-action resolve route; custom instructions or skills that told Runner agents to PATCH their own status should switch to the finish tools. ([#18411](https://github.com/paperclipai/paperclip/pull/18411), [#18489](https://github.com/paperclipai/paperclip/pull/18489)) +- **Local Codex and OpenCode Runner agents stay warm by default.** When the Runner lifecycle is unset, local Codex and OpenCode agents keep their runner for a 5-minute idle window after a run; Claude, remote targets, and other harnesses stay per-turn. Migration `0443` clears the stored "Turn by turn" value from existing native Codex, OpenCode, and Claude agents unless their configuration history shows someone explicitly chose it, logging an `agent.updated` activity entry per agent. To keep a runner from staying resident, set Runner lifecycle back to **Turn by turn**. ([#19888](https://github.com/paperclipai/paperclip/pull/19888)) +- **Skill packages move out of PostgreSQL, and this release becomes the rollback floor.** After migration `0415`, repository and managed skill package contents convert in the background to your configured file or object storage after a read-back check. Once that runs, an older binary needs the database contents rehydrated; set `PAPERCLIP_SKILL_PACKAGE_STORAGE_ENABLED=false` on every process during a mixed-version rolling upgrade, and keep that storage durable and backed up. Skill version list responses now return file names and kinds without file bodies. ([#18082](https://github.com/paperclipai/paperclip/pull/18082)) +- **Enter submits task replies and new tasks.** Shift+Enter inserts a new line; to keep Cmd/Ctrl+Enter submission, turn on the experimental preference **Command/Ctrl+Enter to Submit** (`enableLegacyComposerSubmit`). ([#19272](https://github.com/paperclipai/paperclip/pull/19272)) +- **`pi_local` processes no longer inherit the server's `PAPERCLIP_*` environment.** Only the runtime API URL and listen host/port, the run-scoped variables, and the adapter's configured env pass through; a `pi_local` command that relied on an inherited server variable must set it in the agent's adapter env. ([#14503](https://github.com/paperclipai/paperclip/pull/14503)) + +## Highlights + +- **The Coordinator workspace and Agent Chat are standard** — Everyone now lands in a workspace built around one conversation per agent: task proposals turn a chat request into an assigned task linked back to its conversation, tasks and decisions show as compact cards, documents open in contextual panels, and an Inbox queue gathers what needs you with search, filters, and history, while task access, assignment authorization, and review gates still apply ([#17983](https://github.com/paperclipai/paperclip/pull/17983), [#19360](https://github.com/paperclipai/paperclip/pull/19360)). Navigation groups Chat, Tasks, and Inbox with a New task button, Tasks opens All tasks and remembers your view, and old Inbox links redirect into Tasks ([#18703](https://github.com/paperclipai/paperclip/pull/18703), [#18831](https://github.com/paperclipai/paperclip/pull/18831), [#19363](https://github.com/paperclipai/paperclip/pull/19363), [#19393](https://github.com/paperclipai/paperclip/pull/19393)); the Chat directory lists every agent with avatar, role, search, and unread counts, and agents can be pinned alongside pages ([#19685](https://github.com/paperclipai/paperclip/pull/19685), [#19627](https://github.com/paperclipai/paperclip/pull/19627)). Each person can return to the previous layout with **Classic workspace** in Experimental settings. +- **Task chat shows what the agent actually did** — Runner turns render the agent's own plan as a docked task list ([#19252](https://github.com/paperclipai/paperclip/pull/19252)); file edits carry inline `+N −M` diffs and turns that changed files end with a "Changed in this turn" card ([#19269](https://github.com/paperclipai/paperclip/pull/19269)); tool rows name the verb, subject, exit code, and duration, and say when policy refused a tool ([#19265](https://github.com/paperclipai/paperclip/pull/19265)); Claude subagents appear as collapsible cards with their prompt, progress, nested tools, and result ([#19264](https://github.com/paperclipai/paperclip/pull/19264)); hook decisions and Codex auto-review verdicts, web searches, model switches, waits, and verification checks get their own rows ([#19266](https://github.com/paperclipai/paperclip/pull/19266), [#19262](https://github.com/paperclipai/paperclip/pull/19262)); Codex reasoning summaries show as headline bullets ([#19271](https://github.com/paperclipai/paperclip/pull/19271)); and harness banners such as "Compacting…" show as chips instead of leaking into the answer ([#19267](https://github.com/paperclipai/paperclip/pull/19267)). Planning runs put Codex and Claude into their native plan mode, and the proposed plan becomes the task's Plan document behind the confirmation gate, so **Approve** resumes the agent and **Request changes** sends your reason back ([#19291](https://github.com/paperclipai/paperclip/pull/19291)). The final chat reply is now the agent's complete answer (up to 32,000 characters) instead of a 4,000-character preview ([#19971](https://github.com/paperclipai/paperclip/pull/19971)). +- **Runner runs continue through restarts and redeploys** — After a graceful restart, deploy, crash, or container replacement, a native run continues on its own in far more cases: a run caught during bootstrap or sandbox and workspace preparation restarts its bootstrap on the same run, and a turn interrupted mid-flight continues once in the same conversation on Claude and OpenCode as well as Codex ([#19524](https://github.com/paperclipai/paperclip/pull/19524), [#19616](https://github.com/paperclipai/paperclip/pull/19616), [#19694](https://github.com/paperclipai/paperclip/pull/19694), [#20153](https://github.com/paperclipai/paperclip/pull/20153), [#19501](https://github.com/paperclipai/paperclip/pull/19501), [#19699](https://github.com/paperclipai/paperclip/pull/19699), [#20118](https://github.com/paperclipai/paperclip/pull/20118)). Remote Runner agents are re-adopted after a server restart from encrypted controller checkpoints, keeping the sandbox lease, session, and active turn ([#17439](https://github.com/paperclipai/paperclip/pull/17439)). Each server boot now holds a fenced database lease, so work stranded by a replaced Docker, Kubernetes, or Fly container is recovered instead of staying stuck, and held records are released as soon as their owner is proven gone rather than after an age timeout ([#20054](https://github.com/paperclipai/paperclip/pull/20054), [#19953](https://github.com/paperclipai/paperclip/pull/19953), [#19950](https://github.com/paperclipai/paperclip/pull/19950), [#20004](https://github.com/paperclipai/paperclip/pull/20004), [#20006](https://github.com/paperclipai/paperclip/pull/20006)); accepted results finalize within seconds of a restart after a hard kill ([#19713](https://github.com/paperclipai/paperclip/pull/19713), [#19591](https://github.com/paperclipai/paperclip/pull/19591)); queued runs start within about a second of the server listening ([#19431](https://github.com/paperclipai/paperclip/pull/19431)); and restarts no longer use up a run's recovery budget ([#19948](https://github.com/paperclipai/paperclip/pull/19948), [#19625](https://github.com/paperclipai/paperclip/pull/19625)). For a record no server can judge, the board gets a **Confirm the previous server stopped** action ([#20067](https://github.com/paperclipai/paperclip/pull/20067), [#20084](https://github.com/paperclipai/paperclip/pull/20084)). +- **Much faster follow-ups** — With local Codex and OpenCode agents warm by default, measured follow-up time to first token at p50 fell from 12.0 s to 4.7 s for Codex and from 21.7 s to 4.2 s for OpenCode ([#19888](https://github.com/paperclipai/paperclip/pull/19888)); follow-ups claim a parked runner while still preparing ([#20195](https://github.com/paperclipai/paperclip/pull/20195)), Claude follow-ups reach the provider about 1.5–2 s sooner ([#20145](https://github.com/paperclipai/paperclip/pull/20145)), and starts reuse verified executables, provider packs, and startup context ([#18390](https://github.com/paperclipai/paperclip/pull/18390), [#17749](https://github.com/paperclipai/paperclip/pull/17749), [#18405](https://github.com/paperclipai/paperclip/pull/18405)). +- **Sandbox workspaces that survive a server replacement** — On installs with external PostgreSQL, S3 storage, and a stable secrets master key, new task workspaces for Runner agents on sandbox environments stay in the sandbox and each run's files are saved as encrypted, verified snapshots in object storage; a replacement server reconnects to the recorded sandbox or restores the last saved version into a new one, without the old host or copying files back to the web server's disk. The Files panel labels **Live workspace** or **Saved copy**, existing workspaces can be imported explicitly with `server/scripts/migrate-remote-workspaces.ts` (dry run first, then `--apply`), and other setups keep their current path. Edits made since the last save still depend on the live sandbox. ([#18403](https://github.com/paperclipai/paperclip/pull/18403), [#18826](https://github.com/paperclipai/paperclip/pull/18826)) +- **Agents can set up connections** — Within their own grants (`tools:manage_connections`, `tools:manage_profiles`, and related) and their responsible person's current authority, agents can configure app and tool connections, chat and email channels, AI accounts and pools, access profiles, and MCP gateways through the same APIs the app uses; steps that need a person — sign-in, consent, credential entry — are saved as handoffs in the usual setup screens and the agent continues when you finish them. Agents still cannot approve their own governed requests or edit their own permission grants; a change a user explicitly asked for may loosen the acting agent's own tool controls without a separate approval. Existing agents' permissions are not backfilled. ([#17737](https://github.com/paperclipai/paperclip/pull/17737), [#17739](https://github.com/paperclipai/paperclip/pull/17739)) +- **Edit an agent as one YAML document** — A new **Advanced** tab edits the whole configuration — profile, harness and runtime, instruction files, skill pins, tools, channels, permissions and trust, secrets, and API keys — as a versioned `paperclip/v1` Agent document. Saves go through each resource's own API and validation with a change preview, stale writes are rejected, partial saves keep the draft, and credentials stay redacted; omitted settings are left unchanged and explicit empty values clear them. ([#18036](https://github.com/paperclipai/paperclip/pull/18036), [#18168](https://github.com/paperclipai/paperclip/pull/18168)) +- **Context and usage limits in view** — Task properties show the assignee's context window ("10% of 258k") with a breakdown of tokens, cached input, cost, and compactions for Codex and Claude Runner agents, and the chat marks each compaction ([#19273](https://github.com/paperclipai/paperclip/pull/19273)); **Compact now** runs the harness's own compaction between runs, board-only and unavailable mid-run ([#19378](https://github.com/paperclipai/paperclip/pull/19378)); a **Usage limit** line shows the provider's rate-limit window ("5h 78% · resets 15:40") ([#19270](https://github.com/paperclipai/paperclip/pull/19270)); and an agent that hits its provider limit waits as "Waiting for usage limit reset" instead of burning runs and retries, while manual runs and conversation turns still start ([#19246](https://github.com/paperclipai/paperclip/pull/19246)). +- **Chat that reaches you, and agents you can steer** — Agents can post a result to their standing chat with their responsible person through a new `send_chat_message` tool, with task-access and privacy checks, a link to the source task, and per-person unread state ([#18374](https://github.com/paperclipai/paperclip/pull/18374)). A message queued while a Codex or Pi Runner turn is running is steered into the live turn after a 5-second "Sending in Xs" window with Edit and Cancel; other harnesses keep the queue, and Steer and Interrupt stay available ([#19970](https://github.com/paperclipai/paperclip/pull/19970)). +- **A board that rides out outages** — One connection banner replaces per-page errors, loaded content stays visible during an outage and refreshes on recovery ([#15754](https://github.com/paperclipai/paperclip/pull/15754), [#18822](https://github.com/paperclipai/paperclip/pull/18822)); task edits, documents, decisions, new tasks, and messages keep their draft through a disconnect and are verified or offered for resend instead of being lost or duplicated ([#17960](https://github.com/paperclipai/paperclip/pull/17960), [#18412](https://github.com/paperclipai/paperclip/pull/18412)); a small set of reads is cached per user and company for 24 hours so a reload during an outage still shows them, cleared on sign-out ([#18825](https://github.com/paperclipai/paperclip/pull/18825)); and a stale tab after a deploy reloads itself when a page chunk fails ([#17349](https://github.com/paperclipai/paperclip/pull/17349), [#19361](https://github.com/paperclipai/paperclip/pull/19361)). +- **Codex image generation and skill discovery** — Codex Runner agents keep Codex's built-in image tool on their existing sign-in, and agents on a direct OpenAI API-key connection get a Paperclip `generate_image` tool that calls `gpt-image-2` server-side, keeps the key out of the agent's shell, and counts the spend against the agent's budget ([#19516](https://github.com/paperclipai/paperclip/pull/19516), [#19654](https://github.com/paperclipai/paperclip/pull/19654)). New `search_skills` and `load_skill` tools let an agent find and read company skills it was not assigned, under the run's existing company and project access checks and without changing its assignments ([#19676](https://github.com/paperclipai/paperclip/pull/19676)). +- **Storage that leaves PostgreSQL** — On S3-backed instances, new run logs and opted-in provider traces are written as immutable segments in the existing bucket with no new settings, raw traces encrypted with the existing vault key, and existing local history is copied in the background with verified digests ([#18327](https://github.com/paperclipai/paperclip/pull/18327)). Skill packages move to the configured file or object storage ([#18082](https://github.com/paperclipai/paperclip/pull/18082)). Extra project repositories under `.paperclip-repositories/` become worktrees of one shared clone per project and repository instead of full per-task clones, with opt-in sweeps that move existing workspaces over ([#17382](https://github.com/paperclipai/paperclip/pull/17382), [#17369](https://github.com/paperclipai/paperclip/pull/17369), [#17407](https://github.com/paperclipai/paperclip/pull/17407)). +- **More in the catalog** — 1Password as a service-account connection with eight governed vault and item actions ([#17249](https://github.com/paperclipai/paperclip/pull/17249)); Supabase gains a Management API connection with eleven reviewed project, Auth, Data API, and Edge Function actions, and Vercel becomes a team-scoped REST connection replacing its unavailable MCP entry ([#17217](https://github.com/paperclipai/paperclip/pull/17217)); and a new **boxd** sandbox provider plugin runs each sandbox as a KVM microVM that suspends between runs of the same task with disk, memory, and processes kept ([#17284](https://github.com/paperclipai/paperclip/pull/17284)). Kimi Code joins the Runner as an experimental harness while the **Native runner** experimental setting is on ([#18028](https://github.com/paperclipai/paperclip/pull/18028)). + +## Fixes + +- **Runs, Stop, and Retry** — Retry after exhausted or blocked recovery continues in the task's own worktree with uncommitted files, branch, and `.git` intact ([#19666](https://github.com/paperclipai/paperclip/pull/19666), [#19693](https://github.com/paperclipai/paperclip/pull/19693)); a plain task Retry gets the normal bounded automatic retry on a transient setup failure ([#19384](https://github.com/paperclipai/paperclip/pull/19384)); Retry on a chat-connected task under lock contention is saved or returns a retryable `409` instead of a `500` ([#18895](https://github.com/paperclipai/paperclip/pull/18895), [#18896](https://github.com/paperclipai/paperclip/pull/18896)); holds left by cancelled retries, duplicate no-replay holds, and full-disk restarts no longer block later messages and Retry ([#19276](https://github.com/paperclipai/paperclip/pull/19276), [#17055](https://github.com/paperclipai/paperclip/pull/17055), [#18838](https://github.com/paperclipai/paperclip/pull/18838), [#19181](https://github.com/paperclipai/paperclip/pull/19181)); stopping a run while its native session is starting returns `409 native_stop_pending` instead of a `500` ([#19189](https://github.com/paperclipai/paperclip/pull/19189)), Stop retries a PostgreSQL deadlock instead of failing ([#17895](https://github.com/paperclipai/paperclip/pull/17895)), and a run whose runner connection goes silent for 90 seconds is ended and recovered instead of showing "Working" forever ([#19407](https://github.com/paperclipai/paperclip/pull/19407)); an Interrupt settles like a Stop followed by your message instead of a failed-attempt banner ([#19633](https://github.com/paperclipai/paperclip/pull/19633), [#19149](https://github.com/paperclipai/paperclip/pull/19149)); a sandbox provider's temporary 5xx, 429, or timeout at lease time retries automatically ([#19412](https://github.com/paperclipai/paperclip/pull/19412)); releasing a subtree pause restarts the work it interrupted, once ([#19394](https://github.com/paperclipai/paperclip/pull/19394), [#19421](https://github.com/paperclipai/paperclip/pull/19421)); a blocked task whose dependency finished during its assignee's active turn continues when that turn ends ([#19457](https://github.com/paperclipai/paperclip/pull/19457)); successful routine runs no longer trigger a handoff wake that ends `blocked` ([#9129](https://github.com/paperclipai/paperclip/pull/9129)); and the Runner stops every process a provider or tool started when a run ends, including `nohup`/`setsid` jobs ([#19727](https://github.com/paperclipai/paperclip/pull/19727)). +- **Messages and comments** — A comment is no longer lost when a restart lands between saving it and writing its wake, when its run is cancelled as stale, or when it was added to a queued run ([#19992](https://github.com/paperclipai/paperclip/pull/19992), [#20066](https://github.com/paperclipai/paperclip/pull/20066), [#18913](https://github.com/paperclipai/paperclip/pull/18913)); a comment sent while the agent or company is paused is saved and delivered once when the pause lifts ([#19956](https://github.com/paperclipai/paperclip/pull/19956)); a steered message is no longer lost to a restart before the model reads it ([#19962](https://github.com/paperclipai/paperclip/pull/19962)); messages sent while a run prepares go into its first turn instead of interrupting it, and messages sent while it finalizes are delivered once afterward ([#20168](https://github.com/paperclipai/paperclip/pull/20168), [#19183](https://github.com/paperclipai/paperclip/pull/19183)); Send on a saved follow-up after the earlier run finished the task reopens and delivers it once ([#19600](https://github.com/paperclipai/paperclip/pull/19600)); an answered card's receipt leaves the composer queue ([#19376](https://github.com/paperclipai/paperclip/pull/19376)); and a run whose task was reassigned away can no longer close the new owner's task ([#19186](https://github.com/paperclipai/paperclip/pull/19186)). +- **Costs and budgets** — One missing usage receipt no longer freezes a company with a hard budget behind "completed runs await accounting": once recovery ends and the provider is verifiably stopped, known usage settles (priced from the rate card, or recorded as unpriced usage under your policy), a run without closure evidence holds new work for at most 10 minutes, and admission refuses only for a reached hard stop, an explicit pause, or an inactive company ([#19497](https://github.com/paperclipai/paperclip/pull/19497), [#19673](https://github.com/paperclipai/paperclip/pull/19673), [#19606](https://github.com/paperclipai/paperclip/pull/19606), [#19944](https://github.com/paperclipai/paperclip/pull/19944)); comments, Retries, and new assignments made during a temporary accounting hold run exactly once when it clears ([#19741](https://github.com/paperclipai/paperclip/pull/19741), [#19702](https://github.com/paperclipai/paperclip/pull/19702), [#19829](https://github.com/paperclipai/paperclip/pull/19829)); a budget or agent pause that stops a native run no longer leaves the task Blocked with no control ([#20143](https://github.com/paperclipai/paperclip/pull/20143)); **Raise budget** on a hard stop now files one Retry for each task run the budget stopped, without charging an attempt ([#20144](https://github.com/paperclipai/paperclip/pull/20144)); usage reported before a Codex run's first turn is no longer billed to that run ([#19783](https://github.com/paperclipai/paperclip/pull/19783)); and the budget overview no longer fails on a policy that references a deleted agent or project ([#18389](https://github.com/paperclipai/paperclip/pull/18389)). +- **Permissions and access** — `PATCH /api/agents/{id}` with a `status` field no longer gets around the board-only Pause and Terminate actions ([#19955](https://github.com/paperclipai/paperclip/pull/19955), [#20164](https://github.com/paperclipai/paperclip/pull/20164)); turning off "Can create agents" on a CEO agent now stops `hire_agent` and `POST /agent-hires` ([#20041](https://github.com/paperclipai/paperclip/pull/20041)); the default unscoped `tools:use` grant no longer turns on actions a connection's tool profile left off ([#20160](https://github.com/paperclipai/paperclip/pull/20160)), and saving an installation list no longer re-attaches the broad profile to agents you had narrowed ([#17906](https://github.com/paperclipai/paperclip/pull/17906)); plugin logs, job runs, and dashboard data return only the caller's companies, with instance admins keeping the instance-wide view ([#17435](https://github.com/paperclipai/paperclip/pull/17435)); the `credentialValues` envelope is redacted from HTTP logs ([#13742](https://github.com/paperclipai/paperclip/pull/13742)); and secret redaction runs in linear time, so a large base64 payload no longer freezes the server ([#16999](https://github.com/paperclipai/paperclip/pull/16999)). +- **Workspaces and sandboxes** — Paperclip records a sandbox's owner before asking the provider to create it, so a failed write or server replacement no longer leaves an untracked sandbox running ([#18357](https://github.com/paperclipai/paperclip/pull/18357)), and a restart during acquire or teardown reclaims it at the next startup sweep ([#19696](https://github.com/paperclipai/paperclip/pull/19696), [#19749](https://github.com/paperclipai/paperclip/pull/19749)); orphaned sandboxes are stopped and kept for their files, then destroyed once unreferenced ([#19964](https://github.com/paperclipai/paperclip/pull/19964), [#19976](https://github.com/paperclipai/paperclip/pull/19976)); a consented environment delete also destroys sandboxes kept for failed runs' file recovery ([#20085](https://github.com/paperclipai/paperclip/pull/20085), [#20099](https://github.com/paperclipai/paperclip/pull/20099)); Daytona auto-stop always fires at least 5 minutes after the warm idle window, a sandbox in Daytona's `error` state is recovered, and exports stream around a full sandbox disk ([#19199](https://github.com/paperclipai/paperclip/pull/19199), [#19178](https://github.com/paperclipai/paperclip/pull/19178), [#18172](https://github.com/paperclipai/paperclip/pull/18172)); a leftover `.paperclip-upload-*` file or `.clone-*` staging directory no longer breaks every later copy-back or run ([#19730](https://github.com/paperclipai/paperclip/pull/19730), [#19374](https://github.com/paperclipai/paperclip/pull/19374)); stopping a run stuck retrying copy-back saves its files and frees the workspace ([#19385](https://github.com/paperclipai/paperclip/pull/19385)); two tasks starting at once on one repository no longer collide on `.git/config` ([#20039](https://github.com/paperclipai/paperclip/pull/20039)); plain non-Git directories can be closed ([#19553](https://github.com/paperclipai/paperclip/pull/19553)); child tasks sharing a busy workspace wait as one parked retry in arrival order ([#19143](https://github.com/paperclipai/paperclip/pull/19143)); and a fresh checkout with no author settings commits as `Paperclip ` instead of failing ([#18094](https://github.com/paperclipai/paperclip/pull/18094)). +- **Adapters** — Sandbox Claude runs in `approve-all` mode no longer stall 30 minutes on a permission request that never arrives ([#19430](https://github.com/paperclipai/paperclip/pull/19430)); "Claude - Subscription" sign-in works again with Claude CLI 2.1.291 ([#15550](https://github.com/paperclipai/paperclip/pull/15550)); native Claude agents see `request_human_input` again and re-apply the chosen effort after a cold resume ([#18046](https://github.com/paperclipai/paperclip/pull/18046), [#19708](https://github.com/paperclipai/paperclip/pull/19708)); legacy Codex shell commands can use the run's managed `git` and `gh` again ([#17605](https://github.com/paperclipai/paperclip/pull/17605)) and a saved search-off setting is kept on Runner launches ([#17744](https://github.com/paperclipai/paperclip/pull/17744)); OpenCode sessions over 4 MiB resume again, a reply cut off at the output limit is never settled as the answer, and tool results over 64 KiB are delivered whole up to 1 MiB ([#18218](https://github.com/paperclipai/paperclip/pull/18218), [#19242](https://github.com/paperclipai/paperclip/pull/19242), [#17825](https://github.com/paperclipai/paperclip/pull/17825)); failed runs show the provider's sanitized error, provider, phase, and HTTP status, and a model the provider rejects shows as "Model unavailable" and fails at once instead of retrying ([#18622](https://github.com/paperclipai/paperclip/pull/18622), [#18087](https://github.com/paperclipai/paperclip/pull/18087), [#19548](https://github.com/paperclipai/paperclip/pull/19548)); native failover backups no longer carry per-launch homes, plugin `node_modules`, or pnpm stores, and earlier leftovers are swept ([#17618](https://github.com/paperclipai/paperclip/pull/17618)); and Claude ACP session saves on Windows no longer fail with `EPERM` ([#16925](https://github.com/paperclipai/paperclip/pull/16925)). +- **Chat and task UI** — The editor stores `snake_case`, `a=b`, and `x => y` as typed instead of adding escapes that reached agents verbatim ([#19350](https://github.com/paperclipai/paperclip/pull/19350), [#19540](https://github.com/paperclipai/paperclip/pull/19540)); pasting over a selection replaces it instead of linking it ([#18796](https://github.com/paperclipai/paperclip/pull/18796)); sending a message while a confirmation is open keeps the request to answer later ([#19496](https://github.com/paperclipai/paperclip/pull/19496)); a run waiting for a busy workspace, AI connection, or runner update no longer shows "Couldn't finish this attempt" ([#19369](https://github.com/paperclipai/paperclip/pull/19369), [#19507](https://github.com/paperclipai/paperclip/pull/19507)); approving the newest confirmation no longer brings an older replaced card back to your inbox ([#19520](https://github.com/paperclipai/paperclip/pull/19520)); creating a task already `done` or `cancelled` no longer wakes its assignee ([#19961](https://github.com/paperclipai/paperclip/pull/19961)); answering the onboarding opening question starts the agent immediately ([#19886](https://github.com/paperclipai/paperclip/pull/19886)); a reply in a Slack DM thread continues that thread's task even after it is Done ([#19486](https://github.com/paperclipai/paperclip/pull/19486)); and iPhone task chat no longer jumps while typing and streaming ([#17232](https://github.com/paperclipai/paperclip/pull/17232)). +- **Connections, GitHub, skills, and plugins** — A task reassigned to another agent keeps its MCP tools ([#17340](https://github.com/paperclipai/paperclip/pull/17340)); fresh personal app setup after an archived connection creates a new connection instead of a `403` ([#18902](https://github.com/paperclipai/paperclip/pull/18902)); a later distinct "Ask first" write opens a new review instead of returning an old decline ([#18742](https://github.com/paperclipai/paperclip/pull/18742)); GitHub `403 Resource not accessible by integration` shows a **Manage GitHub access** card ([#19315](https://github.com/paperclipai/paperclip/pull/19315), [#19655](https://github.com/paperclipai/paperclip/pull/19655)), transient repository-listing errors retry with backoff ([#19690](https://github.com/paperclipai/paperclip/pull/19690)), a webhook mid-refresh no longer drops repository access ([#18805](https://github.com/paperclipai/paperclip/pull/18805)), and background Git jobs fetch private repositories with the task's managed identity ([#17515](https://github.com/paperclipai/paperclip/pull/17515)); a crashed skill-cache build no longer blocks later runs, and slow preparation survives databases with an idle-transaction timeout ([#19849](https://github.com/paperclipai/paperclip/pull/19849), [#18996](https://github.com/paperclipai/paperclip/pull/18996)); plugin `secret-ref` settings fields save ([#20181](https://github.com/paperclipai/paperclip/pull/20181)) and a retired plugin worker restarts on a fresh process ([#19245](https://github.com/paperclipai/paperclip/pull/19245)); and purging a terminated agent with cost history returns `409 agent_cost_history_retained` instead of a `500` ([#19022](https://github.com/paperclipai/paperclip/pull/19022)). +- **Server and CLI** — Task file-resource routes accept identifiers such as `ABC-230` ([#16352](https://github.com/paperclipai/paperclip/pull/16352)); approving a tool review whose target changed returns the gateway's `409` instead of a `500` ([#19158](https://github.com/paperclipai/paperclip/pull/19158)); malformed UUID filters on issue lists return `422` ([#17389](https://github.com/paperclipai/paperclip/pull/17389)); deleting a company with a chat endpoint no longer fails ([#17561](https://github.com/paperclipai/paperclip/pull/17561)); `PGMAX_PIPELINE=0` no longer breaks transactions ([#17831](https://github.com/paperclipai/paperclip/pull/17831)); leftover `paperclip-run-*` scratch directories are swept ([#19671](https://github.com/paperclipai/paperclip/pull/19671)); `paperclipai service install` writes `KillMode=mixed` so embedded PostgreSQL shuts down cleanly ([#18598](https://github.com/paperclipai/paperclip/pull/18598)); and `paperclipai doctor` no longer warns about key-file permissions on Windows ([#14308](https://github.com/paperclipai/paperclip/pull/14308)). + +## Improvements + +- A new **agents:read** permission allows redacted configuration, skill, and instruction reads with no write authority, and scoped grants now work on individual configuration routes; every agent can read its own configuration ([#18766](https://github.com/paperclipai/paperclip/pull/18766)). Agents hitting a board-only route get `code: "board_access_required"` with remediation that links the board page holding the control ([#20151](https://github.com/paperclipai/paperclip/pull/20151), [#20182](https://github.com/paperclipai/paperclip/pull/20182), [#20207](https://github.com/paperclipai/paperclip/pull/20207)). +- The agent page is regrouped into Agent and Audit sections with name and title editable in the header and Activity, Runs, Costs, and Budgets opening inside the agent ([#18378](https://github.com/paperclipai/paperclip/pull/18378)); Identity files get a save footer ([#19535](https://github.com/paperclipai/paperclip/pull/19535)); the Secrets page shows the agent's environment bindings, masked ([#18121](https://github.com/paperclipai/paperclip/pull/18121)); and AI connection choices show sign-in method, scope, and account so two accounts named "OpenAI" can be told apart ([#17738](https://github.com/paperclipai/paperclip/pull/17738)). +- Routines show a **Responsible user** you can transfer or adopt; automatic tasks run as that person, and changes need `tasks:assign` or an instance admin ([#19128](https://github.com/paperclipai/paperclip/pull/19128)). An agent-owned task waiting only on a saved monitor shows a **Monitoring** status ([#18624](https://github.com/paperclipai/paperclip/pull/18624)), shows **In Progress** only while a task-linked run is queued or running ([#19453](https://github.com/paperclipai/paperclip/pull/19453)), and a parent is woken once when a child stalls on a board-only recovery action ([#20098](https://github.com/paperclipai/paperclip/pull/20098)). +- The task feed groups adjacent images into a thumbnail grid ([#19626](https://github.com/paperclipai/paperclip/pull/19626)), shows agent-created subtasks as linked cards ([#18320](https://github.com/paperclipai/paperclip/pull/18320)), renders `.patch`/`.diff` attachments with colors ([#19478](https://github.com/paperclipai/paperclip/pull/19478)), labels GitHub links as `owner/repo#123` ([#19476](https://github.com/paperclipai/paperclip/pull/19476)), and task documents open images in a shareable gallery ([#18157](https://github.com/paperclipai/paperclip/pull/18157)). Retry shows its current recovery step ([#19260](https://github.com/paperclipai/paperclip/pull/19260)), and tool approval cards show server-redacted arguments ([#18734](https://github.com/paperclipai/paperclip/pull/18734)). +- Faster tasks, chats, and inbox: cold task opens show the instruction and recent conversation first and load older history on demand ([#17593](https://github.com/paperclipai/paperclip/pull/17593), [#18092](https://github.com/paperclipai/paperclip/pull/18092), [#18461](https://github.com/paperclipai/paperclip/pull/18461)); standing chats open on their 20 most recent messages and reopen from cache ([#18358](https://github.com/paperclipai/paperclip/pull/18358), [#19452](https://github.com/paperclipai/paperclip/pull/19452)); Tasks and Inbox load a small index first ([#17756](https://github.com/paperclipai/paperclip/pull/17756), [#18492](https://github.com/paperclipai/paperclip/pull/18492)); and the Apps Permissions page no longer downloads every profile ([#18687](https://github.com/paperclipai/paperclip/pull/18687)). +- More background work waits for committed writes and saved deadlines instead of polling the database — issue monitors and routines, automatic backups, native finalization and recovery, GitHub webhooks and the review bot, chat channels, tool health and reviews, approvals and join requests, plugin jobs, status cards, and agent timers ([#17863](https://github.com/paperclipai/paperclip/pull/17863), [#17840](https://github.com/paperclipai/paperclip/pull/17840), [#17836](https://github.com/paperclipai/paperclip/pull/17836), [#17801](https://github.com/paperclipai/paperclip/pull/17801), [#17666](https://github.com/paperclipai/paperclip/pull/17666), [#17653](https://github.com/paperclipai/paperclip/pull/17653), [#17554](https://github.com/paperclipai/paperclip/pull/17554), [#17510](https://github.com/paperclipai/paperclip/pull/17510), [#17518](https://github.com/paperclipai/paperclip/pull/17518), [#18401](https://github.com/paperclipai/paperclip/pull/18401), [#17876](https://github.com/paperclipai/paperclip/pull/17876), [#18387](https://github.com/paperclipai/paperclip/pull/18387)); recovery sweeps and UI polls read only the fields they need, for example about 2.5 MB down to under 2 KB per queued-comment poll ([#17650](https://github.com/paperclipai/paperclip/pull/17650), [#17463](https://github.com/paperclipai/paperclip/pull/17463), [#17460](https://github.com/paperclipai/paperclip/pull/17460)). +- A public `GET`/`HEAD /api/ready` reports deployment readiness from memory and returns `503` with `Retry-After` while starting, recovering, or draining ([#18518](https://github.com/paperclipai/paperclip/pull/18518)); the company issue list sets `X-Paperclip-Has-More` and next-page headers when capped ([#19972](https://github.com/paperclipai/paperclip/pull/19972)); `comment_on_task` gains an optional `resume` flag ([#20028](https://github.com/paperclipai/paperclip/pull/20028)); and the API catalog agents search through `call_api` gains bodies and guidance for company import/export and skill-source import ([#19945](https://github.com/paperclipai/paperclip/pull/19945), [#18757](https://github.com/paperclipai/paperclip/pull/18757)). +- Agent observability exports native OpenCode turns, tool outcomes, and usage to Braintrust or OTLP ([#18098](https://github.com/paperclipai/paperclip/pull/18098)); traces gain spans for Daytona lease acquisition, turn preparation, and skill preparation ([#18626](https://github.com/paperclipai/paperclip/pull/18626), [#18213](https://github.com/paperclipai/paperclip/pull/18213), [#17918](https://github.com/paperclipai/paperclip/pull/17918)); and with `PAPERCLIP_SENTRY_RUN_FAILURES` on, task-level "Couldn't finish this attempt" failures are reported and a Codex capacity failure with a scheduled retry is not ([#18541](https://github.com/paperclipai/paperclip/pull/18541), [#18295](https://github.com/paperclipai/paperclip/pull/18295)). +- Daytona sandboxes gain an optional `ttlMinutes` wall-clock lifetime and gzip uploads on images without `zstd` ([#17980](https://github.com/paperclipai/paperclip/pull/17980), [#20104](https://github.com/paperclipai/paperclip/pull/20104)); S3 multipart and workspace snapshot uploads run parts in parallel ([#18659](https://github.com/paperclipai/paperclip/pull/18659), [#19917](https://github.com/paperclipai/paperclip/pull/19917)); Linux provider packs are smaller (linux-x64 from 1,131 MB to 876 MB) ([#17387](https://github.com/paperclipai/paperclip/pull/17387)); and Grok Build agents get **Upgrade runner** on qualified hosts ([#17922](https://github.com/paperclipai/paperclip/pull/17922)). +- Plugins can show task-sidebar panels driven by recorded runtime activity ([#18129](https://github.com/paperclipai/paperclip/pull/18129), [#17796](https://github.com/paperclipai/paperclip/pull/17796)), environment drivers can declare managed skills and require an agent ([#17774](https://github.com/paperclipai/paperclip/pull/17774), [#17761](https://github.com/paperclipai/paperclip/pull/17761)), a project writer can authorize a workspace-provider plugin to use their GitHub grant for repository maintenance ([#17798](https://github.com/paperclipai/paperclip/pull/17798)), and workspace cleanup recognizes squash-merged GitHub PRs ([#18493](https://github.com/paperclipai/paperclip/pull/18493)). + +## Upgrade Guide + +- **Migrations `0375`–`0451`** run on upgrade; none drops a table or column. Additive tables: `0394` `native_runner_checkpoints`; `0404` and `0433` per-user workspace preferences (Coordinator by default, `classic_workspace_enabled` off); `0405` interaction idempotency keys; `0415` and `0417` skill package storage, deletions, and mutation receipts; `0418` `sandbox_creation_operations`; `0421` and `0427` `execution_workspace_snapshots`; `0422` `agent_file_roots`; `0426` and `0428` project execution admissions (no route writes them yet); `0429` `native_harness_backups`; `0430` budget evaluation work; `0438` native provider artifacts; `0449` `controller_instances`; `0451` `budget_resume_claims`. Additive columns: `0379` project Git authorization, `0380` gateway token responsible user, `0396` inbound voice-call cleanup tracking (with a batched backfill), `0420`, `0424`, `0425`, `0431`, `0434` `issues.origin_issue_id`, `0439`, `0441`, `0442`, `0446`–`0448`. Triggers and functions: `0378` environment and plugin runtime hooks, `0444` GitHub refresh bookkeeping no longer advances agent runtimes. Row updates: `0376` and `0377` clear settled native recovery state and process identities; `0419` backfills Agent Chat read states; `0423` grants `agents:read`; `0443` clears stored per-turn lifecycles. Indexes: `0375` replaces the restore-point uniqueness index so stale pending restore points no longer block retries ([#17344](https://github.com/paperclipai/paperclip/pull/17344)); the index-only migrations in `0381`–`0414`, `0432`, `0435`, `0436`, `0447`, and `0450` are built `CONCURRENTLY` outside a transaction and are safe to rerun if interrupted. `0437` and `0440` serve managed and Cloud deployments and are harmless elsewhere. Expect `0377`, `0395`, `0412`, `0414`, `0419`, and `0432` to take longer on instances with large run, activity, or comment histories; `0416` rebuilds a `heartbeat_runs` index inside a transaction and blocks writes to that table while it runs, `0445` likewise builds a `native_run_finalizations` index inside a transaction and blocks writes to that table while it runs, and `0434` briefly blocks `issues` writes. +- **New environment variables**, none required. Recovery: `PAPERCLIP_CONTROLLER_INSTANCE_LEASE` (on unless exactly `off`) — a server that loses its instance lease while holding work, for example because the database was unreachable for more than 60 seconds, logs a fatal error and exits with code 1 so a newer server can recover the work, so run Paperclip under a supervisor that restarts it ([#20054](https://github.com/paperclipai/paperclip/pull/20054)). Storage: `PAPERCLIP_SKILL_PACKAGE_STORAGE_ENABLED` (on unless exactly `false`) ([#18082](https://github.com/paperclipai/paperclip/pull/18082)). Cleanup: `PAPERCLIP_NATIVE_WORKSPACE_SYNC_RETENTION_ENABLED` (on unless `false`) with `_DRY_RUN` (off unless `true`) and `_DAYS` (`7`) expires settled runs' native workspace sync folders ([#17358](https://github.com/paperclipai/paperclip/pull/17358)); `PAPERCLIP_NATIVE_RUNNER_EVIDENCE_RETENTION_DAYS` (`7`) expires Runner continuity archives and quarantined sessions ([#17616](https://github.com/paperclipai/paperclip/pull/17616)); `PAPERCLIP_TASK_DIRECTORY_RETENTION_ENABLED` (default `false`) with `_DRY_RUN` (on unless `false`) and `PAPERCLIP_TASK_DIRECTORY_ORPHAN_GRACE_DAYS` (`7`) saves finished plain task directories to restore points and removes them, and needs `PAPERCLIP_GIT_RESTORE_POINTS_ENABLED=true` ([#17472](https://github.com/paperclipai/paperclip/pull/17472)); `PAPERCLIP_ISOLATED_SOURCE_REHOME_ENABLED` and `PAPERCLIP_NESTED_CLONE_MIGRATION_ENABLED` (default `false`, and unlike the other sweeps their `_DRY_RUN` switches are also off by default) move existing workspaces onto the shared clones, with rehome also requiring `PAPERCLIP_GIT_CACHE_EXPIRATION_ENABLED=true` ([#17369](https://github.com/paperclipai/paperclip/pull/17369), [#17407](https://github.com/paperclipai/paperclip/pull/17407)). Other: `BOXD_API_KEY` is the host fallback key for the boxd provider ([#17284](https://github.com/paperclipai/paperclip/pull/17284)), and `PAPERCLIP_DB_RESPONSE_CAPTURE_WINDOW` opts into one bounded database response-size diagnostic window ([#17504](https://github.com/paperclipai/paperclip/pull/17504)). An explicit `DATABASE_PREPARED_STATEMENTS=true` now also prepares ORM queries; behind a pooler without named-statement support, use `false` ([#17673](https://github.com/paperclipai/paperclip/pull/17673)). +- **Remote workspace storage is on by default where it applies** ([#18403](https://github.com/paperclipai/paperclip/pull/18403)): with S3 storage, a `postgres://` `DATABASE_URL`, and a secrets master key, new task workspaces of Runner agents on sandbox environments enroll automatically. Every replacement server must use the same master key; snapshot expiry needs `s3:ListBucketVersions` and `s3:DeleteObjectVersion` on the snapshot prefix; and once a workspace is enrolled, do not roll back to an older binary. To opt out before upgrading, store `remoteWorkspaceStorageEnabled: false` in the experimental instance settings. +- **New and changed experimental settings**: `enableGoogleWorkspaceConnector` (default off, see Breaking Changes) ([#19247](https://github.com/paperclipai/paperclip/pull/19247)); `enableLegacyComposerSubmit` (default off) ([#19272](https://github.com/paperclipai/paperclip/pull/19272)); `remoteWorkspaceStorageEnabled` (default on); `enableAgentChat` is retired and Agent Chat is always on, ignoring a stored off value ([#19360](https://github.com/paperclipai/paperclip/pull/19360)); and **Artifacts V1** is on for every instance with its toggle removed ([#19164](https://github.com/paperclipai/paperclip/pull/19164)). +- **Default views change**: every person starts on the Coordinator workspace, and **Classic workspace** in Experimental settings brings back the previous layout ([#19360](https://github.com/paperclipai/paperclip/pull/19360)). The runner dropdown, including the "Legacy runner" override under Advanced, is removed from agent setup and configuration; new agents get the automatically selected runner, existing agents keep theirs, and the API and CLI still accept runner options ([#19517](https://github.com/paperclipai/paperclip/pull/19517)). New Codex agents default to `gpt-6.1-sol`; agents with a saved model keep it ([#19623](https://github.com/paperclipai/paperclip/pull/19623)). +- **Permissions** ([#18766](https://github.com/paperclipai/paperclip/pull/18766)): migration `0423` grants company-wide `agents:read` to existing standard agents that are active and have an active membership, even where an operator had removed their configure grant; agents in setup, managed built-ins, low-trust or trust-boundary agents, and agents that already hold a scoped configure or suggest-changes grant are skipped. Each grant is logged as `agent.permissions_updated`; remove it from any agent that should not read peer configuration, and the removal persists. Separately, a CEO hiring denial is enforced only once it is saved on this release, so turn **Can create agents** off again on any CEO that should not hire ([#20041](https://github.com/paperclipai/paperclip/pull/20041)). +- **API clients**: native-run self status PATCH returns `409 native_run_status_reported_by_finish` ([#18411](https://github.com/paperclipai/paperclip/pull/18411)); agent-created child tasks may return `parentAdjusted` ([#19312](https://github.com/paperclipai/paperclip/pull/19312)); `inheritExecutionWorkspaceFromIssueId` copies only project and strategy ([#19860](https://github.com/paperclipai/paperclip/pull/19860)); workspace detail responses no longer run Git and return delivery state `unknown`, so read close-readiness for Git safety ([#18410](https://github.com/paperclipai/paperclip/pull/18410)); skill version lists omit file bodies ([#18082](https://github.com/paperclipai/paperclip/pull/18082)); `GET /api/companies/{companyId}/user-directory` now returns each member's `membershipRole` to anyone with company access ([#15183](https://github.com/paperclipai/paperclip/pull/15183)); and new routes include `GET /api/issues/{id}/context-usage`, `POST /api/issues/{id}/context/compact`, `POST /api/agents/me/chat/messages`, `POST /api/issues/{id}/recovery-actions/confirm-owner-gone`, and the public `GET /api/ready`. +- **systemd users**: re-run `paperclipai service install` to pick up `KillMode=mixed`; existing unit files are not rewritten ([#18598](https://github.com/paperclipai/paperclip/pull/18598)). +- **Telemetry**: when telemetry is enabled, `server.started` now carries only the OS family, and `connection.created`, `connection.updated`, and `connection.invoked` events carrying only the connector key and status are sent; `PAPERCLIP_TELEMETRY_DISABLED=1` and `DO_NOT_TRACK=1` still turn telemetry off ([#18897](https://github.com/paperclipai/paperclip/pull/18897)). +- **Harness pins** are unchanged from v2026.1106.0: Codex 0.160.0, Claude Agent SDK 0.3.286, OpenCode 1.18.34, and GitHub Copilot CLI 1.0.88. Kimi Code ships at 2.3.3 ([#18028](https://github.com/paperclipai/paperclip/pull/18028)). +- No other configuration or API changes require action. + +## Contributors + +This release has 1,586 commits from 37 contributors. Thank you to everyone who contributed to this release! + +@afurm, @AlexFrontegg, @ARTeMobAgents, @caniko, @clempat, @conreo, @d4kine, @Ethereal49, @fengwuqingchen, @genius-0963, @greegorij, @harjothkhara, @HviorForgeFlow, @jamiebuchanan, @LKL-ZREO, @lorenzozanee, @lyuboslavmedarov, @mdc2122, @MichielMAnalytics, @MindSyncHub, @MrBlackTongue, @naeemakhtar110, @phant0um, @Podwarden, @Rockiez, @stefanriegel, @sudheerDev, @tiangao88, @timafen, @xiehuanyi, @yzxcj797