From c4b2183db66f0f8f8b60edaf09f9c33b2f349a03 Mon Sep 17 00:00:00 2001 From: Dallin Romney Date: Thu, 16 Jul 2026 11:45:31 -0700 Subject: [PATCH] fix(release): repair frozen validation compatibility (#109272) --- .github/workflows/ci.yml | 10 +++++++++- .../openclaw-live-and-e2e-checks-reusable.yml | 4 +--- scripts/test-live-shard.mjs | 10 ++++++---- test/scripts/ci-workflow-guards.test.ts | 5 +++-- test/scripts/package-acceptance-workflow.test.ts | 2 +- test/scripts/test-live-shard.test.ts | 8 ++++---- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b5e815acfb2..21a9cec987d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -668,7 +668,10 @@ jobs: runAndroid ? [ // android-ci-contract-v2: both app variants, Android lint, benchmark, and ktlint. - { check_name: "android-test-play", task: "test-play" }, + { + check_name: "android-test-play", + task: useCompatibleAndroidCi ? "test-play-compat" : "test-play", + }, { check_name: "android-test-third-party", task: "test-third-party" }, { check_name: "android-build-play", @@ -2927,6 +2930,11 @@ jobs: :app:testPlayDebugUnitTest \ :wear-shared:testDebugUnitTest ;; + test-play-compat) + # Frozen targets predate the Wear shared project. Keep their app-owned + # Play unit tests without importing current Android modules. + ./gradlew --no-daemon --build-cache :app:testPlayDebugUnitTest + ;; test-third-party) ./gradlew --no-daemon --build-cache :app:testThirdPartyDebugUnitTest ;; diff --git a/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml b/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml index 52509ce1375..4985f04450e 100644 --- a/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml +++ b/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml @@ -2837,9 +2837,7 @@ jobs: include: - suite_id: native-live-src-agents label: Native live agents - # Keep the dedicated Coding Plan suite below while temporarily omitting - # API Platform calls from the broad agents shard. - command: ZAI_API_KEY= Z_AI_API_KEY= node .release-harness/scripts/test-live-shard.mjs native-live-src-agents + command: node .release-harness/scripts/test-live-shard.mjs native-live-src-agents timeout_minutes: 60 profile_env_only: false profiles: stable full diff --git a/scripts/test-live-shard.mjs b/scripts/test-live-shard.mjs index f02a9b4d75d..2d1ab807f65 100644 --- a/scripts/test-live-shard.mjs +++ b/scripts/test-live-shard.mjs @@ -44,6 +44,7 @@ const OPTIONAL_LIVE_SHARD_FILE_ENVS = new Map([ const SKIPPED_ASSERTION_STATUSES = new Set(["disabled", "pending", "skipped", "todo"]); const QA_RUNTIME_LIVE_TEST = "extensions/qa-lab/src/matrix-channel-driver.lifecycle.live.test.ts"; const QA_RUNTIME_ARTIFACT = "dist/extensions/qa-lab/runtime-api.js"; +const ZAI_LIVE_TEST_FILE = "src/agents/zai.live.test.ts"; /** Live-test shards included in release validation. */ export const RELEASE_LIVE_TEST_SHARDS = Object.freeze([ @@ -259,12 +260,13 @@ export function selectLiveShardFiles(shard, files = collectAllLiveTestFiles()) { case "native-live-src-agents": return files.filter( (file) => - file.startsWith("src/agents/") || - file.startsWith("src/llm/") || - file.startsWith("src/skills/"), + file !== ZAI_LIVE_TEST_FILE && + (file.startsWith("src/agents/") || + file.startsWith("src/llm/") || + file.startsWith("src/skills/")), ); case "native-live-src-agents-zai-coding": - return files.filter((file) => file === "src/agents/zai.live.test.ts"); + return files.filter((file) => file === ZAI_LIVE_TEST_FILE); case "native-live-src-gateway": return files.filter( (file) => file.startsWith("src/gateway/") || file.startsWith("src/system-agent/"), diff --git a/test/scripts/ci-workflow-guards.test.ts b/test/scripts/ci-workflow-guards.test.ts index 652dd725242..44dd0eb7278 100644 --- a/test/scripts/ci-workflow-guards.test.ts +++ b/test/scripts/ci-workflow-guards.test.ts @@ -1571,7 +1571,7 @@ describe("ci workflow guards", () => { (step: WorkflowStep) => step.name === "Run Android ${{ matrix.task }}", ); - expect(source).toContain('{ check_name: "android-test-play", task: "test-play" }'); + expect(source).toContain('task: useCompatibleAndroidCi ? "test-play-compat" : "test-play"'); expect(source).toContain( '{ check_name: "android-test-third-party", task: "test-third-party" }', ); @@ -2525,6 +2525,7 @@ printf '%s\n' "\${CURL_SUCCESS_IP:-203.0.113.7}" (step: WorkflowStep) => step.name === "Run Android ${{ matrix.task }}", ).run; expect(androidRun).toContain("build-play-compat)"); + expect(androidRun).toContain("test-play-compat)"); expect(androidRun).toContain(":app:assemblePlayDebug"); const legacy = runCiManifestFixture({ bundledPlanner: false }); @@ -2539,7 +2540,7 @@ printf '%s\n' "\${CURL_SUCCESS_IP:-203.0.113.7}" JSON.parse(expectDefined(legacy.outputs.android_matrix, "legacy Android matrix output")) .include, ).toEqual([ - { check_name: "android-test-play", task: "test-play" }, + { check_name: "android-test-play", task: "test-play-compat" }, { check_name: "android-test-third-party", task: "test-third-party" }, { check_name: "android-build-play", task: "build-play-compat" }, ]); diff --git a/test/scripts/package-acceptance-workflow.test.ts b/test/scripts/package-acceptance-workflow.test.ts index 7b70ecf9b92..a8825d8d013 100644 --- a/test/scripts/package-acceptance-workflow.test.ts +++ b/test/scripts/package-acceptance-workflow.test.ts @@ -1604,7 +1604,7 @@ describe("package artifact reuse", () => { expect(workflow).toContain("suite_id: native-live-src-agents"); expect(workflow).toContain("Checkout trusted live shard harness"); expect(workflow).toContain( - "command: ZAI_API_KEY= Z_AI_API_KEY= node .release-harness/scripts/test-live-shard.mjs native-live-src-agents", + "command: node .release-harness/scripts/test-live-shard.mjs native-live-src-agents", ); expect(workflow).toContain("suite_id: native-live-src-agents-zai-coding"); expect(workflow).toContain( diff --git a/test/scripts/test-live-shard.test.ts b/test/scripts/test-live-shard.test.ts index b5415ec01c5..7d1f00e4e18 100644 --- a/test/scripts/test-live-shard.test.ts +++ b/test/scripts/test-live-shard.test.ts @@ -48,10 +48,7 @@ describe("scripts/test-live-shard", () => { expect(allFiles.length).toBeGreaterThan(0); expect([...new Set(selectedFiles)].toSorted((a, b) => a.localeCompare(b))).toEqual(allFiles); - expect(duplicateFiles).toEqual([ - "src/agents/zai.live.test.ts", - "extensions/music-generation-providers.live.test.ts", - ]); + expect(duplicateFiles).toEqual(["extensions/music-generation-providers.live.test.ts"]); expect(musicProviderFanout).toEqual([ "native-live-extensions-media-music-google", "native-live-extensions-media-music-minimax", @@ -91,6 +88,9 @@ describe("scripts/test-live-shard", () => { expect(selectLiveShardFiles("native-live-src-agents", allFiles)).toContain( "src/skills/workshop/experience-review.live.test.ts", ); + expect(selectLiveShardFiles("native-live-src-agents", allFiles)).not.toContain( + "src/agents/zai.live.test.ts", + ); expect(selectLiveShardFiles("native-live-src-agents-zai-coding", allFiles)).toEqual([ "src/agents/zai.live.test.ts", ]);