Repository navigation
perf(ci): cut redundant tests and reuse expensive setup - #28669
Conversation
511f212 to
e76c9cd
Compare
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Priority: ➖ Normal Merge Risk: 🔵 Low · up to
|
There was a problem hiding this comment.
Actionable comments posted: 2
🔇 Additional comments: 49
src/cli/browser-empty-values.test.ts: 1
135-213: LGTM!src/cli/index.test.ts: 1
462-470: LGTM!Also applies to: 479-479, 494-497
src/cli/terminal-format.test.ts: 1
10-10: LGTM!Also applies to: 272-290
config/scripts/generated-artifact-line-ending-pin.test.mjs: 1
24-26: LGTM!config/scripts/workflow-ref-reachability.test.mjs: 1
99-100: LGTM!src/renderer/src/components/settings/GeneralPane.test.ts: 1
12-16: LGTM!src/renderer/src/components/onboarding/OnboardingFlow.test.tsx: 1
221-221: LGTM!src/shared/constants.test.ts: 1
2-2: LGTM!src/shared/contextual-tours.test.ts: 1
2-4: LGTM!mobile/src/session/mobile-native-chat-merged-snapshot-parity.test.ts: 1
212-212: LGTM!Also applies to: 224-224
tests/e2e/helpers/e2e-completed-onboarding-profile.ts: 1
50-51: LGTM!tests/e2e/onboarding.spec.ts: 1
163-169: LGTM!Also applies to: 207-207
tests/e2e/tabs.spec.ts: 1
396-396: LGTM!Also applies to: 425-425
tests/e2e/worktree-reveal-host-sections.spec.ts: 1
21-31: LGTM!config/scripts/pr-e2e-gate-contract.test.mjs: 1
213-214: LGTM!Also applies to: 240-268
config/scripts/pr-e2e-source-routing.mjs: 1
12-14: LGTM!Also applies to: 17-17, 260-263, 274-275
config/scripts/node-server-change-scope.mjs: 1
21-21: LGTM!config/scripts/vitest-dom-setup.ts: 1
1-7: LGTM!config/scripts/happy-dom-offscreen-canvas.ts: 1
52-52: LGTM!config/scripts/vitest-host-ports-setup.ts: 1
18-23: LGTM!Also applies to: 26-28, 43-43
config/tsconfig.node.json: 1
11-13: LGTM!config/vitest.config.ts: 1
40-40: LGTM!config/patches/i18next-cli@1.74.2.patch: 1
2-2: LGTM!Also applies to: 23-168, 170-197, 201-201, 222-368, 369-398
config/scripts/localization-extraction-call-syntax.test.mjs: 1
56-98: LGTM!src/main/agent-hooks/server-transport-interference.test.ts: 1
51-73: LGTM!src/main/daemon/daemon-pty-startup-delivery.test.ts: 1
76-88: LGTM!Also applies to: 104-110
src/main/daemon/slow-daemon-session-verification.test.ts: 1
4-4: LGTM!Also applies to: 19-19, 53-53, 90-90, 124-150
src/main/hook-termination-real-process.test.ts: 1
39-40: LGTM!src/main/provider-process/provider-process-supervisor.integration.test.ts: 2
413-418: LGTM!Also applies to: 432-434, 531-534, 554-560
351-374: 📐 Maintainability & Code QualityThe preload runs before the inline supervisor script. It patches
childProcess.spawnbefore the supervisor executesconst { spawn } = require('node:child_process'). The supervisor then uses that patched binding for the provider launch. Thefork,execFile, and ESM import alternatives do not apply.The
provider-startedassertion would be redundant because the marker already detects the provider spawn.src/shared/git-branch-line-total-soft-deadline.test.ts: 1
37-72: LGTM!src/renderer/src/components/native-chat/NativeChatMessageList.rail-history-jump.test.tsx: 1
116-125: LGTM!Also applies to: 216-216
cloud/apps/relay/src/drain-release-cell-row-contention-postgres.test.ts: 1
35-36: LGTM!config/scripts/process-host-build-dist.test.mjs: 1
114-126: LGTM!src/main/native-chat/transcript-opencode2-sqlite.test.ts: 1
29-32: LGTM!Also applies to: 161-162
mobile/src/test-support/rpc-recording/golden-value-pool.ts: 1
92-97: LGTM!cloud/apps/relay/src/public-assignment-drain-return-lane.test.ts: 1
366-371: 🎯 Functional CorrectnessNo flaky path is established.
elapsedMsadvances in fixed 20 ms steps under fake timers. The director selection is deterministic. The 250 drained arrivals also exceed the shared inventory-lock throughput and the five directors' combined admission capacity, so the reduced cohort must produce at least one deferral.src/shared/git-binary-compatibility.test.ts: 1
43-51: LGTM!Also applies to: 73-75, 92-96
src/main/git/worktree-rebase-update-refs-real-git.test.ts: 1
14-26: LGTM!Also applies to: 48-52
src/main/git/worktree-safety-real-git.test.ts: 1
41-44: LGTM!Also applies to: 48-54, 57-57, 64-64
.github/workflows/ci-cache-warmup-platform-jobs.yml: 1
56-65: LGTM!Also applies to: 67-77
.github/workflows/ci-cache-warmup-platforms.yml: 1
37-42: LGTM!config/scripts/orcad-windows-prebuild-workflow.test.mjs: 1
228-228: LGTM!Also applies to: 292-293
.github/workflows/node-server-tests.yml: 1
30-30: LGTM!Also applies to: 48-48, 123-124
config/scripts/node-server-change-scope.test.mjs: 1
530-530: LGTM!.github/actions/prepare-orcad-prebuilds/action.yml: 1
66-67: 🩺 Stability & AvailabilityNo prerequisite change is needed.
The install action runs
pnpm run --if-present build:packagesafter installation, including on cache hits. The direct invocations therefore do not bypass the required package build.src/main/ssh/orcad-state-mutation-fence-heartbeat.test.ts: 1
80-82: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
⚠️ Unverified finding
Verification ran but could not confirm this finding. It is shown for review, not as a verified issue.The fixed 300 ms pauses are tight under CI load.
These pauses ensure a stale fence is not refreshed after the host dies or after the owner changes. They are negative checks, so a slow runner cannot cause a false failure. A pause that is too short can only cause a false pass. The heartbeat interval is 0.1 s, so 300 ms covers roughly three beats.
The line 100 and line 119 pauses behave the same way. Each is a negative observation window. A false pass is possible only if the heartbeat is delayed past the window. The window does not synchronize with the real event. This is acceptable for negative assertions.
Add a short comment that these are bounded negative observation windows. This prevents later "fixes" that shorten them further.
Also applies to: 100-100, 119-119
config/scripts/playwright-focused-workflow-selection.test.mjs: 1
78-107: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low value
⚠️ Unverified finding
Verification ran but could not confirm this finding. It is shown for review, not as a verified issue.Concurrent runs may exceed the 20-second timeout under load.
All commands now start at once with
timeoutMs: 20_000each. On a loaded CI runner, parallel Playwright--listprocesses can time out. Failures would then be flaky. Consider bounding concurrency or raising the timeout.src/shared/git-binary.test-fixture.ts: 1
49-54: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win
⚠️ Unverified finding
Verification ran but could not confirm this finding. It is shown for review, not as a verified issue.Set
GIT_TERMINAL_PROMPT=0and an emptyGIT_ASKPASSin the isolated environment.The fixture isolates
HOMEandXDG_CONFIG_HOME. It does not disable credential prompts. In local mode,process.envis inherited. An inherited askpass helper orcore.askPasssetting can then block a Git command that needs credentials. Add both variables as defaults. Callers can still override them throughenv.Based on learnings: when spawning Git in non-interactive contexts, set both GIT_TERMINAL_PROMPT=0 and GIT_ASKPASS="" so Git fails fast instead of hanging.Proposed fix
const isolatedEnv = { HOME: this.executionRoot, XDG_CONFIG_HOME: this.executionRoot, GIT_CONFIG_NOSYSTEM: '1', + GIT_TERMINAL_PROMPT: '0', + GIT_ASKPASS: '', ...env }Source: Learnings
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
a5e27943-9ce7-403b-9dd8-9b36baa36ec7
⛔ Files ignored due to path filters: 1
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing: 87
.github/actions/prepare-orcad-prebuilds/action.yml.github/actions/prepare-wayland-clipboard/action.yml.github/workflows/ci-cache-warmup-platform-jobs.yml.github/workflows/ci-cache-warmup-platforms.yml.github/workflows/ci-cache-warmup.yml.github/workflows/node-server-tests.yml.github/workflows/pr.ymlcloud/apps/relay/src/drain-release-cell-row-contention-postgres.test.tscloud/apps/relay/src/public-assignment-drain-return-lane.test.tscloud/apps/relay/src/reserve-placement-simulation.test.tsconfig/patches/i18next-cli@1.74.2.patchconfig/scripts/build-wayland-clipboard.test.mjsconfig/scripts/electron-builder-mac-channel-config.test.mjsconfig/scripts/generated-artifact-line-ending-pin.test.mjsconfig/scripts/happy-dom-offscreen-canvas.tsconfig/scripts/locale-ko-key-overrides.test.mjsconfig/scripts/localization-extraction-call-syntax.test.mjsconfig/scripts/mobile-web-app-browser-pane-text-inputs.test.mjsconfig/scripts/mobile-web-app-module-closure.test.mjsconfig/scripts/mobile-web-app-session-terminal-closure.test.mjsconfig/scripts/mobile-web-app-session-text-inputs.test.mjsconfig/scripts/mobile-web-app-terminal-live-input-render.test.mjsconfig/scripts/mobile-web-app-text-input-discovery.test.mjsconfig/scripts/node-server-change-scope.mjsconfig/scripts/node-server-change-scope.test.mjsconfig/scripts/orcad-windows-prebuild-workflow.test.mjsconfig/scripts/playwright-focused-workflow-selection.test.mjsconfig/scripts/pr-code-change-scope.mjsconfig/scripts/pr-code-change-scope.test.mjsconfig/scripts/pr-e2e-gate-contract.test.mjsconfig/scripts/pr-e2e-source-routing.mjsconfig/scripts/process-host-build-dist.test.mjsconfig/scripts/shebang-script-line-ending-pin.test.mjsconfig/scripts/vitest-dom-setup.tsconfig/scripts/vitest-host-ports-setup.tsconfig/scripts/workflow-ref-mirror-case-safety.test.mjsconfig/scripts/workflow-ref-reachability.test.mjsconfig/tsconfig.node.jsonconfig/vitest.config.tsmobile/src/session/mobile-native-chat-merged-snapshot-parity.test.tsmobile/src/test-support/rpc-recording/golden-value-pool.tssrc/cli/browser-cookie-credentials-empty-value.test.tssrc/cli/browser-empty-values.test.tssrc/cli/index.test.tssrc/cli/specs/file.test.tssrc/cli/specs/search.test.tssrc/cli/terminal-format-draft.test.tssrc/cli/terminal-format.test.tssrc/main/agent-hooks/server-transport-interference.test.tssrc/main/daemon/daemon-pty-startup-delivery.test.tssrc/main/daemon/slow-daemon-session-verification.test.tssrc/main/git/repo-ref-maintenance-real-git.test.tssrc/main/git/worktree-rebase-update-refs-real-git.test.tssrc/main/git/worktree-safety-real-git.test.tssrc/main/hook-termination-real-process.test.tssrc/main/native-chat/transcript-opencode2-sqlite.test.tssrc/main/provider-process/provider-process-supervisor.integration.test.tssrc/main/ssh/orcad-state-mutation-fence-heartbeat.test.tssrc/renderer/src/components/native-chat/NativeChatMessageList.rail-history-jump.test.tsxsrc/renderer/src/components/onboarding/OnboardingFlow.test.tsxsrc/renderer/src/components/onboarding/OnboardingInlineCommandTerminal.test.tssrc/renderer/src/components/settings/GeneralPane.test.tssrc/renderer/src/components/settings/browser-cookie-import-label.test.tssrc/renderer/src/components/settings/osc52-clipboard-copy.test.tssrc/renderer/src/components/settings/setting-ownership.test.tssrc/renderer/src/components/sidebar/wsl-host-copy-catalog.test.tssrc/renderer/src/i18n/ja-technical-literal-mistranslations.test.tssrc/renderer/src/i18n/ko-ui-semantic-mistranslations.test.tssrc/renderer/src/i18n/locale-english-regression.test.tssrc/renderer/src/i18n/native-chat-locales.test.tssrc/renderer/src/i18n/relative-duration-copy-localization.test.tssrc/renderer/src/i18n/settings-status-label-localization.test.tssrc/renderer/src/i18n/technical-literal-catalog-values.test.tssrc/renderer/src/i18n/zh-technical-literal-mistranslations.test.tssrc/shared/constants.test.tssrc/shared/contextual-tours.test.tssrc/shared/feature-tips.test.tssrc/shared/git-binary-compatibility.test.tssrc/shared/git-binary.test-fixture.tssrc/shared/git-branch-line-total-soft-deadline.test.tssrc/shared/native-chat-types.test.tstests/e2e/browser-tab.spec.tstests/e2e/helpers/e2e-completed-onboarding-profile.tstests/e2e/onboarding.spec.tstests/e2e/tabs.spec.tstests/e2e/terminal-tui-wheel-drain.spec.tstests/e2e/worktree-reveal-host-sections.spec.ts
💤 Files with no reviewable changes: 28
- src/cli/specs/file.test.ts
- src/renderer/src/components/settings/setting-ownership.test.ts
- src/renderer/src/components/settings/osc52-clipboard-copy.test.ts
- src/renderer/src/i18n/relative-duration-copy-localization.test.ts
- config/scripts/mobile-web-app-module-closure.test.mjs
- src/renderer/src/components/onboarding/OnboardingInlineCommandTerminal.test.ts
- src/renderer/src/i18n/technical-literal-catalog-values.test.ts
- src/renderer/src/components/settings/browser-cookie-import-label.test.ts
- src/cli/terminal-format-draft.test.ts
- src/renderer/src/components/sidebar/wsl-host-copy-catalog.test.ts
- src/cli/browser-cookie-credentials-empty-value.test.ts
- config/scripts/mobile-web-app-browser-pane-text-inputs.test.mjs
- src/renderer/src/i18n/zh-technical-literal-mistranslations.test.ts
- src/renderer/src/i18n/locale-english-regression.test.ts
- src/renderer/src/i18n/ja-technical-literal-mistranslations.test.ts
- config/scripts/shebang-script-line-ending-pin.test.mjs
- src/renderer/src/i18n/native-chat-locales.test.ts
- src/shared/native-chat-types.test.ts
- src/shared/feature-tips.test.ts
- config/scripts/locale-ko-key-overrides.test.mjs
- src/renderer/src/i18n/settings-status-label-localization.test.ts
- cloud/apps/relay/src/reserve-placement-simulation.test.ts
- config/scripts/mobile-web-app-session-text-inputs.test.mjs
- src/renderer/src/i18n/ko-ui-semantic-mistranslations.test.ts
- config/scripts/electron-builder-mac-channel-config.test.mjs
- src/cli/specs/search.test.ts
- config/scripts/workflow-ref-mirror-case-safety.test.mjs
- tests/e2e/browser-tab.spec.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 1 remain after this review.
…NG-CI # Conflicts: # mobile/src/tasks/use-mobile-jira-connection-state.test.ts # src/main/runtime/orca-runtime-files-artifact-facade.test.ts # src/renderer/src/components/JiraIssueWorkspace.tsx # src/renderer/src/store/slices/pull-request-generation.ts
288 commits landed on main between 9c113ed and 67fe1e1, and all six catalogs and en-runtime-required.json conflicted. They are taken from main and the prune is recomputed in one pass: 1,475 keys. Four Hermes keys left the set because stablyai#28877 deleted them from main, and two Jira keys joined it after stablyai#28590 and stablyai#28612 stopped reading them. en.json goes from 16,098 entries to 14,623; en-runtime-required.json keeps 558 of them. stablyai#28669 deleted ko-ui-semantic-mistranslations.test.ts, technical-literal-catalog-values.test.ts and zh-technical-literal-mistranslations.test.ts from main. This branch only removed the entries of pruned keys from them, so the deletion is taken.
main moved 171 commits. Two kinds of conflict: - es, fr, ja, ko and zh: the translation sync (stablyai#28896) and this branch both appended keys to the end of auto.components.TaskPage. main's six Jira column labels and jiraBoardEmptyColumn come first, then the four labelCount and memberCount sentences from this branch. - ko-ui-semantic-mistranslations.test.ts was deleted on main (stablyai#28669); this branch only dropped the pinned sshImportSynced value from it, so the deletion is taken. en.json merged on its own. Against main the branch still removes the same twelve keys and adds the same 24 in all six catalogs, with no other value changed.
ELI5
The same runners spend less time repeating setup, waiting, and rebuilding identical inputs. Hosted CI confirms large improvements in targeted tests, while the full unit suite is slower than the older baseline as main adds more tests.
What Changed
Why
Runner capacity is fixed. Reusing setup and removing idle waits improves useful work per runner without adding shards. This also deliberately drops selected narrow safeguards, including exact translations, the onboarding retry-cap helper, and the browser-pane input-size census, in favor of broader behavioral and validation suites. Those specific regression checks and prolonged Cloud stress coverage are reduced. Main's removal of the per-merge server matrix in #28664 is excluded from this PR's gains.
Linked Issue
N/A — internal CI maintenance.
Visual Proof
N/A — no product layout or interaction changes.
Testing
Current revision:
a61047a0c615, merged with main7244bf3e6f0. The only conflict was the independently repaired transcript filesystem mock; the merged version retains forwarding spies for named and default exports, native stream classes, and every case/assertion/deadline. Focused verification passed 58 cases and Node typecheck. Fresh qualification for this exact revision passed PR Checks run 38650417532, testing merge445d83b2e27f24b76d1599e7b413ba0721eb96c6against main7244bf3e6f0. All 80 checks completed: 64 successes and 16 expected skips, including all four Windows SSH lanes. All five unit shards passed: 12,165 files passed, 151 skipped, zero unhandled errors. Their five diagnostic ZIP digests, all 20 report hashes, exact source/runtime/run provenance, and complete 12,316-file source inventory were independently verified. Combined unit runner occupancy is 50.73 minutes, including 182 seconds outside the test steps. That is six seconds above the preceding 50.63-minute qualification and 4.46% above the original 48.57-minute baseline; source/workload differences prevent attributing that delta to this PR. No whole-unit or whole-CI speedup is claimed. A separately reviewed complete audit binds all 80 checks to 13 successful pull-request workflows. Compared with the prior green4334e9qualification, total occupancy is 262.97 → 264.93 runner-minutes (+0.75%), while observed whole-head completion elapsed is 24m53s → 19m50s. Unit plus package occupancy is 3,823 → 4,160 seconds (+8.82%); retained Electron cases moved into package gates are included. The older run also executes a 401-second native WSL gate skipped in the fresh run, so its lower PR-only total is not a comparable workload saving. Source, workload, caches and runner conditions differ; these are observations, not causal estimates. The completed qualification below applies to prior repair revision1dc4a8f24d26216135677939e8b76e34533fef5b. Previous repaired PR checks test merge8d7f46198b99432efd104ac7803174173b367c66against maine53b20095d3ca98df120cd0a3ef4814e945a9779. All five unit shards passed in attempt 1: 12,163 files passed, 151 skipped, zero unhandled errors. All 20 report hashes and source/runtime/run provenance were verified with complete file coverage. Their combined runner occupancy is 50.63 minutes, versus 53.37 at the prior qualified revision below and 48.57 at the older baseline. This remains 4.2% above the older baseline with a changed workload; no whole-unit or whole-CI speedup is claimed. All PR Checks jobs passed, including static analysis, Linux and Windows packaging, Electron lanes, and the aggregate. All 80 reported checks are now complete: 65 succeeded and 15 skipped as expected, including all four auxiliary Windows SSH host lanes. The ARM inbox lane passed in 28m35s; provisioning cost is included in runner occupancy.The failed preceding revision
5d67257d44fcb65efa9e7c1d221b082fd1053ef9is excluded from qualification. A newly introduced main suite recursively spied on native stream classes, causing ten unchanged 30-second deadlines to expire. Forwarding spies now observe the same five filesystem functions without altering those classes. All 13 cases, tracked read paths, assertions, and deadlines remain unchanged; the repaired hosted module passed in 389 ms, versus 300,554 ms in the failed run. Local direct Node/pool checks, Node typecheck, and independent review passed.The merge retains main's stronger Jira fixture/startup assertions and guide-projection test, the planned translation-test deletion, and unchanged package-test inventory extraction with checkout/fixture routing dependencies. Local validation passed the conflict/startup, routing, checkout/Mobile/package-registration cases, full typecheck, and commit lint/format hooks.
Completed prior qualification: revision
4334e9a95d03ec670354deb3f826fce9f485fae2; full PR checks passed on merge9b30c3c9dd6fb7dfe80d1e197a52698d53f3904fagainst maina0c46b405ff. All 65 hosted checks succeeded with 15 expected skips, including all four SSH Windows host lanes. All five unit shards passed in attempt 1: 12,122 files passed, 150 skipped, zero unhandled errors. All 20 report hashes and their source/runtime/run provenance were verified, with complete file coverage. Failed earlier runs are excluded from the comparison.Baselines: unit/preflight, Electron, Cloud, Mobile.
4334e9, queue excludedThe unit comparison uses identical Node 24.21.0/Bun 1.4.3 versions and runner labels. Main adds 194 unit files versus baseline; this PR adds two and removes 23 of the 34 removed files. Unchanged passing files have a median duration ratio of 1.00 (1.024 for baseline durations of at least 250ms). These observations support the targeted module improvement, not a whole-unit speedup. Two newly skipped modules are unchanged from main.
The Electron lane passed 30 cases with nine platform skips; all 28 retained cases in the five optimized specs passed, including all 16 reveal scenarios. The broader seven-spec lane occupied its runner for 877s. Baseline and final use Node 24.21.0/Electron 43.7.5. Source trees and shard selection differ; the summed case time includes app launch but excludes separate CI preparation/build/queue. It is not an overall CI wall-time measurement.
Cloud passed 2,910 tests with one skip; Mobile passed 10,635 with six skips. Cloud savings include deliberately smaller stress workloads: drain hosts decrease from 2,500 to 250 with the same proportions and a 300s→30s pace; PostgreSQL contention windows decrease from ten to five seconds at the same rates. These are not same-workload throughput gains. Mobile parity histories shrink from eight to two turns while retaining completed/interrupted/revised/dropped states, exhaustive enumeration, and the 70-turn case. Main adds four relay simulation cases/invariant tracking and 51 passing Mobile cases versus baseline; Push drops from 189 to 180 tests through ten upstream removals and one fixture-isolation regression added here. Source, runner, cache, and service variation limit attribution; no independent hosted hash-memoization gain is claimed.
Preflight passed at 161s versus 182s; extraction took 25s versus 31s. Successful candidates ranged 149–187s, so the branch's independent whole-job contribution is unproven. All extraction/catalog gates and terminal/execution-host smoke checks passed. Local same-source extraction was about 30% faster with approximately 0.5 GiB more peak memory; hosted numerical RSS is unavailable.
Server qualification passed all six persistence platforms and five Linux gates. All four platform warmers passed. The Windows packaging consumer restored the exact source key and reused all three executables; hook/launcher build steps took 1s/0s versus 35–45s cold. Caches are PR-scoped; sharing through main and Wayland warm-cache savings remain unverified. Runner types, matrix sizes, shard counts, and concurrency limits are unchanged; the daily server qualification adds scheduled demand within existing capacity.
Local validation passes full typecheck, root lint, anti-slop, changed-code quality, relevant behavioral tests, 34 startup cases under Bun and Node, and 32 Jira/build-safety cases. All 39 popup cases passed on macOS and isolated Linux with CI's runtime versions/environment; hidden-window evidence records no presentation calls. Earlier qualification covered full Mobile/Cloud commands, real Git 2.25.5/2.38.1/2.49.1/host compatibility, a cold Wayland build, and native tests. Full local lint has existing Mobile import cycles outside these edits; full E2E typecheck has existing errors. Hosted packaging and all required gates passed.
Review
Independent reviews covered retained assertions, workflow selection, cache validation, process cleanup, remote behavior, and platform/version compatibility. Cache-review dispositions: Wayland entries are immutable; a failed validation rebuilds from source, and repair of an invalid published entry requires bumping the existing key version. Making that literal an input would still require manual rotation and would not repair an entry automatically. Daily Windows qualification deliberately builds without restoration and publishes missing exact fingerprint keys; unchanged keys retain their previous validated artifact rather than being overwritten. The action and schedule comments document these limits. The existing full unit file selection remains enabled. The canonical PR classifier counts 78 test files, with 902 lines added and 3,119 deleted: a net reduction of 2,217 test lines.
Agent skill upstream boundary
Checklist
N/Awith reasonpnpm lint,pnpm typecheck,pnpm test, andpnpm buildpass (or CI will cover; local preferred)