<feed xmlns='http://www.w3.org/2005/Atom'>
<title>pardes.git/tools, branch release-0.24</title>
<subtitle>Pardes</subtitle>
<id>https://git.0x4200.cafe/pardes.git/atom?h=release-0.24</id>
<link rel='self' href='https://git.0x4200.cafe/pardes.git/atom?h=release-0.24'/>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/'/>
<updated>2026-10-01T16:16:47Z</updated>
<entry>
<title>Builtins are chips that link to a glossary generated from the registry, and the virtual filesystem is drawn as a tree</title>
<updated>2026-10-01T16:16:47Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-10-01T16:05:10Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=f700b2af8e874c586e6996b8311c3983203c6637'/>
<id>urn:sha1:f700b2af8e874c586e6996b8311c3983203c6637</id>
<content type='text'>
#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 &lt;code class="word"&gt; 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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>The PDF benches share their clock, fatal exit, hash, count parser and effect drain, and lspprobe is lspbench's probe subcommand</title>
<updated>2026-10-01T03:12:17Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-30T01:58:53Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=b1485c97b493f7eaf65c6afdfb82e3065306b8fe'/>
<id>urn:sha1:b1485c97b493f7eaf65c6afdfb82e3065306b8fe</id>
<content type='text'>
B4: test/bench_util.zig holds what pdf_bench, pdf_pointer_bench, pdf_scroll_bench and pdf_sections_bench each copied (nowNs x4, fatal x3 named per bench, mix x3, parsePositive/parseCount x3, drainEffects x2). They stay four entry points: pdf_bench links its own mupdf module (with its C source and c_heap) where the others link the core's, which one executable cannot import under one name, and their reports and identities are each bench's own. pdf_sections_bench had rotted since the pane's cursor and selections moved to its body and the render revision became next_raster_revision; it builds and runs again. C6: tools/lspprobe.zig is lspbench's `probe` subcommand (zig build lspbench -- probe &lt;kind&gt; &lt;file&gt; &lt;line&gt;:&lt;col&gt;), and the lspprobe build step goes; docs/lsp.md names the new command.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Point docs and comments at the files code moved to</title>
<updated>2026-10-01T03:12:14Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-28T01:49:49Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=c8f0c25a854b8e169db08a84d1fdcd915a70aaa0'/>
<id>urn:sha1:c8f0c25a854b8e169db08a84d1fdcd915a70aaa0</id>
<content type='text'>
Documentation only, no code change: README's reading order and layout,
docs/design.typ's paragraph on where pane kinds and editor parts live,
docs/helix-keys.md's code map (normalInput and the executors now in
normal.zig and edit.zig, insertTab in edit.zig), docs/open-questions.md
(execute and ttyForDir in exec.zig), and the comments that named pardes.zig
for fold, Cell, takesCommandLine and runBuiltin (tools/gen_themes.zig,
themes/helix.zig, detached/wire.zig, host_io.zig, lsp_zls.zig).
docs/design.pdf is a retained fixture and is not regenerated.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Resolve relative restores in the dump directory and propagate LSP probe errors</title>
<updated>2026-09-15T20:24:42Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-10T13:57:58Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=6878e1c309172d624c0d7a3555f6f0217ae6770e'/>
<id>urn:sha1:6878e1c309172d624c0d7a3555f6f0217ae6770e</id>
<content type='text'>
</content>
</entry>
<entry>
<title>lsp: a protocol client for every other language, narrated on the message row</title>
<updated>2026-09-01T14:24:12Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-01T12:23:53Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=ae9325a5cb128d0d952afb8f9feaaca68e5e37a2'/>
<id>urn:sha1:ae9325a5cb128d0d952afb8f9feaaca68e5e37a2</id>
<content type='text'>
The seam grows a second backend: src/lsp/lsp_client.zig speaks JSON-RPC to
child language servers — rust-analyzer, clangd, gopls, tsserver, pyright are
rows in a spec table — while the in-process ZLS analyser keeps .zig. One
reader thread per server owns the socket, routes responses to a mailbox
under the conn mutex (monotonic condvar), answers server-to-client requests,
feeds the diagnostics store, and narrates $/progress and state changes
through a status sink both native shells post to the transient message row:
"rust-analyzer: cargo check 88% 955/1083" lands where a save narrates, with
the same clock. Chatty progress is throttled and deduplicated; settled
states always land, which is also what makes the goldens deterministic.

Nothing wedges and nothing healthy dies: waits are deadline-bounded, a
timeout cancels and returns no rows, three consecutive timeouts restart the
server ONLY while it is idle (an indexing server is narrating its own
excuse), spawn and handshake failures back off 10s to 2min, a crash shortly
after ready counts as a failure, and only a missing binary disables a spec.
PARDES_LSP_{RS,C,GO,TS,PY} override binaries; empty disables; the snapshot
harness pins RS to test/lspmock.zig and empties the rest.

Mutating answers really mutate now: the @put record beside rename @edit
carries per-range text, so = applies the formatter (both backends) and a
same-file WorkspaceEdit rename applies atomically, one undo step, narrated
("renamed 2 range(s)"); a multi-file rename previews as rows instead of
half-applying. Malformed responses fail closed: coordinates validated not
clamped, one bad TextEdit poisons the whole edit set, poison frames kill
the connection instead of buffering forever, decoded control bytes reject a
uri, hierarchy items too deep to reserialize are skipped.

Four kinds helix does not have, on SPC l: c/C incoming/outgoing calls (rows
are call sites), t/T super/subtypes. Pull diagnostics (3.17) preferred when
advertised. Help gains a language-keys footer for the motions no builtin
row could carry; lsp.rel and look.grep now share one path-shortening rule.

zig build lspprobe drives the seam from the CLI (comma-separated kinds share
one server); measured against a 1083-crate workspace warm: gd 26ms, gr 213
rows 165ms, incoming calls 212 sites 197ms, document symbols 670 rows 347ms.
docs/lsp.md tells the whole story; lsp-evaluation.md gets an addendum.
</content>
</entry>
<entry>
<title>host: the core owns the event loop; every platform becomes a vtable of optional methods</title>
<updated>2026-08-25T12:42:07Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-08-24T13:56:05Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=c3d0b84b7961ae26d2d654e7120821cc2d83d20d'/>
<id>urn:sha1:c3d0b84b7961ae26d2d654e7120821cc2d83d20d</id>
<content type='text'>
</content>
</entry>
<entry>
<title>big slow change: prebuilt shaders (SPIR-V/Metal), core gui reflow, docs, web + snapshot refresh</title>
<updated>2026-08-19T02:44:42Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-08-16T18:49:12Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=1551e409c31992437cb2fa864f576d45c8433801'/>
<id>urn:sha1:1551e409c31992437cb2fa864f576d45c8433801</id>
<content type='text'>
</content>
</entry>
<entry>
<title>macos: the AppKit shell, its icon, and the offscreen e2e harness</title>
<updated>2026-08-11T12:58:59Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-08-10T12:58:31Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=eb11ab331b4e13e2b9e5a673a4c012d22fdd1d9c'/>
<id>urn:sha1:eb11ab331b4e13e2b9e5a673a4c012d22fdd1d9c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>replace ArrayLists with bounded storage</title>
<updated>2026-08-10T12:17:07Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-08-09T13:41:33Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=9085cb5bfdd0b78ff3a62c0c71fc231dd7b5052a'/>
<id>urn:sha1:9085cb5bfdd0b78ff3a62c0c71fc231dd7b5052a</id>
<content type='text'>
</content>
</entry>
<entry>
<title>theme the selection colors</title>
<updated>2026-08-10T12:17:07Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-08-05T18:05:34Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=6eaa81710fee8ee2191a0b967b069bb01952be2e'/>
<id>urn:sha1:6eaa81710fee8ee2191a0b967b069bb01952be2e</id>
<content type='text'>
</content>
</entry>
</feed>
