Skip to content
Changelog

What Quickshell shipped.

Every entry in docs/CHANGELOG.md, read at bc9e62e and dated by the commit that wrote it.

Atom feed
  1. The UI cases still carry a synthesised-input workaround for a foreground winwright 1.1.3 now takes itself

    The UI cases run on winwright 1.1.3, which takes the foreground at launch, so the nudge is gone and the tab case soaked alone passed 20 of 20.

    QS369 · 7d4fcf1
  2. Winwright 1.1.2's repair of the tab case's typed substitution is unproven, so winwright's WW545 stays blocked

    The tab case passed 300 of 300 guest runs on winwright 1.1.2, the repair firing on two; run-tests-vm -Soak repeats any one case on one build.

    QS368 · 00a82b3
  3. In a split tab every pane blinks its cursor and nothing marks which pane has the keyboard

    Only the focused pane blinks; the others draw a steady hollow cursor and ask for no blink frames, and in a split tab the focused pane is framed in the accent.

    QS367 · 6533daf
  4. A default window hides the menu bar until Alt is tapped, so a person who does not know the tap never finds it

    A default window shows the menu bar under the title bar, menuBar now defaulting to Always; Alt and Hidden stay, and Block G's criterion names the menu bar as part of a default window.

    QS366 · 7d14260
  5. The palette's Document sessions as PDF writes only the connected session instead of every saved one

    Document all sessions as PDF, in the palette, writes every saved session whatever the sidebar selected; the sidebar's own menus still document the session, folder or rows chosen there.

    QS365 · fe69a45
  6. The UI cases still work around three winwright gaps that 1.1.2 closed

    The cases name the checkout by {root/}, stage the agent feed and request as written now, and bring the menu bar up by an Alt tap, all on winwright 1.1.2.

    QS364 · 26aee1e
  7. Choosing several sidebar rows is proven by automation peers in a unit test, not by a UI case

    A UI case Ctrl+clicks two sessions and a folder, Shift+clicks a range and reads each row chosen; the set they stand for is still read in process.

    QS349 · d40640f
  8. That a tab's close cross is drawn inside its tab is proven by an in-process render, not by a UI case

    A UI case retitles a tab short and then long and claims its close cross is drawn inside it and not empty, so QS312's geometry is proven in the guest.

    QS348 · 81b35c3
  9. The Claude Code plugin names quickshell.exe by its Windows path, which a Claude Code inside WSL2 cannot start

    Install into WSL in Settings finds a distribution's claude and installs a plugin naming quickshell.exe by its /mnt path, measured answering tools/list.

    QS363 · eebcb65
  10. The tab-strip UI case's typed "first-tab-marker" once reached cmd as "first-tabrmarker"

    Traced to winwright: both typos are WW310's last-character substitution, which its resend cannot repair on a terminal; filed there as WW545, nothing for the client.

    QS361 · 7d14b26
  11. An agent account set up from the session menu cannot be removed from it

    Remove the agent account from the session menu: the removal shown, run in the person's tab under their sudo, and the session's own identity and key forgotten.

    QS359 · 8e0b91f
  12. On native Windows nothing below the shell stops an agent's own script from opening SSH around the gateway

    On Windows the wall is WSL2 with its sandbox and the Windows gateway as MCP server, measured; firewall rules by program or user lost (design recorded in docs/design/agent-gateway/README.md).

    QS358 · 7975315
  13. The echo-delay pipeline test goes red in the guest when ConPTY prints under 300 KB/s for thirty seconds

    The echo-delay test reads until a byte count or its patience, skips naming cmd's rate when too little printed, and still fails a parser that falls behind.

    QS357 · a33b93f
  14. exec quotes every argument for a POSIX shell, so on a Windows server a word with a space or a quote arrives altered

    On a Windows server exec goes through PowerShell to CreateProcess, quoted as Windows reads it back, so a space, quote, % or & arrives byte for byte.

    QS356 · 57990f5
  15. Every action is reached only by a hotkey or the palette, so a user who has not learned them cannot find a feature

    An Alt tap shows a menu bar built from the palette's own bindings, every action under a heading with its keys; a default window still holds no menu.

    QS354 · 894c751
  16. A connected recent card on Home clips its New connection and Go to tab buttons when the window is not maximised

    A connected recent card gives its when a row of its own and wraps Go to tab under New connection, so a restored window cuts neither button.

    QS353 · 4f69916
  17. Whether a narrowed bash pane's extra prompt line on a split is bash's or this client's reflow was never traced

    Traced on the fixture's bash: it redraws its prompt in place with no line feed; the prompt moves down only by lines the client's reflow wraps, and shows once.

    QS350 · 1255719
  18. A middle click closing a tab is proven by routed events raised in a unit test, not by a UI case

    UI cases in the guest middle-click a tab closed and right-click Close tabs to the right, now that winwright 1.1.1 names a click's button.

    QS347 · 845c66a
  19. Wiring the gateway into Claude Code means hand-editing MCP config, hooks and sandbox rules, so few will

    Settings offers a Claude Code plugin quickshell writes itself: the gateway, the hook and a skill installed in one answer, refused by a gateway of another version.

    QS343 · 4b94970
  20. Asking a local Claude Code about what a pane shows means copying the scrollback by hand into another window

    Open Claude Code runs it in a local pane wired to the gateway and hook; Send to Claude types a pane's selection or screen into it under its session and tags.

    QS342 · bcae1bc
  21. An agent's key on a server is valid until someone removes it, so a key that leaks works for months

    The agent signs in on a certificate quickshell signs for minutes per connection; its key alone and an expired certificate are refused by the server.

    QS341 · 9cc9fac
  22. A client-side policy is advice the server never hears, and nothing helps set up an account that limits an agent there

    Set up an agent account from the session menu: the exact script shown, run in the person's tab under their sudo, and the identity recorded on the session.

    QS340 · 2b00401
  23. An agent able to write files can rewrite the very policy that limits it, and grant itself whatever it wants

    The hook keeps an agent's tools off its policy and approvals; a policy changed outside quickshell holds every call until accepted (design recorded in docs/design/agent-gateway/README.md).

    QS339 · 8c7f3e6
  24. Text an agent read from a server can steer its next command, and the policy treats that command as if nothing happened

    After an agent reads server text, every change asks, even a granted one, until the person trusts it again in the palette (design recorded in docs/design/agent-gateway/README.md).

    QS338 · 9d004cb
  25. A call the policy says to ask about has nowhere to be asked, so the gateway can only allow or refuse it

    An ask shows in a quickshell dialog, each call as its words with session, tags and diff; the answer binds to the batch hash, may grant (design recorded in docs/design/agent-gateway/README.md).

    QS337 · 165ba39
  26. Every call an agent makes through the gateway is allowed, whatever the host and whatever the command

    Each gateway call is judged first: a read runs, a mutation asks or is refused by tag level, and a grant or break-glass admits it (design recorded in docs/design/agent-gateway/README.md).

    QS336 · 9758de9
  27. What an agent runs on a server is invisible to the person until it reports back, if it reports at all

    Each gateway run shows in quickshell as a read-only tab badged agent, every call and its result in it, behind the tab in use (design recorded in docs/design/agent-gateway/README.md).

    QS335 · 39fe5ab
  28. CI is red on every push: the app tests skip three on a clean runner against a budget of two

    The app tests may skip three on a clean desk, PuTTY's and MobaXterm's two real-file readers, so CI is held to what a runner without either has.

    QS355 · f40c0a7
  29. The recording test stops its recording on the first byte, ConPTY's mode sequences, before the line it reads back

    The recording test waits until the echoed line is on the pane's screen before stopping, so a fast run no longer records only ConPTY's escapes.

    QS352 · 3b65301
  30. Only the prod tag has a look on the strip, and no import brings tags in from MobaXterm or PuTTY

    A MobaXterm folder named exactly prod, production or prd imports tagged prod, named in the preview first (design recorded in docs/SESSIONS.md).

    QS351 · a7cf15e
  31. Reading a KDBX 4 vault encrypted with ChaCha20, or derived with AES-KDF, is proven by no vault

    A ChaCha20 vault and a KDBX 4 AES-KDF vault written here open in keepassxc-cli and read back through KdbxReader.

    QS346 · 69f90ab
  32. An exported vault restores the passwords but not the key files sessions name, so a new machine still lacks the keys

    An export can carry each key file sessions name, once with its .pub, read back unchanged by KeePassXC, and a kept vault keeps them (design recorded in docs/SESSIONS.md).

    QS345 · 3516aaf
  33. A person who sees an agent going wrong on a server has no single act that stops it everywhere at once

    Ctrl+Shift+F12 stops every agent: each gateway cancels its jobs, closes its connections and refuses calls until let run again (design recorded in docs/design/agent-gateway/README.md).

    QS334 · b9783f2
  34. Nothing records what an agent ran on which server, who approved it, or what came back, once the session scrolls away

    Each gateway call is a hash-chained audit line, and quickshell --audit prints a run's changes and names a removed line (design recorded in docs/design/agent-gateway/README.md).

    QS333 · ddf8155
  35. With the gateway installed an agent can still run ssh, plink, scp or paramiko from its own shell and skip every rule

    quickshell --agent-hook denies an agent's ssh, scp, rsync, git or paramiko call, naming the gateway tool to use instead (design recorded in docs/design/agent-gateway/README.md).

    QS332 · 3385506
  36. A saved session carries nothing that tells production from staging, to the person or to anything reading the store

    A tab holding a session tagged prod, by its own tag or a folder's, shows prod in the danger colour, and every tag is the tab's item type (design recorded in docs/SESSIONS.md).

    QS331 · ee63734
  37. A secret printed by a remote command, an .env or a token, goes straight into the agent's transcript and its provider

    Every gateway answer passes a redactor that hides keys, tokens and password assignments and counts them (design recorded in docs/design/agent-gateway/README.md).

    QS330 · fb912ab
  38. A large command output lands whole in the agent's context, so one journalctl costs the rest of the session's room

    exec answers within a byte budget, head and tail kept and the cut named, and output_page and output_grep reach the rest (design recorded in docs/design/agent-gateway/README.md).

    QS329 · 8a610c2
  39. A long remote command dies at the agent's timeout, or with its connection, and leaves no way to look back in on it

    job_start runs a command detached, kept on the server, so a later gateway reads its output by cursor and its exit code (design recorded in docs/design/agent-gateway/README.md).

    QS328 · ee36eb0
  40. A sudo password, a pager or an apt dialog hangs an agent's command until its timeout, with no word of what it waited for

    exec runs with no input, pager or apt dialog, so nothing waits for a person, and a sudo password or y/N is named (design recorded in docs/design/agent-gateway/README.md).

    QS327 · b65f070
  41. An agent edits a remote file by heredoc or sed -i, blind, with no diff for the person and no copy to go back to

    read_file and edit_file read a remote text file and change one exact piece of it, the original kept beside it, the diff returned (design recorded in docs/design/agent-gateway/README.md).

    QS326 · 78ef66d
  42. An agent reaches a saved session only through raw ssh, quoting through four shells and paying a handshake per command

    quickshell --mcp serves hosts_list and exec: argv byte-exact on a kept connection, streams apart, off unless agentGateway (design recorded in docs/design/agent-gateway/README.md).

    QS325 · 3a79ff5
  43. Approving an agent's commands one prompt at a time trains the person to click yes, the 41st one included

    The approval section settles plans bound to a hash, a dialog the agent cannot fake, a measured ask budget, and both open questions (design recorded in docs/design/agent-gateway/README.md).

    QS324 · f0ab2e2
  44. Nothing says how a remote command is judged read-only, so a regex blocklist is the only idea on the table

    The judging section picks a small managed parser, an argument-checked allowlist, narrow unwrapping and a zero-false-allow gate (design recorded in docs/design/agent-gateway/README.md).

    QS323 · 8d1ee36
  45. No policy format exists to say what an agent may do on which host, for how long, or who may change it

    The policy section fixes tags, three levels, grants that must end, a file only the person writes, an example and three open questions (design recorded in docs/design/agent-gateway/README.md).

    QS322 · d38d062
  46. Nothing decides whether an agent gateway fits a client sold as "an SSH client, not a suite"

    The agent gateway is in scope on the owner's answer: off by default, its own process, no network, nothing on the terminal's path (design recorded in docs/design/agent-gateway/README.md).

    QS321 · 3e8aa9d
  47. Nothing written says what an agent driving SSH from this desk can harm, nor which layer stops which harm

    docs/design/agent-gateway/README.md opens with the threat model: six harms, who causes them, three layers and what each honestly stops (design recorded in docs/design/agent-gateway/README.md).

    QS320 · 4d2ac1e
  48. Two tabs on the same host carry the same title, so the strip gives nothing to tell them apart by

    Every tab shows its place on the strip before its title, the Alt digit that reaches it, renumbered when a tab is added, closed or moved (design recorded in docs/KEYS.md).

    QS319 · 287c78c
  49. The session bar's Split button always splits side by side, with no way to split one above the other

    The session bar's Split keeps its click beside and has a chevron offering Split right and Split down, each naming its chord (design recorded in docs/SESSIONS.md).

    QS318 · 841733d
  50. A pane opened by Split has no button, chord or palette entry that closes it, only closing the whole tab

    A split tab's panes each carry a close cross above them, Ctrl+Shift+W closes the focused pane before the tab, and Close pane is in the palette (design recorded in docs/KEYS.md).

    QS317 · 0686e58
  51. Each split prints a new prompt line in every pane already open, as if Enter had been pressed in it

    A resize to the size a pane already has tells the far end nothing, and none writes input, so a split no longer prompts a pane it did not resize.

    QS316 · a4ac7ed
  52. How a set of sessions is configured, with jump hosts, keys and forwards, can be documented only by copying it by hand

    Document as PDF, in the sidebar's menu and the palette, writes the chosen sessions with every value's origin, jump hops, forwards and key fingerprints, and no secret.

    QS315 · aafc3a2
  53. The sidebar selects one row at a time, so nothing can act on several chosen sessions at once

    Ctrl+click, Shift+click and Ctrl+A choose several sidebar rows, and the window reports the set, a chosen folder standing for every session under it (design recorded in docs/SESSIONS.md).

    QS314 · 48819bb
  54. A recent card says Connected now and its Connect opens a second connection, with no way from Home to the open tab

    A card or sidebar row whose session is open offers Go to tab, which puts that tab on screen, and New connection beside it (design recorded in docs/SESSIONS.md).

    QS313 · 924bc77
  55. A tab's close button is in the tree but a user looking at the strip does not find it, so a tab seems unclosable

    A tab's close cross is drawn at 10 points after every title, inside its tab; the theme's button padding had left it no room to paint.

    QS312 · c3a1b82
  56. A right click on a tab offers nothing, so closing every tab but one is a close per tab

    A tab's menu offers Close, Close other tabs and Close tabs to the right, asking once for every live session it would end; the last two are palette commands too (design recorded in docs/KEYS.md).

    QS311 · f45d4dd
  57. A middle click on a tab does nothing, where every browser and terminal on Windows closes it

    A middle click on a tab closes that tab, asking first for a live session, and leaves the tab on screen, or Home, where it was (design recorded in docs/KEYS.md).

    QS310 · a7ede8f
  58. Splitting a pane opened on a saved session opens a local Command Prompt instead of another shell on that server

    A split of a server's pane opens the same saved session in the new pane over a connection of its own, and a split of a local pane is still a local shell.

    QS309 · c597600
  59. A new machine starts with no remembered password, because DPAPI does not travel and nothing reads a vault back

    Import saved passwords reads a KDBX 4 or 3.1 vault, ours or KeePassXC's, and remembers each matching session's password, asking before replacing one (design recorded in docs/SESSIONS.md).

    QS308 · 4b8c234
  60. An exported vault goes stale the moment a password is saved or changed, so the file consulted is not the one in use

    With Keep this file up to date ticked, the vault is rewritten on every password or session change, from a DPAPI-kept key (design recorded in docs/SETTINGS.md).

    QS307 · 6213cd7
  61. A forgotten password can be read only by connecting with this client on this machine, so there is nothing to consult

    Export saved passwords, in the palette, writes every session and its saved password to a KDBX 4 vault after Windows Hello (design recorded in docs/SESSIONS.md).

    QS306 · 21b80f0
  62. Nothing in the client can write a KeePass KDBX 4 file, so no saved secret can leave it in a form another tool opens

    KdbxWriter writes KDBX 4 vaults, key file and attachments included, that keepassxc-cli 2.7.12 opens field for field (design recorded in src/Quickshell.Transport/Kdbx.cs).

    QS305 · a71adda
  63. The sessions sidebar opens with every folder unfolded, so a large store is a long list before it is a tree

    The sessions sidebar opens with every folder folded, one click opens one, and a copy or a move opens the folder it put its session in.

    QS304 · 30862c2
  64. The Explorer drop is proven by a test that drives the desk by hand instead of by a UI case

    The Explorer drop is a UI case in browser.cases.json: a file dragged from the host's pane lands in an Explorer folder and is read back byte for byte, and the hand-driven test is gone.

    QS292 · d74c140
  65. The UI cases run on winwright 1.0.2, so CasesRun guesses a survivor's case that 1.1.0 names itself

    The UI cases run on winwright 1.1.0, and a survivor's red names its case from the engine instead of a pairing guessed by launch order.

    QS303 · dbd994b
  66. A guest run starts while another project's run is driving the same VM, and its UI cases lose the foreground

    Every guest tool takes winwright's desk mutex before it touches the VM, and a second run waits naming the holder, so two suites never share the desk.

    QS302 · db7d320
  67. The client crashes on every start after a window maximised from its first paint is closed

    A window maximised from its first paint is remembered without a rectangle, and a file already holding -2147483648 opens maximised instead of crashing.

    QS301 · 4e5fd00
  68. A folder in the sessions sidebar opens or closes only on a double-click

    A folder in the sessions sidebar folds on one click, the second press of a double-click is ignored, and a session still connects on a double-click.

    QS300 · 4499d04
  69. The Explorer drop run sometimes goes red waiting for the host's file list, without saying what the browser showed

    The UI-case assembly runs one class at a time, so the drop run's real input no longer shares the desk with CasesRun's windows.

    QS299 · 3b86055
  70. A UI case's client sometimes outlives its case and turns a green run red, without saying which case

    A survivor's red also says whether it went soon after the kill or Windows could not end it, which is what a stop that failed after a kill can mean.

    QS298 · 05b0687
  71. An imported MobaXterm jump host drops its user and port, and a chain of two jumps becomes one unusable name

    A MobaXterm jump comes across as user@host:port from its three fields, two jumps as an OpenSSH chain; JumpHost takes that chain, and the guest opens a session through two hops.

    QS297 · 3f1f74f
  72. A MobaXterm import drops jump hosts, flattens nested folders, and finds no portable edition's file

    A MobaXterm import carries the jump host into the session's own, keeps nested folders nested, and asks for the file where none is where MobaXterm keeps it.

    QS296 · aa73048
  73. PuTTY's sessions cannot be imported from the window, though the import reads them

    The window's import reads PuTTY's sessions as well as MobaXterm's, each previewed and written on its own under a folder named for its client.

    QS295 · aa73048
  74. The import preview says each setting left behind is named beside its session, and names none

    The import preview names what each session left behind, grouped with the sessions that had it, and the store carries it as a comment above each session that later writes keep.

    QS294 · aa73048
  75. A session never asks Pageant for a key, so a PuTTY or MobaXterm user's loaded keys are not offered

    A session offers Pageant through its window after the OpenSSH agent; in the guest a saved session with no key opens on the sshd with a key only Pageant 0.77 holds.

    QS293 · 6020c9a
  76. A host run is over the skip budget, because the tests that only the guest can run count as its skips

    A skip naming a tools/provision-guest-*.ps1 script is waived and listed off the guest, and counted in it, where run-tests-vm sets QUICKSHELL_GUEST.

    QS291 · 190707d
  77. This client has never met Windows OpenSSH, where the far side is cmd under the console host

    Windows OpenSSH 9.5 in the guest negotiates curve25519, ed25519, aes128-ctr and hmac-sha2-256, and cmd draws through the console host: a row in the matrix.

    QS290 · 464091f
  78. A guest run after one that was cut off cannot sync, because the old run's test processes still hold the tree

    A guest run ends what a cut-off run left running, its batch and then this client's processes, each said by name and pid, before it syncs.

    QS289 · 0bb05cd
  79. The repository declares no licence, so "free and open" cannot be said of it to anyone it is shown to

    quickshell is MIT: LICENSE at the root, PackageLicenseExpression set, the README and site say so, and the bundled MIT and ISC libraries are credited in the archive.

    QS285 · 2ddca86
  80. The tab strip is the stock control: no Home tab, no status dot, no close or new-tab button, no accent underline

    tabs.cases.json finds each tab by its published state, TabItem[status="Local"], left behind and right on screen, read in the guest on winwright 1.0.2.

    QS278 · ea3cb2f
  81. No UI case reads the session bar's state or forward chips, since no case fixture reaches an SSH server

    connected.cases.json reads a live tab's session bar, Connected, forward chip and status in the guest, over a Windows sshd on 127.0.0.1:2240 that provision-guest-sshd.ps1 sets up.

    QS273 · 44eef4e
  82. The window opens on a local Command Prompt, and nothing on screen says this client connects to servers

    A new window opens on Home and starts no shell, startWith Shell or --tabs, --panes, --session open a shell; a Home start is timed at Home's first frame.

    QS272 · e3bb78d
  83. Nothing can be dragged out of the host's pane, so a file on the server reaches Explorer only through a copy

    In the guest a file dragged from the host's pane onto an Explorer folder lands there byte for byte, by real input; a C# test until a case can drop on another window (QS292).

    QS188 · ccb962a
  84. A PuTTY user on Pageant older than 0.78 has an agent this client cannot reach at all

    A real Pageant 0.77 in the guest lists the key through its window, signs what the key verifies, and opens a session on the guest's sshd with nothing else offered.

    QS114 · 23d144b
  85. A user weighing the switch has nothing that says what they will and will not get

    docs/SWITCHING.md says what comes across, what quickshell does and refuses with what to use instead, and compares it with MobaXterm 26.5 from a documented guest run.

    QS81 · d8c4020
  86. The contrast test's Direct2D reference still draws blank in the guest after every redraw, and the run goes red

    A Direct2D reference still blank after its redraws is drawn on a device built from scratch, and where that is blank too the pass is a skip with its reason, not a failure.

    QS287 · ba74f07
  87. The site and llms.txt describe features as shipped that the client lacks, so a visitor arriving from a post is misled

    The site and llms.txt say what has shipped: pre-release 0.1.0, unsigned, no release yet, 160 MB, golden images on NVIDIA and WARP, no agent forwarding, reconnect as delivered.

    QS286 · 745310e
  88. A guest run with no failing test goes red on the skip budget when a bitmap is copied on the host during it

    A guest run turns VMware's clipboard sharing off for its whole length and back on after, so a picture copied on the host mid-run no longer skips the clipboard case.

    QS284 · c846347
  89. The window, taskbar, Alt+Tab and Start menu show Windows' generic application icon

    The executable carries the client's own mark at 16 to 256 px, drawn per size by tools\make-icon.py, so the window, taskbar, shortcut and uninstall entry show it.

    QS283 · 14f2a6b
  90. A local tab and the window are titled C:\WINDOWS\system32\cmd.exe instead of naming the shell

    A local tab whose shell wrote its own executable's path is named as the shell: Command Prompt, Windows PowerShell, PowerShell or WSL; any other title shows as written.

    QS282 · ffb9d52
  91. The terminal's text touches the sidebar's divider and the window's top edge, with no inset around the grid

    The terminal sits 18 in from the sides and 14 from top and bottom, in the focused pane's own background, repainted with a new scheme or OSC 11, and the grid shrinks to fit inside.

    QS281 · d510cd5
  92. Home has the design's content in another layout: quick connect in three rows, other start-point copy and shape

    Home is the design's: the 26px heading and its line, quick connect in one row with a Sign in with drop-down that asks for a key file, and three start-point cards.

    QS280 · c120ea3
  93. Home's recent sessions are forgotten on every restart and their cards cannot say when each was last used

    Home's cards are the design's: Recent with Show all sessions, three columns, a server tile, name over address, folder and tag chips, the time and a 28-high Connect.

    QS279 · 0a36c23
  94. The sidebar is not the approved one: a filled hamburger, Command Prompt icons on SSH rows, an opaque selection

    The sidebar is the design's: a ghost panel fold, 32-high rows indented 8 plus 22 a level, a drawn terminal glyph on sessions, the accent at a tenth when selected, a Files and Tunnels rail.

    QS277 · d62f0c9
  95. An imported key path keeps MobaXterm's _ProfileDir_ placeholder, so the key file is never found or offered

    MobaXterm's _ProfileDir_, _MyDocuments_, _AppDataDir_ and _CurrentDrive_ expand on import and when a key is offered, and a named key that is not there is said in the pane.

    QS276 · 02421cc
  96. A store whose root node has a name opens none of its sessions: every row says there is no such session

    A store whose root node has a name opens every session the sidebar lists: the root's name is kept in the file and is never part of a path.

    QS275 · 937112f
  97. A green guest run brings no reports back, so which UI cases ran cannot be read on the host

    Every guest run brings its reports back, green or red, and the summary says how many of the declared UI cases ran; a short count is red.

    QS274 · 564dd1a
  98. A host nobody has saved cannot be reached without filling and saving the session dialog first

    Connect to an address takes user@host[:port] or an ssh_config host, saves it as a session unless unticked, and opens it by the path a saved session takes.

    QS271 · 2802c62
  99. The session dialog decides how to sign in by which text box was filled, and cannot test a session

    The session dialog offers Sign in with as three segments over Key and Credential, folds the rest into summarised groups, and Test connection signs in and says why not, unsaved.

    QS270 · 2fb136f
  100. A connected tab shows nothing of its connection: where it goes, whether it is up, which forwards it holds

    A remote tab shows a session bar (name, user@host:port via its jump host, a Connected/Reconnecting/Disconnected chip, a chip per forward, Files, Split, More) and a status bar under it.

    QS269 · 0ff06ce
  101. Saved sessions are reached only by typing in the palette, so nobody sees what is saved or what is connected

    A sidebar lists saved sessions as a tree, searches them, marks the ones a tab holds Connected, and folds to a remembered rail (design recorded in docs/design/friendly-shell/README.md).

    QS268 · c168074
  102. The tab-strip UI case fails on CI's elevated runner, where cmd puts Administrator before every title

    The tab-strip case accepts cmd's own Administrator prefix before the first tab's title, so it passes on an elevated runner and on an ordinary desk.

    QS267 · 7ccaed0
  103. The nightly fuzz job fails on its own script before the campaign says anything

    fuzz.ps1 and release.ps1 hash with .NET's SHA256, so they reach their verdict when CI's pwsh starts them under Windows PowerShell.

    QS266 · 3620411
  104. The UI cases have never run in CI: they launch a Debug client the Release build does not make

    A Release run launches the Release client: the UI cases point winwright at the configuration their own assembly was built in.

    QS265 · 816cb99
  105. The settings-reference test fails on every CI push and passes in the guest

    The settings-reference test finds the same headings on a CRLF checkout as on an LF one, and a test now checks both.

    QS264 · 7fd9216
  106. The echo-delay test times out in the guest waiting for sixteen megabytes and never says how far it got

    The echo-delay test reads at two and eight megabytes, keeping its four-to-one ratio, and a timeout now says how many megabytes were parsed.

    QS263 · 59151b9
  107. The text an input method is composing vanishes every time the blinking cursor goes dark

    A composition is placed by where the cursor is and only its caret blinks, so the text being typed stays on screen and its blink is one cell.

    QS262 · d516fd1
  108. Where a read ends decides how wide a character is, so a keycap split by the network leaves the cursor a column off

    A mark starting a read joins the cell just written where they make one cluster, so a byte-at-a-time stream leaves the screen a whole one does.

    QS261 · 00de5b4
  109. A remote forward whose local service stops reading freezes every channel on the connection

    Remote forward channels are answered here with a 2 MB window granted as bytes are delivered, so an unread one leaves the shell up (design recorded in src/Quickshell.Transport/RemoteChannels.cs).

    QS259 · 84774fa
  110. A session's whole path parses near 54 MB/s where the budget now asks for 100, the rate the transport delivers

    Printable ASCII is written a row's worth at a time, and emulate on cat-log reads about 190 MB/s where it read 31 to 43 that day (design recorded in benchmarks/results/replay-xps.md).

    QS258 · 19ebf5c
  111. One local pane holds 172 MB and a connected session 211 MB, where the budget allows 120 MB for the connected one

    Figure 6 is 160 MB, argued from the account: 126 MB is the window and the device, and a connected session now settles at 142 to 145 MB (design recorded in docs/PERFORMANCE.md).

    QS256 · f0d7a28
  112. A session field written in the wrong place in the store is silently ignored, so the session connects with defaults

    A field the store does not have is refused by name and line, and a setting beside the host is told to move under settings, so nothing connects on defaults.

    QS254 · 1fa539b
  113. A forwarded port whose local tool stops reading freezes every channel on the connection, the shell included

    A local or SOCKS forward nobody reads no longer freezes the connection: its window is granted as bytes reach the user (design recorded in src/Quickshell.Transport/ChannelWindow.cs).

    QS252 · 2ac10cb
  114. An echo in a window covering its whole monitor has never been timed, the one case offered independent flip

    A monitor-covering chain flips independently on the reference desk, echoing at a 24 ms median against 33 windowed; the non-goal names it (design recorded in benchmarks/results/photon-h.md).

    QS225 · 227b338
  115. The parse figure spreads by a fifth between runs on the reference machine, so the gate lets a regression that big pass

    Parse is pinned to one P-core with eight streams a pass, and the baseline retaken on 2026-10-07 derives a parse threshold of 1.5 % where it was 20.9.

    QS197 · 18d3634
  116. Feed runs near 4 MB/s where the budget asks for 400, and the budget measures a different arm

    The whole path has a figure argued from the transport: emulate at least 100 MB/s on cat-log, the rate one SSH session delivers over loopback.

    QS141 · 6f1404f
  117. A host sending faster than the parser consumes buffers gigabytes inside the channel

    A fast host now waits for the reader: the shell's 2 MB window is granted back as read, and ten unread seconds hold 1.4 MB, not 3 GB (design recorded in src/Quickshell.Transport/ChannelWindow.cs).

    QS139 · 31c63d9
  118. The idle figure is measured on a window with no session and no render loop in it

    A connected client is measured idle: one pane 0.62 % of a core and 172 MB, a session 0.96 % and 211 MB, GPU time read too (design recorded in benchmarks/results/idle-h.md).

    QS137 · 1f875e3
  119. Nothing has been measured starting, so the cold start figure is an aspiration

    Timed beside MobaXterm on the reference machine by one observer, quickshell's window is up at 612 ms warm against 894; its prompt reads 657 ms (design recorded in benchmarks/results/startup-h.md).

    QS75 · cd4133d
  120. The site's build pulls source-map-js 1.2.1, which Dependabot flags high for an event-loop denial of service

    The site's lockfile resolves source-map-js 1.2.2 for both vite and tailwind, npm audit finds nothing, and the site builds.

    QS251 · 72685dd
  121. A tab cannot be dragged along the strip, and there is no way back to the tab used before this one

    A tab dragged along the strip moves under the pointer, and the palette's Go to the last tab used switches by order of use, which Ctrl+Tab leaves positional.

    QS250 · 87d635c
  122. Keys typed before a new pane's shell has started are dropped, so a fast first command loses its start

    Keys typed while a pane's session opens are kept, bounded, and handed over first and in order once it attaches, so a fast first command no longer loses its start.

    QS249 · bdd5c00
  123. An SGR in the last column cancels the owed wrap, so the next character overwrites that column

    Only sequences that move the cursor or change the grid cancel an owed wrap, as xterm's ResetWrap sites do, so a full-width line that changes colour at its end still wraps.

    QS248 · 3938f7a
  124. A copy started a moment before an install is not found running, so the install is not refused

    The running check reads the kernel's image path, so a copy started a moment before an install or uninstall is found and refused instead of being missed.

    QS247 · 909a542
  125. Reverse screen mode DECSCNM is not drawn, so a visual bell never flashes

    Mode 5 swaps the default colours in the palette lookup and redraws on each edge, so the visual bell vim and readline send now flashes; esctest went from 465 to 466 passed.

    QS246 · 6b48f1b
  126. A session's scheme, font size, terminal type, scrollback and credential are stored and inherited but never applied

    A session's credential name now keys its remembered password and FontSize is a non-goal out of the dialog, so no session field is shown and then ignored.

    QS245 · 7c84d2d
  127. Seventeen esctest failures in eleven classes have no family of their own

    Every class the line listed now passes or is named by a non-goal, DECSCL's levels by a new one; esctest went from 458 to 465 passed across the parts.

    QS244 · a2c28cb
  128. DECRQSS answers invalid for settings the client holds, and DA, DA2 and DECID answer another identity

    DECSCUSR is drawn and reported, DECRQSS answers every setting held, DECID answers, and the VT220 identity is kept by a non-goal; esctest went from 454 to 458 passed.

    QS243 · 2136161
  129. Reverse wraparound does not follow a backspace back across a wrapped line as xterm does

    BS and CUB follow xterm's CursorBack: 45 walks back through a wrapped line, 1045 crosses any row, and an owed wrap is honoured; esctest went from 444 to 454 passed.

    QS242 · a6eaed0
  130. HPR and VPR move the cursor nowhere

    HPR and VPR move the cursor right and down to the screen's edge, ignoring margins and origin mode; esctest went from 436 to 444 passed.

    QS241 · 850282e
  131. Most DSR variants and the checksum report get no answer

    Every private DSR is answered, hardware this client lacks reported as absent, and DECXCPR's shape follows the claimed VT level; esctest went from 425 to 436 passed.

    QS240 · 1f29a1f
  132. The saved cursor is one for both screens, and XTSAVE, XTRESTORE and DECSTR leave saved state behind

    Each screen has its own saved cursor, DECRC with nothing saved homes and resets DECOM, DECSTR does xterm's list, and XTSAVE/XTRESTORE work; esctest went from 407 to 425 passed.

    QS239 · c97d1c5
  133. The rectangular area operations DECCRA, DECFRA and DECERA do nothing

    DECFRA fills, DECERA erases and DECCRA copies a rectangle, clipped and origin-relative as xterm's, and DECSACE is held and reported; esctest went from 388 to 407 passed.

    QS238 · 07a0e57
  134. DECRQM answers not recognised for modes xterm reports as permanently reset or as set

    DECRQM answers xterm's ignored modes as permanently reset, KAM and SRM by decision, and DECNKM and DECBKM as real modes; esctest went from 373 to 388 passed.

    QS237 · 33d3532
  135. Window operations through CSI t neither report the window nor say they are refused

    Every CSI t report is answered from the pane, titles read back empty, the title stack works, and moves and resizes are refused by a non-goal; esctest rose from 359 to 373 passed.

    QS236 · 419af4a
  136. Character protection is not modelled, so selective erase and protected fields erase everything

    DECSCA, SPA and EPA protect cells; DECSED, DECSEL and DECSERA skip them as xterm does, ED, EL and ECH respect ISO protection, and esctest rose from 323 to 359 passed.

    QS235 · 8681d20
  137. Asking for a colour with OSC 4, 5 or 10 to 19 gets no answer, and their resets are ignored

    OSC 4, 5 and 10 to 19 answer a colour query in xterm's form, 104, 105 and 110 to 119 reset to the session's scheme, and XTGETTCAP answers Co; esctest passes 323.

    QS234 · d76aa37
  138. No left or right margin can be set, so everything esctest checks inside a column region fails

    DECLRMM and DECSLRM set a column region every cursor, edit, scroll and wrap respects, with DECIC, DECDC, DECBI and DECFI; esctest passes 299 where it passed 231.

    QS233 · 524e710
  139. Dark text on a light theme carries 12 to 17 % less ink than Windows draws, while light-on-dark carries more

    Dark text on a light theme carries Direct2D's ink within 1 % in both antialiasing modes, and light-on-dark is drawn as before (design recorded in docs/measurements/contrast.md).

    QS212 · f40821f
  140. The fuzzing campaign runs only when somebody types run-fuzz.cmd

    A nightly CI workflow runs the fuzz campaign with its corpus cached between runs, and CI warns on every push once the last campaign is over a week old.

    QS210 · 46d49a9
  141. A tab cannot be dragged into a new order or out into its own window, so the workspace is fixed as it was opened

    A tab moves out into a window of its own with its sessions connected, and closing one of several windows ends only its own sessions.

    QS160 · b5d26a2
  142. A master password is stretched by a function a graphics card is good at, where the design asked for one it is not

    The master password is stretched with Argon2id through libsodium, and entries sealed with the old PBKDF2 still open and are sealed again in the new format.

    QS115 · 0134bc8
  143. A line feed, VT, FF or IND also returns the cursor to column one, as though every one were NEL

    A line feed, VT, FF and IND move down and keep the column, LNM returns the carriage, and esctest passes 231 where it passed 216.

    QS232 · 292f9e2
  144. No screen reader in another process can read the terminal's output: its TextPattern gives a null document range

    TerminalDocument addressed lines by their place in the buffer's life, so every read threw once a line was let go; a reader in another process now reads the text.

    QS231 · b5bdf02
  145. A test that hangs in the guest holds the whole run, and the host shows nothing that says which one

    A guest run shows each assembly as it starts and ends, and a test past the hang timeout is dumped, ended and named in the red verdict.

    QS230 · 23a73ef
  146. The session store's fields are documented nowhere, and Reconnect can only be set by editing the file

    docs/SESSIONS.md documents every store field, kept so by a test both ways, and the dialog sets Reconnect and no longer drops one set by hand.

    QS229 · 9024a40
  147. A connection that ends before the server presents its key is reported as a refused host key

    A connection that ends before the server presents a key is reported by how it ended, not as a refused host key, so a reconnect tries it again.

    QS228 · dccf68c
  148. esctest fails 309 of 568 tests now that the emulator answers its queries, and no line names which to fix

    Every failing esctest class now has a line, QS232 to QS244, grouped from the log by cause; QS232's line feed is the emulator's own bug.

    QS227 · 1db61fa
  149. A guest run goes red on the skip budget when the guest's clipboard holds a bitmap from an earlier session

    run-tests-vm reads the guest's clipboard and, where it is not text, turns sharing off, writes text there and turns sharing back on in a finally.

    QS226 · 80dc477
  150. A guest run asked to carry HEAD alone carries the working tree's uncommitted edits to tracked files

    Send-Tree -CommittedOnly archives HEAD with git archive, so a tracked file's uncommitted edit no longer reaches a run asked to carry HEAD alone.

    QS224 · c0df550
  151. Clicking a tab on the strip moves its highlight but leaves the other tab's terminal on screen

    A click on the strip switches tabs as the chords do; a UI case that failed before the fix now reads the clicked tab's session in the window's title.

    QS223 · 2ebdfd9
  152. A desk that cannot be observed runs no UI case, and the run counts it as a pass

    CasesRun skips with the desk's reason where nothing can be observed, so the run's table shows it and the skip budget holds it.

    QS222 · f55727a
  153. A graphics driver reset leaves every pane frozen, and nothing in the client recovers or says so

    A draw failing on a removed device rebuilds it on the loop's thread and redraws every pane, logged; a closed pane's swapchain leaves the device's list.

    QS221 · 757555a
  154. An SSH tab whose link drops stays ended, though the session that reconnects was built for it

    An SSH tab set to Reconnect connects again after its link drops, keeping its scrollback and saying each attempt and which forwards came back.

    QS220 · add31a5
  155. The file browser opened over an SSH tab shows nothing on the host's side

    The browser over an SSH tab lists that host over a file channel of the tab's own connection, opened in the background once the shell is up (design superseded: kept per session, not per browser).

    QS219 · 7da11c5
  156. A saved session to a host that takes a password or a one-time code cannot be connected from the client

    A saved session signs in by key, prompt or password: the window answers the server's questions, asks a password-only host once, and a kept password is not asked again.

    QS218 · 6f08915
  157. A saved session can only be opened by typing its path on a command line

    Open session in the palette lists the store's sessions, found by part of a name; a UI case proves it over a store staged for the launch.

    QS217 · 70527f6
  158. Importing sessions writes over the whole session store, so sessions made since are lost without a word

    An import is added to the store under a dated folder of its own, the preview says the sessions already there stay, and a store that will not read is refused.

    QS216 · 70b6860
  159. esctest is judged through a pseudo-console that answers its queries itself, so the figure measures conhost

    esctest runs on a Linux pty bridged to a socket, so every reply is the emulator's: 216 passed of 568, up from conhost's 151 (design recorded in docs/measurements/esctest-xps.md).

    QS211 · 05350b9
  160. A request for 132 columns is ignored without its side effects, and nothing says whether that is the intent

    DECCOLM keeps the pane's width, now a non-goal, and still clears the screen, resets the margins and homes the cursor; DECRQM calls mode 3 permanently off.

    QS208 · a2caf74
  161. Insert mode is ignored, so text printed with CSI 4 h overwrites the row instead of pushing it right

    CSI 4 h turns on insert mode: printed text pushes the row right and loses what falls off, DECRQM reports it, and vttest's cuts 025 and 026 agree with xterm.

    QS207 · fed5779
  162. Restoring the cursor does not restore the character set, so line drawing after ESC 8 prints letters

    ESC 7 saves the two designations and the shifted-in slot with the cursor and ESC 8 restores them, so vttest's cut 022 draws lines as xterm does.

    QS206 · 808140a
  163. Cursor up and down cross the scrolling region's edges, so a program moving inside a region writes outside it

    CUU, CUD, CNL and CPL stop at the margin between the cursor and the screen's edge, so vttest's cuts 014 and 016 now agree with xterm.

    QS205 · bd86dbd
  164. Two combining marks on the same side of one base are drawn on the same pixels instead of stacked

    A later mark on the same side of a base is lifted clear of the earlier one's ink, so q with an acute and a diaeresis draws two stacked marks.

    QS203 · 918f539
  165. An echo at a prompt reaches the glass two refresh intervals after it arrives, one more than the vblank wait explains

    Every windowed chain, window or composition, popup or WPF host, was composed at two intervals; a non-goal names that floor (design recorded in benchmarks/results/photon-h.md).

    QS201 · a2dd8d9
  166. The release gate times parse and emulate on the replay harness's build, not on the assemblies being archived

    Parse and emulate run on the published client's assemblies and runtimeconfig; a client-only tiering-off publish now fails the gate (design recorded in docs/PERFORMANCE.md).

    QS200 · 59e2ee3
  167. Nothing in the window can start a recording, so nobody can capture the defect they hit

    The palette opens a tab or a saved session recorded, after a dialog naming the file, what is kept and the limit; Stop recording says where the file is.

    QS134 · bd73586
  168. Nothing in the client says where its log is, or turns the trace on

    Trace this session, in the palette, connects an open tab's session again into a trace of its own, handshake included, and says in the pane where it is.

    QS129 · d24d273
  169. Nothing says which forwards are running, so a stale one is discovered through a port conflict

    Every running forward is listed with what it carries now, and the window title says how many run while any do, so none is forgotten.

    QS70 · 3ef0654
  170. A forward is set up by hand each time and dies silently when its session drops

    A session's forwards start with it, come back after a reconnect each said, go with it, and a busy port names the program holding it.

    QS69 · 2628aea
  171. The test that says a chrome theme leaves the terminal's colours alone checks a palette nothing draws with

    The terminal's colours have one model, Settings.Colours; the theme test now reads an open pane's palette across a change of chrome theme and finds its scheme untouched.

    QS199 · 40fb448
  172. A scheme's cursor colour and OSC 12 are stored and never drawn, so every pane's cursor is the same grey

    Each pane hands its own palette's cursor to the renderer as it draws, so a scheme's cursor and a host's OSC 12 are the colour on screen.

    QS198 · 14a02be
  173. Figure 3 of the budget, steady-state frame cost, is measured by nothing, so no gate can hold it

    The replay harness times one filled 200x50 grid redrawn 2000 times, CPU and GPU apart; the reference desk drew it at 0.11 ms GPU and 0.016 ms CPU median.

    QS196 · 901b5db
  174. Each test class carries its own copy of the fixture plumbing, so a fault in one copy is a fault in all of them

    The STA runner, the repository walk and the SSH fixture's trust and probe are each written once per assembly, and every pane-building helper runs through Sta.Run.

    QS195 · d6849ce
  175. The release archive is built only by hand, so a change that breaks the self-contained publish passes CI

    CI builds the unsigned, ungated release archive after the suite on every push and keeps it for five days, so a publish that breaks fails there.

    QS193 · 699ddad
  176. A portable copy that installs itself leaves its saved sessions and settings behind in the copy it came from

    Installing from a portable copy copies its settings and saved sessions into a profile with none, leaves one with its own untouched, and says which.

    QS192 · b65acef
  177. The graphics device and the shell both wait for the window, so a start runs three slow things one after another

    The device and the first tab's shell now start with the process; in the guest a start reached its prompt at 435 ms against 609 and 634.

    QS191 · 784eaed
  178. A file dropped onto an SSH terminal can only be typed as its path, never sent to the directory the shell is in

    Shift held while dropping onto an SSH pane sends the files into the directory its shell reported, over its own connection; with no report nothing is sent and the title says why.

    QS189 · 03853df
  179. A copy started from the browser shows nothing until it ends and cannot be stopped, so a large tree looks hung

    A copy is a line under the panes with what is moving, the rate, the time left and a stop; one that stops short stays with its reason and a retry that resumes.

    QS186 · 4280f40
  180. A remote file cannot be edited in a local editor, so changing a config is still a download, an edit and an upload

    A remote file opens in its local program and each save goes back, asking first if the server's copy changed, moving the old file aside and restoring its mode; QS219 wires SSH tabs.

    QS185 · 63c19f0
  181. The remote pane opens at the account's home while the shell beside it has already said where it is

    The remote pane opens at the directory the shell reported on the session's own host and follows later reports until the user navigates it; QS219 brings the pane to SSH tabs.

    QS184 · f1bc2b1
  182. A paste pressed while another process holds the clipboard open does nothing and says nothing

    Copy and paste wait up to a tenth of a second for a clipboard somebody else holds, and past that say in the title that they did not happen.

    QS183 · 03582d5
  183. A resumed guest can hold run-app-vm past its own deadline and then yield an all-black picture reported as a success

    vmrun is waited on by its own exit, so a console that inherits its output no longer holds a resume, and a one-colour capture is refused rather than reported.

    QS182 · 9b3ea64
  184. A fleet has no saved group to broadcast to, so the same split is rebuilt by hand before every broadcast

    A folder of saved sessions opens as one tab, every session a pane connected to it, broadcasting to those panes alone; past sixteen it says what it left out.

    QS179 · 073b6f8
  185. Five command-line flags exist and no page names them, so a script author finds them by reading the source

    Every flag lives in one list the entry points read, docs/COMMAND-LINE.md names exactly that list, and the client spells no flag outside it.

    QS178 · 4f07171
  186. The strip past the last whole cell is never painted, so every pane has a black band at its right and bottom edges

    Every frame clears the target to the scheme's background before the grid, so the strip past a pane's last whole cell is the scheme's colour, not black.

    QS177 · a4957ef
  187. The winwright this project restores is older than the engine beside it, so cases work around gaps that are closed

    The cases restore Winwright 1.0.0 from nuget.org and open the palette and a second tab with the chords a user presses; import keeps its flag, for the file it names.

    QS176 · 113a408
  188. A settings value the client could not use is not mentioned anywhere the user will look

    The settings window names every value the client could not use: an unparsable file, an unknown key, a wrong-kind value, or a scheme path that leads nowhere.

    QS174 · 81765f2
  189. A user looking for help presses Ctrl+Shift+F1 and gets a defect report

    Ctrl+Shift+F1 opens help, the palette listing every action with its keys; the diagnostic report moved to a palette entry reached on purpose.

    QS172 · 0f0dcf9
  190. Splitting a pane is bound to one Oem key, and which character that is depends on the layout

    Punctuation chords are bound to the character their key types on the active layout, one binding each, checked against every installed layout and written in KEYS.md.

    QS171 · 6e28ada
  191. Every setting has to be found and typed by hand, because the surface over the file was never built

    Ctrl+Shift+, opens a window with a control per documented key that writes the file on each change, keeping its comments, and never over a file that does not parse.

    QS170 · aceee68
  192. Changing the font in the settings file does nothing until the client is restarted

    A font changed in the settings file redraws every open pane at the new size without a restart, as a test asserts against real panes (design superseded: QS135 had already shipped it).

    QS168 · 6921aea
  193. An allocation assertion fails about once in two guest runs on a tree nothing touched

    Allocation assertions read the least of up to three warmed passes, so a one-off from the runtime is not the code's; zero is still the only pass, with no ceiling.

    QS167 · 22dd7c0
  194. Four panes open four graphics devices, and nothing in the client stops a user opening sixteen

    Sixteen panes hold one device, as asserted against real swapchains; splitting stops at sixteen, and a pane narrower than a cell no longer crashes its layout.

    QS164 · f1f5123
  195. A divider cannot be dragged, so the only sizes a split has are the halves it was created with

    Split panes leave a gap holding a handle that drags its divider, and Ctrl+Alt+Shift+Arrow nudges the divider beside the focused pane.

    QS163 · 438f73f
  196. The shipping discipline tells an agent to screenshot a UI task, and this repository's evidence rule forbids that

    The shipping skill now says what AGENTS.md says: a UI task is proven by a UI case read off the accessibility tree in the guest, and a picture is for a human.

    QS159 · 6082822
  197. Nothing says how far back the view is, so a reader who scrolled has no idea where they are or that output arrived

    A view scrolled into the history shows a thumb in the right-hand column and an arrow when output arrived below, drawn in the grid; the live screen carries neither.

    QS158 · 7597958
  198. Grapheme segmentation runs at half its old rate, because every cluster now asks ICU where the boundary is

    Measured with ICU on: segmentation runs 270 MB/s on cat-log and 180 on ls-color-r, above the 181 and 83 it ran before QS154 (design superseded: QS143's pair rule had already shipped it).

    QS156 · 5a38c70
  199. A program that asks for the mouse never gets one, and the wheel scrolls nothing at all

    A program with mouse tracking hears every button's press and release, drags and wheel notches; under a full-screen program without it the wheel sends arrow keys.

    QS155 · d9d7158
  200. A shell that exits leaves the window holding its last frame, with nothing saying the session ended

    A session that ends says so in its pane, telling an exit code from a dropped link, and hides the cursor; closing the tab says nothing.

    QS152 · 433bc71
  201. A reconnecting session makes a new damage signal per connection, so a pane asleep on the first never repaints

    A reconnecting session takes the pane's damage signal once and hands it to every connection's pipeline, so what a reconnect prints wakes the same window.

    QS151 · 1f0f35e
  202. A defect report about a black window says what an adapter probe found, not what the window did

    A diagnostic bundle names the device the panes are drawing with and each pane's frames, draws, presents and covered presents; a probe answers only before any pane draws.

    QS150 · a8583d0
  203. A tool that rewrites a source file can mangle its punctuation and every check stays green

    The hygiene suite refuses UTF-8 that went through Windows-1252 and back in any source, document, script or case file, and leaves real accented prose alone.

    QS149 · 115d22e
  204. The reply buffer exceeds the maximum its own constant states

    The reply buffer never passes MaximumReplyLength: an answer that would end past it is taken back whole, so only whole answers are held.

    QS140 · 32c09fa
  205. A run with a hundred tests skipped prints the same "Passed" as one with none

    Every run prints what ran, passed, failed and skipped with the reasons; a skip past tests/skips.json fails it, and a desk without the fixture says so as waived.

    QS136 · 67f7853
  206. Three settings are read, written and kept faithfully, and nothing acts on them

    A scrollback depth changed in the settings reaches every open pane in order with its output, dropping only the oldest lines when it shrinks.

    QS135 · 78b77fc
  207. A recording has no bound and will fill a disk if it is left running

    A recording stops at a compressed limit stated before it starts, ends its file with a line saying where it was cut, and raises Stopped (design recorded in src/Quickshell.App/SessionRecording.cs).

    QS133 · d3a6257
  208. A crash report cannot name the GPU, on the failures most likely to be about one

    A crash report names the adapter of the device every pane shares, how many losses it had survived, and why there is none when opening it failed.

    QS132 · 24d993b
  209. The crash dialog mixes this client's English with Windows' own button words

    Every question is now the client's own Choice window; each button names its act and Escape is never the destructive one (design recorded in src/Quickshell.App/Choice.cs).

    QS131 · 0dcf6b1
  210. The log goes quiet exactly where a transfer or a tunnel failed

    A transfer that failed halfway, a forward's start, stop and failures, and the file channels are now in the log by path and port.

    QS130 · bfe58ca
  211. The composition allocation test fails whenever it runs first, counting a one-time initialisation as a keystroke's

    The test warms every caret position before it measures, so run alone or first it still counts zero bytes per keystroke.

    QS213 · 7e9cb78
  212. A test assembly refuses to run after a referenced project changed only its implementation and was rebuilt

    Each project's sources are measured against its own DLL beside the tests, so an implementation-only change, built, runs instead of being refused.

    QS209 · eb7011c
  213. Erasing part of the screen fills it with the default background, so a curses program's full-width bars stop at text

    EL, ED and ECH leave the pen's background and nothing else of it, so htop's header and selected row reach the right edge; a copy still trims them.

    QS204 · 0712e94
  214. An editor's save over the settings file can be refused while the client is reading it

    A save that deletes the settings file and renames into place is not refused by the client's read; a move over an open file still is, by any reader.

    QS202 · bea60df
  215. The import preview case missed its dialog in one full run and found it alone, so its five-second wait is a guess

    The import case opens the same Yes/No preview on every desk from a committed file and refuses it by IDNO, never a caption button (design superseded: the locator, not the wait).

    QS181 · 5c7f533
  216. The library's SOCKS proxy answers about one request in six with something that is not a SOCKS reply

    A hundred connects through the SOCKS proxy each get a well-formed reply before the target's first byte (design recorded in src/Quickshell.Transport/DynamicForward.cs).

    QS127 · 88f2eea
  217. Eleven shipped transport components are named by no code in the application, so none of them can be used

    Saved sessions reach an SSH tab, and each component still unreached has a line naming what will reach it.

    QS126 · ef766b7
  218. A forward cannot tell a refused target from a normal close, and cannot be bound to every interface

    A refused target, a forbidden forward and a close each say so, from the server's reason code, and every interface can be asked for (design recorded in src/Quickshell.Transport/LocalForward.cs).

    QS125 · e313ad8
  219. A forward drops the whole connection when one direction half-closes, so protocols that shut and wait hang

    A forwarded connection that shuts its sending half still receives the answer, over a channel that says EOF and waits (design recorded in src/Quickshell.Transport/LocalForward.cs).

    QS124 · f2e327b
  220. A symbolic link on the server cannot be copied, because nothing here can read where it points

    Remote links are read with READLINK and recreated relative as they were (design recorded in src/Quickshell.Transport/TransferPlan.cs).

    QS123 · 4fd09c6
  221. The shared-session trick rests on six SSH.NET members reached by name, and only a live server proves it holds

    Every SSH.NET member reached by name is checked by a test with no server, and the library is pinned to one version (design recorded in src/Quickshell.Transport/LibraryShape.cs).

    QS122 · 0e87698
  222. Nothing owns the session store file and nothing opens the session dialog, so neither is reachable

    The store lives in Locations.Sessions, New session opens the dialog, and saving writes into the file as it is then (design superseded: connecting to a session moved to QS126).

    QS121 · b392dad
  223. A jump carries traffic through a local port anything running as this user can connect to

    A jump's local port stops listening once its hop is through, so no second process reaches the next machine past the bastion (design recorded in src/Quickshell.Transport/SshChain.cs).

    QS119 · 57e033a
  224. Comments a user wrote in the session store are gone the next time the client writes it

    A commented store written by the client keeps every comment before what it annotated, a session's found by name (design recorded in src/Quickshell.App/StoreText.cs).

    QS117 · 4262699
  225. A key accepted with a second factor still to come looks the same as a connection that has stalled

    A sign-in says in the pane where it is connecting, the server's banner and a key accepted with a second factor to come.

    QS113 · e8f9e69
  226. A dead route and a port that is not SSH read as one failure, so the remedy offered covers two things

    A dead route is Unreachable and a port that never speaks SSH is NotResponding, each with its own remedy; abandoning still works (design recorded in src/Quickshell.Transport/SshDiagnosis.cs).

    QS112 · a58d56d
  227. A peer that stopped answering on a socket that stayed open is not noticed, so the session looks live for minutes

    A host frozen on an open socket is reported Dropped within three keepalive intervals, by a request it must answer (design recorded in src/Quickshell.Transport/SshNetTransport.cs).

    QS111 · b5cdccc
  228. Remote throughput has no local figure taken beside it, so a slow link and a slow client look alike

    Local prints at 1.0 MB/s through conhost beside remote's 124.8; a cancelled read was never the fault, a write with no reader was (design recorded in docs/measurements/throughput.md).

    QS110 · 00c324b
  229. The suite builds the solution and then measures wall-clock latency against what that build left running

    run-tests.cmd stops its build servers before timing anything, and the keystroke test reads a 95th percentile, not one worst write.

    QS108 · 957b960
  230. ClearType coverage is drawn without the contrast enhancement Windows applies, so stems stay lighter than elsewhere

    Measured against Direct2D: this text is 4-7% heavier on dark grounds and 12-17% lighter on light ones; which to match is QS212 (design recorded in docs/measurements/contrast.md).

    QS107 · 7ec7933
  231. Backspace at the left edge stops there instead of wrapping to the end of the line above

    Under DECSET 45 with autowrap, a backspace at the left edge goes to the end of the row above, never past the top margin, as xterm does (design superseded: xterm does not check the wrapped flag).

    QS105 · 5ba148d
  232. A program asking whether a mode is set gets no answer, so it cannot tell off from unsupported

    DECRQM answers ANSI and DEC modes: set or reset by state, permanently off for what is refused, zero for the unknown and the unbuilt.

    QS104 · 383cf55
  233. Nothing answers a request for a rectangle's checksum, so an external suite cannot read the screen back

    DECRQCRA answers with xterm's negated 16-bit sum, empty cells as spaces and no attributes, as esctest reads it; conhost hiding it is QS211.

    QS103 · ae8ac6b
  234. The parser is fuzzed only by the suite's own mutator, which stops when the build does

    Every crash-* in artifacts/fuzz/findings is replayed by the suite as the fuzz target fed it and fails it by name; scheduling moved to QS210.

    QS102 · 622b7c7
  235. Ninety-six bytes of the parse path's allocation is measured but unattributed

    The hostile sequence allocates nothing: a split broken character no longer reaches .NET's byte[] fallback, and the ceiling is zero.

    QS101 · 945cdae
  236. A failed build leaves the old test binary in place and running it reports a green suite that proves nothing

    Every test assembly refuses to run when a source it is built from is newer than it, naming the file, however it is launched (design recorded in tests/Freshness.cs).

    QS99 · 790f0ac
  237. Every golden scene is text somebody typed into the test, so none of them is a screen a real program drew

    Three golden scenes are now screens real programs drew: htop, vim and ls --color replayed from the corpus at 200x50 through the client's painter.

    QS93 · 178625c
  238. A combining mark takes no cell and is then drawn nowhere, so an accent typed as two codepoints vanishes

    A mark with no precomposed form is drawn over its base and a joined emoji as one glyph, each cluster shaped whole into one atlas entry (design superseded: no overlay: a cell is its instance index).

    QS91 · b3999a2
  239. Nobody has built this repository from a clean clone, so the steps it needs beyond the SDK are unknown

    A fresh clone with an empty NuGet cache, and HEAD alone in the guest, both build and pass run-tests.cmd with no step beyond the .NET 10 SDK.

    QS90 · 092ba2a
  240. dotnet test reports zero tests and exits 5 while run-tests.cmd runs the same assemblies and passes

    dotnet test --solution Quickshell.sln runs the same 1307 tests as run-tests.cmd and exits 2 on a broken one, under SDK 10.0.401 (design superseded: the output path it blamed was not the cause).

    QS89 · 1ff8620
  241. Input to photon is the first figure in the budget and the only one nothing has ever measured

    Input to photon is measured: 33 ms median at a prompt on the 60 Hz panel, and under load the flags hold 42 ms where an unbought chain takes 56 (design recorded in benchmarks/results/photon-h.md).

    QS86 · 41bb478
  242. Reaching many hosts on the remote network needs one forward configured per host

    One SOCKS5 or SOCKS4a proxy reaches the remote network, every name resolved by the server and every refusal given its reply code.

    QS68 · 9a520a8
  243. A link that drops for ten seconds costs the whole session and its scrollback

    A dropped or frozen link costs a command, not the scrollback: the model outlives the link, a silent host is noticed, backoff is bounded (design recorded in src/Quickshell.App/RemoteSession.cs).

    QS38 · 3e3c7d6
  244. No external suite has ever judged this emulator, so its fidelity is the author's own opinion

    vttest is judged by xterm: 23 of 31 screens drawn as xterm draws them, the other 8 listed against QS205 to QS208, and esctest's run beside it (design recorded in docs/measurements/vttest.md).

    QS33 · 11bff16
  245. An install fails outright when a virus scanner has one of its just-copied files open for a moment

    Each rename and removal of the program folder is tried for five seconds, so a scanner reading a just-copied file no longer fails an install, and a longer hold is named.

    QS194 · a54de66
  246. Pasting or composing more than sixteen accented or eight CJK characters throws instead of reaching the host

    The typist sizes its buffer in bytes, so a pasted Portuguese paragraph, a CJK phrase from the input method or an emoji reaches the host as its own UTF-8 instead of throwing.

    QS187 · 74f7f63
  247. The paste tests use the desk's real clipboard, so a run erases what the user copied and fails while a guest shares it

    Copy and paste go through one clipboard seam, and the one test left on the real clipboard puts back what it found (design recorded in tests/Quickshell.App.Tests/CopyPasteTests.cs).

    QS180 · d6a7499
  248. Sixteen minutes of the suite is two helpers waiting out timeouts they then ignore

    One helper reads shell markers without carriage returns and fails a silent command; the transport suite takes 83 s, not 18 min (design recorded in tests/Quickshell.Transport.Tests/RemoteShell.cs).

    QS138 · 2593a6f
  249. Every window would invent its own colours and row shapes, so the chrome drifts from the two clients it should match

    Every colour the client decides is declared once in Brand.cs, a test refuses one written elsewhere in src, and open windows follow a change of theme.

    QS83 · bd74d38
  250. A file can only be transferred through the browser, so dragging one from Explorer does nothing

    Files dragged from Explorer onto a terminal are typed as their paths, quoted for that pane's shell, and onto a browser pane are copied into the directory it shows.

    QS64 · 62d483d
  251. There is no way to see what is on the remote host without running a command

    Browse files lists as entries arrive, 50,000 remote ones first shown in 19 ms, and copies both ways, renames, makes, sets modes and deletes after asking, each proven on a real server.

    QS60 · 6fcd643
  252. The same command on eight hosts has to be typed eight times

    Ctrl+Shift+B types and pastes into every pane of the tab at once, the palette leaves any pane out, and only panes wearing an orange edge receive, until a switch, split, zoom or close ends it.

    QS53 · 2db4dd0
  253. One App.Tests run went red once and named nothing, and seven runs since have not reproduced it

    Every assembly writes a TRX and a red run prints the failed test names, on this machine and out of the guest's artefacts, so the next occurrence names itself instead of leaving a count.

    QS175 · 00c114c
  254. The guest runs the suite but cannot run the client, so looking at a window still means taking over the user's desk

    run-app-vm.cmd builds and starts the client in the guest, lets it draw and brings back a picture of it, so evidence that needs looking at no longer needs the operator's screen.

    QS173 · 5f23627
  255. The settings file is read once at start-up, so editing it while the client runs changes nothing

    Saving the settings file applies it, including the rename an editor really saves by, and Ctrl+Shift+R rereads it where a watch could not be armed.

    QS169 · 0bdeaf7
  256. A pane behind another tab keeps drawing, so a client with eight tabs presents seven frames nobody sees

    A pane behind another tab draws nothing and forgets its frame when it comes forward, and a window something covered asks DXGI rather than presenting to find out.

    QS166 · 90ac519
  257. A pane reports the whole client's draw calls as its own, so a per-pane frame count is the sum of every pane's

    A pane counts the draw calls it issued and no other pane's, so Block C's idle criterion can be read against a client that has more than one.

    QS165 · 48e15ca
  258. This client now takes thirteen chords from the remote program and tells nobody which

    Every chord this client takes from the remote program is named in docs/KEYS.md, held there by a test reading the real window's bindings in both directions.

    QS162 · 966c546
  259. A title the host writes appears nowhere while there is one tab, because the strip that would carry it is hidden

    The window is named for the session it shows and then for this client, so a shell reporting its directory reaches the one place a single-tab window has.

    QS161 · 58036b1
  260. Three proxy-command tests fail in the guest and pass on this machine, and nothing says which desk is right

    The three cases that disagreed by machine wanted a gitignored key they never used, so they take one that reads no file and the guest is green for the first time.

    QS157 · 09ed569
  261. Naming a typeface on any WPF text kills the client, because invariant globalization refuses the culture WPF builds

    Invariant globalization is off, so a text box and a named typeface both survive; it saved no bytes on Windows and cost grapheme segmentation half its rate.

    QS154 · 90bb3fe
  262. The window's terminal is an empty rectangle, because nothing presents a swapchain into the pane's handle

    The client runs a shell on its pane: what it prints is drawn, what is typed reaches it, and a resize reaches the model, the swapchain and the program in that order.

    QS116 · 5d25481
  263. Every action needs a chord the user memorised or a menu they have to go looking for

    Ctrl+Shift+P lists every action this client has, each beside the chord that also does it, and the list is read off the bindings so one cannot exist that it does not offer.

    QS52 · 94eddd8
  264. A user's chosen colour scheme has to be entered as twenty colours by hand

    A scheme in either format everybody already shares is read from a path beside the settings file, repaints the scrollback with it, and has its unreadable pairs named rather than refused.

    QS51 · ce2f38b
  265. Nothing can be configured, so the font, the colours and the keybindings are whatever the code says

    Eight settings apply live from a file that keeps the notes a user writes in it, and a test refuses any key the reference does not document or documents and this build has not.

    QS50 · ab9227b
  266. Each pane would open its own graphics device, so four panes cost four times the driver's attention

    Every pane borrows one device, one atlas and one set of shaders and owns only its swapchain, so four panes drawing the same text rasterise it once between them.

    QS49 · f8174fb
  267. Two sessions cannot be seen at once, so comparing output means alternating between tabs

    A tab holds a tree of terminals, so two hosts are on screen at once, and moving the focus goes to the pane that is really in that direction rather than the next one in the tree.

    QS48 · caff265
  268. Every session needs its own window, so working across four hosts means four windows to arrange

    A tab owns its session, so a window holds several: the keyboard, the selection and the find follow whichever is on screen, and a live one asks before it closes.

    QS47 · c94a201
  269. There is no window, only a render surface, so nothing can be opened, themed or closed

    The window holds a live session, and closing one asks first, naming what is open, with a never-again that is written down before the window goes.

    QS46 · c8d2dcd
  270. Output that scrolled past cannot be scrolled back to, and nothing in it can be found

    The wheel and Shift+Page read back through the history without the view being stolen, and Ctrl+Shift+F finds a match the wrap fell inside and highlights it across the break.

    QS31 · 16493ee
  271. Text on screen cannot be selected or copied, and a paste arrives as keystrokes the host may run

    A drag selects and highlights, Ctrl+Shift+C copies a wrapped line back as one line, and a paste carrying a newline is shown in full before any of it is sent.

    QS30 · 3da5f8a
  272. Typing Japanese or Chinese shows no composition and commits nothing

    Composition is display state the buffer never sees, and the window answers the input method's own messages by putting its windows on the cursor's cell, measured in cells and not characters.

    QS29 · 327f6cf
  273. The client exits the moment anything asks its terminal about accessibility

    The child window declines the accessibility question instead of dying on it, and the terminal is still published where a reader looks.

    QS148 · ce480f7
  274. UI is verified by synthetic keystrokes and screenshots, which need a desk somebody is sitting at

    A UI case launches the client and reads its window through the accessibility tree, inside the suite, needing neither foreground nor a capture — and what the engine cannot say is filed against it.

    QS147 · a467aef
  275. Placing one character costs eighty-seven nanoseconds, and nobody knows which part

    The width lookup was 22 per cent of placing a character and two binary searches guaranteed to miss for ASCII; below U+0300 it now answers without searching, and the path is 19 per cent faster.

    QS146 · a7438c4
  276. A render claim skips itself over statistics that two of its three assertions never needed

    The idle draw-call figure is proven on every run: its three assertions no longer wait on DXGI statistics, and the count is compared where one exists.

    QS145 · 3653b5e
  277. Writing cells is sixty milliseconds a megabyte, the largest cost on the path

    Scrolling is cleared of it: the ring already rotates and its fill is a seventh, measured by widening the screen tenfold, so 87 per cent is the per-character path at 87 ns each.

    QS144 · 7ade850
  278. Grapheme clustering costs nine times everything that reaches it

    Two characters below U+0300 cannot join, so the first is a cluster without asking the rules — clustering fell from 23.2 ns to 3.53, and the ladder's segment arm from 60 MB/s to 259.

    QS143 · 6417645
  279. A MobaXterm or PuTTY user has to recreate every session by hand before they can start

    PuTTY's registry reads with the same accounting as MobaXterm's file, and a UI case reads the preview and refuses it — the dialog no capture could reach.

    QS80 · 2fc855c
  280. A window nobody is typing into has never been measured, so the low-idle claim is untested

    Ten minutes idle costs 0 ms of core time and raises no system timer, against the incumbent's 3,625 ms on the same desk, and an idle render loop presents nothing to the GPU.

    QS76 · 625d7db
  281. Settings have no file, so nothing survives a restart and nothing can be moved to another machine

    Settings are a versioned, hand-editable file that keeps keys this build has never heard of, backs itself up before migrating, and moves beside the executable on a marker.

    QS74 · b6d13c2
  282. A user reporting a defect has no way to say what their client was doing when it happened

    Ctrl+Shift+F1 writes one file holding the machine, the adapter, the settings with every value a secret could hide behind removed, the log and the crashes — and output records without keystrokes.

    QS73 · e0ced1f
  283. A crash takes the session, the scrollback and any explanation of what happened with it

    A crash writes a report naming the build, the machine and what was open, then tells the user where it is — and a lost graphics device is told apart from a defect.

    QS72 · f29e132
  284. When a connection fails there is nothing to read afterwards but the dialog that has gone

    A session writes what happened where a user can send it — connections, credentials by kind, failures in their own words, the negotiation under a trace — and no secret can reach the file.

    QS71 · d1f2a5f
  285. The pipeline test's drain guard counts reads rather than bytes, so a loaded machine fails it

    The parser's backlog is now measured as bytes waiting when a drain begins, which says how far behind it is rather than how the reader happened to be scheduled.

    QS120 · 31590a8
  286. A host reached through a ProxyCommand is read from the config, reported, and cannot be connected to

    A host reachable only on the container network is reached by running the escape hatch people actually write, ssh -W, and what the program prints on stderr survives into the failure.

    QS118 · b0d07cc
  287. The golden suite's text tolerance does not hold on the CI runner, so every commit's build is red for the same pixels

    A text scene is judged by how far the whole picture moved rather than by its noisiest pixel, which separates a rasteriser from a regression by 251 times.

    QS109 · 6f2bd29
  288. The latency test's bound is a maximum over more reads at sixteen megabytes than at four, so a scheduler hiccup fails it

    The latency claim is now checked with the mean wait over each interval, which does not climb merely because the later reading covers four times as many reads.

    QS106 · 3e885f5
  289. Segmenting a printed run allocates a string per character, which is the whole of the render arm's cost

    The render arm's allocation went from fifty-four megabytes per megabyte of stream and a hundred and two collections to the harness's own floor and none.

    QS94 · 6e312ce
  290. A service running locally cannot be reached from the remote host

    A service here is reached from the server, the port it chose comes back, and a refusal names the port asked for and the two settings that cause it.

    QS67 · b1264fb
  291. A port on the remote network cannot be reached from a local tool

    A port on the remote network is reached from a local tool, bound to loopback unless an address is named, and the operating system is asked where it is listening.

    QS66 · cf347ed
  292. Keeping a local and a remote directory alike means comparing them by eye

    Two trees are compared before anything moves, tolerant of the resolutions the two filesystems keep, and a mirror deletes exactly the list it showed and nothing that arrived after.

    QS65 · a5cd8a7
  293. A host too old to offer an SFTP subsystem cannot receive a file at all

    A host with no sftp subsystem moves files with scp, every path quoted for the remote shell, and the fallback says what it costs instead of being discovered.

    QS63 · ecf9b29
  294. A folder cannot be copied, and a name that already exists on the far side is resolved by guessing

    A folder copies whole, empty directories included, and a cancelled overwrite leaves the file that was there complete because the bytes land beside it first.

    QS62 · 66e0fcc
  295. A transfer has no progress, cannot be cancelled, and starts again from zero if it fails

    Transfers queue with progress, rate and estimate, cancel stops the file it is on, and a resume happens only where the partial can be shown to be the source's beginning.

    QS61 · da5a511
  296. Moving a file means a second authentication and a second connection to a host already open

    The file channel opens on the session the shell is already using, and the server's own log shows one authentication and the sftp subsystem on that same connection.

    QS59 · 4a38cc7
  297. A session cannot be created or edited, so the store can only be built by editing its file

    A session is made by typing a host, every other field answered from the folder above with its source named beside it, and a password after login refused.

    QS58 · 912ace6
  298. A host reachable only through a bastion cannot be reached at all

    Both routes through a bastion now work, the built-in jump and a proxy command, through one loop that treats three hops as one hop three times.

    QS57 · b0d07cc
  299. Hosts already defined for OpenSSH have to be defined a second time here

    The user's own ssh_config is read with OpenSSH's first-value-wins rule and its negations, never written, and every directive not acted on names its file and line.

    QS56 · 4e51656
  300. Every connection is retyped, so a host used daily costs the same as one used once

    A tree of folders whose settings a session inherits and may override, each value naming the node that set it, in a file that holds no secret and survives a hand edit.

    QS55 · afac841
  301. A screen reader finds nothing on the terminal surface, so the client cannot be used without sight

    The buffer is published as a text pattern with scrollback and screen as one document, the cursor as the caret, and a flood of output as one announcement.

    QS54 · 08fc46e
  302. A saved password would rest on disk where anything running as the user can read it

    A password lives in a pinned buffer that is zeroed and can never be a string, and rests in the user's own Credential Manager bound to their Windows account.

    QS44 · 4c65ec6
  303. Nothing checks the host key, so a machine in the middle is indistinguishable from the server

    The user's own known_hosts decides, hashed entries and all, and a changed key is refused without ever being put to anybody as a question.

    QS42 · 7a205d6
  304. Only one way in is proven, so a host needing a second factor or an ed25519 key is unreachable

    Three key types in four formats, none offered first and a password last, and a second factor asked in the server's own words against an account that enforces both.

    QS41 · c79d529
  305. A refused connection reports a library exception, so a user cannot tell a wrong port from a wrong key

    Eleven failures, each provoked against a real socket or server before its rule was written, and each carrying what happened, what it means and what to do.

    QS39 · 0b95590
  306. No remote host's output has ever reached the emulator

    A remote shell arrives through the same four members a local one does, carrying 124.8 MB/s at 233 KB allocated per megabyte against a real OpenSSH server.

    QS37 · ed80f8e
  307. Protocol library types would reach the terminal and the UI, so replacing that library means rewriting the client

    The seam is four interfaces of this client's own words, with a second implementation behind it that needs no server and a test that fires when a library escapes.

    QS36 · 6e907eb
  308. Text is rasterised in grayscale, so it looks thinner here than in every other Windows application

    Coverage is three numbers per pixel where the display has three stripes, refused on a panel that has none and reversed on one that runs the other way.

    QS35 · c01b469
  309. A programming font's ligatures do not form, so text set in it looks unlike the same text elsewhere

    A run's glyphs now come from the font's shaper, cached by the run's own text, and the cell under the cursor goes back to its character so no ligature can hide which one it is.

    QS34 · 14c6c02
  310. Resizing the window leaves the remote program drawing to the geometry it had before

    The model reflows first and the far end is told once the drag settles, so a real shell reports the size the drag ended on, and a drag of two hundred sizes costs a handful of requests.

    QS32 · 9c2c693
  311. Arrow keys, function keys and modified keys send nothing a remote program recognises

    Arrows, function keys and modified keys send the forms this client's own terminal name promises, and change shape when the host asks for the application modes.

    QS28 · 9ba5818
  312. A keystroke queues behind a screenful of pending output before it is written to the host

    A keystroke leaves in twenty microseconds while forty-eight megabytes stream in, sharing no queue with the output and allocating nothing of its own.

    QS27 · 65c041f
  313. Under heavy output the delay before a typed character appears grows without bound

    The parser drains its whole queue before the renderer hears anything, so thirty-two times the bytes cost one and a half times the worst wait and no byte is dropped getting there.

    QS26 · 7192c8d
  314. The emulator has no real producer of bytes, so every test of it is a fixture its own author wrote

    A real shell runs behind the same four members an SSH channel will be behind, its output reaches the emulator as VT bytes, and closing it leaves no process and no handle behind.

    QS25 · 4a36bd1
  315. A malformed escape sequence from a hostile host has never been shown not to crash or allocate

    Mutated and pathological input is answered rather than thrown at, and replaying a real stream allocates zero bytes where it used to allocate fifty-five kilobytes per megabyte.

    QS24 · 2eea807
  316. Narrowing the window turns wrapped output into ragged fragments that never recover

    Narrowing and widening again comes back to the same rows, the cursor stays on the character it was on, and the alternate screen is replaced rather than re-wrapped.

    QS23 · d7d0e49
  317. Nothing records which rows changed, so any redraw is a whole-screen redraw

    Every mutation moves a generation the renderer compares, a scroll dirties one row rather than the screen, and after the host stops a window authorises no further frame.

    QS22 · 8213b39
  318. A click inside a remote editor or pager does nothing, because no mouse event reaches the host

    A click, drag or wheel reaches the host in whichever of the four modes it asked for, in SGR where offered, and past column 223 the legacy encoding refuses out loud rather than naming another cell.

    QS21 · 8501d86
  319. The ban on raw control bytes covers tests and not src, so the same byte went into shipped source unseen

    The walk covers src and tests both, and the six raw ESC bytes it found in Emulator.Replies.cs are spelled as escapes.

    QS100 · b5db536
  320. A test can carry a raw escape byte, and a file where it went missing fails as though the code were wrong

    A test asserts no source under tests carries a control byte, and the ninety-six already there are escapes now.

    QS98 · 359af06
  321. The frame queue reaches three under a virtualised presentation path, where the bound was measured at two

    The test asserts the queue does not grow, since its depth is the presentation pipeline's and its growth is the renderer's (design superseded: reading the swapchain gives the two it had).

    QS97 · 3ce360c
  322. A third rasteriser shifts one antialiased pixel by six levels, which is three times the measured tolerance

    Text scenes allow the eight levels the rasteriser was measured to move; a glyph-free scene holds the shader to one (design superseded: the shader cannot move a pixel one level, let alone six).

    QS96 · 78d74df
  323. The render suite takes the screen with topmost windows, and anything the operator does corrupts it

    One command runs the suite on a VMware guest, and the host's screen stops being part of the measurement (design superseded: the guest is a third rasteriser, not this desk).

    QS95 · e998277
  324. A program asking the terminal what it is gets no answer and falls back to a dumber mode

    DA1, DA2 and the status reports answer, and DECRQSS reports SGR, the region and the level and refuses everything else instead of leaving the asker waiting.

    QS20 · 27e4838
  325. A remote host can write the local clipboard and read back a string it planted in the title

    The clipboard is off per session and write-only when on, the title is set and never reported, and every other reply is a constant and some numbers.

    QS19 · 56c5dd3
  326. Box drawing renders as letters, and the title, palette and working directory a host sends are ignored

    ESC ( 0 now draws a box corner where lqqqk used to be letters, and the title, palette, default colours, working directory and hyperlinks a host sends all land, OSC 52 still refused.

    QS18 · 904e93c
  327. A full-width line wraps a column early and a scrolled region redraws the wrong rows

    Writing the last column owes a wrap rather than taking one, and margins, origin mode and a real tab-stop set all hold.

    QS17 · 8d0d77c
  328. The cursor cannot be moved, a line cannot be erased and no character carries a colour

    Cursor movement, erasing and editing that clamp, plus SGR in both spellings, with default and indexed colours left unresolved.

    QS16 · 9738488
  329. Nothing holds what the remote host has printed, so a line that scrolls off the top is gone

    A ring with a moving origin: one scroll writes one row, whether the scrollback is ten lines or a hundred thousand.

    QS15 · e5ffccf
  330. dotnet test reports zero tests and exits non-zero on a tree whose suite passes when the assembly is run directly

    .\run-tests.cmd runs every test assembly, and its exit code is the verdict (design §QS88 superseded: it falsified only on dotnet test) (design §QS88 recorded in run-tests.cmd).

    QS88 · 27c8920
  331. The frame-queue measurement reads two on runs where nothing regressed, so its result is not evidence either way

    The warm-up waits for DXGI's statistics instead of counting frames, and the assertion is the bound the instrument can see (design §QS87 superseded: the counter it blamed reads identical).

    QS87 · 4b83aa9
  332. A byte carrying an escape sequence is indistinguishable from text, so a host cannot move the cursor

    Williams' table over fourteen states and all 256 bytes, emitting events and allocating nothing per parse (design §QS14 superseded: a UTF-8 stream cannot honour single-byte C1).

    QS14 · 75baee0
  333. A multi-byte character split across two network reads decodes as two broken ones

    A stateful decoder, UAX #29 clusters that survive any split, and a width table generated from Unicode 17.0.0 (design §QS13 recorded in tools/generate-width-table.py).

    QS13 · 51ddae9
  334. Nothing catches a renderer that draws correctly on one vendor's driver and wrongly on another's

    Seven scenes rendered offscreen and compared against committed references, on this machine's adapter and on WARP.

    QS12 · 4dcb244
  335. Underline, undercurl, strikethrough, the cursor and a selection have no representation on screen

    Five underline styles, overline, strike, three cursor shapes and selection, all derived in the pixel shader from the same twenty bytes (design §QS11 recorded in src/Quickshell.Render/Grid.hlsl).

    QS11 · d84a09a
  336. A CJK character, a combining mark and a colour emoji each draw wrongly or not at all

    A fallback face, a colour page and a two-cell span, so CJK and emoji draw where the model says they are (design §QS10 superseded: its fallback API needs a callback Vortice cannot marshal).

    QS10 · 59c1ffe
  337. Nothing turns a grid of cells into a draw call, so text on this client's screen is still hypothetical

    The whole grid is one DrawInstanced of twenty-byte cells, blended in linear light so text weighs the same either way round (design §QS9 recorded in src/Quickshell.Render/CellRenderer.cs).

    QS9 · 8a38098
  338. No glyph is on the GPU, so drawing a character would cost a rasterisation on the frame that needs it

    Every glyph is rasterised once and sampled thereafter, keyed on the subpixel offset so a character keeps its weight in every column (design §QS8 recorded in src/Quickshell.Render/GlyphAtlas.cs).

    QS8 · 976c11f
  339. Nothing replays a real terminal workload, so a change that halves throughput lands unnoticed

    Both replay arms are wired, and the gap between them is 623 against 8 MB/s on the 32 MB stream.

    QS3 · ddc4f75
  340. The commit script stages the whole tree, so a second session's half-written work lands inside another task's commit

    run-commit.cmd stages only the paths a commit declares after --, and says what it is sweeping when none are declared, so a second session's files stay out.

    QS85 · 69e2d43
  341. The pipeline pins its actions by tag and nothing watches them, so a stale or advisory-bearing action is found by chance

    Dependabot watches the actions the pipeline pins and opens one grouped pull request a week, so a stale action arrives as a review rather than as a surprise.

    QS84 · 2db32a6
  342. The tree targets net8.0, where WPF has no Fluent theme, so the chrome the sibling clients share cannot be built here

    Every project targets net10.0-windows, so WPF's Fluent ThemeMode is reachable here and a guard test fails any retarget that would take it back out.

    QS82 · cdbc37e
  343. A frame reaches the screen whenever the compositor chooses, so no bound on input-to-photon delay can be claimed

    A flip-discard swapchain waits on its own latency handle at a queue measured one frame deep, asks for tearing, and resizes without a stretch.

    QS7 · 4543473
  344. Nothing opens a graphics device, so no pixel this client draws has ever reached a screen

    A D3D11 device opens on the window's adapter, the default one or WARP, names what it skipped, and rebuilds every GPU resource on a loss.

    QS6 · fdda686
  345. Nothing measures whether the chosen protocol library reaches a modern sshd, so the network layer is unpriced risk

    SSH.NET does certificates, jump hosts and two factors against OpenSSH 9.6; the agent and ssh_config are ours to write (design §QS5 recorded in docs/measurements/ssh-net-probe.md).

    QS5 · 0dda752
  346. No decision records which window host can present a swapchain without adding frames of latency

    WPF with a child HWND per pane won on a click-to-pixel floor of 13.8 ms, the only host of three to answer within one refresh interval (design §QS4 recorded in docs/measurements/host-probe.md).

    QS4 · 0fc5768
  347. Fast and lean are this client's whole premise, and no number anywhere states what either word means

    docs/PERFORMANCE.md fixes six figures, the method that settles each and the machine they are measured on, so a claim about speed or size is checked against a number instead of a word.

    QS2 · 9759946
  348. The repository holds no buildable tree, so no claim about this client's speed or size can be measured

    A fresh clone builds and tests four layered projects with nullable, warnings-as-errors and the allocation analyzers on, and a project reference that inverts the layering fails the build.

    QS1 · 84547d2
  349. The agent's certificate authority signs whenever any process of the person's asks, with nobody present

    With agentCertificateHello on, Windows Hello over the window confirms each signing; unconfirmed, nothing is signed and the agent is told why.

    QS360
  350. The Windows Hello prompt before a vault export has never been seen to run, since no test desk has Hello set up

    In the guest, which has no Hello, the real UserConsentVerifier interop answers Unavailable: factory, IID, call and status all run.

    QS344
  351. A shell start takes a third longer than at 40fb448, and the performance gate fails on start

    No XAML parser on start, sessions listed once the window is idle, one context menu: a shell start timed level with 40fb448 back to back on the reference desk.

    QS288
  352. A cursor blink redraws the whole grid, so a blinking cursor alone costs half a per cent of a core while idle

    A blink redraws only the cursor's cell onto a flip-sequential buffer that holds the rest, and presents that one dirty rectangle.

    QS260
  353. There is no full-screen mode, the one window shape whose echoes reach the glass an interval sooner

    F11 and the palette make the window borderless at its monitor's pixel bounds with no strip, sidebar or bars, and each pane waits on its swapchain before reading the model.

    QS257
  354. An idle pane costs 0.6 % of a core and GPU work even with the cursor blink off, and four cost nearly three times one

    An idle pane with blink off now wakes its loop zero times and draws nothing: the blink wait no longer spins, and cursorBlink reaches panes open at start.

    QS255
  355. The gate fails unchanged code, because the desk runs a seventh slower some days than when the baseline was taken

    A check runs the baseline's code beside the tree and judges the ratio; a sitting too noisy to see a tenth now says it judged nothing.

    QS253
  356. The contrast test's Direct2D reference sometimes draws nothing in the guest, and the failure reads as infinite ink

    EndDraw is checked, the draw flushed, and a blank reference read again, redrawn and recorded instead of read as infinite ink.

    QS215
  357. Replaying the tmux resize recording sometimes allocates in steady state in the guest, and the failure says no more

    A steady-state allocation failure now refeeds the stream in 512-byte pieces and names each piece that allocated, with its offset and its bytes spelled out.

    QS214
  358. The text being composed is a box the input method draws over the grid, not underlined text inside it

    The text being composed is painted into the grid at the cursor, underlined in the session's font and colours, wrapping like text, with the cursor on its caret.

    QS153
  359. A change that costs performance is caught by whoever happens to notice it

    run-perf-gate.cmd and release.cmd fail a build whose parse, emulate or warm start is worse than the baseline's own noise allows, unless a commit's trailer says so.

    QS79
  360. Nothing has run for longer than a working session, so a slow leak would reach users first

    Twenty sessions in six roles soak against a real sshd, and every watched counter carries a slope extrapolated over three weeks rather than a bound it sits under.

    QS78
  361. There is no way to install this client, so it can only be run from a build directory

    The release archive runs portable or installs itself for one user with no administrator prompt and uninstalls keeping settings, proven on a guest by run-install-vm.cmd.

    QS77
  362. A key already unlocked in an agent must be typed again, and a hardware key cannot be used at all

    A key generated inside an agent, held nowhere else and readable by nothing, authenticates against a real OpenSSH server through a protocol written here.

    QS43
  363. This client has met one server, so an appliance that negotiates differently is an unknown

    OpenSSH 6.6 to 9.6 and Dropbear each negotiate, take an RSA key and draw top, with the agreed algorithms recorded per row.

    QS40

← Quickshell's product page