Skip to content

Release v0.0.48 - #293

Merged
queil merged 30 commits into
mainfrom
release-v0.0.48
Sep 22, 2026
Merged

queil merged 30 commits into
mainfrom
release-v0.0.48

Conversation

@queil

@queil queil commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

No description provided.

…ials cross-origin [DA-05] [D:contract-redirect]
Session.resolve rejects a NUL-bearing path with a located weir error
before Path.GetFullPath throws its raw ArgumentException (SIGABRT via
the parse resolver, raw .NET message elsewhere) — the one resolution
funnel every File/Proc/completion builtin shares. Extern.exists reports
a NUL-bearing program head as not-found so the parser emits its ordinary
missing-command diagnostic instead of aborting. NUL-free paths unchanged.
…ach, never hang or crash (STRIX-6) [D:yaml-depth]
@strix-security

strix-security Bot commented Sep 21, 2026

Copy link
Copy Markdown

Strix Security Review

Warning

This pull request has 13 commits after the last Strix review (b4601fd). Strix has not reviewed these changes.
Automatic review on push is off for this repository. To review the latest changes, tag @strix-security in a comment, or turn on re-review on push.

No security issues found.

Updated for b4601fd.


Reviewed by Strix
Re-run review · Configure security review settings

…A-03 e2e preview separator-agnostic

testSequenced does not isolate process-global PATH under the YoloDev
TestSdk (a concurrent list's echo saw the stripped PATH), so the
PATH-separator probe now PREPENDS its dir instead of replacing PATH —
sh/echo stay resolvable for every concurrent spawn. The DA-03 e2e
bound.weir asserts the absolute-under-A preview TAIL (Windows emits
backslashes and 8.3 shortnames the bash prefix lacks).
…Cwd()

Four cwd-mutating tests captured 'saved = Session.Cwd()' and restored to
it. Under the parallel runner that snapshots a CONCURRENT test's temp dir;
after that dir is deleted the global Session.Cwd is left pointing at a
deleted path for a sustained window, and every concurrent spawn test then
fails 'command not found: sh' (Process.Start cannot chdir there). This is
the real cause of the recurring sh/echo failures — NOT the PATH strip.
Capture Directory.GetCurrentDirectory() (never mutated) instead.
…tal-delivery on POSIX

The S1/DA-05/http-echo cells slept a fixed 0.6s before the weir client
connected. On a slow runner (macOS) the listener is not yet accepting at
0.6s and a connect into the bind race HANGS to the 30s client timeout
instead of refusing (exactly what awaitTcp exists for). Wait for the
listener. F8's GOT-FIRST asserts incremental chunk delivery, which Windows
HttpListener cannot do (it buffers the body, so an early chunk is not on
the wire when the producer's raise aborts) — a verified platform wall;
guard that half to POSIX, keep the streamErrors half everywhere.
F13 drives weir through a real pty to prove data ANSI/CR is neutralized
at a terminal. Windows Python has no termios/tty, so 'import pty' is a
ModuleNotFoundError and the cell dies before any assertion (it never
reached the redirect coda on Windows). Guard the whole cell to POSIX,
same as F8's platform-specific half.
…per-call scan

exists() only used the cache when already built; the None branch did a
per-call PATH×PATHEXT filesystem scan and never populated it. A bareword
';'-spine calls exists() once per head, so 20k heads meant 20k full scans
— ~20s on POSIX (already at the e2e ceiling) and >800s on Windows
(PATHEXT × slow File.Exists). Route through names(), which enumerates PATH
once and memoises; every lookup is then O(1). 20k spine: 20.3s -> ~1s.
The previous fix routed exists() through names(), which enumerates EVERY
file in EVERY PATH dir. That fixed the 20k-spine but regressed two things:
a one-command line (weir -e 'ls |> ...') paid the full /usr/bin
enumeration (~6ms -> 21ms, over the timing gate), and the Windows PATHEXT
test failed because the whole-PATH set was cached before the test wrote
its .bat mid-run. Memoise the per-name SCAN RESULT instead: a distinct
head pays one targeted scan then hits the cache (20k identical heads ->
one scan), a single head does NOT enumerate all of PATH, and each name is
scanned live on its first query (so a mid-run file is seen). names()
stays for completion.
Every other cwd-mutating list is testSequenced; lsTruthTests was left
parallel and mutated the GLOBAL Session.Cwd (setCwd temp dir, then delete)
in the parallel phase, racing the parallel spawn tests: a concurrent spawn
snapshots the temp cwd, this list deletes it before Process.Start, the
child dies 'command not found' (chdir fails). The GetCurrentDirectory
restore fixed the sustained leak (brief green) but not this TOCTOU, which
macOS's slower timing re-exposed. Sequencing removes it from the parallel
phase — no spawn ever sees a vanishing cwd.
…l Session.Cwd

runFile is Weir.Script.run (IN-PROCESS), so the DA-03 programs' 'within cd'
mutate the shared Session.Cwd. Left parallel, the list raced itself (two
DA-03 programs stomping each other's cwd -> a plan preview bound to the
wrong dir -> 'not absolute-A', exit 1) and the parallel spawn tests. This
is the macOS DA-03 failure. With lsTruthTests, this was the last parallel
cwd mutator; both now sequenced.
…heads)

The section feeds NUL-bearing data via #!/bin/sh shims used as command
HEADS (emitprog, emitnul, argvdump on PATH). A native weir.exe cannot exec
a shebang script and an extensionless name never resolves via PATHEXT, so
on Windows 'emitprog' reads as an unbound variable. The existing
'command -v sh' guard is insufficient (MSYS ships sh); require IS_WINDOWS=0.
The NUL-refusal itself is platform-neutral and unit-tested.
@queil
queil merged commit 84a30d4 into main Sep 22, 2026
3 checks passed
@queil
queil deleted the release-v0.0.48 branch September 22, 2026 20:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant