Commit Graph

1859 Commits

Author SHA1 Message Date
Peter Steinberger
e0b1a39d2a improve(i18n): generate native locales after merge (#111557)
* ci(i18n): move native locale generation post-merge

* fix(i18n): allow generated Android companions
2026-07-19 15:42:41 -07:00
Peter Steinberger
3247a56d15 fix(ui): prevent cross-file mock leakage in Control UI tests (#111554)
* test(ui): stop shared mock registry leakage

* ci: add three-worker UI leakage canary
2026-07-19 15:38:50 -07:00
Peter Steinberger
d9c9eeb8cd fix(ci): resolve manual protocol baseline 2026-07-19 14:53:32 +01:00
Peter Steinberger
3b84a55d99 refactor(protocol): pre-publish cheat-window cleanup and vintage tracking (#111041)
* fix(codex): drain dynamic-tool handlers before side-thread cleanup

* refactor(protocol): rename question ids to questionId and flatten answer maps

* refactor(protocol): slim worker stack and unify session-catalog shapes

* refactor(protocol): delete dead public surface and polish packaging

* feat(protocol): track release-train vintage on gateway methods and schemas

* fix(apps): align question surfaces merged from main with reshaped protocol

* test(health): shape secret fixtures to scanner-safe token names

* test(health): use scanner-safe token fixtures

* fix(apps): align question surfaces merged from main with reshaped protocol

* fix(ci): prove reshaped protocol in shallow checks

* fix(ui): align sidebar question fixtures with protocol

* fix(apps): read flat Swift question answers

* fix(apps): align question surfaces merged from main with reshaped protocol

* fix(apps): refresh native question inventory

* fix(apps): align macOS snapshot fixtures with protocol

* fix(ui): align narration question fixture with protocol
2026-07-19 04:07:15 -07:00
Peter Steinberger
c7d2d111d8 fix(ci): enforce plugin SDK API baseline (#111289)
* fix(ci): enforce plugin SDK API baseline

* fix(plugin-sdk): refresh fs-safe API baseline
2026-07-19 02:38:58 -07:00
Mason Huang
c26d3cfbd0 fix(ci): skip Periphery scans for unrelated PR changes (#107991)
* fix(ci): scope Periphery to PR merge changes

* test(ci): align Periphery changed-test routing
2026-07-19 16:52:44 +08:00
Peter Steinberger
28ce6b8116 fix(macos): accept current native state schema (#111032) 2026-07-18 19:58:37 -07:00
Dallin Romney
6325b0f3c4 fix(qa): hydrate full profile live credentials (#110897) 2026-07-18 12:29:13 -07:00
Peter Steinberger
53ad69c6ee ci: hourly sweeper re-fires dropped pull_request CI runs (#110889)
* ci: add hourly PR CI sweeper for dropped pull_request runs

Fresh PRs race GitHub's merge-ref computation: the open-event CI run can
drop entirely or be created as an un-rerunnable startup_failure (~10-16
runs daily). The sweeper lists recently updated open PRs hourly, finds
heads whose only pull_request-event CI runs are startup failures (or
missing), and re-fires the event by close/reopen with the Barnacle app
token (GITHUB_TOKEN events would not trigger workflows).

Safety: 10-minute quiet window, 24h lookback, skips drafts, merge
conflicts, pending mergeability, and auto-merge PRs (close cancels
auto-merge); revalidates state, head, and CI attachment immediately
before mutating; per-PR budget of two sweeper closes and a per-sweep cap
of ten; reopen-on-unknown ownership so a stranded close (silent) always
loses to a spurious reopen (visible); manual dispatch supports dry_run.

Accepted tradeoffs are documented inline: shared-SHA PR topologies can
mask a dropped run (skip-only miss; run.pull_requests matching would
break fork PRs), and app-auth failover at worst doubles the close budget.

* test(ci): exercise pr-ci-sweeper runner with a faked client

* fix(test): lint-clean pr-ci-sweeper runner fakes
2026-07-18 20:18:57 +01:00
Peter Steinberger
a2f845e6c8 fix: control UI locale PRs fail to arm auto-merge (#110809)
* fix(ci): grant locale auto-merge token contents access

* style(ci): format locale workflow guards
2026-07-18 17:45:27 +01:00
xingzhou
faf3dbdda8 fix(ci): classify proxied APNs TLS tunnel (#110480)
* fix(ci): classify proxied APNs TLS tunnel

* fix(ci): prove network CodeQL contract changes

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 16:18:29 +01:00
Peter Steinberger
7a7c158210 perf(ci): parallelize gateway watch artifact check (#110609) 2026-07-18 11:01:08 +01:00
wanyongstar
a2b0cfed26 fix(ci): bound openclaw-npm-release git fetch operations with timeout (#109176)
* fix(ci): bound all openclaw-npm-release git fetch operations with timeout

Wrap all six git fetch commands with a 120-second deadline
and 10-second termination grace period, matching the pattern
established in #108940.

Fixes #109176

* test(ci): cover npm release fetch deadlines

Co-authored-by: wanyongstar <wan.yong@xydigit.com>

* ci: raise Control UI startup budget

Unblock exact-head builds after the compressed startup bundle reached the previous 370 KiB ratchet.

* ci: drop superseded Control UI budget bump

Current main now carries the smaller 340 KiB startup ratchet from #110528, so remove the temporary 372 KiB adjustment while keeping the PR head conflict-free.

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 09:23:56 +01:00
Peter Steinberger
2ba272bda6 improve(ci): warm import-heavy Vitest graphs (#110557)
* perf(ci): broaden Vitest transform cache seed

* fix(ci): declare cache slot clone helper
2026-07-18 09:20:14 +01:00
Peter Steinberger
64f3397874 fix(ci): persist warm runtime caches across runs (#110363)
* ci: make cache persistence verifiable

* test: fix cache guard CI failures

* test: narrow cache maintenance env

* fix(ci): stabilize vitest cache fingerprint

* test: stabilize lagging-history outbox check
2026-07-18 08:21:26 +01:00
Peter Steinberger
2612728b3b fix(ci): feed candidate identity JSON to validator (#110456) 2026-07-18 07:07:00 +01:00
wanyongstar
e6534018e1 fix(ci): bound qa-profile-evidence git fetch operations with timeout (#110282)
* fix(ci): bound qa-profile-evidence git fetch operations with timeout

* fix(ci): bound qa-profile-evidence git fetch operations with timeout

ci: retrigger checks

* test(ci): guard QA evidence fetch timeouts

Co-authored-by: wanyongstar <wan.yong@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-18 06:34:43 +01:00
wanyongstar
c1e5c1d4fa fix(ci): bound release-checks git fetch operations with timeout (#110028)
* fix(ci): bound release-checks git fetch operations with timeout

* fix(ci): bound release fetches across auth modes

Co-authored-by: wanyongstar <wan.yong@xydigit.com>

* style(ci): format release timeout guard

Co-authored-by: wanyongstar <wan.yong@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-18 06:32:19 +01:00
Peter Steinberger
700a089d3b ci(release): tolerate historical script contracts (#110365)
* ci(release): tolerate historical script contracts

* ci: escape stalled macOS retry capacity

* ci: freeze exact release-gate merge snapshot
2026-07-18 06:31:47 +01:00
wanyongstar
6aee64179c fix(ci): bound ci.yml git fetch operations with timeout (#110281)
* fix(ci): bound ci.yml git fetch operations with timeout

* test(ci): scope and guard fetch timeouts

Co-authored-by: wanyongstar <wan.yong@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 06:11:13 +01:00
wanyongstar
e8734d837e fix(ci): bound plugin-npm-release git fetch and npm publish with timeout (#110279)
* fix(ci): bound plugin-npm-release git fetch and npm publish with timeout

* fix(ci): bound plugin-npm-release git fetch and npm publish with timeout

ci: retrigger checks

* test(ci): guard plugin release timeouts

Co-authored-by: wanyongstar <wan.yong@xydigit.com>

* docs(ci): explain npm timeout recovery

Co-authored-by: wanyongstar <wan.yong@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 06:06:12 +01:00
Peter Steinberger
75d0260e0c ci(release): enforce reusable permission ceiling (#110353) 2026-07-18 04:07:42 +01:00
Peter Steinberger
6a6d3465d8 improve: shorten release candidate validation (#110316)
* ci(release): shorten candidate validation critical path

* ci(test): parallelize memory extension lane

* ci(release): preserve read-only candidate validation
2026-07-18 03:39:03 +01:00
Peter Steinberger
8c17d20cd9 improve(ci): preserve complete main validation during merge bursts (#110298)
* ci: serialize main and bound sticky caches

* fix(ci): pin cache warmer to validated SHA

* fix(ci): read current sticky retirement manifest
2026-07-18 03:27:54 +01:00
Peter Steinberger
3d1b771035 fix(ci): catch script declaration drift before merge (#110248)
* fix(ci): verify script declaration contracts

* fix(ci): harden declaration export analysis

* fix(ci): cover opaque script module exports

* test(ci): cover cyclic script declaration barrels
2026-07-18 02:54:26 +01:00
wanyongstar
e244a2b2f6 fix(ci): bound docs-agent git fetch operations with timeout (#110026) 2026-07-17 17:40:14 -07:00
wanyongstar
ef75d4fcce fix(ci): bound linux-app-release git fetch with timeout (#110027) 2026-07-17 17:40:04 -07:00
wanyongstar
b130f96c6f fix(ci): bound macos-release git fetch with timeout (#109174)
## Summary
- Problem: The `git fetch` in `macos-release.yml` had no timeout bound, risking indefinite CI hangs on network stalls. Same pattern already fixed for Mantis Crabbox workflows in #108940.
- Solution: Add `timeout --signal=TERM --kill-after=10s 120s` before the `git fetch` command.
- What changed: Wrapped the `git fetch --no-tags origin` command with timeout.
- What did NOT change: All release logic remains unchanged.

## Real behavior proof
- **Behavior addressed:** CI macos-release could hang during git fetch.
- **Evidence:** Same timeout pattern as merged Crabbox fix (#108940 / 16c2bbb).
- **Change:** `timeout --signal=TERM --kill-after=10s 120s git fetch --no-tags origin` replaces `git fetch --no-tags origin`.

## Root Cause
- The git fetch was added before the timeout-bounding pattern was standardized across CI workflows.
2026-07-17 17:39:53 -07:00
wanyongstar
64dd2535dc fix(ci): bound docs-sync publish repo git clone (#109173)
## Summary
- Problem: The `git clone` of `openclaw/docs.git` in `docs-sync-publish.yml` had no timeout bound, risking indefinite CI hangs on network stalls. Same pattern already fixed for Mantis Crabbox workflows in #108940.
- Solution: Add `timeout --signal=TERM --kill-after=10s 120s` before the `git clone` command.
- What changed: Wrapped the `git clone` command with timeout, matching the bounded pattern from #108940.
- What did NOT change: All retry logic, publish sync steps, and non-network operations remain unchanged.

## Real behavior proof
- **Behavior addressed:** CI docs-sync-publish workflow could hang indefinitely during git clone of external docs repo.
- **Real environment tested:** Pattern analysis and cross-reference with already-merged Crabbox fix (#108940 / 16c2bbb).
- **Exact change:** `if timeout --signal=TERM --kill-after=10s 120s git clone \` replaces `if git clone \`.
- **Evidence after fix:** Same `timeout --signal=TERM --kill-after=10s 120s` wrapper applied to Crabbox source retrieval.
- **What was not tested:** Live CI run.

## Root Cause
- The git clone was added before the timeout-bounding pattern was standardized across CI workflows. Missing automated check for unbounded external git operations.
2026-07-17 17:39:45 -07:00
Peter Steinberger
a6102690dd perf(ci): cut the pre-fan-out critical path and bin canonical main runs (#110183)
* perf(ci): cut the pre-fan-out critical path on canonical runs

Two changes to the run head and matrix shape:

1. runner-admission was a hosted 90s sleep every run queued behind
(observed 1.7min hosted-queue latency before the sleep started). The
debounce now lives at the tail of preflight: heavy jobs all need
preflight, so a superseding main push still cancels the run before
fan-out while only one 4 vCPU runner has been spent, and preflight's
own work usually exceeds the window so the residual sleep is zero.
security-fast (hosted, dependency-free) starts immediately.

2. Canonical main pushes now use the compact bin plan like PRs: the
82-job named matrix drained the runner pool for ~4.5min (job starts
trickled from minute 5.2 to 9.7 in run 29592647843) with no
branch-protection consumer for per-shard names on main. Coverage is
identical; dispatch/release-gate runs keep the full named matrix.

* perf(test): boot TUI PTY suite fixtures concurrently

tsx+TUI startup dominated the harness file's wall time and the three
suite PTYs booted serially. Boot them concurrently in beforeAll
(allSettled so a failed boot still assigns survivors for afterAll
cleanup); the env-specific fixtures never receive input, so their tests
only await their own readiness output. The slow-startup test now proves
frame ordering on the append-only output, which the old sequential
waits did not. File wall 10.2s -> ~4.9s, 3/3 repeat runs green.

* docs(ci): align gate and debounce descriptions with the removed admission job

* test(tooling): wait for readiness file content, not existence

writeFileSync creates the file before its bytes land, so the existence
poll raced the child's write on loaded runners and read an empty ready
file (observed in compact-small-4, run 29615028678). Poll for non-empty
content at both readiness sites.
2026-07-18 01:05:07 +01:00
Peter Steinberger
b0a2d02427 fix(ci): make plugin SDK API manifest mergeable (#110228) 2026-07-18 00:16:39 +01:00
Peter Steinberger
da44d52ac6 feat: ask_user — structured questions from the agent with web card, channel buttons, and text answers (#109922)
* feat(gateway): add transient question runtime (question.* methods + broadcasts)

* feat(agents): add blocking ask_user question tool with chat prompt delivery and text-reply claim

* feat(ui): interactive in-thread question cards for ask_user

* feat(channels): native tap-to-answer buttons for ask_user on Telegram, Discord, and Slack

* feat(ui): unify codex and gateway question cards with interactive gateway answering

* refactor(agents): collapse ask_user pending state to one registry; docs for ask_user

* fix(agents): include ask_user in normal gateway runs; add question-flow control-ui e2e

* test(ui): avoid credential-shaped fixture in question card test

* refactor(ui): reorder stream-group context keys

* fix(gateway,ui): validate question answers at resolve; reject secret/duplicate-label questions; UI retry and reconnect hardening

* fix(gateway,agents): canonicalize accepted option answers; bound ask_user option labels to 64 chars

* chore(ci): prune unused question exports, allowlist mobile question events, fix discord lint

* chore(ci): regenerate protocol/i18n/docs/tool-display artifacts for question surface

* fix(protocol): flatten QuestionRecord for native codegen; drop TS-only alias from schema registry

* chore(android): regenerate ask-user localization resources

* docs: regenerate docs map after rebase

* fix(ci): avoid stale read-only dependency disks

* test: remove stale reef lint suppression ratchet

* fix(ci): keep source locale drift advisory in release gates

* fix(ci): scope locale advisory handling to parity check
2026-07-17 22:24:17 +01:00
Peter Steinberger
bab9a5ede7 fix(release): keep beta Telegram advisory nonblocking 2026-07-17 22:18:10 +01:00
Peter Steinberger
e7801deb57 fix(release): fail fast on flaky beta QA 2026-07-17 21:55:27 +01:00
Peter Steinberger
7d3b5f56af fix(release): harden beta validation feedback 2026-07-17 21:55:27 +01:00
Dallin Romney
da17178ffc fix(ci): extend frozen target hook timeout (#109564)
* fix(ci): extend frozen target hook timeout

* test(ci): align package acceptance omission default

* fix(android): refresh Japanese disable translation
2026-07-17 12:31:24 -07:00
Peter Steinberger
69b83b515a fix(ci): default package acceptance omission flag 2026-07-17 20:01:07 +01:00
Peter Steinberger
8367253f61 fix(ci): let cancelled main runs trigger the cache warm writer
Success-only gating starved the deps/vitest snapshots: under merge
traffic every main push cancels the prior CI run, so the deadline
writer skipped for hours (15:34->18:45 observed) while PRs paid full
reinstalls against stale fingerprints. The warm job checks out main
tip regardless of the triggering run, so cancelled completions are
safe refresh signals; failed runs still skip.
2026-07-17 11:51:36 -07:00
Peter Steinberger
4ef86b149d test(apple): isolate OpenClawKit CI builds (#110088) 2026-07-17 18:58:39 +01:00
Peter Steinberger
7f2867997f ci: allow release macOS cache finalization 2026-07-17 17:32:06 +01:00
Peter Steinberger
0476243d5d fix(release): honor unreleased changelog opt-in 2026-07-17 16:23:17 +01:00
Peter Steinberger
363e8b09ec fix(release): honor explicit unreleased dry-run input 2026-07-17 13:43:12 +01:00
Peter Steinberger
c149489703 ci: trim release metadata and ClawHub checkouts 2026-07-17 13:43:12 +01:00
Peter Steinberger
cb70d7104e ci: speed up release preparation 2026-07-17 13:43:12 +01:00
Peter Steinberger
00a64f6e95 ci: bound Blacksmith sticky disk growth (#109934) 2026-07-17 12:13:28 +01:00
Peter Steinberger
d3143ced6d perf(ci): collapse remaining per-PR sticky-disk minters to O(1) keys (#109929)
The installation hit Blacksmith's backing-disk cap because sticky keys
embedded PR numbers and content hashes, minting a new disk per PR and
per input change until every mount 429-failed fleet-wide. node-deps
(#109752) and ext-boundary (#109804) were already re-keyed; this
converts the last two minters and audits the third suspect.

Keys changed:
- Vitest fs transform cache: `vitest-fs-v2-<pr-N|protected>-...` ->
  the one existing `vitest-fs-v2-protected-<os>-<arch>-node-<ver>`
  disk. Entries are content-hash keyed (vitest sha1 over
  id+content+NODE_ENV+version+env config), so cross-PR sharing is safe
  by construction: PRs now mount the protected snapshot directly
  (read-only, commit false) and the separate PR-only seed mount is
  deleted. Writers (non-PR shard writer + scheduled warm run) keep
  explicit commit true. Disk count: 1 + O(open PRs) -> 1.
- Gradle: `gradle-v1-<task>-<pr-N|protected>-<hashFiles(deps)>` ->
  `gradle-v2-<task>`. Task scope stays (light ktlint must not seed
  heavy build lanes); PR number and dependency hash leave the key. The
  dependency hash moved to an in-job fingerprint marker that makes the
  non-PR writer rebuild its snapshot cold when inputs change, bounding
  disk growth; PR mounts are read-only and safely reuse stale
  snapshots because Gradle caches are content-addressed. Disk count:
  O(tasks x PRs x dependency bumps) -> O(tasks) (7 today).
- Docker builder (useblacksmith/setup-docker-builder): audited, out of
  scope. The action owns its key internally and always uses the repo
  name only (src/setup_builder.ts getStickyDisk), so it is already one
  disk per installation repo and cannot mint per-PR disks.

PR warm-path behavior changes:
- Vitest: PRs lose only PR-local warm entries for files the PR itself
  changed (previously persisted on the pr-N disk between pushes);
  changed files re-transform once per push, unchanged files still hit
  the protected snapshot. PRs touching transform inputs
  (lockfile/tsconfig/package.json) run cold per push since the
  generation wipe is now local to the discarded clone.
- Gradle: dependency-bump PRs get warmer (stale-but-valid protected
  snapshot instead of a cold fresh key); other PRs are unchanged.

Deleted `.github/workflows/pr-cache-cleanup.yml`: it existed for the
per-PR cache layer (#109425) and only deleted GitHub actions/cache
archives, which GitHub's own LRU/TTL eviction already handles for the
remaining fork/Windows per-PR archive paths.

Guards: pinned the O(1) vitest key + non-PR commit gate, added a
Gradle per-task key/writer/fingerprint guard, added a repo-wide scan
asserting no useblacksmith/stickydisk key ever contains
github.event.pull_request.number or hashFiles(), and replaced the
cleanup-workflow assertions with a stays-deleted check.
2026-07-17 11:52:32 +01:00
Peter Steinberger
dfd457adc0 perf(ci): repair and re-key the extension-boundary sticky lane (#109804)
check-additional-extension-package-boundary is the light-run critical-path
pole. Measured on runs 29564442266/29564411446/29564259862 (8 vCPU, sticky
mounts 429-failing): Setup Node ~40s cold install, shard step 142-161s =
~101s cold plugin-sdk dts prep (nine parallel tsgo builds) + ~58s compiling
122 plugins at concurrency 6 + ~1s canary; warm actions/cache path on a main
push (29551077288) runs the shard in 67s.

Levers chosen from that data:
- Re-key the ext-boundary sticky disk from per-PR/per-config keys (v1) to one
  O(1) protected key (v2), following the node_modules snapshot fix in
  #109752. Blacksmith's installation-wide 1000-disk cap is saturated and
  every mount 429s; per-PR keys are a direct contributor. The config/scripts/
  lockfile hash moves from the key into the in-job .source-trees marker next
  to the existing tree-OID + node/pnpm gate. Single semantic writer: the
  boundary lane commits explicitly (true, not if-missing) on protected pushes
  only; PR mounts and the check-lint consumer stay read-only, and the seed
  step is now writer-only (saves ~11s per PR cold run).
- Bump the lane 8 -> 32 vCPU and raise OPENCLAW_EXTENSION_BOUNDARY_CONCURRENCY
  6 -> 16: both the parallel dts prep and the 122 plugin compiles scale with
  cores at similar billed core-minutes (same precedent as check-lint/deps).

Expected pole time: warm PR runs (protected snapshot tracks every main push)
drop to roughly checkout + install-skip + restore + incremental shard, well
under 2 minutes; cold runs that touch boundary trees shrink via the core
bump. Guarded in ci-workflow-guards so the O(1) key, single-writer commit,
and fingerprint composition cannot silently regress.
2026-07-17 10:30:09 +01:00
Peter Steinberger
ced50f88e9 fix(ci): allow detached release children after parent success 2026-07-17 09:48:38 +01:00
Peter Steinberger
a9ac13b2ef fix(ci): resolve trusted release loader 2026-07-17 09:21:20 +01:00
Peter Steinberger
8858944a81 fix(ci): isolate trusted release tooling dependencies 2026-07-17 09:12:58 +01:00