Ctrl K
ComunidadGuías…

CHANGELOG.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Changelog

All notable changes to Agent 007 are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project uses a four-part `MAJOR.MINOR.PATCH.MICRO` version.

## [0.74.1.0] - 2026-11-11

### Removed

- **`AGENT007_STATIC_DIR` is gone; the web UI is always served from the bundled `public/`.**

## [0.74.0.0] - 2026-11-09

### Added

- **`AGENT007_STATIC_DIR` picks the directory the web UI is served from.** An app that imports the engine (such as Star Quest) can serve its own UI without replacing the HTTP server's request listener. Unset, it serves the bundled `public/` as before.

## [0.73.0.0] - 2026-10-31

### Added

- **A board worker stopped by a transient API error is told to continue.** When a worker's turn dies on an API 429, 5xx, "Overloaded" or a dropped connection, it no longer sits stalled until morning: a minute after the error the board types `continue` into it, at most twice per card, and a turn that ends cleanly gives it both back. Each one is logged on the card (`autoContinues` in read_job) and in server.log. Usage limits and logins are left to account rotation and Billion's CLI switch, and agents started by hand are never touched. Idea from mattabate/life-distributable's `hub/internal/threads/retry.go`.

## [0.72.1.0] - 2026-10-31

### Fixed

- **Server git calls no longer run repo hooks or fsmonitor, and no longer see server-only secrets.** A worker can write the shared `.git`, so a `post-checkout` hook or `core.fsmonitor` fired by `git worktree add` used to run with the server's `TELEGRAM_BOT_TOKEN` and friends in its env. Git now runs with `core.hooksPath` and `core.fsmonitor` off and the same env stripping workers get.

## [0.72.0.0] - 2026-10-28

### Added

- **A board-wide worker limit.** The job board now runs at most `jobBoard.maxWorkers` workers at once across every repo (5 unless set; **max total** in the toolbar), on top of `maxPerRepo`. Billion itself never counts. When the board is full, Billion's urgent cards (`post_job` with `urgent: true`) and the runs of a schedule go out first, then the oldest card.
- **Memory back-pressure.** Before starting a worker the board reads swap, macOS's memory pressure level, free disk and, when present, the mac-mini-guard watchdog's `current.json`. Under pressure (swap over 75%, under 15 GB free) it runs two workers fewer; when critical (swap over 90%, under 8 GB free) it starts none until memory recovers, and running workers carry on. To do says why ("Waiting: Mac memory is low"), a held card shows "delayed by memory", a delayed schedule run keeps its place and goes first, and the board looks again every minute. The toolbar shows running against the limit, and `agent007 doctor` shows the readings, the limit and the reason. `MEMORY_BACK_PRESSURE=0` turns it off.

### Fixed

- **A dropped connection no longer hides the owner's pending message.** While the Billion tab reconnects, a message still waiting for Billion keeps its "waiting" state and its progress box (marked "Reconnecting… your message is kept", not active) instead of looking answered, and the reconnect's replay brings it up to date without reloading the page.

## [0.71.0.0] - 2026-10-28

### Added

- **A live step log under your message in the Billion tab.** While Billion works on your message, the box under it lists every step, each with its time, and highlights the newest with a running timer ("12 s"), so you can see it is working and what it has found. Each `set_status` adds a step instead of replacing the last, and the tools Billion uses show as plain phrases ("Running a command", "Reading STATE.md", "Checking the job board", "Posting a card"), never a command, its arguments or output, a file's contents, a secret or Billion's reasoning. The log scrolls on its own and folds into the reply's **Work details (N steps)** when Billion answers. Works on a phone and without Telegram; no new setting.
- **Queued versus being worked on, said plainly.** A message still in Billion's queue reads "Waiting for Billion to finish its current step"; one Billion has reads "Billion is working on this" (or, behind an older one, "Billion has this, and is answering your earlier message first"), in place of the old "Waiting to start…".

### Fixed

- **A message you sent Billion survives a restart.** Billion's queue lived only in the server's memory, so a message still waiting when Agent 007 or Billion restarted was never typed in. The Billion tab showed it "queued" for good, and as the oldest message waiting for a reply it took Billion's next reply, leaving every later answer bound one message too early. When Billion starts, the owner's messages still marked queued go back in its queue, oldest first, and Cancel still works on them.

## [0.70.1.0] - 2026-10-26

### Fixed

- **`merge_check` sees deploys in workflow files the PR itself adds or edits.** It read `.github/workflows` only at the base branch, but a merge runs the workflows as the PR leaves them, so a PR adding a push-to-main deploy workflow came back "no deploy". Changed workflow files are now read at the PR's head (a fork's too), a deleted one drops out, one it cannot read there is unknown, and the result notes which workflow files the PR changes.

## [0.70.0.0] - 2026-10-23

### Changed

- **Talk to Billion sounds like a person, waits for you to finish, and answers at once.** With `ELEVENLABS_API_KEY` in `~/.agent-007/.env`, replies are spoken by ElevenLabs (voice Eric, the Flash model; `ELEVENLABS_VOICE` and `ELEVENLABS_MODEL` change them) and play as they stream in; without it, `say` as before. A turn now ends only after a real pause (about 1.2 s after a finished sentence, 1.5 s usually, 2.6 s after an unfinished phrase like "...and the"), and words you add before Billion answers join the same turn instead of making a second one. The moment a turn ends, a short acknowledgment ("Got it, one sec.", never the same twice in a row) plays while Billion works on the reply. Speaking over Billion ducks it at once and stops it a few frames in. See docs/BILLION.md "Talk to Billion".

## [0.69.6.0] - 2026-10-20

### Fixed

- **The page no longer reloads every time its connection drops.** Behind
  Tailscale Serve, a Cloudflare tunnel or any proxy, an idle timeout or a
  network blip dropped the socket, and every reconnect reloaded the whole
  page. Now the page reconnects in place: closed tabs go, the terminal on
  screen gets its scrollback again, and the chat, board and status resync from
  the server. It reloads only when the server itself restarted or updated,
  which it tells apart by a boot id the server sends in its welcome.
- **The server no longer cuts a healthy page whose ping replies go missing.**
  Through cloudflared or Tailscale Serve, or from a suspended tab, the
  socket's protocol-level pong could go missing while the page's own ping
  every 15 s still arrived, and the server's heartbeat dropped the connection.
  Any message from the page now counts as alive.

## [0.69.5.0] - 2026-10-20

### Added

- **Cancel a message before Billion gets it.** In the Billion tab, a message still waiting in Billion's queue reads "queued" and has a **× Cancel** link (tap twice to confirm). Cancelling takes it out of the queue so Billion never receives it and shows it struck through as "Cancelled — Billion never got it". The cancel is saved, so a reload or restart keeps it cancelled and delivers nothing. This works for typed messages, Talk to Billion voice turns, attachments and Telegram messages. If typing into Billion's terminal has already started, the message stays sent and the tab says "Already sent to Billion".

## [0.69.4.4] - 2026-10-11

### Fixed

- **Leftover agents whose worktree folder is gone no longer linger.** If a leftover agent's worktree was removed outside the app (for example with `git worktree remove`), it is now dropped from the office at startup instead of showing forever.

## [0.69.4.3] - 2026-10-11

### Changed

- **Solo Founder Guide: the MDN link is replaced by two explainer videos.** MDN was too hard for non-technical founders. The guide now links to a 5-minute video on the frontend, API, backend and database parts, and a 13-minute backend overview, with an optional 6-minute frontend companion.

## [0.69.4.2] - 2026-10-11

### Added

- **Solo Founder Field Guide.** A plain-language guide for non-technical founders running a one-person company with AI agents: ten things to know, what agents still leave to you, and just enough of the technical side to judge their work. See `docs/SOLO-FOUNDER-GUIDE.md`, linked from the README.

## [0.69.4.1] - 2026-10-11

### Changed

- **The Accounts hint now matches how switching works.** Each CLI cycles through its own selected accounts in list order, and Billion moves to the other CLI only when every selected account of its own CLI is limited.

## [0.69.4.0] - 2026-10-10

### Fixed

- **Filing a card closes its worker even when that worker's CLI has already exited.** Before, the exited tab was only unlinked from the card. It stayed in the saved session list, and the next server restart turned it into an orphan of a card that had moved on. This applies when a card moves to Done or back to To do, when its PR merges, and in the closed-PR sweep. Its files are never discarded on the way out, even for a superseded scheduled run, since a CLI that died mid-run may hold work its summary does not. A worker paused for an account switch is not treated as idle. A filed card also no longer keeps a link to a session that is gone.
- **server.log names every worker the board closes** when its card is filed or sent back, for example `Shadow-2: closed, its card "…" moved to Finished`.

## [0.69.3.0] - 2026-10-10

### Fixed

- **A finished card's worktree is released once its work is on main, even after a squash merge.** A worktree counted as "unpushed" whenever its branch had commits the local base branch lacked, so every squash-merged PR (its commits never land on main as-is, and its remote branch is deleted) and every run that branched from a newer `origin/main` than the local `main` was kept as an orphan. Now a branch is "unpushed" only when it has commits that are on neither its remote branch nor `origin/<base>`, unless every file it changed has since held exactly the branch's version on the base branch (what a squash or rebase merge leaves, compared by blob id, so an edit that differs only in whitespace still counts as unpushed). `origin/<base>` is fetched before that file test, and a failed fetch keeps the branch. Uncommitted files still keep the worktree, and so does anything git cannot decide. The startup pass re-checks existing "unpushed" orphans of finished cards under the new rule and releases those whose work is on main.

### Added

- **`agent007 doctor` lists stale orphans.** A new "Stale orphans" check (under Repos) names each orphaned worktree that is clean, whose work is already on the base branch and that no open card may re-adopt, with how to remove it: its delete button in the Explorer, or a restart for an "unpushed" one. Report only, from local refs, as the rest of doctor.

## [0.69.2.0] - 2026-10-10

### Added

- **Settings → Accounts marks the login Billion runs on.** When both a Claude and a Codex row say "Active", the one Billion itself is using now ends its status line with "Billion". No marker when Billion is off.

## [0.69.1.0] - 2026-10-10

### Changed

- **Accounts rows are two lines, not three.** Move up, Move down (now ↑ and ↓ buttons, with tooltips) and Switch now sit on the right of each account's row instead of on a line of their own, so the list is shorter and works on a phone.

## [0.69.0.0] - 2026-10-09

### Changed

- **One Accounts list in Settings.** "Agents & accounts" and "Auto-switch accounts" are now one **Accounts** section: one row per login, led by its CLI (Claude, Codex, Gemini), then its email, plan and one status (Active, Available, Limited · until …, Logged in or Logged out, plus Default for the CLI's default folder). Claude and Codex rows come first in switch order and keep their status, checkbox, Move up/down and Switch now; other CLIs' logins and logged-out folders show read-only after them. **Find logged-in accounts** is gone: every logged-in Claude and Codex login the scan finds (at start and on **Refresh**) joins the switch list on its own. **Add an account folder manually** stays for folders the scan misses. Each agent CLI's version, path and Update now sit on one compact line below the list, CLIs with no accounts included. With user accounts on, the list still shows, read-only.

## [0.68.0.0] - 2026-10-09

### Added

- **Billion hears about repo skills only one CLI can see.** Codex reads a repo's `.agents/skills` and `.codex/skills` (from its working directory up to the repo root), never `.claude/skills`, so a skill kept only in `.claude/skills` is Claude Code's alone. On the board's repos, Agent 007 now tells Billion once per such skill per server run, naming the repo, the skill and the fix: keep the folder in `.agents/skills` and commit a relative link to it in `.claude/skills`. It changes nothing in a repo. The README's "One skill store" documents where each CLI looks, the shared layout, and what Windows needs (`core.symlinks`).

## [0.67.0.0] - 2026-10-09

### Added

- **One skill store: every skill installed once, for Claude Code and Codex.** Turn on **Settings → One skill store** (a dry run shows first) and each skill lives once in `~/.agents/skills`, which Codex reads, with a link in `~/.claude/skills` for Claude Code. Skill folders in `~/.claude/skills` or `~/.codex/skills` move into the store, at start and before every agent starts, so a skill installed later for either CLI reaches both. Nothing is deleted: replaced folders go to `~/.agent-007/skill-backup/`, two different copies of one name are left alone and Billion is told, and links, gstack, `synced`, `.system`, plugins and repo skills are never touched. `agent007 skills sync [--dry-run]` runs it from a terminal; `claudeOnly` / `codexOnly` in `skill-families.json` opt a skill out.

## [0.66.0.0] - 2026-10-09

### Changed

- **One Auto-switch accounts list for Claude and Codex.** Settings → Auto-switch accounts now shows a single list of every account, each tagged Claude or Codex, with one on/off switch, one Find logged-in accounts (it finds both CLIs' logins), one Add an account folder manually (pick the CLI next to the folder) and one Save settings. The list order is the switch order. The two "Fall back to …" checkboxes are gone: Billion hands over to the other CLI when its own accounts run out only if the list has a selected account of that CLI. Existing settings carry over, Claude accounts first, then Codex.

## [0.65.0.0] - 2026-10-09

### Added

- **Codex account rotation, like Claude's.** With two or more Codex logins (`~/.codex` and `~/.codex-*` folders with an `auth.json`), **Settings → Auto-switch accounts** now has a Codex list next to the Claude one, with the same controls: Find logged-in accounts, order, on/off, Switch now, Restore previous login. At a hard Codex usage limit on Billion or a Codex worker, the app saves the current login's refreshed `auth.json`, writes the next account's over `~/.codex/auth.json` (config, sessions, skills and history stay put), restarts Codex's background server so it picks the new login up, and resumes each Codex session on `codex resume <id>`. A limited account is retried at the "try again at …" time Codex prints, else after 30 minutes. Billion hands over to Claude Code only once every Codex account is unavailable, and Codex workers rotate instead of waiting. Other tools that read `~/.codex/auth.json` follow the switch.

## [0.64.2.0] - 2026-10-09

### Fixed

- **Skill duplicates no longer compare one repo's skills against another's.** A repo's `.claude/skills` only loads inside that repo, so two repos each having their own `qa-browser` is not a duplicate. Repo vs global, repo vs plugin and two copies in one repo are still reported.

## [0.64.1.0] - 2026-10-09

### Fixed

- **Skill duplicates no longer flags a skill the `skills` installer mirrored on purpose.** An identical copy in `~/.claude/skills` and `~/.agents/skills` whose name is in `~/.agents/.skill-lock.json` is one install, so it is skipped. Copies whose contents differ, and identical copies of unlocked skills, are still reported.

## [0.64.0.0] - 2026-10-09

### Changed

- **Removing a repo now asks first, then closes its agents and deletes their worktrees.** The × on a repo's header opens a dialog naming the agents that will close, and warning about any with uncommitted changes or unpushed commits ("Raven has 3 unpushed commits; they will be lost."). Cancel is the default. On confirm, every agent of the repo is closed with nothing kept, its orphans and their worktrees and local branches are deleted, and every browser clears the tabs, office figures and left panel. The repo folder on disk is never touched, nor is Billion's own folder. A card In progress in that repo goes back to To do with the note "repo removed from Agent 007". A repo that is not on the list (a hand-edited config) still shows its orphans, labelled "· not on the board".

## [0.63.2.0] - 2026-10-09

### Fixed

- **Closing an agent in one browser no longer leaves a red crashed tab in the others.** The server now tells every browser when an agent is closed, so its tab and office figure go away everywhere. A real crash or exit still keeps the tab so its output stays readable.

## [0.63.1.0] - 2026-10-09

### Changed

- **The built-in skill family comes from what this machine's Claude Code actually lists.** At server start, and whenever `claude --version` changes, Agent 007 runs `claude -p` once against a stand-in API on 127.0.0.1 and reads the skill listing out of the request: no fixed list of bundled skills in code, nothing sent to Anthropic, no usage spent, request headers never read or kept. The result is cached per version in `~/.agent-007/skill-listing.json`. Built-in is that listing minus installed, plugin and engineering skills, each with the listing's own one-liner. If the probe fails there is no built-in family on that machine, so nothing is hidden, and Billion gets one notice saying why.

## [0.63.0.0] - 2026-10-09

### Added

- **One Restart for any agent that is not running.** An agent whose CLI quit by itself (Codex's update, a crash, a stray `/exit`) now shows Restart across the bottom of its terminal and on its left-panel row. It comes back in place, in the same tab and worktree and on the same card, resuming its own conversation: `codex resume <its session id>` or `claude --resume <its conversation id>`, with the model and permission flags it ran with. An orphan's Re-spawn is now that same Restart. A board worker whose CLI exits keeps its tab instead of vanishing, and closing a stopped agent's tab now really closes it, so it no longer comes back on a reload.
- **Codex no longer offers to update inside an agent's terminal.** That prompt installed the update and exited, leaving a dead agent. Every Codex Agent 007 starts gets `-c check_for_update_on_startup=false` (your `~/.codex/config.toml` is untouched). Settings now lists Claude Code and Codex under Agent 007's own version, installed against latest, with an Update that runs the CLI's own `update`. Running agents pick the new version up on their next Restart.

## [0.62.0.0] - 2026-10-09

### Added

- **Cards can switch a marketplace plugin on for their worker, Vanta first.** A `"plugins"` map in `~/.agent-007/skill-families.json` names plugins by a short name (Vanta is built in: `{"plugins": {"vanta": "vanta-mcp-plugin@claude-plugins-official"}}`). Every Claude Code agent Agent 007 starts gets those off through `enabledPlugins` in its `--settings`, and a card whose `skills` names one (`["vanta"]`) gets it on. Plugins outside the map stay as you set them, and `~/.claude/settings.json` is never written. If a named plugin isn't installed, the worker starts anyway and the card says so. The card form's Skills suggestions include the plugin names.

### Fixed

- **The card form's Skills and Schedule fields take the row's width again.** A more specific rule had them sizing to their hint text, which ran past the panel edge at phone width.

## [0.61.0.0] - 2026-10-08

### Added

- **A `built-in` skill family for Claude Code's own skills and your claude.ai skills.** The agents Agent 007 starts now list dataviz, claude-api, loop, schedule, the artifact skills, `anthropic-skills:pdf`, `docx`, `deep-research` and the rest by name only, behind one `families:built-in` catalog, unless a card asks for `skills: ["built-in"]`. That frees about 14 KB of every listing: a plain worker's skill listing drops from 22.6k to 8.8k characters, and a `hyperframes` card now fits Claude Code's listing budget. Synced skills are read from `~/.claude/skills/synced`, so new ones join on their own; a bundled skill a newer Claude Code adds is reported to Billion like any unfiled skill. Your own sessions are unchanged.

## [0.60.1.0] - 2026-10-08

### Added

- **Billion is told about duplicate and superseded skills.** The skill scan now spots the same skill name in more than one place (`~/.claude/skills`, `~/.agents/skills`, a board repo's `.claude/skills`, plugins), byte-identical skill folders under different names, and a skill whose description says it replaces, supersedes or deprecates another installed one. Billion gets one notice per finding per server run naming both paths and suggesting the removal; Agent 007 deletes nothing. gstack's intentional aliases are left out.

## [0.60.0.0] - 2026-10-08

### Added

- **Skill families: agents see one line per family of skills, and a card picks the families its job needs.** Claude Code fits every installed skill's description into about 1% of the context window, so with 150-odd skills most showed as bare names and got missed. For the Claude Code agents Agent 007 starts, installed skills are now grouped into families (by `~/.agents/.skill-lock.json` source, gstack's folder, and an `engineering` family carved out of gstack and Claude Code's own), each with a generated catalog skill (`families:marketing`); members are listed by name only and still run by name. A card's new **Skills** field (`skills` on `post_job`, `edit_job` and `POST /api/jobs`) keeps its families fully listed; a card that ends in a pull request gets `engineering`, Billion gets `marketing` and the review skills. Everything goes in per spawn, never in `~/.claude/settings.json`. Change the grouping in `~/.agent-007/skill-families.json`; Billion is told about skills no family takes. `SKILL_FAMILIES=0` turns it off. See the README's "Skill families".

## [0.59.1.0] - 2026-10-08

### Fixed

- **The app holds up over a slow remote link.** Over Tailscale from public Wi-Fi, a message sent to Billion sat at "Sending", then said "No answer from the server" though it had gone through, and a refresh was slow. Every terminal's output went to every browser, so a reply queued behind megabytes of other agents' spinners. Now a browser gets a terminal's output only while it shows that terminal, and gets the scrollback when it switches to one. Every other terminal sends only a small "still busy" signal every few seconds, which keeps the "quiet — may need you" badges working. The WebSocket is compressed. With four busy agents, an idle browser now receives about 750 bytes a minute instead of 1.9 MB. On a 128 kbit/s link, a chat send round-trips in about 0.13 s instead of about 47 s, and the page loads in 0.2 s instead of 15.6 s.
- **A dead connection is noticed and a send is never lost or doubled.** The server and the page ping each other, so a socket left half-dead by a network change is dropped and the reconnect runs. A slow send keeps waiting instead of claiming failure. Only a dropped socket says "Not sent: connection dropped", and the text stays in the box. The box's text, its attachments and an unsettled send survive the reload that follows a reconnect. If the message reached the thread, the box clears. Sending the same text again is recognized as the message already sent.

## [0.59.0.0] - 2026-10-08

### Added

- **A "What's new" link when an update is available.** Settings' "Version x is available" line now links to a window listing every CHANGELOG section between the version you run and the latest, newest first, with Update and Close. The notes come from GitHub at the latest release's tag (`GET /api/update/changelog`), since the npm package doesn't ship CHANGELOG.md; if GitHub can't be reached, the window says so and links to the CHANGELOG instead.

## [0.58.0.0] - 2026-10-07

### Added

- **A "Check for updates" button in Settings.** It asks the npm registry right now instead of waiting out the 10-minute cache, then says "Up to date" or offers Update. A failed check says so and keeps the button.

## [0.57.0.0] - 2026-10-07

### Added

- **A card's poster can close it and message its worker over HTTP.** `POST /api/jobs/:id/close` (`{accept, note}`) and `POST /api/jobs/:id/message` (`{message}`) are open to whoever posted the card through `POST /api/jobs` or `post_job`, so a headless poller with Billion off can file its finished card as Done, send it back, or type a change request into the same worker. `GET /api/jobs/:id` tells it the card's state and whether its worker is still alive; a message to a card with none answers 409. Anyone else gets 403. Close is the same code as Billion's `close_job`, and messages go through `send_message`'s queue, length cap and rate limit. See README, "Job board HTTP API".

## [0.56.2.0] - 2026-10-07

### Fixed

- **With `BILLION=0` the app no longer shows a Billion tab.** The desktop tab and the phone's Billion button are gone, and the page opens on the Jobs board instead of an empty chat. Anything that would have opened the chat (a badge, a remembered tab) lands on Jobs. With Billion on, nothing changes.

## [0.56.1.0] - 2026-10-06

### Changed

- **Job cards read better, on a desktop and on a phone.** The title comes first in bold with its chips on a row under it, then the card's status: the live badge (running, needs you, quiet, agent gone) and the PR link now sit together right under the title as matching pills. Card text is a step larger and meets 4.5:1 contrast in both themes; error and status text no longer fall short in the dark theme or the light one. Chips keep their case (`claude-opus-5-5`, `bypassPermissions`), long repo and branch names truncate with a tooltip instead of breaking mid-word, and the agent line reads "Viper · started 12m ago" with the branch under it. Attachments get a drawn paperclip instead of the emoji, and everything on a card shares one focus ring.
- **On a phone the board scrolls as one list.** Each column used to be its own clipped scroller a third of the screen tall. Card actions now always show on a touch screen, at 40px tall, instead of hiding until hover.
- **Every To do card says who posted it and when it runs.** "posted by Billion · 2h ago" (or "posted by bill") replaces "bill · via Billion", and a run line reads "runs Tue 8:00 PM · in 5h" on a schedule or a card with a start time, "runs next" while its repo has a free slot, "runs when a slot frees (1 ahead)" behind a full one, and "queued · board stopped" while the board is stopped.
- **The repo and the branch read as one pair.** Every card leads its details with the repo it is about, in bold with a repo glyph, and once work has started the branch sits beside it ("shop · bill/negroni", truncated with a tooltip). The agent doing the work and when it started ("Viper · started 12m ago") follow on the next line.
- **Each column leads with what it is for.** To do: repo, when it runs, who posted it, then the kind chips. In progress: status, repo · branch, the agent. Review: the PR, repo · branch, the agent with its model, then the summary on a card with no PR. The kind chips moved out of the title onto their own smaller row.
- **Every card says what runs it, in one pill.** "claude · opus-5-5" or "codex · gpt-5.5" ("claude · default" / "codex · default" when no model is set) opens the chip row on every card, with no PR and a permission mode after it. The job's type (recurring, scheduled, run) stays inline on the title line. A Claude card used to show only a bare model id, and a Codex card two separate pills.

## [0.56.0.2] - 2026-10-06

### Changed

- **README teaser gif is cut from the shipped 38 s phone-call demo.** It opens on the "Ask for a change on a call" line, taps Talk and shows the request; the video caption and launch notes now say 38 s and no longer mention the old Veo opening shot.

## [0.56.0.1] - 2026-10-06

### Changed

- **The phone-call demo's disclosure says "voices are text-to-speech".** The README caption under the video now names the voices as what they are, text-to-speech, instead of "AI-generated".

## [0.56.0.0] - 2026-10-06

### Added

- **Remote access without Tailscale: run Agent 007 behind Cloudflare Tunnel + Access, caddy or nginx at your own https address.** `agent007 install --public-url https://agent.example.com` writes `PUBLIC_URL` to `~/.agent-007/.env` and installs the service bound to `127.0.0.1`, no Tailscale involved (`--public-url` also works when starting in a terminal). With `PUBLIC_URL` set, that hostname passes the origin check for the API and WebSocket, a proxy on the same machine is believed about `X-Forwarded-Proto/For`, and Telegram links use it. Voice input and Talk to Billion work, since the browser sees https from the proxy. `agent007 status` and `doctor` say which mode is on and whether forwarded requests are arriving as https, and doctor flags a `HOST=0.0.0.0` that would bypass the proxy.
- **Shows who Cloudflare Access signed in.** Behind Access, the Settings panel and `agent007 status` show the `Cf-Access-Authenticated-User-Email`, and the server logs each email once. Display only: the Access JWT is not verified, and Agent 007's own user accounts stay off.
- **A rewritten remote access guide** (`docs/REMOTE.md`): Tailscale, Cloudflare Tunnel + Access with a copy-paste `cloudflared` config and the Access policy to set, and WireGuard with a local certificate (caddy and nginx configs), plus security notes: never expose the port directly, and the app trusts whoever the proxy lets in.

## [0.55.0.0] - 2026-10-05

### Changed

- **The Billion tab's Chat view starts near the top.** The status line, the Briefing/Chat tabs, the read-aloud row and the open questions strip were four bars before the first message; they are now one bar. Briefing | Chat is a segmented control beside the status line, the open questions are one chip ("2 open questions", "!" when one is blocking) that opens the panel, and a speaker button labelled "Read aloud" (icon only on narrow panes) is the "Read new messages aloud" switch: one tap on, one off, with a "Read aloud: on/off" toast; a tap while it reads stops the speech and turns it off, so the bar has no separate Stop. The voice picker moved to Settings: "Voice for reading messages aloud", under "Read aloud". On a phone, or a narrow pane, the status line is a quiet line under the controls, and the chat gets back about 130px.

## [0.54.3.1] - 2026-10-05

### Fixed

- **Clarify account switching setup.** Keep the auto-switch toggle and account discovery visible at the top of Settings, compact account actions, collapse manual folder entry, and explain when two selected accounts are required.

## [0.54.3.0] - 2026-10-05

### Fixed

- **Hanging up a Talk call no longer opens the phone keyboard.** The end of a call used to focus the message box; it now focuses the Talk button, so the chat stays in view and keyboard users still land somewhere predictable.

## [0.54.2.1] - 2026-10-04

### Changed

- **The README opens on the phone pitch.** Under "Manage your coding agents by talking to them, from your phone." it now has a one-line subline, the teaser GIF linking to the 76 s video, and three bullets on what Agent 007 does.

### Added

- **docs/BUILT-BY-AGENTS.md.** How many merged PRs on agent-007 and finnamon came from board workers, what the owner did and what the agents did, and the `gh` command to count them again.
- **docs/launch/.** A Show HN facts sheet (facts, caveats and likely questions, not a post), drafts for r/ClaudeAI, the r/selfhosted megathread and an X thread, and one-liners with a proposed GitHub description and topics. Nothing is posted and no repo setting is changed.

## [0.54.2.0] - 2026-10-04

### Fixed

- **Talk to Billion no longer answers a mishearing of its own progress line.** "Working on your best" (whisper's take on the spoken "Working on your message") was sent as a voice turn. A short transcript that mostly overlaps a progress phrase spoken in the last 10 seconds is now dropped as echo; real short turns like "stop" still go through.

## [0.54.1.1] - 2026-10-03

### Added

- **A phone-call demo at the top of the README.** A 76-second video of a Talk to Billion call on a phone, from a Veo-generated cold open and the spoken request to the merged pull request, with burned-in captions and AI-generated voices, plus an 8-second teaser GIF under the new headline, "Manage your coding agents by talking to them, from your phone." It is labelled: sped up, voices AI-generated, app screens real. `node scripts/demo/phone-call.mjs` re-records it on a scratch server with stand-in agents (with `DEMO_MEDIA` pointing at generated clips, or macOS `say` without); `record.mjs` now shares that scratch setup (`scripts/demo/scratch.mjs`), and its cards no longer warn about a missing GitHub remote or ship skill.

## [0.54.1.0] - 2026-10-03

### Added

- **Talk to Billion on an iPhone: a Speaker / Earpiece button in the call bar.** Replies stay on the output you pick for the whole call, remembered per browser (Speaker by default). Mute now silences the mic track instead of closing it, and the audio session is held at play-and-record for the call, so iOS no longer flips replies between the loudspeaker and the earpiece. Desktop and Android browsers show no button.

## [0.54.0.0] - 2026-10-03

### Added

- **Settings shows the version and an Update button.** The top of the Settings panel names the running version and, when npm has a newer one, offers Update, which runs `agent007 update` in the background (npm install -g, or git pull for a clone), then restarts once busy workers finish. The panel follows it through Updating…, Waiting for busy workers…, Restarting… and the new version, or shows the error from `~/.agent-007/logs/update.log` with the terminal command to run instead. The gear gets a dot while an update is out. The registry is asked at most every 10 minutes; npx copies show no button. Owner only, like the Claude account switch.

## [0.53.5.0] - 2026-10-03

### Changed

- **`agent007 install --remote` no longer asks before touching HTTPS 443.** When another app (say a dashboard) already uses Tailscale Serve's port 443, it leaves it alone, serves Agent 007 on the first free HTTPS port (8443, then 10000), adds `<name>:<port>` to ALLOWED_ORIGINS and prints `Open https://<name>:<port>`. If all three are taken it says what uses them and changes nothing. `agent007 doctor` recognises names on those ports.

## [0.53.4.0] - 2026-10-03

### Fixed

- **The Billion tab's Chat fits a phone.** "Read aloud" and the voice picker share one row, the picker in the tab's own type size (it no longer jumps to its own line in a bigger font), and the text box gets the room it needs: its placeholder reads "Message Billion" on one line (typing `/` still explains slash commands). The box and the voice picker also tell password managers and AutoFill they are not login fields, so nothing pins the page's address to them. Desktop is unchanged.

## [0.53.3.0] - 2026-10-03

### Fixed

- **Talk no longer sends its own spoken progress lines as your words.** On speakers, the mic could pick up "Working on your message" and Billion received it as a voice turn. The server now drops a transcript that matches a progress phrase it handed the page in the last 10 seconds.

## [0.53.2.0] - 2026-10-03

### Fixed

- **`agent007 install --remote` no longer hangs silently when Serve isn't enabled.** `tailscale serve` prints a link to enable Serve and waits; its output now shows live, the wait is capped at 5 minutes (the link and the command to re-run are printed if it runs out), and Ctrl-C stops cleanly. The `ts.net` name it found is printed before serve runs.

## [0.53.1.0] - 2026-10-03

### Changed

- **Talk to Billion now speaks the progress box heading when Billion has not set a status line.** "Working on your message" or "Starting on your message" is said under the same rules as status updates (first after 0.8 s, newest only, never twice, never over you); a status line still wins.

## [0.53.0.0] - 2026-10-03

### Added

- **`agent007 install --remote` sets up remote access over Tailscale in one step.** It finds the Tailscale CLI (PATH, or inside the macOS app), runs `tailscale serve --bg <port>` (kept across reboots), adds this machine's ts.net name to `ALLOWED_ORIGINS` in `~/.agent-007/.env`, and restarts Agent 007 if it is running; then open `https://<machine>.<tailnet>.ts.net` on any device in your tailnet. Without a running, logged-in Tailscale it says what to do and changes nothing, it never replaces another site on the HTTPS port without asking, and it prints Tailscale's link when Serve is not enabled on the tailnet. `install --all` now includes it, plain `install` offers it when Tailscale is installed, and `--dry-run` prints what it would do.

## [0.52.2.0] - 2026-10-03

### Fixed

- **`agent007 doctor` always says something about remote access.** It now finds the Tailscale CLI inside the macOS app (`/Applications/Tailscale.app`) when `tailscale` is not on PATH, reports when Tailscale is missing or `tailscale serve` does not proxy this port (listing what it serves), and shows the `ALLOWED_ORIGINS` the service reads.

## [0.52.1.0] - 2026-10-02

### Changed

- **Talk to Billion speaks progress sooner and without filler.** The first spoken update comes after 0.8 s, and each new status line is spoken as soon as nothing else is playing (only the newest if several changed). The "Still working on it." cue is gone.
- **Billion's activity text is verb + object.** "Working on your message…", "Starting on your message…", "Answering your earlier message first…", "Replying shortly…" replace the third-person wording.

## [0.52.0.0] - 2026-10-02

### Changed

- **The twice-a-day "round" is now the "Briefing".** The Billion tab's first view reads "Briefing", with "Start the briefing now", "next briefing" and the Telegram and Billion notices to match; Billion's charter and tool descriptions say "briefing" too. Typing "start the round now" still works, and so does "start the briefing now". Tool names, settings and stored data are unchanged.

## [0.51.0.0] - 2026-10-02

### Added

- **Slash commands from the Billion chat.** A message starting with `/` (say `/model opus`) is typed bare into Billion's terminal at its next prompt, so it runs on whichever CLI Billion uses; the thread marks it *Command*, waits for no reply, and shows Billion's screen a few seconds later. A picker it opens (a bare `/model`) is shown and closed, so give the argument. `//` sends a literal `/` message. Works from your private Telegram chat too, never from a group or an agent.

## [0.50.3.0] - 2026-10-02

### Fixed

- **A status note no longer gets read out as the answer to a voice turn.** A `tell_owner` without `reply_to` now answers only a waiting typed message, never a "Talk to Billion" turn; voice turns are answered by a `tell_owner` whose `reply_to` names them.

## [0.50.2.0] - 2026-10-02

### Added

- **Talk to Billion speaks short progress updates while Billion works.** During a call, while your voice turn waits for its answer, each new `set_status` line is spoken in a few plain words (code, links, paths and file names left out): nothing in the first 3 seconds, at most one every 9 seconds, never the same line twice, and the answer always cuts in ahead of an update. The long silence between your question and the answer now tells you work is happening.

## [0.50.1.0] - 2026-10-02

### Fixed

- **`agent007 install` keeps remote access working.** The service runs in `~/.agent-007`, so a `.env` in the folder you used to start Agent 007 from (`ALLOWED_ORIGINS` for your tailnet name, `PORT`, `HOST`, Telegram) stopped applying and remote browsers were turned away. Install now copies every key that `~/.agent-007/.env` lacks from the current folder's `.env`, never overwriting one, and names the keys it copied (never their values).
- **`agent007 doctor` checks `tailscale serve`.** When it proxies a tailnet name to this port and `ALLOWED_ORIGINS`, as the server reads it, does not list that name, doctor says so and gives the line to add.

## [0.50.0.0] - 2026-10-02

### Added

- **`agent007 install` can set up voice.** `install` asks once whether to set up voice too (only in a terminal), `install --voice` sets up voice alone without touching the service (Windows included), and `install --all` does both. Voice setup installs whisper.cpp and ffmpeg (Homebrew on macOS; instructions on Linux and Windows), downloads a speech model you confirm to `~/.agent-007/whisper/`, sets `WHISPER_MODEL` in `~/.agent-007/.env`, tests it, and offers a restart. doctor and the Talk button's "not set up" note now point to it.

## [0.49.4.0] - 2026-10-02

### Fixed

- **`agent007 update` no longer says "Already up to date" while the registry has a newer version.** On an npm install it asks the registry for `latest` directly (npm's own cache can lag by minutes), installs that exact version with `--prefer-online`, and checks the installed version matches. If the registry is unreachable or npm installed the old version, it says so and prints the command to retry instead of restarting.

## [0.49.3.0] - 2026-10-02

### Changed

- **Talk to Billion now starts from a phone button in the message box row, and the row becomes a call bar during a conversation.** The button sits between the mic and Send. In a call the row shows the state (Listening, Thinking, Speaking, Muted, Reconnecting), an elapsed timer, Mute and End; End or Esc restores the text box with focus in it. The old bar above the questions strip is gone; its notices now show above the row.

## [0.49.2.0] - 2026-10-02

### Changed

- **`agent007 doctor` streams its report in sections.** Checks are grouped under System, Agents, GitHub, Repos, Skills, Settings & service, Telegram & voice and Recommended; each section prints as soon as it and those before it are done, so a slow network check no longer holds back the fast ones. It ends with "N problems, M notes" (or "All good"), and the exit code is still 1 on any ✗.
- **Doctor is colored on a terminal.** ✓ green, ✗ and its fix red, – dim, headings bold. Piped output stays plain; `NO_COLOR` turns it off and `FORCE_COLOR` turns it on.

## [0.49.1.0] - 2026-10-02

### Changed

- **Billion asks in its introduction whether to ask before merging a PR that deploys, and your answer is the rule.** It is written into its `CLAUDE.md` as a standing rule ("ask first", "never ask", "ask only for production", per-repo exceptions). Without a rule, Billion asks when `merge_check` reports a deploy or can't tell.

### Removed

- **The per-repo "deploy merges" setting in the Jobs toolbar.** Your rule in Billion's `CLAUDE.md` replaces it; a leftover `deployMergePolicy` in `config.json` is ignored. `merge_check` no longer reports `policy` or `should_ask`, only what deploys.

## [0.49.0.0] - 2026-10-02

### Fixed

- **A new install's introduction finishes from the chat.** Billion now gives its introduction in the Billion tab's chat (`tell_owner`) rather than only in its hidden terminal. Your answers reach it during the introduction; other mail still waits for `billion_ready`. Before, your reply in the chat waited for a `billion_ready` that was itself waiting for your reply.
- **The Billion tab opens on Chat until the first round.** That is where the introduction happens, and where the chat explains a missing or logged-out Claude Code. A new install used to open on an empty "This round" view. Once a round has been released, the tab opens on This round, and your own choice wins either way.
- **Day one doesn't wait for 08:30.** Until the first round comes due (or you start one early), Billion's questions show as it asks them, under *Open questions*. After that they come in rounds as before.
- **A card that can't open its pull request says why.** The card's CLI having no ship skill now shows on the card, next to the existing no-GitHub-remote note, with the gstack install. Both notes go once the card has its pull request.

### Changed

- The README Quick Start describes what a first run really looks like: the chat, the introduction, logging in to Claude Code, and what a pull-request card needs. Requirements now lists these too.
- doctor's "newer version" line suggests `agent007 update`. The Settings Telegram line says `agent007 init` creates `~/.agent-007/.env`. The start-up line about Codex approvals no longer prints when Codex isn't installed.

## [0.48.0.0] - 2026-10-02

### Added

- **Talk to Billion: a hands-free voice conversation in the Billion tab.** Tap
  Talk to Billion, allow the mic, and speak: each utterance is detected in the
  browser (Silero VAD, served by the app), transcribed on your machine by
  whisper.cpp and sent once as `[Owner via app, voice]`; Billion's reply to that
  message is spoken by the same `say` voice as Telegram, and it listens again.
  Talk over it to interrupt. Listening, thinking, speaking, muted and
  disconnected states, Mute and End, and the chat thread as the transcript. No
  audio leaves the machine; without whisper.cpp or `say` it falls back to the
  browser's speech, and says so. See docs/BILLION.md, "Talk to Billion".

## [0.47.0.0] - 2026-10-02

### Added

- **Billion checks whether a merge deploys before it merges, and asks you first.** A revert undoes a merge but not a deploy it set off. The new Billion-only board tool `merge_check` reads the repo's `.github/workflows` at the PR's base branch (read-only) and reports which workflows the merge runs (push with matching branch and path filters, `pull_request` closed, `workflow_run` chains, tag workflows only when something makes a tag) and which jobs deploy (an `environment:`, deploy/release/publish job names, known deploy actions, `docker push`, `npm publish`, `vercel`, `netlify`, `fly deploy`, `gh release create`), with anything it could not read listed as unknown rather than "no deploy". Billion's charter now runs it before every merge and asks you with `notify_owner` when it says to. Per repo, the Jobs tab's *deploy merges* control (or `jobBoard.deployMergePolicy` in `config.json`) sets ask (default), never ask, or ask for production only. (#192)

## [0.46.0.0] - 2026-10-02

### Added

- **`agent007 install`: run Agent 007 as a background service.** On macOS (a LaunchAgent) and Linux (a systemd `--user` unit), it starts at login, comes back if it stops, and keeps running after you close the terminal. It runs the copy you installed from with an absolute `node` and your login shell's `PATH`, captured at install time, so `claude`, `codex`, `gh` and an nvm node are found. `--dry-run` prints the file; it refuses while a server already runs in a terminal. `agent007 uninstall` removes it and keeps `~/.agent-007`.
- **`agent007 status`, `restart`, `logs`, `update`.** `status`: running or not, as a service or in a terminal, pid, version, port, uptime, workers mid-step. `restart` waits for those workers to finish their step (`--now` skips the wait), and works in a terminal too, where the server restarts in place. `logs [-f]` tails `~/.agent-007/logs/server.log` (capped at 5 MB plus one older copy). `update` pulls a clone (`git pull --ff-only`, `npm install` only when the lock changed) or runs `npm install -g @bill10/agent-007@latest`, prints old → new version, then restarts.
- **`agent007` is the command's name.** `agent-007` still works, and `npm start -- <command>` in a clone.
- **doctor checks an installed service**: its node and bin still exist, and `claude`, `codex` and `gh` resolve on its `PATH`; the fix is `agent007 install`, which captures the `PATH` anew.

## [0.45.2.0] - 2026-10-02

### Added

- **doctor checks whisper.cpp (recommended).** Reports whether whisper.cpp is set up to transcribe Telegram voice notes, and what steps are needed to enable transcription.

## [0.45.1.0] - 2026-10-02

### Fixed

- **Several jobs starting at once in one repo no longer fail to create their worktrees.** Two `git worktree add` runs at the same moment could trip over each other's half-written entry (`failed to read .git/worktrees/…/commondir`), most often on Windows, and the job failed to start. Worktree creation in one repo now takes turns; different repos still start in parallel.

## [0.45.0.0] - 2026-10-02

### Added

- **`agent-007 doctor` checks the ship skill for each CLI.** A card that needs a pull request finishes with gstack's ship skill; doctor now says ✗ (with the gstack setup command) when Billion or such a card uses `claude` or `codex` and no working ship skill is installed, and reports skill links in `~/.claude/skills` and `~/.codex/skills` that point nowhere. `agent-browser` is listed as recommended, never ✗. The start's quick check includes both.

## [0.44.0.0] - 2026-10-02

### Changed

- **A scheduled job is one card.** A job for one date is now an ordinary one-time card with a start time: it waits in To do showing its date under a *scheduled* chip, the board dispatches that same card when the time comes, and it moves through In progress, Review and Done like any other. No more separate run card, and no schedule archiving itself. **Run now** on the card starts it early; Edit moves its time, Now clears it, Recurring makes it a schedule. Agents still post it with `run_at` (or a schedule plus `once: true`). On start, the server converts every once schedule that has not fired yet into such a card, keeping its id, text, repo, agent, model and attachments, and logs each one.

## [0.43.0.0] - 2026-10-02

### Changed

- **Job cards say what kind they are.** A one-date card now carries a *scheduled* chip and shows its date ("Sat Oct 3, 9:00 AM · in 2 days") instead of a cron; a repeating one carries *recurring* and shows its schedule in words ("Weekdays at 9:00 AM", cron in the tooltip). The + Job type "Once at…" is now **Scheduled**.
- **A Scheduled card has no Pause.** Resuming one after its date re-armed it a year out; the board now refuses to pause it (change its time with Edit, or Archive it).

## [0.42.0.0] - 2026-10-02

### Changed

- **Billion always knows its CLI and the models it may pick.** Every start prompt (first run, restart, handover) now says whether Billion runs on Claude Code or Codex and lists the models available per CLI, and `post_job`'s `agent` field tells the caller which CLI it runs as. Billion's start waits up to 15 s for the first model discovery, so a fresh conversation no longer loads a `post_job` that says Codex has no models; past that it starts anyway and points to `billion-tools.json`, which now carries the lists and is rewritten when they change. The charter has Billion name both `agent` and `model` on every card, picking the model most appropriate for the job, in place of the old strong/fast rule of thumb and "leave it empty when unsure".

## [0.41.0.0] - 2026-10-01

### Added

- **`agent-007 doctor` checks what Agent 007 needs and says how to fix it.** Run it as `agent-007 doctor`, `npx @bill10/agent-007 doctor` or `npm start -- doctor`. It prints one line per check, marked ✓, ✗ or – (not needed), with a fix line under every ✗, and exits 1 when anything is ✗. It checks:
  - Node and node-pty.
  - `claude` and `codex`: installed, their version, and whether they are logged in. A missing one, or one that is logged out, is ✗ only when Billion or a board card uses it.
  - `gh`: its signed-in accounts, and which one board workers use for each GitHub repo on the board.
  - git and each board repo: the path exists, it is a repo, it has an origin, and its base branch is on the remote. The remote check runs as that repo's account and never prompts. A local-only repo is fine unless a card on it needs a pull request.
  - The port: free, held by this Agent 007, or held by something else.
  - The settings files read, and whether `config.json` parses.
  - The version against npm's latest.
  - Whether the Telegram bot answers.
  - Stray local plugin registrations in board worktrees or deleted folders.

  It only reports. Nothing is written, installed, logged in or switched, and no token or file content is printed.
- **Every start runs the quick part of it.** Before the URL line, the offline checks run in parallel for at most two seconds: Node, node-pty, the CLIs and their logins, gh installed, the port and `config.json`. Only failures are printed, and the list ends with the doctor command to run for details. When everything passes, nothing is printed. The start reuses the doctor's CLI scan instead of running a second one.

## [0.40.1.0] - 2026-10-01

### Fixed

- **Queued jobs advance past failed worker spawns.** Each scan tries a card at most once and rechecks live repository capacity before starting the next eligible card, while retaining failures on their cards.
- **Repeated job titles no longer exhaust 50 branch names.** Worker branches use collision-checked random suffixes after a taken name, with bounded retries and existing branches preserved.

## [0.40.0.0] - 2026-10-01

### Changed

- **Billion closes any finished card with one tool: `retire_job` folds into `close_job`.** On a card in Review, `close_job` is still the verdict on the work (accept files a no-PR card as Done, send back returns it to To do with the note). On one of Billion's own To do cards, accept with a note drops it unrun: archived to Finished jobs with the note as the reason, the same path as the Jobs tab's Archive. Send back on a To do card is refused, and an In progress card is refused with what to do instead. Billion now has 24 tools, not 25.

## [0.39.0.0] - 2026-10-01

### Added

- **The + Job form has three types: Now, Once at…, Recurring.** Once at… shows a date-time picker (your local time, now to a year ahead) and posts a one-time schedule that runs once and archives itself; Now and Recurring behave as One-time and Scheduled did. Editing a one-time schedule shows its time and lets you change it.

## [0.38.2.0] - 2026-10-01

### Added

- **See why a schedule has not posted its next run.** Jobs now distinguishes overdue posting, active or queued holds, and gone or stalled prior workers, with a link to the blocking run and timestamped firing evidence. Detection is passive: it never retries work or changes recovery decisions.

## [0.38.1.0] - 2026-10-01

### Fixed

- **Billion's progress stays with your message.** Concise status summaries appear while you wait, then fold into expandable Work details beneath the answer. Rapid messages keep separate replies across reconnects and restarts. Terminal commands and private analysis never enter the progress stream.

## [0.38.0.0] - 2026-10-01

### Added

- **Billion comes to you twice a day, two questions per department.** `notify_owner` now queues a question under its project instead of showing it at once. At each round (08:30 and 15:30 your time by default; `rounds`, `roundMaxPerProject` and `roundsTimeZone` in `~/.agent-007/config.json`, `rounds: []` for the old behaviour) the server shows at most two per project, most important first, with Billion's brief on top and one Telegram message for the whole round. Whatever the previous round left unanswered is consolidated into *Earlier*, and Billion is told so it re-asks only what is still in a project's top two. Only a blocking question (or `telegram: true`) reaches you between rounds. New Billion tools: `list_round_queue`, `drop_queued`, `set_round_brief`, `set_status`, and `rank` on `notify_owner`.
- **The Billion tab opens on This round.** One section per project with its cards (tap a choice or type a reply; answered cards fold where they stand; "3 of 7 done"), nothing jumping while you read or type, and the chat thread moved to a **Chat** view beside it.
- **Numbered items, Done and "1d".** Every item in a round has a number; tap *Done* or type `1d` (`1d 3d` for several) in the chat, a card or Telegram, and Billion reads `[Owner via app] item 1 done`.
- **Start the round now.** A button on This round, or typing "start the round now", releases the next round early under the same rules.
- **Your messages are never held, and show progress.** Each message you send stays pending, with a progress box of what Billion is doing (its `set_status` line and the last steps on its screen), until its own reply arrives; two messages get two replies.
- **A status line on the Billion tab.** "Working: reviewing PR #120 · 3 workers running · next round 3:30 pm", and "Billion is working on your message…" from the moment you write until it replies.

### Changed

- **On the first start, open questions are consolidated.** Every open question except blocking ones moves to *Earlier*, and Billion is told which, so you start from a clean round. Restart with `node bin/agent-007.js` to pick this up.

## [0.37.0.0] - 2026-10-01

### Fixed

- **The Jobs and Billion tabs keep your place when they refresh.** Scrolling down To do (or Finished jobs, or the Billion chat and its Open questions panel) and then a board broadcast or the 30-second clock tick no longer throws you back to the top, on a phone or a desktop. Lists now update in place: an unchanged card stays exactly as it is, a changed one is swapped where it stands, and the chat only follows new messages while you are already at the bottom.

### Added

- **One-time schedules.** `post_job` and `edit_job` take `run_at` (an ISO date-time, at most a year ahead) or `once: true` with a schedule: the card runs a single time and is then archived to Finished jobs by itself, with its run card going through the board as usual. On the next server start, every one-date schedule (`0 10 24 9 *`) that has already run is archived and logged, so cards like "follow-up September 24" stop showing "next 9/24/2027".
- **Archive a To do card without running it.** An **Archive** action on To do cards in the Jobs tab (with a confirm) files the card to Finished jobs with a note; Billion gets `retire_job` (id, reason) to do the same for its own cards. Nothing is deleted.

## [0.36.0.0] - 2026-10-01

### Changed

- **Each board worker gets the GitHub account that owns its repo, and nobody switches gh's account any more.** With several gh accounts signed in, a board worker in a github.com repo now gets `GH_TOKEN` for the account that can see it (the one named like the repo's owner, else the first that can read it, remembered per repo and re-checked at each spawn), and `git push` uses the same account through gh's credential helper. Before, the card prompt told workers to `gh auth switch`, which flipped the active account for the whole machine under the owner and every other agent. Claude Code workers are now denied `gh auth switch`, `login` and `logout`, every card prompt says never to run them, and Billion's charter says to pick the account per command with `GH_TOKEN=$(gh auth token -u <account>) gh …`.

## [0.35.0.0] - 2026-10-01

### Changed

- **Only blocking questions buzz the owner's phone.** `notify_owner` used to push every question to Telegram; now only `urgency: "blocking"` ones go there, and normal and low questions wait in the Billion tab (thread, open-questions strip, badge) without buzzing the phone. A new optional `telegram` flag overrides it: `true` pushes a non-blocking question Billion judges super urgent, `false` keeps even a blocking one in the tab. The tool result says which happened ("Put in the owner's Billion tab as Q12; not sent to Telegram (urgency normal)"). `tell_owner` is unchanged.

## [0.34.0.1] - 2026-09-30

### Fixed

- **Open questions section headers are headings again.** The project and type sections in the Open questions panel are `<h3>` headings wrapping the fold button, so screen-reader heading navigation jumps between them; the button now names the section body it opens (`aria-controls`). Look, keyboard behaviour and the remembered open/closed state are unchanged.

## [0.34.0.0] - 2026-09-30

### Added

- **Open questions by type, in sections that fold.** The Open questions panel in the Billion tab has a *by project | by type* switch: the same rows regrouped by engineering, marketing, outreach, finance, product, admin or other. `notify_owner` takes a `type` from that list; left out, the server reads it off the question's text, and older questions get one the first time they are read. Every section starts closed, its header showing the count and a "!" when a blocking question is inside, so nothing urgent hides; tap it to open. The browser remembers the grouping and which sections are open.

## [0.33.0.1] - 2026-09-30

### Changed

- **Settings icon is a conventional gear.** The terminal header's Settings button no longer looks like the theme toggle's sun.

## [0.33.0.0] - 2026-09-30

### Added

- **An Open questions panel in the Billion tab, grouped by project.** The strip of open questions is now one button ("7 open questions ▾", "tap to see all" the first time): tap it or the tab's badge and a panel slides over the thread with a section per project (blocking first, then oldest), each question a row with its urgency, number, first line and age, answered in place with its choices or *Reply*; tap the text to jump to its bubble, × or Esc to go back. Full screen on a phone; open or closed is remembered per browser.
- **`notify_owner` takes a `project`.** Billion names the repo a question is about (its folder name on the board, or `general`); left out, the server reads it off a GitHub PR/issue/repo URL or a board repo's name in the text, else `general`. Questions saved before read as `general`.

## [0.32.0.0] - 2026-09-30

### Added

- **Connect Telegram from the browser.** With no chat set, a message to the bot from any chat shows in the Billion tab as "Telegram: a message from <name> (chat <id>). Use it for Billion?". Press **Use this chat** and it is connected at once, no `.env` edit and no restart; the bot says "Connected to Agent 007." there. Only the owner's browser sees the offers, none is adopted by itself, and `TELEGRAM_CHAT_ID` still wins when set. The Settings gear gets a Telegram line naming the connected chat, with **Change** to pick another.
- **Group chats say who spoke.** When the connected chat is a Telegram group, Billion reads `[Owner via Telegram (Alice)] ...` (voice and answers too), and the thread shows "Alice on Telegram" and "Alice answered: Merge". Private chats are unchanged. The server logs a hint when a group's bot still has privacy mode on.

## [0.31.0.0] - 2026-09-30

### Added

- **Show Billion a screenshot or a file from the Billion tab.** Paste an image, drop files anywhere on the tab, or pick them with the new paperclip beside the mic; they show as chips above the box and go with the next message (files alone send too). Billion's turn ends with `(attached: <absolute paths>)` so it reads them with its file tools. They are saved owner-only under `~/.agent-007/chat-files/<message id>/` with the job form's limits (10MB a file, 20 files and 50MB a message), and your bubble keeps them as thumbnails and download links, served only from that folder.

### Fixed

- **A screenshot pasted in the Billion tab no longer uploads to whichever agent was last selected.**

## [0.30.0.2] - 2026-09-30

### Fixed

- **The Billion tab's text box, mic and Send are one height.** They were 31px, 40px and 25px on desktop; all three, and the "Read new messages aloud" toggle and voice picker above the thread, now share one control-height token (40px, 44px on phones) and one gap. A multi-line message grows the box while mic and Send stay by its last line, the mic's icon matches the header icons' line weight, and on a phone the voice picker gets its own full-width line.

## [0.30.0.1] - 2026-09-30

### Fixed

- **The file explorer follows the cursor when you drag its divider.** Its width
  was animated, so the panel trailed a drag by 200ms; collapsing it (Cmd+E)
  now happens at once instead of re-laying out the office and terminal on every
  frame.
- **Easier-to-read panel labels.** REPOS, the job board's column headers and
  Finished go from 9px to 11px, and the job form's and board toolbar's labels
  from 10px to 11px.
  Uppercase now applies only to each label's word, not to the dropdown or hint
  inside it.
- **Header buttons sit inside their headers.** "+ Agent"/"+ Job" and the REPOS
  row's icons sat 2.5–4.5px from the header's edges; they now sit 4.5–6.5px
  in.

## [0.30.0.0] - 2026-09-30

### Added

- **Rotate through selected Claude accounts at usage limits.** Settings now supports discovery, account order, inclusion, automatic rotation, manual switching, and optional Codex fallback. Refreshed credentials and cooldowns persist; Claude conversations resume by exact session ID while settings and history stay in place. Failed and interrupted switches have a recovery path. Rotation turns on by default once two accounts are added, while preserving saved off settings.

### Changed

- **Preserve more conversation context between Claude and Codex.** Billion's handover includes recent tool calls and results alongside dialogue, labels truncation, and points to the original transcript. A failed handover write now prevents the CLI switch. Billion's existing Git directory continues to hold its state and pending work.

## [0.29.2.0] - 2026-09-29

### Changed

- **The job board runs from a fresh install.** A first card no longer sits in To do until you find Start on the board toolbar. An install that has already saved a setting keeps it. When the board is stopped and a card is waiting, To do says so, with a Start button beside it.

### Fixed

- **A card that needs a pull request says up front when its repo has no GitHub remote**, as soon as it is posted or dispatched, instead of after the worker finishes. The job still runs.
- **Phone fixes:** the read-aloud voice picker wraps to its own line instead of being clipped, the stopped-Billion placeholder fits on one line ("Start Billion to send"), and the Terminal button opens your first agent when none is selected, instead of "No agent selected".
- **The Billion tab no longer says "Nothing here yet. Say something to Billion." under a notice that Billion can't hear you.**

## [0.29.1.0] - 2026-09-29

### Fixed

- **The Billion tab says why Billion can't talk yet, with a button to fix it.** On a first run without Claude Code, or with it installed but logged out, the chat used to say "Nothing here yet. Say something to Billion." A message sent to a logged-out Billion then waited, unexplained, for good. A bar above the text box now gives the reason: the CLI is missing (with a Start button), Billion is stopped, or Billion is waiting at its sign-in (with a button that opens its terminal). The bar goes away once Billion is ready.
- **A phone opens on the Billion chat**, as a desktop does, instead of on the office.
- **A job card says "gh is not installed" and where to get it**, instead of `spawn gh ENOENT (tried 1 account: signed-in account)`.
- **Settings lists Claude Code and Codex when they are missing**, each with its install command. An installed CLI with no login folder shows "no login found".
- **+ Agent starts on your only repo.** When you have one repo, the form fills it in. Before, a blank field started the agent in your home folder.
- **"No repos yet" says how to add one**, and a fresh install no longer logs a "Could not pre-trust" error because `~/.claude.json` doesn't exist yet.

## [0.29.0.1] - 2026-09-29

### Changed

- **The README demo shows the Billion chat tab.** The hero GIF and its video are re-recorded around how you work with Billion now: a goal typed in the chat, two jobs on the board, pull requests merged, one question answered with a tap. The still screenshot is new too. `scripts/demo/record.mjs` re-records all three from a scratch server with stand-in `claude` and `gh`, so the next re-record is one command.

## [0.29.0.0] - 2026-09-29

### Changed

- **No character limit on your messages and answers in the Billion tab.** Long pasted text (a product listing, a log) now reaches Billion whole, line breaks kept, as one `[Owner via app]` turn, and shows whole in a scrollable bubble. Only a paste over 200,000 characters is refused.
- **Long messages to Telegram are split, not cut.** Text past Telegram's 4,096-character message limit goes as consecutive messages (buttons on the last), and what does not fit in a voice caption or an answered question's edited copy follows as a message of its own.

## [0.28.0.0] - 2026-09-29

### Added

- **Read Billion's messages aloud in the Billion tab, and dictate your reply.** Every message from Billion has a speaker button that reads it with the browser's own voices (free, nothing leaves the browser): markdown dropped, links read as "link", Q51 as "question 51", a question's choices read at the end, long messages spoken sentence by sentence so Chrome never cuts them off; tap again to stop. *Read new messages aloud* at the top of the tab (off by default, remembered) speaks each new message as it arrives while the tab is showing, one at a time; after a reload one tap on *Resume reading* lets the page speak again. A voice picker keeps your choice. The mic beside the text box dictates into the box (interim words greyed, finished phrases added as text) with the terminal mic's limits, and never sends for you; in "Answers Q3" mode the dictated text answers Q3. On a phone, reading stops with the screen locked; Telegram voice notes cover that. See docs/BILLION.md "Read aloud and dictation in the tab".

## [0.27.2.0] - 2026-09-28

### Fixed

- **On Windows, closing a terminal while input to it is still in flight no longer shuts the server down.** node-pty writes keystrokes through a pipe whose errors nothing handled, and closing the terminal made a pending write fail ("write EAGAIN" or "write EOF"), which exited the whole server. Now that input is dropped and logged, and the other terminals keep running. This was also what intermittently killed the Windows test run with `ERR_IPC_CHANNEL_CLOSED`.

## [0.27.1.0] - 2026-09-28

### Fixed

- **A resumed Billion is told what changed in its charter, not only which tools changed.** After an upgrade, a Billion that resumed its old conversation kept answering the owner's tab messages in its terminal only: a re-read CHARTER.md loses to hundreds of turns of old habit. Each start now saves the charter to `billion-charter.md` in the config folder, and the restart prompt of a resumed conversation quotes the changed paragraphs under "Your charter changed; these rules replace what you did before." (a long change names the sections to re-read instead). The first start on this version, with no saved copy, quotes the charter's paragraphs on answering `[Owner via app]` and `[Owner via Telegram]` messages with `tell_owner`.

## [0.27.0.0] - 2026-09-28

### Changed

- **Telegram buzzes only for questions and for replies to a conversation on the phone.** Every `notify_owner` question still goes to Telegram, but a `tell_owner` reply (and a server notice such as an account-switch result) reaches the phone only when the owner's last message came over Telegram, or before they have written at all since the server started. Talking to Billion in the Billion tab keeps the replies there. The tool result tells Billion which way it went.
- **No "Billion: " prefix on Telegram.** The bot is Billion's own: questions read `Q3: …` (`! Q3: …` when blocking), replies are the text alone.

## [0.26.0.0] - 2026-09-28

### Changed

- **The Billion tab is a chat bubble, and the page opens on it.** The bell is now a chat bubble (the badge still counts open questions), and the Billion chat is the tab a page load or restart lands on, unless a remembered terminal tab is restored. Like Jobs it has no close button.
- **Billion's terminal tab stays out of the way until you want it.** Billion still runs from the start, but its terminal tab is hidden until you click Billion in the office (or its row in the left panel). Closing that tab hides it again and never stops Billion.

## [0.25.0.0] - 2026-09-28

### Fixed

- **Typing in the Billion chat never answers a question you did not pick.** With questions open, a typed line used to be filed as the answer to the oldest one, so ordinary messages closed questions they had nothing to do with. Now it is always a plain message to Billion, like on Telegram; to answer by typing, tap *Reply* under the question (or its chip in the strip) and the box says "Answers Q3". Choice buttons still answer with one tap.

### Added

- **Undo an answer, and `reopen_question`.** *Undo* sits beside "you answered: ..." for a minute: the question opens again and Billion is told the answer no longer stands. After that, Billion puts a wrongly answered question back with its new `reopen_question` board tool (by number or id; nothing is sent to Telegram).

## [0.24.0.0] - 2026-09-28

### Added

- **The Waiting tab is now the Billion tab: a chat with Billion.** Billion's terminal stays the work log, where board notices and worker messages keep arriving; the conversation with the owner moves to a thread in the browser, the web twin of the Telegram channel. Type in the box at the bottom (Enter sends, Shift+Enter is a new line) and it reaches Billion as `[Owner via app] ...`. Billion's `tell_owner` replies now always show there (with or without Telegram), its questions show as bubbles with their choices as buttons that collapse to "you answered: ..." once answered, and Telegram messages, voice notes included, join the same thread. While a question is open the box answers the oldest blocking one, else the oldest one, and says so (× sends a plain message instead). Open questions pin to a strip at the top, blocking first. The last 500 messages are kept in `~/.agent-007/chat.json`.

## [0.23.0.0] - 2026-09-28

### Added

- **Billion's questions say how urgent they are.** `notify_owner` takes an optional `urgency` (`blocking`, `normal` by default, or `low`). The Waiting on you tab lists blocking questions first, then normal, then low, oldest first within each; a bold `!` marks a blocking one (`! Q24`) and a low one's number is dimmed. Blocking questions reach Telegram with a leading `! `. Questions saved before this read as normal.

## [0.22.0.0] - 2026-09-28

### Added

- **Billion answers Codex workers' permission requests too.** A Codex worker on one of Billion's cards now asks Billion before it asks you, as Claude Code workers already did. Its `PermissionRequest` hook goes in as two `-c` flags for that run, the hook and its trusted hash, so nothing is written to `~/.codex/config.toml` and no trust prompt appears. The server asks Codex itself for the hash when it starts (`codex app-server`, `hooks/list`); if `codex` is missing or the answer isn't exactly our hook, Codex workers keep asking you. If you have your own `PermissionRequest` hook in `~/.codex/hooks.json`, both run and a deny from either wins.

## [0.21.2.0] - 2026-09-28

### Fixed

- **Deleting an orphan with a big `node_modules` no longer fails and leaves the worktree half deleted.** The worktree folder is now moved to a trash folder (instant), git's record is pruned, and the files are deleted in the background, so no git timeout can cut the delete off halfway. Deleting an orphan whose folder is already partly or fully gone now finishes the job instead of failing. Closing an agent and releasing a job's worktree use the same path. (#137)

## [0.21.1.0] - 2026-09-28

### Fixed

- **Closing an agent's session now stops what it left running in the background.** A scratch server an agent started with `&` used to keep its port after the tab closed, because the agent's shell dying hands its children to launchd/init. Now killing a session (closing the tab, filing or retiring a card) sends SIGTERM to every process group under the agent's PTY, including the detached groups Claude Code runs its Bash commands in, and SIGKILL to any left after three seconds. Nothing outside that tree is touched. The server log says how many processes it stopped, and how many groups needed SIGKILL. Windows is unchanged: ConPTY already takes the console's whole tree.

## [0.21.0.0] - 2026-09-28

### Added

- **A card sent back to To do waits a minute before it is dispatched again.** Moving a card back from In progress or Review, or Billion sending one back with `close_job`, used to hand it to a new worker within two seconds, before anyone could fix the text that sent it back. Now the card is held for 60 seconds and says "held · dispatching in Ns"; `edit_job` and the board's Edit work during the hold without lifting it, and **Dispatch now** on the card sends it at once. A freshly posted card still goes out straight away.

## [0.20.0.0] - 2026-09-27

### Added

- **A queued agent message can be withdrawn or replaced before it is delivered.** `send_message` now returns a message id when the recipient is busy. The new `withdraw_message` tool takes a still-queued message back, and `send_message`'s `replaces` swaps new text into the old one's place in the queue, so a worker no longer acts on instructions that events have overtaken (a version bump for a PR that has since merged). Only the sender can touch its own messages; board notices and approval requests are out of reach. Billion's charter mentions both.

## [0.19.0.1] - 2026-09-27

### Documentation

- **Troubleshooting: a repo's local plugin (e.g. Telegram) gets registered in every worker worktree.** Explains why the registrations pile up in `~/.claude/plugins/installed_plugins.json` and how to remove them.

## [0.19.0.0] - 2026-09-27

### Added

- **Move to another Claude account in place, from the app.** A **Claude account** section in the Settings gear takes the folder a new account was logged in with (`CLAUDE_CONFIG_DIR=~/.claude-new claude`), shows both emails, and offers **Switch now**, **Arm**, **Roll back** and **Retire the new folder**, each behind a confirm. Off by default: nothing happens until you press one, and Billion has no tool for it. A switch backs the current login up (0600, under `~/.agent-007/account-backup/`), writes the new token into the Keychain item Claude Code itself uses (`.credentials.json` on Linux) and the account block into `~/.claude.json`, keeps everything else, checks `claude auth status --json` and the token read back, and rolls back by itself if the new email does not show; a rollback backs up what it replaces. Armed, it runs at Billion's first hard usage limit, before any switch to Codex, and Billion restarts on the new account. The new folder is never deleted; retiring renames it. For a permanent move, not for rotating past usage limits.

## [0.18.0.2] - 2026-09-27

### Changed

- **README FAQ: added "How is this different from Munder Difflin?"**

## [0.18.0.1] - 2026-09-27

### Changed

- **New README headline.** "Run your coding agents like a one-person company." replaces the old tagline as the hero line, with a proof line describing Agent 007 as the operations layer for coding agents underneath; the old tagline now introduces the numbered ladder, which is followed by an invite to compare notes if you already run agents this way, and an FAQ answers the questions people ask before trying it (safety of auto-merging, cost, where it runs, which agents it supports, whether Billion is required, and usage limits).

## [0.18.0.0] - 2026-09-27

### Added

- **A Settings gear lists the AI agent CLIs on this machine and the accounts each is logged in with.** Next to the light/dark toggle, the gear opens "Agents & accounts": for each CLI found on the PATH (Claude Code, Codex, Gemini CLI, opencode, aider, Hermes, Cursor Agent, Amp, goose, Qwen Code, Crush) its version and path, and under Claude Code, Codex and Gemini CLI each login folder (the default marked) with its email, plan and logged-in state. Scanned once at start; Refresh rescans. Read-only: it only runs each CLI's local status check and reads the email from its login file, and never returns or logs a token.

## [0.17.1.0] - 2026-09-27

### Security

- **Agents no longer see Agent 007's own settings.** Every agent the app starts used to inherit the server's whole environment, including what `~/.agent-007/.env` sets, so any worker (and anything it ran) could read `TELEGRAM_BOT_TOKEN`. Every setting `.env.example` documents (the Telegram token and chat, voice and Whisper settings, `PORT`, `HOST`, `BILLION_*`, the `AGENT007_*` paths and the rest) is now taken out of an agent's environment. What your own shell sets, such as `HOME`, `PATH`, `CODEX_HOME`, `CLAUDE_CONFIG_DIR` and proxies, still passes through.

### Fixed

- **Board workers no longer run Claude Code channel plugins.** A worker whose repo had the Telegram channel plugin installed polled Billion's bot, so your replies could go to the worker instead of Billion. Claude Code board workers, fresh or re-spawned, now start with the official channel plugins (telegram, discord, imessage, fakechat) turned off. Agents you start by hand are unchanged.
- **The Models line in the server log is said once.** It is logged again only when the source or the list of Codex models changes, and each distinct discovery error once.

## [0.17.0.0] - 2026-09-27

### Added

- **Billion switches CLI by itself at a usage limit.** The server reads the bottom of Billion's screen (only Billion's) for Claude Code's and Codex's own limit notices. Past 75% and again past 90% of a limit it tells Billion to bring `STATE.md` up to date and commit; at a hard limit ("You're out of usage credits", "You've hit your session limit", Codex's "You've hit your usage limit") it waits for Billion to go quiet, switches it to the other CLI with a `HANDOVER.md`, saves the reason in `billion-agent.json` and tells you on Telegram. It never switches back on a timer and never twice within 30 minutes; if the other CLI is spent too, missing or logged out, Billion stays put and "Billion paused: both Claude Code and Codex are at their limits" goes to *Waiting on you* and Telegram. `BILLION_AUTO_SWITCH=0` turns it off.

## [0.16.0.0] - 2026-09-27

### Added

- **Billion can run on Codex.** `BILLION_AGENT=codex` in `.env` (default `claude`) starts Billion as `codex --dangerously-bypass-approvals-and-sandbox` in its folder, with the board tools and the folder's trust passed per run, resuming its own Codex session by id after a restart. Codex reads `AGENTS.md`, so the server writes one on every start from the charter and your `CLAUDE.md`, your rules still last and still winning; `CLAUDE.md` is only read.
- **A switch button next to Billion's name.** It writes `HANDOVER.md` (the last 20 messages of the old CLI's conversation, read off its transcript, no model involved), stops Billion, and starts the other CLI in a new conversation that reads `STATE.md` and `HANDOVER.md` first. Waiting mail moves with it; the Waiting tab, Telegram and the board tools keep working. The choice is saved in `~/.agent-007/billion-agent.json` and holds until you change `BILLION_AGENT`. `agent-007 handover` writes the file on demand.
- **The server runs Billion's operating loop, on both CLIs.** It types `Run one operating cycle as defined in CHARTER.md.` into Billion's terminal every 30 minutes, every 3 while a worker on one of its cards is running or a card just reached Review or finished CI (not for a stalled or waiting one), never mid-turn and never within 2 minutes of you typing there. Billion paces itself with the new `set_next_wake` tool (3–60 minutes) instead of `/loop`, which the charter now tells it not to start.

## [0.15.1.0] - 2026-09-26

### Fixed

- **Billion hears when a board tool changes under a resumed conversation.** Claude Code keeps each tool's definition from when the conversation first loaded it, so after an upgrade Billion went on reading the old `notify_owner` (no one-tap choices) with nothing to say it had changed. Each start now saves the current board tool definitions to `billion-tools.json` in the config folder, and the restart prompt names the tools that changed since the last start and tells Billion to read them there.

## [0.15.0.0] - 2026-09-26

### Added

- **`resolve_question` closes a question the owner answered elsewhere.** When you answer Billion in its terminal instead of the Waiting tab or Telegram, Billion marks that question answered: it moves to Answered in every browser, the badge drops, and your phone's copy shows the answer. Billion-only.

### Changed

- **Every question to the owner goes through the Waiting tab.** Billion's charter now makes it a hard rule: anything that needs your answer, escalation or not, is a `notify_owner` call, so it never lives only in the terminal where your phone can't see it.

## [0.14.0.2] - 2026-09-26

### Changed

- **README hero shows the Billion demo (goal -> jobs -> merged) instead of the older pixel-office capture.** The office GIF moved down next to step 2, and the hero links to the full 41s video.

## [0.14.0.1] - 2026-09-26

### Changed

- **`SAY_RATE` unset now means the voice's own system speed.** Previously
  unset `SAY_RATE` defaulted to 205 wpm; now no `-r` is passed to `say` at
  all, so each voice speaks at its own default rate. Set `SAY_RATE` (120-300)
  to still choose a fixed speed.

## [0.14.0.0] - 2026-09-26

### Added

- **Billion can reply to you on Telegram without filing a question.** A new Billion-only `tell_owner` tool sends replies and status updates ("Got it, restart looks clean") to your phone the same way `notify_owner` does (same voice rule, size and per-minute limit) but files no *Waiting on you* item and leaves the bell badge alone. Billion's charter now keeps `notify_owner` for questions and decisions.

## [0.13.0.0] - 2026-09-26

### Added

- **Billion can read a long approval request in full with `read_approval`.** A worker's permission request with long input (a multi-line script, a file write) is typed into Billion's terminal cut short, so an allow on it used to go to the owner. Billion can now read the whole request (tool, full input, worker, card, time left), quoted under the untrusted-data banner, and once it has, its allow stands. Requests over 20 KB (as quoted, in UTF-8 bytes, so the reply stays under Claude Code's MCP output cap) still go to the owner on allow.

## [0.12.2.3] - 2026-09-26

### Changed

- **Billion's Telegram voice notes speak a little faster, and `SAY_RATE` sets the pace.** The default is 205 words per minute instead of `say`'s 175; `SAY_RATE` takes 120 to 300. The startup log gives the rate with the voice; see docs/BILLION.md, "Voice".

## [0.12.2.2] - 2026-09-26

### Changed

- **The Telegram poller logs going offline and coming back, not every retry.** A Mac sleeping, waking or changing network used to fill the server log with `getUpdates failed` lines. Now a brief blip is silent; an outage past three failures or a minute logs one `Telegram: offline (no network / DNS / timeout / HTTP n), retrying quietly` line, and recovery logs `Telegram: back online after <duration>`. A 401 (wrong or revoked token) or 409 (another process polling this bot) logs right away with a hint.

## [0.12.2.1] - 2026-09-26

### Changed

- **The board asks Codex for its models with `codex debug models`.** Codex's official catalog command replaces reading its private `models_cache.json`, which is still read if the command is missing, fails, times out or prints something that is not a catalog. The server log says which one each refresh used.

## [0.12.2.0] - 2026-09-26

### Fixed

- **Codex workers on Billion's cards report back without a dialog.** Every `send_message` or `finish_job` call a Codex worker made opened "Allow the agent-007-board MCP server to run tool …?" for you, so an unattended job stalled until someone clicked. Those two tools are now pre-allowed for that run, the same two Claude Code workers get; any other board tool still asks, and `~/.codex/config.toml` is untouched.

## [0.12.1.1] - 2026-09-26

### Changed

- **The Waiting tab is a bell with a notification badge.** The tab drops its "Waiting" label: open questions show as an orange count on the bell's corner ("9+" above 9), and with none open the bell is dimmed. Its name moves to the aria-label and tooltip ("Waiting on you, 3 questions"). The phone's bottom-bar button gets the same bell and badge.

## [0.12.1.0] - 2026-09-26

### Fixed

- **Codex agents answer agent messages through the board again.** Codex 0.157 has a built-in `send_message` of its own, and a message's "Reply with the send_message tool" line sent Codex's reply there, where it failed. The reply line, and the line telling a worker on Billion's cards how to ask Billion, now name the `agent-007-board` tool, and Codex uses it.

## [0.12.0.0] - 2026-09-26

### Added

- **Each job card can pick its model.** A **Model** dropdown on the + Job form and the card editor lists the models the board discovers on this computer: Claude Code's aliases (`fable`, `opus`, `sonnet`, `haiku`) and the models in Codex's picker (read from `$CODEX_HOME/models_cache.json`). Nobody maintains a list, and "CLI default" stays the default. The card shows its model, a worker re-spawned after a restart keeps it, and unknown values are refused. `post_job` and `edit_job` take `model` and list what is available, and Billion's charter says when to spend a strong model and when a fast one will do.

## [0.11.0.0] - 2026-09-26

### Added

- **Answer Billion's questions in the app.** Each open question in *Waiting on you* is a card with its choice buttons (the recommended one marked) and a reply line; a click or Send types `[Owner via app] Q3: <answer>` into Billion's terminal, with the start of the question for context. If Billion is not running the card says so and stays open. Answered questions fold into a collapsed Answered section.
- **Choices for `notify_owner`.** Billion can pass 2 to 5 short `choices` and mark one `recommended`; every question gets a short number (Q1, Q2 …). On Telegram the choices are buttons, and a text reply to a question's message answers that question; both reach Billion as `[Owner via Telegram] Q3: …`, and the message is edited to show the answer (or "Answered in app: …").

### Changed

- **Waiting on you is its own tab next to Jobs**, with a bell and a count of open questions, and a *Waiting* button in the phone's bottom bar. It used to be a list under Billion's row in the file explorer, which is easy to miss and hidden on phones. `waiting.json` written by earlier versions still loads.

## [0.10.0.0] - 2026-09-26

### Added

- **Billion's workers come back after a restart.** A worker on one of Billion's cards that is still In progress is re-spawned by itself on the board's first scan after the server starts (while the board is running): it resumes its own worktree and conversation, gets its card back and one nudge to continue. They come back one every couple of seconds, within the board's per-repo cap; any over the cap wait in the orphans list for the next scan. Cards in Review, agents you started by hand and other people's cards are left alone. `RESPAWN_BOARD_WORKERS=0` in `.env` turns it off.
- **`respawn_agent` for Billion.** Billion can bring back an orphaned worker on one of its own cards by name, through the same path as the Re-spawn button. It never makes a new worktree, reports a worktree that has gone instead, and respects the cap.

## [0.9.3.0] - 2026-09-25

### Fixed

- **A long agent message is acted on, not questioned.** Claude Code turned any message over a few hundred characters into "pasted content", which it treats as maybe not from the user, so a worker handed a long coordination message from Billion asked whether to act on it and waited. Messages, board notices and approval requests now go in as a series of short bracketed pastes, a line or less each, and arrive as an ordinary typed turn. The sender header, the quoted body and the text itself are unchanged.

## [0.9.2.1] - 2026-09-25

### Changed

- **Billion's Telegram voice notes use a better macOS voice.** It now speaks with the best English voice installed (Premium, then Enhanced, en_US before en_GB) instead of `say`'s old default, and `SAY_VOICE` picks one by name. Download the free Premium voices in System Settings → Accessibility → Spoken Content → Manage Voices; see docs/BILLION.md, "Voice".

## [0.9.2.0] - 2026-09-25

### Changed

- **A new card starts right away when its repo has room.** Posting a card, moving one back to To do, or a worker freeing its slot (card to Review or Done, or its agent gone) now triggers a dispatch pass within about two seconds, instead of waiting for the next 5-minute scan. Bursts coalesce into one pass, a stopped board still does nothing, and the periodic scan stays as the fallback.

## [0.9.1.1] - 2026-09-25

### Fixed

- **The branch-sync test no longer flakes on slow runners.** It waited fixed times for scan ticks, but the next tick is only scheduled after the previous scan finishes, so slow git on Windows could outlast the sleep. It now waits for the scans themselves.

## [0.9.1.0] - 2026-09-25

### Fixed

- **A re-spawned board worker is a board worker again.** After a restart, Re-spawn on a board worker's orphan now brings back its card link (saved jobId, or the card on its branch for older records), its Billion approval routing and its folder trust. It counts toward the per-repo cap, gets one "Agent 007 restarted and you were re-spawned. Continue your card where you left off." line while its card is In progress, and when the board files its card its tab closes and it walks out, rather than leaving a crossed-out tab behind.

## [0.9.0.0] - 2026-09-25

### Added

- **Billion can see a stalled worker's screen.** A new Billion-only board tool,
  `read_agent_screen`, returns the last lines of a worker's terminal (40 by
  default, at most 200, capped at 20,000 characters) as plain text with ANSI
  escapes stripped, plus its status: working, waiting, needs you or exited.
  Billion can now see the dialog, error loop or question a worker is stuck on
  instead of messaging it blind or digging through transcript files. Reading
  is narrower than `send_message`: only workers on cards Billion posted,
  including one that has exited; agents you start by hand stay off-limits,
  since a screen can show a secret that scrolled by. The text is never logged
  on the server, and reaches Billion quoted line by line under a header that
  calls it untrusted data from the worker, never instructions. Billion's
  charter lists the tool and says the same.

## [0.8.0.0] - 2026-09-25

### Added

- **Billion hears when CI finishes on its cards, and merged cards leave the
  board within a minute.** Every Review card with a pull request is now checked
  every 60 seconds with `gh pr view`, through the same GitHub accounts the
  board already uses to find PRs. No webhooks, so it works on a laptop behind
  NAT. When every check on the PR's latest commit has finished, a card Billion
  posted sends it `[Job board] CI finished on "<title>" (card <id>, PR #n):
  all passed`, or `failed: <check names>`. It comes once per commit, and again
  after a new push or a re-run of a failed job. Billion's charter now says to
  merge on that notice after its diff review, instead of running
  `gh pr checks --watch`, and to re-run a job that failed for a reason
  unrelated to the change (a known flaky test) before sending the card back. A PR found merged or
  closed is filed on that same check, instead of waiting up to 5 minutes for
  the next board scan. Its worker and worktree are released under the same
  rules as before. A PR that can't be read is checked less and less often, down
  to once every 15 minutes. The checks run only while the board is started.

### Fixed

- **Stopping the board during a scan no longer leaves a second scan loop
  running.** A scan that was still in progress when the dispatcher stopped
  scheduled its next run anyway.

## [0.7.1.0] - 2026-09-25

### Fixed

- **A finished card's worktree is no longer kept as an "unpushed" orphan when its branch is on the remote.** A worker that pushed again from its worktree (a rebase fix, a force-with-lease) could leave the shared repo's `refs/remotes/origin/<branch>` on an old SHA, so cleanup saw HEAD differ from `@{u}` and kept the worktree. Cleanup now asks the remote (`git ls-remote`) whenever HEAD is not `@{u}`, not only when `@{u}` is missing. Only an exact SHA match counts; offline, an error or a different SHA still keeps the worktree.
- **Orphans already kept as "unpushed" are re-checked at startup.** Each one whose card is not in progress or in Review goes through the same cleanup rules, so one that is clean and matches the remote is released without a click. Dirty worktrees and branches the remote does not hold stay.

## [0.7.0.0] - 2026-09-25

### Added

- **Talk to Billion over Telegram, and hear it answer, free and on your own
  machine.** Send the bot a voice note and it is transcribed locally by
  whisper.cpp and typed into Billion's terminal as
  `[Owner via Telegram, voice] <transcript>` (a caption you add is kept).
  Billion's messages to you can come back as voice notes, spoken by macOS
  `say` and encoded with ffmpeg, always with the same text as the caption so
  links stay tappable. Nothing leaves the machine but the Telegram calls
  themselves, and there is no paid transcription. `TELEGRAM_VOICE=mirror` (the
  default) answers in the mode of your last message and remembers it across
  restarts; `always` and `never` fix it. A message over about a minute of
  speech (900 characters), or one that is mostly links, code or paths, always
  goes as text. Without `say` or ffmpeg (Linux, Windows) Billion sends text and
  the log says why once. Until whisper.cpp and a model (`WHISPER_MODEL`) are
  set up, a voice note gets a one-line reply on how to turn it on, and nothing
  reaches Billion. Notes over 5 minutes or 20 MB are refused. Setup is in
  docs/BILLION.md, "Voice". Billion's charter now says a voice transcript is
  the owner's words with possible transcription errors, and to ask back when
  something is ambiguous and risky.

## [0.6.7.0] - 2026-09-25

### Changed

- **Parallel PRs no longer conflict on VERSION and CHANGELOG.md.** A PR now
  adds its release notes as its own file, `changelog.d/<branch-name>.md`, with
  a `bump:` level (`major`, `minor`, `patch` or `micro`) in its front matter,
  and never edits `VERSION`, `package.json`'s version or `CHANGELOG.md`. When
  it merges, the release workflow runs `scripts/release.js`, which picks the
  next version from the fragments, writes `VERSION`, `package.json`,
  `package-lock.json` and the `CHANGELOG.md` section, deletes the fragments and
  commits that to `main`; the tag, GitHub Release and npm publish follow as
  before, with the same npm version mapping. Two or three workers running at
  once used to cost a rebase-and-renumber round trip each. `AGENTS.md` (read
  by Codex, and by Claude Code through `CLAUDE.md`) tells agents to skip
  /ship's version bump and write the fragment instead; CONTRIBUTING.md
  "Releases" has the details. A PR that still bumps `VERSION` by hand is
  released as before.

## [0.6.6.0] - 2026-09-25

### Added

- **Billion's questions reach your phone, and you can answer from there.** In
  a busy company Billion's terminal fills with card notices and merges, and a
  question to you scrolled away. Billion now has a `notify_owner` tool: the
  question, why, and its recommendation, in one short message. It is pinned in
  a **Waiting on you** list under Billion's row in the left panel (dismiss each
  with ×; kept in `~/.agent-007/waiting.json` across restarts), and with
  `TELEGRAM_BOT_TOKEN` and `TELEGRAM_CHAT_ID` set it is sent to you by a
  Telegram bot. Whatever you answer the bot is typed into Billion's terminal as
  `[Owner via Telegram] <text>`; if Billion is not running, the bot says so.
  Only your chat is accepted: messages from any other chat are ignored without
  a reply. With only the token set, the server log shows the id of each chat
  that messages the bot, so setup is three steps (docs/BILLION.md,
  "Telegram"). The token is never logged or sent to the browser. At most five
  notifications a minute. No new dependency: Node's own `fetch`. Billion's
  charter now tells it to use the tool when it asks you something.

## [0.6.5.0] - 2026-09-25

### Added

- **Queued Codex jobs start without a click too.** Codex asks "Do you trust
  the contents of this directory?" in every brand-new worktree, so a Codex card
  on the board used to wait there for someone. A board-dispatched Codex worker
  is now started with `-c projects={"<worktree>"={trust_level="trusted"}}`,
  which trusts that one worktree for that run. Nothing is written to
  `~/.codex/config.toml`, and your own trusted projects stay trusted. A trusted
  worktree lets the repo's Codex project config, hooks and exec policies load,
  the same trade-off as for Claude Code. `TRUST_BOARD_WORKTREES=0` now keeps
  the dialog for both CLIs, and hand-started Codex agents keep it as before.

## [0.6.4.1] - 2026-09-25

### Changed

- **The README says what Agent 007 is for, in the order you'd grow into it.**
  The tagline is now "From web terminals for your coding agents to a
  self-running agent company", followed by four steps: one agent in a web
  terminal with its worktree handled for you, many terminals across projects in
  one window, a job board Claude Code and Codex workers pick up on their own
  (cron jobs included), and Billion, who takes a goal and runs the board. The
  old Highlights list is folded into those steps. The README also says plainly
  that it runs on your machine (agents work while it is on and awake), that
  Billion's plan and memory live in git so it resumes after a restart, and that
  every worker is a real terminal you can open, from a phone too.
- **npm description** matches the GitHub one, and the keywords add
  `autonomous-agents`. `docs/FEATURES.md` and `docs/BILLION.md` open with a line
  placing them in the same progression.

## [0.6.4.0] - 2026-09-25

### Added

- **A settings file you can find without the repo.** `npx @bill10/agent-007 init`
  (or `agent-007 init`) writes `~/.agent-007/.env`, a copy of `.env.example`
  with every setting explained and commented out, so creating it changes
  nothing until you uncomment a line. It never overwrites a file that is already
  there; it says so and prints the path. `.env.example` now ships in the npm
  package, so the template has one copy.
- **The same settings rules everywhere.** `npx`, a global `agent-007` and
  `npm start` / `npm run dev` / `npm run adduser` in a clone all read
  `./.env` and `~/.agent-007/.env` (`AGENT007_CONFIG_DIR/.env` when set).
  Highest wins: `--port`, then the real environment, then `./.env`, then
  `~/.agent-007/.env`. Before, settings came only from a `.env` in whatever
  directory you happened to run the command from.
- **Startup says where settings came from.** One line: `Settings:` and the
  files it loaded, or `Settings: defaults (run \`npx @bill10/agent-007 init\`
  to create ~/.agent-007/.env)`, with the init command in the form you launched
  it with.
- **`--help` lists every setting** with its meaning and default, plus the
  `init` command. The README has a short Settings section after Quick Start.

## [0.6.2.1] - 2026-09-25

### Changed

- **Install with `npx @bill10/agent-007`.** npm refused the unscoped name
  `agent-007` as too close to the existing `agent007`, so the package is now
  `@bill10/agent-007`. The command it installs is still `agent-007`:
  `npm i -g @bill10/agent-007`, then run `agent-007`. The README, the
  contributor guide and the release workflow use the new name, and the
  workflow reads it from `package.json` instead of hard-coding it.

## [0.6.3.0] - 2026-09-25

### Fixed

- **A first run without Claude Code says what to do instead of showing a
  dead terminal.** With no `claude` on the PATH, Billion's tab used to open
  black and already stopped, while the server log said Billion was running.
  The tab now shows one line: install Claude Code (with the link) and press
  Start next to Billion, or restart with `BILLION=0` to turn Billion off. The
  log says Billion was not started and why. Nothing retries on its own.
- **Starting an agent or a job whose CLI is missing fails with a readable
  error.** + Agent with Claude Code, Codex or Gemini not installed used to open
  a tab that was dead from the start and leave its worktree behind. The form
  now shows `"claude" is not installed, or not on the PATH Agent 007 was
  started with`, with where to install it, and no worktree is kept. A board
  card stays in To do with the same message on it.

## [0.6.2.0] - 2026-09-25

### Added

- **Queued Claude Code jobs start without a click.** Every board worker gets a
  brand-new worktree, and Claude Code used to stop there at "do you trust this
  folder?" until someone answered. The board now marks the worktree trusted in
  `~/.claude.json` before the spawn, adding that one entry and leaving the rest
  of the file as it was, and picks "Yes" on screen if the dialog shows anyway.
  A trusted worktree loads the repo's own `.claude/settings.json`, so its
  hooks run and its permission allow rules apply. `TRUST_BOARD_WORKTREES=0` in
  `.env` keeps the dialog. Hand-started agents keep it as before. Codex
  workers still stop at Codex's own trust prompt.

### Fixed

- **Answering the trust dialog no longer risks exiting Claude Code.** The
  server moved off "No, exit" with the down arrow, whose first byte is Escape,
  and a lone Escape on that dialog exits. It now sends Ctrl-N, and it only
  acts when both of the dialog's options are on screen.

## [0.6.1.0] - 2026-09-25

### Fixed

- **A finished card's worktree is cleaned up even when its branch was pushed
  to a URL.** A worker that pushed with `git push -u https://…@github.com/…`
  left the branch tracking that URL instead of `origin`, so git had no
  remote-tracking ref to compare against and the cleanup called a fully pushed
  branch "unpushed" and kept its worktree as an orphan. When the upstream can't
  be resolved locally, the cleanup now asks the remote for the branch's SHA
  (5 second timeout) and releases the worktree only on an exact match. Offline,
  an error, or a different SHA still keeps it, so no branch whose commits are
  missing from the remote is deleted.
- **A token left in a branch's remote URL is removed.** If that URL holds
  a user and token before the host, the cleanup points the branch back at
  `origin`, so the token no longer sits in `.git/config`. The URL is never
  logged.

### Changed

- **Dispatched workers are told to push with `git push -u origin HEAD`** and
  never to put credentials in a remote URL. To push as a different GitHub
  account, `gh auth switch` is enough.

## [0.6.0.0] - 2026-09-25

### Added

- **Install with one command: `npx agent-007`.** No clone needed. Agent 007 is
  ready to publish to npm as `agent-007`, with an `agent-007` command that takes
  `--port`, `--help` and `--version`, and `agent-007 adduser "Name"` for login
  users. It reads a `.env` in the directory you run it from, keeps everything
  it saves in `~/.agent-007`, and installs without compiling anything. The
  package holds only what runs (about 250 kB).
- **Each release goes to npm too.** After the GitHub Release, the release
  workflow publishes the same version to npm from GitHub Actions, with
  provenance and no stored token. npm versions are three-part, so VERSION
  `A.B.C.D` is published as `A.B.(C*1000+D)` and every MICRO release reaches
  npm; this one is `0.6.0`.
## [0.5.1.5] - 2026-09-25

### Fixed

- **`npm test` passes when your shell exports agent-007's own settings.** With
  `CLAUDE_PERMISSION_MODE`, `CODEX_PERMISSION_MODE` or `AGENT_MESSAGING` set,
  as a configured `.env` often leaves them, six messaging and permission tests
  read those values instead of the defaults they check, and failed. The shared
  test setup now clears every variable `.env.example` documents before each
  test file, so a variable added there later is covered too. Runtime behaviour
  is unchanged.
- **The test suite no longer writes MCP configs into your real
  `~/.agent-007/mcp`.** They now go to a temp dir, like the suite's other
  Agent 007 paths, so a test run can't sweep away a running server's configs.

## [0.5.1.4] - 2026-09-25

### Fixed

- **A fresh install no longer opens with a wall of security warnings.**
  `npm install` used to report 9 vulnerabilities (1 critical, 4 high). The
  server's own dependencies now audit clean: Express 4.22.3 brings `qs`
  6.16.0, plus patched `body-parser` and `path-to-regexp`. The test tooling
  moved to Vitest 3.2.7, vite 7.3.6 and esbuild 0.28. One moderate advisory
  remains (GHSA-82fw-gwwq-j7x9, test tooling only). It covers Vitest's
  browser-mode mock server, which this project never starts, and no Vitest 3
  release fixes it. `npm audit --omit=dev` reports 0.

## [0.5.1.3] - 2026-09-25

### Added

- **Every version is a GitHub Release.** Watch the repo's releases to hear
  about each new version, and link a version's notes straight from GitHub.
  When a merge to `main` bumps `VERSION`, a workflow tags that commit `vX` and
  publishes a Release whose notes are this file's section for it. v0.5.1.1 is
  the first one.

## [0.5.1.1] - 2026-09-25

### Changed

- **The README says what Agent 007 is for on its first screen.** It opens with
  "Queue coding jobs, walk away, review the PRs", the demo, a three-command
  Quick Start and five short highlights: the job board, Billion, bring your own
  Claude Code or Codex subscription, the pixel office, and agents that message
  each other. The long feature list lives in `docs/FEATURES.md`.
- **No C++ compiler needed to install.** `node-pty` ships prebuilt binaries for
  macOS, Linux and Windows on x64 and arm64, so the compiler setup moved out of
  the requirements (README and CONTRIBUTING) into a Troubleshooting note for
  the rare install that has to build it.

## [0.5.1.0] - 2026-09-25

### Added

- **A default permission mode for every agent, from `.env`.**
  `CLAUDE_PERMISSION_MODE` and `CODEX_PERMISSION_MODE` (one of `auto`,
  `acceptEdits`, `bypassPermissions`, `manual`, `dontAsk`, `plan`) set the mode
  every Claude Code or Codex agent the app starts runs in: agents you start
  from **+ Agent** or type a command for, and job board workers. Anything more
  specific still wins: permission flags in the command (any value, including
  ones like `--permission-mode default`, and Codex config overrides and
  profiles), a card's own mode, or a mode picked in the board's permissions
  dropdown. Until you pick one there, the dropdown shows the `.env` defaults,
  in red when either is bypass. Billion keeps its own mode. A misspelt mode is
  reported when the server starts.
- **`AGENT_MESSAGING=open`** lets any of your agents message any other. By
  default an agent that asks before acting still cannot message one that never
  asks, so it cannot borrow that agent's permissions; with every agent in the
  same kind of mode the rule never blocks anything anyway.

### Changed

- When the messaging rule refuses a message, the sender is told why and how
  the owner can allow it, instead of being told no such agent exists.

### Fixed

- A Codex agent started with its profile name attached to `-p` (`-pyolo`) is
  now recognised as possibly never asking, like `-p yolo`.

## [0.5.0.0] - 2026-09-24

### Added

- **Billion, the one agent you talk to.** The server now starts an always-on
  Claude Code agent called Billion. You give it a mission, narrow ("ship the
  Windows build") or broad ("grow the company"), and it runs the work: it
  plans, posts job cards, reviews what comes back, merges pull requests, and
  comes to you only for money, access, anything irreversible, making a
  private repo public, payments or security, and real forks in direction.
  It runs without permission prompts, so those rules are its brakes.
  - On its first start it introduces itself, shows you what it will always
    ask you about, and asks for your mission and where new project repos
    should go. After that it works in a self-paced loop and picks up where it
    left off when the server restarts.
  - Its memory is a git repo of its own in `~/.agent-007/billion`: your rules
    in `CLAUDE.md`, the mission and what it learns in `COMPANY.md`, its
    current plan in `STATE.md`. Every change is a commit. Its instructions
    (`CHARTER.md`) are Agent 007's and update with each release, without
    touching your rules.
  - It sits pinned at the top of the left panel and alone at the top of the
    office, and its terminal opens by default. Nothing restarts it on its own:
    a stopped Billion shows a Start button.
  - On by default. `BILLION=0` turns it off and `BILLION_DIR` moves its
    folder (it must be new or empty). It stays off while user accounts are
    enabled, since it would belong to everyone.
- **Every agent can message Billion,** and a card Billion posted tells it the
  moment it reaches Review, with the pull request or summary, instead of
  waiting for its next check. Workers on its cards are told they can ask it
  instead of waiting for you.
- **Billion answers its workers' permission requests.** A Claude Code worker
  on one of Billion's cards asks Billion before it asks you. Billion allows,
  denies with a reason the worker reads, or leaves it to you, and anything it
  does not answer within two minutes comes to you as the usual dialog. A
  request it could not see in full, a question or plan approval, or text that
  tries to steer its answer always reaches you instead. Codex workers still
  ask you.
- **Billion's board tools:** it can add a new project's repo to the board, and
  accept a finished card that has no pull request or send it back with a note
  for the next worker.

### Changed

- `list_jobs` shows which agent posted each card.
- The server answers Claude Code's first-run folder trust dialog for Billion's
  own folder.

## [0.4.10.1] - 2026-09-24

### Fixed

- **Scrolling back down reaches the prompt again.** If an agent printed
  while its terminal was out of view (another tab, the job board, another
  phone view), switching back left the scroll range short: after scrolling
  up, the wheel stopped about a screenful above the bottom and the input
  line stayed out of reach. Showing a terminal now brings its scroll range
  up to date.

## [0.4.10.0] - 2026-09-24

### Changed

- **A closed pull request files its card away, like a merge does.** A card
  whose PR was closed without merging used to sit in Review indefinitely,
  holding a live agent and worktree, and for a schedule's run it held the
  schedule off for good. Now it moves to Finished jobs, marked "PR closed
  without merging" rather than "merged", and its agent is closed. Anything
  unpushed in its worktree is kept as an orphan. A schedule whose run's PR
  was closed can run again.
- The board is careful about when it counts a PR as closed:
  - If the agent opened a replacement PR on the same branch, the card follows
    the new PR instead.
  - Closing and reopening a PR (to re-run CI, say) doesn't file anything,
    because the closed state has to hold across two scans.
  - An agent that is still working or asking you something isn't closed
    until it's quiet.

### Fixed

- The board no longer adopts a pull request from someone else's fork that
  happens to use the same branch name.
- An agent that reworks its PR and calls `finish_job` again with the new link
  now updates its card.

## [0.4.9.0] - 2026-09-24

### Changed

- **A schedule posts a run card each time it comes due.** A scheduled card
  used to run itself, cycling To do -> In progress -> To do, and the board
  had to guess when a run was over. Now the schedule stays in To do, and each
  firing posts an ordinary job card for that run. The run goes through the
  board like any other job: its agent reports back with `finish_job`, the
  result waits in Review with the agent still running, and the agent is
  released at Done. Runs count toward the per-repo agent limit.
- **Scheduled jobs can't flood the board.** A schedule holds off while its
  last run is still waiting or running, and while that run's pull request is
  open. When a newer summary-only run reaches Review, the older one moves to
  Finished jobs, keeping its summary, and its agent is closed. The newest
  card says how many earlier runs it replaced, and the schedule card says
  why it last held off and links to its latest run. Finished jobs keeps a
  schedule's newest 50 runs.
- **A schedule's runs report a summary unless you ask for a PR.** The job
  form's Pull request field now applies to schedules too, and starts at Not
  required. Set it to Required for a recurring code change, such as a weekly
  dependency bump. Such schedules carry a "PR runs" chip.

### Removed

- The "End run" button and the kept last-run terminal link on scheduled
  cards. A run is its own card now, with the usual buttons.

### Fixed

- A schedule no longer loses firings silently when a run gets stuck: the run
  shows its status on its own card, and the schedule says it is holding off.

## [0.4.8.0] - 2026-09-24

### Added

- **Jobs that don't need a pull request.** A one-time job can now be marked
  "Pull request: Not required" on the job form, or with `requires_pr: false`
  when an agent posts or edits it. Its agent is not told to run `/ship`, so
  research, investigations and chores no longer invent a code change to
  ship. It reports back with a summary instead, and the summary shows on the
  card in Review. Cards marked this way carry a "no PR" chip.
- **Agents say when they're done.** A dispatched agent now finishes its job
  by calling the board's new `finish_job` tool: with the pull request `/ship`
  opened, or with a summary for a job that needs none. The board checks that
  the PR is the open one on that card's own branch before moving the card,
  and only the agent working a card can finish it. The board still spots a
  PR on its own if an agent forgets to call in.

### Changed

- **A card in Review keeps its agent.** The agent used to be closed the
  moment its PR appeared. It now stays running until the card is done, so
  you can click a Review card to open the agent's terminal and ask about the
  work. The agent and its worktree are released when the PR merges or you
  mark the card done (or move it back to To do). Agents waiting in Review do
  not count toward the per-repo limit.
- **Done cleans up after a restart too.** A Review card moved to Done or
  back to To do after the server restarted now releases the worktree its
  agent left behind, instead of leaving it in the orphans list.

### Fixed

- Re-adopting an agent that was closed by hand now reconnects it to its job
  card, even without a restart.
- A merge no longer closes a terminal you opened yourself on a Review card's
  branch.

## [0.4.7.0] - 2026-09-23

### Fixed

- **Opening a tab no longer yanks everyone else's screen.** When several
  people share one server, spawning an agent made every other browser flash
  to the new tab and then land on whatever tab it had open when the page
  loaded. Now only the browser that spawned (or re-spawned) the agent
  switches to it; everyone else gets the new tab in their strip and stays
  where they were. Someone else's spawn also no longer closes your
  half-filled spawn form, and no longer closes the job board while you're
  working in it.

## [0.4.6.0] - 2026-09-23

### Fixed

- **A re-spawned Codex agent comes back to its own conversation.** Re-spawn
  ran `codex resume --last`, and Codex counts every worktree of a repo as one
  place, so an agent in one worktree picked up whichever sibling agent's
  conversation was newest. With that sibling still running, it stopped on
  "This conversation is open in another app"; with the sibling closed, it
  carried on the wrong agent's work. Re-spawn now names the session: the
  newest one Codex recorded in exactly that worktree, with the same permission
  flags as before. A worktree with no session of its own opens Codex's session
  picker rather than guessing.

## [0.4.5.1] - 2026-09-22

### Changed

- **The README opens with the app running.** A short screen capture — spawning
  an agent, posting a job to the board, and an agent turning orange when it
  needs an answer — replaces the static screenshot above the fold, so the
  states the office is built to show are visible before you read a word.

## [0.4.5.0] - 2026-09-22

### Fixed

- **Several people can watch the same terminal without its text scrambling.**
  A terminal has one size and every browser gets the same output, but each
  browser resized it to fit its own window. Whoever resized last saw it right;
  everyone else got output drawn for the wrong width, until they resized it
  back and scrambled it for the first person. A terminal now takes the size of
  the smallest of its owner's windows showing it, as tmux does, and every
  browser draws it at exactly that size. A bigger window shows some empty
  space, and nothing is reflowed. A window stops counting as soon as it isn't
  showing that terminal: it switched tabs, opened the job board or another
  phone view, went to a background browser tab, or closed.
- **A new or reconnecting browser shows a terminal's history at the right
  width.** It used to replay the history into a blank 80x24 terminal before
  sizing it, which wrapped every longer line.
- **Terminals get a UTF-8 locale when the server has none.** A server started
  by launchd, systemd or a bare ssh command has no `LANG`, so every terminal
  ran in the plain POSIX locale, and so did any server reached from one over
  ssh (ssh forwards `LANG`). Accented text, box-drawing lines and emoji came
  out as `?` or junk in shells, vim and tmux. A locale you set yourself is
  still left alone.

## [0.4.4.2] - 2026-09-22

### Fixed

- **The pty-chunking test "leaves the last frame alone when a read draws no
  frame" no longer fails at random.** It wrote a Codex frame and then a history
  line and expected the frame to win, which held only when both landed in the
  same millisecond; a clock tick between them let the newer line outrank the
  frame, as the product rule intends. The test now pins the clock across the
  two writes. No product behaviour changed.

## [0.4.4.1] - 2026-09-22

### Fixed

- **The test suite passes on Node 26.** Node 25 and later define their own
  `localStorage`, which is undefined unless Node starts with
  `--localstorage-file`. Vitest's happy-dom environment skips any browser global
  Node already has, so the 17 client tests that read or write storage found
  nothing there and failed. The test setup now installs happy-dom's storage in
  its place. The app's browser code is unchanged.

## [0.4.4.0] - 2026-09-22

### Added

- **Agents message each other, whichever CLI they run on.** Tell an agent "ask
  Viper what it changed in jobs.js" and it sends the question itself, whether
  Viper runs on Claude Code or Codex. Before, only Claude Code agents could
  reach each other, through Claude Code's own messaging. Every agent now has two
  more tools on the board's MCP server, `list_agents` and `send_message`. A
  message is typed into the other agent's terminal as a new turn, headed with
  who sent it and quoted line by line, and the reply comes back the same way.
  It goes in only while that agent rests at its prompt. It never goes into a
  permission or trust dialog the app recognises, and never within 30 seconds of
  you typing in that terminal. Until then it queues. An agent reaches only
  agents with the same owner, never a shell tab, and at most 10 messages per
  pair every 10 minutes. An agent that never asks before acting only takes
  messages from another agent like it, so a careful agent cannot borrow a
  bypass agent's permissions by asking it. The design, and the limits that
  remain, are in [docs/designs/agent-messaging.md](docs/designs/agent-messaging.md).

### Fixed

- **Codex's folder-trust and hook-review dialogs are recognised as questions.**
  They read as an agent resting at its prompt, so a Codex agent parked at one
  showed no "needs you" bubble. Anything typed into them, a message included,
  answered them: the trust dialog saved the folder as trusted, and "Hooks need
  review" opened the hooks browser, which had the same fault.

## [0.4.3.2] - 2026-09-21

### Fixed

- **A scheduled job's next run cleans up after the last one.** When a scheduled
  card dispatches again, the previous run's worktree is now deleted even if that
  run left files behind, such as a report it wrote or the board's own
  attachments folder. Before, those files kept the worktree around as an orphan
  in the left panel after every run. Unpushed commits are still protected and
  still orphan the worktree. A previous run whose agent had already exited is
  now retired too, where before it was skipped and its dead session and
  worktree lingered until a restart. Deleting a scheduled card retires an
  exited last run the same way.
- **Worktree cleanup never deletes commits it cannot account for.** In a repo
  whose default branch is neither `main` nor `master` and has no remote HEAD
  recorded, cleanup could not tell whether a branch held unpushed commits and
  deleted it anyway. It now keeps such a worktree as an orphan. Removing a
  worktree also gets the longer git timeout, so one with `node_modules` in it
  is no longer cut off mid-delete and left half-removed.

## [0.4.3.1] - 2026-09-20

### Changed

- **The README's Features section is short enough to read.** Each feature is
  now one or two sentences; the full tour, with every detail and caveat, moved
  word for word to [docs/FEATURES.md](docs/FEATURES.md), which the README links
  to.

## [0.4.3.0] - 2026-09-18

### Added

- **The app works on a phone.** Below 700px the three panels no longer fight
  for a screen that fits one: a Files / Office / Terminal bar along the bottom
  picks which panel you see. Tapping a desk in the office opens that agent's
  terminal, tapping a whiteboard opens the job board, and opening a file diff
  brings you to the office panel where the diff is drawn, with closing it
  taking you back to the file list. Only your taps move you: an agent
  spawning, finishing, or coming back after a reconnect changes the tab strip
  as it always did but leaves you on the panel you are reading. The spawn
  form and directory browser fit the screen, form fields are sized so iOS
  stops zooming into them on focus, the page follows the visible area rather
  than the space behind Safari's address bar, and the terminal shrinks above
  the software keyboard so the prompt line stays in view. Leaving the
  terminal panel stops voice input, since its recording cue lives there.
  Desktop and tablet layouts are unchanged.

### Fixed

- **The office no longer redraws itself while nobody can see it.** The
  animation loop painted the whole room sixty times a second into a canvas
  that was hidden (behind the diff viewer, or on a phone showing another
  panel); it now skips the frame when the canvas has no size. Nothing is
  lost: every animation runs on the clock, so the room is current the moment
  it is shown again.

## [0.4.2.3] - 2026-09-16

### Fixed

- **A Codex agent no longer shows the "needs you" bubble after a dialog it
  already answered.** Opening `/permissions` (or any Codex dialog) lit the
  bubble correctly, but it stayed lit after the choice, with the terminal
  plainly idle at its prompt. Two causes: the dialog detector matched any
  line containing "allow" or "approve", so the picker's own description
  ("choose what Codex is allowed to do", "Ask for approval") counted as a
  question; and Codex redraws its prompt with cursor moves rather than
  newlines, so those lines stayed the newest the detector remembered until
  five more real lines arrived. The detector now matches each CLI's actual
  dialog wording, and for a TUI that repaints in synchronized-output frames
  (Codex does) it reads the last frame, which is the pane as it stands: the
  dialog while it is open, the bare prompt once it is answered. A frame that
  straddles two terminal reads is still read whole, and a frame that repaints
  only part of the pane (the option rows as you arrow through a picker, the
  history Codex re-inserts after a resize) is merged onto it rather than
  taken for it. Claude Code does not draw such frames and keeps the previous
  behaviour; a tab that stops drawing them (a shell that ran one such tool,
  then Claude Code) falls back to it too, since whichever source is newer
  speaks. Frames are read for Codex agents only. Claude Code's own dialog answers, which arrive with their
  spaces cursor-moved away, now match whether or not the spaces survive, and
  its 2.1 permission dialog ("Yes, and always allow access to …", a "Tab to
  amend" footer) is recognised by a captured fixture rather than by luck.

## [0.4.2.2] - 2026-09-16

### Fixed

- **A re-spawned hand-spawned agent keeps its permission flags.** Only a job
  agent got its mode back on Re-spawn, from its card; an agent you started
  yourself as `codex --dangerously-bypass-approvals-and-sandbox` or
  `claude --permission-mode plan` came back under the CLI's default, so a
  bypass agent started asking and a read-only one could write. The board now
  records the permission flags each agent was spawned with, on the session
  and on the orphan it becomes, and Re-spawn puts them back on the command.
  A job card's mode still wins when there is one. What is kept: Codex's
  `--sandbox`, `--ask-for-approval`, `--approve-for-me` and
  `--dangerously-bypass-approvals-and-sandbox` (short and `--yolo`
  spellings included), and Claude Code's `--permission-mode` and
  `--dangerously-skip-permissions`, each only with values the CLI accepts,
  so nothing else on the record can reach the command line. Other
  permission sources, such as Claude's `--allowedTools` or a Codex `-c`
  override, are not carried. A board-dispatched agent records no flags of
  its own: its card's mode is re-read at every re-spawn, and once the card is
  gone the board's current setting decides (records now remember which agents
  the board dispatched), so a bypass card retired long ago cannot come back
  as a bypass agent.

## [0.4.2.1] - 2026-09-16

### Fixed

- **Re-spawning a Codex agent no longer dies with "No conversation found to
  continue".** Re-spawn always ran `claude --continue`, whichever CLI the
  orphaned session had been running, and a Codex worktree has no Claude
  transcript to continue. The board now notes which CLI each agent runs, the
  orphan it becomes after a restart or a close inherits that note, and
  Re-spawn runs `codex resume --last` (scoped to the worktree, so it picks up
  that agent's own session) or `claude --continue` to match. An orphan with
  no note, one recorded before this release or discovered from a bare
  worktree, falls back to the job card on its branch, then to whichever CLI
  left the newer transcript for that directory under its own home
  (`~/.claude/projects`, `~/.codex/sessions`; only interactive Codex sessions
  count, since those are the ones `resume --last` can reach), and only then
  to Claude Code, which is what it always did before. So the orphans you
  already have re-spawn correctly without any hand edit to `config.json`.
  The note is written only for an agent started as `claude` or `codex`
  itself: a shell tab you ran Codex from, or a re-spawn whose CLI was
  guessed, records nothing and lets the fallbacks decide next time, so a
  wrong guess can never harden into a fact.
- **A re-spawned job agent keeps its permission mode.** Neither CLI remembers
  it, so a Codex card dispatched read-only came back after a restart with
  Codex's default workspace-write sandbox, and an unattended card came back
  asking for approval. Re-spawn now passes the card's mode (or the board's,
  if the card inherits it) the same way dispatch did: `--sandbox` /
  `--ask-for-approval` flags for Codex, `--permission-mode` for Claude Code.
  A manually spawned agent has no card and resumes under its CLI's default,
  as before.
- **A Codex card in `manual` mode starts.** The mode mapped onto Codex's
  `--ask-for-approval untrusted`, a value codex-cli 0.153 no longer accepts,
  so the agent died at parse time before showing a prompt. It now runs
  Codex's read-only sandbox with approvals on request: every write and every
  step outside the sandbox comes back as a question, the nearest Codex has
  to asking before each tool.

## [0.4.2.0] - 2026-09-15

### Added

- **Rename a running agent.** Double-click an agent's tab, or press the pencil
  button in the terminal header, to give it a new name. Only the agent's owner
  can rename it, and the change reaches every connected browser at once, along
  with the pixel office, the explorer sidebar, and any job card the agent is
  working. The name survives a server restart. The agent's worktree directory
  and branch keep their original codename, so nothing moves under a running
  session.

## [0.4.1.0] - 2026-09-11

### Added

- **A job can run on Codex.** The job form has an **Agent** select, Claude Code
  or Codex, and the board's `post_job` tool takes an `agent`. A card an agent
  files defaults to the CLI it is itself running on; a card a person files
  defaults to Claude Code. Codex has no `--permission-mode`, so a Codex card
  offers board default, `auto` (Codex's own default) and `bypassPermissions`
  (`--dangerously-bypass-approvals-and-sandbox`); a board set to any other
  mode maps onto Codex's nearest flag, so a read-only board stays read-only
  for a Codex card. A Codex card is told to run `$ship` rather than `/ship`,
  shows a `codex` chip on its face, and reads back as such through the
  board's `list_jobs` and `read_job` tools.

### Fixed

- **A card edited while its agent was spawning no longer runs the old text.**
  The dispatcher builds the agent's command, then spends seconds creating the
  worktree and process, and only afterwards claims the card. An edit landing
  in that window used to leave the agent running the previous prompt, in the
  previous repository, under a card that read otherwise. The claim now
  compares the command it actually spawned, and the repository, against the
  card as it stands, and abandons the spawn on any difference; the next scan
  sends the card out as it now reads.
## [0.4.0.0] - 2026-09-11

### Added

- **Ask Codex to manage the job board.** Newly launched Codex agents can now
  post, list, read, and edit jobs through the same board tools as Claude Code.
  The connection is configured automatically for each session, preserves your
  other MCP servers, and keeps the session credential out of command-line
  arguments and inherited environment variables.

## [0.3.33.0] - 2026-09-04

### Added

- **A permission mode you can actually reach, at two levels.** The board's
  toolbar has a **permissions** select -- the mode every dispatched agent gets
  unless its card says otherwise -- and the job form has a **Permissions** field
  for one job on its own. A card left on "Board default" stays genuinely unset
  rather than taking a copy of today's board setting, so changing the board
  still moves every card queued behind it. A card that does carry its own mode
  shows it as a chip on its face, because the mode decides how much that agent
  may do without asking. Only a card still in To do can be given one, which is
  the rule the board already applies to every other edit: past To do, its agent
  has already been handed the card. An agent posting a card through the board's
  MCP tool cannot set the mode -- those cards always inherit the board's.

### Fixed

- **A job on a machine without auto mode no longer waits at every permission
  prompt.** Board agents dispatch with `--permission-mode auto`, whose
  classifier needs a supported model and an organisation that has not switched
  it off. On an Amazon Bedrock or Vertex account running an unsupported model,
  or behind `permissions.disableAutoMode`, it simply isn't available -- and
  Claude Code does not say so. It quietly starts the session in Manual instead,
  so the agent works normally right up until it needs your permission for
  something and then stops, waiting for a person who isn't watching. Every job,
  every time. Until now there was nothing you could do about it from inside the
  app; the two controls above are the fix. Set the board's permissions once on
  a machine like that, or give a single card what it needs.

  `auto` stays the default, and deliberately so rather than for want of an
  alternative. Its classifier is the only thing that reviews a dispatched
  agent's actions before they run, and a job agent's prompt is your card text
  plus whatever it reads out of the repo. Under `bypassPermissions` nothing
  reviews anything: the agent runs shell commands and edits files with nothing
  asking you first, as you, with your access, and the only thing keeping it
  inside its own worktree is its own good behaviour. That is a reasonable trade
  to make on purpose -- point the board at repositories whose contents you
  trust, the same way you would only hand an Agent 007 login to someone you
  would give an SSH account -- and a bad one to end up in by accident, which is
  why it is a mode you pick rather than a mode you get.

  A note on how the setting is stored, because it changes once here. The board
  writes its settings to `~/.agent-007/config.json` the first time the
  dispatcher starts, so every board that has ever run already has a permission
  mode saved that nobody chose -- there was no way to choose one until this
  release. Those saved values are treated as unset, once, and the default
  applies. In practice nothing moves: the saved value and the default are both
  `auto`. From now on a mode you pick in the toolbar is recorded as a choice
  and is never overwritten by a future default.

  One thing no permission mode changes, so that `bypassPermissions` isn't
  mistaken for hands-off dispatch: Claude Code asks you to trust a directory
  the first time it runs there, and every board job gets a brand-new worktree,
  so each job still needs one click before it starts. The mode decides what
  happens after that click, not whether there is one. And the first session you
  ever start with permissions bypassed asks you to accept responsibility once
  and remembers -- until that is answered by hand, an agent in that mode waits
  there instead of working.

## [0.3.32.1] - 2026-09-04

### Fixed

- An agent waiting on a multiple-choice question is no longer mistaken for one
  that has gone quiet. The dialog is recognised by its footer line, but the
  server was reading the terminal one chunk at a time rather than one line at a
  time -- so whenever a chunk boundary happened to land in the middle of that
  footer, the line arrived as two halves, matched nothing, and the agent was
  filed as resting: no thought bubble, and after a few seconds it walked off to
  a conference seat with the question still on screen. About one dialog in five
  landed that way, which is why it looked intermittent. Terminal output is now
  reassembled into whole lines across chunk boundaries, escape sequences
  included.

## [0.3.32.0] - 2026-09-04

### Added

- A scheduled job can be paused. **Pause** on the card holds every further run
  while the card stays in To do, and **Resume** starts it again; until now the
  only ways to stop a schedule were to stop the whole dispatcher or delete the
  card. Pause is offered during a run as well as between runs -- **End run**
  stops the run that is going, Pause stops the ones after it -- and a run
  already under way is left to finish. Resuming sets the next run from that
  moment: a card paused for a week does not fire the instant it comes back.

## [0.3.31.1] - 2026-09-04

### Fixed

- An agent running a plain shell no longer paces between its desk and the
  sofas. Resting agents wait out a quiet window before they wander off, so
  that a pause between commands doesn't send them on an eleven-second walk
  that the next line of output cancels -- but the window only covered the
  state a TUI agent rests in. A shell rests in the other one, so every bash
  terminal walked out and snapped back every few seconds, forever. Both rest
  states now wait the same window.

## [0.3.31.0] - 2026-09-04

### Added

- Clicking one of the whiteboards painted on the office wall opens the Jobs
  tab. The boards already mirror the board's three columns, so they were the
  one part of the room that showed job state and did nothing when you clicked
  it. The whole board is the target, frame and stand, and a click anywhere
  else on the wall or floor still falls through to the agents.

## [0.3.30.2] - 2026-09-04

### Changed

- The README screenshot is current again: it shows the office with the
  conference table, the lounge sofas and the seated agents, alongside a live
  agent terminal.
- The test workflow is now two workflows, one per operating system, so the
  README carries a separate badge for Ubuntu and for Windows. Both runners run
  exactly the same suite they ran before; the split is what makes the two
  results visible separately, because a badge points at a workflow file rather
  than at one job inside it.

## [0.3.30.1] - 2026-09-04

### Fixed

- Agents sitting down in the office now actually sit. They were drawn standing
  — the character art has a separate seated pose, the one already used at the
  desks, and the sofas and conference chairs were using the standing one, so
  everybody looked like they were perched on top of the furniture rather than
  in it. Sofa sitters and the four side seats at the conference table now use
  the seated pose and settle onto the cushion. The head and foot of the table
  keep the standing pose on purpose: the tabletop and the chair back are drawn
  over their legs, so nothing shows.

## [0.3.30.0] - 2026-09-03

### Added

- Agents that have been quiet for a few minutes now get up from their desks,
  walk over to the sofas in the lounge areas and sit down until there is work
  for them again. The office has had an idle-wander since the conference table
  landed, but nobody had ever seen it: it only triggered on a state no Claude
  agent can actually reach, and the conference table it walked to only exists
  on a canvas about 970px tall, which is taller than the office panel on a
  normal laptop. Both are fixed, and the sofas are always there, so a quiet
  office now has agents milling about in it at any window size. An agent that
  has merely paused to think stays at its desk — the walk takes longer than
  that pause, so it would only turn around halfway. A sitter is still one click
  away: clicking the character on the sofa focuses its terminal, same as
  clicking its desk.

### Fixed

- An agent waiting on a multiple-choice question now stays at its desk instead
  of wandering off mid-question. The board reads a terminal to tell what an
  agent is doing, and the footer those questions print ("Enter to select ...
  Esc to cancel") was not recognised, so the agent looked like it was simply
  resting.
- A single agent printing one very long line no longer slows the whole board
  down. Reading a terminal to work out what its agent is doing means matching
  a handful of patterns against the last few lines, once a second per agent,
  and on a line tens of thousands of characters wide that match took seconds —
  stalling every other agent's terminal, the job board and the web UI along
  with it. Those lines are now trimmed before they are examined.

## [0.3.29.3] - 2026-09-03

### Fixed

- An idle agent walking over to the conference table now checks that its way is
  actually clear. Two legs of that walk were picked from the table's shape
  alone: the row it crossed the room on was a fixed offset above the tabletop,
  and the lane it came down beside the chairs never looked at the furniture at
  all. If anything stood between the conference set and that row — a plant, a
  spare desk, a pod rug in a tight room — the agent walked straight over it.
  The crossing now runs along the same clear-row scan the walk in and out
  already used, and the lane is vetted against the furniture, stepping a little
  wider when it is blocked. The head chair is still approached straight down
  its own column, and the last step in still goes between the chairs. On the
  open floor the set usually sits in, the walk is unchanged apart from crossing
  just above the chairs rather than over the tabletop.

## [0.3.29.2] - 2026-09-03

### Fixed

- An agent leaving a seat at the conference table now checks that the way out
  is actually clear. It steps out sideways from between the chairs, as before,
  but that step-out column was picked from the table's shape alone: if anything
  stood between the conference set and the corridor — a plant, a spare desk —
  the agent walked straight down over it. The column is now vetted against the
  furniture the same way every other walk is, and the agent steps a little
  wider when it is blocked. On the open floor the set usually sits in, the
  route is unchanged.

## [0.3.29.1] - 2026-09-03

### Fixed

- An agent walking to or from its desk no longer jumps sideways when someone
  else joins or leaves the office mid-walk. The walker's route was rebuilt from
  the current furniture on every frame while its progress along it ran on the
  clock, so a spawn that changed the room re-projected the walker onto a
  different route — at 900x800 with two repos, a walk could snap a whole desk
  over. The route is now fixed when the walk starts and only rebuilt when the
  canvas resizes.

## [0.3.29.0] - 2026-09-03

### Added

- An agent you are talking to can now read the job board back to you and change
  a card you have not started yet, not just post one. "What is queued?", "what
  does that card say?", "add the repro steps to that one" — the board answers
  through the same MCP tool surface `post_job` already used, so no setup and
  nothing new to learn. A card's id comes back with the listing, which is what
  the read and edit tools take.

### Changed

- A job card stops being editable the moment it leaves To do, for you as well as
  for an agent. Its agent was handed the title, detail and attachments in its
  prompt when the board dispatched it, so an edit afterwards changes nothing
  about the run and leaves the card describing work nobody was asked to do. The
  board's Edit button has only ever appeared on To do cards; now the rule holds
  wherever the request comes from. The cost: retitling a card in Review so the
  archive reads better is no longer possible.
- An agent cannot rewrite a card someone else queued, and an edit it does make
  is announced and marked on the card. A To do card's detail is the next agent's
  prompt, so an unnoticed rewrite is the one edit that matters most.

### Fixed

- A malformed tool call naming a built-in JavaScript property (`valueOf`,
  `toString`) made the board's MCP server return an error page or a nonsense
  result instead of "unknown tool".

## [0.3.28.0] - 2026-09-02

### Fixed

- Agents walking in and out of the office no longer step over the furniture on
  their way to the desk. The route already crossed the room on a clear floor
  row; the up-or-down leg went straight down the desk's own column, over
  whatever rugs, plants and sofas happened to lie between it and that row.
  It now drops down the nearest clear aisle and comes in along the desk's own
  row instead, without walking over the colleagues seated in its own pod, off
  the edge of the room, or out to an aisle it would only have to double back
  over. Agents heading to and from the conference table take the same clear
  aisle. Swept over 6,825 desk positions: 40% fewer routes cross furniture and
  48% fewer cross a colleague's desk, for 2% more walking.

## [0.3.27.3] - 2026-09-02

### Fixed

- The chair at the head of the conference table faced the wrong way and sat in
  the wrong place. It showed the back of a chair, as if its occupant had turned
  away from the table, and it floated in the open floor above the table rather
  than tucking into it. Both came from measuring against the table sprite's box
  instead of the tabletop it paints: the sprite's top sixth is empty, so the
  painted edge is well below where the chair was placed. The head chair now
  faces the room, stands with its feet against that edge, and uses a new
  front-facing chair sprite whose seat cushion catches the light the way the
  side chairs' do. It sits at the table rather than tucking under it, because
  it draws behind the table: overlap that reads as tucked-in on the foot chair
  would simply eat this one, leaving a stub too small to read as a chair.
- Sparser offices get their conference table back. The previous release grew the
  set to make the misplaced head chair visible, which pushed the table out of
  the room entirely on smaller panels. Tucking the chair where it belongs needs
  no extra height, so those layouts seat again.

## [0.3.27.2] - 2026-09-02

### Added

- The conference table now has a chair at the head as well as the foot, so an
  empty top seat reads as a seat instead of bare floor. The head chair sits a
  little higher above the tabletop than its occupant does, which is what lets
  any of it show — the person facing you would otherwise hide it completely.
  How much higher is capped by what the room can spare: a taller chair back
  starts costing the whole conference set on smaller panels.

### Fixed

- The walk in/out route now measures the conference set from the same constant
  the set is built from, instead of a copy of its old height. A route could
  otherwise corridor straight through the top of the set whenever that height
  changed.

## [0.3.27.1] - 2026-09-02

### Changed

- The chairs around the conference table are slate blue instead of bright
  green, so the meeting area sits with the rest of the office instead of
  jumping out of it. The chair sprite only ever shipped in one colour, so the
  two 16x16 PNGs are recoloured in place onto the same blue-grey ramp the
  desks use (`#595d79` / `#4a4e68` / `#3a3e55`). Pixel shapes and transparency
  are unchanged, so nothing about the office layout moves.

## [0.3.27.0] - 2026-09-02

### Fixed

- Agents walking in and out of the office no longer drop to the bottom-left
  corner first. The route now comes in at the left edge on the empty floor row
  nearest the desk, crosses that row, and takes the desk column. There is no
  fixed door — the entrance rides the row, so it sits higher or lower with the
  desk. The row is picked from the furniture on the floor that frame — pod
  rugs, spare desks, the chat areas and plants, and the conference set with its
  chairs — so the walk no longer cuts through the sofas along the bottom edge.
  Most panels are too dense for a row that clears a whole character (the gaps
  run 18-54px against a 64px sprite), so when none fits the widest gap takes
  the crossing and the walker's feet ride its floor. Only a pod grid that
  already overflows the panel falls back to the desk's own row.

## [0.3.26.1] - 2026-09-02

### Changed

- Agents now enter and leave the office through the middle of the left wall
  instead of the bottom-left corner. A new agent walks in from the left edge,
  halfway down the floor, and a departing one walks out the same way along
  the clear left strip and the corridor above the conference table (or the
  bottom edge when there is no table). Spare desks and the conference set
  now keep that strip clear on narrow panels.

## [0.3.26.0] - 2026-09-02

### Added

- Attach screenshots and files to a job. The job form has an **Attach files**
  button, and pasting an image into Details attaches it as a screenshot.
  Files are kept outside the repository, so nothing can end up committed by
  accident, and the dispatched agent is told where to read them. Each card
  lists its attachments as links that open in a sandboxed tab. Up to 20
  files, 10MB each and 50MB in total; a file that cannot be stored is
  refused with a message rather than silently dropped. The files are freed
  when the card reaches Done: the archived card keeps its record and PR
  link, but the run its files were input to is over.

### Changed

- Attachments can only be changed while a card is in To do, the same rule
  that already applied to its repository: an agent mid-run was handed those
  paths when it started.
- An edit that is refused (a bad schedule, an oversized file) now changes
  nothing at all, instead of leaving the text edits half-applied.
- Terminal uploads and job attachments share one file-name sanitiser, which
  now also prefixes Windows device names (CON, NUL, COM1) so a file can
  never be written to a device.

## [0.3.25.0] - 2026-09-01

### Added

- A conference table in the open floor between the desks and the chat areas:
  a vertical boardroom table with cushioned chairs at thirds down both sides,
  one at the foot and a free seat at the head (sprites from pixel-agents,
  MIT). Idle agents wander over and sit there until their state changes,
  then walk back to their desks. The set only places while the band fits it,
  so it yields on short panels just like the rest of the decor.
- Clicking a seated agent at the conference table switches to its terminal —
  click-to-focus follows the character wherever it is.

### Changed

- The bottom decor: the single centred chat area is now a chat area in each
  bottom corner, with the leafy plant stacked above the cactus between them
  as a small divider drawn at 1.25x (down from 2x). The walk-in entrance
  moves to the bottom-left corner strip the chat margin leaves free.
- Walkers route around the conference set: wandering, arriving and departing
  agents climb clear lanes and cross a corridor above the table instead of
  driving through the tabletop or chairs.
- Idle agents already seated when the page connects render seated — no
  replayed commute — and colleagues' read-only agents stay at their desks,
  where their dimming and owner label live.

### Fixed

- A conference sprite that fails to load can no longer make an idle agent
  invisible: characters always draw, with or without their furniture.
- A departing agent walks out from wherever it actually is — its conference
  seat, or its current point mid-walk — instead of snapping to a desk first.
- Message bubbles no longer float over an empty desk while their agent is
  walking the floor.

## [0.3.24.0] - 2026-09-01

### Added

- A sparse office now shows a row of empty spare desks below the real one:
  dark screens, no chair filled, no rug, so the room reads as unassigned
  seats rather than bare floor. They sit on the same desk grid and vanish as
  soon as a second row of real desks is needed.
- A centred chat area at the bottom of the floor: two side sofas either side
  of the coffee table, a front-facing sofa above it, on its own gold rug.
  A leafy plant stands in the bottom-left corner and a cactus bottom-right.
  Like the old decor, all of it yields and disappears as desks fill the room.
- A low bookshelf run under each window, tight against the wall, drawn from
  the same Antea office set as the desks.

### Changed

- The wall plants between the job boards, the bottom-left lounge corner, the
  bottom-right floor plant and the top-corner pots are gone, replaced by the
  bookshelves, chat area and corner plants above.
- Characters now walk in and out from the bottom-left of the floor, beside
  the corner plant, instead of the bottom centre where the chat area is.

### Removed

- The unused `plant_big.png` and `large_plant.png` sprites.

## [0.3.23.2] - 2026-09-01

### Fixed

- The pixel office's plants are smaller: every plant sprite (the wall cactus
  and leafy plant, the floor plant, the corner pots) now draws at 1x so it reads
  as desk-side decor, shorter than a job board, instead of standing as tall as
  a person. Being smaller, the corner and floor plants also fit in offices that
  used to be too crowded for them.
- The two back-wall plants are centred in the gaps between the three job
  boards, computed from the boards' positions, so they no longer overlap a
  board edge and stay centred when the panel is resized. On a panel too narrow
  for boards they stay out of the way too.

## [0.3.23.1] - 2026-09-01

### Changed

- The wall hangings (clock and two small paintings) added in 0.3.22.0 are
  removed again; the back wall beside the job boards is bare plaster.
- The break-room sofa is now a side view that faces right, toward the coffee
  table, instead of facing the viewer.

## [0.3.23.0] - 2026-09-01

### Changed

- Desk pods in the pixel office now sit just below the job boards instead of
  floating in the middle of the floor. With only a few agents the empty wood
  collects at the bottom, where the sofa and plants live, rather than as a
  dead band under the boards. A busy office that fills the floor lays out
  exactly as before.

## [0.3.22.0] - 2026-09-01

### Changed

- The pixel office no longer repeats one potted plant everywhere. Each window
  now gets a single plant of its own — a cactus by the first, a leafy plant by
  the second — and no plant sprite appears more than twice in the room.
- The bottom-left corner is a small break room: a real sofa sprite next to a
  coffee table with a coffee pot on it, replacing the drawn-by-hand sofa. A tall
  floor plant stands in the bottom-right corner. As before, the decor yields to
  desk pods as the office fills up.
- The back wall carries a clock and two small paintings beside the job boards
  (above them on the default narrow panel), so the plaster is no longer bare
  between the windows.
- Sprites come from the pixel-agents project (MIT) and are attributed in the
  README; a sprite that fails to load is simply skipped.

## [0.3.21.2] - 2026-09-01

### Fixed

- The sofa and the corner plants along the bottom of the office are no longer
  cut off mid-sprite. The canvas was being sized to the whole office panel,
  header included, so its bottom band hung below the panel edge and was
  clipped; it now fills exactly the area under the "+ Agent" / "+ Job" bar.
  Desks sit correctly centered in that space and click-to-focus, panel
  resizing, and the agent walk-out animation all measure the same box. While
  the diff viewer hides the office, the canvas keeps its last real size, so
  agents who leave while a diff is open still walk out from their own desk
  and dispatch papers already in flight are not dropped.

## [0.3.21.1] - 2026-09-01

### Fixed

- The rug under each repo's desk pod is visible again in light mode. It was
  tinted with the theme accent, and the light theme's darker gold is almost
  the same colour as the wood floor, so the rug disappeared. The rug now uses
  the same fixed gold in both themes, like the rest of the office furniture;
  the repo label keeps the theme's text colour.

## [0.3.21.0] - 2026-09-01

### Changed

- Every desk in the pixel office now faces front again. Desks inside a repo's
  pod sit in a plain classroom grid (up to four across, wrapping into rows
  with a full aisle between them), so every monitor screen stays readable and
  an agent's facing always tells you its state: back to you means working,
  facing you means idle or waiting. A narrow panel drops to fewer columns
  instead of turning desks around.

### Removed

- The face-to-face desk pairs from v0.3.19.0, along with the monitor-back
  sprite and the facing-pair screenshots. A turned desk hid its screen and
  made a typing agent face the same way as a waiting one.

## [0.3.20.0] - 2026-09-01

### Added

- The pixel office now shows cause and effect in motion. When the job board
  dispatches a job, a small paper flies from that job's whiteboard column down
  to the new agent's desk. A newly spawned agent walks in from the office
  entrance to its desk and sits; an exiting agent stands up and walks out
  before its desk disappears — including agents the server retires, such as
  board agents closing after opening their pull request.
- Animations respect your system's reduce-motion setting (agents appear and
  disappear instantly), never replay on page load for agents already running,
  and skip entirely while the tab is in the background.

## [0.3.19.0] - 2026-09-01

### Changed

- Desks in a pod now pair up facing each other across a shared aisle, the way
  a real office arranges them: the top desk of each pair turns toward you, its
  character seated behind it with the monitor's back to the aisle, while its
  partner faces it from the other side. A waiting agent at a turned desk reads
  instead of typing so its state stays readable, a lone agent keeps the
  familiar single desk, and an odd agent out takes a default desk at the end
  of the pod without leaving an empty row under the rug.
- Each agent's desk style now sticks to the agent (like its character sprite)
  instead of its position in the room, so desks no longer restyle when an
  unrelated agent leaves.
- On narrow panels, a full-width pod now leaves room for its rug border
  instead of letting the rug clip at the panel edges.

## [0.3.18.0] - 2026-08-31

### Changed

- The pixel office now seats agents in per-repo pods: agents working on the
  same repo share a rug labeled with the repo name, and separate repos sit
  visibly apart. Agents without a repo (bash terminals) get their own
  unlabeled pod. With a single repo the desk layout is unchanged — the
  shared labeled rug is the only addition.
- Leftover floor space fills with ambient furniture — a sofa-and-plant
  corner and potted plants — that yields and disappears as desks crowd
  the room.

## [0.3.17.0] - 2026-08-31

### Changed

- The agents in the pixel office are now real pixel-art characters (six
  variants from the pixel-agents sprite pack) instead of procedurally drawn
  figures. A working agent sits typing at its keyboard, an agent waiting for
  you turns around in its chair to face you, and an idle agent stands by its
  desk. Each agent keeps the same look for as long as it runs.

### Removed

- The old procedurally drawn character code (~150 lines of fillRect art).

## [0.3.16.0] - 2026-08-31

### Changed

- The whiteboards in the pixel office now show the real job board: each board
  pins one paper per job in its column (To do, In progress, Review), updates
  the moment the board changes, and notes "+N" when more jobs are queued than
  fit on the board. An empty column shows a clean board instead of decorative
  paper.

## [0.3.15.0] - 2026-08-31

### Added

- Repo sections in the file explorer can now be collapsed: click a repo
  header (or focus it and press Enter/Space) to fold that section away and
  click again to bring it back. A collapsed header still shows how many
  agents live inside and a colored dot for the most urgent agent state, so
  nothing important goes quiet just because a section is folded. Which
  sections are folded is remembered in the browser, so a page refresh keeps
  your layout.

## [0.3.14.0] - 2026-08-31

### Added

- The "+ Agent" dialog now offers one-click presets — Claude Code, Codex,
  Gemini, and Bash — so starting an agent no longer means typing its command.
  Picking one fills the Command field under Advanced, and the shell preset
  follows the server's operating system: PowerShell on a Windows server, Bash
  everywhere else.

### Fixed

- A quiet Codex or Gemini agent no longer reads as idle: state detection now
  treats `codex` and `gemini` commands as TUI sessions, so their workstations
  show waiting (green) at a quiet prompt instead of idle gray.

## [0.3.13.1] - 2026-08-31

### Changed

- The README now says what the last few releases made true: Agent 007 runs on
  macOS, Linux, and Windows — spawning agents, adding repositories, and
  browsing paths all handle Windows natively, and CI runs the test suite on
  both Ubuntu and Windows. It also names the one Windows caveat: the per-agent
  MCP config file's token protection is POSIX permissions, which Windows
  doesn't have.

### Fixed

- The README's and CONTRIBUTING's node-pty links pointed at a personal fork;
  they now point at microsoft/node-pty, where the dependency actually lives,
  and the Windows requirement names Visual Studio Build Tools instead of the
  deprecated windows-build-tools.

## [0.3.13.0] - 2026-08-31

### Added

- A theme-token sync test (`test/theme-tokens.test.js`) that fails if the
  palette in DESIGN.md, the CSS light-theme tokens, and the terminal's core
  colors drift apart.

### Changed

- Light mode is easier on the eyes: panels and the terminal now sit on warm
  low-glare cream surfaces instead of near-white, with warm near-black ink
  and a darker gold accent, tuned to WCAG AA contrast on the panel surfaces.
- Light-mode state colors, terminal ANSI colors, and text selection were
  retuned for the cream background so nothing washes out.

### Fixed

- Diff add/delete highlighting, row-hover feedback, the office watermark,
  and primary-button labels were unreadable in light mode; each now has a
  light-theme-aware color.
- Toggling the theme with no agents running repaints the office canvas
  immediately instead of leaving it in the old theme's colors.

## [0.3.12.3] - 2026-08-30

### Changed

- CI runs the test suite on windows-latest as well as ubuntu, so a change that
  passes locally on macOS/Linux can still go red on the Windows leg.

### Fixed

- A `.gitattributes` file forces LF line endings at checkout. Without it,
  Windows checkouts got CRLF, and the `\r` after `server.js`'s shebang line
  broke Vite's transform of that file — the whole `test/server.test.js` suite
  died at collection with "Invalid or unexpected token".
- On Windows, Vitest's test and hook timeouts are 30s instead of 5s/10s: the
  git-heavy worktree tests run 5-12s on a Windows CI runner and were timing
  out.

## [0.3.12.2] - 2026-08-30

### Fixed

- The test suite passes on Windows. `test/server.test.js` used to fail before a
  single test ran because Vite tried to transform node-pty's native addon; the
  test runner now leaves node-pty alone. Three assertions that assumed `/` path
  separators or POSIX permission bits no longer fail on a Windows machine, and
  the owner-only check on the agent MCP config file still holds on Linux and
  macOS.

## [0.3.12.1] - 2026-08-30

### Changed

- **The office whiteboards are the job board.** The three whiteboards on the
  office canvas now read TO DO, IN PROGRESS and REVIEW, the columns of the Jobs
  tab, instead of the made-up JOBS / HIRE / OPEN. They also stand almost
  against the back wall, level with the plant pots, rather than out on the
  floor. A test keeps the three titles in step with the Jobs tab's columns and
  the server's job states, so renaming a column can no longer leave the office
  showing something else.
- Each whiteboard's heading underline now matches the heading's width instead
  of a fixed fraction of the board.

## [0.3.12.0] - 2026-08-30

### Added

- **Scheduled jobs.** A job card can now be a standing one that fires on a cron
  schedule instead of being dispatched once. Pick "Scheduled" in the job form and
  give it a schedule — `0 9 * * 1-5` for weekday mornings, or one of `@hourly`,
  `@daily`, `@weekly`, `@monthly`, `@yearly` — and the board runs it every time
  it comes due, in the server's local time. The card shows its schedule, when it
  next fires, and how many times it has run.
- A scheduled job does not have to be a coding task, so its prompt is just the
  task plus one line about assuming rather than asking. When the run goes quiet
  the board puts the card back in To do with its next run time — and keeps the
  agent's terminal open so you can read what the run wrote; the next run, or
  closing the tab, retires it. It cycles To do → In progress → To do and never
  reaches Review, so one card is one standing job — neither the pull-request
  watcher nor the merged-PR sweep will file a scheduled card away, even when a
  run's work happens to open or merge one.
- Agents can post a scheduled card too: `post_job` and `POST /api/jobs` take an
  optional `schedule`, and the reply reads back the schedule and the next run
  time so a cron expression that means something other than you intended is
  visible while there is still someone in the conversation to correct it.

### Changed

- Scheduled jobs sit outside the per-repo agent cap, in both directions: a run
  in flight does not consume a slot a one-time job could use, and busy one-time
  jobs cannot hold a schedule back — missed firings are never replayed, so a
  firing starved by the cap would simply be lost.
- Existing jobs are now called **one-time** jobs. Nothing about them changed —
  they are dispatched once, move to Review when their pull request appears, and
  stop there. Cards posted before this release are one-time jobs.
- The Jobs tab's attention badge and a card's status pill both know the
  difference between an agent that went quiet with work unfinished and a
  scheduled run that simply ended. A finished run no longer asks for your
  attention.

## [0.3.11.1] - 2026-08-28

### Fixed

- Agents start on Windows. Spawning or re-spawning one used to kill the whole
  server with `Cannot create process, error code: 2`, taking every other agent's
  terminal down with it. `claude` installs from npm as `claude.cmd`, and the
  Windows console host only ever looks for a `.exe`, so it never found the
  command it had just been told existed. Agent 007 now hands it the full path to
  a file Windows can actually launch.
- Re-spawning an agent whose worktree was deleted says so on that one tab
  instead of ending the session. Windows reports a missing working directory
  after the terminal has already been handed back, far too late for the old
  error path, so the directory is checked before the terminal is opened. Any
  other console-host failure is now contained to the agent it belongs to.
- Adding a repository works on Windows. Every path you could type was rejected
  as "Path must be absolute", because the check looked for a leading slash and
  an absolute Windows path starts with a drive letter.
- The repository browser opens where you point it. Typing a Windows path and
  clicking Browse used to send you to your home directory, and at the top of a
  drive the "up" entry navigated to itself instead of stopping.

## [0.3.11.0] - 2026-08-28

### Added

- **A merged pull request takes its card off the board.** Jobs gain a fourth
  state, `done`, with no column. The Review column exists to hold the short list
  of things a human still has to look at; letting merged work pile up in it made
  it an archive nobody read. The job itself is kept, not deleted, with its agent,
  branch and PR link intact.
- **View finished jobs.** A toolbar toggle swaps the columns for the archive,
  newest first, each card saying when it merged. A Review card also gains
  "✓ Done" to file one away by hand, for a merge the board cannot see; it asks
  first, because done is the end of a card's life on the board. A finished card
  cannot be moved back — follow-up work on merged code is a new job, and the
  archived card is the record to point at. Deleting it is the only other option.

### Fixed

- The board no longer confuses "some pull request on this branch merged" with
  "this card's pull request merged". `gh pr list --head` matches the head ref
  *name*, and that name outlives the branch: a merged PR stays in the listing
  forever, and board branch names are reused once the branch is deleted at
  retirement. The sweep now matches on the card's own PR number, or on a merge
  that postdates the current attempt. Without it a stale merge filed a card away
  while its real pull request was still open, overwriting the card's PR number
  on the way out so the open one was no longer recorded anywhere.
- A pull request that opens and merges inside one scan interval no longer
  strands its job. `--state open` cannot see a merged PR, so the open-PR watcher
  found nothing and left the card in In progress reading "agent gone" forever,
  for work that had shipped. The merge sweep now covers In progress as well as
  Review, and retires the agent when it finishes a job from there.
- A finished card can no longer be walked back onto the board and re-filed by
  the next scan. It kept the pull request that finished it, and `reviewAt` stays
  the sweep's time floor, so a job moved back to In progress carried a spent PR
  of record into its new attempt: the sweep matched that same old merge within
  five minutes, filed the card away again, and — because finishing from In
  progress retires an agent — closed whatever terminal had been re-adopted on
  the branch. Done is now terminal, enforced on the server rather than only in
  the UI, so the whole class of problem is gone.
- The "cannot check for a pull request here" note no longer follows a card into
  the archive still telling the user to move it by hand.

### Changed

- One `gh auth status` and one `gh auth token` per account now serve a whole
  scan instead of being re-run for every job, with a one-minute cache. Signing
  in or out is still picked up promptly.
## [0.3.10.1] - 2026-08-28

### Changed

- **Dispatched agents now finish with /ship alone.** The job prompt used to end
  with "run /review, fix, re-review, then /ship" — a hand-written description of
  what /ship already does on its own. Its pre-landing step dispatches the same
  specialist review army /review does (the two skills share the section file)
  and runs the same auto-fix-and-loop cycle afterwards, so every dispatched job
  paid for that army twice, and the first pass reviewed the pre-merge tree that
  /ship's base merge was about to replace. The prompt now names /ship as the
  single finishing step and no other skill: an agent arrives with no memory of
  the rest, and naming one to forbid it is what puts it on the table.

## [0.3.10.0] - 2026-08-28

### Changed

- Clicking a job that is in progress now opens that agent's terminal. Before,
  only the small status pill at the bottom of the card was a jump target, which
  is a hard thing to find and a harder thing to hit; the obvious gesture, which
  is to click the job you want to look at, did nothing. The whole card is now
  the target, and it lights up on hover to say so. The pill still works and
  remains the keyboard path, so nothing that used to work has moved. Clicks on
  the card's own buttons, on its pull request link, and clicks that finish
  selecting text on the card are all left alone.

## [0.3.9.0] - 2026-08-28

### Changed

- The couch nooks along the office wall are gone. In their place stand three job
  boards: whiteboards on A-frame easels, out on the floor rather than hung on the
  wall, each one with paper job posts pinned to it under a marker-written heading.
  The boards cap themselves to the wall section they stand in, so they never drift
  under a window, and they step aside entirely on a panel too narrow to hold one.
  The potted plants now draw behind the boards, which is the right way round: the
  plants sit against the wall, the easels stand in front of them.

## [0.3.8.0] - 2026-08-28

### Added

- You can now ask an agent you are working with to put a job on the board. Say
  "add that to the job board" and it posts the card itself, so noticing work no
  longer means stopping to type it into the form. The board reaches every Claude
  Code agent as an MCP tool, which is what makes it discoverable — the agent can
  see the tool without being told it exists — and Claude Code still asks you to
  approve the call, so nothing is filed behind your back. The card lands in To do
  showing "via <agent>" beside whoever it belongs to, and runs in that terminal's
  repo unless the agent names another.
- `POST /api/jobs` does the same thing over plain HTTP, for agents that cannot
  take a per-invocation MCP config.

### Changed

- Routes under `/api` now require a *user* token by default. The new agent
  session token reaches only the two places that are meant for it; anything added
  later is people-only unless it deliberately says otherwise.

## [0.3.7.0] - 2026-08-28

### Added

- **"+ Job" in the top bar.** Posting a job no longer starts with hunting for
  the Jobs tab. The button sits in the office header and does the whole trip in
  one click: it brings the board up, switches the panel to it, and opens the new
  job form with the title field already focused. The spawn button beside it is
  now labelled "+ Agent", so the two read as the pair of things you can start.

### Fixed

- Opening the job form while the agent spawn form was up no longer swallows what
  you type. The spawn form covers the panels but not the header strip, so both
  header buttons stay clickable underneath it. Either button now closes the
  other's form first, instead of leaving a focused text field hidden behind the
  overlay.

## [0.3.6.0] - 2026-08-28

### Fixed

- A finished job card now shows what it produced. One card reached Review with
  its pull request open and displayed nothing but its title: the agent's name was
  discarded on restart, the branch was only drawn as part of the agent line so it
  vanished with it, and a card moved to Review by hand never looked up its pull
  request. The name is kept as a record of who did the work, the branch stands on
  its own, and a manual move fetches the pull request once.
- A card no longer claims the board is still waiting for a pull request directly
  above the number of the one it just found.
- Agents are identified in a way that cannot be reused between runs. Previously a
  finished card could point at a slot number that a completely different agent
  later occupied, so it reported an agent alive that had nothing to do with it.
- Sending a job back to To do now clears the note explaining why its pull request
  could not be checked, so a fresh card no longer reports a failure against work
  that has not been attempted yet.
- Moving a card to Review by hand no longer attaches a pull request to it if you
  send the job back to To do while the lookup is still running.

## [0.3.5.0] - 2026-08-28

### Fixed

- An agent whose job reaches Review is now retired even when the board had lost
  track of which agent it was. A restart clears that link, so a job whose pull
  request turned up afterwards moved to Review with its agent still running,
  holding a worktree for work that had already shipped. The branch identifies
  the agent instead, since it outlives a restart.
- Agents already sitting in Review are deliberately left alone. If you reopen an
  agent on a branch whose pull request is already up, to deal with review
  comments, it stays yours — the board only retires an agent at the moment the
  job moves to Review, never afterwards.

## [0.3.4.0] - 2026-08-28

### Fixed

- The job board tries every GitHub account you are signed in to before deciding
  it cannot find a pull request. If you keep more than one account on a machine
  — one for your own repositories, another for an organisation's — a private
  repo is usually visible to exactly one of them, so the signed-in account
  failing said nothing about whether the pull request existed. Jobs in the
  "wrong" repository could never complete. The account that answers is
  remembered per repository, so the usual case stays a single lookup.
- The job board now tells you when it cannot check for a pull request, instead
  of looking like the agent went quiet. If the `gh` account signed in on this
  machine cannot see a repository — the wrong account for that organisation, a
  renamed repo, no access — every job in it used to sit in progress forever with
  its agent still running and its worktree still held, and the only clue was a
  card reading "quiet, may need you", which points at the agent rather than at
  the real cause. The card now names the reason and tells you to move the job by
  hand. It clears itself as soon as the check works again.
- Re-adopting an agent after a restart reconnects it to the job it was working
  on. Before, the card kept saying its agent was gone while the agent was
  visibly running, the job stopped counting toward the per-repo limit so the
  board could start a second agent on the same work, and when the pull request
  arrived the board could not close the agent or release its worktree. The two
  are matched by branch name, which is the one thing that survives a restart.

## [0.3.1.1] - 2026-08-28

### Fixed

- Job board agents no longer stop one step short of opening their pull request.
  An agent would finish the work, review it, fix what the review found, and then
  end its turn announcing that shipping was next — leaving the job parked at a
  prompt with everything uncommitted, because nothing was there to tell it to
  carry on. The instructions a dispatched agent receives now rule that stopping
  point out explicitly, while still leaving it free to stop for a question it
  genuinely cannot answer or a failure it cannot get past.

## [0.3.1.0] - 2026-08-28

### Fixed

- New agents now start from your repository's base branch as it exists on the
  remote, freshly fetched, instead of from whatever you happen to have checked
  out. Two things went wrong before. If your local `main` had fallen behind, the
  agent quietly worked from superseded code and its pull request showed a diff
  against a base it had never seen. Worse, if you were sitting on an unrelated
  feature branch, the new agent inherited that branch's half-finished work,
  which then rode along inside the agent's pull request. This matters most for
  job board agents, which are dispatched while you are busy doing something
  else, and your checkout is least likely to be on a clean base.
- Agent 007 no longer waits on a git credential prompt that nobody can answer.
  Any git command that needs credentials now fails immediately instead of
  hanging.

### Added

- **Start from** (New Agent -> Advanced). Branch, tag or commit the agent's
  branch starts from. Leave it blank for the repository's base branch on the
  remote; set it to branch off work you have in progress. A value that does not
  exist is reported by name rather than failing later with a confusing git
  error.

## [0.3.0.0] - 2026-08-27

### Added

- **Job board.** A new "Jobs" tab in the terminal panel holds a queue of work
  across three columns: To do, In progress, and Review. A job has a title, a
  free-text detail, the repo it belongs to, who posted it and when, and once it
  starts, which agent is working on it and since when.
- **Automatic dispatch.** Start the dispatcher and every five minutes the board
  takes the oldest queued job whose repo is under its agent cap (2 by default,
  adjustable per board) and puts a fresh agent on it: a new worktree, a branch
  named after the job title, and the job text handed to `claude` in auto mode.
  The agent is told to run /review, fix, re-review, then /ship, and the board
  watches for the pull request that /ship opens.
- **A job that needs you says so.** When a dispatched agent stops to ask
  something, its card turns orange with a "needs you" badge and the Jobs tab
  shows a count. Click the badge to land in that agent's terminal, answer, and
  it carries on. A card that has gone quiet for a few minutes is flagged too,
  since an agent that finished without opening a PR looks the same as one that
  is still thinking.
- Dispatched agents open their tab quietly instead of stealing focus, so the
  dispatcher firing while you are mid-sentence no longer moves your cursor.
- When a job's PR appears, the board moves the card to Review, closes the
  agent, and releases its worktree and local branch. The pull request is
  untouched. The card keeps the agent name, branch and PR link.

### Fixed

- Agent 007 now notices when an agent is sitting on one of Claude Code's own
  dialogs, including the workspace-trust prompt that greets every agent started
  in a fresh worktree. Previously such an agent showed as merely waiting, which
  for a Claude agent is indistinguishable from idle, so it could sit unanswered
  indefinitely.
- Closing an agent whose branch is fully pushed now removes its worktree and
  local branch instead of keeping them as an orphan. Work that is uncommitted,
  or committed but never pushed, is still preserved exactly as before. The old
  check treated "not merged into main" as "unpushed", so every branch with an
  open pull request was kept forever.
- A repository whose `user.name` is set to an empty string no longer fails
  every agent spawn. Git reports success with no output in that case, so the
  fallback never fired and every branch name came out invalid.

## [0.2.2.0] - 2026-08-27

### Fixed

- `npm start` now works when Agent 007 is installed in a folder whose path
  contains a space (e.g. `C:\Users\you\Claude Code\agent-007`) or other
  special characters. Previously the server built everything, decided it
  wasn't the entry point, and exited silently with no error.
- The server also starts correctly when launched through a symlinked or
  junction path (macOS `/tmp`-style links, relocated Windows folders) and via
  `node .`.
- If the entry-point check ever misfires again when `server.js` is launched
  directly, the server now prints a clear "not auto-starting" message to
  stderr instead of exiting silently with code 0.

## [0.2.1.0] - 2026-08-24

### Changed

- The voice-input mic is now a floating button at the terminal's bottom-right,
  next to the prompt line — no more hunting for it in the header. The live
  transcript pill docks right above the mic and slides out of it when you
  click, so the reaction appears exactly where you clicked, without ever
  covering the terminal's last row (where your dictated keystrokes echo).
- Clicking the mic for the first time now asks for microphone permission
  *before* recording starts. Previously the permission prompt raced the
  recognizer: by the time you clicked "Allow", the mic had silently shut off
  and your speech went nowhere. The red recording signals now turn on only
  once the mic is truly live — while the permission prompt is open you see a
  dot-less "Requesting microphone…" notice instead.
- Repeat dictation starts faster: the microphone permission is acquired once
  per visit instead of on every mic click (and re-requested automatically if
  you revoke it mid-session).
- Better error messages: a mic held by another app, missing hardware, or a
  policy block each get their own guidance instead of a generic "access
  denied".
- Starting or stopping dictation now returns keyboard focus to the
  terminal, so the Enter that sends your prompt lands in the terminal even
  when you used Cmd+D from elsewhere in the app.
- The multiplayer presence dots moved just above the mic, keeping the
  bottom-right corner clear for the new button in logged-in sessions.
- The new voice animations (pill slide-in, recording pulse) are explicitly
  disabled under the system reduce-motion preference.

## [0.2.0.0] - 2026-08-24

### Added

- Voice input: dictate prompts instead of typing. Click the mic button in the
  terminal header (or press `Cmd+D`), speak, and your words are typed into the
  active agent's terminal — press Enter to send, exactly as if you had typed.
  A floating pill shows the live transcript while you speak; nothing is ever
  auto-submitted. Works in Chrome, Edge, and Safari over HTTPS or localhost
  (for remote access, use `tailscale serve` — see `docs/REMOTE.md`).
- The microphone is deliberately bounded so it can never stay hot unnoticed:
  it stops after ~1 minute without delivered speech, always after 5 minutes,
  when you switch or close agents, when an agent's shell ends, and when the
  browser tab is hidden — each stop except the hidden-tab one flashes an
  on-screen notice explaining why (a hidden tab can't show one; that stop is
  announced to screen readers).
- Screen-reader support for dictation: the mic button announces its
  pressed state and voice start/stop/errors are read out via a live region.

### Changed

- Global keyboard shortcuts (`Cmd+1..9`, `Cmd+E`, `Cmd+N`, and the new
  `Cmd+D`) now fire only on exact Cmd chords: combos with Ctrl or Alt also
  held, and held-key repeats, no longer trigger them. The page and the
  terminal now share one shortcut list, so no chord is blocked in the
  terminal but dead on the page.
- The docs now spell out the voice privacy trade-off: Chrome and Edge process
  speech on vendor servers, so dictated content leaves the machine even inside
  a tailnet — don't dictate secrets. They also note that transcripts arrive as
  keystrokes, so single-key prompts (pagers, y/n confirmations) react to
  speech like typing.

## [0.1.0.1] - 2026-08-01

### Added

- The README now shows a screenshot of the app: the pixel office running four
  agents alongside a live agent terminal. The README had referenced
  `docs/screenshot.png` since the initial commit, but the image was never
  captured, so the link rendered broken on GitHub.
- Version tracking via a `VERSION` file and this changelog.
- CI: a GitHub Actions workflow that runs the test suite on pushes to `main` and
  on every pull request. The README's Tests badge had pointed at
  `.github/workflows/test.yml` since the initial commit, but no workflow existed,
  so the badge never resolved.

### Changed

- README image markup now carries descriptive alt text and no longer keeps the
  placeholder comment that specified the screenshot before it existed.