Repository navigation
Execute the Rust cutover: drive PR #260 to a merged 0.1.0 release #261
Description
Execution ticket (wayfinder:build) for the follow-on effort that map #248 defers
to its own map with an execution override. The plan is decided (#248, tickets
#249–#255, docs/rust-rewrite-plan.md); this ticket is the doing: finish PR #260,
turn CI green, then merge and ship the first Rust release.
Where it stands
- Branch:
rust/big-bang-port— PR Rust port of devlaunch (big-bang cutover, 0.1.0) #260 (open, mergeable, not draft). 24 commits. - The port is functionally complete: four-layer Rust workspace under
rust/
(runner → tool clients → domain → flows),dl+aidbinaries, ~1410 Rust tests
incl. 108 binary-boundary tests against Python goldens, parity manifest empty,
spec ledger 0 pending,compare.py10/10 SAME. - A six-angle adversarial review ran against the finished tree; every material
finding was reproduced and the fixes are committed (waves 1–2 + CI-fix commits). - A post-review tree audit re-confirmed the in-PR fixes actually landed: R9
refresh-path fetch timeout (5s ls-remote bound; no unbounded fetch on any
user-facing path), R7 prune lock-wait notice, F1 migration-under-lock+reload,
the--forcegrammar, empty-id launch refusal, and the maturin wheel packaging.
The one gap it found — aid's SIGINT handler was a bare_exitthat skipped
dl's cleanup, leaking the staged GitHub token and orphaning theupchild on a
Ctrl-C mid-aid-launch — is now fixed (both binaries share one
dl::install_interrupt_handler; newaid/tests/interrupt.rsguards it).
Remaining work (the finish line)
-
CI green. The
rust-parityjob was deterministically killing the GitHub
runner at ~46m. Root cause: thelock_waitintegration test drovedl --prune
through.output()(blocks on stderr-pipe EOF that a detached refresh grandchild
can hold open), and its later 30s "deadline kill" usedkill -KILL -<pgid>with
no--, which procps parses as a signal word and no-ops — so nothing was killed
and an orphaned test binary held the step's log pipe open. Fixed in the last two
commits (stderr→file + process-group + a deadline that kills viaChild::kill
pluskill -KILL -- -<pgid>; CI step routes cargo output through a file). The
per-binary Test split inci.ymlwas a diagnostic — consider collapsing it back
to one bounded step once stable. The fix is confirmed: on the run before the
aid commit,Test dl lock_waitandTest dl interruptboth passed (the runner
no longer dies). aid's process-spawning interrupt test got the same log-pipe
fence. Verify the latest run is fully green before merging. -
File the pre-existing security findings PRIVATELY. The review surfaced host
RCE paths and path-containment issues that exist in the frozen Python too and
are therefore NOT introduced by this PR. They must NOT be disclosed in a public
issue or PR comment. The private write-up is with the owner; file via the repo's
private security-advisory flow, not the public tracker. (Details deliberately
omitted here — this is a public ticket.) -
Merge + release 0.1.0. Cutover ships as
0.1.0, version single-sourced in
Cargo.toml; both channels (PyPI maturin bin-wheel + prefix.dev conda) publish
from one tag on version change (publish.yml/conda-publish.yml), linux-64 only.
The releaseddl/aidflip from Python to Rust here. Rollback = pin<0.1.
Merge and release only on explicit owner go-ahead.
Constraints for the taker
- Work in the worktree
.claude/worktrees/rust-port; never touch the owner's primary checkout. - Don't disturb real running devpod workspaces; scope any
dlrun to a scratch
XDG_CACHE_HOMEand never run--purge/--pruneagainst the real cache. - Python is feature-frozen; the only legal Python change is an emergency 0.0.x fix
carrying a manifest debt row. - Post-cutover: Launch latency: dl <spec> -- <cmd> to a running command #139/Launch benchmarking: time-to-entrypoint as a tracked per-stage trend #193/New-branch launches can be based on a stale cache without saying so #244 resume against the Rust tree;
wfswitches from
shelling out todlto linkingdevlaunch-coreat-or-after cutover.
Closes the execution half of #248.
Activity
blooop commentedon Aug 19, 2026
CI status update (2026-08-19). Two distinct rust-parity blockers, in order of discovery:
Runner hang at ~46m — FIXED & confirmed. The
lock_waitintegration test drovedl --prunethrough a pipe that a detached refresh child held open, and its deadline-kill usedkill -KILL -<pgid>without--(procps no-ops that), so an orphan held the step's log pipe until the runner died. Fixed (commits on branch);Test dl lock_wait/Test dl interruptnow pass in CI.e2e interactive PTY tests fail — FIX IN PROGRESS. Once the hang was fixed,
rust-parity's tier-2 e2e reached the interactive suite for the first time in a while and 11test_interactive_session.pytests time out (never saw 'TTY-STATUS:HAVE', round-trips hang). Root cause: a prior commit madeProcessRunner::passthroughalways put its child in its own process group (setpgid(0,0)). That's right fordevpod up(so a Ctrl-C can kill the build), but the interactivessh -texec also goes throughpassthrough— and a child in its own group is not the controlling terminal's foreground group, so it stops on SIGTTIN when it reads the PTY. Fix: make own-group a per-call choice onSpawnSpec—devpod upkeeps it,ssh/gitdon't. The standalone Pythone2ejob passes throughout, which is consistent with this being a Rust-runner-only regression.Merge/release remain held for owner go-ahead.
blooop commentedon Aug 19, 2026
CI is fully green (run 32279756786, commit f3a9e79). All jobs pass —
rust-parity(both tiers incl. the tier-2 e2e interactive suite that was timing out),e2e, the py310–313 + default matrix,packaging, andgate. Both CI blockers are resolved: the runner hang and the interactive-ssh -tSIGTTIN regression.Remaining, both on owner go-ahead only:
0.1.0release.The PR is green and mergeable; nothing technical is outstanding.
blooop commentedon Aug 19, 2026
Status update (2026-08-19 evening): an independent review of PR #260 re-confirmed the finish-line claims — CI green on head f3a9e79, full cargo suite green locally, parity manifest empty, ledger 0 pending, release wiring verified (note: merging #260 IS the 0.1.0 release — Auto-publish fires on the merge commit since Cargo.toml already says 0.1.0, and CHANGELOG has the required
## [0.1.0]section).The three non-security follow-up tickets (#262/#263/#264) are now implemented on PR #265, stacked on this branch, so #260 itself is unchanged. Remaining here: the private security filing (with the owner) and the merge+release on explicit owner go-ahead.
blooop commentedon Aug 19, 2026
Owner-directed re-litigation (2026-08-19): merge + 0.1.0 is now gated on one more decision — #266.
With the port implemented and green, the owner directed a re-examination of what the cutover actually buys. The load-bearing benefit —
wflinkingdevlaunch-corein-process, killing the wire-skew bug class (#53's driver, #250's closure) — was re-measured against wf's actual code rather than the estimates:src/reap.rsplus one version-floor error message, not ~300; the rest ofreap.rsis deletion policy that survives linking unchanged.execs into thedlbinary for terminal handoff, so linking converts only the listing/rm calls — the binary stays in wf's world either way.dlfixes to wf for free viapixi global update; a crate pin costs re-pin → rebuild → wf release per devlaunch fix.Every other claimed benefit was either disclaimed at decision time (perf: one
devpodround-trip ≈ 5× Python startup) or doesn't materialize (distribution: same channels, narrowed to linux-64). The port's genuine side-yield — the bug finds, theDEVLAUNCH_DL_CMDboundary-test harness, the grammar fixes — is language-independent and is harvested under either outcome.Consequence for this ticket: the "merge and release only on explicit owner go-ahead" constraint stands; the go-ahead now waits on #266 — whether wf-in-process actually beats the wire seam, settled by a ~1-day prototype on wayfinder's side (or by an explicit owner call for the all-Rust ecosystem, which #266 names as a legitimate resolution). Since merging #260 is the 0.1.0 release, the gate sits in front of the merge itself. Everything else here is unchanged: CI stays green, the private security-fix flow proceeds regardless of the outcome.
Nothing about the port's execution quality is in question — #266 is about whether the premise pays, and both of its outcome branches (merge-with-retirement-conditions / harvest-and-close) are written down there.
blooop commentedon Aug 19, 2026
Shipped (2026-08-19). The cutover is complete; this ticket's three remaining items all closed tonight, in an owner-directed session ("finish everything related to this rust port"):
rust-parity, 5.6 min) and again onmainpost-merge.Pre-merge verification beyond CI:
--ls --jsonbyte-identical, metadata untouched.pixi global update devlaunch→dl 0.1.0/aid 0.1.0(static-pie ELF) on the host;--ls,--ls --json(21 rows),--reposall correct against the real cache; the release's first real-world write (the background refresh'slast_fetchedstamps) is format-identical to Python's spelling.Known non-blockers, tracked elsewhere: the Launch-benchmark workflow was already failing on
mainbefore the merge (bench-container pixi permissions — #193's territory, not a cutover regression); dev-loop names still run Python (#268); Python-tree + parity-harness retirement after soak (#267); API freeze finishing in the shrinking direction (#262, direction set by #266). Rollback remainspin devlaunch <0.1.