summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAge
* Tty and Shell refuse a directory: not a shellGabriel Schneider3 days
| | | | | | | | | | A directory passes access(X_OK), so Tty /etc made a pane whose shell exited 127 and Shell /etc was taken. The shell lookup now refuses a directory, and both say "not a shell: /etc is a directory" (Tty and Shell share one refusal, host_io.Shell.refusal). shellset's golden takes the shared wording (re-recorded by name). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A REPL paste's Enter waits on the clock, not on stale core timeGabriel Schneider3 days
| | | | | | | | | | | | sendToRepl timed the Enter's fallback from stepped_ns, which in an idle detached session is as old as the last frame: the wait was over before it began and the \r went out with the paste, which 3.13's REPL then reads as part of it (4 of 5 sends lost their Enter). The wait now starts from the host's clock and is checked against now_ns; the REPL's echo of the paste still sends it sooner, and the wake is scheduled for the deadline. fs.py sends five times after two idle seconds each in a real pty. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A pane restored with unsaved text is asked about before it is thrown awayGabriel Schneider3 days
| | | | | | | | | Exit, Restore, Del and get warn only about a pane edited since it was opened, which its saved hash says (set at its first edit). A pane a Dump kept dirty came back with no hash, so a restored session quit at once over it. Restoring one dirty now gives it a hash its text does not match. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* dump.zig's tests run: nothing had included themGabriel Schneider3 days
| | | | | | | | dump.zig was imported by the code but by no test block, so its tests, the dump settings and restored-dot ones among them, never ran. The pardes test block imports it; they all pass. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The docs give the full-column refusal, an Edit block left open at close, and ↵Gabriel Schneider3 days
| | | | | | | | | | | | byte columns Round 11's doc findings: the skill names the full-column refusal beside the 64-pane cap; fs.md and the skill say an Edit block still open when its open closes fails with unmatched { and an err; and line:col's byte columns get the tip for character columns from tools (the same on ASCII, else a search or #n). A unit test pins the unmatched { at close. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A detached session with no frontend takes its size from the root ctlGabriel Schneider3 days
| | | | | | | | | | A --detach session nobody is attached to stayed 80x24, too small for an agent's panes, and nothing could change it. The root ctl takes size <cols> <rows> while no frontend is attached (refused while one owns the size), and a client that attaches later still sets its own (the server compares with the core's size). Documented with the 80x24 default. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Words from the workspace and column tags run in the session's directoryGabriel Schneider3 days
| | | | | | | | | | A command or Tty run from the workspace tag or a column tag started in the focused pane's directory, though those tags have none of their own. As acme's row and column tags do, they now run in the session's directory, where pardes started (Pardes.sessionDir); a pane's tag and text keep the pane's. The same for /tagexec, a column's exec and ctl. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* +Errors with no room anywhere logs its text rather than fail the EditGabriel Schneider3 days
| | | | | | | | | Edit's p and = put their output in +Errors, and when its column had no room the placement refusal failed the whole Edit. +Errors now tries every column with room, the last first, and with none its text is logged as msg records, a line each; the Edit succeeds. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An exec line over 1024 bytes fails the write, naming the limitGabriel Schneider3 days
| | | | | | | | | | A command line longer than the 1024 bytes a command pane takes was said on the message row after the write had already succeeded. An exec write (the root's, a pane's, tagexec, a column's) now refuses it before anything runs, EINVAL with "a command line is at most 1024 bytes" and an err record; a builtin's line, a long Msg or an Edit block, is not limited. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A failed builtin's err replaces its msg, and (xN) is a running totalGabriel Schneider3 days
| | | | | | | | | | | A builtin failing a ctl write logged its Verbose announcement, its words as a msg, and the write's err, so the same failure again never repeated the newest record and never collapsed. Its err alone is logged now (the msg is still shown and kept in +Messages). A repeat of a record a follower has read is a new line with the running total, (xN) being N in all. fs.md states both rules. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Shell refuses a name that is no executable, and bare restores the defaultGabriel Schneider3 days
| | | | | | | | | | | Shell took any word and the host quietly ran another shell at the next spawn. It now refuses a path or name that is not executable ("Shell: x: no executable by that name", failing a ctl write, logged err), a bare Shell goes back to the default, and a default $SHELL that is not executable falls back to /bin/sh. shellset's golden takes the refusal on the message row (re-recorded by name). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Edit's x, y and s match whole runes, as addresses doGabriel Schneider3 days
| | | | | | | | | | | mvzr matches bytes, and only the addr path widened a match to runes, so ,x/./a/|/ on é split it into invalid UTF-8 and ,s/./X/g gave a combining sequence four X's. Edit's matches now go through the same rune alignment (and an empty match steps a rune, not a byte). runeStart no longer walks a stray continuation byte back onto the ASCII before it: an invalid byte is a place of its own. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* No placement leaves a pane shorter than its tag and two rowsGabriel Schneider3 days
| | | | | | | | | | | | | | | | Placement could split a pane down to a tag and one row, or give a new one less. Every placement now checks the pane it made and each pane it shrank against its tag (wrapped at its width) plus two rows: where they lack the room, the column's tallest pane is halved instead, and where none can give it the new pane is refused with "no space for a pane in that column" (ENOSPC over 9P) and closed at the step's end, once its maker is done with it. splitBelow and splitParent leave two body rows (a boot layout, split before any row exists, is as before). Re-recorded by name: lookpanes (panes one or two rows lower) and splitparent (the 6-row squeeze now refuses); fs.py closes the scratches and long-named panes it no longer needs, since its 24-row session filled. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The default Shell is $SHELL, else /bin/shGabriel Schneider3 days
| | | | | | | | | | With no Shell set, pardes ran fish, which a box may not have and a user may not use. The default is now the user's login shell ($SHELL), else /bin/sh; an explicit Shell still overrides it. The tests pin their own shell (snapshots bash, the python suites /bin/sh or bash) and pass with SHELL unset; the Config report and docs say where the default comes from. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A read on a closed pane's event ends ENOENT, and the pane cap is ENOSPCGabriel Schneider3 days
| | | | | | | | | | 9ns reads an error's words, not its errno: "window shut down" came out as EIO where every other file of a gone pane gives ENOENT, and "no pane slots" as EIO. The event and pty/data reads a pane closed under now say "no such pane: its window shut" (ENOENT), and the cap says "no space for a pane: 64 max" (ENOSPC; 9ns has no word for ENFILE). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A pane closed with its question standing logs answer <serial> -Gabriel Schneider3 days
| | | | | | | | A follower that saw ask never heard the question end when its pane closed first. Retiring a pane with a question still up now logs answer <serial> - before its del. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A msg said again word for word is that line counted in the logGabriel Schneider3 days
| | | | | | | | | | 1000 Undos with nothing left made 2000 log lines: the Verbose announcement and the answer each time. A msg repeating the newest record is now that record counted, (xN), as err's already were (shared as pushCounting), unless a follower has read it; and a builtin's own words that start with its name take the place of its announcement just before them. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Undo and Redo with nothing left say so, and the write succeedsGabriel Schneider3 days
| | | | | | | | | A pane's Undo or Redo with no step left did nothing and said nothing. It now says "Undo: nothing to undo" (or Redo's) as a message, not a failure, so a ctl write of it still succeeds as acme's silent Undo does. The docs give the 256-step history. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* addr reads empty after a failed address instead of failingGabriel Schneider3 days
| | | | | | | | With no address after a failed write, a read of addr itself failed (EIO through a mount), which reads as a broken file rather than as no address. It now reads empty, as an unset limit does; data and xdata still refuse. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A limit write that fails keeps the limit it hadGabriel Schneider3 days
| | | | | | | | | A shell's > truncates limit, which lifted it, before the write; a write that then failed left no limit at all. The truncation now keeps the old limit until that open's write, and a failed write puts it back; a bare truncation still lifts it once its open is released. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Addresses snap to runes, not grapheme clustersGabriel Schneider3 days
| | | | | | | | | | sam and acme address runes; pardes snapped #n, line:col, dot and data's reads to grapheme clusters, so a lone combining mark or a CRLF's \r could not be addressed. #n, line:col, a search's match, dot (both ways) and data now land on rune boundaries (modal.runeStart and friends), and the tty's cell drawing is untouched. The README, fs.md and the skill say so. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A line address past the last newline is sam's empty line thereGabriel Schneider3 days
| | | | | | | | | Forward line addresses followed acme's number(), which refuses the empty line after a text's last newline, so 1 of an empty buffer and 2 of "a\n" were out of range and Edit 1i/header/ failed on an empty file. They now follow sam's lineaddr (editors/sam/address.c:180-215): #0,#0 and #2,#2. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A command line cut across writes runs once whole, and look/exec answer per openGabriel Schneider3 days
| | | | | | | | | | | | | | | | A mount cuts a write at its message size, and each piece ran on its own: a line cut at the boundary ran as shell commands and a 50 KB Edit block broke. An open of look, exec, tagexec, any ctl or a column's exec now keeps an unfinished last line, or an Edit block still open, until its next write or its release, and never runs a fragment. The same open record holds what its last write touched, which a read on it answers (as /net/tcp/clone does); an open that never wrote reads the session's last as of its open. A release that runs a held line waits for quiet and counts as a change; a clicked line with a control character is still refused at its write. Tested in unit tests, fs.py (python client, 8 KiB) and selfmount.py (the kernel mount, a 1000-line seq burst and a 50 KB Edit block). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The workspace tag has /tagexec, every exec file reads back what it touched, ↵Gabriel Schneider3 days
| | | | | | | | | | | | | | and a tag's words log as the session's /tagexec runs a word as a click in the workspace tag, as col/<serial>/exec does in a column's. A column's exec was write-only; it and /tagexec now read back the serials the last write touched, as /exec does. A click in a tag no longer goes to the focused pane's event reader, and what a word run from a column's ctl or exec or /tagexec says is logged msg -, not against the focused pane. The README, fs.md and the skill say so, and document the answer record. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Every answer to a pane's question is logged, answer - includedGabriel Schneider3 days
| | | | | | | | | The log said ask but never what came of it, so a follower could not tell a question taken back from one still standing. answerQuestion now records answer <serial> <choice|-> whichever route answered, key or ctl; a key the question does not offer is -. (Docs are in the tagexec change.) Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A look's miss repeats the path whole, up to 256 bytesGabriel Schneider3 days
| | | | | | | | | The miss message clipped what was looked at to 48 bytes, mid-word, and a path past 160 bytes turned the has-no-line message into a bare no match. Both now carry up to 256 bytes, cut on a character boundary with an ellipsis past that. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* An error on a column's ctl, exec or rmdir names that file in the logGabriel Schneider3 days
| | | | | | | | noteError named every column node col/<serial>/tag, so a refused ctl write or rmdir pointed at the tag. It now names col/<serial>/ctl, /exec, /tag or the directory itself. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Kill stops a command pane's whole command, its & jobs includedGabriel Schneider3 days
| | | | | | | | | | With job control on, a command's & jobs get process groups of their own, so Kill's signal to the foreground group and the shell's group left them running, orphaned. A stop of a command pane now signals every process group in its shell's session (Linux; a /proc scan). Jobs still outlive a command that exits on its own. Docs and the skill say it per route. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* $ may end any alternative in a pattern, not only the lastGabriel Schneider3 days
| | | | | | | | | | mvzr refuses $ anywhere but at the very end, so /h$|zz/ and Edit ,x/r$|pi/ were bad patterns while /zz|h$/ worked. Its matcher already ends an alternative at .end, so a build-time patch, anchor-checked like the group one, lets $ stand before | and ). The upstream report is in docs/mvzr-group-backtrack.md. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A look at file:/re/ on an open pane goes on from its dot, and a miss leaves itGabriel Schneider3 days
| | | | | | | | | Look's clean start cleared the active pane's selection before the address read the dot, so the root look's file:/re/ always found the same match, a miss collapsed the dot to a caret, and dumps kept the collapsed dot. A pane already open on the path is now addressed where it stands. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The look walk goes on from a restored dot both waysGabriel Schneider3 days
| | | | | | | | | | | After a Restore the dot came back on the match it was on, but N stayed on that match instead of wrapping to the last as it does live: the walk remembers the spot it landed on (look_at), and a restored pane has none, so it stood at the cursor, the selection's end, and found the match it was in. A one-row selection now counts as where the walk stands, from its start and past it either way, as a landed spot does. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A pane renamed but never edited closes on the first DelGabriel Schneider3 days
| | | | | | | | | | | The GUI golden's wide-glyph pane, renamed and never edited, was refused by Del as modified, and every frame after it kept the pane. A rename marks a pane dirty, but its text is what it loaded: the check now asks whether the text was ever edited (its first edit keeps a hash of what it had), not only whether it is dirty, as get's refusal does. Tests that faked an edit by the dirty mark alone now fake the hash too. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The tree's README fits its 45 lines again, and fs-discovery-test knows the ↵Gabriel Schneider3 days
| | | | | | | | | | | | new entries /README had grown to 51 lines with the layout files and the round 8 notes, past the 45 the discovery test holds it to. It is condensed (the log's record names on one line, the column files on one, two examples fs.md covers), and fs-discovery-test lists layout, tag and col, reads /index's new last field, and reads /commands' setting values. Co-Authored-By: Claude Opus 5.5 <[email protected]>
*-. Merge: 9P rounds 7-8 + layout files + loose ends + G3 cursorGabriel Schneider3 days
|\ \
| | * G3: the focused cursor glides a jump on the Motion flavour's springs, and blinksGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The core owns the motion, as Lift: animation.CursorGlide keeps the focused cursor's four corners on springs (leading corners at the flavour's pace x2.4, trailing ones x follow, so a jump smears and collapses; a long jump bows by the flavour's arc), sampled at each frame's own time. A step of a cell or less, insert mode, a focus change and any scroll (a file's view, a terminal's output) land at once; a snap lands a glide under way too. The quad is clamped to the focused pane when drawn (never its springs). Chrome carries it on the wire (cursor_glide: bit 1 a cursor, bit 0 gliding; cursor_alpha; cursor_quad, grid cells; cursor_idle_ms): the GUI draws the quad as an overlay in the cursor's colour, at 85% (70% on the long flavours) rising to solid as it lands, and hides the cells' cursors while it does: one or the other every frame. Only the focused cursor glides. Blink (CursorBlink, on by default in pixel shells) is the shell's: from cursor_idle_ms and when the frame arrived, solid while typing and 500 ms after, 530 ms halves with 80 ms eased edges, solid after 10 s idle, and never while the window is unfocused or minimized or on a virtual clock. An edge redraws the last frame with no core render (level B, blink_redraws); an attached GUI blinks from the same field without a frame per edge. Tests: snaps a cell, glides a jump with smear and bow, arrives under a pixel by 150 ms on smooth and lands exactly, shifts with a scroll; blink holds, eases, stops; the core glides a jump (ge) frame by frame (gliding exactly while it moves, alpha rising, exact at rest), snaps a step (j) and a switch to insert mid-glide; a terminal's scrolling output lands its cursor; wire round-trip of the cursor record. Shared files: src/animation.zig, src/pardes.zig, src/config.zig (toggle CursorBlink), src/surface.zig, src/detached/wire.zig.
| * | The QUIC listener tests are deterministic, and fs-test --quic passesGabriel Schneider3 days
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | "Unix TCP and QUIC share one listener" failed 17 of 360 runs under load (12 parallel copies), always at p.fs.opens: the client had hung up but its connection's task had not yet seen it, reset() then cut the connection, and the releases the hangup owes were refused as the old editor's. The test's replacement editor is the same editor, so those opens stayed. It now waits (resting, with its own deadline) for the runner to empty before reset: 0 of 360 after. fs-test -Dquic=true failed too, at two points. A session Looking at its own tree through a QUIC mount is features.txt's documented "left as they are" case (QUIC is answered on the editor's thread); that check is dropped with a note. The /screen check asserted body text that the view may have scrolled past (2 of 7 runs); it now asserts the pane's tag. 10 of 10 after. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | The tree's README and fs.md answer round 8's doc questionsGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | | | The README's log line names newcol, delcol, ask, restored and restoredcol; it says what $m is under 9ns --unix; and a build that embeds no sources no longer lists src/ (derived from the build, and tested). fs.md says what the rest of a typed line does after Kill for each shell (fish runs on, bash abandons it), that Exec <text> in a .py pane runs a command and never the REPL, and why appending to a tag wants printf and a leading blank. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | Edit's refusals name the pattern, not the line, and say when dot is emptyGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | | | A ctl Edit that missed answered `Edit: no match for regexp "Edit /nomatch/d"`, quoting the whole program; it now names the address that missed (`no match for regexp /nomatch/`) and quotes no line after. An s on an empty dot says `no substitution: dot is empty`. A \\1 is blamed only once its pattern has matched, as before. tags.md says & is special in s and not in c, a or i, as in sam. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | Restore keeps each pane's dot, as acme's dump doesGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | A restored text pane came back with its caret at its view's top, whatever had been selected. The dump now keeps each text pane's dot, q0 and q1 as acme's keeps a window's, and Restore puts it back without moving the view it kept. Two look-walk tests that restored and walked on now start from the match they were on. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A column has a ctl, an exec and an rmdir over 9P, and Restore maps its serialGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | A script could read and write a column's tag but not act on the column. col/<serial>/ctl takes Delcol, Joincol, New and Tty, each acting on that column as from its tag; col/<serial>/exec runs a word as a middle click in the tag; rmdir col/<serial> closes an empty column and refuses one with panes (ENOTEMPTY, an err record saying why). The root ctl's refusal of Delcol and Joincol points at col/<serial>/ctl. A dump keeps each column's serial and Restore logs restoredcol <old> <new>; the dump golden gains them. Documented: Joincol's survivor, the column on the right, keeps its serial and tag. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A terminal's body reads as logical lines, the last one ending in a newlineGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | A terminal's body came back as the screen's rows, a long line cut where the terminal wrapped it and the last line with no newline. The body (and a terminal's Save, and the length its ctl reports) now joins wrapped rows by ghostty's wrap flags, as pty/run's output does, and ends the last line with a newline. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A focus write makes its pane's column the active one, and layout's active is itGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | | | Writing a serial to /focus gave that pane the keyboard but left the active column where it was, so pane/new under Placement acme went elsewhere, and /layout's active named the keyboard's column rather than where a new pane would go. A focus write now sets the active column as the user's click there would, under either Placement, and /layout's active names the active column, which pane/new and a look place into. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A desktop session holds 64 panes, and every route that finds none free says soGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | | | | | | | Sixteen panes was far too few for a real session. MAX_PANES is now 64 on a desktop and stays 16 on the board; the 48 more slots cost about 3.7 KB each in fixed tables (the core 1.33 to 1.45 MB, its surface 19 to 72 KB), and a pane itself (84 KB and its terminal) is allocated only when it opens. At the cap, pane/new fails with `pane/new: no pane slots: 64 max` and an err record rather than a bare ENFILE, a 9P look or exec that would open a pane fails its write with the same words and reads back empty, and New, Tty, Tutor and Alt-n say it on the message row (their ctl writes fail with it). Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A repeat inside a regexp group gives back to what follows the groupGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | On aab, /a+ab/ matched but /(a+)ab/ and /(a*)ab/ missed, and so did (.+)_area and ([a-z_]+)_area, in addr, Edit and look alike. mvzr's hasAlt counts a group's own ) as an alternative, so every group with pattern after it takes matchGroup's alternatives branch, which never tries a repeat's shorter matches. No newer mvzr fixes it (trunk is the pinned commit), so the build patches the fetched source as it does the step budget, anchor-checked: when the rest fails after a group, the group's shorter matches are tried, longest first. docs/mvzr-group-backtrack.md is a report for upstream. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | Columns are named by stable serials over 9P, as panes areGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | | | /col/<n> named a column by its index, which shifts when a column left of it closes: exactly what scripts trip on. A column is now /col/<serial>, its serial kept while it lives and never reused; /layout lines give serial and index (`<serial> <index> ...`), active names the serial, /index's last field is the column's serial, and the log says newcol and delcol with serials. Docs, the skill and the tree's README say so. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A pane's last row of text is no resize handle; the grip is, and the GUI's ruleGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A press on a pane's last row began a seam drag, so the row could not be clicked or swept like the rest of the text (rsearch dragged the handle out of the way first). Now no row of text is a handle: in the GUI a press on the 2 px rule between two panes drags their seam, and anywhere the grip does, as acme's button moves a window -- dragged up or down its own column it moves the pane's top, either pane down to its tag alone (acme's coldragwin), dragged down inside itself too. The hover hint over a last row is gone; column edges resize as they did. Scripts that dragged a seam drag a grip instead and match their goldens; six goldens lost the hint or moved a cursor to the clicked text, re-recorded by name. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | The tree serves the layout: /layout, /tag and /col/<n>/tagGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | | | | | | | A script could not see where the panes sit or edit the tags a person clicks in. /layout lists each column, its index, x and width in cells, current or not, empty or full, and its panes' serials, then the active column; /tag is the workspace tag and /col/<n>/tag a column's, read and written as a pane tag is (one line: a newline written in is a space, and a truncating write drops the one ending it); /index's lines end with the pane's column; the log says newcol <n> and delcol <n>. acme serves no column files, and the docs say so. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A dump keeps the settings changed from a fresh session's, and Restore sets themGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | | | A session running with Placement pardes came back from Restore as acme: a dump kept the layout and the theme but no setting. It now keeps every setting line that differs from a fresh session's, as the root ctl reads it, and a Restore applies them; the theme stays where it was kept, the font the frontend's, and REPL bindings are still dropped. The dump golden gains the three the snapshot harness sets. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A GUI-only setting says so on a terminal, and DumpDir reads back its directoryGabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | `Lift on` over ctl on a terminal answered "unknown control message" while Config listed Lift as unsupported, and the ctl's DumpDir line read bare while Config showed the path in effect. A setting word this frontend lacks is now refused as `Lift is GUI-only` (GripWidth too), and DumpDir reads back the directory in effect, as Config does. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* | A write to a closed pane's file says it is gone, and a terminal says why it ↵Gabriel Schneider3 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | takes no name `echo Del > pane/6/exec` just after pane 6 closed failed EACCES: the shell's lookup failed, it tried to create the file, and the engine refused every Tcreate as a permission error. pardes now takes Tcreate itself: refused as before (acme's fsyscreate refuses it too), ENOENT in a pane that has closed. Renaming a terminal was refused with only EPERM; it now says a terminal is named by its shell's directory, worded so a mount still maps it to EPERM. Co-Authored-By: Claude Opus 5.5 <[email protected]>