Repository navigation
v0.20.0 physical-QA stabilization: v0.19 fixes forward, task bar, managed-Claude deferral - #396
Merged
Merged
Conversation
…yped Physical QA found replies to `read reply`, `read -k 1` and `read -n 1` queued or left in the composer, and hidden replies typed quickly lost. On macOS the only evidence of a line or key read was a question-shaped prompt left open, so reads without a prompt were never seen; and a key typed before the first look (or after the schedule backed off) was routed on no evidence at all. - InputWatch: the shell itself holding its terminal while a command runs is a builtin's read. Line input off there is a confirmed key read; ordinary line settings idle across two samples (the second 100 ms later) are a likely line read. A loop's shell between commands is not. - lookNow and the negotiated input-look/input-looked messages: the frontend holds the first key of a draft, and an Enter that would queue, until the session has looked (at most 800 ms, after the shell's exec), then routes them on that evidence. Older services are never asked. - Held keys reach a program that took the terminal meanwhile (Fish's reader) in order, and a draft typed for the command is handed to that reader. - An answer sent clears the frontend's copy of the request, so the next command typed at speed is never sent to a program that stopped reading. - Typing right after Ctrl+C/Ctrl+Z stays type-ahead for the prompt. Real-PTY tests through the session service cover zsh, Bash and Fish line, hidden and key reads at 0 and 300 ms, Ctrl+Q while a read waits, Enter during sleep and a loop, and commands typed right after a read and Ctrl+C.
The waiting state shared the running shimmer's lavender family and put its
instructions in the subtle tier, said twice in different words, so physical
QA found it too easy to miss.
- A semantic attention color (cyan) for the headline, the composer's mark
and waiting rows in /sessions, apart from running, paused, failed and done.
- The second activity row is the program's own question, or what it reads
when it left none ("zsh is probably reading a line").
- The composer carries the one instruction at secondary contrast: "Type your
answer · Enter sends it to zsh · Ctrl+Q queues a command", "Hidden input ·
nothing you type is shown · ...", "Press a key · it goes straight to ...".
Physical QA counted 399 lines after copying `seq 1 400`; checklist item 1.11 expects `printf 'a\tb\n indented\nüñí\n'` to copy as 6109620a2020696e64656e7465640ac3bcc3b1c3ad0a. Both failed in the stored output, before the clipboard: command output is kept through the screen model, which draws a tab as spaces and records lines without saying whether the last one was ended, so `x\ny` and `x\ny\n` were stored alike. - The parser marks the cells a tab advanced over; exactLine writes the tab back while its whole span is intact (an overwritten span stays as shown). Drawing, selection, search, compare and reports keep the drawn text. - A record keeps copyText (only when it differs) and outputNewline, set from program output only: escapes after the newline still count, NMSh's own notices and carriage returns do not. Both survive restore. - serializeCopyPayload is the one exact copy; /copy, /cp, the picker, block Copy and clips use it. Records join with one line break, never two. Tests that pinned the dropped newline or tab expansion now expect the printed bytes. A live test runs each command and /copy separately through the real composer and checks both diagnostics byte for byte.
…king regex The trailing-escape pattern used to find a write's last text was anchored with a repeated group, so a large write of escape sequences ending in text was scanned quadratically, on every output chunk. The parser now records whether the last text it wrote ended a line, in its single pass; an escape split across writes is still not text.
Brings the v0.19 physical-QA fixes (input ownership with on-demand looks, the waiting-for-input presentation, exact /copy bytes) onto the v0.20 candidate c71a428. The service and client feature lists keep both v0.20's background-tasks and the new input-look.
Physical QA found the queue hard to follow without reopening /queue, the pause said twice, and approval only through /queue then a. - The expanded queue near the composer: a header and up to three commands in run order with their conditions, then "+N more". It takes its rows from the transcript's view through the screen plan (withQueueRows, a new queue region after the activity region); the shell's PTY never resizes. From 24 rows three commands, from 18 two, below that the one-line row. Hidden while a program waits for input. Safe glyphs and NO_COLOR keep it aligned. - An empty Enter at idle, with nothing else owning input, arms an inline review of a paused queue or of the entry that asks first, showing exactly what will run (the whole command for an approval). Only then do Enter or y confirm; n or Esc leave it, e edits. A review owns the keys while armed, so a typed "y" at the composer is always a command, never an approval; any change to what it shows dismisses it; an empty Enter right after a confirm never reaches the command it started. "n" on an approval pauses the queue so typed commands run directly instead of waiting behind it. - A pause is said once in the transcript, with its reason; the queue's row is the state and what to do.
A submission is NMSh's only when the whole of it is one NMSh command, so a pasted /copy, /queue or /compare among other lines went to zsh as a path (physical QA's contaminated clipboard test). The compact preview and the full review now classify those lines as NMSh commands and say, before anything is inserted or queued, that here they reach the shell as text and must be submitted alone. Nothing is reinterpreted or run differently; an absolute path and unknown slash words stay the shell's.
Among other lines the shell receives a pasted /copy, so what it contains runs there: /copy $(curl … | sh) must still say it runs downloaded code. The NMSh tag is now added beside the line's ordinary classification, and every risk outranks it in the label and in whether the paste is previewed.
…igned marks Physical QA found the bar awkward: a task could only be read by entering the bar, finished tasks stayed, the large disc distracted, the mark, pointer and label were misaligned, and a selected row turned wholly purple. - At rest the bar names the task that matters most (a failure first, else the newest that runs) with its time and state, counts the rest, and says how to open it. - A finished task stays on the bar with its outcome for 6 s (30 s after a failure), then the bar lets it go; it stays in /background (bounded by finishedKept). A live task, one whose processes are left, and the task in hand are never let go; letting a row go stops nothing. The frontend redraws when the next one leaves. - Marks are one narrow cell each (no East Asian ambiguous-width glyphs, which some terminals draw wider): a small dot for running. - The selected row uses the same full-width selection band as the completion menu (shared in ui/selectionBand), each part keeping its meaning in color; without color the pointer marks it.
…nventory stays The maintainer deferred managed-Claude physical QA (items 4.1-4.3) for v0.20, so the one path that writes the person's Claude settings, never verified against a live account, is no longer offered by default. Rows keep the real types, states and Inspect, and say which claude plugin command to run instead. The path stays behind NMSH_EXPERIMENTAL_CLAUDE_PLUGIN_TOGGLE=1 and setPluginEnabled refuses without it, whatever the caller.
Physical QA found Setup's appearance choices hard to judge: screen savers previewed as an empty or unrelated star field, choosing a Chroma changed nothing visible, and the activity wording was a muted, truncated note. - One screen saver preview for Setup, the color editor and /screensaver (idlePreviewRows): Black Hole, Fireworks, Circletastic and raiseCatError animate a fixed sample NMSh screen where no screen is captured (never the Setup panel or anything private), and Random shows each saver it can actually choose, from the registry, in turn, naming it. - The Chroma preview follows the setting: choosing one shows it at once; P compares with the base theme until the choice changes. The Chroma row says what will show and what hides or stills it: Off by default, NO_COLOR, an external prompt or Prompt None, Decorative effects Off, Reduced Motion, identity modules only. - Selecting an activity row previews the real running, finished and failed lines (Expressive by default: Cooking… then Cooked for 18s; failures stay factual), at secondary contrast.
…l, paste disclosure
Brings the v0.19 queue preview and contextual review, the paste disclosure and the Setup previews forward (the input and copy fixes are already here).
… go, menu selection
… P compares with the base theme
…s for the prompt
The canonical run found it: after Ctrl+C on a read with a question open,
the frontend still held that question, so the next command's first key
started a draft marked as a reply. When the prompt came back mid-typing,
the reply rule discarded it ("finished before your reply was sent") and
the rest ran as a broken fragment. An interrupt or suspend now ends the
question here as an answer does, and a draft started in the stop window
is never a reply.
Also two tests that pinned the dropped final newline (block Copy output,
welcome copy) now expect the bytes printed.
…a waiting question
…ll rule holds The gate rejects any "shell:" in claudePlugins.ts (a deliberately textual rule against shell options); the note said "In a shell: claude plugin …". The canonical run on stabilize/v0.20.0 36858e7 caught it. The rule is unchanged; the words are.
…ing answers Linux CI (dispatch run 38803613336, ubuntu shard 1/2) showed the answer on screen while the journal record was not yet written, so the exactly-once check read no record. The test now counts the command's records before it runs and waits for one more; the product behavior is unchanged.
…or its journal record
raiseCatError
added a commit
that referenced
this pull request
Oct 15, 2026
…tion and the workspace UI proposal Records the maintainer's first physical QA: triage, diagnostics A-C before and after (exact bytes), root causes, the branches and backport map, every canonical and CI run on the stabilization heads (failed runs kept with their causes), draft PRs #395/#396, and what still needs a person. Adds the final sidebar/Git decision proposal (recommendation: delegate, then retire) and the Setup navigation proposal. No release branch, tag or PR target changed.
raiseCatError
added a commit
that referenced
this pull request
Oct 16, 2026
…a20, qa19r, qa20r) Physical QA must test the stabilized candidates (#395, #396), but the launcher only knew wt/v019 and wt/v020, which hold the original candidates. The new nmsh_qa_stable commands run a read-only build of one pinned commit, verified before every launch (commit, tracked sources, dist digest, the build's own identity), in a QA directory that records that build; reopening uses the same build and refuses a service of any other. Original QA directories and their running services are untouched; cleanup is explicit and asks first. zsh docs/development/nmsh-qa.test.zsh: 78 checks (selection, wrong commit, wrong session identity, reopening, isolation, cleanup).
Physical QA found theme settings scattered across Prompt and Appearance, with Chroma offered in both and the rows that depend on a theme shown before it. The approved order (workspace-ui-decision.md): - Look (formerly Appearance) follows Terminal: theme family, variant, accent, theme text, UI chrome, then Chroma with its dependent rows under it. It is the only place Setup chooses Chroma. - Prompt shows Chroma as a read-only line; Enter goes to Look's Chroma row. - Motion starts with Reduced Motion, Decorative effects, Shimmer and Milestone effects, above the motion rows they govern; the Shimmer sample preview moved with its row. - Cursor follows Motion; the remaining steps are unchanged. /setup look and /setup motion are listed; /setup appearance and /setup chroma still work. /setup chroma now selects the Chroma row itself: its index was counted over hidden theme rows and landed on Theme Studio. Saved values and every setting's reachability are unchanged (tests/setupOrder.test.ts).
The maintainer's decision for v0.20 (workspace-ui-decision.md): the docked sidebar and detail panel are not presented as finished features. - New setting workspacePanels, Off by default and Off for any configuration without it; nothing else in a saved configuration changes. Settings → Layout → Workspace sidebar & panel and Setup → Editor show it, labelled experimental. - Off: /sidebar, /panel and their focus forms open nothing and say how to turn them on; keymap.json workspace bindings are kept but take no key, and /keys says so; the PTY keeps every column. Turning it Off closes open regions and returns focus to the composer. - One gate on the actions that open or focus a region (WorkspaceHost.perform); geometry, PTY sizing, passthrough and focus are unchanged when it is On. - /worktrees, /sessions, /github and /background never depend on it. - Help, command descriptions, the Ask concept, CHANGELOG and physical QA pass 1 (1.0a–c required; the docked regions as optional 1E, recorded Deferred) say the same.
Owner
Author
Update 2026-10-16: new head
|
Owner
Author
|
Integrated: |
4 of 21 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Physical-QA stabilization for v0.20.0. Draft: do not merge. It targets
release/v0.20.0(c71a4284), whose head and evidence are unchanged; merging needs the maintainer's physical retest and approval./copy, queue preview and review, Setup previews).fix/v020-task-ux): readable at rest, finished tasks shown briefly with their outcome (6 s, 30 s after a failure) and then left in/background, narrow non-ambiguous marks, the menus' selection band.fix/v020-claude-defer): turning Claude plugins on or off from NMSh is off by default (never verified against a live account); the inventory and Inspect stay; behindNMSH_EXPERIMENTAL_CLAUDE_PLUGIN_TOGGLE=1. Physical items 4.1–4.3 are deferred, not passed.docs/development/workspace-ui-decision.mdon the release-train branch.Details and the remaining physical QA are in the release ledger.
Verification
verify:release: runs on36858e76(fail 2: the portable-mod gate rejected the words "In a shell:" in the deferral note; reworded, the gate unchanged) andaff3f8cc(fail 1: a new test read the journal before it was written; fixed in23fcb4f4) are kept. The result on the current head is reported in the release ledger and below once complete.