Commit Graph

5535 Commits

Author SHA1 Message Date
Peter Steinberger e907f412ca fix(ios): restore approval settings navigation and remove duplicate shell state (#130651)
* fix(ios): unify root navigation and restore approval settings routes

* fix(ios): align shell cleanup inventories and test entrypoints
2026-08-26 21:36:16 -07:00
Peter Steinberger 71d4a8c3e3 fix(parallels): main install and update smoke cannot complete (#130658)
* fix(parallels): restore candidate install and update smoke coverage

* fix(scripts): allow prepublish artifact imports from stdin

* refactor(parallels): remove obsolete server re-exports

* fix(parallels): require configured Windows gateway RPC readiness
2026-08-26 21:24:22 -07:00
Vincent Koc b7d9be0209 fix(ci): stabilize compact node shards (#129702) 2026-08-27 11:52:20 +08:00
Mislav Ivanda 3a5cb3847c feat(sandbox): add Daytona cloud sandbox backend plugin (#121554)
* feat: @openclaw/daytona-sandbox inital version

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* feat: plugin config params extended

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* feat: implement ClawSweeper review notes

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* fix(daytona): honor abort signals and clean up remote staging on failure

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* fix(daytona): register launcher as knip entry and refresh manifest schema

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* fix(daytona): cancellable session transport and auto-stopped sandbox restart

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* fix(daytona): deny egress by default and arm launcher cleanup before startup

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* fix(daytona): stop cancelled startup before submission

* test(daytona): satisfy deferred race lint

* test(release): update plugin publisher inventory

* fix(daytona): close provisioning and PTY cleanup gaps

* test(daytona): type PTY launcher mock

* fix(acpx): avoid promise-returning line handler

* fix(daytona): await PTY signal cleanup

* fix(daytona): declare ClawHub install route

* fix(daytona): forward PTY stdin EOF

* fix(daytona): serialize PTY input

* docs(daytona): document sandbox backend config

---------

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>
Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-26 20:52:12 -07:00
Peter Steinberger 4041937d5a test(parallels): keep snapshot restoration checks offline (#130638) 2026-08-26 20:19:36 -07:00
Peter Steinberger 372850d59f fix(tooling): resume PR checkouts after completed deletions (#130630) 2026-08-26 20:17:58 -07:00
Peter Steinberger 7602af0667 fix: remove unavailable OpenGrep install alternatives (#130585) 2026-08-26 19:20:09 -07:00
Peter Steinberger 9ccbbf83f2 perf(control-ui): load built-in theme palettes on demand (#130473)
* perf(control-ui): load built-in theme palettes on demand

Every built-in theme's tokens shipped in the startup stylesheet, so the default
path downloaded six palettes it never painted and each new theme taxed everyone.
That is what pushed the startup CSS ceiling from 45 to 47 KiB when Tide, Beacon,
and Phosphor landed.

Moves the twelve non-default palettes into public/themes/<family>.css, one file
per family covering both modes. Claw stays inline because its tokens are the
:root defaults, so the default path loses nothing and gains the bytes back.

The first-paint story this needed: index.html's boot script now links the active
family's palette during head parsing, which makes it render-blocking exactly
like the app stylesheet, so a persisted theme paints its own colours on the
first frame instead of flashing the default. The href is built from the mount
prefix the gateway already stamps on <html>, so it follows a configured Control
UI base path without the script having to know one. theme.ts keeps the link
correct when the theme changes at runtime, reusing the helper the webfont
stylesheets already use.

The nested resolve-theme ternary became a family table in the same script, since
it now picks an asset as well as a data-theme value.

  startup CSS  45.8 -> 42.2 KiB gzip, below the 44.3 KiB it measured before the
               three themes landed; ceiling restored 47 -> 45 KiB
  base.css     64.0 -> 35.8 KiB raw

Adds a regression test that blocks every bundle script and asserts the palette
still applies, so moving this back into the app bundle fails instead of silently
reintroducing the flash. Verified it catches that: with the boot-script link
removed the assertion reports `expected null to be '/themes/tide.css'`.

* fix(control-ui): publish themes after their palettes load

* fix(control-ui): clean up palette completion listeners

* refactor(control-ui): consolidate theme name resolution
2026-08-26 18:56:14 -07:00
Peter Steinberger 2d386c2ea6 fix(packaging): serialize packs when the docs map is already generated (#130538) 2026-08-26 18:01:28 -07:00
Peter Steinberger 35adcc6c6f test(scripts): pin assertion-ratchet SAFETY-comment scanner fix (#130191)
The raw skipTrivia=false scanner in collectSafetyCommentLines never
re-scanned the `}` ending a template substitution, so it lexed a
phantom NoSubstitutionTemplateLiteral that swallowed every later
comment in the file. #129769 already fixed this with per-line text
matching, but shipped without a regression test, leaving the fix
unpinned against reintroduction.
2026-08-26 17:50:10 -07:00
Vincent Koc 8afa8f339e fix(release): restore direct package Telegram acceptance (#129912)
* fix(release): provision package acceptance plugin registry

* fix(release): accept registry tuple in package dispatch

* fix(release): default Docker advisory input

* fix(release): bind artifact registry to package source

* fix(release): preserve package advisory dispatch

* fix(ci): bound hosted release gate checks

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>

* test(ci): update release-gate manifest fixture

* fix(ci): avoid duplicate release gate lint

* test(release): restore Docker helper fixture path

---------

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-27 08:32:19 +08:00
Dallin Romney cb1d892b3d fix(release): stage Codex for npm onboarding candidates (#130360)
* fix(release): stage Codex for npm onboarding candidates

* refactor(release): share candidate registry lifecycle
2026-08-26 16:58:45 -07:00
Peter Steinberger 395e5db41b chore(deps): refresh dependencies after seven-day cooldown (#130296)
* chore(deps): refresh cooled npm and plugin dependencies

* chore(deps): refresh cooled build and workflow tooling

* chore(deps): retain formatter compatibility

* chore(deps): retain lint compatibility
2026-08-26 16:13:18 -07:00
Peter Steinberger 1fc29beba2 refactor(state): fold singleton tables into config_machine_state at schema v12 (#129876)
* refactor(state): fold singleton tables into config_machine_state at schema v11

Eight singleton tables (skill_curator_state, update_check_state,
clawhub_promotions_feed_state, model_catalog_remote, voicewake_triggers,
voicewake_routing_config, voicewake_routing_routes,
onboarding_recommendations) were each one logical JSON value behind a
fixed key; their bespoke schemas, lazy ensures, and per-table accessors
collapse onto the shared config_machine_state KV under namespaced keys.
cron_store_epochs retires outright: it was born write-only in #114388
and no reader ever existed in any language. Durable values (update
check state, voicewake triggers and routing, per-workspace onboarding
answers) migrate insert-if-absent during the v10->v11 migration; cache
class contents rebuild on next use. Deferred with named reasons:
exec_approvals_config (macOS direct-SQL contract), installed_plugin_index
(same-tx lease fence), node_host_config and web_push_vapid_keys
(secret-table git-backup redaction).

# Conflicts:
#	src/skills/workshop/collection-review-state.ts
#	src/skills/workshop/collection-review.gateway-admission.test.ts

* test: register v11 guard carve-outs and suppression pin

The v11 migration module joins the raw-SQLite allowlist (migrations are
the named guardrail exception), the lint-suppression allowlist records
the second type-parameter suppression in config-machine-state, and the
identity module keeps only externally consumed exports.

* test: surface CLI stderr when migration-diagnostic assertion fails

* test: expect migration diagnostics on stderr for models plain commands

The #129037 pending-migration cases asserted that aliases/fallbacks
lists never open the state database, but config-health observation
(observeConfigSnapshot -> readConfigHealthStateFromStore) full-opens it
on any config read whose file exists — reproduced identically on clean
main with a main-built dist. The protected contract is exact stdout;
the diagnostic legitimately lands on stderr for every case.

* test: drop unused defaults import from CLI stdout e2e

* test: split session path derivation out of oversized session-files suite

#130016 pushed session-files.test.ts to 1008 lines, over the 1000-line
lint cap and red for every PR's check-lint. The sessionPathForFile
describe moves to a self-contained sibling following the existing
session-files.*.test.ts split pattern; no assertions change.

* refactor(state): fold four more singleton tables into schema v12

tui_last_sessions (cache-class, regenerates on next session switch),
sidebar_sections (persistent section order, migrated as one JSON array),
node_host_config, and web_push_vapid_keys join the v12 fold-in, taking
the retirement to thirteen tables at the same version. The two secret
singletons were blocked on table-granular git-backup redaction; backups
now exclude config_machine_state rows by secret key prefix (nodeHost.*,
webPush.vapidKeys) with a fail-closed row filter and regression proof,
so STATE_SECRET_TABLE_NAMES sheds both tables. The sidebar fold also
retires its lazy-ensure WeakSet and inline DDL; sidebar edits stay
inside the existing session-group write transaction via direct Kysely.

* fix(node-host): omit absent Cloudflare Access config like the column reader

The KV rewrite returned gateway.cloudflareAccess as an own undefined
property where the retired column reader omitted the key; toStrictEqual
consumers (state-migrations doctor-repair test) caught the shape drift.
Mirror the column reader's conditional spread at both construction
sites.

* fix(backup): disclose redacted machine-state prefixes after restore

The prefix-granular secret redaction recorded omitted key prefixes in
the backup manifest but the restore result exposed only excludedTables,
so a redacted restore looked complete while nodeHost.* and
webPush.vapidKeys configuration were intentionally absent. The restore
result and CLI output now disclose the omitted prefixes (JSON mode
carries them via the result shape), with restore-side regression
coverage.

* fix(tui): compare-and-delete retired session pointers

Doctor cleanup read matching pointer keys then deleted them
unconditionally, so a replacement pointer written between the scan and
the delete was erased. The delete now re-checks the stored value inside
the write transaction and only removes pointers that still name a
retired session; a live replacement survives (regression covered).
Also corrects the stale schema-version line in database-first.md.
2026-08-26 13:32:19 -07:00
Peter Steinberger fc2724d831 fix(release): normalize package tarball modes and prove non-root install (#130335)
npm/pnpm pack copy on-disk file modes into the tarball, and node-tar's
portable mode-fix only strips group/other write bits — it never adds
read bits. A restrictive-umask build host therefore ships owner-only
(0600/0700) tarball entries, which breaks the CLI for non-root users
after `sudo npm install -g` under mode-preserving consumers such as
system tar.

- Normalize every packed entry to 0644/0755 (a+rX, exec bits kept) as
  the last step of packOpenClawPackageForDocker.
- Add a tar -tvf mode gate to check-openclaw-package-tarball that
  rejects any non-world-readable entry.
- Run the docker-package-install npm lane as root and execute the
  installed CLI as a non-root user to prove the fix live.
- Fix the docker-package-install bun proof, broken on main since
  #129552 wired the bun smoke into the shared openclaw-e2e-instance
  library: replace the drift-prone per-file harness copy list with
  directory copies, and add a closure-walking guard test that fails
  on missing harness dependencies.
2026-08-26 13:24:13 -07:00
Peter Steinberger 1560142754 fix(e2e): stable candidate plugin repair fails after update (#130306)
* fix(e2e): resolve stable candidate plugins by latest

Amp-Thread-ID: https://ampcode.com/threads/T-01a039ee-f7c4-71d8-8b71-e028dbd60493

* fix(e2e): preserve stable fixture dist-tags

Amp-Thread-ID: https://ampcode.com/threads/T-01a039ee-f7c4-71d8-8b71-e028dbd60493

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-26 13:08:37 -07:00
Peter Steinberger 21df0f36a4 fix(e2e): mount prerelease registry verifier (#130288)
Amp-Thread-ID: https://ampcode.com/threads/T-01a039ee-f7c4-71d8-8b71-e028dbd60493

Co-authored-by: Amp <amp@ampcode.com>
2026-08-26 11:58:43 -07:00
Peter Steinberger 50e4655ba6 refactor(providers): remove redundant private runtime facades (#130212)
* refactor(providers): remove redundant private runtime facades

* fix(xai): narrow x-search enabled config
2026-08-26 11:33:22 -07:00
Harjoth Khara 3be7baa1a3 fix(macos): timestamp hash-pinned Developer ID signatures (#118989)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-26 10:39:41 -07:00
Dallin Romney 67a310b2c6 fix(ci): publish maturity scorecards when main advances (#129955)
* fix(ci): retry stale maturity scorecard runs

* fix(ci): refreeze queued scorecard successors

* fix(ci): allow scorecard publication after main advances
2026-08-26 10:03:37 -07:00
Dallin Romney 8ce8085e84 fix(e2e): include Codex thread project id (#130086) 2026-08-26 09:59:36 -07:00
Peter Steinberger eb17c8da5a refactor(matrix): remove obsolete private runtime forwarding layers (#130129)
* refactor(matrix): remove obsolete private runtime forwarding layers

* test(commands): preserve filesystem safety exports in delete mocks
2026-08-26 07:33:52 -07:00
Peter Steinberger 3b22a6cdd3 fix(gateway): keep loaded conversations responsive under heavy load (#130071)
* fix(gateway): keep loaded sessions responsive under heavy load

* test(gateway): narrow concurrency lane and stabilize inherited lint

* fix(ui): retain presented snapshots during background prefetch

* chore: respect release-owned root changelog policy
2026-08-26 05:42:01 -07:00
Peter Steinberger a842ad35f3 test(release): require live channel after restart (#127013)
* test(release): require live channel after restart

* test(release): migrate upgrade channel assertion

* test(release): assert channel runtime after restart

* test(release): await restarted channel runtime

* test(release): prove ClickClack reconnect generation

* test(release): preserve fixture runtime status

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-26 03:27:23 -07:00
xingzhou ee2f5f2084 fix(install): --json preserves valid NDJSON for dynamic values (#128682)
* fix(install): preserve valid NDJSON for dynamic values

* fix(install): satisfy installer shell checks
2026-08-26 03:19:43 -07:00
Vincent Koc ce54cae86d fix(ci): stop source-only PR fallback requiring generated locales (#120973)
* fix(ci): scope native i18n parity for release gates

Punchcard-Session: amber-workshop-workshop-36

* fix(ci): preserve native locale scope for PR release gates

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-26 02:50:48 -07:00
Vincent Koc 02c5190014 fix(release): preserve beta channel in prerelease survivor (#129966)
* fix(release): preserve beta channel in prerelease survivor

* fix(release): register prerelease survivor scenario
2026-08-26 17:47:16 +08:00
Peter Steinberger 1605dbd3ef chore(deps): refresh dependencies after seven-day cooldown (#129941)
* chore(deps): refresh dependencies after cooldown

* chore(deps): refresh sherpa-onnx runtime to v1.13.6

* test(ios): refresh Fastlane pin expectations
2026-08-26 01:37:37 -07:00
Harjoth Khara 7c6040550a ci(macos): budget macos-swift by runner so fork PRs finish (#119017)
* ci(macos): budget macos-swift by runner so fork PRs finish

runs-on falls back to hosted macos-26 for several cases: workflow_dispatch,
run_attempt > 1, fork pull requests, and (as of the runner-backend circuit
breaker landed on main the same day this PR was authored) breaker-routed
GitHub-hosted fallback. timeout-minutes did not cover the fork-PR case, so
fork PRs ran on the slow hosted runner with the Blacksmith-tuned 20-minute
budget.

Measured on PR #118989 (a fork PR): macos-swift was cancelled after 20m25s,
killed mid-compile at step 1365/1416. No test executed, and the log has no
swift compile error - only 'The operation was canceled.' ci-gate then fails
because it lists macos-swift as required, so the PR reads red for a reason
unrelated to its diff, and a contributor cannot rerun it.

Make the budget follow the runner instead of the trigger: every hosted path
gets 30 (folded into the same budget the circuit breaker's own hosted-fallback
timeout extension already established for this job), so this doesn't
reintroduce a second, competing hosted-timeout value. Blacksmith paths keep
20 unchanged. Replaces the single pinned-string guard with a table-driven
test covering runs-on and timeout-minutes together across every trigger
context that can route to a hosted runner.

* chore: refresh PR head (keep open for maintainer review)

* ci(macos): track main's author-association runner routing

Main now routes macos-swift by pull_request author_association rather than
fork-ness, so the timeout predicate and its guard scenarios follow it.

* ci(macos): tighten hosted runner budget coverage

Co-authored-by: harjoth <harjoth.khara@gmail.com>

* docs(ci): document hosted macOS budgets without merge conflicts

Co-authored-by: harjoth <harjoth.khara@gmail.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-26 01:12:07 -07:00
Peter Steinberger 4bd8859126 fix(skills): record skill usage again and retire dead curator tables (#129769)
* fix(scripts): see SAFETY comments after template substitutions

The assertion ratchet scanned each file with a raw ts.createScanner, which
reads the `}` closing a template-literal substitution as a block close. The
scanner desynced there, so every `// SAFETY:` comment after a file's first
`${...}` was invisible and its annotated assertions were counted as bare.

Track substitution brace depth and rescan the closing brace the way the parser
does. The fix uncovers already-annotated assertions in eight files, so the
baseline shrinks accordingly.

* fix(skills): record skill usage again and retire dead curator tables

Skill lifecycle curation shipped in 2026.7.1 with two producers: a trusted
`skill.used` consumer writing `skill_usage`, and a daily sweep aging skills
into `skill_lifecycle`. The weekly collection review (#121653) replaced that
policy and deleted both producers, but left every reader in place. Since then
`skill_usage` has had no writer, so curator status reported `lastUsedAtMs:
null` and `useCount: 0` forever, and `skill_lifecycle` had no writer either, so
pin/unpin/restore either threw "not found" on fresh installs or, worse,
"succeeded" on upgraded ones while gating nothing at all.
`skill_workshop_proposal_origin_runs` was never read in any revision; proposal
provenance is authoritative in `record_json`.

Restore the usage producer at its owner and retire what has no owner:

- `skill.used` events populate `skill_usage` again, registered with the
  collection-review maintenance it belongs beside. Curator status derives
  curated skills from applied Workshop create proposals and reports real usage.
- Weekly review receives bounded `useCount` / `lastUsedDaysAgo` evidence, with
  prompt text stating usage supports keeping a procedure and never alone
  justifies a drop.
- State schema 10 drops `skill_lifecycle` and
  `skill_workshop_proposal_origin_runs`. Previously archived skills return to
  the active collection, where review judges them by content; the migration
  logs how many. Reconcile now clears usage only for skills it actually drops.
- `skills.curator.pin`/`unpin`/`restore` stay registered for existing clients
  but fail with an explicit retirement message instead of silently doing
  nothing.

Retirement code moves to openclaw-state-db-table-retirements.ts to keep the
schema-repair module under max-lines; that split is a pure relocation.

Production delta is +23 raw: about -46 for the change itself, +44 for the file
split, +25 for the ratchet fix in the previous commit.
2026-08-26 01:06:06 -07:00
Peter Steinberger 10108ca0f2 fix(e2e): suppress update checks inside Docker E2E containers (#129931)
* fix(e2e): suppress update checks inside Docker E2E containers

The runner's CI variable does not cross into `docker run`, so containers kept
reporting daily update checks and drowned real operators in the telemetry
aggregates. Inject the existing suppression switch from the shared helper so
every lane inherits it; callers that exercise update behavior keep their own
value.

* test(e2e): record the injected suppression in docker run contracts
2026-08-26 00:14:40 -07:00
Peter Steinberger 0229fe7a2a improve: verify packaged runtime on Bun 1.4 (#129552)
* test: exercise packaged OpenClaw under Bun

Amp-Thread-ID: https://ampcode.com/threads/T-01a037b7-66db-71f0-91e7-1578b383afb2

* docs: align Bun runtime guidance

Amp-Thread-ID: https://ampcode.com/threads/T-01a037b7-66db-71f0-91e7-1578b383afb2

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-25 23:41:05 -07:00
Peter Steinberger 2e50bdf9fb test(release): route workflow regressions (#129914) 2026-08-25 23:21:59 -07:00
Peter Steinberger 0285926bf9 refactor(codex): compact generated protocol JSON (#129524) 2026-08-25 22:26:54 -07:00
Vincent Koc 263d2a2a91 fix(i18n): include concatenated Apple UI strings (#129882)
* fix(i18n): include concatenated Apple UI strings

* test(i18n): cover multiline Apple modifiers
2026-08-26 13:24:48 +08:00
Vincent Koc 67c5a85619 fix(release): bind prerelease plugins into package Telegram QA (#129784)
* fix(release): bind prerelease plugins into package Telegram QA

* fix(release): preserve registry artifact provenance
2026-08-26 13:17:30 +08:00
Vincent Koc 2b06180bb5 fix(package): restore npm package size headroom (#129782)
* fix(package): externalize diffs build outputs

* chore: remove release-owned changelog entry

* fix(build): generate selected plugin assets before Docker staging

---------

Co-authored-by: Dallin Romney <dallinromney@gmail.com>
2026-08-26 12:40:27 +08:00
Peter Steinberger a5f36aef39 fix(parallels): avoid host networking for macOS upgrades (#129861) 2026-08-25 21:37:00 -07:00
Peter Steinberger 3a37a12d89 fix(package): prevent installs from deleting validated runtime assets (#129724)
* fix(package): enforce postinstall inventory parity

Reject packages whose pruning inventory omits shipped dist assets, and verify every installed bundled plugin artifact survives postinstall. Preserve lifecycle-free historical package compatibility.

Fixes #129722

* fix(package): keep parity helper private

* refactor(package): deduplicate SDK artifact requirements
2026-08-25 21:14:39 -07:00
Peter Steinberger 6f1ed5396e fix(release): start approved VCR mirror recovery jobs (#129829) 2026-08-25 21:11:18 -07:00
Vincent Koc db085b7d8f fix(tooling): arm prompt cleanup before spawn (#129755) 2026-08-26 11:43:39 +08:00
Peter Steinberger c406ef4b4d test: consolidate prompt snapshot deltas (#129295) 2026-08-25 20:42:03 -07:00
Peter Steinberger 20b453f155 fix(agents): reject forged plugin owner authority (#104872)
* fix(security): bind channel owner authority to trusted runtime

* fix(plugins): preserve untrusted channel guest ingress

* fix(plugins): snapshot channel ingress authority once
2026-08-25 20:36:05 -07:00
tzy-17 7133f92007 fix(bench): preserve Unicode across bounded gateway diagnostics (#120125) 2026-08-25 20:24:33 -07:00
Peter Steinberger 54b0f9ff85 fix(release): prevent empty VCR mirror inputs (#129467)
* fix(release): preserve VCR mirror source digests

Transport only attestation-verified digests across secret-scanned job outputs, reconstruct immutable GHCR refs inside the VCR mirror, and add an approved mirror-only recovery path.\n\nCloses #129466

* fix(release): verify VCR recovery sources

Revalidate attestations and release-version labels before any VCR registry write so manual recovery preserves the immutable source boundary.

* test(release): keep VCR regression scoped

Leave global workflow-to-test routing cleanup for a follow-up; this PR directly changes and runs both VCR regression suites without forcing metadata-complete CI.

* fix(ci): preserve caches after warmer failures

Finish every selected cache-warm group, save content-keyed transform and compile caches, then fail visibly after the save steps. Ordinary CI remains fail-fast.
2026-08-25 20:15:42 -07:00
Peter Steinberger b3d3494919 refactor(i18n): compact native source inventory (#129777) 2026-08-25 20:08:10 -07:00
Peter Steinberger b5fcae34fe refactor(install): remove obsolete Baileys media hotfix (#129751) 2026-08-25 20:00:29 -07:00
Peter Steinberger 9e8144e8d4 fix(parallels): preserve saved macOS snapshot sessions (#129788) 2026-08-25 19:48:34 -07:00
Peter Steinberger 5e81a346d7 fix(ci): narrow release validation GitHub contract (#129783)
Replace the checker-only broad Octokit shape with exact issue request and response contracts, and make the test harness reject impossible missing issue responses.

Co-authored-by: Dallin Romney <dallinromney@gmail.com>
2026-08-25 19:47:59 -07:00
Peter Steinberger e5173eddd4 fix(parallels): macOS dev upgrade needlessly rebuilds the checkout (#129444)
* fix(parallels): skip packaging for macOS dev upgrades

* fix(test): sanitize compile cache for all vitest children

* test(node-host): honor disabled worker compile-cache fixtures
2026-08-25 19:39:31 -07:00