From b83a6f74be92aa50e224a06b92cc09ca39e2913d Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Tue, 13 Oct 2026 23:57:33 -0700 Subject: [PATCH] Finish agent-selection cleanup and restore merge validation (#28607) * Retire newly translated None option labels * Reserve required verify check for the complete PR gate * Preserve headless default tab styling and stabilize import ordering test * Restore the option mutation clock after crossing fixes * Check both supported workflow extensions --- .github/workflows/mobile.yml | 1 + .../scripts/required-pr-check-name.test.mjs | 20 +++++++++++++++++++ .../browser-cookie-import-concurrency.test.ts | 3 +-- .../runtime-worktree-terminal-provisioning.ts | 5 +++-- 4 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 config/scripts/required-pr-check-name.test.mjs diff --git a/.github/workflows/mobile.yml b/.github/workflows/mobile.yml index 07ba8c9bd00..f0edb9c52ee 100644 --- a/.github/workflows/mobile.yml +++ b/.github/workflows/mobile.yml @@ -70,6 +70,7 @@ concurrency: jobs: verify: + name: Mobile verify if: github.event_name == 'pull_request' # Why ARM: 209s of this job is Vitest and nothing here needs x86: no Android SDK, emulator, gradle, # Hermes or Watchman, no docker, and no artifacts. The Gemfile.lock lists the generic `ruby` diff --git a/config/scripts/required-pr-check-name.test.mjs b/config/scripts/required-pr-check-name.test.mjs new file mode 100644 index 00000000000..0bf763add08 --- /dev/null +++ b/config/scripts/required-pr-check-name.test.mjs @@ -0,0 +1,20 @@ +import { readdirSync, readFileSync } from 'node:fs' +import { join } from 'node:path' +import { expect, it } from 'vitest' +import { parse } from 'yaml' + +it('reserves the required verify check for the full PR gate', () => { + const directory = '.github/workflows' + const providers = readdirSync(directory) + .filter((file) => /\.ya?ml$/.test(file)) + .flatMap((file) => { + const workflow = parse(readFileSync(join(directory, file), 'utf8')) + if (!Object.hasOwn(workflow.on ?? {}, 'pull_request')) { + return [] + } + return Object.entries(workflow.jobs) + .filter(([id, job]) => (job.name ?? id) === 'verify') + .map(() => file) + }) + expect(providers).toEqual(['pr.yml']) +}) diff --git a/src/main/browser/browser-cookie-import-concurrency.test.ts b/src/main/browser/browser-cookie-import-concurrency.test.ts index 2826cc1207c..ab0fdb387ff 100644 --- a/src/main/browser/browser-cookie-import-concurrency.test.ts +++ b/src/main/browser/browser-cookie-import-concurrency.test.ts @@ -241,8 +241,7 @@ describe('two concurrent imports into one partition', () => { const fileB = writeSource('new-b', '.b.example') const first = importCookiesFromFile(fileA, 'persist:concurrency-test') - // Let the first import reach its write and block there. - await new Promise((resolve) => setTimeout(resolve, 5)) + await vi.waitFor(() => expect(events).toContain('set:new-a')) const second = importCookiesFromFile(fileB, 'persist:concurrency-test') await new Promise((resolve) => setTimeout(resolve, 20)) diff --git a/src/main/runtime/runtime-worktree-terminal-provisioning.ts b/src/main/runtime/runtime-worktree-terminal-provisioning.ts index 29d59c51b08..229ac99f6ac 100644 --- a/src/main/runtime/runtime-worktree-terminal-provisioning.ts +++ b/src/main/runtime/runtime-worktree-terminal-provisioning.ts @@ -120,8 +120,9 @@ export async function provisionWorktreeTerminals( let setupTerminalHandle: string | null = null let shellSkippedForSetup = false try { - const settings = host.getSettings() - const setupLaunchMode = settings.setupScriptLaunchMode ?? 'new-tab' + const setupLaunchMode = args.setup + ? (host.getSettings().setupScriptLaunchMode ?? 'new-tab') + : 'new-tab' // A cleared creation choice leaves Setup as the only surface; splits still need a shell. const setupOnly = args.setup !== undefined && setupLaunchMode === 'new-tab' && args.setupOnly === true