fix(release): harden beta validation gates

(cherry picked from commit 91eeda0d708c2d8dac7c09c259b7cf390193f83f)
This commit is contained in:
Vincent Koc 2026-06-14 17:33:36 +08:00
parent db5e415888
commit 2f34d06b42
No known key found for this signature in database
2 changed files with 27 additions and 4 deletions

View file

@ -1181,7 +1181,7 @@ jobs:
runtime_tool_coverage_release_checks:
name: Enforce QA Lab runtime tool coverage
needs: [resolve_target, qa_lab_runtime_parity_release_checks]
if: always() && contains(fromJSON('["all","qa","qa-parity"]'), needs.resolve_target.outputs.rerun_group)
if: contains(fromJSON('["all","qa","qa-parity"]'), needs.resolve_target.outputs.rerun_group)
runs-on: ubuntu-24.04
timeout-minutes: 15
permissions:
@ -1204,13 +1204,35 @@ jobs:
node-version: ${{ env.NODE_VERSION }}
install-bun: "true"
- name: Download runtime parity status
uses: actions/download-artifact@v8
with:
name: release-check-status-qa-runtime-parity-${{ needs.resolve_target.outputs.revision }}
path: .artifacts/release-check-status/
- name: Verify runtime parity producer status
id: verify_runtime_parity_status
shell: bash
run: |
set -euo pipefail
status_path=".artifacts/release-check-status/qa_lab_runtime_parity_release_checks.env"
status="$(sed -n 's/^status=//p' "$status_path" | tail -n 1)"
if [[ "$status" != "success" ]]; then
echo "Runtime parity producer status is ${status:-missing}; skipping coverage artifact consumer."
echo "ready=false" >> "$GITHUB_OUTPUT"
exit 0
fi
echo "ready=true" >> "$GITHUB_OUTPUT"
- name: Download runtime parity artifacts
if: steps.verify_runtime_parity_status.outputs.ready == 'true'
uses: actions/download-artifact@v8
with:
name: release-qa-runtime-parity-${{ needs.resolve_target.outputs.revision }}
path: .artifacts/qa-e2e/
- name: Enforce standard runtime tool coverage
if: steps.verify_runtime_parity_status.outputs.ready == 'true'
run: |
set -euo pipefail
pnpm openclaw qa coverage \

View file

@ -28,6 +28,7 @@ const LIVE_VISION_MODEL = process.env.OPENCLAW_LIVE_OPENAI_VISION_MODEL?.trim()
const liveEnabled = OPENAI_API_KEY.trim().length > 0 && process.env.OPENCLAW_LIVE_TEST === "1";
const describeLive = liveEnabled ? describe : describe.skip;
const EMPTY_AUTH_STORE = { version: 1, profiles: {} } as const;
const LIVE_TTS_TIMEOUT_MS = 60_000;
const ModelRegistryCtor = ModelRegistry as unknown as {
new (authStorage: AuthStorage, modelsJsonPath?: string): ModelRegistry;
};
@ -139,7 +140,7 @@ function createLiveTtsConfig(): ResolvedTtsConfig {
},
personas: {},
maxTextLength: 4_000,
timeoutMs: 30_000,
timeoutMs: LIVE_TTS_TIMEOUT_MS,
};
}
@ -264,7 +265,7 @@ describeLive("openai plugin live", () => {
expect(telephony?.outputFormat).toBe("pcm");
expect(telephony?.sampleRate).toBe(24_000);
expect(telephony?.audioBuffer.byteLength).toBeGreaterThan(512);
}, 45_000);
}, 150_000);
it("transcribes synthesized speech through the registered media provider", async () => {
const { speechProviders, mediaProviders } = await registerOpenAIPlugin();
@ -297,7 +298,7 @@ describeLive("openai plugin live", () => {
expect(text.length).toBeGreaterThan(0);
expect(collapsedText).toContain("speech");
expect(collapsedText).toMatch(/(?:check|okay|ok|transcription)/);
}, 45_000);
}, 120_000);
it("opens OpenAI realtime STT before sending audio", async () => {
const { realtimeTranscriptionProviders } = await registerOpenAIPlugin();