Repository navigation
Tale v0.5.92
Highlights
- Keep a project's agents busy with dispatch. A project's new Dispatch tab starts its ready tasks on the agents of its pool as soon as one is free, up to the runs the pool and each agent may hold, in the order of the board's columns, priorities and positions, asking the sandbox host before each start. Standing roles start an agent on its own task on a schedule, each occurrence decided once, and gates hold the work they govern while a signal from outside says so, such as a full CI queue (
POST /api/v1/projects/{id}/dispatch/gates/{key}). The tab says why each agent of the pool is idle; administrators edit the dispatch there, or declare it as the managed resourceproject-dispatchwith thetaleCLI. The CLI asks Tale whether a declared dispatch would be saved before it writes anything of the declaration, so a dispatch Tale would refuse leaves the rest of the declaration unapplied (#4987, #4995, #4945). - Run one agent on hundreds of tasks. A dispatch may hold up to 500 runs at once and keep one agent of its pool on up to 500 of them, so one coding agent can work a large board on hundreds of workers. Without a spacing, a pass starts work for up to two minutes and then asks for the next pass at once. The Dispatch tab counts each agent's runs (running, queued and waiting by reason) and lists its 50 oldest (#4998).
- One project's dispatch can serve other projects' boards. A central project's pool and its reviewers can work the boards of other projects of the organization, such as one board per product or client. Adding a board takes the right to edit it, and every pass checks that right again for whoever saved the dispatch last: a board that is gone, archived or out of that right is skipped, and the tab says why. A run a person starts on a served board gets the agent's secrets, credentials and standing workspace only when that person may edit both projects. Boards and reviewers are set through the settings tools or the
taleCLI; the app's editor shows them and keeps them (#5001). - A model at capacity makes the runs of project agents' tasks wait instead of failing them. When a provider refuses a run because its model is at capacity, every task run of the organization on that model waits as Waiting for model capacity and holds no worker; after 1, 2, 4, 8 and then 15 minutes one run tries first and the others follow once it works. Waiting spends no automatic retry, so an agent's own task no longer pauses itself after three refusals. A model that stays at capacity for twelve hours is no longer waited for. When the model answers again, the waiting runs wake in waves 15 seconds apart that double up to a sixteenth of the waiters, so 256 or even 500 waiting runs have all started within five minutes, and for five minutes dispatch starts new work on that model at the same pace. For task runs this replaces the one-minute retry floor of v0.5.91, which an automation's agent step keeps (#4987, #4998).
- Automation templates. Every automation Tale ships is a template in one catalog under Create automation › From a template: cards with the product's logo, a preview of how it works, what it changes and never does, when it runs and what it needs, its workflow drawn read-only, and Use this template, which asks its questions and can create and start the automation in one step. New organizations start without automations; people add the ones they need (#4988).
- Sync issues, pull requests and security alerts in one step for any number of sources: GitHub issues and pull requests (Renovate's, for example, by their
author), a GitHub repository's code scanning, Dependabot and secret scanning alerts as one task per alert from a severity you choose (a secret's value is never read), Forgejo issues and pull requests through the new Forgejo connector, and GlitchTip issues. Each source can label the tasks it creates. A failing source, an issue the tracker refuses or a write the database refuses never stops the others, a rate limit's wait is kept for later runs, and the step fails only when every source failed, or, withfailOn: any, when any one did (#4988, #4997). - The mail syncs read a mailbox's Inbox, and its Sent folder unless that is turned off, oldest first and each email once. Gmail no longer skips mail when a backlog is larger than one pass or stalls on a burst of mail in one second, a sender's wrong
Dateheader no longer strands later email, and a mailbox's first pass reads back a set number of days, 7 to start with (#4988). - Connect a shared Outlook mailbox to the Inbox. An administrator adds an Outlook credential that signs in as an Entra app scoped to that mailbox, or a person with Full Access to it names the mailbox when connecting. The mail sync, triage, drafts and replies then work on that mailbox, and a credential keeps the mailbox it was added with (#5002).
- The shipped triage, review, digest and webhook automations hold up at production sizes: each caps its batch, the pull request reviewer reviews once per new commit, inbox triage marks a thread only once its draft is left, the task digest lists every task since the last digest exactly once, and a webhook delivery sent again updates its task. A loop step can go on past a failed item (
onItemError: continue) (#4988). - Give each agent its own repository access. An owner or administrator can pin the GitHub or Forgejo credential a project agent works as and set the name and email its commits carry, so one agent reaches every repository and another only its client's. A pinned agent works only as its pinned credential, never as the default in its place, and agents equipped with Forgejo can now clone from and push to it in their sandbox (#5003).
- Agents see a task's labels:
task_findandtask_getanswerlabels, and a run's brief names the same labels in the same order (#5004). - The sandbox host admits work by its pressure, and project agents are told to take a lease before a heavy phase such as an install or a full test run (
host_lease_acquire), so heavy phases take turns on a shared Docker host. Idle agent workspaces are reclaimed while the workspaces' disk runs short, and above a size once a policy setsmaxWorkspaceGiB(#4987). - Login shells in a sandbox session now find
node,npm, the agent CLIs and the packages the session installed. The shell tool of the Codex harness runs commands in one, and found none of them before (#5019). - Reach other websites through your own proxies.
OUTBOUND_PROXY_URLSlists HTTP proxies that every request to another website takes in turn: the website crawler, the chat assistant's web fetch, remote images in emails, video ingestion and everything a sandbox session reaches on the internet. The services a deployment is configured with, such as model providers and connectors, are still reached directly. A proxy that fails is set aside and the request goes once more through the next one; nothing falls back to the server's own address.VIDEO_INGEST_PROXY_URLstill gives video ingestion a proxy of its own (#5053). - Declare a fleet with the
taleCLI. A managed declaration can now create, not only adopt, projects, their labels and agents, standing tasks, agent secrets and connector credentials (createIfMissing: true). Secret values come fromTALE_CONFIG_SECRET_*variables and never enter a declaration, plan or receipt, and a declaration file can include others (#5000). - Sign a managed deployment's people in through any OpenID Connect provider, such as ZITADEL, with
identity.oidcbeside or instead of the Entra fields (#5016). - Run a managed deployment's sandboxes on an Incus node by declaring
sandboxwithbackend: incus. A deployment switches between Docker and Incus in place, after draining the outgoing sandbox service. Incus sessions can install npm and PyPI packages through the node's caches (SANDBOX_INCUS_NPM_REGISTRY,SANDBOX_INCUS_PYPI_INDEX), andSANDBOX_EGRESS_DENIED_HOSTSstops a package manager from going around them (#5015, #5017). - Dependencies move to releases that fix published advisories: dompurify 3.4.17 (a critical advisory), undici 7.30.1, zod 4.6.6, vite 8.1.6, follow-redirects 1.16.1 and Storybook 10.6.2 (#5054).
Upgrade notes
- From v0.5.91 to v0.5.92 the backend applies migrations 0205, 0206, 0207 and 0209 to 0219 at start; all are additive, and each is safe while the previous image still serves.
- The API contract moves from
3.44.0to3.49.0. It adds the project dispatch read and its gates (3.45.0, with the error codesDISPATCH_GATE_UNKNOWNandDISPATCH_GATE_VALUE_UNJUDGED), the 500-run dispatch limits and each agent'srunCounts(3.46.0), tasks synced from GitHub security alerts and Forgejo (3.47.0), a dispatch'ssources,reviewersandservedBy(3.48.0), and an agent'sconnectorCredentialsandgitIdentity(3.49.0, with the error codesPROJECT_AGENT_CREDENTIAL_UNKNOWNandPROJECT_AGENT_CREDENTIALS_FORBIDDEN). The settings tools take a project's dispatch (project-dispatch). One change reaches tasks a client made before: a task whoseexternalSystemisgithub-securityorforgejonow belongs to the issue sync, so itsexternalStateno longer moves it andPUT …/tasks/{taskId}/external-statusrefuses it (TASK_EXTERNAL_REF_INVALID), where aclosedstate used to park it atin_review.PUT /api/v1/projects/{id}/agents/{agentId}keepsconnectorCredentialsandgitIdentitywhen the body leaves them out; send{}ornullto clear them. - Update the sandbox service and the sandbox-runtime image with the backend. An older sandbox service keeps working, but the backend then grants no heavy-phase leases and reads no workspace sizes. The runtime image's git credential helper now reads only
TALE_GIT_CREDENTIALS, so a new runtime image under an older platform gets no git credential for github.com, and an older runtime image under this platform reaches github.com but not Forgejo. New sandbox settings:SANDBOX_ADMISSION_PRESET(default),SANDBOX_ADMISSION_LOAD_PER_CPU,SANDBOX_ADMISSION_CPU_PSI,SANDBOX_ADMISSION_MEMORY_PSI,SANDBOX_ADMISSION_IO_PSI,SANDBOX_ADMISSION_RECOVER(0.5),SANDBOX_HEAVY_LEASES_MAX(2) andSANDBOX_HEAVY_MIN_FREE_DISK(20g). Kubernetes, Incus and remote Docker daemons grant no leases, and agents work without them. A dispatch judged by theconservativeadmission preset, set as its Sandbox host or bySANDBOX_ADMISSION_PRESET=conservative, starts no work where the host cannot be judged: under an older sandbox service, and on Kubernetes, Incus or a remote Docker daemon. - Reclaiming idle workspaces on disk pressure is on by default: an agent workspace idle for 24 hours may be deleted while the workspaces' disk is short. Set
reclaimOnDiskPressure: falsein thesandbox_workspacespolicy, or raisereclaimMinIdleHours, before upgrading if you keep large idle workspaces on purpose; pinned workspaces and those under a legal hold are never reclaimed. - New organizations get no automations, and
tale migrateadds none: it adds the configuration files an organization is missing and the starter project to one without a project. Organizations keep the automations they have. The GitHub and GlitchTip import automations leave the catalog for Sync GitHub issues and Sync GlitchTip issues; copies already installed keep working. - Mail syncs installed before this release keep their documents: Gmail and Outlook copies read Sent only once edited, and an IMAP copy's
limitnow covers the Inbox and Sent together. Their positions carry over; a position dated in the future restarts at the seven-day window, and email read twice is stored once. - A GlitchTip sync source that names a
credentialnow keeps a position of its own, so its next run reads that source once more from the oldest issue; no task is duplicated. - Dispatch is off until a project administrator sets it up; automations that start agents keep working. Once it is on,
tale_backend_dispatch_last_pass_timestamp_seconds{project}tells when each project's dispatch last completed a pass, and the Prometheus guide's alert rules include one for a dispatch that stops (TaleDispatchStopped). - Project instructions now reach task agents: every turn of a task agent, retries included, opens with its project's current instructions, between the organization's custom instructions and the agent's own. Before, only a project's chats read them, so check instructions written for chat alone before upgrading. A turn whose project or task cannot be read does not start, and is retried like any failed start.
- During a rolling deploy, an older worker that takes a run of a template made by this release can fail it, because it does not know
onItemError,task.sync_issuesor theautomationconnector. Deployments that drain before they switch colours are not affected. - A generic OIDC or OAuth2 sign-in connection that maps the email claim (
claimMappings.email) now refuses a person whose provider answer lacks that claim; before, it fell back toemailand thenpreferred_username. Before you upgrade, confirm that your provider sends the mapped claim for everyone. - For every OAuth connector, a token endpoint that answers 5xx or 429 during a refresh no longer marks the credential for reauthentication: that call fails with the retryable
CREDENTIAL_REFRESH_FAILED, and the next call refreshes again. A connection starts only from Tale: a Connect link followed from another site is refused (cross_site_start). - Upgrade the
taleCLI with the platform. This CLI declares a project's dispatch (project-dispatch, with itssourcesandreviewers), the new managed kinds (project,project-label,project-agent,task,agent-secret,connector-credential),identity.oidcand an Incussandbox; an older platform answers 404 at plan for the new kinds, before anything is written. Declaring a new secret or rotating its value changes the backend's environment, so it needs a full deployment, not--configuration-only.tale deploynow removesSANDBOX_INCUS_*andSANDBOX_BACKEND=incusfrom a managed deployment's.envunless its specification declares them. - New optional settings, none of which changes anything until it is set:
OUTBOUND_PROXY_URLS(read by the backend roles andsandbox-egress; recreate both after a change),CONNECTOR_OAUTH_<SLUG>_TENANT_ID(a single-tenant Microsoft app),SANDBOX_INCUS_NPM_REGISTRY,SANDBOX_INCUS_PYPI_INDEXandSANDBOX_EGRESS_DENIED_HOSTS(Incus registry caches: roll the runtime image and the sandbox service together, and set the deny-list last), and theTALE_CONFIG_SECRET_prefix for the secrets a managed declaration reads. - The release publishes eleven images: the
tale-ai-gatewayimage is gone. No deploymenttale deploymakes ran it, and subscription accounts work through a broker you operate.
API contract changes
The contract moved from 3.44.0 to 3.49.0 (161 → 163 operations). Read the API reference's versioning section before upgrading a pinned client.
Added operations:
GET /api/v1/projects/{id}/dispatchPOST /api/v1/projects/{id}/dispatch/gates/{key}
Removed operations: none.
Changelog
3.49.0 — 2026-10-15: a project agent carries its own repository access. ProjectAgent answers connectorCredentials (a connector slug to the name of the organization credential the agent acts as; {} when it pins none) and gitIdentity ({name, email} its commits carry, or null), and POST/PUT /api/v1/projects/{id}/agents… take both. A pin must name a credential the organization holds for that connector (400 PROJECT_AGENT_CREDENTIAL_UNKNOWN, the pins under data.connectorCredentials), and only an organization admin may change the pins (403 PROJECT_AGENT_CREDENTIALS_FORBIDDEN). Only a connector that opens a git host — GitHub, Forgejo — takes a pin; one on any other connector is refused with the same 400. A PUT that omits either field keeps what is stored — unlike the other optional fields, since dropping a pin would widen the agent to the connector's default — and {} / null clear them. An equipped pinned connector hands the agent's sandbox the pinned credential's git access instead of the default's, and the agent's connector calls through the sandbox bridge act as it too; a pin whose credential is gone hands it nothing and fails those calls. The MCP list_connectors tool names that host as gitHost.
What's Changed
- feat(platform): dispatch, admission and leases for agent fleets by @yannickmonney in #4987
- feat(platform): one template catalog, general syncs, no default automations by @yannickmonney in #4988
- docs: prepare Tale v0.5.92 notes by @yannickmonney in #4992
- fix(platform): check a managed dispatch before anything is written by @yannickmonney in #4995
- feat(platform): dispatch one agent across hundreds of workers by @yannickmonney in #4998
- feat(ai-gateway): manage accounts over REST, group them by state by @yannickmonney in #4999
- feat(platform): sync Forgejo, GitHub pull requests and security alerts by @yannickmonney in #4997
- feat(cli): declare projects, agents, labels, tasks and credentials by @yannickmonney in #5000
- feat(platform): let a project's dispatch work other projects' boards by @yannickmonney in #5001
- feat(platform): connect an Exchange shared mailbox to the Inbox by @yannickmonney in #5002
- feat(sandbox): give each agent its own repository credentials by @yannickmonney in #5003
- feat(platform): show a task's labels to agents in task_find and task_get by @yannickmonney in #5004
- chore: remove the ai-gateway service by @yannickmonney in #5005
- fix(web): remove homepage hardware and show all releases by @yannickmonney in #5009
- fix(web): remove hardware product surface by @yannickmonney in #5010
- feat(cli): declare the Incus sandbox backend of a managed deployment by @yannickmonney in #5015
- feat(cli): port Tale's workflows to Forgejo by @yannickmonney in #4984
- feat(cli): sign a platform's people in through a generic OIDC provider by @yannickmonney in #5016
- fix(sandbox): pin a current Zabbly build of Incus in the lab by @yannickmonney in #5018
- fix(sandbox): keep the image's tools on PATH in login shells by @yannickmonney in #5019
- feat(sandbox): install Incus sessions through the node's registry caches by @yannickmonney in #5017
- fix(deps): take the fixed releases behind open security advisories by @yannickmonney in #5054
- feat(platform): reach other websites through a round-robin proxy pool by @yannickmonney in #5053
- docs: cover everything since v0.5.91 in the v0.5.92 notes by @yannickmonney in #5055
Full Changelog: v0.5.91...v0.5.92