Commit Graph

2141 Commits

Author SHA1 Message Date
Peter Steinberger ed5e489633 perf(ci): widen ui-e2e to 12 shards, ride Blacksmith Windows on hybrid, overlap built-runtime verifiers
Three measured cuts toward the sub-4-minute wall:

- checks-ui-e2e hosted-planner matrix 10 -> 12 rows (11 Vitest shards +
  browser-extension). Shard 1 measured 230s with ~123s test body; Vitest
  hash sharding leaves count as the only balance lever.
- checks-windows hybrid attempt 1 now rides blacksmith-8vcpu-windows-2025
  (retries stay hosted windows-2025). The 3-part hosted split measured a
  342s pole on full-graph runs.
- build-artifacts folds the Doctor plugin-index proof (12s), singleton
  smoke, and startup-memory check (7s) into one step that overlaps them
  on Blacksmith and stays serial on hosted 4-core so the RSS measurement
  is unperturbed; any missing startup asset rebuild completes before the
  fork so no verifier reads dist mid-write.
2026-08-14 21:12:05 -07:00
Peter Steinberger d612949ee6 perf(ci): ride hybrid 8 vCPU for the checks-ui browser suite
Run 31861511624 made checks-ui the UI-scoped wall pole (247s job, 177s body
on hosted 4-core even in hybrid). Attempt 1 now uses the 8 vCPU class like
the ui-e2e shards; retries stay hosted.
2026-08-14 20:27:03 -07:00
Peter Steinberger 7e54cc9d19 perf(ci): make push/PR preflight dependency-free and prune the store archive
The manifest planner closure and the protocol coverage script import only
node builtins and relative files (verified importing the full closure with
an empty node_modules under native type stripping), so push/PR preflight
drops the pnpm store restore and install (~30s off the barrier every lane
waits behind). Manual dispatches keep the tsx path for frozen targets, and
the coverage script inlines the record guard under the documented
dependency-free exception.

The store archive accretes every prior lockfile generation through
prefix-key restores (measured 2.05 GiB, ~36s restore in every hosted job);
the warmup writer now prunes to the current lockfile closure before saving.
2026-08-14 19:25:16 -07:00
Peter Steinberger 00164c7bdc perf(ci): cut the QA smoke double build and three audited wall lanes
Sub-agent caching audit tranche, all measured on runs 31856622489 and
31857193681:

- QA Smoke parts rebuilt the runtime twice and packed a docker tgz that no
  scenario in the smoke coverage set consumes (verified against the resolved
  plan: zero docker-lane, zero Control UI scenarios). One private overlay
  build replaces the public-build/ui:build/pack/private-rebuild chain
  (~35-50s per part); the run step fails closed if a docker-lane scenario
  ever returns, and the guard now pins never-pack-after-private-build.
- report-plugin-sdk-api-diff is pure reporting (nothing passes
  --require-acknowledgement); it now runs on manual/release dispatches only.
- check-npm-lock resolved ~94 npm graphs against the registry on every push;
  push/PR runs now use the reviewed --changed scoping (2.4s on dep-free
  diffs) with a fail-open full sweep on base-fetch failure, and dispatches
  keep --all for registry-drift coverage.
- Six restore-test-caches gates said 'github' only while the writer already
  runs in hybrid; hybrid attempt-1 lanes now restore the transform seed.
- QA smoke lane reads the protected build compile cache; test-type stripes
  widen to five.
2026-08-14 19:19:13 -07:00
Peter Steinberger 76e4ef68ce perf(ci): squeeze the last hybrid stragglers under the five-minute wall
Green tip run 31855637027 measured the remaining poles: ui-e2e shards up to
282s (imbalanced eight-way split), report-plugin-sdk-api-diff 246s on 4 vCPU,
and 220s test-type stripes (tsgo saturates a machine per graph, so stripe
count is the lever, not cores). Widen hosted-profile ui-e2e to ten rows,
test-type stripes to four, and lift the SDK diff to the 8 vCPU class.
2026-08-14 18:20:28 -07:00
Peter Steinberger ad508a51c2 perf(ci): overlap two tsgo graphs inside each test-type stripe
Each graph is a serial single-project build, so tsgo gains little past four
cores; run 31852071103 measured ~34s/graph on 8 vCPU versus ~42s on hosted
4-core. Overlapping two fresh shard processes per CI stripe (--concurrency 2)
uses the idle cores and roughly halves the stripe body; local runs keep the
heap-bounded serial default.
2026-08-14 17:11:39 -07:00
Peter Steinberger 9adfe07d9b perf(ci): ride hybrid Blacksmith attempt-1 for the measured hosted poles
First hybrid main cycles (runs 31850815388-31851455918) landed at 5:47-6:32
walls with every remaining pole a hosted lane: the three test-type stripes
(232-269s), check-additional-runtime-topology (274s), check-dependencies
(260s), and report-plugin-sdk-api-diff (209s). Route them to their Blacksmith
labels on hybrid attempt 1 (retries stay hosted) and lift runtime topology to
the 8 vCPU class.
2026-08-14 16:56:52 -07:00
Peter Steinberger dc55a7d08d ci: expand Linux installer verification (#123849) 2026-08-14 14:45:39 -07:00
Peter Steinberger 7c977e0f84 perf(ci): cut hosted CI critical path toward five-minute walls (#123780)
* perf(ci): cut hosted CI critical path toward five-minute walls

Stripe the serial core test-type graphs across two hosted jobs and drop the
duplicated tsgo:test:root pass; gate the six-part QA Smoke matrix off pull
requests unless a QA-owned surface changed; split the fat multi-config Node
shards (cli/cli-process, unit-fast isolated/fake-timers, infra
logging-process/runtime-config) and lower the hosted split ceiling to 150
predicted seconds so no compact lane owns a ~280s wall; expand tooling to
seven stripes.

* perf(ci): widen hosted test-type striping to three jobs

Run 31825922122 measured ~40s per core test-type graph on loaded hosted
runners (282s worst stripe body of the two-way split); three stripes keep
each lane near 150s body under load.
2026-08-14 13:03:52 -07:00
Peter Steinberger fc5265d685 improve: tighten newest regression ownership (#123606)
* test: tighten newest regression ownership

* test(ui): stabilize request-driven e2e waits

* fix(ci): stabilize lifecycle-bound test observations

* test(ci): pin current Telegram job cap

* test(ui): wait for terminal selection owner

* test(mac): use shared unread wait policy
2026-08-14 08:08:45 -07:00
Peter Steinberger bd4b972794 ci: lower hybrid compact shard height (#123595) 2026-08-14 06:55:17 -07:00
Peter Steinberger e342e02b6f test(ui): capture mock gateway timeout diagnostics (#123650) 2026-08-14 05:50:05 -07:00
Josh Lehman f49eaf8639 fix(ci): prevent type-aware lint timeouts on constrained runners (#123328)
* oc-073.1: target UI style lint in changed checks

* oc-073.2: reuse tsgolint programs on hosted CI

* fix(ci): repair lint scope validation

* oc-073.3: restore no-target core lint fallback
2026-08-14 05:43:54 -07:00
Peter Steinberger 7aac8ee04b fix: preserve device sessions while runner is offline (#123477)
* fix(runners): recover offline device placements

* test(runners): model reclaimed launch dispatch

* ci: serialize macOS Swift test retries

* test: wait for steering subscription readiness

* fix(gateway): restore authority-safe steering

* test(gateway): align authority projector fixture

* fix(gateway): dispatch leaf authority mismatches

* refactor: keep authority overlay contract leaf-only

* test(ui): close place popover before details
2026-08-14 03:31:19 -07:00
Dallin Romney 7c73f80281 fix(release): run package validator from harness cwd (#123206) 2026-08-14 18:10:02 +08:00
Peter Steinberger ee288a836c ci: route hybrid compact shards to Blacksmith (#123593) 2026-08-14 03:01:33 -07:00
Peter Steinberger 3a49aa1ac6 improve: split hosted Windows CI into three lanes (#123577)
* ci: split Windows tests into three lanes

* test: cover three-way Windows CI partition
2026-08-14 02:40:02 -07:00
Peter Steinberger 8865c2539b ci: shorten hosted PR path (#123570) 2026-08-14 02:11:25 -07:00
Peter Steinberger 749340fc16 ci: widen hybrid Blacksmith routing (#123552) 2026-08-14 01:37:32 -07:00
Peter Steinberger e51ee089b7 improve: add hybrid CI runner backend (#123479)
* ci: add hybrid runner backend

* test: admit hybrid backend in CI fixture
2026-08-14 00:19:28 -07:00
Peter Steinberger 1400049ae9 improve(ci): cut hosted test import time with warm caches (#123465)
* perf(ci): restore hosted test caches across lanes

* perf(ci): restore caches in remaining Vitest lanes
2026-08-13 22:41:27 -07:00
Peter Steinberger c06f993b5c fix(ci): restore hosted cache writers (#123440) 2026-08-13 20:16:54 -07:00
Peter Steinberger 257eb21235 improve(ci): shorten GitHub-hosted Node matrix (#123406)
* improve(ci): shorten GitHub-hosted matrix wall time

* fix(ci): keep hosted dependency setup store-only

* fix(ci): split the hosted tooling tail
2026-08-13 19:32:50 -07:00
Peter Steinberger b376b13fec feat(docker): weekly refresh of published moving image tags (#123348)
* feat(docker): schedule image refreshes

* docs(docker): explain weekly image refreshes

* test(scripts): gate workflow-step execution on bash 4 mapfile support

Stock macOS bash 3.2 lacks mapfile; CI truth is Linux bash 5.

* test: cover docker-release suffix threading and sanctioned second caller

* test(codex): wire run-attempt-state into the attempt-extra project

#123345 added the file without a project owner; the full-suite coverage
guard fails for any PR that runs it.

* fix(ci): run build-artifacts PR validation on hosted runners

ci-build-artifacts-testbox.yml pinned PR runs to blacksmith-16vcpu and
ran Testbox lifecycle steps unconditionally, so the prepare-run landing
gate starved for every PR during a Blacksmith outage even with
OPENCLAW_CI_RUNNER_BACKEND=github. PR events now build on ubuntu-24.04
with dispatch-only Testbox steps, mirroring ci-check-testbox.yml.

* test(ci): align build-artifacts dispatch guard
2026-08-13 19:20:05 -07:00
Peter Steinberger 6995f98243 ci: split remaining GitHub-hosted tail lanes (#123364)
* ci: codify manual-only Node 22 compatibility

* ci: split remaining hosted tail lanes

* fix(qa-lab): carry the validated part index into the plan id type

* test(ci): repair hosted tail lane guards
2026-08-13 16:52:25 -07:00
Peter Steinberger b1491356df ci: shard hosted UI e2e further (#123329) 2026-08-13 15:20:37 -07:00
Peter Steinberger 4a5aeb8dd2 improve(ci): shorten GitHub-hosted outage runs (#123294)
* ci: run push compacts without tooling lanes and stripe giants three-way

* fix(ci): keep CompactNodeTestPlanMode internal

knip --production flags the exported type as unused; no external module
imports it.

* ci: shard hosted lint and node tests

Split core oxlint across hosted runners and use backend-specific compact Node admission caps while preserving Blacksmith behavior.

* test(ci): guard plugin prerelease planner isolation
2026-08-13 15:19:15 -07:00
Peter Steinberger 0d73229b60 fix(ci): route fork-PR runs to hosted runners in standalone workflows
Repo variables are not supplied to fork-triggered pull_request runs, so
the OPENCLAW_CI_RUNNER_BACKEND breaker silently fell through to bare
Blacksmith labels for fork PRs; mirror ci.yml's fork-to-hosted fallback.
2026-08-13 12:28:20 -07:00
Vincent Koc abd63c06c2 fix(ci): allow GitHub-hosted npm preflight (#123191) 2026-08-14 02:32:01 +08:00
Peter Steinberger 165a2e9ede fix(ci): extend runner-backend breaker to PR-gating standalone workflows
OpenGrep precise/full, sandbox-common-smoke, and plugin-init scaffold
validation were still pinned to Blacksmith runners outside ci.yml, so
PR checks starved during the Blacksmith outage even with
OPENCLAW_CI_RUNNER_BACKEND=github. Route them through the same breaker
expression and bound sandbox-common-smoke with a timeout.
2026-08-13 10:23:22 -07:00
Peter Steinberger fb82d87cad fix: keep CI running during Blacksmith outages (#123263)
* ci: add runner-backend circuit breaker with GitHub-hosted fallback

* fix(ci): extend hosted timeouts to circuit-breaker runs
2026-08-13 10:18:35 -07:00
Peter Steinberger fa18d8d273 ci: pipeline canonical main runs across two concurrency slots (#123135)
Measured canonical-main first-start delay: median 180s, average 209s; 10 of the last 30 runs waited more than 300s.

Approved tradeoff: up to ~+30 concurrent Blacksmith VMs during merge storms. Scope is canonical main pushes only; pull requests, manual runs, non-main refs, and forks keep their existing semantics.

Bump the canonical-main concurrency group from v7 to v8 so in-flight old-group runs cannot mix with the two-slot pipeline.
2026-08-13 04:04:51 -07:00
Ayaan Zaidi d2afbd05ad refactor(plugin-sdk): replace API baselines with diffs (#123036)
* refactor(plugin-sdk): replace API baselines with diffs

* perf(plugin-sdk): bound API diff resources

* fix(plugin-sdk): isolate API diff dependencies

* fix(release): forward Plugin SDK acknowledgement

* fix(release): enforce SDK acknowledgement on publish

* chore: preserve generated-doc ignore policy

* fix(release): freeze SDK API evidence before publish

* fix(ci): satisfy SDK evidence guards

* fix(release): bind complete SDK evidence

* fix(release): authenticate plugin SDK evidence

* fix(plugin-sdk): abort interrupted API diffs

* test(ui): freeze page clock in background-tasks rail e2e

The rail transcript is compared byte-for-byte across the detail-panel
round-trip while it renders live relative ages; on slow CI runners the
second boundary ticks between the two reads (11s -> 12s) and fails the
equality assertion. Fix the page Date with Playwright setFixedTime while
keeping timers running so the tasks.list polling assertions still hold.

Repro: a 1.5s stall between the reads fails pre-fix with the exact CI
diff and passes post-fix.

* fix(scripts): drop unused export on dependency-evidence CLI main

Knip's workflow scan re-roots script references after an actions/checkout
step that sets path:, so the new trusted-tooling checkout in
openclaw-npm-release.yml stops marking this CLI as a workflow entry and
its exported main() surfaces as an unused export in check-dependencies.
Nothing imports main; the module invokes it through its own entry guard,
so the export keyword was dead surface either way.

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-13 03:45:36 -07:00
Vincent Koc 03e89dc9d5 fix(release): include plugin tooling dependencies (#123082) 2026-08-13 17:22:11 +08:00
Peter Steinberger 3b6e54041f ci: replace dependency sticky disk with exact cache (#123040)
Amp-Thread-ID: https://ampcode.com/threads/T-019ff3db-c467-70ad-8ed3-81f2ba94b0c0

Co-authored-by: Amp <amp@ampcode.com>
2026-08-13 01:13:25 -07:00
Vincent Koc 8371831eba fix(ci): validate duplicate coverage on frozen targets 2026-08-13 14:37:21 +08:00
Peter Steinberger fba9ad43bc fix(ci): run affected extension suites when changed-test planning falls back (#122885)
The PR-changed test planner fails safe to the compact full-suite plan for any diff touching packages/**, but that compact plan excludes all extension test configs, so mixed package+extension PRs landed with zero extension test execution (escapes: PR #120534 breaking extensions/codex run-attempt.native-hook-relay.test.ts, PRs #122163/#121522 and cd7b7f639d breaking media-understanding-provider.test.ts and thread-lifecycle.test.ts on main full runs). The preflight now appends whole-config shards for the diff's touched extensions whenever the precise plan fails safe; whole configs (not precise targets) because the fail-safe cause leaves the non-extension diff's extension impact unbounded.
2026-08-12 18:51:00 -07:00
Peter Steinberger be600d0a24 fix: restore Telegram release isolation checks (#122843)
* fix(release): repair isolated Telegram QA runtime

sticky runner/SUT suite root permits config locks without config replacement; add PS1 after attested env verification for nested login shells.

* test(node-host): own desktop teardown resets
2026-08-12 16:21:45 -07:00
Vincent Koc d82edfc4d2 fix(ci): preserve periphery artifacts across reruns (#122743) 2026-08-13 01:56:00 +08:00
Vincent Koc 716f996be8 fix(ci): prepare sandbox before repo E2E (#122525) 2026-08-12 16:08:19 +08:00
Peter Steinberger 3dcd494f66 improve(ci): reuse built dist for Doctor proof (#122491)
Amp-Thread-ID: https://ampcode.com/threads/T-019ff3db-c467-70ad-8ed3-81f2ba94b0c0

Co-authored-by: Amp <amp@ampcode.com>
2026-08-11 23:51:59 -07:00
Peter Steinberger 66fe424590 fix(release): trust canonical beta Telegram QA candidates (#122480)
Canonical beta branch head exact-SHA provenance; unique merged-PR attribution for GitHub web-flow signed transport; extract duplicated gate into one trusted helper.
2026-08-11 23:25:56 -07:00
Peter Steinberger 72e42eed48 improve(ci): reduce main gating delays and add timing trends (#122441)
* ci: stop publishing warm dependency snapshots

Amp-Thread-ID: https://ampcode.com/threads/T-019ff3db-c467-70ad-8ed3-81f2ba94b0c0

* ci: isolate the high-variance source test shard

Amp-Thread-ID: https://ampcode.com/threads/T-019ff3db-c467-70ad-8ed3-81f2ba94b0c0

* ci: guarantee rebuilt dependency snapshot publication

Amp-Thread-ID: https://ampcode.com/threads/T-019ff3db-c467-70ad-8ed3-81f2ba94b0c0

* ci: add balanced main timing trends

Amp-Thread-ID: https://ampcode.com/threads/T-019ff3db-c467-70ad-8ed3-81f2ba94b0c0

* fix(ci): fall back when Crabbox CLI is unavailable

Amp-Thread-ID: https://ampcode.com/threads/T-019ff3db-c467-70ad-8ed3-81f2ba94b0c0

* Revert "fix(ci): fall back when Crabbox CLI is unavailable"

This reverts commit 0583ac8a9d.

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-11 22:26:39 -07:00
joshavant 49dabadf86 fix(ci): avoid unrelated iOS release-gate runs 2026-08-11 20:35:35 -05:00
Peter Steinberger e6b439e1cb test(ci): parallelize channel contract projects (#122336)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-11 16:46:53 -07:00
Peter Steinberger 25f7fc0ec5 test(ci): skip unrelated Bun launcher builds (#122333)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-11 16:21:44 -07:00
Sliverp 84c7d45f15 refactor(qqbot): install plugin from Tencent package (#107295)
* refactor(qqbot): remove bundled extension source

Mechanical deletion half of the #107295 squashed rebase; the catalog
repoint and host integration land in the follow-up commit.

Co-authored-by: sliverp <870080352@qq.com>

* refactor(qqbot): install plugin from Tencent package

Squashed rebase of #107295 onto current main. Repoints the official
external channel catalog at @tencent-connect/openclaw-qqbot@2.0.1 and
adapts onboarding, doctor migrations, secrets, build guards, and tests.

Documents the known limitation that the external package does not
support structured SecretRef clientSecret values; operators move those
to QQBOT_CLIENT_SECRET or clientSecretFile before upgrading.

Co-authored-by: sliverp <870080352@qq.com>

* fix(doctor): reuse shared hasOwnKey record helper

The rebased QQBot migration carried its own hasOwnKey export, colliding
with the one main now ships in legacy-config-record-shared.ts.

Co-authored-by: sliverp <870080352@qq.com>

* fix(plugins): carry catalog integrity through the update bridge

The externalized-bundled-plugin bridge dropped the official catalog's
expectedIntegrity pin, so bundled-user updates installed the external
npm package without integrity verification. The bridge now carries the
pin for the catalog's exact npm spec and both bridge install calls pass
it through; update-channel spec overrides intentionally skip the pin
since it only covers the pinned version.

Co-authored-by: sliverp <870080352@qq.com>

* chore(plugin-sdk): refresh per-entrypoint API baselines

The QQBot compat export and bundled-type removal shift 26 entrypoint
closure hashes in the new split baseline layout.

Co-authored-by: sliverp <870080352@qq.com>

* refactor(qqbot): drop helper reintroduced during rebase

Main's coercion consolidation added this file after the deletion
commit's base; its only consumers were the removed qqbot sources.

Co-authored-by: sliverp <870080352@qq.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-11 15:10:27 -07:00
Josh Lehman d035dba6c7 chore: scope SQLite session lifecycle CI (#121917)
* oc-358: scope SQLite lifecycle CI

* chore(ci): cover shared session lifecycle owner
2026-08-11 15:06:46 -07:00
Vincent Koc 653ab3b2aa fix(ci): restore duplicate scans with jscpd 5 (#122124) 2026-08-12 01:39:40 +08:00
Peter Steinberger cad77fb39c refactor: consolidate remaining coercion helpers (#122020) 2026-08-11 10:22:01 -07:00