# [12.0.0-beta.12](https://github.com/maxritter/pilot-shell/compare/v12.0.0-beta.11...v12.0.0-beta.12) (2026-10-04)
### Bug Fixes
* **app:** a refused link takes the running App home, and the moved page counts as rendered ([2848b5b](https://github.com/maxritter/pilot-shell/commit/2848b5bb778948196b7c730af8020eda17637b15))
* **app:** a restart never reopens the setup or moved page from memory, and the self-test keeps no WebView storage ([b601d41](https://github.com/maxritter/pilot-shell/commit/b601d418e6e628b2263675c28ee521fdf91ec60e))
* **app:** inside the App the page offers no browser notification prompt and says where the system's switch is ([ed269dc](https://github.com/maxritter/pilot-shell/commit/ed269dc351f853283cfcb5bcde5a2bfdfe8d861f))
* **app:** the Linux AppImage carries its CLI outside usr/bin, and the proof runs on every leg ([b896b11](https://github.com/maxritter/pilot-shell/commit/b896b11bdfe1bbbe3e7e6ca10968f126fe2f9f5a))
* **app:** the self-test names a licence or expired-link page at once ([6394e16](https://github.com/maxritter/pilot-shell/commit/6394e165759c0497491d5f6d30c81393d0363e22))
* **checkpoints:** a failed run whose scenario was amended runs again ([3f38ca1](https://github.com/maxritter/pilot-shell/commit/3f38ca1aa8dad102395a60eb1eb3b45fe5fc895e))
* **checkpoints:** a run that ran out of time runs again at once, with time for its scenarios, and rerun repeats the right one ([9add490](https://github.com/maxritter/pilot-shell/commit/9add4905a022aebbcb7d51176817f755412803a0))
* **ci:** the App suites run one after the other, the installer is picked by version, WSL2 paths are converted here, and the installer test tolerates a stubborn temp home ([f785682](https://github.com/maxritter/pilot-shell/commit/f78568225cb4207ae161435c75926239d20ddaa3))
* **ci:** Windows jobs check out with LF so git-crypt unlocks, and the App suites skip without a toolchain and find the display's X authority ([e027d61](https://github.com/maxritter/pilot-shell/commit/e027d610a8107a63c35b82348c7e947844585df6))
* **cockpit:** a build's file writes no longer spend the Team pass's hourly budget ([5b59e51](https://github.com/maxritter/pilot-shell/commit/5b59e519cef47e4f775545464134bc913f44f1a9))
* **cockpit:** an ask on a whole document heads its page, and a link marks it ([9ee7f6c](https://github.com/maxritter/pilot-shell/commit/9ee7f6c7ff0deff4fca74ba8b7556fc7d69839d4))
* **cockpit:** no route card above the task's tabs ([eec9f1e](https://github.com/maxritter/pilot-shell/commit/eec9f1e0df2e565eaf2aa1061c50d64ee760eb93))
* **cockpit:** the handoff lists what the plan asks of you, and names only builds that are running ([61a8874](https://github.com/maxritter/pilot-shell/commit/61a887432657f12a237e2898dcfeaeacc4d81727))
* **cockpit:** the Review bar says when the code changed after the judge, instead of an Approve that fails ([1a27896](https://github.com/maxritter/pilot-shell/commit/1a278965015308153ae88d1b98b4662dd0f55ec2))
* **cockpit:** views tell the truth about quick tasks, reopened gates, outline tasks and running helpers ([daf9a50](https://github.com/maxritter/pilot-shell/commit/daf9a5049fa948ac0b4c888ebbfc1160f2f9619d))
* **grok:** the ask message names the exact command, and the proof stops when Grok Bot's computer is offline ([e360241](https://github.com/maxritter/pilot-shell/commit/e360241259603d155c0fa032fb8c4ed86f6d27cc))
* **handoff:** your part renders its emphasis at the handoff too, a bold Now line is sorted by its words, and helpers stay one row at a narrow width ([fadda84](https://github.com/maxritter/pilot-shell/commit/fadda844790459a11111e986c518f951bf9b5476))
* **install:** an install after an uninstall names the mod again ([1505df1](https://github.com/maxritter/pilot-shell/commit/1505df152bfefc51201e9d8c0ac86c6948b518d2))
* **install:** uninstall puts settings back last-set-first, so no empty env stays behind ([a0dcbda](https://github.com/maxritter/pilot-shell/commit/a0dcbdadc2cf108b2d95421c8f8a1d4b3193377a))
* **lane:** a developer's TDD no longer recommends the product route ([70c3a5d](https://github.com/maxritter/pilot-shell/commit/70c3a5ded19e38382ad7d43dd8ca22b48bd119fc))
* **lane:** only a route command with its colon starts a task, so '/ql quick fix …' still shows the picture and the start question ([d76d2a3](https://github.com/maxritter/pilot-shell/commit/d76d2a3e58ef9c07b28a1c0474bd85aebe6787d2))
* **mod:** the pane draws the task's own track, one refresh timer, and a failing status call shows its error ([b2396f8](https://github.com/maxritter/pilot-shell/commit/b2396f8f36d538cb443fdc8bf13a70c3635c8a32))
* **peers:** a Codex state database without side files is read as immutable on every system, leaving Codex's folder untouched ([4793b3f](https://github.com/maxritter/pilot-shell/commit/4793b3f8423b16bcfcc151a69ac28215b8e44616))
* **peers:** Codex threads are found again when Codex 0.160 leaves its state database without side files ([0c91ada](https://github.com/maxritter/pilot-shell/commit/0c91ada413365d04752bfbdf1ba431c044af4163))
* **quality:** a failed security re-check sends the finding to a second re-check, not to the judge ([6eaef69](https://github.com/maxritter/pilot-shell/commit/6eaef69f7351ab5adaf2c2fa96718202debbabf2))
* **quality:** a step heading with no result line is still owed, so an empty block never skips the step ([7bae9b5](https://github.com/maxritter/pilot-shell/commit/7bae9b58ddd636d0952101ada6e3a7ae989d36df))
* **review:** a pull request opened before the task began is not the task's ([8cdff07](https://github.com/maxritter/pilot-shell/commit/8cdff0782757d0eb74b8aa8245a7f0c38bb40526))
* **review:** Review's column never grows past the page under the side panel ([53122be](https://github.com/maxritter/pilot-shell/commit/53122be633082cff3b8e1c6c5d53a56d8a142e82))
* **review:** the tabs row shrinks with the column, and a finished review no longer shows its last shell line ([c8c4ef9](https://github.com/maxritter/pilot-shell/commit/c8c4ef9ceddada1e655eff5a94898a80ab4032ec))
* **review:** the verdict shortens before a tab does, a fold's title stays on one line, and what changed since a run folds to one line ([e5f23c8](https://github.com/maxritter/pilot-shell/commit/e5f23c8bb77a87bf40f4524d2ad85a5108d34c29))
* **scripts:** copy-probe takes the plan folder as an argument and pins playwright-core ([96c0e73](https://github.com/maxritter/pilot-shell/commit/96c0e730d5bce5aebd2ec2304389f2cc59d13401))
* **security:** close publication, review, and local filesystem vulnerabilities ([ab54ff4](https://github.com/maxritter/pilot-shell/commit/ab54ff4bed26c47aaf85fa4e8ad739c57903d86d))
* **server:** a Host with a port no socket can have is refused, not answered with a crash ([c318a3a](https://github.com/maxritter/pilot-shell/commit/c318a3a9a375ff305715b5d2050aa8c53e62a53f))
* **settings:** the Slack card says when Slack can be added again, instead of disappearing ([c0ef46a](https://github.com/maxritter/pilot-shell/commit/c0ef46a21054e5f92f7e8f767064b86b43b8df06))
* **status:** status --json answers a real failure as an error envelope, not as 'no open task' ([521d80c](https://github.com/maxritter/pilot-shell/commit/521d80cb9e14b074e5302c97d1107e8b5eeadd52))
* **team:** a change to a task you can't see answers like an unshared one ([b5719fb](https://github.com/maxritter/pilot-shell/commit/b5719fbd7c72d68abd7945e2d0ce99c9f3129396))
* **team:** a claimed epoch carries its copies in the claim, so no epoch exists that nobody can open ([14bd039](https://github.com/maxritter/pilot-shell/commit/14bd039cd664018d8662ba6dc452a7c67378e419))
* **team:** a machine taken off the device list that still holds the key triggers a new key ([89ac2b3](https://github.com/maxritter/pilot-shell/commit/89ac2b329e70879130f0c4bc3c0e0f1eb52b095e))
* **team:** a machine that reads its asks hands the team key to newcomers, shared tasks or not ([44015a1](https://github.com/maxritter/pilot-shell/commit/44015a10f5324e7fec632833a74bff56ecc37d64))
* **team:** a machine whose App or page looks at the asks hands the team key over within a poll ([29e209c](https://github.com/maxritter/pilot-shell/commit/29e209c1e1c05fb0dffc632a9923aea1348fc6f8))
* **team:** close the races and edge cases a review found in Slack pings and groups ([bf37ebd](https://github.com/maxritter/pilot-shell/commit/bf37ebdcae51f5b0b9f338801ff86df59db27118))
* **team:** key and device decisions use a seat list at most 30 seconds old, not the cached five minutes ([7bbef43](https://github.com/maxritter/pilot-shell/commit/7bbef437dc593cc46d5394dcfb8d99c3f846504a))
* **team:** send nothing to the backend while a 429 pause runs ([8d17ee4](https://github.com/maxritter/pilot-shell/commit/8d17ee47947545d3302ffb9454daeda2ff708f75))
* **team:** the backend refuses key writes from a member without a seat ([760cc18](https://github.com/maxritter/pilot-shell/commit/760cc187da49c21ce9aec4159908e13adbadf3ce))
* **ui:** the role dialog's focused card shows a focus ring, not the chosen fill ([563bcec](https://github.com/maxritter/pilot-shell/commit/563bcec8ac7c1a764c2008bd4b6e149d4598b71e))
* **verify:** a judge set that was over stays over when the task comes back to Verify ([b0a98e8](https://github.com/maxritter/pilot-shell/commit/b0a98e84064aa754fd5c5733a5c0c89c759af2d0))
* **verify:** Accept as is stays in the bar whatever the agent is doing, quiet or gone included ([73b93b8](https://github.com/maxritter/pilot-shell/commit/73b93b85a24d7ae2def8319eea66fed192e6c678))
* **verify:** cited evidence may sit in a subfolder of the evidence folder ([dd5349b](https://github.com/maxritter/pilot-shell/commit/dd5349be8a85b70794569c2d7470d9f59c632047))
* **verify:** the final gate opened in Verify says it waits for the quality pass ([e0e732a](https://github.com/maxritter/pilot-shell/commit/e0e732aad47472398ecdefa59ac9cb3ee3d4bf93))
* **workflow:** a PRD's mockups reach the builders, and a product task is tagged as one ([ec1d9a8](https://github.com/maxritter/pilot-shell/commit/ec1d9a8947456373233fd6cf4a8e96d55528dc69))
### Features
* **app:** --quit lets a script do what the tray's Quit does ([dfb2d11](https://github.com/maxritter/pilot-shell/commit/dfb2d11ee00ca5d93fdb852655c183d643828644))
* **app:** a development QualityLayer App over the local server, reached through a launcher ([574badd](https://github.com/maxritter/pilot-shell/commit/574badde1d42870f7ff5ff2178dbd56a8645d238))
* **app:** a signed, notarized Mac App that updates itself and its CLI ([f33139d](https://github.com/maxritter/pilot-shell/commit/f33139db3723223a1fb6f3c04717c57e3eb60a4b))
* **app:** closed, the App waits in the tray and notifies about gates and asks ([454a1ef](https://github.com/maxritter/pilot-shell/commit/454a1efad9de937ceac6a5f9797c95c911a70e3e))
* **app:** first start sets everything up without a terminal, and greets Pilot Shell 11 users ([90d13f5](https://github.com/maxritter/pilot-shell/commit/90d13f5302b605da1bbedea80b3663f23cede162))
* **app:** on macOS the App asks the system for notification permission and shows notifications through UNUserNotificationCenter, with a tray line while it is undecided or denied ([e0caad0](https://github.com/maxritter/pilot-shell/commit/e0caad056bd87d9911962268f588830c4aacbef4))
* **build-view:** drop the plan map from the Build tab ([45775e0](https://github.com/maxritter/pilot-shell/commit/45775e0437e6547f1c958276ea10b13fa1f540d6))
* **build:** checkpoints run what changed, corrected scenarios never stop a build, helpers report from any shell ([1323a59](https://github.com/maxritter/pilot-shell/commit/1323a59a4bb9315bfd94fe22e2a257dc74798aca))
* **claude-code:** a mod shows the task in the terminal, from qualitylayer status --json ([0bfa1de](https://github.com/maxritter/pilot-shell/commit/0bfa1def33196515625d9edf308fbe8ffad905ff))
* **cockpit:** every document copies out, formatted or as Markdown ([9d0e290](https://github.com/maxritter/pilot-shell/commit/9d0e290a3d039d5bb78a8489163d1f6551489def))
* **cockpit:** the handoff switches build steps into the prompt, and the task shows its route and quality pass ([b83988b](https://github.com/maxritter/pilot-shell/commit/b83988bf6b80e1bf9e2475518e649e88dc6ce1f1))
* **demo:** the Cockpit demo and the film posters show the new flow ([5ef8d8d](https://github.com/maxritter/pilot-shell/commit/5ef8d8d2ca480404cc93f39f1e9b7088a3045b9b))
* **design:** a design proves what it stands on before its gate ([aef6e36](https://github.com/maxritter/pilot-shell/commit/aef6e363db7dfec162be39190db977dfc495e5bf))
* everything people read says the QualityLayer App, not the Cockpit ([bbc6b9e](https://github.com/maxritter/pilot-shell/commit/bbc6b9e9fcc3ac4e06155b63b081d88b566284dd))
* **gates:** only a person approves a gate, in the Cockpit or by typing approve in the chat ([6428508](https://github.com/maxritter/pilot-shell/commit/6428508e8f842482f34dc3c8c322bc6fbc1b97a0))
* **grok:** the ql skill goes into Grok Bot, an ask goes to the person's bot, and the App offers both ([b55c0a5](https://github.com/maxritter/pilot-shell/commit/b55c0a5d2e98bcf7894b0e15b6f84dcd6d2f6b51))
* **install:** a machine with a screen gets the App, every other the command line ([47b4ef5](https://github.com/maxritter/pilot-shell/commit/47b4ef58b52ccbdd6e2710d9304ce4ba906f18c4))
* **install:** the move from Pilot Shell 11 also removes what Pilot's uninstaller leaves, and the App's move page starts with the terminal's ticks ([73f0d83](https://github.com/maxritter/pilot-shell/commit/73f0d83146cb7663098349d7d545d4bbb4801e0e))
* **links:** guest links carry their key after #, the handoff renders its emphasis without the crew table, and Changes so far shows only the build's work ([f318ffc](https://github.com/maxritter/pilot-shell/commit/f318ffc01249a25b5ff29f3f06b87076ff3b6a3e))
* **links:** plain links on any forwarded port that land in the App ([d436e60](https://github.com/maxritter/pilot-shell/commit/d436e601a4ffc3a4cd25dc4b56673790ab3d8084))
* **peers:** sessions sharing a checkout say what they do, claim paths and pause ([127d78e](https://github.com/maxritter/pilot-shell/commit/127d78e696105f631177fada39aa9d29e43d7bfa))
* QualityLayer gives back your status line and shows itself in a band above the prompt ([a3e50ac](https://github.com/maxritter/pilot-shell/commit/a3e50ac2343bdc561fb4de2a154d7b4f27762a3d))
* **review:** every Review tab reads short, and Accept as is sits in the Verify bar ([e329518](https://github.com/maxritter/pilot-shell/commit/e3295182a46e5d91aa870954ce879b66ed8b2a82))
* **settings:** auto-advance, on by default: the frame and the research go on without a review ([7d24793](https://github.com/maxritter/pilot-shell/commit/7d2479319f599cee7b811fc8aad81112c4b21776))
* **settings:** one model per agent for subagents and the second opinion, and a switch per optional step ([868b9c8](https://github.com/maxritter/pilot-shell/commit/868b9c8eafbe139e50d2c01102ba916c4efce90a))
* **site,docs:** the scroll website, and README and docs for the App and the five steps ([c5274f5](https://github.com/maxritter/pilot-shell/commit/c5274f5ac0334b25d957542145cec17a6b6e3a01))
* **site:** Slack DMs open the App through qualitylayer.dev/open, and a download page ([99723d5](https://github.com/maxritter/pilot-shell/commit/99723d5de629b50001c75bce46f07fa4641cde63))
* support native Windows and harden standalone builds ([b10088f](https://github.com/maxritter/pilot-shell/commit/b10088f700896c4562222c34007b97569d1f76c1))
* **team:** a tag on a shared task becomes a Slack DM whose link opens the ask ([b755530](https://github.com/maxritter/pilot-shell/commit/b755530e667cea69d3d880c39b55c7c883cd22a0))
* **team:** a teammate's own Claude Code or Codex answers an ask after their yes ([2cebcff](https://github.com/maxritter/pilot-shell/commit/2cebcff0cfcce24f375461e8ce7dd9891cc12b72))
* **team:** groups keep a team's shared tasks to their members, enforced by the backend ([2f8a2d9](https://github.com/maxritter/pilot-shell/commit/2f8a2d9cc15275ab33180230d47d40ba2506f0b3))
* **team:** owners manage groups in Settings, sharing picks a group, and the Team space filters by it ([2dc508c](https://github.com/maxritter/pilot-shell/commit/2dc508cd788e5053bd72da4e9f85d5d405fe7c8f))
* **team:** reminders, hand-offs, your turn and build outcomes reach Slack once, and survive a busy Slack ([c8efbef](https://github.com/maxritter/pilot-shell/commit/c8efbef0a4d27695a8af7ee866398d96ccd6eada))
* **team:** shared plans, comments, asks and reviews travel sealed; teammates get the key without a step ([f28aaaa](https://github.com/maxritter/pilot-shell/commit/f28aaaab3fd326ba77cb0f9ff74e92b324bce8ef))
* **team:** the team owner connects Slack from Settings, through an install bound to their browser ([087e03d](https://github.com/maxritter/pilot-shell/commit/087e03dc34b8746431d9a715a2b49fa57a8e79a1))
* **ui:** the App uses shadcn 4.21.1, with collapsible sections and a modal picture viewer from the components ([e66fc4c](https://github.com/maxritter/pilot-shell/commit/e66fc4c443fe90aaeea544f442e106d7225ac402))
* **ui:** the document reader shows an outline of the document ([95e36f3](https://github.com/maxritter/pilot-shell/commit/95e36f3baa041833702f1d6a96d85e78d72f8127))
* **verify:** a defect the test gaps review finds is fixed before the judge ([20c97b8](https://github.com/maxritter/pilot-shell/commit/20c97b8e729ace19679c07bd499f50d73ad2eebe))
* **verify:** a quality pass with a security review runs before the judge, and you can accept a build as it stands ([73a43a4](https://github.com/maxritter/pilot-shell/commit/73a43a400ab1f9538bae08c609c3122e42b00eaa))
* **verify:** every optional step follows the task's list, and Simplify joins the quality pass ([f4cd3c5](https://github.com/maxritter/pilot-shell/commit/f4cd3c561f924dbe51584118c2d02202a7ba481e))
* **workflow:** a product manager plans with a PRD and a TDD, and the role recommends that route ([c842d29](https://github.com/maxritter/pilot-shell/commit/c842d29c2f253129ac24fd5dbd7e457eac0243c5))
* **workflow:** every task starts from its route picture and keeps the optional steps chosen for it ([d8be97a](https://github.com/maxritter/pilot-shell/commit/d8be97af88967ad40eb612824e13b606c0cb232d))
### Performance Improvements
* **changes:** a change of hundreds of megabytes previews in a third of a second, names with umlauts included ([c280fd1](https://github.com/maxritter/pilot-shell/commit/c280fd19d0f7fd3acd6a89900d7006c769d210a3))
* **cockpit:** a task opens in a third of a second, not eight, and a test keeps it that way ([d678153](https://github.com/maxritter/pilot-shell/commit/d678153fccb273058ff61ebec6a5c724d082c892))
* **cockpit:** the page's script drops from 6.2 MB to under 1 MB, and a reload reuses it ([97a2077](https://github.com/maxritter/pilot-shell/commit/97a2077197d40072fde0f0c21db794f16c3c989a))
* **review:** Review reads the acceptance file instead of diffing the whole build on every load ([a40d11e](https://github.com/maxritter/pilot-shell/commit/a40d11e90498f5a8393c85ce167416c6fff37773))
* **review:** the files changed draw only what is near the view, and a comment no longer draws every file again ([c007495](https://github.com/maxritter/pilot-shell/commit/c007495e362a59c4d982d0df7a5c2f87d92a435a))
* **revision:** a build's revision is read once per change, not on every Cockpit refresh ([b9f85c5](https://github.com/maxritter/pilot-shell/commit/b9f85c59b4418193e856deb1690659dfb4b2dd71))