Commit Graph

1792 Commits

Author SHA1 Message Date
Peter Steinberger
6b6bf3a34b fix(ci): repair Mantis desktop scenario dispatch (#109505) 2026-07-16 18:50:57 -07:00
Peter Steinberger
067635cb51 fix(ui): prevent generated locale rebase conflicts (#109393)
* ci(ui): make locale refresh bot-owned

* test(ui): keep locale gate coverage scoped

* fix(ci): preserve generated PR merge policy

* fix(ci): wait for generated PR head convergence

* fix(ci): retry transient guard API failures

* fix(ci): enforce locale isolation across CI events

* fix(ci): harden generated PR publication

* fix(ci): validate release gate merge tree

* fix(ci): allow trusted main locale output
2026-07-16 18:48:20 -07:00
Peter Steinberger
7f50fb6bfe fix(ci): validate frozen release tags 2026-07-17 02:41:05 +01:00
ooiuuii
71c5005d2c fix(ci): run mantis codex proof on node 24 (#100237) 2026-07-16 18:33:51 -07:00
Peter Steinberger
b78cf56349 improve(ci): persist warm Vitest and Node caches (#109425)
* perf(ci): harden persistent test caches

* ci: document trusted cache cleanup trigger

* ci: harden composite cache inputs

* perf(ci): isolate Node build bytecode cache
2026-07-16 17:22:28 -07:00
Peter Steinberger
9cda66123b fix(ci): address reviewer findings across the perf-lever batch (#109254)
* fix(ci): address reviewer findings across the perf-lever batch

Seven follow-ups from Codex review feedback on the landed CI perf PRs:
docker packaging switches to the full build profile (the ciArtifacts
step env clobbered its canonical-dts requirement); the boundary sticky
restore gates on generative source tree OIDs in both lanes, making
restored artifacts valid by construction (kills the clock-skew mtime
false-skip and ghost declarations from deleted sources); the node-test
worker budget derives from nproc instead of the runner label (labels
over-promise under load) and keeps the 2-worker cap when plans can
overlap; the deadcode task falls back to serial Knip below 8 cores;
the lint-lane i18n verify also runs for any ui-touching diff (keys are
extracted from all ui sources, not just ui/src/i18n); the oxlint
concurrency diagnostic moves to stderr; and workspace packages join
the prompt-snapshot always-run surface.

* fix(ci): fingerprint every generative source the boundary artifacts consume

Autoreview flagged inputs outside the tree-OID gate; toolchain, config,
and script inputs were already covered by the sticky key hash, but the
old actions/cache key also fingerprinted src/plugins/types.ts and
src/video-generation sources the OID list missed. Add those plus
src/channels (the plugin-sdk declaration graph reaches its public
types) to the fingerprint in all three sites.

* fix(ci): fold runner toolchain identity into the boundary sticky fingerprint

Autoreview: the sticky key hashes config/scripts/package.json/lockfile,
but a node/pnpm toolchain bump (pinned in the workflow, not the key)
could leave the key unchanged and bless artifacts built with the prior
toolchain. Record node/pnpm versions alongside the source tree OIDs in
all three fingerprint sites so a toolchain-only change forces a cold
build.
2026-07-16 17:09:56 -07:00
Peter Steinberger
2a52e45e2b fix(ci): avoid flaky commit pulls lookup 2026-07-17 00:52:44 +01:00
Peter Steinberger
d6a33b539f fix(ci): retry Telegram provenance API reads 2026-07-17 00:29:04 +01:00
Peter Steinberger
7662b4bb8c fix(release): make beta performance advisory 2026-07-16 23:55:10 +01:00
Peter Steinberger
c68a644056 fix(ci): retry malformed GitHub responses 2026-07-16 23:33:24 +01:00
Peter Steinberger
8a31825837 fix(ci): accept queued release artifacts 2026-07-16 23:05:04 +01:00
Peter Steinberger
7bf5c772be improve: reuse Vitest transform cache across CI runs (#109330)
* ci: persist Vitest transform cache

* fix(ci): declare Vitest cache helpers

* fix(ci): serialize Vitest cache snapshots
2026-07-16 14:15:17 -07:00
Dallin Romney
c4b2183db6 fix(release): repair frozen validation compatibility (#109272) 2026-07-16 11:45:31 -07:00
tzy-17
e9b974e18b fix(ci): bound release evidence dispatch (#108898) 2026-07-16 11:38:19 -07:00
tzy-17
9c61809ec4 fix(ci): bound plugin npm artifact connection (#108897) 2026-07-16 11:23:01 -07:00
Dallin Romney
954c77d4ef test(ci): temporarily omit Z.AI API Platform validation (#109246)
* test(ci): temporarily omit Z.AI API Platform validation

* test(ci): align disabled provider count
2026-07-16 11:16:29 -07:00
Peter Steinberger
b35fc165ee feat(linux): extend companion self-update to macOS/Windows test builds (#109244)
Platform-aware install kinds: Linux AppImage and macOS self-install in place;
Windows defers — the update downloads and verifies in the background, then the
NSIS installer runs only from the user-confirmed restart (Tauri's installer
launch exits the process, so it must never fire behind a silent auto-check).
Linux system packages stay notify-only.

The release workflow gains dispatch-gated unsigned macOS/Windows test bundles
signed with the same minisign key, and a separate desktop-test update channel:
latest.json stays Linux-only on every release, while an opt-in fixed
'desktop-test' prerelease hosts latest-desktop-test.json (monotonic version
guard) so Linux-only releases can never strand distributed test builds. Build
jobs check out the SHA the validation job resolved, closing the tag-move race.
2026-07-16 10:55:19 -07:00
Peter Steinberger
21b08f34b7 perf(ci): run the deadcode Knip scans concurrently (#109151)
* perf(ci): run the deadcode Knip scans concurrently

check-dependencies spent ~194s running seven Knip child processes
strictly serially (three package scripts, each iterating its scans).
The scans are independent processes over separate configs: both
deadcode scripts now Promise.all their scans, the CI task launches the
three package scripts concurrently with buffered logs, and the lane
moves to the 16 vCPU class for core/memory headroom. The
missing-exports-script contract violation now fails fast before
launching scans. Local: unused-files 218% CPU, 37s wall.

* test(ci): align prerelease plan with the 16 vCPU dependencies lane
2026-07-16 10:46:44 -07:00
Peter Steinberger
0815f6a4f9 feat(android): add Wear proxy protocol (#108835)
* feat(android): add Wear proxy protocol

Introduce a bounded, versioned phone/watch RPC contract and wire its test, lint, and build gates before either runtime endpoint lands.

Co-authored-by: Sebastian Schubotz <git@sibbl.de>

* test(android): lock Wear wire names

Cover every supported RPC method and event discriminator so phone and watch cannot silently drift.

Co-authored-by: Sebastian Schubotz <git@sibbl.net>

* fix(android): bound Wear JSON depth

Reject excessively nested Data Layer envelopes before kotlinx.serialization can recurse through them.

* fix(android): enforce Wear depth on encode

Keep outbound messages inside the same JSON nesting contract enforced by the decoder.

* fix(android): preflight Wear payload depth

Traverse arbitrary JSON payloads iteratively before serialization so deeply nested local trees fail safely.

---------

Co-authored-by: Sebastian Schubotz <git@sibbl.de>
Co-authored-by: Sebastian Schubotz <git@sibbl.net>
2026-07-16 10:21:38 -07:00
Peter Steinberger
e71ef76e8e feat(onboarding): offer detected Claude Code/Codex/Hermes memory imports across CLI, macOS, and Linux onboarding (#108977)
* feat(migrate): add Hermes memory-only import and a shared memory-import core

* feat(onboarding): offer detected memory imports during CLI setup and guided onboarding

* feat(ui): show a first-run memory-import offer in Control UI onboarding mode

* feat(linux-app): open the first-run dashboard in onboarding mode

* feat(macos): add the onboarding memory-import page

* docs: document the onboarding memory-import page across surfaces

* chore(i18n): translate onboarding memory-import strings for control-ui and native locales

* refactor: keep memory-import internals unexported for deadcode gates

* fix(ci): resolve lint findings in onboarding memory import

* chore(i18n): refresh native inventory after lint refactor

* fix(ci): skip updater artifacts in the unsigned Linux companion PR lane

* chore(i18n): reconcile locale artifacts after rebase
2026-07-16 10:10:01 -07:00
Peter Steinberger
fe4a0aae62 perf(ci): carry extension boundary artifacts on a Blacksmith sticky disk (#109169)
* perf(ci): carry extension boundary artifacts on a Blacksmith sticky disk

The boundary lane spends ~113s of its 214s rebuilding plugin-sdk
declaration artifacts that an actions/cache was meant to carry — but
that cache is evicted so fast under the repo quota that even its prefix
restore never hits. Same-repo runs now keep the artifacts on a sticky
disk with a coarse toolchain key (source changes intentionally hit a
stale snapshot: restored mtimes predate the fresh checkout, so the
mtime-based freshness predicate always routes into the incremental
rebuild — a stale snapshot can never false-skip the compile). Fork PRs
keep the GitHub cache path and can never write repository-global
snapshots. Seed/restore round-trip verified locally with rsync -aR
layout mirroring.

* perf(ci): restore boundary artifacts for the lint lane too

check-lint's shard runner spawns the same plugin-sdk boundary artifact
prep the boundary lane snapshots (~72s of its wall clock); it now
mounts the shared sticky read-only-by-convention (only the boundary
lane seeds) and restores before the run step.

* fix(ci): make the lint boundary-sticky mount strictly read-only

Autoreview caught a first-hydration race: with commit if-missing, a
cold-key lint job racing the boundary lane could commit an empty,
marker-less snapshot that if-missing then never repairs. commit false
makes lint a pure reader; only the boundary lane can seed.
2026-07-16 09:54:29 -07:00
Peter Steinberger
af42fbb6f3 perf(ci): unblock parallel oxlint shards and gate the lint-lane i18n verify (#109144)
* perf(ci): unblock parallel oxlint shards and gate the lint-lane i18n verify

check-lint is the slowest static lane (median 252s): the control-UI
i18n verify runs 86s unconditionally and the three oxlint shards run
serially (89s) because the parallel gate demands 48GB of memory — a
local-Mac threshold that Blacksmith's 32GB 16 vCPU class can never
meet. CI now parallelizes shards at 8+ cores / 24GB+, and the lint case
reuses the existing run_control_ui_i18n manifest gate so diffs that
cannot affect generated catalogs skip the verify while oxlint always
runs.

* chore(ci): print oxlint shard concurrency decision

The lint-lane validation run still executed shards serially on a 16
vCPU runner; one log line exposes the resolved concurrency and the
host resources the decision saw.
2026-07-16 09:45:47 -07:00
Peter Steinberger
f3a2f9f8a7 perf(ci): gate prompt-snapshot regeneration on the generator's blast radius (#109083)
check-prompt-snapshots costs 200-310s per PR regenerating real prompt
stacks, but snapshots only change when the generator's import graph or
its fixtures do. The manifest now computes that reach (same pattern as
QA smoke gating: always-run surface regex incl. the codex extension
whose test API loads via a dynamic module id, plus import-graph walk
from the snapshot helper; deletions and null diffs fail safe to
running). Unaffected PR diffs skip the lane with an explicit log line;
pushes and dispatches always run.
2026-07-16 08:06:06 -07:00
xingzhou
16c2bbb540 fix(mantis): bound Crabbox source checkout (#108940) 2026-07-16 07:49:07 -07:00
Peter Steinberger
99826ebf85 fix(ci): install xcodegen via pinned release script in periphery scans
The arm64 Homebrew xcodegen bottle is corrupt on current runner images
(pour fails with 'Cellar/xcodegen/<ver> is not a directory'), and
reinstalling re-pours the same broken tarball. Use the repo's pinned,
checksummed scripts/install-xcodegen.sh like ci.yml already does.
2026-07-16 13:04:08 +01:00
Peter Steinberger
977e0b64a1 fix(ci): survive corrupted xcodegen Cellar on macOS runners
Periphery scans fail org-wide when the runner image ships a broken
Cellar entry (pour errors with 'Cellar/xcodegen/<ver> is not a
directory'). Pre-clean the path and retry the install once.
2026-07-16 12:55:38 +01:00
Peter Steinberger
037ef6695a fix(ci): bound actionlint downloads (#108938) 2026-07-16 04:24:26 -07:00
Peter Steinberger
06e3a09bd8 fix(ci): preserve advisory release checks 2026-07-16 11:56:01 +01:00
Peter Steinberger
e0ffbd90d9 fix(ci): isolate bounded metadata retries (#108804)
* fix(ci): bound Mantis runner IP retries

* fix(e2e): isolate Windows metadata retries

* fix(ci): validate complete runner IPv4

Co-authored-by: Alix-007 <li.long15@xydigit.com>

---------

Co-authored-by: Alix-007 <li.long15@xydigit.com>
2026-07-16 03:39:31 -07:00
Peter Steinberger
b6b8e59b9e refactor(ci): share Android toolchain setup (#108855)
* refactor(ci): share Android toolchain setup

* fix(ci): preserve frozen Android targets
2026-07-16 03:38:31 -07:00
Peter Steinberger
2c7cf8d745 perf(ci): scale Vitest workers with runner class and share serial module cache (#108788)
* perf(ci): scale Vitest workers with runner class and share serial module cache

Compact node-test jobs pinned OPENCLAW_VITEST_MAX_WORKERS=2 regardless of
runner size, so import-bound suites (30-45s of module-graph import per
file) crawled: runner-cli spent 284s on 5s of tests, commands-1 296s on
10s. With serial plans the budget now scales with the class (6 on 8vcpu,
3 on 4vcpu); timing-sensitive groups (tooling, tui-pty, infra-process)
stay pinned to 2 via plan-level env. Serial bins share one Vitest
fs-module-cache path so later plans reuse the first plan's transforms.
The import-bound commands stripes and security suite move to the 8vcpu
class, and packing hints refresh from serial-run measurements (run
29481835688).

* perf(ci): stripe cli-runner suite and pin media-ui worker budget

The agents-core config runs files serially (fileParallelism false guards
shared module state), so raising the worker budget cannot help its
import-heavy cli-runner suite (~35s module import per file, 213s serial).
Stripe it three ways so bins parallelize the imports instead. media-ui
hosts browser locator tests that timed out at 6 workers on the first
validation run; pin it to the proven 2-worker budget. commands-1's hint
drops to its measured 6-worker runtime.
2026-07-16 03:36:37 -07:00
Alix-007
de10d98c81 fix(e2e): bound OpenShell installer fetch (#108810) 2026-07-16 03:27:03 -07:00
Peter Steinberger
76a236da5f fix(ci): harden release validation gates (#108798)
* fix(ci): harden release validation gates

* fix(apns): keep tombstones in strict SQLite schema

* fix(ci): isolate PR publication transport
2026-07-16 03:21:08 -07:00
Peter Steinberger
57ae43a89c fix(ci): harden full release validation 2026-07-16 10:26:29 +01:00
Alix-007
47dd90c5ea fix(ci): bound Android SDK downloads (#108723) 2026-07-16 02:12:07 -07:00
Alix-007
5cd9243465 fix(ci): bound Windows Testbox phone-home requests (#108755) 2026-07-16 01:57:53 -07:00
Alix-007
8a21f640e3 fix(ci): bound release resume tarball downloads (#108766) 2026-07-16 01:54:50 -07:00
Alix-007
ea3ac194f4 fix(ci): bound Mantis runner IP discovery (#108699) 2026-07-16 01:50:22 -07:00
Alix-007
0b7f4ccb72 fix(ci): bound Telegram QA OIDC requests (#108701) 2026-07-16 01:49:15 -07:00
Peter Steinberger
f460c2871a feat(linux): add signed auto-updater to the Tauri companion app (#108770)
Sparkle-parity self-update for the apps/linux companion: tauri-plugin-updater +
process, checked silently on launch and from a "Check for Updates" tray item /
manual trigger. AppImage installs download, verify the signed update, and wait
for a user-confirmed restart; package-managed (deb) installs get a release-page
notice instead of replacing files the system package manager owns. The
linux-app release workflow signs the AppImage and publishes a signed latest.json
manifest that the app verifies with the committed minisign public key.
2026-07-16 01:48:08 -07:00
Alix-007
cc58940993 fix(ci): bound Windows WSL rootfs downloads (#108743) 2026-07-16 01:47:37 -07:00
Alix-007
00ff4e8b84 fix(ci): bound OCM asset transfers (#108700) 2026-07-16 01:44:53 -07:00
Alix-007
e0394c2ab4 fix(ci): bound native tool downloads (#108685)
* fix(ci): bound native tool downloads

* fix(ci): bound historical SwiftFormat downloads

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 01:44:30 -07:00
Peter Steinberger
a7d5386896 improve: speed up ring-zero QA smoke (#108694)
* ci: speed up ring-zero QA smoke

* ci: scope QA sticky cache to Docker lane

* ci: keep QA dependency setup on actions cache

* test: restore modern Docker QA proof
2026-07-16 01:12:40 -07:00
Alix-007
3912cf38b9 fix(ci): bound workflow ShellCheck download (#108672) 2026-07-16 00:56:27 -07:00
Sash Zats
0960d07d8e ci: gate PR edit automation by changed field (#95010)
* ci: gate PR edit automation by changed field

* ci: include title edits in ClawSweeper dispatch gate

* ci: refine PR edit automation gates

Co-authored-by: Sash Zats <sash@zats.io>

* test(ci): require boolean workflow matcher

Co-authored-by: Sash Zats <sash@zats.io>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:42:14 -07:00
Alix-007
98fc55ca96 fix(ci): bound performance gateway health probes (#108621) 2026-07-15 22:59:18 -07:00
Peter Steinberger
a6125b7868 perf(ci): split QA smoke into four profile parts and time tsdown invocations (#108638) 2026-07-15 22:41:02 -07:00
Dallin Romney
401e7b003c fix(release): support frozen pre-AI package targets (#108479) 2026-07-15 15:49:27 -07:00
Peter Steinberger
6252f9b1f7 improve(ci): speed warm Node shards with sticky bind mount (#108386)
* perf(ci): bind sticky dependency disk into test shards

* chore(ci): restore workflow guard coverage

* perf(ci): skip pnpm install on exact sticky hits

* fix(ci): require stock layout for sticky dependencies

* perf(ci): bypass pnpm for test shard launches

* fix(ci): declare direct shard runner command

* fix(ci): bypass pnpm in warm shard builds

* fix(ci): invalidate sticky deps on pnpm config

* ci: document sticky failure guard
2026-07-15 15:41:24 -07:00