Commit Graph
9706 Commits
Author SHA1 Message Date
Neil 4ae8674cd5 fix(updater): preserve Linux recovery across stale events 2026-08-31 05:48:39 -07:00
Neil 4e74c322c1 fix(linux): move deb/rpm update installation outside Orca 2026-08-31 05:48:38 -07:00
Neil af45dd41fb docs(linux): document local RPM build prerequisites 2026-08-31 05:48:38 -07:00
Neil a4d2b09f87 fix(linux): preserve CLI link during package upgrades 2026-08-31 05:48:38 -07:00
Neil b29bec1121 fix(linux): complete deb/rpm package metadata 2026-08-31 05:48:38 -07:00
Neil 107f8fbd9f test(linux): record native AppImage startup evidence 2026-08-31 05:48:38 -07:00
Neil c2ecbf95a8 test(linux): reject non-executable AppImages 2026-08-31 05:48:37 -07:00
Neil 79301792df fix(linux): keep local package targets aligned 2026-08-31 05:48:37 -07:00
Neil 23a0a829b1 fix(linux): make local package architecture explicit 2026-08-31 05:48:37 -07:00
Neil 8c7eb06b51 fix(linux): bind AppImage names to architectures 2026-08-31 05:48:37 -07:00
Neil a9f68aa7cb fix(linux): harden AppImage desktop startup oracle 2026-08-31 05:48:37 -07:00
Neil 5fc80c368b test(linux): preserve AppImage startup failure logs 2026-08-31 05:48:36 -07:00
Neil 300a94abe5 fix(linux): bind AppImage runtime and desktop startup checks 2026-08-31 05:48:36 -07:00
Neil 58fe0411c5 fix(ci): route headless pairing package contracts 2026-08-31 05:48:36 -07:00
Neil 651d93c26d fix(linux): verify static AppImages before publishing 2026-08-31 05:48:36 -07:00
Neil cf6c6292eb fix(linux): require static AppImage runtimes 2026-08-31 05:48:36 -07:00
Neil f95b0c957e test(linux): bound shutdown cleanup grace 2026-08-31 05:48:35 -07:00
Neil 22da34b604 test(linux): poll shutdown readiness without tail leaks 2026-08-31 05:48:35 -07:00
Neil 6beeb1c203 fix(ci): route all Linux packaging contract changes 2026-08-31 05:48:35 -07:00
Neil 7864f529d9 ci(linux): give package contracts timeout headroom 2026-08-31 05:48:35 -07:00
Neil 50813a76d8 test(linux): add startup margin to shutdown oracle 2026-08-31 05:48:35 -07:00
Neil f9d226bd02 test(linux): tolerate readiness timeout boundary 2026-08-31 05:48:34 -07:00
Neil eec969499e test(linux): signal AppImage serve owner directly 2026-08-31 05:48:34 -07:00
Neil d8fde15eb5 test(linux): avoid buffered serve readiness detection 2026-08-31 05:48:34 -07:00
Neil 266e6c6541 test(linux): add a packaged-artifact contract for the CLI launch paths 2026-08-31 05:48:33 -07:00
Neil 7e7ca31adf fix(linux): fail serve when no display is available 2026-08-31 05:48:33 -07:00
Neil 4500dfcea5 test(packaging): split runtime resource checks 2026-08-31 05:48:33 -07:00
Neil 8c83dcd781 chore: format reliability gate manifest 2026-08-31 05:48:33 -07:00
Neil e356ca6cd9 fix(linux): preserve unverified external displays 2026-08-31 05:48:32 -07:00
Neil 95d1c82e2d refactor(linux): read display locks without a preflight race 2026-08-31 05:48:32 -07:00
Neil 71925a91e4 fix(linux): report a missing display instead of dying in uv_close 2026-08-31 05:48:32 -07:00
Neil 000f798033 fix(linux): strip injected Chromium switches from CLI args 2026-08-31 05:48:32 -07:00
Neil f7447ee8cf fix(linux): respect CLI flag value boundaries 2026-08-31 05:48:31 -07:00
Neil 0784a2e869 fix(linux): tighten CLI launch detection 2026-08-31 05:48:31 -07:00
Neil 20d0861e83 test(linux): cover AUR serve wrapper flags 2026-08-31 05:48:31 -07:00
Neil 63608160c1 fix(cli): redirect the open-url command before startup 2026-08-31 05:48:31 -07:00
Neil 093764b19f test(cli): cover command-named project selectors 2026-08-31 05:48:30 -07:00
Neil a23b98db9e refactor(cli): remove redundant command membership check 2026-08-31 05:48:30 -07:00
Neil f2f655677d fix(linux): stop CLI commands from falling through to Chromium startup 2026-08-31 05:48:30 -07:00
Neil 15e13881da refactor(linux): import bundled launcher directly 2026-08-31 05:48:30 -07:00
Neil cc575461c9 docs(linux): make headless AppImage extraction runnable 2026-08-31 05:48:29 -07:00
Neil f821ca0cca fix(linux): accept extracted AppImage runtimes with APPDIR only 2026-08-31 05:48:29 -07:00
Neil daff0b9301 fix(linux): fence AppImage terminal shim mounts 2026-08-31 05:48:29 -07:00
Neil 6c1a6d39c1 test(cli): assert registration lock serialization 2026-08-31 05:48:29 -07:00
Neil 657967f30a refactor(linux): trim AppImage CLI registration seams 2026-08-31 05:48:29 -07:00
Neil 307e9f0f7d fix(linux): give the CLI one entrypoint by extracting the AppImage once 2026-08-31 05:48:28 -07:00
github-actions[bot] 212c0e42a6 Update README downloads badge 2026-08-31 12:37:51 +00:00
Neil 75e5c996c1 perf(relay): stop ACK boundary scans at first pending boundary (#17491)
* perf(relay): stop ACK boundary scans at first pending boundary

* test(relay): pin PTY source boundary cleanup and guard ascending sends

The early-`break` in advanceCredit is only correct while sentBoundaries is
inserted in ascending sentEndSu order. Turn that implicit invariant into a
throw at the sole live write site (commitPtySourceSend), and assert the
post-state directly instead of inferring it from an iteration budget:

- assert the surviving boundary set after the 1,023-ACK benchmark
- cover the jump-ahead cumulative ACK that must delete many boundaries in
  one pass (the case an over-eager `break` would get wrong)
- cover the settleReservedPtySourceAck -> advanceCredit entry point
- drop an arithmetically-implied assertion and CI benchmark log noise

* perf(relay): reclaim ACK boundaries with a monotone cursor

The early-break Set scan still rebuilt a Set iterator per ACK, so V8 walked
delete tombstones and the drain stayed superlinear; the visit-count test could
not see it because it stubbed sentBoundaries with a generator over a private
Set. Replace the Set with an ascending boundary list plus a monotone cursor,
assert the real structure, and add a benchmark over the shipped code.

* test(relay): enforce ascending sent-boundary inserts in the collection

Move the ascending-order precondition into PtySourceSentBoundaries.add so
both insert sites are covered, and assert per-ACK span reclamation in the drain.

* test(relay): collapse ledger test record accessors into getDeliveryRecord

Rebase onto #17490 left two structurally identical internals accessors
(getCursorRecord, getBoundaryRecord); one typed accessor covers both.
2026-08-31 03:10:44 -07:00
Neil ae2eeff55d perf(relay): index PTY source-credit send spans (#17490)
* perf(relay): index PTY source-credit send spans

* perf(relay): maintain PTY source-credit retention totals

* test(relay): pin PTY send-cursor rebase across ACK reclaim

Cover the Math.max clamp branch in reclaimCreditedSpans where reclaim
removes spans at or past the send cursor, and widen the seeded fuzz case
to 20 spans per seed so the cursor actually traverses spans; assert the
cursor never overshoots the span containing sentEndSu.

* refactor(relay): drop dead retained-total helpers and pin retention counters

The incremental PtySourceCreditRetention counters replaced the recompute-from-records
helpers; delete the now-unreferenced exports and recompute the totals from the live
records inside the ledger tests so the counters have an independent oracle.

* test(relay): bound send-span reads instead of pinning the read pattern

Address review feedback on the send-span cursor coverage:
- replace the exact indexed-read pin and the tautological naive-visit
  assertion with a linear bound that still fails on the old Array.find path
- drop the per-run bench console.log
- assert retention totals immediately after rotate(), the only path that
  removes and re-adds a record in one call

Also count the replacement delivery in retention as it enters the delivery
map so the "in deliveries <=> counted" invariant never has a hole.
2026-08-31 02:41:15 -07:00
Neil e17c98d425 fix(daemon): bound the whole boot-recovery sequence with one budget (STA-5732) (#17427)
* fix(daemon): bound the whole boot-recovery sequence with one budget (STA-5732)

* fix(daemon): keep socket probes inside recovery budget

* fix(daemon): size the recovery budget against the real post-kill tail

The 24s budget reserved only 9s for everything after the deadline, leaving
27s of the startup PTY gate's fail-open cap unused — and every unused second
is one where a daemon that would have drained gets killed with its live PTYs
instead. Reserve each post-deadline stage's actual hard cap (kill 10.5s, fork
10s, lease 5s) and spend the rest: 24s -> 32s of adopt window.

* fix(daemon): keep the last-resort endpoint rescue outside the recovery budget

The rescue probe in the launcher's outer catch was clamped to the recovery
budget's remainder, but it runs *after* that budget by construction — past
prepareDaemonReplacement, killStaleDaemon, the fork and the adoption lease.
The remainder is therefore essentially always negative, so Math.max(1, ...)
handed a live socket a 1ms connect window. On the loaded machine this path
exists for the probe loses to its own timer, the launcher rethrows, and a
recoverable degraded adoption becomes total daemon loss for the whole run —
the outcome the comment above it exists to prevent. Restore the 1s default
and pin the window with a test that drives the launcher to that catch with
the budget already spent.

Also make the deliberate narrowing legible instead of implicit:

- daemon-recovery-budget.ts: TRANSIENT_WEDGE_DRAIN_MS documented 20s as the
  grace #8697 sized, but #8697's merged second commit (840d3277d1) widened
  it to 11 retries ~= 60s. Record that 20s is the drain estimate and that the
  budget deliberately sits under #8697's shipped grace.
- daemon-init-wedged-daemon-grace.test.ts: pin the trade directly — a wedge
  draining after the budget is replaced and loses its live sessions.
- Rewrite 'preserves a daemon that stays wedged until the LAST allowed grace
  retry' onto the simulated clock. It never mocked Date.now, so its 12 probes
  elapsed ~0ms and asserted a retry grace the wall clock can no longer
  deliver; it now pins the last drain the budget still adopts.

* fix(daemon): name the socket probe default and correct the grace-retry rationale

Answers the review round on the budget accounting: the outer-catch endpoint
rescue is deliberately outside it, and the preflight clamp no longer duplicates
probeDaemonSocket's default as a bare literal.
2026-08-31 02:41:11 -07:00