diff --git a/.github/workflows/full-release-validation.yml b/.github/workflows/full-release-validation.yml index a219a8b45db7..11e3998c0381 100644 --- a/.github/workflows/full-release-validation.yml +++ b/.github/workflows/full-release-validation.yml @@ -34,7 +34,7 @@ on: default: false type: boolean telegram_waiver: - description: Reviewed stable/full waiver; 2026.8.1/9.1 cover Telegram, 2026.9.5 covers Telegram and Matrix QA-live + description: Reviewed stable/full waiver; 2026.8.1/9.1 cover Telegram, 2026.9.5/9.7/9.8 cover Telegram and Matrix QA-live required: false default: "" type: string diff --git a/docs/reference/full-release-validation/extended-stable.md b/docs/reference/full-release-validation/extended-stable.md index f08d89c3d215..1a79a3d0e467 100644 --- a/docs/reference/full-release-validation/extended-stable.md +++ b/docs/reference/full-release-validation/extended-stable.md @@ -163,11 +163,14 @@ keep Telegram selected by default. The existing deferral; it is rejected for `stable` and `full` and does not disable the focused `rerun_group=npm-telegram` workflow. -Selected-test requirements are separate from explicit omissions. The reviewed exceptions are -`-f telegram_waiver=2026.8.1-owner-approved` and -`-f telegram_waiver=2026.9.1-owner-approved`. Any future exception requires a -reviewed code change; a matching `-owner-approved` string alone -is not authorization. The value must name the validated target's actual +Selected-test requirements are separate from explicit omissions. The reviewed +Telegram-only exceptions are `2026.8.1-owner-approved` and +`2026.9.1-owner-approved`. The reviewed Telegram and Matrix QA-live exceptions +are `2026.9.5-owner-approved`, `2026.9.7-owner-approved`, and +`2026.9.8-owner-approved`. Pass the selected value with `-f telegram_waiver=`. +Any future exception requires a reviewed code change; a matching +`-owner-approved` string alone is not authorization. The value +must name the validated target's actual `package.json` version, the sealed candidate version must match, and the profile must be `stable` or `full`. Beta, prerelease, and unlisted targets are rejected. Package-spec overrides must be exactly `openclaw@`; blank specs diff --git a/scripts/full-release-validation-policy.mjs b/scripts/full-release-validation-policy.mjs index a0b20bcee488..42e2c45ab1ad 100644 --- a/scripts/full-release-validation-policy.mjs +++ b/scripts/full-release-validation-policy.mjs @@ -303,6 +303,9 @@ const REVIEWED_TELEGRAM_WAIVERS = new Map([ // 01d71319 (FRV 36534008742, jobs 109299525565 and rerun 109316259401) and Telegram // QA 4/25 on 56fb8872 and e61efb6c (job 109279074202). ["2026.9.7-owner-approved", ["telegram", "matrix"]], + // The release owner approved the same Telegram and Matrix QA-live scope for 2026.9.8 + // on 2026-10-02. Every other stable-release gate remains blocking. + ["2026.9.8-owner-approved", ["telegram", "matrix"]], ]); const HARD_GH_TRANSPORT_PATTERN = /HTTP (?:400|401|403|404|410|422)\b|Bad credentials|authentication required|not authenticated|gh auth login|unknown (?:command|flag)|Usage: gh\b|ENOENT|EACCES/iu; diff --git a/test/scripts/release-channel-waiver.test.ts b/test/scripts/release-channel-waiver.test.ts index 18d23fb7d54f..c139effa641f 100644 --- a/test/scripts/release-channel-waiver.test.ts +++ b/test/scripts/release-channel-waiver.test.ts @@ -18,7 +18,7 @@ const approved = { }; describe("reviewed release channel waiver", () => { - it("owns the exact 9.5 channel set without extending historical waivers", () => { + it("owns the reviewed combined channel sets without extending historical waivers", () => { expect(releaseWaivedIntegrationChannels(approved)).toEqual(["telegram", "matrix"]); for (const version of ["2026.8.1", "2026.9.1"]) { expect( @@ -31,15 +31,17 @@ describe("reviewed release channel waiver", () => { }), ).toEqual(["telegram"]); } - expect( - releaseWaivedIntegrationChannels({ - ...approved, - targetVersion: "2026.9.7", - candidateVersion: "2026.9.7", - telegramWaiver: "2026.9.7-owner-approved", - releaseProfile: "stable", - }), - ).toEqual(["telegram", "matrix"]); + for (const version of ["2026.9.7", "2026.9.8"]) { + expect( + releaseWaivedIntegrationChannels({ + ...approved, + targetVersion: version, + candidateVersion: version, + telegramWaiver: `${version}-owner-approved`, + releaseProfile: "stable", + }), + ).toEqual(["telegram", "matrix"]); + } const projection = releaseWaivedIntegrationChannels(approved); projection.push("buzz"); expect(releaseWaivedIntegrationChannels(approved)).toEqual(["telegram", "matrix"]);