[{"data":1,"prerenderedAt":2346},["ShallowReactive",2],{"changelog-releases":3},[4,115,439,545,786,895,1329,1842,2188],{"id":5,"title":6,"body":7,"date":106,"description":13,"extension":107,"meta":108,"navigation":109,"path":110,"seo":111,"stem":112,"version":113,"__hash__":114},"changelog\u002Fchangelog\u002Fv0.15.0.md","Side-by-side diffs, PR conversations, and steadier Windows sessions",{"type":8,"value":9,"toc":97},"minimark",[10,14,19,27,30,34,37,52,56,63,67,75,78,82,85],[11,12,13],"p",{},"A big review release: diffs can now be read side by side, pull-request conversations live\ninside the Review tab, and several long-standing Windows rough edges are gone.",[15,16,18],"h2",{"id":17},"side-by-side-diffs","Side-by-side diffs",[11,20,21,22,26],{},"Every diff pane — session Review, the Git tab, and the project Git client — now has a\n",[23,24,25],"strong",{},"Unified \u002F Split"," switcher. Split lays the old and new sides next to each other and marks the\nwords that actually changed within a line, so a rename or a reordered argument reads at a glance\ninstead of as two near-identical rows.",[11,28,29],{},"Your choice is remembered globally and applies to all three panes at once. Review comments work\nthe same in both layouts: an anchor still belongs to a line, not to a column.",[15,31,33],{"id":32},"pull-request-conversations","Pull-request conversations",[11,35,36],{},"Once a session has a pull request, the provider's own review conversation is rendered in the\nReview tab beside your local notes — never merged into them. Works with both GitHub and\nBitbucket.",[11,38,39,40,43,44,47,48,51],{},"For each thread you can ",[23,41,42],{},"Reply",", ",[23,45,46],{},"Resolve",", or hand the whole thread to the agent to act on.\nComments that no longer point at any line in the current diff collect in a collapsible\n",[23,49,50],{},"Pull request conversation"," strip rather than silently disappearing.",[15,53,55],{"id":54},"search-your-repositories-when-adding-a-project","Search your repositories when adding a project",[11,57,58,59,62],{},"The repository picker's search box now actually filters. Type to search the repositories you can\nsee on a connected provider, with a ",[23,60,61],{},"refresh"," control beside the box for a repository you have\njust created. When the list is capped, the footnote says so plainly instead of pretending it\nsearched everything.",[15,64,66],{"id":65},"worktrees-that-clean-up-after-themselves","Worktrees that clean up after themselves",[11,68,69,70,74],{},"Deleting a session — or a whole project or workspace — now reliably removes the git worktree\nthat went with it. Previously the ",[71,72,73],"code",{},".git\u002Fworktrees"," entry could outlive its directory, which left\ngit holding the branch and refusing to reuse it.",[11,76,77],{},"The Git tab's refs panel gained a cleanup action for metadata stranded by older versions, and\nPlexus reclaims what it can at startup. When it deliberately keeps something — a branch you may\nstill want, a worktree an agent is still using — it now says so rather than acting silently.",[15,79,81],{"id":80},"windows-sessions-that-start-and-stay-started","Windows: sessions that start, and stay started",[11,83,84],{},"Three separate wedges are fixed. Starting a session no longer hangs on a \"Starting…\" spinner\nthat only a restart could clear. Resuming a session resumes the actual conversation instead of\nopening a fresh one. And the review-and-fix cycle no longer freezes the window after its first\nround.",[11,86,87,88,92,93,96],{},"If Windows has been asking ",[89,90,91],"em",{},"\"Are you sure you want to uninstall this product?\""," every time\nPlexus updates, it can now find the older installation responsible and offer to remove it — see\n",[23,94,95],{},"Settings → About",".",{"title":98,"searchDepth":99,"depth":99,"links":100},"",2,[101,102,103,104,105],{"id":17,"depth":99,"text":18},{"id":32,"depth":99,"text":33},{"id":54,"depth":99,"text":55},{"id":65,"depth":99,"text":66},{"id":80,"depth":99,"text":81},"2026-08-04","md",{},true,"\u002Fchangelog\u002Fv0.15.0",{"title":6,"description":13},"changelog\u002Fv0.15.0","v0.15.0","TJ5COIgPU6dV1Kc7jGTkJI2JlYqiEhHfcrfM5zk548Q",{"id":116,"title":117,"body":118,"date":432,"description":122,"extension":107,"meta":433,"navigation":109,"path":434,"seo":435,"stem":436,"version":437,"__hash__":438},"changelog\u002Fchangelog\u002Fv0.16.0.md","Sessions on branches you already have, hooks that add up, and a What's new window",{"type":8,"value":119,"toc":412},[120,123,127,142,148,152,163,169,174,185,189,196,207,214,229,233,246,250,269,272,276,287,305,308,311,321,325,328,335,339,348,352,358,376,379,383,386,390,396,402,406],[11,121,122],{},"Sessions can now start on a branch that already exists, repository hooks run alongside the ones\nyou set up rather than replacing them, and every release explains itself — in the app and on the\nweb.",[15,124,126],{"id":125},"release-notes-you-can-actually-read","Release notes you can actually read",[11,128,129,130,137,138,141],{},"Plexus now keeps a changelog. Every release is published at\n",[131,132,136],"a",{"href":133,"rel":134},"https:\u002F\u002Frunplexus.com\u002Fchangelog",[135],"nofollow","runplexus.com\u002Fchangelog",", and the app shows you what changed\nin a ",[23,139,140],{},"What's new"," window the first time you run a new version — one tab per feature, so each\none gets room to explain itself rather than a single line in a toast.",[11,143,144,145,96],{},"You will only ever see it once per version. If you skipped a few releases, they are all there,\nselectable from the top of the window. You can reopen it any time from\n",[23,146,147],{},"Settings → About → What's new",[15,149,151],{"id":150},"repository-hooks-run-alongside-your-own","Repository hooks run alongside your own",[11,153,154,155,158,159,162],{},"A repository that commits a ",[71,156,157],{},".plexus\u002Fhooks.json"," used to ",[23,160,161],{},"replace"," the hooks you had set up in\nPlexus for that project — every event, even the ones the file says nothing about. Both sets run\nnow. Cloning a repo still gets you the team's setup, and it no longer costs you the hooks you\nadded for yourself.",[11,164,165,168],{},[23,166,167],{},"How repository hooks combine with yours"," (Settings → Worktrees & Hooks) decides which set goes\nfirst: the repository's hooks first (the default), yours first, or repository hooks only. That\nlast value is the old behaviour, if you want it back. Like the other hook settings it layers\nglobal → workspace → project, so one choice can cover everything and a single project can still\ndiffer.",[170,171,173],"h3",{"id":172},"if-you-used-repository-hooks-before-this-version","If you used repository hooks before this version",[11,175,176,177,180,181,184],{},"Hooks you set up in Plexus for such a project ",[23,178,179],{},"start running again"," the next time a session\nstarts, resumes, or is torn down — including the teardown that runs when you delete a session or\na project. Open ",[23,182,183],{},"Settings → Worktrees & Hooks"," on the project to see exactly what will run; the\neditor points this out once, on projects that have both.",[15,186,188],{"id":187},"plexus-tells-you-when-a-connection-needs-renewing","Plexus tells you when a connection needs renewing",[11,190,191,192,195],{},"GitHub and Bitbucket grant a token the permissions the app had ",[23,193,194],{},"at the moment you signed in",".\nIf that set later changes, your existing connection quietly keeps the narrower access — and\nrefreshing it in the background never widens it. Until now you found out when something failed:\na repository search that couldn't list anything, or a pull-request status that stopped updating.",[11,197,198,199,202,203,206],{},"Plexus now checks for itself, shortly after starting and occasionally while you work. When the\naccess no longer covers what it needs, a notice names the missing permission — in the wording the\nprovider itself uses, like Bitbucket's ",[23,200,201],{},"Workspace membership: Read"," — and offers ",[23,204,205],{},"Reconnect","\nright there, so you sign in without leaving what you were doing.",[11,208,209,210,213],{},"It then re-checks before telling you it worked. Signing in again is not what clears the warning;\nthe check is. So if a reconnect happens to land on the same narrow access, Plexus says so plainly\nand stops asking, rather than sending you round the same loop. ",[23,211,212],{},"Settings → Git providers"," keeps\nshowing the warning until a check finds the access restored, and a later permissions change\nraises a fresh notice — dismissing one never silences the next.",[11,215,216,217,220,221,224,225,228],{},"Two settings under ",[23,218,219],{},"Settings → Git & PRs → Connection checks"," control it: ",[23,222,223],{},"Check that provider\nconnections still work"," turns it off entirely, and ",[23,226,227],{},"How often to check provider connections\n(hours)"," spaces the checks out on a metered connection or a rate-limited account.",[15,230,232],{"id":231},"settings-grouped-into-sections","Settings grouped into sections",[11,234,235,236,43,239,43,242,245],{},"Settings pages are no longer one long list. Related settings now sit together under a heading\nwith a line describing what the group covers — ",[23,237,238],{},"Pull requests",[23,240,241],{},"Code review",[23,243,244],{},"Fetching and\nremotes",", and so on. Nothing moved between pages, so anything you knew where to find is still\non the same page.",[170,247,249],{"id":248},"override-one-group-at-a-time","Override one group at a time",[11,251,252,253,256,257,260,261,264,265,268],{},"On a workspace's or project's settings, ",[23,254,255],{},"Override parent settings"," now belongs to each section\nrather than to the whole page. You can override ",[23,258,259],{},"Copied files"," for one project and leave\n",[23,262,263],{},"Session folders"," and ",[23,266,267],{},"Lifecycle hooks"," inheriting, and turning a section back off clears only\nthat section's overrides.",[11,270,271],{},"One consequence worth knowing: if you had previously overridden a whole page to change a single\nvalue, only the sections you actually edited will show as overridden. Nothing you set has been\nlost — the rest of that page was inheriting all along, and now says so.",[15,273,275],{"id":274},"start-a-session-on-a-branch-that-already-exists","Start a session on a branch that already exists",[11,277,278,279,282,283,286],{},"Starting a session always cut a new branch for it. Now the New session dialog has a mode switch:\nkeep ",[23,280,281],{},"New branch"," for that, or pick ",[23,284,285],{},"Existing branch"," to check out a branch that is already\nthere. Point a session at a colleague's pushed branch to carry it forward, or at one you have\nbeen asked to look at, and review it with the agent in a worktree of its own.",[11,288,289,292,293,296,297,300,301,304],{},[23,290,291],{},"Branch"," is what gets checked out; ",[23,294,295],{},"Compare with"," is what the Review tab diffs against, what\n",[23,298,299],{},"Rebase onto…"," targets, and the base of any pull request you open. It defaults to your\nrepository's trunk — usually ",[71,302,303],{},"main"," — rather than whatever your main working copy happens to be\non, so a branch you did not cut is compared against something meaningful.",[11,306,307],{},"A branch that only exists on the remote works the same way: Plexus creates a local branch\ntracking it, so it starts at the remote's tip and ahead\u002Fbehind counts are right from the start.",[11,309,310],{},"Git allows a branch in exactly one working copy at a time, so a branch that is already checked\nout is shown greyed out with the reason — the session holding it, your project's own working\ncopy, or a leftover worktree record you can clear from the Git tab.",[11,312,313,316,317,320],{},[23,314,315],{},"Pull base branch first"," becomes ",[23,318,319],{},"Pull the branch first"," in this mode: it fetches, then\nfast-forwards the branch you picked, so you do not quietly start on a copy from last week.",[170,322,324],{"id":323},"plexus-will-not-delete-a-branch-it-did-not-create","Plexus will not delete a branch it did not create",[11,326,327],{},"Cancelling a start, a setup script that stops the launch, or an agent that fails to start all\nclean up the session's working copy — but a branch that was already there is left alone. Only a\nbranch Plexus cut for the session is removed, exactly as before.",[11,329,330,331,334],{},"Deleting one on purpose is still possible: ",[23,332,333],{},"Also delete the local branch"," asks a second time\nand names the branch, and it is never pre-ticked from your last answer the way it is for a branch\nPlexus created. Git then keeps any branch still carrying commits that are not merged anywhere\nelse, and Plexus tells you it did. Deleting a project or workspace works the same way, listing\nthe branches it did not create before it touches them.",[170,336,338],{"id":337},"one-thing-to-keep-in-mind","One thing to keep in mind",[11,340,341,264,344,347],{},[23,342,343],{},"Rebase",[23,345,346],{},"Squash"," rewrite the branch's history. On a branch you share with other people,\nthat is history they may already have — so Plexus warns rather than stopping you. Nothing leaves\nyour machine until you push, and Plexus never force-pushes.",[15,349,351],{"id":350},"the-pull-request-conversation-stays-out-of-the-way","The pull request conversation stays out of the way",[11,353,354,355,357],{},"The ",[23,356,50],{}," section at the top of the Review tab now starts collapsed, so\nopening the tab shows you the diff rather than a wall of remote comments. Opening it is for the\nvisit you're on — come back to the tab later and it's closed again.",[11,359,360,361,364,365,368,369,264,372,375],{},"Collapsed, its header still tells you what it's holding: a count of what's actually inside the\nsection, an ",[23,362,363],{},"Approved"," or ",[23,366,367],{},"Changes requested"," chip when a reviewer left a verdict, and a\nwarning triangle when only part of a very busy conversation could be fetched. ",[23,370,371],{},"Comment on the\nPR",[23,373,374],{},"Send N PR comments to agent"," stay where they were, so neither needs the section open.",[11,377,378],{},"Opened, the section takes at most about 40% of the tab and scrolls inside that, with its header\nstaying put. A long conversation can no longer squeeze the diff off the screen.",[170,380,382],{"id":381},"the-count-now-describes-whats-behind-it","The count now describes what's behind it",[11,384,385],{},"It used to count every thread on the pull request, including the ones that render against their\ndiff lines further down. It now counts what opening the section actually gives you — the\ncomments that have no home on a line, plus the review verdicts.",[170,387,389],{"id":388},"approving-without-writing-anything-counts","Approving without writing anything counts",[11,391,392,393,395],{},"A reviewer who clicks Approve and leaves the comment box empty — GitHub's default — used to be\ndropped entirely on the way in. If they had asked for changes earlier, Plexus went on reporting\n",[23,394,367],{}," long after they had approved. Empty-bodied decisions now come through and\nappear as a one-line entry with the reviewer's name and the verdict.",[11,397,398,399,401],{},"The chip also reads the review history correctly: each reviewer's most recent decision counts, so\nan approval replaces that same reviewer's earlier ",[23,400,367],{},", while one reviewer still\nasking for changes outweighs everyone else's approval.",[170,403,405],{"id":404},"writing-a-comment-has-room-of-its-own","Writing a comment has room of its own",[11,407,408,411],{},[23,409,410],{},"Comment on the PR"," opens its box below the section rather than inside it, so the conversation's\nsize limit never squeezes what you're typing, and collapsing the section while you write is a way\nto make room — your text stays put when you do.",{"title":98,"searchDepth":99,"depth":99,"links":413},[414,415,419,420,423,427],{"id":125,"depth":99,"text":126},{"id":150,"depth":99,"text":151,"children":416},[417],{"id":172,"depth":418,"text":173},3,{"id":187,"depth":99,"text":188},{"id":231,"depth":99,"text":232,"children":421},[422],{"id":248,"depth":418,"text":249},{"id":274,"depth":99,"text":275,"children":424},[425,426],{"id":323,"depth":418,"text":324},{"id":337,"depth":418,"text":338},{"id":350,"depth":99,"text":351,"children":428},[429,430,431],{"id":381,"depth":418,"text":382},{"id":388,"depth":418,"text":389},{"id":404,"depth":418,"text":405},"2026-08-05",{},"\u002Fchangelog\u002Fv0.16.0",{"title":117,"description":122},"changelog\u002Fv0.16.0","v0.16.0","h6qJBrGMsLEfHPL1pEeCNKOt9dfZ68XCmmOdJ-pyRwI",{"id":440,"title":441,"body":442,"date":538,"description":446,"extension":107,"meta":539,"navigation":109,"path":540,"seo":541,"stem":542,"version":543,"__hash__":544},"changelog\u002Fchangelog\u002Fv0.16.1.md","Git that authenticates itself, and a What's new window that shows up",{"type":8,"value":443,"toc":533},[444,447,451,466,475,482,485,489,492,503,513,517,523,526],[11,445,446],{},"Fetch and push can now use the GitHub or Bitbucket account you connected in Plexus when your\nmachine has no credentials of its own. The What's new window no longer sits out the update that\nintroduced it, and a release now runs down the side of it rather than across the top.",[15,448,450],{"id":449},"your-connected-provider-now-authenticates-git-too","Your connected provider now authenticates git too",[11,452,453,454,457,458,461,462,465],{},"Fetch, Pull and Push run the real ",[71,455,456],{},"git"," on your machine, so they have always used your own\ncredentials — a credential helper, an SSH key, whatever ",[71,459,460],{},"git fetch"," would use in a terminal.\nOn a machine that has none of those for an ",[71,463,464],{},"https"," remote, that was the end of it: the\noperation simply failed, even for people who had signed into GitHub or Bitbucket in Plexus.",[11,467,468,469,471,472,474],{},"That connection now counts. If your machine's own credentials can't authenticate an ",[71,470,464],{},"\nremote on GitHub or Bitbucket, Plexus retries the operation once with the account you\nconnected in ",[23,473,212],{}," — including background fetches, which cannot ask\nyou for anything. Most people will simply notice that Fetch works now.",[11,476,477,478,481],{},"Your own credentials still go first, always. The connection is only ever tried after git's\nown attempt has failed, so a credential helper with wider access than your Plexus connection\nkeeps being the one that authenticates, and nothing about a setup that already works changes.\nThe token is offered only to the provider's own host, only for that one command — never\nwritten into your repository's config or its remote URL. ",[71,479,480],{},"ssh"," remotes are untouched.",[11,483,484],{},"And if the provider turns that connection down — the account can't reach the repository, the\ngrant was revoked, your organization hasn't authorized it — Plexus rests it for a few minutes\ninstead of doubling every fetch with an attempt it already knows will fail. Reconnecting the\nprovider clears that immediately, so following the error's own advice never means waiting.",[15,486,488],{"id":487},"git-errors-that-say-what-to-do","Git errors that say what to do",[11,490,491],{},"A git operation that couldn't authenticate used to report git's own words:",[493,494,495],"blockquote",{},[11,496,497,498,502],{},"git command failed: fatal: could not read Password for '",[131,499,500],{"href":500,"rel":501},"https:\u002F\u002Fyou@bitbucket.org",[135],"': terminal\nprompts disabled",[11,504,505,506,508,509,512],{},"Which reads like a Plexus fault, and isn't — \"terminal prompts disabled\" is Plexus deciding\nnever to hang on a password box you can't see. That message now names the host that refused\nand what will fix it: connect the provider, sort out your credential helper, or switch the\nremote to ",[71,507,480],{},". If the credentials that ",[89,510,511],{},"were"," tried got refused — an expired app password, a\nrevoked token — it says that instead, which is a different problem with a different fix.",[15,514,516],{"id":515},"the-whats-new-window","The What's new window",[11,518,519,520,522],{},"Plexus shows a ",[23,521,140],{}," window the first time you run a new version. Until now it stayed\nquiet unless it already had a record of what you had last been shown — which nobody had before\nthe window itself existed, so the release that introduced it was the one release it could not\nannounce. It now opens after an update, with the notes for the version you have just moved to.",[11,524,525],{},"A brand-new install still opens straight into Plexus. A first launch is not an update, and\nnobody's first minute with an app should be a wall of release notes.",[11,527,528,529,532],{},"The window is also wider, and the changes in a release are listed ",[23,530,531],{},"down the left-hand side","\nrather than across the top, so you can see everything a release contains at a glance instead of\nscrolling a strip of tabs. A long entry scrolls on its own, while the title, the release you are\nreading and the buttons stay where they are.",{"title":98,"searchDepth":99,"depth":99,"links":534},[535,536,537],{"id":449,"depth":99,"text":450},{"id":487,"depth":99,"text":488},{"id":515,"depth":99,"text":516},"2026-08-06",{},"\u002Fchangelog\u002Fv0.16.1",{"title":441,"description":446},"changelog\u002Fv0.16.1","v0.16.1","P21Ed8B2L1vnI0Z5S0uD4aONRsmvc149JbDld63tv9k",{"id":546,"title":547,"body":548,"date":779,"description":552,"extension":107,"meta":780,"navigation":109,"path":781,"seo":782,"stem":783,"version":784,"__hash__":785},"changelog\u002Fchangelog\u002Fv0.17.0.md","Remotes without a terminal, discarding where you are looking, and a file list that remembers",{"type":8,"value":549,"toc":768},[550,553,556,560,581,594,604,608,615,619,622,626,632,647,651,658,668,679,683,695,698,717,720,724,735,738,741,748,752,755,758,765],[11,551,552],{},"The project Git tab can now add, edit and remove the repository's remotes: right-click a\nremote's heading in the refs panel to rename it, point it somewhere else, or drop it — and\nhover it to see where it actually points.",[11,554,555],{},"Throwing away uncommitted work has stopped meaning a hunt through the panel header, too.\nChanged files answer to a right-click like everything else in the git client, the whole\nworking tree can go in one action, and a single hunk can go without the rest of the file.\nAnd in the Review tab, resolving a comment no longer drops the file from the file list —\neach row now says both how many comments are still open and how many have been dealt with.",[15,557,559],{"id":558},"add-edit-and-remove-remotes","Add, edit and remove remotes",[11,561,562,563,566,567,43,570,43,573,576,577,580],{},"Until now the Git tab showed you the remotes your repository had and left changing them to a\nterminal. Each remote's ",[23,564,565],{},"heading in the refs panel"," is now a menu: ",[23,568,569],{},"Edit remote…",[23,571,572],{},"Add\nremote…",[23,574,575],{},"Remove remote…",", and copies of its URL and its name. Hovering that heading tells you\nthe URL it points at, and the separate push URL underneath when it has one — so a repository whose\n",[71,578,579],{},"origin"," quietly points at the wrong fork is something you can now see rather than something you\nfind out about on the next push.",[11,582,583,586,587,589,590,593],{},[23,584,585],{},"Add remote…"," takes a name and a URL — HTTPS, SSH, or a path to a repository on your own machine.\n",[23,588,569],{}," renames it, repoints it, and can give it a separate ",[23,591,592],{},"push URL"," so fetches and\npushes go to different places. Renaming is the safe kind of rewrite: the remote's branches move to\nthe new name and every local branch that was tracking one is repointed for you.",[11,595,596,597,599,600,603],{},"If the repository has no remotes at all, the refs panel offers ",[23,598,585],{}," on the spot, and so\ndoes the ",[23,601,602],{},"Pull"," button's menu — with nothing to pull from, there is no heading to right-click.",[170,605,607],{"id":606},"adding-a-remote-doesnt-reach-out-to-it","Adding a remote doesn't reach out to it",[11,609,610,611,614],{},"The Add dialog has a ",[23,612,613],{},"Fetch after adding"," switch, on by default, that runs an ordinary fetch right\nafter. The two stay separate steps on purpose: a typo in the URL or a credential the remote won't\naccept is then reported as a fetch that failed against a remote that was still added properly,\nrather than as an add that half-worked and left you guessing which half.",[170,616,618],{"id":617},"credentials-stored-in-a-url-are-left-alone","Credentials stored in a URL are left alone",[11,620,621],{},"Some remote URLs carry a password or a token in them. Plexus shows those URLs without it, and the\nEdit dialog leaves that field empty with the stripped URL as a hint. Leave it empty and the stored\nURL is kept exactly as it is, credential included; type a new one and it replaces the whole thing,\nso put the credential back in if you still need it there.",[170,623,625],{"id":624},"what-removing-costs-and-what-it-doesnt","What removing costs, and what it doesn't",[11,627,628,629,96],{},"Removing a remote deletes your local copies of its branches and clears the upstream of every local\nbranch that tracked one. The confirmation spells that out first, down to which branch copies go and\nhow many locals lose their upstream. Your own branches and their commits stay put, and ",[23,630,631],{},"nothing at\nall changes on the server",[11,633,634,635,638,639,643,644,646],{},"Two things are worth knowing before you rename or remove one. Remotes belong to the ",[23,636,637],{},"repository",",\nnot to a session: every session of a project works in a linked copy of the same checkout, so the\nchange reaches all of them at once. And Plexus finds a project's pull requests through the remote\ncalled ",[23,640,641],{},[71,642,579],{}," — so renaming or removing that one clears its record of which pull request\nbelongs to which session, and the badges showing it. Nothing is lost on GitHub or Bitbucket: those\nlinks come back on the next refresh, worked out from wherever ",[71,645,579],{}," points now.",[15,648,650],{"id":649},"right-click-a-changed-file","Right-click a changed file",[11,652,653,654,657],{},"Every other row in the git client has a right-click menu — branches, tags, stashes, worktrees,\ncommits. Changed files did not, which made ",[23,655,656],{},"Discard"," hard to find: it only appeared in the\npanel header once you had already selected something, and the header is nowhere near the file\nyou are looking at.",[11,659,660,661,264,664,667],{},"Changed files now have their own menu, in both the project Git client and a session's Git tab.\nIt stages or unstages the file, copies its path or its name, and discards it. On a conflicted\nfile it offers ",[23,662,663],{},"Take ours",[23,665,666],{},"Take theirs"," instead, with discard greyed out until the\nconflict is resolved.",[11,669,670,671,674,675,678],{},"The menu follows the same rule your file manager does. Right-click a file that is already part\nof a selection and the whole selection is what gets discarded — the entry says which, reading\n",[23,672,673],{},"Discard 3 files…"," rather than ",[23,676,677],{},"Discard changes…",". Right-click anywhere else and that one\nfile becomes the selection first. Staging is the exception, and the labels make it obvious: it\nalways acts on just the file you clicked.",[15,680,682],{"id":681},"discard-all-changes","Discard all changes",[11,684,685,264,688,691,692,96],{},[23,686,687],{},"Stage all",[23,689,690],{},"Unstage all"," have always been one click. Discarding everything meant\nselecting every row by hand. With nothing selected, the header now offers ",[23,693,694],{},"Discard all",[11,696,697],{},"Every tracked file goes back to its state at the last commit, and every new file is deleted from\ndisk — including new files you have already staged, which have never been committed either. A\nswitch in the confirmation turns that second part off if you would rather keep them, and the\ndialog says how many of each it found before you commit to anything. Empty folders left behind\nby deleted files go too, which the per-file discard never handled.",[11,699,700,701,704,705,708,709,712,713,716],{},"Files ignored by ",[71,702,703],{},".gitignore"," are never touched, and there is no switch that changes that. Your\n",[71,706,707],{},"node_modules",", your build output and your local ",[71,710,711],{},".env"," are not part of \"your changes\" — they\nnever appear in the file list, so a confirmation could not honestly show you what it was about\nto delete. If you genuinely want that, ",[71,714,715],{},"git clean -xfd"," in the built-in terminal is one line and\ncarries its own warning.",[11,718,719],{},"Discard all also refuses while a merge, rebase, cherry-pick or revert is in progress. Reverting\nthe working tree underneath one of those does not cancel it — it strands it, leaving git\nconvinced an operation is still running over files that no longer contain the resolution.\nFinish or abort it from the conflict banner first, and the button explains itself in the\nmeantime.",[15,721,723],{"id":722},"discard-a-single-hunk","Discard a single hunk",[11,725,726,727,730,731,734],{},"Diffs in the project Git client already let you stage one hunk at a time. Each hunk on the\nunstaged side now carries a ",[23,728,729],{},"Discard hunk"," button next to ",[23,732,733],{},"Stage hunk",", for the case where\none experiment in a file did not work out and the rest of it did.",[11,736,737],{},"It reverts only those lines, and only in the working tree. Anything you have already staged in\nthe same file is left exactly as it was, so a file you were carefully splitting across two\ncommits stays split.",[11,739,740],{},"To discard a hunk you have already staged, unstage it first and then discard it. That is one\nextra click and it is deliberate: once a file is both staged and further edited, \"remove just\nthe staged half of these lines\" has no single correct answer, and guessing at one would quietly\ndestroy the other half. Unstaging first merges the two into the hunk you can actually see, so\nyou are confirming against the real result.",[11,742,743,744,747],{},"Discarding still cannot be undone and still never stashes anything on your behalf. ",[23,745,746],{},"Stash","\nsits next to it for when you might want the work back.",[15,749,751],{"id":750},"resolved-comments-stay-on-the-file-list","Resolved comments stay on the file list",[11,753,754],{},"A file with comments used to carry one badge — a speech bubble and a count of its open comments.\nResolve them all and the badge went away, which left a file you had just read and worked through\nlooking exactly like one nobody had ever opened.",[11,756,757],{},"Each row now shows two badges: a speech bubble with the open comments, and a check with the\nresolved ones. Either appears only when it has something to count, so a file whose comments are\nall resolved still says so, and a file with no comments still shows nothing at all.",[11,759,760,761,764],{},"This was most confusing where Plexus resolves comments for you. ",[23,762,763],{},"Send N comments to agent","\nresolves everything it sends, and so does each round of the review-and-fix cycle — so handing a\nwhole review over used to blank the entire sidebar in one click. It now reads as a count of\nresolved comments per file: a record of what was addressed, on the files it was addressed on.",[11,766,767],{},"While the pull request conversation is shown, both badges count its threads too — open threads\nin the speech bubble, resolved ones in the check. Hide the conversation and they go back to\ncounting only your own notes, so a badge never points at a comment the tab isn't showing you.\n(A pull request thread that no longer lines up with the diff still counts on its file — you'll\nfind that one in the conversation rather than on a diff line.)",{"title":98,"searchDepth":99,"depth":99,"links":769},[770,775,776,777,778],{"id":558,"depth":99,"text":559,"children":771},[772,773,774],{"id":606,"depth":418,"text":607},{"id":617,"depth":418,"text":618},{"id":624,"depth":418,"text":625},{"id":649,"depth":99,"text":650},{"id":681,"depth":99,"text":682},{"id":722,"depth":99,"text":723},{"id":750,"depth":99,"text":751},"2026-08-07",{},"\u002Fchangelog\u002Fv0.17.0",{"title":547,"description":552},"changelog\u002Fv0.17.0","v0.17.0","hY-cu3CRq29ee8Tc7cQprmtG7ocyVtCLfWufOzCutN4",{"id":787,"title":788,"body":789,"date":888,"description":793,"extension":107,"meta":889,"navigation":109,"path":890,"seo":891,"stem":892,"version":893,"__hash__":894},"changelog\u002Fchangelog\u002Fv0.17.1.md","A commit graph that stays on screen, and links that open",{"type":8,"value":790,"toc":881},[791,794,801,805,812,815,819,822,826,833,837,859,865,871,875,878],[11,792,793],{},"The project Git tab's commit graph could go blank and stay blank until you switched to\nanother tab and back. It no longer can — and while you are down in a repository's history,\nrefreshing now keeps your place instead of throwing it away.",[11,795,796,797,800],{},"Clicking a link in Plexus mostly did nothing, either. The ",[23,798,799],{},"Open in browser"," button on a\npull-request comment, a link inside a comment someone wrote on your PR, a link in a markdown\nfile you were previewing, a dependency's homepage on the About screen, a link in this very\nchangelog window — all of them were dead. Not slow, not an error: nothing at all. They open\nnow.",[15,802,804],{"id":803},"the-commit-graph-no-longer-goes-blank","The commit graph no longer goes blank",[11,806,807,808,811],{},"Scrolling a fair way down a project's commit history and then doing anything that reloaded\nit could leave the graph pane empty. Deleting a branch was the easiest way to hit it, but it\ndid not need a git operation at all: leaving Plexus and coming back, or an agent committing\nin a session worktree of the same repository, would do it just as well. Nothing brought the\ngraph back except switching to another tab and returning — and typing into ",[23,809,810],{},"Search commits","\nwhile scrolled down could empty the pane the same way, taking the search results with it.",[11,813,814],{},"The pane now stays on the deepest position that still exists whenever the history under it\ngets shorter, so there is nothing left to strand it.",[15,816,818],{"id":817},"refreshing-keeps-your-place-in-the-history","Refreshing keeps your place in the history",[11,820,821],{},"Loading more commits and then refreshing used to snap you back to the most recent 200, which\nhappened on every commit, checkout, branch switch and background refresh. A refresh now\nreloads as much history as you had actually loaded, so the graph stays where you were reading.",[15,823,825],{"id":824},"the-graph-says-when-it-is-loading-and-when-it-could-not-load","The graph says when it is loading, and when it could not load",[11,827,828,829,832],{},"If reading a repository's history failed, the graph pane simply sat empty with no explanation\nand no way to try again. It now tells you it is loading while it works, and shows what went\nwrong with a ",[23,830,831],{},"Try again"," button if it could not.",[15,834,836],{"id":835},"links-open-in-your-browser-again","Links open in your browser again",[11,838,839,840,842,843,846,847,850,851,854,855,858],{},"The button that started it was the small ",[23,841,799],{}," icon on a pull-request comment\nthread in the ",[23,844,845],{},"Review"," tab, and the ",[23,848,849],{},"read them on the provider"," link next to a thread\nPlexus had only fetched part of. Both went nowhere. The same fault was underneath every other\nlink in the app that was written as markdown rather than as a button — links inside PR comment\nbodies, in the ",[23,852,853],{},"Explorer","'s markdown preview, in an AI session summary, and in the ",[23,856,857],{},"What's\nnew"," window you are probably reading this in.",[11,860,861,864],{},[71,862,863],{},"mailto:"," links now open your mail client, too. They used to be styled as links, sit there\nlooking clickable, and do nothing.",[11,866,867,868,870],{},"Where Plexus genuinely cannot open something — an address in a form no browser handles — it no\nlonger shows you a button for it. A dependency on ",[23,869,95],{}," whose homepage Plexus\ncan't open is now printed as plain text instead of a link that fails silently, and a\npull-request comment whose permalink is unusable simply has no button. If your system refuses\nto open a link, you get a message saying so rather than nothing happening.",[15,872,874],{"id":873},"session-summaries-cant-lose-the-window","Session summaries can't lose the window",[11,876,877],{},"A link in an AI session summary was worse than dead. Summaries are written by the agent, and if\none contained a link to a file in the repository — the kind of thing an agent writes without\nthinking about it — clicking it replaced Plexus's own window with a blank page, with no way back\nexcept quitting and reopening the app.",[11,879,880],{},"Links in a summary now behave like links everywhere else: the ones that point at a real web page\nopen in your browser, and the ones that point at a file in your repository do nothing at all.",{"title":98,"searchDepth":99,"depth":99,"links":882},[883,884,885,886,887],{"id":803,"depth":99,"text":804},{"id":817,"depth":99,"text":818},{"id":824,"depth":99,"text":825},{"id":835,"depth":99,"text":836},{"id":873,"depth":99,"text":874},"2026-08-09",{},"\u002Fchangelog\u002Fv0.17.1",{"title":788,"description":793},"changelog\u002Fv0.17.1","v0.17.1","isPPikylur8nNbb--54TQ-RUReEj0YIbJyM4OkOGH58",{"id":896,"title":897,"body":898,"date":1322,"description":902,"extension":107,"meta":1323,"navigation":109,"path":1324,"seo":1325,"stem":1326,"version":1327,"__hash__":1328},"changelog\u002Fchangelog\u002Fv0.18.0.md","An activity dot that works on Windows, published review notes, and comments that delete",{"type":8,"value":899,"toc":1305},[900,903,906,909,912,915,918,922,934,941,948,953,959,963,973,977,984,987,994,998,1005,1008,1011,1015,1026,1029,1035,1038,1064,1068,1077,1081,1095,1098,1101,1111,1114,1120,1124,1130,1136,1140,1143,1153,1157,1160,1163,1167,1178,1181,1184,1188,1199,1214,1218,1221,1236,1243,1250,1265,1275,1282,1286],[11,901,902],{},"The notes you leave on a diff line have always been private — written for the agent, kept on\nyour machine. Sometimes the right reader is a person instead. A note can now be posted to the\nsession's pull request as an inline comment on the same line, one at a time or the whole\nreview at once. And notes finally keep their line breaks, so a paragraph stays a paragraph\nwherever it ends up.",[11,904,905],{},"Deleting one of those notes could also do nothing at all, and then insist the note no longer\nexisted. Both halves of that are fixed.",[11,907,908],{},"Connected accounts got a fix of their own: a Bitbucket connection that was short of a\npermission could ask you to reconnect for ever, and now it stops once it has been asked\nand answered.",[11,910,911],{},"On some Windows machines the green dot next to a session simply never lit up. The agent was\nworking perfectly — it just never looked like it, so a wall of sessions gave you nothing to\nread and the dashboard was worth no more than a glance at each terminal.",[11,913,914],{},"The cause was a link in the chain nobody could see. Plexus asked Claude Code to report what\nyour agent was doing by running a small command, and Claude Code hands that command to a\nshell — which on Windows is PowerShell unless you happen to have Git Bash installed. There\nthe report was quietly lost on the way. That is why it broke for some Windows users and not\nothers, and why nothing anywhere said so.",[11,916,917],{},"Plexus no longer asks a shell. It also no longer depends on those reports arriving at all,\nand if something is still wrong there is now a button that tells you which link is broken.",[15,919,921],{"id":920},"publish-a-note-to-the-pull-request","Publish a note to the pull request",[11,923,924,925,43,928,264,930,933],{},"Every inline note carries a fourth button next to ",[23,926,927],{},"Edit",[23,929,46],{},[23,931,932],{},"Delete",":\npublish it. It posts the note to the session's pull request as an inline comment on the same\nfile and line, under your own GitHub or Bitbucket account.",[11,935,936,937,940],{},"Plexus asks first. A confirmation shows the note about to go out and names the repository it\nis going to, as ",[71,938,939],{},"owner\u002Frepo#number"," — publishing is public and there is no undo from Plexus,\nso the last step is always yours.",[11,942,943,944,947],{},"Publishing ",[23,945,946],{},"consumes"," the note. Once the comment lands, the local copy is deleted and the\npull request's own thread renders on that line in its place, so there is nothing left in\nPlexus to accidentally send twice. To change or remove it afterwards, edit or delete the\ncomment on GitHub or Bitbucket, the same as any other comment you left there.",[11,949,950,951,96],{},"The Review header carries the bulk version — the same confirmation, a button with a count.\nIt sends the session's unresolved notes, up to forty at a time; with more than that the dialog\nsays so (\"the first 40 of 57\") rather than quietly leaving the rest behind. Notes whose file\nhas left the diff are skipped, since there is no line left to anchor them to — which is why\nthe count can be lower than the one on ",[23,952,763],{},[11,954,955,956,958],{},"Resolved notes can be published too. ",[23,957,763],{}," resolves everything it\nsends, and so does each round of the review-and-fix cycle, so the notes worth showing a\nreviewer are often exactly the resolved ones.",[170,960,962],{"id":961},"notes-the-ai-review-agent-wrote-say-so","Notes the AI review agent wrote say so",[11,964,965,966,969,970,972],{},"A published note that the AI review agent drafted opens with an italic line, ",[89,967,968],{},"Drafted by the\nPlexus review agent."," — someone reading the thread should know which findings came from a\nmodel rather than from you. Notes you wrote yourself go out exactly as written, with no\nmarker, the same as the line composer's ",[23,971,410],{}," always has.",[170,974,976],{"id":975},"when-its-offered-and-what-can-still-refuse-it","When it's offered, and what can still refuse it",[11,978,979,980,983],{},"Both buttons appear only once the pull request's conversation has actually loaded, only while\nthe pull request's comments are shown, and only while the pull request is ",[23,981,982],{},"open"," — a merged\nor closed one takes no new comments.",[11,985,986],{},"A line that isn't part of the pull request's diff yet is refused by the provider. Plexus keeps\nthat note and tells you which ones didn't land, so committing and pushing and trying again is\nall it takes. A large batch goes out one comment at a time, paced so the provider doesn't\nrate-limit it halfway through; if it does run into a rate limit or an authentication problem\nit stops there and reports the rest as untried, rather than hammering an endpoint that has\nalready said no.",[11,988,989,990,993],{},"And you can stop a batch yourself: while one is running, the header button becomes a ",[23,991,992],{},"Stop",".\nIt stops at the next note — the comment already on its way still lands — and leaves the rest\nuntouched, so publishing again picks up where it left off.",[15,995,997],{"id":996},"notes-keep-their-line-breaks","Notes keep their line breaks",[11,999,1000,1001,1004],{},"An inline note used to be flattened into a single line the moment it was saved, which turned a\ntwo-paragraph thought — or an AI review finding with a code block in it — into one long run of\ntext. It doesn't any more: paragraphs, nested lists, indented code fences and the alignment\ninside them survive being saved, so the Review tab shows you the note you wrote, and so does\nthe pull request when you publish it. That matters most for a ",[71,1002,1003],{},"suggestion"," block, which the\nperson reading your comment can apply into the file with one click.",[11,1006,1007],{},"Two things a saved note still bounds, so no note can pad the rest of itself out of view: a run\nof spaces is kept up to 16 columns, and a run of blank lines up to two. A very long note now\nscrolls inside its own thread rather than pushing the diff off screen.",[11,1009,1010],{},"The prompt the agent receives is unchanged: it still gets one line per note, so a long comment\ncan't split the instruction it belongs to.",[15,1012,1014],{"id":1013},"reconnect-notices-that-stop-coming-back","Reconnect notices that stop coming back",[11,1016,1017,1018,1021,1022,1025],{},"If your Bitbucket connection was short of a permission — the access to your repositories,\nor to pull requests — Plexus asked you to reconnect, then announced ",[23,1019,1020],{},"Bitbucket access\nrestored"," a moment later, then showed the very same notice the next time you searched for\na repository or refreshed a pull request. ",[23,1023,1024],{},"Not now"," didn't end it either: the notice was\nback with the next round. Reconnecting never stopped the app asking you to reconnect.",[11,1027,1028],{},"Behind it was a check being read as an all-clear it was never able to give. Plexus checks\nyour Bitbucket connection every few hours, but that check can only confirm one thing — that\nyour workspaces are still visible — because Bitbucket offers no way to ask what else a\nconnection covers. Passing it was treated as proof that everything was fine, which wiped a\nwarning about a completely different permission, and wiped the fact that you had put that\nwarning away.",[11,1030,1031,1032,1034],{},"A check now clears a warning only when it actually tested the permission the warning is\nabout. So a notice raised by a real refusal stays up until the refusal stops, ",[23,1033,1024],{},"\nputs it away for good, and the \"access restored\" message only appears when something really\nwas restored.",[11,1036,1037],{},"Three things follow from that:",[1039,1040,1041,1048,1058],"ul",{},[1042,1043,1044,1047],"li",{},[23,1045,1046],{},"When signing in again genuinely can't help, Plexus says so and stops asking."," Some\nBitbucket permissions have to be enabled on the Plexus side, where no amount of\nre-signing-in will widen them. Once a reconnect has been tried and the access is still\nshort, Plexus tells you that plainly instead of offering the same button again — and it\nnow remembers it after a restart, so you don't walk into the same loop every time you\nopen the app.",[1042,1049,1050,1053,1054,1057],{},[23,1051,1052],{},"The notice names the permission the way Bitbucket does."," Bitbucket's newer permission\nnames are recognised now, so a notice reads ",[23,1055,1056],{},"Account: Read"," — the checkbox as it is\nlabelled — rather than an internal identifier you'd have to guess at.",[1042,1059,1060,1063],{},[23,1061,1062],{},"A refusal while loading a pull request counts."," If a provider turned down a\npull-request request because of a missing permission, that could pass without ever\nreaching a notice. It now raises the same notice as everything else, against the account\nit came from.",[15,1065,1067],{"id":1066},"the-access-each-connection-carries-in-settings-about","The access each connection carries, in Settings → About",[11,1069,1070,1072,1073,1076],{},[23,1071,95],{}," now lists every connected account under ",[23,1074,1075],{},"Connected accounts",",\ntogether with the access the provider recorded for it. When Plexus tells you a permission\nhas to be enabled on our side and asks you to report it, that list is the thing to copy\ninto the report — until now there was no way to see it from the app at all. A provider that\nrecorded nothing says so, rather than showing a blank you would read as \"no access\".",[15,1078,1080],{"id":1079},"deleting-an-inline-comment","Deleting an inline comment",[11,1082,1083,1084,1086,1087,1090,1091,1094],{},"Clicking the trash icon on an inline comment in the ",[23,1085,845],{}," tab could leave the comment\nsitting exactly where it was, with no error and no sign anything had happened. Clicking it a\nsecond time then said ",[71,1088,1089],{},"not found: review comment 3"," — and the comment ",[89,1092,1093],{},"still"," stayed on\nscreen. The frustrating part was invisible: the first click had already deleted it. The list\nyou were looking at had simply put it back.",[11,1096,1097],{},"It deletes on the first click now, and stays deleted — through a tab switch, and through\nquitting and reopening Plexus.",[11,1099,1100],{},"Two things caused a comment to come back. Plexus matched a comment by its number alone, and\nthose numbers get reused after you delete a session, so a comment could be matched against a\nlong-gone comment from a session you had already thrown away. And re-reading the comment list\nin the background could overwrite a comment you had just deleted with an older copy of the\nlist. Neither can happen now: a comment is only ever matched inside the session it belongs to,\nand a list that was read before your change is discarded rather than applied on top of it.",[11,1102,1103,264,1105,1107,1108,1110],{},[23,1104,46],{},[23,1106,927],{}," were affected by the same matching fault and are fixed with it — they\ncould silently apply to the wrong copy of a comment, so the strikethrough or the new text only\nshowed up after you left the ",[23,1109,845],{}," tab and came back.",[11,1112,1113],{},"Deleting a comment that is already gone is no longer reported as an error. It is what you\nasked for, so the comment simply disappears.",[11,1115,1116,1117,1119],{},"While a change to a comment is still being saved — a delete, a resolve or an edit — that\ncomment's buttons are greyed out. A second click can't land on a comment that is already on its\nway out, and two quick clicks on ",[23,1118,46],{}," can no longer race each other into leaving the row\nshowing the opposite of what was saved.",[15,1121,1123],{"id":1122},"comments-from-a-deleted-session-no-longer-show-up-under-a-new-one","Comments from a deleted session no longer show up under a new one",[11,1125,1126,1127,1129],{},"Deleting a session left its inline comments in memory. Because Plexus reuses the internal\nnumbering of deleted sessions, a session created afterwards could show the deleted session's\ncomments in its ",[23,1128,845],{}," tab until you switched tabs. They are now cleared along with the\nrest of the session's state when it is deleted.",[11,1131,1132,1133,1135],{},"A change you made just before deleting a session can no longer land in the session that\ninherits its number either, which could otherwise leave a comment in a brand-new session's\n",[23,1134,845],{}," tab that had never been written there.",[15,1137,1139],{"id":1138},"the-first-comment-on-a-file-appears-immediately","The first comment on a file appears immediately",[11,1141,1142],{},"Adding the very first comment to a session — before Plexus had finished reading that session's\nexisting comments — could leave it invisible until something else redrew the diff. It shows up\nas soon as you add it.",[11,1144,1145,1146,1149,1150,1152],{},"Commenting during that same moment could also hide the comments that were ",[89,1147,1148],{},"already"," there:\nPlexus discards a comment list it read before your change, and it now reads a fresh one instead\nof waiting for the next time you open the ",[23,1151,845],{}," tab.",[15,1154,1156],{"id":1155},"sessions-on-windows-show-what-the-agent-is-doing","Sessions on Windows show what the agent is doing",[11,1158,1159],{},"Plexus now has Claude Code report activity directly, with no command and no shell in between\n— so there is nothing left to lose the message. Working, waiting for you, plan-mode pauses\nand the background-subagent ring all behave on Windows the way they always have on macOS and\nLinux.",[11,1161,1162],{},"If you are running an older Claude Code, Plexus keeps using the previous method, which is\nunchanged. Updating Claude Code is worth it on Windows.",[15,1164,1166],{"id":1165},"the-dot-keeps-working-even-when-the-reports-dont","The dot keeps working even when the reports don't",[11,1168,1169,1170,1173,1174,1177],{},"The activity dot used to be entirely dependent on those reports. If none arrived — an old\nClaude Code, a policy that blocks them, a broken ",[71,1171,1172],{},"PATH"," — the dot was simply dead, and a\nsession that ran a tool could get stuck showing green forever, with ",[23,1175,1176],{},"Reset status"," the only\nway out.",[11,1179,1180],{},"Now, when a session has gone a while without a single report, Plexus falls back to reading\nthe agent's own conversation record instead. It turns green while the agent is writing and\ngoes back to amber when the turn ends — including for turns that use no tools at all, which\nthe old behaviour could never show. A session that was interrupted mid-tool now returns to\namber on its own instead of pulsing green until you notice.",[11,1182,1183],{},"This only ever engages for a session that has had no reports at all, so nothing changes for a\nsession where they are arriving normally.",[15,1185,1187],{"id":1186},"check-activity-hooks","Check activity hooks",[11,1189,1190,1191,1194,1195,1198],{},"There is a new ",[23,1192,1193],{},"Check activity hooks…"," item in a session's ⋯ menu, right above ",[23,1196,1197],{},"Reset\nstatus",". It runs the whole chain end to end and tells you in one line what it found —\nwhether Claude Code is running Plexus's hooks, whether they are reaching Plexus, and whether\nthis session is pointing at an older run of the app and needs restarting.",[11,1200,1201,1202,1205,1206,1209,1210,1213],{},"It also reports what happened on the session's ",[23,1203,1204],{},"last real turn",", not just a test, so a\nproblem that has already happened can be diagnosed without reproducing it. ",[23,1207,1208],{},"Copy report","\nputs the whole thing on your clipboard for a bug report. Plexus's own secret is never in\nit. Claude Code reports hook errors for the whole turn rather than per hook, so if any of\nyour other hooks failed their errors appear too — that is where your own API keys can end\nup, so those errors stay on screen and are kept out of the copied report unless you turn on\n",[23,1211,1212],{},"Include these in Copy report"," underneath them. The report still says how many there were,\nso nobody reads it as \"no errors\".",[15,1215,1217],{"id":1216},"anonymous-usage-data-is-now-always-on","Anonymous usage data is now always on",[11,1219,1220],{},"Plexus has always sent one small message a day: your operating system, your processor type,\nthe app version, and a random install id that our server scrambles with a key that changes\nevery day, so today's message can't be matched against yesterday's. It is what tells us how\nmany people actually use Plexus — the number every decision about what to build next rests on.",[11,1222,1223,1224,1227,1228,1231,1232,1235],{},"That message is now part of the app, it carries more, and the ",[23,1225,1226],{},"Share anonymous usage data","\nsetting is gone, along with the ",[23,1229,1230],{},"Privacy"," page in Settings that held nothing else. ",[23,1233,1234],{},"If you\nhad switched that setting off, it is now on again."," We are telling you plainly rather than\nletting you find out: the reason the switch went is that there is nothing in what we send that\nidentifies you, your machine, or your work, and a switch labelled \"share anonymous usage data\"\nsuggests otherwise.",[11,1237,1238,1239,1242],{},"The message now also carries ",[23,1240,1241],{},"how much the app was used since the previous one"," — how many\nsessions you ran, how many turns you exchanged with an agent, how often each feature and Git\noperation was used, and how often things failed and in what broad way. Alongside that it\ncarries a few coarse facts about your setup: your colour theme, which model you have\nselected, whether a Git provider is connected, how many workspaces and projects you have as a\nrange like \"6-20\" rather than an exact figure, your operating-system version, how Plexus was\ninstalled, your shell, and the version of the Claude CLI it is driving.",[11,1244,1245,1246,1249],{},"What is ",[23,1247,1248],{},"never"," sent has not changed, and this is the part that matters: no code, no file\ncontents, no prompts, no file paths, no repository, project or branch names, no commit or\npull-request text, no error messages, no IP address. Nothing you type is ever part of it, and\nevery value we do send is either a number or one of a fixed set of options — never free text.",[11,1251,1252,1253,1256,1257,1260,1261,1264],{},"Three things keep it anonymous rather than merely promised. The usage counts are added into\nshared daily totals the moment they arrive and are ",[23,1254,1255],{},"never stored against your install",", so\nno record of \"what this install did\" exists on our side at any point. The daily id used to\ncount how many installs were active is ",[23,1258,1259],{},"deleted every night"," once it has been counted. And\nthe random install id stored on your own machine now ",[23,1262,1263],{},"expires after a year"," — Plexus\nreplaces it with a new one, so nothing identifying the install persists indefinitely, and\nthere is no version of it we could go back and join anything to. What survives is aggregate:\n\"1,240 active installs on macOS running 0.18.0\". It is all stored in the EU.",[11,1266,1267,1268,264,1271,1274],{},"If you need Plexus to send nothing at all — a locked-down machine, an offline-by-policy\nnetwork — it still honours the ",[71,1269,1270],{},"DO_NOT_TRACK",[71,1272,1273],{},"PLEXUS_NO_TELEMETRY"," environment\nvariables. Set either one before launching and no message is sent. Development builds never\nsend anything either.",[11,1276,1277,1278,96],{},"The full detail, including the legal basis, is in the Privacy Policy at\n",[131,1279,1280],{"href":1280,"rel":1281},"https:\u002F\u002Frunplexus.com\u002Flegal\u002Fprivacy",[135],[15,1283,1285],{"id":1284},"fixes","Fixes",[1039,1287,1288,1291,1294],{},[1042,1289,1290],{},"A session whose folder is spelled differently from how Plexus recorded it — a different\ndrive-letter case, a trailing slash, one of Windows' long-path prefixes — no longer loses\nits activity updates.",[1042,1292,1293],{},"When the check finds that a session's hooks point at an earlier run of Plexus, or that it\nhas none at all, it can now repair them in place — no restart, so the agent keeps its\nconversation and whatever it is in the middle of. If you have just updated Claude Code,\nthe repair picks that up as well and switches the session to the newer, shell-free\nmethod — without restarting Plexus either.",[1042,1295,1296,1297,1300,1301,1304],{},"Turning on ",[23,1298,1299],{},"Diagnostic logging"," in ",[23,1302,1303],{},"Settings → Advanced"," now records the whole activity\nchain: whether the hooks were installed, whether Claude Code ran them, whether they reached\nPlexus, and which session they were matched to.",{"title":98,"searchDepth":99,"depth":99,"links":1306},[1307,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321],{"id":920,"depth":99,"text":921,"children":1308},[1309,1310],{"id":961,"depth":418,"text":962},{"id":975,"depth":418,"text":976},{"id":996,"depth":99,"text":997},{"id":1013,"depth":99,"text":1014},{"id":1066,"depth":99,"text":1067},{"id":1079,"depth":99,"text":1080},{"id":1122,"depth":99,"text":1123},{"id":1138,"depth":99,"text":1139},{"id":1155,"depth":99,"text":1156},{"id":1165,"depth":99,"text":1166},{"id":1186,"depth":99,"text":1187},{"id":1216,"depth":99,"text":1217},{"id":1284,"depth":99,"text":1285},"2026-08-12",{},"\u002Fchangelog\u002Fv0.18.0",{"title":897,"description":902},"changelog\u002Fv0.18.0","v0.18.0","SCS7MrdEx8uqLobLY80qLVn5Q8ofKuMEC3QFCt6wPfg",{"id":1330,"title":1331,"body":1332,"date":1835,"description":1336,"extension":107,"meta":1836,"navigation":109,"path":1837,"seo":1838,"stem":1839,"version":1840,"__hash__":1841},"changelog\u002Fchangelog\u002Fv0.19.0.md","Appearance settings, two interface modes, and one header per window",{"type":8,"value":1333,"toc":1814},[1334,1337,1340,1344,1347,1350,1354,1357,1361,1367,1373,1379,1382,1389,1392,1395,1399,1402,1405,1408,1415,1418,1422,1433,1440,1447,1451,1458,1465,1474,1480,1484,1487,1493,1496,1500,1503,1507,1514,1517,1520,1538,1542,1568,1575,1584,1590,1594,1608,1612,1628,1642,1646,1661,1678,1692,1696,1705,1712,1716,1719,1728,1731,1734,1738,1741,1744,1762,1765,1769,1772,1778,1784,1787,1793,1805],[11,1335,1336],{},"Plexus has always had exactly one look, and it was the tightest one — built for the moment\nyou have five to ten sessions live and every pixel is signal. That is still there, and it is\nstill what Compact means. But it is no longer the only answer, and it is no longer something\nyou have to accept silently.",[11,1338,1339],{},"Settings has a new Appearance page. Theme moves there from the title-bar button — including\n\"match my operating system\", which the button could take you out of but never back into.\nBeside it are two new choices about the shape of the app itself.",[15,1341,1343],{"id":1342},"appearance-settings","Appearance settings",[11,1345,1346],{},"Settings → Appearance. Three preferences, each shown as a pair of cards with a small diagram\nof the layout it produces, so you can see the difference before you commit to it.",[11,1348,1349],{},"These are per-machine preferences. Unlike everything else in Settings they are never\ninherited by a workspace or project, and they will not appear on a project's own settings\npage — how Plexus looks on this laptop is not a property of your repository.",[170,1351,1353],{"id":1352},"theme","Theme",[11,1355,1356],{},"Light, Dark, and Match system, which is what a new install uses. The title-bar toggle stays\nas a shortcut between light and dark; the page is where you get back to following the OS.",[15,1358,1360],{"id":1359},"compact-and-normal","Compact and Normal",[11,1362,1363,1364,96],{},"Density is a layout mode, not a spacing slider. Each one changes what a session row ",[23,1365,1366],{},"is",[11,1368,1369,1372],{},[23,1370,1371],{},"Compact"," is one 28px line per session: the name, a coloured dot for the agent's state, and\nthe pull-request icon. It is the layout Plexus shipped with, unchanged.",[11,1374,1375,1378],{},[23,1376,1377],{},"Normal"," — the new default — gives a session two lines. The second one names the branch it\nis on and says what the agent is doing in words: Working, Needs you, Idle.",[11,1380,1381],{},"The glyph beside that branch name does two jobs at once. Its shape tells you where the branch\ncame from: a branch Plexus cut for the session, or a link for one it attached to — which is\nwhat you want to spot before a rebase rewrites history someone else may already have. Its\ncolour is the pull request: grey when there is none, green when one is open, purple once it\nis merged. Click it to open the PR.",[11,1383,1384,1385,1388],{},"The row's ",[71,1386,1387],{},"⋯"," menu no longer holds a place for itself while it is hidden, so the session name\nand the state word run to the edge of the sidebar instead of stopping short of it. The menu\nappears over that edge when you hover the row.",[11,1390,1391],{},"Switch between them from the app bar, or from Settings → Appearance.",[11,1393,1394],{},"The session and project tabs changed with them: the active tab is now marked by\na brand underline along the bottom of the strip rather than a filled chip, and\neach tab carries its own glyph.",[15,1396,1398],{"id":1397},"one-active-workspace","One active workspace",[11,1400,1401],{},"The sidebar used to nest three levels: workspace, then project, then session. It now shows\none workspace at a time, chosen from a switcher in the app bar — so a project is the first\nthing in the sidebar and a session is one step in, with no chain of chevrons to open before\nyou reach the thing you wanted.",[11,1403,1404],{},"The switcher's menu lists every workspace with its session count and, in amber, how many are\nwaiting on you. That is the question you switch workspaces to answer, so it is visible before\nyou switch rather than after.",[11,1406,1407],{},"Under that list are the active workspace's own actions — Edit, Settings, Set as default and\nDelete workspace. With one workspace shown at a time there is no workspace row in the sidebar\nto hang them on, so this menu is where they live.",[11,1409,1410,1411,1414],{},"Prefer the old tree? Settings → Appearance → Workspace navigation → ",[23,1412,1413],{},"All workspaces in the\nsidebar"," brings all three levels back — and it is easier to read than it was. Each workspace\nis now drawn as a group: a header that stays put while its projects scroll past, over a well\nwith a rail down its left edge, so you can see where one workspace ends and the next begins\ninstead of counting indentation. The workspace holding whatever you have open is tinted, and\nnothing is tinted when nothing is open.",[11,1416,1417],{},"Project rows also gained a standing button for the project view — the dashboard, git client\nand terminal — which previously you could only reach by knowing that clicking the row did\nsomething.",[15,1419,1421],{"id":1420},"search-your-sessions","Search your sessions",[11,1423,1424,1425,1428,1429,1432],{},"Press ",[23,1426,1427],{},"⌘K"," — Ctrl+K on Windows and Linux — or click the search field in the app bar, and\ntype. Every session and every project in the tree is there: match on a session's name, the\nbranch it is on, the project it belongs to, or the workspace. Two words narrow instead of\nwiden, so ",[71,1430,1431],{},"plexus settings"," finds the one session you meant.",[11,1434,1435,1436,1439],{},"Enter opens it. If it lives in a workspace you are not currently looking at, or in a project\nthat is collapsed, Plexus points the sidebar at it and scrolls the row into view rather than\nselecting something you cannot see. With nothing typed you get your whole tree as a flat list,\n50 rows at a time — when there are more than that, the bar along the bottom tells you how many. The same is now true of the ",[23,1437,1438],{},"Open"," button on a\nnotification — it used to be able to take you to a row that was nowhere on screen.",[11,1441,1442,1443,1446],{},"The shortcut works while the agent terminal has focus, which is where it is most useful and\nwhere a shortcut normally stands down. That does mean Ctrl+K no longer reaches the terminal on\nWindows and Linux, where it clears to the end of the line; if you want it back, Settings →\nKeybindings → ",[23,1444,1445],{},"Search sessions and projects"," rebinds or unbinds it. It does stand down for\none thing: another dialog. Opening a search on top of a half-filled New session dialog would\nnavigate away and leave that dialog stranded over an unrelated session.",[15,1448,1450],{"id":1449},"choose-the-project-when-you-create-a-session","Choose the project when you create a session",[11,1452,1453,1454,1457],{},"The New session dialog inherited its project from wherever you opened it, and the ",[23,1455,1456],{},"+"," in the\napp bar had to guess — the project you had selected, or the first one in the workspace. When\nthe guess was wrong the only way out was to close the dialog and start again.",[11,1459,1460,1461,1464],{},"It now asks. ",[23,1462,1463],{},"Project"," is a field in the dialog, prefilled with that same guess and\nchangeable in one click. It offers what the sidebar offers: the current workspace's projects,\nor every workspace's grouped by name if you use the \"All workspaces in the sidebar\" setting.\nOpen it on a project from another workspace — from a dashboard row — and both are listed under\ntheir names, so the way back is a click rather than a reopen.",[11,1466,1467,1468,1470,1471,1473],{},"Switching re-reads that repository's branches and clears the base and branch you had picked —\n",[71,1469,303],{}," in one repository is not ",[71,1472,303],{}," in another — while keeping the name you typed. A name\nPlexus filled in for you from a branch goes with that branch.",[11,1475,354,1476,1479],{},[23,1477,1478],{},"New branch \u002F Existing branch"," switch is now a segmented control, with the explanation\nfor whichever mode is selected below it.",[15,1481,1483],{"id":1482},"session-summaries-introduce-themselves","Session summaries introduce themselves",[11,1485,1486],{},"Plexus can keep an AI-written digest of a session — what you asked for, and what the agent has\ndone about it — refreshed as the agent stops, while you have the panel open on it. It has been\nthere for a while, switched off by default. The trouble was that the same setting also hid its\nbutton, so the only way to find the feature was to already know it existed.",[11,1488,1489,1492],{},[23,1490,1491],{},"Summary"," is now always in the session header. Open it with summaries switched off and the\npanel says what it does and what it costs — each refresh sends that session's transcript to\nthe agent and uses one of your plan's turns — and offers two ways to switch it on: for the\nproject you are working in, or everywhere. Either way Plexus writes the first summary straight\naway rather than leaving you with an empty panel until the agent next stops.",[11,1494,1495],{},"Nothing is sent anywhere until you press one of those buttons.",[15,1497,1499],{"id":1498},"one-header-per-window","One header per window",[11,1501,1502],{},"The session view and the project view each used to draw their own header inside the right\npane, starting at the sidebar's edge and repeating what the sidebar already showed. There is\nnow a single bar across the full width of the window that says where you are — project, then\nsession, then the agent's state — and carries the tools that act on it. The pane below it is\njust the work.",[15,1504,1506],{"id":1505},"dev-server-ports","Dev server ports",[11,1508,1509,1510,1513],{},"Running two sessions of one repository has always had the same sharp edge: both want to start\nthe dev server, and the second one finds port 3000 taken. Plexus now hands ",[23,1511,1512],{},"every session its\nown block of ten localhost ports"," and puts them in the environment of everything it starts for\nthat session — the agent, the session's terminal tab, and every lifecycle hook.",[11,1515,1516],{},"The block is reserved when a session starts, checked to be genuinely free before Plexus commits\nto it, and kept for as long as the session's working copy exists. Resuming gives a session the\nsame ports it had, so a dev server that is already listening is never moved out from under\nitself. Tearing the worktree down releases them.",[11,1518,1519],{},"Each session's first port shows as a small chip in three places — its sidebar row, its dashboard\nrow, and the header bar while it is open. Hover it and the tooltip names the whole range.",[11,1521,1522,1523,1525,1526,1529,1530,1533,1534,1537],{},"Its ",[71,1524,1387],{}," menu, in the sidebar and on the dashboard both, gains three matching actions: ",[23,1527,1528],{},"Open\nlocalhost:20030"," launches your browser at that port, ",[23,1531,1532],{},"Copy port"," puts the number on the\nclipboard, and ",[23,1535,1536],{},"Reassign ports"," is covered below. They are absent rather than greyed out for a\nsession that holds no block, since nothing you could do from that menu would give it one.",[170,1539,1541],{"id":1540},"what-your-scripts-get","What your scripts get",[11,1543,1544,1547,1548,1551,1552,1555,1556,1559,1560,1563,1564,1567],{},[71,1545,1546],{},"PLEXUS_PORT"," is the session's first port — the one to use. ",[71,1549,1550],{},"PLEXUS_PORT_BASE"," is the same\nnumber for scripts that do arithmetic, ",[71,1553,1554],{},"PLEXUS_PORT_COUNT"," is how many the block holds, and\n",[71,1557,1558],{},"PLEXUS_PORT_1"," through ",[71,1561,1562],{},"PLEXUS_PORT_9"," are the rest of it, for a second server, a test\ndatabase or a debugger. ",[71,1565,1566],{},"PORT"," is set too, because that is the name Next.js, Nuxt, Rails and\nExpress already read.",[11,1569,1570,1571,1574],{},"The intended home for all of this is a ",[23,1572,1573],{},"run"," hook, which fires on every start and resume:",[1576,1577,1582],"pre",{"className":1578,"code":1580,"language":1581,"meta":98},[1579],"language-bash","pnpm dev --port $PLEXUS_PORT\n","bash",[71,1583,1580],{"__ignoreMap":98},[11,1585,1586,1587,1589],{},"Commit that to your repository's ",[71,1588,157],{}," and everyone on the team gets it from a\nclone.",[170,1591,1593],{"id":1592},"your-dev-server-still-has-to-be-told","Your dev server still has to be told",[11,1595,1596,1597,1599,1600,1603,1604,1607],{},"Plexus sets the variables. It does not inspect your project, does not know which framework you\nuse, and never adds a flag to a command you wrote. If your server reads ",[71,1598,1566],{}," on its own,\nthere is nothing else to do. ",[23,1601,1602],{},"Vite, Astro and Angular do not"," — they need\n",[71,1605,1606],{},"--port $PLEXUS_PORT"," on the command, or the value threaded into their config. And if nothing\nin your project reads any of these variables, nothing about your setup changes.",[170,1609,1611],{"id":1610},"one-thing-that-may-change-under-you","One thing that may change under you",[11,1613,1614,1615,1617,1618,1620,1621,1624,1625,1627],{},"Most ",[71,1616,711],{}," loaders leave a variable alone when the process already has one. So for a project\nwhose ",[71,1619,711],{}," is copied into each session and carries a ",[71,1622,1623],{},"PORT=3000"," line, that line no longer\nwins: Plexus sets ",[71,1626,1566],{}," in the environment first, and the loader will not overwrite it. If you\nwere fixing a port that way — which is exactly what the old documentation suggested — your\nserver now starts somewhere in the twenty-thousands instead.",[11,1629,1630,1631,1634,1635,1638,1639,1641],{},"That is usually the outcome you wanted. If it isn't, open Settings → Worktrees & Hooks and\nclear ",[23,1632,1633],{},"Extra port variables",": with the list empty, Plexus sets only its own ",[71,1636,1637],{},"PLEXUS_PORT*","\nnames and ",[71,1640,1566],{}," is yours again.",[170,1643,1645],{"id":1644},"the-range-and-the-settings-behind-it","The range, and the settings behind it",[11,1647,1648,1649,1652,1653,1656,1657,1660],{},"Blocks come out of ",[23,1650,1651],{},"20000–32000"," — around 1200 of them. That window sits above every common\ndev-server port, above 10080 (the highest port Chrome and Firefox refuse to open, which would\ngive you a server that starts fine and a browser that will not load it), and below 32768, where\nLinux starts handing the same numbers out to outgoing connections. Move it with ",[23,1654,1655],{},"First port","\nand ",[23,1658,1659],{},"Last port"," if it clashes with something on your machine.",[11,1662,1663,1664,1667,1668,43,1670,43,1672,1674,1675,96],{},"All five settings live in Settings → Worktrees & Hooks, globally or per project: ",[23,1665,1666],{},"Assign dev\nserver ports"," (on), ",[23,1669,1655],{},[23,1671,1659],{},[23,1673,1633],{},", and ",[23,1676,1677],{},"Write ports\nto file",[11,1679,1680,1681,1684,1685,1687,1688,1691],{},"That last one is off by default and covers what environment variables cannot reach — a\n",[71,1682,1683],{},"docker compose"," file reading ",[71,1686,711],{}," for substitution, or a server you launch yourself from a\nterminal Plexus did not open. Name a file and Plexus keeps a marked block of the same variables\ninside it, refreshed every time the session comes back up, with everything outside the markers\nleft exactly as you wrote it. It is for compose services, database ports and app config. It is not a second way\nto move a dev server: Vite, for one, loads ",[71,1689,1690],{},".env.local"," and still takes its listen port only\nfrom its config or its command line.",[170,1693,1695],{"id":1694},"if-a-port-gets-taken-anyway","If a port gets taken anyway",[11,1697,1698,1699,1701,1702,1704],{},"A reservation is remembered, not re-checked — re-checking it on every resume could move a\nrunning server's ports out from under it — so something else on your machine can claim one of a\nstopped session's ports while it is down. ",[23,1700,1536],{}," in that session's ",[71,1703,1387],{}," menu drops\nthe block and searches again. If nothing has taken the old one after all, you get it back: what\nyou asked for is a block that works, not a different number.",[11,1706,1707,1708,96],{},"Full details, including what the reservation does and does not promise, are at\n",[131,1709,1710],{"href":1710,"rel":1711},"https:\u002F\u002Frunplexus.com\u002Fdocs\u002Fworktrees#dev-server-ports",[135],[15,1713,1715],{"id":1714},"watch-the-review-and-fix-cycle-work","Watch the review-and-fix cycle work",[11,1717,1718],{},"A review-and-fix cycle can run for the better part of an hour, and until now the only thing it\ntold you was \"Cycle round 2 — agent applying fixes…\". That sentence is the same on a round that\nis editing files and a round that is stuck, which made a long round and a broken one impossible\nto tell apart.",[11,1720,1721,1724,1725,1727],{},[23,1722,1723],{},"Watch agent"," now sits next to ",[23,1726,992],{},", both in the Review tab's status strip and in the\nsession header, and only while a cycle is actually running. It opens a panel across the bottom\nof the session with two halves. The top is a running account: which round it is on, how many\nfiles the review is reading, when it asked the model, how many comments came back, and how long\neach phase took. The bottom is a live terminal on the fix agent itself, so you can watch what it\nis editing as it happens.",[11,1729,1730],{},"The terminal is read-only. You can select and copy from it, but nothing you type reaches the\nagent — which also means a stray keystroke can't interrupt a round that has been going for\ntwenty minutes. The output never touches disk, and it only reaches the app while the panel is\nopen; closing it stops the stream at the source rather than just hiding it. Open the panel\npart-way through a round and it back-fills the most recent stretch so you aren't starting from\nblank.",[11,1732,1733],{},"Only the fix half runs in a terminal. During a reviewing phase the panel says so, and the\naccount above it carries the story instead — with a live clock on the current step, so you can\nalways see something is moving.",[15,1735,1737],{"id":1736},"rounds-that-dont-idle-and-settings-for-the-rest","Rounds that don't idle, and settings for the rest",[11,1739,1740],{},"Every headless call Plexus makes — the AI review, session summaries, pull request descriptions,\ncommit messages — was starting up your configured MCP servers first, waiting for all of them to\nconnect, and shutting them down again when it finished. None of those features can use an MCP\ntool. On a machine with a handful of servers configured that was tens of seconds of waiting per\ncall, twice per review-and-fix round, for nothing. They are no longer started.",[11,1742,1743],{},"Three other things on the review path were quietly wrong. It ran in whatever directory Plexus\nitself had been launched from rather than the session's worktree. It had no time limit at all,\nso a review that wedged looked exactly like a review that was merely slow, forever — it now\ngives up after fifteen minutes and says so, and inside a cycle that just skips the round. And\nthe fix agent was handed the review comments with nothing telling it to stay on them, so in a\nrepository whose agent instructions describe a lot of routine upkeep, a round applying six\ncomments could go and do all of that too.",[11,1745,1746,1747,264,1750,1753,1754,1757,1758,1761],{},"The parts that are genuinely a matter of taste are now settings rather than assumptions\n(Settings → Git & PRs, overridable per workspace or project). ",[23,1748,1749],{},"Model",[23,1751,1752],{},"Effort"," pickers\nfor the review and, for the first time, for the fix agent — the expensive half, which previously\nhad no controls whatsoever and silently inherited whatever your Claude Code configuration\nresolved to. ",[23,1755,1756],{},"Review-and-fix agent instructions"," for what the fix agent is told before the\ncomments. And ",[23,1759,1760],{},"Allow MCP servers in the review-and-fix agent",", off by default, for the rare\nproject whose fixes genuinely need one.",[11,1763,1764],{},"All four model and effort settings default to Automatic, so nothing changes until you choose —\nbut the new panel reports what each round actually used, which is the part that was invisible\nbefore.",[15,1766,1768],{"id":1767},"a-more-reliable-subagent-ring","A more reliable subagent ring",[11,1770,1771],{},"The blue ring around a session's dot means the agent handed work to subagents and carried\non without waiting for them. When it appeared it was right — it just did not appear\nanywhere near often enough, and once lit it did not always go out again.",[11,1773,1774,1777],{},[23,1775,1776],{},"Work started by a workflow counts now."," A workflow that fans out to several agents at\nonce records the fan-out but nothing about the agents themselves, so the ring stayed dark\nfor exactly the case where the most work is running in parallel. Plexus now follows the\nrun itself, and those agents light the ring and drop off it as each one finishes.",[11,1779,1780,1783],{},[23,1781,1782],{},"A launch is reported the moment it happens",", rather than when the session's conversation\nrecord catches up. Those are usually the same instant, with one exception that made the\nring look unreliable: if the same turn also stopped to ask you a question or to show you a\nplan, the record could land after the work had already been reported finished — and the\nring then never appeared at all. Nothing about that was visible from the outside, so the\nsame action seemed to work sometimes and not others.",[11,1785,1786],{},"What lights the ring is unchanged. An agent the main agent is sitting and waiting on is the\nmain agent working, so it stays a plain green dot with no ring; the ring is for work running\nbeside your session, not work it is blocked on.",[11,1788,1789,1792],{},[23,1790,1791],{},"Stopping a session clears it."," A session stopped in the middle of a delegation kept\npulsing blue until you restarted Plexus. Stopping it — or the agent exiting on its own —\nnow clears the ring immediately, which is what the documentation has always said happens.",[11,1794,1795,1798,1799,1801,1802,96],{},[23,1796,1797],{},"And it shows up where sessions are only summarised."," A collapsed project used to hide\ndelegated work completely; its row now carries a small ring and the number of sessions\ndelegating underneath it. The workspace switcher in the app bar does the same for the\nworkspace you are in, and its menu shows that count per workspace beside the \"need you\"\none. In ",[23,1800,1427],{}," search, a session's second line spells it out in words — ",[89,1803,1804],{},"Working · 2\ndelegating",[11,1806,1807,1810,1811,1813],{},[23,1808,1809],{},"A dark ring can now explain itself."," Turn on ",[23,1812,1299],{}," (Settings →\nAdvanced) and Plexus records what the session actually delegated to — including the kinds\nof agent that deliberately do not light the ring, counted alongside the ones that do. If\nyour subagents did not show up, that tells you whether Plexus missed them or whether they\nwere the sort that never lights it, without you having to reproduce anything.",{"title":98,"searchDepth":99,"depth":99,"links":1815},[1816,1819,1820,1821,1822,1823,1824,1825,1832,1833,1834],{"id":1342,"depth":99,"text":1343,"children":1817},[1818],{"id":1352,"depth":418,"text":1353},{"id":1359,"depth":99,"text":1360},{"id":1397,"depth":99,"text":1398},{"id":1420,"depth":99,"text":1421},{"id":1449,"depth":99,"text":1450},{"id":1482,"depth":99,"text":1483},{"id":1498,"depth":99,"text":1499},{"id":1505,"depth":99,"text":1506,"children":1826},[1827,1828,1829,1830,1831],{"id":1540,"depth":418,"text":1541},{"id":1592,"depth":418,"text":1593},{"id":1610,"depth":418,"text":1611},{"id":1644,"depth":418,"text":1645},{"id":1694,"depth":418,"text":1695},{"id":1714,"depth":99,"text":1715},{"id":1736,"depth":99,"text":1737},{"id":1767,"depth":99,"text":1768},"2026-08-14",{},"\u002Fchangelog\u002Fv0.19.0",{"title":1331,"description":1336},"changelog\u002Fv0.19.0","v0.19.0","EPnG28_GJc4qe8wJZVsekkh9mt-J8WO3FnMvwZsBtrA",{"id":1843,"title":1844,"body":1845,"date":2180,"description":2181,"extension":107,"meta":2182,"navigation":109,"path":2183,"seo":2184,"stem":2185,"version":2186,"__hash__":2187},"changelog\u002Fchangelog\u002Fv0.20.0.md","Send feedback, and open your dev server from the session",{"type":8,"value":1846,"toc":2165},[1847,1854,1858,1864,1867,1871,1881,1891,1894,1897,1901,1909,1917,1921,1927,1942,1945,1949,1952,1971,1978,1984,1987,1993,1997,2003,2006,2025,2032,2036,2039,2043,2046,2050,2063,2074,2085,2094,2097,2101,2118,2125,2128,2131,2142,2146,2159],[11,1848,1849,1850,1853],{},"Plexus can now hear back from you. There is a ",[23,1851,1852],{},"Feedback"," button in the app bar, the diagnostic log finally stops growing forever, a session's dev server is one click away from its tab strip, a session whose pull request has merged cleans itself up without stopping to ask, and a session that has handed its work to subagents says so rather than asking for you. And on Windows, two things that never worked on an npm install of Claude Code now do: every AI feature, and starting a session at all when your user name has a space in it.",[15,1855,1857],{"id":1856},"send-feedback","Send feedback",[11,1859,1860,1861,1863],{},"Next to the search field there is now a ",[23,1862,1852],{}," button. Write whatever you want — a bug, a missing feature, something that annoys you — and it reaches us directly. No account, no issue tracker, no signing up.",[11,1865,1866],{},"Because Plexus is local-first, this is the one place where something you made can leave your machine, so the dialog is built around showing you exactly what that is. Nothing is sent until you press Send, and nothing is sent that the dialog did not put in front of you first.",[170,1868,1870],{"id":1869},"what-you-can-attach","What you can attach",[11,1872,1873,1876,1877,1880],{},[23,1874,1875],{},"A screenshot",", only if you press ",[23,1878,1879],{},"Attach screenshot",". It is a picture of the Plexus window drawn by Plexus itself, not a capture of your screen — it cannot contain another application, a second monitor, or anything behind the window, and Plexus never asks macOS for screen-recording permission. You see it before you send, and you can remove it again.",[11,1882,1883,1886,1887,1890],{},[23,1884,1885],{},"Diagnostic logs",", on by default, with a ",[23,1888,1889],{},"Preview what's included"," panel that prints the exact text that will be uploaded. Anything shaped like a token, key or password is blanked out before it leaves your machine, and your home folder and username are rewritten. What it keeps — deliberately, because it is what makes the log useful — is repository paths, branch names, worktree folders, session ids and timings.",[11,1892,1893],{},"If Diagnostic logging is switched off, Plexus says so, still attaches the activity trail it keeps in memory, and offers to turn logging on — while being honest that it starts recording from that moment and will not help the report you are writing.",[11,1895,1896],{},"Your email address is optional and blank unless you type it. Without it we simply cannot reply.",[170,1898,1900],{"id":1899},"deleting-a-report","Deleting a report",[11,1902,1903,1904,1908],{},"Every report comes back with a reference code, which Plexus keeps in a list on your device. Mail that code to ",[131,1905,1907],{"href":1906},"mailto:timo@codedwords.com","timo@codedwords.com"," and we delete the report and everything attached to it. Screenshots and logs are deleted automatically after 90 days in any case, and the message itself after a year.",[11,1910,1911,1912,1916],{},"Full details of what is and is not sent are at ",[131,1913,1914],{"href":1914,"rel":1915},"https:\u002F\u002Frunplexus.com\u002Fdocs\u002Ffeedback",[135]," and in the Privacy Policy.",[15,1918,1920],{"id":1919},"diagnostic-logs-stop-growing-forever","Diagnostic logs stop growing forever",[11,1922,1923,1926],{},[71,1924,1925],{},"plexus-diag.log"," used to be appended to and never trimmed. Now every launch drops lines older than seven days.",[11,1928,1929,1930,1933,1934,1937,1938,1941],{},"You can change that with ",[23,1931,1932],{},"Delete diagnostic logs after (days)"," under Settings → Advanced — set it to ",[71,1935,1936],{},"0"," to keep everything, which is what you want when you are capturing a problem that only reappears every few weeks. A log file you pinned yourself with the ",[71,1939,1940],{},"PLEXUS_DIAG"," environment variable is never touched.",[11,1943,1944],{},"Diagnostic logging itself is still off by default, and still writes nothing until you turn it on.",[15,1946,1948],{"id":1947},"open-the-sessions-dev-server","Open the session's dev server",[11,1950,1951],{},"Every session gets its own block of ten localhost ports, and the first of them — the one your\ndev server should be listening on — used to be a small grey number on the session's sidebar row\nand in the header bar. A number you could read, in two places you could not do anything with it.",[11,1953,1954,1955,1957,1958,1961,1962,264,1964,1966,1967,1970],{},"It has moved to where it is useful. Open a session and its tab strip now carries an ",[23,1956,1528],{}," button, beside ",[23,1959,1960],{},"Hook output",". Click it and your browser opens at that port.\nThe caret next to it holds ",[23,1963,1532],{},[23,1965,1536],{},", so nothing about a session's\nports asks you to leave the session any more. In Compact the label shortens to\n",[71,1968,1969],{},"localhost:20030",", and on a narrow pane it drops to the icon, so the tabs beside it stay\nreachable however far you drag the sidebar over. Hover it and the tooltip names the whole block,\nports 20030 through 20039.",[11,1972,1973,1974,1977],{},"The button is there when the session holds a block and ",[23,1975,1976],{},"Assign dev server ports"," is on for\nthat project — and it goes the moment you switch that setting off, with no restart. It is never\nshown greyed out: a session that has never started holds no ports, and there is nothing you\ncould press to give it some.",[11,1979,1980,1981,1983],{},"The dashboard keeps its port chip. That screen has no session tab strip to put a button in, and\nit is the one place you compare one session's ports against another's. The ",[71,1982,1387],{}," menu on every\nsession row, in the sidebar and on the dashboard alike, still carries the same three port\nactions it always did.",[11,1985,1986],{},"One thing worth knowing now that reassigning is a click away: it does not move a dev server that\nis already running. The port variables are handed to what Plexus starts, at the moment it starts\nit, so a server your run hook launched keeps listening where it was told to while the button\nalready names the new block. Reassign while the session is stopped, or restart it afterwards.",[11,1988,1989,1990,96],{},"Full details are at ",[131,1991,1710],{"href":1710,"rel":1992},[135],[15,1994,1996],{"id":1995},"cleanup-after-a-merge-no-longer-asks","Cleanup after a merge no longer asks",[11,1998,1999,2002],{},[23,2000,2001],{},"Clean up a session when its pull request is merged"," has always described something Plexus\ndid not quite do. It said it would remove the session automatically; what it actually did was\nwait until a background check noticed the merge — sometimes a minute after somebody else\npressed the button — and then open a confirmation dialog in front of whatever you were doing.",[11,2004,2005],{},"That dialog is gone. If you switched the setting on, that was the answer. Plexus now cleans\nthe session up on its own, with no interruption, and tells you afterwards what it did.",[11,2007,2008,2009,2012,2013,2016,2017,2020,2021,2024],{},"It still follows your ",[23,2010,2011],{},"When you remove a session"," setting, so ",[23,2014,2015],{},"Archive (keep a\nrestorable copy)"," files the session away and leaves everything on disk. The one change is\n",[23,2018,2019],{},"Ask each time",": there is nobody to ask when the trigger is a background check, so it\ndeletes there, the same as ",[23,2022,2023],{},"Delete immediately",". The setting's description in Settings →\nGit & PRs now says all of this outright.",[11,2026,2027,2028,2031],{},"Whether the session's branch goes with it is inherited from the ",[23,2029,2030],{},"Also delete the local\nbranch"," switch in the ordinary removal dialog — the one you last used when removing a\nsession by hand. That switch starts off, so branches are kept until you have ticked it at\nleast once. A branch that existed before the session, one you started work on rather than\none Plexus cut, is always kept: deleting somebody else's branch is not a decision Plexus\nwill make while you are not looking.",[170,2033,2035],{"id":2034},"only-a-merge-plexus-watched","Only a merge Plexus watched",[11,2037,2038],{},"The cleanup runs for a pull request Plexus saw while it was open. One that was opened and\nmerged entirely between two checks — or that Plexus is meeting for the first time already\nmerged — is left alone. Removing a worktree cannot be undone, so it is not something to do\non the strength of a status just seen for the first time.",[170,2040,2042],{"id":2041},"several-at-once","Several at once",[11,2044,2045],{},"If more than one session's pull request has merged, all of them are cleaned up now, one\nafter another. Previously only the last one got its dialog and the rest were quietly\nskipped, which is why a merged session sometimes stayed in the sidebar for no visible\nreason.",[15,2047,2049],{"id":2048},"sessions-say-delegating-instead-of-needs-you","Sessions say \"Delegating\" instead of \"Needs you\"",[11,2051,2052,2053,2056,2057,2059,2060,96],{},"A session with background subagents running now says ",[23,2054,2055],{},"Delegating"," — in the same blue as the\nring around its dot — whenever its main agent is not mid-turn. It reads that way on the second\nline of its sidebar row and in the header bar at Normal density, and in ",[23,2058,1427],{}," search, where it\ncomes with the count: ",[89,2061,2062],{},"Delegating · 2",[11,2064,2065,2066,2069,2070,2073],{},"A session whose agent is still working is untouched. That one keeps saying ",[23,2067,2068],{},"Working",", and\n",[23,2071,2072],{},"Working · 2 delegating"," in search, because the main agent being busy is the more useful half\nof that answer.",[11,2075,2076,2077,2080,2081,2084],{},"Before this, the same session said ",[23,2078,2079],{},"Needs you"," in amber, or ",[23,2082,2083],{},"Idle"," — and amber reads as a\ncall to action for a session where the agent has handed work off and the delegated work is what\nis still running. The rest of the app had already decided that isn't a moment worth pulling you\nin for: a turn that ends with subagents still going gets no chime and no notification. The word\nwas the last surface still calling you over.",[11,2086,2087,2088,2090,2091,96],{},"One thing worth knowing, because the word alone won't tell you: a session paused on a permission\nprompt, a plan waiting for approval or a question also reads ",[23,2089,2055],{}," while the ring is\nlit. The tell is the dot, which is deliberately unchanged — it stays amber, and hovering it\nstill says ",[89,2092,2093],{},"Waiting for input — 2 subagents running",[11,2095,2096],{},"Nothing else moves. The dot, the ring, the tooltip and every \"N delegating\" count are exactly as\nthey were.",[15,2098,2100],{"id":2099},"ai-features-on-a-windows-npm-install","AI features on a Windows npm install",[11,2102,2103,2106,2107,43,2110,2113,2114,2117],{},[23,2104,2105],{},"Run AI review",", the AI ",[23,2108,2109],{},"pull request title and description",[23,2111,2112],{},"session summaries"," and\nevery round of the ",[23,2115,2116],{},"review-and-fix cycle"," now work on an npm or Volta install of Claude\nCode, on Windows, with nothing for you to change. No setting, no reinstall.",[11,2119,2120,2121,2124],{},"They had never worked there. Plexus handed Claude its instructions on the command line, and\non Windows an npm install of Claude Code is a small ",[71,2122,2123],{},"claude.cmd"," script that Windows runs\nthrough the command prompt — which cannot carry a line break inside a command-line argument\nat all. Every one of those instructions is more than one line long, so each of those features\nfailed every single time, before Claude was even started. AI commit messages were the one\nexception, and only because their instruction happens to fit on a single line.",[11,2126,2127],{},"Plexus now sends the instruction to Claude the same way it has always sent the diff or the\ntranscript that goes with it: through the program's input rather than its command line. That\nis the case on macOS and Linux too, not only on Windows — one route everywhere, so this is\nnot a special case that only breaks again somewhere nobody looks. What the agent is asked for\nis unchanged, word for word.",[11,2129,2130],{},"The review-and-fix agent runs in a terminal of its own and has no such input to write to, so\non those installs Plexus hands it a file holding the instructions instead. That one is the\nonly part of this that is Windows-specific: for the fix agent, native installs of Claude Code\nand every install on macOS and Linux take exactly the route they always did.",[11,2132,2133,2134,2137,2138,2141],{},"If Plexus does still refuse an argument on Windows — a session name containing a character\nthe command prompt would treat as punctuation, for instance — the message now tells you what\nto do about it. It leads with ",[71,2135,2136],{},"claude install",", the Claude Code command that replaces an npm\ninstall with the native build without opening a browser, and offers the PowerShell one-liner\n",[71,2139,2140],{},"irm https:\u002F\u002Fclaude.ai\u002Finstall.ps1 | iex"," beside it. The old message pointed at a page that\nanswers with an error.",[15,2143,2145],{"id":2144},"sessions-start-when-your-windows-user-name-has-a-space-in-it","Sessions start when your Windows user name has a space in it",[11,2147,2148,2149,2151,2152,2155,2156,96],{},"A second Windows bug, found while fixing the first, and unrelated to AI features: if the\npath to your ",[71,2150,2123],{}," contained a space, starting a session did not work at all. That is\nnot an exotic case — a Windows profile named ",[71,2153,2154],{},"First Last"," puts a space in the npm install\npath, and so does any install under ",[71,2157,2158],{},"C:\\Program Files",[11,2160,2161,2162,2164],{},"Plexus runs a ",[71,2163,2123],{}," through the Windows command prompt, and a quoted path at the very\nstart of that command was being taken apart by the command prompt's own quote handling\nbefore it ever ran. The command is now written so that cannot happen. Nothing about your\nsetup needs to change.",{"title":98,"searchDepth":99,"depth":99,"links":2166},[2167,2171,2172,2173,2177,2178,2179],{"id":1856,"depth":99,"text":1857,"children":2168},[2169,2170],{"id":1869,"depth":418,"text":1870},{"id":1899,"depth":418,"text":1900},{"id":1919,"depth":99,"text":1920},{"id":1947,"depth":99,"text":1948},{"id":1995,"depth":99,"text":1996,"children":2174},[2175,2176],{"id":2034,"depth":418,"text":2035},{"id":2041,"depth":418,"text":2042},{"id":2048,"depth":99,"text":2049},{"id":2099,"depth":99,"text":2100},{"id":2144,"depth":99,"text":2145},"2026-08-16","Plexus can now hear back from you. There is a Feedback button in the app bar, the diagnostic log finally stops growing forever, a session's dev server is one click away from its tab strip, a session whose pull request has merged cleans itself up without stopping to ask, and a session that has handed its work to subagents says so rather than asking for you. And on Windows, two things that never worked on an npm install of Claude Code now do: every AI feature, and starting a session at all when your user name has a space in it.",{},"\u002Fchangelog\u002Fv0.20.0",{"title":1844,"description":2181},"changelog\u002Fv0.20.0","v0.20.0","o9S2a203WQlh3e5nO54upmFKBz-FXhz6nTNwatzl_rA",{"id":2189,"title":2190,"body":2191,"date":2338,"description":2339,"extension":107,"meta":2340,"navigation":109,"path":2341,"seo":2342,"stem":2343,"version":2344,"__hash__":2345},"changelog\u002Fchangelog\u002Fv0.20.2.md","Windows sessions start, and consoles close",{"type":8,"value":2192,"toc":2328},[2193,2200,2204,2207,2210,2213,2217,2223,2226,2230,2237,2240,2244,2247,2250,2253,2257,2260,2264,2267,2271,2278,2289,2301,2305,2312,2318,2321],[11,2194,2195,2196,2199],{},"Two Windows fixes that turn out to be the same bug seen from opposite ends. A session could refuse to start — a blinking cursor, then ",[23,2197,2198],{},"\"Claude didn't start — it launched but produced no output, and an automatic retry didn't help either.\""," And every terminal Plexus opened left its Windows console process behind when it closed, some of them spinning a CPU core for as long as the app stayed open. One report had 23 of those alive after a day of use, burning 85 CPU-hours between them while Plexus itself sat idle. There are fixes in here that are not Windows ones either: the review-and-fix cycle no longer marks findings as done when its agent never ran, and pull request comments you send to the agent can always be sent again.",[15,2201,2203],{"id":2202},"sessions-that-never-started","Sessions that never started",[11,2205,2206],{},"A new Windows console asks the terminal it is attached to where the cursor is, and it will not start the program inside it until something answers. Plexus answered from its terminal view, which meant the answer could be missed entirely — and when it was missed, that session was stuck for good. Resuming again started a fresh console with the same problem, which is why Retry did not help.",[11,2208,2209],{},"Plexus now answers immediately, in the same place it reads the console's output, before any of the app's own machinery is involved. It was never a problem with your Claude installation, and nothing about that installation needed fixing.",[11,2211,2212],{},"The review-and-fix cycle's background agent could never answer at all — its terminal is deliberately read-only — so its rounds are covered by the same change.",[15,2214,2216],{"id":2215},"a-review-round-that-didnt-run-keeps-its-comments","A review round that didn't run keeps its comments",[11,2218,2219,2220,2222],{},"The review-and-fix cycle marked the comments it handed to a round as resolved the moment it launched the fix agent — about a minute before it could tell whether that agent had started at all. So when one didn't start, the round's findings were struck through anyway: the Review tab read as though there was nothing left to do, ",[23,2221,763],{}," greyed out, and the per-file counts showed a tally of work that never happened.",[11,2224,2225],{},"A round now resolves its comments only once it has actually run. If the fix agent never started, the comments stay open and the next round hands them over again — so a cycle that stopped early leaves you exactly where you were, with every finding still there to act on.",[15,2227,2229],{"id":2228},"the-fix-agent-says-when-there-is-too-much-to-send-it","The fix agent says when there is too much to send it",[11,2231,2232,2233,2236],{},"There is a limit to how much text can be handed to a program when it starts, and a cycle with a lot of open comments could exceed it. What came back was the operating system's own wording — ",[89,2234,2235],{},"\"The filename or extension is too long.\""," — attached to a failed cycle, which explained nothing.",[11,2238,2239],{},"Plexus now checks first and says what is wrong: how much there is, what the limit is, and that resolving or deleting some comments will let the cycle run. It never sends a shortened version of your comments, because an agent working from half a list is worse than one that didn't start.",[15,2241,2243],{"id":2242},"consoles-are-closed-when-a-terminal-closes","Consoles are closed when a terminal closes",[11,2245,2246],{},"Stopping a session, switching away from one, closing a scratch terminal or finishing a review round now releases the Windows console that terminal was using, instead of leaving it running until you quit the app.",[11,2248,2249],{},"Switching between sessions was the quietest source of this. Plexus keeps a limited number of sessions warm and stops the least recently used one beyond that, so simply moving around a project with more sessions than the warm limit leaked a console each time — with nothing on screen to suggest it.",[11,2251,2252],{},"If you have been hitting this, you do not need to do anything after updating: the leftovers from earlier runs are gone the next time you quit and reopen Plexus.",[15,2254,2256],{"id":2255},"a-terminal-that-fails-to-open-is-retried","A terminal that fails to open is retried",[11,2258,2259],{},"If building a terminal failed once, Plexus remembered the failure and reused it for every terminal afterwards, for as long as the app stayed open. Every session opened from that point on got no terminal — and on Windows, a session with no terminal was a session that could not start. Plexus now retries instead of caching the failure.",[15,2261,2263],{"id":2262},"sessions-that-fail-to-start-no-longer-leave-an-agent-behind","Sessions that fail to start no longer leave an agent behind",[11,2265,2266],{},"If the last step of starting or resuming a session failed, Plexus could return an error while the agent it had just launched kept running — with no way for you to see or stop it. That agent is now stopped as part of the failure.",[15,2268,2270],{"id":2269},"diagnostic-logs-stay-a-sensible-size-and-stay-readable","Diagnostic logs stay a sensible size, and stay readable",[11,2272,2273,2274,2277],{},"Three fixes to the log behind ",[23,2275,2276],{},"Settings → Diagnostics",":",[1039,2279,2280,2283,2286],{},[1042,2281,2282],{},"It could grow without limit inside a single run — one report arrived at 179 MB — because the clean-up on start-up skipped any file whose oldest line was still inside the retention window, which is always true of a file something is actively filling. Oversized logs are now trimmed to their most recent portion regardless of age.",[1042,2284,2285],{},"A session that failed to start wrote a warning about it every two seconds for as long as the app stayed open, which is what filled those logs. That warning is now capped, so the log keeps the part that explains the problem instead of burying it.",[1042,2287,2288],{},"Lines written at the same moment from different parts of the app could interleave, splicing two entries into one unreadable line. Each entry is now written in one piece.",[11,2290,2291,2292,2294,2295,2297,2298,2300],{},"Setting ",[23,2293,1932],{}," to ",[71,2296,1936],{}," still keeps everything, and a log you pointed Plexus at yourself with ",[71,2299,1940],{}," is still never touched.",[15,2302,2304],{"id":2303},"pull-request-comments-you-can-always-send-again","Pull request comments you can always send again",[11,2306,2307,2308,2311],{},"Handing a PR review comment to the agent marks it ",[23,2309,2310],{},"Sent"," so you don't send it twice. That mark now lasts only as long as the agent that received it. Stop the session, resume it, or lose the agent to a crash, and every comment it was given goes back to being sendable — because a prompt written to a terminal that is no longer there was never read by anybody.",[11,2313,2314,2315,2317],{},"Before, the mark lasted for as long as Plexus was open. A send into a session whose agent was not actually running still counted, so the comments were left chipped ",[23,2316,2310],{},", the button that sends them all disappeared, and restarting Plexus was the only way back.",[11,2319,2320],{},"That button also stays on screen now instead of vanishing once everything has been sent. It goes quiet and says what it is waiting for, rather than leaving you looking for a control that isn't there.",[11,2322,2323,2324,2327],{},"If you have ",[23,2325,2326],{},"Resolve PR comments after the agent fixes them"," turned on, it is held to the same rule: a comment is only resolved on GitHub or Bitbucket if the agent that was actually given it finishes the turn. A resume no longer resolves comments that agent never saw.",{"title":98,"searchDepth":99,"depth":99,"links":2329},[2330,2331,2332,2333,2334,2335,2336,2337],{"id":2202,"depth":99,"text":2203},{"id":2215,"depth":99,"text":2216},{"id":2228,"depth":99,"text":2229},{"id":2242,"depth":99,"text":2243},{"id":2255,"depth":99,"text":2256},{"id":2262,"depth":99,"text":2263},{"id":2269,"depth":99,"text":2270},{"id":2303,"depth":99,"text":2304},"2026-08-19","Two Windows fixes that turn out to be the same bug seen from opposite ends. A session could refuse to start — a blinking cursor, then \"Claude didn't start — it launched but produced no output, and an automatic retry didn't help either.\" And every terminal Plexus opened left its Windows console process behind when it closed, some of them spinning a CPU core for as long as the app stayed open. One report had 23 of those alive after a day of use, burning 85 CPU-hours between them while Plexus itself sat idle. There are fixes in here that are not Windows ones either: the review-and-fix cycle no longer marks findings as done when its agent never ran, and pull request comments you send to the agent can always be sent again.",{},"\u002Fchangelog\u002Fv0.20.2",{"title":2190,"description":2339},"changelog\u002Fv0.20.2","v0.20.2","rdv8gmbQBCdzTm4ytgnwmxEwHETGg4Y6YgJ08y590J0",1787146617606]