What Quickshell shipped.
Every entry in docs/CHANGELOG.md, read at bc9e62e and dated by the commit that wrote it.
- QS369 · 7d4fcf1The 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.
- QS368 · 00a82b3Winwright 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.
- QS367 · 6533dafIn 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.
- QS366 · 7d14260A 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.
- QS365 · fe69a45The 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.
- QS364 · 26aee1eThe 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.
- QS349 · d40640fChoosing 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.
- QS348 · 81b35c3That 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.
- QS363 · eebcb65The 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.
- QS361 · 7d14b26The 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.
- QS359 · 8e0b91fAn 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.
- QS358 · 7975315On 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). - QS357 · a33b93fThe 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.
- QS356 · 57990f5exec 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.
- QS354 · 894c751Every 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.
- QS353 · 4f69916A 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.
- QS350 · 1255719Whether 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.
- QS347 · 845c66aA 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.
- QS343 · 4b94970Wiring 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.
- QS342 · bcae1bcAsking 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.
- QS341 · 9cc9facAn 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.
- QS340 · 2b00401A 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.
- QS339 · 8c7f3e6An 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). - QS338 · 9d004cbText 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). - QS337 · 165ba39A 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). - QS336 · 9758de9Every 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). - QS335 · 39fe5abWhat 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). - QS355 · f40c0a7CI 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.
- QS352 · 3b65301The 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.
- QS351 · a7cf15eOnly 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). - QS346 · 69f90abReading 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.
- QS345 · 3516aafAn 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). - QS334 · b9783f2A 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). - QS333 · ddf8155Nothing 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). - QS332 · 3385506With 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). - QS331 · ee63734A 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). - QS330 · fb912abA 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). - QS329 · 8a610c2A 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). - QS328 · ee36eb0A 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). - QS327 · b65f070A 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). - QS326 · 78ef66dAn 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). - QS325 · 3a79ff5An 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). - QS324 · f0ab2e2Approving 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). - QS323 · 8d1ee36Nothing 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). - QS322 · d38d062No 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). - QS321 · 3e8aa9dNothing 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). - QS320 · 4d2ac1eNothing 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). - QS319 · 287c78cTwo 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). - QS318 · 841733dThe 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). - QS317 · 0686e58A 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). - QS316 · a4ac7edEach 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.
- QS315 · aafc3a2How 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.
- QS314 · 48819bbThe 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). - QS313 · 924bc77A 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). - QS312 · c3a1b82A 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.
- QS311 · f45d4ddA 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). - QS310 · a7ede8fA 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). - QS309 · c597600Splitting 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.
- QS308 · 4b8c234A 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). - QS307 · 6213cd7An 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). - QS306 · 21b80f0A 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). - QS305 · a71addaNothing 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). - QS304 · 30862c2The 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.
- QS292 · d74c140The 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.
- QS303 · dbd994bThe 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.
- QS302 · db7d320A 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.
- QS301 · 4e5fd00The 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.
- QS300 · 4499d04A 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.
- QS299 · 3b86055The 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.
- QS298 · 05b0687A 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.
- QS297 · 3f1f74fAn 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.
- QS296 · aa73048A 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.
- QS295 · aa73048PuTTY'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.
- QS294 · aa73048The 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.
- QS293 · 6020c9aA 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.
- QS291 · 190707dA 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.
- QS290 · 464091fThis 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.
- QS289 · 0bb05cdA 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.
- QS285 · 2ddca86The 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.
- QS278 · ea3cb2fThe 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.
- QS273 · 44eef4eNo 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.
- QS272 · e3bb78dThe 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.
- QS188 · ccb962aNothing 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).
- QS114 · 23d144bA 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.
- QS81 · d8c4020A 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.
- QS287 · ba74f07The 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.
- QS286 · 745310eThe 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.
- QS284 · c846347A 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.
- QS283 · 14f2a6bThe 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.
- QS282 · ffb9d52A 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.
- QS281 · d510cd5The 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.
- QS280 · c120ea3Home 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.
- QS279 · 0a36c23Home'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.
- QS277 · d62f0c9The 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.
- QS276 · 02421ccAn 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.
- QS275 · 937112fA 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.
- QS274 · 564dd1aA 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.
- QS271 · 2802c62A 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.
- QS270 · 2fb136fThe 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.
- QS269 · 0ff06ceA 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.
- QS268 · c168074Saved 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). - QS267 · 7ccaed0The 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.
- QS266 · 3620411The 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.
- QS265 · 816cb99The 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.
- QS264 · 7fd9216The 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.
- QS263 · 59151b9The 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.
- QS262 · d516fd1The 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.
- QS261 · 00de5b4Where 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.
- QS259 · 84774faA 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). - QS258 · 19ebf5cA 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). - QS256 · f0d7a28One 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). - QS254 · 1fa539bA 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.
- QS252 · 2ac10cbA 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). - QS225 · 227b338An 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). - QS197 · 18d3634The 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.
- QS141 · 6f1404fFeed 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.
- QS139 · 31c63d9A 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). - QS137 · 1f875e3The 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). - QS75 · cd4133dNothing 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). - QS251 · 72685ddThe 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.
- QS250 · 87d635cA 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.
- QS249 · bdd5c00Keys 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.
- QS248 · 3938f7aAn 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.
- QS247 · 909a542A 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.
- QS246 · 6b48f1bReverse 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.
- QS245 · 7c84d2dA 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.
- QS244 · a2c28cbSeventeen 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.
- QS243 · 2136161DECRQSS 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.
- QS242 · a6eaed0Reverse 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.
- QS241 · 850282eHPR 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.
- QS240 · 1f29a1fMost 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.
- QS239 · c97d1c5The 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.
- QS238 · 07a0e57The 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.
- QS237 · 33d3532DECRQM 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.
- QS236 · 419af4aWindow 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.
- QS235 · 8681d20Character 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.
- QS234 · d76aa37Asking 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.
- QS233 · 524e710No 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.
- QS212 · f40821fDark 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). - QS210 · 46d49a9The 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.
- QS160 · b5d26a2A 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.
- QS115 · 0134bc8A 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.
- QS232 · 292f9e2A 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.
- QS231 · b5bdf02No 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.
- QS230 · 23a73efA 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.
- QS229 · 9024a40The 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.
- QS228 · dccf68cA 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.
- QS227 · 1db61faesctest 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.
- QS226 · 80dc477A 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.
- QS224 · c0df550A 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.
- QS223 · 2ebdfd9Clicking 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.
- QS222 · f55727aA 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.
- QS221 · 757555aA 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.
- QS220 · add31a5An 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.
- QS219 · 7da11c5The 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).
- QS218 · 6f08915A 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.
- QS217 · 70527f6A 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.
- QS216 · 70b6860Importing 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.
- QS211 · 05350b9esctest 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). - QS208 · a2caf74A 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.
- QS207 · fed5779Insert 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.
- QS206 · 808140aRestoring 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.
- QS205 · bd86dbdCursor 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.
- QS203 · 918f539Two 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.
- QS201 · a2dd8d9An 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). - QS200 · 59e2ee3The 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). - QS134 · bd73586Nothing 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.
- QS129 · d24d273Nothing 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.
- QS70 · 3ef0654Nothing 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.
- QS69 · 2628aeaA 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.
- QS199 · 40fb448The 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.
- QS198 · 14a02beA 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.
- QS196 · 901b5dbFigure 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.
- QS195 · d6849ceEach 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.
- QS193 · 699ddadThe 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.
- QS192 · b65acefA 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.
- QS191 · 784eaedThe 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.
- QS189 · 03853dfA 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.
- QS186 · 4280f40A 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.
- QS185 · 63c19f0A 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.
- QS184 · f1bc2b1The 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.
- QS183 · 03582d5A 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.
- QS182 · 9b3ea64A 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.
- QS179 · 073b6f8A 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.
- QS178 · 4f07171Five 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.
- QS177 · a4957efThe 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.
- QS176 · 113a408The 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.
- QS174 · 81765f2A 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.
- QS172 · 0f0dcf9A 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.
- QS171 · 6e28adaSplitting 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.
- QS170 · aceee68Every 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.
- QS168 · 6921aeaChanging 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).
- QS167 · 22dd7c0An 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.
- QS164 · f1f5123Four 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.
- QS163 · 438f73fA 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.
- QS159 · 6082822The 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.
- QS158 · 7597958Nothing 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.
- QS156 · 5a38c70Grapheme 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).
- QS155 · d9d7158A 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.
- QS152 · 433bc71A 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.
- QS151 · 1f0f35eA 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.
- QS150 · a8583d0A 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.
- QS149 · 115d22eA 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.
- QS140 · 32c09faThe 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.
- QS136 · 67f7853A 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.
- QS135 · 78b77fcThree 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.
- QS133 · d3a6257A 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). - QS132 · 24d993bA 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.
- QS131 · 0dcf6b1The 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). - QS130 · bfe58caThe 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.
- QS213 · 7e9cb78The 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.
- QS209 · eb7011cA 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.
- QS204 · 0712e94Erasing 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.
- QS202 · bea60dfAn 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.
- QS181 · 5c7f533The 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).
- QS127 · 88f2eeaThe 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). - QS126 · ef766b7Eleven 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.
- QS125 · e313ad8A 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). - QS124 · f2e327bA 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). - QS123 · 4fd09c6A 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). - QS122 · 0e87698The 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). - QS121 · b392dadNothing 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).
- QS119 · 57e033aA 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). - QS117 · 4262699Comments 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). - QS113 · e8f9e69A 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.
- QS112 · a58d56dA 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). - QS111 · b5cdcccA 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). - QS110 · 00c324bRemote 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). - QS108 · 957b960The 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.
- QS107 · 7ec7933ClearType 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). - QS105 · 5ba148dBackspace 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).
- QS104 · 383cf55A 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.
- QS103 · ae8ac6bNothing 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.
- QS102 · 622b7c7The 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.
- QS101 · 945cdaeNinety-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.
- QS99 · 790f0acA 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). - QS93 · 178625cEvery 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.
- QS91 · b3999a2A 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).
- QS90 · 092ba2aNobody 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.
- QS89 · 1ff8620dotnet 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).
- QS86 · 41bb478Input 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). - QS68 · 9a520a8Reaching 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.
- QS38 · 3e3c7d6A 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). - QS33 · 11bff16No 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). - QS194 · a54de66An 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.
- QS187 · 74f7f63Pasting 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.
- QS180 · d6a7499The 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). - QS138 · 2593a6fSixteen 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). - QS83 · bd74d38Every 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.
- QS64 · 62d483dA 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.
- QS60 · 6fcd643There 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.
- QS53 · 2db4dd0The 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.
- QS175 · 00c114cOne 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.
- QS173 · 5f23627The 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.
- QS169 · 0bdeaf7The 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.
- QS166 · 90ac519A 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.
- QS165 · 48e15caA 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.
- QS162 · 966c546This 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.
- QS161 · 58036b1A 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.
- QS157 · 09ed569Three 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.
- QS154 · 90bb3feNaming 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.
- QS116 · 5d25481The 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.
- QS52 · 94eddd8Every 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.
- QS51 · ce2f38bA 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.
- QS50 · ab9227bNothing 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.
- QS49 · f8174fbEach 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.
- QS48 · caff265Two 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.
- QS47 · c94a201Every 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.
- QS46 · c8d2dcdThere 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.
- QS31 · 16493eeOutput 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.
- QS30 · 3da5f8aText 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.
- QS29 · 327f6cfTyping 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.
- QS148 · ce480f7The 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.
- QS147 · a467aefUI 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.
- QS146 · a7438c4Placing 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.
- QS145 · 3653b5eA 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.
- QS144 · 7ade850Writing 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.
- QS143 · 6417645Grapheme 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.
- QS80 · 2fc855cA 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.
- QS76 · 625d7dbA 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.
- QS74 · b6d13c2Settings 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.
- QS73 · e0ced1fA 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.
- QS72 · f29e132A 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.
- QS71 · d1f2a5fWhen 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.
- QS120 · 31590a8The 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.
- QS118 · b0d07ccA 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.
- QS109 · 6f2bd29The 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.
- QS106 · 3e885f5The 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.
- QS94 · 6e312ceSegmenting 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.
- QS67 · b1264fbA 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.
- QS66 · cf347edA 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.
- QS65 · a5cd8a7Keeping 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.
- QS63 · ecf9b29A 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.
- QS62 · 66e0fccA 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.
- QS61 · da5a511A 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.
- QS59 · 4a38cc7Moving 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.
- QS58 · 912ace6A 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.
- QS57 · b0d07ccA 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.
- QS56 · 4e51656Hosts 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.
- QS55 · afac841Every 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.
- QS54 · 08fc46eA 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.
- QS44 · 4c65ec6A 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.
- QS42 · 7a205d6Nothing 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.
- QS41 · c79d529Only 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.
- QS39 · 0b95590A 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.
- QS37 · ed80f8eNo 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.
- QS36 · 6e907ebProtocol 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.
- QS35 · c01b469Text 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.
- QS34 · 14c6c02A 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.
- QS32 · 9c2c693Resizing 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.
- QS28 · 9ba5818Arrow 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.
- QS27 · 65c041fA 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.
- QS26 · 7192c8dUnder 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.
- QS25 · 4a36bd1The 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.
- QS24 · 2eea807A 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.
- QS23 · d7d0e49Narrowing 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.
- QS22 · 8213b39Nothing 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.
- QS21 · 8501d86A 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.
- QS100 · b5db536The 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.
- QS98 · 359af06A 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.
- QS97 · 3ce360cThe 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).
- QS96 · 78d74dfA 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).
- QS95 · e998277The 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).
- QS20 · 27e4838A 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.
- QS19 · 56c5dd3A 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.
- QS18 · 904e93cBox 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.
- QS17 · 8d0d77cA 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.
- QS16 · 9738488The 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.
- QS15 · e5ffccfNothing 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.
- QS88 · 27c8920dotnet test reports zero tests and exits non-zero on a tree whose suite passes when the assembly is run directly
.\run-tests.cmdruns every test assembly, and its exit code is the verdict (design §QS88 superseded: it falsified only on dotnet test) (design §QS88 recorded inrun-tests.cmd). - QS87 · 4b83aa9The 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).
- QS14 · 75baee0A 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).
- QS13 · 51ddae9A 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). - QS12 · 4dcb244Nothing 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.
- QS11 · d84a09aUnderline, 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). - QS10 · 59c1ffeA 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).
- QS9 · 8a38098Nothing 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). - QS8 · 976c11fNo 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). - QS3 · ddc4f75Nothing 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.
- QS85 · 69e2d43The 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.
- QS84 · 2db32a6The 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.
- QS82 · cdbc37eThe 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.
- QS7 · 4543473A 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.
- QS6 · fdda686Nothing 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.
- QS5 · 0dda752Nothing 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). - QS4 · 0fc5768No 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). - QS2 · 9759946Fast 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.
- QS1 · 84547d2The 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.
- QS360The 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.
- QS344The 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.
- QS288A 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.
- QS260A 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.
- QS257There 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.
- QS255An 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.
- QS253The 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.
- QS215The 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.
- QS214Replaying 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.
- QS153The 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.
- QS79A 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.
- QS78Nothing 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.
- QS77There 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.
- QS43A 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.
- QS40This 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.