Skip to content

wisp 0.57.1-nightly.20261109.1653

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 23 Oct 22:01
· 0 commits to c8b17ec921c2a9dc195e6da809c55c3b87c76df3 since this release
6e35fd1

A build of main at 6e35fd1, made every night once the full test suite passes there. It may break: for everyday use, take the latest release.

Since the last release

Added

  • What the harnesses keep on disk, and fixes for what runs leave behind. GET /api/machine now measures every installed harness's own folders (Claude Code and Cowork's VM, Codex, Cursor, opencode, Antigravity, Copilot, Grok) with du alone, never opening a file. One click (POST /api/machine/harness/clean) removes only crash dumps and Claude Code's stale temp files; everything else says how that CLI cleans up after itself. Processes runs left behind are grouped by the command that started them and the task, and File a fix (POST /api/machine/fix) gives Bugsy, or a task in that project, the command lines and "kill what you spawn". On a Mac, each process's memory is now what Activity Monitor shows (its footprint), not RSS, which read about a quarter low.

  • See what agents cost your computer, and pause automations. GET /api/machine reports each running task's memory and CPU (summed over every process it started), per crew member too, the processes finished runs left running (a test server, a dev server, a watcher) with Stop (POST /api/machine/stop), 24 h of memory, CPU and run history, and the worktree folders that can go, grouped by merged PRs, Done tasks, finished crew jobs and leftovers. Pause automations until a time (POST /api/automations/pause), and on a Mac on battery under 20% (batteryHold: off, 20 or 40) check-ins and the crew queue wait for the charger. A heavy task's card data now carries its memory and CPU. The This Mac pane that shows it comes next.

  • This Mac: see what your agents cost your computer, and act on it. Settings → This Mac (This PC on Windows, This computer on Linux), or ⌘K → What’s using my computer, shows free memory, CPU and disk with the last hour, then each running task and crew member by RAM, CPU and folder size, with Stop and Later (in an hour, tonight or tomorrow morning: it stops and carries on then). Processes still running after their task finished can be stopped one by one or all at once, folders wisp can give back are grouped (merged PRs, Done tasks, finished crew jobs, folders no task knows) with their size and Remove, and Pause automations holds check-ins, triggers and goal rounds for an hour or until tomorrow 8:00. A chip in the top bar appears only when memory runs low, work is waiting, automations are paused or something was left behind (12% memory · 9 running), and a running task that's heavy shows its RAM on its row. Spells reach it through the machine.head slot and the machine.* parts.

  • Automations wait while your computer is short. Check-ins, triggers, goal rounds and agents' own follow-ups now wait while free memory is under 15%, the CPU stays over 200% of its cores for a minute, or wisp already has a run per 3 GB of memory going (8 on a 24 GB Mac). They go on once memory is 5 points above the floor, the load is down and a slot is free, and their row says why (Waiting for memory: 11% free, needs 20%). What you start always runs; when memory is short the page says so. Subagents count but never wait. Settings → Usage → Machine load has the three knobs, and spells can set them (memoryFloor, cpuCeiling, maxRuns).

  • Done asks about the worktree. Marking a task done in the page used to leave its folder on disk, with its node_modules and build output, and those of its subagents, delegated crew jobs and compare runs: gigabytes each, until the cleanup two weeks later. Now Mark done (the button, E, a row's ✓) opens a small dialog when any of them hold a folder, listing each with its size and state (clean, uncommitted files, commits not pushed, PR open or merged). Remove takes the clean ones; one holding uncommitted work goes only if you tick it. Keep keeps them all. Always do this remembers the answer in Settings → Worktrees → When a task is done (Ask, Remove clean ones, Keep them; spells can set worktreeOnDone), and even Remove asks before a folder with work in it goes. Done from anywhere else (a channel, wisp_task, Ship it) asks nothing and removes only clean folders with no open PR. A crew job that ends clean with no open PR loses its folder right away. Branches always stay, and a follow-up brings a folder back.

  • See when a banked Codex reset expires. When wisp reads a Codex account's usage (Check Codex while work waits, or the read before held-back work), Settings → Usage → Plan budget now shows its banked resets under the bars: 1 banked reset, expires tomorrow 17:00, or just the count when Codex doesn't list them. The day before one expires your phone gets one note for it, when ntfy or Telegram is set up. wisp only reads: it never redeems a reset. Spells can hide or restyle the line (budget.banked).

  • on laptop from Telegram, on wisp Cloud. Tell a bot on laptop fix the login and it runs on that computer, even with your cloud wisp asleep. Off unless the grid has channels.route in grid.json. Make a new bot for this and connect it on your account page (Telegram to your computers): the grid holds its webhook with a secret of its own, and only the people you list can route. Not your cloud wisp's bot: anything on your cloud wisp can read that token, and with it what goes through here, so the page warns if it's the same one. on <computer> has to come first; anything else to that bot gets a line saying what it does. A computer takes these only once you turn on Settings → Notifications → Accept tasks from channels on it, off by default, and turning it on is refused from a phone: Plan unless the message asks, Edits at most, never Full auto, on that computer's own projects. Asleep or switched off, you get a plain line back and nothing waits. Reports and replies come back in the same chat, through the grid: the computer never holds the bot. A spell can force the switch off, never on.

  • Pick element tells the agent what it's looking at. Clicking an element in Preview now puts its trimmed HTML and key computed styles (size, spacing, colour, font) in the reply box as plain text, with its selector and page, not just a line naming it. One pick stays under 2,000 characters, whatever the page holds, and leaves out what's in password and hidden fields. Nothing sends until you do. The cursor is a crosshair everywhere while you pick, also over the app's buttons and links, and only a pick you made can reach the box: a page can't write in it by itself.

  • Share to wisp from your phone. A link, text, pictures or a PDF from any app's share sheet used to need copying across by hand. Now the Android app, and a Home Screen install of your cloud wisp on Android, open New task with it in the box and attached, ready to send (below whatever you'd typed, 10 files and 20 MB at most). Nothing starts and no file leaves your phone until you press Send, and a line marks it as shared from outside wisp so you read it first. On an iPhone, a guide shows how to build a Shortcut that starts a task on your cloud wisp with an API key.

  • Discord's /wisp works on a sleeping cloud wisp. On a grid with channels in grid.json, paste the bot token and public key in the Phone dialog and copy the Endpoint URL it shows into the Developer Portal. wisp Grid checks each call's signature and answers Discord in time, the box wakes and does the work, and the reply lands in place. Mentions need a connection that stays open, so on a cloud computer only /wisp works, in threads too. Someone in a server who isn't linked gets a line only they can see, and it wakes nothing. On a cloud computer a message from any channel stays there: it never starts or follows up on a task on another machine. Message Content stays off.

  • Discord, two-way. Turn on Discord in the Phone dialog (Settings → Notifications → Phone, or ⌘K, off by default): it walks you through creating your bot in the Developer Portal, pasting its token, adding it to a server and linking yourself, then shows that it's connected, in how many servers and who's linked, or what's wrong and what to do. Or give PUT /api/remote its token (discord: { enabled, token }) and add it with the link from GET /api/remote/discord/invite. Then mention it, DM it or use /wisp, whose options fill in from your own projects, crew, machines and models. A task starts and answers in a thread of its own, or in reply in a DM. Questions come with buttons, and stop, done, status, btw and @ada work there. People link with link <code> in a DM, by their Discord user id; anyone else gets one line in a DM and silence in a server. Tasks run in Plan unless you say Edits, Full auto is refused, tool approvals stay in wisp and the thread says what's waiting there, nothing posted pings anyone or hides a link, a Discord token is scrubbed like any other secret, and in a server lists and refusals show none of your names. It needs no privileged intent, so in a thread you mention the bot or use /wisp. It won't turn on on a cloud computer, which sleeps.

  • Mail a task to your cloud wisp. On a grid with mail in grid.json, Settings → Notifications → Phone → Email gives you a secret address and asks which address you'll send from. A message from there wakes the box and starts a task from its subject and first lines, said as you'd type it in wisp, and the answer comes back as a reply in the same thread; replying follows up. Plan by default, Edits at most, and Full auto can't be asked for. Only your secret address, your one allowed address and a DKIM signature wisp verified itself, by your address's own domain, count together: anything it can't prove gets no answer, and Settings says why the last message was ignored. Your provider has to sign with the same domain as your address: consumer Gmail and iCloud do, while a company domain signed by its provider's domain won't pass, and neither will a subdomain signed by its parent. Quoted text and signatures never run, attachments aren't read yet, and tool approvals stay in wisp. Off by default. See grid/README.md for the SES and DNS setup.

  • Telegram reaches a sleeping cloud wisp. On a grid with channels in grid.json, a box takes a webhook to its own /_in/<token> URL instead of polling. The grid answers Telegram at once, holds the message, wakes the box and delivers it once, in order. A channel never keeps a box awake. Messages that can't be delivered within the hour are dropped, and the box says so in the chat. Strangers messaging the bot can't push other people's boxes out: after three wakes with nothing for wisp, a wake waits its turn behind people, at most one every 10 minutes (opening wisp still delivers at once). If the URL leaks, POST /api/channels/rotate replaces it. A computer's Telegram keeps polling, and with channels off nothing changes.

  • Slack reaches a sleeping cloud wisp. On a grid with channels in grid.json, turn on Slack in the Phone dialog on a cloud computer: the manifest carries your wisp's own private URL, and setup takes the signing secret and the bot token, with no app token. Slack posts its events to that URL, the grid answers within Slack's 3 seconds, holds the event and wakes the box, and the box checks Slack's signature and handles it once, so a message sent while wisp sleeps still runs, up to an hour later. Keep wisp open while Slack checks the URL: asleep, it answers 503 and Slack lets you retry. A leaked URL can be replaced with POST /api/channels/rotate, which gives you the new one for the app's Event Subscriptions. A computer keeps Socket Mode, unchanged.

  • Buttons for questions in Slack. A question in a Slack thread shows a button per choice, and a click answers it: the buttons give way to what was chosen and who. Only people linked to wisp can click, an old button tells the clicker alone that it's stale and never answers another question, and a tool approval still has no buttons. An app made before this needs Interactivity & Shortcuts turned on in its settings; typing the answer works either way. On a cloud computer there are no buttons yet: Slack would need a second URL for clicks, so you type the answer.

  • Crew jobs that need you are in Needs you. A job run for another task (delegated, an @ answer, a check on a task) that asks you something or has an unread report now sits in the task list's Needs you with your own tasks, with its member's face. It used to show only on home. It leaves the list under its member meanwhile, and the project chips count exactly what Needs you holds.

  • Slack, two-way. Turn on Slack in the Phone dialog (Settings → Notifications → Phone, or ⌘K, off by default): it walks you through creating your own Slack app from wisp's manifest, pasting its two tokens and linking yourself, then shows the workspace, the bot, how many people are linked, and what's wrong with the way to fix it when it isn't working. Then @wisp in api with opus plan: fix it in a channel, or a DM to the bot, starts a task and answers in a thread. Follow up, answer questions, stop, done, status and btw there, and @ada reaches your crew. People link with link <code> in a DM, by their Slack user id; anyone else gets one line in a DM and silence in a channel. Tasks run in Plan unless you say Edits, Full auto is refused, tool approvals stay in wisp, and in a channel lists and refusals show none of your names. On a computer it uses Socket Mode, so nothing has to reach it. Spells reach the section through the phone.slack part.

  • ⌃Tab switches tasks in the desktop app. A tap jumps back to the task you had open before, so two tasks are one key apart. Hold Ctrl and press Tab to step through your latest tasks (⇧Tab goes back, Esc stays put) and let go to open one. If you were in the reply box, you land in the new task's. A browser tab can't have it: Chrome keeps ⌃Tab for its own tabs.

  • Start a task from a GitHub comment. Turn on GitHub in the Phone dialog (Settings → Notifications → Phone, or ⌘K, off by default; github: { enabled: true } on PUT /api/remote) and a comment of yours whose first line is /wisp …, on an issue or PR of a repo one of your projects has as its origin, starts a task, or follows up on the one already there, and the answer comes back as a comment through gh, as you. It reads like the launcher: /wisp in api with opus edits: fix it, /wisp @ada look at this, /wisp stop, /wisp new …. Only your own comments count, by account id; anyone else gets silence. Tasks run in Plan unless you say Edits, Full auto is refused, and tool approvals stay in wisp. On a public repo a report is one fixed line with nothing an agent wrote; Full reports on public repos turns full reports on there. The section says at a glance whether it's working: who gh is signed in as, how many repos it watches, and what's wrong with the way to fix it when it isn't. It runs only while the computer is awake. Spells reach it through the phone.github part.

  • Say what you'd type in wisp, from Telegram. With the new Say what you’d type in wisp switch on (Phone → Telegram, under Start tasks from Telegram, off by default) a Telegram message reads like the launcher: @ada in api on laptop with opus high plan: fix the flaky login test. wisp replies first with what it chose, tells you the valid choices when something's ambiguous or not installed, and stop, done, status, /btw and with sonnet work in a task's thread. Crew members take jobs this way and answer in the thread that started them, queued jobs included, across a restart. Plain text starts a task, a group chat is capped at Edits, and with the switch on what leaves wisp has its secrets and @mentions taken out. Telegram and ntfy now run on a shared channel layer; with the switch off they behave exactly as before.

  • Sign in from the task that needs it. A run that fails because its harness is signed out used to end on Claude Code failed, and you had to leave the task to log in. Now the turn says Claude Code is signed out with the sign-in right there, and once you're in wisp sends your request again, once, in the same conversation. If the CLI says it's signed in after all, the turn says that instead and offers Try again. Works for every harness wisp can sign in, on machines too; /login in the reply box does the same.

  • Right-click a project to edit or remove it. It used to work only on the chips at the top of the sidebar, and only sent you to Manage projects. Right-click a project there, in New task's in row or in the list behind +N: Edit project… changes its name and colour in place, Remove project takes it off wisp and keeps its tasks and files. Both show at once and come back with a toast if the server refuses.

  • A task says what changed in the CLI between turns. wisp now records on each turn what the CLI was: its version, its tool set and, for Codex, a hash of its model catalog. When one of them moves from one turn to the next on the same harness and account, the finished turn says so in one line under its prompt (Since the last turn: Claude Code 2.1.316 → 2.1.318, WebFetch added.), so a run that behaves differently has a reason to look at. They're possible causes, not proof, and the line says so: a server-side change (a model updated behind the same name) won't show. Spells: the turn.whatChanged part. API: stats.cli on turns (version, tools, catalog, account, each only when known).

  • Panes: pin a My Stuff app beside your tasks or on home. An app's menu in My Stuff has Pin beside tasks (a tab in the side panel next to Changes, PR and Shell, told which task is open) and Pin on home (a whole-workspace tool under Needs you, such as a board of your tasks). An app can now use wisp itself: its wisp-app.json lists what it needs in "uses" (tasks:read, tasks:write, prs:read, crew:read, usage:read), you allow it once when you pin it, and its page calls wisp.tasks.list(), wisp.tasks.get(id), wisp.on('tasks', fn) (live), wisp.tasks.launch({ prompt, project }), wisp.tasks.followUp(id, text), wisp.tasks.done(id), wisp.prs.list(), wisp.crew.list() and wisp.usage.accounts() after loading /_wisp/pane.js. wisp checks every call against what you allowed, answers with each task's title, state, branch, PR and the last answer's one-line summary (never the conversation), lets a pane start or change at most 6 tasks a minute, and serves an app that uses wisp with a policy that keeps its requests on its own address. tasks:write lets a pane ask: every task it starts and every follow-up it sends waits on wisp's own card, and only your click on Send sends it. Starting tasks uses your own defaults: a pane can't pick the harness or the mode. The card asking for access only opens from your own click, never while the task it's for, or the task that made the app, runs in Full auto. Take it back from the app's menu (Take back access). A spell can pin panes (settings.panes: "Task board@home") but never allow them anything. API: uses and allowed on an app, POST/DELETE /api/stuff/:id/allow, the panes setting.

  • Compare shows honest numbers for each run. Compare now totals every turn of a run instead of showing its last one, and adds tokens, cache, Agent steps (the tools it used, counted the same on every harness) and plan share in one table, which updates in place as runs finish. When runs overlap on one account wisp can only trace what they took together, so each share is an estimate marked ≈, split by cost, beside the total. Under the table one sentence sets each run against the first in plain numbers, and never says which is better. Spells can restyle or hide the table and the sentence (compare.table, compare.note).

  • A quiet run says how long it's been quiet. After 12 minutes with nothing new, the working panel says No output for 12 min and keeps counting (No output for 1 h 5 min). It clears on the next activity and changes nothing else, and it stays away while a delegate or subagent is working or the task is asking you something. A spell can restyle or hide it (turn.noOutput).

  • Read what each judge did, like a task. Click a judge's row in the goal band's votes, or the check line under Done when, and each goal check opens as a page: which judge, which round, its vote and why, the prompt wisp gave it, its messages and commands, and what it saw. Older rounds are there too, under Earlier rounds, and a goal without judges has its own check to read the same way. A judge that timed out or answered without a vote keeps what it did, and one still checking shows live. Goal checks… is in the task's menus and ⌘K too. A goal keeps these for its last 50 checks; they go when you delete the task or drop the goal.

  • API keys for your cloud wisp. Script it with Authorization: Bearer wgk_… at https://<handle>.<domain>/api/…, no browser sign-in needed. Settings → Cloud → API keys (Connect, in a cloud computer) makes one, shows it once, and lists each key's name, last four characters, and when it was made and last used, with Revoke. A key opens that one wisp and nothing else: not your computers, sandboxes or account, and it can't manage keys.

  • Compact now, for a large Claude task while its cache is warm. At 200k tokens or more, the task's menus, ⌘K and the near-the-limit row offer one click that shrinks the conversation, with both prices beside it: About $0.74 now, $3.84 once the cache is cold (estimates at API list prices, its tooltip says; on a plan it counts against your usage window). It never runs by itself and has no setting. It isn't held near the limit, a goal or Auto's checks aren't touched, and the task stays where it was, unless the compact fails. In the task it's one quiet line, Compacting while it runs, under the answer you were reading, which stays open, and the task's row keeps that answer's verdict. Spells: the hold.compact, hold.compactNote, menu.compact and turn.compact parts, and a { "compact": true } button. A /compact you type now says what it did (Compacted from 480k to 12k tokens.) instead of The agent finished without a message, and when there was nothing to compact it says that.

  • Bring in your Conductor worktrees. Add or open a project and New task shows one line, 3 worktrees from Conductor, with Bring in and Not now (with Undo on its toast). Bring in makes each one a task right where it is, on its own branch, with your uncommitted changes as they were and the Claude chat picking up on your next message. wisp runs nothing there and never removes one, whether you archive, delete or merge: the task's side panel says so.

  • Subagents on Haiku. Claude Code runs every built-in subagent (Explore, Plan, page reads) on the task's model, so an Opus task's subagents spend Opus. Settings → Usage → Subagents run on (Same as the task, Sonnet or Haiku) sets CLAUDE_CODE_SUBAGENT_MODEL and CLAUDE_CODE_WORKFLOW_SUBAGENT_MODEL on Claude runs; an Agent call or custom agent that names its own model keeps it. When subagents on the task's model wrote 40% or more of a turn's output, the turn's subagent line offers Run subagents on Haiku, which opens that row (wisp never changes it for you), and a turn that ran with it says so in its tooltip. Spells: the subagentModel setting, the settings.subagentModel and turn.agents.switch parts. API: defaults.subagentModel, run.subagentModel on Claude turns, same on stats.subagents.

  • Old worktrees clean themselves up. A finished task kept its worktree, node_modules and all, until you archived it, so a few hundred tasks could fill a disk. Now a task's folder goes once it's been idle for 14 days (Settings → Worktrees → Clean up automatically: 3, 7, 14 or 30 days, or Never), and sooner if the disk gets under 10 GB free. The days count from this update, not from each task's age. Its branch stays and replying to the task brings the folder back, with the files .worktreeinclude lists; setup doesn't run again. Uncommitted work, open PRs, tasks in use or in For later, and anything you mark Keep worktree (in a task's More, its right-click menu or ⌘K) stay. The same pane shows what each worktree takes and lets you remove one, clean up in one click, or remove folders no task uses.

  • A large idle task says when its cache has gone cold. Replying to a Claude task of 100k tokens or more after its prompt cache has lapsed reads the whole conversation back in. The reply box now says so in one quiet line, Cache gone cold: this reply re-reads about 480k, with Fork… beside it, and the usage-limit card says the same when the reset comes after the cache has gone. It's only words: Send stays one click and nothing waits. The time comes from what the harness reports, so Codex and the others show nothing rather than a guess.

  • Side discussions can run commands and edit files. Ask /side to run the tests or fix a line and it does, in the main task's folder, without a card. Before each write wisp compares it with what the main task changed: a file it hasn't touched goes through, other lines of a file it changed go through with a warning row, and the same lines (or anything wisp can't place) show a clash card in the side discussion with both versions, whatever mode the main task is in. Apply and tell main task writes it and sends the main task a message, queued if it's running, and rechecks first in case it moved; Keep main's version refuses it. Commands that rewrite shared work (git reset, commit, git rm…) count as clashes, and so does one that removes or writes over a file the main task changed (rm, >, sed -i, patch, tee, cp…), named on the card before it runs. Files it hasn't touched stay free. Claude Code and OpenCode only for now: other harnesses can't ask before a write, so their side discussions keep reading and say so. /btw still only reads.

  • Review by another harness checks what you ruled out. The review before Merge now gets the lines in your own messages that rule something out or narrow the task (don't touch migrations/, only change web/, leave the tests alone) and the task's Done when, and checks the diff against each. A change that breaks one comes back as a High finding naming the path and your words (Touched migrations/ — you said: don't touch migrations), and the PR panel's review lists what it checked, a cross on any it broke. A harness's own /review only looks for bugs.

  • Lean Claude Code runs for wisp's own side runs. The small Claude Code runs wisp makes for itself (goal judges, the judge, the scout, review by another harness, the retro, titles) now start with CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: no telemetry, error reports or update checks, so 5 connections at start instead of 12 and about a second sooner, which keeps a box running many sessions from running out of NAT ports (anthropics/claude-code#106875). Nothing is lost there: they only answer with JSON or a short note. Tasks, crew jobs, delegated tasks, subagents and scheduled, automation and trigger runs start as before, because a lean run drops your claude.ai connectors (Google Drive, Docs, …), org memory (Team plans), /ultrareview, /advisor, push notifications and server-rolled features. Lean Claude Code runs in Settings → Agents: Off, wisp's side runs (the default) or All Claude runs, which says what's lost. Spells: the leanRuns setting (off, on, all) and the settings.leanRuns part. API: lean (on, off or null) on PATCH /sessions/:id for one task, defaults.leanRuns.

  • Make a pane: say what you want and an agent builds it. Type make me a pane that… in New task, or use Make a pane in My Stuff's header or ⌘K. An agent writes the app into My Stuff from an empty folder, pins it, and the pane reloads in place each time the agent changes it. Pinning grants nothing: the pane does nothing with wisp until you press Allow… on its bar. Apps can load /_wisp/pane.css to look like wisp, in light and dark. API: kind: 'pane' on POST /api/sessions, pin on wisp_save (only in a Make a pane task).

  • Two starter panes: Agent board and Allowance board. Add one from the Make a pane dialog; the click asks what it may use. Agent board shows every task across harnesses, accounts, machines and your crew in Working, Needs you, Review and Done columns. Drag a task to Done or press its Done button, and send follow-ups from its card (wisp's card still asks first). Allowance board shows each account's usage windows, when they reset, and how fast they're going when that can be told. It uses the new usage:read scope and wisp.usage.accounts(). API: GET /api/stuff/starters, POST /api/stuff/starters/:id.

  • Allowance board shows what each period cost. Each usage window now keeps its periods, and the board shows them newest first: how much went Outside wisp, then what 1% of the window cost in wisp (in dollars on Claude Code, in millions of tokens on Codex), period by period. Costs worked out from running totals, on older Claude Code turns and Codex follow-ups, are marked ≈. After 2 full weekly periods on each side, a line says whether 1% buys less, the same or more than it did, and what changed in the CLI; before that it says nothing. API: periods and shrink on each window of wisp.usage.accounts(), and GET /api/usage/periods. A starter copy you or an agent haven't changed now follows wisp's newer version, with the one before kept for Restore; a changed one stays as it is.

  • Panes on home sit side by side. Pin two or three apps on home and they fill its width as tiles instead of one under the other. Drag between them or under them to resize; wisp keeps the sizes, and a double-click resets them. On a phone or in a narrow window each pane is a row that opens as a full page with Back, and it only starts when you open it. A spell can set the layout with columns, widths and height on split.panes.

  • Repos set up for Conductor work in wisp. A repo with .conductor/settings.toml (or conductor.json, which Conductor ignores once the toml exists) gets its setup script run in each new worktree and its run script offered in the side panel's Run, as is. The setup goes through the same trust card as any repo's: wisp lists it and waits for Trust and start, except in Full auto. Both get CONDUCTOR_ROOT_PATH, CONDUCTOR_WORKSPACE_PATH, CONDUCTOR_WORKSPACE_NAME, CONDUCTOR_DEFAULT_BRANCH, CONDUCTOR_PORT (the first of ten free ports in a row) and CONDUCTOR_IS_LOCAL. For the setup, .wisp/worktree.json comes first, then Cursor's .cursor/worktrees.json, then Conductor; .wisp/worktree.json's run also beats Conductor's. A file wisp can't read for sure is refused whole, and the task and Run say why. Of several named run actions, wisp offers the one with default = true, else the first. Ignored: scripts.archive, run_mode, auto_run_after_setup, environment_variables, .conductor/settings.local.toml, ~/.conductor and scripts kept only in Conductor's app.

  • The crew has its own rail. In a wide window the sidebar now has a slim rail with a face for each crew member, and the task list sits beside it as a raised panel. Each face shows at a glance who's working (and on how many jobs), who's asking you, who has a report you haven't read and who's paused. Hover a face for its status; click it to open the thread. Org and + sit at the bottom of the rail. Narrow windows and the phone app keep the Crew section, and a spell can bring it back with sidebar crewRail: false.

  • wisp Grid has a real home page. After sign-in you used to get one long column of equal rows, with Delete weighing as much as Open. Now your cloud wisp comes first, with its state, a big Open, its address and a picture of the app; your computers and published apps sit under it as cards; and What your grid can do offers the next thing to try, saying so when it's done (4 published, Phone connected). A new account also gets three first steps. Devices, sign-ins, sign out and delete moved to Account (/account), a tab in the header.

  • Compare pages on trywisp.dev. Conductor alternatives sets seven apps side by side for people leaving Conductor, and links a page each for Orca, T3 Code, Paseo, cmux, Multica and Paradev. Each is built from the rival's own docs, says where the rival is better and when to pick it. Moving off Conductor links to them, and the guides list has a wisp compared section.

  • The crew rail picks what the list shows. Click a face and the list beside it holds only that member's jobs, every kind, in the usual sections, and New task is For Ada ×: what you send is a job for Ada, as if you had typed @Ada. All, first on the rail, brings every task back, and takes a dot if something outside the pick needs you, so a pick never hides a question. A typed @Other wins, × sends one prompt as your own, and opening a task the pick hides goes back to All. Side by side only: stacked and in the phone app nothing changes.

  • Hover a crew member to see what they're on. A face on the crew rail now brings a card instead of a tooltip: name, role and status, then their tasks in the order that matters (asking you, working, an unread report, recently finished), up to six, then All N in the thread. Click a row to open that task, or the head to pick them and open their thread, like a click on the face. The card waits while you move the pointer across, and rows don't move under it while tasks finish. With the keyboard, → goes into the card (← with the list on the right), ↑ ↓ walk it, Enter opens and Esc goes back. Spells: the crew.rail.card, crew.rail.card.head, crew.rail.card.row and crew.rail.card.all parts.

  • Try it two ways: one task, twice, on one harness, with one setting changed. Pick a harness and click Try it two ways in the prompt box's bar (the ↻ button, named in full on a wide box). A copy of your setup joins the pill and its picker opens with a What's different group for Claude Code: Subagents (Task's model, Haiku, Sonnet) and Skills (On, Off). Skills off runs Claude Code without its skills and slash commands; plugins, agents and CLAUDE.md stay. Each run keeps its setting on follow-ups, forks, moves and Rerun, and Compare says what differed under the prompt (Subagents: Opus → Haiku). Ask near the limit now adds up the runs of one launch that share an account, here and in the page. It isn't on Auto or in Plan. For the API, POST /sessions takes subagentModel, skills: 'off' and trial: true (and the first two on each compare entry), and PATCH /sessions/:id takes trialKept; for the CLI, --agent claude --try subagents=haiku or --try skills=off. Spells can reach launcher.tryTwo, compare.diff and picker.vary. Anonymous usage stats get one count per launch, with nothing else in it.

Changed

  • A worktree's copied folders cost no disk on a Mac. What .worktreeinclude brings into a new worktree (a node_modules, a build cache) is now a copy-on-write clone on APFS, and on Linux on btrfs, XFS or bcachefs: it shares the checkout's blocks until one side changes a file. A 2.1 GB node_modules took 2.2 GB of disk per worktree and now takes under 0.1 GB. Other file systems and Windows copy as before. The worktree records how many bytes it shares (prepared.cloned).
  • Old worktrees go sooner, and never pile up past a cap. A clean task whose PR is merged or closed loses its folder at the next hourly cleanup, a Done one after a day idle, and the rest after 7 days instead of 14 (Settings → Worktrees → Clean up automatically). New Keep at most (20, 40 or 80 worktrees, or no limit; 40 by default): past that many tasks' worktrees the oldest idle ones go, a few minutes after the new one that went over; left over folders don't count. Uncommitted work, kept worktrees, For later, open PRs and tasks in use still never go, even over the cap, and branches stay, so replying brings a folder back. Each cleanup also runs git worktree prune in your repos, so git worktree add stops reading hundreds of entries for folders long gone. Looking costs less while agents work: folder sizes are measured at most every 6 hours or when one comes or goes, and git reads only folders that changed. Folders no task knows still go only by hand. Spells can set it (settings.worktreeMax).
  • One answer box for questions and approvals: the reply box. A question or approval card used to carry its own Or say what to do instead (denies this call)… box right above the reply box's Or tell Claude Code what to do instead…, and both were cut short on a phone. Now the card holds the question and its buttons, and you type your answer in the reply box. It answers the question, or denies the approval with your words, exactly as the old box did, in Plan, Edits and Full auto. A mode, harness or team you picked under the box waits for your next follow-up instead of turning the answer into a new run. A spell that hides composer or composer.input still loads, with a warning, and the box stays while a task waits on your answer.
  • Ship it and Merge say when comments are still waiting. With comments you haven't sent on a task, both dialogs show one line, 2 comments not sent yet: they go with your next follow-up. It never holds anything back: the buttons work as before and Merge doesn't turn red for it, and the comments stay in the reply box. Several warnings in Merge's box now sit on a line each.
  • Changes shows a diff without a click. The first time you look at a task's files, the first one opens, or all of them when there are three or fewer. Generated, very long and already viewed files don't count. A spell can turn it off (panel.changes autoOpen: false).
  • The What changed line names the Codex model. When Codex's model catalog moves between turns, the line now says which models were added, removed or changed: Codex model catalog changed (gpt-6-luna changed), up to three by name. Turns from before this still read Codex model catalog changed. API: stats.cli.models holds one hash per model.
  • Codex's stop line reads fresh numbers. With an Automations stop line set for Codex, held-back work checks Codex first when the last reading is over 15 minutes old: nothing is spent, and a failed check changes nothing. The Allowance board's line on whether 1% buys less says nothing for Codex across December's plan change, when chats and Codex share one allowance, and Codex's bars no longer freeze if its limit moves to a new id.
  • A pane can no longer send a prompt on its own. With tasks:write allowed, wisp.tasks.launch() and wisp.tasks.followUp() used to send straight away. They now open a card in wisp itself, never in the pane, showing the project or task, harness, mode (Full auto says so) and the exact prompt with invisible and direction characters spelled out as <U+202E>. Cancel has the focus, Send wakes after 600 ms, and only your click sends. One card at a time; if a dialog of yours is open, the pane is told to try again. A pane's task also now runs in your default mode: it always ran in Full auto, whatever your default was.
  • A pane's write access lasts as long as its code. If an agent or an update changes any file of the app, tasks:write stops working and its bar says Changed since allowed, until you allow it again or the code goes back to what you allowed. Read scopes stay. API: GET /api/stuff/:id/grant.
  • A pane's access can't grow during a Full auto run. Allowing a new scope is refused (Not while … runs in Full auto.) while the task the pane is for, or the task that made the app, runs in Full auto. Taking access back always works, and other Full auto tasks, such as crew jobs, don't count.
  • The Haiku offer says where it pays off. The offer under a turn now reads Run subagents on Haiku: best on large repos and read-heavy work: Haiku saved 75% on a 52k-line repo and nothing on a 10k-line one.
  • Panes stay where wisp put them, and say what they can't promise. A pane's frame can no longer send what it read away by navigating itself to another address, and an app that doesn't use wisp can no longer frame wisp's page to steal your clicks. Secrets in a task's title, summary or live line are redacted before a pane gets them. The Allow card no longer says an app can't reach the internet, which wasn't true: browsers don't apply these rules to WebRTC, so it now tells you to treat what a pane reads as visible to whoever wrote it, and says so plainly when the app's code uses WebRTC.
  • Full auto no longer asks before a repo's hooks, MCP servers and worktree setup run. Full auto already skips every approval, so a task in it runs them as before the trust card, unasked, and a new worktree sets itself up at once. Plan and Edits still wait on the card, and a run held on it starts when you switch the task to Full auto.
  • The picked crew member stands out in the rail. The tile the list is showing (All or a member) now has a long pip on the rail's outer edge and a firmer outline, so it reads at a glance in light and dark. Hovering another face only tints it and shows a short pip, so hover and the pick no longer look alike.
  • A task is named after what you asked, not after what the agent did last. A task used to take its first answer's headline as its name (Connectors pane fixed and merged), so the list read as a log of outcomes. Now the agent's report names the subject of your request (Connectors pane), and wisp uses that; an agent that doesn't say keeps the name from your prompt's first line. A task you renamed, and a compare task, keep theirs.
  • A crew member's finished-job toast and notification open that task, not the member's thread. Its Open (and a click on the desktop notification) opens the job as a task, under its member with the member as a crumb, like opening it from the list.
  • The desktop app is now Tauri, and about a third of the size. It's the same page and the same server, on the system's own web view (WebKit on a Mac, WebView2 on Windows, WebKitGTK on Linux) instead of a bundled Chromium, with Node beside it. Downloads against 0.57.0's Electron builds: Mac Apple silicon 42.9 MB zip (was 130.3 MB) and 35.9 MB dmg (was 130.6 MB), Mac Intel 44.3 MB zip (was 137.1 MB), Windows x64 26.6 MB (was 114.4 MB), Windows Arm 22.7 MB (was 108.1 MB). The download names haven't changed. It needs macOS 13.3 or later (Safari 16.4, which the page needs); install.sh --app says so on an older Mac. Updating from an Electron build is the usual Update to …: the new app takes its place and opens, with your tasks, projects, crew and settings, all in ~/.wisp. What the old window kept for itself starts fresh: text you typed and didn't send, the list's width, which files you'd viewed in Changes, and the commands you'd allowed a spell to run, which it asks about again. On Windows the old copy in Programs\wisp-agents and its entry in Apps go, and your Start menu, desktop and taskbar links open the new one; Electron's profile in %APPDATA%\wisp-agents is left. From npm, wisp no longer installs Electron (npm i -g wisp-agents has no dependencies at all): it downloads the app's shell from the release once, checks it and opens it on your Node, or opens a tab if it can't. Homebrew has nothing left to strip.

Fixed

  • A quick answer names its task too. A one-line answer (Not yet, #728 is still open) has no report, so its task kept your whole prompt as its name (Did you merge the title generator work or not yet? Just answer). Now the agent ends even a plain answer with the subject of what you asked, and the task takes it (Title generator merge); a crew member's quick answer does the same. The answer still shows as it is, with no empty report or Nothing new above it.
  • A task that delegated in the background no longer says it's done before its delegates are. A lead that sent subagents off with wait: false and ended its turn landed in Needs you, unread, with a "finished" notification, then started again by itself when their report came back. Now it stays in Working, with Waiting on @name on its row and a panel with Stop under its latest turn, and lands, with one notification, once the follow-up that reads their reports ends. Stopping it, or deleting the last delegate it waited on, lands it quietly. A spell can restyle or hide the panel (delegate.waiting).
  • The Tauri app on macOS no longer quits when a notification shows and macOS returns no list of delivered ones.
  • A Claude turn that worked no longer shows the refusal card. Once Claude Code had a refusal anywhere in a run, every later answer of it said Claude Code turned this task down: the turn after a refusal the CLI retried and got past, and the turns a finished background shell or subagent starts. Now only a turn that itself ended in a refusal says so, and a subagent's refusal isn't the task's.
  • A Claude run on a Console sign-in says so. When Claude Code's claude.ai login stops working and an ant auth login or keyless Console profile is on the machine, Claude Code quietly runs on that profile and bills the Console org, and nothing in its output says so. wisp now reads claude auth status --text as a task starts (once a minute per account, beside the run, cut off after 5 s) and, when it shows a Profile: line, marks the turn Console sign-in and counts it under Settings → Usage → Plan budget's Past your plan. It's a notice only: the run is never held, asked about or slowed. API: turn.overage.kind and budgets' overage.kind can be profile.
  • A forwarded Telegram message no longer runs as your own words. Someone else's text forwarded to your bot could start a task, up to Full auto in a private chat, or follow up on one, answer its question or stop it. A link code in a forward could link the chat. Now a forward does nothing: you get one line saying nothing started and to say it in your own words, and a chat that isn't linked hears nothing. Replies, and your own words beside one, work as before.
  • A task started from a channel at a cap stays under it. A Slack or GitHub message, or a Telegram group's, runs at Edits or lower, but its agent could call wisp's own tools, which need no approval: start a Full auto task on another machine, raise another task, read other projects, hire a crew member, all with no prompt. Now anything it starts carries the cap; going above it, to another machine, a sandbox or another project is refused with a line the agent reads, and so are changes to your crew and connectors, public links, and tasks it didn't start. wisp_session, wisp_sessions, wisp_stuff and wisp_stats keep to its own project. Choosing a higher mode on your own follow-up in wisp lifts the cap for that task. Each agent also gets a token of its own, so it can't speak for another task, and on a capped task Codex's sandbox stays off the network whatever your config says, and opencode waits for you before a command or a web fetch. Tasks you start work as before.
  • A reload right after Send no longer brings the prompt back. Reloading or closing wisp while a new task was still starting cut the request off, and the page took that for a failure: the prompt came back as a draft although the task was running, ready to be sent twice. It now stays gone; if the task really didn't start, ↑ in the prompt box still has it.
  • A task from GitHub or Slack says when it stalls on you. When a task started there stops for an approval, a clash or a connector sign-in, which can only be answered in wisp, the thread now says so at once: Waiting for your OK in wisp: run npm publish, once per ask, whatever the Phone events say. That covers a subagent, side discussion or delegated crew job holding the task up, which used to say nothing, and every approval in a turn followed up from a comment. A public GitHub repo gets only Waiting for your OK in wisp., even with full reports on.
  • A channel no longer claims a model that won't run. The Claude CLI runs haiku on Sonnet in Plan, so a start from Telegram or a GitHub comment that said Haiku · Plan was wrong. The ack, a crew member's and a follow-up's now name Sonnet and say why, and a finished turn's report says which model ran when it isn't the one the task asked for (never on a public repo, which keeps its fixed line).
  • A reply to Slack or Telegram survives a broken connection, and GitHub's or Slack's first reply isn't lost. A post whose connection broke was dropped, so a task could start in silence and its question arrive first. It now goes again, up to three tries, and can on rare occasions show twice. If it still can't get out, Settings says so and the first reply goes ahead of the next thing said in that thread. A follow-up or a crew mention that went, whose reply didn't, no longer says Couldn't send that: resending it ran it twice. On GitHub that reply no longer cancels the turn's report either.
  • A tap on an ntfy button is no longer lost while wisp is off. wisp began reading each time from the moment it started, so an answer tapped while it was stopped, or while a cloud computer slept, never arrived. It now remembers where it stopped reading, and catches up with whatever ntfy still holds (12 hours on ntfy.sh). A question that was answered in the meantime stays answered.
  • A Slack trigger only answers the people you name. Anyone in its channel could start a task. A Slack trigger now takes a list of member IDs (users; in Slack, their profile → ⋯ → Copy member ID), new and edited ones must name at least one, and everyone else is skipped. A trigger you already have keeps working as it did, and is marked open until you name someone.
  • Safari: the Enter that picks an IME word no longer sends your message. With a Japanese, Chinese or Korean input method, confirming a word sent the whole box. Also in Safari: a row you scroll to in a long task list lands in view, the dashed loop in a flow block draws, code and key hints use the same font as Chrome, and the terminal's scrollbar shows.
  • Publish, Share and /sandbox work from a cloud computer. A box couldn't reach its own grid: the rule that keeps boxes off the host also dropped the grid's public address, so each of the three waited a minute or two and failed with Couldn't reach grid.trywisp.dev. A box can now call the grid's public HTTPS like anyone on the internet, and nothing else on the host opens. Grids pick this up from grid/deploy/firewall.sh.
  • The Mac window buttons clear the list's panel. In the desktop app the green button straddled the edge of the list's panel. The top of the sidebar is now a strip in the crew rail's colour: the window buttons, the sidebar button beside them, search and your account on the right, with the task panel under it. Beside the panel, the rail now has the main area's colour: dark in dark mode, white in light, and the panel alone stands out.
  • A subagent no longer gets the whole conversation's output on its receipt. A resumed Claude turn whose last turn stored no per-model counters took modelUsage for its own, so it could read 246k of 246k output when the subagent wrote 18k. That turn now shows only the main thread's tokens, with its subagents' calls and model, and the next turn is exact. Older stored turns no longer show a subagent output figure, and it no longer counts toward the Haiku offer or Settings → Usage.
  • A secret in a report no longer reaches your phone's channels. Notifications to ntfy and Telegram went out as written, so a token an agent printed in its report landed on ntfy's public server, or in your Telegram chat. wisp now takes secrets out of everything it sends there, with a line saying so, whatever your settings. Reports with no secret read exactly as before.
  • Preview's bar no longer cuts its address to a fragment. On a narrow phone or window the bar read Running · loca…. Where the address won't fit whole it now says Running or Starting alone; the address stays in Logs and Open in browser, and wider screens show it as before.
  • A stopped task says why on its row. A crash, a usage limit and a refusal all read a red Blocked, the same as an agent that stopped to explain. The list, ⌘K, older turns and shared tasks now say Failed in red, At limit or Refused in amber; Blocked stays for the agent's own report.
  • The editor's head stays readable while the agent works. A long path used to squeeze Back to 16px, and the file name and Agent working: save when it stops both came out cut. Back now keeps its size and the word stays Unsaved, with the reason as the tip on Save and on the word (touch has no tips, so there it says Agent working). In a tight head, the language offer is its spark alone. ⌘K now says Open file…, like Changes, and the Rename toast no longer points at a note that's gone.
  • A pane opened as a page keeps its name on the row. On a phone or in a narrow window, a pane with all its access showed its name about 8px above Back, Reload and Unpin. It now sits level with them, and only moves up when a line under it says what the pane still asks for.
  • Reading a task stays put. A run finishing, a queued follow-up starting or a compact no longer throws you to the new turn, and the answer you're reading stays open. New output only follows you at the end of the task: scroll up and it stops at once. Your own send moves the view once, and a Latest pill over the reply box takes you to anything that landed while you were reading further up.
  • An overlap warning no longer knocks you off the end of a task. The warning that another task changes the same files comes a couple of seconds after a run, and at the end of a task it covered the last lines and stopped the next answer from following: a Latest pill showed instead. The view now stays at the end.
  • Long file names show whole in Changes. The Stage and Viewed controls left a name about 140px in the default 480px panel, so changes-open-first.test.js lost its end. A name that doesn't fit now takes the whole line and the counts and controls drop under it, in the same columns as every other row; the other rows stay one line. On a phone the counts move to the controls' line, which gives the name their room.
  • The page says when it has lost wisp. With wisp gone, a task kept saying working and its timer kept counting until you tried to send. After 4 seconds Reconnecting to wisp… now shows on the task's header, or at the top of home and the list, on every width and in the phone app, where the old line sat behind the task page. It goes as soon as wisp is back.
  • Claude Code tasks in Plan mode can ask you and tag themselves. Plan mode refused wisp's own tools (Cannot call mcp__wisp__ask_user while in plan mode), so a planning agent couldn't put a question to you. Now it can ask, tag the task, schedule a follow-up, show its watch page and read your tasks, stuff and crew; what starts or changes something stays refused until you leave Plan.
  • A working task counts 1 action. The working panel said 1 actions until the second one.
  • Compare runs use the account you picked. The account picked for a second or third runner in Compare was ignored: the run took your last pick or the first free one while its pill showed your choice. Each run now goes on its own pick, and a limit check looks at that account.
  • With no connection, wisp says so in its own words. A failed request showed the browser's own Failed to fetch (or Load failed in Safari). Toasts and panels now say Can’t reach wisp. Check the connection and try again., and a request given up on says wisp took too long.
  • A reply wisp doesn't answer comes back to you. A follow-up sent while wisp wasn't answering left the task on Working with the text gone and no message. After 20 seconds the text is back in the box, the task goes back to how it was and a toast says wisp took too long to answer. Try again. Sending it again is safe: if the first one got through after all, it doesn't run twice. Queued follow-ups stay as they were.
  • The cold line waits for the bar on a phone. On a phone and in the app, Cache gone cold sat above the folded reply box and made it 20px taller, 44px in the app, the moment a task went cold. It now arrives with the bar when you tap the box and goes with it, so a resting box stays one line and never moves.
  • The usage-limit card says when a cache may have gone cold. Tasks that woke at a reset could go cold well inside their cache time and re-read 170k tokens with no warning. The card now says Cache may have gone cold by then however soon the reset is, will have when it's past the cache time, and nothing once it's already cold: the line used to show twice, on the card and in the reply box.
  • Changes stays current after Ship it. Changes kept showing the Commit box, Stage boxes and 2 uncommitted until a reload, and Commit then said there was nothing to commit. They now go as soon as the ship ends, in every open window, including when the push fails after the commit landed.
  • Deleting your Grid account shows Account deleted again. With your cloud wisp running, the account page refreshed itself halfway through and landed on the sign-in page, though the account was deleted.
  • The keyboard stays in the reply box after Send. Sending from a finished task moved its row from Needs you to Working and left the keys nowhere, so the next word went to wisp's shortcuts: typing edit raised a toast, opened Changes and asked to stop and take over the run you'd just started. The box keeps the keys now. On a touch screen Send still lets the keyboard drop.
  • A goal check's page shows everything the judge said. The words in a judge's last message before its vote were dropped from the transcript of its check; they now show as its last message.
  • A side discussion keeps its link back to a long-titled task. With a long main task title the line above its first message read Side discussion of …, with no title and nothing to click. The title is what's cut now, the link stays, and its focus ring isn't clipped.
  • A failed run says why, at once. The screen said Something went wrong, and the reason took over a second to appear behind a typed-out command. Now it reads Claude Code failed with the error's first line, in the task's row too, and the output shows straight away. The command was made up, claude run, and its Run button started the harness in the task's folder: failed runs and the usage-limit and too-many-devices screens no longer show it, on old tasks too. Try again stays, and terminal blocks with a real command keep Run.
  • A side discussion's clash card keeps its answers in view on a phone. It no longer repeats the main task's lines when the diff shows them, or a second what to do instead box above the reply box, so Keep main's version isn't under the reply box when a phone opens it.
  • App data isn't stopped for a slow disk. An app's query on a file that took a while to open came back as took over 5 s and was stopped; its time limit now starts once the file is open.
  • Publish keeps secrets off the public link. .env files, credentials, keys and source maps went up with an app and anyone could open them. Now they're never saved to My Stuff or published, and a wisp Grid drops them on receipt and opens no dotfile (.well-known stays), even for an older wisp. A key or token in the app's own files stops the publish with the file and line, never the value; public keys (Firebase, Mapbox, Stripe pk_, a Supabase anon key) and placeholders go through. A published app's card, and the answer an agent gets, now say it plainly: anyone with the link can read and change its data, so no personal data in it.
  • A second side discussion no longer blames the main task. When one side discussion had changed a file, another side discussion's card said those lines were the main task's, and Apply sent the main task a message about a file it never touched. The card and the warning row now name the side discussion, Apply and Keep leave the main task out of it, and lines the main task did change stay its own.
  • A goal with one judge reads right. The check told the agent 0 of 1 judge say met; it now says 0 of 1 judge says met.
  • A Claude Code follow-up no longer counts the whole task again. On --resume the CLI's cost and per-model counters carry on from the last run, and wisp took them for that turn's, so every follow-up's cost, receipt and model split held all the turns before it: Usage, crew usage and the budget's units added them up again (cost read about 3.6x high on real tasks). A turn now counts what it spent, subagents included, and Usage's tokens are the receipt's. Turns from before this keep their old cost; their tokens read from the turn's own usage.
  • A Codex follow-up no longer counts the whole thread again. codex exec reports the thread's running token totals, so each follow-up counted every earlier turn too, and Ask near the limit, Drain watch, usage and the receipt read high. Each turn now counts its own tokens. Turns from before this keep the numbers they stored.
  • The reply box in a phone browser stays one row. Up to 720px wide, Side question · … and a read time are one line above the buttons, ending in …, instead of a word-wide column that tripled the box. Typing /btw moves neither Send nor the input sideways, and no button squeezes: the bar scrolls sideways with Send pinned, as in the app.
  • Archiving a task right after it finishes removes its clean worktree. In the seconds a CLI takes to exit after its result, the task already shows as done, but archiving it left the worktree on disk for good. Archive now lets that CLI go, as Ship it does, and removes the worktree at once.
  • Files that arrive during a run open in Changes. With the panel open, new files stayed shut until a reload, and a first look at only a lockfile or a large file left every later file shut. They now open as a reload would show them: all of three or fewer, or the first. Once you open, fold or view a file, nothing else opens by itself.
  • Grid rate limits hold across the minute. All counters were wiped at once every 60 seconds, so a client that timed it got twice its limit in a burst, and a limit could reset for someone a moment after they reached it. Limits now count the last 60 seconds for each client.
  • The keyboard stays put in Preview. Run, Restart, Stop, Logs and Escape while picking dropped focus to the page, so the next Tab started over from the top. Each now keeps its place: Logs and Restart stay on their button, Run lands on the bar, Stop and an exit land on the command, Escape goes back to Pick.
  • Issue sits with the recipes on New task. It used to wrap alone under the project chips, even with No folder picked. It's now at the right end of the Recipes row, and only shows with a project picked; ⌘K Start from an issue… still works anywhere.
  • /sandbox no longer fails on a project that takes a while to pack. A sandbox left idle while wisp packed your project was stopped by the grid. The upload woke it, but the very next step was refused with Sandbox is offline, and after three tries the task was never made. wisp now lets requests through while a cloud computer wakes.
  • An app whose database was stopped while it was being made no longer stays broken. If the first query ran into the time limit before seed.sql finished, the file stayed half made and every later query failed with no such table. A seed that didn't finish now starts over on the next query, and an app's database left empty this way gets its seed. A seed.sql too slow for the limit (5 s) now says the query was stopped each time, rather than leaving half its data.
  • A task or crew member can have as many delegates as you pick. Delegates stopped at 6 (12 counting copies): a seventh crew member had to replace one, and extra rows from the API, a preset or a follow-up were dropped without a word. Add delegate, the Org chart, shared crew files and subagents an agent makes on the fly no longer have a limit, and one delegate call reaches every member, not the first 12. Copies of one delegate still go up to 5. A run too long for the computer to start now ends with an error that says so, instead of staying on Working.
  • The phone app's reply box stays one tidy row. Side question · Claude Code keeps working and a read time now take one line above the buttons instead of wrapping into a one-word column over Queue and making the box three times taller. Queue is a 44px target, typing /btw moves neither Send nor the input sideways and the buttons stay readable, a long file name no longer squeezes its icon, and under a live transcript the working panel is one centred row with less empty space around a turn's stats.
  • Follow up on a crew member's job near your usage limit asks you, instead of failing. In a member's thread, a follow-up that would take its account past your line showed only a red error and lost what you typed. Now the box keeps your text and shows the same row as a task's reply box, with Send anyway.
  • Start anyway on a job for a crew member on another computer starts it there, instead of held. Near your usage limit, the yes you gave a member who works on another computer (or in a sandbox) didn't go with the job, so that computer started it held in Needs you. Now the job carries your yes, and without one that computer asks you first, as yours here does.
  • Start anyway on @ada @Quill … gives each member one job. Near your usage limit for only one of the members you named, the others started at once and the row asked about the last one; Start anyway then gave the ones that had started a second job. Now every member is checked before any starts.
  • Send anyway on a message to a crew member sends it, instead of starting the task held. Near your usage limit, a job you gave a crew member yourself (@ada … in the prompt box, or the box in their thread) was always created held, Held before it started, even after Start anyway, so you had to open it and press Start now. It's now asked about like any task of yours: the hold row shows over the box (their thread's box has it too), and Start anyway starts the job at once, also when it waits for a free slot first. Check-ins, triggers and other automations still start held.
  • A review that saw only part of the PR says so. Review by another harness used to cut a long diff off silently, and could say Nothing to fix about changes it never got. It now keeps whole files and hunks, and the PR row says Partly reviewed instead of Reviewed, on findings and failing tests too. The PR panel opens the review with a box naming the files it didn't read, Merge's confirmation warns, and your don't-touch rules lose their green ticks because those files weren't checked. A whole review adds one quiet line, Reviewed all 12 files.
  • Saving settings on Windows no longer fails now and then. When something held config.json (or another file wisp saves) open for a moment, such as antivirus, the search indexer or another reader, the save failed with EPERM: operation not permitted, rename and the change (a new connector, a setting) was refused. wisp now waits out the lock, for half a second at most, before giving up.
  • Open on a toast or notification closes the image viewer or dialog in front. Open on a reminder, a finished or has a question toast, Side discussion started or Sent to … (and a tapped system notification) opened the task behind the image viewer or any dialog that was showing, so it seemed nothing happened until you closed it.
  • Open on the Saved to My Stuff toast now closes the image viewer. Saving a picture from the viewer, then clicking Open on the toast, opened My Stuff behind the viewer, which stayed on screen until you closed it.
  • The desktop app's first window opens within 5 seconds, even with a slow shell setup. On first open the app reads PATH from your login shell. A ~/.zshrc that took long kept the window from opening until it finished, because the 5-second limit never stopped an interactive zsh.
  • New task steps aside for a question's answers. In the Android app, the floating New task button could sit on the Yes or No of a question answered from its row, and a long answer wrapped centred. The button now fades away while a row's answers are on screen, and answers read from the left like the open card's.
  • The task list stays where you put it. Sending a follow-up threw the list to Working, a run finishing threw it back to the top (from 2963px to 0), and launching from New task scrolled it down to the new row. The list now only moves when you scroll it, press J or K, or open a task from search or a toast whose row is out of view, which used to leave the row off-screen. A launch whose row doesn't show says Sent to Claude with Open instead. Stacked and on a phone, a launch still brings the row into view.
  • Project pickers are a plain list again. Since Make a pane, every project picker (New task's projects, the top bar's, a crew member's and sharing's) drew each project as its own bordered, centred box inside a framed list: Make a pane's starter list used the picker's class name. It has its own now.
  • A quick answer reaches your phone. When an agent replied in plain text with no report card, Telegram and ntfy said Ready for review. and left the answer in wisp. The answer is now the message, cut at 1000 characters.
  • A spell's card in a task is full width again. Since the spare-allowance row on home, a spell panel shown as a card above or below a task (card.top, card.bottom) was squeezed into a 13px column, one word per line, and home's spare-allowance row sat low in its box: the two shared a class name. The row has its own now.
  • Delegating to many subagents no longer freezes wisp. Starting subagents on harnesses that report edits after the fact (Codex, Cursor, OpenCode and others) ran one blocking git stash create per subagent, then one git show per subagent for each file, and the server answered nothing meanwhile: the page stalled for longer the bigger the repo. A delegate call now asks git once for the folder and once per file: 14 Codex subagents went from 42 blocking git calls to 3.
  • A harness you just signed in to reaches the picker however often the list is asked for. Each look at the harness list starts a check, and a check that finished was thrown away if a newer one had started, so with looks arriving faster than a check takes, the list kept saying signed out.
  • The editor keeps your place. A file now opens at its first line, not its last, with the caret there. Load theirs and a rename stay on your line. Closing a picker (⇧F12, ⌘P, Ctrl+Space, problems), Rename or Cancel on Discard gives the keyboard back to the file, where it used to fall to the page; Esc gives it to the file's row in Changes.
  • Settings → Connectors lays out again. Its heading wrapped one word per line, Add connector showed as an empty 13px square, and the connector rows spilled out of the pane over the hint: the pane shared class names with the Changes panel, whose Viewed checkbox style squeezed it. Connectors now has class names of its own; spells that restyle settings.connectors, connectors.row or connectors.import keep working.
  • Settings → Cloud lays out again. Since the crew rail's hover card, your cloud account sat in a floating 320px card over the pane's own words, and the grid address box under Reach this computer from anywhere (Settings → Machines) and Add an account was crushed behind its Sign in button: the card and the Cloud pane shared class names. The Cloud pane has names of its own now, and a test fails when one class is styled as two things in two stylesheets.
  • wisp Grid no longer goes down as a computer's tunnel closes. A computer hanging up or reconnecting, or the grid shutting down, could land its keep-alive ping on a tunnel already closing, which threw where nothing caught it and stopped the grid. That ping is now skipped.
  • A long question shows its answers when it opens. When an agent's question or approval had more text than fit, its answers sat under the reply box, so you had to scroll past everything to reach them: on a phone, and on a laptop-sized window. They now stop above the reply box and the text scrolls under them. Cards that fit look the same.
  • Quitting wisp while a cloud computer wakes stops the wake. The wake and tunnel checks went on asking the grid for up to 90 s after wisp had stopped, keeping the process alive and changing the machine's state after the server was gone.

Get wisp 0.57.1-nightly.20261109.1653

macOS (Apple silicon) wisp-mac-arm64.dmg
macOS (Intel) wisp-mac-x64.dmg
Windows wisp-windows-x64-setup.exe · Arm
Linux AppImage · .deb · Arm: AppImage, .deb
npm (Node 20+) npx wisp-agents@nightly or npm install -g wisp-agents@nightly

To keep getting these, set Settings → General → Updates to Nightly. Checksums are in SHA256SUMS.txt.