summaryrefslogtreecommitdiff
path: root/docs
Commit message (Collapse)AuthorAge
* Incl dir ... adds directories a look at a name found nowhere else is tried ↵Gabriel Schneider43 hours
| | | | | | in, as acme's includename, <stdio.h> too; bare Incl lists them and Incl - empties them; the session's, seeded with /usr/include and /usr/local/include, kept in a dump; Indent's refusal says Enter keeps the indent always Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Putall saves every pane holding unsaved edits to a file, each as its own ↵Gabriel Schneider44 hours
| | | | | | Save, a refused one said and the rest saved all the same Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Get reads a pane's file again, refusing unsaved edits once as Del does, and ↵Gabriel Schneider44 hours
| | | | | | Get file loads that file into the pane; in a directory pane it reads the directory again. Load is Restore, as Put is Save; Abort's refusal says it is acme's debugging word Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Back and Forward keep to the focused file: Ctrl-o, Ctrl-i, the mouse's side ↵Gabriel Schneider45 hours
| | | | buttons (now the tty's 8 and 9 too), the builtins and 9P go to the nearest place that way in this pane, else in this file in another pane, else of any file; JumpScope all takes every place in order as before
* ideas: a Send builtin as an action beside Repl, sending a selection to a ↵Gabriel Schneider45 hours
| | | | | | terminal now Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A look at a directory opens a pane listing it, as acme's directory window: ↵Gabriel Schneider45 hours
| | | | | | named dir/, its entries in acme's columns (bytewise, dotfiles kept, a directory's marked /), a look at an entry from there, Get or a look again reads it again, never dirty, Save refused; DirLook terminal keeps ls in a terminal Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Two scripting clips: edit-via-ctl (an Edit written to a pane's ctl from a ↵Gabriel Schneider45 hours
| | | | | | | | | | | shell, then one Undo) and wait-editor (git commit with EDITOR='pardes --wait', its message a pane, Save and Del) record_demos.py: Esc goes to the test window as CSI u (ESC [27u): a bare ESC byte waited in the stdin feed's parser and joined the next mouse event, which then typed itself into the pane. clips.toml lists both with landing = false. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The reference gains Coming from acme, one table of what differs for acme ↵Gabriel Schneider45 hours
| | | | | | users and scripts; the intros say modelled on acme's; Look says it has no plumber; the guide compares Esc with acme's and answers the acme question fairly; the OTRUNC sentence reads Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The tutor opens with its title alone, and the slogan lines go: setup's ↵Gabriel Schneider47 hours
| | | | | | opening, the guide's and reference's "carry" framings, the tutor's "Two carry the rest" Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The guide shows the where-commands-run, columns and search clips in place of ↵Gabriel Schneider47 hours
| | | | | | | | | | | | their TODOs #clip takes `wide: true` for a recording that needs the page's full width; the columns clip (80 columns split three ways) uses it, the others keep the 640 px inline width. An inline video takes its own shape from its poster rather than a fixed ratio. where-commands-run's caption is trimmed to eleven words. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Three guide clips: columns (Newcol, a look into the new column, Alt-c), ↵Gabriel Schneider47 hours
| | | | | | | | | | search (Grep, n and N over +Search, a look at a hit) and where-commands-run (pwd from the column's tag and from a file's) record_demos.py: a clip may set its own window size (columns is 80x26, scaled to 960 wide), and col_tag_px finds a word in a column's tag. clips.toml lists the three with landing = false. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The guide's glossary is a definition list, and the site's tutor links its ↵Gabriel Schneider47 hours
| | | | | | | | | | | | pointers into the guide On the site the glossary is a <dl> of terms and meanings inside its <details>, with no stray count, so a text browser reads each term then its meaning. The tutor page links docs/typ/<chapter>.typ to that page, each "-> Guide: <section>" to the guide's section of that title (read from guide.typ's headings), and URLs; the tutor itself keeps its text. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The guide answers a first session: n walks a build's errors from its command ↵Gabriel Schneider47 hours
| | | | | | pane, a finished one is already normal, why make wants the project root, opening beside, a builtin's argument by mouse, 12G, and SPC ? is Help everywhere; the tutor's tagline and button names match the site, and the cheatsheet's tree gains data, look and exec Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The guide's Modes tables draw each mode's box, the unsaved pane's filled box ↵Gabriel Schneider47 hours
| | | | | | too, and Questions says what the name pardes names Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A chapter can show a recording: #clip(name), used once for the chords in the ↵Gabriel Schneider47 hours
| | | | | | | | | | | | guide's mouse section #clip reads docs/site/media/clips.toml. On the site it is the landing's video (poster, autoplay muted loop playsinline, controls) with its caption, and the in-view script that plays it now runs on every page; in the book it is the poster at 7 cm with the caption. The guide shows the chords clip under its mouse table, in place of the TODO. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The guide opens with one line and the annotated pane, drops the glossary ↵Gabriel Schneider47 hours
| | | | | | entries its legend shows, loosens its first half into short sentences and tables, and ends with Questions Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The landing's words jump to their recordings, the casts open on their ↵Gabriel Schneider47 hours
| | | | | | | | | | | | | | | | | | | | | | | telling frame, and #mode-box draws the box Each recording on the landing has an anchor (rec-<name>); the "What's in it" words jump to theirs (Terminals, PDFs, Images, Diff review, Scripting) and the recording's caption ends in a link to the docs; Language servers and Themes, with no recording, link to the docs. A cast's `poster_at` in casts.toml picks the frame it shows until it plays: live-text at the error, terminals at the copied line, petscii on the Mandelbrot; the casts wait for the in-view script to play them. A caption may hold markup: the 9P clip links 9ns to setup. The downloads give their size, read from project.download, and the footer links the changes (project.changes). The guide's annotated pane has alt text, pin 1 beside the workspace tag rather than on Changelog, and pin 5 on the body's text; pin positions are written with repr, since str puts a U+2212 minus CSS cannot read. #mode-box(mark, unsaved:) draws a pane's box as it looks, in print and HTML. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A chords clip for the guide: B1 sweeps and stays down, B2 cuts, B3 pastes, ↵Gabriel Schneider2 days
| | | | | | | | | | | | B2 then B3 copies, every held button drawn record_demos.py chords: a small notes file; each chord glides, stops, presses B1 and keeps it down while B2 or B3 clicks. The pointer wears a ring per button down and a mouse whose held buttons are lit, named "left held + middle-click" and the like; B1 is drawn blue. clips.toml lists it with landing = false, for the guide to embed. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The reference says an image's or terminal's petscii word is what is drawn: ↵Gabriel Schneider2 days
| | | | | | always on with no graphics, Petscii choosing for when they are there Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Install offers the built pardes 0.23 binaries first, each with its checksum, ↵Gabriel Schneider2 days
| | | | | | | | | | | | then building from source `project.download` in style.typ holds the version, the SHA256SUMS link and a file per program (the static terminal build and the window build, with what each needs); install.typ shows, for each, the curl, the sha256sum -c of its own checksum and the move into ~/.local/bin, then the clone and the build as the alternative. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The landing shows each thing once, lists what is in pardes, and the guide ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | | | | | | | | | | | | opens on an annotated pane The window shelf drops terminals-are-panes (`landing = false` in clips.toml; the casts show it) and keeps the PDF, image, make, diff and 9P clips. Captions say what happens: the live-text cast renames a variable, runs make and lands on the error; the 9P clip is a shell under 9ns where the session is a directory. Casts stack one per row at the page's width, each showing a frame of itself until it plays. Under the lead, a row of linked chips names what is in pardes: terminals, PDFs, images, language servers, diff review, scripting, themes. Install says how long the first build takes (62 s from a clean cache on 16 cores, measured with the dependencies already fetched), and `project` in style.typ has a `download` slot (url, sha256, arch) install.typ shows once a binary exists. #annotated draws a screenshot with numbered pins and their labels as text beside it; the guide opens with one of the orchard theme's shot: the workspace tag, a column's tag, a pane's tag, the box, the body and the scrollbar, before its glossary. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The hero clip middle-clicks make in the README's text, not a word added to ↵Gabriel Schneider2 days
| | | | | | its tag: text in a document runs as a tag word does Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The cast player keeps its colours in dark mode: the site's code-block rules ↵Gabriel Schneider2 days
| | | | | | no longer reach the player's own <pre> Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Every recording on the landing plays by itself, and only while it is on screenGabriel Schneider2 days
| | | | | | | | | | The GUI clips are autoplay muted loop playsinline with their controls, and every terminal cast autoplays and loops. A few lines of script watch them with an IntersectionObserver, playing each while a quarter of it is in view and pausing it when it leaves; without the script the videos still autoplay. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The terminal casts pin the orchard theme and show all four syntax colours, ↵Gabriel Schneider2 days
| | | | | | | | | | | | and the petscii cast opens its pictures on camera from a README pardes colours four syntax classes (keyword, string, number, comment), so main.c gains a comment to show the fourth; types and function names stay plain in any theme. The petscii cast starts on a README naming the pictures and the manual, right-clicks each open, no longer runs Petscii, and searches 'bit 21', which first appears on the CPUID page. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Show, don't tell: the guide, the tutor, scripting, setup and the landing ↵Gabriel Schneider2 days
| | | | | | lead show an example first and cut the prose it makes redundant; the reference's 9P tree and REPLs name Look and Exec Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The guide, the cheatsheet and the tutor point to helix's keymap for every ↵Gabriel Schneider2 days
| | | | | | key, and say where pardes differs Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The hero clip opens its output pane when make is clicked; the image clip ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | shows the Mandelbrot set and a seahorse-valley zoom, no Petscii; the landing lists the PDF and image clips first record_demos.py: text-is-the-interface starts on README and main.c alone, and the middle-click on make brings up the output pane before the right-click puts main.c on line 12. image-pane draws two PNGs, the classic view and a zoom into the seahorse valley; ls lists them, a right-click opens the set, Del closes it and a right-click opens the zoom. clips.toml and CLIPS run pdf-navigation, image-pane, pdf-tint-fit, then the hero, terminals, scripting and diff-review. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The remaining builtins in the reference, setup and the cheatsheet's 9P tree ↵Gabriel Schneider2 days
| | | | | | are written as #word, the window-only ones included, so each links to its glossary entry Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The landing's terminal casts are recorded: live text, terminals as panes, ↵Gabriel Schneider2 days
| | | | | | | | | | | | | and images and PDFs in a plain terminal, each a tty pardes that test/record_casts.py drives in a pty of its own as a plain xterm The script answers only what an xterm answers, so images fall back to PETSCII glyph art and a PDF to its text layer. It stamps each scripted step on a virtual clock and writes the cells the step changed, as pyte saw them, so the same input makes the same file. The petscii cast generates its Mandelbrot views and reads the Intel SDM (--pdf) through a symlink. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Builtins are chips that link to a glossary generated from the registry, and ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | the virtual filesystem is drawn as a tree #word draws a builtin as a chip on the tag's ground over a rule (Look and Exec in acme's look green and exec red), a <code class="word"> in HTML, and links it to its entry in a new Builtins chapter wherever that chapter is in the same output (the book, the site). The chapter is drawn from docs/typ/builtins-tty.json and builtins-gui.json, which `zig build builtins-json -Dplatform=tty|gui` writes from the registry and the Help rows (src/builtins_json.zig, tools/gen_builtins_json.zig; summaryOf in ninep/ctl.zig is now pub); style.typ merges them, marking the window-only words. The doc steps refresh their build's file first, and each build's unit-test fails when its file is stale. Everyday words first (`everyday` in style.typ), then groups by leader prefix as Help has them, then settings, the words with no path, debugging and internals, and last an A-Z index of every word. `zig build book` joins the doc steps. #fstree draws a directory tree with its connectors, a description column and links to the sections that document each file; reference.typ draws the served tree with it, each pane, pty and column file on its own line, and a test in config.zig checks it against ninep/tree.zig's files both ways. The cheatsheet has a two-level version. On the site the tree reads as `tree` text in w3m and wraps descriptions under the names on a phone. The site's tutor draws its B1, B2, B3 and 1-2 chords as mouse glyphs; the landing credits Plan 9 and acme, as does the book's title page; install.typ no longer lists the mirrors (the footer does). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Clicks in the site's clips stop, then click in place with a ring; the hero ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | | | | opens on all three panes; new clips show the PDF and image panes; the Themes gallery has a shot of every theme record_demos.py: a click glides to its target, stops, and presses and releases with the pointer still (a ring and the button's name on the press, a pulse after), pausing before anything moves. The hero's README, main.c and output pane are all up from its first frame. pdf-navigation and pdf-tint-fit page the Intel SDM vol. 2 (--pdf, read where it is): PdfSections to CPUID, a search stepped with n, PdfTint's three looks, PdfFit both ways and a page address. image-pane opens a Mandelbrot PNG the script draws, then Petscii. `record_demos.py themes` shoots one scene in each theme of src/themes, in the Themes order, into docs/site/media/themes with themes.toml (ready). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Builtins are written by name: each chapter and the tutor define Look and ↵Gabriel Schneider2 days
| | | | | | Exec once and then say Look and Exec; the cheatsheet draws every mouse button as its icon; one-button clicks (Alt is B2, Super is B3) are in the guide and cheatsheet; building says how to send patches to the list Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Prose that names a mouse button in words drops the glyph beside it, so a ↵Gabriel Schneider2 days
| | | | | | screen reader or text browser reads each click once Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs call pardes's scripting interface a virtual filesystem, served over ↵Gabriel Schneider2 days
| | | | | | 9P, and the guide opens on look and execute as the core idea Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The landing leads with live text and plays terminal casts first; the Themes ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | | | | | | | | | | | page gets a gallery; install starts at the clone The landing's own words sit in one `landing` record in site.typ: a lead on the core idea (any text is live: right-click looks, middle-click runs), where it runs, and a status line whose version is read from build.zig.zon. Recordings come in two shelves: "In a terminal", asciicast players from docs/site/casts/casts.toml (the first autoplays; all loop and fit the width; data inline, so they play from file://), then "In its own window", the GUI clips. asciinema-player 3.17.0 is vendored in docs/site/player with its Apache-2.0 licence, from `npm pack`. The Themes page shows #theme-gallery() from media/themes/themes.toml, a thumbnail per theme opening the full picture; on paper it is nothing. Both shelves and the gallery show placeholders until their files exist. `project` in style.typ lists the mirrors (sourcehut, git.0x4200.cafe); install.typ clones from the first and names them all, and the footer links each. The README clones before it builds. The scripting interface is a virtual filesystem served over 9P, never just a filesystem, in the tagline, captions and README. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The landing shows the four recordings, pardes is ISC-licensed, and the ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | | | | install lines fit a phone clips.toml names the recordings (text-is-the-interface, terminals-are-panes, scripting-over-9p, diff-review), each ready, its caption checked against what the clip shows. The first ready clip plays at the top, full width and on its own (autoplay, muted, looping), and the grid below shows the others, three across. Videos and posters keep the recordings' 960x700 shape. The footer links the source at git.0x4200.cafe/pardes and names the ISC license, from `project` in style.typ. LICENSE holds the ISC text, and the README names it and says the libraries keep their own (MuPDF, on by default, is AGPL). The install lines put their comments on lines of their own, and on a phone a shell line wraps rather than scroll its end away. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Scripts find the session as m=\$PARDES_MOUNT, else 9p; SPC q quits; upper ↵Gabriel Schneider2 days
| | | | | | keeps a selection's newline and its tag words once; the reference takes line files, init errors, dumps, dials and Save on +Tutor Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The documentation site's landing page has four short silent clips in ↵Gabriel Schneider2 days
| | | | | | | | | | | | | docs/site/media, recorded from a hidden test window by test/record_demos.py text-is-the-interface, terminals-are-panes, scripting-over-9p and diff-review: each a webm (VP9), an mp4 (H.264, faststart) and a poster PNG at 960 px, with captions.txt. The script drives a PARDES_TEST session on the virtual clock through stdin mouse events, keys and 9P, keeps the settled frame after each step, draws the pointer and loops each clip with a dissolve back to its first frame. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs become a website: a page per chapter, a landing page with ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | recordings, one Typst bundle run docs/site/site.typ writes every page in one bundle compile: the landing page (the tagline, the recordings listed in media/clips.toml, links to start from), a page per entry of `chapters` in style.typ, and the tutor. Every page shares a tag-line header with the chapter words; #doc links resolve to the right page and anchor; a chapter with four or more sections gets an "On this page" list. Links are relative and pages flat, so it reads from file:// or any static server. `zig build site` installs it to <prefix>/share/doc/pardes/site and fails plainly without typst. The look is 0x4200.cafe's lapis layout (framed panels, hard shadows, a tag-line trail, Departure Mono headings over Crimson Pro) in orchard's greens and amber, forestbones_light when the reader prefers light; both fonts are OFL and shipped. In HTML a key is one pill with its + and ›, and a mouse button is an inline SVG in currentColor. The tagline lives once in style.typ for the sheet, the book and the site, and the single page html.typ gives way to the site. The landing leads with one plain sentence (columns of panes, click to run or open, helix keys, scripts through files), then the tagline and a line on where it runs; a hero image is the first ready clip's poster; "Start: the guide" leads the links, "Hands on: the tutor" next, the rest a plain row; the captions use no undefined words. docs/typ/install.typ holds the install lines once: setup.typ has an Install section that includes it, and the landing includes it too. Building says up front it is for contributors and points at setup to install. In HTML the guide's glossary is a closed <details> (#glossary, the same heading and table on paper), each drawn mouse carries hidden text (left-click, hold left, click middle) for screen readers, w3m and copying, and the footer takes a source link and a licence from `project` in style.typ once decided. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs give back the day-one lines the trim cut, the tutor becomes ↵Gabriel Schneider2 days
| | | | | | exercises on a +Tutor copy, the README builds the GUI and says what a terminal needs, and Shift-Esc says it needs the kitty keyboard protocol Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs trimmed to their path: a guide with Words you'll see and one Where ↵Gabriel Schneider2 days
| | | | | | commands run and panes go table, scripting's first tag word Fmt and eight traps, setup as the one home of the pager and the servers, a scannable cheatsheet, an honest README, the edge cases moved to the reference, and the pager's colours Co-Authored-By: Claude Opus 5.5 <[email protected]>
* SPC q runs Exit, refused once over unsaved panes as the tag word is, as ↵Gabriel Schneider2 days
| | | | | | helix's :q Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A command line runs when its newline comes, or at its open's close, never ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | | | because a write was short: a long line cut by a mount is one line A write shorter than its message, and not a multiple of 4096, was taken as whole, its tail a line. 9ns cuts a FUSE write of up to 512 KiB into 65512-byte Twrites, the last one short, so a 600 KiB `Edit ,c/.../` arrived cut and its tail ran as an unknown control message; the 1 MiB refusal failed the same way. Each open now holds a partial line until its newline, or its release, which ends the last line; an Edit block is whole when it closes, as before. A name write with a NUL still fails its write at once. selfmount writes a 600 KiB Edit line and a 1.1 MiB line through a real 9ns mount; building.typ says how lines are cut. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Grep's miss says `Grep: text not found`: it is a literal search, and ↵Gabriel Schneider2 days
| | | | | | | | | "pattern" suggested a regular expression Still ENOENT through a mount ("not found" is in 9ns's table, and the unit tests' errno-words check holds it so). The guide's quote follows. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Shift-Esc always backs out: in every mode and pane it goes to the previous ↵Gabriel Schneider2 days
| | | | | | | | | | | | | | | pane, as Esc does from normal, and a raw program never sees it; Ctrl-b alone toggles raw Shift-Esc switched a terminal in normal or insert mode into raw, so the one key meant to get out of anything got a script or a person into a program instead. It is now handled before any mode: an open prompt is closed, insert mode left, a pending count dropped, and Last runs, the pane keeping its mode (a raw terminal stays raw). Ctrl-b is the only switch between raw and normal. The keymap's two chords become one, back_out; the cheatsheet row, the guide's mode table and the tutor say so, and the tty and builtins goldens are re-recorded. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs take round 36: empty names, get as an undo step, what a Dump keeps ↵Gabriel Schneider2 days
| | | | | | and Restore reads, Find and Grep caps and notes, the ctl read's collapsed and fit/tint, PDF search hits, ./x misses, 1 MiB lines, DumpDir, bad dials, /pager files, rename previews, Lspinfo, and --wait from an agent Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs take round 35: cloud9's errno table, Restore's parser words, insert ↵Gabriel Schneider2 days
| | | | | | after a match, LookWord list rows, the last-run awk without exit, command pane directories, rename previews, listings that keep the keyboard, set-value toggles, pty/run one line a write, /pager resolving, PDF :N:H, skipped directories and Lspinfo Co-Authored-By: Claude Opus 5.5 <[email protected]>
* addr, dot and limit on a pane with no text are refused `invalid address: ↵Gabriel Schneider2 days
| | | | | | | | | this pane has no text to address`, which a mount reads as EINVAL, not EIO 9ns maps a refusal back to its errno by its words; "this pane has no text to address" held none it knows. The reference quotes the new words. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* /pager's refusals say invalid, so a mount's shell hears EINVAL: `pager: ↵Gabriel Schneider2 days
| | | | | | | | | | | invalid directory "relative": must be absolute` 9ns maps a refusal back to an errno by its words, and "the directory must be absolute" and "one directory a write" held none it knows, so a shell through the mount got EIO for both. They now say `invalid`, as every EINVAL here does, and the reference quotes the new words. Co-Authored-By: Claude Opus 5.5 <[email protected]>