[
	{
		"date": "2026-09-05",
		"type": "feature",
		"slug": "30-board-movements-in-dev3-events",
		"title": "`dev3 events` now carries board movements alongside notes: a task being created, changing column (completion and canc...",
		"body": "`dev3 events` now carries board movements alongside notes: a task being created, changing column (completion and cancellation included), or moving into a custom column. `--kind note|move` filters between them, and a filtered run says its cursor only advances over that kind. Movements are recorded from this version onward — moves made earlier were never stored by any version and are never invented — and when the per-task cap has destroyed moves inside the range you asked for, the run says so instead of presenting a trimmed log as complete.",
		"short": "Board moves join the events feed"
	},
	{
		"date": "2026-09-05",
		"type": "fix",
		"slug": "artifact-popup-no-resizable-panel",
		"title": "HTML artifacts from `dev3 show-artifact` now open the same way images do — a popup over the task, closed with Escape ...",
		"body": "HTML artifacts from `dev3 show-artifact` now open the same way images do — a popup over the task, closed with Escape or a click outside — instead of a panel docked beside the terminal. The drag-resizable artifact panel is gone, and with it the resize that could freeze the whole UI.",
		"short": "Artifacts open as a popup"
	},
	{
		"date": "2026-09-05",
		"type": "fix",
		"slug": "artifact-viewer-back-in-the-page",
		"title": "HTML artifacts render inside the app window again instead of in a separate native webview layer, which could paint an...",
		"body": "HTML artifacts render inside the app window again instead of in a separate native webview layer, which could paint an opaque rectangle over the artifact popup and over menus and toasts drawn on top of it. The transport picker and the overlay-mask machinery that layer needed are gone; find, theme, image saving, downloads, version switching and sending a form back to the agent all work exactly as before, and remote (browser) mode is unchanged.",
		"short": "Artifact popup no longer painted over"
	},
	{
		"date": "2026-09-05",
		"type": "feature",
		"slug": "codex-gpt-6-astra",
		"title": "Added GPT-6 Astra at the top of the Codex presets, with Medium reasoning as the default",
		"body": "Added GPT-6 Astra at the top of the Codex presets, with Medium reasoning as the default. Bypass and Standard variants cover all reasoning levels, and GPT-5.6 Luna X-High remains available as a separate preset.",
		"short": "GPT-6 Astra in Codex"
	},
	{
		"date": "2026-09-05",
		"type": "feature",
		"slug": "live-agent-traffic-orbit",
		"title": "Experiment 1 in Experimental features enables the agent traffic icon, which opens a live 3D orbit of real tasks, coor...",
		"body": "Experiment 1 in Experimental features enables the agent traffic icon, which opens a live 3D orbit of real tasks, coordinators, and recorded messages, with the last 24 hours loaded immediately. Inspect exact delivery evidence, search history, filter routes, and open tasks from the map; new confirmed deliveries animate once as the durable log updates. The map emphasizes the busiest project with raised, readable nodes, hover feedback, and layout-independent WASD navigation.",
		"short": "See your agents exchange messages"
	},
	{
		"date": "2026-09-05",
		"type": "fix",
		"slug": "low-battery-off-by-default",
		"title": "The low-battery answer format no longer installs itself: a fresh install ships nothing, selects no Claude Code output...",
		"body": "The low-battery answer format no longer installs itself: a fresh install ships nothing, selects no Claude Code output style, and adds no line to ~/.agents/AGENTS.md until you turn it on in Settings → Agents → Low-battery answer format. An install from the earlier default-on release keeps its files until you flip that switch on and off again, which is a real uninstall of what dev3 wrote; `dev3 doctor` names those leftovers.",
		"short": "Low-battery format is now opt-in"
	},
	{
		"date": "2026-09-05",
		"type": "feature",
		"slug": "tmux-session-sort-live-refresh",
		"title": "The tmux Sessions popover now sorts by memory (default) or CPU, heaviest first, and the numbers go live while it is o...",
		"body": "The tmux Sessions popover now sorts by memory (default) or CPU, heaviest first, and the numbers go live while it is open — the resource monitor drops from a 10-second to a 2-second tick and pushes each session's CPU and memory as they move, then lapses back on its own once the list closes.",
		"short": "Sort tmux sessions by memory or CPU"
	},
	{
		"date": "2026-09-05",
		"type": "feature",
		"slug": "70-coordinator-reads-events-from-a-cursor",
		"title": "The default Coordinator role now begins a turn by reading `dev3 events` from the cursor it saved last time, drains ev...",
		"body": "The default Coordinator role now begins a turn by reading `dev3 events` from the cursor it saved last time, drains every capped page, opens the notes that matter in full, and advances the cursor only after consuming the results. A lost cursor is bootstrapped as an openly bounded window instead of a short relative one, and a failed read is reported as a failed read rather than as a quiet board. The rest of the role text was condensed to pay for the addition, so a coordinator task costs no more of the launch command line than before.",
		"short": "Coordinators read the event log"
	},
	{
		"date": "2026-09-04",
		"type": "feature",
		"slug": "30-agent-requested-cancellation",
		"title": "An agent can now clean up a task it should not have created: `dev3 task move --status cancelled` asks the user for ap...",
		"body": "An agent can now clean up a task it should not have created: `dev3 task move --status cancelled` asks the user for approval instead of being refused outright. The dialog is deliberately unmistakable — red border, red badge, red button, Cancel focused by default — and it streams the local git check in, keeping the confirm button unavailable until it can tell you what would be lost. Declining exits 22 and leaves the task and its session exactly as they were.",
		"short": "Agents can ask to cancel a task"
	},
	{
		"date": "2026-09-04",
		"type": "feature",
		"slug": "30-default-handoff-reporting",
		"title": "A task launched by a peer agent now hears, in its very first message, that its description is the brief and that prog...",
		"body": "A task launched by a peer agent now hears, in its very first message, that its description is the brief and that progress and results go into a file under its own task directory — it messages the launcher only the absolute path. Coordinators no longer have to type that instruction by hand after every launch, and a launcher with standing rules of its own can append them with `--handoff-file <path>` on `dev3 task move --status in-progress` or `dev3 task create --scratch --run`.",
		"short": "Launched agents report back as files"
	},
	{
		"date": "2026-09-04",
		"type": "docs",
		"slug": "agents-md-path-sweep",
		"title": "Swept every file-path reference in AGENTS.md and docs/agents/ against the repo and fixed the ones that no longer reso...",
		"body": "Swept every file-path reference in AGENTS.md and docs/agents/ against the repo and fixed the ones that no longer resolved: the decision-record example now names a record that exists, the native menu bar is qualified as src/shared/application-menu.ts, and four keymap/i18n references that were written relative to src/mainview now carry their full path. A new test, src/bun/__tests__/documentation-paths.test.ts, asserts that every backticked file token and markdown link target in those docs still resolves, so the next one is caught before it misdirects an agent."
	},
	{
		"date": "2026-09-04",
		"type": "feature",
		"slug": "dev-server-env-flag",
		"title": "`dev3 dev-server start --env KEY=VALUE` (repeatable, and the same on `restart`) passes extra environment variables to...",
		"body": "`dev3 dev-server start --env KEY=VALUE` (repeatable, and the same on `restart`) passes extra environment variables to the project's dev script, so a dev server can be booted on a different configuration without editing `.dev3/config.local.json`. It overrides the project's own `env` but never the task's identity or its assigned `DEV3_PORT*`, and those names are refused outright rather than silently dropped. A bare `restart` reuses the last start's variables, a `stop` clears them, and `dev3 dev-server status` lists their names (never their values).",
		"short": "Pass env vars to a dev server"
	},
	{
		"date": "2026-09-04",
		"type": "fix",
		"slug": "drop-agent-toast-quotes",
		"title": "The agent-message toast no longer wraps the message preview in typographic quotes — the preview reads as plain text i...",
		"body": "The agent-message toast no longer wraps the message preview in typographic quotes — the preview reads as plain text in all three locales.",
		"short": "Agent toast preview without quotes"
	},
	{
		"date": "2026-09-04",
		"type": "fix",
		"slug": "pane-exit-e2e-revived-and-gated",
		"title": "The `test:pane-e2e` pane-exit reconciliation suite died at import time because its preload mocked `agents.ts` and `da...",
		"body": "The `test:pane-e2e` pane-exit reconciliation suite died at import time because its preload mocked `agents.ts` and `data.ts` with hand-listed exports that had since fallen behind the real modules. The mocks now spread the real module and override only what the test needs, and the script joined the live terminal e2e CI gate so it can never rot unnoticed again."
	},
	{
		"date": "2026-09-04",
		"type": "fix",
		"slug": "remote-clients-miss-desktop-pushes",
		"title": "A terminal that exited kept looking alive in a browser or on a phone: the desktop app announced the death to its own ...",
		"body": "A terminal that exited kept looking alive in a browser or on a phone: the desktop app announced the death to its own windows only, so the remote view sat on a bare `[exited]` with no \"Terminal session ended\" screen until a reload. Nine events were affected in all — terminal deaths, port and dev-server updates, resource and rate-limit readings, and update prompts — and every push in the desktop entry now goes to attached browsers as well, guarded by a test so a new one cannot forget.",
		"short": "Remote terminals notice when they die"
	},
	{
		"date": "2026-09-04",
		"type": "chore",
		"slug": "route-every-ci-install-through-bun-install-retry",
		"title": "Every CI workflow now installs dependencies through the bounded-retry `bun install` action instead of calling `bun in...",
		"body": "Every CI workflow now installs dependencies through the bounded-retry `bun install` action instead of calling `bun install` directly, so a transient registry tarball failure no longer kills a release run — release v1.51.2 lost all five platform builds to exactly that, in the one workflow the original retry never reached. A repo-wide test now fails if any workflow calls `bun install` directly or quietly drops `--frozen-lockfile`."
	},
	{
		"date": "2026-09-04",
		"type": "fix",
		"slug": "terminal-e2e-guard-tmux-server-socket-probe",
		"title": "The live terminal e2e gate now proves a leaked tmux server by connecting to its socket instead of relying on how tmux...",
		"body": "The live terminal e2e gate now proves a leaked tmux server by connecting to its socket instead of relying on how tmux happens to name itself in the process table, and reports it with the socket name and the command that clears it. The guard's fixtures for a leaked server were hand-written strings the operating system never prints; they are replaced with output measured on macOS and Linux, and a decision record explains why a fixture of real command output has to come from a real run."
	},
	{
		"date": "2026-09-04",
		"type": "feature",
		"slug": "touch-scroll-to-latest-button",
		"title": "On touch devices the terminal now shows a round scroll-to-latest button over the canvas whenever the pane is scrolled...",
		"body": "On touch devices the terminal now shows a round scroll-to-latest button over the canvas whenever the pane is scrolled into history, and a tap returns to the live output (leaving tmux copy-mode or scrolling the native buffer to the bottom). Before, the tap that ends copy-mode on desktop was swallowed by the prompt composer, so the only way back on a phone was swiping through the whole history. Text sent from the composer while scrolled up now leaves copy-mode first instead of being eaten as copy-mode keys.",
		"short": "Scroll-to-latest button on phones"
	},
	{
		"date": "2026-09-03",
		"type": "fix",
		"slug": "agent-message-head-truncation",
		"title": "Messages sent between tasks with `dev3 message` no longer lose their beginning: text is pasted\r\ninto the receiving ag...",
		"body": "Messages sent between tasks with `dev3 message` no longer lose their beginning: text is pasted\r\ninto the receiving agent through a tmux paste buffer instead of typed, so a long message arrives\r\nas one atomic paste rather than as several ~1 KB fragments the receiving CLI could drop one of.\r\nThe native terminal backend is unchanged — it cannot tell whether the running app accepts a\r\nbracketed paste.",
		"short": "Long agent messages arrive whole"
	},
	{
		"date": "2026-09-03",
		"type": "fix",
		"slug": "clone-rpc-timeout",
		"title": "Tripled the renderer RPC request timeout from 2 to 6 minutes so cloning a large repo through the Add Project dialog n...",
		"body": "Tripled the renderer RPC request timeout from 2 to 6 minutes so cloning a large repo through the Add Project dialog no longer fails with 'RPC \"cloneAndAddProject\" timed out'. The timeout is a last-resort backstop — the bridge watchdog still detects a genuinely dead connection in seconds.",
		"short": "Clones no longer time out"
	},
	{
		"date": "2026-09-03",
		"type": "fix",
		"slug": "codex-orphaned-mcp-tools-block",
		"title": "Fixed Codex tasks failing to launch with \"invalid transport\" when a per-theme dev3 profile still held an approval tab...",
		"body": "Fixed Codex tasks failing to launch with \"invalid transport\" when a per-theme dev3 profile still held an approval table for an MCP server that had left the config; dev3 now prunes those orphaned `mcp_servers.*` entries at startup and before every Codex spawn.",
		"short": "Codex tasks no longer die on stale MCP approvals",
		"suggestedBy": "OrenZak",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1640",
		"issueRef": "#1640"
	},
	{
		"date": "2026-09-03",
		"type": "feature",
		"slug": "per-window-native-title",
		"title": "Each desktop window now shows what it displays in its native title bar — `<task> · dev-3.0` on a task, `<project> · d...",
		"body": "Each desktop window now shows what it displays in its native title bar — `<task> · dev-3.0` on a task, `<project> · dev-3.0` on a board — so a multi-monitor layout of several windows is tellable apart in the title bar, Mission Control and the Window menu. Streamer mode keeps a sensitive project's name out of the title, exactly as it already did for the browser tab.",
		"short": "Window titles name their task",
		"suggestedBy": "yhattav",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1632",
		"issueRef": "#1632"
	},
	{
		"date": "2026-09-03",
		"type": "fix",
		"slug": "queue-popover-shows-subject",
		"title": "The pending-message popover on a task card and in the session bar now leads with the sender's one-line subject instea...",
		"body": "The pending-message popover on a task card and in the session bar now leads with the sender's one-line subject instead of the raw message body, with the full body still available on hover. A message queued without a subject keeps showing its body.",
		"short": "Message queue shows the subject"
	},
	{
		"date": "2026-09-03",
		"type": "fix",
		"slug": "spill-at-pty-chunk-boundary",
		"title": "A `dev3 message` between two tasks no longer types anything longer than one terminal read: past 1 000 bytes of the wh...",
		"body": "A `dev3 message` between two tasks no longer types anything longer than one terminal read: past 1 000 bytes of the whole envelope the body is written to a file and the agent is handed the path, and a burst released together obeys the same limit instead of merging into one oversized stream. The lost heads reported in #1608 were the receiving Claude Code folding the first ~1 KiB chunk into a pasted-text attachment and dropping it at submit, so the only reliable fix is to never send a second chunk; the `<full-copy>` receipt that used to detect the loss is gone, because the file itself is now the copy.",
		"short": "Long inter-task messages arrive whole",
		"suggestedBy": "yhattav",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1608",
		"issueRef": "#1608"
	},
	{
		"date": "2026-09-03",
		"type": "fix",
		"slug": "unpatched-jetbrains-mono-and-honest-font-labels",
		"title": "Settings → Terminal now ships unpatched JetBrains Mono as its own option, and every bundled Nerd Font says so in its ...",
		"body": "Settings → Terminal now ships unpatched JetBrains Mono as its own option, and every bundled Nerd Font says so in its name — \"Hack Nerd Font\", not \"Hack\". The old labels claimed the upstream typeface while handing over the icon-patched variant, and because a label matching what you typed won the picker, a font you had installed yourself could not be chosen at all. Picking the plain face keeps the Nerd Font at the end of the stack, so prompt and file-listing icons it does not carry still resolve instead of turning into boxes.",
		"short": "Plain JetBrains Mono, honest font names",
		"suggestedBy": "vit-pavlenko",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1625",
		"issueRef": "#1625"
	},
	{
		"date": "2026-09-02",
		"type": "feature",
		"slug": "40-artifact-starter-card-and-directory-publish",
		"title": "`dev3 show-artifact ./dev3-artifact-report --title \"…\"` now publishes a whole report directory — `index.html` plus ev...",
		"body": "`dev3 show-artifact ./dev3-artifact-report --title \"…\"` now publishes a whole report directory — `index.html` plus every CSS, JS and image under it — instead of a six-line command naming each asset. The starter's `AUTHORING.md` shrank to a one-screen card with a class cheat sheet, the depth moved to a new `REFERENCE.md` read by section, and a `<table data-sortable>` is sorted by the shell so a static report needs no JavaScript.",
		"short": "Publish an artifact directory in one line"
	},
	{
		"date": "2026-09-02",
		"type": "fix",
		"slug": "agent-prompt-audit-batch-one",
		"title": "The coordinator preamble is regrouped into five headed blocks (role, reporting, relaying, permissions, the board bloc...",
		"body": "The coordinator preamble is regrouped into five headed blocks (role, reporting, relaying, permissions, the board block), gains a template for briefing child tasks and treats a child's \"done\" as a claim until the artefact is seen, and no longer assumes the user's gender. The PR-review preamble ranks findings as blocker / worth fixing / nitpick, keeps the review off GitHub and records it with `dev3 note add`; the AI-review column prompt asks for the type-check and tests before committing a fix; and the Claude `dev3` skill description stops demanding a mandatory invoke when the protocol is already in the system prompt.",
		"short": "Clearer coordinator and review prompts"
	},
	{
		"date": "2026-09-02",
		"type": "feature",
		"slug": "project-switcher-search",
		"title": "The header's project switcher now opens with a search field: type to fuzzy-filter the list by project name or by the ...",
		"body": "The header's project switcher now opens with a search field: type to fuzzy-filter the list by project name or by the name of a space it belongs to, walk the matches with ↑/↓ and open one with ⏎. The row beside it advertises the ⌘K \"Go to Project\" palette and opens it, so the same jump is one key away next time.",
		"short": "Search inside the project switcher"
	},
	{
		"date": "2026-09-01",
		"type": "feature",
		"slug": "00-claude-fable-5-1-presets",
		"title": "Claude Fable 5.1 joins the built-in Claude presets on its 1M-context alias (`claude-fable-5-1[1m]`) with Medium/High/...",
		"body": "Claude Fable 5.1 joins the built-in Claude presets on its 1M-context alias (`claude-fable-5-1[1m]`) with Medium/High/X-High effort tiers for Auto and Bypass plus Default, Plan and Accept Edits, listed above Fable 5 in every mode group. The Fable 5, Opus 5, Opus 4.8, Sonnet 5 and Opus 4.7 presets and the default configuration are unchanged; the usage-cost table prices Fable 5.1 and Opus 4.8 cache reads at their published $0.25/MTok instead of the generic 10%-of-input default. The `/debug-ui` skill now routes the scoped QA board through `dev3 dev-server` via `DEV3_QA_SCOPE` in `.dev3/config.local.json` instead of a hand-run `bun run dev --qa`.",
		"short": "Claude Fable 5.1 presets"
	},
	{
		"date": "2026-09-01",
		"type": "feature",
		"slug": "40-back-up-all-user-state",
		"title": "Every file of user state in ~/.dev3.0 now gets the hourly safety copies that projects.json already had — spaces, sett...",
		"body": "Every file of user state in ~/.dev3.0 now gets the hourly safety copies that projects.json already had — spaces, settings, agent presets, Operations boards and the model catalog, each with a last-known-good copy that rotation can never evict and that refuses to advance onto a collapsed file. Credentials are deliberately left out, and restoring is always a manual step: see docs/state-backups.md.",
		"short": "Hourly backups of all your state"
	},
	{
		"date": "2026-09-01",
		"type": "docs",
		"slug": "agents-md-stale-paths-and-glossary",
		"title": "Brought AGENTS.md back in line with the code: fixed three paths that no longer existed (the skill body now lives in `...",
		"body": "Brought AGENTS.md back in line with the code: fixed three paths that no longer existed (the skill body now lives in `src/shared/agent-skill-content.ts`, tmux bindings in `src/bun/tmux/config.ts`, the plural-keys test under `src/mainview/i18n/`), dropped the stale nine-domain list of RPC handlers and the two conflicting decision-record counts, and replaced every bare \"decision NNN\" citation with its slug. The task-lifecycle and model-routing glossaries moved to `docs/glossary.md`, the TeamCreate section now says which harnesses actually have it, and MANDATORY is kept only on the sections whose violation silently ships a broken or leaking build."
	},
	{
		"date": "2026-09-01",
		"type": "docs",
		"slug": "align-test-gate-with-local-e2e-policy",
		"title": "The agent instructions contradicted the verify-changes skill about the full test suite: the verification gate demande...",
		"body": "The agent instructions contradicted the verify-changes skill about the full test suite: the verification gate demanded `bun run test:full` locally before a PR, while the skill reserves that command for CI and forbids running it locally. The gate now matches the skill — the fast suite plus the suites around your change run locally, and the full run's verdict is read off CI for the head you pushed — and the fast run's exclusion count is corrected from six to the seven files it actually skips."
	},
	{
		"date": "2026-09-01",
		"type": "fix",
		"slug": "handoff-prompt-rides-the-launch-command",
		"title": "\"+ Agent\" with \"Continue this task's conversation\" now hands the new agent its pointer to the retelling as the launch...",
		"body": "\"+ Agent\" with \"Continue this task's conversation\" now hands the new agent its pointer to the retelling as the launch prompt, so reading it is the agent's first turn. It used to be typed into the pane afterwards and held until the pane went quiet — and because any keystroke anywhere in the task pushes that hold back, the pointer sat unsent until the user pressed Enter in the pane he spawned from.",
		"short": "Continue-in-another-agent now starts instantly"
	},
	{
		"date": "2026-09-01",
		"type": "fix",
		"slug": "mojibake-in-shared-types",
		"title": "The AI Review column's default prompt showed garbled characters instead of dashes (\"worth surfacing â add a short\"), ...",
		"body": "The AI Review column's default prompt showed garbled characters instead of dashes (\"worth surfacing â add a short\"), and 44 more mangled arrows, degree signs and dashes sat in the same file's comments — a commit two months ago had re-saved it with the wrong text encoding. All 46 are repaired, and a new test scans every tracked text file so the next occurrence fails CI instead of shipping.",
		"short": "Fix garbled dashes in review prompt"
	},
	{
		"date": "2026-09-01",
		"type": "fix",
		"slug": "osc8-file-links-clickable",
		"title": "Terminal file paths that agents wrap in OSC 8 file:// hyperlinks (Claude Code does) showed a hover underline but a de...",
		"body": "Terminal file paths that agents wrap in OSC 8 file:// hyperlinks (Claude Code does) showed a hover underline but a dead click: the link provider accepted only http(s) URIs. file:// links now Cmd/Ctrl+Click open like plain path links — resolved on the backend against the allowed roots, then previewed or revealed per the \"File path click action\" setting. Clicking an OSC 8 link also opens the link actually under the cursor: every such link on screen shares one hyperlink id, so the terminal's own link cache used to answer every click with whichever link was hovered first, and the hover tooltip named one file while the click opened another.",
		"short": "Terminal file links open the right file",
		"suggestedBy": "arditti",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1617",
		"issueRef": "#1617"
	},
	{
		"date": "2026-09-01",
		"type": "fix",
		"slug": "separate-messages-in-one-burst",
		"title": "Several `dev3 message` deliveries that land inside one quiet window are typed as a single agent turn, and until now t...",
		"body": "Several `dev3 message` deliveries that land inside one quiet window are typed as a single agent turn, and until now they arrived welded together — the closing tag of one report and the opening tag of the next sat on the same line, so a coordinator reading a multi-part report could not tell where one child stopped and the next began. Every message after the first now goes in behind a blank line, and so does the board snapshot that trails a burst.",
		"short": "Two messages in one turn no longer weld",
		"suggestedBy": "yhattav",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1608",
		"issueRef": "#1608"
	},
	{
		"date": "2026-09-01",
		"type": "feature",
		"slug": "space-follows-you-into-a-task",
		"title": "A project can belong to several spaces, and the header used to forget which one you came through the moment you opene...",
		"body": "A project can belong to several spaces, and the header used to forget which one you came through the moment you opened a task — the Active Tasks sidebar then pooled every space the project belongs to instead of the one on screen. The space is now its own crumb between the app name and the project (dev-3.0 / AI / Nanochat), a plain link back to that space's board, and it survives Back/Forward and a full-page task; Active Tasks holds exactly that space's projects.",
		"short": "Space becomes a breadcrumb level"
	},
	{
		"date": "2026-08-31",
		"type": "feature",
		"slug": "30-import-the-session-youre-in",
		"title": "`dev3 import`, run from an agent's own shell, puts that conversation on the board as a task",
		"body": "`dev3 import`, run from an agent's own shell, puts that conversation on the board as a task. The working directory decides which project owns it and CLAUDE_CODE_SESSION_ID decides which conversation, so there is nothing to pass and nothing to pick. A conversation that was recently active arrives with a git worktree of its own, and the description is the transcript as it stands at that moment. `dev3 conversations import` still covers importing past conversations in bulk.",
		"short": "Import the session you are in"
	},
	{
		"date": "2026-08-31",
		"type": "fix",
		"slug": "agent-message-head-loss-receipt",
		"title": "A `dev3 message` over 1 500 bytes now also lands on disk next to the receiving task, and the envelope names that copy...",
		"body": "A `dev3 message` over 1 500 bytes now also lands on disk next to the receiving task, and the envelope names that copy on its last line, just before the closing tag. A receiver that finds a closing `</dev3-ai-message>` with no opening line knows the delivery lost its head and can read the whole message from the named file instead of acting on half a ruling. Each task keeps its newest 50 receipts.",
		"short": "Long agent messages keep a recoverable copy",
		"suggestedBy": "yhattav",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1608",
		"issueRef": "#1608"
	},
	{
		"date": "2026-08-31",
		"type": "fix",
		"slug": "artifact-input-survives-republish",
		"title": "Filling in a form inside an artifact and then having the agent publish a new version used to wipe what you had typed,...",
		"body": "Filling in a form inside an artifact and then having the agent publish a new version used to wipe what you had typed, with no warning and nothing to recover. Whatever you have written is now kept, the viewer offers to take you back to the version you were answering, and sending from there still works. Reported by Evgeny Alterman.",
		"short": "Your artifact answer survives a republish"
	},
	{
		"date": "2026-08-31",
		"type": "fix",
		"slug": "artifact-table-query-container",
		"title": "A plain table in a dev3 HTML artifact card no longer overflows its panel: the shell now makes the table's own parent ...",
		"body": "A plain table in a dev3 HTML artifact card no longer overflows its panel: the shell now makes the table's own parent the `dev3-table` query container, so the documented stacking into labelled lines works without an opt-in wrapper class. The shell also relabels cells when a report writes a whole table into a host element in one go, which is how report code normally renders one.",
		"short": "Narrow artifact tables stack again"
	},
	{
		"date": "2026-08-31",
		"type": "fix",
		"slug": "artifact-viewer-webview-process",
		"title": "On macOS the artifact viewer now renders the report in its own webview process instead of an iframe, so an artifact t...",
		"body": "On macOS the artifact viewer now renders the report in its own webview process instead of an iframe, so an artifact that wedges its own main thread no longer takes the whole dev-3.0 window with it — the app stays responsive and you can close the report. Remote mode, Linux and Windows keep the previous iframe path.\r\n\r\nThe local Electrobun webview-tag reference in vendor-docs was also corrected against the shipped 1.18.1 code: it documented four things that do not hold, each of which fails silently.",
		"short": "Artifacts can no longer freeze the app"
	},
	{
		"date": "2026-08-31",
		"type": "fix",
		"slug": "git-bar-no-merge-base",
		"title": "The task git bar could read \"1889 ahead · 6 behind\" for a branch that was two commits ahead: with a truncated local c...",
		"body": "The task git bar could read \"1889 ahead · 6 behind\" for a branch that was two commits ahead: with a truncated local clone git finds no fork point and answers with each side's whole history instead of failing. The bar now says the base is unreachable and names the fix, the branch diff says it was never computed instead of showing \"no changes\", and Push, Create PR, Merge and Rebase say why they are off.",
		"short": "Git bar stops inventing an ahead count"
	},
	{
		"date": "2026-08-31",
		"type": "fix",
		"slug": "project-backups-and-test-isolation",
		"title": "The project list is now snapshotted hourly (72 kept) alongside the existing daily copies, and both are driven by a ti...",
		"body": "The project list is now snapshotted hourly (72 kept) alongside the existing daily copies, and both are driven by a timer instead of only by a save — an app left running for days previously snapshotted nothing at all. A separate last-known-good copy is kept that no rotation can evict, so a collapsed project list can never become the only surviving backup. Separately, the test harness now drops every inherited DEV3_ environment variable rather than six named ones, closing a hole where a shell exporting DEV3_HOME made the backend suites resolve the real ~/.dev3.0 instead of their sandbox.",
		"short": "Project list now backed up hourly"
	},
	{
		"date": "2026-08-31",
		"type": "fix",
		"slug": "remote-access-dialog-fits-viewport",
		"title": "The Remote Access dialog no longer runs off the top and bottom of the window once the access-code, tunnel and exposed...",
		"body": "The Remote Access dialog no longer runs off the top and bottom of the window once the access-code, tunnel and exposed-ports blocks are all present. Its height is now capped against the viewport with a scrolling body, the heading and the Copy URL / Close row stay pinned, the QR shrinks on short windows, and the sign-in URL is clamped to two lines beside the copy button. Verified from 1280x720 up to 1920x1080, on a 500px-tall window and on a 390x844 phone viewport.",
		"short": "Remote Access dialog fits any screen"
	},
	{
		"date": "2026-08-31",
		"type": "fix",
		"slug": "republished-artifact-goes-last",
		"title": "Re-publishing an artifact now moves its row to the end of the task's artifact list instead of keeping its original po...",
		"body": "Re-publishing an artifact now moves its row to the end of the task's artifact list instead of keeping its original position. Every surface opens a task's artifacts at the last one, so the report you just updated is the one on screen — no more paging back to it after every publish.",
		"short": "Republished artifact moves to the end"
	},
	{
		"date": "2026-08-31",
		"type": "fix",
		"slug": "resume-conversation-from-another-directory",
		"title": "Fix a pane whose conversation started in another directory silently getting a brand-new conversation on the first rec...",
		"body": "Fix a pane whose conversation started in another directory silently getting a brand-new conversation on the first recovery. Such a transcript stays in its original directory's store, but the agent still creates an empty store directory for the task's own worktree — enough for the resume resolver to conclude the session was dead and fall back to starting fresh. It now records the conversation's origin directory and checks that store before healing.",
		"short": "Resuming keeps the right conversation"
	},
	{
		"date": "2026-08-31",
		"type": "fix",
		"slug": "trackpad-vertical-scroll-drifted-sideways",
		"title": "On a trackpad a vertical two-finger swipe arrives with a horizontal delta of exactly zero, which is indistinguishable...",
		"body": "On a trackpad a vertical two-finger swipe arrives with a horizontal delta of exactly zero, which is indistinguishable from a mouse notch — so the new mouse-wheel bridge grabbed it and pushed the Kanban board sideways instead of scrolling. The bridge now stays dormant on macOS, and anywhere else it switches itself off permanently the first time it sees a horizontal delta, which is proof a touchpad is in use.",
		"short": "Trackpad scrolls straight again"
	},
	{
		"date": "2026-08-30",
		"type": "feature",
		"slug": "30-pr-badge-active-tasks-sidebar",
		"title": "The Active Tasks sidebar now shows each task's pull request the way the board does: number, merge state, review verdi...",
		"body": "The Active Tasks sidebar now shows each task's pull request the way the board does: number, merge state, review verdict and unresolved-comment count, hovering any of them for the checks breakdown and clicking to open the PR. It costs no extra network calls — the state is already on the task, kept fresh by the same push the board follows. On this narrow row the merge verdict shows as its glyph, with the word in the tooltip, so the whole cluster fits one line.",
		"short": "PR badge on Active Tasks cards"
	},
	{
		"date": "2026-08-30",
		"type": "fix",
		"slug": "coordinator-prompt-safeguard-refusal",
		"title": "The built-in Coordinator preset prompt contained a sentence that Anthropic's safeguards flagged as a reasoning-extrac...",
		"body": "The built-in Coordinator preset prompt contained a sentence that Anthropic's safeguards flagged as a reasoning-extraction attempt, so every coordinator task launched on Opus died on its first message with an API refusal before the agent could do anything. The sentence is gone and the paragraph around it already carried the same instruction.",
		"short": "Coordinator tasks start again on Opus"
	},
	{
		"date": "2026-08-30",
		"type": "fix",
		"slug": "create-space-from-add-project",
		"title": "The Add Project dialog's space picker said \"type a name to create one\" but had no way to do it — no create row, and E...",
		"body": "The Add Project dialog's space picker said \"type a name to create one\" but had no way to do it — no create row, and Enter did nothing, because the project it would belong to did not exist yet. Typing a name now adds it as a chip and the space is created together with the project.",
		"short": "Create a space while adding a project"
	},
	{
		"date": "2026-08-30",
		"type": "fix",
		"slug": "held-message-enter-swallowed",
		"title": "A `dev3 message` sometimes pasted its whole text into the receiving Claude Code pane without submitting it, and every...",
		"body": "A `dev3 message` sometimes pasted its whole text into the receiving Claude Code pane without submitting it, and every later message then piled onto the same unsubmitted input box. The Enter that ends a held burst now keeps the same 800 ms gap behind it that button hand-offs already had, so the agent's input layer cannot read it as part of the paste.",
		"short": "dev3 message no longer gets stuck unsent"
	},
	{
		"date": "2026-08-30",
		"type": "fix",
		"slug": "worktree-add-config-lock-retry",
		"title": "Starting a task with several variants could fail with \"could not lock config file .git/config: File exists\", because ...",
		"body": "Starting a task with several variants could fail with \"could not lock config file .git/config: File exists\", because the variants write their branch tracking config at the same moment. Worktree creation now retries up to three times with backoff, cleaning up the half-created branch between attempts.",
		"short": "Variant starts no longer lose a git lock race"
	},
	{
		"date": "2026-08-29",
		"type": "feature",
		"slug": "01-ship-low-battery-answer-format",
		"title": "dev3 now ships the low-battery answer rules to every supported agent — a header block that re-establishes what the ta...",
		"body": "dev3 now ships the low-battery answer rules to every supported agent — a header block that re-establishes what the task is, the decision at the bottom, tables instead of prose — so a task you come back to after two days is readable in seconds. It is on by default and switchable off from Settings → Agents → Low-battery answer format; turning it off removes only what dev3 installed and never touches your own Claude Code output style.",
		"short": "Agents answer in low-battery format"
	},
	{
		"date": "2026-08-29",
		"type": "feature",
		"slug": "02-import-codex-conversations",
		"title": "The conversation import now offers Codex rollouts alongside Claude Code ones, from `~/.codex/sessions` and from every...",
		"body": "The conversation import now offers Codex rollouts alongside Claude Code ones, from `~/.codex/sessions` and from every dev3 agent account. Codex writes no title of its own, so a Codex row is named after the first thing you actually asked for — the context Codex injects into the user role is recognised and never counted as a turn or quoted as the request. Each row says which agent it came from.",
		"short": "Import Codex sessions as tasks"
	},
	{
		"date": "2026-08-29",
		"type": "feature",
		"slug": "10-continue-conversation-in-another-agent",
		"title": "\"+ Agent\" can now hand the new agent the conversation that has been running",
		"body": "\"+ Agent\" can now hand the new agent the conversation that has been running. Tick \"Continue this task's conversation\" and dev3 writes a retelling of the session — your prompts and the agent's replies verbatim, its actions summarised — beside the task's other files, then points the new agent at it. Start in Claude Code and finish in Codex, or the other way round, in the same worktree. Agents cannot resume each other's sessions, so a switch is a retelling and says so on its first line.",
		"short": "Continue a task in another agent"
	},
	{
		"date": "2026-08-29",
		"type": "feature",
		"slug": "20-dev3-events-board-feed",
		"title": "New `dev3 events` CLI command: one feed of the notes recorded by every task on the board, including completed and can...",
		"body": "New `dev3 events` CLI command: one feed of the notes recorded by every task on the board, including completed and cancelled ones whose worktrees are long gone. It is addressed by a cursor rather than a time window, so the same cursor always returns the same answer and nothing is silently skipped — a bare call shows the last 24 hours and states, as a number, how many events are older than that window.",
		"short": "Read every task's notes in one feed"
	},
	{
		"date": "2026-08-29",
		"type": "feature",
		"slug": "agent-usage-panel-default-account",
		"title": "The header rate-limit pill's panel now lets you switch the default agent account: it shows the same per-account quota...",
		"body": "The header rate-limit pill's panel now lets you switch the default agent account: it shows the same per-account quota cards for every Claude and Codex account, and each card is a radio row — pick one to make it the default for new launches, exactly as in Settings → Agent Accounts. Hovering the pill keeps the panel read-only; a click pins it, and only a pinned panel lets you choose, so a durable setting is never one stray click away. The switch confirms itself with a toast naming the account it moved to.",
		"short": "Switch default account from usage panel"
	},
	{
		"date": "2026-08-29",
		"type": "fix",
		"slug": "compact-agent-usage-panel",
		"title": "The header rate-limit panel is about half as tall: each limit window is one dense \"label · bar · % · resets in\" line,...",
		"body": "The header rate-limit panel is about half as tall: each limit window is one dense \"label · bar · % · resets in\" line, the capture age rides that line instead of taking its own, an account with no reading says so on its headline, and the Account settings button at the bottom became a link in the header row. Switching the default account no longer needs a click on the pill first — the rows arm once the pointer has rested in the panel, so you hover, move down and pick. Usage bars inside a card also render full width again in the desktop app, and a long workspace name now elides instead of pushing the plan and Default chips off the right edge.",
		"short": "Usage panel fits, and switches again"
	},
	{
		"date": "2026-08-29",
		"type": "fix",
		"slug": "pane-close-no-longer-kills-the-terminal",
		"title": "Closing one pane of a native task's terminal used to replace the whole terminal with the \"session ended\" screen when ...",
		"body": "Closing one pane of a native task's terminal used to replace the whole terminal with the \"session ended\" screen when the pane happened to be the one the task was launched with, hiding panes whose agents were still running. The task's terminal now reports itself over only when its last pane closes.",
		"short": "Closing a pane no longer kills the terminal"
	},
	{
		"date": "2026-08-29",
		"type": "fix",
		"slug": "plain-mouse-wheel-horizontal-scroll",
		"title": "A plain mouse has no horizontal axis, so horizontal-only containers were unreachable without a trackpad — the Kanban ...",
		"body": "A plain mouse has no horizontal axis, so horizontal-only containers were unreachable without a trackpad — the Kanban board simply would not move. A vertical wheel now scrolls sideways whenever nothing under the pointer can scroll vertically, which covers the board and the folder-picker breadcrumb; short sideways strips such as the contribution heatmap, the image thumbnail row and the model-catalog table opt in explicitly. Code blocks in pull-request and diff markdown now wrap instead of scrolling sideways.",
		"short": "Mouse wheel now scrolls the board"
	},
	{
		"date": "2026-08-29",
		"type": "fix",
		"slug": "remote-access-port-in-use",
		"title": "A remote-access port that was already in use used to take the whole app down a moment after the window appeared, sile...",
		"body": "A remote-access port that was already in use used to take the whole app down a moment after the window appeared, silently killing task rehydration and every background scheduler with it. The app now keeps starting, remote access alone stays down, and Settings → System says which port is taken and offers Try again without an app restart.",
		"short": "App survives a taken remote port"
	},
	{
		"date": "2026-08-29",
		"type": "fix",
		"slug": "web-push-and-remote-access-gaps",
		"title": "Web Push could never enrol in a packaged build: `sw.js` and `manifest.webmanifest` were missing from the app bundle, ...",
		"body": "Web Push could never enrol in a packaged build: `sw.js` and `manifest.webmanifest` were missing from the app bundle, so the service worker was served as HTML and refused to register. Every file in the renderer's public folder is now packaged automatically. The remote-access port can also be pinned in Settings → System instead of only through an environment variable a Finder launch never sees, and a custom tunnel's log lines are attributed to the tool that printed them rather than to the wrapper that echoed its hostname.",
		"short": "Web Push works in packaged builds"
	},
	{
		"date": "2026-08-28",
		"type": "feature",
		"slug": "02-import-claude-conversations",
		"title": "Add a project and dev3 offers to import the Claude Code conversations that already ran in that folder and belong to n...",
		"body": "Add a project and dev3 offers to import the Claude Code conversations that already ran in that folder and belong to no task: each becomes an ordinary task titled by Claude, described by a retelling of the conversation, labelled `imported`, with work from the last week landing in Has Questions with its own worktree and older work in Completed. Projects added before this existed get the same offer once, the first time their board is opened. The dialog is re-openable from Project Settings, from Project → Import from Other Agents…, from the ⇧⌘P palette's new Import section, available as `dev3 conversations import --dry-run`, and every task now writes a conversation dump when it goes terminal so its transcript outlives Claude's retention window.",
		"short": "Import Claude Code chats as tasks"
	},
	{
		"date": "2026-08-28",
		"type": "feature",
		"slug": "20-artifact-agent-messages",
		"title": "An HTML artifact can now send text back to the agent that published it: report code calls `window.dev3.sendToAgent(.....",
		"body": "An HTML artifact can now send text back to the agent that published it: report code calls `window.dev3.sendToAgent(...)` from a button or form, and the answer lands in that task's agent pane tagged with the artifact and version the user was looking at. So a report can ask a question — pick an option, approve a variant, name the files to skip — instead of making you retype the answer into the terminal. The form is inert on an older version, in a downloaded copy, and in a tab opened outside the app; a send that cannot be delivered fails with a toast rather than silently.",
		"short": "Reports can message their agent"
	},
	{
		"date": "2026-08-28",
		"type": "feature",
		"slug": "20-cross-space-kanban-board",
		"title": "A space can now be the subject of the kanban board itself: a zoom-out button beside the project switcher (⇧⌘U, or pic...",
		"body": "A space can now be the subject of the kanban board itself: a zoom-out button beside the project switcher (⇧⌘U, or pick the space in ⌘K), an \"Open space board\" button on each space's dashboard header, or a click on a space's heading in the project switcher opens one board showing every member project's tasks on one set of columns, with drag, filters and task creation working exactly as they do on a project's own board. Columns and labels are the union across member projects, merged by name, and a drag only ever changes status in the card's own repository — each card names its project on a line above the task title. A crowded card header no longer squeezes the priority badge into a circle. A space now also has a glyph of its own — three stacked sheets — in the dashboard rail, the dashboard group headers, the project switcher, the mobile filter sheet and the sidebar's scope switcher, which previously showed a plain ring. A project's own board is untouched. The board is addressable as `dev3://space/<id>`, and `dev3 current` now groups a worktree's siblings per space and prints each one's project id.",
		"short": "One kanban across a whole space"
	},
	{
		"date": "2026-08-28",
		"type": "feature",
		"slug": "20-static-access-code-sign-in",
		"title": "The remote-access static code is now a proper long-lived credential: it is typed on a browser sign-in screen instead ...",
		"body": "The remote-access static code is now a proper long-lived credential: it is typed on a browser sign-in screen instead of riding in the URL, it works alongside QR sign-in rather than replacing it, and you can set it in Settings → System instead of only through an environment variable. `dev3 remote --static-code=…` now starts with a warning about public-tunnel reach instead of refusing to boot. To avoid typing the code on a phone, `dev3 remote url` and the Remote Access modal also hand out a bookmarkable sign-in link that carries it in the URL fragment, which browsers never send to a server.",
		"short": "Sign in with a permanent access code"
	},
	{
		"date": "2026-08-28",
		"type": "feature",
		"slug": "30-artifact-gold-and-viz-tones",
		"title": "Artifact reports are no longer two colors on a dark page: the `DEV3 ARTIFACT` line is now a gold chip, panel headings...",
		"body": "Artifact reports are no longer two colors on a dark page: the `DEV3 ARTIFACT` line is now a gold chip, panel headings carry a colored marker, KPI cards and toned panels wear their own hue on rail and edge, and a faint colored wash sits behind the whole page. Six categorical `--dev3-viz-*` hues replace the semantic colors ECharts used as its default series palette, so a chart no longer claims a warning or a failure purely from series order, and authors color a panel with a `tone-1` … `tone-6` class instead of writing a hex. Gold ships as `--dev3-gold` / `--dev3-gold-ink` / `--dev3-on-gold` because a gold that passes contrast as text on a white page is brown; dark-theme neutrals were retuned so table headings finally pass AA contrast.",
		"short": "Artifacts get gold and a color palette"
	},
	{
		"date": "2026-08-28",
		"type": "fix",
		"slug": "bound-failed-pane-run-dismissal",
		"title": "A pane run that failed no longer waits for Enter forever — it closes itself after 30 minutes, long enough to read the...",
		"body": "A pane run that failed no longer waits for Enter forever — it closes itself after 30 minutes, long enough to read the output and short enough that dead panes stop piling up, while a successful run still goes after 10 seconds. The dev3 skill now states closing finished panes as the agent's own duty rather than something the timer handles for it.",
		"short": "Failed panes also close themselves"
	},
	{
		"date": "2026-08-28",
		"type": "feature",
		"slug": "cli-review-task-on-pr-branch",
		"title": "`dev3 task create --pr <number>` now starts the task on the pull request's own branch — a fork too — so a CLI-created...",
		"body": "`dev3 task create --pr <number>` now starts the task on the pull request's own branch — a fork too — so a CLI-created review task lands exactly where a GUI-created one does, marked as somebody else's code. `--branch <ref>` does the same for a branch that is not a pull request. A ref that does not resolve creates nothing and exits 18 instead of quietly leaving the task on the base branch, and `dev3 task create --help` plus the agent skill now spell out how a review task is meant to be created.",
		"short": "Review a PR from the CLI"
	},
	{
		"date": "2026-08-28",
		"type": "fix",
		"slug": "harden-remote-static-access-code",
		"title": "Hardened the remote-access static code (`dev3 remote --static-code` / `DEV3_REMOTE_STATIC_CODE`) against brute force:...",
		"body": "Hardened the remote-access static code (`dev3 remote --static-code` / `DEV3_REMOTE_STATIC_CODE`) against brute force: the minimum length is now 8 characters instead of 4, and a code set straight into the environment below that makes the server refuse to start rather than silently ignore it. Failed `/auth/exchange` attempts are now throttled per client — 5 failures per 30 seconds, then a 429 with `Retry-After` — checked before the submitted code is even compared. Only failures count and a success clears the record, so several devices can still enrol back to back and nobody can lock the owner out.",
		"short": "Remote access code harder to guess"
	},
	{
		"date": "2026-08-28",
		"type": "feature",
		"slug": "message-subject",
		"title": "`dev3 message` now requires `--subject`: one line, about six words, 80 characters at most, stored with the message an...",
		"body": "`dev3 message` now requires `--subject`: one line, about six words, 80 characters at most, stored with the message and rendered as the row in the agent-traffic readout and log instead of the head of the body. Omitting it exits 17 with an error that shows the limit, a good and a bad example, a subject suggested from your own text, and the corrected command; an over-limit subject is rejected rather than truncated. Messages sent before this keep showing their body head — nothing is backfilled.",
		"short": "Every dev3 message needs a subject"
	},
	{
		"date": "2026-08-28",
		"type": "fix",
		"slug": "windows-agent-command-quoting",
		"title": "Starting or resuming an agent on Windows failed twice over: the command line was quoted for a POSIX shell, so the apo...",
		"body": "Starting or resuming an agent on Windows failed twice over: the command line was quoted for a POSIX shell, so the apostrophe in the dev3 system prompt ended the PowerShell string literal, and the prompt itself was longer than a whole Windows command line. Command lines are now quoted in the platform's launch dialect, the dev3 protocol was rewritten about a quarter shorter and capped by a test that fails when it grows past the Windows limit, Claude receives it as a file on Windows, and a binary whose path contains a space (`C:\\Users\\John Smith\\...`) launches correctly on every platform.",
		"short": "Agents launch on Windows again"
	},
	{
		"date": "2026-08-27",
		"type": "feature",
		"slug": "20-first-run-follows-system-language",
		"title": "On a fresh install dev-3.0 now opens in the language your system asks for — Russian, Spanish or English — instead of ...",
		"body": "On a fresh install dev-3.0 now opens in the language your system asks for — Russian, Spanish or English — instead of always English, so you no longer have to find Settings → Appearance → Language before discovering the app is translated at all. Picking a language yourself still wins and is remembered; the automatic guess is not, so it follows your system if you change it. Two Russian and Spanish strings that had been left as their English originals are translated, and a new check keeps that from happening again.",
		"short": "dev-3.0 opens in your language"
	},
	{
		"date": "2026-08-27",
		"type": "feature",
		"slug": "30-notification-settings",
		"title": "Notification preferences now have a dedicated Settings → Notifications page for Focus Mode, default task watching, co...",
		"body": "Notification preferences now have a dedicated Settings → Notifications page for Focus Mode, default task watching, completion sounds, browser alerts, and Web Push. The one-time push invitation opens that page instead of asking for permission from a toast.",
		"short": "Notification settings in one place"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "agent-traffic-pill-stays-on-the-bar",
		"title": "The agent-traffic pill next to the ⋯ button used to disappear the moment you looked at it, which meant hovering it to...",
		"body": "The agent-traffic pill next to the ⋯ button used to disappear the moment you looked at it, which meant hovering it to open the panel also took it away. It now stays on the bar for as long as the project's agents have messaged each other; the count of unseen messages is just a badge on it, and that is what clears when you look.",
		"short": "Agent traffic pill stops vanishing"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "artifact-starter-silent-traps",
		"title": "Images an artifact report builds from JavaScript now load in the in-app viewer instead of\r\nsilently breaking, both th...",
		"body": "Images an artifact report builds from JavaScript now load in the in-app viewer instead of\r\nsilently breaking, both through the new `dev3Artifact.asset()` helper and for reports\r\npublished before it existed. The starter's chart bridge now names the fix when it is handed\r\nan element id instead of an element, or an option object passed to `update()`/`remount()`,\r\nand `AUTHORING.md` shows the exact `rgb(var(--dev3-token) / a)` colour form and the\r\n`chart()` signature that used to be described only in prose.",
		"short": "Artifact images built by script now load"
	},
	{
		"date": "2026-08-27",
		"type": "feature",
		"slug": "attention-clear",
		"title": "`dev3 attention --clear` takes the red badge back down and drops every accumulated reason with it, so an agent that r...",
		"body": "`dev3 attention --clear` takes the red badge back down and drops every accumulated reason with it, so an agent that raised an alert during an incident can lower it once the incident is over instead of leaving a badge that outlives its cause. Clearing is never queued or silenced — it goes through even while Focus Mode is on, and it also removes badge events that were queued for that task, so a cleared badge cannot reappear when the queue flushes.",
		"short": "Clear the attention badge from the CLI"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "auto-close-successful-pane-runs",
		"title": "A command an agent ran in a neighbouring pane (`dev3 pane run` — builds, test runs) no longer parks the pane at \"pres...",
		"body": "A command an agent ran in a neighbouring pane (`dev3 pane run` — builds, test runs) no longer parks the pane at \"press Enter to close\" once it succeeds: a run that exits 0 closes its own pane after 10 seconds. A run that failed or was killed still keeps its pane open until you dismiss it, because that output is what you came to read.",
		"short": "Green pane runs close themselves"
	},
	{
		"date": "2026-08-27",
		"type": "chore",
		"slug": "cap-total-test-worker-count",
		"title": "`bun run test` and `bun run test:full` now share one worker budget across their three concurrent vitest processes, in...",
		"body": "`bun run test` and `bun run test:full` now share one worker budget across their three concurrent vitest processes, instead of each process independently defaulting to `cores - 1` and putting roughly three workers on every core. On a 16-core machine that is 9 workers split 4 mainview / 4 bun / 1 cli instead of 45: the run takes about twice as long, and in exchange the machine stays usable and the CPU-starvation timeouts the backend suite produced on 4 of 5 uncapped runs are gone. A solo `test:bun` / `test:cli`, watch mode, and CI keep the vitest default untouched."
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "claude-bypass-mode-under-root",
		"title": "Claude Code refuses to start under root whenever bypass mode is reachable, which killed every session on a box runnin...",
		"body": "Claude Code refuses to start under root whenever bypass mode is reachable, which killed every session on a box running dev3 as root (a container or Kubernetes pod). dev3 now declares `IS_SANDBOX=1` for Claude launches when it is running as root, so bypass and Accept Edits presets work there instead of exiting immediately.",
		"short": "Claude sessions start when dev3 runs as root"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "cli-jit-entitlements",
		"title": "Creating a task no longer kills a running `dev3 remote` server on macOS, which\r\ndropped the connected browser or phon...",
		"body": "Creating a task no longer kills a running `dev3 remote` server on macOS, which\r\ndropped the connected browser or phone into \"Reconnecting\". The CLI binary is\r\nnow signed with the JIT entitlements Bun needs, so the copy-on-write clone step\r\nof task creation stops crashing the process outright.",
		"short": "Remote access survives task creation"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "completion-warning-cross-branch-push",
		"title": "The completion dialog no longer claims commits will be lost when the branch was pushed to a differently named remote ...",
		"body": "The completion dialog no longer claims commits will be lost when the branch was pushed to a differently named remote branch: it now asks whether the work is on any remote at all, instead of only looking for `origin/<branch-name>`. A branch that genuinely has nothing on a remote still warns exactly as loudly as before.",
		"short": "No false lost-commit warning",
		"suggestedBy": "vit-pavlenko",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1545",
		"issueRef": "#1545"
	},
	{
		"date": "2026-08-27",
		"type": "docs",
		"slug": "coordinator-board-header-real-delivery-seam",
		"title": "The module header of `src/shared/coordinator-board.ts` described a `UserPromptSubmit` hook that was built and then re...",
		"body": "The module header of `src/shared/coordinator-board.ts` described a `UserPromptSubmit` hook that was built and then removed before the feature shipped, and cited a decision record that does not exist. It now describes the real delivery seam (the `coordinatorBoardEpilogue` trailer on `deliverAgentPrompt`), names the user's own pane typing as a known limitation instead of omitting it, and points at the record that actually shipped.",
		"suggestedBy": "mcaldas",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1539",
		"issueRef": "#1539"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "description-edit-never-reaches-a-running-agent",
		"title": "A task's description is delivered as its agent's first prompt at launch and nothing re-delivers it, so rewriting a ru...",
		"body": "A task's description is delivered as its agent's first prompt at launch and nothing re-delivers it, so rewriting a running task's brief changed the board while its agent never found out. `dev3 task update --description` on a task with a live agent now prints a note saying so and suggests the `dev3 message` command to send alongside it; the same warning is spelled out in `dev3 task update --help` and in the dev3 skill every agent loads at startup.",
		"short": "Warn when a description edit misses the agent"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "dev-builds-no-longer-replace-the-managed-cli",
		"title": "Running the dev loop (`bun run dev`, or `dev3 dev-server start`) no longer overwrites the machine-wide `~/.dev3.0/bin...",
		"body": "Running the dev loop (`bun run dev`, or `dev3 dev-server start`) no longer overwrites the machine-wide `~/.dev3.0/bin/dev3` that every agent and terminal runs — a source run used to point it at the `bun` binary (breaking every command with `Script not found`), and a local app build used to copy its own unmerged branch build over it silently. Only an installed build writes that name now; a developer who wants their branch's CLI there can opt in with `DEV3_INSTALL_MANAGED_CLI=1`.",
		"short": "Dev builds stop hijacking the dev3 CLI"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "drop-ip-override-geolocation",
		"title": "Analytics no longer looks up your public IP address from a third-party service, and no longer sends it to Google Anal...",
		"body": "Analytics no longer looks up your public IP address from a third-party service, and no longer sends it to Google Analytics; any IP a previous version cached on your machine is erased on the next launch. Your country is now derived from your computer's own timezone instead, with no network call, and no city or region is sent. The rest of the analytics payload was reshaped at the same time: how many projects and tasks you have, and how long ago you installed dev3, are reported only as coarse bands, and no project or task identifier goes into the page address any more. Analytics also reports which build sent an event now, so a canary or source build is labelled as one instead of reading as the stable release on the same version number.",
		"short": "App no longer sends your IP"
	},
	{
		"date": "2026-08-27",
		"type": "feature",
		"slug": "message-variant-flag",
		"title": "`dev3 message` now takes `--variant <i>` next to `--task seq:<N>`, so one member of a live variant group can be addre...",
		"body": "`dev3 message` now takes `--variant <i>` next to `--task seq:<N>`, so one member of a live variant group can be addressed by the number on its card instead of a 36-char UUID. A wrong index fails loudly and names the indices that do exist, and the reply command inside a cross-task message envelope uses the readable form too.",
		"short": "Address a variant by seq"
	},
	{
		"date": "2026-08-27",
		"type": "chore",
		"slug": "neutral-placeholders-in-sample-data",
		"title": "Sample data, test fixtures and doc examples now use generic placeholder names and example.com addresses instead of on...",
		"body": "Sample data, test fixtures and doc examples now use generic placeholder names and example.com addresses instead of one-off ad-hoc values, so the same names read consistently everywhere."
	},
	{
		"date": "2026-08-27",
		"type": "feature",
		"slug": "optional-pane-dimming",
		"title": "Settings → Terminal has a new \"Dim inactive panes\" toggle",
		"body": "Settings → Terminal has a new \"Dim inactive panes\" toggle. tmux terminals darken every split except the focused one; switching it off gives all panes the same colors, and the change reaches running sessions immediately instead of waiting for a restart.",
		"short": "Turn off inactive pane dimming",
		"suggestedBy": "vit-pavlenko",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1568",
		"issueRef": "#1568"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "orphaned-completion-approval-dialog",
		"title": "A window that reloaded while an agent was waiting for completion approval used to take the only copy of that dialog w...",
		"body": "A window that reloaded while an agent was waiting for completion approval used to take the only copy of that dialog with it, leaving the agent blocked and the task unable to ask again for the rest of the app session. A connecting window now picks up any completion request that is still waiting and re-draws it.",
		"short": "Reloading no longer strands an approval"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "plural-count-strings",
		"title": "Counts next to a noun no longer say \"1 commits ahead\" or \"1 коммитов позади\": 21 flat strings across English, Russian...",
		"body": "Counts next to a noun no longer say \"1 commits ahead\" or \"1 коммитов позади\": 21 flat strings across English, Russian and Spanish gained proper plural forms, and the diff badge's hardcoded English \"file/files\" now goes through the translations. Plural forms come from the runtime's own CLDR table (`Intl.PluralRules`) instead of a hand-written Russian branch, so a future locale needs no code, and a new test fails on any count string that forgets its plural forms.",
		"short": "Counts read correctly at one"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "quiet-renderer-test-output",
		"title": "The renderer test run printed 12 192 lines of output and now prints 589",
		"body": "The renderer test run printed 12 192 lines of output and now prints 589. Along the way it turned up real defects rather than just noise: the suite was firing Google Analytics hits and an ipify lookup from every dev machine and CI runner, three test files were missing `getSpaces` from their RPC mock, and `TaskCard`, `SpaceGroupedProjects` and the agent-traffic ledger were rendering lists with missing or colliding React keys. Terminal and RPC setup traces moved to an opt-in debug channel (`localStorage[\"dev3-debug\"] = \"terminal,rpc\"`), React's repeated act(...) boilerplate is now one tallied line per file, and the FolderPickerModal test that failed on ubuntu CI was fixed at its real cause.",
		"short": "Renderer tests stop spamming 12k log lines"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "responsive-artifact-tables",
		"title": "Tables in dev3 HTML artifacts no longer scroll sideways or drop columns on narrow screens",
		"body": "Tables in dev3 HTML artifacts no longer scroll sideways or drop columns on narrow screens. Below 768px of the table's own container each row becomes a stack of labelled lines, with the shell copying every column heading onto the cells beneath it, so a plain `<table>` needs no new markup to get it. This removes the `.evidence-table-scroll` horizontal scroller and the rule that hid the third and fifth column below 560px, which silently deleted data; print still gets real columns and a repeating header.",
		"short": "Artifact tables stack instead of scrolling"
	},
	{
		"date": "2026-08-27",
		"type": "feature",
		"slug": "task-create-type",
		"title": "`dev3 task create` now takes `--type coordinator|pr-review|standard`, the same values `dev3 task update --type` accep...",
		"body": "`dev3 task create` now takes `--type coordinator|pr-review|standard`, the same values `dev3 task update --type` accepts, so a task can be created with its role already set instead of created and then updated. The role brief is written into the description at creation, so a task launched straight away is told what it is rather than reading a badge its agent was never given.",
		"short": "Create coordinator or review tasks from the CLI"
	},
	{
		"date": "2026-08-27",
		"type": "feature",
		"slug": "tasks-list-priority",
		"title": "`dev3 tasks list` now prints a PRI column and orders each group the way the board orders a column — highest priority ...",
		"body": "`dev3 tasks list` now prints a PRI column and orders each group the way the board orders a column — highest priority first, newest seq breaking ties; `--sort seq` restores the old chronological order. `--priority P0,P1` filters by band and composes with `--status` and `--label`, the coordinator's `<dev3-board>` snapshot carries each task's priority, and the singular `dev3 project list` now works as an alias instead of failing with \"Unknown command\".",
		"short": "Priority in dev3 tasks list"
	},
	{
		"date": "2026-08-27",
		"type": "feature",
		"slug": "terminal-osc8-hyperlinks",
		"title": "Markdown links that agents print in the terminal (OSC 8 hyperlinks, e.g",
		"body": "Markdown links that agents print in the terminal (OSC 8 hyperlinks, e.g. Claude Code's PR/issue references) now underline on hover, show their destination URL in a tooltip, and open in the browser on Cmd/Ctrl+Click. tmux forwards them via the `hyperlinks` terminal feature, `FORCE_HYPERLINK=1` opts hyperlink-capable CLIs into emitting them (Project Settings env can turn it off), and the renderer recovers each link's URL from the output stream (ghostty-web's wasm never exposes it), refusing to follow a label that untrusted output later re-mapped elsewhere.",
		"short": "Clickable hyperlinks in the terminal"
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "test-socket-path-length",
		"title": "Unix socket fixture paths in the test suites now come from one short, run-scoped socket root instead of the deep isol...",
		"body": "Unix socket fixture paths in the test suites now come from one short, run-scoped socket root instead of the deep isolated temp dir, so they fit the kernel's 104-byte limit by construction. On Node 23 and newer this fixes ten tests in native-pane-owner-forward.test.ts that failed with listen EINVAL; on older Node the same paths were being silently truncated to 103 bytes and bound at the wrong name. An audit test now fails any test file that builds a socket path under a deep temp root."
	},
	{
		"date": "2026-08-27",
		"type": "fix",
		"slug": "tmux-socket-file-leak",
		"title": "dev3 no longer accumulates dead tmux socket files in the system temp directory forever: every test that mints a pid-k...",
		"body": "dev3 no longer accumulates dead tmux socket files in the system temp directory forever: every test that mints a pid-keyed socket now unlinks it, and the app sweeps dev3-prefixed sockets with nothing listening on them once at startup. Two leaking test temp directories were fixed the same way. Measured on the maintainer's machine: 1 374 stale socket files and 25 591 leftover directories, none of which anything ever removed.",
		"short": "Stop leaving dead tmux sockets"
	},
	{
		"date": "2026-08-27",
		"type": "docs",
		"slug": "ux-manifest-artifact-versions",
		"title": "The UX manifest now records artifact version switching as an allowed action of the task artifact workspace, and corre...",
		"body": "The UX manifest now records artifact version switching as an allowed action of the task artifact workspace, and corrects the shared-images retention line that claimed artifacts are also kept unbounded — republishing under the same title groups into one record capped at 20 versions."
	},
	{
		"date": "2026-08-26",
		"type": "feature",
		"slug": "20-phone-notifications",
		"title": "Task notifications can now leave the machine, so a blocked agent reaches you when dev-3.0 is closed and no browser ta...",
		"body": "Task notifications can now leave the machine, so a blocked agent reaches you when dev-3.0 is closed and no browser tab is open: a command or webhook you configure in `~/.dev3.0/notifications.json` receives each one as JSON on stdin, and any browser served over HTTPS — including an iPhone with dev-3.0 added to the Home Screen — can register for Web Push, with the payload encrypted end to end so the push service relays it without being able to read it. dev-3.0 runs no server for either and never picks a destination: an install with no config and no registered device sends nothing anywhere, and the VAPID keypair is generated locally. The first time a browser could accept push it is offered once as a dismissible toast that takes you to the setting where you switch it on; ignore it and it never asks again.",
		"short": "Task notifications reach your phone"
	},
	{
		"date": "2026-08-26",
		"type": "feature",
		"slug": "45-mmd-mermaid-render",
		"title": "Standalone Mermaid files (`.mmd`) now render the same way markdown does: the file preview you get from Cmd/Ctrl+Click...",
		"body": "Standalone Mermaid files (`.mmd`) now render the same way markdown does: the file preview you get from Cmd/Ctrl+Clicking a path opens the drawn diagram with a Raw toggle, and in the diff viewer a changed `.mmd` file gets the Preview toggle and shows the resulting diagram instead of raw diagram source.",
		"short": "Mermaid .mmd files render as diagrams"
	},
	{
		"date": "2026-08-26",
		"type": "docs",
		"slug": "contributor-checklist-and-supersede-convention",
		"title": "Added a pull request template and a CONTRIBUTING.md distilling the rules external contributions most often bounce on ...",
		"body": "Added a pull request template and a CONTRIBUTING.md distilling the rules external contributions most often bounce on (changelog merge-date, full-suite verification, rebase, i18n, registries, dependency pinning), documented the decision-record supersede convention in AGENTS.md and decisions/README.md, and documented the search-token help strings (help.ts, tips.ts) as a surface to keep in lockstep. The pre-PR test gate now names bun run test:full explicitly, since the plain bun run test skips slow e2e suites that CI runs, and the exact-version pinning rule for new dependencies is written down in AGENTS.md. Derived from an audit of the last two months of PR reviews."
	},
	{
		"date": "2026-08-26",
		"type": "fix",
		"slug": "landing-mobile-horizontal-scroll",
		"title": "Fixed the landing page scrolling sideways on phones: the footer link row was a non-wrapping flex line that pushed the...",
		"body": "Fixed the landing page scrolling sideways on phones: the footer link row was a non-wrapping flex line that pushed the document 65px wider than the viewport. It now wraps and centers, so the page fits at every width from 320px up.",
		"short": "No sideways scroll on mobile"
	},
	{
		"date": "2026-08-26",
		"type": "chore",
		"slug": "mock-heavy-backend-test-fixtures",
		"title": "The backend test suite stops building a real git repository for every diff test: `getTaskDiff`'s recent-mode suite no...",
		"body": "The backend test suite stops building a real git repository for every diff test: `getTaskDiff`'s recent-mode suite now replays a recorded transcript of real git output instead of spawning git, and the shared git fixture builds its template once per run instead of once per test file and repoints the clone's remote by editing `.git/config` rather than spawning `git remote set-url`. One settings test also pastes the 649-character built-in review prompt instead of typing it keystroke by keystroke. Counted over one backend run, real process spawns drop from 341 to 199 and no test lost an assertion; the suite's 727 real temp directories are spread across some fifty unrelated files and are barely touched here."
	},
	{
		"date": "2026-08-26",
		"type": "feature",
		"slug": "selectable-posix-shell",
		"title": "Settings → Terminal now has a Shell picker: automatic (your login shell, then whichever of zsh, bash or sh is install...",
		"body": "Settings → Terminal now has a Shell picker: automatic (your login shell, then whichever of zsh, bash or sh is installed) or a pinned zsh, bash or sh, with the picker naming any flavor this machine does not have. dev3 no longer assumes /bin/zsh exists, so a minimal Linux box with only a POSIX sh gets working terminals, dev3 on PATH via ~/.profile, a worktree-relative prompt, and generated wrapper scripts that stay clear of bash-only syntax.",
		"short": "Pick the shell dev3 runs"
	},
	{
		"date": "2026-08-26",
		"type": "fix",
		"slug": "update-prompt-and-toasts-share-one-stack",
		"title": "The update-ready prompt and the toast stack no longer overlap in the top-right corner",
		"body": "The update-ready prompt and the toast stack no longer overlap in the top-right corner. The prompt now pins above the toasts inside a single column, so an arriving notification can never cover its version header, its \"what's new\" list, or its Restart button.",
		"short": "Update prompt no longer hides under toasts"
	},
	{
		"date": "2026-08-25",
		"type": "feature",
		"slug": "01-telemetry-opt-out",
		"title": "Telemetry can now be switched off in Settings → System → Telemetry, or from the environment with DEV3_TELEMETRY=off o...",
		"body": "Telemetry can now be switched off in Settings → System → Telemetry, or from the environment with DEV3_TELEMETRY=off or DO_NOT_TRACK=1 — previously the only way out was a build from source. Switching off is immediate and stops every channel at once, and an opted-out install no longer hands its per-install id to the renderer. Separately, PostHog autocapture now masks element text and attributes so task titles and project names cannot be harvested from the UI, absolute paths are stripped from crash reports before they are sent, exception capture is left to the server-side config instead of being forced on, and session replay plus in-app surveys are pinned off in the client so they cannot be switched on remotely. Found and reported by Mathias Caldas (Screenz mate), whose independent privacy audit of the shipped build prompted all of it — thank you.",
		"short": "Turn telemetry off without rebuilding"
	},
	{
		"date": "2026-08-25",
		"type": "feature",
		"slug": "02-agent-traffic-log",
		"title": "Messages your agents send each other with `dev3 message` are no longer just a 30-second toast, once you switch the be...",
		"body": "Messages your agents send each other with `dev3 message` are no longer just a 30-second toast, once you switch the beta on in Settings → System → Advanced Experience → \"Agent traffic readout and log\". The overflow (⋯) menu then has an Agent traffic row, and a small wire pill sits next to the ⋯ button for any project whose agents have messaged each other — it carries the count of messages you have not seen yet and drops that number once you look, while the pill itself stays. Both open a panel of live pairs showing which task has not answered yet, and a click lands you in it. The full history opens with ⇧⌘M (also View → Agent Traffic Log, or the command palette): every message the agents typed into each other, kept for 30 days, filterable to one pair or to the messages dev3 could not prove reached the other side. On a phone it all lives in the hamburger, where the log opens as a sheet. Messages are recorded on disk either way, so turning it on later shows the history you already have.",
		"short": "See who your agents are messaging"
	},
	{
		"date": "2026-08-25",
		"type": "feature",
		"slug": "20-coordinator-board-injection",
		"title": "Every message dev3 delivers to a coordinator task now ends with a `<dev3-board>` snapshot: each task not parked in To...",
		"body": "Every message dev3 delivers to a coordinator task now ends with a `<dev3-board>` snapshot: each task not parked in To Do, everything finished in the last 24 hours, and how long each one has been sitting in the column it is in. A child reporting in therefore also tells the coordinator what else moved while it was not being spoken to, and the coordinator answers from that instead of spending a turn on `dev3 task list`. A burst of messages carries exactly one snapshot, built as it is typed.",
		"short": "Messages to a coordinator carry the board"
	},
	{
		"date": "2026-08-25",
		"type": "feature",
		"slug": "agent-request-launch-variants",
		"title": "When an agent asks to start a task, the approval dialog now lets you add variants before you launch — the same picker...",
		"body": "When an agent asks to start a task, the approval dialog now lets you add variants before you launch — the same picker the manual Launch modal has. The default is still exactly one task, and the button says how many it will start. The requesting agent is handed one address per variant, because a live variant group shares its seq.",
		"short": "Launch variants from an agent request"
	},
	{
		"date": "2026-08-25",
		"type": "fix",
		"slug": "artifact-dashboard-grid-panel-collapse",
		"title": "A panel dropped into an artifact's `.dashboard-grid` without a width class used to land in a single column of the 12-...",
		"body": "A panel dropped into an artifact's `.dashboard-grid` without a width class used to land in a single column of the 12-column grid and render as an ~86px sliver with one word per line. Unsized panels now take the whole row, and authors can place them side by side with the new `span-3` … `span-9` classes, which apply above 900px and go full width below that and in print.",
		"short": "Artifact panels no longer collapse"
	},
	{
		"date": "2026-08-25",
		"type": "feature",
		"slug": "byo-tunnel-origin-check",
		"title": "Bring your own tunnel: a custom ngrok-like command configured in Settings → System now serves every tunnel dev3 start...",
		"body": "Bring your own tunnel: a custom ngrok-like command configured in Settings → System now serves every tunnel dev3 starts — the remote-access URL and per-task exposed ports alike — while the built-in Cloudflare quick tunnel stays the default. While a custom provider is configured, the remote-access origin check also accepts an Origin matching X-Forwarded-Host, so Host-rewriting tunnel proxies no longer break browser auth and WebSocket upgrades.",
		"short": "Remote access behind any tunnel"
	},
	{
		"date": "2026-08-25",
		"type": "fix",
		"slug": "center-header-nav-chevrons",
		"title": "The back, forward, project-switcher and variant-switcher chevrons in the global header now centre inside their button...",
		"body": "The back, forward, project-switcher and variant-switcher chevrons in the global header now centre inside their buttons instead of drifting to the left edge. On touch devices the 24px touch-target floor grows those buttons past their padding, and the glyphs had no explicit centring to follow; the back and forward chevrons were also drawn a stroke's width off-centre inside their own icon box.",
		"short": "Header arrows sit centred again"
	},
	{
		"date": "2026-08-25",
		"type": "fix",
		"slug": "codex-config-tests-read-the-host-dialect",
		"title": "The Codex hook-block tests hardcoded the POSIX spelling of the dev3 CLI, so they\r\nfailed on the windows-latest proof ...",
		"body": "The Codex hook-block tests hardcoded the POSIX spelling of the dev3 CLI, so they\r\nfailed on the windows-latest proof job where the generated command is a quoted\r\n`dev3.exe` path with no shell guard. `ensureCodexConfig` now takes the hook\r\ndialect as an option, and the tests pin both dialects explicitly so each runner\r\ncovers the other platform's output too.",
		"short": "Windows proof green again"
	},
	{
		"date": "2026-08-25",
		"type": "fix",
		"slug": "codex-hooks-leak-into-foreign-sessions",
		"title": "dev3's Codex status hooks are declared in `~/.codex/config.toml`, which Codex loads in every session on the machine, ...",
		"body": "dev3's Codex status hooks are declared in `~/.codex/config.toml`, which Codex loads in every session on the machine, so they were waking up — and spending a couple of hundred milliseconds per tool call — in Codex sessions that had nothing to do with dev3. The declared command now checks for a dev3 task first and spawns nothing at all outside one (POSIX; on Windows the hook runner may be cmd or PowerShell, so the command is unchanged there), and duplicate hook blocks left behind in the config are collected instead of piling up.",
		"short": "Codex hooks stay out of other sessions",
		"suggestedBy": "vit-pavlenko",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1527",
		"issueRef": "#1527"
	},
	{
		"date": "2026-08-25",
		"type": "feature",
		"slug": "configurable-terminal-font-and-pane-hotkeys",
		"title": "Settings → Terminal now ships the 15 most-installed Nerd Fonts — JetBrains Mono, Meslo, Hack, Fira Code, IBM Plex, Ca...",
		"body": "Settings → Terminal now ships the 15 most-installed Nerd Fonts — JetBrains Mono, Meslo, Hack, Fira Code, IBM Plex, Cascadia, Iosevka and the rest — so picking one installs nothing, and \"Compare all 15 fonts\" renders the same terminal block in every one, with clicking a row applying it live. The choice covers your terminals and every monospace thing in the app: branch names, paths, seq numbers, script editors. Nerd Font icons keep their own font, so they cannot break. A font wider than JetBrains Mono is trimmed so it can never take columns away from a terminal you already sized by eye, and the setting says when that happened; a font you type yourself still works, is measured the same way, and is called out when this device does not have it. Pane zoom and pane swap also got prefix-free, rebindable shortcuts (⇧⌘Enter to zoom, ⇧⌘, / ⇧⌘. to swap) that work on the native backend and in the browser, where tmux's ⌃B z / { / } are not available — swap is new on the native backend and is also reachable from the pane layout menu and the Terminal menu (#1514).",
		"short": "Pick your monospace font from 15",
		"suggestedBy": "vit-pavlenko",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1511",
		"issueRef": "#1511"
	},
	{
		"date": "2026-08-25",
		"type": "fix",
		"slug": "coordinator-prompt-keeps-bookkeeping-in-reasoning",
		"title": "The built-in Coordinator prompt now tells the agent to keep its internal bookkeeping — relay chains, ruled-out hypoth...",
		"body": "The built-in Coordinator prompt now tells the agent to keep its internal bookkeeping — relay chains, ruled-out hypotheses, child transcripts, self-correction — in its reasoning instead of the messages the user reads, and to keep each status to one line per task plus the pending decision. The reversal rule also names its addressee: announce a reversal to the user first, saying what no longer holds, what replaces it, and who was already told the old version.",
		"short": "Coordinator status messages stay short"
	},
	{
		"date": "2026-08-25",
		"type": "fix",
		"slug": "dashboard-mobile-header-row",
		"title": "On a phone the dashboard's project count, New space and Add project no longer share one cramped row — the count sits ...",
		"body": "On a phone the dashboard's project count, New space and Add project no longer share one cramped row — the count sits on its own line and the two buttons split the width below it, so Add project is never pushed off the right edge. The space filter and the search field now match heights on mobile too.",
		"short": "Dashboard header fits on phones"
	},
	{
		"date": "2026-08-25",
		"type": "feature",
		"slug": "mobile-summary-bar-diff-button",
		"title": "The task summary bar on a phone now carries a compact diff chip next to status, priority and the artifact/image reado...",
		"body": "The task summary bar on a phone now carries a compact diff chip next to status, priority and the artifact/image readouts, so the diff is one tap away instead of hiding behind the kebab menu. It appears whenever the branch has anything to show — commits or just uncommitted work — and opens the side that actually has the changes.",
		"short": "Diff button on the mobile task bar"
	},
	{
		"date": "2026-08-25",
		"type": "fix",
		"slug": "no-auto-restart-while-remote",
		"title": "The update toast's 5-minute auto-restart countdown no longer runs while remote access is engaged — a public tunnel th...",
		"body": "The update toast's 5-minute auto-restart countdown no longer runs while remote access is engaged — a public tunnel that is up or coming up, or any browser attached. The toast says why and keeps the manual \"Restart to Update\" button, the timer stops if a remote session appears mid-countdown, and it starts a fresh five minutes once remote access goes away.",
		"short": "No auto-restart while remote is on"
	},
	{
		"date": "2026-08-25",
		"type": "fix",
		"slug": "port-release-lost-update",
		"title": "Releasing a task's ports no longer races a second app instance allocating ports at the same moment: the release now t...",
		"body": "Releasing a task's ports no longer races a second app instance allocating ports at the same moment: the release now takes the same cross-process lock as allocation and re-reads the assignment file first, so a peer's just-persisted task can no longer be erased from port-assignments.json and its ports handed out twice."
	},
	{
		"date": "2026-08-25",
		"type": "fix",
		"slug": "setup-failed-notice-agent-aware",
		"title": "The \"Setup failed\" popup used to claim the agent was never started and offer to start it anyway — but in the default ...",
		"body": "The \"Setup failed\" popup used to claim the agent was never started and offer to start it anyway — but in the default parallel launch mode the agent is already running, and that button destroyed it along with its context. The notice now knows which happened: a live agent gets a small dismissible strip offering to re-run setup, a never-started agent keeps the dialog with the re-run leading. Dismissing it sticks instead of returning on the next task switch, and \"Re-run project setup\" is also available from the Scripts dropdown.",
		"short": "Setup-failure notice stops lying"
	},
	{
		"date": "2026-08-25",
		"type": "fix",
		"slug": "space-filter-auto-expand",
		"title": "Selecting a space in the rail or filter sheet now expands that space's group on the dashboard if it was left collapse...",
		"body": "Selecting a space in the rail or filter sheet now expands that space's group on the dashboard if it was left collapsed from a previous session, so filtering to a space no longer shows an empty collapsed header.",
		"short": "Space filter auto-expands its group"
	},
	{
		"date": "2026-08-25",
		"type": "feature",
		"slug": "toast-clear-all",
		"title": "A \"Clear all (n)\" chip now appears under the toast stack whenever two or more notifications are on screen, so a pile ...",
		"body": "A \"Clear all (n)\" chip now appears under the toast stack whenever two or more notifications are on screen, so a pile that built up while you were away goes away in one click instead of five; hovering it pauses every toast timer so the button cannot slip out from under the cursor. And `dev3 notify` now reaches every running dev3 instance instead of only the primary one, so a toast shows up in the app you are actually looking at — desktop window, phone, or a task's dev-server — while `--desktop` stays single-target because Notification Center is one surface per machine.",
		"short": "Clear all toasts at once"
	},
	{
		"date": "2026-08-24",
		"type": "fix",
		"slug": "closed-task-back-to-kanban",
		"title": "Completing or cancelling a task while its view is open no longer leaves the terminal pane showing a \"Task environment...",
		"body": "Completing or cancelling a task while its view is open no longer leaves the terminal pane showing a \"Task environment error / restart session\" card for a worktree that was removed on purpose. The pane now shows a plain empty state naming the outcome with a single Back to Kanban button, and it stops polling the dead session."
	},
	{
		"date": "2026-08-24",
		"type": "fix",
		"slug": "cross-project-agent-reply-command",
		"title": "A cross-task agent message sent between two different projects handed the receiver a reply command it could not run: ...",
		"body": "A cross-task agent message sent between two different projects handed the receiver a reply command it could not run: `dev3 message` scopes every request to the sender's own board, so the bare `--task seq:<N>` was looked up there and failed. The generated `<reply-with>` command — and the reply command printed after an agent-initiated launch — now carry `--project <id>` whenever the two tasks live on different boards, and a scoped \"task not found\" error names the project it searched instead of blaming an id change. The same command also stopped handing out a raw UUID for every variant task: it falls back to the id only while another live task still shares the seq, so a variant whose siblings were dropped is addressed as the readable `seq:<N>` again.",
		"short": "Cross-project replies now work"
	},
	{
		"date": "2026-08-24",
		"type": "feature",
		"slug": "file-picker-for-binary-paths",
		"title": "Every field that used to demand a hand-typed path now has a \"Browse…\" button",
		"body": "Every field that used to demand a hand-typed path now has a \"Browse…\" button. The folder picker learned to pick a file, so the custom binary path in Settings → Agents and the requirements screen can point at a CLI on disk; dotfiles are shown there by default and a \"Hidden files\" toggle works everywhere. It also learned a confined mode used by Clone Paths and Sparse Checkout in project settings: the picker opens at the project root, refuses to leave it, and stores the path relative to the repo, with a second button for picking several folders at once.",
		"short": "Browse instead of typing paths by hand"
	},
	{
		"date": "2026-08-24",
		"type": "docs",
		"slug": "first-task-tutorial-page",
		"title": "The website now carries a screen-by-screen walkthrough of the guided first task at `/first-task.html`: every step of ...",
		"body": "The website now carries a screen-by-screen walkthrough of the guided first task at `/first-task.html`: every step of the tour with a real screenshot, the before/after of the change the agent makes, and what happens after the task closes. Screenshots come from a live run against a brand-new profile, with usernames, machine names and absolute paths blurred out. The landing page, the README quick start and the docs table all link to it, and the page itself says up front that dev-3.0 runs the same tour live — this is the read-ahead version for people who have not installed anything yet."
	},
	{
		"date": "2026-08-24",
		"type": "fix",
		"slug": "send-to-agent-button-is-instant-again",
		"title": "\"Send to agent\" under a review comment, \"Send now\" on a scheduled message, and the note a newly launched agent receiv...",
		"body": "\"Send to agent\" under a review comment, \"Send now\" on a scheduled message, and the note a newly launched agent receives all go into the terminal the moment you click, instead of waiting for the pane to go quiet. The quiet-pane hold now applies only to `dev3 message` and messages that fire on a timer, which is the traffic it was built for.",
		"short": "Send to agent works instantly again"
	},
	{
		"date": "2026-08-24",
		"type": "fix",
		"slug": "task-completion-sound-audible-again",
		"title": "The task completion and cancellation chimes are audible again in packaged builds: Web Audio produces no sound at all ...",
		"body": "The task completion and cancellation chimes are audible again in packaged builds: Web Audio produces no sound at all in the app's WKWebView, so the chimes play through a short audio element instead. Both sounds were re-cut to 0.82s, which keeps them under the threshold above which macOS would hand them the hardware Play/Pause key and stop it from controlling Spotify.",
		"short": "Task completion chime is audible again"
	},
	{
		"date": "2026-08-24",
		"type": "fix",
		"slug": "terminal-links-nested-file-paths",
		"title": "Terminal file links now resolve a file named without its directory — \"architecture.md\" for `docs/architecture.md` — b...",
		"body": "Terminal file links now resolve a file named without its directory — \"architecture.md\" for `docs/architecture.md` — by matching it as a unique path suffix in the task's git file index, so an agent listing several docs no longer underlines only the one that happens to sit at the repo root. Ambiguous names stay unlinked rather than opening a guessed file.",
		"short": "Clickable links for nested file paths"
	},
	{
		"date": "2026-08-23",
		"type": "feature",
		"slug": "10-guided-first-task-tour",
		"title": "The sandbox now comes with a guide instead of an empty board, and it runs the whole loop end to end: a small card rin...",
		"body": "The sandbox now comes with a guide instead of an empty board, and it runs the whole loop end to end: a small card rings the button you should press, holds back the rest of the screen, says what that button does, and moves along on its own once the app moves — from New Task, through the prompt (already filled in), past the difference between Save and Save & Start, through the Launch dialog, to the agent working in its own terminal, the dev server serving the sandbox page, the report the agent publishes, the diff, Merge, and the \"complete the task?\" dialog that closes it. The sandbox itself is now one page with one green button plus a dependency-free server, and the first task is to turn that button blue and show the before and after in a dev3 artifact — a change you can see rather than a diff you have to read. Sandbox tasks also launch in a bypass mode by default, so the agent never stops to ask a brand-new user for permission to run a command they have no way to judge — same model you normally use, only the permission mode differs; your own default is untouched in every other project. The card's button presses the real control for you, a step that waits on the agent says so instead of pretending it is stuck, and the tour follows the app forward without ever rewinding it: you can go back over an explanation, leave with Escape or \"I'll look around myself\", and if it loses sight of what it was pointing at it re-finds its place or says so rather than vanishing. It starts again on every visit to an empty sandbox board until you walk it to the end, and after that help mode carries \"Walk me through the first task\". If no agent CLI is installed — or one is installed but not logged in — the first-run strip says so and offers Settings instead of a sandbox whose very first task would have died on a login prompt. Help mode also explains two more things it had been silent about: the Project / Space / Global switcher above the task list, and the \"Did you know?\" card.",
		"short": "dev-3.0 walks you through task one"
	},
	{
		"date": "2026-08-23",
		"type": "feature",
		"slug": "agent-message-log",
		"title": "Every message delivered into a task's agent is now recorded in an append-only per-project log at `~/.dev3.0/data/<pro...",
		"body": "Every message delivered into a task's agent is now recorded in an append-only per-project log at `~/.dev3.0/data/<project>/messages/YYYY-MM-DD.jsonl`, so task-to-task traffic survives the 30-second toast that used to be its only trace. Each row names both ends by task id and seq, the body (or the spill-file pointer for a body too large to type), whether it was immediate or scheduled, and the delivery outcome including attempts that landed nowhere. History is kept for 30 days and older day-files are deleted whole; a new `readAgentMessageLog` RPC reads it back newest-first.",
		"short": "Agent messages are now logged"
	},
	{
		"date": "2026-08-23",
		"type": "fix",
		"slug": "artifact-version-popover",
		"title": "The artifact version popover now hangs under the version chip instead of the viewer header's right edge, clamped so i...",
		"body": "The artifact version popover now hangs under the version chip instead of the viewer header's right edge, clamped so it stays inside the docked pane, and a click anywhere outside it closes it — including over the artifact itself, whose sandboxed iframe swallowed those clicks before."
	},
	{
		"date": "2026-08-23",
		"type": "fix",
		"slug": "hold-agent-message-text-not-just-enter",
		"title": "An incoming `dev3 message` from another task is no longer typed into the agent's input box the moment it arrives, so ...",
		"body": "An incoming `dev3 message` from another task is no longer typed into the agent's input box the moment it arrives, so it can't get mixed into the line you are writing. The whole message — text and Enter — waits for that pane to be quiet for 15 seconds, waits a full minute after your last keystroke (with no deadline at all while you keep typing), and lands immediately when you press Enter on your own line. A burst of messages from several peers still becomes exactly one turn for the receiver.",
		"short": "Agent messages no longer interrupt your typing",
		"suggestedBy": "markkesty",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1495",
		"issueRef": "#1495"
	},
	{
		"date": "2026-08-23",
		"type": "feature",
		"slug": "launch-dialog-priority",
		"title": "A task an agent asks to start now inherits the requesting task's priority instead of always landing on P3, and the la...",
		"body": "A task an agent asks to start now inherits the requesting task's priority instead of always landing on P3, and the launch approval dialog's priority badge became a picker, so you can set the band before the task starts. An explicit priority on the target task still wins, and the priority you pick is applied even if the dialog approves itself while you are away.",
		"short": "Launched tasks inherit your priority",
		"suggestedBy": "markkesty",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1496",
		"issueRef": "#1496"
	},
	{
		"date": "2026-08-23",
		"type": "fix",
		"slug": "pane-nav-off-alt-arrows",
		"title": "Prefix-free tmux pane switching moved from Alt+arrows to Alt+Shift+arrows, and dev3's managed shells (zsh and bash) n...",
		"body": "Prefix-free tmux pane switching moved from Alt+arrows to Alt+Shift+arrows, and dev3's managed shells (zsh and bash) now bind Alt+arrows and Ctrl+arrows to word-by-word cursor motion — zsh binds neither out of the box, and macOS claims Ctrl+arrows system-wide for \"move a space\". `⌃B` + arrows keeps working as before, and the Keyboard Shortcuts overlay's Terminal tab lists the new combo.",
		"short": "Alt+arrows now jump by word"
	},
	{
		"date": "2026-08-23",
		"type": "feature",
		"slug": "rename-project",
		"title": "Projects can now be renamed: Project Settings → Board → Project name, saved as soon as you press Enter or leave the f...",
		"body": "Projects can now be renamed: Project Settings → Board → Project name, saved as soon as you press Enter or leave the field. Only the display name changes — the folder on disk, its worktrees, its tasks and every path derived from them stay exactly where they are, and the path is shown under the field to make that obvious. Renaming the built-in Operations board now shows your own name everywhere while it keeps its pinned position and its ⌘0 shortcut. Suggested by Amit Cohen.",
		"short": "Rename a project"
	},
	{
		"date": "2026-08-23",
		"type": "chore",
		"slug": "retune-agent-message-coalescing",
		"title": "Retuned the window that holds a `dev3 message` Enter so a burst of peer messages\r\nbecomes one agent turn: the quiet w...",
		"body": "Retuned the window that holds a `dev3 message` Enter so a burst of peer messages\r\nbecomes one agent turn: the quiet window is now 15 seconds (was 10) and the hard\r\nceiling 60 seconds (was 30). The CLI's \"sent\" line and the injected agent skill\r\ntext now quote the live constant instead of restating it, so the number agents are\r\ntold can no longer drift from the number the code honours."
	},
	{
		"date": "2026-08-23",
		"type": "feature",
		"slug": "review-task-board-identity",
		"title": "A PR-review task is now called \"Review of #493 from Arseny Pavlenko about pin tmux to a vendored keg\" instead of the ...",
		"body": "A PR-review task is now called \"Review of #493 from Arseny Pavlenko about pin tmux to a vendored keg\" instead of the first 80 characters of the review prompt, so several reviews on the board are finally distinguishable at a glance; a branch with no pull request falls back to the branch, its commit author and its subject. That title is a draft built from the pull request's own words — the built-in review prompt tells the reviewing agent to replace it with what the diff actually does, and to leave a verdict overview: safe to merge, merge after fixes or do not merge, followed by how many blockers, fixes and nitpicks it found.",
		"short": "Review tasks name themselves"
	},
	{
		"date": "2026-08-23",
		"type": "feature",
		"slug": "search-tasks-by-pr-number",
		"title": "Task search now finds a task by its pull request: type a number (`1488`, `#1488`, `pr1488`) or paste the full GitHub ...",
		"body": "Task search now finds a task by its pull request: type a number (`1488`, `#1488`, `pr1488`) or paste the full GitHub PR link, on the Kanban filter bar and in the Active Tasks sidebar. A pasted link is matched on owner/repo/pull/number, so PR 42 of one repo never matches PR 42 of another.",
		"short": "Find tasks by PR number or link"
	},
	{
		"date": "2026-08-23",
		"type": "fix",
		"slug": "task-completion-sound-silent-on-release-builds",
		"title": "The task-sound debug probe no longer reports a healthy pipeline while playing nothing, and the audio unlock handlers ...",
		"body": "The task-sound debug probe no longer reports a healthy pipeline while playing nothing, and the audio unlock handlers stay installed so a later click can recover a sound the browser refused. The chimes themselves were still silent on packaged builds after this; that is fixed separately.",
		"short": "Honest task-sound diagnostics"
	},
	{
		"date": "2026-08-22",
		"type": "feature",
		"slug": "01-remote-self-update",
		"title": "A headless `dev3 remote` box keeps itself current: it checks every 30 minutes and installs the update on its own once...",
		"body": "A headless `dev3 remote` box keeps itself current: it checks every 30 minutes and installs the update on its own once nothing is in progress, no terminal is printing and no browser is connected — and the restart hands its port and live Cloudflare tunnel to the new build, so the public link and your open session survive it. The new `dev3 update` command does the same thing on demand from any shell, detecting whether this install came from a Homebrew formula, a cask, or a plain CLI tarball — and saying so plainly when an install is one it must not touch, such as the PATH copy the desktop app maintains (`--check` and `--dry-run` report without changing anything). Turn the automatic half off in Settings → System.",
		"short": "Remote boxes now update themselves"
	},
	{
		"date": "2026-08-22",
		"type": "feature",
		"slug": "10-coordinator-task-type",
		"title": "The new-task popup now has a Task type selector — Standard, Coordinator, or PR review — sitting directly under the de...",
		"body": "The new-task popup now has a Task type selector — Standard, Coordinator, or PR review — sitting directly under the description instead of the old PR-review toggle hidden inside the branch block. Picking Coordinator drops a built-in brief above your own text and marks the task as the board's coordinator: its card wears a dashed green border and a Coordinator chip, it sorts above every priority on the board and in the active-tasks sidebar, and it never auto-completes after a merge. Picking PR review stores the type too, but stays quiet about it: the card just says PR review, with no border and no sort change — it is an ordinary task with a job, not one that outranks the board. Any task can change type later with `dev3 task update --type coordinator|pr-review|standard`, which also rewrites the role brief in the description and tells the running agent, so the badge never claims a role its agent was not given. Both preset prompts are editable app-wide in Settings and per project in Project Settings.",
		"short": "Coordinator task type"
	},
	{
		"date": "2026-08-22",
		"type": "feature",
		"slug": "10-first-run-advertises-help-mode",
		"title": "A small callout now appears beside the ? button in the header on the dashboard, board, task and project-settings scre...",
		"body": "A small callout now appears beside the ? button in the header on the dashboard, board, task and project-settings screens, saying that it explains every screen — it goes away for good once you open help mode or close it. A brand-new install also gets a short line in place of the empty Productivity Stats card saying what dev-3.0 does, Spaces and Add project are now explained in help mode, the help icon inside the New Task, Launch and Add Project dialogs is legible instead of a grey dot, empty board columns stop pointing at a New Task button they do not have, the To Do column explains your first task and which save button launches an agent, and tips no longer appear on a board with zero tasks. Tooltips, hover cards and help cards also float properly now instead of looking glued to the surface under them. The Add project dialog now says in two lines where a task's branch comes from and that your own working copy is left alone. And if you have nothing to point dev-3.0 at yet — or nothing you are willing to experiment on — there is a \"Try a sandbox repo\" button on that same first-run strip: it creates a tiny throwaway repository of its own and drops you on its board, so you can watch a task get its own branch, worktree and agent without touching your own work. Written after walking the real first run on a genuinely empty home directory.",
		"short": "First run points at the ? button"
	},
	{
		"date": "2026-08-22",
		"type": "feature",
		"slug": "30-auto-approve-agent-launch",
		"title": "When an agent asks to start another task, the approval dialog now starts a countdown and approves itself after five m...",
		"body": "When an agent asks to start another task, the approval dialog now starts a countdown and approves itself after five minutes, so a user who stepped away delays the launch instead of blocking it. Declining still cancels it, the completion dialog is deliberately untouched, and Settings → Tasks → \"Auto-approve agent launch requests\" changes the delay or turns it off.",
		"short": "Launch requests approve themselves"
	},
	{
		"date": "2026-08-22",
		"type": "feature",
		"slug": "30-variant-switcher-in-breadcrumb",
		"title": "The task breadcrumb badge (`#1636-1`) is now a switcher: with two or more live variants it grows a chevron that opens...",
		"body": "The task breadcrumb badge (`#1636-1`) is now a switcher: with two or more live variants it grows a chevron that opens the variant menu, so jumping between attempts is one click from the header. Switching from the fullscreen task screen keeps you there instead of dropping you on the board.",
		"short": "Switch variants from the header badge"
	},
	{
		"date": "2026-08-22",
		"type": "fix",
		"slug": "add-variant-on-operations-boards",
		"title": "The Launch task dialog now offers \"+ Add variant\" on Operations (non-git) boards instead of\r\nsilently leaving the slo...",
		"body": "The Launch task dialog now offers \"+ Add variant\" on Operations (non-git) boards instead of\r\nsilently leaving the slot empty. The old guard assumed parallel operations would clobber a\r\nshared folder, but each variant is its own task and gets its own work dir, so they never\r\ncollided.",
		"short": "Add variant works on Operations"
	},
	{
		"date": "2026-08-22",
		"type": "fix",
		"slug": "archived-task-shared-outputs-prominence",
		"title": "Reopening a finished task is usually about what the agent shared, so the archived task modal now leads with it: artif...",
		"body": "Reopening a finished task is usually about what the agent shared, so the archived task modal now leads with it: artifacts first as real cards, images as a thumbnail grid instead of a list of filenames, both above the description rather than buried between it and the notes. The modal header carries the same artifact and image count badges a live task has, each section is a real heading a screen reader can jump to, and an artifact row shows its size, version and asset count instead of the `index.html` every artifact is called.",
		"short": "Shared artifacts and images lead a finished task"
	},
	{
		"date": "2026-08-22",
		"type": "feature",
		"slug": "artifact-versions",
		"title": "Re-publishing an HTML artifact with `dev3 show-artifact` now adds a version to the artifact you already have instead ...",
		"body": "Re-publishing an HTML artifact with `dev3 show-artifact` now adds a version to the artifact you already have instead of a new row, so a report revised twenty times is one row with a version switcher in the viewer rather than twenty near-identical entries. Grouping follows the title, or an explicit `--artifact-id <slug>` that survives re-wording it, and `--new` publishes a separate artifact when two reports genuinely share a title. The viewer opens on the newest version, lists every retained one with its publish time, and states how many the 20-version cap dropped.",
		"short": "Artifacts get versions"
	},
	{
		"date": "2026-08-22",
		"type": "fix",
		"slug": "diff-view-history-step",
		"title": "Opening a task's diff is now a real navigation step: Back returns to the task you opened it from and Forward returns ...",
		"body": "Opening a task's diff is now a real navigation step: Back returns to the task you opened it from and Forward returns to the diff, instead of Back jumping straight out to the board. Applies to every Back gesture — the header arrows, Cmd+[ / Cmd+], the mouse side buttons, the menu, the command palette and Android back.",
		"short": "Back leaves the diff, not the task"
	},
	{
		"date": "2026-08-22",
		"type": "fix",
		"slug": "git-bar-push-lease-merge-push-gates",
		"title": "Push detects when the branch has diverged from origin, renames itself to \"Force push\", and runs `git push --force-wit...",
		"body": "Push detects when the branch has diverged from origin, renames itself to \"Force push\", and runs `git push --force-with-lease=<branch>:<sha>` against a freshly fetched sha instead of failing with an unexplained non-fast-forward; Merge now pushes the base branch to origin behind a confirmation that names the review and CI bypass, so work is not left half-landed in the local clone. A git failure inside the operation pane also raises a toast now instead of only printing in the pane. Foreign-code tasks no longer offer Push, Merge or Create PR at all, and Create PR is unavailable when origin is not a GitHub remote.",
		"short": "Push now force-pushes safely after a rebase"
	},
	{
		"date": "2026-08-22",
		"type": "fix",
		"slug": "help-mode-explains-the-task-screen",
		"title": "Press the ? button on a task and help mode finally outlines the task's own two toolbars and the terminal itself, inst...",
		"body": "Press the ? button on a task and help mode finally outlines the task's own two toolbars and the terminal itself, instead of only the app header and the sidebar — the terminal card explains that it is a real tmux session in this task's own worktree, what the bar along the bottom means, and that the agent keeps running when you close the window. The builtin Operations board also gets its own explanation on the dashboard instead of borrowing the one written for git projects.",
		"short": "Help mode now explains the task screen"
	},
	{
		"date": "2026-08-22",
		"type": "fix",
		"slug": "mark-missing-translation-keys",
		"title": "A translation key that resolves in no locale now renders as ⟦kanban.someKey⟧ instead of the bare key text, so a hole ...",
		"body": "A translation key that resolves in no locale now renders as ⟦kanban.someKey⟧ instead of the bare key text, so a hole in the translations reads as a hole rather than as copy. Plural fallbacks keep the resolved suffix (⟦ports.count_few⟧) so the missing form is identifiable, and in dev builds the console names every key that was missing, fell back to English, or fell back to the wrong plural form."
	},
	{
		"date": "2026-08-22",
		"type": "fix",
		"slug": "merge-button-merges-the-pull-request",
		"title": "The git bar's Merge button merges the branch's open pull request through `gh` instead of squashing into the local bas...",
		"body": "The git bar's Merge button merges the branch's open pull request through `gh` instead of squashing into the local base branch and pushing it, so review, branch protection and CI still gate the landing; the button reads \"Merge PR\" and names the PR in its confirmation. With no pull request it keeps squashing locally as before, and being behind the base no longer blocks the PR route.",
		"short": "Merge now merges the open PR"
	},
	{
		"date": "2026-08-22",
		"type": "fix",
		"slug": "merge-commit-subject-source",
		"title": "Merging a task now takes its commit subject from the branch's own commits — reused verbatim when the branch has a sin...",
		"body": "Merging a task now takes its commit subject from the branch's own commits — reused verbatim when the branch has a single commit — or from the task title, instead of the first 80 characters of the task description with a trailing ellipsis. A scratch placeholder, an already-truncated title, or a title with a newline never reaches the subject, and nothing is ever truncated.",
		"short": "Merge commits get a real subject"
	},
	{
		"date": "2026-08-22",
		"type": "feature",
		"slug": "project-switcher-affordance-and-spaces",
		"title": "The header project breadcrumb became one segmented control — the project name and the dropdown chevron now share a bo...",
		"body": "The header project breadcrumb became one segmented control — the project name and the dropdown chevron now share a bordered shell, the same grammar as the back/forward pair beside it, so the switcher is visible instead of being a 12px glyph nobody clicked. Its list is also grouped by space now: each space is a tinted header with a hairline running to the edge, its projects sit indented off a vertical rule so they read as filed under it, and every space holding the current project is hoisted to the top (spaceless projects land under Home). The ⌘1-9 badges keep following board order.",
		"short": "Project switcher is now visible"
	},
	{
		"date": "2026-08-22",
		"type": "fix",
		"slug": "rebase-compare-ref-without-remote",
		"title": "Rebase now runs against the base the branch dropdown promises",
		"body": "Rebase now runs against the base the branch dropdown promises. In a project with no git remote the button announced the local base branch and then ran `git rebase origin/<base>`, which died with `fatal: invalid upstream` after a failed fetch it had already swallowed — the `params.compareRef || origin/<base>` fallback fired on the normal path, because the renderer sends an empty compare ref whenever the server owns the choice. Every git action now resolves its ref through the one resolver, no fetch is attempted without a remote, a rebase target that does not exist is refused before a pane opens, and a failed rebase distinguishes \"stopped on conflicts\" from \"refused before touching your branch\" instead of always telling you to resolve conflicts. Line counts on the Stats screen change for local-only projects: they were measured against a ref that does not exist there and are now measured against the local base."
	},
	{
		"date": "2026-08-22",
		"type": "chore",
		"slug": "retry-bun-install-on-a-registry-flake",
		"title": "CI no longer fails a whole job when the registry serves a bad tarball: all four `bun install` steps in the build work...",
		"body": "CI no longer fails a whole job when the registry serves a bad tarball: all four `bun install` steps in the build workflow now run through a composite action that retries up to three times, wiping `node_modules` and bun's cache between attempts. Every retry is announced as a workflow warning and on the run summary, so the registry's failure rate stays visible instead of being absorbed, and an install that fails all three attempts still fails the job."
	},
	{
		"date": "2026-08-22",
		"type": "feature",
		"slug": "sidebar-space-scope-default",
		"title": "The Active Tasks sidebar now opens on the Spaces scope when the current project belongs to a space, and on the projec...",
		"body": "The Active Tasks sidebar now opens on the Spaces scope when the current project belongs to a space, and on the project itself when it is standalone; an explicit scope you picked yourself still wins. When the project is in no space the Spaces button is struck through and clearly disabled, and its tooltip says where to add the project to a space — Project Settings or the Spaces… button on its Dashboard row.",
		"short": "Sidebar opens on your space"
	},
	{
		"date": "2026-08-22",
		"type": "fix",
		"slug": "widen-header-project-switcher",
		"title": "The header project switcher menu grew from 18rem to 24rem, because a row carries the space indent, an active-task cou...",
		"body": "The header project switcher menu grew from 18rem to 24rem, because a row carries the space indent, an active-task count and a ⌘N badge beside the project name — real project names were being cut off. On a narrow viewport the menu now pins to the window edges under the header instead of running off the right side of the screen.",
		"short": "Wider project switcher menu"
	},
	{
		"date": "2026-08-22",
		"type": "feature",
		"slug": "70-cli-instance-targeting",
		"title": "The dev3 CLI can now be pointed at a specific running instance instead of whichever one discovery prefers: `--instanc...",
		"body": "The dev3 CLI can now be pointed at a specific running instance instead of whichever one discovery prefers: `--instance self | primary | task:<id> | seq:<N>` on any command, or `DEV3_CLI_SOCKET=<endpoint>` for a whole shell, and Settings → Install dev3 CLI additionally arms `~/.dev3.0/bin/dev3-self`, which always talks to the instance that installed it. Agent hooks keep invoking plain `dev3` and keep reaching the same instance they always did.",
		"short": "Aim the CLI at one dev3 instance"
	},
	{
		"date": "2026-08-21",
		"type": "feature",
		"slug": "01-remote-connection-quality",
		"title": "Viewing dev3 over remote access now measures the connection's round-trip time and keeps it as a `Connection` row in t...",
		"body": "Viewing dev3 over remote access now measures the connection's round-trip time and keeps it as a `Connection` row in the header's overflow menu — hover it for the spread, the jitter, lost samples, and how much of the wait was spent on this computer versus on the network. When the link stops behaving (past 150 ms, or jittery enough to feel) the number climbs into the header itself, in the slot the QR icon uses on the desktop, and leaves again when it recovers. If the connection is open but nothing comes back at all, it shows a dash in red rather than disappearing. The number is a real request through the same connection the app uses, sampled every five seconds while the tab is visible. On a machine whose VPN exits far away, that wait is mostly the VPN: the new opt-in `DEV3_CLOUDFLARED_EDGE_BIND=en0` lets the Cloudflare tunnel dial the edge from a chosen interface instead, which moved one measured round trip from 340 ms to 25 ms. It is off unless you set it, because it routes that traffic around your VPN. Help mode also stopped putting its explanation card in the top-left corner of the screen when the control it explains had appeared or disappeared while help mode was open.",
		"short": "See your remote connection speed"
	},
	{
		"date": "2026-08-21",
		"type": "docs",
		"slug": "01-spaces-manifest-sync",
		"title": "The UX manifest, the Spaces decision records and the ask-dev3 skill text now describe the spaces surface as it actual...",
		"body": "The UX manifest, the Spaces decision records and the ask-dev3 skill text now describe the spaces surface as it actually shipped: one menu per space on both surfaces, the rail gated on its container's width with a bottom-sheet filter below it, no cross-space task panel on the dashboard, no activity dots, and a space's own hide-on-camera flag. Unticking a space's last member in the membership dialog now also says the space itself was removed, which the backend has always done and the dialog stayed silent about. The load-bearing Spaces model record (a space is a tag, every project keeps its board, no merged space board) is also in the repo for the first time — both merged Spaces PRs cited a path that only existed on an unpushed branch.",
		"short": "Docs match the shipped spaces surface"
	},
	{
		"date": "2026-08-21",
		"type": "feature",
		"slug": "10-calmer-spaces-dashboard",
		"title": "The dashboard drops its cross-project task panel, which was listing the same waiting tasks the project rows already s...",
		"body": "The dashboard drops its cross-project task panel, which was listing the same waiting tasks the project rows already show, and every project row gains an \"Open board\" footer stating the work it is not showing (including how many tasks sit in To Do). Dragging a project now collapses every project row in that space to a single line for the duration of the drag, so the whole list you are reordering fits on one screen. Every space carries one \"…\" menu — on its rail row as well as its group header — holding \"Edit projects…\", Move up / Move down, Rename and Delete: the membership dialog lists every project with the current members ticked, so the same screen both adds and removes, and the old add-only \"+\" is gone. Spaces finally explain themselves through an (i) and help mode, including what the amber and blue dots count. A space's project rows are now indented under its header with a hairline rule, so the grouping is visible and not merely spaced; the rail rows dropped their amber/blue activity dots (the group headers still say \"3 need you\" in words, which was the dots' only legend anyway) and a board that cannot be reordered no longer shows a dead grip and two disabled arrows. The rail hides on its own container's width rather than the window's, and below that width the space filter moves into a bottom sheet opened from the search row instead of being silently cleared, and a project's Spaces field in Project Settings wears the app's removable chips instead of a bordered box with an \"Edit…\" link. A space can now be marked hide-on-camera in its own right, blurring its name in streamer mode wherever it appears rather than only when one of its projects is marked; the rail's \"New space\" is drawn as a proper bordered button, the overview row is called \"Everything\" now that it lists spaces too, and on touch a space's \"…\" is a 44px control at the right edge of its header instead of a hairline glyph mid-row.",
		"short": "Calmer dashboard, spaces you can edit"
	},
	{
		"date": "2026-08-21",
		"type": "feature",
		"slug": "coalesce-agent-message-submit",
		"title": "`dev3 message` now types its text in at once but holds the Enter until the target\r\npane has been quiet for 10 seconds...",
		"body": "`dev3 message` now types its text in at once but holds the Enter until the target\r\npane has been quiet for 10 seconds, so a burst of messages — one agent writing\r\nthree in a row, or several peers reporting at once — reaches the receiving agent as\r\na single turn instead of interrupting it once per message. A hard 30-second ceiling\r\nkeeps a steady stream from holding the submit forever, and button hand-offs\r\n(Create PR, commit, rebase, bug-hunter prompts) still submit immediately. Typing\r\ninto the task's terminal pushes the Enter back too, so it never lands mid-word while\r\nyou are writing to the agent yourself.",
		"short": "Stacked messages arrive as one turn"
	},
	{
		"date": "2026-08-21",
		"type": "fix",
		"slug": "hide-stopped-dev-server-badge",
		"title": "The dev-server control on a kanban task card no longer shows an inert \"dev off\" pill when no server is running — it a...",
		"body": "The dev-server control on a kanban task card no longer shows an inert \"dev off\" pill when no server is running — it appears only while the server is starting, running, or its assigned port is squatted by another process.",
		"short": "Kanban cards drop the dev-off badge"
	},
	{
		"date": "2026-08-21",
		"type": "feature",
		"slug": "kanban-dev-server-control",
		"title": "Kanban cards for active tasks with a dev script now carry a dev-server control: the left half shows the live state (r...",
		"body": "Kanban cards for active tasks with a dev script now carry a dev-server control: the left half shows the live state (running with its lowest port, starting, stopped, or a red port conflict) and opens that port in the browser, the right half stops the server. Dev-server state is broadcast to the board from the port-scan cycle instead of being polled per task by the info panel.",
		"short": "See dev servers on the board"
	},
	{
		"date": "2026-08-21",
		"type": "fix",
		"slug": "kanban-no-text-selection",
		"title": "Dragging across the Kanban board no longer smears a text selection over task titles and column headers — the board an...",
		"body": "Dragging across the Kanban board no longer smears a text selection over task titles and column headers — the board and the mobile column carousel are now non-selectable, like the controls they are. Renaming a column still lets you select inside its input.",
		"short": "No stray text selection on the board"
	},
	{
		"date": "2026-08-21",
		"type": "chore",
		"slug": "native-cross-session-echo-probe",
		"title": "Settled the intermittent \"bravo journal holds only bravo's output\" failure of the native-session lifecycle E2E: the r...",
		"body": "Settled the intermittent \"bravo journal holds only bravo's output\" failure of the native-session lifecycle E2E: the registry never leaked, the second session's own PowerShell drew the first session's command as PSReadLine ghost text out of the user-wide history file, and the journal recorded that faithfully. The fixture now silences the Windows line editor before any marker exists, prints the bytes around a foreign marker so the two possible channels are told apart, and ships a dispatch-only probe that reproduces the crossing with dev3 absent. Every independent proof step in the packaged-runtime job now runs with `if: always()`, so one failure no longer hides the fourteen verdicts after it."
	},
	{
		"date": "2026-08-21",
		"type": "feature",
		"slug": "new-image-highlight-in-viewer",
		"title": "The shared-images viewer now opens on the FIRST image of the batch an agent just published instead of the last one, r...",
		"body": "The shared-images viewer now opens on the FIRST image of the batch an agent just published instead of the last one, rings every new image in the thumbnail strip, and states how many are new in the header. The highlight survives for as long as the viewer stays open, so a batch of three is readable in order.",
		"short": "See which shared images are new"
	},
	{
		"date": "2026-08-21",
		"type": "fix",
		"slug": "no-remote-compare-base",
		"title": "A project added from a local folder with no git remote no longer compares against `origin/main`, a ref that is not there",
		"body": "A project added from a local folder with no git remote no longer compares against `origin/main`, a ref that is not there. Diffs, ahead/behind and Show Diff now measure against the local base branch, Push / Create PR / PR + auto-merge read as unavailable with a reason instead of failing on click, and a diff whose compare ref does not exist says so rather than reporting \"no changes to show\". The root cause was the newly added project reaching the UI with its config unresolved, so the UI guessed `origin/` for the rest of the session.",
		"short": "No more \"vs origin/main\" without a remote"
	},
	{
		"date": "2026-08-21",
		"type": "feature",
		"slug": "remote-access-stop-tunnel-button",
		"title": "The Remote Access modal now shows an explicit Stop tunnel button next to \"Public tunnel active\", so shutting the publ...",
		"body": "The Remote Access modal now shows an explicit Stop tunnel button next to \"Public tunnel active\", so shutting the public Cloudflare tunnel down no longer depends on discovering that you have to uncheck the \"Accessible from anywhere\" checkbox. The same modal became a real dialog along the way: it announces itself as one, traps keyboard focus, closes on Escape, and its tunnel-status line now uses the themed success color instead of a raw palette green that was unreadable in light mode.",
		"short": "Stop button for the public tunnel"
	},
	{
		"date": "2026-08-21",
		"type": "feature",
		"slug": "scoped-qa-app-instance",
		"title": "`bun run dev --qa` now launches the app against a throwaway data root instead of your real board, so browser verifica...",
		"body": "`bun run dev --qa` now launches the app against a throwaway data root instead of your real board, so browser verification cannot click another task's \"Branch Merged\" dialog or reach another task's live terminal. `--qa=virgin` gives a completely empty home — the state a brand-new user is in. `$DEV3_HOME` is now honoured by one shared resolver across the app, the CLI and the native terminal paths, which previously disagreed and produced a half-redirected instance.",
		"short": "Throwaway board for browser QA"
	},
	{
		"date": "2026-08-21",
		"type": "fix",
		"slug": "sidebar-scope-switcher-active-state",
		"title": "The Active Tasks sidebar scope switcher (project / space / global) marked its selection only by a faint text-color sh...",
		"body": "The Active Tasks sidebar scope switcher (project / space / global) marked its selection only by a faint text-color shift and an outline-to-filled glyph swap, which was practically invisible at 20px. The selected scope now carries an accent-tinted pill, and the dashboard's All / Needs-you preset toggle uses the same accent pill so both switchers in that header speak one language.",
		"short": "Selected task scope now obvious"
	},
	{
		"date": "2026-08-21",
		"type": "docs",
		"slug": "spaces-readme-landing",
		"title": "Spaces now appear outside the changelog: the README gains a short \"Spaces, when one flat list of projects stops worki...",
		"body": "Spaces now appear outside the changelog: the README gains a short \"Spaces, when one flat list of projects stops working\" subsection in the \"What else is in there\" block, and the landing page gains one feature card mid-grid. Both say the same three things — projects group into spaces, a project can sit in several at once, nothing moves on disk and every project keeps its own board — over two new screenshots shot against a throwaway demo state so nothing real is on screen. The existing `dev-server.jpg` on the landing page also stopped showing the developer's home path: the two log lines behind the Dev Server dropdown are blurred in place, at the same dimensions, so the page needs no edit."
	},
	{
		"date": "2026-08-21",
		"type": "chore",
		"slug": "split-ux-principal-from-better-skills",
		"title": "Reconciled the vendored `ux-principal` skill with the `better-*` skill family: it is now mandatory only for changes t...",
		"body": "Reconciled the vendored `ux-principal` skill with the `better-*` skill family: it is now mandatory only for changes that add a destination, surface, or action, while craft work on an existing control goes to the owning `better-*` skill. Deleted its duplicated colour/token reference and accessibility sub-agent brief, rewrote the UX bible's quality-floor section down to dev3's own deltas and documented exceptions, and settled the three rules where the two sides contradicted each other — borders may no longer fake depth, `better-ui`'s motion primitives win, and the looping hover animations on the terminal/git/header icon families stay by design. `docs/ux` now has a size budget enforced by a test instead of a prose cap that had drifted from 131 KB to 307 KB. The UX decision log folded to an index — the 24 entries whose reasoning already lives in a decision record became pointers — and both manifest files now state that they are hand-authored rather than generated, after the first pass in this task nearly deleted the yaml on the strength of its own misleading `derived_from_repository` header."
	},
	{
		"date": "2026-08-21",
		"type": "feature",
		"slug": "task-open-cli-deep-link",
		"title": "`dev3 task open [<id>]` brings the app to the front on a task — the CLI twin of a `dev3://task/<id>` link, but it nee...",
		"body": "`dev3 task open [<id>]` brings the app to the front on a task — the CLI twin of a `dev3://task/<id>` link, but it needs no registered URL scheme, so it works on every platform. Without an id it targets the current worktree's task, it honors the split-vs-fullscreen open-mode preference, and it reopens a window when the app is sitting window-less in the dock.",
		"short": "Open a task from the CLI",
		"suggestedBy": "sworgkh",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/632",
		"issueRef": "#632"
	},
	{
		"date": "2026-08-21",
		"type": "docs",
		"slug": "tmux-shared-config-path-not-a-race",
		"title": "Recorded that the shared tmux config path is not a race: tmux 3.6a treats config errors as non-fatal, so a torn read ...",
		"body": "Recorded that the shared tmux config path is not a race: tmux 3.6a treats config errors as non-fatal, so a torn read of the generated conf can never produce \"server exited unexpectedly\". The decision record carries the falsification, the negative reproductions, and the two unchased leads for whoever meets that error next."
	},
	{
		"date": "2026-08-20",
		"type": "feature",
		"slug": "40-artifact-text-size-control",
		"title": "The dev3 artifact starter now carries an A− / A+ text-size control beside the theme toggle: eight stops from 80% to 1...",
		"body": "The dev3 artifact starter now carries an A− / A+ text-size control beside the theme toggle: eight stops from 80% to 150%, the percentage readout doubles as reset, and the choice is remembered per browser. Every part of the report follows it — text, tables, KPI figures, chart labels and heights, checkboxes, switches, sliders, Choices dropdowns, and print output — because the shell is sized in rem/em and the chart bridge rescales every ECharts `fontSize` before rendering.",
		"short": "Resize text in any artifact"
	},
	{
		"date": "2026-08-20",
		"type": "feature",
		"slug": "40-conversation-parser",
		"title": "dev3 now parses a task's Claude Code and Codex transcripts into one canonical model — turns, messages, reasoning, and...",
		"body": "dev3 now parses a task's Claude Code and Codex transcripts into one canonical model — turns, messages, reasoning, and tool calls reduced to agent-independent operations (Claude's `Bash` and Codex's `exec_command` both read as `shell.run`) — with the agent's own bookkeeping kept in a separate layer. `dev3 conversations dump` writes the JSON to the task's own `conversations/` folder next to its logs and diffs, and `dev3 conversations handoff` retells the conversation as one message another agent can be handed, with bounded tool output. A compaction is normalized across formats, with how much context it dropped and a flag on the summary that replaced the history, so a reader never mistakes it for a user request. Dumps are trimmed by default: duplicated fields dropped, session bookkeeping discarded, and tool payloads cut by operation rather than by size — a file edit keeps the path it touched, a shell command keeps the command with bounded output, and anything fetched from outside keeps a bounded copy. `--verbatim` keeps everything. Codex sessions launched under a dev3 agent account are found too, not just the ones in the default Codex home.",
		"short": "Hand a conversation to another agent"
	},
	{
		"date": "2026-08-20",
		"type": "feature",
		"slug": "artifact-template-cli",
		"title": "New `dev3 artifact-template` command copies this task's pristine dev3 artifact starter into `./dev3-artifact-report` ...",
		"body": "New `dev3 artifact-template` command copies this task's pristine dev3 artifact starter into `./dev3-artifact-report` and prints where it went. It is the recovery path when `$DEV3_ARTIFACT_TEMPLATE_DIR` is absent — that variable is baked into a session's environment at launch, so an older session or a shell that never inherited it could not reach the starter at all.",
		"short": "Recover a missing artifact starter",
		"suggestedBy": "DolevEpshtein",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1437",
		"issueRef": "#1437"
	},
	{
		"date": "2026-08-20",
		"type": "feature",
		"slug": "copy-pr-link-branch-menu",
		"title": "The task's Branch menu now offers \"Copy PR link\" alongside the branch name, worktree path and checkout command, shown...",
		"body": "The task's Branch menu now offers \"Copy PR link\" alongside the branch name, worktree path and checkout command, shown only when the task actually has a pull request. Pasting a PR URL elsewhere no longer means opening the PR in a browser first.",
		"short": "Copy PR link from branch menu"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "dev-server-wait-assigned-port",
		"title": "`dev3 dev-server start --wait` / `restart --wait` now waits for a port the task was actually assigned (`DEV3_PORT*`) ...",
		"body": "`dev3 dev-server start --wait` / `restart --wait` now waits for a port the task was actually assigned (`DEV3_PORT*`) instead of the first port anything in the dev-server process tree opens, so a curl right after the wait no longer races a dev server whose bundler socket or sidecar came up first. If only an auxiliary port is listening it keeps polling for an assigned one for 10 more seconds, then reports ready on what it has and says the assigned port never came up — a devScript that binds a fixed port and ignores the pool still returns instead of hanging.",
		"short": "dev-server --wait waits for DEV3_PORT"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "dev-server-wait-container-published-ports",
		"title": "`dev3 dev-server start --wait` now succeeds for projects whose dev server runs in a container: a port that starts lis...",
		"body": "`dev3 dev-server start --wait` now succeeds for projects whose dev server runs in a container: a port that starts listening after the dev server launched counts as ready even when the listening socket belongs to the container runtime's daemon instead of the dev pane's process tree. `restart --wait` counts it too, so a container that keeps running across a stop no longer reads as somebody else squatting the port. Such ports are shown as `Published Ports` in `dev-server status` and in the task's port list instead of being reported as a port conflict, and a wait that does time out now names the process squatting the assigned port.",
		"short": "Dev-server --wait works with containers",
		"suggestedBy": "diverru",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1427",
		"issueRef": "#1427"
	},
	{
		"date": "2026-08-20",
		"type": "feature",
		"slug": "image-viewer-download",
		"title": "The shared image viewer (`dev3 show-image`) now has a Download button in its header, and right-clicking the image ope...",
		"body": "The shared image viewer (`dev3 show-image`) now has a Download button in its header, and right-clicking the image opens an in-app menu with Save image / Copy image path. The native WKWebView \"Save Image As…\" never worked there; the download uses the same anchor path as the artifact viewer, so it lands in ~/Downloads on the desktop and in the browser's download folder in remote mode. The same download button and right-click menu are now on the attachment lightbox (images attached to a task, a note or a scheduled message).",
		"short": "Download images from the viewer"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "kanban-shows-only-one-task",
		"title": "Fixed the Kanban board rendering only a single task after entering a project whose task list was fetched while a task...",
		"body": "Fixed the Kanban board rendering only a single task after entering a project whose task list was fetched while a task update arrived. The board now merges live updates into the snapshot instead of discarding the whole snapshot, so leaving a task via the breadcrumb no longer requires a dashboard round trip to see the other cards.",
		"short": "Kanban no longer drops every card"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "keep-diff-stats-during-refresh",
		"title": "Switching tasks no longer blanks the diff summary and ahead/behind counts into a spinner: the last known numbers for ...",
		"body": "Switching tasks no longer blanks the diff summary and ahead/behind counts into a spinner: the last known numbers for that task and compare ref are kept and replaced in place once the refresh lands. The spinner now only shows for a task whose status has never been fetched. The status poll also no longer restarts on every render, so a task-list update stops triggering an extra git status fetch.",
		"short": "Diff stats stay visible on task switch"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "label-filter-fills-row-width",
		"title": "The board's label filter row no longer stops after a fixed ten chips: it measures the free width and shows as many la...",
		"body": "The board's label filter row no longer stops after a fixed ten chips: it measures the free width and shows as many labels as actually fit, pushing the \"+N more\" button to the right end of the row and re-fitting on every resize.",
		"short": "Label filters fill the whole row"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "light-theme-yellow-readable",
		"title": "The light theme's yellow read as dark brown and was hard to spot, because sRGB cannot make a colour that is both dark...",
		"body": "The light theme's yellow read as dark brown and was hard to spot, because sRGB cannot make a colour that is both dark enough to carry text on white and still yellow. The role is now split: `--warning` is the paper (fills, borders, bar fills) and `--warning-strong` is the ink that goes on it, so warning text jumps from 4.0:1 to 9.6:1 contrast. The P2 priority chip and the Hibernate button additionally get a real yellow fill in the light theme. The dark theme is unchanged.",
		"short": "Light-theme yellow is yellow again"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "macos-x64-notarization-bifrost-sdk",
		"title": "Fixed macOS x64 builds failing Apple notarization since the model-catalog proxy landed: the vendored bifrost binary f...",
		"body": "Fixed macOS x64 builds failing Apple notarization since the model-catalog proxy landed: the vendored bifrost binary for Intel declared an SDK of 10.4 and Apple rejects anything below 10.9, which failed the whole app archive. The staged copy now declares 10.15; arm64 was never affected.",
		"short": "Intel macOS builds ship again"
	},
	{
		"date": "2026-08-20",
		"type": "feature",
		"slug": "md-preview-selection-comments",
		"title": "Selecting text in a Markdown preview inside Show Diff now raises an \"Add comment\" button, so a rendered document can ...",
		"body": "Selecting text in a Markdown preview inside Show Diff now raises an \"Add comment\" button, so a rendered document can be reviewed without switching back to the source diff — the comment lands on the same source lines and in the same review export as a gutter comment. The preview also marks commented blocks in place and lists the file's comments underneath, so a comment made there is never invisible.",
		"short": "Comment by selecting text in Markdown previews"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "mobile-card-add-label-button",
		"title": "Task cards no longer carry the hover-only \"+ Add label\" button in mobile view, where it was invisible but still tappa...",
		"body": "Task cards no longer carry the hover-only \"+ Add label\" button in mobile view, where it was invisible but still tappable right next to the label chips. Tapping a label chip still opens the label picker, and a card with no labels no longer reserves an empty row.",
		"short": "No stray Add label taps on mobile"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "mobile-pane-carousel-touch-size",
		"title": "The pane and window switcher bars above the terminal on a phone were noticeably smaller than the task summary bar rig...",
		"body": "The pane and window switcher bars above the terminal on a phone were noticeably smaller than the task summary bar right above them. Their controls are now touch-sized (44px) with a larger label, matching the summary bar's height.",
		"short": "Bigger mobile pane switcher bar"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "mobile-priority-chip-height",
		"title": "On a phone the priority chip in the task summary bar was a tiny badge next to the tall status control; it now matches...",
		"body": "On a phone the priority chip in the task summary bar was a tiny badge next to the tall status control; it now matches the status control's height, so the two read as one band and the chip is a comfortable touch target.",
		"short": "Bigger priority chip on mobile"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "native-terminal-connecting-forever",
		"title": "A native-backend task whose terminal host process was killed used to sit on \"Connecting...\" forever, with no timeout ...",
		"body": "A native-backend task whose terminal host process was killed used to sit on \"Connecting...\" forever, with no timeout and no way out. The backend now says outright that the session is gone, and the task terminal offers a Restart terminal button within a few seconds instead of a spinner that could never resolve.",
		"short": "Dead native terminal offers a restart"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "red-behind-commit-count",
		"title": "The \"N behind\" half of the task git row is now red instead of muted grey — number and wording together, because being...",
		"body": "The \"N behind\" half of the task git row is now red instead of muted grey — number and wording together, because being behind the base branch is a warning that a rebase is needed. The ahead half stays a quiet readout, and the combined \"N ahead · N behind\" line went back through the translation layer instead of hardcoded English.",
		"short": "Red behind-commit warning"
	},
	{
		"date": "2026-08-20",
		"type": "fix",
		"slug": "terminal-wrapped-path-links",
		"title": "Terminal file-path links now survive a path that wraps onto the next row — a real soft wrap, a vertically split tmux ...",
		"body": "Terminal file-path links now survive a path that wraps onto the next row — a real soft wrap, a vertically split tmux window where the terminal never sees a wrap at all, and an agent CLI that reflows its own output into indented continuation rows. Each pane's columns are stitched on their own, so a link never reaches into the neighbouring pane, and a row that was stitched by mistake still keeps the links it holds on its own.",
		"short": "File links work on wrapped paths"
	},
	{
		"date": "2026-08-20",
		"type": "refactor",
		"slug": "tests-filter-into-diff-badge",
		"title": "The with/without-tests toggle is no longer a chip of its own: in both the task summary bar and the diff toolbar it is...",
		"body": "The with/without-tests toggle is no longer a chip of its own: in both the task summary bar and the diff toolbar it is now a nested icon segment inside the changed-files readout, boxed like the quick-complete segment of the status control, showing a struck-through flask while tests are excluded. Test files are excluded by default. Task labels left the summary bar for a hover card on the breadcrumb title, which also carries the branch name, the task number and how long the task has been around. In the git row the ahead/behind counts went grey so they stop competing with the uncommitted diff, whose +/− now reads green for added and red for removed lines."
	},
	{
		"date": "2026-08-19",
		"type": "feature",
		"slug": "00-spaces-project-grouping",
		"title": "Projects can now be grouped into Spaces — many-to-many groups with their own ordering, surfaced as a dashboard rail t...",
		"body": "Projects can now be grouped into Spaces — many-to-many groups with their own ordering, surfaced as a dashboard rail that filters the overview (each rail row showing its needs-you/working split), collapsible group headers with per-space counts, membership chips and a Spaces… action on every project row, a search field matching space names, the active-tasks panel beside the overview showing work across all spaces, a space filter (including the computed Home group) in the task funnel, and space info with sibling paths in `dev3 current`. Every project keeps its own board, and with zero spaces the dashboard is exactly the screen it was.",
		"short": "Group projects into Spaces",
		"suggestedBy": "arditti",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1295",
		"issueRef": "#1295"
	},
	{
		"date": "2026-08-19",
		"type": "feature",
		"slug": "30-setup-failed-force-start",
		"title": "When a project's setup script fails, the task pane now offers to start the agent anyway instead of leaving you with a...",
		"body": "When a project's setup script fails, the task pane now offers to start the agent anyway instead of leaving you with a bare shell. Previously a failed setup in `blocking` launch mode (or on the native terminal backend) meant the agent never launched at all and there was no way to reach the task's prompt short of recreating the task.",
		"short": "Start the agent after a failed setup"
	},
	{
		"date": "2026-08-19",
		"type": "fix",
		"slug": "artifact-template-top-layer-overlays",
		"title": "Menus and dropdowns in dev3 HTML artifacts no longer get cut off by the card, scroller, or sticky table header around...",
		"body": "Menus and dropdowns in dev3 HTML artifacts no longer get cut off by the card, scroller, or sticky table header around them: the artifact starter now opens every overlay in the browser top layer and places it against its trigger, flipping above when the viewport is short. The starter ships a `.popover` menu primitive with keyboard, Escape, and outside-click handling so report authors never hand-roll an absolutely positioned panel again, and enhanced selects get the same lift for free.",
		"short": "Artifact menus stop getting clipped"
	},
	{
		"date": "2026-08-19",
		"type": "fix",
		"slug": "boxed-panel-chrome-buttons",
		"title": "The worktree-config gear and the \"I decide\" completion toggle in the task info panel now carry the same bordered box ...",
		"body": "The worktree-config gear and the \"I decide\" completion toggle in the task info panel now carry the same bordered box as the buttons around them, instead of sitting flat in the bar.",
		"short": "Worktree config and I-decide get a box"
	},
	{
		"date": "2026-08-19",
		"type": "fix",
		"slug": "canary-apt-stall-and-half-hourly-schedule",
		"title": "Linux release builds no longer crawl or stall on Ubuntu's Azure package mirror: amd64 now installs\r\nits GTK/WebKit de...",
		"body": "Linux release builds no longer crawl or stall on Ubuntu's Azure package mirror: amd64 now installs\r\nits GTK/WebKit dependencies from archive.ubuntu.com directly, which cut apt from 2m31s+15m27s down\r\nto 4s+9s on a degraded day, and every apt call is bounded by a timeout and retried so a bad mirror\r\nfails loudly instead of holding the canary publish queue for an hour. The canary schedule also\r\nmoves back to every half hour, on the round half hour."
	},
	{
		"date": "2026-08-19",
		"type": "fix",
		"slug": "custom-agent-binary-resume",
		"title": "An agent pointed at a custom executable — a wrapper script, a shell alias, a renamed build of Claude Code — is now ha...",
		"body": "An agent pointed at a custom executable — a wrapper script, a shell alias, a renamed build of Claude Code — is now handled as the CLI it actually is, so Resume Session continues the conversation instead of restarting from the task description. Settings → Agents gained \"Which CLI is this\" (the old \"Lifecycle Hooks\" field, widened to cover launch flags, session resume and the dev3 protocol as well), and setting a Custom path on a built-in agent no longer makes dev3 forget which agent it is.",
		"short": "Custom agent binaries resume properly"
	},
	{
		"date": "2026-08-19",
		"type": "refactor",
		"slug": "declutter-header-and-task-bar",
		"title": "The header bar keeps only what you act on: the tmux session list, Quick Shell and the No Sleep toggle moved into the ...",
		"body": "The header bar keeps only what you act on: the tmux session list, Quick Shell and the No Sleep toggle moved into the \"More\" menu, and the memory readout now appears in the bar only when the OS reports pressure (yellow or red) — otherwise it sits in that menu as a row. The menu's icon became horizontal dots in a bordered chip, because the old vertical dots read as one of the header's separators, and the menu now closes on a click anywhere outside it, including over a terminal. In the task bar the Watching bell and the \"I decide\" toggle lost their text labels (the sentence stays in the tooltip), \"I decide\" moved to the right of the status chip, and the terminal-shortcuts button now sits with the panel chrome between Worktree Config and Full screen, and the panel expand/collapse chevron moved down to the end of the Runtime bar, right of Images, so it is no longer mistaken for the fullscreen toggle beside it. The git bar dropped the \"vs origin/main\" compare-ref picker (Project Settings already owns that choice) and the separator between the commit counts and the line counts: ahead/behind and +/- now form one control that opens the diff when clicked. The header and the inspector bars also halved their left/right edge padding, and the \"More\" menu moved to the far left of the header's utilities cluster so the settings pair keeps the right end. Finally the branch name left the bar for a labelled \"Branch\" chip: it opens a menu headed by the full name, with Copy branch name / Copy worktree path / Copy checkout command, and the confirmation is a toast that only fires once the clipboard write resolved — the old confirmation lived inside a tooltip nobody was still hovering. The compare-ref choice returned as a \"Compare against\" section inside that same menu, where it costs no bar width, and it now ticks the row that matches the resolved ref rather than the raw stored value."
	},
	{
		"date": "2026-08-19",
		"type": "fix",
		"slug": "flaky-test-ownership",
		"title": "Fixed the fixture race behind the cli-socket flake: a vitest test that fails by timeout keeps executing, and every te...",
		"body": "Fixed the fixture race behind the cli-socket flake: a vitest test that fails by timeout keeps executing, and every test in socket-client.test.ts shared one unix socket path, so the zombie could rebind it under its successor and kill it with a real assertion failure. Fixture paths are now derived per test via test-scoped-path.ts, and the one test with a deferred timer cancels it from the test signal.\r\n\r\nAlso flushed the streamer-mode toggle through act() in the Cmd+2 sensitive-project test, which was letting the keystroke race the guard's React state and evict the whole project screen; gave shift-keys-e2e a fresh FIFO pair and capture file per run; and made the git test spawn mock name the errno when a fork fails, because it resolves to exit code 1 and otherwise reads as a git regression."
	},
	{
		"date": "2026-08-19",
		"type": "chore",
		"slug": "grey-out-inspector-buttons",
		"title": "The inspector session bar is quieter: Find bugs and + Agent are now neutral grey instead of red and green, Open in… /...",
		"body": "The inspector session bar is quieter: Find bugs and + Agent are now neutral grey instead of red and green, Open in… / the file browser / the scripts button lost their blue and green too, and the new tmux window button matches the blue of the split buttons next to it. Full screen also turned grey and moved down to the runtime bar, right before the panel collapse chevron."
	},
	{
		"date": "2026-08-19",
		"type": "chore",
		"slug": "grey-out-tmux-and-git-buttons",
		"title": "The tmux pane controls (split, new window, zoom, layout) and the git action buttons (Diff, Commit, Rebase, Push, Crea...",
		"body": "The tmux pane controls (split, new window, zoom, layout) and the git action buttons (Diff, Commit, Rebase, Push, Create PR, Merge) are neutral grey instead of blue, finishing the quieting of the inspector session bar. Colour in those rows now belongs only to the status badges — ahead/behind, the PR chip, conflicts — and to Close pane, which turned amber to match Hibernate: both take a session away without touching the work in the worktree."
	},
	{
		"date": "2026-08-19",
		"type": "fix",
		"slug": "menu-row-flyouts-open-on-hover",
		"title": "The header kebab's \"Memory left\" and \"tmux Sessions\" rows open their panels on hover again, and the panel now appears...",
		"body": "The header kebab's \"Memory left\" and \"tmux Sessions\" rows open their panels on hover again, and the panel now appears beside the menu instead of over it, so the pointer can keep moving down the list. A click still pins the panel open, and clicking inside it no longer closes the menu underneath.",
		"short": "Hover opens memory and tmux panels"
	},
	{
		"date": "2026-08-19",
		"type": "chore",
		"slug": "renderer-freeze-watchdog",
		"title": "A frozen app window now leaves a record in the log instead of nothing: each window beats into the backend every two s...",
		"body": "A frozen app window now leaves a record in the log instead of nothing: each window beats into the backend every two seconds, and the backend — which survives the freeze — reports when the beats stop, what the window had on screen, and when they come back. A healthy session costs one log line per window, and repeated stalls are capped at five reports so the log stays readable."
	},
	{
		"date": "2026-08-19",
		"type": "fix",
		"slug": "reset-terminal-once-not-every-reconnect",
		"title": "A terminal pane no longer breaks — blank canvas, output frozen until restart — after the app has been in the backgrou...",
		"body": "A terminal pane no longer breaks — blank canvas, output frozen until restart — after the app has been in the background for a while. The screen reset that clears pixels inherited from a previous terminal now runs once when the terminal is built, instead of on every socket reconnect, which is what corrupted the renderer's state during a resume.",
		"short": "Terminals stop dying after a resume"
	},
	{
		"date": "2026-08-19",
		"type": "fix",
		"slug": "status-control-segmented-box",
		"title": "The status control in the task info panel now reads as a single boxed control: it carries the same bordered box as th...",
		"body": "The status control in the task info panel now reads as a single boxed control: it carries the same bordered box as the buttons around it, and the green \"complete\" check sits inside that box as a full-height right segment behind a hairline divider instead of floating loose next to the chip. Hover now lights the segment you are actually pointing at — the chip or the check — so the two click targets stay distinguishable.",
		"short": "Status chip and its check become one control"
	},
	{
		"date": "2026-08-19",
		"type": "fix",
		"slug": "terminal-input-latency",
		"title": "Terminal text is drawn from a glyph cache now instead of being re-shaped character by character on every frame, which...",
		"body": "Terminal text is drawn from a glyph cache now instead of being re-shaped character by character on every frame, which is what WebKit was charging most of the frame for. Output whose colours never repeat cannot be cached at all, so the cache notices within a couple of frames, switches itself off and hands its memory back rather than paying for a cache nobody hits. Separately, the terminal no longer holds PTY output for an animation frame before handing it to the emulator, and the app no longer waits out the full 16 ms batch window before sending a lone keystroke echo — together roughly 33 ms off every character you type. A fast scroll flick now delivers the lines the pacer held back instead of dropping them, so scrolling stops short less often. Terminal performance is also measured now, and View → Debug → Terminal Performance shows it live per pane: frame rate, the gap between painted frames, frames that missed their slot, PTY throughput, wheel-to-tmux scroll rate, and keystroke-to-pixel latency (also readable from devtools as `window.__dev3TerminalLatency()`, with a summary in the log every minute).",
		"short": "Typing echoes about 33 ms sooner"
	},
	{
		"date": "2026-08-19",
		"type": "fix",
		"slug": "terminal-viewport-cache",
		"title": "Redrawing a full terminal screen used to re-read and re-parse the entire screen once for every row on it, so a 46-row...",
		"body": "Redrawing a full terminal screen used to re-read and re-parse the entire screen once for every row on it, so a 46-row repaint did that work 46 times over. The screen is now read once per frame and sliced per row, which takes about 3.8 ms off every full repaint — the redraws behind scrolling, `vim`, and anything that rewrites the whole screen. Typing a single character is unaffected, because that only repaints a few rows.",
		"short": "Busy terminal screens repaint sooner"
	},
	{
		"date": "2026-08-19",
		"type": "fix",
		"slug": "variant-agent-reply-address",
		"title": "A cross-task agent message sent from a task variant now carries the sender's task id as the reply address instead of ...",
		"body": "A cross-task agent message sent from a task variant now carries the sender's task id as the reply address instead of `seq:<N>`, which every variant of a group shares and which the CLI rejects as ambiguous. The same address is used for the reply command handed back after an agent-initiated launch.",
		"short": "Variants get a working reply address"
	},
	{
		"date": "2026-08-18",
		"type": "refactor",
		"slug": "hide-single-pane-controls",
		"title": "The pane toolbar in the task inspector now hides the layout, zoom and close-pane buttons until the task actually has ...",
		"body": "The pane toolbar in the task inspector now hides the layout, zoom and close-pane buttons until the task actually has a second pane, leaving only split, new window and the shortcuts cheat sheet on a single-pane terminal. The header's Pull button follows the same rule: it shows up only when the project's main or master is really behind origin, and disappears again once there is nothing to pull, instead of sitting in the bar greyed out. The No Sleep toggle moved out of the header bar entirely and now lives as a row in the kebab (\"More\") menu — it is on for everyone and practically never switched off."
	},
	{
		"date": "2026-08-18",
		"type": "fix",
		"slug": "terminal-render-guard",
		"title": "The terminal now keeps painting through a frame that crashes instead of going\r\nblank for good, and a pane that stoppe...",
		"body": "The terminal now keeps painting through a frame that crashes instead of going\r\nblank for good, and a pane that stopped painting with no error at all is detected\r\nand rebuilt. Two catch blocks that used to swallow ghostty crashes silently now\r\nlog them with the byte and frame counts around the failure, so a blank pane can be\r\ndiagnosed from the log instead of guessed at. Every one of those log lines now also\r\ncarries the last few things that happened to that terminal — successful resizes,\r\nscale-factor changes, backgrounding — plus how many panes are alive and how many\r\nhave died, which is what identifies the trigger rather than just the symptom.",
		"short": "Terminal survives a bad frame"
	},
	{
		"date": "2026-08-18",
		"type": "fix",
		"slug": "terminal-renderer-crash-recovery",
		"title": "A terminal pane that went permanently blank — ghostty-web's render loop stops for\r\ngood after a single throw inside a...",
		"body": "A terminal pane that went permanently blank — ghostty-web's render loop stops for\r\ngood after a single throw inside a resize, so neither a window resize nor a\r\nfullscreen toggle brought it back — now rebuilds itself and reattaches to the\r\nstill-running session. Both observed crashes are covered (an out-of-range\r\ncodepoint and a WASM out-of-bounds access), and if three rebuilds in a row fail\r\nyou get a toast offering the window reload that does fix it.",
		"short": "Blank terminal now heals itself"
	},
	{
		"date": "2026-08-17",
		"type": "feature",
		"slug": "20-share-artifact-skill",
		"title": "dev3 now ships a `dev3-share-artifact` skill to every agent: ask for a link to a report and the agent folds the multi...",
		"body": "dev3 now ships a `dev3-share-artifact` skill to every agent: ask for a link to a report and the agent folds the multi-file artifact into one self-contained HTML file, publishes it as a secret GitHub gist, and verifies the preview URL before handing it over. The folding is a new `dev3 inline-html` command that embeds local CSS, JS, images and fonts, leaves CDN links alone, and refuses to write a page carrying a credential-shaped string or a missing local asset. `ask-dev3` now routes \"share this report\" to it.",
		"short": "Share a report as a gist link"
	},
	{
		"date": "2026-08-17",
		"type": "fix",
		"slug": "display-change-geometry-diagnostics",
		"title": "A window left hanging off every screen after a monitor resolution change (or a\r\nwake) is now pulled back onto a displ...",
		"body": "A window left hanging off every screen after a monitor resolution change (or a\r\nwake) is now pulled back onto a display, instead of only being clamped on the\r\nnext app start. The same trigger writes one geometry line from the backend and\r\none from the renderer into the log, and a terminal refit that throws is no longer\r\nswallowed silently — the three blind spots behind reports of a black terminal\r\nafter a resolution change.",
		"short": "Window survives a resolution change"
	},
	{
		"date": "2026-08-17",
		"type": "feature",
		"slug": "mermaid-markdown-rendering",
		"title": "Render Mermaid code fences as theme-aware diagrams across Markdown previews and PR conversations, keeping wide sequen...",
		"body": "Render Mermaid code fences as theme-aware diagrams across Markdown previews and PR conversations, keeping wide sequences readable with horizontal scrolling and preserving source for invalid diagrams.",
		"short": "Mermaid diagrams in Markdown"
	},
	{
		"date": "2026-08-17",
		"type": "refactor",
		"slug": "remove-sidebar-attention-scope",
		"title": "The active-tasks sidebar scope switcher is now project/global: the attention scope (bell button with the pulsing coun...",
		"body": "The active-tasks sidebar scope switcher is now project/global: the attention scope (bell button with the pulsing count) was removed in favor of the upcoming Spaces scope. The same list is still one `is:attention` search token away, and the per-task attention bell is unchanged."
	},
	{
		"date": "2026-08-17",
		"type": "refactor",
		"slug": "tasks-json-cold-payload-sidecar",
		"title": "Task storage no longer carries a per-file diff breakdown that nothing read, keeps each task's title/overview history ...",
		"body": "Task storage no longer carries a per-file diff breakdown that nothing read, keeps each task's title/overview history in a per-task sidecar file, and writes tasks.json without indentation — a large board's store drops by up to 68%, so it loads and saves faster. Nothing is deleted and the file stays readable by older app versions. A task now also keeps its 50 most recent notes, so one long-running agent can no longer grow a single card's note list without bound.",
		"short": "Task storage shrinks by two thirds"
	},
	{
		"date": "2026-08-16",
		"type": "fix",
		"slug": "bound-every-tmux-spawn",
		"title": "Fixed the app hanging forever on the \"Checking system…\" startup screen, where Reload and Retry both re-armed the freeze",
		"body": "Fixed the app hanging forever on the \"Checking system…\" startup screen, where Reload and Retry both re-armed the freeze. Every tmux command now gives up and cleans up after itself instead of waiting on an unresponsive tmux server — previously an unanswered command waited forever, and the pane pollers could pile up thousands of stuck tmux processes that saturated the machine and froze the app.",
		"short": "App no longer freezes on startup"
	},
	{
		"date": "2026-08-16",
		"type": "fix",
		"slug": "clone-npmrc-into-worktrees",
		"title": "A gitignored `.npmrc` at the project root is now cloned into every new task worktree, so installs there use the same ...",
		"body": "A gitignored `.npmrc` at the project root is now cloned into every new task worktree, so installs there use the same registry and credentials as the main checkout instead of silently falling back to the public registry. The file is also gitignored in this repo so it can never be committed by accident.",
		"short": "Worktrees keep your .npmrc"
	},
	{
		"date": "2026-08-16",
		"type": "feature",
		"slug": "disconnected-session-state",
		"title": "A task whose agent session did not survive a force quit or a machine restart now renders like a hibernated one — grey...",
		"body": "A task whose agent session did not survive a force quit or a machine restart now renders like a hibernated one — greyed out, sorted below every live task, and carrying a DISCONNECTED badge on the Kanban card, the Active Tasks sidebar row and the dashboard row. Opening the task still offers the usual Resume Session / Start Fresh recovery, and resuming puts it straight back among the live sessions.",
		"short": "Dead sessions no longer look active",
		"suggestedBy": "yakirn",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1392",
		"issueRef": "#1392"
	},
	{
		"date": "2026-08-16",
		"type": "fix",
		"slug": "noop-task-update-write-storm",
		"title": "A task update that changes nothing no longer rewrites the project's tasks.json, and the Codex pane-session hook answe...",
		"body": "A task update that changes nothing no longer rewrites the project's tasks.json, and the Codex pane-session hook answers its steady-state no-op from cache instead of taking the file lock. On a large board an active Codex agent was rewriting a 14 MB tasks.json around eleven times a second, which pinned the main process event loop and froze the UI.",
		"short": "Stop no-op task updates freezing the app"
	},
	{
		"date": "2026-08-16",
		"type": "feature",
		"slug": "telemetry-opt-out",
		"title": "A build-time `VITE_TELEMETRY` flag can turn every analytics channel off",
		"body": "A build-time `VITE_TELEMETRY` flag can turn every analytics channel off. Setting `VITE_TELEMETRY=off` (or `false`, `0`, `no`) in the root `.env` stops the Google Analytics hits, the public-IP lookup that geolocates them, and the PostHog client from running, leaving feature flags on their shipped defaults; crash logging to the local log file keeps working. Unset still means on, so released builds and existing local builds behave exactly as before.",
		"short": "Build with telemetry off"
	},
	{
		"date": "2026-08-16",
		"type": "docs",
		"slug": "windows-no-longer-canary-only",
		"title": "Every user-facing surface that still said the Windows build ships in the canary channel only now points at `stable-wi...",
		"body": "Every user-facing surface that still said the Windows build ships in the canary channel only now points at `stable-win-x64-dev-3.0.zip`, which has been attached to tagged releases since v1.45.0 — README, the landing page, the install guide, `llms.txt`, `ai-install.txt`, concept and AGENTS. The unsigned-launch warning in the release notes no longer promises the build will never be signed: it says it is not code-signed at this time and that may change, keeping the SmartScreen click path and the \"not a virus report\" line.",
		"short": "Windows docs match the real release"
	},
	{
		"date": "2026-08-15",
		"type": "feature",
		"slug": "01-model-catalog-and-model-roles",
		"title": "Register the providers you pay for in the new **API models** section of Global Settings, ask them what they offer, gi...",
		"body": "Register the providers you pay for in the new **API models** section of Global Settings, ask them what they offer, give the models you want your own names, then bind those names to an agent's own roles in its preset — Claude Code's Opus/Sonnet/Haiku slots, Codex's main/subagent/review models. A pinned proxy sidecar bundled with the app resolves the names, so one Claude Code session can run its main model on OpenAI and its subagents on DeepSeek through OpenRouter. Upstream keys never leave your machine: the agent only ever sees a local proxy key, and a launch is blocked with the offending role named rather than silently falling back to the wrong model. The proxy is infrastructure rather than something you operate: dev3 brings it up with the app on one fixed loopback port and keeps that address across restarts, so running sessions survive a catalog edit. Presets saved in Settings now reach every open board and launch picker immediately, instead of only after the window reloads, and the launcher's first column is labelled **Harness**, because Claude, Codex and Gemini are agent CLIs rather than providers. A hand-built Codex preset now reaches the dev3 CLI as well: dev3 supplies its own permissions preset and profile when the preset itself decides nothing, instead of leaving the agent alive but unable to move the task's status. The Model field captions a routed preset with who serves it (`DS-Flash · OpenRouter`), the providers table says plainly that a subscription is not an API key, and the proxy now ships on every platform dev3 releases rather than Apple Silicon alone. The preset editor's drag handle and up/down arrows are gone: the handle never worked and the arrows permuted an order the grouped list does not show. Codex no longer opens a routed session complaining that it has never heard of the model: dev3 hands it generated metadata for every catalog model, which also restores `apply_patch` and parallel tool calls that its placeholder metadata switched off, and a role left unbound now follows the main model instead of a slug the proxy cannot serve. The launcher no longer waits to be found: with no provider of your own, the Model list shows the open-source models dev3 recommends as locked rows carrying what they cost and what they stand in for (`$4 / 1M instead of Claude Opus 5`), and a **+ Connect a provider…** row is always there regardless. Clicking either opens a one-screen flow — pick OpenRouter, Ollama, Fireworks, Baseten or your own endpoint, paste a key, done — and connecting OpenRouter also names the three recommended models and writes a ready-to-run **Best value** preset into Claude Code and Codex, so the first routed session needs no catalog editing at all. The recommendations go quiet the moment you have any provider of your own. The Model field is wider than its neighbours and its list may outgrow it, so a row reads `GLM 5.2  $4/M vs Opus 5` on one line instead of wrapping; a pencil beside the field opens the preset editor whenever the selected preset is one whose model is a set of roles, so the out-of-the-box choice is a starting point rather than a fixed menu. A custom endpoint can now speak the Anthropic protocol as well as OpenAI's — pick the format when you add it, and the proxy handles the rest. The pencil lands on the exact preset it belongs to, selected and scrolled into view, rather than on the Agents page in general. And when dev3's recommended set moves on in a later release, the preset you are already running says so in one line and shows both sides per role before anything is written — taking the new set or keeping yours are equally final, and the question is asked once. A local endpoint that authenticates nobody (Ollama, LM Studio, your own gateway) is now actually served instead of being refused by the proxy for having no key, a proxy that dies on its own stops reporting itself as running, quitting can no longer orphan a proxy that was still starting, and the credential file is written atomically so a crash mid-save cannot wipe every stored key. A Claude Code preset with only some slots bound now routes the rest at the model it launches with instead of asking the proxy for a Claude model it cannot serve, connecting a second Ollama box or a second hand-entered endpoint no longer collides with the first, the toast after connecting one lands on the model catalog rather than on Appearance, a routed session's cost is priced through the catalog instead of reading as unpriced, and a freshly seeded preset can no longer bind to a model of yours that happens to share a name with a recommended one. A saved API key now shows as a mask with an eye beside it: click to read the key back, and once it is on screen you can replace it or clear the field to remove it entirely — the key is fetched one provider at a time, only when you ask, and a recording blurs it. The unverified OpenRouter-with-Claude-Code warning is gone from the role picker, and a role left empty now says what it actually does — it follows the model the preset launches with. Connecting OpenRouter now seeds two ready-to-run presets instead of one: **Best value** runs Qwen3.8 Max, GLM 5.2 and DeepSeek V4 Flash and starts on GLM 5.2, and **Best value · Smart** puts Kimi K3 on the top slot with GLM 5.2 doing the everyday work and starts on Kimi — so an ordinary turn costs workhorse money and switching to the smarter model is `/model` inside the session, not a relaunch. A preset that names no model of its own no longer opens on the priciest slot it happens to have bound. If you were already seeded, the update prompt offers the new tier as a whole preset and shows every role before writing anything. The third-party rates the launcher quotes were refreshed against what OpenRouter actually charges today. Inside a routed Claude Code session, `/model` now labels each slot with your own name for the model and who serves it (`glm-5.2 · OpenRouter · z-ai/glm-5.2`) instead of a bare wire name against `Custom Opus model`. A routed model that serves a million-token context window now runs on it: models in the API-models table carry a **1M context** box, ticked automatically for the ones dev3 recommends, and a session on such a model compacts at a million tokens instead of at 200k. A wrapper binary you declared as a given agent CLI now routes through that CLI's model roles instead of launching unrouted because its file is named something else.",
		"short": "Run any agent on any provider"
	},
	{
		"date": "2026-08-15",
		"type": "fix",
		"slug": "codex-hooks-status-hooks-via-config-file",
		"title": "Fixed launching Codex on Windows, where every session died with `expected struct HooksToml` before it began: the stat...",
		"body": "Fixed launching Codex on Windows, where every session died with `expected struct HooksToml` before it began: the status hooks dev3 passes to Codex used to travel as a quoted `-c hooks={...}` argument, and the Windows command line ate their quotes. The hooks are now declared in the Codex config file dev3 already maintains, so nothing about them passes through a command line on any platform.",
		"short": "Codex starts again on Windows"
	},
	{
		"date": "2026-08-15",
		"type": "feature",
		"slug": "folder-picker-nested-create",
		"title": "The folder picker now creates a new folder inside the folder you highlighted, and says which one on the button and in...",
		"body": "The folder picker now creates a new folder inside the folder you highlighted, and says which one on the button and in the name field, instead of always creating in the folder the tree is rooted at. The folder you just created stays selected so Select works right away, the folder you are browsing is now a pickable row of its own, empty folders say they are empty, the tree is keyboard-navigable in single-select mode, and the modal no longer resizes or overlaps its footer when the listing is short.",
		"short": "Folder picker creates where you point"
	},
	{
		"date": "2026-08-15",
		"type": "fix",
		"slug": "prune-claude-json-trust-entries",
		"title": "dev3 no longer leaves dead trust entries behind in Claude Code's `~/.claude.json`",
		"body": "dev3 no longer leaves dead trust entries behind in Claude Code's `~/.claude.json`. Every task launch used to add a `projects` entry for its worktree and nothing ever removed it — on one machine that was 2 130 entries for deleted worktrees, half of a 1.9 MB file. dev3 now prunes them when a worktree is torn down and sweeps the leftovers once per app launch; entries that are not dev3 worktrees, and files it cannot parse, are never touched.",
		"short": "Stop bloating Claude Code's config"
	},
	{
		"date": "2026-08-15",
		"type": "fix",
		"slug": "prune-codex-trust-blocks",
		"title": "dev3 added a `[projects.\"<worktree>\"] trust_level = \"trusted\"` block to `~/.codex/config.toml` on every task launch a...",
		"body": "dev3 added a `[projects.\"<worktree>\"] trust_level = \"trusted\"` block to `~/.codex/config.toml` on every task launch and never removed one, so the file grew by one dead block per task forever — 464 blocks in 63 KB on the machine that reported it. Those blocks are now dropped when the worktree is removed, plus a one-time sweep at startup for what earlier versions left behind; only paths under `~/.dev3.0/worktrees` or `~/.dev3.0/ops` whose directory is gone qualify, your own trusted projects are never touched, a comment you wrote above the block that follows a removed one stays where it was, and any edit that would change anything else in the file is abandoned rather than risked.",
		"short": "Codex config stops collecting dead worktrees"
	},
	{
		"date": "2026-08-15",
		"type": "fix",
		"slug": "prune-gemini-trusted-folders",
		"title": "dev3 registered every task worktree in ~/.gemini/trustedFolders.json and never removed it, so the file grew one dead ...",
		"body": "dev3 registered every task worktree in ~/.gemini/trustedFolders.json and never removed it, so the file grew one dead entry per task forever. Entries are now dropped when the worktree is removed, and a startup sweep clears the ones left behind — only paths under `~/.dev3.0/worktrees` or `~/.dev3.0/ops` that no longer exist, never a folder you trusted yourself.",
		"short": "Stop leaking worktree paths to Gemini"
	},
	{
		"date": "2026-08-15",
		"type": "fix",
		"slug": "stale-agent-binary-path-shadowing-base-command",
		"title": "Fixed editing an agent's base command having no effect on new sessions: the auto-cached resolved binary path kept poi...",
		"body": "Fixed editing an agent's base command having no effect on new sessions: the auto-cached resolved binary path kept pointing at the previous binary and silently overrode the edited command at every launch. A cached path now only applies while it still names the same binary as the agent's current base command, while a path you set yourself under Settings → Agents → Custom path is kept separately and always wins.",
		"short": "Edited agent command now takes effect"
	},
	{
		"date": "2026-08-15",
		"type": "fix",
		"slug": "windows-agent-spawn-shell",
		"title": "Adding a second agent to a task on Windows failed with \"requested shell executable not found: /bin/bash\" — the pane s...",
		"body": "Adding a second agent to a task on Windows failed with \"requested shell executable not found: /bin/bash\" — the pane spawn path hardcoded a POSIX shell. The generated wrapper is now launched through the platform dialect (bash on macOS/Linux, PowerShell with a .ps1 wrapper on Windows), and when a launch fails because the shell could not be resolved the error hint says so instead of telling you to check that the agent is installed. The agent's PATH is also joined with the platform's own separator now, instead of always a colon.",
		"short": "Adding an agent works on Windows"
	},
	{
		"date": "2026-08-15",
		"type": "fix",
		"slug": "windows-dev-server-pane",
		"title": "The Dev Server button and `dev3 dev-server start` no longer refuse on Windows with \"the dev-server pane requires the ...",
		"body": "The Dev Server button and `dev3 dev-server start` no longer refuse on Windows with \"the dev-server pane requires the tmux backend, which is POSIX-only\": that refusal belonged to the nested tmux session the tmux backend hosts the server in, not to the pane, and a Windows task is always native. The pane's wrapper script is now written in the platform launch dialect (PowerShell there, byte-compatible bash on macOS and Linux) and launched through it instead of a hardcoded `/bin/bash`, and the marker that re-finds the pane no longer assumes a `.sh` file name. A project's own `devScript` is still the user's text in the user's shell — dev3 does not translate it, so a POSIX dev command still needs a Windows-compatible form.\r\n\r\nFixes h0x91b/dev-3.0#1387",
		"short": "Dev server starts on Windows"
	},
	{
		"date": "2026-08-15",
		"type": "fix",
		"slug": "windows-git-op-panes",
		"title": "The Rebase, Push and Merge buttons opened a pane that ran a hand-written bash script through /bin/bash, so on Windows...",
		"body": "The Rebase, Push and Merge buttons opened a pane that ran a hand-written bash script through /bin/bash, so on Windows they did nothing at all. All three now generate their script in the platform's own dialect (bash on macOS/Linux, PowerShell on Windows) and are proved by running real git operations against throwaway repositories on a Windows runner, conflict path included. The merge commit message travels as a file instead of a quoted argument, so a task title containing quotes survives. Opening a pull request from the pane is still unavailable on Windows and now says so with a clear error instead of opening a pane that cannot work — its GitHub-token prelude is a separate port.",
		"short": "Rebase, push and merge work on Windows"
	},
	{
		"date": "2026-08-15",
		"type": "fix",
		"slug": "windows-powershell-lookup-fallback",
		"title": "The packaged Windows CI job now executes a real `dev3 pane run` and reads its log back — that path had never been run...",
		"body": "The packaged Windows CI job now executes a real `dev3 pane run` and reads its log back — that path had never been run on Windows at all, only asserted about from macOS. The same step also settles why PowerShell resolution refuses instead of falling back to a PATH lookup when %SystemRoot% is missing: it launches that fallback for real and records Windows PowerShell failing to start with error 8009001d while reporting exit 0.",
		"short": "Pane runs proved on Windows"
	},
	{
		"date": "2026-08-14",
		"type": "feature",
		"slug": "01-browser-keyboard-coverage",
		"title": "Keyboard shortcuts now work properly in browser remote mode",
		"body": "Keyboard shortcuts now work properly in browser remote mode. Ctrl combos are left to the shell while a terminal has focus, so Ctrl+D sends end-of-file instead of splitting a pane, and the pane keys moved to Ctrl+Shift off macOS as in every terminal emulator. Combos the browser keeps (⌘W, ⌘T, ⌘0, F11) now show their working alternative instead of doing nothing, ⇧⌘Space always opens the Command Palette, and going fullscreen in a Chromium browser hands the whole keyboard back to the app.",
		"short": "Full keyboard in the browser"
	},
	{
		"date": "2026-08-14",
		"type": "feature",
		"slug": "01-windows-release-asset",
		"title": "Tagged releases now carry a Windows build: `stable-win-x64-dev-3.0.zip` (121 MB, ~400 MB extracted), the exact tree C...",
		"body": "Tagged releases now carry a Windows build: `stable-win-x64-dev-3.0.zip` (121 MB, ~400 MB extracted), the exact tree CI extracted and launched on a Windows runner, attached next to the macOS disk images. It is unsigned and always will be, so the release notes and the install docs spell out the first-launch SmartScreen warning and the two clicks past it (**More info** → **Run anyway**) — extract the zip, run `bin\\launcher.exe`, no installer needed.",
		"short": "Windows build on the release page"
	},
	{
		"date": "2026-08-14",
		"type": "chore",
		"slug": "02-icon-artwork-v2",
		"title": "Swapped the app icon and website logo for a bolder redraw of the DEV-3 artwork: thicker neon eye outline, a filled li...",
		"body": "Swapped the app icon and website logo for a bolder redraw of the DEV-3 artwork: thicker neon eye outline, a filled light iris behind the console tiles, and a heavier wordmark, so it stays readable at menu-bar and favicon sizes. This render arrived on a pure-black background instead of white, so the alpha channel is derived from the black surround this time; every size was regenerated from one 1024x1024 master, including the iconset behind the macOS .icns and the Windows executable icon, the README and landing images, the web favicons, the artifact-template brand asset, and the logo baked into the social preview.",
		"short": "Bolder DEV-3 icon artwork"
	},
	{
		"date": "2026-08-14",
		"type": "feature",
		"slug": "03-artifact-template-wide-tables",
		"title": "The dev3 artifact starter now grows with the viewport up to 1840px instead of parking a fixed 1180px column on a wide...",
		"body": "The dev3 artifact starter now grows with the viewport up to 1840px instead of parking a fixed 1180px column on a wide monitor, and every table reads like a data grid: alternating row tint, a full-row hover highlight, vertical rules between cells, tabular figures, a header that stays pinned while the rows scroll, and a caret showing the sorted column and direction. Dense evidence ledgers keep their first column pinned so a row never becomes an anonymous strip of digits.",
		"short": "Wider artifact reports, readable tables"
	},
	{
		"date": "2026-08-14",
		"type": "feature",
		"slug": "20-backend-agnostic-pane-runs",
		"title": "Agents can now put a long command in a neighbouring pane and read what it printed on any terminal backend and any OS:...",
		"body": "Agents can now put a long command in a neighbouring pane and read what it printed on any terminal backend and any OS: `dev3 pane list` names the backend and which pane is yours, `dev3 pane run \"<command>\"` opens a pane and mirrors its output into a run log, `dev3 pane logs <run-id>` returns the outcome (still running, or the exit code) plus a bounded tail, and `dev3 pane close <run-id>` closes it. The injected dev3 skill no longer claims every agent lives inside a tmux session — false on every Windows task, where tmux does not exist — and the `/dev3-tmux` reference now gates itself on `dev3 pane list` before handing out a single tmux command. Same discipline for the other platform claim in that text: only macOS registers the `dev3://` scheme, so on Windows and Linux the skill now tells the agent NOT to append the origin-task footer instead of asking it to publish a dead link into a public pull request.",
		"short": "Run a command in the next pane"
	},
	{
		"date": "2026-08-14",
		"type": "feature",
		"slug": "30-task-notes-preview-and-log",
		"title": "Task notes no longer bury the task details: the panel now shows the newest three notes with a count, each long agent ...",
		"body": "Task notes no longer bury the task details: the panel now shows the newest three notes with a count, each long agent note folded to six lines behind a Show more toggle, and a Show all row that opens the whole note log in its own sheet on phones or dialog on desktop. A task with 143 notes used to render 45 900 px of scroll inside the mobile actions sheet.",
		"short": "Task notes stop flooding the panel"
	},
	{
		"date": "2026-08-14",
		"type": "feature",
		"slug": "30-windows-desktop-shortcut",
		"title": "dev3 now creates its own Desktop and Start Menu shortcuts on Windows at startup, and repairs them when an update move...",
		"body": "dev3 now creates its own Desktop and Start Menu shortcuts on Windows at startup, and repairs them when an update moves the app, so the app can be launched after a reboot without hunting through AppData. A shortcut you delete stays deleted, and a shortcut belonging to another app is never overwritten.",
		"short": "Windows gets a Desktop icon"
	},
	{
		"date": "2026-08-14",
		"type": "feature",
		"slug": "40-canary-releases-page",
		"title": "Canary builds are now downloadable from the GitHub releases page: one rolling pre-release tagged `canary`, refreshed ...",
		"body": "Canary builds are now downloadable from the GitHub releases page: one rolling pre-release tagged `canary`, refreshed on every publish, carrying the macOS DMGs, the Linux tarballs, the CLI tarballs and the launched Windows zip. It is always a pre-release and never \"Latest\", so the stable release keeps the badge and every `/releases/latest` link keeps resolving to it. Each file's row names the run that produced those exact bytes, and the in-app updater still reads the S3 feed — nothing about updates changed.",
		"short": "Canary builds on the releases page"
	},
	{
		"date": "2026-08-14",
		"type": "feature",
		"slug": "agent-message-toast",
		"title": "When one task's agent sends `dev3 message` to another task, a violet toast now names both sides — `#7 Coordinator → #...",
		"body": "When one task's agent sends `dev3 message` to another task, a violet toast now names both sides — `#7 Coordinator → #42 Receiver` — with a preview of the text, and clicking it opens the receiving task where the message landed. Human-sent messages and sends that reached no live agent stay silent, and the toast is dropped when either side belongs to a sensitive project in streamer mode.",
		"short": "See when agents message each other"
	},
	{
		"date": "2026-08-14",
		"type": "fix",
		"slug": "atomic-write-race-and-lock-retry",
		"title": "Task metadata writes no longer fail on transient filesystem hiccups: each atomic write now uses its own temp file (tw...",
		"body": "Task metadata writes no longer fail on transient filesystem hiccups: each atomic write now uses its own temp file (two concurrent writes inside one process used to collide and fail with ENOENT), retries a transient rename a few times, and a timed-out file-lock acquisition is retried with a short deadline instead of failing the whole operation.",
		"short": "No more transient task write failures"
	},
	{
		"date": "2026-08-14",
		"type": "chore",
		"slug": "canary-cron-every-20-minutes",
		"title": "The canary channel now publishes every 20 minutes instead of hourly while Windows is being shaken out on it, so a fix...",
		"body": "The canary channel now publishes every 20 minutes instead of hourly while Windows is being shaken out on it, so a fix no longer waits up to an hour for a build to appear. The cadence is temporary and the workflow carries the original cron line verbatim for a one-line revert; a concurrency group was added at the same time so two publish runs can queue rather than race each other's manifests."
	},
	{
		"date": "2026-08-14",
		"type": "fix",
		"slug": "close-agent-dialogs-on-every-client",
		"title": "Agent-initiated approval dialogs (a task asking to complete, or to start another task) are shown on every connected c...",
		"body": "Agent-initiated approval dialogs (a task asking to complete, or to start another task) are shown on every connected client — each open window plus every remote browser. Answering on one of them now closes the dialog on all the others instead of leaving a dead prompt behind.",
		"short": "Agent dialogs close on every client"
	},
	{
		"date": "2026-08-14",
		"type": "fix",
		"slug": "codex-config-windows-toml-escaping",
		"title": "Fixed the Codex config.toml dev3 writes on Windows: native paths were interpolated raw into TOML basic strings, so `C...",
		"body": "Fixed the Codex config.toml dev3 writes on Windows: native paths were interpolated raw into TOML basic strings, so `C:\\Users` read as the escape `\\U` and codex refused to start anywhere on the machine with a parse error. Paths are now escaped and joined with the platform separator, and dev3 repairs an already-broken config in place on next launch (backing the original up to `config.toml.dev3-backup` and leaving every non-dev3 line untouched).\r\n\r\nFollow-up: the paths are now joined in the dialect of the path they extend rather than the host's, so a POSIX fixture stays POSIX on a Windows runner.",
		"short": "Codex starts again on Windows"
	},
	{
		"date": "2026-08-14",
		"type": "docs",
		"slug": "debug-ui-headless-mobile-gate",
		"title": "The debug-ui QA skill now spells out the viewport rules for headless Chromium — set the viewport before opening the a...",
		"body": "The debug-ui QA skill now spells out the viewport rules for headless Chromium — set the viewport before opening the app and keep it at least 1024px wide — and adds a snapshot step that proves the page is actually clickable, not just screenshot-able. A new gotcha explains that an app which renders but refuses every click is the mobile portrait gate, with a one-line diagnostic to confirm it."
	},
	{
		"date": "2026-08-14",
		"type": "fix",
		"slug": "mobile-bottom-sheet-unclosable",
		"title": "Fixed the mobile bottom sheets (task actions, status, move to, PR status, pane map) rendering taller than the screen ...",
		"body": "Fixed the mobile bottom sheets (task actions, status, move to, PR status, pane map) rendering taller than the screen inside a task, which pushed their header — grabber, title and close button — above the top edge and left no backdrop to tap, so the only way out was picking an action. Backdrop dismissal now listens for a pointer tap, which iOS delivers reliably.",
		"short": "Mobile sheets close again"
	},
	{
		"date": "2026-08-14",
		"type": "feature",
		"slug": "mobile-key-repeat",
		"title": "On mobile, holding the Backspace or arrow keys in the terminal key bar now repeats them after a short delay, like a p...",
		"body": "On mobile, holding the Backspace or arrow keys in the terminal key bar now repeats them after a short delay, like a physical keyboard, instead of requiring one tap per character.",
		"short": "Hold mobile keys to repeat"
	},
	{
		"date": "2026-08-14",
		"type": "chore",
		"slug": "new-app-icon-v3",
		"title": "Replaced the app icon and the website logo with the new DEV-3 artwork: a neon eye framing a mission-control console w...",
		"body": "Replaced the app icon and the website logo with the new DEV-3 artwork: a neon eye framing a mission-control console with the DEV-3 wordmark on a dark rounded tile. The white background of the source render was converted to a real alpha channel (derived from the tile outline, not a rectangular crop), and every size was regenerated from one 1024x1024 master: the full `icon.iconset` (drives the macOS .icns and the embedded Windows executable icon), `docs/icon.png` / `docs/icon-192.png` for the README and landing page, the web favicons and apple-touch-icon served in remote/browser mode, the artifact-template brand asset, and the small logo baked into the social preview image `docs/og-image.jpg`.",
		"short": "New app icon and site logo"
	},
	{
		"date": "2026-08-14",
		"type": "fix",
		"slug": "pr-deeplink-single-line-handoff",
		"title": "The Create-PR prompt no longer carries a multi-line markdown block, so it cannot submit early on agents that read a n...",
		"body": "The Create-PR prompt no longer carries a multi-line markdown block, so it cannot submit early on agents that read a newline as Enter; the footer travels as one line and the divider is described in words. The dev3 agent skill and the ask-dev3 map now also describe the footer and where to switch it off.\r\n\r\nThe single-line approach, the skill updates and the toggle tests are all @BnayaZil's work from h0x91b/dev-3.0#1344, and the origin-task link feature itself is his (h0x91b/dev-3.0#1339).",
		"short": "Safer PR task-link handoff"
	},
	{
		"date": "2026-08-14",
		"type": "fix",
		"slug": "pr-origin-link-needs-registered-scheme",
		"title": "On Windows and Linux the \"Link pull requests back to the task\" setting is now off and disabled, with a line explainin...",
		"body": "On Windows and Linux the \"Link pull requests back to the task\" setting is now off and disabled, with a line explaining why: neither registers a handler for dev3:// links, so the deep link dev3 appended to a public pull request went nowhere when clicked. Pull requests opened from those hosts no longer carry the footer; your saved preference is left untouched on disk and still applies on a machine that has a handler.",
		"short": "PR back-link only where it works"
	},
	{
		"date": "2026-08-14",
		"type": "fix",
		"slug": "remote-terminal-stale-screen",
		"title": "Opening a task in remote mode no longer shows the previous task's terminal output: a fresh ghostty terminal inherited...",
		"body": "Opening a task in remote mode no longer shows the previous task's terminal output: a fresh ghostty terminal inherited the screen the previous one held, and over a tunnel that leftover stayed on display for as long as the redraw took. The canvas is now cleared on attach, and in remote mode it sits behind a blur labelled \"Syncing terminal...\" until the session's own output arrives.",
		"short": "No stale screen on task switch"
	},
	{
		"date": "2026-08-14",
		"type": "chore",
		"slug": "slower-qr-token-rotation",
		"title": "The remote-access QR code and its share link now rotate once a minute instead of every 25 seconds (the signed URL's l...",
		"body": "The remote-access QR code and its share link now rotate once a minute instead of every 25 seconds (the signed URL's lifetime grew from 30 to 65 seconds to match), so a link you just handed to a phone stays valid noticeably longer."
	},
	{
		"date": "2026-08-14",
		"type": "fix",
		"slug": "task-list-status-order",
		"title": "`dev3 task list` (and `dev3 tasks list`) now groups by column before paging: live work (in-progress, questions, every...",
		"body": "`dev3 task list` (and `dev3 tasks list`) now groups by column before paging: live work (in-progress, questions, every review column, custom columns) first, then To Do, then completed, then cancelled — newest first inside each group. A default page is no longer filled with archived tasks while something is still running.",
		"short": "task list shows live work first"
	},
	{
		"date": "2026-08-14",
		"type": "fix",
		"slug": "win-canary-publish-path-dialect",
		"title": "Fixed the win-x64 canary publish, which failed on its first ever run: the release script built an absolute module pat...",
		"body": "Fixed the win-x64 canary publish, which failed on its first ever run: the release script built an absolute module path under Git Bash (`/d/a/...`) and handed it to bun, which on Windows resolves only `D:\\a\\...`. The canary version suffix is now computed with a cwd-relative import, and the publish path is exercised on a real Windows runner in the packaged Windows proof so a macOS-only pass can no longer stand in for it.",
		"short": "Windows canary builds publish again"
	},
	{
		"date": "2026-08-14",
		"type": "feature",
		"slug": "windows-canary-channel",
		"title": "Windows (win-x64) now publishes to the canary update channel: the update manifest plus a downloadable .zip of the exa...",
		"body": "Windows (win-x64) now publishes to the canary update channel: the update manifest plus a downloadable .zip of the exact app tree CI launched and shut down cleanly, so a Windows user can install dev-3.0 for the first time instead of digging a build out of a workflow run. The build is not code-signed, so Windows shows a SmartScreen warning on first launch; the download instructions say so plainly. Tagged stable releases still ship no Windows build.",
		"short": "Windows builds now reach the canary channel"
	},
	{
		"date": "2026-08-14",
		"type": "fix",
		"slug": "windows-failure-fails-the-release",
		"title": "From now on a broken Windows build blocks the entire release, including the macOS disk images: the win-x64 leg is no ...",
		"body": "From now on a broken Windows build blocks the entire release, including the macOS disk images: the win-x64 leg is no longer best-effort, `release-build-windows.yml` lost its `bestEffort` input and `continue-on-error` altogether, and the release job's \"Warn when the Windows build is missing\" step is deleted because a missing Windows zip can no longer happen. The Linux legs keep their own best-effort semantics unchanged, and the canary channel was already fail-closed.",
		"short": "Windows failures now block the release"
	},
	{
		"date": "2026-08-14",
		"type": "docs",
		"slug": "windows-in-platform-lists",
		"title": "Every place that tells a human which platforms dev-3.0 runs on now lists Windows — the landing page (platform badge, ...",
		"body": "Every place that tells a human which platforms dev-3.0 runs on now lists Windows — the landing page (platform badge, install card, download caption, JSON-LD, social card), the README badge and platform table, the install guide, `llms.txt`, the agent install brief, AGENTS.md and concept.md — each carrying the same honest note that Windows support is brand new and may still be rough. Where the reader is about to download, the docs now say where the build actually lives: the Windows x64 zip ships in the canary channel only (the stable release page has no Windows file yet) and is unsigned, so the first launch goes through a SmartScreen warning. This also corrects the install guide, which pointed at a `stable-win-x64` download link that 404s today, and the generated canary release body, which told every reader that canary updates itself in place — true on macOS and Linux, but not reliable on Windows yet, where the way to a newer canary is to download the zip again. The Open Graph share image every link preview serves was re-rendered too, so a shared link no longer shows the old platform list.",
		"short": "Windows listed everywhere platforms are"
	},
	{
		"date": "2026-08-14",
		"type": "fix",
		"slug": "windows-update-hang",
		"title": "The Windows self-update could hang forever on a black console: the handover script waited on process image names, so ...",
		"body": "The Windows self-update could hang forever on a black console: the handover script waited on process image names, so a single leftover launcher.exe — or any unrelated Bun process on the machine — blocked it with no output at all. dev3 now runs its own swap script that waits on the app's actual process id, force-closes only what is still running from the folder being replaced, prints what it is doing, and keeps the window open with the reason when something genuinely fails.",
		"short": "Windows update no longer hangs"
	},
	{
		"date": "2026-08-13",
		"type": "feature",
		"slug": "pr-deeplink-opt-out",
		"title": "The deep link dev3 appends to pull requests is now a setting (Settings → Tasks, on by default), so a public PR need n...",
		"body": "The deep link dev3 appends to pull requests is now a setting (Settings → Tasks, on by default), so a public PR need not advertise which tool opened it, and the footer itself says where to switch it off. The footer also stopped swallowing the auto-merge instruction, starts on its own line so Markdown renders a rule instead of a heading, and the https open page now resolves new-task links correctly.\r\n\r\nBuilds on the origin-task deep link contributed by @BnayaZil (h0x91b/dev-3.0#1339).",
		"short": "Turn the PR task link on or off"
	},
	{
		"date": "2026-08-13",
		"type": "feature",
		"slug": "pr-origin-task-deeplink",
		"title": "Pull requests dev3 opens now end with a deep link back to the originating task, so anyone reading the PR can jump str...",
		"body": "Pull requests dev3 opens now end with a deep link back to the originating task, so anyone reading the PR can jump straight into the app. The link is a clickable https://dev3.h0x91b.com/open.html URL that redirects to the dev3:// scheme, plus the raw dev3://task/<id> as a copy-paste fallback.",
		"short": "Deep link back to the task in PRs"
	},
	{
		"date": "2026-08-12",
		"type": "fix",
		"slug": "global-settings-stale-at-boot",
		"title": "The task-complete sound played on every UI-driven completion after a restart even when the setting was off, because t...",
		"body": "The task-complete sound played on every UI-driven completion after a restart even when the setting was off, because the app never read global settings at boot — it held hardcoded defaults until the Settings screen was opened. Custom keyboard rebinds and the experimental terminal BiDi flag were stale the same way.",
		"short": "Sound setting honored right after launch",
		"suggestedBy": "giladra-wix",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1337",
		"issueRef": "#1337"
	},
	{
		"date": "2026-08-11",
		"type": "feature",
		"slug": "10-agent-preset-library",
		"title": "Settings → Agents is a two-pane preset library instead of nested accordions: a filterable list grouped by model on th...",
		"body": "Settings → Agents is a two-pane preset library instead of nested accordions: a filterable list grouped by model on the left (the same Model → Mode labels the launch picker shows), one preset editor on the right, with duplicate, favorite/unfavorite, make-default and a confirmation before delete. Every enum field — model, permission mode, reasoning effort, max budget — is now a searchable dropdown that also accepts a typed value the app has never heard of, so a brand-new model id or effort level needs no dev3 release.\r\n\r\nAn agent whose base command dev3 cannot recognize — a wrapper script, a shell alias, a command carrying flags — used to get no lifecycle hooks at all, so its task never moved across the board by itself and nothing on screen said why. The agent's own settings now carry a Lifecycle Hooks field (Auto, Claude Code, Codex, none) and warn when auto-detection comes up empty.",
		"short": "Agent settings is now a preset library"
	},
	{
		"date": "2026-08-11",
		"type": "fix",
		"slug": "artifact-template-spacing-and-chart-labels",
		"title": "The dev3 artifact starter no longer stacks panels flush against each other: `main.app` spaces its children, and a bar...",
		"body": "The dev3 artifact starter no longer stacks panels flush against each other: `main.app` spaces its children, and a bare `.card` carries its own padding, so a report looks right whatever order panels are written in. Chart value labels also stopped rendering as dark grey text inside a white halo on the dark theme — charts now declare the card surface they sit on, so ECharts picks readable label colors in both themes.",
		"short": "Artifact panels, padding and chart labels"
	},
	{
		"date": "2026-08-11",
		"type": "fix",
		"slug": "dev-devtools-black-window",
		"title": "Fixed locally built dev-channel apps opening a permanently black window on macOS 26: the dev-only DevTools auto-open ...",
		"body": "Fixed locally built dev-channel apps opening a permanently black window on macOS 26: the dev-only DevTools auto-open at dom-ready hit a known Electrobun bug (blackboardsh/electrobun#357) where the docked Web Inspector blanks WKWebView content rendering while the renderer keeps running. DevTools auto-open is now gated off on macOS 26 and newer (still on for Linux, Windows, and earlier macOS), with `DEV3_DEVTOOLS=1`/`=0` as explicit overrides, restoring native-window development on macOS 26."
	},
	{
		"date": "2026-08-11",
		"type": "fix",
		"slug": "foreign-branch-config-trust",
		"title": "A task started on a remote or fork ref — a pull request you opened for review — no longer runs that branch's committe...",
		"body": "A task started on a remote or fork ref — a pull request you opened for review — no longer runs that branch's committed `.dev3` setup, dev and cleanup scripts, no longer exports its env vars into your sessions, and no longer gets pre-granted agent trust or `.mcp.json` approval; the project's own config is used instead. Such tasks carry an eye marker on the board and a \"Code: someone else's\" row in the inspector, where one click hands the branch its trust back after a warning. In the diff viewer, a changed `.dev3/config.json`, `.mcp.json` or `.claude/settings.json` now wears a RUNS badge so a hostile command cannot hide in a large review.\r\n\r\nReported by @glmgbj233 (h0x91b/dev-3.0#1315)",
		"short": "Reviewed branches no longer run their own scripts"
	},
	{
		"date": "2026-08-11",
		"type": "fix",
		"slug": "remote-qr-waits-for-tunnel",
		"title": "Remote Access no longer flashes a scannable LAN QR code while the Cloudflare tunnel is still starting: with \"Accessib...",
		"body": "Remote Access no longer flashes a scannable LAN QR code while the Cloudflare tunnel is still starting: with \"Accessible from anywhere\" on, the QR, the URL and Copy URL are replaced by a loader until the public hostname lands. With the tunnel off, the interface picker and the local QR appear immediately as before.",
		"short": "QR waits for the public link"
	},
	{
		"date": "2026-08-11",
		"type": "fix",
		"slug": "setup-pane-below-agent",
		"title": "When a project has a setup script, its log pane now opens below the agent pane instead of above it, so the agent keep...",
		"body": "When a project has a setup script, its log pane now opens below the agent pane instead of above it, so the agent keeps the top slot it occupies on tasks without a setup script.",
		"short": "Setup log pane now sits below"
	},
	{
		"date": "2026-08-11",
		"type": "feature",
		"slug": "task-sort-order-setting",
		"title": "Settings → Tasks & Board now has a Task sort order preference that governs the order of tasks inside a priority band,...",
		"body": "Settings → Tasks & Board now has a Task sort order preference that governs the order of tasks inside a priority band, on the Kanban board and in the Active Tasks sidebar alike: Oldest first (default) floats the task whose status changed longest ago, Newest first puts the most recently active one on top. It replaces the old Task drop position setting, and manual drag-reordering inside a column is gone — dragging a card still moves it between columns, but its position within one is now derived rather than stored, so the two surfaces can no longer disagree. Two consequences of that: dropping a card into another priority band no longer changes its priority (use the card's priority badge, the inspector, or `dev3 task update --priority`), and variants of one task are no longer kept adjacent inside a column — each is placed by its own activity clock. Tasks in custom columns are now ordered too — they used to render unsorted, which could show a P4 above a P3.",
		"short": "Choose how tasks are ordered",
		"suggestedBy": "giladra-wix",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1314",
		"issueRef": "#1314"
	},
	{
		"date": "2026-08-10",
		"type": "feature",
		"slug": "30-remote-terminal-latency-flag",
		"title": "The terminal over remote access no longer holds a keystroke echo for a full frame before sending it, and it now throt...",
		"body": "The terminal over remote access no longer holds a keystroke echo for a full frame before sending it, and it now throttles its send cadence instead of piling frames into a socket the tunnel cannot drain — so sustained output stops rendering smoothly but behind reality. Both behaviours ship behind the project's first PostHog feature flag, which refreshes about every five minutes without a restart.\r\n\r\nDebug → Feature Flags is a new window listing every flag with the value the app is actually gating code on, next to the PostHog distinct ID a rollout can be pointed at — the id PostHog really evaluates this install as, shared by the desktop window and any attached browser, with a copy button and a warning if the two ever disagree. Alongside it, saving a global setting no longer erases values the host owns rather than the settings screen.",
		"short": "Snappier terminal over remote"
	},
	{
		"date": "2026-08-10",
		"type": "fix",
		"slug": "ai-review-config-reset",
		"title": "Project Settings saves no longer get silently reverted when a .dev3 config file already owns the field — the value is...",
		"body": "Project Settings saves no longer get silently reverted when a .dev3 config file already owns the field — the value is written back into that file instead of projects.json, and the Project tab now shows the config that will actually run. The AI Review column also defaults to Claude Opus 5 (X-High) and rewrites the removed `claude-bypass-sonnet` preset instead of falling back to whatever preset happens to sit first in the list.",
		"short": "AI Review settings stop resetting"
	},
	{
		"date": "2026-08-10",
		"type": "chore",
		"slug": "claude-hook-merge-regression-tests",
		"title": "Hardened dev3 hook installation against a malformed .claude/settings.local.json: shapes that previously threw (a non-...",
		"body": "Hardened dev3 hook installation against a malformed .claude/settings.local.json: shapes that previously threw (a non-array hooks event, a null root, a broken matcher group) now install cleanly instead of silently launching the agent with no hooks, a UTF-8 byte-order mark no longer wipes the file, and a string or array root no longer injects numeric keys into the user's settings. dev3 also re-asserts the Claude hooks before every prompt it delivers, so a task keeps moving between columns even when Claude Code or an MCP server rewrites that file mid-session."
	},
	{
		"date": "2026-08-10",
		"type": "fix",
		"slug": "diff-markdown-images",
		"title": "The Markdown preview and rich diff in the diff viewer now render images the document references from the repo (`![](d...",
		"body": "The Markdown preview and rich diff in the diff viewer now render images the document references from the repo (`![](docs/shot.png)`) instead of showing a broken box — the file is read off disk and inlined. Missing files show a labelled placeholder, remote URLs are untouched.",
		"short": "Markdown preview shows repo images"
	},
	{
		"date": "2026-08-10",
		"type": "fix",
		"slug": "diff-review-one-click-send-and-header-layout",
		"title": "Throwing a single remark at the agent from the diff cost three clicks — add the comment, send it, delete it — so the ...",
		"body": "Throwing a single remark at the agent from the diff cost three clicks — add the comment, send it, delete it — so the comment composer now has a Send now button that ships it immediately and keeps it out of the review. The Review export card shrank to its title line: the count is plain text instead of a boxed number that looked editable, Copy, Send and an icon-only Reset sit in one compact row, and an empty review shows no buttons at all. Comment cards now read \"Comment 1/2\". The per-file header in the diff no longer squeezes long paths into a one-character-per-line column on medium window widths — the path stays on one line and the Preview/Read controls wrap instead.",
		"short": "One-click send in diff review",
		"suggestedBy": "diverru"
	},
	{
		"date": "2026-08-10",
		"type": "feature",
		"slug": "editable-review-mode-prompt",
		"title": "The prompt the Review toggle injects into a new task's description is now editable in Settings → Tasks & Board and, p...",
		"body": "The prompt the Review toggle injects into a new task's description is now editable in Settings → Tasks & Board and, per project, in Project Settings → Project Config. A project override wins over the global one, which wins over the built-in localized text; both fields have a reset that falls back to what they inherit.",
		"short": "Edit the Review toggle's prompt"
	},
	{
		"date": "2026-08-10",
		"type": "feature",
		"slug": "large-agent-messages",
		"title": "`dev3 message` now accepts up to 80 000 characters instead of 10 000, and a body too large to type into a terminal is...",
		"body": "`dev3 message` now accepts up to 80 000 characters instead of 10 000, and a body too large to type into a terminal is written to a file automatically — the agent receives that path inside the usual envelope instead of a `command too long` failure. The old limits were also wrong about what tmux can carry, so messages that passed validation could still die at delivery.",
		"short": "Send messages up to 80 000 chars"
	},
	{
		"date": "2026-08-10",
		"type": "fix",
		"slug": "no-nested-worktrees",
		"title": "The dev3 agent protocol now states that the managed worktree is the isolation boundary, so agents no longer create a ...",
		"body": "The dev3 agent protocol now states that the managed worktree is the isolation boundary, so agents no longer create a nested git worktree, clone, or side checkout when an unrelated skill or workflow asks for one. An explicit user request still overrides it.\r\n\r\nReported by Bar Volovsky",
		"short": "Stop agents nesting git worktrees"
	},
	{
		"date": "2026-08-10",
		"type": "docs",
		"slug": "readme-product-showcase",
		"title": "The README was rebuilt as a visual product tour: the board screenshot sits above the fold, then the six-step loop fro...",
		"body": "The README was rebuilt as a visual product tour: the board screenshot sits above the fold, then the six-step loop from task to merge with a screenshot or GIF at every step, then capabilities, then why it works this way — the one-person-studio bet and the \"not an IDE\" refusal — and finally a short quick start. Two screens that had no picture at all are now shown, Productivity stats and the artifact viewer, the five-month-old New Task dialog screenshot was replaced, and the install reference, remote-access guide, troubleshooting and full keyboard-shortcut table moved into focused pages under `docs/` that are linked from both the README and the website footer.",
		"short": "README is now a product tour"
	},
	{
		"date": "2026-08-10",
		"type": "fix",
		"slug": "review-send-never-loses-comments",
		"title": "Pressing \"Send to agent\" on a diff review could erase the whole review while the agent received nothing — the send re...",
		"body": "Pressing \"Send to agent\" on a diff review could erase the whole review while the agent received nothing — the send reported success as soon as the keystrokes left dev3, which is not the same as the agent reading them. Sent comments are now marked as sent and kept, exactly like a single comment sent on its own, and clearing them stays the explicit Reset button. A second cause is fixed underneath: on a task with several agent panes and no recorded focus, the hand-off could be typed into whatever pane you were looking at, including a plain shell — it now always goes to an agent pane, and the chosen pane is written to the log.",
		"short": "Sending a review never loses it",
		"suggestedBy": "diverru"
	},
	{
		"date": "2026-08-10",
		"type": "fix",
		"slug": "terminal-cursor-hidden-when-unfocused",
		"title": "The terminal cursor no longer blinks while your input goes somewhere else — it disappears when focus moves to the art...",
		"body": "The terminal cursor no longer blinks while your input goes somewhere else — it disappears when focus moves to the artifact panel, another pane, or another app, and comes back the moment the terminal is focused again. Dictating into a terminal that only looked ready to receive it is what this ends.",
		"short": "Terminal cursor hides when unfocused"
	},
	{
		"date": "2026-08-10",
		"type": "fix",
		"slug": "uncap-task-shared-images",
		"title": "Images an agent shares with `dev3 show-image` are no longer capped at 50 per task — the 51st image used to silently d...",
		"body": "Images an agent shares with `dev3 show-image` are no longer capped at 50 per task — the 51st image used to silently drop and delete the oldest one. The whole history is kept now, exactly like shared artifacts, and the stored files still die with the worktree.",
		"short": "Task image history is no longer capped"
	},
	{
		"date": "2026-08-10",
		"type": "fix",
		"slug": "web-terminal-glyph-cell-alignment",
		"title": "Block, box-drawing and powerline glyphs in the web terminal are now painted on the same cell box as the cell backgrou...",
		"body": "Block, box-drawing and powerline glyphs in the web terminal are now painted on the same cell box as the cell background, so powerline caps sit flush against the segment they join instead of 2px above it, and bars drawn out of block characters come out solid instead of striped with 1px seams.\r\n\r\nReported by Vitaly Pavlenko.",
		"short": "Powerline prompts line up in the terminal"
	},
	{
		"date": "2026-08-09",
		"type": "fix",
		"slug": "canary-version-identity",
		"title": "A canary build and the stable release of the same version were indistinguishable: the published canary manifest carri...",
		"body": "A canary build and the stable release of the same version were indistinguishable: the published canary manifest carried a bare version, so the update popover offered \"v1.42.3 ready to install\" with \"what's new in v1.42.3\" for a build off main. The canary feed now publishes `1.42.3+canary.<sha>`, the update popover and the About dialog mark the build with a Canary badge carrying the commit, and the popover's what's-new heading says \"since\" rather than \"in\" on canary, because that list is the changes the release does not contain.",
		"short": "Canary builds say they are canary"
	},
	{
		"date": "2026-08-08",
		"type": "feature",
		"slug": "02-stable-unstable-update-channels",
		"title": "Settings → System now lets you pick which builds you get",
		"body": "Settings → System now lets you pick which builds you get. Stable ships only when a release is tagged, which is what everyone was already on; unstable publishes from main roughly hourly, so you see features the day they land. Switching either way keeps your board, your tasks and your settings — and switching back to stable while it is behind installs the older build, which the confirmation says out loud before you commit to it.",
		"short": "Choose stable or unstable updates"
	},
	{
		"date": "2026-08-08",
		"type": "feature",
		"slug": "05-canary-update-channel",
		"title": "Settings → System can now switch you to the Canary update channel, which publishes from main roughly hourly instead o...",
		"body": "Settings → System can now switch you to the Canary update channel, which publishes from main roughly hourly instead of only when a release is tagged. Switching either way keeps your board, your tasks and your settings, and going back to Stable while it is behind installs the older build — the confirmation says so before you commit. Canary is not published for Windows yet, so the picker stays disabled there and explains why rather than looking broken.",
		"short": "Canary channel is live on macOS and Linux"
	},
	{
		"date": "2026-08-08",
		"type": "feature",
		"slug": "archived-task-shared-outputs",
		"title": "Clicking a completed or cancelled task now lists every screenshot and HTML report the agent shared for it, each as it...",
		"body": "Clicking a completed or cancelled task now lists every screenshot and HTML report the agent shared for it, each as its own link that opens the viewer at that item — no need to restart the task to see its own output. Escape now unwinds viewer first, then the task card, instead of closing the card underneath.",
		"short": "Reopen a finished task's images and reports"
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "cli-socket-race-test-corpse-isolation",
		"title": "Fixed the load-dependent flake in the cli-socket label.delete and note race suites",
		"body": "Fixed the load-dependent flake in the cli-socket label.delete and note race suites. A test that blew its time budget kept running, and because it read its project id, path and slug from mutable module scope it adopted the next test's identity and wrote its fixture and its injected concurrent write into that test's tasks.json. Each body now receives a frozen context created before its first await, injections are keyed by project, and the suites get a budget that a loaded machine cannot blow by accident."
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "hide-update-channel-until-feed-exists",
		"title": "The update-channel picker went out live in 1.42.1, but nothing is published on the second channel yet — choosing it l...",
		"body": "The update-channel picker went out live in 1.42.1, but nothing is published on the second channel yet — choosing it left the app showing a bare HTTP 403 instead of an update. The picker is disabled again and a channel already saved is read back as stable, so anyone who switched is returned to working updates without touching their settings file. The hourly publishing job is off for the same reason, rather than failing every hour.",
		"short": "Update channel hidden until it works"
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "label-delete-race-test-isolation",
		"title": "Gave each test in the `label.delete` and `note.add`/`note.delete` race suites its own project, so a handler suspended...",
		"body": "Gave each test in the `label.delete` and `note.add`/`note.delete` race suites its own project, so a handler suspended on purpose by one test can no longer land its write in the next test's tasks.json. Each suite gains an isolation test that kills the neighbour deliberately and asserts the late write is unobservable, replacing a failure that only appeared under machine load."
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "mobile-board-touch-target-inflation",
		"title": "Fixed the phone UI being sized for a mouse: the global touch-target rule forced every button to 44×44 (inflating caro...",
		"body": "Fixed the phone UI being sized for a mouse: the global touch-target rule forced every button to 44×44 (inflating carousel dots, label chips and priority badges) and its `:is()` selector silently overrode each component's own size. The floor is now 24×24 via `:where()`, bottom-sheet rows keep true 44px targets, and the 0.67× density that only the terminal screen used now applies to every screen on a phone. Priority badges and label chips opt out of the floor entirely, so their text sits centred in a box that fits it, and the label chip's hover-only remove button no longer reserves space on a device that has no hover. Control rows now shed instead of stacking: the task summary bar drops the diff badge and then the output badges rather than wrapping onto a second line (the diff stays one tap away in the actions sheet), the diff viewer's four comparison modes collapse into one button that opens a sheet on a phone, and its desktop toolbar sheds its chips instead of breaking in two on a narrowed window. The Kanban carousel dropped its column dots, and the Launch-task footer no longer breaks its button labels one word per line.",
		"short": "Phone UI is half the size"
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "mobile-kanban-loading-skeleton",
		"title": "The Kanban loading placeholder now matches the phone layout it precedes: below 768px it shows a single full-width col...",
		"body": "The Kanban loading placeholder now matches the phone layout it precedes: below 768px it shows a single full-width column under a pager row instead of five squeezed vertical rails, so the board reads as loading rather than as an empty grid.",
		"short": "Phone-shaped Kanban loading skeleton"
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "mobile-per-screen-density",
		"title": "The phone used one scale everywhere, tuned for working inside a task, which left the Kanban board and the dashboard r...",
		"body": "The phone used one scale everywhere, tuned for working inside a task, which left the Kanban board and the dashboard reading as a thumbnail of a desktop board. Screens you only browse — board, dashboard, settings, stats, changelog — are now 25% larger, while a task's terminal, diff and inspector keep the dense scale. Bottom sheets such as the header's More menu and Task actions come up at the larger size too, even when opened on top of a task, and the icon buttons inside them no longer sit against the left edge of their tap target.",
		"short": "Board and dashboard 25% bigger on phone"
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "narrow-header-memory-into-kebab",
		"title": "On narrow viewports the global header's memory-headroom readout no longer sits inline next to the breadcrumb — it fol...",
		"body": "On narrow viewports the global header's memory-headroom readout no longer sits inline next to the breadcrumb — it folds into the kebab bottom sheet alongside prevent-sleep, rate limits, git pull and tmux sessions, and still opens its full breakdown there. Desktop widths are unchanged.",
		"short": "Memory readout folds into phone kebab"
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "native-e2e-record-geometry-wait",
		"title": "The native task-terminal E2E no longer assumes that a resize acknowledgement means the session record is already on d...",
		"body": "The native task-terminal E2E no longer assumes that a resize acknowledgement means the session record is already on disk — the host persists it fire-and-forget after answering, so the record lagged and the Windows release gate failed intermittently. The three geometry reads in that test now wait for the record and print what it actually held when they fail."
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "publish-update-manifest-last",
		"title": "A release published the update manifest before the file it points at, so an app that happened to check for updates du...",
		"body": "A release published the update manifest before the file it points at, so an app that happened to check for updates during those few seconds was offered a download that did not exist yet. The manifest is now the last thing written to the release bucket.",
		"short": "No more updates that fail to download"
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "reap-worktree-processes-on-teardown",
		"title": "Completing, cancelling, deleting or hibernating a task now kills every process still running inside its worktree, not...",
		"body": "Completing, cancelling, deleting or hibernating a task now kills every process still running inside its worktree, not just the terminal tree and the dev server — detached agent daemons, headless browsers, watchers and leftover dev builds used to survive teardown and keep burning CPU and memory for weeks. What earlier versions already leaked shows up as a new section at the bottom of the memory breakdown (the header memory pill) with a single Kill button; it appears only when there is something to reclaim, and nothing is ever killed without confirmation.",
		"short": "Reclaim processes leaked by finished tasks"
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "rename-update-channel-to-canary",
		"title": "The second update channel is now called Canary instead of Unstable — the old name could never actually be built, beca...",
		"body": "The second update channel is now called Canary instead of Unstable — the old name could never actually be built, because the build tool only accepts channel names from its own list and quietly produced a development build for anything else. Nothing had been published under the old name, so nobody needs to do anything; a saved choice simply reads back as Stable. The hourly publishing job is running again, and the picker stays disabled until a build is actually readable in the release bucket.",
		"short": "Second update channel renamed canary"
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "sidebar-rail-label-latched-height",
		"title": "The Active Tasks sidebar showed its upright status word only on rows tall enough for it, but the word itself propped ...",
		"body": "The Active Tasks sidebar showed its upright status word only on rows tall enough for it, but the word itself propped up the row: once a task had been focused with an overview, its row kept both the word and the extra height after focus moved away. The word is now painted out of flow, so a row that loses its overview shrinks straight back.",
		"short": "Sidebar rows stop staying tall"
	},
	{
		"date": "2026-08-08",
		"type": "chore",
		"slug": "update-channel-mechanism",
		"title": "The stable/unstable update channel is now implemented end to end — one persisted setting, three separate ordering rul...",
		"body": "The stable/unstable update channel is now implemented end to end — one persisted setting, three separate ordering rules, and a confirmation that says what switching back costs — but the Settings control stays disabled until the unstable feed exists, so nothing changes for anyone yet. The old \"canary\" channel value is gone; anything unrecognised in settings.json reads as stable.",
		"short": "Update-channel plumbing behind a gate"
	},
	{
		"date": "2026-08-08",
		"type": "chore",
		"slug": "windows-ci-dependency-cache",
		"title": "Cached the dependency install in both Windows jobs of the packaged proof, where `bun install` measured 255s against 4...",
		"body": "Cached the dependency install in both Windows jobs of the packaged proof, where `bun install` measured 255s against 4-5s on Ubuntu and 10-36s on macOS, making it over half of the job that gates every release. Paying for it meant dropping the Linux node_modules cache, which measured a 7s restore against a 5s install while holding 4.8 GiB of the repository's 10 GB cache budget. The release graph is unchanged: the Windows proof still gates the build jobs, so a partial release stays impossible."
	},
	{
		"date": "2026-08-08",
		"type": "fix",
		"slug": "windows-window-taskbar-icon",
		"title": "The dev-3.0 window on Windows now shows the app icon in its title bar and in the taskbar instead of the generic syste...",
		"body": "The dev-3.0 window on Windows now shows the app icon in its title bar and in the taskbar instead of the generic system default. Electrobun never assigns an icon to its window class, so the app sets one itself at startup from the icon already embedded in its own executables.",
		"short": "Windows window and taskbar icon"
	},
	{
		"date": "2026-08-07",
		"type": "feature",
		"slug": "02-sidebar-lifecycle-rail",
		"title": "The Active Tasks sidebar row now carries the same lifecycle rail as the Kanban card: a status ring that opens the Mov...",
		"body": "The Active Tasks sidebar row now carries the same lifecycle rail as the Kanban card: a status ring that opens the Move-to menu, the attention bell, and one-click complete, with the upright status word appearing only on rows tall enough to hold it whole. The row leads with the task title and demotes the agent config to a muted line at the bottom, so what identifies a task outranks what is identical on almost every task.",
		"short": "Lifecycle rail in the sidebar"
	},
	{
		"date": "2026-08-07",
		"type": "feature",
		"slug": "20-toast-unified-anatomy",
		"title": "Every toast now carries a source line saying where it came from: the task number, project and title for task work, th...",
		"body": "Every toast now carries a source line saying where it came from: the task number, project and title for task work, the project name for project-level messages, or the app area (Settings, Update, Dashboard, Terminal, Menu) for everything else — and clicking a task or project toast takes you there. A call site only names its origin with one token; the toast host composes the rest, so new toasts are correct by default.",
		"short": "Toasts say where they came from"
	},
	{
		"date": "2026-08-07",
		"type": "feature",
		"slug": "artifact-open-in-browser",
		"title": "The artifact viewer header now has an external-link button that opens the artifact in your web browser, next to the d...",
		"body": "The artifact viewer header now has an external-link button that opens the artifact in your web browser, next to the download button. On the desktop app it hands the stored HTML file to your default browser; over remote access it opens the rendered document in a new tab.",
		"short": "Open an artifact in your browser"
	},
	{
		"date": "2026-08-07",
		"type": "chore",
		"slug": "extract-reusable-release-build-workflows",
		"title": "The four per-platform release builds moved out of release.yml into two reusable workflows, so a second trigger no lon...",
		"body": "The four per-platform release builds moved out of release.yml into two reusable workflows, so a second trigger no longer means a fifth and sixth copy of the same steps. Two long-dead recovery branches in the release artifact script were revived and covered by tests — one of them had been unable to run since March.",
		"short": "One release build definition per platform"
	},
	{
		"date": "2026-08-07",
		"type": "fix",
		"slug": "mobile-shared-images-viewer",
		"title": "On a phone the Images and Artifacts rows in the task actions sheet just closed the sheet without opening anything — t...",
		"body": "On a phone the Images and Artifacts rows in the task actions sheet just closed the sheet without opening anything — the event they fired was missing the project id the viewer needs. Both now open, and both also ride the task summary bar next to the priority chip as touch-sized badges, so a produced screenshot or artifact is visible without opening the menu.",
		"short": "Images and artifacts on mobile"
	},
	{
		"date": "2026-08-07",
		"type": "fix",
		"slug": "native-journal-proof-durability-vs-isolation",
		"title": "The native-session registry's Windows lifecycle proof reported journal isolation as one\r\nboolean over two unrelated p...",
		"body": "The native-session registry's Windows lifecycle proof reported journal isolation as one\r\nboolean over two unrelated properties, so a red run could name neither: a session's own\r\noutput is now awaited to a ceiling instead of a fixed 400 ms sleep, cross-session leakage is\r\nre-checked on every observation so waiting can never hide it, and a failure names the cause,\r\nthe fix and the journal contents it saw. Whether this also removes the intermittent Windows\r\nred is unproven — only recurrence will tell, and the log will then say which half broke.",
		"short": "Native journal proof says what broke"
	},
	{
		"date": "2026-08-07",
		"type": "fix",
		"slug": "no-merge-prompt-after-reopening-a-task",
		"title": "Pulling a task back out of Completed no longer greets you with \"the branch is already merged — complete the task?\" se...",
		"body": "Pulling a task back out of Completed no longer greets you with \"the branch is already merged — complete the task?\" seconds later. The head the task comes back on counts as already answered; work merged after the reopen still offers completion as usual.",
		"short": "No merge prompt after reopening"
	},
	{
		"date": "2026-08-07",
		"type": "fix",
		"slug": "stale-task-comparison-base",
		"title": "A task's ahead/behind counts, diff chip, PR badge and Rebase (AI) target could stay pinned to an already-merged revie...",
		"body": "A task's ahead/behind counts, diff chip, PR badge and Rebase (AI) target could stay pinned to an already-merged review branch after the task's own branch was renamed, so every number described someone else's branch. The comparison base now survives a rename, retires itself once that branch is merged or gone, is fetched from the remote that actually owns it, and a stored pull request only counts while it belongs to the task's own branch.",
		"short": "Task git numbers stop trusting a dead base"
	},
	{
		"date": "2026-08-06",
		"type": "feature",
		"slug": "01-claude-limit-parks-task",
		"title": "When a Claude turn dies on an API error — a hit usage limit, an expired login, a billing block — the task now moves i...",
		"body": "When a Claude turn dies on an API error — a hit usage limit, an expired login, a billing block — the task now moves itself to Has Questions with a red attention badge and a desktop notification naming the reset time, instead of sitting in Agent is Working for hours. Claude Code fires its `StopFailure` hook instead of `Stop` in that case, which dev3 previously ignored.",
		"short": "Usage limits park the task, not hide"
	},
	{
		"date": "2026-08-06",
		"type": "feature",
		"slug": "01-doctor-worktrees-disk-report",
		"title": "`dev3 doctor --worktrees` reports what `~/.dev3.0/worktrees` keeps on disk per project and how much of it is reclaima...",
		"body": "`dev3 doctor --worktrees` reports what `~/.dev3.0/worktrees` keeps on disk per project and how much of it is reclaimable: orphaned directories whose task record no longer exists, worktrees whose teardown never finished, and old diffs/logs of long-finished tasks. Report-only by default; `--prune-orphans` and `--prune-older-than <duration>` delete, and a directory on an unmerged `dev3/task-*` branch is skipped unless you add `--force-unmerged`.",
		"short": "See and reclaim worktree disk"
	},
	{
		"date": "2026-08-06",
		"type": "feature",
		"slug": "10-terminal-file-path-links",
		"title": "File paths mentioned in terminal output (absolute, ~-relative, or worktree-relative, even when soft-wrapped across li...",
		"body": "File paths mentioned in terminal output (absolute, ~-relative, or worktree-relative, even when soft-wrapped across lines) are now rendered as underlined links and are Cmd/Ctrl+Clickable — only paths that actually exist on disk, inside your home directory or a registered project, become links. A new Settings → Terminal \"File path click action\" chooses what the click does: preview the file in a dev3 modal (default, with markdown rendering and image support), open it in the OS default app, or reveal it in Finder; browser/remote sessions always use the in-app preview.",
		"short": "Cmd+Click file paths in terminal"
	},
	{
		"date": "2026-08-06",
		"type": "feature",
		"slug": "20-peek-peer-task-terminal",
		"title": "New read-only `dev3 peek` command: a coordinating agent can glance at another task's terminal — a per-pane summary wi...",
		"body": "New read-only `dev3 peek` command: a coordinating agent can glance at another task's terminal — a per-pane summary with liveness and how long ago each pane produced output, plus the tail of one pane — without focusing it, sending input, or interrupting the worker. Both backends answer with the same fields and the same meanings: on tmux the output ages are per window, which the output states explicitly, and anything a backend cannot supply is reported as `unknown` rather than guessed. Native tasks currently answer `could not read the terminal — not-enabled`, because the native host publishes no capture artifact yet (decision 202); their pane summary still works.",
		"short": "Peek at another task's terminal"
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "agent-prompt-guarded-delivery",
		"title": "Handing a task off to its agent — Create PR, Commit, the rebase-conflict prompt, `dev3 message` and scheduled message...",
		"body": "Handing a task off to its agent — Create PR, Commit, the rebase-conflict prompt, `dev3 message` and scheduled messages — now reports three answers instead of two: delivered, not delivered, or sent-but-unconfirmed. The last one used to be silently reported as success, which mattered most for scheduled messages: they leave the queue whichever way it goes, so a message that never arrived looked delivered and was unrecoverable. `dev3 message` exits with the new code 11 for it, so an agent no longer re-sends a message that may already have landed. On tmux the prompt is also now pinned to the exact pane and server it was sighted in, and a message whose text reads like a key name (`C-c`, `Escape`) is finally typed into the agent rather than pressed as that key.",
		"short": "Honest answers when a prompt is sent"
	},
	{
		"date": "2026-08-06",
		"type": "refactor",
		"slug": "backend-neutral-pane-input",
		"title": "Added one internal backend-neutral way to inject terminal input into a named task pane, ready for terminal workflows ...",
		"body": "Added one internal backend-neutral way to inject terminal input into a named task pane, ready for terminal workflows to build on. A tmux stage goes out as a single guarded command that checks the pane's session, its server's own generation token, that the pane is alive and that it is not sitting in copy mode before sending, so a moved pane, a restarted server or a scrolled-back pane cannot receive stray input. Delivery is at-most-once within one executor process and pane incarnation, with an honest verdict instead of a boolean, and the native backend reports uncertainty until its host can acknowledge input."
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "create-pr-delivery-feedback",
		"title": "The Create PR and PR + auto-merge buttons used to hand the request to the agent in total\r\nsilence, so a failed handof...",
		"body": "The Create PR and PR + auto-merge buttons used to hand the request to the agent in total\r\nsilence, so a failed handoff looked exactly like a successful one. They now show the same\r\nthree answers the Rebase and Commit handoffs give: the request reached the agent, delivery\r\ncould not be confirmed, or no agent terminal was found. None of the messages claims the pull\r\nrequest itself exists — only that the request reached the agent.",
		"short": "Create PR now tells you what happened"
	},
	{
		"date": "2026-08-06",
		"type": "docs",
		"slug": "decision-records-dated-not-numbered",
		"title": "Decision records moved from a sequential `decisions/NNN-slug.md` to dated directories, `decisions/YYYY/MM/DD/slug.md`...",
		"body": "Decision records moved from a sequential `decisions/NNN-slug.md` to dated directories, `decisions/YYYY/MM/DD/slug.md`, the same shape as change-logs and for the same reason: parallel agents branching off the same main all read the same \"next\" number and all take it, so 98 numbers on main were already shared by two to seven records each. All 369 existing records were moved in one pass, dated by the day they were first committed, and `decisions/README.md` maps every old name to its new path so existing citations still resolve. A test enforces the layout, since the prose rule is what failed the first time."
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "dim-placeholder-color",
		"title": "Dim text in Claude Code and Codex — input placeholders, hints, select-prompt descriptions — rendered at full brightne...",
		"body": "Dim text in Claude Code and Codex — input placeholders, hints, select-prompt descriptions — rendered at full brightness instead of gray. The tmux Catppuccin pane style paints every default-fg cell with an explicit truecolor foreground, which made the terminal color filter treat those cells as an app-chosen color and drop the dim; dim is now tracked as independent terminal state and the pane-style foreground no longer counts as a color.",
		"short": "Placeholder text is gray again"
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "hunter-launch-rolls-back-on-unproven-prompt",
		"title": "Launching bug hunters on a tmux task now waits for each hunt prompt to actually reach its pane instead of firing it b...",
		"body": "Launching bug hunters on a tmux task now waits for each hunt prompt to actually reach its pane instead of firing it blind. If a pane provably never got its prompt, the whole launch is undone and you get an error naming that pane, rather than a hunter sitting at an empty prompt you would have to notice and close by hand. A delivery whose fate cannot be proven keeps its pane. The visible trade-off: the Find bugs action now takes about five seconds before it finishes, the way it already did on the native terminal backend.\r\n\r\nDeclared ride-along, unrelated to the fix above: `decisions/2026/08/06/required-checks-wait-for-windows-packaging.md` stated the new Windows gate's cost as about +4 minutes, which the gate's first live run measured at +4m45 — corrected here with the run id and the reason the first estimate was low, because the estimate came from per-job durations and the scope job runs serially in front of the packaging jobs.",
		"short": "Find bugs no longer leaves silent hunter panes"
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "launch-memory-banner-plain-language",
		"title": "The memory notice in the launch dialogs no longer quotes megabytes; it now says in one short line that the machine is...",
		"body": "The memory notice in the launch dialogs no longer quotes megabytes; it now says in one short line that the machine is loaded and that another task will be a squeeze, taking half the vertical space it used to. The variant number and remove button in the launch dialog are also centred against the pickers instead of riding their top edge.",
		"short": "Memory warning in plain words"
	},
	{
		"date": "2026-08-06",
		"type": "chore",
		"slug": "posthog-product-analytics",
		"title": "Added anonymous PostHog product analytics to the renderer, covering project creation, task create/edit/move/spawn, an...",
		"body": "Added anonymous PostHog product analytics to the renderer, covering project creation, task create/edit/move/spawn, and branch actions such as rebase, commit, push, PR creation and merge, plus unhandled error and promise-rejection capture. No user identification and no PII is sent; without a build-time `VITE_POSTHOG_KEY`/`VITE_POSTHOG_HOST` the client falls back to a no-op so nothing is captured. The release workflow now passes both values into every \"Build release\" step so packaged builds get a live client, and Vite's `envDir` points at the repository root so the `.env` documented in `.env.example` is actually read. `posthog-js` is pinned to an exact `1.407.2` because release-age policies on mirroring registries reject tarballs published hours earlier, which made the previously locked version impossible to install."
	},
	{
		"date": "2026-08-06",
		"type": "chore",
		"slug": "remove-never-run-shared-tests",
		"title": "Removed src/shared/__tests__, which sat outside all three vitest roots and therefore never ran despite looking like c...",
		"body": "Removed src/shared/__tests__, which sat outside all three vitest roots and therefore never ran despite looking like coverage. The pane action mapping tests were fully duplicated by the task-panes handler tests and were deleted; the pane session key tests moved to src/bun/__tests__ so the separator's URL-safety invariant is actually guarded."
	},
	{
		"date": "2026-08-06",
		"type": "chore",
		"slug": "required-checks-wait-for-windows-packaging",
		"title": "The required status checks on main now wait for the packaged Windows jobs instead of merging ahead of them: the Windo...",
		"body": "The required status checks on main now wait for the packaged Windows jobs instead of merging ahead of them: the Windows packaging workflow became a reusable workflow called from build.yml, and its 45-entry path filter moved into code as a single source of truth so out-of-scope pull requests still skip it. A pull request can no longer merge while the Windows proof is still pending, and a Windows job that did not run says so out loud rather than passing in silence. Three existing tests ride along because they read what this change reshapes: the Bun-pin proof invariant now reads the scope list as a typed import instead of parsing the deleted filter, the registry isolation guard matches import specifiers instead of any file that merely names the directory in a string, and the terminal e2e gate checks that it is in the required job's dependency list rather than that the list is exactly two entries long."
	},
	{
		"date": "2026-08-06",
		"type": "feature",
		"slug": "scratch-task-parks-in-has-questions",
		"title": "A Scratch task now launches into Has Questions instead of In Progress — it has no prompt, so nothing is happening unt...",
		"body": "A Scratch task now launches into Has Questions instead of In Progress — it has no prompt, so nothing is happening until you type, and the board says so. The first message you send flips it to In Progress as usual. Codex agents no longer flip a parked task to In Progress just by starting their session.",
		"short": "Scratch tasks wait in Has Questions"
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "spawned-agent-takes-the-keyboard",
		"title": "\"+ Agent\" now leaves the keyboard in the pane it just opened, so the first thing you type is the new agent's prompt i...",
		"body": "\"+ Agent\" now leaves the keyboard in the pane it just opened, so the first thing you type is the new agent's prompt instead of being swallowed by the button that opened the dialog. On a native task the viewer also follows the freshly spawned pane; an auxiliary pane such as a dev server still hands focus back to the agent.",
		"short": "Typing goes to the new agent"
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "task-completion-sound-timing",
		"title": "The completion and cancellation chime now fires as the first thing a terminal move does, instead of after the termina...",
		"body": "The completion and cancellation chime now fires as the first thing a terminal move does, instead of after the terminal session, cleanup script and worktree were torn down — so it no longer arrives seconds late, and it is no longer lost when teardown fails. Accepting the \"branch merged — complete the task?\" prompt plays it locally like every board surface does, Task → Move to Status → Mark Completed / Mark Cancelled now actually work (behind the usual confirmation) instead of doing nothing, and View → Debug gained three probes that play the chime through the exact client and backend paths the real moves use.",
		"short": "Completion chime plays immediately"
	},
	{
		"date": "2026-08-06",
		"type": "chore",
		"slug": "terminal-e2e-in-ci",
		"title": "The seven live terminal end-to-end scripts (real tmux server, real native host) now run in CI on both macOS and Ubunt...",
		"body": "The seven live terminal end-to-end scripts (real tmux server, real native host) now run in CI on both macOS and Ubuntu instead of only when someone remembered to run them locally. A new runner times every script, prints the runtime table on the run summary, and fails the job if any orphan process or throwaway temp dir survives; the gate hangs off the required `test` check, so a red terminal run blocks the merge."
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "terminal-link-underline-flicker",
		"title": "Underlines on file paths in terminal output no longer blink while an agent is working: the overlay now repaints on th...",
		"body": "Underlines on file paths in terminal output no longer blink while an agent is working: the overlay now repaints on the next animation frame instead of clearing itself and waiting out a debounce that never expired under continuous output.",
		"short": "File-path underlines stop flickering"
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "windows-clipboard-image-paste",
		"title": "Pasting an image now takes the picture from the paste event itself instead of re-reading the host clipboard, which on...",
		"body": "Pasting an image now takes the picture from the paste event itself instead of re-reading the host clipboard, which on Windows returned raw bitmap bytes that were saved as a broken `.png`; the host-clipboard fallback converts those bytes to real PNG. Image thumbnails, \"open image\", \"open folder\", and `dev3 show-image` also stop rejecting Windows paths like `C:/Users/...`. A paste that still fails now shows an error instead of doing nothing. On macOS the paste path changed too — the pasted image is uploaded from the event rather than through the clipboard RPC.",
		"short": "Pasting an image works on Windows"
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "windows-dev-build-ebusy",
		"title": "`bun run dev` on Windows failed before it could start, because Electrobun wipes its build folder with an un-retried d...",
		"body": "`bun run dev` on Windows failed before it could start, because Electrobun wipes its build folder with an un-retried delete and Windows refuses to remove a folder a running process sits in. Detached terminal hosts no longer inherit the app's bundle directory as their working directory, and a new pre-build step clears the folder first — terminating only this build's own app processes, never a `dev3` CLI that might be serving another task. macOS and Linux are untouched.",
		"short": "Windows dev build no longer dies on EBUSY"
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "windows-executable-icon",
		"title": "Windows executables shipped with the blank default icon because electrobun's bundled CLI cannot resolve its own `rced...",
		"body": "Windows executables shipped with the blank default icon because electrobun's bundled CLI cannot resolve its own `rcedit` dependency and swallowed the failure as a warning. The app icon is now embedded by the build itself and verified by reading the icon resource back out of `launcher.exe` and `bun.exe`, so a silent failure fails the packaging build instead of shipping.",
		"short": "Windows builds get their app icon"
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "windows-launch-proof-process-query",
		"title": "A single 60s stall of the Windows launch proof's PowerShell process query withheld the\r\ndownloadable Windows build fr...",
		"body": "A single 60s stall of the Windows launch proof's PowerShell process query withheld the\r\ndownloadable Windows build from a launch that had actually succeeded (run 31098005022\r\nattempt 1). The two queries that need parent pids now retry a bounded number of times at\r\nunchanged budgets and record how long every attempt took, and the shutdown liveness polls\r\nmoved off PowerShell and WMI onto tasklist.exe, which cuts the number of stall-prone calls\r\nper run from roughly fifteen to two.",
		"short": "Windows build survives a stalled process query"
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "windows-proof-post-merge-not-pull-request",
		"title": "The packaged Windows proof no longer makes pull requests wait — that cost about four\r\nand three quarter minutes on ev...",
		"body": "The packaged Windows proof no longer makes pull requests wait — that cost about four\r\nand three quarter minutes on every in-scope PR. It now runs post-merge on main, where a\r\nbreak is attributable to a single commit, and it runs before anything publishes during a\r\nrelease, so a release fails outright if the Windows app cannot be built and launched.",
		"short": "Windows proof off PRs, onto main"
	},
	{
		"date": "2026-08-06",
		"type": "fix",
		"slug": "windows-renderer-ready-budget",
		"title": "The Windows desktop launch waited only 45 seconds for its renderer, which measurement showed was barely longer than t...",
		"body": "The Windows desktop launch waited only 45 seconds for its renderer, which measurement showed was barely longer than the slowest healthy packaged startup — so a slow or loaded machine could be told it had no UI when it simply had not painted yet. The budget is now sized off 40 measured launches, and every packaged-launch proof records how long the renderer actually took so it stays that way.",
		"short": "Windows launch no longer gives up early"
	},
	{
		"date": "2026-08-06",
		"type": "feature",
		"slug": "80-downloadable-windows-build",
		"title": "CI already built the real Windows app, launched it and proved it reached a window — then discarded it, so nobody coul...",
		"body": "CI already built the real Windows app, launched it and proved it reached a window — then discarded it, so nobody could obtain the thing we prove works. The packaged Windows job now publishes the extracted app tree it actually launched as a `windows-app-<sha>` artifact kept for 30 days, and writes a run summary naming the artifact, the exact executable to double-click, and what an unsigned build looks like on Windows (SmartScreen, unknown publisher). The uploaded bytes are the launched bytes, not a re-extraction: the run summary is generated from the launch proof, so it cannot advertise a file nothing started, and a failed proof publishes nothing. The upload lives in the reusable packaging workflow, so releases emit the same artifact — that behaviour reaches `release.yml` without editing it. The build is still `--env=canary`; that is safe only while the channel is a name (artifact and app naming plus a `build.json` field, no published Windows update feed) and must be re-examined when real channel semantics land. The self-extracting Windows installer is built by the same job and has never been launched by anything, so it is deliberately not handed out — a known gap recorded in `decisions/2026/08/06/downloadable-windows-build-is-the-launched-tree.md`, not an oversight.",
		"short": "Download the packaged Windows build"
	},
	{
		"date": "2026-08-05",
		"type": "feature",
		"slug": "10-sensitive-projects-streamer-mode",
		"title": "Project Settings → Board now has a \"Sensitive project\" toggle",
		"body": "Project Settings → Board now has a \"Sensitive project\" toggle. While streamer mode is on, such a project's name and tasks are blurred everywhere they appear, the project cannot be opened (the row shows a lock and a click explains why), and none of its notifications — desktop, in-app toast, attention badge, shared images or artifacts — are shown. With streamer mode off the project behaves exactly as before.",
		"short": "Mark a project as sensitive"
	},
	{
		"date": "2026-08-05",
		"type": "feature",
		"slug": "30-dashboard-row-complete",
		"title": "Every task row on the projects dashboard now ends in a green ✓ that completes the task without opening its board — ho...",
		"body": "Every task row on the projects dashboard now ends in a green ✓ that completes the task without opening its board — hover-revealed on desktop, always visible and touch-sized on mobile. It routes through the usual completion confirmation, so a mis-click never quietly finishes a task.",
		"short": "Complete a task from the dashboard",
		"suggestedBy": "giladra-wix",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1252",
		"issueRef": "#1252"
	},
	{
		"date": "2026-08-05",
		"type": "fix",
		"slug": "cleanup-script-teardown-wedge",
		"title": "Task teardown no longer hangs forever when the cleanup script's tmux client refuses to exit: an orphaned client is de...",
		"body": "Task teardown no longer hangs forever when the cleanup script's tmux client refuses to exit: an orphaned client is detected and killed within seconds, a genuinely long script gives up at a 10-minute cap, and worktree removal plus the final status write always run. The cleanup step now logs its spawn, exit code and duration.",
		"short": "Stuck \"Shutting down\" cards fixed",
		"suggestedBy": "DolevEpshtein",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1251",
		"issueRef": "#1251"
	},
	{
		"date": "2026-08-05",
		"type": "fix",
		"slug": "dashboard-project-actions-visible-at-rest",
		"title": "Icon glyphs written as `text-base` were being painted in the page background colour, because the `base` design token ...",
		"body": "Icon glyphs written as `text-base` were being painted in the page background colour, because the `base` design token also emitted a `text-base` colour utility that collided with Tailwind's font-size class — 107 of them were invisible on the Dashboard alone. The Dashboard project rows also no longer hide their settings, Open in Finder, project terminal and remove buttons until you hover, and the diff viewer's copy-path button no longer out-sizes the file name it sits next to.",
		"short": "Invisible icons across the app now render"
	},
	{
		"date": "2026-08-04",
		"type": "feature",
		"slug": "02-kanban-card-lifecycle-rail",
		"title": "Rebuilt the Kanban task card around five zones: a 3px status strip on the top edge, a full-width identity header that...",
		"body": "Rebuilt the Kanban task card around five zones: a 3px status strip on the top edge, a full-width identity header that finally fits the agent and config string, a vertical lifecycle rail on the left that is the status control (pipeline ring, short upright column name, attention count, quick-complete), and a segmented bottom bar where read-only signals are grouped git / run / time above a reserved action strip. Clicking anywhere on the rail opens Move to, and the action strip can no longer be squeezed out by badges. Board columns grew to 304px, and a variant task now shows a compact `2/3` next to its number instead of a spelled-out \"Variant 2\" — and nothing at all when it is the only variant.",
		"short": "Task cards get a status rail"
	},
	{
		"date": "2026-08-04",
		"type": "fix",
		"slug": "card-config-styled-tooltip",
		"title": "The task card's agent-config string keeps its ellipsis but now reveals the full value in the app's own tooltip instea...",
		"body": "The task card's agent-config string keeps its ellipsis but now reveals the full value in the app's own tooltip instead of the slow, unstyled native one — and only when the text is actually clipped. The scratch, automation, draft and hibernated markers in the same header row moved to the styled tooltip too.",
		"short": "Card header tooltips are styled now"
	},
	{
		"date": "2026-08-04",
		"type": "feature",
		"slug": "dev3-url-scheme-deep-links",
		"title": "Added a custom `dev3://` URL scheme (macOS) so links can open the app directly: `dev3://task/<id>` jumps to a task, `...",
		"body": "Added a custom `dev3://` URL scheme (macOS) so links can open the app directly: `dev3://task/<id>` jumps to a task, `dev3://project/<id>` opens a board, and `dev3://new-task?project=<id>&text=<…>` opens the Create Task modal prefilled with text. Right-click a task card → \"Copy Deep Link\" to grab its link. Requires the app installed in /Applications for macOS to register the scheme."
	},
	{
		"date": "2026-08-04",
		"type": "fix",
		"slug": "narrow-card-status-rail",
		"title": "The task card's vertical status rail shrank from 38px to 20px on the desktop board, giving the title and labels the s...",
		"body": "The task card's vertical status rail shrank from 38px to 20px on the desktop board, giving the title and labels the space back. The pipeline ring, custom-column dot and attention count shrank with it; on narrow viewports the rail stays 44px so both of its buttons keep a full-size touch target.",
		"short": "Card status rail is half as wide"
	},
	{
		"date": "2026-08-04",
		"type": "fix",
		"slug": "native-dev-server-stop-freeze-diagnosis",
		"title": "The UI freeze after Stop Dev Server on a native task remains unconfirmed, and nothing here changes how the dev server...",
		"body": "The UI freeze after Stop Dev Server on a native task remains unconfirmed, and nothing here changes how the dev server behaves. Closing the focused dev-server pane no longer leaves the task with no pane focused and the viewer bar bound to a pane that is gone, and a native terminal session that fails while starting now tears down the pane host it already spawned instead of orphaning it. Diagnostics leave more evidence wherever either the durable log or the renderer console survives — correlation ids on Dev Server actions, a report when a request never settles, pane ids on native viewer sockets, start and finish markers around terminal teardown — though a recurrence that kills the bridge can still take the renderer's own traces down with it.",
		"short": "Diagnose native dev-server stop freeze"
	},
	{
		"date": "2026-08-04",
		"type": "fix",
		"slug": "native-take-control-transfers-writer-lease",
		"title": "Take control in a native terminal now actually transfers the writer lease when another dev3 window or instance holds ...",
		"body": "Take control in a native terminal now actually transfers the writer lease when another dev3 window or instance holds it, instead of coming back refused and leaving the viewer permanently read-only. The window that had control is told authoritatively that it is now an observer, and the new owner immediately publishes its own pane size as the canonical grid so observers follow it instead of wrapping the output at their own width. Ordinary attaching still never steals the lease, and a host too old to transfer now says so instead of failing silently.",
		"short": "Take control now works across windows"
	},
	{
		"date": "2026-08-04",
		"type": "fix",
		"slug": "task-store-burst-io",
		"title": "The hourly task-store backup now checks with a stat() whether this hour is already\r\nsnapshotted, instead of reading b...",
		"body": "The hourly task-store backup now checks with a stat() whether this hour is already\r\nsnapshotted, instead of reading both the board and the existing backup in full before every\r\nsave. On a 1509-task project a burst of ten saves moves 74 MB instead of 221 MB, with the\r\nsame once-per-hour snapshot; a save that crosses an hour boundary is now filed under the hour\r\nit started in, and expired backups are pruned when the next snapshot is written.",
		"short": "Fewer whole-file reads per task save"
	},
	{
		"date": "2026-08-04",
		"type": "fix",
		"slug": "ux-quality-floors-and-accessibility-sweep",
		"title": "The keyboard focus ring was invisible on 27 controls: Tailwind's focus variant of\r\noutline-none out-specifies the app...",
		"body": "The keyboard focus ring was invisible on 27 controls: Tailwind's focus variant of\r\noutline-none out-specifies the app's global :focus-visible rule and painted a\r\ntransparent outline over it. Destructive dialogs also confirmed with a bare \"OK\", several\r\ntips pointed at a Settings category that no longer exists, and fixed-width overlays ran\r\noff the edge of a phone. The UX bible gains a \"Quality floors\" chapter — accessibility,\r\ncontrast, typography, copy, motion and layout thresholds every surface must clear — and\r\neach floor ships with the mechanism and the test that keep it true.",
		"short": "Keyboard focus rings are visible again"
	},
	{
		"date": "2026-08-04",
		"type": "feature",
		"slug": "90-backend-neutral-pane-capture",
		"title": "The terminal-backend seam gained `captureView`, one read-only way to read a named pane's recent text on both the tmux...",
		"body": "The terminal-backend seam gained `captureView`, one read-only way to read a named pane's recent text on both the tmux and native backends without focusing it, typing into it, resizing it, or depending on the pane's agent. It reports the visible screen and the scrolled-off history separately from one contiguous observation, says when the content actually changed, and names every unavailable case explicitly instead of returning an empty string. A native host can publish its screen as a compact plain-text record on a path only that host can write, as the legacy per-cell snapshot, as both, or as neither; each surface settles independently before it is advertised, while generation-owned session locking keeps capture publication, readiness, replacement, and cleanup mutually exclusive across processes.",
		"short": "Backend-neutral read-only pane capture"
	},
	{
		"date": "2026-08-03",
		"type": "feature",
		"slug": "01-keyboard-shortcut-editor",
		"title": "Settings has a new Keyboard category listing every app-level shortcut: click the keys shown on a row and type the com...",
		"body": "Settings has a new Keyboard category listing every app-level shortcut: click the keys shown on a row and type the combo you want, and if another shortcut already owns it you are told whose before you take it. Each shortcut now has a main combo plus an optional second one, set independently, so an alternative is a thing you add rather than a quirk of the defaults. Filtering matches the keys as well as the name, so `⇧⌘` narrows the list to Shift-Command shortcuts. A few structural ones stay fixed and say why — the `g …` key sequences, the ⌘1–9 project family, the hold-to-cycle task switcher and Esc. The \"iTerm2 compatibility\" toggle is gone: ⌘D, ⌘⇧D, ⌘W and ⌘T are simply how dev3 works now, and like every other shortcut they can be rebound or unbound one by one. The ⓘ button beside the terminal opens the full ⌘/ shortcuts overlay instead of a partial popover. One behavior change on macOS: the app modifier is now strictly ⌘, so Ctrl combos that used to double as app shortcuts (⌃, ⌃= ⌃`) go to the terminal where they belong.",
		"short": "Rebind any keyboard shortcut"
	},
	{
		"date": "2026-08-03",
		"type": "feature",
		"slug": "20-terminal-rtl-bidi",
		"title": "Terminal panes can now reorder right-to-left text (Hebrew, Arabic, Persian) so it reads correctly instead of appearin...",
		"body": "Terminal panes can now reorder right-to-left text (Hebrew, Arabic, Persian) so it reads correctly instead of appearing reversed, via a new Advanced Experience group in Settings → System that hosts beta behaviour and ships off by default. The reorder is display-only: copied text keeps its logical order, while mouse selection and link hover on those lines still follow it, and Arabic letters are not joined into cursive forms — the terminal engine has no right-to-left support of its own yet.",
		"short": "Hebrew and Arabic read correctly",
		"suggestedBy": "Nadav23AnT",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1224",
		"issueRef": "#1224"
	},
	{
		"date": "2026-08-03",
		"type": "fix",
		"slug": "ai-review-launch-native",
		"title": "Moving a task to AI Review did nothing on a task using the native terminal backend: the review agent was launched wit...",
		"body": "Moving a task to AI Review did nothing on a task using the native terminal backend: the review agent was launched with a raw tmux split, which cannot work without a tmux session, and the failure bounced the card back to Your Review in complete silence. The review agent now opens a real pane through the backend-neutral seam (no tmux on native, unchanged behaviour on tmux); a repeated activation replaces the running review agent rather than stacking a second one, refusing to launch at all if it cannot prove the old one is gone; and a launch that does fail now says so in a localized toast naming the column, where the task went, and what to do about it.",
		"short": "AI Review starts on native tasks"
	},
	{
		"date": "2026-08-03",
		"type": "feature",
		"slug": "auto-clear-review-after-send",
		"title": "Sending an inline diff review to the agent now clears the comments automatically, so \"Reset review\" and its confirmat...",
		"body": "Sending an inline diff review to the agent now clears the comments automatically, so \"Reset review\" and its confirmation are no longer part of every review cycle. A failed send keeps the comments intact for a retry, and the manual Reset button stays for dropping comments without sending.",
		"short": "Review clears itself after sending"
	},
	{
		"date": "2026-08-03",
		"type": "fix",
		"slug": "launch-account-usage-bars-inline",
		"title": "The launch picker's account popover now shows each account's 5h/7d usage bars, percentages and reset countdowns inlin...",
		"body": "The launch picker's account popover now shows each account's 5h/7d usage bars, percentages and reset countdowns inline, so comparing accounts no longer costs a click per row. The per-row expand chevron is gone, the capture age rides the last bar line as a compact suffix (warning-tinted once stale), and the panel scrolls instead of growing past its dialog.",
		"short": "Account usage bars visible without a click"
	},
	{
		"date": "2026-08-03",
		"type": "fix",
		"slug": "native-backend-marker-glyph-and-placement",
		"title": "The native-terminal-backend marker is now a bolt in a rounded frame, and in the Active Tasks sidebar it moved up into...",
		"body": "The native-terminal-backend marker is now a bolt in a rounded frame, and in the Active Tasks sidebar it moved up into the badge row between the priority and the agent badge instead of sitting in front of the title.",
		"short": "Clearer native-backend task marker"
	},
	{
		"date": "2026-08-03",
		"type": "feature",
		"slug": "review-payload-spills-to-file",
		"title": "Sending a large review to the agent no longer fails on the message-length guard: payloads over 8 000 characters are w...",
		"body": "Sending a large review to the agent no longer fails on the message-length guard: payloads over 8 000 characters are written to a file next to the task worktree and the agent is sent that path with a one-line instruction to read it. The toast names the file. Applies to the batch review send, the per-comment send and the GitHub PR-thread send alike.",
		"short": "Big reviews reach the agent as a file"
	},
	{
		"date": "2026-08-03",
		"type": "feature",
		"slug": "send-single-review-comment-to-agent",
		"title": "Every inline comment in the diff review now has its own \"Send to agent\" button, so a comment can go to the agent the ...",
		"body": "Every inline comment in the diff review now has its own \"Send to agent\" button, so a comment can go to the agent the moment it is written instead of waiting for the whole review. A sent comment is marked \"Sent\" and drops out of the batch payload, so \"Copy to Clipboard\" and the batch \"Send to Agent\" only carry comments that have not been sent yet; editing a sent comment makes it deliverable again.",
		"short": "Send one review comment at a time"
	},
	{
		"date": "2026-08-02",
		"type": "feature",
		"slug": "30-native-host-process-identity",
		"title": "Native terminal hosts now name themselves after the task that owns them, so a system process viewer shows `dev3-termi...",
		"body": "Native terminal hosts now name themselves after the task that owns them, so a system process viewer shows `dev3-terminal-host seq:1383 pane:1` instead of a wall of identical rows — visible in `ps`, in `ps aux`, and in the Windows Task Manager command-line column. Where a viewer can only ever show the executable name (macOS Activity Monitor, the Windows image-name column), `dev3 doctor --processes` prints the same ownership: task, pane, role, pid and parent, executable, and whether it is still alive. Task panes also export `$DEV3_TASK_SEQ` and `$DEV3_PANE_ID`.",
		"short": "See which task owns each terminal"
	},
	{
		"date": "2026-08-02",
		"type": "fix",
		"slug": "accounts-tab-a11y-and-consistency",
		"title": "Improve the Accounts settings tab: account rows now use proper radio-group semantics with arrow-key navigation and ac...",
		"body": "Improve the Accounts settings tab: account rows now use proper radio-group semantics with arrow-key navigation and account-specific accessible names for the Remove/Rename/Edit-API actions; the slot grids collapse on narrow widths; and several action buttons gain the app's standard press-scale feedback."
	},
	{
		"date": "2026-08-02",
		"type": "fix",
		"slug": "isolate-tmux-config",
		"title": "The dev3 tmux server now runs exclusively on the bundled config and no longer sources `/etc/tmux.conf`, `~/.tmux.conf...",
		"body": "The dev3 tmux server now runs exclusively on the bundled config and no longer sources `/etc/tmux.conf`, `~/.tmux.conf` or `~/.config/tmux/tmux.conf`. Personal prefix keys, plugin managers and status-line overrides can no longer change how dev3 terminals behave; detached sessions also pass `-f` now, so the config is identical no matter which session starts the server. Your own tmux on the default socket is unaffected.",
		"short": "tmux panes ignore your personal tmux.conf"
	},
	{
		"date": "2026-08-02",
		"type": "fix",
		"slug": "native-auxiliary-terminal-panes",
		"title": "On a task using the native terminal backend, starting the dev server or running Rebase opens a real visible pane in t...",
		"body": "On a task using the native terminal backend, starting the dev server or running Rebase opens a real visible pane in the task's own terminal instead of failing invisibly — the dev server used to run hidden in a tmux session a native task should never touch, and the git panes errored out. Repeated clicks reuse the one pane, the agent pane keeps its focus, and closing a task now also stops a native dev server instead of leaking its processes and ports.",
		"short": "Dev server and Rebase panes work natively"
	},
	{
		"date": "2026-08-02",
		"type": "fix",
		"slug": "native-bug-hunter-panes",
		"title": "Launching bug hunters on a native task failed with a tmux socket error, because the launch path always split a tmux pane",
		"body": "Launching bug hunters on a native task failed with a tmux socket error, because the launch path always split a tmux pane. Hunters now open as real native panes through the shared backend-neutral pane API, stack in an equal column beside the agent's pane, get their prompt through the native pane, and leave keyboard focus with the main agent. A native launch that cannot open every hunter, lay the column out or deliver every prompt is rolled back and reported instead of half-starting — a pane that refuses to close is named rather than counted as gone — while tmux tasks are unchanged.",
		"short": "Find bugs works on native tasks"
	},
	{
		"date": "2026-08-02",
		"type": "fix",
		"slug": "native-dev3-message-delivery",
		"title": "`dev3 message`, scheduled \"Send later\" messages, and the Create-PR / commit /\r\nrebase-conflict hand-offs now reach ag...",
		"body": "`dev3 message`, scheduled \"Send later\" messages, and the Create-PR / commit /\r\nrebase-conflict hand-offs now reach agents running on the native terminal\r\nbackend instead of always failing with \"the task has no live agent session\".\r\nDelivery routes through one backend-neutral seam that finds the task's real agent\r\npane — never a shell split — and, when another app instance holds that pane's\r\nwrite lease, hands the whole delivery to it so the text lands exactly once. tmux\r\nbehavior is unchanged, and a task with no live agent still fails honestly.",
		"short": "Messages reach native-terminal agents"
	},
	{
		"date": "2026-08-02",
		"type": "fix",
		"slug": "native-extra-agent-spawn",
		"title": "The \"+ Agent\" action now opens its pane through the shared backend-neutral pane seam, so a task running the native te...",
		"body": "The \"+ Agent\" action now opens its pane through the shared backend-neutral pane seam, so a task running the native terminal gets a real extra agent pane instead of a failed tmux split. Native launches no longer write a phantom tmux pane entry, a failed launch reports why instead of leaving a half-started agent, and tmux tasks keep their existing split and pane bookkeeping.",
		"short": "Spawn extra agents on native tasks"
	},
	{
		"date": "2026-08-02",
		"type": "chore",
		"slug": "native-owner-routing-regression",
		"title": "Added deterministic automated coverage for native-pane owner routing across dev3 app processes, which was previously ...",
		"body": "Added deterministic automated coverage for native-pane owner routing across dev3 app processes, which was previously proven only by hand. A new three-process E2E drives one real native host: the owning process holds the writer lease and serves the CLI's NDJSON protocol, a second process binds the same pane as an observer and forwards one delivery to the owner, and a reopened third viewer replays the journal to prove the delivery landed exactly once while host and shell identity, the single host process, and the untouched tmux path all hold. The product message E2E now also drives the same routing from outside in, with the request arriving over the non-owning app's own CLI socket as a real message.send rather than an in-process call. A companion unit suite exercises the forwarding transport itself over real sockets, including the loopback endpoint record used on Windows."
	},
	{
		"date": "2026-08-02",
		"type": "fix",
		"slug": "native-pane-action-latency",
		"title": "Splitting a pane or picking a layout on a native-backend task no longer looks frozen for a couple of seconds: the too...",
		"body": "Splitting a pane or picking a layout on a native-backend task no longer looks frozen for a couple of seconds: the toolbar and the terminal canvas now share one pane state, so the server's answer repaints the panes immediately instead of waiting for the next poll, and the clicked control greys out for the moment the action runs. The ownership probe that verifies each pane's processes also stopped blocking the event loop, cutting a six-pane layout change from 60 ms to 44 ms and a split from 228 ms to 168 ms.",
		"short": "Instant native pane splits and layouts"
	},
	{
		"date": "2026-08-02",
		"type": "fix",
		"slug": "native-pane-close-latency",
		"title": "Closing a pane on the native terminal backend took about 1.7 seconds: the host asked the shell to stop with SIGTERM, ...",
		"body": "Closing a pane on the native terminal backend took about 1.7 seconds: the host asked the shell to stop with SIGTERM, which an interactive shell on a PTY ignores, so every close waited out the full grace window and then force-killed. The host now sends SIGHUP, the hangup a terminal shell actually honours, and a pane closes in about 0.12 seconds with its foreground processes properly reaped.",
		"short": "Closing a native pane is instant"
	},
	{
		"date": "2026-08-02",
		"type": "fix",
		"slug": "native-pane-reattach-across-app-instances",
		"title": "A task running on the native terminal backend showed \"no terminal session — Unknown session\" for its first pane in an...",
		"body": "A task running on the native terminal backend showed \"no terminal session — Unknown session\" for its first pane in any window other than the one that launched it, while its other panes rendered live output. The first pane now rebinds on demand from any app process, and a pane whose host is really gone shows the same exited state everywhere instead of a dead socket. Native panes also stop pretending to be writable: when another dev3 process holds the terminal's write lease, the read-only strip says so and Take control asks that process instead of cutting it off mid-keystroke. A window that is only watching now renders at the writer's terminal size instead of reflowing the output to its own width, which was garbling long lines, and when the process that was typing quits, the remaining windows are told the terminal is free instead of staying stuck read-only forever.",
		"short": "Native panes reattach in every window"
	},
	{
		"date": "2026-08-02",
		"type": "fix",
		"slug": "native-pane-state-single-sweep",
		"title": "Reading a native task's pane state verified every pane's ownership twice — once while recovering the pane set from di...",
		"body": "Reading a native task's pane state verified every pane's ownership twice — once while recovering the pane set from disk, once again while listing the panes — so a six-pane read forked 24 `ps` processes where 12 answer the question. Recovery now hands back the snapshots it already proved, halving the probe count at every pane count with dead-pane reconciliation, restart/reattach and cross-process ownership unchanged."
	},
	{
		"date": "2026-08-02",
		"type": "feature",
		"slug": "60-native-backend-task-mark",
		"title": "Tasks whose terminal runs on the native backend now carry a small terminal glyph beside their title on the Kanban car...",
		"body": "Tasks whose terminal runs on the native backend now carry a small terminal glyph beside their title on the Kanban card, the Active Tasks sidebar and the task breadcrumb, with a hover tooltip and an accessible label. It states the stored backend only — not whether a terminal is currently running — and tmux tasks stay unmarked.",
		"short": "See which tasks run natively"
	},
	{
		"date": "2026-08-01",
		"type": "feature",
		"slug": "04-native-pane-resize-handles",
		"title": "Native task terminals now show a grab handle on every boundary between panes, so a split can be resized by dragging i...",
		"body": "Native task terminals now show a grab handle on every boundary between panes, so a split can be resized by dragging it instead of guessing at an invisible edge. The handle has a real hit target and cursor, arrow keys step it, double-click recentres it, and the new size is stored with the pane layout so it survives a redraw and an app restart. tmux terminals are unchanged.",
		"short": "Drag native terminal panes to resize"
	},
	{
		"date": "2026-08-01",
		"type": "fix",
		"slug": "account-picker-layer",
		"title": "Raise the launch picker’s portalled favorites menu above modal surfaces so account and preset selection stays visible...",
		"body": "Raise the launch picker’s portalled favorites menu above modal surfaces so account and preset selection stays visible and usable.",
		"short": "Keep picker menus visible"
	},
	{
		"date": "2026-08-01",
		"type": "fix",
		"slug": "dashboard-interaction-polish",
		"title": "Reworked the Dashboard after a full interface review: the background-work line now reads \"2 agents working\" instead o...",
		"body": "Reworked the Dashboard after a full interface review: the background-work line now reads \"2 agents working\" instead of \"3 agent is working\", removing a project explains that nothing on disk is deleted, truncated project names, paths and task titles are selectable and reachable via tooltip, and the drag handle is no longer a dead tab stop. Contrast was fixed across both themes — solid accent buttons moved to a new `--accent-fill` token so white ink passes AA (5.09:1 instead of 2.98:1), timestamps and counts left the failing muted token, disabled reorder controls became visible again, and user-picked column colours now show as a swatch beside legible text instead of colouring the text itself. The screen also gained a `main` landmark and headings, decorative icon glyphs left the accessibility tree, the help dot got a 24px target, and numbers align on a tabular figure.",
		"short": "Dashboard accessibility and polish"
	},
	{
		"date": "2026-08-01",
		"type": "fix",
		"slug": "hibernate-control-skull-and-confirm",
		"title": "The Hibernate control in the open task's session bar now wears its amber skull glyph instead of a grey outline, so a ...",
		"body": "The Hibernate control in the open task's session bar now wears its amber skull glyph instead of a grey outline, so a rare and costly action stops the eye before the tooltip explains it, and hibernating asks for confirmation first — spelling out that the worktree and your changes survive while the terminal scrollback does not, with an extra warning when the task is running several agents at once. Both were authored with the original feature but never reached the merged branch.",
		"short": "Hibernate button is legible again"
	},
	{
		"date": "2026-08-01",
		"type": "fix",
		"slug": "resume-stale-session-id",
		"title": "Resuming a task no longer dies with \"No conversation found with session ID\" when the stored agent session id has no t...",
		"body": "Resuming a task no longer dies with \"No conversation found with session ID\" when the stored agent session id has no transcript on disk. dev3 now checks the id against the agent's transcript store first and reopens the newest surviving conversation for that worktree instead, repairing the stored pointer so later resumes are clean.",
		"short": "Resume survives a stale session id"
	},
	{
		"date": "2026-07-31",
		"type": "feature",
		"slug": "01-agent-requested-task-launch",
		"title": "An agent working in one task can now ask you to start another one: `dev3 task move --task seq:<N> --status in-progres...",
		"body": "An agent working in one task can now ask you to start another one: `dev3 task move --task seq:<N> --status in-progress` on a task that is not its own opens an approval dialog with the usual Provider/Model/Mode picker, so you choose which agent runs it and can decline outright, while `dev3 task create --scratch --run` does the same for a fresh throwaway peer that starts with no prompt. Approval launches the task with exactly the agent you picked, tells it which task asked for it so the two can talk over `dev3 message`, and hands the requesting agent the new task's number; declining launches nothing and discards an unwanted scratch placeholder. This also closes the hole where an agent could already activate any To Do task silently with the stored default agent and no dialog at all.",
		"short": "Agents can ask to start tasks"
	},
	{
		"date": "2026-07-31",
		"type": "fix",
		"slug": "01-spawn-agent-popup-interface-overhaul",
		"title": "The dialogs that pick which agent, model and account to launch are now fully keyboard-operable: the Provider/Model/Mo...",
		"body": "The dialogs that pick which agent, model and account to launch are now fully keyboard-operable: the Provider/Model/Mode dropdowns, the favorites menu and the account switcher are reachable by Tab and driven by arrow keys, and Escape closes the open dropdown instead of throwing away the whole launch configuration. The account popover opens below its trigger instead of covering the dialog, states which account is selected to screen readers, and says whether a quota reading is used or remaining. Field labels appear once per list rather than on every variant row, the favorites star no longer stretches across the dialog at narrow widths, Enter respects the \"Launch later\" panel, launch failures announce themselves with a recovery hint, and small print in the account popover meets contrast in light theme.",
		"short": "Launch dialogs work from the keyboard"
	},
	{
		"date": "2026-07-31",
		"type": "feature",
		"slug": "05-memory-headroom-widget",
		"title": "The global header now shows how many gigabytes of memory are still free, with a level bar under the number that fills...",
		"body": "The global header now shows how many gigabytes of memory are still free, with a level bar under the number that fills as the machine fills and takes its colour from the operating system's own memory-pressure signal rather than from a threshold of our own. Hovering it (tapping, on touch) opens a breakdown of who actually took the rest: the five heaviest applications outside dev-3.0 grouped per app with their process counts, then dev-3.0's own share split into the app itself and the tasks you launched. The same numbers appear as a non-blocking notice in the create-task and launch-variants modals when memory is tight, forecasting the cost from what your own active tasks actually consume — it informs, it never blocks a launch.",
		"short": "See how much RAM is left"
	},
	{
		"date": "2026-07-31",
		"type": "fix",
		"slug": "active-tasks-sidebar-polish",
		"title": "The Active Tasks sidebar got a detail pass: the scope toggles now cross-fade between outline and filled glyphs so the...",
		"body": "The Active Tasks sidebar got a detail pass: the scope toggles now cross-fade between outline and filled glyphs so the active scope reads as more than a colour change, every icon button has press feedback, the attention counter no longer crowds the panel-toggle icon, the bell badge uses the danger design token instead of a raw palette colour, and the pulsing bell plus the busy card rail honour \"reduce motion\".",
		"short": "Polished the Active Tasks sidebar"
	},
	{
		"date": "2026-07-31",
		"type": "fix",
		"slug": "hero-gauge-grid-wrap",
		"title": "The Productivity Stats hero gauges now use three columns on wide screens, keeping the six speedometers in two rows so...",
		"body": "The Productivity Stats hero gauges now use three columns on wide screens, keeping the six speedometers in two rows so their bezels and cards no longer overlap."
	},
	{
		"date": "2026-07-31",
		"type": "fix",
		"slug": "info-toast-task-context",
		"title": "The blue \"agent turned off/on completion prompts\" toast now shows the same task context line as other notifications (...",
		"body": "The blue \"agent turned off/on completion prompts\" toast now shows the same task context line as other notifications (`#seq · project · task title`), so it is clear which task it came from.",
		"short": "Agent info toasts show their task"
	},
	{
		"date": "2026-07-31",
		"type": "refactor",
		"slug": "kanban-ui-polish",
		"title": "Polished the Kanban board's interaction details: task cards now lift with the theme-aware card shadow token (a soft b...",
		"body": "Polished the Kanban board's interaction details: task cards now lift with the theme-aware card shadow token (a soft blue-grey in light mode instead of hard black), every board control gained 0.96 press feedback that respects reduced-motion, hover-revealed controls fade instead of popping, and the quick-complete check cross-fades into its spinner. All `transition-all` declarations on the board were replaced with explicit property lists so hovers no longer animate unrelated properties. A column's pinned footer (\"+ New Task\", the Did-you-know tip) also stopped looking like it lies on top of the task above it: a card clipped by the scroll edge is now separated by a hairline that only shows while something is actually clipped."
	},
	{
		"date": "2026-07-31",
		"type": "feature",
		"slug": "model-configuration-stats",
		"title": "Productivity Stats now includes a model-configuration breakdown alongside the agent distribution, showing how often e...",
		"body": "Productivity Stats now includes a model-configuration breakdown alongside the agent distribution, showing how often each launch preset shipped work.",
		"short": "Model usage by configuration"
	},
	{
		"date": "2026-07-31",
		"type": "refactor",
		"slug": "oklch-theme-color-tokens",
		"title": "Rebuilt the dark and light colour tokens in OKLCH: the muted text ladder is now readable (dark tertiary/muted text we...",
		"body": "Rebuilt the dark and light colour tokens in OKLCH: the muted text ladder is now readable (dark tertiary/muted text went from APCA Lc 35/19 to 61/41), surface lightness ramps are monotonic so modals sit above cards and hovers never dip below the surface they lift from, dark borders got a visible step, and the four warm roles (warning, gold, awake, fire) are separated by hue instead of overlapping. Accent hover split into `--accent-hover` for fills and `--accent-emphasis` for text, so hovering a link no longer lowers its contrast on dark. The light theme then got a second pass so it mirrors the dark concept instead of bleaching it: no pure white or pure black anywhere, tinted surfaces, and fully saturated column colours with a stronger glow — the closest pair of kanban columns went from 0.012 to 0.059 apart in OKLCH, so they finally tell apart.",
		"short": "Rebuilt both theme palettes"
	},
	{
		"date": "2026-07-31",
		"type": "feature",
		"slug": "per-project-env-vars",
		"title": "Project Settings now has an Environment Variables editor, also configurable in .dev3/config.json and .dev3/config.loc...",
		"body": "Project Settings now has an Environment Variables editor, also configurable in .dev3/config.json and .dev3/config.local.json with per-key merging. The variables are exported into the project terminal, every agent terminal, setup/dev/cleanup script, and column agent of the project's tasks. This field is not for secrets; the editor identifies whether its storage is local-only or committed.",
		"short": "Per-project env vars for agents"
	},
	{
		"date": "2026-07-31",
		"type": "refactor",
		"slug": "project-settings-ui-polish",
		"title": "Project Settings got a craft pass: the 12-swatch colour palette on every label and custom column collapsed into a pop...",
		"body": "Project Settings got a craft pass: the 12-swatch colour palette on every label and custom column collapsed into a popover behind the colour dot, reorder arrows now appear on row hover (still always visible on touch), and the long config tabs are grouped into named sections with dividers instead of one flat wall of fields. Deleting a label or a custom column now asks first and says how many tasks it affects, switches and tabs got real focus rings and ARIA roles, and an over-limit column instruction no longer silently fails to save.",
		"short": "Calmer Project Settings screen"
	},
	{
		"date": "2026-07-30",
		"type": "feature",
		"slug": "04-artifact-find-bar",
		"title": "HTML artifacts now have a find bar: press ⌘F (Ctrl+F on Linux) while the artifact viewer has focus, or click the new ...",
		"body": "HTML artifacts now have a find bar: press ⌘F (Ctrl+F on Linux) while the artifact viewer has focus, or click the new magnifier in its header, to search the rendered document with match counts and ↑/↓ stepping. Because the artifact renders in an opaque-origin sandboxed iframe, the query is relayed into an injected script that highlights matches with the CSS Custom Highlight API and scrolls them into view without touching the artifact's own DOM. Also fixes a long-standing keyboard bug in both the artifact viewer and the image lightbox: Escape used to close the viewer and navigate out of the whole task workspace at the same time, plus the search magnifier's vertical alignment in the diff viewer's own search box.",
		"short": "Find inside HTML artifacts"
	},
	{
		"date": "2026-07-30",
		"type": "feature",
		"slug": "05-multifile-artifact-bundles",
		"title": "Artifacts can now bundle local CSS, classic JavaScript, CSS imports, and images while remaining portable through comp...",
		"body": "Artifacts can now bundle local CSS, classic JavaScript, CSS imports, and images while remaining portable through compressed ZIP export and isolated inside the opaque-origin viewer sandbox. The starter keeps report content and behavior in two focused authoring files, while its stable shell supplies working scrollspy navigation, responsive chart panels, native left-to-right ECharts drawing motion, polished controls, and dense evidence tables whose quiet typographic significance markers, narrow-screen scrolling, and full-column print layout work out of the box. Every supported agent receives the fixed file map plus exact copy and publish commands, and a deliberately permissive artifact CSP lets familiar ECharts, Choices.js, noUiSlider, CDN assets, fetch, and WebSockets work without brittle integrity hashes or policy exceptions while retaining readable native or textual fallbacks offline. Text data URLs declare UTF-8 explicitly, and viewer composition canonicalizes local dot segments plus quoted and unquoted asset attributes so preview behavior matches the downloaded ZIP.",
		"short": "Multi-file artifact bundles",
		"suggestedBy": "nadavsheinbein",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1173",
		"issueRef": "#1173"
	},
	{
		"date": "2026-07-30",
		"type": "feature",
		"slug": "05-task-hibernation",
		"title": "Tasks can now be hibernated from the open task's session bar: the agent, its tmux session and the dev server are stop...",
		"body": "Tasks can now be hibernated from the open task's session bar: the agent, its tmux session and the dev server are stopped and their ports released, while the worktree, branch, uncommitted changes, notes and PR state stay untouched. A confirmation spells out what survives, and warns separately when the task is running several agents at once. A hibernated task keeps its column but renders greyed out and labelled, sinks below every live task regardless of priority, refuses column changes, and still offers its quick-complete checkmark. Waking is explicit — opening the task's terminal offers a plain shell or a resume of the agent's conversation, and the dev server stays down.",
		"short": "Hibernate a task to free memory"
	},
	{
		"date": "2026-07-30",
		"type": "feature",
		"slug": "30-dim-inactive-tmux-panes",
		"title": "Inactive tmux panes now render on a darker background with greyed default text, while the focused pane keeps the full...",
		"body": "Inactive tmux panes now render on a darker background with greyed default text, while the focused pane keeps the full theme colors, so it is obvious which split you are typing into.",
		"short": "Dim inactive terminal splits"
	},
	{
		"date": "2026-07-30",
		"type": "feature",
		"slug": "active-task-kanban-toggle",
		"title": "Clicking the currently open task in Active Tasks now returns to its project's Kanban board, while clicks on other tas...",
		"body": "Clicking the currently open task in Active Tasks now returns to its project's Kanban board, while clicks on other tasks still open the selected task. Credit: Bar Volovsky.",
		"short": "Return to Kanban on repeat click"
	},
	{
		"date": "2026-07-30",
		"type": "chore",
		"slug": "align-ci-bun-pins",
		"title": "Every CI and release job now installs the same Bun the app packages (1.3.14) instead of the stale 1.3.10 pinned in th...",
		"body": "Every CI and release job now installs the same Bun the app packages (1.3.14) instead of the stale 1.3.10 pinned in the build and release workflows, and a test fails the build if a workflow pin ever drifts away from that baseline again."
	},
	{
		"date": "2026-07-30",
		"type": "fix",
		"slug": "artifact-resize-cleanup",
		"title": "Artifact panel resizing now exits cleanly when pointer release is lost, the window loses focus, or the page is hidden...",
		"body": "Artifact panel resizing now exits cleanly when pointer release is lost, the window loses focus, or the page is hidden, preventing the resize overlay from blocking the task UI.",
		"short": "Artifact resizing stays responsive"
	},
	{
		"date": "2026-07-30",
		"type": "feature",
		"slug": "ask-dev3-skill",
		"title": "Added the ask-dev3 agent skill — a router over dev3's features and workflows, auto-installed into every supported age...",
		"body": "Added the ask-dev3 agent skill — a router over dev3's features and workflows, auto-installed into every supported agent's skill directory. When the user asks \"how do I do X in dev3\", the agent loads the skill's map (main flow, on-ramps, verifying work, the tmux terminal, running several agents at once, vocabulary, troubleshooting, standalone features) and teaches the intended flow instead of guessing, then offers to do it. The map is GUI-first, covers a curated core of the most common newcomer questions, and points to the repo source (decisions, changelogs, code) for anything deeper. The task-lifecycle skill every managed agent already loads also gained a short paragraph on messaging another task's agent, so cross-task coordination is discoverable without asking for it."
	},
	{
		"date": "2026-07-30",
		"type": "fix",
		"slug": "board-never-hides-occupied-columns",
		"title": "The board no longer hides a review column that still holds cards: turning peer review off, or converting a board to O...",
		"body": "The board no longer hides a review column that still holds cards: turning peer review off, or converting a board to Operations, used to take those tasks off the board entirely while they stayed in tasks.json and visible to the CLI, and a restart did not bring them back. A task whose status matches no column now lands in To Do instead of vanishing, and the tasks.json read cache keys on the file's inode so a same-size rewrite can never be served stale.",
		"short": "Board never hides a column holding tasks"
	},
	{
		"date": "2026-07-30",
		"type": "fix",
		"slug": "cross-platform-native-host-package",
		"title": "The experimental native terminal backend could not start from a packaged macOS or Linux build: the host bundle was on...",
		"body": "The experimental native terminal backend could not start from a packaged macOS or Linux build: the host bundle was only built on Windows and no package outside Windows carried a native host image. Both are now produced and verified on every platform, and a packaged app resolves and stages its own image without any environment override. Terminal backend defaults are unchanged — tmux still owns every task that has not explicitly opted in.",
		"short": "Native terminal host now ships on macOS and Linux"
	},
	{
		"date": "2026-07-30",
		"type": "fix",
		"slug": "ctrl-o-mac-terminal",
		"title": "On macOS the \"Open in…\" picker fired on Ctrl+O as well as ⌘O, and its capture-phase handler swallowed the keystroke b...",
		"body": "On macOS the \"Open in…\" picker fired on Ctrl+O as well as ⌘O, and its capture-phase handler swallowed the keystroke before the focused terminal saw it — so Ctrl+O-bound features of the CLI running in the pane (Claude Code's transcript/expand toggle, for one) were unreachable. The shortcut now matches the keymap exactly: ⌘O on macOS, Ctrl+O elsewhere.",
		"short": "Ctrl+O reaches the terminal on macOS"
	},
	{
		"date": "2026-07-30",
		"type": "fix",
		"slug": "ctrl-shortcuts-mac-terminal",
		"title": "Following the Ctrl+O fix, seven more app shortcuts claimed their Ctrl form on macOS and swallowed the keystroke befor...",
		"body": "Following the Ctrl+O fix, seven more app shortcuts claimed their Ctrl form on macOS and swallowed the keystroke before the focused terminal saw it — Ctrl+Q (unfreeze output), Ctrl+H (backspace), Ctrl+N/Ctrl+P (shell history), Ctrl+K (kill to end of line), Ctrl+G (abort input) and Ctrl+[ (escape). They now match the keymap exactly: ⌘ on macOS, Ctrl elsewhere, with a regression test over the whole set.",
		"short": "Ctrl+Q/H/N/P/K/G/[ reach the terminal on macOS"
	},
	{
		"date": "2026-07-30",
		"type": "fix",
		"slug": "default-compare-ref-remote",
		"title": "New projects with a single committer no longer default their diff comparison to the local base branch — when `origin/...",
		"body": "New projects with a single committer no longer default their diff comparison to the local base branch — when `origin/<base>` exists it always wins, so freshly cloned repos compare against `origin/main` instead of a local `main` that dev3 never fast-forwards.",
		"short": "Diff defaults to origin/main again"
	},
	{
		"date": "2026-07-30",
		"type": "docs",
		"slug": "drop-mandated-reply-format",
		"title": "Removed the Decision-First reply format and the mandatory `## Test instructions` block from the agent instructions",
		"body": "Removed the Decision-First reply format and the mandatory `## Test instructions` block from the agent instructions. The shape of agent replies now belongs to the harness output style; the repo only keeps the English-only rule for text written into the codebase, plus content requirements for telling the user how to check the work."
	},
	{
		"date": "2026-07-30",
		"type": "fix",
		"slug": "macos-media-keys-task-sound",
		"title": "Task completion and cancellation sounds now play through the Web Audio API instead of an `<audio>` element",
		"body": "Task completion and cancellation sounds now play through the Web Audio API instead of an `<audio>` element. On macOS, WebKit made any `<audio>` longer than 0.95s the system \"Now Playing\" session, so the 1.3-1.5s chimes hijacked the hardware Play/Pause keys — pressing Play replayed the chime instead of resuming Spotify or Music. Web Audio mixes as ambient sound, so the keys stay with whatever was really playing.",
		"short": "Media keys stay with your music",
		"suggestedBy": "Paveltarno",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1176",
		"issueRef": "#1176"
	},
	{
		"date": "2026-07-30",
		"type": "feature",
		"slug": "native-terminal-rollout-controls",
		"title": "Global Settings → Terminal now has a machine-local \"Terminal backend for new tasks\" picker, stored in its own version...",
		"body": "Global Settings → Terminal now has a machine-local \"Terminal backend for new tasks\" picker, stored in its own versioned file (`~/.dev3.0/terminal-backend.json`) so an older side-by-side install cannot silently drop it: keep tmux (today's default) or opt new tasks into the experimental native terminal. The native option stays visible but disabled, with the exact reason and fix, when the build cannot resolve a native terminal host, and tmux is shown as unavailable on Windows, which has no tmux runtime. Task details gained a matching per-task override for the next launch, locked with an explanation while a live terminal owns the task. Existing tasks are never rewritten and a native launch failure never falls back to tmux; `dev3 task terminal-backend` remains the expert equivalent and now shares the same guard.",
		"short": "Pick the terminal backend for new tasks"
	},
	{
		"date": "2026-07-30",
		"type": "fix",
		"slug": "packaged-cli-native-host-resolution",
		"title": "Running dev3 in remote or headless mode from an installed app could not start an experimental native terminal: the bu...",
		"body": "Running dev3 in remote or headless mode from an installed app could not start an experimental native terminal: the bundled CLI looked for the packaged host image next to itself instead of at the package root, so the task failed the availability check even though the image was there. The desktop app was unaffected, and no task ever silently fell back to tmux.",
		"short": "Remote mode can start native terminals"
	},
	{
		"date": "2026-07-30",
		"type": "fix",
		"slug": "review-task-fork-diffs",
		"title": "PR review tasks created from fork branches now compare against the project base, restoring changed-file counts, line ...",
		"body": "PR review tasks created from fork branches now compare against the project base, restoring changed-file counts, line stats, branch diffs, and recent-commit diffs.",
		"short": "Review task diffs restored"
	},
	{
		"date": "2026-07-30",
		"type": "feature",
		"slug": "unread-shared-content",
		"title": "New task images and HTML artifacts now highlight their toolbar buttons in green and animate their icons until the use...",
		"body": "New task images and HTML artifacts now highlight their toolbar buttons in green and animate their icons until the user opens the corresponding viewer. Existing shared items remain read, and reduced-motion preferences disable the attention animation.",
		"short": "Unread artifact alerts"
	},
	{
		"date": "2026-07-29",
		"type": "feature",
		"slug": "30-pipeline-ring-quick-complete",
		"title": "The task card's seven-dot pipeline is now a compact progress ring carrying the stage number, which frees roughly a th...",
		"body": "The task card's seven-dot pipeline is now a compact progress ring carrying the stage number, which frees roughly a third of the status row, and a ✓ next to it sends the task straight to Completed after a single in-app confirmation. That dialog opens instantly and streams a local-only check for unsaved work into itself, instead of waiting seconds on git fetches. The \"Move to\" menu gained a ring header with the current stage, a promoted Completed row, and larger, better-aligned rows.",
		"short": "Pipeline ring with one-click complete"
	},
	{
		"date": "2026-07-29",
		"type": "feature",
		"slug": "30-save-task-as-draft",
		"title": "The New Task popup gained a fourth exit, \"Save as draft\": it parks an unfinished task in To Do with a dashed card and...",
		"body": "The New Task popup gained a fourth exit, \"Save as draft\": it parks an unfinished task in To Do with a dashed card and a Draft badge, and nothing can start it — not Run, not a drag, not a scheduled launch, not an automation, not an agent over the CLI. Clicking a draft card reopens the popup prefilled with everything you had entered, so you can keep writing across several sittings and then Save (or Save & Start) once the description is finally there. Closing the popup with unsaved text now offers the same escape hatch: the confirmation asks whether to park the changes as a draft instead of only \"keep typing or lose it\".",
		"short": "Park unfinished tasks as drafts",
		"suggestedBy": "yakirn",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1158",
		"issueRef": "#1158"
	},
	{
		"date": "2026-07-29",
		"type": "feature",
		"slug": "native-multipane-task-terminal",
		"title": "The task terminal's split, focus, resize, zoom, close and layout controls now work on tasks running the native (non-t...",
		"body": "The task terminal's split, focus, resize, zoom, close and layout controls now work on tasks running the native (non-tmux) terminal backend: each visible pane is a real terminal with its own shell, and the layout survives an app restart or a browser reconnect. Splitting after an app restart works too, and the Zoom button and the click-to-close pane picker now act on the pane you are actually looking at instead of failing quietly. On narrow viewports, native panes use the same swipeable carousel as tmux. tmux-backed tasks keep their existing behaviour unchanged, and controls a backend cannot serve are visibly disabled with a reason instead of failing silently.",
		"short": "Real split panes on native terminals"
	},
	{
		"date": "2026-07-29",
		"type": "fix",
		"slug": "relaunch-task-on-existing-branch",
		"title": "Fixed a task launched on an existing or remote branch (for example a code-review task on `origin/<branch>`) becoming ...",
		"body": "Fixed a task launched on an existing or remote branch (for example a code-review task on `origin/<branch>`) becoming impossible to start again after it was moved back to To Do: the leftover worktree directory made `git worktree add` fail and the retry died with \"a branch named X already exists\". The worktree path is now reclaimed on every launch path, and a surviving local or variant branch is checked out instead of recreated, so its commits are kept.",
		"short": "Re-run tasks on an existing branch"
	},
	{
		"date": "2026-07-29",
		"type": "fix",
		"slug": "symlink-output-styles-agent-accounts",
		"title": "Per-agent Claude config dirs now symlink every entry of `~/.claude` except the five that make an account an account (...",
		"body": "Per-agent Claude config dirs now symlink every entry of `~/.claude` except the five that make an account an account (login, identity, usage, org policy, per-user flags), plus anything credential-shaped by name — so `output-styles`, `workflows`, `routines`, `hooks` and imported `*.md` memory files stop silently going missing. Existing accounts pick up whatever is absent on the next launch, and a configured `outputStyle` that matches no registered style is now logged with the names that do exist: Claude Code registers a style under its frontmatter `name` instead of its filename, so `low-battery.md` declaring `name: Low Battery` is only reachable as \"Low Battery\".",
		"short": "Agent accounts share all Claude config"
	},
	{
		"date": "2026-07-28",
		"type": "fix",
		"slug": "artifact-browser-theme-default",
		"title": "HTML artifacts now open with the currently selected dev3 light or dark theme in desktop and browser mode",
		"body": "HTML artifacts now open with the currently selected dev3 light or dark theme in desktop and browser mode. The artifact theme control still cycles through the opposite theme, host-following mode, and the selected theme."
	},
	{
		"date": "2026-07-28",
		"type": "fix",
		"slug": "artifact-panel-resize-cpu",
		"title": "Dragging the artifact panel divider no longer relayouts the artifact iframe and refits the terminal on every pointer ...",
		"body": "Dragging the artifact panel divider no longer relayouts the artifact iframe and refits the terminal on every pointer move. A ghost line follows the pointer during the drag and the new width is applied once, on release, which removes the CPU spike (and the repeated tmux SIGWINCH repaints) while resizing.",
		"short": "Cheaper artifact panel resize"
	},
	{
		"date": "2026-07-28",
		"type": "fix",
		"slug": "diff-comment-caret",
		"title": "Fixed inline diff comment editing so typing in the middle of existing text no longer moves the caret to the end after...",
		"body": "Fixed inline diff comment editing so typing in the middle of existing text no longer moves the caret to the end after the first character.",
		"short": "Stable diff comment editing",
		"suggestedBy": "yakirn",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1152",
		"issueRef": "#1152"
	},
	{
		"date": "2026-07-28",
		"type": "fix",
		"slug": "unregistered-worktree-teardown",
		"title": "Completing a task no longer fails with \"Failed to remove worktree … is not a working tree\"",
		"body": "Completing a task no longer fails with \"Failed to remove worktree … is not a working tree\". When git has no metadata for the worktree path there is nothing left to remove, so dev3 now reclaims the orphan directory, prunes git metadata and finishes the move to Completed; genuinely refused removals (for example a locked worktree) still surface an error.\r\n\r\nReported by Evgeny Alterman.",
		"short": "Tasks complete despite orphan worktrees"
	},
	{
		"date": "2026-07-27",
		"type": "feature",
		"slug": "approved-review-badge",
		"title": "Show a compact green person-check badge on Kanban task cards when a pull request has a human approval, independently ...",
		"body": "Show a compact green person-check badge on Kanban task cards when a pull request has a human approval, independently of mergeability.",
		"short": "Human approval badge"
	},
	{
		"date": "2026-07-26",
		"type": "fix",
		"slug": "clickable-toast-navigation",
		"title": "Clicking anywhere on a notification toast (shared image, shared artifact, agent notify) except its dismiss button ope...",
		"body": "Clicking anywhere on a notification toast (shared image, shared artifact, agent notify) except its dismiss button opens the owning task and closes the toast — the swipe gesture no longer swallows the click. Pressing a toast also no longer leaves a stray blue focus ring around it.",
		"short": "Clickable toasts open their task again"
	},
	{
		"date": "2026-07-26",
		"type": "feature",
		"slug": "cross-task-message-envelope",
		"title": "`dev3 message --task seq:N` sent from inside another task's worktree now arrives wrapped in a `<dev3-ai-message>` env...",
		"body": "`dev3 message --task seq:N` sent from inside another task's worktree now arrives wrapped in a `<dev3-ai-message>` envelope carrying the sender's seq, title and the exact reply command, so the receiving agent immediately knows the text came from another agent and where to answer. Scheduled messages keep their plain text in the queue and get wrapped at delivery.",
		"short": "Cross-task agent messages are labeled"
	},
	{
		"date": "2026-07-26",
		"type": "fix",
		"slug": "native-task-terminal-e2e-writer-observer",
		"title": "The packaged native task-terminal E2E now matches the merged writer/observer contract: the second renderer attaches a...",
		"body": "The packaged native task-terminal E2E now matches the merged writer/observer contract: the second renderer attaches as a replayed observer whose input is refused, an explicit claim moves the writer lease atomically, and the promoted writer reaches the same shell while both viewers receive its output, with geometry following the writer and a reconnect resuming at its watermark."
	},
	{
		"date": "2026-07-26",
		"type": "chore",
		"slug": "native-terminal-soak-gate",
		"title": "Added an opt-in multi-session soak and fault-recovery gate for the native terminal host (`bun run test:native-soak`, ...",
		"body": "Added an opt-in multi-session soak and fault-recovery gate for the native terminal host (`bun run test:native-soak`, plus a manual GitHub workflow and a Windows PowerShell runner). It drives concurrent sessions through sustained agent-like TUI output, resizes, observer/writer takeover, forced reconnect churn, a cold controller reattach, a host crash with nested descendants, and repeated create/stop cycles, then emits a machine-readable verdict against budgets derived from the run's own saturated baseline. The normal test suite and required PR checks do not run it."
	},
	{
		"date": "2026-07-26",
		"type": "fix",
		"slug": "project-name-link-color",
		"title": "Make the clickable project breadcrumb use the existing accent link colors so its navigation affordance is visually cl...",
		"body": "Make the clickable project breadcrumb use the existing accent link colors so its navigation affordance is visually clear without adding an underline."
	},
	{
		"date": "2026-07-26",
		"type": "fix",
		"slug": "rate-limit-accounts-settings",
		"title": "Clicking the header agent rate-limit usage indicator now opens Global Settings → Accounts instead of only dismissing ...",
		"body": "Clicking the header agent rate-limit usage indicator now opens Global Settings → Accounts instead of only dismissing its usage tooltip.",
		"short": "Open accounts from usage"
	},
	{
		"date": "2026-07-26",
		"type": "fix",
		"slug": "shell-free-merge-detection-pipeline",
		"title": "Squash and rebase merge detection no longer shells out to `bash -c` for its `git patch-id` pipelines — the two git pr...",
		"body": "Squash and rebase merge detection no longer shells out to `bash -c` for its `git patch-id` pipelines — the two git processes are now streamed into each other directly, so tasks merged on Windows are detected instead of silently reported as unmerged.",
		"short": "Merge detection works without bash"
	},
	{
		"date": "2026-07-26",
		"type": "fix",
		"slug": "tmux-version-skew-recovery",
		"title": "A tmux client/server version mismatch after an app update could block every new task and project terminal from starti...",
		"body": "A tmux client/server version mismatch after an app update could block every new task and project terminal from starting until all tmux sessions were killed. dev3 now detects the mismatch at startup, reuses a compatible client found later in PATH when available, and gives the exact tmux Sessions → Kill All recovery when it is not.",
		"short": "Fix blocked terminal launches"
	},
	{
		"date": "2026-07-26",
		"type": "fix",
		"slug": "wheel-mouse-report-flood",
		"title": "Scrolling fast through a long agent session no longer pastes fragments of mouse escape sequences (`<64;69;44M`) into ...",
		"body": "Scrolling fast through a long agent session no longer pastes fragments of mouse escape sequences (`<64;69;44M`) into the input box. Wheel reports are now rate-limited so a momentum flick cannot overrun the PTY's read window, and drag motion is reported once per cell instead of once per pixel.",
		"short": "No more scroll garbage in the prompt"
	},
	{
		"date": "2026-07-26",
		"type": "fix",
		"slug": "windows-archive-launcher-selection",
		"title": "The Windows packaged-app launch proof now finds the real desktop launcher at `bin/launcher.exe` instead of scanning t...",
		"body": "The Windows packaged-app launch proof now finds the real desktop launcher at `bin/launcher.exe` instead of scanning the bundle root, which found nothing and kept the `windows-app-archive` job permanently red. Auxiliary executables — the bundled `dev3.exe` CLI, the native terminal host image, setup carriers and the electrobun runtime binaries — are rejected with an explicit reason, missing and ambiguous layouts fail with the full considered inventory, and the executable inventory is uploaded as proof even when the check fails."
	},
	{
		"date": "2026-07-26",
		"type": "fix",
		"slug": "windows-webview2-startup-failure",
		"title": "A Windows launch with no interactive desktop or a broken WebView2 runtime used to create a window whose webview never...",
		"body": "A Windows launch with no interactive desktop or a broken WebView2 runtime used to create a window whose webview never came up, and the first-paint resize nudge then segfaulted the app seconds later — or it kept running with no UI at all and could not even be shut down, because the quit gate waits for a renderer that never existed. The nudge now waits for the renderer, and a launch that never gets one prints what to install or run instead and exits with the new code 8.",
		"short": "No more crash when WebView2 fails"
	},
	{
		"date": "2026-07-26",
		"type": "feature",
		"slug": "70-native-terminal-remote-viewers",
		"title": "A task terminal explicitly running on the native backend is now fully usable through `dev3 remote` in a browser: a vi...",
		"body": "A task terminal explicitly running on the native backend is now fully usable through `dev3 remote` in a browser: a viewer that attaches mid-session rebuilds the screen from a bounded journal instead of starting blank, a reconnect resumes from its own watermark with no missing or duplicated output, and exactly one viewer types while the rest are read-only until they take control. Tmux terminals are unchanged.",
		"short": "Native terminals work in remote mode"
	},
	{
		"date": "2026-07-26",
		"type": "feature",
		"slug": "80-windows-cli-loopback-transport",
		"title": "On Windows the desktop app now publishes a loopback-only TCP endpoint record and the bundled dev3.exe CLI connects th...",
		"body": "On Windows the desktop app now publishes a loopback-only TCP endpoint record and the bundled dev3.exe CLI connects through it, so the existing CLI commands and the agent status hooks work there without a Unix socket. Generated hook commands also spell the CLI in a form the Windows Claude hook runner can execute. macOS and Linux keep using the same `.sock` transport unchanged.",
		"short": "Windows CLI talks to the app"
	},
	{
		"date": "2026-07-25",
		"type": "feature",
		"slug": "20-commit-button-git-row",
		"title": "The task inspector's git row now has a Commit button that hands the commit to the agent in the task terminal — it rev...",
		"body": "The task inspector's git row now has a Commit button that hands the commit to the agent in the task terminal — it reviews the changes, stages them and writes the message, without pushing. It lights up only when the worktree has uncommitted changes, and it is also available as a row in the narrow-viewport actions sheet.",
		"short": "Commit button in the git row",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/271",
		"issueRef": "#271"
	},
	{
		"date": "2026-07-25",
		"type": "feature",
		"slug": "20-markdown-diff-preview-blocks",
		"title": "Markdown files in the diff viewer now open in rendered preview mode by default, and a modified file's preview highlig...",
		"body": "Markdown files in the diff viewer now open in rendered preview mode by default, and a modified file's preview highlights what changed: added blocks sit on a green wash, removed blocks on a red one, GitHub rich-diff style. The Preview toggle still switches back to the raw source diff per file.",
		"short": "Markdown diffs render as rich preview"
	},
	{
		"date": "2026-07-25",
		"type": "feature",
		"slug": "20-remote-connection-status",
		"title": "Remote (browser) mode no longer reads as frozen when the link drops: a floating pill names the connection state, doub...",
		"body": "Remote (browser) mode no longer reads as frozen when the link drops: a floating pill names the connection state, doubles as an instant retry, and confirms \"Back online\" once recovered. The Kanban board now shows a loading skeleton and a retry panel instead of a silently empty board, and reloads itself as soon as the connection is back.",
		"short": "See when remote loses connection"
	},
	{
		"date": "2026-07-25",
		"type": "docs",
		"slug": "agent-rules-conflicts",
		"title": "Cleaned up contradictions and dead weight in the agent instructions: the parallelism section no longer mandates a `Te...",
		"body": "Cleaned up contradictions and dead weight in the agent instructions: the parallelism section no longer mandates a `TeamCreate` tool most harnesses do not expose (preference ladder capped at 5 members, falling back to `Workflow`/`Agent`), the response-style section states that Decision-First governs structure only while the user's language and tone always win, the two overlapping test gates became one escalating `Verification gates` block (nothing gates a commit; lint plus touched tests before push; full suite before opening a PR and after any rebase), the changelog rules merged the `Short:`/popover-priority guidance into a single entry, and coverage expectations now say plainly that no coverage provider is wired up so the percentages are review-time judgment rather than a machine check. Added a `No deprecation — ever` section, moved the git-editor and worktree read-only rules out to the personal global instructions, and dropped the obsolete Nerd Font icon section."
	},
	{
		"date": "2026-07-25",
		"type": "fix",
		"slug": "await-native-terminal-teardown",
		"title": "Completing, cancelling, aborting preparation, or deleting a task on the native terminal backend now waits until that ...",
		"body": "Completing, cancelling, aborting preparation, or deleting a task on the native terminal backend now waits until that task's terminal host, shell, and descendants are verified gone before the cleanup script runs and the worktree is removed. If the stop cannot be confirmed, teardown aborts with an actionable error and leaves the worktree and task state intact for a retry, while tasks on the legacy tmux backend keep their previous non-blocking teardown."
	},
	{
		"date": "2026-07-25",
		"type": "fix",
		"slug": "current-live-branch-after-rename",
		"title": "`dev3 current` and `dev3 task show` now reconcile the stored branch name with the branch actually checked out in the ...",
		"body": "`dev3 current` and `dev3 task show` now reconcile the stored branch name with the branch actually checked out in the worktree, so a `git branch -m` is reflected immediately instead of waiting for the app's next branch-status poll. Offline mode reads the live branch straight from the worktree too.",
		"short": "dev3 current shows renamed branch instantly",
		"suggestedBy": "nadavsheinbein",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1003",
		"issueRef": "#1003"
	},
	{
		"date": "2026-07-25",
		"type": "fix",
		"slug": "dialog-task-title-navigation",
		"title": "Make the task title in unsaved-changes confirmation dialogs clickable",
		"body": "Make the task title in unsaved-changes confirmation dialogs clickable. Clicking it now dismisses the destructive prompt without moving the task and opens the referenced task using the user's configured task view."
	},
	{
		"date": "2026-07-25",
		"type": "fix",
		"slug": "diff-tree-artifact-refresh",
		"title": "Keep the open HTML artifact workspace in sync when an agent shares a new artifact, selecting the newest item and refr...",
		"body": "Keep the open HTML artifact workspace in sync when an agent shares a new artifact, selecting the newest item and refreshing the history counter even when the app window is not focused."
	},
	{
		"date": "2026-07-25",
		"type": "fix",
		"slug": "flaky-app-and-git-tests",
		"title": "Fixed the flaky tests that kept blocking merges on unchanged code",
		"body": "Fixed the flaky tests that kept blocking merges on unchanged code. Toasts raised before the toast host subscribes are now queued and delivered instead of silently dropped, which also fixes losing a `dev3 show-image`/CLI toast that arrives during startup; the git test helpers no longer hang a whole suite when a spawn fails or when a temp repo is removed under a still-running git process; and the sharded CI test gate now tells you to re-run the whole workflow instead of just the aggregate job, which only re-reads the same artifacts.",
		"short": "Killed the merge-blocking flaky tests"
	},
	{
		"date": "2026-07-25",
		"type": "fix",
		"slug": "flaky-diff-viewer-boot-wait",
		"title": "Fixed the flaky TaskDiffViewer test that failed on CI shard 5 whenever the runner stalled: component-boot waits now y...",
		"body": "Fixed the flaky TaskDiffViewer test that failed on CI shard 5 whenever the runner stalled: component-boot waits now yield a bounded number of event-loop ticks instead of racing Testing Library's 1000ms wall-clock budget, so a slow machine can no longer fail a test whose DOM does settle. CI test runs also retry a failing test up to three times as a net for the remaining wall-clock-sensitive suites."
	},
	{
		"date": "2026-07-25",
		"type": "fix",
		"slug": "flaky-task-preparation-alert-test",
		"title": "Made the App test for the task-preparation-failure toast deterministic",
		"body": "Made the App test for the task-preparation-failure toast deterministic. It polled for any `role=\"alert\"` element inside the default 1s timeout even though the toast is delivered synchronously, so it could time out under concurrent test-suite load; it now asserts the exact toast message right after the dispatching `act()`."
	},
	{
		"date": "2026-07-25",
		"type": "fix",
		"slug": "kanban-label-project-order",
		"title": "Kanban label filter chips now follow the label order configured in Project Settings instead of being reordered by tas...",
		"body": "Kanban label filter chips now follow the label order configured in Project Settings instead of being reordered by task usage. This keeps the board consistent with the user's project-wide label arrangement."
	},
	{
		"date": "2026-07-25",
		"type": "fix",
		"slug": "merged-branch-no-own-commits",
		"title": "A branch that was squash-merged and then rebased (no commits of its own left) is no longer reported as \"not fully mer...",
		"body": "A branch that was squash-merged and then rebased (no commits of its own left) is no longer reported as \"not fully merged\" — dev3 now confirms it through the task's own merged pull request before offering completion, while brand-new branches with no work stay untouched. The branch-status toast also names the real blocker (uncommitted changes, a non-base compare ref, or an ineligible task status) instead of always claiming the branch is unmerged.",
		"short": "Merged-and-rebased branches detected"
	},
	{
		"date": "2026-07-25",
		"type": "chore",
		"slug": "native-registry-reboot-recovery",
		"title": "The isolated native terminal registry now classifies persisted session records explicitly as attachable, lost (host g...",
		"body": "The isolated native terminal registry now classifies persisted session records explicitly as attachable, lost (host gone or PID reused), or unreadable, each with an actionable diagnostic, and exposes it through `inspectRecovery`/`recoverSessions`, `status()`, and the dev-only `cli.ts recover [--cleanup]`. Cleanup stays token-matched and passive: it removes only verified native metadata, never signals a reused PID, never starts a replacement shell, and never touches tmux state."
	},
	{
		"date": "2026-07-25",
		"type": "chore",
		"slug": "persist-terminal-backend-identity",
		"title": "A task's primary terminal can now carry an explicitly selected terminal backend that survives a restart, stored as an...",
		"body": "A task's primary terminal can now carry an explicitly selected terminal backend that survives a restart, stored as an optional field decoded through the shared identity codec. Tasks written before the field keep no field at all and continue to mean tmux — nothing backfills or rewrites them — and unknown stored values fail loudly instead of silently switching backends. Nothing selects a backend yet; this is persistence plumbing only."
	},
	{
		"date": "2026-07-25",
		"type": "refactor",
		"slug": "terminal-backend-contract-seam",
		"title": "Added an internal, backend-neutral terminal-backend contract with two real adapters behind it — the existing tmux imp...",
		"body": "Added an internal, backend-neutral terminal-backend contract with two real adapters behind it — the existing tmux implementation and the merged native single-view lifecycle — so future work can target one product vocabulary instead of tmux specifics. tmux remains the only backend in use and all app, CLI, and terminal behavior is unchanged; the seam has no production callers yet and is covered by one conformance suite that runs against both adapters."
	},
	{
		"date": "2026-07-25",
		"type": "chore",
		"slug": "tmux-inventory-advisory",
		"title": "The tmux dependency inventory is no longer a pull-request gate: `bun run test` now runs only the audit's pure unit te...",
		"body": "The tmux dependency inventory is no longer a pull-request gate: `bun run test` now runs only the audit's pure unit tests, and the full live repository scan moved to one manual command (`bun src/cli/tmux-audit/generate.ts`, or `--check` to verify without writing) that is run at tmux-removal milestones. The scanner, classification model, generator, and generated inventory are unchanged."
	},
	{
		"date": "2026-07-25",
		"type": "fix",
		"slug": "updater-redownload-ready-version",
		"title": "The auto-updater no longer re-downloads and re-announces a version that is already downloaded and waiting for a restart",
		"body": "The auto-updater no longer re-downloads and re-announces a version that is already downloaded and waiting for a restart. A postponed update now re-opens its \"restart to update\" prompt every four hours instead, so nobody quietly stays on an old build.",
		"short": "No more repeat update downloads"
	},
	{
		"date": "2026-07-25",
		"type": "docs",
		"slug": "verify-changes-skill",
		"title": "Moved the testing detail out of `AGENTS.md` into a new repo-local `/verify-changes` skill (which vitest config covers...",
		"body": "Moved the testing detail out of `AGENTS.md` into a new repo-local `/verify-changes` skill (which vitest config covers what, what a change needs covered, house style, mocking Electrobun RPC and `useT()`, reproducing flakes under load, coverage expectations), leaving the two verification gates and the browser-QA mandate inline where they cannot be missed. The 1-5 tip coolness rubric now lives on a `TipScore` union type in `src/mainview/tips.ts` instead of being restated in prose, and the key-files list gained the entries an agent is most likely to overlook: shared types, the RPC handler barrel, the reducer, design tokens, the keymap, shipped skill text, CLI exit codes, CI workflows, and the decision records."
	},
	{
		"date": "2026-07-25",
		"type": "chore",
		"slug": "windows-packaged-native-host-image",
		"title": "The Windows build now assembles a versioned native terminal host image — the packaged Bun runtime carrier, the bundle...",
		"body": "The Windows build now assembles a versioned native terminal host image — the packaged Bun runtime carrier, the bundled host entrypoint, and a merged manifest with per-file checksums — into the real dev3 package, so it ships inside the final update archive and is verified from that exact archive. Staging the image is additive and lands outside the replaceable installation directory, so an older image keeps serving a running host while a newer one is staged beside it and rollback can select either. tmux remains the default terminal backend and nothing here starts the native host."
	},
	{
		"date": "2026-07-25",
		"type": "feature",
		"slug": "80-native-parser-backpressure-budgets",
		"title": "The experimental native terminal parser now publishes read-only queue, persistence, and resync counters, caps snapsho...",
		"body": "The experimental native terminal parser now publishes read-only queue, persistence, and resync counters, caps snapshot writes at one per pane per second, skips writes whose screen is unchanged, and never keeps more than one write in flight. A real-PTY load probe across 1, 6, and 20 streams measured roughly half the persisted bytes and a peak write rate of at most one per second per pane, with unchanged parsing and cleanup behaviour. tmux remains the production default and is untouched.",
		"short": "Bounded native terminal snapshot writes"
	},
	{
		"date": "2026-07-25",
		"type": "feature",
		"slug": "90-native-multipane-coordinator",
		"title": "Added a native multi-pane terminal session coordinator that composes one persistent PTY host per logical pane, with a...",
		"body": "Added a native multi-pane terminal session coordinator that composes one persistent PTY host per logical pane, with a shared split layout, client-local focus and zoom, writer-owned resize, and recovery of the same panes and processes after an app restart. Internal groundwork for running terminals without tmux — no product surface changes, tmux remains the default.",
		"short": "Native multi-pane terminal coordinator"
	},
	{
		"date": "2026-07-25",
		"type": "feature",
		"slug": "90-native-primary-task-terminal",
		"title": "A task's primary terminal can now run on dev3's own native terminal host instead of tmux, when the task is explicitly...",
		"body": "A task's primary terminal can now run on dev3's own native terminal host instead of tmux, when the task is explicitly opted in with `dev3 task terminal-backend --to native`. The terminal looks and behaves the same in the app, survives an app restart by reattaching to the same host and shell, and tears down only its own process tree; tmux stays the default for every other task and its behavior is unchanged. Shell scripts are now pinned to LF line endings so the CLI and Windows package builds also work from a Windows clone.",
		"short": "Native terminal for opted-in tasks"
	},
	{
		"date": "2026-07-25",
		"type": "feature",
		"slug": "90-terminal-process-ownership",
		"title": "Added a backend-neutral process/port ownership seam so a terminal session's CPU, memory, and listening ports can be a...",
		"body": "Added a backend-neutral process/port ownership seam so a terminal session's CPU, memory, and listening ports can be accounted for on both tmux and native backends. Ownership must be proved (tmux pane PIDs, or the native session record verified against process identity); a stale or reused PID is reported explicitly and never counted, and the snapshot reuses the existing `ps`/`lsof` scanners rather than adding a second monitor.",
		"short": "Ownership accounting for native terminals"
	},
	{
		"date": "2026-07-25",
		"type": "feature",
		"slug": "90-windows-desktop-runnable",
		"title": "The dev3 desktop app now builds and starts on Windows without Git Bash, WSL or a system Bun: the build path no longer...",
		"body": "The dev3 desktop app now builds and starts on Windows without Git Bash, WSL or a system Bun: the build path no longer invokes any shell script, the packaged app ships its own `dev3.exe`, and `bun run dev` / `bun run start` run as a plain process chain instead of a POSIX shell line. Boot itself was made Windows-safe — the data root resolves from `%USERPROFILE%` rather than guessing `/tmp`, the shell default falls back to PowerShell, and the Unix-socket CLI transport reports itself unavailable instead of crashing before the first window. Generated wrapper scripts and Claude/Codex hook commands now have a Windows spelling (PowerShell scripts, absolute `dev3.exe` paths, no tilde or shell operators), and the packaged Windows archive is verified in CI by launching the real app and proving a clean shutdown. Projects and worktrees also get a Windows-safe storage key (a drive-qualified path is not a legal directory name), the folder picker can reach other drives, worktree cloning no longer shells out to `cp`/`rm`/`mkdir`, and the remote web UI serves its assets there at all. A task started there really creates its worktree, copies the shared paths without freezing the UI, finds the packaged native terminal host the build ships, and writes its launch script to the OS temp directory. Because Windows has no tmux at all, a task created there is stamped with the native terminal backend at creation; tasks created on macOS and Linux are untouched and an existing task without the marker still means tmux everywhere. Windows CLI-to-app IPC is still missing, so `dev3` commands and agent hooks do not reach the app there yet, and switching an existing task's terminal backend is still CLI-only.",
		"short": "dev3 now boots on Windows"
	},
	{
		"date": "2026-07-24",
		"type": "feature",
		"slug": "00-claude-opus-5-presets",
		"title": "Claude Opus 5 joins the built-in Claude presets on the 1M-context alias with Medium/High/X-High effort tiers for Auto...",
		"body": "Claude Opus 5 joins the built-in Claude presets on the 1M-context alias with Medium/High/X-High effort tiers for Auto and Bypass plus Default, Plan and Accept Edits, and Auto (Opus 5, Medium) is now the default configuration for new launches. Opus 4.8, Sonnet 5, Fable 5 and Opus 4.7 presets are unchanged, and the bare `opus` alias now resolves to Opus 5 on third-party backends such as Bedrock. Also repairs the renderer test suite on Node 26, whose experimental global `localStorage` shadowed happy-dom's and broke every component test.",
		"short": "Claude Opus 5 is the new default"
	},
	{
		"date": "2026-07-24",
		"type": "feature",
		"slug": "05-artifact-echarts-charts",
		"title": "The dev3 artifact starter now renders charts with Apache ECharts (SRI-pinned cdnjs script, SVG renderer) behind a tin...",
		"body": "The dev3 artifact starter now renders charts with Apache ECharts (SRI-pinned cdnjs script, SVG renderer) behind a tiny theme-aware dev3Chart bridge, so agent-built reports get modern interactive charts — tooltips, legends, animations, any ECharts chart type — with a few lines of declarative code instead of hand-rolled SVG. The sandboxed artifact viewer now allows network access: artifacts can load external libraries and fetch data from your own services or the dev3 dev server, while staying fully isolated from the app itself. Artifact HTML stays a small readable file, charts follow the Auto/Light/Dark theme switch, and PDF export stays crisp.",
		"short": "Beautiful interactive charts in artifacts"
	},
	{
		"date": "2026-07-24",
		"type": "fix",
		"slug": "align-notify-guidance-flags",
		"title": "Keep generated agent guidance for `dev3 notify` aligned with the CLI contract by documenting separate in-app duration...",
		"body": "Keep generated agent guidance for `dev3 notify` aligned with the CLI contract by documenting separate in-app duration and native desktop notification forms. The guidance now states that `--duration` cannot be combined with `--desktop`."
	},
	{
		"date": "2026-07-24",
		"type": "feature",
		"slug": "codex-bedrock-backend",
		"title": "The Codex agent now supports Amazon Bedrock as an LLM backend, selectable per agent in Settings → Agents (same toggle...",
		"body": "The Codex agent now supports Amazon Bedrock as an LLM backend, selectable per agent in Settings → Agents (same toggle Claude already has). dev3 rewrites its model aliases to Bedrock's `openai.<model>` ids and routes the launch via `-c model_provider=\"amazon-bedrock\"`; credentials and region stay in your own ~/.codex/config.toml. Model ids for all providers are now derived from the config alias, so new models need no mapping-table edits.",
		"short": "Codex can run on Amazon Bedrock"
	},
	{
		"date": "2026-07-24",
		"type": "fix",
		"slug": "inspector-bars-panel-width",
		"title": "The task inspector's two toolbars no longer overlap or clip on a narrow window: the bars now adapt to the panel's own...",
		"body": "The task inspector's two toolbars no longer overlap or clip on a narrow window: the bars now adapt to the panel's own width instead of the viewport's, so label chips stop painting over the tmux controls and the fullscreen, collapse, Dev Server, Ports and Artifacts controls stay inside the panel. As the panel gets tighter the label strip folds into a count chip, the branch name clamps, and the tmux-layout and Runtime buttons go icon-only; the completion-ownership chip now always uses its short label instead of the full \"I'll complete it myself\" sentence, which alone ate ~180px of the bar.",
		"short": "Task toolbars fit narrow windows"
	},
	{
		"date": "2026-07-24",
		"type": "fix",
		"slug": "label-set-task-selectors",
		"title": "`dev3 label set` now resolves full task IDs, ID prefixes, and stable `seq:N` selectors through the shared task resolv...",
		"body": "`dev3 label set` now resolves full task IDs, ID prefixes, and stable `seq:N` selectors through the shared task resolver, while unknown selectors retain a clear error without mutating a task."
	},
	{
		"date": "2026-07-24",
		"type": "chore",
		"slug": "native-stream-budget-harness",
		"title": "Added a deterministic, test-only load and budget harness (new native-terminal-load-budget module, nested inside the n...",
		"body": "Added a deterministic, test-only load and budget harness (new native-terminal-load-budget module, nested inside the native-session terminal registry) over the native-terminal parser and resync primitives, measuring bytes, frames, queue high-water marks, snapshot size, and drain iterations across 1-, 6-, and 20-stream scenarios. It exercises steady, burst, stalled-observer, sequence-gap-then-resync, and bounded-overflow loads and asserts the existing caps, explicit overflow behavior, and cleanup semantics without changing any production code."
	},
	{
		"date": "2026-07-24",
		"type": "chore",
		"slug": "native-terminal-client-layout-model",
		"title": "Added a standalone pure state model (src/shared/native-terminal-client-layout/) for a future native multi-pane termin...",
		"body": "Added a standalone pure state model (src/shared/native-terminal-client-layout/) for a future native multi-pane terminal: it holds each client's view of the shared, ordered pane set plus its own focus and optional zoom, reconciles those overlays deterministically when panes are added, removed, or reordered, and proves that focus/zoom mutations never touch the shared pane list or introduce any PTY dimension. No runtime or UI behavior changes."
	},
	{
		"date": "2026-07-24",
		"type": "chore",
		"slug": "native-terminal-diagnostics-snapshot",
		"title": "Added a read-only native terminal diagnostics module (src/bun/native-terminal-diagnostics/) that shapes injected regi...",
		"body": "Added a read-only native terminal diagnostics module (src/bun/native-terminal-diagnostics/) that shapes injected registry read-API data into a versioned, JSON-safe snapshot plus a compact human-readable formatter. It reports host/session facts and bounded queue/parser counters, marks unavailable facts as explicit \"unknown\" with a reason, and redacts endpoint, token, command, and output by construction. Internal groundwork for the tmux-removal roadmap with no product caller yet."
	},
	{
		"date": "2026-07-24",
		"type": "chore",
		"slug": "native-terminal-host-manifest",
		"title": "Add a standalone, production-unused manifest generator and validator for staged native terminal host artifacts under ...",
		"body": "Add a standalone, production-unused manifest generator and validator for staged native terminal host artifacts under scripts/native-terminal-host-manifest/. It emits deterministic JSON (schema version, host/protocol/Bun versions, OS, arch, entrypoint, per-file sizes and SHA-256 checksums) and re-validates an artifact directory, rejecting missing, partial, path-traversal, duplicate, incompatible-schema, and checksum-mismatch inputs with compact typed errors. Groundwork for the tmux-removal roadmap; packaging, signing, and update flows are untouched."
	},
	{
		"date": "2026-07-24",
		"type": "fix",
		"slug": "pr-auto-merge-reconciliation",
		"title": "Linked tasks now refresh sticky pull requests after GitHub auto-merge, even when the remote branch was deleted, and r...",
		"body": "Linked tasks now refresh sticky pull requests after GitHub auto-merge, even when the remote branch was deleted, and reuse the existing merge completion flow without repeating prompts.",
		"short": "Sync auto-merged PRs"
	},
	{
		"date": "2026-07-24",
		"type": "chore",
		"slug": "terminal-backend-identity-codec",
		"title": "Add a pure terminal backend identity codec (MIG-003, tmux-removal roadmap): a missing field decodes to the effective ...",
		"body": "Add a pure terminal backend identity codec (MIG-003, tmux-removal roadmap): a missing field decodes to the effective legacy tmux while preserving that it was absent, explicit tmux/native round-trip deterministically, and unknown values, wrong types, or malformed containers fail with a typed result instead of silently selecting native. Isolated groundwork with no persistence, migration, or product wiring."
	},
	{
		"date": "2026-07-24",
		"type": "fix",
		"slug": "windows-native-e2e-shell-warmup-budget",
		"title": "Fixed a Windows-only flake in the native-session E2E suite: the probes that wait for a freshly started interactive sh...",
		"body": "Fixed a Windows-only flake in the native-session E2E suite: the probes that wait for a freshly started interactive shell allowed only ~4 seconds, so on a cold CI runner PowerShell answered just after they gave up and the lifecycle run failed. The warm-up budget now lives in one shared constant with room for a slow runner, and it is a ceiling rather than a delay — the POSIX runs still finish in seconds."
	},
	{
		"date": "2026-07-24",
		"type": "feature",
		"slug": "90-native-single-view-terminal-adapter",
		"title": "Composed the merged native terminal primitives (session registry, attach client, versioned record, ownership, bounded...",
		"body": "Composed the merged native terminal primitives (session registry, attach client, versioned record, ownership, bounded parser-state snapshot) into one dev-internal single-view adapter and drove it through the existing backend-neutral parity corpus — every applicable single-view scenario passes against native while the tmux runner stays green. This is an unused tracer with no product callers; tmux remains the only production terminal backend and no behavior changes for users.\r\n\r\nAlso made the sharded CI test report self-contained: when a shard's suite fails, the aggregate `test` job now names the exact shard, suite, and failing test titles inline (banner, GitHub annotations, and run summary) so failures are readable without opening any individual shard job.\r\n\r\nAlong the way the shared parity corpus stopped importing the PTY server for a single pure helper — that import started a WebSocket server at module load and kept the parity E2E process alive long after its checks had passed. The helper now lives in the pure resize-protocol module, and the E2E terminates on its own.\r\n\r\nThe sharded test gate is honest again as well: piping a suite's output into `tee` ran without `pipefail`, so a failing suite was recorded as passing and the aggregate check went green over a real failure. Those steps now use an explicit bash shell, and a test fails if a piping step ever drops it.",
		"short": "Native single-view terminal adapter"
	},
	{
		"date": "2026-07-23",
		"type": "feature",
		"slug": "20-streamer-mode",
		"title": "Added Streamer mode (Settings → Appearance, or the ⇧⌘P command palette) — a privacy toggle for screen recordings and ...",
		"body": "Added Streamer mode (Settings → Appearance, or the ⇧⌘P command palette) — a privacy toggle for screen recordings and screenshots that blurs identity-bearing values across the UI: agent account emails and names, organizations/workspaces, home-folder paths, tunnel URLs, the remote-access QR code, and GitHub logins. Terminal content is not masked. A `?streamer=on` URL parameter forces it in remote/browser mode, so QA agents take every screenshot masked by default.",
		"short": "Streamer mode hides private info"
	},
	{
		"date": "2026-07-23",
		"type": "feature",
		"slug": "cmd-o-open-in-app",
		"title": "Press ⌘O (macOS) or Ctrl+O (Linux) to pop up a searchable launcher of your installed apps (Finder, VS Code, Cursor, G...",
		"body": "Press ⌘O (macOS) or Ctrl+O (Linux) to pop up a searchable launcher of your installed apps (Finder, VS Code, Cursor, Ghostty, …, plus any custom apps you added). Type to filter, use ↑↓, or press 1–9, and it opens the current project — or the active task's worktree — in that app. Works both on the Kanban board and inside a task.",
		"short": "Open in… popup with Cmd+O",
		"suggestedBy": "Paveltarno",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1057",
		"issueRef": "#1057"
	},
	{
		"date": "2026-07-23",
		"type": "fix",
		"slug": "completed-card-footer-overlap",
		"title": "Completed task cards now wrap crowded status, PR, review, and comment badges within the card footer instead of lettin...",
		"body": "Completed task cards now wrap crowded status, PR, review, and comment badges within the card footer instead of letting them overlap in narrow columns."
	},
	{
		"date": "2026-07-23",
		"type": "fix",
		"slug": "diff-panel-order-and-scroll-highlight",
		"title": "The review diff panel now shows files on the right in the exact order of the left file tree (previously a flat path s...",
		"body": "The review diff panel now shows files on the right in the exact order of the left file tree (previously a flat path sort could diverge from the folder-grouped tree), and the file currently under the reading line is highlighted in the tree as you scroll the diff.\r\n\r\nReported by @diverru (Alexander Kiselyov)",
		"short": "Review diff order + scroll highlight"
	},
	{
		"date": "2026-07-23",
		"type": "fix",
		"slug": "dropped-push-handlers",
		"title": "The native \"Add Project\" menu item now works: its openAddProjectModal push was missing a renderer handler, so the men...",
		"body": "The native \"Add Project\" menu item now works: its openAddProjectModal push was missing a renderer handler, so the menu did nothing. Also declared the cliShowImage / cliShowArtifact push messages in the RPC schema (they were sent and handled but undeclared).",
		"short": "Fix broken Add Project menu"
	},
	{
		"date": "2026-07-23",
		"type": "chore",
		"slug": "five-way-ci-test-sharding",
		"title": "Split the full test workflow into five parallel CI shards, with each runner executing its mainview, bun, and CLI shar...",
		"body": "Split the full test workflow into five parallel CI shards, with each runner executing its mainview, bun, and CLI shard sequentially. This reduces wall-clock time while preventing the three Vitest suites from competing for one runner's worker pool, while a Node 24 artifact gate still collects every suite's result when one fails."
	},
	{
		"date": "2026-07-23",
		"type": "feature",
		"slug": "markdown-preview-diff-view",
		"title": "Markdown files in the Diff view now have a per-file Preview toggle that switches between the source diff and the rend...",
		"body": "Markdown files in the Diff view now have a per-file Preview toggle that switches between the source diff and the rendered document (sanitized, themed, GitHub-flavored). Deleted files preview their removed content, and jumping to a search hit switches the file back to the source diff automatically.",
		"short": "Markdown preview in Diff view",
		"suggestedBy": "yakirn",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1063",
		"issueRef": "#1063"
	},
	{
		"date": "2026-07-23",
		"type": "fix",
		"slug": "mobile-status-move-bottom-sheet",
		"title": "On phones the task status \"Move to\" control now opens as a bottom sheet with finger-sized rows (44px touch targets) i...",
		"body": "On phones the task status \"Move to\" control now opens as a bottom sheet with finger-sized rows (44px touch targets) instead of a tiny anchored dropdown, both on the task screen and on Kanban board cards; the status chip in the task summary bar is also larger. Desktop behavior is unchanged.",
		"short": "Bigger mobile status controls"
	},
	{
		"date": "2026-07-23",
		"type": "feature",
		"slug": "move-task-between-projects",
		"title": "Move a To Do task to a different project from its detail view — pick a destination from a searchable list and the tas...",
		"body": "Move a To Do task to a different project from its detail view — pick a destination from a searchable list and the task relocates to that board's To Do column, keeping its notes, history, overview, and priority. Labels that also exist by name in the destination carry over; the rest are dropped. Desktop shows a popover, phones a bottom sheet.",
		"short": "Move a task to another project"
	},
	{
		"date": "2026-07-23",
		"type": "chore",
		"slug": "native-app-restart-reattach-proof",
		"title": "Added a focused app-restart reattach proof (seq 1247) for the isolated native-session registry: two separate short-li...",
		"body": "Added a focused app-restart reattach proof (seq 1247) for the isolated native-session registry: two separate short-lived controller processes prove that a live native terminal session survives full app-process turnover — controller A starts and marks a session then exits, and a clean controller B rediscovers and reattaches to the same host, shell, session, pane, and preserved shell state, with a deterministic single writer, an isolated stop, and honest lost-session results for stale/missing metadata. Test-only; changes no production behaviour and never touches the tmux path."
	},
	{
		"date": "2026-07-23",
		"type": "chore",
		"slug": "native-host-version-skew-harness",
		"title": "Added an isolated proof harness for the tmux-removal roadmap that stages two immutable native terminal host images an...",
		"body": "Added an isolated proof harness for the tmux-removal roadmap that stages two immutable native terminal host images and proves the safe update rule: an existing session stays owned by its original compatible host, an incompatible client gets one explicit version-mismatch without killing or taking over the live session, a new session runs on the new image while the old one continues on the old image, and rollback selects a compatible staged image explicitly instead of guessing or falling back to tmux. Dev-internal only; no production code changed."
	},
	{
		"date": "2026-07-23",
		"type": "fix",
		"slug": "remote-watch-notifications-wide",
		"title": "Watched-task status-change notifications now fire in remote/browser mode on wide desktop viewports too, not only on n...",
		"body": "Watched-task status-change notifications now fire in remote/browser mode on wide desktop viewports too, not only on narrow/mobile ones. This reverses the wide-viewport suppression from #1042: if you explicitly watch a task, its status changes now notify you in a desktop Chrome tab just as they do on the phone and in the native desktop app.",
		"short": "Watch notifications now fire in Chrome"
	},
	{
		"date": "2026-07-23",
		"type": "fix",
		"slug": "skip-completion-warning-pr-review-tasks",
		"title": "Completing a PR-review task (created from an existing branch) no longer prompts about uncommitted, unpushed, or unmer...",
		"body": "Completing a PR-review task (created from an existing branch) no longer prompts about uncommitted, unpushed, or unmerged changes — that branch is someone else's work, not yours."
	},
	{
		"date": "2026-07-23",
		"type": "chore",
		"slug": "stream-resync-spike",
		"title": "Added an isolated stream-resync spike (src/bun/prototypes/stream-resync) proving a backend-neutral terminal sequencin...",
		"body": "Added an isolated stream-resync spike (src/bun/prototypes/stream-resync) proving a backend-neutral terminal sequencing rule: a reconnecting or slow client detects a gap in numbered output frames, recovers from one fresh snapshot, ignores duplicates and stale frames without looping, bounds its resync queue, and reconstructs state matching an uninterrupted ground-truth stream. Groundwork for the tmux-removal roadmap; no production code changed."
	},
	{
		"date": "2026-07-23",
		"type": "chore",
		"slug": "terminal-parity-corpus",
		"title": "Add a backend-neutral terminal parity corpus (MIG-001): a data-driven set of create/attach/input/resize/split/focus/c...",
		"body": "Add a backend-neutral terminal parity corpus (MIG-001): a data-driven set of create/attach/input/resize/split/focus/capture/reconnect/high-output/exit/cleanup scenarios plus negatives, classified as required parity or intentional tmux differences, with a test-only ParityRunner and a live e2e proving the current tmux backend satisfies it. Internal tmux-removal groundwork, isolated from production."
	},
	{
		"date": "2026-07-23",
		"type": "chore",
		"slug": "tmux-dependency-audit",
		"title": "Added a classified, machine-readable inventory of every remaining production tmux dependency under src/cli/tmux-audit...",
		"body": "Added a classified, machine-readable inventory of every remaining production tmux dependency under src/cli/tmux-audit (manifest + generated JSON/Markdown) plus a deterministic test that fails when a new unclassified tmux dependency appears. Tooling only — no production tmux code was changed. Roadmap item INT-008 of the tmux-removal track."
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "00-pr-mergeable-badge",
		"title": "Kanban task cards now show a PR mergeability badge (green \"Mergeable\" or a red reason such as Conflicts/Blocked/Behin...",
		"body": "Kanban task cards now show a PR mergeability badge (green \"Mergeable\" or a red reason such as Conflicts/Blocked/Behind) that replaces the old standalone CI badge; GitHub's merge-state already folds in failing and blocking checks, and the hover popover keeps the per-check breakdown.",
		"short": "PR mergeability badge on cards"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "01-swipe-dismiss-toasts",
		"title": "Toast notifications can now be dismissed with a rightward swipe (touch or mouse drag), in addition to the existing X ...",
		"body": "Toast notifications can now be dismissed with a rightward swipe (touch or mouse drag), in addition to the existing X button — flinging a toast off the right edge is especially handy on mobile. Below-threshold swipes snap back, and a completed drag no longer triggers a clickable toast's action.",
		"short": "Swipe toasts away"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "02-diff-send-to-agent",
		"title": "Added a Send to Agent action to the diff review export card",
		"body": "Added a Send to Agent action to the diff review export card. It sends the generated review XML directly to the task's live agent session while preserving clipboard copy as the primary action.",
		"short": "Send diff review to agent"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "03-manual-completion-controls",
		"title": "Adds per-task and global controls for merge completion suggestions, including an outcome-card merge prompt and agent-...",
		"body": "Adds per-task and global controls for merge completion suggestions, including an outcome-card merge prompt and agent-visible CLI changes.",
		"short": "Control merge completion prompts"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "04-artifact-download-filename",
		"title": "Artifact downloads are now named from the artifact title (sanitized) instead of the source HTML basename, so a titled...",
		"body": "Artifact downloads are now named from the artifact title (sanitized) instead of the source HTML basename, so a titled report saves as \"Q4 Revenue.zip\" rather than \"index.zip\". Falls back to the HTML file name when no usable title is present.",
		"short": "Name artifact download from title"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "05-update-popover-changelog",
		"title": "The update-ready popover now shows a short \"what's new\" preview for the incoming version — the top new features plus ...",
		"body": "The update-ready popover now shows a short \"what's new\" preview for the incoming version — the top new features plus a fix count — and links to the full Changelog screen. The Changelog screen itself was redesigned into a wider card-grid layout that fills the screen (entries grouped by date, laid out in responsive columns) where each entry is clickable to expand its full note (no more mid-sentence truncation). Changelog entries gained an optional short (≤6 word) title for the popover preview, embedded into the release update.json.",
		"short": "Changelog preview + page redesign"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "06-remote-tunnel-propagation-warning",
		"title": "Added a yellow warning note to the Remote Access modal that appears once the Cloudflare tunnel connects, reminding yo...",
		"body": "Added a yellow warning note to the Remote Access modal that appears once the Cloudflare tunnel connects, reminding you to give the domain a few seconds to propagate and to re-toggle the checkbox if the link still errors with \"domain not resolved\".",
		"short": "Remote tunnel propagation warning"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "07-mobile-backspace-key",
		"title": "Add a Backspace button to the mobile terminal key bar before the arrow controls so users can delete pasted prompt tex...",
		"body": "Add a Backspace button to the mobile terminal key bar before the arrow controls so users can delete pasted prompt text without a physical keyboard. Reorder the mobile controls so Escape, Enter, Backspace, and arrows come before the less frequently used Tab, Shift-Tab, and Control keys.",
		"short": "Mobile terminal Backspace key"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "08-inline-help-coverage-floor",
		"title": "Closed the inline-help coverage backlog: image/artifact viewers, the project shell, the add-project/spawn-agent/task-...",
		"body": "Closed the inline-help coverage backlog: image/artifact viewers, the project shell, the add-project/spawn-agent/task-detail/automation/send-later/bug-hunters modals, all four Project Settings tabs, the rate-limit and token-saving-proxy settings sections, the diff viewer's file list and PR-conversation block, and the inspector's notes and task-details all now carry help topics reachable in help mode. Added a coverage-floor guard (REQUIRED_HELP_SURFACES) so any future §5 surface must ship its help topic and zone or the test fails.",
		"short": "Help topics on more surfaces"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "09-update-popover-simulator",
		"title": "Add a dev-only \"Update Popover Preview\" tool under the View → Debug menu that simulates the update-ready popover's \"w...",
		"body": "Add a dev-only \"Update Popover Preview\" tool under the View → Debug menu that simulates the update-ready popover's \"what's new\" section for the next release. It reuses the exact release-time window logic against the local change-logs and git tags — counting uncommitted and untracked entries too — so a developer can see what will make it in before shipping. Shows the real popover 1:1 plus the raw payload and window diagnostics (previous tag, entries in window with a per-type breakdown, total entries, and squash-merged PR count since the tag). The update popover now shows up to 7 feature titles (was 5), and text selection across the app uses a themed accent highlight instead of the default browser blue. Changelog entries can also carry a two-digit priority prefix (`feature-NN-slug`, `00` = most prominent) that deterministically orders which features win the popover's limited slots, so hand-picked highlights lead and dev-only entries sink into \"+N more\".",
		"short": "Preview next-release update popover"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "account-picker-quota-cards",
		"title": "The \"Account for this launch\" picker (Spawn Agent, Launch Variants, Bug Hunters, and the Settings default switcher) n...",
		"body": "The \"Account for this launch\" picker (Spawn Agent, Launch Variants, Bug Hunters, and the Settings default switcher) now embeds a mini quota card in every account row: one severity-colored bar per rate-limit window (5h / 7d / monthly credits) with its percent and reset countdown, an \"∞ unlimited\" chip for unlimited plans, a \"no recent usage data\" note for idle accounts, and the \"captured X ago\" freshness note. No more spawning agents on a nearly exhausted account by accident.",
		"short": "See account quota before spawning"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "artifact-chart-printing",
		"title": "The artifact starter now demonstrates accessible SVG pie and radar charts alongside its area chart",
		"body": "The artifact starter now demonstrates accessible SVG pie and radar charts alongside its area chart. Printing preserves the selected light or dark theme, keeps chart colors visible, removes interactive controls, and compacts the report into a clean PDF layout.",
		"short": "Better artifact charts and PDFs"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "artifact-image-download",
		"title": "Right-clicking an image inside a shared HTML artifact now shows a \"Save image\" menu that saves the picture to your Do...",
		"body": "Right-clicking an image inside a shared HTML artifact now shows a \"Save image\" menu that saves the picture to your Downloads folder. Previously the browser's native context menu was blocked by the artifact sandbox, so saving an image did nothing or landed in an unclear location.",
		"short": "Save images from HTML artifacts"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "branch-merge-subtask-navigation",
		"title": "The task shown in the branch-merged completion prompt is now clickable",
		"body": "The task shown in the branch-merged completion prompt is now clickable. Opening it postpones the prompt and navigates to that task. The dev3 agent protocol now keeps tasks open until work is safely preserved in the required destination — usually a pull request merged into main, but also an external file, task note, shared artifact, or another explicit destination — unless the user directly requests completion."
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "bug-hunter-task-assignment",
		"title": "Spawning an in-task Bug Hunter now keeps the originating task assigned to its primary agent and configuration while r...",
		"body": "Spawning an in-task Bug Hunter now keeps the originating task assigned to its primary agent and configuration while recording the hunter on its own pane.",
		"short": "Preserve task assignment",
		"suggestedBy": "Capibara-",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1024",
		"issueRef": "#1024"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "bug-hunter-task-isolation",
		"title": "In-task Bug Hunters now receive an explicit read-only prompt guard before the normal dev3 session-start checklist",
		"body": "In-task Bug Hunters now receive an explicit read-only prompt guard before the normal dev3 session-start checklist. They may record confirmed findings as `[bug-hunt]` notes, but are told to leave the branch, task metadata, and lifecycle to the main agent.",
		"short": "Bug Hunter mutation guard",
		"suggestedBy": "Capibara-",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1024",
		"issueRef": "#1024"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "changelog-timeline-redesign",
		"title": "The Changelog screen is now a release-notes timeline: prominent feature cards with headlines, compact rows for fixes ...",
		"body": "The Changelog screen is now a release-notes timeline: prominent feature cards with headlines, compact rows for fixes and chores, a sticky date rail, full-text search, and type filters with counts. Long histories load incrementally as you scroll instead of rendering a thousand entries at once.",
		"short": "Redesigned Changelog screen"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "clickable-pr-conversation-row",
		"title": "Make the full pull request conversation header clickable for expanding and collapsing, while keeping resolved-thread,...",
		"body": "Make the full pull request conversation header clickable for expanding and collapsing, while keeping resolved-thread, refresh, and GitHub link controls independent.",
		"short": "Clickable PR conversation header"
	},
	{
		"date": "2026-07-22",
		"type": "refactor",
		"slug": "dedupe-merge-completion-prompt",
		"title": "Extracted a single shared offerMergeCompletion primitive so the \"Branch merged → complete the task?\" outcome-card pro...",
		"body": "Extracted a single shared offerMergeCompletion primitive so the \"Branch merged → complete the task?\" outcome-card prompt has one implementation instead of three drifted copies (the App-level merge-detection push handler and the task info-panel branch-status hook's poll and post-merge paths). The primitive owns the dialog copy, the project/task context card, fingerprint reserve/dismiss bookkeeping, the notify/suppress gate, cross-client de-dup and the manual opt-out; each caller keeps only its own completion side effect. No visible change — the dialog looks and behaves exactly as before."
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "dev-channel-update-crash",
		"title": "Manual \"Check for Updates\" no longer crashes on dev/source builds",
		"body": "Manual \"Check for Updates\" no longer crashes on dev/source builds. Electrobun's updater disables updates on the dev channel and left its state uninitialized, so the download step threw a TypeError; the dev channel now shows an informational notice instead of attempting a download.",
		"short": "Fix update crash on dev builds"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "devserver-ports-remote-beta-warning",
		"title": "In browser remote mode the Dev Server and Ports button tooltips now carry a yellow beta warning: both are tuned for l...",
		"body": "In browser remote mode the Dev Server and Ports button tooltips now carry a yellow beta warning: both are tuned for local use and still experimental over the tunnel, so they may fail to start or misbehave — use at your own risk while we keep polishing them.",
		"short": "Remote beta warning on dev server & ports"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "diagnostic-log-privacy",
		"title": "Diagnostic logs now redact task prompts, URLs, credentials, environment values, and command arguments while retaining...",
		"body": "Diagnostic logs now redact task prompts, URLs, credentials, environment values, and command arguments while retaining useful local failure details. Local daily logs are bounded to the current day plus 13 previous days, and logging or cleanup failures remain non-fatal.",
		"suggestedBy": "nadavsheinbein",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1069",
		"issueRef": "#1069"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "diff-send-to-agent-last-focused",
		"title": "The diff review's Send to Agent now routes to the agent pane you last focused, tracked per tmux session, instead of w...",
		"body": "The diff review's Send to Agent now routes to the agent pane you last focused, tracked per tmux session, instead of whatever pane happens to be active — so with several agents it follows the one you were working in and no longer misfires into a focused shell or dev-server split. Hover tooltips on the Send and Copy buttons and the review help card now explain where each sends.",
		"short": "Send review to last-focused agent"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "empty-task-pane-nav",
		"title": "The empty \"Select a task to see its terminal\" pane is no longer a dead end: on narrow (mobile) viewports it now redir...",
		"body": "The empty \"Select a task to see its terminal\" pane is no longer a dead end: on narrow (mobile) viewports it now redirects straight back to the Kanban board, and on desktop it shows a \"Back to Kanban\" button.",
		"short": "Empty task pane back to Kanban"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "github-env-token-auth",
		"title": "Fixed dev3's backend GitHub integration on machines authenticated only via a `GH_TOKEN` environment variable (e.g",
		"body": "Fixed dev3's backend GitHub integration on machines authenticated only via a `GH_TOKEN` environment variable (e.g. Coder workspaces with GitHub external-auth, common in `dev3 remote`). dev3 now reads such an account's token straight from the environment instead of `gh auth token --user`, which has no stored credential to return and failed with \"no oauth token found for … account …\" — so pasting a PR URL into New Task, PR/merge detection, PR comments, and the open-PR button all work again. Stored-account token resolution additionally neutralizes any ambient token env var so it can't override the requested account."
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "linux-install-issues",
		"title": "Polished the Linux + `dev3 remote` experience so dev3 runs cleanly on a fresh Linux box, fixing several issues hit wh...",
		"body": "Polished the Linux + `dev3 remote` experience so dev3 runs cleanly on a fresh Linux box, fixing several issues hit while installing via Homebrew. The brew formula now ships the artifact-template next to the binary, so launching a task no longer fails with \"Bundled dev3 artifact template not found\" (a missing template also degrades gracefully now instead of blocking task launch). Both `dev3 remote` and the header Remote Access button now wait until the Cloudflare tunnel is actually reachable end-to-end — not just announced — before showing the public URL + QR, so the link resolves the instant you open it instead of dead-ending on a cached DNS_PROBE_FINISHED_NXDOMAIN. The tunnel is now marked connected only once cloudflared's own /ready endpoint reports a live edge connection (the CLI also shows progress dots and the modal keeps its \"Starting tunnel…\" state until then). The AI install guide (ai-install.txt) documents `brew trust` as a required step on Homebrew 6.0+ and hands the `dev3 remote` run-step off to the user rather than having the installing agent start the server itself. Adding a Codex account from a headless/remote box now generates a `codex login --device-auth` command (browser-less device flow) instead of the browser-only `codex login`, which is a dead end without a local browser. Finally, `dev3 remote` now ensures `~/.dev3.0/bin/dev3` points at the running binary on startup — on a headless box that path was never maintained, so agent lifecycle hooks failed with `.../.dev3.0/bin/dev3: not found` and tasks couldn't move status automatically.",
		"short": "dev3 remote on Linux"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "manual-merge-notification",
		"title": "Tasks marked “I’ll complete it myself” no longer show a merge notification when their branch is detected as merged",
		"body": "Tasks marked “I’ll complete it myself” no longer show a merge notification when their branch is detected as merged. The global setting that disables completion suggestions still shows its informational merge toast."
	},
	{
		"date": "2026-07-22",
		"type": "chore",
		"slug": "native-host-crash-recovery",
		"title": "The isolated native-session harness now proves deterministic host-crash cleanup, fail-closed journal and parser persi...",
		"body": "The isolated native-session harness now proves deterministic host-crash cleanup, fail-closed journal and parser persistence, lock-serialized token-matched recovery, and same-ID restart across the pinned Windows, macOS, and Linux Bun 1.3.14 matrix without invoking tmux."
	},
	{
		"date": "2026-07-22",
		"type": "chore",
		"slug": "native-live-parser-proof",
		"title": "Proved that the isolated native-session host can maintain a real Ghostty terminal screen while Bun.Terminal streams o...",
		"body": "Proved that the isolated native-session host can maintain a real Ghostty terminal screen while Bun.Terminal streams output: the terminal data callback now only enqueues raw bytes into a byte-capped queue and parsing runs on a deferred event-loop task, avoiding the Bun 1.3.14 Windows negative WASM allocation-pointer failure (preserved as a runnable regression probe). Parser-generated DSR/DA replies are written back to the same PTY so interactive TUIs keep working, and a fresh client reconstructs the same semantic screen after detach from a bounded, versioned parser-state snapshot with explicit overflow and failure verdicts. Opt-in and additive: the default host, protocol v1, production terminals, tmux, and persisted project/task data are unchanged."
	},
	{
		"date": "2026-07-22",
		"type": "chore",
		"slug": "native-multi-client-ownership",
		"title": "Added an isolated native-terminal writer/observer model with atomic replay-to-live attach, atomic takeover, writer-on...",
		"body": "Added an isolated native-terminal writer/observer model with atomic replay-to-live attach, atomic takeover, writer-only PTY input and resize, cross-platform focused tests, and a real Windows two-client lifecycle proof. Production terminal, RPC, UI, persisted project/task state, and tmux behavior remain unchanged."
	},
	{
		"date": "2026-07-22",
		"type": "chore",
		"slug": "native-registry-e2e-ci",
		"title": "Wire the native-session registry lifecycle E2E (test:native-registry-e2e) into the Packaged Bun runtime workflow so i...",
		"body": "Wire the native-session registry lifecycle E2E (test:native-registry-e2e) into the Packaged Bun runtime workflow so it runs on native Windows and POSIX with the pinned Bun 1.3.14. Dev-internal CI only; no product behavior changes."
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "native-registry-win-token",
		"title": "Harden the native-session registry ownership check so a missing or malformed per-session token on Windows returns a \"...",
		"body": "Harden the native-session registry ownership check so a missing or malformed per-session token on Windows returns a \"reused\" verdict instead of throwing and aborting the whole list/cleanup sweep. Caught by the newly CI-wired Windows lifecycle E2E; dev-internal, no product behavior changes."
	},
	{
		"date": "2026-07-22",
		"type": "chore",
		"slug": "native-session-protocol-v1",
		"title": "Froze the isolated native-session registry's loopback transport as a deliberately small local protocol v1: a version-...",
		"body": "Froze the isolated native-session registry's loopback transport as a deliberately small local protocol v1: a version-agnostic hello handshake that answers a mismatched client with one explicit version-mismatch error, request ids only on the hello and status request/response pairs, one compact error shape, and an oversized-frame guard — all leaving the host and shell alive. The existing per-session token check, tmux-backed production terminals, and persisted project/task data are unchanged; the module stays out of the production import graph."
	},
	{
		"date": "2026-07-22",
		"type": "chore",
		"slug": "native-session-registry",
		"title": "Added a persistent, multi-session native-terminal registry (dev-internal groundwork for the tmux-removal roadmap): st...",
		"body": "Added a persistent, multi-session native-terminal registry (dev-internal groundwork for the tmux-removal roadmap): start/list/status/attach/stop several detached native sessions by stable id, with restart reattach, per-session start locking, passive stale/reused-PID detection, and token-matched cleanup. It is an additive parallel namespace under ~/.dev3.0/native-sessions/ and is not wired into any production UI, CLI, RPC, or tmux flow."
	},
	{
		"date": "2026-07-22",
		"type": "chore",
		"slug": "native-windows-shell-launch-matrix",
		"title": "Added a registry-only native Windows shell launch proof for Windows PowerShell 5.1, PowerShell 7, and cmd.exe, with e...",
		"body": "Added a registry-only native Windows shell launch proof for Windows PowerShell 5.1, PowerShell 7, and cmd.exe, with explicit executable/argv/cwd/environment descriptors, exact exit and lifecycle verdicts, optional Git Bash/WSL detection, and a Bun 1.3.14 CI runner. The runner handles duplicate PATH applications, rejects uncontainable Store/MSIX PowerShell launches while accepting an explicit MSI/ZIP executable, normalizes PowerShell 5.1 WSL output, waits for bounded Job-owned child teardown, and preserves embedded quotes through each shell's native argument rules; the checked-in Windows x64 verdict proves every required lifecycle assertion while production tmux terminals, UI, RPC, settings, and persisted project/task data remain unchanged."
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "preparation-cancellation-race",
		"title": "Cancelling a task during preparation now waits up to 10 seconds for Git and setup processes to exit before best-effor...",
		"body": "Cancelling a task during preparation now waits up to 10 seconds for Git and setup processes to exit before best-effort cleanup, and startup safely removes abandoned `locked initializing` worktrees without touching active task worktrees.",
		"short": "Reliable preparation cancellation",
		"suggestedBy": "nadavsheinbein",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1071",
		"issueRef": "#1071"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "quota-panel-all-accounts",
		"title": "The agent rate-limit panel now keeps every Claude/Codex account used in the last 7 days instead of dropping them afte...",
		"body": "The agent rate-limit panel now keeps every Claude/Codex account used in the last 7 days instead of dropping them after a day, and a managed account no longer overwrites another's data in the shared dump — so switching accounts stops making earlier ones vanish. Each account card shows a \"captured X ago\" note (highlighted when stale) so you can tell how fresh its rate-limit reading is.",
		"short": "See every account's quota for a week"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "quota-panel-usage-bars",
		"title": "The agent rate-limit indicator's hover panel is now a real quota dashboard: one card per Claude/Codex account with a ...",
		"body": "The agent rate-limit indicator's hover panel is now a real quota dashboard: one card per Claude/Codex account with a usage bar per limit window (5h, 7d, monthly credits), reset countdowns, plan badges, and an \"∞ unlimited\" chip for unlimited-credit accounts. The header pill stacks one mini usage bar per account (up to four) so every account's state is visible at a glance, and unlimited accounts read \"∞ unlimited\" with a full green line instead of a misleading 0%.",
		"short": "Per-account quota panel with usage bars"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "remote-notification-click",
		"title": "Remote Chrome notifications no longer reuse the task ID as a browser notification tag, preventing Chrome from replaci...",
		"body": "Remote Chrome notifications no longer reuse the task ID as a browser notification tag, preventing Chrome from replacing a notification across remote tabs and dropping its click-to-open handler."
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "remote-status-notification-noise",
		"title": "Wide remote clients no longer show watched-task status-change notifications; narrow remote viewports still receive th...",
		"body": "Wide remote clients no longer show watched-task status-change notifications; narrow remote viewports still receive them for mobile workflows. Other remote notifications and desktop-native notifications are unchanged."
	},
	{
		"date": "2026-07-22",
		"type": "refactor",
		"slug": "task-lifecycle-state-machine",
		"title": "Centralized task activation, preparation, column moves, teardown, and git watchers behind a per-task lifecycle state ...",
		"body": "Centralized task activation, preparation, column moves, teardown, and git watchers behind a per-task lifecycle state machine with declared effects and crash recovery. Runtime hints are persisted additively and reconciled with worktree and tmux reality at startup."
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "task-list-alias",
		"title": "`dev3 task list` now works as an alias for the plural `dev3 tasks list` instead of failing with \"Unknown subcommand\",...",
		"body": "`dev3 task list` now works as an alias for the plural `dev3 tasks list` instead of failing with \"Unknown subcommand\", so the common mistype just does the right thing.",
		"short": "`dev3 task list` now works"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "toast-dismiss-button",
		"title": "Fixed toast close-button handling after swipe support was added",
		"body": "Fixed toast close-button handling after swipe support was added. Pressing the dismiss button no longer starts card pointer capture, while message-body swipes remain available.",
		"short": "Toast dismiss button works"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "unlimited-artifact-history",
		"title": "Removed the per-task cap on retained HTML artifacts, so `dev3 show-artifact` keeps the full history instead of deleti...",
		"body": "Removed the per-task cap on retained HTML artifacts, so `dev3 show-artifact` keeps the full history instead of deleting the oldest entry after 20. Per-artifact size and image safeguards remain unchanged.",
		"short": "Unlimited artifact history"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "update-popover-changelog-ci",
		"title": "The update-ready popover's \"what's new\" list is now populated on real updates, and GitHub Release pages now include a...",
		"body": "The update-ready popover's \"what's new\" list is now populated on real updates, and GitHub Release pages now include a full grouped changelog (Features, Fixes, Refactors). The release pipeline checked out the repo shallow and without tags, so the changelog window could not be computed and shipped empty (v1.38.0 users saw a bare popover); release jobs now fetch full history and tags.",
		"short": "Update popover now lists what's new"
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "update-toast-changelog",
		"title": "The auto-shown \"update ready\" toast now includes the same \"what's new\" feature list as the header dropdown; previousl...",
		"body": "The auto-shown \"update ready\" toast now includes the same \"what's new\" feature list as the header dropdown; previously it showed only the version and restart button, so the changelog preview was easy to miss.",
		"short": "Update toast now lists what's new"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "windows-detached-pty-containment",
		"title": "The isolated detached-PTY tracer now contains native Windows shells and all descendants in a kill-on-close Job Object",
		"body": "The isolated detached-PTY tracer now contains native Windows shells and all descendants in a kill-on-close Job Object. Stop gracefully requests exit, then forcefully removes the selected tree, endpoint, handles, and metadata without touching tmux; the native regression synchronizes with each PowerShell prompt before checking shell state and ownership."
	},
	{
		"date": "2026-07-22",
		"type": "chore",
		"slug": "windows-replay-matrix-spike",
		"title": "Added runnable Windows shell/agent capture-replay tooling to the terminal-state spike (STATE-004): a scripted live-PT...",
		"body": "Added runnable Windows shell/agent capture-replay tooling to the terminal-state spike (STATE-004): a scripted live-PTY capture, a static non-Ghostty terminal-query responder, an offline replay verifier, and a fail-closed sanitizer, driven by a single Windows runner for cmd.exe, PowerShell 7, Claude, and Codex. Evidence is sanitized (shells as fixtures when clean, agents as hashes plus metrics) and the work stays outside the production import graph."
	},
	{
		"date": "2026-07-22",
		"type": "fix",
		"slug": "worktree-removal-recovery",
		"title": "Task completion and cancellation now report Git worktree removal failures instead of clearing the worktree path and b...",
		"body": "Task completion and cancellation now report Git worktree removal failures instead of clearing the worktree path and branch, preserving teardown state for retry or manual cleanup.",
		"short": "Failed cleanups stay recoverable",
		"suggestedBy": "nadavsheinbein",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/1070",
		"issueRef": "#1070"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "60-slimmer-header-controls",
		"title": "The global header got ~125px slimmer: the prevent-sleep toggle is now icon-only with a new metaphor (grey sleeping z'...",
		"body": "The global header got ~125px slimmer: the prevent-sleep toggle is now icon-only with a new metaphor (grey sleeping z's when sleep is allowed, an awake orange eye while the machine is kept awake, plus a mini lock badge when remote access forces it on), the agent rate-limit pill dropped its hourglass icon and leads with the per-account usage bars, and the Remote Access button dropped its text label leaving just the QR icon.",
		"short": "Slimmer top bar controls"
	},
	{
		"date": "2026-07-22",
		"type": "feature",
		"slug": "95-native-pane-layout-lab",
		"title": "Added an isolated deterministic SplitTree and debug-only fake-terminal lab to prove multi-pane layout, responsive nav...",
		"body": "Added an isolated deterministic SplitTree and debug-only fake-terminal lab to prove multi-pane layout, responsive navigation, stable pane identity, and cleanup behavior without changing production terminal handling. Fake streams cap replay buffers and report timers and subscriptions before and after scripted stress so cleanup is measurable.",
		"short": "Native pane layout feasibility lab"
	},
	{
		"date": "2026-07-21",
		"type": "fix",
		"slug": "claude-bypass-permission-prompt",
		"title": "Claude sessions launched by dev3 no longer show the one-time \"bypass permissions\" confirmation on startup — dev3 now ...",
		"body": "Claude sessions launched by dev3 no longer show the one-time \"bypass permissions\" confirmation on startup — dev3 now injects skipDangerousModePermissionPrompt into the managed Claude settings for every session, including when rate-limit tracking is off.\r\n\r\nReported by Ted Kostylev",
		"short": "No more bypass-permission prompt"
	},
	{
		"date": "2026-07-21",
		"type": "fix",
		"slug": "remote-button-first-click",
		"title": "Fixed the header Remote (QR) button needing several clicks to open",
		"body": "Fixed the header Remote (QR) button needing several clicks to open. It now shows the QR modal instantly on the first click and brings the public Cloudflare tunnel up in the background, instead of blocking the open on the tunnel handshake (which could freeze the button for up to ~35s when cloudflared was installed).",
		"short": "Remote button opens on first click"
	},
	{
		"date": "2026-07-21",
		"type": "fix",
		"slug": "remote-completion-sound-desktop-chrome",
		"title": "Fixed the task-completion sound not playing in remote mode on desktop Chrome (it worked on mobile)",
		"body": "Fixed the task-completion sound not playing in remote mode on desktop Chrome (it worked on mobile). The sound now primes its audio element on the first user gesture and reuses that primed element, so the delayed completion push is honored by the desktop autoplay policy.",
		"short": "Completion sound in desktop Chrome"
	},
	{
		"date": "2026-07-21",
		"type": "feature",
		"slug": "task-relations-foundation",
		"title": "Added a forward-compatible task relation model with typed `blocked-by` and `relates-to` links",
		"body": "Added a forward-compatible task relation model with typed `blocked-by` and `relates-to` links. New and migrated tasks persist an empty relation collection, older-reader updates preserve it, and existing UI and integrations remain unchanged."
	},
	{
		"date": "2026-07-21",
		"type": "chore",
		"slug": "terminal-state-snapshot-spike",
		"title": "Add an isolated terminal-state spike using Ghostty headless parsing, versioned output/resize journals, golden replay ...",
		"body": "Add an isolated terminal-state spike using Ghostty headless parsing, versioned output/resize journals, golden replay fixtures, real Neovim and Windows PowerShell captures, and bounded macOS/Windows benchmarks. It keeps raw PTY capture independent from live parser runtime quirks, remains outside production imports, fails closed if the installed parser drifts from the snapshot identity, and does not change tmux-backed behavior."
	},
	{
		"date": "2026-07-21",
		"type": "chore",
		"slug": "windows-conpty-runtime-delivery",
		"title": "Pinned the packaged Electrobun runtime to Bun 1.3.14 on every platform and added a native Windows package proof that ...",
		"body": "Pinned the packaged Electrobun runtime to Bun 1.3.14 on every platform and added a native Windows package proof that stages the bundled runtime under an updater-safe host name, re-enters it detached, reattaches to the same PIDs, and starts PowerShell through raw Bun.Terminal with no system Bun. The isolated tracer verifies clean shutdown and reports actionable runtime incompatibilities; production tmux behavior remains unchanged. Runtime guards accept Windows 8.3 aliases only for the same file and confirm PTY readiness from callback output before tasklist validates the shell PID, without injecting a startup command."
	},
	{
		"date": "2026-07-20",
		"type": "feature",
		"slug": "completion-dialog-project-context",
		"title": "Every task completion / branch-merged confirm dialog now shows the full task context — task id, project name, priorit...",
		"body": "Every task completion / branch-merged confirm dialog now shows the full task context — task id, project name, priority, labels and overview — so you always know which project a session-destroying prompt belongs to, even when it fires while you are on another board. This covers the agent completion request, the branch-merged prompt (both the background poller and the info-panel merge check), and the manual complete/cancel warning, all sharing one context card.",
		"short": "Task context in confirm dialogs"
	},
	{
		"date": "2026-07-20",
		"type": "chore",
		"slug": "detached-pty-prototype",
		"title": "Added an isolated spike (src/bun/prototypes/detached-pty/) proving a detached Bun process can own one Bun.Terminal sh...",
		"body": "Added an isolated spike (src/bun/prototypes/detached-pty/) proving a detached Bun process can own one Bun.Terminal shell while short-lived clients disconnect and reattach to the same live shell over loopback TCP, with an explicit stop that terminates the owned process tree and removes its metadata. Fully additive groundwork for the tmux-removal roadmap: nothing in the app or CLI imports it, it never touches tmux, pty-server, or existing terminal flows, and a real-Bun integration test (bun run test:proto-e2e) proves the tracer never invokes tmux.",
		"short": "Detached-PTY ownership spike"
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "diff-comment-split-crash",
		"title": "Prevented Diff View from crashing in split mode when a persisted inline comment exists on only one side of a row",
		"body": "Prevented Diff View from crashing in split mode when a persisted inline comment exists on only one side of a row. Split rows and reopened reviews now tolerate the diff library's empty counterpart payload.",
		"short": "Diff View split-mode crash fixed"
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "kanban-unresolved-comments-link",
		"title": "Make unresolved PR comment counts on Kanban cards open the selected task's branch diff and focus the first unresolved...",
		"body": "Make unresolved PR comment counts on Kanban cards open the selected task's branch diff and focus the first unresolved review thread, honoring the user's split or fullscreen task-open preference.",
		"short": "PR comment counts open the diff"
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "launch-modal-default-config-mismatch",
		"title": "Fixed the Launch Task modal preselecting a broken default when the saved global default config belonged to a differen...",
		"body": "Fixed the Launch Task modal preselecting a broken default when the saved global default config belonged to a different provider than the default provider (which left the Mode field empty and the launch inert). The picker now falls back to the provider's own default, matching the Spawn Agent and Bug Hunters surfaces.",
		"short": "Launch modal default config fixed"
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "mobile-actions-sheet-close-on-images",
		"title": "Fixed the mobile Task actions sheet staying open after tapping the Images row — it now closes as it already did for t...",
		"body": "Fixed the mobile Task actions sheet staying open after tapping the Images row — it now closes as it already did for the Artifacts row, so the image viewer opens on a clean surface.",
		"short": "Mobile actions sheet closes on tap"
	},
	{
		"date": "2026-07-20",
		"type": "feature",
		"slug": "mobile-image-pinch-zoom",
		"title": "The shared-image lightbox now supports pinch-to-zoom and drag-to-pan with touch, plus double-tap and ctrl-wheel to zo...",
		"body": "The shared-image lightbox now supports pinch-to-zoom and drag-to-pan with touch, plus double-tap and ctrl-wheel to zoom, so images surfaced via `dev3 show-image` are usable on small mobile screens.",
		"short": "Pinch-to-zoom in image lightbox"
	},
	{
		"date": "2026-07-20",
		"type": "feature",
		"slug": "mobile-shift-tab-key",
		"title": "Added a ⇧Tab button to the mobile terminal extra key bar, next to Tab",
		"body": "Added a ⇧Tab button to the mobile terminal extra key bar, next to Tab. It sends the back-tab escape sequence (ESC [ Z), which lets you cycle Claude Code's agent/permission mode from a phone where Shift+Tab cannot be typed.",
		"short": "Mobile terminal ⇧Tab button"
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "remote-active-tasks-sidebar-wide-viewport",
		"title": "Fix the active-tasks split view disappearing in remote (browser) mode on wide screens: the task workspace now shows t...",
		"body": "Fix the active-tasks split view disappearing in remote (browser) mode on wide screens: the task workspace now shows the ActiveTasksSidebar/SplitLayout whenever the viewport is wide (≥768px), whether desktop or remote, and only hides it on narrow mobile viewports.",
		"short": "Split view on wide remote screens"
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "remote-http-clipboard-copy",
		"title": "Terminal copy now works in remote mode served over plain http: when the browser hides the async clipboard API (insecu...",
		"body": "Terminal copy now works in remote mode served over plain http: when the browser hides the async clipboard API (insecure context), the OSC 52 payload is written through a legacy execCommand fallback instead of being silently dropped. Also explicitly pinned the default tmux mouse-copy binding so already-running tmux servers pick up the #991 revert on config re-source instead of keeping the stale sticky copy-mode binding.",
		"short": "Terminal copy over plain HTTP"
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "remote-merged-popup-sync",
		"title": "Fixed the \"Branch Merged\" completion popup lingering on the desktop app after it was accepted or declined from the re...",
		"body": "Fixed the \"Branch Merged\" completion popup lingering on the desktop app after it was accepted or declined from the remote browser. The dialog now closes on every connected client once the prompt is resolved anywhere — accepting broadcasts the task completion, and declining broadcasts a new merge-prompt-resolved event."
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "remote-multiline-paste-early-submit",
		"title": "Fixed multi-line paste (Ctrl+V) in the browser/remote terminal submitting after the first line — most visible on Wind...",
		"body": "Fixed multi-line paste (Ctrl+V) in the browser/remote terminal submitting after the first line — most visible on Windows where the clipboard carries CRLF. Text pastes now always route through ghostty's bracketed-paste path with newlines normalized to CR, instead of falling onto ghostty's raw container-focus paste handler.",
		"short": "Multi-line paste in remote terminal"
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "revert-tmux-copy-mode-retention",
		"title": "Mouse-copying terminal text no longer leaves the pane stuck in tmux scroll/copy mode",
		"body": "Mouse-copying terminal text no longer leaves the pane stuck in tmux scroll/copy mode. Reverted the copy-mode retention behavior so a mouse copy cancels copy-mode immediately and the terminal stays live — no more stray cursor jumps or having to press Escape after every copy. Copied text still reaches the clipboard. As a trade-off, copying older scrollback again snaps the viewport to live output; the underlying issue #978 is reopened to be solved a different way.",
		"short": "Mouse-copy exits tmux copy mode"
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "strip-claude-mouse-env",
		"title": "Strip the user-global CLAUDE_CODE_DISABLE_MOUSE_CLICKS environment variable at startup so it never propagates into de...",
		"body": "Strip the user-global CLAUDE_CODE_DISABLE_MOUSE_CLICKS environment variable at startup so it never propagates into dev3's tmux panes. When set by users it disabled Claude Code's mouse handling and broke click/drag text selection (copy) inside managed terminals; dev3 now neutralizes it for every spawned process.",
		"short": "Strip Claude mouse-disable env var"
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "task-search-substring",
		"title": "Fixed the Kanban filter bar and Active Tasks sidebar matching almost every task for short or numeric queries",
		"body": "Fixed the Kanban filter bar and Active Tasks sidebar matching almost every task for short or numeric queries. Free-text search now requires each typed word to literally occur in a task's title or description (substring, any order) instead of a loose fuzzy subsequence, so a query like \"1172\" finds the task you meant rather than everything with those digits scattered around.",
		"short": "Sharper task search matching"
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "terminal-click-exit-copy-mode",
		"title": "Terminal input now resumes without Escape after copying text: a plain terminal click exits retained tmux copy mode, a...",
		"body": "Terminal input now resumes without Escape after copying text: a plain terminal click exits retained tmux copy mode, and Back to Terminal restores focus after selecting text in Diff. Scrollback selection still preserves the viewport instead of jumping to live output.",
		"short": "Terminal input resumes after copy"
	},
	{
		"date": "2026-07-20",
		"type": "feature",
		"slug": "terminal-cmdf-search",
		"title": "Press ⌘F (Ctrl+F on Linux) in any terminal to search its tmux scrollback: a floating bar opens over the pane, matches...",
		"body": "Press ⌘F (Ctrl+F on Linux) in any terminal to search its tmux scrollback: a floating bar opens over the pane, matches highlight natively in the terminal, Enter/↑ steps to older matches and Shift+Enter/↓ back to newer ones, with a live match counter. Esc closes the bar and returns the pane to live output. Search runs in the focused pane; when the terminal is split, the searched pane gets an accent frame so it's clear where matches come from — click another pane and press ⌘F again to search it.",
		"short": "⌘F search in terminal scrollback"
	},
	{
		"date": "2026-07-20",
		"type": "fix",
		"slug": "terminal-viewport-fit-race",
		"title": "Fixed the terminal not filling the full viewport height on first load in remote/browser mode (a large empty area appe...",
		"body": "Fixed the terminal not filling the full viewport height on first load in remote/browser mode (a large empty area appeared below tmux). The terminal now keeps its own persistent resize observer and re-fits via term.resize, instead of handing off to ghostty's FitAddon.observeResize whose callback was dropped during the 50ms window fit() opens — the exact window the container's final layout growth landed in on a fresh browser load.",
		"short": "Terminal fills viewport on load"
	},
	{
		"date": "2026-07-19",
		"type": "feature",
		"slug": "claude-allow-bypass-flag",
		"title": "Claude sessions now always launch with --allow-dangerously-skip-permissions, so the dangerous bypass mode is availabl...",
		"body": "Claude sessions now always launch with --allow-dangerously-skip-permissions, so the dangerous bypass mode is available to toggle into (Shift+Tab) from any preset without being enabled by default. The flag is injected once by the claude adapter unless a bypass flag is already present, so it is never duplicated on top of the hard --dangerously-skip-permissions carried by Bypass/Accept-Edits presets. The Default presets no longer carry the hard bypass flag, so \"Default\" now opens in Claude's normal permission mode (bypass available but off) instead of full bypass; their versions were bumped so already-onboarded users get the corrected behaviour."
	},
	{
		"date": "2026-07-19",
		"type": "feature",
		"slug": "clone-progress-output",
		"title": "The Add Project → Clone from URL modal now shows live `git clone` output while cloning: a terminal-style box displays...",
		"body": "The Add Project → Clone from URL modal now shows live `git clone` output while cloning: a terminal-style box displays the last four progress lines (remote counting, receiving objects, resolving deltas), so large repository clones are no longer a silent \"Cloning…\" button. Clone failures also report a clean terminal-style error tail instead of raw progress spam.",
		"short": "Live output when cloning repos"
	},
	{
		"date": "2026-07-19",
		"type": "fix",
		"slug": "copy-button-feedback",
		"title": "The Remote Access modal now gives immediate visual feedback after copying its URL: the button briefly switches to a g...",
		"body": "The Remote Access modal now gives immediate visual feedback after copying its URL: the button briefly switches to a green success state with a checkmark and localized “URL copied” label."
	},
	{
		"date": "2026-07-19",
		"type": "feature",
		"slug": "mobile-composer-attach",
		"title": "Mobile attachments: the touch key bar next to the terminal composer now has a paperclip button that opens the OS phot...",
		"body": "Mobile attachments: the touch key bar next to the terminal composer now has a paperclip button that opens the OS photo/file picker and drops the uploaded worktree path into the draft (or straight onto the prompt in raw mode), and pasting an image from the phone clipboard into the composer uploads it the same way. The New Task modal gained the same attach button next to the Description label in browser mode, and clipboard pastes carrying files now upload directly instead of reading the app host's clipboard."
	},
	{
		"date": "2026-07-19",
		"type": "fix",
		"slug": "mobile-diff-badge-branch-status",
		"title": "Fixed the mobile task view never showing the diff summary badge (\"N files +X −Y\") in the summary bar: branch status w...",
		"body": "Fixed the mobile task view never showing the diff summary badge (\"N files +X −Y\") in the summary bar: branch status was only fetched by the desktop git bar, which does not render on narrow viewports. The narrow TaskInfoPanel now owns a single branch-status instance that drives the badge, restores the merge-completion prompt on mobile, and pre-loads the git actions sheet so Rebase/Push/Create PR rows no longer flash \"Loading branch status\" on open. Also reworked the cramped diff-viewer header on phones — a slim pinned row (back, title with inline ±stats, search, files) while the mode/filter row scrolls away with the content and search opens as a full-width row — plus the task summary bar now wraps so wide diff counters stay tappable, and long file paths in the diff render as one truncating line instead of a multi-row wrap. Added a discovery tip pointing at the mobile ⋮ menu's Git section.",
		"short": "Mobile diff summary badge fixed"
	},
	{
		"date": "2026-07-19",
		"type": "fix",
		"slug": "mobile-pr-checks-bottom-sheet",
		"title": "On phones, tapping a PR/CI/review badge on a kanban card (or the PR row in the task inspector) now opens the PR statu...",
		"body": "On phones, tapping a PR/CI/review badge on a kanban card (or the PR row in the task inspector) now opens the PR status and checks in a full-width bottom sheet with an explicit \"Open PR\" link, instead of the tiny hover popover that also navigated away to GitHub. Desktop hover behavior is unchanged.",
		"short": "Mobile PR/CI badge bottom sheet"
	},
	{
		"date": "2026-07-19",
		"type": "fix",
		"slug": "pr-review-diff-base",
		"title": "Fixed the branch diff, ahead/behind status, and rebase/merge base for PR-review and other tasks created on an existin...",
		"body": "Fixed the branch diff, ahead/behind status, and rebase/merge base for PR-review and other tasks created on an existing branch. These tasks stored the checked-out branch as their base branch, so the diff compared the branch against itself and showed \"No changes to show\"; the comparison now falls back to the project's base branch and shows the branch's actual changes.",
		"short": "Correct diff base for PR review"
	},
	{
		"date": "2026-07-19",
		"type": "feature",
		"slug": "pr-review-threads-diff-viewer",
		"title": "The diff viewer now shows the task PR's GitHub review threads inline on their diff lines (branch mode) and a collapsi...",
		"body": "The diff viewer now shows the task PR's GitHub review threads inline on their diff lines (branch mode) and a collapsible Conversation block with the PR's top-level comments — read-only, markdown-rendered, with deep links to GitHub and a show-resolved toggle. Threads that no longer match the rendered diff collapse into per-file \"Outdated\" groups instead of disappearing, each thread has a \"Send to agent\" button that types a fix prompt into the task terminal, and threads can be opted into the XML review export alongside your own inline comments with an origin marker. The \"N unresolved comments\" row in the PR status popover is now a deep link that opens the branch diff and scrolls to the first unresolved review thread.",
		"short": "PR review threads in diff viewer"
	},
	{
		"date": "2026-07-19",
		"type": "fix",
		"slug": "remove-remote-active-task-strip",
		"title": "Remove the persistent browser-only active-task strip so remote task workspaces keep the terminal full-width without t...",
		"body": "Remove the persistent browser-only active-task strip so remote task workspaces keep the terminal full-width without the distracting horizontal scrollbar; existing task-switcher and breadcrumb navigation remain available.",
		"short": "Remove remote active-task strip"
	},
	{
		"date": "2026-07-19",
		"type": "fix",
		"slug": "stable-task-id-across-launch",
		"title": "Task ids are now stable across launches: launching a To Do task (Launch Variants, scheduled launch) transforms it in ...",
		"body": "Task ids are now stable across launches: launching a To Do task (Launch Variants, scheduled launch) transforms it in place into variant #1 instead of deleting it and re-creating every variant under a fresh id, so the id printed by `dev3 task create` never dangles. The CLI additionally accepts a stable `--task seq:<N>` reference everywhere a task id is expected, and \"Task not found\" errors now explain that older launched ids may have been re-keyed and point at `dev3 tasks list`."
	},
	{
		"date": "2026-07-19",
		"type": "fix",
		"slug": "stale-pr-badge-task-switch",
		"title": "Fixed the task header showing the previously viewed task's PR badge (number, unresolved comment count, CI/review popo...",
		"body": "Fixed the task header showing the previously viewed task's PR badge (number, unresolved comment count, CI/review popover) after switching tasks. The git bar component is reused across task switches and kept the last pushed PR status in memory, so a task without its own PR displayed the stale badge indefinitely; the pushed status is now cleared on every task switch.",
		"short": "Correct PR badge on task switch"
	},
	{
		"date": "2026-07-19",
		"type": "fix",
		"slug": "terminal-scrollback-viewport",
		"title": "Mouse-drag copying in tmux now keeps the terminal at the current scrollback position instead of exiting copy-mode and...",
		"body": "Mouse-drag copying in tmux now keeps the terminal at the current scrollback position instead of exiting copy-mode and jumping to live output. The copied selection still clears, and OSC 52 clipboard delivery is unchanged.",
		"suggestedBy": "DolevSol",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/978",
		"issueRef": "#978"
	},
	{
		"date": "2026-07-19",
		"type": "feature",
		"slug": "web-favicon",
		"title": "The web/remote interface now shows a favicon using the new dev3 app icon, so the browser tab and bookmarks display th...",
		"body": "The web/remote interface now shows a favicon using the new dev3 app icon, so the browser tab and bookmarks display the dev3 logo instead of a blank globe. Added 16/32/256px PNG icons plus an apple-touch-icon, generated from the app iconset and served from the Vite public directory."
	},
	{
		"date": "2026-07-18",
		"type": "refactor",
		"slug": "deep-tmux-client",
		"title": "Consolidated every tmux interaction behind a typed TmuxClient module (src/bun/tmux/): all 63 raw tmux spawn sites, 5 ...",
		"body": "Consolidated every tmux interaction behind a typed TmuxClient module (src/bun/tmux/): all 63 raw tmux spawn sites, 5 output parsers, 3 separator conventions and inline dev3-* session naming collapsed into one client with typed subcommand methods, declarative -F formats and a reverse session-name parser. The tmux-3.6 binary/shim selection moved inside the module verbatim, so bypassing it is no longer reachable by construction; the renderer↔pty resize protocol got a single shared encoder/parser. Pure refactor — terminals, splits, dev servers and alt-click behave exactly as before, now with unit and live-tmux e2e coverage."
	},
	{
		"date": "2026-07-17",
		"type": "docs",
		"slug": "new-task-branch-prefill-help",
		"title": "Added an inline help (i) icon next to the branch field in the New Task dialog that explains why a branch is prefilled...",
		"body": "Added an inline help (i) icon next to the branch field in the New Task dialog that explains why a branch is prefilled from the project's currently checked-out branch (so small tasks stack onto a big feature) and how clearing the field falls back to the default base branch, and reworded the branch tip to match. Evolved the inline-help doctrine on top of that: help coverage is now owed (every surface and non-self-evident field must be reachable in help mode), every HelpSpot auto-registers as a help-mode zone so inline help always correlates with the (?) overlay, a new test guards dangling/orphan help ids, and the silently lost help topics for the Tasks & Board, Terminal, System, and Accounts settings categories plus the header rate-limit indicator were restored.",
		"suggestedBy": "OrenZak",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/979",
		"issueRef": "#979"
	},
	{
		"date": "2026-07-16",
		"type": "feature",
		"slug": "bundle-tmux-macos",
		"title": "macOS releases now bundle a self-contained pinned tmux 3.6a (statically linked libevent_core and utf8proc, only OS li...",
		"body": "macOS releases now bundle a self-contained pinned tmux 3.6a (statically linked libevent_core and utf8proc, only OS libraries otherwise) inside both the app bundle and the CLI tarball, so DMG and in-app-updater installs work without Homebrew or Command Line Tools. The app prefers the bundled binary over the Homebrew keg and PATH while keeping custom overrides and live-server compatibility, dev3 doctor identifies it, third-party license notices ship next to the binary, and the release pipeline gates on otool/codesign checks plus a sanitized-PATH new-session smoke test."
	},
	{
		"date": "2026-07-16",
		"type": "feature",
		"slug": "cross-project-task-creation",
		"title": "Task creation now includes a project picker that defaults to the current board, allowing users to create and launch t...",
		"body": "Task creation now includes a project picker that defaults to the current board, allowing users to create and launch tasks in another project without navigating away."
	},
	{
		"date": "2026-07-16",
		"type": "fix",
		"slug": "favorites-menu-width",
		"title": "Widen the Favorites popover so long agent, model, and mode combinations remain readable instead of being clipped",
		"body": "Widen the Favorites popover so long agent, model, and mode combinations remain readable instead of being clipped."
	},
	{
		"date": "2026-07-16",
		"type": "feature",
		"slug": "inline-task-priority-control",
		"title": "Adds the existing compact priority picker to the task info header beside Watch, including the narrow task summary bar",
		"body": "Adds the existing compact priority picker to the task info header beside Watch, including the narrow task summary bar. Priority changes reuse the current group-wide update flow and error feedback."
	},
	{
		"date": "2026-07-16",
		"type": "fix",
		"slug": "keep-merged-pr-link",
		"title": "Keep a task's detected pull-request link after GitHub merges it by refreshing the sticky PR record and reporting the ...",
		"body": "Keep a task's detected pull-request link after GitHub merges it by refreshing the sticky PR record and reporting the merged state in the existing PR status popover. The badge remains clickable and merged PR status is localized across supported languages."
	},
	{
		"date": "2026-07-16",
		"type": "feature",
		"slug": "mobile-git-actions-in-task-sheet",
		"title": "Mobile task view: removed the duplicate task title from the status bar (it already appears in the breadcrumb above), ...",
		"body": "Mobile task view: removed the duplicate task title from the status bar (it already appears in the breadcrumb above), freeing space. Added a Git section to the task actions sheet so Show Diff, Rebase, Push, Create PR (+ auto-merge) and Merge are now reachable on a phone, mirroring the desktop inspector with the same enable/disable rules and reasons. The task priority badge in the mobile status bar now renders at a larger, more legible size grouped next to the status."
	},
	{
		"date": "2026-07-16",
		"type": "fix",
		"slug": "parallel-worktree-test-isolation",
		"title": "Unit and E2E test processes now sandbox HOME, temporary files, XDG state, logs, tmux configuration, and DEV3 data und...",
		"body": "Unit and E2E test processes now sandbox HOME, temporary files, XDG state, logs, tmux configuration, and DEV3 data under a per-worktree, per-suite run directory. Fixed data fixture directories and the real CLI Unix socket no longer collide when agents test from parallel worktrees. The tmux E2Es also run reliably inside agent tmux sessions and clean up timed-out FIFO readers."
	},
	{
		"date": "2026-07-16",
		"type": "feature",
		"slug": "recent-agent-account-limits",
		"title": "The agent rate-limit indicator now shows every Claude and Codex account with local activity in the last 24 hours, att...",
		"body": "The agent rate-limit indicator now shows every Claude and Codex account with local activity in the last 24 hours, attributing each usage row to its managed account and retaining monthly Codex credit details per account. Its header percentage follows the latest active account instead of the most exhausted account, with unlimited accounts shown as 0% used."
	},
	{
		"date": "2026-07-16",
		"type": "fix",
		"slug": "remote-access-indicator-animation",
		"title": "Keep the Remote Access QR icon blue and animated continuously while the Cloudflare tunnel is starting or connected, i...",
		"body": "Keep the Remote Access QR icon blue and animated continuously while the Cloudflare tunnel is starting or connected, including after the QR modal closes. The indicator returns to its neutral state when the tunnel is idle or fails."
	},
	{
		"date": "2026-07-16",
		"type": "fix",
		"slug": "rosetta-intel-build-warning",
		"title": "The app now detects when it is the Intel (x64) build running under Rosetta 2 on an Apple Silicon Mac and shows a star...",
		"body": "The app now detects when it is the Intel (x64) build running under Rosetta 2 on an Apple Silicon Mac and shows a startup warning with a copy-pasteable reinstall command (Homebrew cask when native brew is present, otherwise the arm64 DMG). Such installs run slower, stay on x64 updates forever, and trigger the macOS \"Support Ending for Intel-based Apps\" notice on every launch."
	},
	{
		"date": "2026-07-16",
		"type": "feature",
		"slug": "settings-category-navigation",
		"title": "Global Settings now uses seven searchable categories with localized title and description matching, legacy deep-link ...",
		"body": "Global Settings now uses seven searchable categories with localized title and description matching, legacy deep-link compatibility, and a narrow list-to-detail layout. Existing settings editors and persistence remain intact, and System adds a reversible confirm-before-quitting toggle."
	},
	{
		"date": "2026-07-16",
		"type": "docs",
		"slug": "typed-push-bus-design",
		"title": "Added decision record 136 with the grilled design for a typed push bus owning all bun→renderer events (single PushMes...",
		"body": "Added decision record 136 with the grilled design for a typed push bus owning all bun→renderer events (single PushMessages source of truth, usePush/onPush API, own emitter replacing the untyped window CustomEvent bus, big-bang migration). The audit also uncovered silently dropped taskRemoved and openAddProjectModal pushes, tracked as a separate bugfix task."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "active-task-completion-animation",
		"title": "Active Tasks now shows the same muted teardown animation as Kanban while a completed or cancelled task closes its ses...",
		"body": "Active Tasks now shows the same muted teardown animation as Kanban while a completed or cancelled task closes its session and worktree. The task stays visible but cannot be opened until backend cleanup finishes."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "active-task-sidebar-focus",
		"title": "Clicking the already-focused task in Active Tasks no longer returns to the Kanban board",
		"body": "Clicking the already-focused task in Active Tasks no longer returns to the Kanban board. The same no-op behavior now applies to the compact browser task strip, preserving the current terminal focus."
	},
	{
		"date": "2026-07-15",
		"type": "feature",
		"slug": "cache-github-pr-status",
		"title": "Kanban task cards now restore the last cached GitHub PR status, including checks and unresolved comments, while hover...",
		"body": "Kanban task cards now restore the last cached GitHub PR status, including checks and unresolved comments, while hover refreshes the latest result without blanking the popover."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "chat-focus-on-file-drop",
		"title": "File drops now restore focus to the editor immediately before the asynchronous upload begins, keeping chat and task-d...",
		"body": "File drops now restore focus to the editor immediately before the asynchronous upload begins, keeping chat and task-description inputs ready for continued typing while attachments are saved."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "clear-stale-scratch-flag",
		"title": "Clear the scratch semantic flag when UI or CLI title edits turn a scratch task into a normal task",
		"body": "Clear the scratch semantic flag when UI or CLI title edits turn a scratch task into a normal task. Preserve launch-time compatibility guards so legacy stale records with real descriptions still receive their prompt."
	},
	{
		"date": "2026-07-15",
		"type": "feature",
		"slug": "cli-task-create-stdin",
		"title": "`dev3 task create` now accepts `--description -` and reads the full task description from stdin, preserving multiline...",
		"body": "`dev3 task create` now accepts `--description -` and reads the full task description from stdin, preserving multiline Markdown without shell quoting. The same stdin convention now covers task description updates, note content, and automation prompts; existing inline, positional, and `@file` inputs remain supported."
	},
	{
		"date": "2026-07-15",
		"type": "feature",
		"slug": "custom-notification-duration",
		"title": "Add an optional `--duration` flag to `dev3 notify` for short-lived in-app toasts from 2 to 30 seconds; the `s` suffix...",
		"body": "Add an optional `--duration` flag to `dev3 notify` for short-lived in-app toasts from 2 to 30 seconds; the `s` suffix is optional, so `--duration 15` means 15 seconds. The existing 30-second default remains, and native desktop notifications are governed by the operating system. The compact command list keeps this optional flag in the detailed help only."
	},
	{
		"date": "2026-07-15",
		"type": "feature",
		"slug": "dashboard-task-priority",
		"title": "Show P{n} badges in the leading marker slot of visible dashboard task rows and sort those rows by priority, preservin...",
		"body": "Show P{n} badges in the leading marker slot of visible dashboard task rows and sort those rows by priority, preserving the existing status ordering within each priority band on narrow screens."
	},
	{
		"date": "2026-07-15",
		"type": "feature",
		"slug": "dev-title-prefix",
		"title": "Dev builds (channel \"dev\", i.e",
		"body": "Dev builds (channel \"dev\", i.e. `bun run dev` from source) now show a \"[DEV from src]\" prefix in the window title so a locally built window is unmistakable next to an installed production/staging one."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "explicit-watch-default",
		"title": "Watch now has an explicit “Watch tasks by default” preference in Settings → Behavior",
		"body": "Watch now has an explicit “Watch tasks by default” preference in Settings → Behavior. Watch controls in the launch picker, task card, and inspector affect only their task, with tooltips pointing users to the global setting."
	},
	{
		"date": "2026-07-15",
		"type": "feature",
		"slug": "github-pr-status-surface",
		"title": "Dev3 now keeps detected GitHub PR identity on tasks, refreshes CI and review-thread status through adaptive polling, ...",
		"body": "Dev3 now keeps detected GitHub PR identity on tasks, refreshes CI and review-thread status through adaptive polling, and shows checks, conflicts, and unresolved comments in an in-app PR status popover. The popover sorts failures first, keeps long check lists within a ten-row scrollable viewport without closing, stays anchored while entering its portal, hydrates PR status automatically when a task opens, and refreshes an empty first-hover status after two seconds of dwell."
	},
	{
		"date": "2026-07-15",
		"type": "feature",
		"slug": "history-navigation-shortcuts",
		"title": "Add VS Code-style Ctrl-minus and Ctrl-Shift-minus aliases for back and forward route navigation while preserving the ...",
		"body": "Add VS Code-style Ctrl-minus and Ctrl-Shift-minus aliases for back and forward route navigation while preserving the existing bracket shortcuts. Move non-macOS zoom-out to Ctrl+Alt-minus to keep the new alias unambiguous, and update the shortcut reference and navigation tip."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "mobile-browser-menu-gap",
		"title": "Removed the standalone browser application-menu row from narrow/mobile layouts, reclaiming 32px above the global head...",
		"body": "Removed the standalone browser application-menu row from narrow/mobile layouts, reclaiming 32px above the global header while keeping the existing More bottom sheet and command-palette touch entry available."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "mobile-codex-submit",
		"title": "Fix mobile terminal message delivery by using one paste-aware submit operation",
		"body": "Fix mobile terminal message delivery by using one paste-aware submit operation. When bracketed paste is unavailable, the submit Enter waits past the agent's paste-burst window instead of sending duplicate Enter characters."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "mobile-composer-double-enter",
		"title": "The mobile terminal composer Send button now appends two Enters after pasting a prompt, while Insert and the Ctrl/Cmd...",
		"body": "The mobile terminal composer Send button now appends two Enters after pasting a prompt, while Insert and the Ctrl/Cmd+Enter shortcut keep their existing behavior."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "mobile-fullscreen-reentry",
		"title": "Mobile browser fullscreen now re-arms its first-tap gesture after any exit, so tapping the app restores fullscreen wh...",
		"body": "Mobile browser fullscreen now re-arms its first-tap gesture after any exit, so tapping the app restores fullscreen while preserving the browser's user-gesture requirement."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "mobile-kanban-initial-focus",
		"title": "On narrow Kanban boards, the carousel now opens on Has Questions when it contains tasks and falls back to Your Review...",
		"body": "On narrow Kanban boards, the carousel now opens on Has Questions when it contains tasks and falls back to Your Review when it is empty. The focus also updates after the initial task fetch until the user navigates manually."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "mobile-portrait-lock",
		"title": "Keep mobile dev-3.0 sessions in portrait orientation by attempting a browser orientation lock and blocking unsupporte...",
		"body": "Keep mobile dev-3.0 sessions in portrait orientation by attempting a browser orientation lock and blocking unsupported landscape sessions with a localized rotate prompt."
	},
	{
		"date": "2026-07-15",
		"type": "feature",
		"slug": "mobile-remote-overhaul",
		"title": "Mobile remote mode overhaul: sessions now ride an HttpOnly cookie backed by a disk-persisted secret, so your phone st...",
		"body": "Mobile remote mode overhaul: sessions now ride an HttpOnly cookie backed by a disk-persisted secret, so your phone stays signed in across desktop app restarts and overnight idle (24h rolling), and a dead session shows a clear \"scan a fresh QR\" screen instead of an infinite reconnect spinner while genuine network blips keep auto-retrying. The Android Back button now works like a native app — it closes the top sheet or modal first, then navigates back in-app, and asks \"press Back again to exit\" at the root — and on Android the UI enters fullscreen on your first tap, with a Fullscreen toggle in the mobile menu. (iPhone Safari has no Fullscreen API, so that toggle is hidden there — a platform limitation, not a bug.)"
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "mobile-status-columns",
		"title": "Keep the Completed and Cancelled Kanban columns reachable in the narrow carousel while preserving explicit user colum...",
		"body": "Keep the Completed and Cancelled Kanban columns reachable in the narrow carousel while preserving explicit user column-collapse choices. The desktop board keeps its existing compact default presentation."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "mobile-toast-capacity",
		"title": "Mobile layouts now show only the newest in-app notification toast at a time, while desktop keeps the existing five-to...",
		"body": "Mobile layouts now show only the newest in-app notification toast at a time, while desktop keeps the existing five-toast capacity and task-scoped overflow fallback."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "new-column-placement",
		"title": "New custom columns created from the Kanban board are inserted immediately before Completed and the full column order ...",
		"body": "New custom columns created from the Kanban board are inserted immediately before Completed and the full column order is persisted, keeping the new column beside the board's add-column affordance."
	},
	{
		"date": "2026-07-15",
		"type": "feature",
		"slug": "pr-merge-status-details",
		"title": "PR status popovers now show whether auto-merge is enabled, whether the pull request is mergeable, and specific GitHub...",
		"body": "PR status popovers now show whether auto-merge is enabled, whether the pull request is mergeable, and specific GitHub-derived blockers such as unresolved comments, missing approvals, and failed checks. The status is cached and localized across English, Russian, and Spanish."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "preserve-new-task-selection",
		"title": "Finishing or cancelling one task no longer clears a different task that the user selected while the completion prefli...",
		"body": "Finishing or cancelling one task no longer clears a different task that the user selected while the completion preflight was still running."
	},
	{
		"date": "2026-07-15",
		"type": "feature",
		"slug": "sidebar-panel-toggle",
		"title": "The Active Tasks sidebar \"zoom\" icon is now a VS Code-style panel toggle, with a matching counterpart in the fullscre...",
		"body": "The Active Tasks sidebar \"zoom\" icon is now a VS Code-style panel toggle, with a matching counterpart in the fullscreen task toolbar that brings the panel back. The terminal fullscreen toggle got a new macOS-style diagonal-arrows icon and an accent tint, and the tmux pane zoom control now shows a magnifier over the split layout instead of the inflating frame. All native tooltips in the sidebar zone and the pane un-zoom badge were migrated to the styled Tooltip, and the redundant sidebar-hide discovery tip was removed."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "terminal-column-recency-sort",
		"title": "Completed and Cancelled Kanban columns now sort by when each task landed there — freshest on top — instead of by prio...",
		"body": "Completed and Cancelled Kanban columns now sort by when each task landed there — freshest on top — instead of by priority. Priority ordering still applies to every other column."
	},
	{
		"date": "2026-07-15",
		"type": "docs",
		"slug": "tmux-shim-startup-recovery",
		"title": "Document the macOS startup-crash recovery for stale tmux shims, including the launcher-log symptom and the safe remov...",
		"body": "Document the macOS startup-crash recovery for stale tmux shims, including the launcher-log symptom and the safe removal command. Link the existing broken-shim troubleshooting row to the new workaround."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "tmux-shim-validation-and-launch-feedback",
		"title": "Tmux paths and shims now require a real executable tmux binary, `dev3 doctor` detects poisoned saved paths and provid...",
		"body": "Tmux paths and shims now require a real executable tmux binary, `dev3 doctor` detects poisoned saved paths and provides repair steps, and failed task launches show the actual error after returning to To Do instead of failing silently. Troubleshooting now starts with doctor and keeps only the minimal tmux install and macOS permission recovery steps."
	},
	{
		"date": "2026-07-15",
		"type": "fix",
		"slug": "toast-timer-overflow",
		"title": "Toast timers now pause while a renderer is hidden, unfocused, hovered, or focused, resume from their remaining budget...",
		"body": "Toast timers now pause while a renderer is hidden, unfocused, hovered, or focused, resume from their remaining budget, and cap each visible stack at five entries. Task-scoped overflow evictions now feed the existing deduplicated task attention badge while ordinary dismissal and unscoped overflow remain silent."
	},
	{
		"date": "2026-07-14",
		"type": "feature",
		"slug": "terminal-immersive-fullscreen",
		"title": "Add an ephemeral task-terminal immersive fullscreen mode with a minimal dev3 exit strip, F11 and Cmd/Ctrl+Shift+F tog...",
		"body": "Add an ephemeral task-terminal immersive fullscreen mode with a minimal dev3 exit strip, F11 and Cmd/Ctrl+Shift+F toggles, shortcut tooltip guidance, preserved tmux layouts, and notification navigation that exits fullscreen first. The focus chrome uses neutral compact surfaces, and the high-priority terminal tip explains that tmux state stays untouched. Agent-facing notifications and viewer events now queue across renderer, browser, CLI, and native delivery while immersive fullscreen or persistent Focus Mode is active, then flush after the final mode ends with task actions preserved."
	},
	{
		"date": "2026-07-13",
		"type": "refactor",
		"slug": "agent-adapter-interface",
		"title": "Refactored all per-agent launch/trust/hooks/skill differences behind a single AgentAdapter abstraction (one adapter p...",
		"body": "Refactored all per-agent launch/trust/hooks/skill differences behind a single AgentAdapter abstraction (one adapter per coding agent plus a GenericAdapter fallback), replacing the scattered `is*Command` ladders. Adding or changing a coding agent is now a one-file change and the type-checker enumerates every member to fill in. Pure adapter core lives in the shared layer; a thin backend executor applies trust/hook I/O. No user-visible change — every launch command, trust config, and hook file is byte-identical, guarded by a new golden characterization test and per-adapter contract tests."
	},
	{
		"date": "2026-07-13",
		"type": "fix",
		"slug": "cloudflare-remote-link-dns-delay",
		"title": "Remote Access now automatically starts a Cloudflare tunnel when `cloudflared` is installed and keeps the public URL o...",
		"body": "Remote Access now automatically starts a Cloudflare tunnel when `cloudflared` is installed and keeps the public URL out of the QR modal until Cloudflare DNS has had five seconds to provision the hostname. Explicit local/LAN mode remains available by disabling the tunnel."
	},
	{
		"date": "2026-07-13",
		"type": "fix",
		"slug": "codex-profile-migration",
		"title": "Codex profile migration now switches to per-profile config files at Codex 0.134.0, removes nested managed legacy prof...",
		"body": "Codex profile migration now switches to per-profile config files at Codex 0.134.0, removes nested managed legacy profile tables, and detects the installed version after the user's shell PATH is loaded."
	},
	{
		"date": "2026-07-13",
		"type": "fix",
		"slug": "codex-workspace-accounts",
		"title": "Codex account management now identifies duplicate logins by ChatGPT workspace, so one email can keep multiple workspaces",
		"body": "Codex account management now identifies duplicate logins by ChatGPT workspace, so one email can keep multiple workspaces. Account rows, launch pickers, duplicate errors, and diagnostic logs use readable workspace names when available, with a short workspace ID as an offline fallback."
	},
	{
		"date": "2026-07-13",
		"type": "fix",
		"slug": "dev-server-socket-refusal-self-hosted-instance",
		"title": "Fixed the chronic dev-server stop/restart failures (\"Empty response from server\" / refused control socket, #910/#920)...",
		"body": "Fixed the chronic dev-server stop/restart failures (\"Empty response from server\" / refused control socket, #910/#920): when a project's devScript boots a dev3 app of its own (dev-3.0 dogfooding), that guest instance won CLI socket discovery and killed itself mid-teardown before replying. The app now marks guest sockets with a meta sidecar and answers stop before tearing down its own host session, the CLI deprioritizes guest sockets and transparently replays idempotent dev-server commands against a surviving instance, so stop/restart are reliable and idempotent even with multiple app instances running."
	},
	{
		"date": "2026-07-13",
		"type": "fix",
		"slug": "disabled-git-action-tooltips",
		"title": "Disabled Git actions now explain their blocking state through the styled tooltip, including uncommitted changes and m...",
		"body": "Disabled Git actions now explain their blocking state through the styled tooltip, including uncommitted changes and missing local commits. Disabled controls remain non-interactive while their tooltips work on hover and keyboard focus."
	},
	{
		"date": "2026-07-13",
		"type": "feature",
		"slug": "luna-codex-presets",
		"title": "Prioritize GPT-5.6 Luna X-High and Max Codex presets, expose every available effort tier for Sol, and order the model...",
		"body": "Prioritize GPT-5.6 Luna X-High and Max Codex presets, expose every available effort tier for Sol, and order the models Luna → Sol → Terra → GPT-5.5. Existing installations resync the expanded preset layout into the canonical order."
	},
	{
		"date": "2026-07-13",
		"type": "fix",
		"slug": "ratelimit-workspace-name",
		"title": "The Agent rate-limit popup now shows each account's workspace/organization name as a consistent \"email · workspace\" r...",
		"body": "The Agent rate-limit popup now shows each account's workspace/organization name as a consistent \"email · workspace\" row, so two accounts sharing the same email in different workspaces are no longer indistinguishable, and the popup is widened so long rows fit on one line."
	},
	{
		"date": "2026-07-13",
		"type": "feature",
		"slug": "recent-commits-diff-mode",
		"title": "Added a \"Recent commits\" diff mode to the task diff viewer for quickly inspecting an agent's latest commits",
		"body": "Added a \"Recent commits\" diff mode to the task diff viewer for quickly inspecting an agent's latest commits. Click \"Last commit\" to see the newest commit, or use the dropdown to view the last 2, 3, 5, or 10 commits (HEAD~N..HEAD, clamped to the branch's own commits).",
		"suggestedBy": "banuni",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/917",
		"issueRef": "#917"
	},
	{
		"date": "2026-07-13",
		"type": "fix",
		"slug": "remote-tunnel-liveness",
		"title": "Remote Access now records cloudflared output in the daily app logs, detects stalled edge connections, restarts stale ...",
		"body": "Remote Access now records cloudflared output in the daily app logs, detects stalled edge connections, restarts stale Quick Tunnels, and refreshes rotated URLs in open QR and exposed-port surfaces."
	},
	{
		"date": "2026-07-13",
		"type": "docs",
		"slug": "star-history-sealed-embed",
		"title": "Updated the README and public website Star History charts to use the regenerated sealed-token embed, restoring live s...",
		"body": "Updated the README and public website Star History charts to use the regenerated sealed-token embed, restoring live star-history rendering after GitHub restricted anonymous stargazer data access."
	},
	{
		"date": "2026-07-13",
		"type": "feature",
		"slug": "variant-switching",
		"title": "Variant task cards and active-task surfaces now share bounded sibling navigation, while the task inspector and keyboa...",
		"body": "Variant task cards and active-task surfaces now share bounded sibling navigation, while the task inspector and keyboard shortcuts provide fast switching between live variants. Opening the sibling overview now also closes any terminal hover preview so the group stays unobstructed. The workspace variant switcher now keeps only numbered status chips without decorative agent glyphs."
	},
	{
		"date": "2026-07-12",
		"type": "fix",
		"slug": "claude-question-status-hooks",
		"title": "Claude Code task hooks now move a task to in-progress as soon as AskUserQuestion completes, rather than waiting for t...",
		"body": "Claude Code task hooks now move a task to in-progress as soon as AskUserQuestion completes, rather than waiting for the next tool call."
	},
	{
		"date": "2026-07-12",
		"type": "fix",
		"slug": "codex-create-pr-pane",
		"title": "Create PR and other agent hand-offs now target the initial Codex pane before its first lifecycle hook runs",
		"body": "Create PR and other agent hand-offs now target the initial Codex pane before its first lifecycle hook runs."
	},
	{
		"date": "2026-07-12",
		"type": "fix",
		"slug": "codex-skill-autocomplete",
		"title": "Task descriptions now autocomplete Codex skills with `$` even when Codex is selected only at launch",
		"body": "Task descriptions now autocomplete Codex skills with `$` even when Codex is selected only at launch. The typed prefix is preserved when inserting the skill."
	},
	{
		"date": "2026-07-12",
		"type": "feature",
		"slug": "daily-weekday-picker",
		"title": "Automation schedules now let you pick which weekdays a \"Daily\" run fires on: quick presets (Every day / Weekdays / We...",
		"body": "Automation schedules now let you pick which weekdays a \"Daily\" run fires on: quick presets (Every day / Weekdays / Weekend) plus per-day toggles, so you can schedule \"every day except weekends\" in one click. The separate Weekly tab is folded into Daily — selecting a subset of days emits a weekly rule, all days emit a daily one. The Weekdays/Weekend presets follow the region's work week: for the Asia/Jerusalem timezone they mean Sun–Thu work / Fri–Sat rest and the day chips start on Sunday."
	},
	{
		"date": "2026-07-12",
		"type": "fix",
		"slug": "diff-code-zoom",
		"title": "Diff code text now follows the app zoom level instead of remaining fixed at 14 pixels, so Command-Plus and Command-Mi...",
		"body": "Diff code text now follows the app zoom level instead of remaining fixed at 14 pixels, so Command-Plus and Command-Minus keep code readable alongside the surrounding interface."
	},
	{
		"date": "2026-07-12",
		"type": "fix",
		"slug": "mobile-composer-header",
		"title": "Restore the mobile terminal header when Android dismisses the composer keyboard without blurring its textarea",
		"body": "Restore the mobile terminal header when Android dismisses the composer keyboard without blurring its textarea. The composer now tracks visual viewport changes and has regression coverage for that focus state."
	},
	{
		"date": "2026-07-12",
		"type": "fix",
		"slug": "mobile-project-task-desync",
		"title": "Fixed mobile project switching so stale task cards cannot open under another project's breadcrumb",
		"body": "Fixed mobile project switching so stale task cards cannot open under another project's breadcrumb. Late task-load responses are now ignored after navigating away."
	},
	{
		"date": "2026-07-12",
		"type": "fix",
		"slug": "mobile-rpc-pty-reconnect",
		"title": "Mobile remote sessions now recover both RPC requests and the active tmux terminal after the browser returns from the ...",
		"body": "Mobile remote sessions now recover both RPC requests and the active tmux terminal after the browser returns from the background. Reconnects replace stale sockets without duplicating listeners, requests made during an outage are delivered when the replacement RPC socket opens, and authenticated PTY URLs are redacted from reconnect logs."
	},
	{
		"date": "2026-07-12",
		"type": "fix",
		"slug": "pr-review-needs-you-tier",
		"title": "PR Review tasks now always appear in the Active Tasks sidebar's top Needs You queue and the attention filter",
		"body": "PR Review tasks now always appear in the Active Tasks sidebar's top Needs You queue and the attention filter. Working and AI Review tasks remain in Waiting, while bells continue to signal new activity without changing queue placement."
	},
	{
		"date": "2026-07-12",
		"type": "fix",
		"slug": "priority-lost-on-variant-launch",
		"title": "Fixed the task priority (e.g",
		"body": "Fixed the task priority (e.g. P0) picked in the New Task dialog being reset to the default P3 once the task was launched with variants. Both spawnVariants and addAttempts now carry the source task's priority onto the spawned variants/attempts, since priority belongs to the whole variant group."
	},
	{
		"date": "2026-07-12",
		"type": "fix",
		"slug": "vent-issue-offer-wording",
		"title": "Reworked the agent skill's public bug-report offer: agents must never mention the private vent channel to the user, a...",
		"body": "Reworked the agent skill's public bug-report offer: agents must never mention the private vent channel to the user, and the offer to open a GitHub issue is now a friendly, explicit ask (\"I stumbled on a dev3 bug — may I open a public issue using your gh account?\") instead of an announcement that a report was already sent."
	},
	{
		"date": "2026-07-12",
		"type": "fix",
		"slug": "widen-launch-modal",
		"title": "Widened the Launch Task / Retry modal so the Provider, Model, and Mode dropdowns have enough room to show their full ...",
		"body": "Widened the Launch Task / Retry modal so the Provider, Model, and Mode dropdowns have enough room to show their full labels instead of truncating them (e.g. \"GPT-5.6 …\", \"Bypass [X…\")."
	},
	{
		"date": "2026-07-11",
		"type": "docs",
		"slug": "agent-adapter-design",
		"title": "Recorded the design for an AgentAdapter interface (decision 124) that collapses the per-agent `is*Command` ladders in...",
		"body": "Recorded the design for an AgentAdapter interface (decision 124) that collapses the per-agent `is*Command` ladders in agents.ts, tmux-pty.ts, agent-hooks.ts, and agent-skills.ts into one pure descriptor per agent plus a bun-side executor, following the existing llm-provider.ts registry precedent. Design only — no code change yet; the agent support matrix now points at the planned interface."
	},
	{
		"date": "2026-07-11",
		"type": "feature",
		"slug": "favorite-agent-configs",
		"title": "Added Favorites to the agent launch picker: star your go-to provider/model/mode combos and pick them in one click",
		"body": "Added Favorites to the agent launch picker: star your go-to provider/model/mode combos and pick them in one click. A compact \"Favorites\" column sits at the start of the picker on Launch, Spawn Agent, and Bug Hunters — its star fills when the current combo is saved, and clicking it opens a menu to save the current combo or apply/remove a saved one. Favorites are capped at 10, ordered by how often you use them, and the least-used one is dropped when you star an eleventh."
	},
	{
		"date": "2026-07-11",
		"type": "feature",
		"slug": "per-launch-agent-account",
		"title": "Agent accounts can now be chosen per launch",
		"body": "Agent accounts can now be chosen per launch. Every spawn dialog (Launch Variants, Spawn Agent, Bug Hunters) gets an account selector so each session runs under the account you pick, instead of a single global active one; the former global switch becomes a default preselect. Claude isolates per session via CLAUDE_CONFIG_DIR and Codex via CODEX_HOME. The chosen account is remembered for Retry."
	},
	{
		"date": "2026-07-11",
		"type": "fix",
		"slug": "rate-limit-used-label",
		"title": "The agent rate-limit header badge and the Claude window rows in its tooltip now spell out that the percentage is the ...",
		"body": "The agent rate-limit header badge and the Claude window rows in its tooltip now spell out that the percentage is the amount \"used\" (e.g. \"22% used\"), removing the ambiguity of a bare \"22%\". Codex already reads \"% left\", so its rows are unchanged."
	},
	{
		"date": "2026-07-11",
		"type": "feature",
		"slug": "reorder-labels",
		"title": "Labels in Project Settings can now be reordered — drag the grip handle or use the up/down arrows on each label row",
		"body": "Labels in Project Settings can now be reordered — drag the grip handle or use the up/down arrows on each label row. The new order is saved per project and reflected wherever labels are shown (task cards, label picker)."
	},
	{
		"date": "2026-07-11",
		"type": "feature",
		"slug": "scheduled-agent-message",
		"title": "Added \"Send later\" scheduled messages: queue a one-shot prompt to a task's live agent to be delivered at a wall-clock...",
		"body": "Added \"Send later\" scheduled messages: queue a one-shot prompt to a task's live agent to be delivered at a wall-clock time or after a delay. Reach it from the inspector Session bar, the task-card menu, the browser/touch terminal composer, or `dev3 message [--in <dur> | --at <hh:mm>] \"text\"` (bare form sends immediately). The pending queue shows as a countdown chip both on the board card and in the open-task Session bar, each with cancel / send-now; the compose dialog accepts dropped or pasted images (uploaded into the worktree). Unresolvable or offline-late deliveries notify instead of silently failing."
	},
	{
		"date": "2026-07-11",
		"type": "feature",
		"slug": "sidebar-priority-tiers",
		"title": "The Active Tasks sidebar now shows each task's priority as the same colored P0–P4 badge used on the kanban card (clic...",
		"body": "The Active Tasks sidebar now shows each task's priority as the same colored P0–P4 badge used on the kanban card (click it to re-prioritize the whole variant group), and groups the queue into readiness tiers — Needs You, your custom columns, then Waiting — each sorted by priority band with the longest-waiting task on top. A compact status label on every card keeps the merged statuses legible, and the cross-project attention/bell scope adopts the same priority-first order."
	},
	{
		"date": "2026-07-11",
		"type": "feature",
		"slug": "targeted-codex-gemini-recovery",
		"title": "Session recovery now resumes the exact previous session for more agents",
		"body": "Session recovery now resumes the exact previous session for more agents. Gemini gets targeted recovery via its new launch-time --session-id flag (gemini-cli #26060), joining Claude and Cursor. Codex sessions are now recovered per-pane: dev3 records each pane's real Codex session id from the lifecycle hook (which reports the session id plus $TMUX_PANE), so reviving a worktree that ran several Codex agents (e.g. multiple bug hunters) resumes each pane to its own session instead of collapsing them onto the most-recent one. Note: Gemini --session-id requires a gemini-cli build from 2026-04-27 or later."
	},
	{
		"date": "2026-07-10",
		"type": "feature",
		"slug": "board-add-column-button",
		"title": "You can now create a custom column straight from the Kanban board: a slim dashed \"+\" affordance sits just before the ...",
		"body": "You can now create a custom column straight from the Kanban board: a slim dashed \"+\" affordance sits just before the Completed column, and clicking it adds a column that opens directly in inline rename so you can name it in place without opening Project Settings. Board custom columns are also renamable inline now (the pencil affordance in their header); color, LLM instruction, and agent config still live in Project Settings.\r\n\r\nSuggested by Bar Volovski (h0x91b/dev-3.0#222)"
	},
	{
		"date": "2026-07-10",
		"type": "fix",
		"slug": "current-custom-columns-discovery",
		"title": "Fixed `dev3 current` so its custom-columns hint actually appears: the offline data reader used to drop the project's ...",
		"body": "Fixed `dev3 current` so its custom-columns hint actually appears: the offline data reader used to drop the project's customColumns, so the section silently never rendered (even online). It now reads the full stored project and lists each custom column's 8-char ID + name in both online and offline modes, so agents can find the `dev3 task move --status <id>` token without reading it off the UI. Board column ordering/visibility also moved into a single shared, unit-tested helper reused by the Kanban board."
	},
	{
		"date": "2026-07-10",
		"type": "chore",
		"slug": "default-priority-p3",
		"title": "Newly created tasks now default to priority P3 instead of P2, so fresh work starts one band lower unless you explicit...",
		"body": "Newly created tasks now default to priority P3 instead of P2, so fresh work starts one band lower unless you explicitly bump it. Legacy tasks that predate the priority field also fall back to P3."
	},
	{
		"date": "2026-07-10",
		"type": "feature",
		"slug": "edit-task-image-dnd",
		"title": "Editing a todo task's description now supports drag-and-drop and clipboard-paste image/file upload, with an inline at...",
		"body": "Editing a todo task's description now supports drag-and-drop and clipboard-paste image/file upload, with an inline attachments strip — matching the create-task modal. Previously the edit textarea in the task detail modal was plain text only."
	},
	{
		"date": "2026-07-10",
		"type": "fix",
		"slug": "graceful-devserver-status-on-tmux-failure",
		"title": "`dev3 dev-server status` no longer hard-crashes with a raw `posix_spawn ENOENT` when tmux can't be launched (usually ...",
		"body": "`dev3 dev-server status` no longer hard-crashes with a raw `posix_spawn ENOENT` when tmux can't be launched (usually macOS Full Disk Access lost). It now degrades gracefully — printing the last-known state as \"unknown\" plus a clear diagnostic that points at re-adding dev3 to Full Disk Access — and `start`/`restart` surface the same actionable message instead of the cryptic spawn error."
	},
	{
		"date": "2026-07-10",
		"type": "fix",
		"slug": "image-share-toast-task-focus",
		"title": "Clicking the \"Agent shared an image\" toast now navigates to the task that produced the image (honoring your task open...",
		"body": "Clicking the \"Agent shared an image\" toast now navigates to the task that produced the image (honoring your task open-mode) before opening the lightbox, instead of opening the viewer without switching focus. Matches how shared HTML artifacts already behave."
	},
	{
		"date": "2026-07-10",
		"type": "feature",
		"slug": "label-task-counts",
		"title": "Project Settings → Labels now shows a task-count badge next to each label, so you can see at a glance how many projec...",
		"body": "Project Settings → Labels now shows a task-count badge next to each label, so you can see at a glance how many project tasks currently carry it (0 is dimmed to flag unused labels)."
	},
	{
		"date": "2026-07-10",
		"type": "feature",
		"slug": "rate-limit-account-info",
		"title": "The agent rate-limit indicator tooltip in the global header now shows which account each Claude/Codex limit belongs t...",
		"body": "The agent rate-limit indicator tooltip in the global header now shows which account each Claude/Codex limit belongs to — the active account's email/label plus its plan tier (or an API-profile marker) — so it is clear whose limits you are looking at."
	},
	{
		"date": "2026-07-10",
		"type": "feature",
		"slug": "remote-error-visibility",
		"title": "Remote and mobile-browser sessions now surface faults in the UI instead of hanging on a blank \"Loading…\" with no way ...",
		"body": "Remote and mobile-browser sessions now surface faults in the UI instead of hanging on a blank \"Loading…\" with no way to see what broke. A top-level error boundary renders render/lifecycle crashes as a readable, copyable screen; the loading screen names its phase (connecting, authenticating, loading) and, after a timeout, offers Retry/Reload with the actual error; uncaught errors, unhandled rejections, and WebSocket/RPC failures are collected into an in-UI diagnostics panel reachable from a small floating indicator that only appears in remote mode when something has actually gone wrong. A static pre-React loader also replaces the initial blank flash."
	},
	{
		"date": "2026-07-10",
		"type": "feature",
		"slug": "task-priority",
		"title": "Tasks now have a priority (P0 highest … P4 lowest, default P2) shown as a colored badge on every card — a red → orang...",
		"body": "Tasks now have a priority (P0 highest … P4 lowest, default P2) shown as a colored badge on every card — a red → orange → yellow → green → grey heat ramp by importance; click it to change. The board columns and the active-tasks sidebar sort by priority first, so the most important work is always on top, and dragging a card into a higher/lower band re-prioritizes it. A colored priority filter joins the label filter on a single-line, horizontally-scrollable filter row, and `dev3 task update --priority P0..P4` lets you delegate prioritizing to an agent."
	},
	{
		"date": "2026-07-10",
		"type": "feature",
		"slug": "token-dsl-filters",
		"title": "Added VSCode-style token-DSL filters to both the Kanban board and the Active Tasks sidebar",
		"body": "Added VSCode-style token-DSL filters to both the Kanban board and the Active Tasks sidebar. Type or click to filter by priority:, label:, agent:, status:, is:attention and has:port — the search string is the single source of truth, so the P0–P4 priority chips, label chips and the funnel dropdown all edit the same tokens and never disagree. The board shows the most-popular labels inline with a \"+N more\" that opens the full list in the funnel. Facet values that contain the DSL's own quote character (labels, agents or custom columns named like He said \"ship it\") are now escaped so their tokens round-trip correctly instead of hiding the matching task."
	},
	{
		"date": "2026-07-09",
		"type": "feature",
		"slug": "ai-filed-bug-reports",
		"title": "Teach dev3 agents to offer public GitHub bug reports after sending private vents",
		"body": "Teach dev3 agents to offer public GitHub bug reports after sending private vents. Approved reports are filed with the Reported by AI label and scrubbed of private project details."
	},
	{
		"date": "2026-07-09",
		"type": "feature",
		"slug": "artifact-starter-template",
		"title": "Give every dev3 task a pristine branded HTML artifact starter with semantic tokens, responsive interactive components...",
		"body": "Give every dev3 task a pristine branded HTML artifact starter with semantic tokens, responsive interactive components, and an Auto/Light/Dark theme switch. Agents receive its absolute task-local path and guidance that unqualified interactive artifact requests usually mean dev3 artifacts."
	},
	{
		"date": "2026-07-09",
		"type": "fix",
		"slug": "claude-code-theme-contrast",
		"title": "Improved terminal contrast for every Claude Code `/theme` variant",
		"body": "Improved terminal contrast for every Claude Code `/theme` variant. Regular and colorblind diff palettes now adapt in both directions when the Claude theme and dev3 theme use opposite light/dark modes, while ANSI-only themes retain the configured terminal palette. The README now recommends Codex `dracula` for dark dev3 and `github` for light dev3."
	},
	{
		"date": "2026-07-09",
		"type": "fix",
		"slug": "codex-skill-prefix",
		"title": "Fixed Codex skill invocation in Find bugs and Create Task",
		"body": "Fixed Codex skill invocation in Find bugs and Create Task. Codex now receives `$skill`; other supported agents keep `/skill`, and task autocomplete waits for the selected agent instead of guessing. The bug-hunter lightbox now explains how to hand recorded findings back to the main agent."
	},
	{
		"date": "2026-07-09",
		"type": "feature",
		"slug": "cursor-composer-2-5",
		"title": "Add Composer 2.5 as a selectable Cursor Agent model preset in the launch picker",
		"body": "Add Composer 2.5 as a selectable Cursor Agent model preset in the launch picker."
	},
	{
		"date": "2026-07-09",
		"type": "fix",
		"slug": "dev-server-empty-response",
		"title": "Fixed `dev3 dev-server stop`/`restart` intermittently failing with \"error: Empty response from server\" during the tmu...",
		"body": "Fixed `dev3 dev-server stop`/`restart` intermittently failing with \"error: Empty response from server\" during the tmux socket handoff. The CLI now treats an empty socket reply as a transient response-phase condition and briefly settles-and-retries the request for the idempotent dev-server operations, so a restart reliably brings the server back and stop reports success when the server is actually gone."
	},
	{
		"date": "2026-07-09",
		"type": "fix",
		"slug": "edited-scratch-variant-prompts",
		"title": "Convert scratch tasks into normal tasks when their description is edited, so multi-variant launches deliver the meani...",
		"body": "Convert scratch tasks into normal tasks when their description is edited, so multi-variant launches deliver the meaningful prompt to every agent. Untouched scratch placeholders remain excluded from agent prompts."
	},
	{
		"date": "2026-07-09",
		"type": "fix",
		"slug": "ga-page-location-https-scheme",
		"title": "Fixed GA4 \"Page path\" being empty by sending page_location as a real https URL (https://dev3.local/app/...) instead o...",
		"body": "Fixed GA4 \"Page path\" being empty by sending page_location as a real https URL (https://dev3.local/app/...) instead of the custom app:// scheme, which GA4's URL parser cannot turn into a Page path. Page titles were already arriving; only the derived path dimension was affected."
	},
	{
		"date": "2026-07-09",
		"type": "feature",
		"slug": "github-pr-links",
		"title": "Added GitHub pull-request link support to the Create Task modal",
		"body": "Added GitHub pull-request link support to the Create Task modal. Paste a PR URL into the description and a non-blocking banner offers to set up a code review; you can also paste a PR URL directly into the \"Use existing branch\" box. Either path resolves the PR via gh (fork-aware) to its head branch and enables review mode automatically."
	},
	{
		"date": "2026-07-09",
		"type": "feature",
		"slug": "html-artifacts",
		"title": "Added `dev3 show-artifact <file.html> [--images <image...>] [--title \"...\"]` for task-bound interactive HTML reports",
		"body": "Added `dev3 show-artifact <file.html> [--images <image...>] [--title \"...\"]` for task-bound interactive HTML reports. Artifacts open in a sandboxed workspace with a reliable resize handle, fullscreen mode, and a local Follow dev3/Light/Dark theme cycle; copied image assets stay beside the HTML and make the portable download a ZIP, while standalone artifacts download directly as HTML."
	},
	{
		"date": "2026-07-09",
		"type": "fix",
		"slug": "latest-task-agent",
		"title": "Task cards now show the most recently launched agent and configuration, including its launcher icon, immediately afte...",
		"body": "Task cards now show the most recently launched agent and configuration, including its launcher icon, immediately after extra-agent and bug-hunter launches."
	},
	{
		"date": "2026-07-09",
		"type": "fix",
		"slug": "live-scheduled-task-refresh",
		"title": "Scheduled task launches now stay visible when their live update races the project board's initial task load",
		"body": "Scheduled task launches now stay visible when their live update races the project board's initial task load."
	},
	{
		"date": "2026-07-09",
		"type": "feature",
		"slug": "task-lifetime-metrics",
		"title": "Add average task lifetime to Productivity Stats, measured from the first in-progress transition to completion",
		"body": "Add average task lifetime to Productivity Stats, measured from the first in-progress transition to completion. The dashboard shows the selected period's average and a per-project breakdown; reopening a completed task starts a new cycle."
	},
	{
		"date": "2026-07-09",
		"type": "feature",
		"slug": "task-time-tracking",
		"title": "Tasks now track how long they took: total lifetime, agent time (coding + AI review), and your real focus time (the mi...",
		"body": "Tasks now track how long they took: total lifetime, agent time (coding + AI review), and your real focus time (the minutes a task was actually on-screen and active). The Productivity page gets a new \"Time invested\" section — total/agent/your-time with an agent-vs-you split — plus per-project total time on the breakdown cards, both globally and per project."
	},
	{
		"date": "2026-07-08",
		"type": "chore",
		"slug": "agent-skills-config",
		"title": "Added an `## Agent skills` section to AGENTS.md plus `docs/agents/{issue-tracker,triage-labels,domain}.md` so Matt Po...",
		"body": "Added an `## Agent skills` section to AGENTS.md plus `docs/agents/{issue-tracker,triage-labels,domain}.md` so Matt Pocock's engineering skills (triage, to-tickets, to-spec, qa, …) fit this repo: issues live as dev-3.0 Kanban tasks via the `dev3` CLI with external GitHub PRs as a secondary triage surface, the five triage roles map to dev3 labels, and domain docs are single-context (AGENTS.md + ADRs under `decisions/`)."
	},
	{
		"date": "2026-07-08",
		"type": "feature",
		"slug": "codex-agent-usage",
		"title": "Velocity Cockpit now includes local Codex rollout token usage and API-equivalent model costs alongside Claude usage, ...",
		"body": "Velocity Cockpit now includes local Codex rollout token usage and API-equivalent model costs alongside Claude usage, with cached input priced separately and unknown preview models reported without guessed rates. The header rate-limit widget also shows live Codex monthly credit usage, remaining percentage, and reset time with graceful rollout fallback."
	},
	{
		"date": "2026-07-08",
		"type": "fix",
		"slug": "codex-ai-git-command-routing",
		"title": "AI-assisted Git actions now follow the active Codex pane when the task also has another registered agent pane, instea...",
		"body": "AI-assisted Git actions now follow the active Codex pane when the task also has another registered agent pane, instead of sending the prompt to the wrong agent."
	},
	{
		"date": "2026-07-08",
		"type": "fix",
		"slug": "codex-dark-theme-diff-colors",
		"title": "Fixed Codex terminal colors by launching it with GitHub in the light theme and Dracula in the dark theme, while prese...",
		"body": "Fixed Codex terminal colors by launching it with GitHub in the light theme and Dracula in the dark theme, while preserving user configuration outside dev3. A renderer fallback also replaces legacy glaring GitHub-light diff backgrounds with muted dark variants and readable syntax colors."
	},
	{
		"date": "2026-07-08",
		"type": "feature",
		"slug": "codex-developer-instructions",
		"title": "Codex now receives the dev3 task-lifecycle protocol as a developer-role message via the `-c developer_instructions=.....",
		"body": "Codex now receives the dev3 task-lifecycle protocol as a developer-role message via the `-c developer_instructions=...` config override instead of having it appended to the first user prompt. This keeps the opening message clean and, more importantly, delivers the protocol on scratch tasks (empty prompt) and resumed sessions, which previously got no injection at all."
	},
	{
		"date": "2026-07-08",
		"type": "feature",
		"slug": "codex-gpt56-presets",
		"title": "Refreshed the Codex launch presets for OpenAI's new model lineup: GPT-5.6 Sol, Terra, and Luna now expose curated Byp...",
		"body": "Refreshed the Codex launch presets for OpenAI's new model lineup: GPT-5.6 Sol, Terra, and Luna now expose curated Bypass-first effort ladders with bracketed effort labels, while Sol remains the frontier default with dedicated Default and Plan workflows. Standard modes are trimmed to the useful everyday efforts, model labels keep canonical GPT casing across app versions, GPT-5.5 moves below the new models as a consistent legacy tier, and the unsupported GPT-5.3 Codex presets are removed from persisted settings."
	},
	{
		"date": "2026-07-08",
		"type": "fix",
		"slug": "codex-status-hook-lifecycle",
		"title": "Codex tasks now leave Agent is Working reliably, move approval waits to User Questions on Codex 0.122+, and select th...",
		"body": "Codex tasks now leave Agent is Working reliably, move approval waits to User Questions on Codex 0.122+, and select the correct review column through one atomic lifecycle handler. Status hooks remain generated and gitignored inside each task worktree; current Codex releases trust only those exact dev3 definitions automatically, with no `/hooks` step or global hooks file, and the session override is positioned before prompts and resume subcommands so Codex parses it as a global option. Codex-specific skill and shared AGENTS instructions no longer duplicate hook-owned lifecycle moves manually."
	},
	{
		"date": "2026-07-08",
		"type": "fix",
		"slug": "ga-analytics-events-and-paths",
		"title": "Fixed and enriched the GA4 analytics",
		"body": "Fixed and enriched the GA4 analytics. Replaced the app-stream `first_open` event with `first_visit` so the web data stream actually populates the \"New users\" metric, and replaced the hardcoded `engagement_time_msec` constant with real foreground time (visibility-aware) so engagement metrics are meaningful. Page views now carry rich `/app`-prefixed locations (e.g. `/app/project/<id>/kanban`, `.../task/<seq>`, `.../diff/<seq>`), keeping the app cleanly separable from the landing page in the shared property while never sending confidential project names. Task paths use the human-readable per-project sequence label (e.g. `981-1`) instead of the opaque hash, so analytics shows how deep into a project's task list people get."
	},
	{
		"date": "2026-07-08",
		"type": "refactor",
		"slug": "shrink-dev3-skill",
		"title": "Cut the dev3 skill's token footprint: the Claude SKILL.md no longer duplicates the protocol already injected into the...",
		"body": "Cut the dev3 skill's token footprint: the Claude SKILL.md no longer duplicates the protocol already injected into the system prompt (a PROTOCOL.md fallback covers sessions started outside the launcher), the skill invoke now uses `dev3 current --brief` instead of re-printing the full help and task description, and the shared skill body was rewritten ~40% denser for all agents. A Claude session now carries ~4k tokens of dev3 protocol instead of ~13.5k."
	},
	{
		"date": "2026-07-07",
		"type": "fix",
		"slug": "agent-account-picker-placement",
		"title": "Fixed the agent account switcher in the task-launch picker: the account list now opens above the trigger (it previous...",
		"body": "Fixed the agent account switcher in the task-launch picker: the account list now opens above the trigger (it previously spilled below over the Launch/Cancel buttons) and closes before the confirm dialog. The popover header now reads \"Active account\" with a note that the choice is global — machine-wide, applied to every agent dev3 launches, not per task — and the trigger shows the active account name with a switch caret."
	},
	{
		"date": "2026-07-07",
		"type": "fix",
		"slug": "automation-modal-offscreen",
		"title": "Fixed the automation create/edit modal rendering partially off-screen",
		"body": "Fixed the automation create/edit modal rendering partially off-screen. It was nested inside the Project Settings blur-backed card, whose backdrop-filter trapped the modal's fixed positioning; it now portals to the document body and anchors to the viewport like every other modal.",
		"suggestedBy": "EvgenyAlterman",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/845",
		"issueRef": "#845"
	},
	{
		"date": "2026-07-07",
		"type": "fix",
		"slug": "cli-epipe-broken-pipe",
		"title": "Fixed the dev3 CLI dumping a raw \"EPIPE: broken pipe\" stack trace when its output was piped into a consumer that clos...",
		"body": "Fixed the dev3 CLI dumping a raw \"EPIPE: broken pipe\" stack trace when its output was piped into a consumer that closes early (`dev3 ui state | head`, `| grep -m1`, quitting a pager). The CLI now tolerates a broken stdout/stderr pipe and exits cleanly, so piping through head/grep no longer pollutes otherwise-clean tool output."
	},
	{
		"date": "2026-07-07",
		"type": "docs",
		"slug": "condense-agents-md",
		"title": "Condensed AGENTS.md from ~43.7k to ~34k characters (below the 40k agent-context warning threshold) by removing redund...",
		"body": "Condensed AGENTS.md from ~43.7k to ~34k characters (below the 40k agent-context warning threshold) by removing redundancy and verbose phrasing while preserving every rule, file path, command, and decision-record reference; merged small i18n/testing sub-sections into compact paragraphs."
	},
	{
		"date": "2026-07-07",
		"type": "feature",
		"slug": "fable5-effort-tiers",
		"title": "Added a High effort tier to the Fable 5 Auto and Bypass launch presets (previously only Medium and X-High)",
		"body": "Added a High effort tier to the Fable 5 Auto and Bypass launch presets (previously only Medium and X-High). Expanded the experimental \"Fable 5 (cost trick)\" cost-saving preset into Bypass and Default modes across Medium/High/X-High effort variants (Fable 5 does not behave under auto mode, so auto was dropped). Stored selections of the old single cost-trick preset are remapped to its Bypass Medium tier."
	},
	{
		"date": "2026-07-07",
		"type": "fix",
		"slug": "pull-multiple-branches-retry",
		"title": "Pulling origin now retries once when git fails with \"Cannot fast-forward to multiple branches\" — a transient race wit...",
		"body": "Pulling origin now retries once when git fails with \"Cannot fast-forward to multiple branches\" — a transient race with a concurrent background fetch rewriting FETCH_HEAD. The single retry re-fetches a clean state and clears the error; unrelated pull failures are returned immediately without retrying."
	},
	{
		"date": "2026-07-07",
		"type": "fix",
		"slug": "remote-lan-blank-page",
		"title": "Fixed Remote Access showing a blank page when opened directly over the LAN (non-Cloudflare) — the large JS bundle was...",
		"body": "Fixed Remote Access showing a blank page when opened directly over the LAN (non-Cloudflare) — the large JS bundle was served via Bun's zero-copy sendfile path, which drops the HTTP response headers over a real network socket on macOS, so the browser rejected it and the app never mounted. Static files are now read into memory before being sent, which keeps the response headers intact; Cloudflare tunnel access was unaffected because it reaches the server over loopback."
	},
	{
		"date": "2026-07-06",
		"type": "feature",
		"slug": "agent-account-switcher",
		"title": "Added an agent account switcher: Settings → Agent Accounts keeps multiple Claude Code and Codex logins and hot-swaps ...",
		"body": "Added an agent account switcher: Settings → Agent Accounts keeps multiple Claude Code and Codex logins and hot-swaps the active one without re-login. Claude accounts are isolated CLAUDE_CONFIG_DIR profiles (credentials per account, skills/settings/transcripts shared via symlinks) injected into new sessions; Codex accounts are auth.json snapshots swapped atomically with refreshed-token sync-back. Shows email/org/plan per account and flags out-of-band logins as unmanaged. Claude also supports API profiles — accounts backed by an API key / custom Anthropic-compatible endpoint (Anthropic API, OpenRouter, LiteLLM proxy, Bedrock via extra env vars) instead of a subscription login. The launch picker (Provider → Model → Mode) now shows a \"via <account>\" line under the Provider field whenever the selected provider has managed accounts, with a click-to-open popover for quick global switching without leaving the launch flow. Every switch asks for confirmation with an explicit billing warning (new sessions bill to the target account; running sessions are unaffected). An API profile's model now truly overrides the preset's --model flag, and the same login can be added from several organizations (duplicates are detected per account + organization). API profiles are now fully editable — the pencil on an API row reopens the whole form prefilled (base URL, key, models, extra env, label); the key is shown masked with a reveal toggle. Beyond a single \"override all models\" field, each Claude alias slot (Opus/Sonnet/Haiku/Fable) can be pointed at its own provider model id with an optional /model display name and description — dev3 rewrites the launch --model per family and exports the ANTHROPIC_DEFAULT_*_MODEL vars for aliases, background tasks and subagents. Each slot's display name auto-fills from the model id's last path segment (editable), and every field shows a realistic example placeholder. Every field carries an (i) tooltip, and the switch warning now reminds you that the account only applies to agents dev3 launches (Spawn agent, Find bugs, …), not a hand-run `claude`. Switching from an API profile back to a normal login now actively unsets the profile's ANTHROPIC_BASE_URL / ANTHROPIC_API_KEY / model vars in new sessions (they previously leaked through the long-lived tmux server env and hijacked OAuth sessions)."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "agent-pane-prompt-routing",
		"title": "Fixed the Create-PR / auto-merge / rebase-conflict hand-off writing its prompt into whatever pane happened to be focused",
		"body": "Fixed the Create-PR / auto-merge / rebase-conflict hand-off writing its prompt into whatever pane happened to be focused. When a task has exactly one live agent pane, the prompt now always goes there even if a shell or dev-server split is active; with two or more agent panes it still respects the active pane.",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/609",
		"issueRef": "#609"
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "branch-rename-gui-desync",
		"title": "Fixed the task branch name shown in the GUI (header, cards, detail modal) staying stale after the branch was renamed ...",
		"body": "Fixed the task branch name shown in the GUI (header, cards, detail modal) staying stale after the branch was renamed inside the worktree. getBranchStatus already re-synced the stored name but never notified the renderer; it now broadcasts a taskUpdated push so every open surface re-renders with the live branch."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "branch-search-dash",
		"title": "Fixed the \"use existing branch\" search in the new-task modal returning no results once the typed query contained a dash",
		"body": "Fixed the \"use existing branch\" search in the new-task modal returning no results once the typed query contained a dash. The query is now tokenized on the same separators as branch names (/, -, _, .), so a dashed query like \"login-page\" matches instead of falling through."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "brew-upgrade-resilience",
		"title": "Survive Homebrew fighting the in-app updater: child processes now default their working directory to ~/.dev3.0 so a `...",
		"body": "Survive Homebrew fighting the in-app updater: child processes now default their working directory to ~/.dev3.0 so a `brew upgrade` that replaces (or rips away) the .app bundle can no longer break child process spawning (tmux ENOENT) in the running instance, and the Homebrew cask is marked `auto_updates true` so a bulk `brew upgrade` skips dev3 instead of colliding with in-app-updated installs (explicit `brew upgrade --cask dev3` still works). Also adds `dev3 doctor` — a read-only install health check (app bundle, tmux shim, pinned tmux keg, Homebrew cask/formula state) that works without the app running and prints the exact fix command for anything broken — plus a README troubleshooting section covering the same recovery scenarios."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "bump-push-single-tag",
		"title": "Fixed the version bump script pushing all local tags (`git push --tags`) instead of just the new release tag",
		"body": "Fixed the version bump script pushing all local tags (`git push --tags`) instead of just the new release tag. GitHub silently drops the push event when more than 3 tags are pushed at once, so a bulk push containing stale local tags could swallow the Release workflow trigger entirely (this bit the v1.30.0 release)."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "cloudflared-install-command-visible",
		"title": "Made the cloudflared install command in the Remote Access (Cloudflare Tunnel) section readable and copyable — it was ...",
		"body": "Made the cloudflared install command in the Remote Access (Cloudflare Tunnel) section readable and copyable — it was rendered in the lowest-contrast tiny text. It now shows as a warning-colored monospace code block with a one-click copy button, matching the yazi \"not installed\" install-command pattern."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "desktop-blank-window-chdir",
		"title": "Fixed the desktop window opening blank grey with \"Resource not found\" errors",
		"body": "Fixed the desktop window opening blank grey with \"Resource not found\" errors. A recent startup change moved the process working directory away from the .app bundle, which broke electrobun's views:// asset resolution and the native bridge. The process now stays put; child processes are instead pinned to ~/.dev3.0 so the original brew-upgrade resilience is preserved."
	},
	{
		"date": "2026-07-06",
		"type": "feature",
		"slug": "dev-mode-fresh-window",
		"title": "Local dev launches (`bun run dev` / `bun run start`) now open a fresh, centered window on the dashboard instead of re...",
		"body": "Local dev launches (`bun run dev` / `bun run start`) now open a fresh, centered window on the dashboard instead of restoring the last window geometry, macOS fullscreen, and last open task. Gated by the `DEV3_FRESH_START=1` env var set by those scripts; dev runs also stop persisting window/route state so they never clobber the shared prod state. Prod builds are unaffected."
	},
	{
		"date": "2026-07-06",
		"type": "refactor",
		"slug": "git-pull-spinner-unify",
		"title": "Replaced the git-pull button's CSS ring spinner with the smoother SVG spinner already used by the \"checking for updat...",
		"body": "Replaced the git-pull button's CSS ring spinner with the smoother SVG spinner already used by the \"checking for updates\" header indicator, so both loading states look identical."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "image-viewer-size-thumbnails",
		"title": "Enlarged the shared-image viewer to fill ~90% of the viewport (≈5% margin each side) instead of a small capped card, ...",
		"body": "Enlarged the shared-image viewer to fill ~90% of the viewport (≈5% margin each side) instead of a small capped card, and made it eager-load every image so the thumbnail rail always shows a real picture instead of a placeholder icon that only filled in as you scrubbed between shots."
	},
	{
		"date": "2026-07-06",
		"type": "feature",
		"slug": "llm-provider-bedrock",
		"title": "Added a per-agent LLM Provider toggle in Settings → Coding Agents — each agent can run on its native API (default) or...",
		"body": "Added a per-agent LLM Provider toggle in Settings → Coding Agents — each agent can run on its native API (default) or a registered third-party backend (Amazon Bedrock for Claude). The toggle lives inside the agent's row and only appears for agents that have a backend. Selecting a third-party provider injects its environment (CLAUDE_CODE_USE_BEDROCK, mapped model id, geo) into that agent's launches and omits dev3's native --model alias, which the provider rejects with a 400. Known models map to provider-native ids automatically; a per-model override field handles region-pinned inference profiles, ARNs, or new models. Providers are defined in a registry, so new backends can be added with a single entry."
	},
	{
		"date": "2026-07-06",
		"type": "feature",
		"slug": "makefile-targets",
		"title": "The Scripts (ƒ) dropdown now also parses the worktree's Makefile and lists its targets alongside package.json scripts",
		"body": "The Scripts (ƒ) dropdown now also parses the worktree's Makefile and lists its targets alongside package.json scripts. Pick a target and it runs `make <target>` in a tmux pane, just like npm scripts. Variable assignments, pattern rules and .PHONY declarations are ignored."
	},
	{
		"date": "2026-07-06",
		"type": "feature",
		"slug": "mobile-header-fold-stateful-widgets",
		"title": "On narrow (mobile) viewports the global header no longer shows the prevent-sleep, rate-limit, git-pull, and tmux-sess...",
		"body": "On narrow (mobile) viewports the global header no longer shows the prevent-sleep, rate-limit, git-pull, and tmux-sessions widgets inline; they now fold into the kebab (⋮) bottom sheet as a controls strip, decluttering the mobile header. Their popovers/modals layer above the sheet."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "mobile-new-task-modal",
		"title": "Made the New Task creation modal usable on narrow/mobile viewports: the fixed 520px width now clamps to the viewport,...",
		"body": "Made the New Task creation modal usable on narrow/mobile viewports: the fixed 520px width now clamps to the viewport, the modal scrolls instead of clipping the Save actions on short screens, and the footer action buttons wrap gracefully instead of cramming into one overflowing row. The label selector is now compact too — instead of listing every project label as an always-visible chip grid, it shows only the selected labels as chips plus an \"+ Add Label\" button that opens the searchable label picker (the same popover already used on task cards and in task detail)."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "mobile-task-actions-sheet",
		"title": "Rebuilt the Task actions bottom sheet on narrow (mobile) viewports",
		"body": "Rebuilt the Task actions bottom sheet on narrow (mobile) viewports. It was a dumping ground of dense desktop icon buttons; it is now a short, curated list of full-width touch rows. Desktop-only actions that make no sense on a phone were dropped from mobile (open-in editors/file browser, scripts, tmux layout controls, dev server, git mutations, worktree config, include-tests) — the diff stays reachable via the summary-bar badge. Kept: watch, spawn agent, bug hunters, exposed ports/tunnels (open the running app on the phone), shared images, and read-only details."
	},
	{
		"date": "2026-07-06",
		"type": "feature",
		"slug": "name-tmux-windows",
		"title": "Agents are now told to give any tmux window they open a short human name (dev-server, logs, tests) via -n or rename-w...",
		"body": "Agents are now told to give any tmux window they open a short human name (dev-server, logs, tests) via -n or rename-window, and to proactively rename windows still stuck on a generic auto-name (node/zsh/bash/claude) whenever they list the session — so the terminal tabs read clearly instead of \"node\"/\"zsh\"."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "pages-deploy-spam",
		"title": "Replace GitHub's auto legacy \"Deploy from a branch\" Pages workflow with a custom Actions workflow that only runs when...",
		"body": "Replace GitHub's auto legacy \"Deploy from a branch\" Pages workflow with a custom Actions workflow that only runs when docs/ changes, serializes deploys via a concurrency group, retries the deploy once in-job to absorb transient \"Deployment failed, try again later.\" backend errors, and never fails the run (emits a warning instead) — eliminating the false \"Run failed\" deployment emails."
	},
	{
		"date": "2026-07-06",
		"type": "feature",
		"slug": "pxpipe-cost-trick-preset",
		"title": "Added an opt-in \"Fable 5 (cost trick)\" agent preset that routes Claude through the local pxpipe token-saving proxy (A...",
		"body": "Added an opt-in \"Fable 5 (cost trick)\" agent preset that routes Claude through the local pxpipe token-saving proxy (ANTHROPIC_BASE_URL). It appears as its own greyed-out Model choice in the launch picker while disabled; clicking it links to a new Global Settings \"Token-saving proxy\" section that checks npx, detects the port 47821 owner (ours vs foreign), and starts/stops the proxy. The section always shows a credit link to the upstream repo, and surfaces the proxy dashboard link (savings breakdown) inside the status block once the proxy is running. The trick and proxy are the work of the pxpipe team (github.com/teamchong/pxpipe); it is experimental and ships off by default — slower, but typically halves request cost or more, with virtually unchanged accuracy."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "quick-shell-chromeless-view",
		"title": "Fixed Quick Shell (⇧⌘`) opening a scratch op in a chrome-less terminal with no task header or tmux controls",
		"body": "Fixed Quick Shell (⇧⌘`) opening a scratch op in a chrome-less terminal with no task header or tmux controls. The full-page task view now loads its project's tasks so the header always renders, and Quick Shell honors the task open-mode preference (split by default) instead of forcing a bare fullscreen terminal."
	},
	{
		"date": "2026-07-06",
		"type": "feature",
		"slug": "rebase-conflict-agent-handoff",
		"title": "The Rebase git button now handles conflicts instead of going dead",
		"body": "The Rebase git button now handles conflicts instead of going dead. When the branch can rebase cleanly it still runs `git rebase` in a visible terminal pane as before; when it can't (conflicts), the button stays enabled, relabels to \"Rebase (AI)\", and hands the rebase off to the agent in the task terminal — the same mechanism as the Create-PR button — with a toast confirming the handoff."
	},
	{
		"date": "2026-07-06",
		"type": "refactor",
		"slug": "remove-board-split-mode",
		"title": "Removed the Kanban board split-view mode from the task view",
		"body": "Removed the Kanban board split-view mode from the task view. The \"Show board\" / \"Show sidebar\" toggle buttons are gone; the task view now always shows the Active Tasks sidebar next to the terminal. The full Kanban board is still reachable via the breadcrumb."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "scripts-dropdown-overflow",
		"title": "Fixed the Scripts runner dropdown overflowing past the right screen edge on narrow windows (mobile/remote browser)",
		"body": "Fixed the Scripts runner dropdown overflowing past the right screen edge on narrow windows (mobile/remote browser). The popover now shrinks its width to fit the viewport and keeps a 16px gutter on both sides instead of using a fixed 24rem width."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "spawn-agent-codex-trust",
		"title": "Fixed spawning an extra Codex agent (Spawn Agent modal) or a Codex bug-hunter crashing with \"--profile dev3-dark cann...",
		"body": "Fixed spawning an extra Codex agent (Spawn Agent modal) or a Codex bug-hunter crashing with \"--profile dev3-dark cannot be used while config.toml contains legacy profile\". The spawn paths now run the same worktree-trust / Codex config re-patch step the primary task launch does, so the stale legacy profile table is stripped before Codex launches."
	},
	{
		"date": "2026-07-06",
		"type": "feature",
		"slug": "task-switcher-shift-toggle",
		"title": "In the Option+Tab task switcher, Shift now toggles the \"all projects\" scope with a single tap (sticky) instead of onl...",
		"body": "In the Option+Tab task switcher, Shift now toggles the \"all projects\" scope with a single tap (sticky) instead of only working while held, with a clear scope-toggle hint in the footer. The overlay is also wider and each task's overview is shown on up to two more-legible lines with larger terminal thumbnails, so tasks are easier to tell apart."
	},
	{
		"date": "2026-07-06",
		"type": "fix",
		"slug": "test-log-isolation",
		"title": "Unit tests no longer pollute the real ~/.dev3.0/logs with fake ERROR/WARN lines: logger.ts now redirects to an isolat...",
		"body": "Unit tests no longer pollute the real ~/.dev3.0/logs with fake ERROR/WARN lines: logger.ts now redirects to an isolated tmp dir under vitest (or a DEV3_LOG_DIR override), so no test worker touches the production daily log."
	},
	{
		"date": "2026-07-05",
		"type": "feature",
		"slug": "3section-agent-picker-everywhere",
		"title": "Extracted the Provider → Model → Mode launch picker into a shared AgentConfigPicker component and rolled it out to ev...",
		"body": "Extracted the Provider → Model → Mode launch picker into a shared AgentConfigPicker component and rolled it out to every surface that still used the old two-dropdown Agent + Configuration form: Spawn Agent, Spawn Bug Hunters, the global default-agent setting, and the per-column auto-launch agent. Also gave Fable 5 explicit Medium and X-High effort tiers for Auto and Bypass, mirroring Opus 4.8."
	},
	{
		"date": "2026-07-05",
		"type": "feature",
		"slug": "agent-rate-limit-indicator",
		"title": "Added an ambient agent rate-limit indicator to the global header: dev-3.0 now tracks Claude Code limit windows (5h/7d...",
		"body": "Added an ambient agent rate-limit indicator to the global header: dev-3.0 now tracks Claude Code limit windows (5h/7d, % used + time-to-reset) by routing launched sessions' statusLine through a `dev3 statusline` wrapper (the user's own statusLine keeps working — dev3 delegates to it and appends a compact usage segment), and Codex windows/credits parsed from local session rollout files. The header gauge stays quiet below 80%, escalates to warning/danger colors at 80%/95%, and details live in its tooltip; a Global Settings → Behavior toggle disables the whole mechanism. No API calls — everything is parsed from local files."
	},
	{
		"date": "2026-07-05",
		"type": "feature",
		"slug": "automations-scheduled-agent-runs",
		"title": "Added Automations — scheduled agent runs",
		"body": "Added Automations — scheduled agent runs. Each project can define recurring schedules (RFC 5545 RRULE subset + IANA timezone) that fire a stored prompt with a chosen agent: every fire creates an ordinary task (worktree + tmux + agent) on the board, with a clock provenance glyph on the card. Runs are tracked (created / failed / missed); occurrences missed while the app was offline surface as a toast and can optionally catch up with a single run. Managed from a new Automations tab in Project Settings and via `dev3 automations` (list/show/create/update/delete/run/templates). Ships a built-in \"What I shipped\" weekly report template — a recurring AI digest of completed and in-flight work across projects. The New Task modal footer links straight to the Automations tab for discoverability."
	},
	{
		"date": "2026-07-05",
		"type": "feature",
		"slug": "help-mode-header-button",
		"title": "Added a bright animated \"?\" button to the global header — visible on every screen, it triggers help mode (\"Explain th...",
		"body": "Added a bright animated \"?\" button to the global header — visible on every screen, it triggers help mode (\"Explain this screen\", same as ⇧⌘/). The hand-drawn icon redraws its question-mark curve and drops the dot in on hover, matching the other animated header glyphs. Escape now only exits help mode instead of also navigating back a screen, and the header's Project Terminal button label was shortened to \"Terminal\" to keep the row compact."
	},
	{
		"date": "2026-07-05",
		"type": "fix",
		"slug": "macho-headerpad-codesign",
		"title": "Fixed macOS Intel (x86_64) builds crashing instantly on launch: Apple's codesign silently overwrote the start of the ...",
		"body": "Fixed macOS Intel (x86_64) builds crashing instantly on launch: Apple's codesign silently overwrote the start of the code section in Electrobun's zero-headerpad Zig binaries (launcher/extractor/libasar), producing signed, notarized apps that segfault. Release CI now reserves a code-signature slot in these binaries before signing, and a new gate verifies every shipped Mach-O and smoke-runs the launcher on a native Intel runner so this class of corruption can never ship silently again. The release workflow also gained a dry-run mode (`test-*` tags or manual dispatch) that builds, signs and gates everything without publishing to S3/GitHub/Homebrew — so fixes like this can be verified in CI without pushing an update to users.",
		"suggestedBy": "AlexanderVase",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/563",
		"issueRef": "#563"
	},
	{
		"date": "2026-07-05",
		"type": "fix",
		"slug": "mobile-dense-terminal-zoom",
		"title": "On mobile devices the task terminal and diff screens now render at ~2/3 scale (1.5× denser), fitting noticeably more ...",
		"body": "On mobile devices the task terminal and diff screens now render at ~2/3 scale (1.5× denser), fitting noticeably more content where space is scarce. Board, dashboard, and settings keep the regular mobile scale. The dense factor multiplies the user's zoom setting without changing it, and the terminal font follows automatically."
	},
	{
		"date": "2026-07-05",
		"type": "fix",
		"slug": "notification-click-focus-task",
		"title": "Clicking a native macOS notification now reliably focuses the task that triggered it, whenever the click happens",
		"body": "Clicking a native macOS notification now reliably focuses the task that triggered it, whenever the click happens. A small compiled UNUserNotificationCenter shim gives the app real notification-click callbacks (Electrobun's API is fire-and-forget), replacing the old 3-second window-focus guess; clicks that arrive while the app has no window reopen one and still navigate to the task. Linux and permission-denied setups keep the previous focus-proxy behavior."
	},
	{
		"date": "2026-07-05",
		"type": "fix",
		"slug": "pin-tmux-36-vendored-keg",
		"title": "Pin tmux to 3.6a: tmux 3.7 clients busy-spin at 100% CPU on a congested server socket, freezing the UI for 10-35s",
		"body": "Pin tmux to 3.6a: tmux 3.7 clients busy-spin at 100% CPU on a congested server socket, freezing the UI for 10-35s. The Homebrew cask/formula now depend on the keg-only h0x91b/dev3/tmux@3.6, the app prefers that keg over PATH, a `~/.dev3.0/bin/tmux` shim keeps agent-issued tmux commands on the same binary, and a live-server compatibility probe keeps existing sessions alive across the upgrade."
	},
	{
		"date": "2026-07-05",
		"type": "fix",
		"slug": "stuck-restart-to-update",
		"title": "Fixed the \"Restart to Update\" button silently doing nothing",
		"body": "Fixed the \"Restart to Update\" button silently doing nothing. Electrobun's checkForUpdate() overwrites its in-memory state with the remote update.json (which has no updateReady field), so any periodic or manual check after a download wiped the ready flag and made apply refuse to run. The apply path now self-heals by re-running the (cheap, idempotent) download before restarting, download/apply are serialized so a background check can't wipe state mid-click, and an apply failure now surfaces as an error toast instead of being swallowed.",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/813",
		"issueRef": "#813"
	},
	{
		"date": "2026-07-05",
		"type": "fix",
		"slug": "tmux-shim-self-symlink-eloop",
		"title": "Fixed the tmux PATH shim (`~/.dev3.0/bin/tmux`) symlinking onto itself for users without the vendored tmux@3.6 keg (e.g",
		"body": "Fixed the tmux PATH shim (`~/.dev3.0/bin/tmux`) symlinking onto itself for users without the vendored tmux@3.6 keg (e.g. after an in-app update, which cannot install brew dependencies) — every tmux spawn then failed with ELOOP and no session could start or resume. Binary resolution now dereferences the shim to its real target, refuses to point the shim at itself, and removes an already-broken shim at startup so affected installs self-heal. Also logs a warning when the selected tmux is the known-bad 3.7, and documents the `brew trust h0x91b/dev3` step newer Homebrew requires for tap installs/upgrades. Follow-up: the startup self-heal itself crashed the whole app on poisoned installs — it logged through a module-level logger declared further down the file (a temporal-dead-zone access), so the app died before showing a window; the logger is now initialized before any module-load code runs."
	},
	{
		"date": "2026-07-04",
		"type": "fix",
		"slug": "cli-data-layer-races-and-prefix-guards",
		"title": "Fixed four data-layer bugs in the dev3 CLI: concurrent `note add`/`note delete`/`label create`/`label delete` no long...",
		"body": "Fixed four data-layer bugs in the dev3 CLI: concurrent `note add`/`note delete`/`label create`/`label delete` no longer lose each other's writes (they now recompute inside the file lock); a too-short or ambiguous `--task`/`--project` prefix is rejected instead of silently resolving to the wrong entity; `label set` rejects unknown label IDs instead of persisting garbage; and launching a To Do task with variants now carries its notes and overview onto the variants instead of dropping them."
	},
	{
		"date": "2026-07-04",
		"type": "fix",
		"slug": "ctrl-c-quits-dev-app",
		"title": "Fixed Ctrl+C being completely ignored when the app runs under `bun run dev`",
		"body": "Fixed Ctrl+C being completely ignored when the app runs under `bun run dev`. Two layered causes: the shell-env bootstrap's interactive zsh stole the terminal's foreground process group and left it dead (SIGINT was delivered to nobody) — the shell now runs with job control disabled (`+m`); and the unified quit gate intercepted signal-initiated quits behind the GUI confirmation dialog — SIGINT/SIGTERM now bypass the dialog and shut down gracefully with full cleanup."
	},
	{
		"date": "2026-07-04",
		"type": "fix",
		"slug": "data-layer-race-conditions",
		"title": "Fix three task-lifecycle race conditions found in a bug-hunt pass",
		"body": "Fix three task-lifecycle race conditions found in a bug-hunt pass. Guard-blocked `completed`/`cancelled` moves no longer tear down the worktree/PTY before the status guard check. The terminal-bell auto-transition now guards on still-in-progress inside the lock, so a late bell can't drag an already-reviewed task back to user-questions. `addAttempts` allocates variant indices atomically inside the task file lock, so concurrent calls can't mint duplicate variant numbers in one group."
	},
	{
		"date": "2026-07-04",
		"type": "fix",
		"slug": "lint-and-ci-test-gaps",
		"title": "Fix two CI gate gaps found by a bug-hunt pass: `bun run lint` silently reported success when tsc failed to run at all...",
		"body": "Fix two CI gate gaps found by a bug-hunt pass: `bun run lint` silently reported success when tsc failed to run at all (corrupt tsconfig, missing binary, crash) because it only surfaced diagnostics prefixed with `src/` and never checked the exit code — it now fails loudly on global/config tsc errors and on a nonzero exit without per-file diagnostics. Also wired the CLI test suite (vitest.config.cli.ts, ~470 tests, including the exit-code contract test) into `bun run test` and `bun run test:full`, which previously never ran it — so it now actually gates CI. Also made the getAccessUrl tests hermetic against an inherited DEV3_REMOTE_STATIC_CODE env var (they failed inside dev3-managed worktree shells)."
	},
	{
		"date": "2026-07-04",
		"type": "fix",
		"slug": "main-loop-spawnsync-stalls",
		"title": "Fixed multi-second UI freezes (frozen terminals stuck on \"Connecting...\") caused by synchronous process spawns blocki...",
		"body": "Fixed multi-second UI freezes (frozen terminals stuck on \"Connecting...\") caused by synchronous process spawns blocking the main event loop. The port-scanner and resource-monitor pollers ran `lsof`, `ps`, and two `tmux list-panes` per session every 10 seconds via spawnSync — with many active sessions under load this stalled the loop for seconds (loop-monitor recorded up to 91 minutes of cumulative stalls in one day). All process-inspection primitives are now async, per-session tmux calls are batched into a single `list-panes -a`, the `codex --version` probe is cached instead of re-spawned on every task launch, and slow spawnSync calls (≥250ms) are now logged with their command for future field diagnosis. Also stopped the caffeinate sleep-inhibit from retry-spamming ENOENT errors every 10 seconds."
	},
	{
		"date": "2026-07-04",
		"type": "fix",
		"slug": "port-alloc-race-and-startup-hardening",
		"title": "Fixed three bootstrap-layer bugs found in a bug-hunt pass: concurrent port allocation could hand two parallel task va...",
		"body": "Fixed three bootstrap-layer bugs found in a bug-hunt pass: concurrent port allocation could hand two parallel task variants overlapping ports (now serialized with a cross-process file lock that re-reads assignments under the lock); the dev-channel Vite probe fetch had no timeout and could hang app startup forever if something squatted port 5173 (now bounded to 1s); and the dev3 CLI binary was copied non-atomically on every launch, so an agent exec'ing it mid-copy could hit a partial binary (now written to a temp sibling and atomically renamed into place)."
	},
	{
		"date": "2026-07-04",
		"type": "chore",
		"slug": "tips-policy-gate-and-prune",
		"title": "Rewrote the \"Did you know?\" tips policy in AGENTS.md — tips are no longer mandatory per feature; a new tip must pass ...",
		"body": "Rewrote the \"Did you know?\" tips policy in AGENTS.md — tips are no longer mandatory per feature; a new tip must pass a three-part gate (hidden/non-obvious value, honest score >= 3, no existing coverage), with a \"never write a tip for\" list and a registry-hygiene rule. Pruned 36 low-value tips from the registry (duplicates, self-describing UI, and over-served clusters like stats/mobile/remote/diff) and merged the multiline-comment and Ctrl+D pane-close hints into their surviving sibling tips, leaving 101 tips."
	},
	{
		"date": "2026-07-04",
		"type": "fix",
		"slug": "tmux-server-dead-cwd-panes",
		"title": "Fixed all new tmux panes (setup, rebase/git-op panes, splits, dev-server) starting in a wrong deleted directory after...",
		"body": "Fixed all new tmux panes (setup, rebase/git-op panes, splits, dev-server) starting in a wrong deleted directory after the Homebrew tmux 3.7 upgrade. The tmux server daemonized with the first task's worktree as its cwd; once that worktree was deleted, tmux 3.7 silently ignored `-c` everywhere. tmux clients now always spawn from the immortal `~/.dev3.0` and the pane cwd is passed explicitly via `-c`. Also fixed UI splits/new-window opening inside the .app bundle when tmux reports an empty `pane_current_path` — the `-c` format now falls back to `#{session_path}` (the task worktree)."
	},
	{
		"date": "2026-07-04",
		"type": "fix",
		"slug": "ui-rendering-bugs",
		"title": "Fixed four UI rendering bugs found in a bug-hunt pass: dragging to reorder a task within a Kanban column dropped it a...",
		"body": "Fixed four UI rendering bugs found in a bug-hunt pass: dragging to reorder a task within a Kanban column dropped it at the wrong (doubled) position because the drop-index counted both the card wrapper and the card root; a drop below the visible cards in a truncated column (>15 tasks) silently moved the task into the hidden tail; the task-age badge showed \"0y\" for ages between 360 and 364 days; and colon-form ANSI color codes (e.g. 38:5:196) leaked as raw text in terminal previews instead of rendering as color."
	},
	{
		"date": "2026-07-04",
		"type": "chore",
		"slug": "vite-8-upgrade",
		"title": "Upgraded Vite 6 to 8 (Rolldown-based) and @vitejs/plugin-react 4 to 6",
		"body": "Upgraded Vite 6 to 8 (Rolldown-based) and @vitejs/plugin-react 4 to 6. Build output structure, asset paths, and dev-server behavior are unchanged; production builds are noticeably faster. Also made remote-access-server tests hermetic against the DEV3_REMOTE_STATIC_CODE env var that dev3 agent sessions export."
	},
	{
		"date": "2026-07-03",
		"type": "feature",
		"slug": "agent-picker-provider-model-mode",
		"title": "Redesigned the Launch Task / add-variant agent picker from a flat 2-field control (Agent + one long Configuration dro...",
		"body": "Redesigned the Launch Task / add-variant agent picker from a flat 2-field control (Agent + one long Configuration dropdown — 21 presets for Claude) into a 3-field Provider → Model → Mode cascade, so you narrow from ~4 models to ≤7 modes instead of scanning one 21-row list. Purely a UI grouping over the existing presets — the flat configId stays the storage key, so nothing migrates and per-preset curation is preserved. Changing the model keeps your current mode kind when the new model has it."
	},
	{
		"date": "2026-07-03",
		"type": "feature",
		"slug": "animated-tmux-icons",
		"title": "Tmux toolbar icons now animate on hover, acting out the operation they trigger: splits saw their divider across, cycl...",
		"body": "Tmux toolbar icons now animate on hover, acting out the operation they trigger: splits saw their divider across, cycle-layout swaps the panes, zoom inflates the pane, close draws the X and blinks the pane out, layout presets draw their dividers, and the mobile New Window icon pops into existence. Shared glyph components live in TmuxIcons.tsx. The git action row (Show Diff, Rebase, Push, Create PR, PR + auto-merge, Merge) and the diff include-tests toggle now use matching hand-drawn animated icons (GitIcons.tsx): the diff types its added line and blinks the removed one, the rebase commit rides the rail to the tip, the push arrow flies into the cloud, the PR sparkle twinkles, the auto-merge bolt strikes, the merge commit lands, the tests flask boils. Git buttons are flex-centered and use compact labels (Diff, PR, Auto PR) so the row with icons stays no wider than before. The desktop tmux pane toolbar also gains a green New Window button (between the split buttons and the layout pill) that runs tmux new-window, with the same animated icon. The global header's Report and Changelog buttons are now icon-only (labels dropped, tooltips kept) to tighten the row. The entire top header row was then redesigned: the old mix of Nerd Font glyphs and ad-hoc inline SVGs (back, forward, home breadcrumb, project dropdown, no-sleep coffee/lock, quick shell, project terminal, pull with its refresh/success/alert states, remote QR, productivity stats, GitHub, report, changelog, overflow kebab, project-settings wrench, global-settings sliders, update-ready) is replaced by a single hand-drawn stroke set (HeaderIcons.tsx) matching the tmux and git icon style, each with a hover animation acting out its operation. The task header row was redesigned the same way: the watch toggle, bug-hunter and spawn-agent buttons, worktree settings, Open in…, file browser, scripts, ports, shared images, and the fullscreen / collapse panel chrome now use a single hand-drawn stroke set (TaskIcons.tsx), each with a hover animation acting out its operation — the watch bell rings with sound waves, the caught bug squirms under a focusing lens (so it stops looking identical to the header's report-a-bug glyph), the agent robot tilts hello and pings, the open-in arrow launches out of its box, the file and port trees wire themselves up, the scripts ƒ writes itself, the images sun rises at golden hour, the settings gear ratchets, the fullscreen corners fly, the panel chevron dips with a ghost echo."
	},
	{
		"date": "2026-07-03",
		"type": "feature",
		"slug": "close-pane-hotkey-hints",
		"title": "Surface how to close a terminal pane in the hotkeys reference: the \"i\" tmux hints popover and the ⌘/ Keyboard Shortcu...",
		"body": "Surface how to close a terminal pane in the hotkeys reference: the \"i\" tmux hints popover and the ⌘/ Keyboard Shortcuts overlay now list Ctrl+D (exit shell → close pane) alongside the existing ⌃B x. Added a matching \"Did you know?\" tip. Cmd+W already closes a pane in iTerm2 keyboard mode (shown under the popover's Keyboard Mode toggle)."
	},
	{
		"date": "2026-07-03",
		"type": "feature",
		"slug": "close-pane-picker",
		"title": "Close Pane is now a two-step visual picker instead of blindly killing the active pane: click it, then hover the exact...",
		"body": "Close Pane is now a two-step visual picker instead of blindly killing the active pane: click it, then hover the exact tmux split you mean and click to close it. Each pane shows an inset marching-ants marquee — neutral blue while idle, turning red with a \"Close\" chip on hover — under a readable mode hint; Esc cancels. The last-pane teardown still asks for confirmation, and narrow/mobile keeps the direct-kill fallback."
	},
	{
		"date": "2026-07-03",
		"type": "fix",
		"slug": "config-show-source-provenance",
		"title": "`dev3 config show` now reports an accurate source for every setting — local, repo, project, default, or unset — inste...",
		"body": "`dev3 config show` now reports an accurate source for every setting — local, repo, project, default, or unset — instead of collapsing project-object values, defaults, and truly-unset keys into a misleading \"global\". Object-valued fields like builtinColumnAgents render as a readable summary rather than \"[object Object]\"."
	},
	{
		"date": "2026-07-03",
		"type": "fix",
		"slug": "dev-server-status-version-skew-crash",
		"title": "Fixed `dev3 dev-server status` crashing with \"undefined is not an object (evaluating 'ports.length')\" when a newer CL...",
		"body": "Fixed `dev3 dev-server status` crashing with \"undefined is not an object (evaluating 'ports.length')\" when a newer CLI talks to an older running app that never sent the `devPorts`/`portConflicts` fields. The CLI now normalizes the status payload, defaulting missing array fields to empty, so status renders cleanly regardless of CLI/app version skew."
	},
	{
		"date": "2026-07-03",
		"type": "feature",
		"slug": "inline-help-system",
		"title": "Added an inline help system: fast styled tooltips replace the slow native hovers on icon toolbars, small (i) icons in...",
		"body": "Added an inline help system: fast styled tooltips replace the slow native hovers on icon toolbars, small (i) icons in section headers (settings, board columns, modals, diff viewer, stats) open rich help cards explaining what each section does, and a new help mode (⇧⌘/ or Help → Explain This Screen) highlights every zone of the current screen with clickable explanations. Toolbar tooltips are two-tier: a bold headline naming the control plus a detailed line explaining what it does and why (e.g. tmux pane controls now say what tmux does). All help content lives in one localized registry (en/ru/es), documented as UX bible §5.4."
	},
	{
		"date": "2026-07-03",
		"type": "fix",
		"slug": "invisible-task-partial-create",
		"title": "Fixed a bug in the Create Task modal where a task created successfully but failing to apply its custom title or label...",
		"body": "Fixed a bug in the Create Task modal where a task created successfully but failing to apply its custom title or labels would vanish from the board (invisible orphan) and let a retry create a duplicate. The new task now appears on the board immediately after creation; title/label application is a non-fatal follow-up that surfaces a warning without hiding the task or blocking the modal."
	},
	{
		"date": "2026-07-03",
		"type": "fix",
		"slug": "isolate-qa-browser-per-agent",
		"title": "Isolated the browser-QA flow per task so parallel agents stop stomping each other",
		"body": "Isolated the browser-QA flow per task so parallel agents stop stomping each other. The debug-ui skill now exports AGENT_BROWSER_SESSION=\"dev3-${DEV3_TASK_ID%%-*}\" before driving agent-browser, giving each task its own isolated browser session/profile instead of the shared global \"default\" one where one agent's navigation leaked into another's screenshot. Documented the singleton gotcha in the skill and AGENTS.md."
	},
	{
		"date": "2026-07-03",
		"type": "feature",
		"slug": "iterm2-keymap-default",
		"title": "iTerm2 terminal hotkeys (⌘D/⌘⇧D split, ⌘W close pane, ⌘T new window, ⌘[/⌘] navigate) now ship on by default instead o...",
		"body": "iTerm2 terminal hotkeys (⌘D/⌘⇧D split, ⌘W close pane, ⌘T new window, ⌘[/⌘] navigate) now ship on by default instead of being opt-in. Anyone who explicitly picked the plain \"Default\" keymap keeps it, and the opt-out now survives a settings round-trip."
	},
	{
		"date": "2026-07-03",
		"type": "feature",
		"slug": "shutting-down-card-state",
		"title": "Task cards now show a muted \"Shutting down…\" state (the opposite of the blue \"preparing\" loader) while a completed/ca...",
		"body": "Task cards now show a muted \"Shutting down…\" state (the opposite of the blue \"preparing\" loader) while a completed/cancelled task tears down its session and worktree — a window that can last several seconds. The card is greyed and locked (not openable, no context menu) until teardown finishes, so you no longer click a card whose worktree is being destroyed."
	},
	{
		"date": "2026-07-03",
		"type": "chore",
		"slug": "vendor-ux-skills",
		"title": "Vendored the ux-principal and ux-create-manifest agent skills into .claude/skills and put them on a doc diet: plannin...",
		"body": "Vendored the ux-principal and ux-create-manifest agent skills into .claude/skills and put them on a doc diet: planning reports are now chat/PR output with zero file writes by default, manifest files are touched only when an explicit architecture-change gate passes, and the canonical docs/ux footprint shrank to three files (bible with glossary folded in, yaml, compact decisions log). Deleted 20 stale feature-plans, the manifest changelog, and the audit report (456 KB → 136 KB); compacted UX_DECISIONS.md from 100 KB to 29 KB with stale statuses corrected."
	},
	{
		"date": "2026-07-02",
		"type": "feature",
		"slug": "agent-usage-dashboard",
		"title": "The Velocity Cockpit now shows agent token usage and an API-equivalent cost for the selected period, reconstructed en...",
		"body": "The Velocity Cockpit now shows agent token usage and an API-equivalent cost for the selected period, reconstructed entirely from local Claude Code transcripts (no API calls). The cost is what the usage would run at public API rates — on a subscription it's included/subsidized, not a bill."
	},
	{
		"date": "2026-07-02",
		"type": "feature",
		"slug": "alt-click-move-terminal-cursor",
		"title": "Added iTerm2-style Alt/Option-click in the terminal to move the shell cursor: at a plain shell prompt, holding Option...",
		"body": "Added iTerm2-style Alt/Option-click in the terminal to move the shell cursor: at a plain shell prompt, holding Option/Alt and clicking a cell walks the cursor there (the backend asks tmux what runs in the clicked pane, so TUIs like vim or htop are never touched). The terminal's mouse bridge now also forwards the Alt modifier, so Claude Code's own built-in Option-click works through dev3 too."
	},
	{
		"date": "2026-07-02",
		"type": "feature",
		"slug": "bug-hunter-task-notes",
		"title": "In-task bug hunters now report findings as dev3 notes instead of leaving them trapped in their own tmux pane",
		"body": "In-task bug hunters now report findings as dev3 notes instead of leaving them trapped in their own tmux pane. Each confirmed critical/high/medium finding is recorded as a `[bug-hunt]`-prefixed dev3 note, so the main task agent can pick them all up with `dev3 note list` and fix them. Standalone `/dev3-bug-hunter` keeps its human-facing stdout report unchanged."
	},
	{
		"date": "2026-07-02",
		"type": "fix",
		"slug": "cloudflare-tunnel-http2",
		"title": "Fixed remote access via the Cloudflare tunnel silently failing (QR/link showed as active but the trycloudflare.com UR...",
		"body": "Fixed remote access via the Cloudflare tunnel silently failing (QR/link showed as active but the trycloudflare.com URL never resolved) on networks that block outbound QUIC/UDP 7844. cloudflared quick tunnels now use the http2 transport by default (override with DEV3_CLOUDFLARED_PROTOCOL=quic|http2|auto)."
	},
	{
		"date": "2026-07-02",
		"type": "fix",
		"slug": "dev-server-verified-teardown",
		"title": "Dev-server stop/restart now verifies teardown instead of fire-and-forget: processes are polled until actually dead (S...",
		"body": "Dev-server stop/restart now verifies teardown instead of fire-and-forget: processes are polled until actually dead (SIGTERM → SIGKILL escalation), daemonized devScript orphans holding the task's pool ports are found via port ownership and reaped, and stop waits for the ports to be released before returning. Start and status now surface \"port already in use by PID/name\" conflicts, and `dev3 dev-server start/restart --wait` blocks until the new server is really listening — so agents no longer test a stale bundle or hit invisible port collisions."
	},
	{
		"date": "2026-07-02",
		"type": "fix",
		"slug": "gh-auth-plain-status-parsing",
		"title": "Fixed the \"GitHub CLI (gh) is not signed in\" false negative for gh versions (~2.50–2.63) that lack `gh auth status --...",
		"body": "Fixed the \"GitHub CLI (gh) is not signed in\" false negative for gh versions (~2.50–2.63) that lack `gh auth status --json` but print the modern plain-text wording \"Logged in to <host> account <login>\" — the fallback parser only matched the old \"as <login>\" wording. The parser now accepts both wordings and marks the account flagged \"Active account: true\" as active instead of assuming the first listed one."
	},
	{
		"date": "2026-07-02",
		"type": "fix",
		"slug": "landing-conversion-and-perf",
		"title": "Landing page conversion & performance pass: fixed the dead mobile nav menu (missing `.nav-links.show` CSS), cut initi...",
		"body": "Landing page conversion & performance pass: fixed the dead mobile nav menu (missing `.nav-links.show` CSS), cut initial page weight from ~6MB to ~1MB (192px nav/favicon icon instead of the 1.4MB original, hover-preview gif replaced with a 150KB mp4, lazy-loading on below-fold images, hero carousel slides 2+ deferred until page load), reworked the Get Started section into macOS/Linux install cards with copy-to-clipboard Homebrew commands and direct DMG links, added a dedicated Remote section, pointed Download buttons at releases/latest, and added robots.txt, sitemap.xml and JSON-LD SoftwareApplication markup. Also populated GitHub repo topics. Made agent-driven install the primary path: a one-line prompt (\"Install dev-3.0 by following the guide at https://dev3.h0x91b.com/ai-install.txt\") with a copy button leads the Get Started section on the landing and the Install section in the README, backed by a new machine-readable ai-install.txt guide plus an llms.txt site map for LLM crawlers. Reordered landing sections into a conversion funnel: philosophy right after features, then Star History social proof and compare leading straight into Get Started, with remote/ways-to-work moved into the researcher tail below. Same funnel pass on the README: a Quick start section (agent prompt + brew one-liners) right under the hero screenshot, keyboard shortcuts moved below Install, Website/Download links pointed at the canonical domain and releases/latest with direct DMG deep links, and the flaky third-party visitor badge replaced with a platform badge."
	},
	{
		"date": "2026-07-02",
		"type": "fix",
		"slug": "mobile-narrow-surfaces",
		"title": "Adapted several surfaces to narrow (phone) viewports",
		"body": "Adapted several surfaces to narrow (phone) viewports. The folder picker now replaces its fixed vertical Places sidebar and clipped filter column with a horizontal Places chip strip and stacked full-width inputs. The diff viewer now gives the diff full width on narrow, moves the file list into a bottom sheet behind a \"Files\" button, forces Unified view (Split is unusable at phone width), and no longer breaks file paths character-by-character. The Productivity Stats page swaps its space-hungry speedometer cockpit for compact stat cards on phones, tightens page padding, and the contribution heatmap now auto-anchors to the most recent weeks (instead of the oldest) and re-anchors on orientation change. Terminals also gain a touch composer: on phones and tablets the terminal no longer summons the on-screen keyboard — a docked chat-style input above the extra-key bar delivers prompts as a single paste (+ Enter), with an expand mode for long text and a ⌨ toggle for direct raw typing; non-essential chrome collapses while typing, and Quick Shell gets the extra-key bar and composer too."
	},
	{
		"date": "2026-07-02",
		"type": "fix",
		"slug": "project-local-skills-autocomplete",
		"title": "Fixed the New Task slash-command autocomplete so it now also lists project-local skills (`.agents/.claude/.codex/skil...",
		"body": "Fixed the New Task slash-command autocomplete so it now also lists project-local skills (`.agents/.claude/.codex/skills` inside the repo, e.g. `/debug-ui`), not only the global ones under the home directory. A project-local skill wins over a same-named global one."
	},
	{
		"date": "2026-07-02",
		"type": "fix",
		"slug": "restore-last-route",
		"title": "Restore the last route (project/task/screen) across app restarts — quit, reboot, and auto-update — not just the windo...",
		"body": "Restore the last route (project/task/screen) across app restarts — quit, reboot, and auto-update — not just the window position. The current route is persisted to ~/.dev3.0/last-route.json (debounced on navigation) and reopened at launch, falling back to the dashboard if the saved project no longer exists."
	},
	{
		"date": "2026-07-02",
		"type": "feature",
		"slug": "restore-window-screen",
		"title": "The main window now remembers its position, size, screen, and macOS fullscreen state, and restores them on relaunch —...",
		"body": "The main window now remembers its position, size, screen, and macOS fullscreen state, and restores them on relaunch — so an auto-update restart no longer yanks the window to the center of the primary display. On multi-monitor setups the window returns to the same physical screen; if that screen is gone it falls back to the centered default. Also reverted the update auto-restart countdown back to 5 minutes (was temporarily 15)."
	},
	{
		"date": "2026-07-02",
		"type": "fix",
		"slug": "setup-pane-zsh-read",
		"title": "Fixed the task setup pane crashing with \"not an identifier: -s\" when pressing a key at the \"press any key to close\" p...",
		"body": "Fixed the task setup pane crashing with \"not an identifier: -s\" when pressing a key at the \"press any key to close\" prompt. The bash-only `read -n 1 -s` was running under zsh; replaced it with a shell-portable read that branches on `$ZSH_VERSION`."
	},
	{
		"date": "2026-07-02",
		"type": "feature",
		"slug": "show-image-viewer",
		"title": "Added `dev3 show-image <path> [--caption \"...\"] [<path> ...]` — agents can now surface images (screenshots, agent-bro...",
		"body": "Added `dev3 show-image <path> [--caption \"...\"] [<path> ...]` — agents can now surface images (screenshots, agent-browser captures, rendered charts) to the human in an in-app viewer bound to the task, with a clickable history (newest shown first). The viewer is a centred, windowed card (~3/4 of the screen) that clearly belongs to the task, with a fullscreen toggle (press `f`); images scale up to fill the frame and tall full-page captures switch to fill-width + vertical scroll. Each `--caption` annotates the image path it follows, so an agent can say what to look at in each shot — shown as a readable note below the image. New images raise the task's attention badge and a clickable toast; the viewer auto-opens only when you're already looking at that task (toggle in Settings → Behavior). Images are copied into the worktree `shared-images/` dir. Reopen the viewer anytime from the \"Images\" button (with a live count) in the task inspector's Runtime bar, next to Dev Server and Ports — it appears only when the task has shared images."
	},
	{
		"date": "2026-07-02",
		"type": "feature",
		"slug": "stats-period-navigation",
		"title": "Added prev/next period navigation to the Productivity Stats page so you can browse past days, weeks, and months inste...",
		"body": "Added prev/next period navigation to the Productivity Stats page so you can browse past days, weeks, and months instead of only the current period. Lifetime views (heatmap, streaks, all-time counters) stay anchored to now; the offset resets when you change the range and is hidden for the All view."
	},
	{
		"date": "2026-07-02",
		"type": "fix",
		"slug": "task-close-home-surface-all-paths",
		"title": "Completing or cancelling a task from the task info panel's status dropdown, the terminal error screen, the preparing-...",
		"body": "Completing or cancelling a task from the task info panel's status dropdown, the terminal error screen, the preparing-view cancel, or the in-panel \"Branch Merged\" auto-complete now lands fullscreen open-mode users on the Kanban board instead of the split task view. PR #756 fixed this only for the two app-level dialogs; the remaining four surfaces hardcoded the split view. All navigation now goes through a shared taskClosedHomeRoute helper."
	},
	{
		"date": "2026-07-02",
		"type": "feature",
		"slug": "terminal-scroll-speed",
		"title": "Added a global Terminal scroll speed slider in Settings → Appearance",
		"body": "Added a global Terminal scroll speed slider in Settings → Appearance. It controls how fast the mouse wheel scrolls the terminal by scaling the wheel-to-tmux threshold, persists per-device in localStorage, and applies live to open terminals without a rebuild (same pattern as the Zoom control)."
	},
	{
		"date": "2026-07-02",
		"type": "feature",
		"slug": "todo-detail-run-action",
		"title": "The To Do task detail modal now has a footer where you can start the task: a green Run button (opens the launch-varia...",
		"body": "The To Do task detail modal now has a footer where you can start the task: a green Run button (opens the launch-variants picker), an editable labels row, and a Delete action. Previously you could only read and edit the description from that view and had to close it to start the task."
	},
	{
		"date": "2026-07-01",
		"type": "feature",
		"slug": "sonnet5-opus-effort-presets",
		"title": "Overhauled the built-in Claude preset list: added a pinned Sonnet 5 model block, added Medium/X-High reasoning-effort...",
		"body": "Overhauled the built-in Claude preset list: added a pinned Sonnet 5 model block, added Medium/X-High reasoning-effort variants for Opus 4.8 and Sonnet 5 Auto/Bypass (replacing their plain-effort versions), dropped \"Don't Ask\" presets and the redundant generic \"Sonnet\" alias block, trimmed the Opus 4.7 fallback to Auto+Bypass, and moved Fable 5 to the top of every mode group. New default preset is Auto (Opus 4.8, X-High). Added the `xhigh` option to the Effort Level dropdown and `EffortLevel` type. Since preset *ordering* changes never used to reach already-onboarded installs (stored order is preserved forever), added a one-time `agentsLayoutRevision`-gated resync so existing users get the new order once too — see decision 096."
	},
	{
		"date": "2026-06-30",
		"type": "feature",
		"slug": "deterministic-dev-remote-port",
		"title": "The `bun run dev` script now binds the dev app's remote web UI to the task's first pool-allocated port (`DEV3_REMOTE_...",
		"body": "The `bun run dev` script now binds the dev app's remote web UI to the task's first pool-allocated port (`DEV3_REMOTE_PORT=${DEV3_PORT0:-0}`), so the QA URL is derivable from `dev3 dev-server status` instead of scraping a random port or starting a separate `dev3 remote`. The dev-server now allocates pool ports on start (back-filling existing tasks), `portCount: 1` is committed for the project, and `dev3 config show` no longer hides unset config fields like `portCount`. A bare `bun run dev` still falls back to a random port.\r\n\r\nAlso simplified project-config resolution into one uniform precedence applied to every field (worktree config.local → worktree config → main config.local → main config → project settings → defaults): worktree config now consistently outranks the main checkout, including for setup/dev/cleanup scripts. The dead, unwritten app-level config layer was removed."
	},
	{
		"date": "2026-06-30",
		"type": "fix",
		"slug": "dev-server-stop-orphan-reap",
		"title": "Fixed Stop (and Restart) leaving the dev server running: the process-tree reap used `pgrep -P`, which returns nothing...",
		"body": "Fixed Stop (and Restart) leaving the dev server running: the process-tree reap used `pgrep -P`, which returns nothing when spawned from the packaged GUI `.app` (sandbox blocks its sysctl), so only the tmux pane was killed and the launched app stayed alive. Descendant collection now uses a single `ps` snapshot, reaping the whole tree."
	},
	{
		"date": "2026-06-30",
		"type": "fix",
		"slug": "folderpicker-focus-flake-and-logger-enoent",
		"title": "Fixed a flaky CI test: the FolderPickerModal focus-trap test now polls for focus to land inside the dialog (useFocusT...",
		"body": "Fixed a flaky CI test: the FolderPickerModal focus-trap test now polls for focus to land inside the dialog (useFocusTrap moves focus from a passive effect, so the old synchronous assertion raced under CI scheduling jitter). Also made the file logger self-healing — if its log directory is deleted after being cached, it now recreates the directory and retries once instead of spamming \"Failed to write log file\" ENOENT errors (the source of noisy stderr in the bun test suite)."
	},
	{
		"date": "2026-06-30",
		"type": "feature",
		"slug": "mobile-activity-view",
		"title": "Made the Dashboard Activity view usable on a phone (sub-768px / dev3 remote): project cards go full-width, per-projec...",
		"body": "Made the Dashboard Activity view usable on a phone (sub-768px / dev3 remote): project cards go full-width, per-project actions and reorder collapse from the hover icon row into a touch kebab that opens a bottom-sheet (Open board, Settings, Finder, Terminal, Move up/down, Remove), and touch targets are bumped to ≥44px. Reorder, previously impossible on touch, is now reachable from the sheet. Task rows now stack on narrow viewports so titles stay readable instead of being squeezed by the status + time cluster; the project path is hidden, the kebab moves to the row end, each project caps at three attention rows behind a \"show more\" fold, \"your turn\" tasks sort first and get an accent strip."
	},
	{
		"date": "2026-06-30",
		"type": "feature",
		"slug": "mobile-pane-map-sheet",
		"title": "On a narrow viewport the terminal pane carousel gains a \"zoom-out\" overview: a grid button opens a bottom sheet that ...",
		"body": "On a narrow viewport the terminal pane carousel gains a \"zoom-out\" overview: a grid button opens a bottom sheet that draws a spatial mini-map of the active tmux window's panes by their real geometry (like the boxes `dev3 ui state` prints) — tap a box to jump to and zoom that pane. Backed by a new `tmuxLayout` RPC that returns pane geometry plus the window list (the foundation for a future windows switcher and +split/+window)."
	},
	{
		"date": "2026-06-30",
		"type": "feature",
		"slug": "mobile-tmux-pane-window-controls",
		"title": "On a narrow viewport (phone via dev3 remote / narrow window) the terminal now shows a \"Panes & windows\" button above ...",
		"body": "On a narrow viewport (phone via dev3 remote / narrow window) the terminal now shows a \"Panes & windows\" button above the pane that opens a bottom sheet to split the pane (horizontally/vertically), open a new tmux window, or close the current pane — previously only reachable via the ⌃B prefix, which is impractical on a phone."
	},
	{
		"date": "2026-06-30",
		"type": "feature",
		"slug": "mobile-tmux-windows-switcher",
		"title": "Added a narrow-viewport (mobile) tmux windows switcher: a slim bar above the panes carousel lets you list and move be...",
		"body": "Added a narrow-viewport (mobile) tmux windows switcher: a slim bar above the panes carousel lets you list and move between tmux windows (separate workspaces in a session) with prev/next chevrons, a named dropdown, and Arrow keys. Backed by a new tmuxWindowNavigate RPC (list-windows + select-window) and pairs with the existing panes switcher so multi-window sessions are finally navigable on a phone over dev3 remote."
	},
	{
		"date": "2026-06-30",
		"type": "fix",
		"slug": "pull-spinner-offcenter",
		"title": "Fixed the git pull button's loading spinner (and the identical task git-action spinners) appearing off-center",
		"body": "Fixed the git pull button's loading spinner (and the identical task git-action spinners) appearing off-center. A spinning Nerd Font glyph sits in a tall advance-width × line-height box on the baseline, so animate-spin pivoted on the box center instead of the glyph's visual center and it wobbled. The spinner is now a circular ring (radially symmetric, so it rotates perfectly around its own center) rendered inside a fixed-size icon slot, so it stays centered, never shifts the icon sideways when the spin starts, and reads no larger than the neighboring toolbar icons."
	},
	{
		"date": "2026-06-29",
		"type": "fix",
		"slug": "altscreen-selection-regression",
		"title": "Fixed a regression where a double-click selection in the terminal stayed highlighted in place while the content scrol...",
		"body": "Fixed a regression where a double-click selection in the terminal stayed highlighted in place while the content scrolled or repainted underneath it (notably inside Claude Code). Runtime logs showed the offending TUI renders inline on the primary screen with mouse tracking on, so the alt-screen-only clear from the earlier fix never fired. The stale-selection clear now also triggers when the app owns the screen via mouse tracking, while plain shell scrollback selections stay anchored."
	},
	{
		"date": "2026-06-29",
		"type": "fix",
		"slug": "claude-hooks-app-offline",
		"title": "Generated Claude Code lifecycle hooks now treat the dev3 CLI's \"app not running\" exit code (2) as a non-blocking no-o...",
		"body": "Generated Claude Code lifecycle hooks now treat the dev3 CLI's \"app not running\" exit code (2) as a non-blocking no-op, so editing files, running tools, submitting prompts, and stopping keep working when the desktop app is closed mid-session (e.g. during an app update). Claude Code reads hook exit code 2 as a blocking error, which previously wedged tool calls; the fix mirrors the selective fallback Codex hooks already use, so unrelated failures still surface."
	},
	{
		"date": "2026-06-29",
		"type": "feature",
		"slug": "dev-server-button-running-state",
		"title": "The Dev Server button now shows its live state at a glance: neutral with a play icon when stopped, a spinner while st...",
		"body": "The Dev Server button now shows its live state at a glance: neutral with a play icon when stopped, a spinner while starting, and green with a pulsing dot while running (previously it looked identical in every state). The button polls the dev-server status while the task panel is open and reflects start/stop instantly."
	},
	{
		"date": "2026-06-29",
		"type": "fix",
		"slug": "dev-server-orphan-children",
		"title": "Stopping a task's dev server now kills its entire child process tree, not just the tmux pane",
		"body": "Stopping a task's dev server now kills its entire child process tree, not just the tmux pane. Previously the underlying server (e.g. the launched app or a process holding a port) kept running orphaned after Stop. The same reap also runs when a task session is destroyed."
	},
	{
		"date": "2026-06-29",
		"type": "feature",
		"slug": "mobile-carousel",
		"title": "Added narrow-viewport carousel navigation for the Kanban board (Level 1)",
		"body": "Added narrow-viewport carousel navigation for the Kanban board (Level 1). On a sub-768px viewport (phone via dev3 remote, or a narrow browser window — gated by a media query) the board shows one column at a time: swipe sideways or use the pager chevrons/dots to change column, scroll vertically to browse its tasks. Collapsed columns are excluded; empty columns are kept. Browser remote now renders at device-width so the layout is responsive. Hover terminal previews are disabled on touch and narrow viewports (no hover there, and the popover just covers the card). On narrow viewports the board's label-filter chip strip is replaced by a compact funnel button that opens a new bottom-sheet (so filtering stays reachable while reclaiming the vertical space), and opening a task zooms its workspace — the active-tasks sidebar/strip is hidden since there is no room for it. Introduced a reusable BottomSheet primitive (pure React, works in desktop and browser; backdrop/Esc/swipe-down dismiss, focus trap, safe-area, reduced-motion) plus a narrow-viewport clamp that keeps centered modals/palettes inside the phone viewport. On narrow viewports the global header's right-side action cluster (Quick Shell, Project Terminal, Remote access, Website/Report/Changelog, Project/Global Settings) folds into a single kebab that opens a BottomSheet, which also adds a touch entry to the Command Palette (otherwise keyboard-only, and the native menu is absent in remote); the prevent-sleep, git-pull, tmux and update-ready widgets stay inline. The same treatment now lands on the task screen: on narrow viewports the task info panel's two dense action toolbars collapse into a thin summary bar (status + title + diff badge) with a kebab that opens an actions BottomSheet holding every git/dev-server/ports/scripts/open-in/tmux action plus the full task details grid (rename, branch, PR, worktree, notes) — otherwise unreachable on a phone where the panel can't be resized. The same one-element-at-a-time idea now extends to the terminal itself (Level 2): on a narrow viewport a task opens with its tmux window zoomed to a single pane, and a compact top switcher — ‹ prev · a named-pane dropdown · next › — plus a horizontal swipe over the terminal, a horizontal trackpad scroll, or Arrow keys move between panes and re-zoom the target, so the agent/dev-server/shell panes are no longer crammed into a tiny split. The dropdown lists every pane by name (its explicit tmux title, else the running command) and renders above the terminal canvas — the glass switcher creates its own stacking context, so the carousel is isolated (`isolate` + z-layered) and the popover never falls behind the terminal. The swipe arbitrates by axis in the capture phase (a clearly-horizontal drag is the carousel; a vertical drag or tap falls through to the terminal untouched, so it never fights interactive TUIs, and any nascent text selection is collapsed at the gesture origin), zoom is enforced idempotently in one backend round trip via a new tmuxPaneNavigate RPC, and the switcher/gesture are absent for single-pane sessions. On the full (non-narrow) viewport a \"Zoomed\" badge appears at the top-right of the terminal whenever a multi-pane tmux window is zoomed (e.g. left over from a phone session, or ⌃B z) with a one-tap un-zoom — making the otherwise-invisible, shared per-window zoom state legible and reversible, without ever mutating it automatically. The carousel was also generalised into a product-wide narrow-viewport (mobile) UX doctrine in docs/ux/ (bible §12, ux-architecture responsive block, a UX decision, and feature-plans/narrow-viewport-doctrine.md) — one-element-at-a-time per surface, a reconciled 768px breakpoint, a swipe gesture law, a touch navigation/action-reachability model, and a mandated BottomSheet primitive. Full UX plan is documented in docs/ux/feature-plans/mobile-carousel-navigation.md. Idea by Ittai Zeidman."
	},
	{
		"date": "2026-06-29",
		"type": "fix",
		"slug": "operations-your-review-column",
		"title": "Restore the \"Your Review\" column on Operations (virtual) boards",
		"body": "Restore the \"Your Review\" column on Operations (virtual) boards. Finished operations tasks are handed back via review-by-user, but the board hid that column for virtual projects, so the task disappeared. Now only AI Review and PR Review stay hidden on Operations boards."
	},
	{
		"date": "2026-06-28",
		"type": "feature",
		"slug": "browser-app-menu-bar",
		"title": "In Remote Access (browser) mode the app now renders its own File/Task/Project/View/Terminal/Help menu bar at the top ...",
		"body": "In Remote Access (browser) mode the app now renders its own File/Task/Project/View/Terminal/Help menu bar at the top of the window, since the native macOS/Linux menu bar isn't available in a browser. It is built from the same menu definition the native menu uses (now shared) and dispatches through the same action router, so behavior matches the desktop; native-only items (clipboard, window, quit) and roadmap entries are omitted, and items grey out when their context (task/project/terminal) is absent. Collapses to a single menu button on narrow/mobile screens."
	},
	{
		"date": "2026-06-28",
		"type": "fix",
		"slug": "dangling-custom-column-vanish",
		"title": "Fixed tasks silently vanishing from the Kanban board when their customColumnId pointed to a deleted custom column",
		"body": "Fixed tasks silently vanishing from the Kanban board when their customColumnId pointed to a deleted custom column. The board now falls back to rendering such a task in its underlying status column, and the data layer self-heals the dangling id to null on the next task mutation (in-place, fully backward-compatible)."
	},
	{
		"date": "2026-06-28",
		"type": "fix",
		"slug": "dashboard-show-pr-review-custom-columns",
		"title": "The main dashboard's per-project activity now lists PR Review tasks and tasks parked in custom columns as their own r...",
		"body": "The main dashboard's per-project activity now lists PR Review tasks and tasks parked in custom columns as their own rows, instead of burying them in the collapsed background summary. PR Review rows show the \"PR Review\" status; custom-column rows are labeled and colored by their column."
	},
	{
		"date": "2026-06-28",
		"type": "refactor",
		"slug": "merge-cli-headless-server",
		"title": "Merged the standalone `dev3-server` headless binary into the `dev3` CLI: it's now a single binary, and `dev3 remote` ...",
		"body": "Merged the standalone `dev3-server` headless binary into the `dev3` CLI: it's now a single binary, and `dev3 remote` boots the headless server in-process via a dynamic import instead of spawning a sibling. This drops the duplicated Bun runtime from releases and removes the sibling-locate/version-skew failure modes. A guard test keeps the heavy backend out of the CLI's startup path."
	},
	{
		"date": "2026-06-28",
		"type": "fix",
		"slug": "modal-escape-fullscreen",
		"title": "Escape now reliably closes any open modal, lightbox, or popover instead of dropping the app out of native fullscreen",
		"body": "Escape now reliably closes any open modal, lightbox, or popover instead of dropping the app out of native fullscreen. Added a shared `useEscapeKey` hook (capture-phase listener that calls preventDefault + stopImmediatePropagation) and routed every overlay through it; the About dialog now also closes on Escape."
	},
	{
		"date": "2026-06-28",
		"type": "feature",
		"slug": "productivity-stats-dashboard",
		"title": "Added a Productivity Stats dashboard (\"Velocity Cockpit\") — a stylish full-screen view that proves how much you ship:...",
		"body": "Added a Productivity Stats dashboard (\"Velocity Cockpit\") — a stylish full-screen view that proves how much you ship: tasks completed over time, lines of code changed, projects/tasks/agents counts, streaks, busiest project, and per-project and per-agent breakdowns, with a day/week/month/all time-range switch. Built around the speedometer gauge, plus custom SVG bar/line charts. Lines-of-code are captured per task at completion time (before the worktree is removed) so they survive cleanup. Each gauge auto-scales to a tight round maximum and paints a red \"beat-your-average\" zone from your rolling average up to the top, so topping your usual output is visible at a glance. The completed/lines charts use recharts (real axes, hover tooltips), the per-agent split is a donut, and the per-project breakdown uses LED-style segmented bars. Reachable from the Dashboard card and a speedometer button in the top header. The screen boots up alive — gauge needles sweep from zero and numbers count up — and adds a GitHub-style year-long contribution heatmap, lifetime shipping medals (100/500/1000…) with progress to the next, a dynamic \"momentum\" headline that calls out when you're on fire, and a friendly placeholder while diff tracking warms up. All motion respects prefers-reduced-motion."
	},
	{
		"date": "2026-06-28",
		"type": "feature",
		"slug": "remember-watch-default",
		"title": "The Watch toggle in the launch/create-variant dialog now remembers its on/off state as a global default and applies i...",
		"body": "The Watch toggle in the launch/create-variant dialog now remembers its on/off state as a global default and applies it to the next tasks you launch. Toggling it persists your preference; launching applies the chosen watch state to the task."
	},
	{
		"date": "2026-06-28",
		"type": "fix",
		"slug": "remote-detach-compiled-binary-argv",
		"title": "Fixed `dev3 remote` dying on startup (\"Unknown command: /$bunfs/root/dev3\") on the compiled binary",
		"body": "Fixed `dev3 remote` dying on startup (\"Unknown command: /$bunfs/root/dev3\") on the compiled binary. Background mode (the default) re-spawns the server, and the child argv wrongly re-included bun's injected `/$bunfs/root/dev3` virtual entry path, which bun re-injects on the child too — shoving it into argv where it parsed as the command. The respawn argv computation now passes only the user-facing args (with the dev `bun run` script-path case handled), and a unit test covers the compiled-binary argv shape."
	},
	{
		"date": "2026-06-28",
		"type": "fix",
		"slug": "remote-double-completion-sound",
		"title": "Fixed the task complete/cancel sound playing twice in remote mode when the desktop app and a browser are both connect...",
		"body": "Fixed the task complete/cancel sound playing twice in remote mode when the desktop app and a browser are both connected to the same machine. UI-initiated terminal moves now play the sound locally and tell the backend to skip its broadcast `taskSound` push, so it is heard exactly once."
	},
	{
		"date": "2026-06-28",
		"type": "feature",
		"slug": "remote-hotkey-mapping",
		"title": "Made app keyboard shortcuts transport-aware in browser remote mode: shell-only combos (⌘Q, ⌘H, New Window, zoom, hard...",
		"body": "Made app keyboard shortcuts transport-aware in browser remote mode: shell-only combos (⌘Q, ⌘H, New Window, zoom, hard refresh) are dropped and yielded to the browser, ⌘1–9 / ⌘N fall back to their browser-safe aliases (G then 1–9 / C), the Keyboard Shortcuts overlay shows the remote keymap with a notice, and \"Open in Finder\" is hidden from the command palette in the browser since it targets the server host."
	},
	{
		"date": "2026-06-28",
		"type": "feature",
		"slug": "remote-lifecycle-cli",
		"title": "Improved `dev3 remote` for remote-Linux use",
		"body": "Improved `dev3 remote` for remote-Linux use. Lifecycle: `dev3 remote` now runs the headless server in the **background by default** (surviving the SSH session) — pass `--no-detach` to keep it in the foreground (systemd, Docker, and the dev tooling do that automatically) — and new `dev3 remote status`, `dev3 remote url`, and `dev3 remote stop` subcommands let you query a running server, re-print a fresh QR/URL from any new SSH session, and shut it down cleanly. The server records its PID/port/socket under `~/.dev3.0/remote/` so a separate process can find and control it. On Linux, `dev3 remote install-service` installs and enables a systemd --user unit so the server survives logout and starts on boot (`uninstall-service` removes it). The browser now also remembers your session (localStorage, 8h) and silently reconnects on reload without rescanning the QR. In the Remote Access modal, when the tunnel is off, a new interface dropdown lets you choose which local IP (including localhost / 127.0.0.1) the QR and URL point at — handy for multi-homed boxes, VPNs, or the SSH-forward path. Hardened the lifecycle against a batch of edge cases: `install-service` now validates `--static-code` (length + no whitespace) at install time instead of silently restart-looping under systemd; `--detach` surfaces spawn failures cleanly and uses a lock file so two simultaneous launches can no longer orphan a server; the background server records its lifecycle state before (not after) the Cloudflare tunnel connects, so a blocked-outbound box no longer leaves the server invisible to `status`/`url`/`stop`; and the remote WebSocket proxy no longer leaks upstream connections that disconnect mid-handshake. The dev web-access token is no longer hardcoded in `package.json`: `bun run dev` now derives `DEV3_REMOTE_STATIC_CODE` from a per-machine random UUID generated once and persisted at `~/.dev3.0/dev-web-access-code` (delete it to rotate)."
	},
	{
		"date": "2026-06-28",
		"type": "feature",
		"slug": "remote-linux-ux-improvements",
		"title": "Improved the `dev3 remote` experience for headless Linux: added `dev3 remote restart` and `dev3 remote logs [--follow...",
		"body": "Improved the `dev3 remote` experience for headless Linux: added `dev3 remote restart` and `dev3 remote logs [--follow] [--lines <n>]`; `--static-code` is now refused on a default-on public tunnel (no replay protection) unless `--no-tunnel` is also passed; the browser \"Session Expired\" screen now tells you to run `dev3 remote url` on the host instead of pointing at a non-existent desktop app; the `dev3 gui` bundle URL is arch-aware (arm64 hosts no longer silently fetch the x64 bundle); and fixed stale `--tunnel`/`--detach` hints in the CLI help and console banner. The release pipeline now also builds linux-arm64 artifacts (CLI tarball + best-effort desktop bundle) and the Homebrew formula gains a Linux arm64 bottle, so `brew install` / `dev3 remote` work on arm64 boxes (Ampere/Graviton/Hetzner CAX)."
	},
	{
		"date": "2026-06-28",
		"type": "fix",
		"slug": "stale-lock-toctou",
		"title": "Fixed a stale-lock break race in withFileLock where two processes sharing ~/.dev3.0/ could both break and acquire the...",
		"body": "Fixed a stale-lock break race in withFileLock where two processes sharing ~/.dev3.0/ could both break and acquire the same lock, risking silent data loss in tasks.json/projects.json. Stale locks are now claimed via an atomic rename + age re-validation (ABA-safe), and unexpected stat errors (e.g. EACCES) surface immediately instead of spinning forever. The on-disk lock format is unchanged, so older app versions stay interoperable."
	},
	{
		"date": "2026-06-28",
		"type": "fix",
		"slug": "teammate-permission-mode",
		"title": "Fixed Claude agent-team teammates falling back to manual approval when the lead launched in an auto-approve mode (Aut...",
		"body": "Fixed Claude agent-team teammates falling back to manual approval when the lead launched in an auto-approve mode (Auto, Bypass, Accept Edits, Don't Ask). The chosen config's permission mode is now written as permissions.defaultMode into the worktree's .claude/settings.local.json, so spawned teammates inherit the same auto-approve baseline instead of prompting \"Waiting for tool approval\" on every command."
	},
	{
		"date": "2026-06-28",
		"type": "fix",
		"slug": "update-countdown-15min",
		"title": "Extended the update toast auto-restart countdown from 5 minutes to 15 minutes, giving users more time before the app ...",
		"body": "Extended the update toast auto-restart countdown from 5 minutes to 15 minutes, giving users more time before the app restarts itself to install a downloaded update."
	},
	{
		"date": "2026-06-28",
		"type": "feature",
		"slug": "web-notifications-remote",
		"title": "Browser Web Notifications in remote mode: when the UI is opened in a browser via `dev3 remote`, `dev3 notify --deskto...",
		"body": "Browser Web Notifications in remote mode: when the UI is opened in a browser via `dev3 remote`, `dev3 notify --desktop` and watched-task status/event banners now fire a real Chrome/Safari desktop notification (clickable, opens the task). Falls back to an in-app toast on insecure LAN URLs (the Notification API needs HTTPS/localhost) or when permission is denied. Added a Browser Notifications toggle in Settings → Behavior (browser-only)."
	},
	{
		"date": "2026-06-27",
		"type": "fix",
		"slug": "pty-cwd-false-error",
		"title": "Fixed a bogus \"PTY cwd missing\" error that was logged for every valid terminal directory: the existence probe now use...",
		"body": "Fixed a bogus \"PTY cwd missing\" error that was logged for every valid terminal directory: the existence probe now uses fs.access instead of Bun.file().exists(), which always returns false for directories."
	},
	{
		"date": "2026-06-27",
		"type": "refactor",
		"slug": "quick-shell-fresh-scratch",
		"title": "Quick Shell (⇧⌘`) now spawns a fresh scratch task in the built-in Operations board on every press — like clicking \"Sc...",
		"body": "Quick Shell (⇧⌘`) now spawns a fresh scratch task in the built-in Operations board on every press — like clicking \"Scratch Task\" — instead of reusing a singleton bare shell in the home directory. The new op gets the normal `Scratch — HH:mm` title, a managed work dir, and launches immediately with your default agent + config (Claude Opus 4.8 / auto by default), no agent picker. Also fixed focus on Operations ops: after the agent + split-right shell come up, focus now lands on the agent pane instead of the shell."
	},
	{
		"date": "2026-06-27",
		"type": "fix",
		"slug": "tips-disabled-persist",
		"title": "Fixed the \"Disable feature tips\" setting being silently lost on app restart (and then erased from settings.json on th...",
		"body": "Fixed the \"Disable feature tips\" setting being silently lost on app restart (and then erased from settings.json on the next settings change). loadSettings now reads tipsDisabled, and the drifted duplicate GlobalSettings interface in src/bun/settings.ts was removed in favor of the single shared type, with a round-trip test guarding against the same class of dropped-field bug."
	},
	{
		"date": "2026-06-27",
		"type": "fix",
		"slug": "variants-modal-enter-mislaunch",
		"title": "Fixed the Launch Variants and Spawn Agent modals spawning agents when pressing Enter while the agent/config picker or...",
		"body": "Fixed the Launch Variants and Spawn Agent modals spawning agents when pressing Enter while the agent/config picker or the Watch/Cancel/Add/Remove buttons were keyboard-focused — Enter now only launches when no interactive control is focused. Added a reusable focus trap (useFocusTrap) to every modal/dialog (Launch Variants, Spawn Agent, About, Add Project, Create Task, Folder Picker, Task Detail, command/quick-switch palettes, Keyboard Shortcuts, Git Pull error, and the confirm dialog) so Tab/Shift+Tab cycle within the dialog instead of escaping to the Kanban board behind it, with focus restored on close. Added a global keyboard focus ring (`:focus-visible`) so Tab/Shift+Tab now visibly highlights the focused control (Select pickers, buttons, inputs) app-wide — shown only for keyboard focus, never on mouse click. Also fixed the custom Select dropdown staying open when keyboard focus moved to another Select, which let two dropdowns stack on top of each other; a Select now closes when it loses focus."
	},
	{
		"date": "2026-06-27",
		"type": "fix",
		"slug": "verify-task-create-persistence",
		"title": "Task creation now verifies the write actually landed on disk before reporting success",
		"body": "Task creation now verifies the write actually landed on disk before reporting success. Previously `dev3 task create` could print \"Created task <id>\" (consuming a seq) for a task that was never persisted; it now fails loudly with a clear error instead of returning a ghost task, so the printed id is always immediately resolvable."
	},
	{
		"date": "2026-06-27",
		"type": "feature",
		"slug": "workspace-lifecycle-hooks-env",
		"title": "Project hook scripts (setup/dev/cleanup) now receive workspace env vars (DEV3_PROJECT_PATH, DEV3_PROJECT_NAME, DEV3_T...",
		"body": "Project hook scripts (setup/dev/cleanup) now receive workspace env vars (DEV3_PROJECT_PATH, DEV3_PROJECT_NAME, DEV3_TASK_TITLE, DEV3_WORKTREE_PATH, DEV3_BRANCH_NAME) so git-ignored hooks in .dev3/config.local.json can be resolved from the project root, mirroring the Superset workspace-hook contract. The cleanup script now also runs when an active task is deleted (DEV3_TASK_STATUS=deleted) or its preparation is cancelled (todo), and task deletion releases allocated ports and stops the dev server — per-worktree resources like dev containers no longer leak on those paths."
	},
	{
		"date": "2026-06-26",
		"type": "fix",
		"slug": "fullscreen-task-completion-returns-to-board",
		"title": "Fixed completing a task jumping users to the wrong surface",
		"body": "Fixed completing a task jumping users to the wrong surface. Where you land after a task completes now follows your Task Open Mode: full-screen users return to the Kanban board (instead of being dumped into the split task view they never use), while split-view users stay in the split task view with the task deselected — even if they had temporarily zoomed the task to full screen."
	},
	{
		"date": "2026-06-26",
		"type": "fix",
		"slug": "unpushed-diff-merge-base",
		"title": "Fixed the \"Unpushed\" diff mode showing changes that aren't yours when the branch's upstream has diverged from HEAD (a...",
		"body": "Fixed the \"Unpushed\" diff mode showing changes that aren't yours when the branch's upstream has diverged from HEAD (after a rebase, force-push, or when the upstream tracks a base branch that has advanced). The diff now compares HEAD against the merge-base with the upstream (three-dot semantics) instead of the upstream tip directly, so it shows only the commits HEAD added — matching the no-upstream fallback."
	},
	{
		"date": "2026-06-25",
		"type": "fix",
		"slug": "claude-codex-sandbox-socket",
		"title": "Fixed the dev3 CLI falsely reporting \"app not running\" inside sandboxed agents",
		"body": "Fixed the dev3 CLI falsely reporting \"app not running\" inside sandboxed agents. dev3 now auto-allowlists the sockets directory in Claude Code's sandbox (~/.claude/settings.json sandbox.network.allowUnixSockets), migrates Codex's config to the new [permissions.*.network.unix_sockets] map form that codex >= 0.119 actually reads (the old allow_unix_sockets array was silently ignored), and the CLI now explains a blocked connection points at the sandbox instead of a stopped app.",
		"suggestedBy": "banuni",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/726",
		"issueRef": "#726"
	},
	{
		"date": "2026-06-25",
		"type": "fix",
		"slug": "pty-configure-timer-leak",
		"title": "Fixed a flaky pty-server test by cancelling the deferred post-spawn configureTmux timer when a session is destroyed",
		"body": "Fixed a flaky pty-server test by cancelling the deferred post-spawn configureTmux timer when a session is destroyed. Previously the 200ms setTimeout fired even for torn-down sessions, leaking a default-socket tmux source-file spawn that could bleed into a later test and pick the wrong socket. Hardened the related tests to match the source-file call for their own socket."
	},
	{
		"date": "2026-06-24",
		"type": "docs",
		"slug": "positioning-one-person-studio",
		"title": "Reframed the README and landing page (docs/index.html) around dev-3.0's positioning: mission control for the One Pers...",
		"body": "Reframed the README and landing page (docs/index.html) around dev-3.0's positioning: mission control for the One Person Studio, deliberately not an IDE. Added Philosophy, Ways to work, and \"Which is for you?\" sections plus a refreshed hero, meta tags, and CTA copy. See decisions/2026/06/24/positioning-not-an-ide.md."
	},
	{
		"date": "2026-06-24",
		"type": "feature",
		"slug": "pr-ci-review-badges",
		"title": "Added CI and PR-review status badges to task cards (CI passed/failed/running, review approved/changes-requested/comme...",
		"body": "Added CI and PR-review status badges to task cards (CI passed/failed/running, review approved/changes-requested/commented), fetched by the existing background PR poller — which now keeps polling tasks in the PR Review column. A new signal raises the attention bell (respecting Focus Mode) and a native notification for watched tasks, surfaces the task in the attention sidebar until read, and clicking a badge moves the task back to your review."
	},
	{
		"date": "2026-06-24",
		"type": "fix",
		"slug": "prod-log-level-debug-spam",
		"title": "Backend file logging now defaults to `info` on prod/staging/canary builds (full `debug` is kept on dev builds and can...",
		"body": "Backend file logging now defaults to `info` on prod/staging/canary builds (full `debug` is kept on dev builds and can be forced anywhere with `DEV3_LOG_LEVEL`). Previously the minimum level was hard-wired to `debug` and nothing ever lowered it, so every build wrote tens of thousands of trace lines per session to disk via synchronous appends — multi-MB/day logs and needless event-loop pressure on the busy git-status poll path. The highest-frequency poll traces (getBranchStatus / getResolvedProject / fetchOrigin / \"No tasks file yet\") were also demoted from `info` to `debug`."
	},
	{
		"date": "2026-06-24",
		"type": "feature",
		"slug": "virtual-operations-board",
		"title": "Added a virtual \"Operations\" board: a non-git, cross-project Kanban for ad-hoc, code-driven tasks (back up prod, stop...",
		"body": "Added a virtual \"Operations\" board: a non-git, cross-project Kanban for ad-hoc, code-driven tasks (back up prod, stop a server, mail/Slack triage, throwaway experiments) that persist in history. Modeled as Project.kind \"virtual\" (stored in a separate ~/.dev3.0/virtual-projects.json so older app versions stay compatible), each operation runs an AI agent plus a split-right shell in a managed temp folder — or a folder you pick — with no git worktree, branch, diff, PR, or review columns. Create one from \"Add Project → Operations\"; completed operations stay in Done as history and are removed only when you delete them (a chosen folder is never auto-removed). The single home terminal is replaced by a built-in Operations board, and ⇧⌘` now opens a \"Quick Shell\" operation in your home directory. The built-in board is pinned first everywhere, reachable with ⌘0, and marked as a special system object (shown as \"[ Operations ]\" with a SYSTEM badge); inside an operation the inspector hides git, Dev Server, and Scripts, showing a subtle \"Git is not available in operations tasks\" note instead. Operations are now treated at full parity with git tasks across the app: a dead terminal session is restored (or relaunched) when you reopen an active operation, the dashboard shows operations' active tasks, the working-folder conflict warning works, and the dev3 CLI resolves and lists operations. A second sweep closed the remaining git-only gaps: the command palette no longer offers git, dev-server, or run-script actions for operations; the ⌘K project switcher pins the board first and badges it ⌘0 with its bracketed name; the branch-status poll (every 15s) and the open-PR poll (every 60s) are skipped for operations instead of spawning a doomed git; git RPCs (diff/rebase/merge/push/PR) reject operations with a clear message; cancelling an operation's preparation no longer attempts a git worktree removal; and offline `dev3 current` / short-id resolution read operations from virtual-projects.json. A third sweep fixed a real data-layer gap: creating or editing labels and custom columns on an Operations board (which route through updateProjectWith) no longer fails with \"Project not found\" — that helper now routes virtual ids to virtual-projects.json like the other mutators; the Operations board's Project Settings now show only the Board tab (labels + columns), hiding the git-only Project/Worktree config tabs; and the merge-notification cleanup also reaps virtual task ids so stale entries can't linger. A fourth sweep closed the last forgotten seams: opening the Project Terminal on an Operations board (header button, project tile, Cmd+`, command palette, or native menu) no longer crashes with \"Project path does not exist\" — the affordance and the Open-in-Finder tile button are hidden for virtual boards and the backend rejects the call; the pinned built-in Operations board can no longer be deleted (which previously dead-ended Cmd+0 until restart and orphaned its tasks); the dev3 CLI now resolves task context from the injected DEV3_TASK_ID for operations whose working dir is outside ~/.dev3.0/ops/ (fixed-folder ops and the Quick shell in $HOME), so agent status hooks stop silently no-opping there; the Quick shell hotkey reuses an inactive shell instead of spawning duplicates and is race-safe against rapid double-presses; and the Quick Shell header button and the scratch-session card badge now render their icon glyphs instead of an empty placeholder.",
		"suggestedBy": "BnayaZil"
	},
	{
		"date": "2026-06-23",
		"type": "fix",
		"slug": "cli-transient-app-not-running",
		"title": "Fixed the dev3 CLI intermittently reporting \"app not running\" while the desktop app was alive",
		"body": "Fixed the dev3 CLI intermittently reporting \"app not running\" while the desktop app was alive. The CLI now retries transient Unix-socket failures — both connect (ECONNREFUSED/ENOENT/EAGAIN) and socket discovery — with short backoff before giving up, instead of declaring the app offline on the first hiccup (common when agent hooks fire many CLI calls in bursts, especially on macOS). Running any command with DEV3_DEBUG=1 now prints why resolution failed (HOME, sockets dir, each socket's pid/liveness, failing stage, last errno).",
		"suggestedBy": "banuni",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/714",
		"issueRef": "#714"
	},
	{
		"date": "2026-06-23",
		"type": "feature",
		"slug": "cli-ui-control",
		"title": "Added CLI commands that let agents drive the app UI: `dev3 notify` shows a clickable in-app toast (or a native OS not...",
		"body": "Added CLI commands that let agents drive the app UI: `dev3 notify` shows a clickable in-app toast (or a native OS notification with `--desktop`) that jumps you to the originating task and carries the source-task context (#seq · project · title); `dev3 attention \"reason\"` lights the red task-card badge and shows the reason(s) in the card's hover preview — repeated calls accumulate (newest 5 kept), with no native browser tooltip; and `dev3 ui state` reports the focused task/project, app foreground, how long the user has been idle (so an agent can pick the right channel or hold off), and the worktree's tmux layout (windows, panes, an ASCII pane map; `--json` for raw data). A new Settings → Behavior → Focus Mode toggle silences all of it for users who find the pings distracting. The dev3 agent skill documents when/how to use these so agents nudge on real blockers, questions, completions, and failures without spamming."
	},
	{
		"date": "2026-06-23",
		"type": "feature",
		"slug": "cmdk-recent-projects",
		"title": "The Cmd/Ctrl+K project quick-switch palette now lists the projects you jumped to most recently first, then the rest i...",
		"body": "The Cmd/Ctrl+K project quick-switch palette now lists the projects you jumped to most recently first, then the rest in board order. Recency is tracked in a small localStorage LRU cache; the ⌘1-9 badges still follow the stable board order."
	},
	{
		"date": "2026-06-23",
		"type": "feature",
		"slug": "exclude-worktrees-from-backup",
		"title": "On macOS, the whole worktrees root (~/.dev3.0/worktrees) is now automatically excluded from Time Machine backups once...",
		"body": "On macOS, the whole worktrees root (~/.dev3.0/worktrees) is now automatically excluded from Time Machine backups once at app startup, sparing backups from gigabytes of CoW-cloned dependencies that already live in git. A new Settings → Workspace toggle lets you opt out."
	},
	{
		"date": "2026-06-23",
		"type": "feature",
		"slug": "ga-agent-usage-events",
		"title": "Added a Google Analytics `agent_launched` event fired once per agent instance started, carrying the agent name and th...",
		"body": "Added a Google Analytics `agent_launched` event fired once per agent instance started, carrying the agent name and the chosen permission mode, plus an `agent_name` parameter on the existing `task_moved` event. Now usage can be broken down by which agents (Claude, Codex, Gemini, custom CLIs, etc.) people actually run and complete tasks with. Launch event is wired into every launch path: variants, retries, extra agent, and bug hunters. Analytics now also sends the user's public IP as `ip_override` (resolved best-effort once per launch and cached) so GA4 can populate the Country/City geo dimensions, which Measurement Protocol web hits otherwise leave unset."
	},
	{
		"date": "2026-06-23",
		"type": "fix",
		"slug": "stale-git-line-on-task-switch",
		"title": "Fixed the task info panel briefly showing the previous task's branch/commit status when switching tasks",
		"body": "Fixed the task info panel briefly showing the previous task's branch/commit status when switching tasks. The git line now clears and shows a loading state until fresh branch status arrives."
	},
	{
		"date": "2026-06-23",
		"type": "fix",
		"slug": "stay-in-view-after-complete",
		"title": "Completing or cancelling a task no longer kicks you back to the bare Kanban board",
		"body": "Completing or cancelling a task no longer kicks you back to the bare Kanban board. If you were in a task view it now stays in task view with nothing selected; if you were on the Kanban board it stays there."
	},
	{
		"date": "2026-06-22",
		"type": "feature",
		"slug": "cli-subcommand-help",
		"title": "The dev3 CLI now prints command- and subcommand-specific help",
		"body": "The dev3 CLI now prints command- and subcommand-specific help. `dev3 task create --help`, `dev3 note add --help`, `dev3 label set --help`, etc. show focused usage and flags for that exact command instead of dumping the generic top-level help. A new declarative help registry (src/cli/help.ts) is the single source of truth; `remote`/`gui` keep their own richer help."
	},
	{
		"date": "2026-06-22",
		"type": "fix",
		"slug": "sidebar-custom-column-grouping",
		"title": "Active Tasks sidebar now mirrors the kanban board: tasks parked in a custom column (e.g",
		"body": "Active Tasks sidebar now mirrors the kanban board: tasks parked in a custom column (e.g. \"On hold\") show under their own column group with the column's color instead of leaking into their underlying built-in status group, and built-in status groups exclude custom-column tasks. Within each group, tasks are sorted oldest-first by last status change (longest-waiting on top) so blocked tasks can't be buried."
	},
	{
		"date": "2026-06-22",
		"type": "feature",
		"slug": "surface-aware-tips-sidebar",
		"title": "Feature-discovery tips are now surface-aware and reach beyond the Kanban board",
		"body": "Feature-discovery tips are now surface-aware and reach beyond the Kanban board. Each tip declares the surface(s) it's most relevant to, and a compact tip card now appears in the Active Tasks sidebar (under the search box) in the task view — so terminal users finally see tips too. Context biases ordering (relevant tips lead) without ever hiding the rest. Added a top-priority tip teaching that selecting text in any terminal pane auto-copies it to the clipboard. Each tip card now shows a thin progress bar timing the auto-rotation; hovering the card pauses it, and \"Next tip\" restarts it. Text inside tip cards is no longer selectable (it looked broken). The first time you copy by selecting terminal text, a one-time toast explains that selection auto-copies."
	},
	{
		"date": "2026-06-22",
		"type": "fix",
		"slug": "terminal-stale-altscreen-selection",
		"title": "Fixed a terminal selection that stayed glued to the screen while a full-screen TUI (Claude Code, vim, htop) repainted...",
		"body": "Fixed a terminal selection that stayed glued to the screen while a full-screen TUI (Claude Code, vim, htop) repainted underneath it. ghostty-web never clears the selection on write, so on the alternate screen the highlight floated over the wrong text; we now drop any alt-screen selection on each write. Primary-screen scrollback selections are unaffected.",
		"suggestedBy": "shaharitzko"
	},
	{
		"date": "2026-06-21",
		"type": "feature",
		"slug": "keyboard-first-hints-nav",
		"title": "Generalized the Vimium-style hint overlay into a cross-surface navigation primitive: pressing F (or the new ⌘G alias)...",
		"body": "Generalized the Vimium-style hint overlay into a cross-surface navigation primitive: pressing F (or the new ⌘G alias) now labels every task, project row, and sidebar task on screen — dashboard and task view included — and hint typing plus activation are matched on physical key codes, so they finally work on Cyrillic, Hebrew, and other non-Latin layouts. Also added a Linear/GitHub-style \"go to\" layer (G then D/P/T/S → dashboard/project/tasks/settings, plus G then a digit = project N and G P/T + digit = that project's board/tasks), \"/\" to focus the search box, and \"C\" as a bare-key alias for new task. Builds directly on Ittai Zeidman's original Vimium hint concept.",
		"suggestedBy": "ittaiz",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/704",
		"issueRef": "#704"
	},
	{
		"date": "2026-06-21",
		"type": "fix",
		"slug": "preparing-task-loading-view",
		"title": "Opening a task that is still cloning/setting up now shows a loading state (stage progress + Cancel) in the main task ...",
		"body": "Opening a task that is still cloning/setting up now shows a loading state (stage progress + Cancel) in the main task view instead of leaving the previously-active task's terminal on screen. Still-preparing cards are now clickable so the loading view can surface."
	},
	{
		"date": "2026-06-20",
		"type": "fix",
		"slug": "completion-modal-task-details",
		"title": "The \"Unsaved Changes\" confirmation shown when completing or cancelling a task with uncommitted changes now displays t...",
		"body": "The \"Unsaved Changes\" confirmation shown when completing or cancelling a task with uncommitted changes now displays the task's title and overview in an info card, so you can tell which task's worktree and branch are about to be deleted."
	},
	{
		"date": "2026-06-20",
		"type": "feature",
		"slug": "vimium-task-hints",
		"title": "Added Vimium-style task hint navigation to the board",
		"body": "Added Vimium-style task hint navigation to the board. Press F (when not typing in a field) to overlay a short letter hint on every visible task card; type the hint to jump straight to that task, exactly as if you had clicked the card. Backspace edits the typed prefix and Esc cancels."
	},
	{
		"date": "2026-06-19",
		"type": "feature",
		"slug": "git-refresh-force-merge-check",
		"title": "The git refresh button in a task now force-checks whether the branch is fully merged into its base",
		"body": "The git refresh button in a task now force-checks whether the branch is fully merged into its base. If it is, the \"Branch Merged — complete the task?\" prompt reappears even after you dismissed it earlier (bypassing the usual suppression), and you get a toast when nothing is mergeable yet."
	},
	{
		"date": "2026-06-19",
		"type": "fix",
		"slug": "guard-before-activate-task",
		"title": "Fixed a leaked git worktree and tmux/PTY session that occurred when a conditional task move (--if-status / --if-statu...",
		"body": "Fixed a leaked git worktree and tmux/PTY session that occurred when a conditional task move (--if-status / --if-status-not) was blocked: the guard is now evaluated before activateTask, so no worktree is created when the move is rejected. The authoritative in-lock guard inside updateTask is unchanged."
	},
	{
		"date": "2026-06-19",
		"type": "feature",
		"slug": "keyboard-shortcuts-registry",
		"title": "Added a single source of truth for app-level keyboard shortcuts (src/mainview/keymap.ts) and a unified Keyboard Short...",
		"body": "Added a single source of truth for app-level keyboard shortcuts (src/mainview/keymap.ts) and a unified Keyboard Shortcuts overlay with two tabs (App + Terminal/tmux), opened via Help → Keyboard Shortcuts, the ⌘/ (Ctrl+/) shortcut, or the ⇧⌘P command palette. The previously dead Help → Keyboard Shortcuts menu item is now wired, and the standalone tmux cheat sheet was folded into the Terminal tab."
	},
	{
		"date": "2026-06-19",
		"type": "fix",
		"slug": "label-delete-lost-update-race",
		"title": "Fixed a lost-update race in the CLI socket `label.delete` handler: it recomputed each task's labelIds from a stale sn...",
		"body": "Fixed a lost-update race in the CLI socket `label.delete` handler: it recomputed each task's labelIds from a stale snapshot taken outside the per-task lock, so a concurrent labelIds change (e.g. setting labels from the UI) could be silently clobbered. It now recomputes inside the lock via updateTaskWith, mirroring the RPC deleteLabel handler."
	},
	{
		"date": "2026-06-19",
		"type": "docs",
		"slug": "landing-og-meta-and-screenshot-cleanup",
		"title": "Added Open Graph and Twitter card meta tags (og:image, twitter:card, og:url, canonical) to the landing page so shared...",
		"body": "Added Open Graph and Twitter card meta tags (og:image, twitter:card, og:url, canonical) to the landing page so shared links render a preview image, pointing at the dev3.h0x91b.com custom domain. Removed three screenshots that still carried hand-drawn green annotation marks left over from agent communication — file-browser and completed-column from the hero carousel and pr-review-mode from the README — and deleted the defective image files; the PR review feature stays described in text and the carousel rebuilds its dots from the remaining slides. Refreshed the hero carousel with new English-only screenshots: replaced the stale \"Review by AI (unimplemented)\" board shot and the dated activity dashboard, and added command-palette (⌘⇧P) and project-quick-switch (⌘K) slides; the README hero now uses the fresh board image too. Added three more English-only carousel slides for previously unshown killer features: the built-in inline diff/code-review viewer, the bug-hunters launcher, and the Option+Tab task switcher with live previews. Added a Remote Access (QR + Cloudflare tunnel) carousel slide, refreshed the global-settings (Coding Agents) and light-theme board shots, and expanded the README key-features list with remote/browser mode, built-in code review, bug hunters, and the command palette/quick-switch shortcuts. Replaced the stale Cyrillic multi-attempt shot with a fresh English board showing the siblings/variants popover. Replaced the stale terminal-view shot with a fresh English three-pane split running Claude Code, Codex and opencode side by side in one task worktree. Replaced the stale multi-agent-launch shot with a fresh English Spawn Agent dialog showing the agent picker (Claude, Codex, Gemini, opencode, Cursor). Replaced the static hover-preview PNG with an animated GIF (3x sped-up screen recording) of live per-second progress updating across kanban cards. Added two new feature cards to the landing page for previously unadvertised power-user features: auto-allocated per-task ports ($DEV3_PORT0/1) and opening a separate dev-3.0 window per monitor (Cmd+Shift+N). Added a \"Every shortcut in one panel\" feature block with a screenshot of the unified keyboard-shortcuts reference (App tab + full tmux keymap, opened with Cmd+/). Replaced the stopgap Open Graph image with a purpose-built 1200x630 share card (brand gradient, wordmark, tagline, framed kanban screenshot), generated from a reproducible docs/og-card.html template rendered headless, and added og:image width/height hints. Replaced Aider with opencode in the compatible-agents lists (landing tech bar, landing agent badges, README key features) to match the agents the Spawn Agent picker actually offers. Added three more feature cards for previously unadvertised power features: column agents (auto-spawn on column entry), automatic AI review of completed tasks, and the monorepo sparse-checkout file filter."
	},
	{
		"date": "2026-06-19",
		"type": "feature",
		"slug": "landing-tips-section",
		"title": "Added a \"Tips & tricks\" section to the marketing landing page: a curated grid of 12 hand-picked power-user tips, plus...",
		"body": "Added a \"Tips & tricks\" section to the marketing landing page: a curated grid of 12 hand-picked power-user tips, plus a collapsed \"Show all\" disclosure (closed by default) that reveals the full ~90-tip list. The full list is generated from the in-app tip registry by scripts/generate-landing-tips.ts, so it stays in sync as tips are added or edited."
	},
	{
		"date": "2026-06-19",
		"type": "feature",
		"slug": "menu-palette-entries",
		"title": "Added \"Go to Project… (⌘K)\" and \"Command Palette… (⇧⌘P)\" entries to the top of the native View menu so the keyboard p...",
		"body": "Added \"Go to Project… (⌘K)\" and \"Command Palette… (⇧⌘P)\" entries to the top of the native View menu so the keyboard palettes are discoverable and clickable. The Cmd+K / Cmd+Shift+P shortcuts themselves are unchanged."
	},
	{
		"date": "2026-06-19",
		"type": "feature",
		"slug": "persist-diff-review",
		"title": "Inline diff-review comments are now kept per task for up to 3 days, so they survive diff reloads, leaving the viewer,...",
		"body": "Inline diff-review comments are now kept per task for up to 3 days, so they survive diff reloads, leaving the viewer, and app restarts — if an accidental clipboard clobber wipes your copied review, just reopen the diff and copy it again. A new \"Reset review\" button (with confirmation) clears them early when you're done."
	},
	{
		"date": "2026-06-19",
		"type": "fix",
		"slug": "reset-column-order-same-status-move",
		"title": "Fixed task cards landing at a stale mid-column position after moving between a builtin column and a custom column tha...",
		"body": "Fixed task cards landing at a stale mid-column position after moving between a builtin column and a custom column that share the same status (e.g. In Progress <-> On hold). Such moves now reset columnOrder, refresh movedAt, and honor the taskDropPosition setting, so the card sits at the top/bottom as configured after an app reload."
	},
	{
		"date": "2026-06-19",
		"type": "fix",
		"slug": "task-diff-many-files-perf",
		"title": "Sped up opening the task diff for large changesets (180+ files no longer take 10s+)",
		"body": "Sped up opening the task diff for large changesets (180+ files no longer take 10s+). The backend now reads every file's content through batched `git cat-file` calls and a single `git diff --numstat`, instead of spawning ~3-5 git processes per file; per-file hunks are dropped (the renderer derives them from content), turning hundreds of sequential git spawns into a handful. Reported and root-caused by Alexander Kiselyov, who dug into the sources and pinpointed the per-file git spawns."
	},
	{
		"date": "2026-06-19",
		"type": "refactor",
		"slug": "tips-audit-trim-score",
		"title": "Audited the \"Did you know?\" tips: removed 10 low-value/duplicate tips, merged 15 redundant ones into their stronger s...",
		"body": "Audited the \"Did you know?\" tips: removed 10 low-value/duplicate tips, merged 15 redundant ones into their stronger siblings (120 → 95). Each tip now carries a coolness score (1–5) and the rotation surfaces the highest tier first in random order, draining to lower tiers as tips are seen."
	},
	{
		"date": "2026-06-18",
		"type": "fix",
		"slug": "atomic-json-writes",
		"title": "Made projects.json and tasks.json saves crash-safe by writing to a sibling temp file and renaming it over the final path",
		"body": "Made projects.json and tasks.json saves crash-safe by writing to a sibling temp file and renaming it over the final path. A crash or power loss mid-write can no longer truncate the live file and silently empty the dashboard or board."
	},
	{
		"date": "2026-06-18",
		"type": "feature",
		"slug": "command-action-palette",
		"title": "Added a Cmd/Ctrl+Shift+P command (action) palette — the action counterpart to the Cmd+K navigation palette",
		"body": "Added a Cmd/Ctrl+Shift+P command (action) palette — the action counterpart to the Cmd+K navigation palette. Fuzzy-search and run any command (theme, language, navigate back/forward, open home/project terminal, dev server, git pull, create PR, move task between safe statuses…); only commands runnable in the current context are listed. Built on a shared PaletteShell extracted from the project quick-switch palette, dispatching through the same menu router the native menu uses (which also fixed several previously no-op menu items)."
	},
	{
		"date": "2026-06-18",
		"type": "fix",
		"slug": "create-task-labels",
		"title": "Fixed labels selected in the New Task dialog being lost when the task was launched (Save & Start) — spawned variants ...",
		"body": "Fixed labels selected in the New Task dialog being lost when the task was launched (Save & Start) — spawned variants and added attempts now inherit the source task's labels. Also added an inline \"+ Add Label\" control to the New Task dialog so labels can be created and assigned without leaving the form, and a hover hint on the Kanban label bar pointing users to Project Settings to rename, recolor or delete labels."
	},
	{
		"date": "2026-06-18",
		"type": "feature",
		"slug": "diff-syntax-highlighting",
		"title": "Added syntax highlighting to the task diff viewer",
		"body": "Added syntax highlighting to the task diff viewer. Code is now colored by language (detected from the file extension) and follows the active light/dark theme. The library's 2000-line cap that left large files plain was raised so big source files are highlighted too.",
		"suggestedBy": "h0x91b",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/543",
		"issueRef": "#543"
	},
	{
		"date": "2026-06-18",
		"type": "feature",
		"slug": "project-quick-switch-palette",
		"title": "Added a VSCode/Linear-style project quick-switch palette: press Cmd/Ctrl+K, type part of a project name, and hit Ente...",
		"body": "Added a VSCode/Linear-style project quick-switch palette: press Cmd/Ctrl+K, type part of a project name, and hit Enter to jump to the best fuzzy match (arrow keys to pick another). No more memorizing project numbers."
	},
	{
		"date": "2026-06-18",
		"type": "feature",
		"slug": "shell-env-inheritance",
		"title": "dev3 now inherits the full exported environment from your active login shell (bash or zsh) into agent and MCP session...",
		"body": "dev3 now inherits the full exported environment from your active login shell (bash or zsh) into agent and MCP sessions, instead of only a handful of whitelisted vars. This fixes env-based MCP servers (mongodb, datadog, github, etc.) that previously failed with \"Connection closed\" / \"needs authentication\" because credentials set in your .zshrc/.bashrc never reached the non-interactive tmux session. Runtime/internal vars are filtered out, and a new global setting importShellEnv (default on) lets you opt back into an isolated environment."
	},
	{
		"date": "2026-06-18",
		"type": "refactor",
		"slug": "taskSearch-fuzzy",
		"title": "Task search now uses the shared fzf-style fuzzy matcher (fuzzyMatch) for title and description instead of a naive sub...",
		"body": "Task search now uses the shared fzf-style fuzzy matcher (fuzzyMatch) for title and description instead of a naive substring check, so it behaves consistently with the project quick-switch palette. Identifier fields (seq, UUID, PR number) keep strict prefix matching."
	},
	{
		"date": "2026-06-18",
		"type": "fix",
		"slug": "throttle-background-git-polling",
		"title": "Fixed UI freezes (main-loop stalls) caused by a storm of git processes",
		"body": "Fixed UI freezes (main-loop stalls) caused by a storm of git processes. The background merge-detection and PR-promotion pollers now schedule each task individually: the project board you are actively viewing is polled at full cadence while every off-screen project is throttled heavily. Each check is given random jitter so equal intervals never align, fresh tasks are spread across their whole window, and a poll tick that arrives long after a laptop wakes from sleep re-spreads the backlog instead of firing every overdue check at once."
	},
	{
		"date": "2026-06-17",
		"type": "feature",
		"slug": "diff-drag-multiline-comments",
		"title": "In the diff viewer you can now click a line number in the gutter and drag to select a range of lines, then leave a si...",
		"body": "In the diff viewer you can now click a line number in the gutter and drag to select a range of lines, then leave a single inline review comment covering the whole range. The composer and the saved thread show the selected line range. Also fixed the changed-files sidebar so the Review Export header keeps its own space and the file tree scrolls beneath it instead of showing through it."
	},
	{
		"date": "2026-06-17",
		"type": "fix",
		"slug": "instant-completion-sound",
		"title": "Completing or cancelling a task now reacts instantly on every surface (board drag, card status menu, info panel, deta...",
		"body": "Completing or cancelling a task now reacts instantly on every surface (board drag, card status menu, info panel, detail modal, terminal toolbar): the card moves optimistically and the completion sound plays the moment you act, instead of waiting for the worktree-cleanup round-trip. All the previously divergent move flows were unified into a single moveTaskToStatus helper so behaviour is identical everywhere. The bun completion sound is now suppressed precisely by task id, so two tasks finishing back-to-back both ring while the local play and its echo never double up."
	},
	{
		"date": "2026-06-17",
		"type": "chore",
		"slug": "paste-threshold-by-characters",
		"title": "Changed the large-text-paste threshold to count characters instead of UTF-8 bytes and raised it to 8192, so pasting t...",
		"body": "Changed the large-text-paste threshold to count characters instead of UTF-8 bytes and raised it to 8192, so pasting text into a task description, note, or the agent terminal is saved as a .txt attachment only once it exceeds 8192 characters — the limit is now language-independent and no longer penalizes Cyrillic or other multibyte text."
	},
	{
		"date": "2026-06-17",
		"type": "chore",
		"slug": "raise-paste-as-file-threshold",
		"title": "Raised the large-text-paste threshold from 1 KB to 4 KB, so pasting text into a task description, note, or the agent ...",
		"body": "Raised the large-text-paste threshold from 1 KB to 4 KB, so pasting text into a task description, note, or the agent terminal only saves it as a .txt attachment once it exceeds 4 KB."
	},
	{
		"date": "2026-06-17",
		"type": "feature",
		"slug": "task-show-overview-notes-history",
		"title": "`dev3 task show` now always prints the task's current overview, and accepts `--notes` to inline note bodies and `--hi...",
		"body": "`dev3 task show` now always prints the task's current overview, and accepts `--notes` to inline note bodies and `--history` to show the title/overview change log. Lets agents understand a neighbouring or dependency task in one call without its worktree or conversation."
	},
	{
		"date": "2026-06-16",
		"type": "polish",
		"slug": "active-sidebar-working-spinner",
		"title": "Polished the active-tasks sidebar",
		"body": "Polished the active-tasks sidebar. The \"Agent is Working\" and \"AI Review\" status group headers now show an animated spinner instead of a static dot, and for those busy statuses a bright highlight now flows down the card's left rail — both signal that an agent is still in progress. Lightened the task number and last-updated time from fg-muted to fg-3 for readability, and made the currently-selected task stand out more (stronger accent tint, inset ring, and a wider glowing left rail in the sidebar; brighter ring and shadow on the board card)."
	},
	{
		"date": "2026-06-16",
		"type": "feature",
		"slug": "back-forward-navigation",
		"title": "Added browser-style back/forward navigation: two arrow buttons at the top-left of the global header, plus ⌘[ / ⌘] key...",
		"body": "Added browser-style back/forward navigation: two arrow buttons at the top-left of the global header, plus ⌘[ / ⌘] keyboard shortcuts and mouse side buttons. The route-history model already existed; this wires it up to global UI controls."
	},
	{
		"date": "2026-06-16",
		"type": "feature",
		"slug": "cli-note-show-and-current-brief",
		"title": "Added two agent-CLI conveniences driven by platform vents",
		"body": "Added two agent-CLI conveniences driven by platform vents. `dev3 note show <id>` prints a single note's complete body (8-char prefix, ambiguity/not-found errors) since `dev3 note list` only shows a truncated one-line preview — notes are the durable continuity record across context resets, so they must be readable in full. `dev3 current --brief` skips re-printing the full task description (which most agents already receive as their initial prompt), keeping project/task/status/overview to save context tokens. The dev3 skill teaches both."
	},
	{
		"date": "2026-06-16",
		"type": "feature",
		"slug": "conversation-search",
		"title": "Added `dev3 conversations search \"<query>\"` to search past task conversations (completed/cancelled) by scanning each ...",
		"body": "Added `dev3 conversations search \"<query>\"` to search past task conversations (completed/cancelled) by scanning each task's surviving record — the agent transcript plus the task's own notes, overview, and title/overview history — and returning the top few most relevant tasks with snippets. Ranks with BM25 (notes/overview boosted; recency tie-breaker), so common words and injected boilerplate stop dominating and a task with no surviving transcript still surfaces via its notes. Searches local files only (no app needed) across Claude, Codex, and Gemini transcripts, and hard-excludes the current task plus every sibling variant in its group so parallel variants can't peek at each other. Also exposed as a `searchConversations` RPC for a future UI panel and documented in the agent skill (on-demand use only).",
		"suggestedBy": "IttaiZeidman"
	},
	{
		"date": "2026-06-16",
		"type": "feature",
		"slug": "paste-large-text-as-file",
		"title": "Pasting a large text block (over 1 KB) into a task description, note, or the agent terminal now saves it as a .txt at...",
		"body": "Pasting a large text block (over 1 KB) into a task description, note, or the agent terminal now saves it as a .txt attachment in the worktree uploads dir and inserts its path, just like image paste — instead of dumping the raw text and bloating the task. Uploaded non-image files now render as a removable file card in the attachments strip alongside image thumbnails."
	},
	{
		"date": "2026-06-16",
		"type": "chore",
		"slug": "reorder-opus48-presets",
		"title": "Reordered the built-in Claude presets so the Opus 4.8 variants sit at the top of the list and made an Opus 4.8 preset...",
		"body": "Reordered the built-in Claude presets so the Opus 4.8 variants sit at the top of the list and made an Opus 4.8 preset the default, since Fable 5 is temporarily unavailable. Fable 5 and Sonnet presets remain below for when Fable 5 returns."
	},
	{
		"date": "2026-06-16",
		"type": "docs",
		"slug": "strengthen-notes-guidance",
		"title": "Strengthened two sections of the dev3 agent skill",
		"body": "Strengthened two sections of the dev3 agent skill. Notes: stress that notes are the durable memory surviving worktree destruction, with a concrete bar for what to record versus skip. Vents: nudge agents to use the platform-feedback channel far more proactively, lowering the bar so everyday friction gets reported instead of the channel sitting empty."
	},
	{
		"date": "2026-06-16",
		"type": "feature",
		"slug": "task-title-overview-history",
		"title": "Tasks now keep an append-only history of their title and overview as they change over time, recorded automatically in...",
		"body": "Tasks now keep an append-only history of their title and overview as they change over time, recorded automatically in the data layer (seeded at creation, updated whenever the displayed title or overview changes). Not shown in the UI yet — stored for a future history view and search."
	},
	{
		"date": "2026-06-16",
		"type": "fix",
		"slug": "ui-freeze-rpc-bridge-and-poll-storm",
		"title": "Fixed two UI-freeze classes",
		"body": "Fixed two UI-freeze classes. The desktop RPC bridge (Electrobun localhost socket) had no reconnect, so after sleep every request could hang for the full timeout with the GUI stuck (terminals kept working) until a force quit — added a liveness-ping watchdog that re-opens the socket and, as a last resort, reloads the webview while bun stays alive. Separately, git-status pollers fired on every open task panel every 15s and all pending timers stampeded on wake; pollers are now visibility-aware (paused while hidden, single refresh on wake) with jitter, and heavy branch-status runs are capped by a global concurrency semaphore."
	},
	{
		"date": "2026-06-15",
		"type": "feature",
		"slug": "agent-vent-feedback",
		"title": "Added a background, local-only \"vent\" channel: agents run `dev3 vents \"name\" \"markdown\"` to file anonymous feedback a...",
		"body": "Added a background, local-only \"vent\" channel: agents run `dev3 vents \"name\" \"markdown\"` to file anonymous feedback about the dev3 platform itself — both bug reports (something in dev3 got in the way) and feature requests (a missing dev3 capability that would have saved work). Each vent is written as a standalone markdown file under ~/.dev3.0/vents/ with no project context, code, or PII attached — nothing leaves the machine and nothing changes in the UI. The dev3 skill always teaches agents the command and when to use it; the maintainer reads the folder directly."
	},
	{
		"date": "2026-06-15",
		"type": "fix",
		"slug": "ansi-dim-dark-theme",
		"title": "Fixed unreadable muted text in Claude Code's select prompts on the dark theme",
		"body": "Fixed unreadable muted text in Claude Code's select prompts on the dark theme. Option descriptions, numbers and hints are drawn with the terminal dim attribute, which ghostty renders as 50% alpha — on the dark background that collapsed the default foreground into a low-contrast gray. The theme-readability filter now strips dim in the dark theme too (it already did in light), so that text renders at full intensity and stays legible."
	},
	{
		"date": "2026-06-15",
		"type": "fix",
		"slug": "ansi-dim-emulate-gray",
		"title": "Follow-up to the dim-readability fix: instead of dropping the terminal dim attribute entirely (which made the input g...",
		"body": "Follow-up to the dim-readability fix: instead of dropping the terminal dim attribute entirely (which made the input ghost/placeholder suggestion render like already-typed text), dim over the default foreground is now emulated as an explicit muted gray. Muted text stays readable but clearly secondary in both themes, and the placeholder suggestion looks dimmed again. Colored dim still yields the full color."
	},
	{
		"date": "2026-06-15",
		"type": "feature",
		"slug": "cmd-shift-switch-opposite-view",
		"title": "Added Cmd/Ctrl+Shift+1..9 to switch to a project by index and land on the opposite view of the current one — from the...",
		"body": "Added Cmd/Ctrl+Shift+1..9 to switch to a project by index and land on the opposite view of the current one — from the Kanban board you get the project's task view, from a task view you get its board. This mirrors Cmd+1..9, which preserves the current view."
	},
	{
		"date": "2026-06-15",
		"type": "fix",
		"slug": "file-lock-double-acquire",
		"title": "Fixed a file-lock race where two processes could both acquire the same lock for a brand-new project: the ENOENT recov...",
		"body": "Fixed a file-lock race where two processes could both acquire the same lock for a brand-new project: the ENOENT recovery branch used a recursive mkdir on the lock dir itself, which silently swallows EEXIST. It now creates only the parent directory and retries the atomic non-recursive mkdir, so cross-process mutual exclusion holds. The lock path and on-disk shape are unchanged, so older app versions stay interoperable."
	},
	{
		"date": "2026-06-15",
		"type": "fix",
		"slug": "flaky-pty-server-configuretmux-tests",
		"title": "Fixed flaky pty-server configureTmux timeout tests by replacing fixed two-microtask flushes with vi.waitFor polling, ...",
		"body": "Fixed flaky pty-server configureTmux timeout tests by replacing fixed two-microtask flushes with vi.waitFor polling, so assertions no longer depend on the exact async promise-chain depth under CI load. Test-only change; production code untouched."
	},
	{
		"date": "2026-06-15",
		"type": "fix",
		"slug": "frozen-tip-rotation",
		"title": "Fixed the \"Did you know?\" tip card never rotating: the 60s rotation timer captured a stale (null) tipState in its clo...",
		"body": "Fixed the \"Did you know?\" tip card never rotating: the 60s rotation timer captured a stale (null) tipState in its closure, so it rescheduled forever and never marked tips seen. The timer now reads the latest tip state via refs, so tips rotate and the seen-cooldown is recorded."
	},
	{
		"date": "2026-06-15",
		"type": "refactor",
		"slug": "header-button-spacing",
		"title": "Tightened horizontal spacing in the GlobalHeader action row (gap 6px→2px, button padding 8px→6px) to reclaim valuable...",
		"body": "Tightened horizontal spacing in the GlobalHeader action row (gap 6px→2px, button padding 8px→6px) to reclaim valuable top-bar space without shrinking hit targets."
	},
	{
		"date": "2026-06-15",
		"type": "fix",
		"slug": "merge-popup-not-reshown",
		"title": "Fixed the \"Branch Merged — mark task completed?\" popup never re-appearing when it was missed",
		"body": "Fixed the \"Branch Merged — mark task completed?\" popup never re-appearing when it was missed. A prompt reserved while the task was in review was muted for an hour and, if the task then left the eligible-status set (e.g. an agent resumed work, flipping it to in-progress), it was lost for good. An unanswered prompt (never dismissed) now re-offers completion as soon as the task is eligible again, instead of being time-suppressed."
	},
	{
		"date": "2026-06-15",
		"type": "chore",
		"slug": "new-app-icon",
		"title": "Replaced the app icon with a new transparent design: four rounded tiles (Kanban board, git branch graph, tmux split t...",
		"body": "Replaced the app icon with a new transparent design: four rounded tiles (Kanban board, git branch graph, tmux split terminal, multi-agent swarm) around a central neural brain, with tile colors matched to the kanban status palette. Regenerated all icon.iconset sizes and the website/README icon (docs/icon.png) from a 2048x2048 transparent source."
	},
	{
		"date": "2026-06-15",
		"type": "feature",
		"slug": "option-tab-task-switcher",
		"title": "Added an Option+Tab task switcher: hold Option and tap Tab to flip through active tasks of the current project (Optio...",
		"body": "Added an Option+Tab task switcher: hold Option and tap Tab to flip through active tasks of the current project (Option+Shift+Tab spans all projects), release to jump. Arrows ↑↓ move both ways, Enter opens, Esc cancels. Holding/releasing Shift while the overlay is open toggles between the current project and all projects live. The overlay shows a live terminal snapshot, task title, and overview, ordered most-recently-used so a quick tap-tap toggles the two latest tasks. On Linux the binding is Ctrl+Tab / Ctrl+Shift+Tab since the window manager grabs Alt+Tab."
	},
	{
		"date": "2026-06-15",
		"type": "feature",
		"slug": "status-age-badge",
		"title": "Active Tasks sidebar cards now show a compact status-age badge (25s / 5m / 7h / 13d / 7M / 3y) on the meta row, ticki...",
		"body": "Active Tasks sidebar cards now show a compact status-age badge (25s / 5m / 7h / 13d / 7M / 3y) on the meta row, ticking live every second. Hover reveals the full \"status changed … · date\" tooltip."
	},
	{
		"date": "2026-06-15",
		"type": "fix",
		"slug": "tasks-list-custom-title",
		"title": "Fixed `dev3 tasks list` to display the custom/agent-set title via getTaskTitle() instead of the raw auto-generated ti...",
		"body": "Fixed `dev3 tasks list` to display the custom/agent-set title via getTaskTitle() instead of the raw auto-generated title, matching `task show` and the app UI. The list is now ordered newest-first (descending seq), defaults to the newest 50 tasks, and supports `--offset` for paging with a \"Showing X-Y of Z\" footer."
	},
	{
		"date": "2026-06-15",
		"type": "fix",
		"slug": "timeout-stuck-origin-fetch",
		"title": "Prevent task creation from hanging indefinitely when fetching the remote base branch",
		"body": "Prevent task creation from hanging indefinitely when fetching the remote base branch. Remote fetches use non-interactive SSH, and timed-out processes and streams are bounded before worktree creation falls back to the local base branch."
	},
	{
		"date": "2026-06-15",
		"type": "fix",
		"slug": "worktree-prep-failure-recover",
		"title": "Fixed tasks getting stuck in-progress with a misleading \"[session ended]\" terminal when worktree preparation fails (e...",
		"body": "Fixed tasks getting stuck in-progress with a misleading \"[session ended]\" terminal when worktree preparation fails (empty repo or missing base branch). The task is now reverted to To Do and the real error is shown as a toast. Empty repositories also get a clearer \"no commits yet\" message.",
		"suggestedBy": "sworgkh",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/629",
		"issueRef": "#629"
	},
	{
		"date": "2026-06-14",
		"type": "docs",
		"slug": "claude-code-ansi-theme-tip",
		"title": "Documented in the README how dev-3.0's tuned ANSI palettes and readability filter keep agent terminal colors legible,...",
		"body": "Documented in the README how dev-3.0's tuned ANSI palettes and readability filter keep agent terminal colors legible, with optional per-agent theme tips: Claude Code's \"ANSI colors only\" themes, and matching `[tui] theme` values for Codex."
	},
	{
		"date": "2026-06-12",
		"type": "fix",
		"slug": "ansi-fg-before-bg-restore",
		"title": "Fixed the unreadable branch pill in Claude Code's status line on the dark theme",
		"body": "Fixed the unreadable branch pill in Claude Code's status line on the dark theme. Claude emits the pill's pure-black foreground before its teal background; the theme-readability filter had already brightened the black to gray by the time the gating background arrived, leaving gray-on-cyan. The filter now remembers the original params of an adjusted foreground until text is drawn and re-emits them when a background that gates foreground adjustment opens first, restoring the intended black-on-teal contrast (and the light-theme mirror case)."
	},
	{
		"date": "2026-06-12",
		"type": "fix",
		"slug": "non-selectable-button-text",
		"title": "Button labels are no longer selectable as text: a global `user-select: none` rule on `button` elements prevents accid...",
		"body": "Button labels are no longer selectable as text: a global `user-select: none` rule on `button` elements prevents accidental text highlighting when dragging the mouse across toolbar and header controls."
	},
	{
		"date": "2026-06-12",
		"type": "feature",
		"slug": "pull-button-behind-indicator",
		"title": "The header Git Pull button now quietly signals when the local main/master is behind origin: the icon gets a subtle ac...",
		"body": "The header Git Pull button now quietly signals when the local main/master is behind origin: the icon gets a subtle accent tint and a tiny blue dot, and the tooltip shows how many new commits are available. Remote refs are refreshed in the background at most once every 3 minutes to keep polling cheap."
	},
	{
		"date": "2026-06-11",
		"type": "fix",
		"slug": "background-polling-cpu-churn",
		"title": "Cut background CPU churn from polling: tasks.json/projects.json reads are now served from an mtime-validated cache (w...",
		"body": "Cut background CPU churn from polling: tasks.json/projects.json reads are now served from an mtime-validated cache (was ~6,400 full re-parses per hour), failing `git fetch origin` gets an exponential backoff instead of retrying every poller tick, `detectDefaultCompareRef` (git shortlog) is cached for 10 minutes, and `gh auth status`/`gh auth token` results are cached instead of spawning three subprocesses per GitHub call."
	},
	{
		"date": "2026-06-11",
		"type": "fix",
		"slug": "deleted-project-folder-empty-board",
		"title": "Fixed the dashboard showing an empty project list when one project's folder was deleted from disk — config resolution...",
		"body": "Fixed the dashboard showing an empty project list when one project's folder was deleted from disk — config resolution for a missing folder rejected the whole getProjects call. Each project now resolves independently and a broken one falls back to its stored settings. Also added daily projects.json backups (~/.dev3.0/projects-YYYY-MM-DD.json.bak, kept 7 days), written on startup and before each save."
	},
	{
		"date": "2026-06-11",
		"type": "feature",
		"slug": "skill-autocomplete-task-description",
		"title": "Typing \"/\" in the new-task description now opens an autocomplete dropdown with agent skills discovered in the global ...",
		"body": "Typing \"/\" in the new-task description now opens an autocomplete dropdown with agent skills discovered in the global skill directories (~/.agents/skills, ~/.claude/skills, ~/.codex/skills). Arrow keys navigate, Enter/Tab or click inserts the skill name, Escape dismisses the list without closing the modal."
	},
	{
		"date": "2026-06-10",
		"type": "feature",
		"slug": "agent-completion-request",
		"title": "AI agents can now request task completion via `dev3 task move --status completed`",
		"body": "AI agents can now request task completion via `dev3 task move --status completed`. Instead of moving the task directly, the CLI blocks (up to 10 minutes) while the app shows a visually distinct AI-initiated approval dialog — approving completes the task and destroys the session, declining returns exit code 6 to the agent so it knows the user said no. `cancelled` remains fully forbidden via CLI."
	},
	{
		"date": "2026-06-10",
		"type": "fix",
		"slug": "light-theme-terminal-colors",
		"title": "Fixed unreadable terminal colors in both themes",
		"body": "Fixed unreadable terminal colors in both themes. AI agents emit colors tuned for the opposite background: Claude Code sends pale 256-color codes and SGR dim (washed out in light mode), Codex sends GitHub-light ink truecolors like #333333 (invisible in dark mode). The PTY stream is now rewritten on the fly: in light mode dim is dropped, pale foregrounds are darkened, and white backgrounds (Claude Code's message bars) become light gray; in dark mode too-dark foregrounds are brightened toward white, and white backgrounds (Claude Code's message bars and history-select highlight, which the dark palette resolved to a pale lavender block) become dark gray with dark fg on them flipped to light. Foreground fixes are skipped only while an explicit opposite-polarity or unknown background (named ANSI colors, reverse video) is active, so vim themes and highlight bars keep their intended contrast — but bad contrast on a same-polarity background is still fixed (Codex draws its model name in pure black on its own dark truecolor background). Also darkened the light theme's 16-color ANSI palette (white, bright black, both yellows) so diffs and muted text are legible on white."
	},
	{
		"date": "2026-06-10",
		"type": "fix",
		"slug": "merge-prompt-reliability",
		"title": "Fixed several reliability issues in the \"PR merged\" completion popup: a prompt lost to an app restart was suppressed ...",
		"body": "Fixed several reliability issues in the \"PR merged\" completion popup: a prompt lost to an app restart was suppressed forever (now it re-appears after an hour if unanswered, while explicit dismissals stay permanent), tasks whose remote branch was pruned after merge (delete_branch_on_merge) were never detected (now verified via the GitHub merged-PR check), the popup could appear while uncommitted changes remained in the worktree, and it could fire when comparing against a non-base ref in the diff dropdown. Dismissed prompts also no longer burn git/gh calls on every poller tick."
	},
	{
		"date": "2026-06-10",
		"type": "fix",
		"slug": "zed-new-window-per-worktree",
		"title": "Fixed \"Open in → Zed\" so each worktree opens in its own Zed window instead of swapping the project in the single runn...",
		"body": "Fixed \"Open in → Zed\" so each worktree opens in its own Zed window instead of swapping the project in the single running window. When the Zed CLI is available (on PATH or bundled in Zed.app), dev3 now launches it with the `-n` flag; it falls back to `open -a Zed` otherwise."
	},
	{
		"date": "2026-06-09",
		"type": "feature",
		"slug": "active-tasks-status-color-rails",
		"title": "Active Tasks sidebar now color-codes every task by its status: a colored left rail plus a faint status wash on each c...",
		"body": "Active Tasks sidebar now color-codes every task by its status: a colored left rail plus a faint status wash on each card, and a tinted, color-barred group header. Makes it obvious at a glance which tasks are running, waiting for review, or asking questions — without hunting for the tiny status dot. Works in both dark and light themes."
	},
	{
		"date": "2026-06-09",
		"type": "fix",
		"slug": "cli-short-project-id",
		"title": "Fixed the dev3 CLI rejecting 8-char short project IDs (the form shown by `projects list`) on the `--project` flag",
		"body": "Fixed the dev3 CLI rejecting 8-char short project IDs (the form shown by `projects list`) on the `--project` flag. Short project IDs are now expanded to the full UUID across task, note, label, overview, dev-server, config, and tasks commands, matching how short task IDs already work."
	},
	{
		"date": "2026-06-09",
		"type": "fix",
		"slug": "dev3-cli-bash-path",
		"title": "Fix `dev3: command not found` in extra terminals opened inside a task for bash users",
		"body": "Fix `dev3: command not found` in extra terminals opened inside a task for bash users. Login bash (macOS Terminal and tmux) reads the login profile, not `.bashrc`, so the dev3 PATH line never loaded; we now also write it to the bash login profile (`.bash_profile`/`.bash_login`/`.profile`)."
	},
	{
		"date": "2026-06-09",
		"type": "fix",
		"slug": "diff-rename-detection",
		"title": "Fixed the diff view showing renamed files as a full delete + add (every line changed) instead of the few lines that a...",
		"body": "Fixed the diff view showing renamed files as a full delete + add (every line changed) instead of the few lines that actually differ. Rename/copy detection is now passed explicitly to every git diff call at git's default 50% similarity, so it works regardless of the user's `diff.renames` config and no longer drops renames with moderate edits."
	},
	{
		"date": "2026-06-09",
		"type": "feature",
		"slug": "fable-5-default-model",
		"title": "Added the new Claude model Fable 5 (claude-fable-5) to the Claude agent presets and promoted it to the default launch...",
		"body": "Added the new Claude model Fable 5 (claude-fable-5) to the Claude agent presets and promoted it to the default launch model across all permission modes (Auto, Bypass, Default, Plan, Accept Edits, Don't Ask). The previous Opus 4.8 presets are kept as a fallback block."
	},
	{
		"date": "2026-06-09",
		"type": "fix",
		"slug": "merge-detection-gh-pr-false-positive",
		"title": "Fixed a false-positive \"Branch Merged\" prompt on PR-review tasks, on two layers",
		"body": "Fixed a false-positive \"Branch Merged\" prompt on PR-review tasks, on two layers. The merge-detection poller no longer compares a review branch against itself (it now falls back to the project's base branch, so a genuinely merged PR is still detected), and the GitHub PR fallback now requires the merged PR's head commit to equal the current local HEAD, so a stale/reused-name PR with new unmerged work no longer triggers the prompt."
	},
	{
		"date": "2026-06-09",
		"type": "feature",
		"slug": "sidebar-attention-mode",
		"title": "Added an \"attention\" mode to the Active Tasks sidebar",
		"body": "Added an \"attention\" mode to the Active Tasks sidebar. The project/global scope toggle was replaced by three icon buttons — folder (this project), globe (all projects), and a new bell. Clicking the bell filters the list cross-project to only tasks in `user-questions` or `review-by-user` status, sorted oldest-first. The bell shows a pulsing count badge when tasks are waiting and the mode is not already active."
	},
	{
		"date": "2026-06-08",
		"type": "fix",
		"slug": "codex-profile-v2-flag-removed",
		"title": "Fixed Codex agents failing to launch on newer codex (`error: unexpected argument '--profile-v2'`)",
		"body": "Fixed Codex agents failing to launch on newer codex (`error: unexpected argument '--profile-v2'`). The `--profile-v2` flag was removed from codex and folded into `--profile`, so dev-3.0 now feature-detects the correct profile flag from `codex --help` instead of guessing from the version number.",
		"suggestedBy": "eladharitanwix",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/611",
		"issueRef": "#611"
	},
	{
		"date": "2026-06-08",
		"type": "fix",
		"slug": "overview-default-english",
		"title": "Fixed the dev3 skill overview instruction that led with a Russian example and explicitly forbade defaulting to Englis...",
		"body": "Fixed the dev3 skill overview instruction that led with a Russian example and explicitly forbade defaulting to English, which caused non-Russian users to occasionally get a Russian task overview. The overview now defaults to English and only mirrors another language when the user is clearly communicating in it."
	},
	{
		"date": "2026-06-08",
		"type": "fix",
		"slug": "scratch-no-autosend-codex",
		"title": "Scratch tasks no longer auto-fire a first message on Codex, Cursor, and OpenCode",
		"body": "Scratch tasks no longer auto-fire a first message on Codex, Cursor, and OpenCode. When the task description is empty, the dev3 system prompt is no longer injected as the positional prompt, so the agent opens an empty interactive window like Claude — protocol adherence relies on the auto-installed dev3 skill and hooks."
	},
	{
		"date": "2026-06-07",
		"type": "fix",
		"slug": "activity-view-breadcrumb-click",
		"title": "Fixed the project name in the global header breadcrumb being unclickable on the activity/task view when no task was s...",
		"body": "Fixed the project name in the global header breadcrumb being unclickable on the activity/task view when no task was selected, so you can now return to the kanban board from there. The isOnKanban check now also accounts for taskView mode."
	},
	{
		"date": "2026-06-07",
		"type": "docs",
		"slug": "changelog-merge-date",
		"title": "Clarify the changelog policy: the YYYY/MM/DD path segment is the expected PR merge date, not the day work started",
		"body": "Clarify the changelog policy: the YYYY/MM/DD path segment is the expected PR merge date, not the day work started. Tasks spanning more than one day must have their file/folder renamed to the actual merge day so entries group under the correct ship date."
	},
	{
		"date": "2026-06-07",
		"type": "feature",
		"slug": "multi-folder-add-project",
		"title": "The \"Local Folder\" tab in Add Project now opens the folder picker in multi-select mode, allowing users to select mult...",
		"body": "The \"Local Folder\" tab in Add Project now opens the folder picker in multi-select mode, allowing users to select multiple git repositories at once and add them all as projects in a single step. Selected folders are highlighted in blue; the footer shows the count when multiple are selected."
	},
	{
		"date": "2026-06-06",
		"type": "fix",
		"slug": "dev3-fetch-origin-branch-specific",
		"title": "Replace `git fetch origin` (full fetch) with `git fetch origin <branch>` for all background and triggered fetches tha...",
		"body": "Replace `git fetch origin` (full fetch) with `git fetch origin <branch>` for all background and triggered fetches that only need the base branch ref. The fetch cache is now keyed by `projectPath:branch` so concurrent callers for different branches no longer share stale cache. The branch picker's explicit fetch-all remains unchanged. Fixed follow-up bugs: rebaseTask now fetches the actual rebase target ref (not just baseBranch), getBranchStatus/getTaskDiff also fetch a custom compareRef branch when it differs from baseBranch, and checkMergedBranches fetches all distinct per-task base branches instead of only the project default."
	},
	{
		"date": "2026-06-05",
		"type": "fix",
		"slug": "cmd-switch-fullscreen-board",
		"title": "Cmd+1..9 project switching now respects the Task Open Mode setting",
		"body": "Cmd+1..9 project switching now respects the Task Open Mode setting. In Full screen mode it jumps straight to the Kanban board (the pre-#619 behavior) instead of an empty \"Select a task\" split; Split mode keeps preserving the task view as before."
	},
	{
		"date": "2026-06-03",
		"type": "feature",
		"slug": "cloudflare-tunnel-by-default",
		"title": "Made the Cloudflare quick tunnel the default for `dev3 remote` — the headless server now starts a public trycloudflar...",
		"body": "Made the Cloudflare quick tunnel the default for `dev3 remote` — the headless server now starts a public trycloudflare.com URL out of the box and includes it in the QR. Added `--no-tunnel` to opt out for local-only mode (LAN + SSH-forward only). `cloudflared` is now a Homebrew dependency of both the `dev3` formula (CLI) and the `dev3` cask (macOS GUI), so it's always present on brew installs; tarball/DMG users get a graceful warning if it's missing. Old `--tunnel` flag and `DEV3_REMOTE_TUNNEL` env var are replaced by `--no-tunnel` / `DEV3_REMOTE_NO_TUNNEL`. Also switched the cask update step to regenerate the full `Casks/dev3.rb` from the workflow (mirroring the formula step), so cask metadata lives in this repo instead of the tap."
	},
	{
		"date": "2026-06-03",
		"type": "feature",
		"slug": "cmd-switch-keep-task-view",
		"title": "Cmd/Ctrl+1..9 project switching now preserves your current view mode",
		"body": "Cmd/Ctrl+1..9 project switching now preserves your current view mode. If you're in a task view (sidebar + terminal), switching projects keeps the task view — the left sidebar shows the new project's active tasks and the terminal pane shows \"Select a task to see its terminal\" until you pick one. On the Kanban board it still switches to the board.\r\n\r\nSuggested by Alexander Kiselev."
	},
	{
		"date": "2026-06-03",
		"type": "feature",
		"slug": "compact-header-toolbar",
		"title": "Added a compact layout for narrow viewports (≤1600px, e.g",
		"body": "Added a compact layout for narrow viewports (≤1600px, e.g. 14\" MacBooks): the top header and the task toolbar now collapse button text labels to icon-only (tooltips preserved), and the header's external actions (Website, Report, Change Log) fold into a single \"More\" overflow menu so controls no longer overflow or overlap on small screens. The git action buttons (Show Diff, Rebase, Push, Create PR, PR + auto-merge, Merge) also become icon-only Nerd Font glyphs in compact mode. The redundant \"Open PR\" button was removed entirely — when a PR exists, the \"PR #N\" badge already links to it. Driven by a new useCompact() media-query hook."
	},
	{
		"date": "2026-06-03",
		"type": "feature",
		"slug": "create-pr-auto-merge",
		"title": "Added a \"Create PR + auto-merge\" button next to \"Create PR\" in the task git actions",
		"body": "Added a \"Create PR + auto-merge\" button next to \"Create PR\" in the task git actions. It does the same push + open PR flow via the task pane agent, but also asks the agent to enable auto-merge (gh pr merge --auto) so the PR lands automatically once checks pass."
	},
	{
		"date": "2026-06-03",
		"type": "fix",
		"slug": "focus-window-on-dock-quit",
		"title": "Focus the app window before showing the quit-confirmation dialog",
		"body": "Focus the app window before showing the quit-confirmation dialog. A dock right-click → Quit does not activate the app on macOS, so the confirmation box used to sit hidden behind other apps and the app looked frozen."
	},
	{
		"date": "2026-06-03",
		"type": "docs",
		"slug": "linux-remote-install",
		"title": "Rewrote the README Linux install section around remote work: two commands (Homebrew install with bash/zsh variants, t...",
		"body": "Rewrote the README Linux install section around remote work: two commands (Homebrew install with bash/zsh variants, then brew tap + install dev3) followed by `dev3 remote`."
	},
	{
		"date": "2026-06-03",
		"type": "feature",
		"slug": "multi-window-support",
		"title": "Added multi-window support",
		"body": "Added multi-window support. File → New Window (or Cmd+Shift+N) opens another dev-3.0 window so users on multi-monitor setups can park a different project on each screen. Closing windows no longer quits the app — like a standard macOS app it keeps running in the dock even with no windows open, and clicking the dock icon brings a window back. Push messages, menu actions and the WKWebView resize nudge now route through a new window-manager module that broadcasts to all windows and targets the focused one for menu actions.\r\n\r\nUnified the quit confirmation: a single `before-quit` gate now drives the existing React \"sessions keep running\" dialog for every quit path — Cmd+Q, the menu Quit item, and dock Quit — instead of only the renderer's Cmd+Q shortcut. The confirmation is React (works the same in the remote/browser client); the \"don't show again\" choice is persisted in global settings. Updater restarts bypass the gate so auto-update keeps working.\r\n\r\nFixed multi-window regressions: Cmd+Q now reliably starts the quit (the renderer catches it and forwards to the main process, since WKWebView swallows the native menu accelerator when a terminal is focused). Quitting while the app is window-less in the dock reopens a window and shows the confirmation dialog there (the reopened window pulls the pending state on mount, so the dialog reliably appears). Also fixed terminal sizing when the same task is open in two windows at once — the shared PTY now sizes to the smallest viewer (smallest-wins, larger windows letterbox) instead of flip-flopping geometry on every resize."
	},
	{
		"date": "2026-06-03",
		"type": "feature",
		"slug": "no-sleep-toggle",
		"title": "Added a prominent \"No Sleep\" toggle to the global header (amber Awake state, coffee glyph)",
		"body": "Added a prominent \"No Sleep\" toggle to the global header (amber Awake state, coffee glyph). It keeps your machine awake the whole time dev-3.0 is open — default on — so long-running agents and remote sessions never stall on a sleeping Mac. While remote access is active the toggle is forced on and locked.\r\n\r\nThis surfaces the previously buried preventSleepWhileRunning setting and changes its meaning from \"while agents are running\" to \"while the app is running\". Backed by new getPreventSleepState / setPreventSleep RPCs.",
		"suggestedBy": "aidanpraidw",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/384",
		"issueRef": "#384"
	},
	{
		"date": "2026-06-03",
		"type": "fix",
		"slug": "notification-zoom",
		"title": "Fixed watched-task notification click-to-open: it now respects the user's task-open-mode preference (split by default...",
		"body": "Fixed watched-task notification click-to-open: it now respects the user's task-open-mode preference (split by default instead of always forcing fullscreen zoom), and no longer fires on an unrelated in-app click. Click-to-open is only armed when the app was in the background when the notification was shown, tracked via a renderer-reported window foreground flag."
	},
	{
		"date": "2026-06-03",
		"type": "feature",
		"slug": "port-tunnels",
		"title": "Added per-port Cloudflare quick tunnels for dev servers",
		"body": "Added per-port Cloudflare quick tunnels for dev servers. Each detected dev-server port can now be exposed publicly with one click (TaskDevServer menu → Expose) or via `dev3 remote --expose-ports=3000,5173` for headless boxes. Two modes: quick (one tunnel per port, own `*.trycloudflare.com`) and shared (one tunnel groups multiple ports under `/p/<token>/<port>/...` so frontend+backend can talk via relative URLs without CORS). Tunnels auto-stop after 2 consecutive port-scan misses (~20s) and on task removal / app shutdown — state is runtime-only. New `Exposed ports` section in the Remote Access modal lists everything live; the headless banner reprints URLs on every change."
	},
	{
		"date": "2026-06-03",
		"type": "refactor",
		"slug": "remove-native-confirm-dialogs",
		"title": "Replaced native dialogs for remote/browser mode",
		"body": "Replaced native dialogs for remote/browser mode. (1) Confirm: swapped the native `Utils.showMessageBox` `showConfirm` RPC (with its `window.confirm` browser fallback) for an in-app promise-based React `confirm()` service; migrated all 10 call sites and removed the RPC. (2) Toast: replaced ~40 blocking `window.alert()` error popups and the old `ErrorToast` with a new imperative `toast.error/success/info/warning` service rendered by a single `ToastHost` (larger styling, variant colors, 30s auto-dismiss with a progress bar). (3) Menu dialogs: replaced the native `Utils.showMessageBox` boxes triggered from the macOS menu bar - \"About\" now opens an in-app React `AboutModal`, and the manual \"Check for Updates\" flow downloads silently (reusing the header \"Update ready\" plaque) and reports \"up to date\"/errors via toast, with no native confirm boxes. `Utils.showMessageBox` is no longer called anywhere. Documented a project-wide ban on native dialogs in AGENTS.md."
	},
	{
		"date": "2026-06-03",
		"type": "feature",
		"slug": "sidebar-hide-button",
		"title": "Added a hide button to the Active Tasks sidebar header that collapses the split view into the full-page task terminal...",
		"body": "Added a hide button to the Active Tasks sidebar header that collapses the split view into the full-page task terminal, mirroring the existing fullscreen/\"Zoom\" toggle in the task info panel. Previously the sidebar could only be hidden from the top-right toggle."
	},
	{
		"date": "2026-05-31",
		"type": "fix",
		"slug": "codex-profile-v2-launch-flag",
		"title": "Fix Codex 0.131+ launch failing with \"config profile `dev3-dark` not found\"",
		"body": "Fix Codex 0.131+ launch failing with \"config profile `dev3-dark` not found\". dev-3.0 writes per-profile settings to `~/.codex/<name>.config.toml`, which Codex only loads via `--profile-v2 <name>` — but the launch command still passed the legacy `-p`/`--profile` flag. On profile-v2 Codex the flag is now rewritten to `--profile-v2`; older Codex keeps `-p`."
	},
	{
		"date": "2026-05-29",
		"type": "feature",
		"slug": "auto-diff-view-mode",
		"title": "Add an \"Auto\" option (now the default) to the diff layout setting",
		"body": "Add an \"Auto\" option (now the default) to the diff layout setting. Auto picks Unified on laptop-sized screens (`window.screen.availWidth < 1800` CSS px) and Side by side on bigger monitors, so the inline diff opens with a layout that actually fits the display. The user can still pin Split or Unified explicitly in Global Settings."
	},
	{
		"date": "2026-05-29",
		"type": "fix",
		"slug": "bug-hunter-diff-scope",
		"title": "Fix the bug-hunter diff scope so it only looks at this branch's own changes",
		"body": "Fix the bug-hunter diff scope so it only looks at this branch's own changes. The hunter prompt now pins the fork point via `git merge-base <ref> HEAD` and diffs against that, instead of relying on a bare three-dot compare; it also honors the project's configured compareRef (and `local` mode) instead of always assuming `origin/<base>`. Prevents un-rebased branches from pulling unrelated files changed only on origin into the hunt."
	},
	{
		"date": "2026-05-29",
		"type": "feature",
		"slug": "claude-opus-4-8-presets",
		"title": "Added Claude Opus 4.8 presets (model: `claude-opus-4-8[1m]`) for every existing variant — Default, Plan, Bypass, Auto...",
		"body": "Added Claude Opus 4.8 presets (model: `claude-opus-4-8[1m]`) for every existing variant — Default, Plan, Bypass, Auto, Accept Edits, Don't Ask — and made them the new defaults. The previous Opus 4.7 presets are kept as a \"Opus 4.7\" group at the bottom of the Claude preset list (new IDs `claude-*-opus47`) so users can still pin the older model. The preset `version` field is bumped so stored configs are reset to the new Opus 4.8 model automatically. The `--model` argument is now quoted when the value contains shell metacharacters (e.g. the square brackets in `claude-opus-4-8[1m]`), so zsh does not try to glob-expand it on launch. Also fixed scratch-task launches that were sending the `Scratch — HH:mm` placeholder to the agent as a prompt: `activateTask` now blanks the placeholder description for scratch tasks (previously only reopened tasks were blanked), and `addAttempts` now propagates the `scratch` flag onto added attempts (it was dropped, so every attempt past the first kept the placeholder prompt)."
	},
	{
		"date": "2026-05-29",
		"type": "feature",
		"slug": "create-pr-asks-agent",
		"title": "The \"Create PR\" button now sends a short instruction to the AI agent in the task's currently focused tmux pane, askin...",
		"body": "The \"Create PR\" button now sends a short instruction to the AI agent in the task's currently focused tmux pane, asking it to run `git push` and then `gh pr create`, instead of opening a separate git-op pane and browser. The button shows a robot icon and the label is always \"Create PR\" (the old \"Push & Create PR\" variant, its push-then-create flow, and the unused \"Push & Create PR\" menu item were removed). If no pane is focused, the action is a silent no-op."
	},
	{
		"date": "2026-05-29",
		"type": "fix",
		"slug": "dev-server-restart-sequence",
		"title": "Fixed the dev server Restart button: it now fully stops the running server, waits ~1s for ports and the inner tmux se...",
		"body": "Fixed the dev server Restart button: it now fully stops the running server, waits ~1s for ports and the inner tmux session to release, then starts fresh — instead of starting immediately and racing the dying process."
	},
	{
		"date": "2026-05-29",
		"type": "fix",
		"slug": "diff-only-tests-empty-state",
		"title": "Diff viewer no longer shows the misleading \"No changes to show\" empty state when every changed file is a test file an...",
		"body": "Diff viewer no longer shows the misleading \"No changes to show\" empty state when every changed file is a test file and \"Include tests\" is off. Instead it renders a dedicated card explaining that N test files are hidden, with a button that re-enables the filter in one click."
	},
	{
		"date": "2026-05-29",
		"type": "fix",
		"slug": "diff-shown-count-badge-inverted",
		"title": "Fixed the diff toolbar \"Showing N of M changed files\" badge that could render with N > M when \"Include tests\" was off...",
		"body": "Fixed the diff toolbar \"Showing N of M changed files\" badge that could render with N > M when \"Include tests\" was off and the diff contained binary or oversized files. The badge now uses the full payload summary as the total and counts both rendered and skipped files as visible."
	},
	{
		"date": "2026-05-29",
		"type": "fix",
		"slug": "disable-terminal-previews-during-dnd",
		"title": "Terminal preview popovers in the active tasks sidebar and on task cards no longer pop up while a drag-and-drop is in ...",
		"body": "Terminal preview popovers in the active tasks sidebar and on task cards no longer pop up while a drag-and-drop is in progress. A global dragstart listener now closes any open preview and blocks new ones until dragend/drop fires, so previews stop fighting the user's drag."
	},
	{
		"date": "2026-05-29",
		"type": "fix",
		"slug": "mark-all-unread-hidden-tests",
		"title": "Fixed \"Mark all read/unread\" in the diff viewer to update read state for hidden test files too",
		"body": "Fixed \"Mark all read/unread\" in the diff viewer to update read state for hidden test files too. Previously the bulk action iterated only over visible files, so toggling \"Include tests\" back on revealed previously read test files still marked as read. Now read state in both in-memory and localStorage covers the full payload, while expand/collapse stays scoped to visible files."
	},
	{
		"date": "2026-05-29",
		"type": "docs",
		"slug": "readme-polish",
		"title": "Polish README: bump tech stack row to React 19, clarify that `bun run dev` builds + launches (no HMR), broaden Electr...",
		"body": "Polish README: bump tech stack row to React 19, clarify that `bun run dev` builds + launches (no HMR), broaden Electrobun description to mention both WKWebView on macOS and WebKitGTK on Linux, and point at `bun run test:full` for CI-parity test runs."
	},
	{
		"date": "2026-05-29",
		"type": "chore",
		"slug": "reorder-claude-presets-auto-default",
		"title": "Reordered the Claude Opus 4.8 presets so Auto comes first, then Bypass, then Default (Plan/Accept Edits/Don't Ask fol...",
		"body": "Reordered the Claude Opus 4.8 presets so Auto comes first, then Bypass, then Default (Plan/Accept Edits/Don't Ask follow, Opus 4.7 group stays at the bottom), and made the Auto (Opus 4.8) preset the default selection for fresh installs."
	},
	{
		"date": "2026-05-29",
		"type": "fix",
		"slug": "skill-session-start-checklist",
		"title": "Strengthened the dev3 agent skill prompt so the session-start chores (branch rename, title, overview, labels) are no ...",
		"body": "Strengthened the dev3 agent skill prompt so the session-start chores (branch rename, title, overview, labels) are no longer silently dropped when the user hands the agent a concrete task immediately. Added a front-loaded \"Session-start checklist\" anchored to an event (\"before you end your first turn\") instead of the easily-skipped \"at session start\", coupled title-setting to the initial-overview moment, and reworded the overview \"keep current\" rule to trigger on material state changes rather than a per-message count."
	},
	{
		"date": "2026-05-29",
		"type": "feature",
		"slug": "stuck-prep-fda-popover",
		"title": "When a macOS task hangs on `fetching-origin` for longer than 60 seconds, a small non-blocking popover now appears nex...",
		"body": "When a macOS task hangs on `fetching-origin` for longer than 60 seconds, a small non-blocking popover now appears next to the stuck card explaining the most likely cause — Full Disk Access being silently revoked for git/tmux child processes — and offering a one-click deep-link to the macOS System Settings → Full Disk Access pane. Cancel keeps the existing cancel-preparation behaviour. Threshold can be overridden via the `DEV3_STUCK_PREP_THRESHOLD_SEC` environment variable. The previous centred blocking modal has been replaced."
	},
	{
		"date": "2026-05-29",
		"type": "fix",
		"slug": "task-sound-views-range",
		"title": "Fixed task completion/cancellation sounds silently failing in packaged builds",
		"body": "Fixed task completion/cancellation sounds silently failing in packaged builds. The MP3s were served via the Electrobun `views://` scheme, which does not honor the Range request WKWebView's media loader issues, so playback failed with `NotSupportedError`. They are now inlined as base64 `data:` URLs (`?inline`), bypassing the scheme handler entirely."
	},
	{
		"date": "2026-05-29",
		"type": "fix",
		"slug": "title-edited-by-user-flag",
		"title": "Fixed task titles freezing on whatever the first agent named them: the \"user-edited — do NOT rename\" lock used to fir...",
		"body": "Fixed task titles freezing on whatever the first agent named them: the \"user-edited — do NOT rename\" lock used to fire on any non-null `customTitle`, including agent renames through `dev3 task update --title`. A new `titleEditedByUser` flag is set only by the UI rename path, so follow-up agents can still refine agent-set titles while real user-typed titles stay protected."
	},
	{
		"date": "2026-05-29",
		"type": "fix",
		"slug": "tmux-env-leak-and-pane-default",
		"title": "Fixed `DEV3_TASK_ID` (and other per-task env vars) leaking between sibling tasks",
		"body": "Fixed `DEV3_TASK_ID` (and other per-task env vars) leaking between sibling tasks. The tmux server inherits its global env from whichever client starts it first, so new sessions/panes saw the first task's id — causing docker containers built from `$DEV3_TASK_ID` to mount against the wrong worktree. Per-task env is now passed atomically via `-e KEY=VAL` to every dev3-issued tmux entrypoint (`new-session`, `split-window`, `new-session -d`), with the existing post-spawn `set-environment` kept as a fallback for the `-A` attach path.\r\n\r\nAlso tightened the agent skill: `split-window` is now the explicit default for background processes (celery, docker exec, log tail, watchers, dev servers). `new-window` is reserved for explicit user requests like \"open a tab\" — agents were creating hidden tabs for celery workers that users had to click to find."
	},
	{
		"date": "2026-05-29",
		"type": "refactor",
		"slug": "tmux-layout-dropdown",
		"title": "Reworked the tmux pane controls toolbar: collapsed the five always-visible layout preset buttons into a single \"tmux ...",
		"body": "Reworked the tmux pane controls toolbar: collapsed the five always-visible layout preset buttons into a single \"tmux layout\" split-button (one-click cycle + a dropdown menu listing each preset with its icon, label and keyboard shortcut, highlighting the last applied one). The dropdown opens on hover, reuses the original cycle-layouts icon, and includes a \"Cycle layouts\" entry alongside the presets. Kept split/zoom/info/close inline, added aria-labels on every control and a divider before the destructive close-pane button. Also shortened the spawn-agent button label to a leading \"+\" to save toolbar space, gave the spawn-agent and Create PR buttons the robot_love_outline glyph, and compacted the diff include-tests toggle to a \"with\"/\"without\" word plus a single test-tube glyph (state read from the word, consistent across the info panel and diff toolbar), reusing a crossed-out test-tube glyph only on the summary badge to mark hidden tests. Added a vertical divider before the tmux controls to separate them from the non-tmux toolbar actions, capitalised the spawn-agent label to \"+ Agent\", and made the Russian tests toggle read \"с тестами\"/\"без тестов\"."
	},
	{
		"date": "2026-05-29",
		"type": "docs",
		"slug": "ux-architecture-manifest",
		"title": "Created the initial Product UX Bible under docs/ux/ — a repository-derived UX architecture manifest covering the obje...",
		"body": "Created the initial Product UX Bible under docs/ux/ — a repository-derived UX architecture manifest covering the object model, screen-based navigation, surface model, action taxonomy, design-token policy, complexity budgets, placement rules, and known anti-patterns. Includes human-readable bible, machine-readable ux-architecture.yaml, decisions, audit report, and glossary. Also wired AGENTS.md to point at the manifest and mandate the /ux-principal skill before any UI/UX work.\r\n\r\nThen defined and applied a 2×2 quickbar model for the TaskInfoPanel inspector: two rows split left|right into four domain bars (Context, Session/Agent, Git, Runtime), one action domain per bar, with panel chrome pinned separately. Moved dev-server, scripts, and open-in out of the overloaded row-1-right cluster into the previously unused row-2-right (Runtime & access bar) beside Git, balancing it at three controls, and truncated the Context label strip to 4 inline chips plus a +k overflow chip. Tightened the inspector header spacing: grouped the Runtime cluster with a wider gap and gave the collapsed two-row layout vertical breathing room."
	},
	{
		"date": "2026-05-27",
		"type": "feature",
		"slug": "bug-hunters-lightbox",
		"title": "Added a \"Find bugs\" lightbox triggered from the task header",
		"body": "Added a \"Find bugs\" lightbox triggered from the task header. Pick how many hunters (1–6, default 3), agent, and config, and dev-3.0 splits the right half of the task session vertically into that many equal-sized panes — each launches the chosen agent and auto-types `/dev3-bug-hunter` so the read-only seeded bug hunt starts immediately. Vertical splits use computed `-l N%` per step so the right column self-balances without calling `select-layout` (which would collapse the main left pane). The auto-typed prompt locks each hunter's scope to files changed in the current branch (`git diff --name-only <base>...HEAD`) so they don't roam the whole codebase. The prompt and the Enter keypress are sent in two separate `send-keys` calls with an 800 ms gap so Claude's bracketed-paste detector treats Enter as a discrete submit. Each pane is tracked in `sessionState.panes` so recovery and exit reconciliation keep working.",
		"suggestedBy": "ittaiz",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/540",
		"issueRef": "#540"
	},
	{
		"date": "2026-05-27",
		"type": "fix",
		"slug": "codex-profile-v2",
		"title": "Fix Codex 0.131+ rejecting `--profile dev3-light` due to legacy `[profiles.dev3*]` blocks in `~/.codex/config.toml`",
		"body": "Fix Codex 0.131+ rejecting `--profile dev3-light` due to legacy `[profiles.dev3*]` blocks in `~/.codex/config.toml`. On new Codex versions, dev-3.0 now writes per-profile settings into `~/.codex/dev3.config.toml`, `dev3-light.config.toml`, and `dev3-dark.config.toml`, removes the legacy blocks and any managed top-level `profile = \"dev3*\"` selector from the main config, while older Codex versions keep the original in-main-config form."
	},
	{
		"date": "2026-05-27",
		"type": "feature",
		"slug": "diff-exclude-tests-toggle",
		"title": "Added an \"Include tests\" toggle to both the diff viewer toolbar and the task info-panel top bar",
		"body": "Added an \"Include tests\" toggle to both the diff viewer toolbar and the task info-panel top bar. When unchecked, test files are hidden from the changed-files list and the +/− line counts are recomputed accordingly. Test detection covers a wide range of languages and frameworks: JS/TS (.test/.spec/.e2e/.cy/.bench/.stories), Python (test_*/_test/conftest/tests.py), Go, Rust, Ruby, Java/Kotlin/Scala/Groovy/C#/PHP/Swift (PascalCase Test/Tests/Spec/IT/Fact suffix), Elixir, Dart, and __tests__/__mocks__/__snapshots__/cypress/playwright/testdata/fixtures directories. The preference is persisted in localStorage and shared between both UIs."
	},
	{
		"date": "2026-05-27",
		"type": "fix",
		"slug": "spawn-variants-preserve-custom-title",
		"title": "Preserve the user-edited customTitle when the source task is replaced by spawnVariants (Save and Run) and when addAtt...",
		"body": "Preserve the user-edited customTitle when the source task is replaced by spawnVariants (Save and Run) and when addAttempts creates new attempts. Previously the new tasks were created from `description` only, silently dropping the title the user had typed in the Create-Task modal.",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/583",
		"issueRef": "#583"
	},
	{
		"date": "2026-05-25",
		"type": "fix",
		"slug": "codex-config-version-syntax",
		"title": "Made dev3 detect the installed Codex CLI version before patching `~/.codex/config.toml`, using `hooks`/`:workspace_ro...",
		"body": "Made dev3 detect the installed Codex CLI version before patching `~/.codex/config.toml`, using `hooks`/`:workspace_roots` for newer Codex and `codex_hooks`/`:project_roots` for older versions. Existing managed keys are migrated in either direction, including duplicate hook feature aliases, so switching Codex versions does not leave stale warning-producing config behind."
	},
	{
		"date": "2026-05-25",
		"type": "docs",
		"slug": "tmux-pane-placement-guidance",
		"title": "Clarified the tmux guidance in the dev3 agent skills: spelled out that \"open a pane\" means splitting the agent's curr...",
		"body": "Clarified the tmux guidance in the dev3 agent skills: spelled out that \"open a pane\" means splitting the agent's current dev3 tmux pane, and added a short placement hint (check `list-panes` first, default to the right of the agent, fall back to below or a new window). Applied to both the short `/dev3` summary and the full `/dev3-tmux` reference."
	},
	{
		"date": "2026-05-24",
		"type": "fix",
		"slug": "merge-complete-popup",
		"title": "Fixed the merge-complete popup inside the full task view so confirming it immediately moves the task to completed whi...",
		"body": "Fixed the merge-complete popup inside the full task view so confirming it immediately moves the task to completed while cleanup runs in the background, matching the existing manual complete flow."
	},
	{
		"date": "2026-05-24",
		"type": "fix",
		"slug": "tmux-close-pane-confirm",
		"title": "The red \"Close pane\" button in the task tmux controls now only prompts for confirmation when you are about to close t...",
		"body": "The red \"Close pane\" button in the task tmux controls now only prompts for confirmation when you are about to close the *last* remaining pane — closing intermediate panes still happens instantly. On confirm, the kill is forced through so the user can actually take down the session if that is what they want. Reuses the existing `showConfirm` modal and last-pane refusal added in #573."
	},
	{
		"date": "2026-05-22",
		"type": "fix",
		"slug": "claude-prompt-arg-escape",
		"title": "Fixed agent CLIs (claude, codex, gemini, cursor) crashing with `error: unknown option '---…'` when a task description...",
		"body": "Fixed agent CLIs (claude, codex, gemini, cursor) crashing with `error: unknown option '---…'` when a task description starts with `---` (markdown frontmatter or horizontal rule). We now emit `--` before the positional prompt so the agent's argument parser stops scanning for options.",
		"suggestedBy": "Capibara-",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/570",
		"issueRef": "#570"
	},
	{
		"date": "2026-05-22",
		"type": "fix",
		"slug": "gh-old-version-auth-detection",
		"title": "Fix GitHub CLI auth detection on older `gh` versions (e.g",
		"body": "Fix GitHub CLI auth detection on older `gh` versions (e.g. v2.45.0) where `gh auth status --json hosts` exits with `unknown flag: --json`. The app now falls back to parsing the plain `gh auth status` text output, so authenticated users no longer see a false \"GitHub CLI is not signed in\" banner.",
		"suggestedBy": "eyalizhaki",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/569",
		"issueRef": "#569"
	},
	{
		"date": "2026-05-22",
		"type": "fix",
		"slug": "preserve-user-edited-task-title",
		"title": "Fix task titles being overwritten by the agent on session start when the user had manually renamed them via the UI",
		"body": "Fix task titles being overwritten by the agent on session start when the user had manually renamed them via the UI. The agent skill now sees a `(user-edited)` marker in `dev3 current` and is told to never rename; as a backstop, the CLI's `dev3 task update --title` silently refuses to overwrite a non-empty `customTitle` unless `--force` is passed.",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/564",
		"issueRef": "#564"
	},
	{
		"date": "2026-05-22",
		"type": "fix",
		"slug": "prevent-last-pane-close",
		"title": "Refuse to kill the last remaining tmux pane in a task session",
		"body": "Refuse to kill the last remaining tmux pane in a task session. Repeated clicks on the red kill-pane button no longer take down the agent's own pane — once a single pane is left, the action becomes a no-op."
	},
	{
		"date": "2026-05-22",
		"type": "fix",
		"slug": "revive-completed-task",
		"title": "Fix reviving a task from completed/cancelled back to in-progress",
		"body": "Fix reviving a task from completed/cancelled back to in-progress. After PR #571 the cleanup script was silently skipped on every task-to-done move (Bun.file(dir).exists() always returns false for directories), and removeWorktree would abort before deleting the branch if the worktree directory was missing — both leaving stale branches/worktree dirs behind so the next reactivation failed with \"branch already exists\" or \"directory already exists\". Restored existsSync for the directory check, made removeWorktree tolerate a missing worktree dir, and added self-healing in createWorktree so reactivation can reclaim stale leftovers automatically."
	},
	{
		"date": "2026-05-22",
		"type": "fix",
		"slug": "unblock-task-lifecycle-sync-spawns",
		"title": "Unblocked the task lifecycle hot path by removing every sync spawn from PTY create/destroy: `destroySession` kills th...",
		"body": "Unblocked the task lifecycle hot path by removing every sync spawn from PTY create/destroy: `destroySession` kills the tmux session via async spawn, `configureTmux`/`setupTiledLayout`/`applyTmuxTheme`/`capturePane`/`tmuxSessionExists`/`splitAndRunCommand`/`listPaneIds` are now async, the `which tmux` diagnostic is fire-and-forget, the `existsSync(cwd)` pre-flight is dropped, and `runCleanupScript` uses `Bun.file().exists()`. `getUserShell` caches the resolved shell for 1h instead of running `dscl` on every task launch. Added a `loop-monitor` heartbeat that logs whenever the Bun event loop is blocked for >500ms, plus step-by-step debug logs around `Bun.spawn` and the first PTY output so future freezes are diagnosable from the log."
	},
	{
		"date": "2026-05-21",
		"type": "feature",
		"slug": "package-scripts-runner",
		"title": "Added an icon-only Scripts button (ƒ function glyph) in the task header — placed between Kill tmux and Dev Server — t...",
		"body": "Added an icon-only Scripts button (ƒ function glyph) in the task header — placed between Kill tmux and Dev Server — that opens a dropdown listing all package.json scripts in the worktree. Click a script and a 5-button placement picker replaces the list — pick left, top, right, bottom or new tab and the script opens in a fresh tmux pane (or window) while the dropdown closes. The picker pre-selects the placement last used for that script (so a second launch is just Enter) and supports keyboard navigation (←/→ to choose, Enter to launch). The runner (bun/pnpm/yarn/npm) is auto-detected from lockfiles and a multi-lockfile warning is shown when ambiguous. Scripts are sorted by most recently launched first so the workflow-relevant ones float to the top. A fuzzy search input is focused on open so users can just type to narrow down the list; arrow keys move between matches and Enter opens the placement picker for the highlighted script. The header was also trimmed elsewhere: the \"Files\" button now shows only its folder icon to save horizontal space. Native menu adds Task → Run Script… (⌘R). Each launch is fire-and-forget — running the same script twice opens two panes, which the user can close in tmux when done."
	},
	{
		"date": "2026-05-18",
		"type": "fix",
		"slug": "claude-mcp-auto-approve",
		"title": "Auto-approve project-scoped MCP servers (`.mcp.json`) in dev-3.0 managed Claude Code worktrees so users no longer fac...",
		"body": "Auto-approve project-scoped MCP servers (`.mcp.json`) in dev-3.0 managed Claude Code worktrees so users no longer face the \"N new MCP servers found\" prompt on every launch. Mirrors the existing trust-dialog bypass: when ensuring Claude trust for a worktree we now also seed `<worktree>/.claude/settings.local.json` with `enableAllProjectMcpServers: true`, merging any explicit approvals/rejections already present in the project's `.claude/settings*.json`."
	},
	{
		"date": "2026-05-18",
		"type": "fix",
		"slug": "diff-panel-file-order",
		"title": "Fix file ordering mismatch between the diff file tree (left panel) and the diff section list (right panel)",
		"body": "Fix file ordering mismatch between the diff file tree (left panel) and the diff section list (right panel). Untracked files were appended at the end of the right-panel list by the backend, while the tree showed them in their alphabetical position. Both panels now use the same alphabetical full-path order."
	},
	{
		"date": "2026-05-18",
		"type": "docs",
		"slug": "full-disk-access-readme",
		"title": "Expanded the macOS Full Disk Access troubleshooting section in README with the real symptom (git remote operations — ...",
		"body": "Expanded the macOS Full Disk Access troubleshooting section in README with the real symptom (git remote operations — fetch/pull/push/clone — hang indefinitely while local-only commands keep working) and a screenshot of the System Settings panel. Added a matching in-app stuck-preparation modal: when a task spends more than 3 minutes on the `Fetching origin` stage, dev-3.0 now pops a centered dialog with two action buttons — open the README troubleshooting anchor and, on macOS, deep-link to the Full Disk Access System Settings pane. New optional `Task.preparingStartedAt`, new RPC `openSystemSettings`, threshold exported as `STUCK_PREPARATION_FETCH_THRESHOLD_MS`. Decision: decisions/2026/05/18/stuck-preparation-popup.md."
	},
	{
		"date": "2026-05-16",
		"type": "feature",
		"slug": "exit-copy-mode-on-task-nav",
		"title": "Auto-exit tmux copy-mode in every pane of a task's session whenever the terminal becomes the visible view — entering ...",
		"body": "Auto-exit tmux copy-mode in every pane of a task's session whenever the terminal becomes the visible view — entering a task from the dashboard, switching between tasks, or returning from the inline diff. Prevents the silent \"copy-mode at scroll position 0\" state where a pane looks live but swallows keystrokes."
	},
	{
		"date": "2026-05-16",
		"type": "refactor",
		"slug": "global-menu-redesign",
		"title": "Redesigned the native macOS menu bar from 5 to 9 top-level menus (App, File, Edit, Task, Project, View, Terminal, Win...",
		"body": "Redesigned the native macOS menu bar from 5 to 9 top-level menus (App, File, Edit, Task, Project, View, Terminal, Window, Help), exposing ~70 features that were previously hidden inside the renderer. Tmux pane / window / session / layout operations now have a discoverability surface and the mark+swap pattern is part of the roadmap. Items that still need backend wiring ship as disabled (visible but greyed out) so users see what is coming without misfiring no-op clicks.\r\n\r\nAdds the Tmux Cheat Sheet — a localised modal (en / ru / es) reachable from Terminal > Show Tmux Cheat Sheet and Help > Tmux Cheat Sheet, organised by panes / layout / windows / sessions / copy mode / misc.\r\n\r\nNative menu items now toggle their enabled state based on the current view: Task items grey out when no task is open, Project items grey out when no project is selected, and tmux pane / layout operations grey out when no terminal is visible. The renderer pushes the live `MenuContext` to the bun side on every route change."
	},
	{
		"date": "2026-05-16",
		"type": "fix",
		"slug": "merged-popup-navigate-back-to-kanban",
		"title": "Fix the \"Branch merged → mark as completed?\" popup so it navigates the user back to the Kanban view when they confirm...",
		"body": "Fix the \"Branch merged → mark as completed?\" popup so it navigates the user back to the Kanban view when they confirm from inside the full task screen. Previously the worktree was destroyed while the task screen was still mounted, causing the TaskTerminal to flip to its \"session ended / restart session\" error state."
	},
	{
		"date": "2026-05-16",
		"type": "fix",
		"slug": "recover-terminal-edge-padding",
		"title": "Recover terminal edges that were reserved by stale workarounds",
		"body": "Recover terminal edges that were reserved by stale workarounds. Drop the global `pb-7` (and matching startup window-resize nudge) — both were 1.14.4-era WKWebView clipping compensations that Electrobun 1.18.1 no longer needs. Also patch ghostty-web's FitAddon to remove its 15px native-scrollbar reservation, since ghostty already overlays its own scrollbar on the canvas. Net: ~1 row of vertical space and ~2 columns of horizontal space restored across all terminal views."
	},
	{
		"date": "2026-05-16",
		"type": "refactor",
		"slug": "shorter-overview-prompt",
		"title": "Tightened the Overview section in the dev3 agent skill to discourage long-form overviews",
		"body": "Tightened the Overview section in the dev3 agent skill to discourage long-form overviews. Replaced \"one paragraph / ~400 chars\" with a sticky-note framing, a 1–2 sentence / ~150 char target, and a good/bad example. Hard cap stays at 500 chars (enforced by CLI)."
	},
	{
		"date": "2026-05-16",
		"type": "chore",
		"slug": "trim-tips-low-value",
		"title": "Trimmed the \"Did you know?\" tips registry from 115 to 91 entries by removing 24 low-value tips: duplicates of overvie...",
		"body": "Trimmed the \"Did you know?\" tips registry from 115 to 91 entries by removing 24 low-value tips: duplicates of overview/PR/menu features, self-evident UI behaviors (ESC closes dialogs, drag reorders), and trivial micro-features (binary files in diff, column \"Show more\", task complete sound). Kept zoom-support and other genuinely hidden features."
	},
	{
		"date": "2026-05-16",
		"type": "feature",
		"slug": "watched-notification-click-opens-task",
		"title": "Clicking a watched-task notification now jumps straight into that task",
		"body": "Clicking a watched-task notification now jumps straight into that task. When a watched task changes status and you click the system notification, dev-3.0 comes to the front and opens the task — no more hunting for it on the board.\r\n\r\nImplementation uses a window-focus heuristic instead of a notification click callback (which Electrobun does not expose). See decision 049 for the trade-offs."
	},
	{
		"date": "2026-05-15",
		"type": "chore",
		"slug": "bump-react-19",
		"title": "Bumped React 18.3.1 → 19.2.6 (react, react-dom, @types/react, @types/react-dom)",
		"body": "Bumped React 18.3.1 → 19.2.6 (react, react-dom, @types/react, @types/react-dom). Fixed three TypeScript errors caused by stricter @types/react@19: useRef<T>() now requires an initial value (two call sites) and the global `JSX` namespace was replaced with `ReactElement` (one call site in TaskDiffViewer). Lint clean, full test suite green (1130 mainview + 1105 bun)."
	},
	{
		"date": "2026-05-15",
		"type": "chore",
		"slug": "bump-top-level-deps",
		"title": "Bumped electrobun 1.14.4 → 1.18.1 and applied minor/patch updates across top-level deps (@lobehub/icons, js-toml, hap...",
		"body": "Bumped electrobun 1.14.4 → 1.18.1 and applied minor/patch updates across top-level deps (@lobehub/icons, js-toml, happy-dom, vitest, concurrently, autoprefixer, postcss). Lint and tests pass clean."
	},
	{
		"date": "2026-05-15",
		"type": "chore",
		"slug": "bump-typescript-6",
		"title": "Bumped TypeScript 5.9.3 → 6.0.3",
		"body": "Bumped TypeScript 5.9.3 → 6.0.3. No source code changes required — `bun run lint` clean, full test suite green."
	},
	{
		"date": "2026-05-15",
		"type": "feature",
		"slug": "collapsible-review-files-panel",
		"title": "Added a collapse toggle to the inline diff review's files panel — on small screens the files sidebar was leaving very...",
		"body": "Added a collapse toggle to the inline diff review's files panel — on small screens the files sidebar was leaving very little room for the diff (especially in side-by-side mode), and the column couldn't be made smaller. A full-width \"« Collapse files panel\" button now sits at the top of the sidebar; collapsing replaces the panel with a thin vertical strip that brings it back. The collapsed/expanded preference is persisted across sessions in localStorage."
	},
	{
		"date": "2026-05-15",
		"type": "feature",
		"slug": "compact-empty-kanban-columns",
		"title": "Empty Kanban columns shrink to a slim fixed strip (~35% of the standard width) on narrow viewports (<1400px), with th...",
		"body": "Empty Kanban columns shrink to a slim fixed strip (~35% of the standard width) on narrow viewports (<1400px), with the title truncated to fit. Hover dwell of 300ms expands the column back to full width; drag-and-drop never triggers the expansion so the board stays stable during a drag. Todo stays full width because of the always-visible \"+ New Task\" button."
	},
	{
		"date": "2026-05-15",
		"type": "fix",
		"slug": "diff-search-toggle-button-size",
		"title": "Make the diff toolbar search-toggle button match the size of the other mode buttons (Branch / Uncommitted / Unpushed ...",
		"body": "Make the diff toolbar search-toggle button match the size of the other mode buttons (Branch / Uncommitted / Unpushed / Unified / Split). It now uses the same compact padding and text size, so it no longer towers over its neighbors. The expanded search input panel itself is unchanged."
	},
	{
		"date": "2026-05-15",
		"type": "feature",
		"slug": "git-pull-error-modal",
		"title": "Replaced the plain `alert()` shown when the Kanban Git Pull button fails with a proper modal — same surface style as ...",
		"body": "Replaced the plain `alert()` shown when the Kanban Git Pull button fails with a proper modal — same surface style as the Create Task dialog — that displays the full scrollable error text and offers Retry and Close buttons. The button's existing success/error flash animation is unchanged; the modal opens on top of it. The button also now resets its flash and error state when the user switches to another project, so a green/red flash no longer leaks across projects."
	},
	{
		"date": "2026-05-15",
		"type": "fix",
		"slug": "task-card-config-label-parens",
		"title": "Removed outer parentheses around the config label on task cards",
		"body": "Removed outer parentheses around the config label on task cards. The config name already includes its own parentheses (e.g. \"Bypass (Opus 4.7)\"), so wrapping it produced an awkward \"(Bypass (Opus 4.7))\" with an unbalanced look."
	},
	{
		"date": "2026-05-14",
		"type": "fix",
		"slug": "diff-default-uncommitted-and-copy-clears-unsaved",
		"title": "The diff viewer now opens in Uncommitted mode by default (and remembers the last mode you picked via Branch / Uncommi...",
		"body": "The diff viewer now opens in Uncommitted mode by default (and remembers the last mode you picked via Branch / Uncommitted / Unpushed buttons), which fits the common \"review-before-commit\" workflow better than the previous Branch default. Clicking Copy to Clipboard on an inline review now clears the \"unsaved review\" state, so leaving the diff viewer right after copying no longer triggers the discard prompt. The prompt re-arms if you keep adding comments after the copy."
	},
	{
		"date": "2026-05-13",
		"type": "feature",
		"slug": "confirm-discard-review",
		"title": "Confirm before discarding unsaved review notes in the diff viewer",
		"body": "Confirm before discarding unsaved review notes in the diff viewer. When inline review comments exist, exiting via Esc or \"Back to Terminal\" shows a confirmation dialog. App-level navigation (breadcrumbs, sidebar links, project switcher) also goes through the standard unsaved-changes prompt; choosing Save copies the review XML to the clipboard so the in-progress review can be pasted into the agent chat after the navigation completes.\r\n\r\nSuggested by user feedback (h0x91b/dev-3.0#544)"
	},
	{
		"date": "2026-05-13",
		"type": "docs",
		"slug": "skill-tmux-guidance",
		"title": "Taught dev3 agents to use the surrounding `tmux -L dev3` session proactively",
		"body": "Taught dev3 agents to use the surrounding `tmux -L dev3` session proactively. The main `/dev3` skill now carries a short summary — discovery commands, when to open a pane, and the most common pitfalls — and points to a new dedicated `/dev3-tmux` skill for the full command reference (split / new-window / send-keys / rename / swap / move / resize / capture / kill, plus pitfalls). The new skill is installed for Claude, Codex, Cursor, OpenCode, Gemini, and the generic `.agents/` directory, with matching OpenAI metadata."
	},
	{
		"date": "2026-05-12",
		"type": "fix",
		"slug": "sidebar-project-badge-visibility",
		"title": "Made the project name badge in the Active Tasks sidebar much more visible in global scope",
		"body": "Made the project name badge in the Active Tasks sidebar much more visible in global scope. The badge is now larger, uses the accent color with a subtle background and border, and is rendered as the first line of each cross-project task card so the project is the first thing the user reads when scanning tasks from all projects. Also fixed horizontal alignment inside the sidebar: the search input now uses the same 12px horizontal padding as the rest of the panel, and the active-task indicator is rendered as an absolute 2px stripe instead of a `border-l-2` so card content stays symmetrically inset on both sides and aligned with the status group headers and separators."
	},
	{
		"date": "2026-05-10",
		"type": "feature",
		"slug": "reorder-agent-configs",
		"title": "Settings → Coding Agents now lets you reorder agents and configurations: each row has a drag handle plus ↑/↓ buttons ...",
		"body": "Settings → Coding Agents now lets you reorder agents and configurations: each row has a drag handle plus ↑/↓ buttons so you can group items however you like (e.g. keep all Plan Mode configs next to each other in the dropdowns). The settings panel itself was widened (max-w-2xl → max-w-4xl) so it no longer looks cramped on large displays.",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/480",
		"issueRef": "#480"
	},
	{
		"date": "2026-05-09",
		"type": "fix",
		"slug": "merge-completion-popup-dedupe",
		"title": "Deduplicate merge-completion prompts by persisting the last prompted task-branch fingerprint",
		"body": "Deduplicate merge-completion prompts by persisting the last prompted task-branch fingerprint. Dismissing the prompt now suppresses repeats until the task branch changes, with a one-hour fallback when the exact branch head cannot be read. Fixed a race condition where two concurrent reservation calls could both pass the in-memory guard before either added the key; fixed polling loop that kept calling prepareMergeCompletionPrompt every 15 s after suppression."
	},
	{
		"date": "2026-05-09",
		"type": "fix",
		"slug": "numpad-shift-enter",
		"title": "Shift+Enter handling in terminals now matches Enter by keyboard meaning instead of only physical key code, so the mai...",
		"body": "Shift+Enter handling in terminals now matches Enter by keyboard meaning instead of only physical key code, so the main Return key and numpad Enter both preserve the newline shortcut on extended keyboards. dev3 also stops writing the now-invalid Codex profile `tui.theme` setting and comments out stale managed theme lines in existing Codex configs."
	},
	{
		"date": "2026-05-06",
		"type": "fix",
		"slug": "agent-type-lost-on-revive",
		"title": "When reviving a task from completed or cancelled, the agent used for the original session is now correctly restored",
		"body": "When reviving a task from completed or cancelled, the agent used for the original session is now correctly restored. Previously, `activateTask` always passed `undefined` for `agentId` to `launchTaskPty`, causing the global default agent to be used instead of the one stored on the task."
	},
	{
		"date": "2026-05-06",
		"type": "fix",
		"slug": "pycharm-external-app",
		"title": "Added PyCharm to the built-in Open In app list, kept incomplete custom External Apps rows visible while their debounc...",
		"body": "Added PyCharm to the built-in Open In app list, kept incomplete custom External Apps rows visible while their debounced settings save filters them from persistence, and fixed file-level Open In menus closing before lower entries can be clicked.",
		"suggestedBy": "nadavsheinbein",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/530",
		"issueRef": "#530"
	},
	{
		"date": "2026-05-05",
		"type": "fix",
		"slug": "terminal-button-order",
		"title": "Swap the Home Terminal and Project Terminal buttons in the global header so Home Terminal appears first and Project T...",
		"body": "Swap the Home Terminal and Project Terminal buttons in the global header so Home Terminal appears first and Project Terminal sits to its right."
	},
	{
		"date": "2026-05-05",
		"type": "fix",
		"slug": "terminal-long-selection-copy",
		"title": "Fixed terminal clipboard handling for long drag selections, including Home Terminal selections that scroll beyond one...",
		"body": "Fixed terminal clipboard handling for long drag selections, including Home Terminal selections that scroll beyond one screen. OSC 52 clipboard payloads are now buffered across PTY chunks before decoding, and native ghostty selections also use a backend clipboard bridge on desktop."
	},
	{
		"date": "2026-05-03",
		"type": "fix",
		"slug": "cmd-n-duplicate-dialog",
		"title": "Cmd+N now opens the same New Task dialog everywhere (with Scratch + Save & Start buttons), regardless of whether the ...",
		"body": "Cmd+N now opens the same New Task dialog everywhere (with Scratch + Save & Start buttons), regardless of whether the user is on the Kanban board or inside a task. Removed the duplicate CreateTaskModal instance from KanbanBoard and made the \"+\" button route through the same App-level modal."
	},
	{
		"date": "2026-05-02",
		"type": "chore",
		"slug": "claude-no-flicker-env",
		"title": "Inject `CLAUDE_CODE_NO_FLICKER=1` into all Claude-based agent presets via `CLAUDE_DEFAULT_ENV`, so every Claude launc...",
		"body": "Inject `CLAUDE_CODE_NO_FLICKER=1` into all Claude-based agent presets via `CLAUDE_DEFAULT_ENV`, so every Claude launch (Default, Plan, Bypass, Auto, Accept Edits, Don't Ask — Opus and Sonnet variants) inherits the flag automatically.\r\n\r\nAlso fix the Plan presets: replace `--dangerously-skip-permissions` with `--allow-dangerously-skip-permissions` for `claude-plan` / `claude-plan-sonnet`, since auto-bypassing all permission checks defeats Plan mode's approve-the-plan gate. The `--allow-` variant keeps the flag *available* for the user to flip on demand without enabling it by default."
	},
	{
		"date": "2026-05-02",
		"type": "feature",
		"slug": "home-terminal",
		"title": "Add Home Terminal — a project-free 2×2 tmux grid that opens in the user's home directory",
		"body": "Add Home Terminal — a project-free 2×2 tmux grid that opens in the user's home directory. Available from the global header (house icon) or via the Cmd+Shift+` shortcut from any screen, complementing the existing Project Terminal."
	},
	{
		"date": "2026-05-02",
		"type": "docs",
		"slug": "readme-linux-headless-install",
		"title": "Rewrote the README install section",
		"body": "Rewrote the README install section. Split macOS desktop app from Linux server (headless), made `brew install h0x91b/dev3/dev3` the primary path on Linux (and macOS for the CLI/headless variant) with a pre-built tarball as the no-brew fallback. Build-from-source moved to a \"contributors\" section at the bottom.\r\n\r\nWired up the Linux brew formula: added `scripts/create-cli-tarball.sh` that packs `dev3` + `dev3-server` + UI assets into `dev3-cli-{macos,linux}-{arm64,x64}.tar.gz`, called from each platform's `release.yml` build job; the CLI tarballs land in S3 (so they live next to the existing DMG/zst artifacts) and are uploaded to the GitHub Release; a new \"Update Homebrew Formula\" step in the `release` job rewrites `Formula/dev3.rb` in the `homebrew-dev3` tap with the right `version` + per-platform `sha256`. Cask flow is untouched.\r\n\r\nMade the headless binary self-contained: `headless-entry.ts` now also probes `dirname(realpath(process.execPath))/dist` and `<bin>/../share/dev-3.0/dist` before falling back to the dev/CWD candidates, so an extracted tarball or a brew install just works without `DEV3_VIEWS_DIR`.\r\n\r\nFixed a remote-mode bug in `getProjectPtyUrl`: clicking Project Terminal failed with \"Failed to connect to PTY server\" because the override was missing in `src/mainview/rpc.ts` browserOverrides — the raw `ws://localhost:<ptyPort>` URL was sent to the laptop browser. Added the override so the URL routes through the `/pty?session=project-<id>&token=<jwt>` proxy like every other PTY URL in browser mode.\r\n\r\nValidated end-to-end on a fresh Hetzner CPX11 (Ubuntu 24.04, dual-stack): `git clone` + build + `./dist/dev3 remote` gets the UI loading, Project Terminal works after the fix.\r\n\r\nRestructured the Linux install section so it isn't framed as \"headless only\" anymore. Promoted the Homebrew install instructions out of the collapsed `<details>` block, added a visible warning that the Linux Homebrew installer refuses to run as `root` (with a one-liner to create a regular user), and added a \"Desktop GUI on Linux\" subsection pointing to the Electrobun `tar.zst` bundle for Linux machines with a display. The brew CLI install is now presented as the universal Linux entry point — works for headless servers and as CLI tooling on a Linux desktop.\r\n\r\nAdded `dev3 gui` subcommand for launching the desktop app from the CLI. On macOS it locates `dev-3.0.app` in `/Applications` (or `~/Applications`) and runs `open -a`. On Linux it lazily downloads the Electrobun `tar.zst` bundle from S3 into `~/.dev3.0/gui/` on first invocation, registers an XDG `.desktop` entry, then probes `libNativeWrapper.so` via `ldd` and either prints a distro-specific install command (apt/dnf/pacman) for any missing system libs (`libwebkit2gtk-4.1`, `libgtk-3`, `libcairo2`, `libayatana-appindicator3`, `librsvg2`) or execs the launcher. No `--install` flag, no auto-sudo — the CLI prints the install command, the user runs it. Subsequent invocations are instant; bundle updates ride Electrobun's built-in patcher. Adds `CLI_EXIT_CODE_GUI_DEPS_MISSING` (5) so wrappers can detect the deps-missing case. Replaces the manual tar.zst download paragraph in the Linux README section with the new `dev3 gui` flow."
	},
	{
		"date": "2026-04-29",
		"type": "fix",
		"slug": "claude-sonnet-presets",
		"title": "Update Claude Code Sonnet presets to use the current `sonnet` model alias instead of the deprecated timed Sonnet alias",
		"body": "Update Claude Code Sonnet presets to use the current `sonnet` model alias instead of the deprecated timed Sonnet alias. Bump the affected preset versions so existing saved configurations pick up the replacement."
	},
	{
		"date": "2026-04-29",
		"type": "feature",
		"slug": "project-reordering",
		"title": "Dashboard projects can now be reordered and the saved order drives Cmd+1 through Cmd+9 project switching",
		"body": "Dashboard projects can now be reordered and the saved order drives Cmd+1 through Cmd+9 project switching. The dashboard keeps the user's explicit project order instead of reshuffling projects by active task count."
	},
	{
		"date": "2026-04-28",
		"type": "fix",
		"slug": "dev3-skill-inline-system-prompt",
		"title": "Inline the full dev3 skill body directly into the agent's system prompt instead of asking the agent to invoke `/dev3`...",
		"body": "Inline the full dev3 skill body directly into the agent's system prompt instead of asking the agent to invoke `/dev3` first. The working directory is guaranteed to be inside a dev-3.0 managed worktree, so the conditional \"MANDATORY: invoke skill\" reminder was redundant and recent Claude Code versions started ignoring it. The skill rules (branch naming, status, overview refresh, scratch handling, etc.) are now always in context regardless of whether the agent loads the skill file. The `~/.claude/skills/dev3/SKILL.md` file remains for manual `/dev3` use."
	},
	{
		"date": "2026-04-27",
		"type": "fix",
		"slug": "tmux-copy-clipboard-regression",
		"title": "Fix tmux selection-to-clipboard regression introduced by PR #473",
		"body": "Fix tmux selection-to-clipboard regression introduced by PR #473. Mouse-drag copy in the terminal now actually lands in the host clipboard again — the desktop main process pipes OSC 52 payloads directly into pbcopy/wl-copy/xclip, instead of relying on the renderer's `navigator.clipboard.writeText()`, which silently fails in Electrobun WKWebView without a user gesture."
	},
	{
		"date": "2026-04-26",
		"type": "fix",
		"slug": "cli-large-description-payload",
		"title": "Fixed CLI socket request parsing so large `dev3 task create/update --description @file.md` payloads are buffered acro...",
		"body": "Fixed CLI socket request parsing so large `dev3 task create/update --description @file.md` payloads are buffered across socket chunks instead of failing with a misleading `Invalid JSON`. Oversized CLI requests now return an explicit payload-size error, and task-targeting CLI commands now support `--task`/`--task-id` aliases while rejecting unknown flags instead of silently falling back to the auto-detected task."
	},
	{
		"date": "2026-04-26",
		"type": "fix",
		"slug": "git-fetch-ssh-auth-sock",
		"title": "Fixed git fetch failing silently in repos that use SSH authentication (e.g., git@github.com: remotes)",
		"body": "Fixed git fetch failing silently in repos that use SSH authentication (e.g., git@github.com: remotes). The app now captures SSH_AUTH_SOCK from the user's login shell during startup, so the SSH agent socket is available to git and other spawned processes."
	},
	{
		"date": "2026-04-24",
		"type": "feature",
		"slug": "active-task-overview-inline",
		"title": "The selected task in the Active Tasks sidebar now shows its overview directly inside its card (below the title, only ...",
		"body": "The selected task in the Active Tasks sidebar now shows its overview directly inside its card (below the title, only when an overview is set), so you no longer need to hover to recall context. The pencil editor now saves your edits to a separate `userOverview` field that overrides the agent's summary everywhere — the agent keeps writing to its own `overview` field freely, but you see your version until you click the new \"Revert to AI\" (undo) icon next to the overview header."
	},
	{
		"date": "2026-04-24",
		"type": "feature",
		"slug": "ai-review-auto-hand-back",
		"title": "AI Review now hands the task back to the user automatically",
		"body": "AI Review now hands the task back to the user automatically. The default review prompt instructs the agent to move the task to `user-questions` when it found or fixed anything, or to `review-by-user` when the diff is clean. The existing review-by-ai safety net remains, so a crashed or forgetful review agent still lands in `review-by-user`."
	},
	{
		"date": "2026-04-24",
		"type": "chore",
		"slug": "codex-55-default-presets",
		"title": "Updated the built-in Codex presets to default to `gpt-5.5` across the preset list, and bumped preset versions so save...",
		"body": "Updated the built-in Codex presets to default to `gpt-5.5` across the preset list, and bumped preset versions so saved agent configs migrate off old GPT-5.4 defaults automatically. OpenCode's OpenAI-backed preset labels were aligned to GPT-5.5 as well, and the Codex model placeholder text now points at 5.5."
	},
	{
		"date": "2026-04-24",
		"type": "fix",
		"slug": "custom-column-ordering-scope",
		"title": "Fixed task ordering so custom columns keep independent columnOrder values even when they share the same built-in status",
		"body": "Fixed task ordering so custom columns keep independent columnOrder values even when they share the same built-in status. Reordering or reopening a task now renumbers only the rendered column it belongs to."
	},
	{
		"date": "2026-04-24",
		"type": "fix",
		"slug": "diff-viewer-refresh-cache-keys",
		"title": "Refresh the inline diff viewer when the same diff request is opened again, and include full file content in read-stat...",
		"body": "Refresh the inline diff viewer when the same diff request is opened again, and include full file content in read-state and render cache keys so repeated commits cannot reuse stale UI state for changed files."
	},
	{
		"date": "2026-04-24",
		"type": "feature",
		"slug": "global-new-task-shortcut",
		"title": "Command+N now opens the New Task dialog from any project screen, including full task views, and File now includes a m...",
		"body": "Command+N now opens the New Task dialog from any project screen, including full task views, and File now includes a matching New Task item. Command+P now returns to the projects dashboard and opens Add Project, with tests covering both the keyboard shortcut and the shared menu event flow."
	},
	{
		"date": "2026-04-24",
		"type": "feature",
		"slug": "init-new-project",
		"title": "Add a \"New\" tab to Add Project that initialises a brand-new project from scratch: user picks (or creates) an empty fo...",
		"body": "Add a \"New\" tab to Add Project that initialises a brand-new project from scratch: user picks (or creates) an empty folder in the custom picker and dev-3.0 runs git init, seeds a .dev3/README.md placeholder, and makes the first \"init\" commit automatically. The folder picker also gained a \"New folder\" button behind a new allowCreateFolder option so users can materialise a subfolder without leaving the app."
	},
	{
		"date": "2026-04-24",
		"type": "fix",
		"slug": "merge-completion-review-statuses",
		"title": "Restore merge-completion prompts for Has Questions, Your Review, and PR Review",
		"body": "Restore merge-completion prompts for Has Questions, Your Review, and PR Review. Merged branches are checked every 60 seconds again, and AI Review is explicitly excluded for now because its review agent may still be running long after the branch becomes stale."
	},
	{
		"date": "2026-04-24",
		"type": "fix",
		"slug": "pr-review-fork-branch-fetch",
		"title": "Fixed PR review branch fetching for fork remotes by storing fetched fork branches as remote-tracking refs, so they ap...",
		"body": "Fixed PR review branch fetching for fork remotes by storing fetched fork branches as remote-tracking refs, so they appear in the Create Task branch picker. Added regression coverage for the git fetch command shape and the fork-branch modal flow. Improved the picker UX so fetched fork branches stay visible in the dropdown and fork/remote branches are prioritized higher in review-heavy flows."
	},
	{
		"date": "2026-04-24",
		"type": "feature",
		"slug": "scratch-task",
		"title": "Added **Scratch Task** button to the New Task modal",
		"body": "Added **Scratch Task** button to the New Task modal. Creates a todo task with a `Scratch — HH:mm` placeholder title and immediately opens the Launch Task dialog so you can pick the agent/config. The agent is launched with no initial prompt — it greets you, asks what you need, and rewrites the task title/overview/labels itself once you tell it. Handy when you just want a sandbox terminal and haven't formulated the task yet."
	},
	{
		"date": "2026-04-24",
		"type": "feature",
		"slug": "sidebar-global-scope-toggle",
		"title": "Add a slider switch to the Active Tasks sidebar header that toggles between project-only and global scope",
		"body": "Add a slider switch to the Active Tasks sidebar header that toggles between project-only and global scope. In global mode the sidebar lists every active task across all dev-3.0 projects, tags each card with its project name, and clicking a card jumps directly into the task's home project. The preference is persisted in localStorage so it survives app restarts."
	},
	{
		"date": "2026-04-24",
		"type": "fix",
		"slug": "terminal-copy-diagnostics",
		"title": "Added terminal copy diagnostics that log selection-driven clipboard attempts, `navigator.clipboard.writeText` failure...",
		"body": "Added terminal copy diagnostics that log selection-driven clipboard attempts, `navigator.clipboard.writeText` failures, `execCommand(\"copy\")` fallback usage, and mouse-tracking interference into the app log. Also added focused tests around terminal clipboard diagnostics and the updated terminal lifecycle wiring. The temporary investigation code is marked in-source with `TEMP DIAGNOSTIC` comments so it can be removed cleanly after the root cause is fixed."
	},
	{
		"date": "2026-04-23",
		"type": "feature",
		"slug": "task-overview",
		"title": "Added first-class Task Overview — a short one-paragraph summary surfaced above the terminal snapshot in the hover-pre...",
		"body": "Added first-class Task Overview — a short one-paragraph summary surfaced above the terminal snapshot in the hover-preview popover, with inline editing and a new `dev3 overview set|show|clear` CLI. The dev3 agent skill now requires every task to have a clean overview so operators can re-enter focus fast on tasks they haven't touched in days; the original `description` is kept as a fallback when no overview is set yet."
	},
	{
		"date": "2026-04-22",
		"type": "feature",
		"slug": "kanban-git-pull-button",
		"title": "Added a Git Pull button to the global header, right after Project Terminal (visible whenever a project is open, not o...",
		"body": "Added a Git Pull button to the global header, right after Project Terminal (visible whenever a project is open, not only on the Kanban board). The button runs `git pull --ff-only origin <branch>` in the project's main worktree and is enabled only when that worktree is on `main` or `master`; otherwise it is disabled with a tooltip explaining why. The result or any pull error is shown as an alert so users no longer have to open the Project Terminal for a routine pull."
	},
	{
		"date": "2026-04-22",
		"type": "feature",
		"slug": "tasks-json-hourly-backups",
		"title": "Added hourly pre-save backups for each project's `tasks.json` under a new `tasks-backups/` directory in `~/.dev3.0/da...",
		"body": "Added hourly pre-save backups for each project's `tasks.json` under a new `tasks-backups/` directory in `~/.dev3.0/data/<slug>/`. The data layer now keeps one snapshot per UTC hour and prunes the set to the newest 72 files, with regression tests covering snapshot creation, hourly deduping, and retention trimming."
	},
	{
		"date": "2026-04-21",
		"type": "fix",
		"slug": "gh-auth-shell-env",
		"title": "Import `GH_CONFIG_DIR` and `XDG_CONFIG_HOME` from the user's login shell during app startup so backend `gh` auth chec...",
		"body": "Import `GH_CONFIG_DIR` and `XDG_CONFIG_HOME` from the user's login shell during app startup so backend `gh` auth checks use the same config directory as interactive terminals. Added a regression test for shell environment bootstrapping to keep the startup warning aligned with real `gh auth status`."
	},
	{
		"date": "2026-04-21",
		"type": "fix",
		"slug": "task-shell-startup",
		"title": "Detect the user's real account shell from system user records instead of trusting a stale `SHELL` environment variable",
		"body": "Detect the user's real account shell from system user records instead of trusting a stale `SHELL` environment variable. Task setup, startup, cleanup, and fallback shells now launch through that resolved shell so shell-managed tools like `bun` and `gh` keep working in dev-3.0 terminals."
	},
	{
		"date": "2026-04-21",
		"type": "fix",
		"slug": "tmux-switch-glitch",
		"title": "Fixed the garbled/overlapping terminal content and the flicker that appeared when switching between tasks",
		"body": "Fixed the garbled/overlapping terminal content and the flicker that appeared when switching between tasks. Three changes: the PTY server no longer runs a `capture-pane` replay on WebSocket reconnect (its content was at tmux's stale pre-resize dimensions); `TaskTerminal` is now keyed by `taskId` so a task switch starts from a fresh `ptyUrl` state instead of briefly remounting `TerminalView` with the leaving task's URL; and the terminal's resize dance nudges the row count instead of the column count, so the two paints share the same text wrapping and the transition is visually imperceptible."
	},
	{
		"date": "2026-04-21",
		"type": "fix",
		"slug": "topbar-diff-click",
		"title": "Made the top changed-files badge in the task header open the same inline branch diff as the `Show Diff` button",
		"body": "Made the top changed-files badge in the task header open the same inline branch diff as the `Show Diff` button. Added a regression test to keep the badge click wired to the diff dialog while preserving the hover popover."
	},
	{
		"date": "2026-04-20",
		"type": "feature",
		"slug": "diff-show-binary-and-large-files",
		"title": "Show binary and oversized files in the task diff viewer instead of hiding them",
		"body": "Show binary and oversized files in the task diff viewer instead of hiding them. The diff response now exposes skipped files with status (added/modified/deleted/renamed), old→new byte sizes, and the reason (binary or too-large), and the viewer renders them as a dedicated list below the regular text diff. The left file tree now also lists these files (marked as italic with a small binary icon), so they support click-to-jump, per-file Read checkboxes, and are counted in the Mark-all-read ratio."
	},
	{
		"date": "2026-04-20",
		"type": "docs",
		"slug": "freeze-dev3-home-layout",
		"title": "Freeze the `~/.dev3.0/` on-disk layout as a hard invariant",
		"body": "Freeze the `~/.dev3.0/` on-disk layout as a hard invariant. Add a MANDATORY section to AGENTS.md and decision 040 forbidding any automatic rename or move of `projectSlug`-derived directories, since doing so in PR #486 silently broke cross-version installs (v1.8.2 ↔ v1.8.3) until the revert in #488. In-place file-content migrations remain allowed; path moves do not."
	},
	{
		"date": "2026-04-20",
		"type": "fix",
		"slug": "git-diff-cmd-f-find",
		"title": "Inline Git Diff now opens its own local search with Cmd+F instead of falling through to board/task search or doing no...",
		"body": "Inline Git Diff now opens its own local search with Cmd+F instead of falling through to board/task search or doing nothing. The search bar jumps between matching diff lines, uses a stronger warm highlight for matched text and the active row, keeps the board/sidebar shortcut disabled while diff is open, and now uses a cleaner compact toolbar layout that matches the surrounding diff header controls instead of duplicated metadata noise."
	},
	{
		"date": "2026-04-20",
		"type": "feature",
		"slug": "git-diff-copy-path",
		"title": "Added a GitHub-style copy-path icon next to each filename in the inline Git Diff viewer so reviewers can copy full wo...",
		"body": "Added a GitHub-style copy-path icon next to each filename in the inline Git Diff viewer so reviewers can copy full worktree file paths without leaving the diff. Also added localization, a discovery tip, and coverage for the new clipboard action."
	},
	{
		"date": "2026-04-20",
		"type": "fix",
		"slug": "prevent-duplicate-project-entries",
		"title": "Fixed duplicate project entries in the renderer state when the same repository is added more than once",
		"body": "Fixed duplicate project entries in the renderer state when the same repository is added more than once. Re-adding a project now replaces the existing entry by project ID or normalized path instead of appending a duplicate card."
	},
	{
		"date": "2026-04-20",
		"type": "fix",
		"slug": "revert-project-slug-dash-escape",
		"title": "Revert the dash-escape projectSlug change and its one-shot data directory migration from PR #486",
		"body": "Revert the dash-escape projectSlug change and its one-shot data directory migration from PR #486. The migration silently renamed `~/.dev3.0/data/<slug>` on startup of v1.8.3, which broke v1.8.2 (still production) for the same project — every Kanban column showed empty because v1.8.2 still computed the old slug and looked in a now-renamed directory. The other four fixes from PR #486 (CLI `--description` tri-state, column-agent fallback, ProjectSettings worktree load race, activateTask note) are left untouched."
	},
	{
		"date": "2026-04-19",
		"type": "fix",
		"slug": "diff-viewer-stale-content-after-rebase",
		"title": "Fix stale content in the inline diff viewer after a branch rebase or fresh refetch",
		"body": "Fix stale content in the inline diff viewer after a branch rebase or fresh refetch. The underlying `@git-diff-view/core` library caches its internal `File` instances keyed only by the `uuid` we pass to the `DiffFile` constructor; reusing a stable file-path uuid across re-renders returned the previously built `File` with the old content even when fresh hunks and content were supplied. We now mix a content hash into the uuid so the cache invalidates whenever the diff payload changes, and added a regression test that pins the library behaviour and covers the fix."
	},
	{
		"date": "2026-04-17",
		"type": "feature",
		"slug": "custom-folder-picker",
		"title": "Replaced the native folder dialog with a custom in-app folder picker so it works in both desktop and remote (browser)...",
		"body": "Replaced the native folder dialog with a custom in-app folder picker so it works in both desktop and remote (browser) modes. The picker uses @headless-tree/react for lazy-loaded directory traversal over IPC and supports keyboard navigation, breadcrumbs, Home/root shortcuts, and pasting an absolute path. Affects \"Add Project → Browse\", \"Clone base directory\", and the global-settings clone-base-directory chooser."
	},
	{
		"date": "2026-04-17",
		"type": "fix",
		"slug": "dev-server-resolve-empty-project-scripts",
		"title": "Fix dev-server start failing with \"No dev script configured\" when a new project keeps its `.dev3/config.json` only in...",
		"body": "Fix dev-server start failing with \"No dev script configured\" when a new project keeps its `.dev3/config.json` only in a feature-branch worktree (not yet merged to the main branch). `resolveOperationalProjectConfig()` now falls back to the worktree-resolved script when the project-level script is empty or whitespace, instead of forcibly shadowing the worktree value with an empty string. Same fallback applied to `setupScript`, `devScript`, `cleanupScript`, and `setupScriptLaunchMode`."
	},
	{
		"date": "2026-04-17",
		"type": "fix",
		"slug": "medium-bugs-group-2",
		"title": "Fix five medium bugs in task lifecycle and CLI: disambiguate projectSlug so paths like `/foo/bar-baz` and `/foo-bar/b...",
		"body": "Fix five medium bugs in task lifecycle and CLI: disambiguate projectSlug so paths like `/foo/bar-baz` and `/foo-bar/baz` no longer collide on disk (one-shot migration renames existing data dirs), make `task update --description \"\"` clear a task's description via tri-state parsing, surface a user-facing alert when a custom-column agent fails to launch (previously silent), prevent ProjectSettings from persisting a stale worktree config into a different worktree after getProjectConfigs fails (form is cleared and Save is disabled until load succeeds), and document the intentional description blanking in activateTask on reopen."
	},
	{
		"date": "2026-04-17",
		"type": "docs",
		"slug": "refresh-agents-md",
		"title": "Refreshed AGENTS.md: fixed stale RPC handlers path (now a barrel over `src/bun/rpc-handlers/*.ts`), replaced the outd...",
		"body": "Refreshed AGENTS.md: fixed stale RPC handlers path (now a barrel over `src/bun/rpc-handlers/*.ts`), replaced the outdated mdfind-based drag-and-drop section with the current worktree-upload flow (decision 036), explicitly disallowed HMR/watch/bump commands for AI agents, and removed the obsolete \"Recent large-scale changes\" section."
	},
	{
		"date": "2026-04-17",
		"type": "fix",
		"slug": "ui-rpc-infra-reliability",
		"title": "Fixed five reliability regressions across the renderer, RPC transport, shell bootstrap, and release workflow",
		"body": "Fixed five reliability regressions across the renderer, RPC transport, shell bootstrap, and release workflow. Failed app discovery no longer poisons the cache, merge-complete now surfaces double-failure instead of desyncing local state, browser RPC rejects in-flight calls on socket loss, release caches hash the real Bun lockfile, and unsupported shells are now guarded explicitly instead of pretending fish is zsh."
	},
	{
		"date": "2026-04-16",
		"type": "chore",
		"slug": "claude-opus-default-47",
		"title": "Updated the built-in Claude Opus presets to use the CLI default model instead of forcing `opus[1m]`, so new sessions ...",
		"body": "Updated the built-in Claude Opus presets to use the CLI default model instead of forcing `opus[1m]`, so new sessions pick up Anthropic's current default Opus 4.7 model automatically. Renamed the affected preset labels to explicit `Opus 4.7` names and bumped preset versions so stored defaults migrate cleanly."
	},
	{
		"date": "2026-04-16",
		"type": "fix",
		"slug": "client-side-osc52-clipboard",
		"title": "Moved OSC 52 clipboard handling from the PTY server to the renderer by forwarding decoded payloads over RPC and writi...",
		"body": "Moved OSC 52 clipboard handling from the PTY server to the renderer by forwarding decoded payloads over RPC and writing them with navigator.clipboard on the client. Removed the tmux pbcopy copy-pipe bindings so remote access and Linux terminals no longer depend on server-side macOS clipboard tooling."
	},
	{
		"date": "2026-04-16",
		"type": "fix",
		"slug": "dropped-files-upload-to-worktree",
		"title": "Dropped files now upload their content into the task worktree uploads directory and use the returned server path inst...",
		"body": "Dropped files now upload their content into the task worktree uploads directory and use the returned server path instead of trying to resolve a host-system filename. This removes the macOS Spotlight dependency from drag-and-drop and makes the flow work the same in local and remote sessions."
	},
	{
		"date": "2026-04-16",
		"type": "fix",
		"slug": "remote-theme-persistence",
		"title": "Persist the resolved UI theme and the selected theme preference when tmux theme changes, then inject that state into ...",
		"body": "Persist the resolved UI theme and the selected theme preference when tmux theme changes, then inject that state into remote HTML bootstrap. Remote clients now reuse the last user-selected light or dark mode instead of falling back to a fresh browser default."
	},
	{
		"date": "2026-04-16",
		"type": "fix",
		"slug": "task-source-base-branch",
		"title": "New tasks created from an existing branch now store that source branch as their task base branch, so Task compare, re...",
		"body": "New tasks created from an existing branch now store that source branch as their task base branch, so Task compare, rebase, and PR defaults follow the branch they were spawned from instead of the project default. Branch-derived tasks now default to the local source branch for compare and diff instead of trying to use a missing `origin/<branch>` ref, and newly added variants or attempts inherit the source task branch to keep the right compare and merge target.\r\nMerge scripts now switch the project repository to the task base branch before squash-merging, and the app includes a new tip explaining that tasks created from another branch compare and diff against that local branch by default."
	},
	{
		"date": "2026-04-15",
		"type": "fix",
		"slug": "cli-socket-destructive-cleanup",
		"title": "Routed destructive CLI socket `task.move` transitions through the shared task lifecycle handler so task state cleanup...",
		"body": "Routed destructive CLI socket `task.move` transitions through the shared task lifecycle handler so task state cleanup, port release, and dev-server teardown stay aligned with the canonical RPC path. Added a focused regression test that fails unless the socket move path delegates cleanup through the shared `moveTask` flow."
	},
	{
		"date": "2026-04-15",
		"type": "fix",
		"slug": "corrupt-json-mutator-guard",
		"title": "Prevented `addProject`/`updateProject` and task mutators from overwriting persisted state after a JSON parse failure ...",
		"body": "Prevented `addProject`/`updateProject` and task mutators from overwriting persisted state after a JSON parse failure in `projects.json` or `tasks.json`. Added regression tests that reproduce the previous destructive overwrite path and verify mutators now throw a typed read error instead of saving over corrupted files."
	},
	{
		"date": "2026-04-15",
		"type": "fix",
		"slug": "desktop-rpc-schema-messages",
		"title": "Declared the desktop-only RPC message ids for zoom controls and QR token consumption in the shared Electrobun schema",
		"body": "Declared the desktop-only RPC message ids for zoom controls and QR token consumption in the shared Electrobun schema.\r\nUpdated the main-process desktop send calls to use typed message dispatch for those routes and added regression tests for the schema and renderer transport handlers."
	},
	{
		"date": "2026-04-15",
		"type": "feature",
		"slug": "dev3-remote-headless-mode",
		"title": "Added `dev3 remote` — run dev-3.0 headless and serve the full React UI to any browser over HTTP + WebSocket",
		"body": "Added `dev3 remote` — run dev-3.0 headless and serve the full React UI to any browser over HTTP + WebSocket. Prints an ASCII QR signed with a short-lived JWT token (auto-refreshed every 25s, matching the GUI modal), plus LAN, SSH port-forward, and optional Cloudflare tunnel (`--tunnel`) connection hints.\r\n\r\nSplit into two binaries: `dist/dev3` (CLI, no electrobun) and `dist/dev3-server` (headless entry). A platform shim (`src/bun/electrobun-platform.ts`) conditionally re-exports `Utils` / `PATHS` / `Updater` so headless mode never imports `electrobun/bun` (whose FFI `dlopen` exits the process and whose top-level awaits break non-GUI bundles). Set `DEV3_HEADLESS=1` via `headless-bootstrap.ts` before ES imports hoist, and the shim short-circuits to stubs.\r\n\r\nIn dev mode (`bun run src/cli/main.ts remote`) always re-run source through Bun rather than spawning `dist/dev3-server`: unsigned compiled binaries are killed by macOS Gatekeeper with SIGKILL and no output, and a stale `dist/` would silently run code that no longer matches the current source. The sibling-spawn path is kept for the compiled prod `dev3`.\r\n\r\nIn prod, the GUI app at startup now refreshes both `dev3` and `dev3-server` from its bundle into `~/.dev3.0/bin/` (previously only `dev3` was copied), so `dev3 remote` finds its sibling after a single GUI launch. Works identically on macOS and Linux; `dev3-server` copy is optional for backwards compatibility with pre-feature releases, and the remote command prints a clear actionable error if the sibling is missing at invocation time.\r\n\r\nAdded `scripts/sign-cli-binaries.sh` invoked from `build:cli`. Bun's `--compile` output embeds a payload that Apple's `codesign` rejects with \"invalid or unsupported format for signature\", so on macOS Sequoia AMFI SIGKILLs the unsigned binary even when run locally (silent `[1] killed`). The script first strips bun's pseudo-blob with `codesign --remove-signature`, then ad-hoc signs with `codesign --force --sign -`. No-op on Linux/Windows. Release builds still get a real Developer ID via the Electrobun bundle pipeline.\r\n\r\nStatic asset root is now resolved lazily on the first HTTP request and supports both layouts: Electrobun bundle (`VIEWS_FOLDER/mainview/index.html`) and flat Vite output (`VIEWS_FOLDER/index.html`). Previously it was a module-level constant computed before `headless-entry` had a chance to set `DEV3_VIEWS_DIR`, so the compiled server always 404'd on `/`.\r\n\r\nAdded `--static-code=<value>` flag (min 4 chars). When set, the URL token is the fixed user-supplied code instead of a rolling 30s JWT, the QR auto-refresher is skipped, and `/auth/exchange` accepts the code as a magic word with no replay protection. Useful for local dev so you don't have to rescan the QR every 30 seconds. The console banner labels the mode \"static code (no rotation, dev only)\" with an explicit warning. Plain JWT exchange continues to work alongside."
	},
	{
		"date": "2026-04-15",
		"type": "feature",
		"slug": "dev3-remote-port-and-docker",
		"title": "Added `--port <n>` to `dev3 remote` (env `DEV3_REMOTE_PORT`) so the listen port can be pinned instead of randomised —...",
		"body": "Added `--port <n>` to `dev3 remote` (env `DEV3_REMOTE_PORT`) so the listen port can be pinned instead of randomised — useful for Docker `-p` mappings and SSH `-L` forwards. Shipped a multi-stage `docker/Dockerfile`, `.dockerignore`, and `docker/docker-compose.yml` so the new flag can be tested on any machine without a real Linux server."
	},
	{
		"date": "2026-04-15",
		"type": "fix",
		"slug": "dev3-server-release-signing",
		"title": "Fixed the macOS release signing flow so both bundled CLI binaries, `dev3` and `dev3-server`, are signed with the Deve...",
		"body": "Fixed the macOS release signing flow so both bundled CLI binaries, `dev3` and `dev3-server`, are signed with the Developer ID certificate before notarization. Added a regression test covering the release-signing mode of `scripts/sign-cli-binaries.sh`."
	},
	{
		"date": "2026-04-15",
		"type": "fix",
		"slug": "migration-lock-race",
		"title": "Stopped `loadProjects()` and `loadTasks()` from writing schema backfills during unlocked reads, and limited migration...",
		"body": "Stopped `loadProjects()` and `loadTasks()` from writing schema backfills during unlocked reads, and limited migration persistence to locked mutators. Added regression tests that reproduce the reader-vs-writer race and verify stale migration writes cannot clobber concurrent project or task updates."
	},
	{
		"date": "2026-04-15",
		"type": "fix",
		"slug": "notes-labels-rmw-race",
		"title": "Fixed notes/labels read-modify-write races by moving project and task mutations under locked mutator APIs in `src/bun...",
		"body": "Fixed notes/labels read-modify-write races by moving project and task mutations under locked mutator APIs in `src/bun/data.ts` and updating `src/bun/rpc-handlers/notes-labels.ts` to use them. Replaced JSON reads/writes in the data layer with `node:fs/promises` to avoid stale same-process reads that broke sequential locked updates, added regression coverage for concurrent project/task mutations, and added a critical `AGENTS.md` rule to keep Git commit/rebase messages inline so editors never pop up."
	},
	{
		"date": "2026-04-15",
		"type": "fix",
		"slug": "release-artifact-notary-diagnostic",
		"title": "Improved the release artifact recovery script so macOS CI failures that leave only `dev-3.0.app.zip` now report a lik...",
		"body": "Improved the release artifact recovery script so macOS CI failures that leave only `dev-3.0.app.zip` now report a likely post-packaging/notarization failure instead of the misleading \"build failed before tarring\" message. Added a regression test for the partial macOS artifact case."
	},
	{
		"date": "2026-04-15",
		"type": "fix",
		"slug": "settings-atomic-save",
		"title": "Hardened global settings persistence with a file lock, parent directory creation, and atomic temp-file rename to prev...",
		"body": "Hardened global settings persistence with a file lock, parent directory creation, and atomic temp-file rename to prevent corrupted `settings.json` writes. Added backend tests covering interrupted writes and first-write directory creation."
	},
	{
		"date": "2026-04-15",
		"type": "fix",
		"slug": "task-move-if-status-cas-race",
		"title": "Moved `task move --if-status/--if-status-not` compare-and-set checks into `data.updateTask()` so the guard now runs u...",
		"body": "Moved `task move --if-status/--if-status-not` compare-and-set checks into `data.updateTask()` so the guard now runs under the per-task file lock. Added regression coverage for concurrent `task.move` requests and direct concurrent `updateTask()` calls on the same task."
	},
	{
		"date": "2026-04-13",
		"type": "fix",
		"slug": "agent-config-save-race",
		"title": "Fixed a race in Global Settings agent config editing where overlapping save requests could persist an older payload a...",
		"body": "Fixed a race in Global Settings agent config editing where overlapping save requests could persist an older payload after a newer one. Agent edits now serialize writes and keep only the latest pending state, so new tasks launch with the command you actually saved."
	},
	{
		"date": "2026-04-13",
		"type": "feature",
		"slug": "dev3-bug-hunter-skill",
		"title": "Added a managed `dev3-bug-hunter` skill that installs for all supported agents and gives each bug-hunting run a seede...",
		"body": "Added a managed `dev3-bug-hunter` skill that installs for all supported agents and gives each bug-hunting run a seeded starting area plus analysis style. The skill is explicitly read-only, now reports findings with a compact ASCII summary table plus detail sections for terminal readability, asks whether `critical` and `medium` findings should become separate dev3 tasks, and requires every follow-up task to validate and reproduce the bug before any fix is attempted. The shared `~/.agents/skills` copies now also get managed `agents/openai.yaml` metadata so `dev3`, `dev3-project-config`, and `dev3 Bug Hunter` stay visible in the skill UI after reinstall."
	},
	{
		"date": "2026-04-13",
		"type": "fix",
		"slug": "inline-diff-wkwebview-paint-glitch",
		"title": "Applied a WKWebView-specific inline diff workaround so split/unified views do not visually drift into fake rows after...",
		"body": "Applied a WKWebView-specific inline diff workaround so split/unified views do not visually drift into fake rows after mode switches or horizontal scrolling. The viewer now remounts on diff payload changes and uses WebKit-safe diff table styling."
	},
	{
		"date": "2026-04-13",
		"type": "feature",
		"slug": "non-base-branch-task-start",
		"title": "Task creation now keeps the current non-base branch visible in the branch picker so users can see what context they a...",
		"body": "Task creation now keeps the current non-base branch visible in the branch picker so users can see what context they are about to inherit. When that branch is selected, the create-task modal now asks for explicit confirmation before starting from it, explains the risk of carrying over unrelated work, and also flags when the main repo itself is dirty."
	},
	{
		"date": "2026-04-13",
		"type": "fix",
		"slug": "preparing-cancel-and-profiling",
		"title": "Preparing tasks now emit step-by-step timing logs for project config resolution, worktree creation, sparse checkout, ...",
		"body": "Preparing tasks now emit step-by-step timing logs for project config resolution, worktree creation, sparse checkout, clone-path reuse, PTY launch, and key git substeps so slow or stuck setup leaves a usable performance trail. Added a Cancel action on Preparing cards that kills tracked setup subprocesses with `kill -9`, cleans up partial task state, and returns the task to To Do instead of leaving it hung forever. Preparing cards now also show a compact progress bar with the current setup stage, so users can see whether dev-3.0 is fetching `origin`, creating the worktree, cloning shared paths, or launching the terminal instead of staring at a dumb spinner.",
		"suggestedBy": "alonkochba",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/442",
		"issueRef": "#442"
	},
	{
		"date": "2026-04-12",
		"type": "fix",
		"slug": "codex-hooks-app-offline",
		"title": "Make generated Codex lifecycle hooks treat `dev3` exit code 2 (\"app not running\") as a non-blocking no-op, so prompt ...",
		"body": "Make generated Codex lifecycle hooks treat `dev3` exit code 2 (\"app not running\") as a non-blocking no-op, so prompt submission, Bash tool execution, and Stop still work when the desktop app is closed. The fallback is selective: other CLI failures still surface instead of being hidden, the Stop hook now avoids zsh's read-only `status` variable so the shell wrapper does not crash with exit code 1, and the CLI now keeps its public exit codes in a shared registry plus `docs/cli-exit-codes.md`.",
		"suggestedBy": "AboMokh-Wix",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/443",
		"issueRef": "#443"
	},
	{
		"date": "2026-04-12",
		"type": "fix",
		"slug": "preparing-task-text-recovery",
		"title": "Preparing task cards now keep a dedicated \"Show full description\" recovery action in the loading overlay, so the orig...",
		"body": "Preparing task cards now keep a dedicated \"Show full description\" recovery action in the loading overlay, so the original task text stays reachable even if preparation hangs. Added TaskCard regression coverage to keep read-only recovery available while state-changing actions remain disabled.",
		"suggestedBy": "alonkochba",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/442",
		"issueRef": "#442"
	},
	{
		"date": "2026-04-11",
		"type": "fix",
		"slug": "git-unicode-filenames",
		"title": "Fixed Git-backed filename handling so Unicode and Cyrillic paths stay readable in branch diff stats and untracked fil...",
		"body": "Fixed Git-backed filename handling so Unicode and Cyrillic paths stay readable in branch diff stats and untracked file scans instead of showing escaped octal sequences. Added regression tests with a real Git repo to cover both branch diffs and untracked files.\r\n\r\nTemporarily added a Russian-named repository file to validate the tracked-path flow end to end, then removed it after verification."
	},
	{
		"date": "2026-04-11",
		"type": "fix",
		"slug": "review-diff-scroll-wrapper",
		"title": "Fix the inline review diff viewer to rely on the library's own horizontal scroll container instead of wrapping it in ...",
		"body": "Fix the inline review diff viewer to rely on the library's own horizontal scroll container instead of wrapping it in a second overflow layer. Add a regression test so the extra wrapper does not come back and break diff rendering in WebKit-based views."
	},
	{
		"date": "2026-04-06",
		"type": "fix",
		"slug": "bundled-task-sounds",
		"title": "Rebuilt task completion and cancellation sounds around renderer-side playback instead of Bun shelling out to `afplay`",
		"body": "Rebuilt task completion and cancellation sounds around renderer-side playback instead of Bun shelling out to `afplay`. Status transitions now emit a lightweight RPC event, and the React app preloads the bundled MP3 assets directly so packaged builds no longer depend on filesystem-only resource paths or cached fallback files."
	},
	{
		"date": "2026-04-06",
		"type": "fix",
		"slug": "codex-stop-hook-json",
		"title": "Made generated Codex Stop hooks call `dev3 task move` with a Codex-specific flag that suppresses human-readable stdou...",
		"body": "Made generated Codex Stop hooks call `dev3 task move` with a Codex-specific flag that suppresses human-readable stdout, so Codex no longer rejects the hook output as invalid JSON. Added regression tests for hook generation and CLI move output."
	},
	{
		"date": "2026-04-06",
		"type": "fix",
		"slug": "codex-stop-hook-json-envelope",
		"title": "Make Codex Stop hooks return an explicit `{}` success envelope instead of relying on empty stdout, and wrap the gener...",
		"body": "Make Codex Stop hooks return an explicit `{}` success envelope instead of relying on empty stdout, and wrap the generated hook command so normal CLI output cannot leak into Codex's JSON parser. This keeps normal `dev3 task move` output unchanged for humans while making old and new Codex hook paths more robust."
	},
	{
		"date": "2026-04-06",
		"type": "docs",
		"slug": "concise-agent-writing-style",
		"title": "Updated the top-level AGENTS.md response-style rule to a Decision-First format",
		"body": "Updated the top-level AGENTS.md response-style rule to a Decision-First format. The default now uses ordered `CANDIDATES`, `DECISION`, `WHY`, and `NEXT` sections with equal-width ASCII dividers, plus the repo-mandated `## Test instructions` block for code changes."
	},
	{
		"date": "2026-04-06",
		"type": "fix",
		"slug": "microphone-entitlement",
		"title": "Add the macOS microphone entitlement to the Electrobun build config so dev-3.0 can request microphone access for AI a...",
		"body": "Add the macOS microphone entitlement to the Electrobun build config so dev-3.0 can request microphone access for AI assistant voice mode. Added a regression test covering the entitlement and generated usage description path.",
		"suggestedBy": "ronnyelkayam",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/432",
		"issueRef": "#432"
	},
	{
		"date": "2026-04-06",
		"type": "chore",
		"slug": "rtk-test-runner",
		"title": "Use RTK (Rust Token Killer) as the vitest runner when available, falling back to bunx otherwise",
		"body": "Use RTK (Rust Token Killer) as the vitest runner when available, falling back to bunx otherwise. Applies to all test scripts: `test`, `test:full`, `test:bun`, `test:cli`. This reduces test output noise by ~90% during local development while keeping CI behavior unchanged."
	},
	{
		"date": "2026-04-06",
		"type": "feature",
		"slug": "task-completion-hook-env",
		"title": "Cleanup Script now runs as a teardown hook for completed and cancelled tasks with lifecycle env vars such as DEV3_TAS...",
		"body": "Cleanup Script now runs as a teardown hook for completed and cancelled tasks with lifecycle env vars such as DEV3_TASK_STATUS, DEV3_TASK_FROM_STATUS, DEV3_TASK_TO_STATUS, DEV3_PROJECT_PATH, and DEV3_WORKTREE_PATH. Project Settings text and agent-facing docs now describe the real behavior, and a new tip highlights branching cleanup logic by task status.",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/361",
		"issueRef": "#361"
	},
	{
		"date": "2026-04-04",
		"type": "feature",
		"slug": "pane-exited-cleanup",
		"title": "Closed tmux panes are now automatically removed from session recovery state via a tmux pane-exited hook",
		"body": "Closed tmux panes are now automatically removed from session recovery state via a tmux pane-exited hook. When a pane exits (user Ctrl+D, agent finishes, killPane), the app receives a callback and removes the dead pane entry from sessionState, preventing recovery from recreating stale panes."
	},
	{
		"date": "2026-04-03",
		"type": "feature",
		"slug": "cli-dev-server-controls",
		"title": "Add `dev3 dev-server start|stop|restart|status` so the CLI can control the same task dev server flow as the UI button",
		"body": "Add `dev3 dev-server start|stop|restart|status` so the CLI can control the same task dev server flow as the UI button. The command now prints stable session, pane, PID, assigned `DEV3_PORT*`, detected listener ports, and worktree details after each action instead of guessing from unrelated listeners, prefers the newest live app socket when multiple dev3 app instances are running, and the generated `dev3` skill now treats dev-server start/stop/restart as explicit side-effectful actions."
	},
	{
		"date": "2026-04-03",
		"type": "fix",
		"slug": "codex-theme-flags",
		"title": "Dev3 now manages dedicated Codex config profiles for themed launches instead of passing one-off `tui.theme` CLI overr...",
		"body": "Dev3 now manages dedicated Codex config profiles for themed launches instead of passing one-off `tui.theme` CLI overrides. Codex sessions launched from dev3 switch between `profiles.dev3-light` and `profiles.dev3-dark` automatically, using `github` for light mode and `dracula` for dark mode."
	},
	{
		"date": "2026-04-02",
		"type": "feature",
		"slug": "active-tasks-agent-identity",
		"title": "Active Tasks now shows each parallel variant by agent and compact config summary instead of relying on duplicated tas...",
		"body": "Active Tasks now shows each parallel variant by agent and compact config summary instead of relying on duplicated task titles alone. It also reuses the compact variant dot indicator so parallel runs of the same task stay easy to distinguish in both the sidebar and the browser strip. User-facing labels now consistently call these parallel runs \"variants\" instead of \"attempts\"."
	},
	{
		"date": "2026-04-02",
		"type": "fix",
		"slug": "bun-which-path",
		"title": "Fixed PATH resolution for binary lookups (tmux, gh, git)",
		"body": "Fixed PATH resolution for binary lookups (tmux, gh, git). Bun.which() was reading the OS-level PATH instead of the shell-resolved PATH, causing binaries outside /usr/bin to not be found in macOS .app bundles. The fix explicitly passes process.env.PATH to Bun.which()."
	},
	{
		"date": "2026-04-02",
		"type": "fix",
		"slug": "dev-server-terminal-corruption",
		"title": "Fix terminal rendering corruption when a dev server pane closes inside a nested tmux session",
		"body": "Fix terminal rendering corruption when a dev server pane closes inside a nested tmux session. The wrappedScript now calls `tmux detach-client` before its pane exits, so inner tmux redraws without a watching client and the escape sequences never reach the outer tmux. The viewer pane's attach command is now a while-loop that re-attaches if the inner session is still alive (e.g. a frontend pane is still running after the backend closes).",
		"suggestedBy": "dolev",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/116",
		"issueRef": "#116"
	},
	{
		"date": "2026-04-02",
		"type": "fix",
		"slug": "gemini-skill-alias-conflicts",
		"title": "Stop installing managed `dev3` and `dev3-project-config` skills into `~/.gemini/skills` now that Gemini CLI already l...",
		"body": "Stop installing managed `dev3` and `dev3-project-config` skills into `~/.gemini/skills` now that Gemini CLI already loads the shared `~/.agents/skills` alias first. Startup and `dev3 install-skills` also remove stale Gemini-specific copies of those two managed skills so existing users stop seeing duplicate skill conflict warnings."
	},
	{
		"date": "2026-04-02",
		"type": "refactor",
		"slug": "global-settings-sections",
		"title": "Refactored Global Settings into domain-specific section components with a shared persistence flow for global setting ...",
		"body": "Refactored Global Settings into domain-specific section components with a shared persistence flow for global setting updates. Extracted pure helpers for settings normalization and command preview generation, and added focused tests to cover the new seams."
	},
	{
		"date": "2026-04-01",
		"type": "fix",
		"slug": "codex-default-permissions",
		"title": "Fix Codex startup failures caused by dev3-managed `config.toml` files that defined permission profiles without `defau...",
		"body": "Fix Codex startup failures caused by dev3-managed `config.toml` files that defined permission profiles without `default_permissions`. dev3 now creates a minimal fallback `permissions.workspace` profile, sets it as the default when missing, and covers the migration with Codex config tests."
	},
	{
		"date": "2026-04-01",
		"type": "feature",
		"slug": "dev3-skill-task-labels",
		"title": "Expanded the generated dev3 skill so agents assign 1-2 meaningful task labels during the same session-start metadata ...",
		"body": "Expanded the generated dev3 skill so agents assign 1-2 meaningful task labels during the same session-start metadata pass as branch renaming and task title cleanup. Tightened the wording so creating a label without immediately attaching it to the current task no longer counts as finishing the step, and added tests to keep the embedded label guidance consistent across Claude, Codex, and generic skill variants."
	},
	{
		"date": "2026-04-01",
		"type": "feature",
		"slug": "inline-diff-comments",
		"title": "Added inline comments to the built-in diff viewer using `@git-diff-view/react` widgets for comment composers and exte...",
		"body": "Added inline comments to the built-in diff viewer using `@git-diff-view/react` widgets for comment composers and extend data for rendered threads. The diff sidebar now keeps review cards inside a capped scrollable area, shows compact 100-character clickable previews with a full-width XML copy button, uses localized Russian strings for the review UI, preserves caret position while editing inline comments, avoids race conditions when jumping from a review card to its inline comment, and appends the review-processing instruction after `</reviews>` without escaping text for LLM consumption; comments remain local to the current viewer session for now, and the internal data model is already range-ready so multi-line targets can be added later without reshaping stored comment state."
	},
	{
		"date": "2026-04-01",
		"type": "feature",
		"slug": "inline-git-diff-viewer",
		"title": "Added an inline git diff mode that replaces the task terminal with an in-app diff viewer",
		"body": "Added an inline git diff mode that replaces the task terminal with an in-app diff viewer. Show Diff now just opens the viewer, while Branch, Uncommitted, and Unpushed switching happens inside the diff toolbar with loading states; the changed-files popup is back on the top summary badge and its diff action now opens the inline viewer focused on the selected file; file headers stay sticky while scrolling with tighter top attachment; and the file navigator is now a real left sidebar tree with collapsible folders, a wider column, tighter indentation, larger tree icons, persistent Read state so unchanged diffs keep their reviewed markers, bulk sidebar actions to collapse everything or mark the whole diff read/unread at once, smarter file-jump alignment so the first click lands under the sticky toolbar instead of in random bullshit territory, and sticky header collapse/read actions now snap the current file back to the top before collapsing so the view does not drop into the middle of the next diff. Each diff file header now also shows its own +/− line stats, the top summary chips were folded into the main toolbar row with colored +/− counts, the changed-files popup uses a tighter right gutter so its action icons do not float in ugly dead space, the folder collapse affordance no longer looks like a stray mini button, the sidebar bulk-action header no longer has a washed-out translucent backdrop or oversized buttons, the diff viewer follows the app light/dark theme correctly, the old external diff tool setting plus its dead RPC paths have been removed entirely, and Global Settings now controls whether Show Diff starts in side-by-side or Unified mode."
	},
	{
		"date": "2026-04-01",
		"type": "fix",
		"slug": "pr-badge-centering",
		"title": "Moved the PR badge off the crowded footer row and into the lower action row of active task cards, with centered badge...",
		"body": "Moved the PR badge off the crowded footer row and into the lower action row of active task cards, with centered badge text and spacing. Added regression coverage so active cards keep the PR badge in the lower row instead of squeezing it into the footer."
	},
	{
		"date": "2026-04-01",
		"type": "feature",
		"slug": "project-github-account-selection",
		"title": "Added a project-scoped GitHub integration layer for `gh`: the app now detects installed/authenticated accounts, lets ...",
		"body": "Added a project-scoped GitHub integration layer for `gh`: the app now detects installed/authenticated accounts, lets you choose a per-project GitHub account in Project Settings, and runs PR discovery/actions through that account instead of relying on whichever `gh` user happens to be active globally. PR polling, PR status lookup, merge detection, and PR open/create flows now all use the same backend wrapper."
	},
	{
		"date": "2026-04-01",
		"type": "refactor",
		"slug": "task-info-panel-extractions",
		"title": "Refactored TaskInfoPanel into focused task-info-panel modules for git actions, dev server controls, notes, open-in ac...",
		"body": "Refactored TaskInfoPanel into focused task-info-panel modules for git actions, dev server controls, notes, open-in actions, tmux controls, and task-specific polling hooks. This cuts parent component state sprawl and isolates async effects without changing the covered task UI behavior."
	},
	{
		"date": "2026-04-01",
		"type": "feature",
		"slug": "task-launcher-icons",
		"title": "Replaced text-only launcher names in task variant badges with @lobehub/icons logos for known agents while keeping a t...",
		"body": "Replaced text-only launcher names in task variant badges with @lobehub/icons logos for known agents while keeping a text fallback for unknown launchers. Updated task card tests with a shared icon mock for the new package. The badge layout was then tightened into separate attempt and config chips, the launcher mapping was corrected to use the actual Claude, Codex, and Gemini brand icons, and the icon was moved to the front so the launcher reads first instead of getting buried after the config text. The second line was then demoted from a second pill into a plain subtitle so wrapped config/model text no longer looks boxed-in or visually heavier than the launcher row, and the temporary feature-discovery tip for this change was removed."
	},
	{
		"date": "2026-04-01",
		"type": "fix",
		"slug": "tmux-session-loading-noise",
		"title": "Reduced `listTmuxSessions` overhead by listing tmux sessions before loading project/task metadata, skipping task load...",
		"body": "Reduced `listTmuxSessions` overhead by listing tmux sessions before loading project/task metadata, skipping task loads for project-terminal-only results, and downgrading routine session logs to debug. The tmux session popover also avoids an immediate redundant refetch after a fresh load, with tests covering both backend and UI behavior."
	},
	{
		"date": "2026-04-01",
		"type": "fix",
		"slug": "tmux-toolbar-button-spacing",
		"title": "Normalize the tmux toolbar spacing so the shortcuts hint button matches the surrounding controls and no longer leaves...",
		"body": "Normalize the tmux toolbar spacing so the shortcuts hint button matches the surrounding controls and no longer leaves an extra gap before close pane.\r\nAdded a regression test that locks the shared button spacing classes in place."
	},
	{
		"date": "2026-04-01",
		"type": "fix",
		"slug": "worktree-copy-tooltip",
		"title": "Made the worktree copy tooltip explicit so it now says it copies the path to the git worktree",
		"body": "Made the worktree copy tooltip explicit so it now says it copies the path to the git worktree. Updated the task info panel test to lock the new wording in place."
	},
	{
		"date": "2026-03-30",
		"type": "fix",
		"slug": "resume-active-task-restore",
		"title": "Restore active task terminals in resume mode after app relaunch by treating persisted worktree-backed tasks as alread...",
		"body": "Restore active task terminals in resume mode after app relaunch by treating persisted worktree-backed tasks as already launched sessions. Dead in-memory PTY sessions are now discarded before restore so reopening does not reuse the stale launch command and replay the original task prompt.",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/379",
		"issueRef": "#379"
	},
	{
		"date": "2026-03-30",
		"type": "refactor",
		"slug": "rpc-handlers-domain-split",
		"title": "Refactored Bun RPC handlers out of the monolithic `src/bun/rpc-handlers.ts` file into domain modules for app/project,...",
		"body": "Refactored Bun RPC handlers out of the monolithic `src/bun/rpc-handlers.ts` file into domain modules for app/project, settings/config, task lifecycle, git operations, tmux/PTY, notes/labels, and remote access. Kept the public `rpc-handlers.ts` API as a thin composition layer so existing imports and tests keep working while handler ownership is obvious. Fixed regressions in `getPtyUrl` session restore and in background variant/attempt preparation so failed config resolution clears `preparing` state instead of leaving tasks stuck and throwing unhandled rejections."
	},
	{
		"date": "2026-03-30",
		"type": "fix",
		"slug": "variant-preparing-stuck",
		"title": "Fixed a background preparation failure path where `spawnVariants` and `addAttempts` could reject before entering per-...",
		"body": "Fixed a background preparation failure path where `spawnVariants` and `addAttempts` could reject before entering per-task error handling, leaving tasks stuck in `Preparing...`. Added regression coverage to ensure failed project config resolution clears the preparing state instead of silently hanging the card. Also added extra RPC logs around background preparation startup, config resolution, per-task preparation, and cleanup so the next incident leaves a usable trail instead of silent bullshit. Added a new View menu action to open the app logs directory directly from the global menu, plus a matching \"Did you know?\" tip. Expanded unit coverage around task activation, worktree preparation, sparse checkout/CoW orchestration, PTY launch failures, and non-fatal trust/hook errors in the startup path."
	},
	{
		"date": "2026-03-29",
		"type": "fix",
		"slug": "codex-worktree-trust-prompt",
		"title": "Fix Codex spawned worktrees asking for the trust prompt again by pre-registering the exact worktree path in `~/.codex...",
		"body": "Fix Codex spawned worktrees asking for the trust prompt again by pre-registering the exact worktree path in `~/.codex/config.toml` before launch. The dev3 Codex config patcher now keeps the shared worktrees root trust entry and can add per-worktree trust entries without duplicating the permission profile logic."
	},
	{
		"date": "2026-03-29",
		"type": "fix",
		"slug": "immediate-task-completion-sound",
		"title": "Task completion and cancellation sounds now play immediately when the status change is accepted instead of waiting fo...",
		"body": "Task completion and cancellation sounds now play immediately when the status change is accepted instead of waiting for tmux cleanup and worktree teardown. Added regression coverage for both RPC and CLI task move flows so delayed audio feedback does not creep back in."
	},
	{
		"date": "2026-03-28",
		"type": "feature",
		"slug": "activity-project-actions",
		"title": "Moved the dashboard to a single Activity-based project list: it now shows all projects, keeps project paths visible, ...",
		"body": "Moved the dashboard to a single Activity-based project list: it now shows all projects, keeps project paths visible, includes Add Project in the Activity header, and no longer depends on the old Projects tab. Also lifted the Add Project modal to app level, added File > Add Project..., documented the flow with tips and tests, and removed the last dead tab i18n leftovers from the old dashboard split."
	},
	{
		"date": "2026-03-28",
		"type": "docs",
		"slug": "agents-command-workflows",
		"title": "Updated AGENTS.md to match the current package scripts, removed the stale dev:once and HMR guidance, and replaced the...",
		"body": "Updated AGENTS.md to match the current package scripts, removed the stale dev:once and HMR guidance, and replaced the incorrect no-linter note with the real lint workflow."
	},
	{
		"date": "2026-03-28",
		"type": "fix",
		"slug": "current-custom-title",
		"title": "Fixed `dev3 current` so it shows the effective task title, including `customTitle` overrides set by `dev3 task update...",
		"body": "Fixed `dev3 current` so it shows the effective task title, including `customTitle` overrides set by `dev3 task update --title`. Added CLI tests covering both live-socket and offline output paths to prevent regressions."
	},
	{
		"date": "2026-03-28",
		"type": "fix",
		"slug": "task-image-drag-drop",
		"title": "Fixed task description, notes, and terminal image drag-and-drop to upload the dropped file directly instead of relyin...",
		"body": "Fixed task description, notes, and terminal image drag-and-drop to upload the dropped file directly instead of relying on Spotlight path resolution. Non-image drops still use filename resolution as a fallback, and uploaded images now preserve the correct file extension."
	},
	{
		"date": "2026-03-28",
		"type": "fix",
		"slug": "trivy-empty-pr-comment",
		"title": "Stop posting or updating the Trivy PR comment when the scan report is clean",
		"body": "Stop posting or updating the Trivy PR comment when the scan report is clean. The workflow now deletes any stale Trivy comment after a clean scan, so PRs stop generating useless notification spam."
	},
	{
		"date": "2026-03-27",
		"type": "chore",
		"slug": "add-trivy-github-scan",
		"title": "Add the same Trivy filesystem scan used in the neighboring repository to the pull request build workflow",
		"body": "Add the same Trivy filesystem scan used in the neighboring repository to the pull request build workflow. The scan now runs in parallel with the other PR checks and posts or updates a PR comment with a markdown summary table."
	},
	{
		"date": "2026-03-27",
		"type": "feature",
		"slug": "blocking-setup-startup-mode",
		"title": "Added a configurable setup startup order so projects can wait for `Setup Script` to finish before the initial agent p...",
		"body": "Added a configurable setup startup order so projects can wait for `Setup Script` to finish before the initial agent prompt starts. The project settings UI now exposes parallel vs blocking startup, the tmux launch wrapper respects that mode, and runtime scripts now prefer the current project-level `.dev3/config.json` over stale worktree copies.",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/383",
		"issueRef": "#383"
	},
	{
		"date": "2026-03-27",
		"type": "feature",
		"slug": "codex-worktree-hooks",
		"title": "Codex tasks now install worktree-local dev3 hooks and enable the `codex_hooks` feature automatically, so `in-progress...",
		"body": "Codex tasks now install worktree-local dev3 hooks and enable the `codex_hooks` feature automatically, so `in-progress` and review transitions work like Claude without relying only on manual skill instructions. Codex also gets a hook-aware dev3 skill plus a launch-time fallback reminder for `user-questions` and older sessions."
	},
	{
		"date": "2026-03-27",
		"type": "chore",
		"slug": "ignore-codex-local-state",
		"title": "Ignore only `.codex/hooks.json` so the Codex hook config created during agent sessions does not show up as untracked ...",
		"body": "Ignore only `.codex/hooks.json` so the Codex hook config created during agent sessions does not show up as untracked worktree noise without hiding other future `.codex` files."
	},
	{
		"date": "2026-03-27",
		"type": "chore",
		"slug": "skill-port-mapping-docs",
		"title": "Improved the dev3-project-config skill with mandatory port discovery and mapping instructions (step 3a)",
		"body": "Improved the dev3-project-config skill with mandatory port discovery and mapping instructions (step 3a). Agents now must inspect the repo's actual dev/runtime configuration, wire DEV3_PORT0..N into proven project port settings, and avoid guessing generic framework env vars when the repo does not prove the mapping."
	},
	{
		"date": "2026-03-26",
		"type": "fix",
		"slug": "extra-key-bar-desktop",
		"title": "Fixed ExtraKeyBar (Esc, Ctrl, Tab, Enter, arrow buttons) showing on desktop browsers in remote/web mode",
		"body": "Fixed ExtraKeyBar (Esc, Ctrl, Tab, Enter, arrow buttons) showing on desktop browsers in remote/web mode. The bar now uses touch capability detection (navigator.maxTouchPoints) instead of screen width, so it only appears on actual touch devices (phones, tablets) where a physical keyboard is unavailable. Also added a \"Session Expired\" screen for browser remote access when the QR token is invalid or expired, replacing the infinite loading spinner. Disabled aggressive caching for remote access static files to prevent stale bundles on mobile browsers. Added a 5-second timeout to getAppVersion to prevent blocking on mobile when WebSocket isn't connected. QR code in the Remote Access modal now visually fades out and shows \"Connected\" when a client connects, with the Copy URL button disabled — auto-refresh of QR codes stops immediately."
	},
	{
		"date": "2026-03-26",
		"type": "feature",
		"slug": "opencode-presets",
		"title": "Added Oh My OpenCode as a built-in agent with 12 presets covering Sisyphus (orchestrator), Prometheus (planner), Atla...",
		"body": "Added Oh My OpenCode as a built-in agent with 12 presets covering Sisyphus (orchestrator), Prometheus (planner), Atlas (executor), Hephaestus (deep worker) agents, plus simple model-only presets for Haiku 4.5, GPT-5.4 Mini, and Big Pickle (free). OpenCode uses --prompt flag for prompt injection and --agent for agent selection, with --continue for session resume. Non-Claude agents now receive a generic system prompt instructing manual status management instead of the Claude-specific hooks message. Skills are also installed to ~/.config/opencode/skills/ for proper priority. Added cross-instance task status sync: when data changes in one dev-3.0 instance, a lightweight _notify message is broadcast to all other running instances via their Unix sockets, keeping all UIs in sync. Added build info (version, git commit hash, build time) to `dev3 current` and `dev3 --version` output for easier debugging."
	},
	{
		"date": "2026-03-26",
		"type": "fix",
		"slug": "shift-enter-esc-cr",
		"title": "Fix Shift+Enter not inserting newline in Claude Code 2.1.82+",
		"body": "Fix Shift+Enter not inserting newline in Claude Code 2.1.82+. Claude Code stopped recognizing raw LF (0x0a) as \"insert newline\" in the input prompt. Switched the Shift+Enter sequence from `\\n` to `\\x1b\\r` (ESC+CR), which Claude Code reliably recognizes through tmux."
	},
	{
		"date": "2026-03-25",
		"type": "fix",
		"slug": "browser-rpc-transport-bugs",
		"title": "Fix three bugs in the browser WebSocket RPC transport: (1) `trySend` retry loop now stops when a request times out or...",
		"body": "Fix three bugs in the browser WebSocket RPC transport: (1) `trySend` retry loop now stops when a request times out or is resolved, preventing indefinite timer accumulation; (2) WebSocket no longer attempts to reconnect when the session token is absent (auth failure), stopping an infinite 401 reconnect loop; (3) `uploadImageBase64` RPC method is now declared in `AppRPCSchema` so TypeScript can type-check callers. Also fixed a non-null assertion on a potentially undefined network interface list in `getLocalIp()`."
	},
	{
		"date": "2026-03-25",
		"type": "feature",
		"slug": "copy-worktree-path",
		"title": "Added a copy-to-clipboard button for the worktree path in three places: a folder+clipboard icon in the collapsed task...",
		"body": "Added a copy-to-clipboard button for the worktree path in three places: a folder+clipboard icon in the collapsed task header bar (next to branch name), a clipboard icon next to the worktree path in the expanded info panel, and a \"Copy Path\" item in the right-click context menu on task cards. Also fixed the terminal preview popover overlapping the context menu."
	},
	{
		"date": "2026-03-25",
		"type": "feature",
		"slug": "global-diff-tool-setting",
		"title": "Add a global \"Default Diff Tool\" setting in Global Settings",
		"body": "Add a global \"Default Diff Tool\" setting in Global Settings. Users can choose between Git terminal diff (default), VS Code, IntelliJ IDEA, WebStorm, Kaleidoscope, Beyond Compare, FileMerge, Meld, or a custom command as their diff viewer. Available tools are auto-detected on PATH; unavailable ones are greyed out. Custom commands use $LOCAL/$REMOTE placeholders for the base and changed file versions."
	},
	{
		"date": "2026-03-25",
		"type": "feature",
		"slug": "prevent-sleep-caffeinate",
		"title": "Added a global \"Prevent Sleep\" setting that keeps your system awake while agents are running",
		"body": "Added a global \"Prevent Sleep\" setting that keeps your system awake while agents are running. Uses caffeinate on macOS and systemd-inhibit on Linux. Enabled by default when a supported tool is found on PATH. Includes a 1-hour safety timeout — the poll cycle restarts it automatically if agents are still active.",
		"suggestedBy": "aidanpraidw",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/384",
		"issueRef": "#384"
	},
	{
		"date": "2026-03-25",
		"type": "feature",
		"slug": "session-recovery",
		"title": "Agent sessions now survive app restarts, tmux crashes, and quit/relaunch cycles",
		"body": "Agent sessions now survive app restarts, tmux crashes, and quit/relaunch cycles. Session IDs are pre-assigned at launch time via Claude's --session-id flag and persisted to the task JSON immediately. When you reopen a task whose tmux session is gone but has a stored session ID, you'll see a \"Resume or Start Fresh\" prompt instead of a blank terminal."
	},
	{
		"date": "2026-03-23",
		"type": "fix",
		"slug": "cow-clone-paths-phantom",
		"title": "Fixed Clone Paths (CoW) not being copied into worktrees",
		"body": "Fixed Clone Paths (CoW) not being copied into worktrees. The `sanitizeConfigPaths` function was creating phantom `clonePaths: []` entries in config files even when clone paths were never configured, which shadowed project-level values via the `??` cascade. Also hardened `resolveProjectConfig` and `getConfigSources` to treat empty arrays from file-based configs as \"not configured\" so they fall through to lower-priority layers.",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/378",
		"issueRef": "#378"
	},
	{
		"date": "2026-03-22",
		"type": "chore",
		"slug": "claude-presets-skip-permissions",
		"title": "Replaced all default Claude agent presets with a clean set covering every permission mode (default, plan, bypass, aut...",
		"body": "Replaced all default Claude agent presets with a clean set covering every permission mode (default, plan, bypass, auto, acceptEdits, dontAsk), each paired with `--dangerously-skip-permissions`. Default model changed from Sonnet to Opus 1M; all Sonnet variants upgraded to 1M context. Removed redundant \"Plan then Bypass\" presets. Added \"auto\" to PermissionMode type and permission mode dropdown in settings UI. Fixed config merge to clean up deprecated preset IDs, preserve default ordering, and reset names on version bumps."
	},
	{
		"date": "2026-03-19",
		"type": "fix",
		"slug": "compact-column-header-icons",
		"title": "Kanban column header icons (rename, info, count, collapse) are now always visible instead of only appearing on hover",
		"body": "Kanban column header icons (rename, info, count, collapse) are now always visible instead of only appearing on hover. Header layout restructured into a single flex row with reduced padding and smaller icon sizes, preventing long column names like \"Agent is Working\" from wrapping to a second line."
	},
	{
		"date": "2026-03-19",
		"type": "fix",
		"slug": "dashboard-default-tab",
		"title": "Dashboard tab preference now uses sessionStorage instead of localStorage, so the Activity tab is always shown by defa...",
		"body": "Dashboard tab preference now uses sessionStorage instead of localStorage, so the Activity tab is always shown by default when the app starts. Within a session, the selected tab is still remembered when navigating away and back."
	},
	{
		"date": "2026-03-19",
		"type": "chore",
		"slug": "expand-allowed-commands",
		"title": "Expanded `.claude/settings.json` allow list from ~12 to ~80 standard safe CLI commands, covering file utilities, sear...",
		"body": "Expanded `.claude/settings.json` allow list from ~12 to ~80 standard safe CLI commands, covering file utilities, search tools, text processing, JS/Node tooling, networking, system info, process inspection, compression, hashing, file operations, and macOS utilities."
	},
	{
		"date": "2026-03-19",
		"type": "feature",
		"slug": "intellij-ultimate-open-in",
		"title": "Add IntelliJ IDEA Ultimate to the \"Open in...\" menu",
		"body": "Add IntelliJ IDEA Ultimate to the \"Open in...\" menu. The existing entries only covered \"IntelliJ IDEA\" (generic) and \"IntelliJ IDEA CE\" (Community Edition), but JetBrains Toolbox installs the app as \"IntelliJ IDEA Ultimate\" which was not detected."
	},
	{
		"date": "2026-03-19",
		"type": "fix",
		"slug": "layout-even-buttons-swapped",
		"title": "Fix swapped layout buttons: the \"even horizontal\" icon (rows) was sending tmux `even-horizontal` (columns) and vice v...",
		"body": "Fix swapped layout buttons: the \"even horizontal\" icon (rows) was sending tmux `even-horizontal` (columns) and vice versa. Swapped the tmux layout names so each button matches its icon."
	},
	{
		"date": "2026-03-19",
		"type": "feature",
		"slug": "project-terminal-ux",
		"title": "Improved project terminal UX: added Cmd+` keyboard shortcut to toggle the terminal from any project screen, a visible...",
		"body": "Improved project terminal UX: added Cmd+` keyboard shortcut to toggle the terminal from any project screen, a visible \"Terminal\" button in the header actions area (with active state highlight), and a \"Back to Board\" toolbar at the top of the terminal screen. Removed the tiny breadcrumb icon that was previously the only entry point."
	},
	{
		"date": "2026-03-19",
		"type": "feature",
		"slug": "task-watch-notifications",
		"title": "Added per-task watch with macOS notifications",
		"body": "Added per-task watch with macOS notifications. Click the bell icon on any task card to opt-in to native notifications when the task status changes. Off by default.",
		"suggestedBy": "AchiaRifman",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/288",
		"issueRef": "#288"
	},
	{
		"date": "2026-03-19",
		"type": "docs",
		"slug": "test-instructions-rule",
		"title": "Added mandatory \"Test instructions\" rule to AGENTS.md",
		"body": "Added mandatory \"Test instructions\" rule to AGENTS.md. Every task must now end with a TL;DR section listing step-by-step verification instructions covering the entire task scope, not just the latest change."
	},
	{
		"date": "2026-03-19",
		"type": "feature",
		"slug": "tmux-next-layout",
		"title": "Redesigned the tmux pane control bar with custom SVG icons and expanded it from 4 to 10 buttons",
		"body": "Redesigned the tmux pane control bar with custom SVG icons and expanded it from 4 to 10 buttons. New layout preset buttons (tiled, even-rows, even-columns, main+bottom, main+right), a close-pane button, a fullscreen/zoom button, and a cycle-layouts button. All icons feature multi-color SVGs with green accents for additive actions and red for destructive. Layout keyboard shortcuts (⌃B M-1 through M-5) added to the hints popover."
	},
	{
		"date": "2026-03-19",
		"type": "feature",
		"slug": "tmux-resource-usage",
		"title": "Display aggregated CPU and memory (RSS) usage for each active tmux session",
		"body": "Display aggregated CPU and memory (RSS) usage for each active tmux session. Resource badges appear on task cards, in the task info panel, and in the tmux sessions popover.",
		"suggestedBy": "user",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/344",
		"issueRef": "#344"
	},
	{
		"date": "2026-03-19",
		"type": "fix",
		"slug": "tmux-session-raw-id",
		"title": "Fixed orphaned tmux sessions showing a raw `dev3-XXXXXXXX` name with no title or navigation in the tmux session manager",
		"body": "Fixed orphaned tmux sessions showing a raw `dev3-XXXXXXXX` name with no title or navigation in the tmux session manager. Root cause: `deleteTask` only killed the tmux session for active tasks, leaving zombie sessions when completed/cancelled tasks were deleted. Now `deleteTask` always attempts a best-effort session kill regardless of status. The UI also shows an \"orphaned\" badge and strips the `dev3-` prefix for sessions whose task data no longer exists."
	},
	{
		"date": "2026-03-19",
		"type": "fix",
		"slug": "watch-indicator-ux",
		"title": "Moved the watch toggle for non-active task cards (todo, completed, cancelled) into the labels row instead of a separa...",
		"body": "Moved the watch toggle for non-active task cards (todo, completed, cancelled) into the labels row instead of a separate row. This eliminates the empty line that appeared on cards when the watch button was hidden (opacity-0) but still occupied vertical space."
	},
	{
		"date": "2026-03-18",
		"type": "fix",
		"slug": "ai-review-empty-prompt",
		"title": "Fixed AI review agent launching without a prompt when builtinColumnAgents config has empty prompt field",
		"body": "Fixed AI review agent launching without a prompt when builtinColumnAgents config has empty prompt field. The normalizeReviewPrompt function intentionally saves empty string for default prompts, but triggerColumnAgentIfNeeded was not falling back to DEFAULT_REVIEW_PROMPT when the config object existed with an empty prompt. Now each field (agentId, configId, prompt) is individually defaulted."
	},
	{
		"date": "2026-03-18",
		"type": "fix",
		"slug": "autoupdate-and-terminal-route",
		"title": "Auto-update download retry now uses exponential backoff (500ms to 30s) instead of a single 1-second retry, giving Ele...",
		"body": "Auto-update download retry now uses exponential backoff (500ms to 30s) instead of a single 1-second retry, giving Electrobun more time to finalize the update state. Project terminal is now a proper route (`project-terminal`) instead of a localStorage toggle, fixing incorrect page restore after update-restart and enabling proper back/forward navigation."
	},
	{
		"date": "2026-03-18",
		"type": "fix",
		"slug": "project-terminal-click",
		"title": "Fix project terminal sessions in the tmux session popover not responding to clicks",
		"body": "Fix project terminal sessions in the tmux session popover not responding to clicks. Added role=\"button\" and tabIndex for WKWebView accessibility, changed copy-attach button from full-width flex to inline-flex so it no longer captures clicks intended for the session row. Added comprehensive component tests for TmuxSessionManager."
	},
	{
		"date": "2026-03-18",
		"type": "fix",
		"slug": "split-pane-pwd",
		"title": "Fixed project terminal split panes opening in the wrong directory",
		"body": "Fixed project terminal split panes opening in the wrong directory. New panes were inheriting the tmux server's start directory (e.g. the app bundle path) instead of the project root. Added `-c` flag to all `split-window` calls in `setupProjectLayout` so every pane starts in the correct project directory."
	},
	{
		"date": "2026-03-18",
		"type": "feature",
		"slug": "tmux-theme-switching",
		"title": "Add tmux theme switching with Catppuccin palettes",
		"body": "Add tmux theme switching with Catppuccin palettes. Dark theme uses Catppuccin Mocha, light theme uses Catppuccin Latte. Switching the app theme now also updates all tmux sessions via source-file. The tmux config also sources system and user tmux.conf files on startup to preserve personal keybindings. Added double pane border lines styled with the theme's surface_2 color.\r\n\r\nCustom shell prompt for dev3 terminals: shows short worktree-relative paths (./src/bun instead of the full absolute path) and git branch in the prompt. Works with both zsh and bash via a ZDOTDIR wrapper that sources the user's own shell config first."
	},
	{
		"date": "2026-03-17",
		"type": "fix",
		"slug": "automatic-ai-review-toggle",
		"title": "Fixed the broken AI Review project setting so turning it off is now saved correctly in repo config and local override...",
		"body": "Fixed the broken AI Review project setting so turning it off is now saved correctly in repo config and local overrides instead of silently reopening as enabled and continuing to auto-review tasks. Added a separate automatic-review opt-in so manual drag-to-review in the AI Review column still works independently, fixed the variant-launch and PTY-restore paths to honor the resolved automatic-review setting, restored type-safe persistence for `autoReviewEnabled`, removed extra launch-prompt instructions so Claude relies on its deterministic review hooks instead of redundant `review-by-ai` text, simplified the new Project Settings logic, made the UI wording explicit that automatic AI review is optional and can be slow and costly, fixed the project settings dirty banner so it clears immediately after a successful save, and moved the automatic AI review toggle into the shared ConfigForm so it is also available in Worktree Config (Repo Config and Local Overrides tabs).",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/336",
		"issueRef": "#336"
	},
	{
		"date": "2026-03-17",
		"type": "chore",
		"slug": "branch-naming-prefix",
		"title": "Updated default branch naming convention to use project-prefixed types (e.g",
		"body": "Updated default branch naming convention to use project-prefixed types (e.g. `feat/dev3-`, `fix/dev3-`, `chore/dev-3`). Removed branch naming rules from AGENTS.md — they now live exclusively in the injected agent skill."
	},
	{
		"date": "2026-03-17",
		"type": "chore",
		"slug": "opus-model-name",
		"title": "Updated Claude Opus model name in presets from \"opus\" to \"opus[1m]\" to match the new model identifier",
		"body": "Updated Claude Opus model name in presets from \"opus\" to \"opus[1m]\" to match the new model identifier. Existing users will also receive the update via the version bump mechanism — model is now reset alongside additionalArgs when preset version increases."
	},
	{
		"date": "2026-03-17",
		"type": "feature",
		"slug": "project-terminal",
		"title": "Add project-level terminal: a persistent shell session rooted at the project's git directory, accessible from the Kan...",
		"body": "Add project-level terminal: a persistent shell session rooted at the project's git directory, accessible from the Kanban board toolbar and Dashboard project cards. Uses the same tmux + ghostty-web infrastructure as task terminals. One session per project, persists across navigation, reconnects seamlessly.",
		"suggestedBy": "h0x91b",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/335",
		"issueRef": "#335"
	},
	{
		"date": "2026-03-17",
		"type": "fix",
		"slug": "rpc-timeout-unhandled-rejection",
		"title": "Fix unhandled RPC timeout rejections with enriched error context",
		"body": "Fix unhandled RPC timeout rejections with enriched error context. Added a Proxy wrapper around `api.request` in the renderer that catches Electrobun's generic \"RPC request timed out\" and re-throws with the method name (e.g. `RPC \"getBranchStatus\" timed out (120 000 ms)`). Added try-catch to unprotected call sites (App.tsx, TerminalView.tsx, AddProjectModal.tsx, GlobalSettings.tsx) so timeout errors are properly handled instead of becoming unhandled rejections."
	},
	{
		"date": "2026-03-17",
		"type": "fix",
		"slug": "setup-script-variants",
		"title": "Fixed setup script not running when tasks are launched via spawnVariants or addAttempts",
		"body": "Fixed setup script not running when tasks are launched via spawnVariants or addAttempts. These code paths passed the raw project object (with empty setupScript) to launchTaskPty instead of resolving the .dev3/config.json first. Now both paths call resolveProjectConfig from the worktree, matching the behavior of activateTask."
	},
	{
		"date": "2026-03-17",
		"type": "fix",
		"slug": "tmux-session-title-refresh",
		"title": "Fixed tmux session list showing stale task titles after rename",
		"body": "Fixed tmux session list showing stale task titles after rename. The list now uses `getTaskTitle()` (which respects `customTitle`) instead of the auto-generated `title`. Also added `rpc:taskUpdated` event listener so titles refresh immediately when a task is renamed, without waiting for the 30-second poll."
	},
	{
		"date": "2026-03-17",
		"type": "fix",
		"slug": "tmux-terminal-flickering",
		"title": "Reduce terminal flickering when viewing running tasks by adding PTY data batching (~60fps instead of per-byte forward...",
		"body": "Reduce terminal flickering when viewing running tasks by adding PTY data batching (~60fps instead of per-byte forwarding), terminal write batching via requestAnimationFrame on the renderer side, improved reconnection (clear screen before injecting captured pane), and optimized tmux config with synchronized output (DEC 2026), extended keys, focus events, RGB terminal overrides, and 250k scrollback buffer. These changes dramatically reduce WS message count and ghostty-web render passes during high-output AI agent sessions.",
		"suggestedBy": "AboMokh-Wix",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/234",
		"issueRef": "#234"
	},
	{
		"date": "2026-03-17",
		"type": "fix",
		"slug": "todo-title-edit",
		"title": "Fixed title editing for ToDo tasks in the task detail modal",
		"body": "Fixed title editing for ToDo tasks in the task detail modal. The rename pencil icon is now always visible (previously hidden until hover), and clicking the title text itself starts rename mode.",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/340",
		"issueRef": "#340"
	},
	{
		"date": "2026-03-16",
		"type": "feature",
		"slug": "agent-binary-detection",
		"title": "Agent binary detection: the app now checks whether each agent CLI (Claude, Codex, Gemini, Cursor Agent) is installed ...",
		"body": "Agent binary detection: the app now checks whether each agent CLI (Claude, Codex, Gemini, Cursor Agent) is installed and shows the status in Global Settings with green/red badges. Missing agents display install commands with a copy button and a custom path input. When launching a task with a missing agent, a friendly error page with retry support replaces the cryptic \"exit code 127\". Resolved binary paths are auto-saved to settings so the app finds agents even with minimal PATH in the .app bundle.",
		"suggestedBy": "arsenyp",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/342",
		"issueRef": "#342"
	},
	{
		"date": "2026-03-16",
		"type": "feature",
		"slug": "auto-dev3-bash-permission",
		"title": "When Claude Code hooks are installed in a worktree, the `Bash(dev3:*)` permission is now automatically added to `.cla...",
		"body": "When Claude Code hooks are installed in a worktree, the `Bash(dev3:*)` permission is now automatically added to `.claude/settings.local.json`. This allows the dev3 skill's Bash commands to run without manual approval."
	},
	{
		"date": "2026-03-16",
		"type": "refactor",
		"slug": "project-config-architecture",
		"title": "Refactored project configuration into a clean 4-level hierarchy: worktree local (.dev3/config.local.json) > worktree ...",
		"body": "Refactored project configuration into a clean 4-level hierarchy: worktree local (.dev3/config.local.json) > worktree repo (.dev3/config.json) > app-level (~/.dev3.0/data/<slug>/config.json) > projects.json > defaults. Project Settings now has three tabs: Board (labels/columns), Project Config (app-level), and Worktree Config (per-task overrides with auto-commit). Fixed #336 where disabling AI Review didn't persist across app restarts. Fixed #341 where dev server ignored worktree-local config overrides. Added a gear icon button in the task panel for quick access to worktree settings.",
		"suggestedBy": "roiros",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/336",
		"issueRef": "#336"
	},
	{
		"date": "2026-03-16",
		"type": "fix",
		"slug": "remove-taskid-from-hooks",
		"title": "Removed hardcoded task IDs from Claude Code hook commands",
		"body": "Removed hardcoded task IDs from Claude Code hook commands. The hooks now use `dev3 task move --status X` without a task ID — the CLI auto-detects the current task from the worktree context. This eliminates noisy diffs in `.claude/settings.local.json` when switching between tasks and simplifies the hook generation code by removing the `taskId` parameter from `buildClaudeHooks`, `mergeClaudeHooks`, `writeClaudeHooks`, and `setupAgentHooks`."
	},
	{
		"date": "2026-03-15",
		"type": "fix",
		"slug": "hook-review-resume",
		"title": "Fixed UserPromptSubmit/PreToolUse hooks not moving tasks from \"Your Review\" back to \"Agent is Working\" when the user ...",
		"body": "Fixed UserPromptSubmit/PreToolUse hooks not moving tasks from \"Your Review\" back to \"Agent is Working\" when the user leaves feedback and the agent resumes. The `--if-status-not` guard now only excludes `review-by-ai` (the AI review agent), allowing the primary agent to correctly transition out of `review-by-user`."
	},
	{
		"date": "2026-03-15",
		"type": "feature",
		"slug": "port-allocation",
		"title": "Added per-task port allocation",
		"body": "Added per-task port allocation. When `portCount` is set in project config, free TCP/UDP ports from the 10000–20000 range are allocated for each task and injected as `$DEV3_PORT0`, `$DEV3_PORT1`, `$DEV3_PORTS`, and `$DEV3_PORT_COUNT` environment variables. Ports are propagated to tmux sessions, dev server scripts, and spawned agents, and released when tasks complete.",
		"suggestedBy": "roiros",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/328",
		"issueRef": "#328"
	},
	{
		"date": "2026-03-15",
		"type": "fix",
		"slug": "port-detection-dev-server",
		"title": "Fixed port detection not finding ports opened by dev server sessions",
		"body": "Fixed port detection not finding ports opened by dev server sessions. The port scanner only scanned the main task tmux session (`dev3-*`) but dev servers run in a separate session (`dev3-dev-*`). Now `collectTaskPids` also collects PIDs from the corresponding dev server session, so ports from `runDevServer` are properly detected and shown in the UI."
	},
	{
		"date": "2026-03-15",
		"type": "feature",
		"slug": "project-diff-compare-default",
		"title": "Projects can now store a default diff comparison target in `.dev3/config.json` or `.dev3/config.local.json`, so branc...",
		"body": "Projects can now store a default diff comparison target in `.dev3/config.json` or `.dev3/config.local.json`, so branch status, rebase, and Show Diff start from the preferred remote or local base branch automatically. Project Settings now uses filterable branch pickers for the base branch and compare ref, and new repos auto-pick `main`/`master` vs `origin/main`/`origin/master` from recent git activity before saving that exact ref. Fixed a bug where a `defaultCompareRef` saved via Project Settings was silently overwritten by auto-detection on every config load.",
		"suggestedBy": "bar-volovski",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/224",
		"issueRef": "#224"
	},
	{
		"date": "2026-03-15",
		"type": "feature",
		"slug": "rename-builtin-columns",
		"title": "Users can now rename standard board columns (To Do, Agent is Working, Your Review, etc.) to match their workflow term...",
		"body": "Users can now rename standard board columns (To Do, Agent is Working, Your Review, etc.) to match their workflow terminology. Double-click any column header to rename it inline. Changes are saved per-project and reflected across the board, task cards, pipeline dropdown, and sidebar.",
		"suggestedBy": "sapirch",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/285",
		"issueRef": "#285"
	},
	{
		"date": "2026-03-15",
		"type": "fix",
		"slug": "status-order-dropdown",
		"title": "Fixed \"Has Questions\" (user-questions) status appearing at the bottom of the pipeline dropdown instead of its correct...",
		"body": "Fixed \"Has Questions\" (user-questions) status appearing at the bottom of the pipeline dropdown instead of its correct position after \"Agent is Working\". The status is now part of the main pipeline stages, matching the board column order."
	},
	{
		"date": "2026-03-14",
		"type": "fix",
		"slug": "codex-default-bypass-preset",
		"title": "Changed the built-in Codex default preset to GPT-5.4 Heavy Bypass and bumped its preset version so existing stored de...",
		"body": "Changed the built-in Codex default preset to GPT-5.4 Heavy Bypass and bumped its preset version so existing stored default configs pick up the new sandbox arguments automatically. Updated tests to lock in the new default selection and naming."
	},
	{
		"date": "2026-03-14",
		"type": "feature",
		"slug": "column-agents",
		"title": "Generalized AI Review into Column Agents — any Kanban column (built-in or custom) can now auto-spawn an agent with a ...",
		"body": "Generalized AI Review into Column Agents — any Kanban column (built-in or custom) can now auto-spawn an agent with a configurable prompt when a task enters it. The primary agent always stops at \"Your Review\" (no automatic AI review); users drag tasks to \"AI Review\" manually to trigger it. Custom columns gain an optional agent config section in Project Settings."
	},
	{
		"date": "2026-03-14",
		"type": "fix",
		"slug": "custom-column-status-display",
		"title": "Fixed task info panel and task card showing the built-in status instead of the custom column name when a task is in a...",
		"body": "Fixed task info panel and task card showing the built-in status instead of the custom column name when a task is in a custom column. Also fixed the MOVE TO dropdown hiding the current custom column entirely — it now shows with a \"current\" marker, consistent with built-in statuses.",
		"suggestedBy": "barvolovski",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/311",
		"issueRef": "#311"
	},
	{
		"date": "2026-03-14",
		"type": "feature",
		"slug": "retry-task-attempts",
		"title": "Added ability to create new attempts for already running tasks",
		"body": "Added ability to create new attempts for already running tasks. Active task cards now show a \"Retry\" button that opens the same launch dialog used for initial task start, creating additional attempts with fresh worktrees using the original task description."
	},
	{
		"date": "2026-03-14",
		"type": "fix",
		"slug": "todo-column-default-open",
		"title": "The Todo column is now expanded by default on the Kanban board",
		"body": "The Todo column is now expanded by default on the Kanban board. Previously it was collapsed along with Completed and Cancelled, making new tasks less visible."
	},
	{
		"date": "2026-03-14",
		"type": "feature",
		"slug": "update-dialog-countdown",
		"title": "The silent update toast now shows a 5-minute (300s) countdown",
		"body": "The silent update toast now shows a 5-minute (300s) countdown. If the user doesn't click \"Postpone\", the app auto-restarts to apply the update. The current page is saved before restart and restored on next launch, so the user picks up right where they left off."
	},
	{
		"date": "2026-03-14",
		"type": "fix",
		"slug": "updater-ready-race",
		"title": "Fixed a race condition in the auto-updater where the app would notify the user that an update was ready to apply, but...",
		"body": "Fixed a race condition in the auto-updater where the app would notify the user that an update was ready to apply, but Electrobun's internal `updateReady` flag hadn't been set yet. Clicking \"Apply\" would silently fail. The updater now verifies the ready state after download and retries via `checkForUpdate()` before reporting success."
	},
	{
		"date": "2026-03-14",
		"type": "feature",
		"slug": "worktree-sparse-checkout",
		"title": "Added Worktree File Filter in Project Settings",
		"body": "Added Worktree File Filter in Project Settings. For large monorepos, users can now toggle off \"Include All Files\" and specify which directories to check out into worktrees using git sparse-checkout (cone mode). This dramatically speeds up worktree creation and saves disk space when only a subset of the repository is needed. Also added unsaved changes guard — navigating away from project settings now prompts to save or discard, with a sticky Save banner at the top when the form is dirty.",
		"suggestedBy": "nickhudkins",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/315",
		"issueRef": "#315"
	},
	{
		"date": "2026-03-13",
		"type": "feature",
		"slug": "async-task-launch",
		"title": "Task launch is now non-blocking: clicking \"Launch\" closes the modal immediately and shows the task card with a prepar...",
		"body": "Task launch is now non-blocking: clicking \"Launch\" closes the modal immediately and shows the task card with a preparing spinner. Worktree creation, CoW cloning, and PTY setup run in the background. This eliminates UI freezes on large monorepos where worktree operations can take minutes."
	},
	{
		"date": "2026-03-13",
		"type": "feature",
		"slug": "gemini-trust-presets",
		"title": "Add Gemini CLI auto-trust and configuration presets",
		"body": "Add Gemini CLI auto-trust and configuration presets. New worktrees are automatically registered in ~/.gemini/trustedFolders.json, eliminating the trust dialog. Gemini now has 9 presets across three model tiers (3.1 Pro, 3 Flash, 3.1 Flash Lite) with approval mode mapping (default, plan, yolo, auto_edit)."
	},
	{
		"date": "2026-03-13",
		"type": "feature",
		"slug": "iterm-toggle-in-tmux-hints",
		"title": "Added iTerm2 compatibility toggle to the tmux shortcuts popover (the ⓘ info button in the task panel header)",
		"body": "Added iTerm2 compatibility toggle to the tmux shortcuts popover (the ⓘ info button in the task panel header). Users can now enable or disable the iTerm2 keymap preset directly from the hints tooltip without navigating to global settings."
	},
	{
		"date": "2026-03-13",
		"type": "fix",
		"slug": "mini-pipeline-badges",
		"title": "Removed the side-branch badge overlay from the compact status pipeline so the mini pipeline only shows stage dots",
		"body": "Removed the side-branch badge overlay from the compact status pipeline so the mini pipeline only shows stage dots.\r\nAdded a regression test to keep question and cancel markers from reappearing in the mini pipeline."
	},
	{
		"date": "2026-03-13",
		"type": "fix",
		"slug": "pr-icon-overflow",
		"title": "Adjusted the task card footer layout so PR badges and other actions wrap instead of forcing horizontal board scroll",
		"body": "Adjusted the task card footer layout so PR badges and other actions wrap instead of forcing horizontal board scroll. Added a regression test to lock in the overflow-safe footer structure."
	},
	{
		"date": "2026-03-13",
		"type": "feature",
		"slug": "repo-local-config",
		"title": "Project settings (setup/dev/cleanup scripts, clone paths, base branch, peer review toggle) now live exclusively in `....",
		"body": "Project settings (setup/dev/cleanup scripts, clone paths, base branch, peer review toggle) now live exclusively in `.dev3/config.json` (shared, committed to git) and `.dev3/config.local.json` (personal, git-ignored). Settings in `projects.json` are no longer used — that file only stores project metadata. Existing settings are auto-migrated to `.dev3/config.json` on first load. Project Settings UI has two tabs: \"Repo Config\" and \"Local Overrides\". A `dev3-project-config` agent skill teaches AI agents about the config schema and when to create/modify these files. Config is now correctly resolved from the active worktree (not just project root), so `.dev3/config.json` created on a feature branch is visible to the Dev Server button and CLI. The disabled Dev Server button now shows a clickable hint popover with a copy-pasteable prompt to tell your AI agent to configure the dev script. Also added an \"Install dev3 CLI\" button in Global Settings for developers to symlink the CLI from the current app instance.",
		"suggestedBy": "Aviv-Rosental",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/249",
		"issueRef": "#249"
	},
	{
		"date": "2026-03-13",
		"type": "feature",
		"slug": "spawn-agent-button",
		"title": "Added a \"Spawn Agent\" button in the task info panel that opens a modal to select an agent and configuration, then spa...",
		"body": "Added a \"Spawn Agent\" button in the task info panel that opens a modal to select an agent and configuration, then spawns it in a new vertical tmux pane within the same task session. This makes multi-agent workflows discoverable without needing to know tmux commands. Also extracted the Select component from LaunchVariantsModal into a reusable shared component.",
		"suggestedBy": "bfrfrr",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/250",
		"issueRef": "#250"
	},
	{
		"date": "2026-03-13",
		"type": "fix",
		"slug": "stale-presets-version",
		"title": "Added version-based preset update mechanism for agent configurations",
		"body": "Added version-based preset update mechanism for agent configurations. When a default preset's version is bumped, stored `additionalArgs` are reset to the new defaults while preserving user-editable fields (model, permissionMode, effort, etc.). All Codex presets set to version 2, which forces a one-time reset of stale cached args (e.g. old `--full-auto` flags) to the current defaults."
	},
	{
		"date": "2026-03-13",
		"type": "fix",
		"slug": "tmux-backslash-binding",
		"title": "Make the bundled tmux config use String.raw so the backslash split binding is emitted as a literal `bind \\\\ split-win...",
		"body": "Make the bundled tmux config use String.raw so the backslash split binding is emitted as a literal `bind \\\\ split-window ...` line. Added a regression test for the generated config text and kept the shift-keys e2e tmux fixture in sync."
	},
	{
		"date": "2026-03-12",
		"type": "fix",
		"slug": "changelog-date-sort",
		"title": "Fixed changelog date groups appearing out of order",
		"body": "Fixed changelog date groups appearing out of order. The type-based sort (feature before fix) was breaking Map insertion order, causing some dates to display below older ones instead of in descending chronological order."
	},
	{
		"date": "2026-03-12",
		"type": "fix",
		"slug": "codex-sandbox-permissions",
		"title": "Temporarily disable Codex sandbox via `--sandbox never` flag on all Codex configurations to work around a breaking ch...",
		"body": "Temporarily disable Codex sandbox via `--sandbox never` flag on all Codex configurations to work around a breaking change in Codex 0.114+ where `[permissions]` requires `default_permissions`. Removed the `[permissions.network]` config.toml patching that was causing startup failures. Fixed default agent config merge logic so that updated defaults (model, args) propagate to existing users who haven't explicitly customized those fields. Model placeholder in settings now shows agent-appropriate examples.",
		"suggestedBy": "hagamitu-wix",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/275",
		"issueRef": "#275"
	},
	{
		"date": "2026-03-12",
		"type": "fix",
		"slug": "codex-workspace-permissions-syntax",
		"title": "Rewrite Codex sandbox integration with dedicated `[permissions.dev3]` and `[profiles.dev3]` profiles using absolute p...",
		"body": "Rewrite Codex sandbox integration with dedicated `[permissions.dev3]` and `[profiles.dev3]` profiles using absolute paths. Fix CLI context detection when sandbox rewrites HOME=/tmp. Add shell=\"/bin/bash\" hint to dev3 skill description and AGENTS.md for Codex agents (env-level SHELL doesn't work). Restructure Codex presets: non-bypass use `-a on-request` (not `--full-auto` which bypasses permission profiles), bypass presets keep `--sandbox danger-full-access`."
	},
	{
		"date": "2026-03-12",
		"type": "feature",
		"slug": "column-load-more",
		"title": "Kanban columns now show only the 15 most recent tasks by default",
		"body": "Kanban columns now show only the 15 most recent tasks by default. A \"Show more\" button at the bottom reveals the rest, and a \"Show less\" button collapses them back, improving rendering performance for columns with hundreds of tasks."
	},
	{
		"date": "2026-03-12",
		"type": "fix",
		"slug": "dashboard-tab-persistence",
		"title": "Dashboard now remembers the active tab (Activity/Projects) in localStorage",
		"body": "Dashboard now remembers the active tab (Activity/Projects) in localStorage. Navigation state replaced single previousRoute with a full route history stack (capped at 15 entries), enabling future back/forward navigation. Changelog Escape key now uses goBack() for proper history traversal.",
		"suggestedBy": "avivros007",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/289",
		"issueRef": "#289"
	},
	{
		"date": "2026-03-12",
		"type": "fix",
		"slug": "exclude-binary-from-diff-stats",
		"title": "Fixed binary files (images, etc.) being counted in uncommitted diff line statistics",
		"body": "Fixed binary files (images, etc.) being counted in uncommitted diff line statistics. Binary files and files larger than 1 MB are now excluded from untracked file line counting, preventing inflated +/- numbers and reducing memory usage from loading large binary files into memory."
	},
	{
		"date": "2026-03-12",
		"type": "fix",
		"slug": "fork-branch-colon-search",
		"title": "Branch selector now finds fork branches when using GitHub's colon notation (e.g., \"user:feat/branch\")",
		"body": "Branch selector now finds fork branches when using GitHub's colon notation (e.g., \"user:feat/branch\"). Previously only the slash format (\"user/feat/branch\") matched in the dropdown filter."
	},
	{
		"date": "2026-03-12",
		"type": "feature",
		"slug": "inline-task-rename",
		"title": "Added inline task rename in two places: the TaskInfoPanel metadata grid and the GlobalHeader breadcrumb",
		"body": "Added inline task rename in two places: the TaskInfoPanel metadata grid and the GlobalHeader breadcrumb. Both show a pencil icon on hover that opens an inline edit field. The info panel also supports reset-to-auto for custom titles. No more need to use the modal or ask the AI agent just to rename a task.",
		"suggestedBy": "sapirch",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/283",
		"issueRef": "#283"
	},
	{
		"date": "2026-03-12",
		"type": "docs",
		"slug": "landing-page-screenshots",
		"title": "Updated landing page and README with new screenshots, feature cards, and improved copy",
		"body": "Updated landing page and README with new screenshots, feature cards, and improved copy. Added Activity Dashboard and Completed column to the hero carousel with marketing captions in the window title bar. Upgraded Labels card to hero card with New Task modal screenshot. Added Dev Server and Custom Workflow feature cards. Fixed Step 2/3 text in \"How it works\" to accurately describe worktree isolation and multi-agent-per-task support. Updated README with new features (dev server, custom columns, multi-project dashboard, multiple agents per task) and added Activity Dashboard screenshot."
	},
	{
		"date": "2026-03-12",
		"type": "fix",
		"slug": "local-bin-path-fallback",
		"title": "Add ~/.local/bin and ~/bin as fallback PATH directories",
		"body": "Add ~/.local/bin and ~/bin as fallback PATH directories. Tools installed via pip, pipx, or Claude CLI installer live in ~/.local/bin, which some shell configurations don't include in PATH. The app now appends these directories (if they exist on disk) after resolving the user's shell environment, ensuring commands like `claude` are found regardless of shell config. Also renamed HOMEBREW_FALLBACK_PATHS to FALLBACK_BIN_PATHS and included user-local dirs in system requirements checks.",
		"suggestedBy": "shmulikf",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/279",
		"issueRef": "#279"
	},
	{
		"date": "2026-03-12",
		"type": "fix",
		"slug": "memory-leaks-caches-buffers",
		"title": "Fix 6 memory leaks: add size guard and cleanup on status transitions for prPromotedTasks Set, add 5-minute TTL to use...",
		"body": "Fix 6 memory leaks: add size guard and cleanup on status transitions for prPromotedTasks Set, add 5-minute TTL to useAvailableApps cache, export destroyAnalytics() for heartbeat interval cleanup, add removeFetchCache() to prune stale fetchLastSuccess entries on project deletion, cap git log -p with --max-count=500 in merge detection, and pre-check diff size via --shortstat before buffering full output in saveDiffSnapshot."
	},
	{
		"date": "2026-03-12",
		"type": "fix",
		"slug": "memory-leaks-cleanup",
		"title": "Fixed 8 memory leaks across the codebase: added mounted/cancelled checks for React components (KanbanBoard tip rotati...",
		"body": "Fixed 8 memory leaks across the codebase: added mounted/cancelled checks for React components (KanbanBoard tip rotation, TaskTerminal async IIFE, useImagePaste hook, GlobalSettings timer), added socket.destroy() in CLI error handler to prevent fd leaks, eliminated double file reads in getUncommittedChanges, wrapped monitorGitPane interval in try-catch for safe cleanup, and added TTL-based eviction for stale pane ID map entries."
	},
	{
		"date": "2026-03-12",
		"type": "fix",
		"slug": "memory-leaks-pollers-zombies",
		"title": "Fix 5 memory-related issues: add LRU eviction to ImageLightbox data URL cache (max 30 entries), add stop functions fo...",
		"body": "Fix 5 memory-related issues: add LRU eviction to ImageLightbox data URL cache (max 30 entries), add stop functions for merge/PR detection pollers to prevent interval stacking, await fire-and-forget tmux spawn calls to prevent zombie processes, and add periodic sweep to clean stale entries from mergeNotifiedTasks/prPromotedTasks Sets."
	},
	{
		"date": "2026-03-12",
		"type": "fix",
		"slug": "pipeline-cancelled-visual",
		"title": "Fixed the pipeline status indicator for cancelled tasks",
		"body": "Fixed the pipeline status indicator for cancelled tasks. Previously, cancelled tasks showed all pipeline stages as completed (dots colored through to the end), making them visually identical to completed tasks. Now cancelled renders all pipeline dots uniformly dimmed in the cancelled color, conveying \"abandoned\" without implying any progress through the stages."
	},
	{
		"date": "2026-03-12",
		"type": "feature",
		"slug": "plan-then-bypass-mode",
		"title": "Added \"Plan then Bypass\" agent configurations for Claude (Opus and Sonnet), Cursor (Opus 4.6), and Codex (GPT-5.4)",
		"body": "Added \"Plan then Bypass\" agent configurations for Claude (Opus and Sonnet), Cursor (Opus 4.6), and Codex (GPT-5.4). These configs start in plan mode so the agent presents a plan for review, then execute without per-action permission prompts once approved."
	},
	{
		"date": "2026-03-12",
		"type": "feature",
		"slug": "pr-link-on-task-card",
		"title": "Task cards on the Kanban board now display a clickable PR badge (e.g",
		"body": "Task cards on the Kanban board now display a clickable PR badge (e.g. \"PR #123\") when the task's branch has an open pull request. The info panel also shows the PR number prominently in the git status row and metadata grid. PR data is fetched once per project via `gh pr list` and refreshed every 60 seconds.",
		"suggestedBy": "sapirch",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/286",
		"issueRef": "#286"
	},
	{
		"date": "2026-03-12",
		"type": "docs",
		"slug": "prefer-teamcreate-rule",
		"title": "Added a mandatory rule to AGENTS.md instructing agents to prefer TeamCreate over sub-agents",
		"body": "Added a mandatory rule to AGENTS.md instructing agents to prefer TeamCreate over sub-agents. Fixed \"Terminal has been disposed\" error (1,529 events in Google Analytics) by adding disposal guards to mouse/wheel event handlers, properly disposing onData/onResize subscriptions, and wrapping async terminal access in try/catch. Added 6 regression tests covering all disposal race conditions."
	},
	{
		"date": "2026-03-12",
		"type": "feature",
		"slug": "separate-task-sounds",
		"title": "Different sounds now play for completed vs cancelled tasks",
		"body": "Different sounds now play for completed vs cancelled tasks. Completed tasks get a celebratory sound, while cancelled tasks keep the original notification sound.",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/262",
		"issueRef": "#262"
	},
	{
		"date": "2026-03-12",
		"type": "feature",
		"slug": "shell-after-agent-exit",
		"title": "When an AI agent exits (e.g",
		"body": "When an AI agent exits (e.g. via /exit), the terminal now drops into a live shell in the worktree instead of showing the \"Terminal session ended\" dialog. Users can run commands, switch agents, or type exit to finish. The dialog only appears when the shell itself exits.",
		"suggestedBy": "AboMokh-Wix",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/233",
		"issueRef": "#233"
	},
	{
		"date": "2026-03-12",
		"type": "feature",
		"slug": "task-search-sidebar-dashboard",
		"title": "Add search/filter capability to the task sidebar (left panel) and the Kanban board",
		"body": "Add search/filter capability to the task sidebar (left panel) and the Kanban board. The sidebar now has a compact search input that filters active tasks by name, description, #ID, or UUID. Board search now also matches PR numbers (e.g., \"PR123\" or \"#456\") via the taskPrMap data.",
		"suggestedBy": "sapirch",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/284",
		"issueRef": "#284"
	},
	{
		"date": "2026-03-12",
		"type": "feature",
		"slug": "tip-restart-task",
		"title": "Added a \"Did you know?\" tip explaining that users can restart a task from scratch by moving it to Cancelled and then ...",
		"body": "Added a \"Did you know?\" tip explaining that users can restart a task from scratch by moving it to Cancelled and then back to Todo, which spawns a fresh worktree and agent session. Also fixed lint script to auto-generate changelog-bundled.ts in fresh worktrees (same pattern as build-info.generated.ts).",
		"suggestedBy": "hagamitu-wix",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/276",
		"issueRef": "#276"
	},
	{
		"date": "2026-03-11",
		"type": "feature",
		"slug": "autofill-branch-on-create",
		"title": "When creating a new task, if the project's main worktree is on a non-base branch, the branch selector now auto-fills ...",
		"body": "When creating a new task, if the project's main worktree is on a non-base branch, the branch selector now auto-fills with that branch. This saves time when you've already checked out the branch you want to work on."
	},
	{
		"date": "2026-03-11",
		"type": "feature",
		"slug": "collapsible-kanban-columns",
		"title": "Kanban columns for todo, completed, and cancelled are now collapsible and collapsed by default, freeing horizontal sp...",
		"body": "Kanban columns for todo, completed, and cancelled are now collapsible and collapsed by default, freeing horizontal space for active work columns. Hover over a collapsed column to peek inside; use the pin icon in the header to keep it open. Collapsed columns still accept drag-and-drop task moves. Expanded columns auto-distribute to fill the available screen width. Collapse state persists per project in localStorage.",
		"suggestedBy": "AieatAssam",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/211",
		"issueRef": "#211"
	},
	{
		"date": "2026-03-11",
		"type": "fix",
		"slug": "create-task-modal-ux",
		"title": "Improved Create Task modal UX: ESC key now properly closes the modal without navigating away, replaced Cancel button ...",
		"body": "Improved Create Task modal UX: ESC key now properly closes the modal without navigating away, replaced Cancel button with a standard X close button in the top corner, and clicking the backdrop dismisses the dialog (with a discard confirmation if the form has unsaved input).",
		"suggestedBy": "roiros",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/210",
		"issueRef": "#210"
	},
	{
		"date": "2026-03-11",
		"type": "fix",
		"slug": "custom-columns-in-dropdowns",
		"title": "Custom columns defined in Project Settings now appear in all \"Move to\" status dropdowns (task card, task info panel, ...",
		"body": "Custom columns defined in Project Settings now appear in all \"Move to\" status dropdowns (task card, task info panel, and task detail modal). Previously they were only reachable via drag-and-drop on the Kanban board."
	},
	{
		"date": "2026-03-11",
		"type": "feature",
		"slug": "fork-branch-support",
		"title": "Support fetching branches from GitHub forks in the branch selector",
		"body": "Support fetching branches from GitHub forks in the branch selector. Type `user:branch` (e.g. `yanive:feat/cross-project-activity-tab`) in the branch field and click Fetch — the app automatically adds the fork remote, fetches the branch, and auto-selects it. The worktree creation logic now handles branches from any remote, not just origin."
	},
	{
		"date": "2026-03-11",
		"type": "chore",
		"slug": "google-ads-tag",
		"title": "Add Google Ads conversion tag (AW-1005164906) to the landing page alongside the existing Google Analytics tag, enabli...",
		"body": "Add Google Ads conversion tag (AW-1005164906) to the landing page alongside the existing Google Analytics tag, enabling ad campaign tracking and conversion measurement."
	},
	{
		"date": "2026-03-11",
		"type": "chore",
		"slug": "optimize-git-tests",
		"title": "Optimized test suite from ~65s to ~6s for local development",
		"body": "Optimized test suite from ~65s to ~6s for local development. Split monolithic git.test.ts into 4 parallel files with template repo optimization. Replaced real git with mocked spawn for thin wrapper tests. Both vitest suites (mainview + bun) now run in parallel via concurrently. Three heaviest files (git-worktree, git-merge-detection, shift-keys-e2e — ~80s combined) are excluded from `bun run test` and available via `bun run test:full` for CI/PR. Eliminated all console noise and React `act()` warnings from test output."
	},
	{
		"date": "2026-03-11",
		"type": "feature",
		"slug": "pipeline-status-dropdown",
		"title": "Replaced the flat status dropdown with a vertical pipeline visualization showing task progress through stages (Todo →...",
		"body": "Replaced the flat status dropdown with a vertical pipeline visualization showing task progress through stages (Todo → Working → AI Review → Your Review → PR Review → Completed). Added a compact horizontal mini-pipeline next to the status label on task cards and the info panel, providing at-a-glance progress tracking. Side-branch statuses (Has Questions, Cancelled) are displayed separately below the main pipeline.\r\n\r\nSuggested by @ZaxYonatan"
	},
	{
		"date": "2026-03-11",
		"type": "feature",
		"slug": "pr-awareness",
		"title": "The \"Create PR\" button in the task info panel now detects when a branch already has an open PR on GitHub",
		"body": "The \"Create PR\" button in the task info panel now detects when a branch already has an open PR on GitHub. When a PR exists, the button changes to \"Open PR\" with a green accent and opens the existing PR directly instead of trying to create a new one. PR detection happens during branch status refresh via `gh pr list`."
	},
	{
		"date": "2026-03-11",
		"type": "feature",
		"slug": "task-open-mode",
		"title": "Added a global preference for how active tasks open when clicked",
		"body": "Added a global preference for how active tasks open when clicked. Users can choose between \"Split view\" (sidebar + terminal, the default) and \"Full screen\" (terminal only, distraction-free). The setting is available in Global Settings and persists across sessions."
	},
	{
		"date": "2026-03-11",
		"type": "feature",
		"slug": "tip-cards",
		"title": "Add \"Did you know?\" tip cards to the Kanban board for feature discovery",
		"body": "Add \"Did you know?\" tip cards to the Kanban board for feature discovery. A single tip card appears in the first column with fewer than 2 tasks, visually distinct from regular task cards (dashed accent border, lightbulb icon). Tips rotate through 8 hints about agent capabilities, keyboard shortcuts, and UI features. Users can dismiss individual tips or cycle through them. Fully localized in English, Russian, and Spanish.",
		"suggestedBy": "BarVolovski",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/245",
		"issueRef": "#245"
	},
	{
		"date": "2026-03-11",
		"type": "fix",
		"slug": "tips-text-and-divider",
		"title": "Fixed split view divider double-click reset by adding a drag threshold so tiny mouse movements during a double-click ...",
		"body": "Fixed split view divider double-click reset by adding a drag threshold so tiny mouse movements during a double-click no longer start a drag. Updated the \"Rearrange board columns\" tip to clarify it applies to custom columns only. Added a new \"Task Drop Position\" tip explaining that new tasks appear at the top by default, configurable in Global Settings."
	},
	{
		"date": "2026-03-11",
		"type": "fix",
		"slug": "tmux-status-bar-clutter",
		"title": "Remove the full worktree path from the tmux status bar to reduce clutter",
		"body": "Remove the full worktree path from the tmux status bar to reduce clutter. The bar now shows only the process info, git branch name, and keyboard shortcuts — dropping the redundant and lengthy worktree filesystem path."
	},
	{
		"date": "2026-03-11",
		"type": "fix",
		"slug": "worktree-invalid-ref",
		"title": "Fix worktree creation crash when base branch does not exist (e.g., repo with no remote or misconfigured default branch)",
		"body": "Fix worktree creation crash when base branch does not exist (e.g., repo with no remote or misconfigured default branch). `getDefaultBranch()` no longer blindly returns \"master\" — it verifies the branch exists and falls back to the first available local branch. `createWorktree()` now validates the base ref before calling `git worktree add`, producing a clear error message instead of a raw git error. Added comprehensive tests for all edge cases: no-remote repos, master-only repos, empty repos, and branch mismatch scenarios.",
		"suggestedBy": "alonfrishberg52",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/213",
		"issueRef": "#213"
	},
	{
		"date": "2026-03-10",
		"type": "feature",
		"slug": "ai-review-stage",
		"title": "Implement the AI Review stage in the task lifecycle",
		"body": "Implement the AI Review stage in the task lifecycle. When an AI agent finishes working on a task, a review agent is automatically spawned in a tmux split-pane (30% width, right side) to audit the work — checking for bugs, code reuse issues, and security problems. The reviewer fixes medium/high severity issues and moves the task to User Review. AI Review is configurable per-project (agent, model, prompt) and can be disabled entirely in Project Settings. Agent hooks now support `workingTarget` option so the review agent stays in `review-by-ai` status while working (uses `--if-status` guard), and `skipSystemPrompt` to omit Kanban management instructions from review agents."
	},
	{
		"date": "2026-03-10",
		"type": "fix",
		"slug": "branch-naming-override",
		"title": "Branch naming convention changed from hardcoded `dev3/` prefix to standard type prefixes (`feat/`, `fix/`, `chore/`, ...",
		"body": "Branch naming convention changed from hardcoded `dev3/` prefix to standard type prefixes (`feat/`, `fix/`, `chore/`, `refactor/`, `docs/`). User preferences from CLAUDE.md, AGENTS.md, or auto-memory now explicitly override these defaults. Worktree cleanup logic updated to track branches by original task name rather than live prefix, so renamed branches are still cleaned up correctly.",
		"suggestedBy": "AboMokh-Wix",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/232",
		"issueRef": "#232"
	},
	{
		"date": "2026-03-10",
		"type": "feature",
		"slug": "browser-rpc-transport",
		"title": "Add browser-mode RPC transport with JWT authentication and optional Cloudflare Tunnel support",
		"body": "Add browser-mode RPC transport with JWT authentication and optional Cloudflare Tunnel support. The UI can run in any browser — scan the QR code from the header \"Remote\" button to open on your phone. Authentication uses short-lived JWT tokens (30s in QR, 30min session) with automatic refresh. Static passkey replaced with rotating tokens, replay prevention, and URL cleanup. Optional Cloudflare Tunnel integration — toggle \"Accessible from anywhere\" directly in the QR modal to get a public https URL via cloudflared. If cloudflared is not installed, the modal shows installation instructions and a recheck button."
	},
	{
		"date": "2026-03-10",
		"type": "fix",
		"slug": "changelog-empty-in-production",
		"title": "Fix changelog showing \"No changelog entries yet\" in production builds",
		"body": "Fix changelog showing \"No changelog entries yet\" in production builds. The Electrobun 1.14 upgrade changed how app resources are bundled (tar archive instead of extracted files), breaking filesystem-based changelog.json reads. Added a build-time inlined TypeScript fallback: scripts/generate-changelog.ts now also writes src/bun/changelog-bundled.ts which the Bun bundler embeds directly into main.js, bypassing the need for runtime filesystem access."
	},
	{
		"date": "2026-03-10",
		"type": "fix",
		"slug": "cli-and-tmux-improvements",
		"title": "Add --if-status-not CLI flag with comma-separated support for task move guards",
		"body": "Add --if-status-not CLI flag with comma-separated support for task move guards. Fix tmux -L dev3 missing from copy-to-clipboard command in session manager. Enforce tmux socket as non-nullable string with DEFAULT_TMUX_SOCKET constant, removing null-socket code paths. Fix worktree path escaping in setup script split command. Remove leftover console.log debug statements from data layer. Simplify agent prompts to delegate status management entirely to hooks."
	},
	{
		"date": "2026-03-10",
		"type": "feature",
		"slug": "codex-curated-presets",
		"title": "Reworked the built-in Codex presets around the actual dev workflow: a planner profile, full-auto worker profiles, and...",
		"body": "Reworked the built-in Codex presets around the actual dev workflow: a planner profile, full-auto worker profiles, and a separate GPT-5.4 heavy profile that keeps confirmations enabled, all with `--search` enabled and `--no-alt-screen` for tmux-friendly inline output. Also fixed Codex command building so resume sessions no longer receive unsupported generic flags like `--permission-mode`, `--effort`, or `--max-budget-usd`, and the settings preview now matches the real command."
	},
	{
		"date": "2026-03-10",
		"type": "fix",
		"slug": "custom-column-ux",
		"title": "Improved custom column UX in project settings: the column name field now has a visible border and background so it lo...",
		"body": "Improved custom column UX in project settings: the column name field now has a visible border and background so it looks like an actual input, and both fields (\"Column name\" and \"LLM instruction\") now have clear labels above them. This prevents users from confusing the name input with the LLM instruction textarea.",
		"suggestedBy": "h0x91b",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/230",
		"issueRef": "#230"
	},
	{
		"date": "2026-03-10",
		"type": "feature",
		"slug": "disable-mobile-viewport",
		"title": "Add mobile device detection and dynamic viewport switching",
		"body": "Add mobile device detection and dynamic viewport switching. On mobile, UI screens (dashboard, settings, kanban) use native device-width viewport for future responsive adaptation, while terminal screens use fixed 1280px viewport to preserve the full desktop terminal experience. On desktop, behavior is unchanged."
	},
	{
		"date": "2026-03-10",
		"type": "fix",
		"slug": "fullpage-toggle-back",
		"title": "Fixed the Full Page toggle button in TaskInfoPanel so it acts as a proper toggle — when already in full-page mode, cl...",
		"body": "Fixed the Full Page toggle button in TaskInfoPanel so it acts as a proper toggle — when already in full-page mode, clicking the button now navigates back to the split project view instead of being a dead end.",
		"suggestedBy": "h0x91b",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/214",
		"issueRef": "#214"
	},
	{
		"date": "2026-03-10",
		"type": "feature",
		"slug": "gh-config-check-popup",
		"title": "Added startup check for GitHub CLI (gh) availability",
		"body": "Added startup check for GitHub CLI (gh) availability. If gh is not installed or not authenticated, a dismissible warning banner appears below the header explaining which features won't work (PR detection, auto-promotion to \"PR Review\" status, merge detection via GitHub). The banner includes a \"Don't show again\" checkbox to suppress it permanently."
	},
	{
		"date": "2026-03-10",
		"type": "fix",
		"slug": "git-op-pane-height",
		"title": "Set the tmux split pane for git operations (rebase, push, merge, create PR, diff) to 20% height instead of the defaul...",
		"body": "Set the tmux split pane for git operations (rebase, push, merge, create PR, diff) to 20% height instead of the default 50/50 split."
	},
	{
		"date": "2026-03-10",
		"type": "feature",
		"slug": "install-skills-command",
		"title": "Added `dev3 install-skills` CLI command that installs agent skills globally (Claude, Cursor, Codex, Gemini, OpenCode)...",
		"body": "Added `dev3 install-skills` CLI command that installs agent skills globally (Claude, Cursor, Codex, Gemini, OpenCode), updates ~/.agents/AGENTS.md, Claude permissions, and Codex config. Works without the app running, useful for debugging agent setups."
	},
	{
		"date": "2026-03-10",
		"type": "fix",
		"slug": "terminal-disposed-errors",
		"title": "Fix race condition causing \"Terminal has been destroyed\" and \"Out of bounds memory access\" errors in TerminalView",
		"body": "Fix race condition causing \"Terminal has been destroyed\" and \"Out of bounds memory access\" errors in TerminalView. WebSocket handlers (onopen, onmessage, onclose, onerror) now check the `disposed` flag before calling terminal methods, and cleanup nullifies all WS handlers (including onopen) before closing the socket to prevent callbacks from firing on a disposed WASM terminal."
	},
	{
		"date": "2026-03-10",
		"type": "fix",
		"slug": "upgrade-progress-indicator",
		"title": "Show visible progress indicator during app upgrade",
		"body": "Show visible progress indicator during app upgrade. The header bar now displays a spinner with \"Checking...\" during update checks and \"Downloading...\" during downloads — for both auto-check on startup, periodic checks, and manual \"Check for Updates\" from the menu.\r\n\r\nReported by Bar Volovski (h0x91b/dev-3.0#215)"
	},
	{
		"date": "2026-03-09",
		"type": "feature",
		"slug": "auto-approve-hook",
		"title": "Add PreToolUse hook to auto-approve safe Bash and Read operations",
		"body": "Add PreToolUse hook to auto-approve safe Bash and Read operations. Compound commands like `unset GH_TOKEN && git push` no longer prompt for permission. Also auto-approves `gh` CLI commands and reading files from `/tmp/` or `screenshots/` directories."
	},
	{
		"date": "2026-03-09",
		"type": "feature",
		"slug": "changelog-contributor-credit",
		"title": "Changelog entries now show community contributor credit when a feature or fix originated from a GitHub issue",
		"body": "Changelog entries now show community contributor credit when a feature or fix originated from a GitHub issue. The \"Suggested by @username\" line in changelog files is parsed and rendered as a linked credit badge in the changelog UI."
	},
	{
		"date": "2026-03-09",
		"type": "feature",
		"slug": "claude-code-hooks",
		"title": "Add automatic Claude Code hooks (PreToolUse, PermissionRequest, Stop) to dev-3.0 worktrees for reliable task status t...",
		"body": "Add automatic Claude Code hooks (PreToolUse, PermissionRequest, Stop) to dev-3.0 worktrees for reliable task status transitions. Hooks are injected into `.claude/settings.local.json` per-worktree at launch time. PreToolUse sets \"Agent is Working\" on every tool call, PermissionRequest moves to \"Waiting for You\" when the agent needs permission approval, and Stop moves to \"Review by User\" when the agent finishes. A new `--if-status` conditional flag was added to the CLI `task move` command. The Claude SKILL.md was simplified to acknowledge hooks handle status automatically — generic agent skills (Cursor, Codex, etc.) retain the full manual instructions."
	},
	{
		"date": "2026-03-09",
		"type": "fix",
		"slug": "create-task-from-existing-branch",
		"title": "Fix creating a task from an existing branch that is already checked out in another worktree",
		"body": "Fix creating a task from an existing branch that is already checked out in another worktree. Previously `git worktree add` would fail with \"already used by worktree\" error. Now falls back to creating a new task branch (`dev3/task-<id>`) based on the existing branch's HEAD when direct checkout is not possible.",
		"suggestedBy": "yoavf",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/189",
		"issueRef": "#189"
	},
	{
		"date": "2026-03-09",
		"type": "fix",
		"slug": "custom-column-drop-opts",
		"title": "Fix missing dropPosition option when resuming completed/cancelled tasks into custom columns",
		"body": "Fix missing dropPosition option when resuming completed/cancelled tasks into custom columns. The two custom-column resume paths (CLI socket and moveTaskToCustomColumn RPC) now pass the user's taskDropPosition setting to updateTask, matching the behavior of built-in status moves."
	},
	{
		"date": "2026-03-09",
		"type": "feature",
		"slug": "dblclick-todo-new-task",
		"title": "Double-clicking empty space in the Todo column now opens the Create Task modal",
		"body": "Double-clicking empty space in the Todo column now opens the Create Task modal. The handler only fires on the task list area and ignores clicks on existing task cards. Non-todo and custom columns are unaffected.",
		"suggestedBy": "roiros",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/191",
		"issueRef": "#191"
	},
	{
		"date": "2026-03-09",
		"type": "feature",
		"slug": "dev-server-running-dialog",
		"title": "When clicking the Dev Server button while a dev server is already running, the app now shows a dropdown menu with Res...",
		"body": "When clicking the Dev Server button while a dev server is already running, the app now shows a dropdown menu with Restart and Stop options. The dev server runs in a dedicated tmux session (`dev3-dev-<taskId>`) with a viewer pane nested inside the task session via `TMUX= tmux attach-session`. Server detection uses `tmux has-session` so it works correctly after app restarts. Dev server sessions are hidden from the tmux session manager UI and are cleaned up on task completion, cancellation, and manual stop. Fixed a restart race condition where a `trap EXIT` in the viewer pane shell could fire after the new session was already created (same name); the fix tracks the viewer pane ID explicitly and kills it before recreating the dev session."
	},
	{
		"date": "2026-03-09",
		"type": "fix",
		"slug": "escape-project-to-dashboard",
		"title": "Pressing Escape on a project's Kanban board now navigates back to the main app dashboard, consistent with other screens",
		"body": "Pressing Escape on a project's Kanban board now navigates back to the main app dashboard, consistent with other screens. Previously, Escape had no effect when viewing a project without an active task."
	},
	{
		"date": "2026-03-09",
		"type": "feature",
		"slug": "expose-task-ports",
		"title": "Detect and display listening TCP ports for each task's tmux session",
		"body": "Detect and display listening TCP ports for each task's tmux session. A background poller (10s interval) scans the PID tree of every active session using lsof, and pushes updates to the renderer on change. Ports appear as clickable badges in three locations: TaskInfoPanel (expanded section with process names), TaskCard (bottom row pills), TmuxSessionManager (session rows), and ActiveTasksSidebar (compact pills). Clicking a port opens http://localhost:<port> in the browser.",
		"suggestedBy": "nicest",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/190",
		"issueRef": "#190"
	},
	{
		"date": "2026-03-09",
		"type": "fix",
		"slug": "fallback-branch-remote-tracking",
		"title": "When creating a task from a branch that is already checked out in another worktree, the fallback task branch now auto...",
		"body": "When creating a task from a branch that is already checked out in another worktree, the fallback task branch now automatically sets up remote tracking to the original branch's remote counterpart (if it exists). This ensures `git push` goes to the right remote branch without requiring manual `--set-upstream` configuration."
	},
	{
		"date": "2026-03-09",
		"type": "feature",
		"slug": "intellij-open-in",
		"title": "Added IntelliJ IDEA, IntelliJ IDEA CE, Zed, and Sublime Text to the default list of external apps in the \"Open in...\"...",
		"body": "Added IntelliJ IDEA, IntelliJ IDEA CE, Zed, and Sublime Text to the default list of external apps in the \"Open in...\" context menu, each with a distinctive Nerd Font icon.",
		"suggestedBy": "AboMokh-Wix",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/158",
		"issueRef": "#158"
	},
	{
		"date": "2026-03-09",
		"type": "fix",
		"slug": "kanban-column-colors",
		"title": "Fix duplicate green colors in Kanban board columns",
		"body": "Fix duplicate green colors in Kanban board columns. AI Review is now gray (neutral \"waiting\" state) and PR Review is now purple, ensuring all columns have visually distinct colors. Light theme colors upgraded from muted Tailwind-600 shades to vivid saturated hues, with increased glow alpha for stronger column presence on white backgrounds."
	},
	{
		"date": "2026-03-09",
		"type": "fix",
		"slug": "new-project-task-creation",
		"title": "Fix task creation failing silently for new projects",
		"body": "Fix task creation failing silently for new projects. The mkdir-based file lock assumed the parent directory already existed, but for projects with no tasks yet the data directory was never created. Now `acquireLock` handles ENOENT by creating parent directories with `recursive: true`."
	},
	{
		"date": "2026-03-09",
		"type": "refactor",
		"slug": "rename-column-labels",
		"title": "Renamed Kanban column labels for clarity: \"Waiting for You\" → \"Has Questions\", \"Review by AI\" → \"AI Review\", \"Review ...",
		"body": "Renamed Kanban column labels for clarity: \"Waiting for You\" → \"Has Questions\", \"Review by AI\" → \"AI Review\", \"Review by You\" → \"Your Review\", \"External Review\" → \"PR Review\". Fixed column order so AI Review appears in its logical position between Has Questions and Your Review. Added info icon with description tooltip to each column header explaining its purpose."
	},
	{
		"date": "2026-03-09",
		"type": "feature",
		"slug": "review-by-colleague-column",
		"title": "Added a new built-in \"External Review\" column (status: `review-by-colleague`) that sits between \"Review by You\" and t...",
		"body": "Added a new built-in \"External Review\" column (status: `review-by-colleague`) that sits between \"Review by You\" and the terminal columns. Tasks in \"Review by You\" are automatically promoted to \"External Review\" when a background poller detects an open non-draft GitHub PR for that branch. The merge polling mechanism now also monitors tasks in this new status for merge detection. A toggle in Project Settings lets teams disable this column for projects that don't use peer code review."
	},
	{
		"date": "2026-03-09",
		"type": "fix",
		"slug": "task-create-positional",
		"title": "Fixed `task create` CLI command ignoring positional content from `@file` syntax",
		"body": "Fixed `task create` CLI command ignoring positional content from `@file` syntax. When using `dev3 task create @file.md --title \"...\"`, the file content was silently dropped instead of being used as the task description. Now positional content is used as description (when `--description` is absent) and as title source (first line, when `--title` is absent)."
	},
	{
		"date": "2026-03-09",
		"type": "fix",
		"slug": "terminal-bottom-clipping",
		"title": "Fix bottom row clipping (e.g",
		"body": "Fix bottom row clipping (e.g. tmux status bar) caused by an Electrobun/WKWebView viewport bug that loses ~29px after window resize. Added a global pb-7 padding to the app content area and a startup resize nudge to normalize the behavior. Also upgraded Electrobun to 1.14.4 and TypeScript to 5.9.3."
	},
	{
		"date": "2026-03-09",
		"type": "refactor",
		"slug": "terminal-keymap-toggle",
		"title": "Replaced the three-option terminal keymap selector (Convenient / iTerm2 / Native tmux) with a single iTerm2 compatibi...",
		"body": "Replaced the three-option terminal keymap selector (Convenient / iTerm2 / Native tmux) with a single iTerm2 compatibility toggle. The two \"no shortcuts\" options were functionally identical, and tmux native Ctrl+B shortcuts always work regardless of the setting — the only real choice is whether to also enable ⌘D/⌘W/⌘T/⌘[/] shortcuts. Legacy saved values (\"dev3\", \"tmux-native\") are normalized to \"default\" automatically. Also fixed a pre-existing bug where terminalKeymap was never read back from the backend settings file (loadSettings omitted the field), making it localStorage-only; the setting now persists correctly across app restarts."
	},
	{
		"date": "2026-03-09",
		"type": "feature",
		"slug": "tmux-session-jump-to-task",
		"title": "Clicking a tmux session row in the TmuxSessionManager popover now navigates to the corresponding task",
		"body": "Clicking a tmux session row in the TmuxSessionManager popover now navigates to the corresponding task. Sessions linked to a known task show the title in accent color and act as clickable links. Kill and copy buttons still work independently via stopPropagation.",
		"suggestedBy": "genrym",
		"issueUrl": "https://github.com/h0x91b/dev-3.0/issues/193",
		"issueRef": "#193"
	},
	{
		"date": "2026-03-09",
		"type": "fix",
		"slug": "unhandled-exceptions",
		"title": "Fix unhandled promise rejections and uncaught errors in the renderer that were flooding Google Analytics with ~8.4K a...",
		"body": "Fix unhandled promise rejections and uncaught errors in the renderer that were flooding Google Analytics with ~8.4K app_exception events. Wrapped term.write() in try/catch to suppress high-frequency ghostty-web rendering errors, added .catch() handlers to 15+ fire-and-forget api.request calls across GlobalSettings, AddProjectModal, Changelog, Dashboard, and useAvailableApps. Added local logging of renderer errors via logRendererError RPC — errors now appear in ~/.dev3.0/logs/ under the [renderer] tag for local debugging."
	},
	{
		"date": "2026-03-09",
		"type": "fix",
		"slug": "worktree-stale-base",
		"title": "Worktrees now start from the latest `origin/<baseBranch>` instead of the potentially stale local branch",
		"body": "Worktrees now start from the latest `origin/<baseBranch>` instead of the potentially stale local branch. Before this fix, creating a task could leave you behind main if the local branch hadn't been updated recently. Falls back to the local branch if fetch fails (e.g. no network)."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "ambiguous-id-prefix",
		"title": "Fix ambiguous ID prefix matching in CLI socket handlers",
		"body": "Fix ambiguous ID prefix matching in CLI socket handlers. All `startsWith`-based lookups for tasks, notes, and labels now use a shared `findByIdPrefix` helper that requires a minimum 8-character prefix and throws an error when multiple items match, instead of silently selecting the first match."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "auto-complete-on-pr-merge",
		"title": "Background merge detection: the app now polls every 60 seconds and checks if tasks in \"Review by You\" status have the...",
		"body": "Background merge detection: the app now polls every 60 seconds and checks if tasks in \"Review by You\" status have their branch changes fully merged into the base branch. When detected (via squash, rebase, or regular merge), a native dialog offers to mark the task as completed. Uses pure git comparison (no `gh` CLI dependency). Dismissed notifications don't re-trigger until the task changes status."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "breadcrumb-project-switcher",
		"title": "Added a dropdown to the project name in the breadcrumb bar for quick project switching",
		"body": "Added a dropdown to the project name in the breadcrumb bar for quick project switching. Clicking the chevron next to the project name opens a list of all projects with active task counts and keyboard shortcut hints (⌘1–⌘9). Also added Cmd+1..9 global shortcuts to switch projects by index, Slack-style. Inspired by Vlad Tansky's feedback and Ittai's keyboard shortcut suggestion (issue #160)."
	},
	{
		"date": "2026-03-08",
		"type": "docs",
		"slug": "bug-reproduce-first-rule",
		"title": "Major AGENTS.md restructuring: moved \"What is this\" to the top for context-first reading, removed \"Multi-agent workfl...",
		"body": "Major AGENTS.md restructuring: moved \"What is this\" to the top for context-first reading, removed \"Multi-agent workflow\" section, consolidated Git-related sections under a single heading, added RPC protocol and state management documentation to Architecture, replaced hardcoded worktree path with dynamic discovery via `git worktree list`, abstracted component names in \"What to test\", updated platform claim to macOS-only. Also added \"reproduce first\" bug fixing rule to Testing section."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "changelog-sort-filter",
		"title": "Changelog dialog now sorts entries by type within each date group (features first, then fixes, then the rest)",
		"body": "Changelog dialog now sorts entries by type within each date group (features first, then fixes, then the rest). Added filter buttons at the top to show only entries of a specific type, with a clear button to reset."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "clear-badge-on-complete",
		"title": "Clear the bell badge (red notification dot) when a task is moved to completed or cancelled status",
		"body": "Clear the bell badge (red notification dot) when a task is moved to completed or cancelled status. Previously the badge persisted even after task completion, which was misleading."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "cmd-h-hide-window",
		"title": "Fix Cmd+H not hiding the app on macOS",
		"body": "Fix Cmd+H not hiding the app on macOS. WKWebView (used by Electrobun) intercepts keyboard events before they reach the native menu system, so the `{ role: \"hide\" }` menu item's Cmd+H accelerator was silently swallowed. Added a JavaScript capture-phase handler that intercepts Cmd+H and calls the new `hideApp` RPC handler, which invokes `[NSApp hide:nil]` directly via Objective-C runtime FFI (no permissions required). Closes #162."
	},
	{
		"date": "2026-03-08",
		"type": "chore",
		"slug": "column-order-tests",
		"title": "Fix column order persistence: cross-column moved tasks now get proper `columnOrder` assigned immediately based on `ta...",
		"body": "Fix column order persistence: cross-column moved tasks now get proper `columnOrder` assigned immediately based on `taskDropPosition` setting (top/bottom), so their position survives app reload. Previously, cross-column moves relied on ephemeral `moveOrderMap` (lost on reload), causing tasks to jump positions. Added `dropPosition` option to `updateTask` in the data layer, wired through both RPC handler and CLI socket server. Includes 52 new tests covering reorder persistence, reload scenarios, and top/bottom mode."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "completed-task-ordering",
		"title": "Fix: tasks moved to Completed/Cancelled from the terminal view (or after merge) now respect the \"Task Drop Position\" ...",
		"body": "Fix: tasks moved to Completed/Cancelled from the terminal view (or after merge) now respect the \"Task Drop Position\" global setting. The root cause was stale `columnOrder` from a previous column persisting after status change, which overrode the `movedAt`-based positioning. columnOrder is now cleared on every status transition."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "concurrent-json-writes",
		"title": "Add file-level locking (mkdir-based atomic lock) to all JSON read-modify-write operations in the data layer",
		"body": "Add file-level locking (mkdir-based atomic lock) to all JSON read-modify-write operations in the data layer. This prevents concurrent writes from losing updates — the root cause of issue #142 (worktrees randomly disappearing). All mutator functions in data.ts (addTask, updateTask, deleteTask, addProject, removeProject, updateProject, reorderTasksInColumn, setLastPickedFolder, saveTasks, saveProjects) now serialize through withFileLock(). Includes 21 new tests: 11 for file-lock mechanics (mutual exclusion, stale recovery, timeout) and 10 for concurrent data operations (parallel addTask, mixed add/update/delete)."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "default-branch-detection",
		"title": "Fix default branch detection when adding a project",
		"body": "Fix default branch detection when adding a project. Previously, if `refs/remotes/origin/HEAD` was not set (common when a remote is added manually rather than via clone), the fallback only checked local branches and often picked the wrong one. Now the app auto-sets `origin/HEAD` via `git remote set-head --auto`, then falls back to checking remote tracking branches. Also fixed the diff view to compare against `origin/<baseBranch>` consistently with the branch status panel, and to respect the user-selected compare ref."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "diff-fetch-dedup",
		"title": "Fix unreliable diffs against main branch (#141)",
		"body": "Fix unreliable diffs against main branch (#141). Added per-project fetch deduplication with 5-second cooldown to prevent git lock contention when multiple callers (polling, git operation completion, merge detection) trigger concurrent fetches. Also added missing `fetchOrigin` call to `showDiff` handler so the tmux diff pane always uses fresh remote refs."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "diff-snapshots",
		"title": "Save periodic diff snapshots per task for recovery purposes",
		"body": "Save periodic diff snapshots per task for recovery purposes. On every branch status refresh, the full `git diff origin/main...HEAD` is saved as a `.patch` file in `{taskDir}/diffs/`. Identical diffs are deduplicated and old snapshots are pruned to keep at most 50 per task."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "diff-stats-in-status-bar",
		"title": "Show branch diff stats (files changed, lines added/removed) on the first row of the task info panel, next to the stat...",
		"body": "Show branch diff stats (files changed, lines added/removed) on the first row of the task info panel, next to the status badge. Uses `git diff --shortstat ref...HEAD` to compute total branch diff against the comparison ref, displayed with a nerd font git-compare icon. Hovering the badge shows a popover with the list of changed file names."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "duplicate-error-tracking",
		"title": "Add a guard flag to `setupErrorTracking()` in analytics to prevent duplicate window error/unhandledrejection listener...",
		"body": "Add a guard flag to `setupErrorTracking()` in analytics to prevent duplicate window error/unhandledrejection listeners from accumulating when `initAnalytics()` is called multiple times (e.g. during HMR)."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "duplicate-task-cards",
		"title": "Fix race condition where creating a new task briefly shows duplicate cards",
		"body": "Fix race condition where creating a new task briefly shows duplicate cards. Added ID deduplication check in the `addTask` reducer so a task that already exists in state is not appended again."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "enhance-google-analytics",
		"title": "Enhanced Google Analytics 4 integration with full-featured tracking: added `first_open` event for new user detection,...",
		"body": "Enhanced Google Analytics 4 integration with full-featured tracking: added `first_open` event for new user detection, `user_agent` field for automatic OS/country/device resolution in GA4 standard reports, `app_update` event on version changes, `app_exception` for global error tracking, `screen_resolution` and `language` user properties, project lifecycle events (`project_added`, `project_removed`), settings change events (`theme_changed`, `locale_changed`, `settings_changed`), and session duration in heartbeat. Heartbeat interval reduced from 1 minute to 10 minutes to reduce event noise."
	},
	{
		"date": "2026-03-08",
		"type": "refactor",
		"slug": "extract-activate-task",
		"title": "Extracted shared `activateTask()` helper in rpc-handlers.ts to deduplicate worktree creation + CoW clones + PTY launc...",
		"body": "Extracted shared `activateTask()` helper in rpc-handlers.ts to deduplicate worktree creation + CoW clones + PTY launch logic. This fixes a bug where the CLI `task.move` handler was missing `runCowClones` and `existingBranch` support when resuming tasks from completed/cancelled status. All four call sites (moveTask, createTask, moveTaskToCustomColumn in rpc-handlers, and task.move in cli-socket-server) now use the shared helper."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "hide-preview-on-drag",
		"title": "Fixed terminal preview popover not closing when drag-and-drop starts on a task card in Kanban view",
		"body": "Fixed terminal preview popover not closing when drag-and-drop starts on a task card in Kanban view. The preview now hides immediately on dragStart."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "instant-grey-on-complete",
		"title": "Task cards now grey out instantly when moved to completed/cancelled status",
		"body": "Task cards now grey out instantly when moved to completed/cancelled status. The menu-based move path now uses optimistic UI updates (like drag-and-drop already did), so the card immediately relocates to the target column with a grayscale + dimmed appearance while the heavy backend cleanup runs in the background."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "memory-leak-logger-stampede",
		"title": "Fix critical memory leak caused by three compounding issues: (1) Logger `appendToFile()` read the entire log file and...",
		"body": "Fix critical memory leak caused by three compounding issues: (1) Logger `appendToFile()` read the entire log file and rewrote it for every single line — O(n²) memory allocation that reached ~44MB/sec at peak logging rates. Replaced with `appendFileSync` and cached `mkdirSync`. (2) `getBranchStatus` RPC had no dedup — on app wake/reconnect, dozens of duplicate calls for the same task fired simultaneously, each spawning 16+ git subprocesses and reading full `git log -p` output into JS strings. Added in-flight request deduplication. (3) `isContentMergedInto` Strategy 2 stored full `git log -p` and `git diff` output as JS strings (potentially multi-MB each). Replaced with shell pipes (`git log -p | git patch-id`) so patch data never enters JS memory."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "open-in-context-menu",
		"title": "Add \"Open in...\" context menu for worktrees",
		"body": "Add \"Open in...\" context menu for worktrees. Right-click any active task card to open its worktree in Finder, VS Code, Cursor, Ghostty, iTerm, or Terminal. The menu auto-detects installed apps on macOS. Also available as a button in the TaskInfoPanel header, and per-file in the diff files popover. Custom external apps can be configured via global settings (`externalApps` field)."
	},
	{
		"date": "2026-03-08",
		"type": "chore",
		"slug": "parallelize-ci-build",
		"title": "Migrated all CI to GitHub-hosted runners, removing the self-hosted macOS dependency",
		"body": "Migrated all CI to GitHub-hosted runners, removing the self-hosted macOS dependency. PR checks (lint, test, build-check) run in parallel on ubuntu-latest. Release builds now always produce all 3 platforms (macOS ARM64, macOS Intel, Linux) on GitHub-hosted runners with per-platform node_modules caching. Removed the `full-v*` tag and `full-release` script since every `v*` release is now a full cross-platform build."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "restart-terminal-use-resume",
		"title": "Fix restart terminal to use resume command with correct agent",
		"body": "Fix restart terminal to use resume command with correct agent. When restoring a PTY session via the \"Resume Session\" button, the task's agentId and configId are now passed to launchTaskPty instead of null. This ensures the correct agent and configuration are used, and the resume flag (e.g. `claude --continue`) is applied to the right command."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "review-ai-column-position",
		"title": "Fix \"Review by AI\" column appearing at position 4 instead of the far right",
		"body": "Fix \"Review by AI\" column appearing at position 4 instead of the far right. The DEFAULT_BEFORE_CUSTOM array in KanbanBoard.tsx still had the old order — moved \"review-by-ai\" to DEFAULT_AFTER_CUSTOM (after \"cancelled\") to match the intended ALL_STATUSES order."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "review-mode-branch",
		"title": "Added \"This is a PR review\" toggle in the Create Task modal",
		"body": "Added \"This is a PR review\" toggle in the Create Task modal. When a branch is selected and review mode is enabled, the task description is pre-filled with a structured code review prompt. If the user already typed a description, the review prompt is prepended with a separator so nothing is lost. Turning off review mode restores the original text. Also fixed branch search to support queries containing \"/\" (e.g., \"origin/dev\"). Updated landing page and README with PR review mode feature and screenshot."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "sidebar-terminal-hover",
		"title": "Added terminal hover preview to the ActiveTasksSidebar",
		"body": "Added terminal hover preview to the ActiveTasksSidebar. Hovering over a task in the sidebar now shows a live terminal preview popup (same as on Kanban board cards), with 400ms delay, auto-refresh every 1s, and smart viewport positioning."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "silent-update-indicator",
		"title": "Replace intrusive update popup with silent background download and non-intrusive UI indicator",
		"body": "Replace intrusive update popup with silent background download and non-intrusive UI indicator. Updates are now downloaded silently, and a toast notification + persistent header badge inform the user when a restart is available. The indicator reassures users that all tmux terminal sessions will be preserved across the restart."
	},
	{
		"date": "2026-03-08",
		"type": "chore",
		"slug": "simplify-redundant-aliases",
		"title": "Remove redundant variable aliases: collapse `effectiveOldStatus` into `oldStatus` in cli-socket-server.ts, and conver...",
		"body": "Remove redundant variable aliases: collapse `effectiveOldStatus` into `oldStatus` in cli-socket-server.ts, and convert module-level `previousAppVersion` to a local const in analytics.ts."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "simplify-review-cleanup",
		"title": "Deduplicate projectSlug() (data.ts now imports from git.ts), cache terminal keymap preset to avoid localStorage reads...",
		"body": "Deduplicate projectSlug() (data.ts now imports from git.ts), cache terminal keymap preset to avoid localStorage reads on every keydown, fix TOCTOU in playTaskCompleteSound(), clean up in-memory pane/merge tracking state on task deletion and completion, fix wrong useCallback dependency in RequirementsCheck."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "task-complete-sound",
		"title": "Replace the `say \"task finished\"` default cleanup script with `echo \"Task finished\"`",
		"body": "Replace the `say \"task finished\"` default cleanup script with `echo \"Task finished\"`. Add a notification sound (MP3) that plays when a task is completed or cancelled. The sound can be disabled in Global Settings via a new \"Task Complete Sound\" toggle (enabled by default)."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "terminal-double-context-menu",
		"title": "Suppress native macOS context menu in the terminal area by adding `preventDefault()` on the `contextmenu` event",
		"body": "Suppress native macOS context menu in the terminal area by adding `preventDefault()` on the `contextmenu` event. Previously, right-clicking opened both the native WKWebView menu and the app's custom context menu simultaneously."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "tmux-not-found",
		"title": "Fix tmux not being detected on fresh installs where Homebrew PATH is not in the app's environment",
		"body": "Fix tmux not being detected on fresh installs where Homebrew PATH is not in the app's environment. The requirements check now falls back to common Homebrew paths (`/opt/homebrew/bin`, `/usr/local/bin`) when `which` fails, and allows users to set a custom tmux binary path directly from the requirements screen."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "tmux-session-leak",
		"title": "Fix tmux sessions leaking after task completion/cancellation",
		"body": "Fix tmux sessions leaking after task completion/cancellation. The destroySession function now always attempts to kill the tmux session on the server even when the in-memory PTY session is missing (e.g. after app restart). Switched from async fire-and-forget spawn to synchronous spawnSync for the kill-session command to ensure it completes reliably."
	},
	{
		"date": "2026-03-08",
		"type": "fix",
		"slug": "update-dropdown-z-index",
		"title": "Fix update dropdown in GlobalHeader being overlapped by Kanban columns",
		"body": "Fix update dropdown in GlobalHeader being overlapped by Kanban columns. The glass-header's backdrop-filter created a stacking context that trapped the dropdown's z-index. Added relative z-30 to the header div so it sits above the board content."
	},
	{
		"date": "2026-03-08",
		"type": "feature",
		"slug": "yazi-file-browser",
		"title": "Add yazi file browser integration",
		"body": "Add yazi file browser integration. A new \"Files\" button in the task header opens yazi in a tmux horizontal split (30% height) for navigating the worktree. The button toggles — clicking again kills the yazi pane. Yazi is added as an optional system requirement (with chafa for ASCII art image preview fallback). Tmux config updated with allow-passthrough and update-environment for future image protocol support."
	},
	{
		"date": "2026-03-07",
		"type": "feature",
		"slug": "active-tasks-sidebar",
		"title": "Add Active Tasks sidebar for split terminal view",
		"body": "Add Active Tasks sidebar for split terminal view. When viewing a terminal in split mode, the left panel now shows a focused list of active tasks (in-progress, user-questions, review-by-ai, review-by-user) instead of the full 7-column Kanban board. Users can toggle between the compact sidebar and the full board view. The preference is persisted to localStorage."
	},
	{
		"date": "2026-03-07",
		"type": "feature",
		"slug": "auto-allow-dev3-claude-code",
		"title": "Auto-allow dev3 CLI commands in Claude Code",
		"body": "Auto-allow dev3 CLI commands in Claude Code. The app now injects `Bash(~/.dev3.0/bin/dev3 *)` into `~/.claude/settings.json` permissions on startup, so Claude Code never prompts for approval on dev3 commands. Split agent skills into Claude-specific (with `!`command`` injection for zero tool calls at startup — `--help`, `current`, and auto `in-progress` status) and generic (for Cursor, Codex, Gemini, etc. — unchanged behavior with explicit bash calls)."
	},
	{
		"date": "2026-03-07",
		"type": "feature",
		"slug": "auto-branch-naming",
		"title": "Updated agent prompts (AGENTS.md and dev3 skill) to auto-rename opaque `dev3/task-<hash>` branches to meaningful name...",
		"body": "Updated agent prompts (AGENTS.md and dev3 skill) to auto-rename opaque `dev3/task-<hash>` branches to meaningful names derived from the task description. Agents no longer ask for permission — they rename automatically on session start."
	},
	{
		"date": "2026-03-07",
		"type": "fix",
		"slug": "card-click-while-moving",
		"title": "Prevent opening a task card (navigation or detail modal) while it is being moved to completed/cancelled",
		"body": "Prevent opening a task card (navigation or detail modal) while it is being moved to completed/cancelled. Added an `isDisabled` guard at the top of `handleClick()` in TaskCard to block interactions during async status transitions."
	},
	{
		"date": "2026-03-07",
		"type": "feature",
		"slug": "cmd-w-kill-tmux-pane",
		"title": "Add configurable terminal keymap presets: \"Convenient\" (Cmd+W kills pane), \"iTerm2\" (Cmd+W/D/Shift+D/T/[/]), and \"Nat...",
		"body": "Add configurable terminal keymap presets: \"Convenient\" (Cmd+W kills pane), \"iTerm2\" (Cmd+W/D/Shift+D/T/[/]), and \"Native tmux\" (no shortcuts). The active preset is selected in Global Settings and persisted across sessions. iTerm2 preset maps macOS shortcuts to the equivalent tmux operations (kill-pane, split-window, new-window, select-pane). Also adds nextPane, prevPane, and newWindow to the tmuxAction RPC."
	},
	{
		"date": "2026-03-07",
		"type": "fix",
		"slug": "codex-sandbox-socket",
		"title": "Fix dev3 CLI connectivity when running inside Codex seatbelt sandbox",
		"body": "Fix dev3 CLI connectivity when running inside Codex seatbelt sandbox. The sandbox blocks `process.kill(pid, 0)` signals to external processes (EPERM) and Unix socket `connect()` calls (ENOENT). Added `ensureCodexConfigFile()` that auto-patches `~/.codex/config.toml` on app startup with `[permissions.network]` settings to allowlist the dev3 socket path. Also fixed `discoverSocket()` to treat EPERM as a sandbox indicator instead of a dead process, and fixed a pre-existing bug where `task show` displayed description even when identical to title."
	},
	{
		"date": "2026-03-07",
		"type": "feature",
		"slug": "custom-columns",
		"title": "Added custom columns to the Kanban board",
		"body": "Added custom columns to the Kanban board. Each project can define project-scoped columns with a name, color, and LLM instruction (a short hint explaining when an agent should move a task there). Custom columns can be freely positioned anywhere in the board (before, between, or after built-in columns) via drag-and-drop using the handle in the column header; position is stored in `Project.columnOrder`. The `dev3 task move --status <column-id>` CLI command supports custom column IDs, and `dev3 current` shows available custom columns with their instructions. Column management UI lives in Project Settings. Moving a task from `completed` or `cancelled` into a custom column triggers the same resume logic as reopening to an active built-in status (new worktree + PTY, status set to `in-progress`).\r\n\r\nFuture idea: add `isEndState: boolean` to `CustomColumn` so that end-state custom columns (e.g. \"Blocked\", \"Won't fix\") skip the resume/worktree logic entirely when tasks are moved into them. Deferred as over-engineering for now."
	},
	{
		"date": "2026-03-07",
		"type": "fix",
		"slug": "dnd-multiple-images",
		"title": "Fixed drag-and-drop of multiple images only attaching 1-2 files instead of all",
		"body": "Fixed drag-and-drop of multiple images only attaching 1-2 files instead of all. The root cause was a race condition: parallel `resolveFilename` calls each read stale DOM state via `el.value`, and React 18 batched the resulting `setDescription` calls so only the last one survived. Switched to functional state updaters (`setValue(prev => ...)`) in both `CreateTaskModal` and `NoteItem` so each update correctly chains on the previous value."
	},
	{
		"date": "2026-03-07",
		"type": "fix",
		"slug": "duplicate-project-creation",
		"title": "Prevent duplicate project creation when the same folder path is added multiple times",
		"body": "Prevent duplicate project creation when the same folder path is added multiple times. Server-side dedup in `data.addProject()` returns the existing project instead of creating a new one (or reactivates a soft-deleted project). Client-side loading state disables the Browse button while the file dialog and addProject request are in flight."
	},
	{
		"date": "2026-03-07",
		"type": "fix",
		"slug": "escape-discard-dialog-focus",
		"title": "Pressing Escape when the discard confirmation is visible in CreateTaskModal now dismisses the confirmation (keep edit...",
		"body": "Pressing Escape when the discard confirmation is visible in CreateTaskModal now dismisses the confirmation (keep editing) instead of re-triggering it. Focus is automatically moved to the \"Keep Editing\" button when the confirmation appears, with a visible focus ring, so users can confirm or discard entirely with the keyboard."
	},
	{
		"date": "2026-03-07",
		"type": "feature",
		"slug": "github-analytics",
		"title": "Added Google Analytics (gtag.js) to the GitHub Pages landing page using the same GA4 measurement ID as the desktop app",
		"body": "Added Google Analytics (gtag.js) to the GitHub Pages landing page using the same GA4 measurement ID as the desktop app. Added a visitor counter badge (hits.seeyoufarm.com) to the bottom of README.md for basic view tracking on the GitHub repo page."
	},
	{
		"date": "2026-03-07",
		"type": "fix",
		"slug": "mdfind-tcc-prompts",
		"title": "Limit mdfind search scope to common user directories (Desktop, Downloads, Documents, etc.) instead of scanning the en...",
		"body": "Limit mdfind search scope to common user directories (Desktop, Downloads, Documents, etc.) instead of scanning the entire filesystem, reducing unwanted macOS TCC permission prompts for protected folders like Music and Photos. Also added Info.plist usage description strings for Desktop, Downloads, and Documents access via Electrobun entitlements."
	},
	{
		"date": "2026-03-07",
		"type": "feature",
		"slug": "push-and-create-pr",
		"title": "Replace disabled \"Create PR\" button with an active \"Push & Create PR\" button when the branch has unpushed commits",
		"body": "Replace disabled \"Create PR\" button with an active \"Push & Create PR\" button when the branch has unpushed commits. Clicking it pushes first, then automatically creates a PR on success — combining two steps into one click."
	},
	{
		"date": "2026-03-07",
		"type": "feature",
		"slug": "redesign-light-theme",
		"title": "Redesign light theme to premium quality",
		"body": "Redesign light theme to premium quality. Status colors now use jewel tones (deep teal, indigo, emerald, etc.) instead of neon colors that looked washed-out on white backgrounds. Background gradient is more saturated, glass effects have stronger blur and contrast, shadows use blue-tinted layers for depth, and column glow is more prominent. Added `useStatusColors()` hook and `useResolvedTheme()` hook for theme-aware color resolution across all components."
	},
	{
		"date": "2026-03-07",
		"type": "chore",
		"slug": "rename-create-task-buttons",
		"title": "Renamed \"Create\" / \"Create & Run\" buttons in the task creation modal to \"Save\" / \"Save & Start\" across all three loca...",
		"body": "Renamed \"Create\" / \"Create & Run\" buttons in the task creation modal to \"Save\" / \"Save & Start\" across all three locales (en, ru, es). Updated keyboard shortcut hints and test descriptions accordingly."
	},
	{
		"date": "2026-03-07",
		"type": "feature",
		"slug": "rename-kanban-columns",
		"title": "Renamed \"In Progress\" column to \"Agent is Working\" and \"User Questions\" to \"Waiting for You\" across all three locales...",
		"body": "Renamed \"In Progress\" column to \"Agent is Working\" and \"User Questions\" to \"Waiting for You\" across all three locales (en, ru, es). Updated STATUS_LABELS for CLI output and fixed all affected tests.\r\n\r\nAlso annotated the skill with UI display names so agents can map user instructions like \"move to agent is working\" to the correct status identifier."
	},
	{
		"date": "2026-03-07",
		"type": "chore",
		"slug": "rename-log-to-change-log",
		"title": "Rename the changelog icon label from \"Log\" to \"Change Log\" across all three locales (en, es, ru) for clarity",
		"body": "Rename the changelog icon label from \"Log\" to \"Change Log\" across all three locales (en, es, ru) for clarity."
	},
	{
		"date": "2026-03-07",
		"type": "chore",
		"slug": "reorder-review-ai-rename-review-user",
		"title": "Moved \"Review by AI\" column to the far right of the Kanban board (after Cancelled) by reordering ALL_STATUSES",
		"body": "Moved \"Review by AI\" column to the far right of the Kanban board (after Cancelled) by reordering ALL_STATUSES. Renamed \"Review by User\" to \"Review by You\" across STATUS_LABELS and all i18n translation files (en, ru, es)."
	},
	{
		"date": "2026-03-07",
		"type": "feature",
		"slug": "resume-agent-session-button",
		"title": "The \"Restart Terminal\" button shown when a tmux session dies (but the worktree is intact) now launches the agent with...",
		"body": "The \"Restart Terminal\" button shown when a tmux session dies (but the worktree is intact) now launches the agent with the resume flag (`claude --continue`, `codex resume --last`, etc.) and is renamed to \"Resume Agent Session\". This aligns it with the existing \"resume last\" convention used when reopening completed/cancelled tasks."
	},
	{
		"date": "2026-03-07",
		"type": "feature",
		"slug": "sibling-variant-visibility",
		"title": "Added sibling variant visibility on the Kanban board",
		"body": "Added sibling variant visibility on the Kanban board. When task variants (same groupId) are spread across different status columns, each card now shows colored status dots indicating where its siblings are. Clicking the dots opens a popover listing all sibling variants with their status, agent, and a navigate action to jump to them in split view."
	},
	{
		"date": "2026-03-07",
		"type": "fix",
		"slug": "task-create-description-lost",
		"title": "Fixed a bug where `dev3 task create --title \"...\" --description @file` would silently discard the description",
		"body": "Fixed a bug where `dev3 task create --title \"...\" --description @file` would silently discard the description. The CLI socket handler for `task.create` was passing the title as the description to `data.addTask()` and ignoring the actual description parameter. Now the full description is stored as the task body, and the title is saved as `customTitle`. Also fixed `--limit` in `tasks list` being sent to the server but never applied — it now works client-side. Fixed pre-existing test failures where \"In Progress\" status label was renamed to \"Agent is Working\" but tests weren't updated. Added missing handler tests for `task.update` (clearing customTitle, description-only update with existing customTitle) and `task.move` (cancelled → active reopen)."
	},
	{
		"date": "2026-03-07",
		"type": "docs",
		"slug": "update-landing-screenshots",
		"title": "Update landing page and README screenshots from v0.2.6 to v0.7.0",
		"body": "Update landing page and README screenshots from v0.2.6 to v0.7.0. Replace kanban board, terminal view, parallel agents, and project settings screenshots with fresh ones showing labels, search, multi-agent launch (Claude/Cursor/Codex/Gemini), and code diff views. Add new \"Labels & instant search\" feature card to the landing page. Update Step 2 text to highlight multi-agent launch capability. Add hero carousel (CSS + vanilla JS) cycling through 5 screenshots with progress bar, dots, prev/next buttons, pause-on-hover, and longer display time for the main kanban shot."
	},
	{
		"date": "2026-03-06",
		"type": "feature",
		"slug": "ai-title-generation-skill",
		"title": "Add title generation instructions to the dev3 agent skill",
		"body": "Add title generation instructions to the dev3 agent skill. After running `dev3 current` at session start, agents now synthesize a concise 5–8 word title and call `dev3 task update --title \"...\"` when the auto-generated title looks truncated or too long."
	},
	{
		"date": "2026-03-06",
		"type": "feature",
		"slug": "branch-selector-task-creation",
		"title": "Add optional branch selector to the Create Task modal",
		"body": "Add optional branch selector to the Create Task modal. Users can now choose an existing local or remote branch instead of always creating a new one. Includes word-boundary autocomplete filtering and a Fetch button to refresh remote branches. Multi-variant spawns create per-variant branches (e.g. feature/login-v1, -v2) from the existing branch's HEAD. User-owned branches are preserved on task completion — only dev3-created branches are deleted."
	},
	{
		"date": "2026-03-06",
		"type": "feature",
		"slug": "config-preview-card",
		"title": "Added a configuration preview card below the Default Configuration dropdown in Global Settings",
		"body": "Added a configuration preview card below the Default Configuration dropdown in Global Settings. When a user selects a configuration, the card shows key properties (model, permission mode, effort level, max budget) as tag pills plus a full command preview. This addresses issue #62 by making it clear what each configuration actually does at runtime."
	},
	{
		"date": "2026-03-06",
		"type": "feature",
		"slug": "create-pr-button",
		"title": "Add \"Create PR\" button to git operations bar in TaskInfoPanel",
		"body": "Add \"Create PR\" button to git operations bar in TaskInfoPanel. After pushing a branch, users can create a GitHub Pull Request directly from the app — it opens in the browser via `gh pr create --fill --web`. If a PR already exists, it falls back to opening it with `gh pr view --web`."
	},
	{
		"date": "2026-03-06",
		"type": "fix",
		"slug": "dev3-skill-trigger-scope",
		"title": "Narrowed the dev3 skill trigger condition to explicitly require `~/.dev3.0/worktrees/` (the dev-3.0 managed directory...",
		"body": "Narrowed the dev3 skill trigger condition to explicitly require `~/.dev3.0/worktrees/` (the dev-3.0 managed directory under $HOME) instead of matching any path containing `.dev3.0/worktrees/`. This prevents the skill from incorrectly activating when agents work in regular git worktrees or other paths that happen to contain \"worktrees\". Fixes #73."
	},
	{
		"date": "2026-03-06",
		"type": "fix",
		"slug": "drag-to-completed-latency",
		"title": "Reduced drag-to-completed latency by applying optimistic UI updates: the card now moves to the target column immediat...",
		"body": "Reduced drag-to-completed latency by applying optimistic UI updates: the card now moves to the target column immediately upon drop, showing a spinner overlay and disabled state while the backend processes worktree cleanup. On failure, the card reverts to its original position."
	},
	{
		"date": "2026-03-06",
		"type": "docs",
		"slug": "gh-auth-switch-graceful",
		"title": "Make `gh auth switch --user h0x91b` graceful for collaborators by appending `2>/dev/null || true`",
		"body": "Make `gh auth switch --user h0x91b` graceful for collaborators by appending `2>/dev/null || true`. The command now silently no-ops when the `h0x91b` account is not configured, allowing collaborators to use their own `gh` account without errors."
	},
	{
		"date": "2026-03-06",
		"type": "feature",
		"slug": "keyboard-shortcuts",
		"title": "Add standard keyboard shortcuts (Cmd+N / Ctrl+N for new task, Escape/Enter on LaunchVariantsModal, Escape on search i...",
		"body": "Add standard keyboard shortcuts (Cmd+N / Ctrl+N for new task, Escape/Enter on LaunchVariantsModal, Escape on search input to clear and blur) and align all App-level shortcuts to support both Cmd (macOS) and Ctrl (Linux/Windows). Add full keyboard shortcut test coverage across App, KanbanBoard, LabelFilterBar, ImageLightbox, CreateTaskModal, LaunchVariantsModal, and AddProjectModal."
	},
	{
		"date": "2026-03-06",
		"type": "fix",
		"slug": "lint-build-info",
		"title": "The lint script now auto-generates `build-info.generated.ts` if it's missing, so `bun run lint` works in fresh worktr...",
		"body": "The lint script now auto-generates `build-info.generated.ts` if it's missing, so `bun run lint` works in fresh worktrees without running a full build first. Removed the build-info workaround note from AGENTS.md."
	},
	{
		"date": "2026-03-06",
		"type": "feature",
		"slug": "resume-conversation-on-reopen",
		"title": "When reopening a completed or cancelled task, AI agents now resume the previous conversation instead of starting fresh",
		"body": "When reopening a completed or cancelled task, AI agents now resume the previous conversation instead of starting fresh. Supported agents: Claude (`--continue`), Codex (`resume --last`), Gemini (`--resume latest`), Cursor Agent (`--continue`). The worktree path is deterministic, so conversation history persists across task lifecycle transitions."
	},
	{
		"date": "2026-03-06",
		"type": "feature",
		"slug": "separate-task-title",
		"title": "Tasks now support a custom title independent of the auto-generated one",
		"body": "Tasks now support a custom title independent of the auto-generated one. By default, titles are still derived from the description, but users can rename a task via the detail modal (pencil icon on hover) or the CLI (`dev3 task update --title`). A \"Reset to auto\" option reverts to the auto-generated title. Addresses #70."
	},
	{
		"date": "2026-03-06",
		"type": "feature",
		"slug": "shift-keys-e2e-test",
		"title": "Add end-to-end tests verifying that all 20 Shift+key sequences survive the full terminal pipeline: ghostty-web WASM h...",
		"body": "Add end-to-end tests verifying that all 20 Shift+key sequences survive the full terminal pipeline: ghostty-web WASM handler → bytes → real PTY → tmux (with production config) → inner pane capture → assertion. Uses a Python PTY bridge helper and FIFO-based synchronization (no polling). Includes canary tests that document the ghostty-web upstream bug so we know when it gets fixed."
	},
	{
		"date": "2026-03-06",
		"type": "fix",
		"slug": "terminal-focus-on-type",
		"title": "When clicking a kanban card removes focus from the terminal, typing printable characters now automatically refocuses ...",
		"body": "When clicking a kanban card removes focus from the terminal, typing printable characters now automatically refocuses the terminal and forwards the keystroke. The fix attaches a document-level keydown listener in TerminalView that activates only when nothing meaningful has focus (activeElement === body) and a plain printable key is pressed (no Ctrl/Alt/Meta modifiers). Includes 8 new unit tests covering the happy path and all guard conditions."
	},
	{
		"date": "2026-03-06",
		"type": "feature",
		"slug": "terminal-image-paste",
		"title": "Add clipboard image paste support in the terminal",
		"body": "Add clipboard image paste support in the terminal. When the user presses Cmd+V with an image in the clipboard, the image is saved to disk and its file path is injected into the PTY — enabling seamless image sharing with AI agents like Claude Code running inside tmux."
	},
	{
		"date": "2026-03-06",
		"type": "fix",
		"slug": "terminal-input-glitches",
		"title": "Fix terminal input glitches: use streaming TextDecoder in PTY data callback to prevent U+FFFD replacement characters ...",
		"body": "Fix terminal input glitches: use streaming TextDecoder in PTY data callback to prevent U+FFFD replacement characters from split multi-byte UTF-8 sequences, and add automatic resize dance on page visibility change to fix row offset / duplicated text issues when returning to the terminal."
	},
	{
		"date": "2026-03-05",
		"type": "fix",
		"slug": "cli-codesign-notarization",
		"title": "Pre-sign the CLI binary (dist/dev3) with the Developer ID certificate before Electrobun copies it into the app bundle",
		"body": "Pre-sign the CLI binary (dist/dev3) with the Developer ID certificate before Electrobun copies it into the app bundle. Electrobun only signs binaries in Contents/MacOS/, but the CLI lives in Contents/Resources/app/cli/ — Apple notarization rejected the unsigned binary."
	},
	{
		"date": "2026-03-05",
		"type": "fix",
		"slug": "cli-missing-in-prod-build",
		"title": "Fix dev3 CLI binary missing from production builds",
		"body": "Fix dev3 CLI binary missing from production builds. The CI release workflow was missing the `bun run build:cli` step, so `dist/dev3` was never compiled and Electrobun silently skipped the missing file during bundling. Added the build step to both release.yml and build.yml workflows."
	},
	{
		"date": "2026-03-05",
		"type": "docs",
		"slug": "cow-clone-paths",
		"title": "Add Copy-on-Write clone paths feature to README.md (new bullet + screenshot) and landing page (new feature card)",
		"body": "Add Copy-on-Write clone paths feature to README.md (new bullet + screenshot) and landing page (new feature card). Screenshot saved as docs/screenshots/cow-clone-paths.jpg."
	},
	{
		"date": "2026-03-05",
		"type": "feature",
		"slug": "cow-clone-paths",
		"title": "Add Copy-on-Write file/directory cloning for worktree setup",
		"body": "Add Copy-on-Write file/directory cloning for worktree setup. Projects can now configure clone paths (e.g. `node_modules`, `.venv`) that are cloned from the root project into each worktree using APFS `clonefile(2)` on macOS (with `cp -cR` and regular copy fallbacks) or `--reflink` on Linux. Clone paths are auto-detected from a comprehensive list of well-known directories (JS, Python, Ruby, Go, Rust, Java, C++, .NET, PHP, Elixir, etc.) when a project is added. Glob patterns (`*.cache`, `src/**/node_modules`) are supported. Project Settings UI includes an Auto-detect button with feedback, which also runs automatically when clone paths are empty."
	},
	{
		"date": "2026-03-05",
		"type": "feature",
		"slug": "cursor-agent-support",
		"title": "Added Cursor Agent (`agent` CLI) as a built-in coding agent with six presets: Default/Plan/YOLO with Opus 4.6 Thinkin...",
		"body": "Added Cursor Agent (`agent` CLI) as a built-in coding agent with six presets: Default/Plan/YOLO with Opus 4.6 Thinking, GPT-5.3 Codex High, YOLO GPT-5.3 Codex, and Gemini 3.1 Pro. The dev3 skill is now also installed into `~/.cursor/skills/dev3/`. Command resolution correctly maps Cursor-specific flags (`--mode plan`, `--force`) instead of Claude-specific ones."
	},
	{
		"date": "2026-03-05",
		"type": "feature",
		"slug": "header-external-links",
		"title": "Add GitHub website and Report Bug buttons to the global header",
		"body": "Add GitHub website and Report Bug buttons to the global header. The GitHub icon opens the project landing page; the bug icon opens the GitHub Issues page for bug reporting. Both open in the system browser."
	},
	{
		"date": "2026-03-05",
		"type": "feature",
		"slug": "open-project-folder",
		"title": "Added \"Open project folder\" button to the global header that appears when inside a project",
		"body": "Added \"Open project folder\" button to the global header that appears when inside a project. Clicking it opens the project root directory in Finder (macOS) or the native file manager on other platforms."
	},
	{
		"date": "2026-03-05",
		"type": "feature",
		"slug": "pick-folder-start-dir",
		"title": "The folder picker dialog now starts from the user's home directory by default and remembers the parent of the last pi...",
		"body": "The folder picker dialog now starts from the user's home directory by default and remembers the parent of the last picked folder for subsequent uses. The preference is persisted in `preferences.json` so it survives app restarts."
	},
	{
		"date": "2026-03-05",
		"type": "fix",
		"slug": "squash-merge-detection",
		"title": "Fix false \"changes will be lost\" warning when completing a task whose PR was squash-merged while main had overlapping...",
		"body": "Fix false \"changes will be lost\" warning when completing a task whose PR was squash-merged while main had overlapping file changes. Added merge-tree comparison as primary strategy, patch-id as secondary, GitHub PR status check as tertiary (definitive), and content containment as offline fallback."
	},
	{
		"date": "2026-03-05",
		"type": "feature",
		"slug": "vertical-dnd-reorder",
		"title": "Add vertical drag-and-drop reordering within Kanban columns",
		"body": "Add vertical drag-and-drop reordering within Kanban columns. Tasks can now be dragged up and down within the same status column, and the new order persists across page reloads via a new `columnOrder` field on the Task type. A visual drop indicator (accent-colored line) shows the insertion point during drag. Variant groups move as a unit when reordered."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "agent-exit-keep-shell-alive",
		"title": "Keep tmux shell alive when agent command exits with non-zero code",
		"body": "Keep tmux shell alive when agent command exits with non-zero code. Previously, if the agent binary was not found or crashed on startup, the tmux session would immediately close, causing a misleading \"Worktree not found\" error dialog. Now `buildEchoAndRun` and `buildCmdScript` capture the exit code and fall back to an interactive bash shell on failure, matching the existing pattern used by dev server and git operation panes. Additionally, the TaskTerminal error screen now distinguishes between a dead tmux session (worktree still intact) and a truly missing worktree — showing a \"Restart Terminal\" button in the former case."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "agent-status-lifecycle",
		"title": "Rewrote the dev3 agent skill and system prompt to clarify task status lifecycle",
		"body": "Rewrote the dev3 agent skill and system prompt to clarify task status lifecycle. `in-progress` is now explicitly documented as a transient per-turn state — agents MUST move to `user-questions` or `review-by-user` at the end of every response. Also added guidance for notes, task title updates, `@file` syntax, and parallel CLI startup commands."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "ahead-behind-compare-local-main",
		"title": "Add a dropdown to the branch status bar allowing users to switch the comparison ref between origin/<baseBranch> (defa...",
		"body": "Add a dropdown to the branch status bar allowing users to switch the comparison ref between origin/<baseBranch> (default) and local <baseBranch>. The dropdown appears on the \"vs origin/main\" text. This lets users see ahead/behind relative to either the remote tracking branch or their local base branch, which is useful when local main has diverged from origin."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "at-file-syntax",
		"title": "Added @file syntax support to the CLI",
		"body": "Added @file syntax support to the CLI. Any flag value or positional argument starting with @ is now treated as a file path — the file contents replace the value. This is useful for large text content like task descriptions. Escape with @@ for literal @."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "autocapitalize-agent-inputs",
		"title": "Disable autocapitalize, autocorrect, and spellcheck on all technical input fields (base command, model, base command ...",
		"body": "Disable autocapitalize, autocorrect, and spellcheck on all technical input fields (base command, model, base command override, additional args, env vars, scripts, branch name) in GlobalSettings and ProjectSettings. WKWebView was auto-capitalizing commands like \"claude\" which broke case-sensitive CLI commands. Fixes #51."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "bell-auto-move-user-questions",
		"title": "Auto-move tasks from \"in-progress\" to \"user-questions\" when a terminal bell (BEL) is detected",
		"body": "Auto-move tasks from \"in-progress\" to \"user-questions\" when a terminal bell (BEL) is detected. Previously `handleBellAutoStatus` was a noop; now it looks up the task, checks if it's in-progress, and transitions it so the Kanban board reflects that the agent is waiting for human input."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "branch-rename-in-worktree",
		"title": "Fixed git operations (merge, unpushed count, worktree cleanup) breaking after branch rename in a worktree",
		"body": "Fixed git operations (merge, unpushed count, worktree cleanup) breaking after branch rename in a worktree. Added `getCurrentBranch()` helper that reads the live branch name from git instead of relying on the stored `task.branchName`. The `getBranchStatus` handler now auto-syncs the stored branch name when it detects a rename. Added comprehensive unit tests covering branch rename scenarios for all git functions."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "cli-install-timing",
		"title": "Fix dev3 CLI binary not found on app startup for new users",
		"body": "Fix dev3 CLI binary not found on app startup for new users. The root cause was using import.meta.dir to locate the bundled CLI binary — in production Electrobun builds, the Bun process runs from Contents/MacOS/ while bundled assets live in Contents/Resources/app/, so the relative path was wrong. Switched to the official Electrobun PATHS.VIEWS_FOLDER API which always resolves correctly. Also fixed the same bug for changelog.json resolution and moved all CLI/skill/PATH setup to run before the potentially slow resolveShellEnv()."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "cli-label-commands",
		"title": "Add CLI commands for label management: `label list`, `label create`, `label delete`, `label set`, and `label set --cl...",
		"body": "Add CLI commands for label management: `label list`, `label create`, `label delete`, `label set`, and `label set --clear`. Also add `--label` filter to `tasks list`. Corresponding CLI socket handlers added to the backend. Agent skill updated with label documentation. Fixed short label ID prefix resolution so CLI-set labels display correctly in UI. Labels now shown in TaskInfoPanel metadata grid. Added `projectUpdated` push message so label create/delete via CLI instantly updates the UI without manual refresh."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "cli-socket-server-tests",
		"title": "Added comprehensive unit tests for cli-socket-server.ts — 61 tests covering all RPC handlers (projects.list, tasks.li...",
		"body": "Added comprehensive unit tests for cli-socket-server.ts — 61 tests covering all RPC handlers (projects.list, tasks.list, task.show/create/update/move, note.add/list/delete), handleRequest dispatch with error handling, cross-project task resolution, task status transitions (active↔inactive, reopen, cleanup), startSocketServer stale socket cleanup, and stopSocketServer. Exported handleRequest for testability."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "clone-from-url",
		"title": "Add \"Clone from URL\" option when adding a new project",
		"body": "Add \"Clone from URL\" option when adding a new project. Users can now paste a git URL and the app will clone the repository automatically. The clone base directory is remembered in global settings for future use. The Add Project button now opens a modal with two tabs: \"Local Folder\" (existing flow) and \"Clone from URL\" (new). The clone directory can also be configured in Global Settings."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "completed-task-modal",
		"title": "Clicking on completed or cancelled task cards now opens a full-screen modal showing all task details: description, no...",
		"body": "Clicking on completed or cancelled task cards now opens a full-screen modal showing all task details: description, notes (with full CRUD), labels, branch info, and timestamps. The modal also includes a status dropdown to reopen/move the task back to any other status. Previously, completed/cancelled cards were unresponsive to clicks."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "completed-task-ordering",
		"title": "Fixed task ordering in completed/cancelled columns for fire-and-forget status transitions",
		"body": "Fixed task ordering in completed/cancelled columns for fire-and-forget status transitions. TaskInfoPanel (status menu + post-merge auto-complete) and TaskTerminal were dispatching tasks with stale movedAt timestamps, causing sortTasksForColumn to place them incorrectly relative to the taskDropPosition setting. Now all paths set movedAt to current time before dispatching."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "create-task-modal-close-on-click",
		"title": "Fixed CreateTaskModal closing when clicking outside the modal area",
		"body": "Fixed CreateTaskModal closing when clicking outside the modal area. The modal now closes only via the Cancel button. Added a confirmation dialog when cancelling with unsaved content (also applies to Escape key). Added tests covering the new behavior."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "dev3-cli-full-path",
		"title": "Replace bare `dev3` CLI references in agent skill content and system prompt with the full path `~/.dev3.0/bin/dev3` t...",
		"body": "Replace bare `dev3` CLI references in agent skill content and system prompt with the full path `~/.dev3.0/bin/dev3` to ensure the command works on systems where the dev3 binary is not in PATH."
	},
	{
		"date": "2026-03-04",
		"type": "chore",
		"slug": "disable-update-channel-selector",
		"title": "Disabled the update channel select in global settings",
		"body": "Disabled the update channel select in global settings. The control now renders as non-interactive (disabled + opacity-50 + cursor-not-allowed) so users cannot change it until the feature is ready."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "dynamic-window-size",
		"title": "App window now starts at 95% of the primary display's work area and is centered on screen, instead of using a hardcod...",
		"body": "App window now starts at 95% of the primary display's work area and is centered on screen, instead of using a hardcoded 1100x800 size. This ensures the window feels spacious on any display size."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "env-vars-not-reaching-agents",
		"title": "Fix environment variables not propagated to agent commands inside tmux sessions",
		"body": "Fix environment variables not propagated to agent commands inside tmux sessions. All tasks share a single tmux server (`-L dev3`), so env vars passed to the tmux client process were lost for subsequent tasks. Now env vars are exported in wrapper bash scripts and propagated via `tmux set-environment` for split panes. Also added `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` as a default env var for all Claude-based agents."
	},
	{
		"date": "2026-03-04",
		"type": "chore",
		"slug": "extract-index-utils",
		"title": "Extracted pure utility functions (getISOWeek, formatDateTime, makeTitle) from src/bun/index.ts into a dedicated src/b...",
		"body": "Extracted pure utility functions (getISOWeek, formatDateTime, makeTitle) from src/bun/index.ts into a dedicated src/bun/app-utils.ts module. Added comprehensive unit tests covering ISO week calculation edge cases, date formatting, and title generation."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "gauge-components",
		"title": "Add reusable skeuomorphic gauge (dial) component extracted from the mastodont-app financial dashboard",
		"body": "Add reusable skeuomorphic gauge (dial) component extracted from the mastodont-app financial dashboard. The `<Gauge>` component supports configurable min/max, red zone, scalable size, custom tick labels, and sweep angle. Includes an interactive demo page with presets and live controls accessible from the dashboard."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "global-settings-tests",
		"title": "Added comprehensive test coverage for GlobalSettings component (34 tests)",
		"body": "Added comprehensive test coverage for GlobalSettings component (34 tests). Covers theme switching, language selection, task drop position, update channel, default agent/config selection, agent CRUD, configuration CRUD, and config field editing (model, permission mode, effort level, max budget, append prompt)."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "image-paste-attach",
		"title": "Add image paste (Cmd+V) and drag-and-drop attach support for task descriptions and notes",
		"body": "Add image paste (Cmd+V) and drag-and-drop attach support for task descriptions and notes. Pasted/dropped images are saved to a project-level uploads directory, their paths are inserted into text, and any image paths found in text render as clickable thumbnails with a fullscreen lightbox preview. Images are loaded via base64 RPC to work around WKWebView file:// restrictions."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "kanban-bottom-padding",
		"title": "Increased bottom padding of the Kanban board container from 12px (pb-3) to 16px (pb-4) so task cards don't stick too ...",
		"body": "Increased bottom padding of the Kanban board container from 12px (pb-3) to 16px (pb-4) so task cards don't stick too close to the bottom window edge."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "nerd-font-symbols",
		"title": "Replace JetBrains Mono with JetBrainsMono Nerd Font Mono (Regular + Bold, woff2) as the primary terminal and monospac...",
		"body": "Replace JetBrains Mono with JetBrainsMono Nerd Font Mono (Regular + Bold, woff2) as the primary terminal and monospace UI font. This adds full Nerd Font glyph support (powerline symbols, devicons, file icons) needed by tools like yazi. Updated @font-face declarations, terminal font chain, and Tailwind mono font stack."
	},
	{
		"date": "2026-03-04",
		"type": "chore",
		"slug": "pty-server-test-coverage",
		"title": "Added comprehensive test coverage for src/bun/pty-server.ts — 43 tests covering all exported functions (tmuxArgs, cre...",
		"body": "Added comprehensive test coverage for src/bun/pty-server.ts — 43 tests covering all exported functions (tmuxArgs, createSession, destroySession, hasSession, capturePane, getSessionProjectId, getSessionSocket, getPtyPort, setOnPtyDied, setOnBell), private functions tested indirectly (handleOsc52, checkForBell, configureTmux, spawnPty), and edge cases (missing cwd, spawn failure, tmux kill failure, OSC 52 clipboard, BEL detection, Uint8Array input)."
	},
	{
		"date": "2026-03-04",
		"type": "refactor",
		"slug": "replace-rebuild-with-hard-refresh",
		"title": "Replaced \"Rebuild\" menu item (which ran vite build + copy + reload) with \"Hard Refresh\" that simply reloads the webvi...",
		"body": "Replaced \"Rebuild\" menu item (which ran vite build + copy + reload) with \"Hard Refresh\" that simply reloads the webview to the home page. Removed the now-unused spawn import and formatDateTime import from index.ts."
	},
	{
		"date": "2026-03-04",
		"type": "chore",
		"slug": "rpc-handlers-test-coverage",
		"title": "Comprehensive test coverage for src/bun/rpc-handlers.ts — expanded from 45 tests to 124, covering all RPC handlers (C...",
		"body": "Comprehensive test coverage for src/bun/rpc-handlers.ts — expanded from 45 tests to 124, covering all RPC handlers (CRUD, task lifecycle, labels, notes, git operations, updates, system requirements), pure helper functions (isActive, escapeForDoubleQuotes, buildEchoAndRun, buildCmdScript), and error paths. Also fixed a pre-existing shell injection test assertion bug."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "setup-script-exit-code",
		"title": "Fix setup script exiting with code 1 after successful completion",
		"body": "Fix setup script exiting with code 1 after successful completion. The `read -t 15` command returns 1 on timeout, and the bare `exit` inherited that code. Now explicitly exits with 0."
	},
	{
		"date": "2026-03-04",
		"type": "chore",
		"slug": "shared-types-tests",
		"title": "Added comprehensive unit tests for src/shared/types.ts covering hexToRgb, titleFromDescription, and all exported cons...",
		"body": "Added comprehensive unit tests for src/shared/types.ts covering hexToRgb, titleFromDescription, and all exported constants (ALL_STATUSES, ACTIVE_STATUSES, STATUS_LABELS, STATUS_COLORS, DEFAULT_AGENTS, LABEL_COLORS). 35 test cases total."
	},
	{
		"date": "2026-03-04",
		"type": "chore",
		"slug": "state-reducer-test-coverage",
		"title": "Added comprehensive test coverage for src/mainview/state.ts reducer — 20 new tests covering navigate (previousRoute, ...",
		"body": "Added comprehensive test coverage for src/mainview/state.ts reducer — 20 new tests covering navigate (previousRoute, bell clearing on task/split view), updateTask (all route screen types for new task auto-add), addBell (increment, suppression in task/split view), and clearBell (removal, no-op, preservation of unrelated bells). Total: 39 tests (was 19)."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "task-detail-modal",
		"title": "Add task detail modal for viewing and editing full task descriptions",
		"body": "Add task detail modal for viewing and editing full task descriptions. TODO cards open the modal on title click (replacing inline edit). Non-TODO cards with truncated descriptions show a \"Show full description\" link. The modal displays the complete description text and allows editing for TODO tasks."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "task-search",
		"title": "Add task search in the Kanban filter bar",
		"body": "Add task search in the Kanban filter bar. Searches by title, description, sequential number (#seq), and UUID (full or short prefix). The search input appears alongside label filters and supports Ctrl/Cmd+F focus shortcut."
	},
	{
		"date": "2026-03-04",
		"type": "chore",
		"slug": "taskcard-test-coverage",
		"title": "Expanded TaskCard component test coverage from 20 to 54 tests",
		"body": "Expanded TaskCard component test coverage from 20 to 54 tests. Added tests for click navigation (split view toggle), drag-and-drop, title click opening detail modal, show description button, bell badge rendering (including 9+ overflow), dismiss button visibility per status, label chips (render, add, remove), handleMove with confirmTaskCompletion/force retry/error alerts, handleDelete dispatch and error handling, isActiveInSplit styling, menu close on outside click, and delete via dropdown menu."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "taskinfopanel-tests",
		"title": "Added comprehensive test coverage for the TaskInfoPanel component (60 tests)",
		"body": "Added comprehensive test coverage for the TaskInfoPanel component (60 tests). Covers collapsed/expanded views, status dropdown transitions, notes CRUD, git action buttons (rebase/push/merge/diff), dev server button, branch status display, collapse/expand toggle, full screen navigation, and branch status polling."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "terminal-idle-detection",
		"title": "Added terminal idle detection: when a PTY session produces no output for 15 seconds, a red notification badge (+1) ap...",
		"body": "Added terminal idle detection: when a PTY session produces no output for 15 seconds, a red notification badge (+1) appears on the task card. Only triggers for tasks in \"in-progress\" status — idle terminals in other statuses are expected and ignored. Unlike the bell-based detection, idle does not auto-move the task status."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "terminal-link-open",
		"title": "Handle `new-window-open` event on the Electrobun webview so that Cmd+Click on URLs in the terminal opens them in the ...",
		"body": "Handle `new-window-open` event on the Electrobun webview so that Cmd+Click on URLs in the terminal opens them in the default browser via `Utils.openExternal()`. Previously, ghostty-web's built-in link providers called `window.open()` which silently failed in the WKWebView context."
	},
	{
		"date": "2026-03-04",
		"type": "docs",
		"slug": "testing-requirements",
		"title": "Added testing requirements to AGENTS.md: code coverage thresholds (70% overall, 85% critical modules), mandatory unit...",
		"body": "Added testing requirements to AGENTS.md: code coverage thresholds (70% overall, 85% critical modules), mandatory unit/component/e2e test categories, test writing rules, and coverage exclusions for bootstrap files."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "tmux-action-buttons",
		"title": "Made tmux hint buttons (horizontal split, vertical split, zoom) in the task info panel clickable",
		"body": "Made tmux hint buttons (horizontal split, vertical split, zoom) in the task info panel clickable. Clicking them now sends the corresponding tmux command to the active terminal session via a new `tmuxAction` RPC handler."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "tmux-command-too-long",
		"title": "Fix \"command too long\" error on terminal restart",
		"body": "Fix \"command too long\" error on terminal restart. tmux 3.x limits the shell-command for `new-session` to ~16 KB. The old `buildEchoAndRun` doubled the command (once for echo, once for execution), easily exceeding that limit for tasks with long descriptions. Now the full command is written to a temp script (`/tmp/dev3-{taskId}-run.sh`) and tmux receives just `bash \"/tmp/...\"` — always under the limit."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "tmux-kill-session-socket",
		"title": "Fix tmux session Kill button not working",
		"body": "Fix tmux session Kill button not working. The `killTmuxSession` RPC handler was targeting the default tmux server instead of the `dev3` socket where sessions actually live. Also removed the confirmation dialog from individual session kills for faster, more reliable operation."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "tmux-scroll-speed",
		"title": "Reduced tmux scroll speed by adding a deltaY accumulator with a threshold of 50px",
		"body": "Reduced tmux scroll speed by adding a deltaY accumulator with a threshold of 50px. Previously, every single WheelEvent sent one scroll line to tmux, making trackpad/high-resolution scroll feel way too fast. Now scroll events are accumulated and only sent when the threshold is reached, giving proportional but much smoother scrolling."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "todo-to-completed-transition",
		"title": "Allow tasks in \"todo\" status to transition directly to \"completed\"",
		"body": "Allow tasks in \"todo\" status to transition directly to \"completed\". Previously, todo tasks could only move to \"in-progress\" or \"cancelled\", which blocked users who accidentally moved a task back to todo from completing it. Also fixed worktree cleanup when completing a task that was moved back to todo but still had a worktree attached."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "update-channel-test",
		"title": "Fixed GlobalSettings test \"changes to canary and saves\" which was failing because the update channel select is now di...",
		"body": "Fixed GlobalSettings test \"changes to canary and saves\" which was failing because the update channel select is now disabled in the UI. Updated the test to assert the select is disabled and saveGlobalSettings is not called."
	},
	{
		"date": "2026-03-04",
		"type": "fix",
		"slug": "updater-loop",
		"title": "Fixed infinite update loop caused by missing Updater.checkForUpdate() call before downloadUpdate()",
		"body": "Fixed infinite update loop caused by missing Updater.checkForUpdate() call before downloadUpdate(). Without populating Electrobun's internal state first, downloads silently did nothing, and applyUpdate() just restarted the app without applying the new version. Added updateReady guard in applyUpdate() to prevent restart loops."
	},
	{
		"date": "2026-03-04",
		"type": "feature",
		"slug": "zoom-support",
		"title": "Add zoom in/out support for the app UI",
		"body": "Add zoom in/out support for the app UI. Users can zoom with Cmd+=/Cmd-/Cmd+0 keyboard shortcuts, via the View menu, or through the zoom control in Global Settings. Zoom level is persisted across sessions in localStorage. Uses root font-size scaling for crisp text rendering at any zoom level — all arbitrary px values converted to rem for proportional scaling. Terminal font size scales independently via ghostty-web's fontSize option with fitAddon.fit() to recalculate grid dimensions. Includes unit tests for zoom module, decision record (012), and eliminates the window.__dev3Zoom global in favor of direct ES module imports."
	},
	{
		"date": "2026-03-03",
		"type": "feature",
		"slug": "always-visible-git-buttons",
		"title": "Git action buttons (Show Diff, Uncommitted, Rebase, Push, Merge, Refresh) are now always visible in the task info pan...",
		"body": "Git action buttons (Show Diff, Uncommitted, Rebase, Push, Merge, Refresh) are now always visible in the task info panel git row. Disabled buttons show explanatory tooltips instead of being hidden. Show Diff button has accent styling for better discoverability. New \"Uncommitted\" button shows uncommitted changes diff (staged + unstaged) in a tmux pane."
	},
	{
		"date": "2026-03-03",
		"type": "feature",
		"slug": "append-system-prompt-claude",
		"title": "All Claude-based agent configurations now inject `--append-system-prompt` with a short mandatory reminder to invoke t...",
		"body": "All Claude-based agent configurations now inject `--append-system-prompt` with a short mandatory reminder to invoke the `/dev3` skill. This reinforces the existing skill installation mechanism (`~/.claude/skills/dev3/SKILL.md`) which is not always picked up reliably. The UI command preview also reflects the new flag."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "branch-status-stale-local-ref",
		"title": "Fix false \"pushed but not merged\" warning when moving a task to completed",
		"body": "Fix false \"pushed but not merged\" warning when moving a task to completed.\r\n\r\n`getBranchStatus` was comparing the task branch against the local `main` branch instead of `origin/main`. Since `git fetch origin` only updates the remote tracking ref, the local branch stayed stale after a PR was merged on GitHub. Additionally, `fetchOrigin` and `getBranchStatus` ran in parallel, so the fetch result wasn't guaranteed to be available. Fixed by awaiting the fetch first, then comparing against `origin/<baseBranch>` in both `getBranchStatus` and `mergeTask` handlers."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "cli-id-flag-and-validation",
		"title": "Fixed 8 bugs in the dev3 CLI: added --id flag support for task show/update/move; added --description flag to task cre...",
		"body": "Fixed 8 bugs in the dev3 CLI: added --id flag support for task show/update/move; added --description flag to task create; added client-side status validation for task move and tasks list; added --limit support for tasks list; added short ID resolution (8-char IDs from `tasks list` now expand to full UUIDs via context prefix match and data file fallback); added whitespace validation for task create/update --title/--description and note add content; added --limit numeric validation rejecting NaN, negative, and partial numbers."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "enforce-task-status-updates",
		"title": "Reinforced task status management requirements in both the `--append-system-prompt` injection and the dev3 skill temp...",
		"body": "Reinforced task status management requirements in both the `--append-system-prompt` injection and the dev3 skill template. The system prompt now explicitly lists the three required status transitions (`in-progress`, `user-questions`, `review-by-user`) with clear instructions, instead of only telling agents to load the skill. The skill text was also expanded with stricter rules and phase-by-phase guidance to ensure agents never skip status updates."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "homebrew-sha-mismatch",
		"title": "Fixed Homebrew cask SHA-256 mismatch caused by full-v* tags overwriting the ARM64 DMG on GitHub Release without updat...",
		"body": "Fixed Homebrew cask SHA-256 mismatch caused by full-v* tags overwriting the ARM64 DMG on GitHub Release without updating the Homebrew formula. The \"Update Homebrew Cask\" step in the release workflow now runs unconditionally for any build that produces an ARM64 DMG, not just v* tags."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "instant-navigate-on-task-completion",
		"title": "Moving a task to completed/cancelled from inside the task view now navigates back to the Kanban board instantly",
		"body": "Moving a task to completed/cancelled from inside the task view now navigates back to the Kanban board instantly. The worktree cleanup and PTY destruction happen in the background, eliminating the \"Worktree not found\" error flash that previously appeared for several seconds."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "landing-stars-badge",
		"title": "Fix GitHub stars badge on landing page showing \"INVALID\" instead of the star count",
		"body": "Fix GitHub stars badge on landing page showing \"INVALID\" instead of the star count. The shields.io `label=GitHub%20Stars` parameter was causing the issue — removed the custom label so it falls back to the default \"STARS\" text (the GitHub logo icon already indicates the source)."
	},
	{
		"date": "2026-03-03",
		"type": "chore",
		"slug": "linux-build-always",
		"title": "Include Linux x64 build in regular (v*) releases, not just full releases",
		"body": "Include Linux x64 build in regular (v*) releases, not just full releases. Only macOS Intel (x64) remains full-release-only. This makes Linux artifacts available on every tagged release at minimal cost (ubuntu-22.04 GitHub runner)."
	},
	{
		"date": "2026-03-03",
		"type": "docs",
		"slug": "remove-manual-task-notice-add-intel-builds",
		"title": "Removed the \"Task movement is currently MANUAL only\" caution notice from README and the landing page — automatic AI-d...",
		"body": "Removed the \"Task movement is currently MANUAL only\" caution notice from README and the landing page — automatic AI-driven task management is now implemented. Updated platform availability text to reflect that both Apple Silicon and Intel macOS builds are now available."
	},
	{
		"date": "2026-03-03",
		"type": "chore",
		"slug": "review-by-ai-unimplemented-reorder",
		"title": "Label the \"Review by AI\" Kanban column as \"(unimplemented)\" across all locales (en/ru/es) to indicate the feature is ...",
		"body": "Label the \"Review by AI\" Kanban column as \"(unimplemented)\" across all locales (en/ru/es) to indicate the feature is not yet built. Also reorder columns so \"Review by User\" appears before \"Review by AI\"."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "shell-escaping-tests",
		"title": "Extracted `escapeForDoubleQuotes`, `buildEchoAndRun`, and `buildCmdScript` as testable functions from `launchTaskPty(...",
		"body": "Extracted `escapeForDoubleQuotes`, `buildEchoAndRun`, and `buildCmdScript` as testable functions from `launchTaskPty()` in `rpc-handlers.ts`. Fixed the echo display wrapper to properly escape all double-quote-sensitive shell metacharacters (`\"`, `$`, `` ` ``, `\\`, `!`) instead of only double quotes. Added comprehensive unit tests covering shell escaping for task creation: `shellEscape` (20+ edge cases), `resolveAgentCommand` with special characters, `escapeForDoubleQuotes`, `buildEchoAndRun`, `buildCmdScript`, and end-to-end pipeline tests including injection attempts, unicode, and mixed special chars."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "shift-key-sequences-in-tmux",
		"title": "Fix Shift+Tab, Shift+Enter, and other Shift+functional key shortcuts not working inside tmux terminal sessions",
		"body": "Fix Shift+Tab, Shift+Enter, and other Shift+functional key shortcuts not working inside tmux terminal sessions. ghostty-web's InputHandler had a shortcut path that silently swallowed the Shift modifier for functional keys (Tab, Enter, Home, End, F1-F12, etc.), sending unmodified sequences instead. Added a custom key event handler in TerminalView that intercepts Shift+functional keys and sends correct xterm-style escape sequences. Also enabled `extended-keys always` in the tmux config so CSI u sequences (like Shift+Enter) are forwarded to inner applications."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "skill-allowed-tools",
		"title": "Remove `allowed-tools: Bash` from the dev3 agent skill template in `agent-skills.ts`",
		"body": "Remove `allowed-tools: Bash` from the dev3 agent skill template in `agent-skills.ts`. The field was restricting Claude Code to only the Bash tool when the skill was active. Without it, all tools are available per the user's normal permission settings."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "task-move-same-status",
		"title": "Moving a task to its current status via `dev3 task move` no longer returns an error",
		"body": "Moving a task to its current status via `dev3 task move` no longer returns an error. The command now exits successfully (returning the task unchanged) when the target status matches the current one."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "tasks-list-truncation",
		"title": "Fixed `dev3 tasks list` crashing with \"Invalid JSON response\" when the task list is large",
		"body": "Fixed `dev3 tasks list` crashing with \"Invalid JSON response\" when the task list is large. The root cause was Bun's `socket.write()` doing partial writes on large payloads (~8KB+), with `socket.end()` called immediately after — truncating the JSON mid-stream. Added drain-based backpressure handling on the server side, fixed UTF-8 buffer accumulation on the client side, and extracted the backpressure logic into a testable `socket-backpressure.ts` module with comprehensive unit tests."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "terminal-light-theme",
		"title": "The terminal was always rendered with a hardcoded dark (Tokyo Night) color scheme regardless of the app theme",
		"body": "The terminal was always rendered with a hardcoded dark (Tokyo Night) color scheme regardless of the app theme. Added a light terminal theme and a MutationObserver that watches `data-theme` on `<html>` to switch terminal colors automatically when the user changes the app theme."
	},
	{
		"date": "2026-03-03",
		"type": "feature",
		"slug": "warn-before-complete",
		"title": "Added a confirmation dialog when moving a task to \"completed\" or \"cancelled\" status",
		"body": "Added a confirmation dialog when moving a task to \"completed\" or \"cancelled\" status. The dialog warns about uncommitted changes, unpushed commits, and unmerged branches before the worktree is destroyed. All three UI entry points (drag-and-drop, context menu, status dropdown) now show the warning."
	},
	{
		"date": "2026-03-03",
		"type": "fix",
		"slug": "white-strip-bottom",
		"title": "Remove spurious `padding-bottom: 16px` from `body, #root` in index.css that caused a white strip at the bottom of the...",
		"body": "Remove spurious `padding-bottom: 16px` from `body, #root` in index.css that caused a white strip at the bottom of the window. Also move the gradient background from `#root`-only to the shared `body, #root` rule so the body background matches the app theme. Set the terminal container background to match the terminal theme color, hiding the ~16px right-side gap caused by ghostty-web FitAddon's hardcoded scrollbar reservation."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "agent-skill-injection",
		"title": "On every app start, dev-3.0 now installs a `dev3` skill file into all supported AI agent directories (`~/.claude/skil...",
		"body": "On every app start, dev-3.0 now installs a `dev3` skill file into all supported AI agent directories (`~/.claude/skills/dev3/`, `~/.codex/skills/dev3/`, `~/.gemini/skills/dev3/`, `~/.opencode/skills/dev3/`). The skill instructs agents to run `dev3 --help` at session start and manage task status (in-progress, user-questions, review-by-user) throughout the session. Trigger changed from `.dev3-marker` file to PWD-based detection (`.dev3.0/worktrees/` in path). Removed automatic status transitions: bell no longer auto-moves to user-questions, and opening a terminal no longer auto-moves to in-progress — status is now fully managed by the agent via `dev3 task move`."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "attempt-in-breadcrumbs",
		"title": "Show attempt number in the breadcrumb header when viewing a shell task that is a variant",
		"body": "Show attempt number in the breadcrumb header when viewing a shell task that is a variant. The breadcrumb now reads `#seq · Attempt N title` instead of just `#seq title`."
	},
	{
		"date": "2026-03-02",
		"type": "fix",
		"slug": "bump-script-args",
		"title": "Fixed `bun run bump [minor|major]` argument passing",
		"body": "Fixed `bun run bump [minor|major]` argument passing. Moved git push logic into the script so extra args don't leak into git commands. Also bumps `package.json` version alongside `electrobun.config.ts`."
	},
	{
		"date": "2026-03-02",
		"type": "fix",
		"slug": "changelog-production",
		"title": "Fixed changelog not showing in production builds",
		"body": "Fixed changelog not showing in production builds. Changelog entries are now baked into the app at build time via a generated TypeScript module, so the production app no longer depends on the change-logs/ directory existing on disk."
	},
	{
		"date": "2026-03-02",
		"type": "chore",
		"slug": "ci-cache-deps",
		"title": "Cache node_modules (arm64 and x64 separately) and x64 Bun binary in CI release workflow to speed up subsequent builds",
		"body": "Cache node_modules (arm64 and x64 separately) and x64 Bun binary in CI release workflow to speed up subsequent builds. Uses explicit cache/restore + cache/save actions to avoid arm64/x64 cross-contamination in a single job."
	},
	{
		"date": "2026-03-02",
		"type": "chore",
		"slug": "ci-parallel-jobs",
		"title": "Split release CI into three parallel-friendly jobs: build-arm64 (ARM64 runner), build-x64 (X64 runner), and release (...",
		"body": "Split release CI into three parallel-friendly jobs: build-arm64 (ARM64 runner), build-x64 (X64 runner), and release (merge + publish). arm64 and x64 builds now run simultaneously, cutting total time roughly in half. Artifacts passed between jobs via actions/upload-artifact + download-artifact."
	},
	{
		"date": "2026-03-02",
		"type": "fix",
		"slug": "cli-block-destructive-statuses",
		"title": "Block \"completed\" and \"cancelled\" statuses via CLI",
		"body": "Block \"completed\" and \"cancelled\" statuses via CLI. These statuses destroy the worktree and terminal session, so an agent running inside a worktree must not be able to accidentally kill its own session. Also rewrote the --help text to be agent-oriented with concrete use cases and examples."
	},
	{
		"date": "2026-03-02",
		"type": "fix",
		"slug": "cli-compiled-binary",
		"title": "Switch dev3 CLI from a Bun TypeScript script to a standalone compiled binary via `bun build --compile`",
		"body": "Switch dev3 CLI from a Bun TypeScript script to a standalone compiled binary via `bun build --compile`. The binary has zero runtime dependencies and is rebuilt as part of the build pipeline. On every app start the binary is copied from the app bundle to ~/.dev3.0/bin/dev3."
	},
	{
		"date": "2026-03-02",
		"type": "fix",
		"slug": "cli-push-refresh",
		"title": "CLI mutations (task create, update, move) now trigger live UI refresh",
		"body": "CLI mutations (task create, update, move) now trigger live UI refresh. Added missing pushMessage to task.create handler and made the updateTask reducer an upsert — new tasks created via CLI appear in the Kanban board without requiring a manual page reload."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "create-and-run",
		"title": "Added \"Create & Run\" button to the task creation modal",
		"body": "Added \"Create & Run\" button to the task creation modal. Users can now create a task and immediately open the launch dialog to select an agent and run it, saving the extra click of finding the task on the board and pressing \"Run\". Keyboard shortcut: Cmd+Shift+Enter (Cmd+Enter remains \"Create\" only)."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "cross-platform-ci",
		"title": "Add cross-platform release builds for Intel macOS and Linux x64",
		"body": "Add cross-platform release builds for Intel macOS and Linux x64. Tag push still builds ARM64 only (free, self-hosted). Manual workflow dispatch builds all three platforms in parallel on GitHub-hosted runners. The artifact script now accepts OS parameter and handles Linux bundles (no DMG)."
	},
	{
		"date": "2026-03-02",
		"type": "fix",
		"slug": "cyrillic-tmux-lang-env",
		"title": "Fix Cyrillic/Unicode rendering as underscores in production terminal",
		"body": "Fix Cyrillic/Unicode rendering as underscores in production terminal. Root cause: macOS .app bundles inherit a minimal environment without LANG, causing tmux to replace all non-ASCII characters with underscores. Now resolve LANG from the user's login shell alongside PATH and pass it to tmux via the PTY environment."
	},
	{
		"date": "2026-03-02",
		"type": "fix",
		"slug": "escape-passthrough-to-terminal",
		"title": "Fix Escape key being intercepted when terminal is focused instead of passing through to the terminal process",
		"body": "Fix Escape key being intercepted when terminal is focused instead of passing through to the terminal process. Added `data-terminal` attribute to the TerminalView container and skipped the global Escape handler when `document.activeElement` is inside a terminal element."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "homebrew-cask-dependencies",
		"title": "Add git and tmux as Homebrew Cask formula dependencies",
		"body": "Add git and tmux as Homebrew Cask formula dependencies. Update README and landing page with upgrade/uninstall commands and dependency info."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "homebrew-cask-support",
		"title": "Add Homebrew Cask support via personal tap `h0x91b/dev3`",
		"body": "Add Homebrew Cask support via personal tap `h0x91b/dev3`. Users can now install with `brew tap h0x91b/dev3 && brew install --cask dev3`. The release workflow automatically updates the Cask formula (version + sha256) on every new version tag."
	},
	{
		"date": "2026-03-02",
		"type": "fix",
		"slug": "kanban-split-scrollbar",
		"title": "Fixed kanban board horizontal scrollbar visibility in split view",
		"body": "Fixed kanban board horizontal scrollbar visibility in split view. The scrollbar track is now always visible with a subtle background, making it clear that more columns exist beyond the visible area. Also fixed the kanban panel flex layout so the scrollbar is never clipped by the parent container."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "keyboard-shortcuts-and-quit-dialog",
		"title": "Added Cmd+Q and Cmd+, keyboard shortcuts",
		"body": "Added Cmd+Q and Cmd+, keyboard shortcuts. Cmd+Q shows a dialog informing the user that tmux sessions keep running in the background, with a \"don't show again\" checkbox (preference persisted in localStorage); once dismissed or skipped, it calls a new `quitApp` RPC that invokes `Utils.quit()`. Cmd+, opens global settings directly from any screen. Both shortcuts use a window capture-phase listener so they fire even when the ghostty-web terminal has focus."
	},
	{
		"date": "2026-03-02",
		"type": "fix",
		"slug": "list-tmux-sessions-multi-socket",
		"title": "Fixed `listTmuxSessions` missing sessions in non-current tmux socket servers",
		"body": "Fixed `listTmuxSessions` missing sessions in non-current tmux socket servers. The Bun process inherits the `TMUX` env var of the socket it was launched in, so a bare `tmux list-sessions` only queried that server. Now queries all unique sockets found in task data (plus the default server) and merges results, deduplicating by session name."
	},
	{
		"date": "2026-03-02",
		"type": "docs",
		"slug": "one-worktree-one-changelog-rule",
		"title": "Added \"one worktree = one changelog\" rule to AGENTS.md changelog policy",
		"body": "Added \"one worktree = one changelog\" rule to AGENTS.md changelog policy. Agents must produce exactly one changelog entry per task session, updating it in place rather than creating new files per commit or feature."
	},
	{
		"date": "2026-03-02",
		"type": "chore",
		"slug": "remove-dev3-marker",
		"title": "Removed `.dev3-marker` file creation from worktree setup and all marker-based context detection from the CLI",
		"body": "Removed `.dev3-marker` file creation from worktree setup and all marker-based context detection from the CLI. The CLI now relies solely on the worktree directory path (`~/.dev3.0/worktrees/{slug}/{id}/worktree`) to resolve project and task context. Updated the `dev3` Claude Code skill to trigger based on the working directory path instead of the marker file presence."
	},
	{
		"date": "2026-03-02",
		"type": "fix",
		"slug": "remove-project-confirm",
		"title": "Fixed \"Remove project\" button on Dashboard not working",
		"body": "Fixed \"Remove project\" button on Dashboard not working. The issue was that `window.confirm()` is not supported in Electrobun's WKWebView (it silently returns `false`). Replaced with the native `api.request.showConfirm()` RPC call, consistent with how `TaskCard` already handles confirmations. Also changed project removal from hard-delete to soft-delete (`deleted: true` flag) for future recoverability."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "show-diff-button",
		"title": "Add \"Show Diff\" button to task info panel git controls",
		"body": "Add \"Show Diff\" button to task info panel git controls. Opens a vertical (side-by-side) tmux split running `git diff <baseBranch>...HEAD` piped through `less -R` for interactive browsing."
	},
	{
		"date": "2026-03-02",
		"type": "chore",
		"slug": "simplify-pr-ci-xprotect",
		"title": "Simplify PR CI workflow to lint + tests + Vite build check only",
		"body": "Simplify PR CI workflow to lint + tests + Vite build check only. Removed nightly builds (DMG, artifacts, S3 upload, PR comments) because macOS XProtect (Sequoia) silently deletes the unsigned Electrobun launcher binary, making PR build artifacts unusable. Added `scripts/fix-dmg.ts` as a workaround for future use with signed release builds."
	},
	{
		"date": "2026-03-02",
		"type": "fix",
		"slug": "spawn-variants-duplicate",
		"title": "Fix duplicate task cards appearing in Kanban after launching a variant",
		"body": "Fix duplicate task cards appearing in Kanban after launching a variant. The spawnVariants reducer now deduplicates tasks that were already added by a concurrent pushMessage(\"taskUpdated\") event, preventing the same task from showing up twice in the In-Progress column."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "split-view-kanban-terminal",
		"title": "Added split-view layout: clicking an active task card now opens the terminal alongside the Kanban board instead of na...",
		"body": "Added split-view layout: clicking an active task card now opens the terminal alongside the Kanban board instead of navigating to a full-screen terminal. The Kanban shrinks to the left (~1.5 column widths) with a resizable divider, and the terminal occupies the right side. The divider width persists in localStorage. Double-click the divider to reset to default width. A new \"full screen\" button in the task info panel navigates to the full-screen terminal view. Press Escape to close the split and return to the full Kanban board."
	},
	{
		"date": "2026-03-02",
		"type": "refactor",
		"slug": "task-info-panel-two-row-header",
		"title": "Refactored TaskInfoPanel header from a single crowded row into two rows",
		"body": "Refactored TaskInfoPanel header from a single crowded row into two rows. Top row: task status (leftmost), label chips, spacer, tmux keyboard hints (⌃B -, |, z + ⓘ popover), dev server, fullscreen, collapse. Bottom row: git info full width — branch, ahead/behind with push/merge/rebase buttons, uncommitted changes. Collapsed panel height increased from 36px to 62px. In split view (ProjectView), TaskInfoPanel is now rendered above the SplitLayout spanning full window width instead of being confined to the narrow terminal pane. TaskTerminal gained a `hideInfoPanel` prop to suppress the duplicate panel in split mode."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "task-labels",
		"title": "Added task labels feature: colored label chips on task cards with instant assignment via inline LabelPicker popover, ...",
		"body": "Added task labels feature: colored label chips on task cards with instant assignment via inline LabelPicker popover, label filter bar above the Kanban board for OR-based filtering, and label management (create, rename, recolor, delete) in Project Settings."
	},
	{
		"date": "2026-03-02",
		"type": "docs",
		"slug": "task-movement-wip-notice",
		"title": "Added a prominent CAUTION notice at the top of README.md clarifying that task movement between Kanban columns is curr...",
		"body": "Added a prominent CAUTION notice at the top of README.md clarifying that task movement between Kanban columns is currently manual-only. Automatic AI-driven task management is planned but not yet implemented."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "task-notes",
		"title": "Added task notes — a per-task scratchpad for markdown notes",
		"body": "Added task notes — a per-task scratchpad for markdown notes. Each note has a source (user or AI), timestamps, and auto-saves as you type. Notes are stored inline in tasks.json and accessible from the expanded TaskInfoPanel. Added CLI support for notes: `dev3 note add`, `dev3 note list`, `dev3 note delete` commands with full context auto-detection. Source defaults to \"ai\" in CLI for agent workflows. Also fixed terminal bottom row clipping on resize — added 16px bottom padding to body/root to compensate for ghostty-web FitAddon charHeight measurement mismatch."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "tmux-refresh-button",
		"title": "Add refresh button and 30-second auto-poll to tmux Sessions popover",
		"body": "Add refresh button and 30-second auto-poll to tmux Sessions popover.\r\n\r\nA manual refresh button with a spin animation was added to the popover header. The background polling interval was changed from 10 seconds to 30 seconds. Translations added for en/ru/es."
	},
	{
		"date": "2026-03-02",
		"type": "feature",
		"slug": "tmux-session-task-title",
		"title": "Show task title instead of tmux session name (hash-based) in the tmux sessions list popover",
		"body": "Show task title instead of tmux session name (hash-based) in the tmux sessions list popover. The session name is still available as a tooltip on hover."
	},
	{
		"date": "2026-03-02",
		"type": "chore",
		"slug": "update-check-interval-30min",
		"title": "Reduced auto-update check interval from 3 hours to 30 minutes so the app picks up new releases faster",
		"body": "Reduced auto-update check interval from 3 hours to 30 minutes so the app picks up new releases faster."
	},
	{
		"date": "2026-03-02",
		"type": "fix",
		"slug": "updater-version-compare",
		"title": "Fix auto-updater repeatedly offering the same version",
		"body": "Fix auto-updater repeatedly offering the same version. Replaced hash-based comparison with semver version comparison (major.minor.patch) so updates are only offered when the remote version is strictly greater than the local one."
	},
	{
		"date": "2026-03-01",
		"type": "chore",
		"slug": "add-lint-script",
		"title": "Added `bun run lint` script that runs TypeScript type-checking via `tsc --noEmit`, filtering errors to `src/` only (e...",
		"body": "Added `bun run lint` script that runs TypeScript type-checking via `tsc --noEmit`, filtering errors to `src/` only (electrobun ships raw `.ts` sources, not `.d.ts`, so `skipLibCheck` does not suppress its issues). Fixed two pre-existing type errors in `pty-server.ts` (`proc.stdin` cast and implicit-any callback params). Updated `AGENTS.md` to require `bun run lint` alongside `bun run test` before every commit."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "branch-status-refresh-button",
		"title": "Add manual refresh button and faster polling for branch status",
		"body": "Add manual refresh button and faster polling for branch status. A small icon button now appears next to the rebase/push/merge buttons to trigger an instant status refresh. The polling interval was reduced from 30s to 15s."
	},
	{
		"date": "2026-03-01",
		"type": "chore",
		"slug": "brighten-dark-theme",
		"title": "Increased dark theme color brightness by ~15%",
		"body": "Increased dark theme color brightness by ~15%. All surface, text, border, accent, danger, glass, and glow tokens bumped. STATUS_COLORS hex values also brightened proportionally."
	},
	{
		"date": "2026-03-01",
		"type": "chore",
		"slug": "brighten-kanban-colors",
		"title": "Brightened 4 kanban status colors (todo, in-progress, user-questions, review-by-user) by 25% and lightened the dark t...",
		"body": "Brightened 4 kanban status colors (todo, in-progress, user-questions, review-by-user) by 25% and lightened the dark theme page background gradient by 15%."
	},
	{
		"date": "2026-03-01",
		"type": "fix",
		"slug": "build-time-in-title",
		"title": "App title now shows the actual build time instead of the startup time",
		"body": "App title now shows the actual build time instead of the startup time. A prebuild script generates `src/shared/build-info.generated.ts` with the timestamp baked in at build time, so it stays constant across restarts."
	},
	{
		"date": "2026-03-01",
		"type": "fix",
		"slug": "bun-spawn-user-path",
		"title": "Replaced all direct `Bun.spawn`/`Bun.spawnSync` calls across the backend with `spawn`/`spawnSync` wrappers from the n...",
		"body": "Replaced all direct `Bun.spawn`/`Bun.spawnSync` calls across the backend with `spawn`/`spawnSync` wrappers from the new `src/bun/spawn.ts` utility. The wrapper always injects `process.env` into spawned processes, fixing tmux/git/pbcopy not being found in production builds where macOS .app bundles inherit a minimal PATH. Added the rule to AGENTS.md to prevent regressions."
	},
	{
		"date": "2026-03-01",
		"type": "fix",
		"slug": "bundle-jetbrains-mono-font",
		"title": "Bundle JetBrains Mono (Regular + Bold, woff2) as a web font so the terminal renders correctly in production builds",
		"body": "Bundle JetBrains Mono (Regular + Bold, woff2) as a web font so the terminal renders correctly in production builds. WKWebView's views:// protocol can't access user-installed fonts from ~/Library/Fonts/. Added @font-face declarations to index.css, font preloading via document.fonts.load() before Terminal init, and improved the fallback chain to SF Mono > Menlo > monospace."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "bundled-tmux-config",
		"title": "Ship a bundled tmux configuration based on the developer's personal setup (mouse support, intuitive splits, 256-color...",
		"body": "Ship a bundled tmux configuration based on the developer's personal setup (mouse support, intuitive splits, 256-color, vim-friendly escape-time, clipboard/bell pass-through). All tmux sessions now run on an isolated `-L dev3` socket with this config, preventing conflicts with the user's personal tmux server."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "changelog-viewer",
		"title": "Added a changelog viewer page accessible from the global header",
		"body": "Added a changelog viewer page accessible from the global header. Displays all changelog entries grouped by date with type badges and short titles. Data is read from the change-logs/ directory via RPC."
	},
	{
		"date": "2026-03-01",
		"type": "fix",
		"slug": "cli-path-propagation",
		"title": "Fix dev3 CLI PATH propagation to all tmux panes and user shells",
		"body": "Fix dev3 CLI PATH propagation to all tmux panes and user shells. Set PATH via tmux set-environment per session so new panes inherit it. Also inject ~/.dev3.0/bin into shell profile (~/.zshrc or ~/.bashrc) idempotently on app startup, making dev3 available in all terminals."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "cli-tool",
		"title": "Added `dev3` CLI tool for managing projects and tasks from the terminal",
		"body": "Added `dev3` CLI tool for managing projects and tasks from the terminal. The CLI communicates with the running app via Unix domain socket and supports: listing projects, listing/filtering tasks, showing task details, creating tasks, updating task title/description, and changing task status. Auto-detects project/task context from `.dev3-marker` files in worktrees. Designed primarily for AI agents to manage their own tasks via bash."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "default-cleanup-script",
		"title": "Added a default cleanup script (`say \"task finished\"`) that runs when a task is completed or cancelled, even if the u...",
		"body": "Added a default cleanup script (`say \"task finished\"`) that runs when a task is completed or cancelled, even if the user hasn't configured a custom cleanup script for the project."
	},
	{
		"date": "2026-03-01",
		"type": "fix",
		"slug": "dev-server-silent-failure",
		"title": "Fixed dev server button silently failing in production builds",
		"body": "Fixed dev server button silently failing in production builds. Added try/catch with logging to the `runDevServer` backend handler (including stderr capture and exit code checks for the tmux spawn), and made the renderer's `handleDevServer` async with proper error handling that shows an alert on failure. Added `infoPanel.devServerFailed` i18n key in all 3 locales."
	},
	{
		"date": "2026-03-01",
		"type": "fix",
		"slug": "dmg-creation-release",
		"title": "Fix DMG creation in release workflow: unmount leftover volumes before hdiutil create to prevent \"Operation not permit...",
		"body": "Fix DMG creation in release workflow: unmount leftover volumes before hdiutil create to prevent \"Operation not permitted\" errors on self-hosted runner, add /Applications symlink to DMG for drag-and-drop install UX, and use dynamic volume names (e.g. \"dev-3.0 0.1.16\") to avoid conflicts between builds."
	},
	{
		"date": "2026-03-01",
		"type": "docs",
		"slug": "english-only-policy",
		"title": "Add language policy to AGENTS.md requiring all code-related content (commits, changelogs, comments, decisions, PRs) t...",
		"body": "Add language policy to AGENTS.md requiring all code-related content (commits, changelogs, comments, decisions, PRs) to be in English only, even if the user communicates in Russian."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "escape-closes-settings",
		"title": "Pressing Escape on the global settings screen navigates back to the dashboard, and on the project settings screen nav...",
		"body": "Pressing Escape on the global settings screen navigates back to the dashboard, and on the project settings screen navigates back to the project view."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "git-ops-terminal-pane",
		"title": "Git operations (push, rebase, merge) now run in a visible tmux terminal pane instead of silently in the background",
		"body": "Git operations (push, rebase, merge) now run in a visible tmux terminal pane instead of silently in the background. Users can see full command output in real-time, with colored success/failure messages and the ability to read error details directly. Post-operation branch status refresh and merge auto-complete dialog are preserved via a `gitOpCompleted` push message."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "google-analytics",
		"title": "Integrated Google Analytics 4 (GA4) into the desktop app",
		"body": "Integrated Google Analytics 4 (GA4) into the desktop app. Tracks page views on navigation, heartbeat pings every 60 seconds for Realtime presence, and custom events for all task operations (create, move, delete, edit, spawn). User properties for operating system and app version are set on init."
	},
	{
		"date": "2026-03-01",
		"type": "fix",
		"slug": "rebase-local-branch",
		"title": "Rebase and branch comparison now use local branch (e.g",
		"body": "Rebase and branch comparison now use local branch (e.g. `main`) instead of `origin/main`. UI text updated accordingly."
	},
	{
		"date": "2026-03-01",
		"type": "fix",
		"slug": "shell-path-resolution",
		"title": "Resolve the user's full shell PATH at app startup by spawning a login shell",
		"body": "Resolve the user's full shell PATH at app startup by spawning a login shell. macOS .app bundles launch with a minimal PATH that doesn't include /opt/homebrew/bin, so tmux, git, and other tools were not found. The resolved PATH is patched into process.env.PATH before the PTY server starts."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "skip-prompt-on-reopen",
		"title": "When a task is moved from completed or cancelled back to an active status, the coding agent now starts without the or...",
		"body": "When a task is moved from completed or cancelled back to an active status, the coding agent now starts without the original task description as a prompt. This gives the user a clean, empty terminal session for continued work."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "system-requirements-check",
		"title": "Added system requirements check on app startup",
		"body": "Added system requirements check on app startup. The app now verifies that git and tmux are installed before loading. If any dependency is missing, a full-screen checklist is shown with installation instructions and a \"Re-check\" button. The requirements list is easily extensible by adding entries to the SYSTEM_REQUIREMENTS array in rpc-handlers.ts."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "system-theme",
		"title": "Added a \"System\" theme option that automatically follows the OS dark/light mode preference",
		"body": "Added a \"System\" theme option that automatically follows the OS dark/light mode preference. When selected, the app listens for OS theme changes and switches in real time. Localized for English, Russian, and Spanish."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "terminal-reset-menu",
		"title": "Added \"Soft Reset Terminal\" and \"Hard Reset Terminal\" to the View menu",
		"body": "Added \"Soft Reset Terminal\" and \"Hard Reset Terminal\" to the View menu. Soft reset sends charset-restore sequences + DECSTR to the PTY. Hard reset calls ghostty-web's term.reset() + renderer.remeasureFont(), sends RIS to PTY, and forces a tmux redraw via resize nudge. Useful when Unicode rendering breaks (e.g. Russian chars showing as underscores after reboot)."
	},
	{
		"date": "2026-03-01",
		"type": "fix",
		"slug": "tmux-check-path",
		"title": "Fixed system requirements check for tmux (and any other tool) not finding binaries installed via Homebrew",
		"body": "Fixed system requirements check for tmux (and any other tool) not finding binaries installed via Homebrew. The `checkSystemRequirements` handler was using `Bun.spawnSync` directly instead of the `spawnSync` wrapper from `spawn.ts`, which meant the child process inherited the minimal macOS .app PATH (`/usr/bin:/bin:/usr/sbin:/sbin`) instead of the user's full PATH."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "tmux-session-manager",
		"title": "Added tmux session manager panel to the global header",
		"body": "Added tmux session manager panel to the global header. Shows a count badge of active dev3-* tmux sessions and opens a popover listing all sessions with their working directory, a copyable attach command, and a force kill button with confirmation. Helps track and manage background tmux sessions that persist after the app closes."
	},
	{
		"date": "2026-03-01",
		"type": "fix",
		"slug": "updater-download-apply",
		"title": "Fix auto-update: actually download and apply updates instead of sending unhandled messages to the renderer",
		"body": "Fix auto-update: actually download and apply updates instead of sending unhandled messages to the renderer. Both the \"Check for Updates\" menu action and the auto-check callback now call downloadUpdateForChannel() + applyUpdate() with native dialogs, instead of sending updateAvailable to the renderer which was never handled."
	},
	{
		"date": "2026-03-01",
		"type": "fix",
		"slug": "updater-missing-base-url",
		"title": "Added missing `release.baseUrl` to `electrobun.config.ts`",
		"body": "Added missing `release.baseUrl` to `electrobun.config.ts`. The built-in `Updater.downloadUpdate()` needs this URL to construct download paths — without it, the fetch fails with `ERR_INVALID_URL`."
	},
	{
		"date": "2026-03-01",
		"type": "feature",
		"slug": "x64-release-build",
		"title": "Added x64 (Intel) macOS build to the release workflow",
		"body": "Added x64 (Intel) macOS build to the release workflow. Both arm64 and x64 builds run sequentially on the same self-hosted ARM Mac runner using Rosetta 2. Extracted artifact creation logic into a reusable script (scripts/create-release-artifacts.sh) parameterized by architecture. GitHub Release notes now list download links for both architectures."
	},
	{
		"date": "2026-02-28",
		"type": "feature",
		"slug": "app-icon",
		"title": "Added application icon for all platforms",
		"body": "Added application icon for all platforms. Created icon.iconset with all required sizes from a 1024x1024 source PNG. Configured electrobun.config.ts with icon paths for macOS, Linux, and Windows."
	},
	{
		"date": "2026-02-28",
		"type": "fix",
		"slug": "appledouble-codesign",
		"title": "Fixed \"app is damaged\" error on signed builds by setting COPYFILE_DISABLE=1 to prevent macOS from creating AppleDoubl...",
		"body": "Fixed \"app is damaged\" error on signed builds by setting COPYFILE_DISABLE=1 to prevent macOS from creating AppleDouble ._ files inside the app bundle, which invalidate code signatures."
	},
	{
		"date": "2026-02-28",
		"type": "feature",
		"slug": "auto-update",
		"title": "Added auto-update mechanism using Electrobun's built-in Updater",
		"body": "Added auto-update mechanism using Electrobun's built-in Updater. The app checks for updates on startup and every 3 hours, with support for stable/canary channels configured in Global Settings. \"Check for Updates...\" menu item added under the app menu. Release workflow now uploads flat artifacts to S3 for the updater to consume."
	},
	{
		"date": "2026-02-28",
		"type": "feature",
		"slug": "ci-artifact-comments",
		"title": "CI workflows now post artifact links after builds",
		"body": "CI workflows now post artifact links after builds. PR builds get a comment with S3 download links and self-signing instructions (unsigned builds). Release workflow creates a GitHub Release with the DMG link."
	},
	{
		"date": "2026-02-28",
		"type": "fix",
		"slug": "crash-diagnostic-logging",
		"title": "Added comprehensive crash diagnostic logging across main process and renderer to investigate production-only crashes ...",
		"body": "Added comprehensive crash diagnostic logging across main process and renderer to investigate production-only crashes when opening task terminals. Includes global uncaughtException/unhandledRejection handlers in both processes, try-catch wrapping around tmux spawn, WebSocket handlers, ghostty-web Terminal init, and detailed logging throughout the getPtyUrl → launchTaskPty → spawnPty → WebSocket connection flow."
	},
	{
		"date": "2026-02-28",
		"type": "feature",
		"slug": "github-actions-build",
		"title": "Added GitHub Actions CI workflow for self-hosted macOS runner",
		"body": "Added GitHub Actions CI workflow for self-hosted macOS runner. The workflow runs on pushes and PRs to main: installs dependencies with frozen lockfile, runs tests, builds the app via Electrobun, and uploads build artifacts with 7-day retention."
	},
	{
		"date": "2026-02-28",
		"type": "feature",
		"slug": "release-code-signing",
		"title": "Added macOS code signing and notarization to the release workflow",
		"body": "Added macOS code signing and notarization to the release workflow. Stable builds are now signed with Developer ID certificate and notarized via Apple. PR builds remain unsigned."
	},
	{
		"date": "2026-02-28",
		"type": "fix",
		"slug": "release-secrets-mapping",
		"title": "Fixed release workflow secret names to match actual GitHub repo secrets (ELECTROBUN_TEAMID, ELECTROBUN_APPLEID, ELECT...",
		"body": "Fixed release workflow secret names to match actual GitHub repo secrets (ELECTROBUN_TEAMID, ELECTROBUN_APPLEID, ELECTROBUN_APPLEIDPASS instead of APPLE_TEAM_ID, APPLE_ID, APPLE_APP_SPECIFIC_PASSWORD)."
	},
	{
		"date": "2026-02-28",
		"type": "feature",
		"slug": "release-workflow-bump",
		"title": "Added stable release workflow triggered by version tags (v*)",
		"body": "Added stable release workflow triggered by version tags (v*). Builds with `--env=stable` and uploads artifacts to S3 under the tag name. Added `bun run bump [patch|minor|major]` script for version bumping with auto-commit and tag creation."
	},
	{
		"date": "2026-02-28",
		"type": "fix",
		"slug": "resolve-filename-verification",
		"title": "Improved drag-and-drop file path resolution for files with non-unique names (e.g",
		"body": "Improved drag-and-drop file path resolution for files with non-unique names (e.g. README.md). The resolveFilename RPC now receives file size and lastModified from the browser File API and uses them to verify mdfind candidates, picking the correct file instead of a random match."
	},
	{
		"date": "2026-02-28",
		"type": "feature",
		"slug": "s3-upload-ci",
		"title": "Added S3 upload step to CI workflow",
		"body": "Added S3 upload step to CI workflow. Build artifacts are now synced to s3://h0x91b-releases/dev-3.0/<sha>/ after a successful build. Replaces GitHub's built-in artifact storage which had quota limits."
	},
	{
		"date": "2026-02-28",
		"type": "feature",
		"slug": "terminal-preview",
		"title": "Added terminal preview on hover for active task cards",
		"body": "Added terminal preview on hover for active task cards. Hovering over an in-progress task on the kanban board shows a miniature \"screenshot\" of the terminal content rendered as ANSI→HTML. Uses tmux capture-pane under the hood, with a new ANSI-to-HTML converter supporting SGR codes, 256-color, and true color."
	},
	{
		"date": "2026-02-28",
		"type": "feature",
		"slug": "terminal-preview-refresh",
		"title": "Terminal preview popover now auto-refreshes every 1 second while the hover is active",
		"body": "Terminal preview popover now auto-refreshes every 1 second while the hover is active. Previously the preview was a static snapshot; now it updates live, showing near-real-time terminal state."
	},
	{
		"date": "2026-02-28",
		"type": "feature",
		"slug": "title-date-version",
		"title": "Window title now shows the app version, full date with day of week, and ISO week number alongside the build time",
		"body": "Window title now shows the app version, full date with day of week, and ISO week number alongside the build time. About dialog also displays the version. Format: `dev-3.0 v0.1.0 [Sat, 28 Feb 2026 · W09 · 14:30:15]`."
	},
	{
		"date": "2026-02-28",
		"type": "feature",
		"slug": "uncommitted-changes-badge",
		"title": "Added uncommitted changes indicator (+insertions / -deletions) to the task status line",
		"body": "Added uncommitted changes indicator (+insertions / -deletions) to the task status line. Shows in red when there are uncommitted changes in the worktree. Data is fetched alongside the existing branch status polling (every 30s)."
	},
	{
		"date": "2026-02-28",
		"type": "chore",
		"slug": "update-app-icon-v2",
		"title": "Updated application icon to a new v2 design — a kanban board with terminal windows, better reflecting the product con...",
		"body": "Updated application icon to a new v2 design — a kanban board with terminal windows, better reflecting the product concept."
	},
	{
		"date": "2026-02-28",
		"type": "feature",
		"slug": "update-channel-setting",
		"title": "Added \"Update Channel\" dropdown (stable/canary) to Global Settings",
		"body": "Added \"Update Channel\" dropdown (stable/canary) to Global Settings. The value is persisted in settings.json but has no functional effect yet — will be used later for app auto-update channel selection."
	},
	{
		"date": "2026-02-28",
		"type": "fix",
		"slug": "updater-artifacts-workaround",
		"title": "Work around Electrobun codesign bug by removing release.baseUrl from config and creating updater artifacts (tar.zst, ...",
		"body": "Work around Electrobun codesign bug by removing release.baseUrl from config and creating updater artifacts (tar.zst, update.json, DMG) manually in the CI workflow. Hardcode the S3 base URL in updater.ts."
	},
	{
		"date": "2026-02-27",
		"type": "feature",
		"slug": "bell-auto-status",
		"title": "Auto-move task status on terminal bell: when a bell is detected (agent asking a question), the task automatically tra...",
		"body": "Auto-move task status on terminal bell: when a bell is detected (agent asking a question), the task automatically transitions from \"in-progress\" to \"user-questions\". When the user opens the task terminal, it transitions back to \"in-progress\"."
	},
	{
		"date": "2026-02-27",
		"type": "fix",
		"slug": "corrupted-task-recovery",
		"title": "Graceful handling of corrupted tasks whose worktree directory or branch was deleted externally",
		"body": "Graceful handling of corrupted tasks whose worktree directory or branch was deleted externally. Backend now checks for worktree existence before spawning PTY processes or running cleanup scripts, and wraps removeWorktree/cleanup in try-catch so moveTask always completes. Frontend shows a recovery popup with Complete/Cancel buttons instead of an infinite \"Connecting...\" spinner when the PTY session fails."
	},
	{
		"date": "2026-02-27",
		"type": "fix",
		"slug": "launch-modal-select-dropdown",
		"title": "Fixed agent/configuration dropdown in LaunchVariantsModal not responding to selection",
		"body": "Fixed agent/configuration dropdown in LaunchVariantsModal not responding to selection. The portal-rendered dropdown was being closed by the outside-click handler before the click event could register, because the handler only checked the button ref but not the dropdown ref."
	},
	{
		"date": "2026-02-27",
		"type": "fix",
		"slug": "merge-completion-no-navigation",
		"title": "Fixed bug where completing a task after merge didn't navigate back to Kanban board",
		"body": "Fixed bug where completing a task after merge didn't navigate back to Kanban board. The app would show \"Task environment error — Worktree not found\" instead because TaskTerminal remained mounted and tried to reconnect the PTY after the worktree was already cleaned up. Added missing navigate() call and auto-retry with force:true (matching handleStatusMove pattern)."
	},
	{
		"date": "2026-02-27",
		"type": "feature",
		"slug": "push-button",
		"title": "Add a Push button to the task info panel that pushes the current branch to origin without merging",
		"body": "Add a Push button to the task info panel that pushes the current branch to origin without merging. The button appears when there are commits ahead, alongside the existing Merge button."
	},
	{
		"date": "2026-02-27",
		"type": "feature",
		"slug": "sequential-task-ids",
		"title": "Added sequential task IDs (`seq`) — each task now gets a unique per-project number (#1, #2, #3...) displayed on Kanba...",
		"body": "Added sequential task IDs (`seq`) — each task now gets a unique per-project number (#1, #2, #3...) displayed on Kanban cards, breadcrumbs, and the info panel. Variant tasks sharing a `groupId` inherit the same seq. Existing tasks without seq are backfilled automatically on first load."
	},
	{
		"date": "2026-02-27",
		"type": "feature",
		"slug": "show-comparison-branch",
		"title": "Show which base branch the ahead/behind commit count is compared against (e.g",
		"body": "Show which base branch the ahead/behind commit count is compared against (e.g. \"vs origin/main\") in the task info panel."
	},
	{
		"date": "2026-02-27",
		"type": "feature",
		"slug": "squash-merge-completion-prompt",
		"title": "Merge button now performs a squash merge (git merge --squash + commit) using the task title as the commit message",
		"body": "Merge button now performs a squash merge (git merge --squash + commit) using the task title as the commit message. After a successful merge, a native dialog asks whether to mark the task as completed — if confirmed, the terminal is destroyed, cleanup runs, and the worktree is removed."
	},
	{
		"date": "2026-02-27",
		"type": "fix",
		"slug": "stuck-tasks-force-move",
		"title": "Fixed stuck tasks when cleanup/PTY operations fail",
		"body": "Fixed stuck tasks when cleanup/PTY operations fail. Added `force` parameter to `moveTask` that skips PTY destruction, cleanup script, and worktree removal — used automatically when the error dialog fires or when a normal move fails. Also made `pty.destroySession` resilient by wrapping tmux kill in try/catch."
	},
	{
		"date": "2026-02-27",
		"type": "fix",
		"slug": "task-complete-from-terminal-view",
		"title": "Fix: completing a task from the terminal view (TaskInfoPanel) now navigates back to the project Kanban board",
		"body": "Fix: completing a task from the terminal view (TaskInfoPanel) now navigates back to the project Kanban board. Previously the cleanup script ran but the UI stayed on the dead terminal screen and the task appeared unchanged in the board."
	},
	{
		"date": "2026-02-27",
		"type": "feature",
		"slug": "tmux-hotkey-hints",
		"title": "Added tmux hotkey hints to the TaskInfoPanel header",
		"body": "Added tmux hotkey hints to the TaskInfoPanel header. Three essential shortcuts (h-split, v-split, zoom) are shown as compact inline badges, with an info button that reveals a full tmux reference popover on hover. Fully localized in English, Russian, and Spanish."
	},
	{
		"date": "2026-02-27",
		"type": "refactor",
		"slug": "worktree-task-dir",
		"title": "Worktree directory restructured: each task now gets a container directory (`{shortId}/`) with `worktree/` (git worktr...",
		"body": "Worktree directory restructured: each task now gets a container directory (`{shortId}/`) with `worktree/` (git worktree) and `logs/` subdirectories. On cleanup, only `worktree/` is removed — `logs/` persists for history."
	},
	{
		"date": "2026-02-26",
		"type": "fix",
		"slug": "bottom-mode-sort",
		"title": "Fix moveOrderMap handling for \"bottom\" drop position mode",
		"body": "Fix moveOrderMap handling for \"bottom\" drop position mode. Previously moveOrderMap was only consulted in \"top\" mode — tasks dragged to a column in \"bottom\" mode ignored move ordering entirely. Now both modes respect moveOrderMap (top: most recent first, bottom: most recent last). Extracted sortTasksForColumn to its own module and added 19 unit tests covering all sort scenarios."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "cleanup-script-on-complete",
		"title": "When a task moves to `completed` or `cancelled`, if the project has a `cleanupScript` configured, it now runs in a ne...",
		"body": "When a task moves to `completed` or `cancelled`, if the project has a `cleanupScript` configured, it now runs in a new dedicated tmux session before the worktree is removed. The cleanup session is automatically destroyed once the script finishes."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "custom-select-launch-modal",
		"title": "Replace native `<select>` elements in LaunchVariantsModal with a custom styled Select component",
		"body": "Replace native `<select>` elements in LaunchVariantsModal with a custom styled Select component. The new component renders a themed button + portal-based dropdown that respects the app's design tokens and avoids OS-native styling."
	},
	{
		"date": "2026-02-26",
		"type": "fix",
		"slug": "dev-server-pane-close-on-error",
		"title": "Dev server tmux pane no longer closes immediately when the process exits with an error",
		"body": "Dev server tmux pane no longer closes immediately when the process exits with an error. It now shows the exit code and waits for a keypress, so the user can read the error output."
	},
	{
		"date": "2026-02-26",
		"type": "fix",
		"slug": "dynamic-pty-ws-port",
		"title": "PTY WebSocket server now binds to port 0 (OS-assigned) instead of hardcoded 7681",
		"body": "PTY WebSocket server now binds to port 0 (OS-assigned) instead of hardcoded 7681. This allows multiple app instances to run in parallel without port conflicts."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "git-branch-status",
		"title": "Added git branch status (ahead/behind) display and one-click rebase to the TaskInfoPanel",
		"body": "Added git branch status (ahead/behind) display and one-click rebase to the TaskInfoPanel. The panel now shows how many commits the task branch is ahead/behind the base branch, with a Rebase button that checks for conflicts before attempting. Data refreshes on mount and every 30 seconds via git fetch."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "header-status-dropdown",
		"title": "Added a status dropdown to the GlobalHeader when viewing a task terminal",
		"body": "Added a status dropdown to the GlobalHeader when viewing a task terminal. Reuses the same portal-based dropdown pattern from TaskCard, allowing users to change task status (e.g., move to user-questions, review, completed) directly from the terminal screen without going back to the Kanban board."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "merge-button-and-text-status",
		"title": "Replaced cryptic ↑N ↓N branch status arrows with human-readable yellow text (\"N commits behind\", \"N commits ahead\", \"...",
		"body": "Replaced cryptic ↑N ↓N branch status arrows with human-readable yellow text (\"N commits behind\", \"N commits ahead\", \"N ahead · N behind\"). Added a Merge button that performs `git merge` in the main project directory when the branch is rebased (behind === 0, ahead > 0). Added `mergeBranch` git helper, `mergeTask` RPC endpoint, and full i18n support for the new UI strings."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "osc52-clipboard",
		"title": "Auto-copy terminal selection to system clipboard",
		"body": "Auto-copy terminal selection to system clipboard. Two mechanisms: (1) tmux MouseDragEnd1Pane is bound to `copy-pipe-and-cancel \"pbcopy\"` for direct mouse-select-to-clipboard; (2) OSC 52 escape sequences from any app are intercepted server-side and piped to `pbcopy`. Client-side strips residual OSC 52 sequences before rendering."
	},
	{
		"date": "2026-02-26",
		"type": "fix",
		"slug": "project-settings-button-visibility",
		"title": "Project settings button now visible on all project sub-screens (task view, project-settings, etc.), not just the kanb...",
		"body": "Project settings button now visible on all project sub-screens (task view, project-settings, etc.), not just the kanban board. Previously the button only appeared when `route.screen === \"project\"`, which hid it inside task terminals."
	},
	{
		"date": "2026-02-26",
		"type": "fix",
		"slug": "pty-spawn-on-task-create",
		"title": "Spawn tmux process immediately when task moves to In Progress, without waiting for the user to open the task terminal",
		"body": "Spawn tmux process immediately when task moves to In Progress, without waiting for the user to open the task terminal. Previously the PTY was only started on WebSocket connection (when the user clicked into the task)."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "rebuild-menu",
		"title": "Added \"Rebuild\" item to the View menu (Cmd+R)",
		"body": "Added \"Rebuild\" item to the View menu (Cmd+R). Runs `vite build` and reloads the webview, useful in `bun run dev:once` mode when HMR is not available."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "run-dev-server",
		"title": "Added \"Dev Server\" button to the task header",
		"body": "Added \"Dev Server\" button to the task header. When clicked, it opens a vertical tmux pane in the task's tmux session and runs the project's `devScript`. The button is disabled when no dev script is configured or the task is not active."
	},
	{
		"date": "2026-02-26",
		"type": "fix",
		"slug": "stale-backend-bundle",
		"title": "Added `clean` script that removes `dist/` and the app bundle's `Resources/app/` directory",
		"body": "Added `clean` script that removes `dist/` and the app bundle's `Resources/app/` directory. All build scripts (`dev`, `build`, `build:prod`) now run `clean` first, ensuring both frontend and backend are always rebuilt from scratch. Previously `electrobun dev` would skip rebundling the backend if the old bundle existed, causing stale handler errors."
	},
	{
		"date": "2026-02-26",
		"type": "fix",
		"slug": "status-dropdown-portal",
		"title": "Fixed status dropdown menu in TaskCard flying off-screen due to `backdrop-filter` on `.glass-column` creating a new C...",
		"body": "Fixed status dropdown menu in TaskCard flying off-screen due to `backdrop-filter` on `.glass-column` creating a new CSS containing block for `fixed`-positioned elements. Wrapped the dropdown in `createPortal(..., document.body)` so it renders outside the glass column and `fixed` positioning works correctly relative to the viewport."
	},
	{
		"date": "2026-02-26",
		"type": "fix",
		"slug": "status-dropdown-viewport-clamp",
		"title": "Added smart viewport clamping for the status dropdown in TaskCard",
		"body": "Added smart viewport clamping for the status dropdown in TaskCard. The menu now renders invisible first, then useLayoutEffect measures its actual size and flips it above the trigger if it would overflow the bottom edge, and clamps left/right/top edges within 8px of the viewport boundary."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "task-drop-position",
		"title": "Added global setting `taskDropPosition` (\"top\" / \"bottom\", default \"top\") that controls where a task appears in the d...",
		"body": "Added global setting `taskDropPosition` (\"top\" / \"bottom\", default \"top\") that controls where a task appears in the destination column when dragged between statuses. Moved tasks now have a `movedAt` timestamp used for column sorting."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "task-info-panel",
		"title": "Added expandable sub-panel between the header and terminal on the task screen",
		"body": "Added expandable sub-panel between the header and terminal on the task screen. In collapsed state it shows a compact row with task status, title, and branch. Expands to reveal full metadata (description, worktree path, timestamps) with a drag handle for resizing. Panel state (collapsed/height) persists in localStorage."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "terminal-bell-indicator",
		"title": "Added terminal Bell signal detection and task attention indicator",
		"body": "Added terminal Bell signal detection and task attention indicator. When a PTY session emits a standalone BEL character (\\x07), a pulsing orange bell icon appears on the task card in the Kanban board. The indicator is automatically cleared when the user opens the task's terminal view."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "terminal-drag-drop-file-path",
		"title": "When files are dragged and dropped onto the terminal window, their full filesystem paths are now inserted into the te...",
		"body": "When files are dragged and dropped onto the terminal window, their full filesystem paths are now inserted into the terminal's stdin (space-separated, with spaces in paths escaped as `\\ `). Mirrors the standard behavior of iTerm2 and Terminal.app."
	},
	{
		"date": "2026-02-26",
		"type": "feature",
		"slug": "todo-task-inline-edit",
		"title": "Added inline editing for TODO tasks",
		"body": "Added inline editing for TODO tasks. Clicking the task title on a todo card opens a textarea with the full description; Cmd+Enter saves, Escape cancels. The title is regenerated from the updated description via the new `editTask` RPC handler."
	},
	{
		"date": "2026-02-25",
		"type": "fix",
		"slug": "setup-script-tmux-env-vars",
		"title": "Fix: setup script and claude command failed because tmux server does not inherit custom env vars from the client process",
		"body": "Fix: setup script and claude command failed because tmux server does not inherit custom env vars from the client process. Switched from env vars to writing content into temp files (/tmp/dev3-{taskId}-setup.sh, /tmp/dev3-{taskId}-cmd.sh)."
	},
	{
		"date": "2026-02-24",
		"type": "fix",
		"slug": "breadcrumb-app-name-style",
		"title": "Styled the app name segment in the breadcrumb with a terminal icon and accent color (font-mono, tracking-wide) to vis...",
		"body": "Styled the app name segment in the breadcrumb with a terminal icon and accent color (font-mono, tracking-wide) to visually distinguish it from project/page names."
	},
	{
		"date": "2026-02-24",
		"type": "fix",
		"slug": "kanban-layout-flex-dvh",
		"title": "Fixed kanban board layout: switched html root to 100dvh, applied flex-1/min-h-0 pattern through App → ProjectView → K...",
		"body": "Fixed kanban board layout: switched html root to 100dvh, applied flex-1/min-h-0 pattern through App → ProjectView → KanbanBoard → KanbanColumn so the board fills available height correctly and scrolls horizontally without overflow issues."
	},
	{
		"date": "2026-02-24",
		"type": "fix",
		"slug": "review-by-user-color",
		"title": "Changed \"Review by User\" kanban column color from teal (#2dd4bf) to orange (#f97316) to better differentiate it from ...",
		"body": "Changed \"Review by User\" kanban column color from teal (#2dd4bf) to orange (#f97316) to better differentiate it from the \"Completed\" status (green #34d399) and convey \"action needed from user\"."
	},
	{
		"date": "2026-02-24",
		"type": "feature",
		"slug": "setup-script-background-flag",
		"title": "Added \"Run in background (don't wait)\" checkbox to Project Settings next to the setup script field",
		"body": "Added \"Run in background (don't wait)\" checkbox to Project Settings next to the setup script field. The flag is stored as `setupScriptBackground` on the Project type and persisted via the existing `updateProjectSettings` RPC. No execution logic is wired up yet — storage only."
	},
	{
		"date": "2026-02-24",
		"type": "feature",
		"slug": "setup-script-tmux-panes",
		"title": "Setup script now runs in a dedicated tmux pane (pane 0), agent runs in the bottom pane (pane 1)",
		"body": "Setup script now runs in a dedicated tmux pane (pane 0), agent runs in the bottom pane (pane 1). In foreground mode the agent waits for setup to finish; in background mode both run in parallel. Implemented via a startup script in /tmp, no escaping issues."
	},
	{
		"date": "2026-02-24",
		"type": "fix",
		"slug": "swap-user-questions-review-colors",
		"title": "Swapped colors for user-questions and review-by-user: user-questions is now orange (#f97316) to signal urgency/blocki...",
		"body": "Swapped colors for user-questions and review-by-user: user-questions is now orange (#f97316) to signal urgency/blocking, review-by-user is now yellow (#fbbf24) as a softer \"ready for review\" indicator."
	},
	{
		"date": "2026-02-23",
		"type": "feature",
		"slug": "agent-config-params",
		"title": "Added permission mode, effort level, and max budget fields to agent configurations",
		"body": "Added permission mode, effort level, and max budget fields to agent configurations. These map directly to claude CLI flags (--permission-mode, --effort, --max-budget-usd) and are reflected in the live command preview."
	},
	{
		"date": "2026-02-23",
		"type": "feature",
		"slug": "bun-main-watcher",
		"title": "Added a Bun watcher script (`scripts/watch-main.ts`) that auto-restarts `electrobun dev` when files in `src/bun/` or ...",
		"body": "Added a Bun watcher script (`scripts/watch-main.ts`) that auto-restarts `electrobun dev` when files in `src/bun/` or `src/shared/` change. Supports 2-second debounce, manual restart via `R` key, and graceful quit via `Q`. The `dev` npm script now uses this watcher instead of `dev:once`, giving the main process a live-reload experience similar to Vite HMR for the renderer."
	},
	{
		"date": "2026-02-23",
		"type": "feature",
		"slug": "dashboard-project-settings-button",
		"title": "Added a settings (gear) icon button to each project card on the dashboard",
		"body": "Added a settings (gear) icon button to each project card on the dashboard. The button appears on hover and navigates directly to the project settings screen."
	},
	{
		"date": "2026-02-23",
		"type": "feature",
		"slug": "drag-and-drop-transitions",
		"title": "Add drag-and-drop between Kanban columns with status transition rules",
		"body": "Add drag-and-drop between Kanban columns with status transition rules. Tasks can be dragged from any column to valid target columns. TODO tasks can only move to In Progress (opens LaunchVariantsModal) or Cancelled. Valid drop targets highlight during drag. Status context menu also respects the same transition rules."
	},
	{
		"date": "2026-02-23",
		"type": "feature",
		"slug": "glassmorphism-dark-theme",
		"title": "Redesigned the dark theme with glassmorphism aesthetics: gradient background, semi-transparent columns with per-statu...",
		"body": "Redesigned the dark theme with glassmorphism aesthetics: gradient background, semi-transparent columns with per-status colored glow overlays, glass cards with hover lift, blurred header, and vibrant status colors. All values expressed through CSS custom properties; light theme falls back to solid opaque surfaces."
	},
	{
		"date": "2026-02-23",
		"type": "fix",
		"slug": "launch-modal-empty-config-dropdown",
		"title": "Fix empty config dropdown in LaunchVariantsModal when project.defaultAgentId is null or points to a removed agent",
		"body": "Fix empty config dropdown in LaunchVariantsModal when project.defaultAgentId is null or points to a removed agent. The modal now falls back to the first available agent. Also added defaultAgentId backfill in loadProjects for old projects created before the agent model redesign."
	},
	{
		"date": "2026-02-23",
		"type": "feature",
		"slug": "multi-variant-tasks",
		"title": "Add multi-variant task spawning",
		"body": "Add multi-variant task spawning. When moving a TODO task to an active status, a LaunchVariantsModal opens allowing the user to configure multiple agent+config combinations. Each variant gets its own worktree, branch, and PTY session. Variant cards display a badge with variant number and agent name."
	},
	{
		"date": "2026-02-23",
		"type": "feature",
		"slug": "project-dev-cleanup-scripts",
		"title": "Added devScript and cleanupScript fields to Project settings alongside the existing setupScript",
		"body": "Added devScript and cleanupScript fields to Project settings alongside the existing setupScript. Both fields are stored in projects.json, exposed via the updateProjectSettings RPC, and rendered as textareas in the Project Settings UI. cleanupScript is intended to run when a task is moved to cancelled (or archived in the future); devScript is reserved for when dev server support is implemented. Documentation added to AGENTS.md."
	},
	{
		"date": "2026-02-23",
		"type": "fix",
		"slug": "project-settings-layout-center",
		"title": "Centered the project settings form content with mx-auto and widened it from max-w-xl to max-w-2xl to better utilize a...",
		"body": "Centered the project settings form content with mx-auto and widened it from max-w-xl to max-w-2xl to better utilize available screen space."
	},
	{
		"date": "2026-02-23",
		"type": "refactor",
		"slug": "remove-deprecated-project-fields",
		"title": "Removed three deprecated fields from the Project interface: `defaultTmuxCommand`, `defaultAgentId`, and `defaultConfi...",
		"body": "Removed three deprecated fields from the Project interface: `defaultTmuxCommand`, `defaultAgentId`, and `defaultConfigId`. These fields were superseded by `GlobalSettings.defaultAgentId` and `GlobalSettings.defaultConfigId`. Cleaned up all usages in data.ts and five test fixture files."
	},
	{
		"date": "2026-02-23",
		"type": "refactor",
		"slug": "separate-global-project-settings",
		"title": "Separated agent configuration from project settings into global settings",
		"body": "Separated agent configuration from project settings into global settings. Default agent and configuration are now stored in `~/.dev3.0/settings.json` and managed in GlobalSettings (Cmd+, to open). Project settings now only contain setup script and base branch. Added navigateToSettings push message so Cmd+, menu item opens settings from any screen."
	},
	{
		"date": "2026-02-23",
		"type": "feature",
		"slug": "taskcard-confirm-dismiss",
		"title": "Redesigned TaskCard: X button on TODO confirms before cancelling, X on cancelled confirms before deleting",
		"body": "Redesigned TaskCard: X button on TODO confirms before cancelling, X on cancelled confirms before deleting. Restored status dropdown on TODO cards alongside the solid green Run button. Improved button styling with proper backgrounds and shadows."
	},
	{
		"date": "2026-02-23",
		"type": "feature",
		"slug": "terminal-mouse-tracking",
		"title": "Add mouse tracking support for the embedded terminal",
		"body": "Add mouse tracking support for the embedded terminal. When a terminal app enables mouse mode (e.g. tmux with `set -g mouse on`), mouse events (click, drag, scroll) are now forwarded to the PTY as SGR extended mouse sequences (mode 1006). When mouse tracking is off, text selection via SelectionManager works as before."
	},
	{
		"date": "2026-02-22",
		"type": "feature",
		"slug": "agent-configurations",
		"title": "Redesigned coding agents to a two-level Agent + Configuration model",
		"body": "Redesigned coding agents to a two-level Agent + Configuration model. Each agent (Claude, Codex, Gemini, or user-created) now has multiple configurations with model selection, append prompt with Mustache-style template variables ({{TASK_TITLE}}, {{PROJECT_NAME}}, etc.), additional CLI arguments, environment variables, and base command override. Built-in agents are now editable but not deletable. Global Settings shows expandable agent cards with inline config editing. Project Settings has two dropdowns for agent and configuration selection."
	},
	{
		"date": "2026-02-22",
		"type": "feature",
		"slug": "configurable-coding-agents",
		"title": "Add configurable coding agents support",
		"body": "Add configurable coding agents support. The app now natively supports Claude, Codex, and Gemini as built-in agents that receive the task title as initial prompt. Users can also create custom shell agents via Global Settings, with access to task metadata through environment variables ($DEV3_TASK_TITLE, $DEV3_TASK_ID, etc.). Project Settings now uses an agent selector dropdown instead of a free-form command input, with backward compatibility for existing projects."
	},
	{
		"date": "2026-02-22",
		"type": "feature",
		"slug": "create-task-modal",
		"title": "Replaced inline task creation form in the To Do column with a centered modal popup",
		"body": "Replaced inline task creation form in the To Do column with a centered modal popup. The modal lets users enter a title and pick any status (To Do, In Progress, etc.) when creating a task. Backend updated to accept an optional status parameter, with automatic worktree + PTY setup for active statuses."
	},
	{
		"date": "2026-02-22",
		"type": "feature",
		"slug": "task-description-field",
		"title": "Added `description` field to the Task model",
		"body": "Added `description` field to the Task model. The user now enters a description (the prompt for AI) in a textarea, and the title is auto-generated from the first ~80 characters. CreateTaskModal updated with textarea input, Cmd+Enter shortcut, and live title preview. Backward compatible with existing tasks via read-time migration."
	},
	{
		"date": "2026-02-21",
		"type": "chore",
		"slug": "add-changelog-and-worktree-rules",
		"title": "Add changelog policy and git worktree awareness to AGENTS.md",
		"body": "Add changelog policy and git worktree awareness to AGENTS.md. Created change-logs/ directory with README.md format spec."
	},
	{
		"date": "2026-02-21",
		"type": "feature",
		"slug": "application-menu",
		"title": "Add native macOS application menu with App (About, Hide, Quit), Edit (Undo, Redo, Cut, Copy, Paste, Select All), View...",
		"body": "Add native macOS application menu with App (About, Hide, Quit), Edit (Undo, Redo, Cut, Copy, Paste, Select All), View (Toggle Developer Tools, Toggle Full Screen), and Window (Minimize, Zoom, Close) menus. DevTools is now user-triggered via menu instead of auto-opening on dev channel."
	},
	{
		"date": "2026-02-21",
		"type": "docs",
		"slug": "branch-naming-guide",
		"title": "Added branch naming instruction to AGENTS.md: agents should suggest renaming opaque worktree branches to descriptive ...",
		"body": "Added branch naming instruction to AGENTS.md: agents should suggest renaming opaque worktree branches to descriptive names after understanding the task context, always asking the user first."
	},
	{
		"date": "2026-02-21",
		"type": "docs",
		"slug": "bun-readme",
		"title": "Added docs/bun/README.md pointing to Bun's llms.txt and llms-full.txt",
		"body": "Added docs/bun/README.md pointing to Bun's llms.txt and llms-full.txt. Updated AGENTS.md with a Documentation section instructing agents to check docs/ before coding against dependencies."
	},
	{
		"date": "2026-02-21",
		"type": "refactor",
		"slug": "consolidate-data-to-dev3-home",
		"title": "Consolidate all app data under ~/.dev3.0/",
		"body": "Consolidate all app data under ~/.dev3.0/. Projects.json, task data, worktrees, and logs all live under one directory now. Introduced src/bun/paths.ts with a single DEV3_HOME constant. Removed dependency on Utils.paths.userData for data storage."
	},
	{
		"date": "2026-02-21",
		"type": "refactor",
		"slug": "design-tokens",
		"title": "Extracted all hardcoded hex colors into CSS custom properties (design tokens) with Tailwind integration",
		"body": "Extracted all hardcoded hex colors into CSS custom properties (design tokens) with Tailwind integration. Defined two themes: dark (midnight indigo, default) and light. All components now use semantic token classes (bg-base, text-fg, border-edge, etc.) instead of arbitrary color values. Theme switching is prepared via data-theme attribute on root element."
	},
	{
		"date": "2026-02-21",
		"type": "fix",
		"slug": "dev-kill-others",
		"title": "Added --kill-others flag to concurrently in the dev script so all processes terminate when one exits (e.g., closing t...",
		"body": "Added --kill-others flag to concurrently in the dev script so all processes terminate when one exits (e.g., closing the app now also stops the Vite dev server)."
	},
	{
		"date": "2026-02-21",
		"type": "feature",
		"slug": "devtools-on-dev",
		"title": "Open DevTools automatically on dev channel after DOM is ready, using the BrowserView dom-ready event to avoid layout ...",
		"body": "Open DevTools automatically on dev channel after DOM is ready, using the BrowserView dom-ready event to avoid layout issues."
	},
	{
		"date": "2026-02-21",
		"type": "feature",
		"slug": "global-header-and-settings",
		"title": "Added global breadcrumb header visible on all screens (dev-3.0 / Project / Task), replacing per-screen headers",
		"body": "Added global breadcrumb header visible on all screens (dev-3.0 / Project / Task), replacing per-screen headers. Created Global Settings page with live theme switcher (dark/light). Theme preference persists in localStorage and applies on app startup via data-theme attribute."
	},
	{
		"date": "2026-02-21",
		"type": "feature",
		"slug": "i18n-system",
		"title": "Added a custom i18n system with English, Russian, and Spanish support",
		"body": "Added a custom i18n system with English, Russian, and Spanish support. All ~45 hardcoded UI strings in 10 components are now localized via `useT()` hook. Includes interpolation, pluralization (with full Russian plural forms), locale persistence in localStorage, and a language switcher in global settings."
	},
	{
		"date": "2026-02-21",
		"type": "fix",
		"slug": "kanban-bottom-cutoff",
		"title": "Fix Kanban columns being cut off at the bottom",
		"body": "Fix Kanban columns being cut off at the bottom. Replace h-screen/w-screen (100vh lies due to native title bar) with h-full/w-full chain. Set html/body/#root to height:100% + overflow:hidden in CSS so the layout fills exactly the available webview area."
	},
	{
		"date": "2026-02-21",
		"type": "fix",
		"slug": "kanban-vertical-overflow",
		"title": "Fix Kanban columns overflowing viewport height",
		"body": "Fix Kanban columns overflowing viewport height. Add h-full to KanbanColumn so it stays within the board's constrained height, and add min-h-0 + overflow-y-hidden to KanbanBoard to prevent implicit vertical scroll. The \"Add Task\" button now stays visible without scrolling."
	},
	{
		"date": "2026-02-21",
		"type": "feature",
		"slug": "mvp-skeleton",
		"title": "Implement full MVP skeleton: dashboard with project management, Kanban board with 7-column task workflow, terminal vi...",
		"body": "Implement full MVP skeleton: dashboard with project management, Kanban board with 7-column task workflow, terminal view with persistent PTY sessions and tmux, git worktree lifecycle, project settings, and Electrobun RPC bridge between bun and renderer processes."
	},
	{
		"date": "2026-02-21",
		"type": "docs",
		"slug": "product-concept-and-readme",
		"title": "Added product concept docs: extracted detailed design (navigation, Kanban columns, task/terminal lifecycle, worktree ...",
		"body": "Added product concept docs: extracted detailed design (navigation, Kanban columns, task/terminal lifecycle, worktree management) into concept.md with implementation status tracker. Updated AGENTS.md to reference concept.md. Rewrote README.md to reflect the actual project instead of the template boilerplate."
	},
	{
		"date": "2026-02-21",
		"type": "fix",
		"slug": "pty-session-restore",
		"title": "Restore PTY sessions after app restart",
		"body": "Restore PTY sessions after app restart. When opening a terminal for an active task that lost its in-memory session (e.g., after restart), the app now recreates the session automatically. Also use tmux `new-session -A` to reattach to existing tmux sessions instead of failing."
	},
	{
		"date": "2026-02-21",
		"type": "fix",
		"slug": "rpc-timeout-and-add-logger",
		"title": "Fix Add Project not working: set browser-side RPC maxRequestTime to 120s (was 1s default — native dialogs and git ops...",
		"body": "Fix Add Project not working: set browser-side RPC maxRequestTime to 120s (was 1s default — native dialogs and git ops timed out). Add structured logger with console output (colored, timestamped) and file logging to {userData}/logs/YYYY/MM/YYYY-MM-DD.log. Ensure parent directories exist before Bun.write(). Add detailed logging to all backend modules (rpc-handlers, data, git, pty-server, main)."
	},
	{
		"date": "2026-02-21",
		"type": "refactor",
		"slug": "tasks-storage-location",
		"title": "Move tasks.json from project directory ({project}/.dev3/tasks.json) to home directory (~/.dev3.0/data/{project-slug}/...",
		"body": "Move tasks.json from project directory ({project}/.dev3/tasks.json) to home directory (~/.dev3.0/data/{project-slug}/tasks.json). Project directories are now completely clean — dev-3.0 stores nothing inside them."
	},
	{
		"date": "2026-02-21",
		"type": "fix",
		"slug": "terminal-reconnect-garble",
		"title": "Fix terminal garbling, lost colors, and blank screen on reconnect",
		"body": "Fix terminal garbling, lost colors, and blank screen on reconnect. Use ResizeObserver instead of requestAnimationFrame for reliable container dimension detection. Add resize dance (cols-1 then cols) to force SIGWINCH even when PTY dimensions haven't changed. Send tmux capture-pane content on WebSocket reconnect for immediate screen rendering with ANSI colors."
	},
	{
		"date": "2026-02-21",
		"type": "docs",
		"slug": "tmux-window-management",
		"title": "Added tmux window management design notes to concept.md: window naming strategy (coder window with automatic-rename d...",
		"body": "Added tmux window management design notes to concept.md: window naming strategy (coder window with automatic-rename disabled), lookup/fallback logic, terminal recreation policy, and approaches for reading terminal content (ghostty-web viewport, scrollback, and tmux capture-pane)."
	},
	{
		"date": "2026-02-21",
		"type": "refactor",
		"slug": "ui-bigger-brighter",
		"title": "Second UI pass: switched from ultra-dark (#0f1014) to midnight indigo (#171924) palette",
		"body": "Second UI pass: switched from ultra-dark (#0f1014) to midnight indigo (#171924) palette. Bumped all font sizes up (titles text-base/text-lg, card text text-sm, labels text-sm). Wider Kanban columns (240px). Cards now have colored left border accent (3px). More vibrant status colors. Bigger padding and spacing throughout. More rounded corners (rounded-2xl). Button shadows for depth."
	},
	{
		"date": "2026-02-21",
		"type": "refactor",
		"slug": "ui-redesign",
		"title": "Complete UI redesign: darker base background (#0f1014), color-coded Kanban columns with status accent bars, custom dr...",
		"body": "Complete UI redesign: darker base background (#0f1014), color-coded Kanban columns with status accent bars, custom dropdown menus replacing native select elements, SVG icons for navigation and actions, styled scrollbars, hover-reveal delete buttons, project cards with folder icons, animated loading states. Tokyo Night palette preserved with better visual hierarchy."
	},
	{
		"date": "2026-02-21",
		"type": "feature",
		"slug": "vitest-testing-setup",
		"title": "Set up Vitest testing infrastructure with happy-dom, React Testing Library, and jest-dom matchers",
		"body": "Set up Vitest testing infrastructure with happy-dom, React Testing Library, and jest-dom matchers. Added unit tests for i18n interpolation, plural forms, status key mapping, and app state reducer. Added integration test for Dashboard component with mocked Electrobun RPC."
	},
	{
		"date": "2026-02-21",
		"type": "refactor",
		"slug": "worktree-location",
		"title": "Move git worktrees from `{project}/.dev3/worktrees/` to `~/.dev3.0/worktrees/{project-slug}/{taskId}`",
		"body": "Move git worktrees from `{project}/.dev3/worktrees/` to `~/.dev3.0/worktrees/{project-slug}/{taskId}`. Keeps project directories clean and centralizes all worktrees under the home directory."
	}
]