From 8999d96c63bacc6b78d68e11d157aa841004f542 Mon Sep 17 00:00:00 2001 From: Copilot Date: Tue, 3 Mar 2026 03:16:51 +0000 Subject: [PATCH 1/6] jsweep: clean substitute_placeholders.cjs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add @ts-check and /// for type safety - Add JSDoc type annotations for function parameters and return type - Extract log() helper to eliminate 20+ repeated typeof core checks - Fix yoda condition: "object" != typeof → typeof !== "object" - Simplify null check: value === undefined || value === null → value == null - Refactor test file: add vitest imports, remove comma-operator anti-pattern Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- actions/setup/js/substitute_placeholders.cjs | 111 ++++++------ .../setup/js/substitute_placeholders.test.cjs | 163 +++++++++++------- 2 files changed, 148 insertions(+), 126 deletions(-) diff --git a/actions/setup/js/substitute_placeholders.cjs b/actions/setup/js/substitute_placeholders.cjs index 42dbef95f50..2815c314564 100644 --- a/actions/setup/js/substitute_placeholders.cjs +++ b/actions/setup/js/substitute_placeholders.cjs @@ -1,61 +1,60 @@ +// @ts-check +/// + const fs = require("fs"); const { getErrorMessage } = require("./error_helpers.cjs"); const { ERR_SYSTEM } = require("./error_codes.cjs"); +/** @param {string} msg */ +const log = msg => { + if (typeof core !== "undefined") core.info(msg); +}; + +/** + * Substitutes `__KEY__` placeholders in a file with values from the substitutions map. + * Undefined/null values are treated as empty strings. + * + * @param {{ file: string, substitutions: Record }} params + * @returns {Promise} + */ const substitutePlaceholders = async ({ file, substitutions }) => { - if (typeof core !== "undefined") { - core.info("========================================"); - core.info("[substitutePlaceholders] Starting placeholder substitution"); - core.info("========================================"); - } + log("========================================"); + log("[substitutePlaceholders] Starting placeholder substitution"); + log("========================================"); // Validate parameters if (!file) { const error = new Error("file parameter is required"); - if (typeof core !== "undefined") { - core.info(`[substitutePlaceholders] ERROR: ${error.message}`); - } + log(`[substitutePlaceholders] ERROR: ${error.message}`); throw error; } - if (!substitutions || "object" != typeof substitutions) { + if (!substitutions || typeof substitutions !== "object") { const error = new Error("substitutions parameter must be an object"); - if (typeof core !== "undefined") { - core.info(`[substitutePlaceholders] ERROR: ${error.message}`); - } + log(`[substitutePlaceholders] ERROR: ${error.message}`); throw error; } - if (typeof core !== "undefined") { - core.info(`[substitutePlaceholders] File: ${file}`); - core.info(`[substitutePlaceholders] Substitution count: ${Object.keys(substitutions).length}`); - } + log(`[substitutePlaceholders] File: ${file}`); + log(`[substitutePlaceholders] Substitution count: ${Object.keys(substitutions).length}`); // Read the file let content; try { - if (typeof core !== "undefined") { - core.info(`[substitutePlaceholders] Reading file...`); - } + log(`[substitutePlaceholders] Reading file...`); content = fs.readFileSync(file, "utf8"); - if (typeof core !== "undefined") { - core.info(`[substitutePlaceholders] File read successfully`); - core.info(`[substitutePlaceholders] Original content length: ${content.length} characters`); - core.info(`[substitutePlaceholders] First 200 characters: ${content.substring(0, 200).replace(/\n/g, "\\n")}`); - } + log(`[substitutePlaceholders] File read successfully`); + log(`[substitutePlaceholders] Original content length: ${content.length} characters`); + log(`[substitutePlaceholders] First 200 characters: ${content.substring(0, 200).replace(/\n/g, "\\n")}`); } catch (error) { const errorMessage = getErrorMessage(error); - if (typeof core !== "undefined") { - core.info(`[substitutePlaceholders] ERROR reading file: ${errorMessage}`); - } + log(`[substitutePlaceholders] ERROR reading file: ${errorMessage}`); throw new Error(`${ERR_SYSTEM}: Failed to read file ${file}: ${errorMessage}`); } // Perform substitutions - if (typeof core !== "undefined") { - core.info("\n========================================"); - core.info("[substitutePlaceholders] Processing Substitutions"); - core.info("========================================"); - } + log("\n========================================"); + log("[substitutePlaceholders] Processing Substitutions"); + log("========================================"); let totalReplacements = 0; const beforeLength = content.length; @@ -63,18 +62,16 @@ const substitutePlaceholders = async ({ file, substitutions }) => { for (const [key, value] of Object.entries(substitutions)) { const placeholder = `__${key}__`; // Convert undefined/null to empty string to avoid leaving "undefined" or "null" in the output - const safeValue = value === undefined || value === null ? "" : value; + const safeValue = value == null ? "" : value; // Count occurrences before replacement const occurrences = (content.match(new RegExp(placeholder.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length; - if (typeof core !== "undefined") { - if (occurrences > 0) { - core.info(`[substitutePlaceholders] Replacing ${placeholder} (${occurrences} occurrence(s))`); - core.info(`[substitutePlaceholders] Value: ${safeValue.substring(0, 100)}${safeValue.length > 100 ? "..." : ""}`); - } else { - core.info(`[substitutePlaceholders] Placeholder ${placeholder} not found in content (unused)`); - } + if (occurrences > 0) { + log(`[substitutePlaceholders] Replacing ${placeholder} (${occurrences} occurrence(s))`); + log(`[substitutePlaceholders] Value: ${safeValue.substring(0, 100)}${safeValue.length > 100 ? "..." : ""}`); + } else { + log(`[substitutePlaceholders] Placeholder ${placeholder} not found in content (unused)`); } content = content.split(placeholder).join(safeValue); @@ -82,36 +79,28 @@ const substitutePlaceholders = async ({ file, substitutions }) => { } const afterLength = content.length; - - if (typeof core !== "undefined") { - core.info(`[substitutePlaceholders] Substitution complete: ${totalReplacements} total replacement(s)`); - core.info(`[substitutePlaceholders] Content length change: ${beforeLength} -> ${afterLength} (${afterLength > beforeLength ? "+" : ""}${afterLength - beforeLength})`); - } + log(`[substitutePlaceholders] Substitution complete: ${totalReplacements} total replacement(s)`); + log(`[substitutePlaceholders] Content length change: ${beforeLength} -> ${afterLength} (${afterLength > beforeLength ? "+" : ""}${afterLength - beforeLength})`); // Write back to the file try { - if (typeof core !== "undefined") { - core.info("\n========================================"); - core.info("[substitutePlaceholders] Writing Output"); - core.info("========================================"); - core.info(`[substitutePlaceholders] Writing processed content back to: ${file}`); - } + log("\n========================================"); + log("[substitutePlaceholders] Writing Output"); + log("========================================"); + log(`[substitutePlaceholders] Writing processed content back to: ${file}`); fs.writeFileSync(file, content, "utf8"); - if (typeof core !== "undefined") { - core.info(`[substitutePlaceholders] File written successfully`); - core.info(`[substitutePlaceholders] Last 200 characters: ${content.substring(Math.max(0, content.length - 200)).replace(/\n/g, "\\n")}`); - core.info("========================================"); - core.info("[substitutePlaceholders] Processing complete - SUCCESS"); - core.info("========================================"); - } + log(`[substitutePlaceholders] File written successfully`); + log(`[substitutePlaceholders] Last 200 characters: ${content.substring(Math.max(0, content.length - 200)).replace(/\n/g, "\\n")}`); + log("========================================"); + log("[substitutePlaceholders] Processing complete - SUCCESS"); + log("========================================"); } catch (error) { const errorMessage = getErrorMessage(error); - if (typeof core !== "undefined") { - core.info(`[substitutePlaceholders] ERROR writing file: ${errorMessage}`); - } + log(`[substitutePlaceholders] ERROR writing file: ${errorMessage}`); throw new Error(`${ERR_SYSTEM}: Failed to write file ${file}: ${errorMessage}`); } return `Successfully substituted ${Object.keys(substitutions).length} placeholder(s) in ${file}`; }; + module.exports = substitutePlaceholders; diff --git a/actions/setup/js/substitute_placeholders.test.cjs b/actions/setup/js/substitute_placeholders.test.cjs index da656404759..11d3d6d781b 100644 --- a/actions/setup/js/substitute_placeholders.test.cjs +++ b/actions/setup/js/substitute_placeholders.test.cjs @@ -1,67 +1,100 @@ -const fs = require("fs"), - os = require("os"), - path = require("path"), - substitutePlaceholders = require("./substitute_placeholders.cjs"); +import { afterEach, beforeEach, describe, expect, it } from "vitest"; + +const fs = require("fs"); +const os = require("os"); +const path = require("path"); +const substitutePlaceholders = require("./substitute_placeholders.cjs"); + describe("substitutePlaceholders", () => { - let tempDir, testFile; - (beforeEach(() => { - ((tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "substitute-test-"))), (testFile = path.join(tempDir, "test.txt"))); - }), - afterEach(() => { - (fs.existsSync(testFile) && fs.unlinkSync(testFile), fs.existsSync(tempDir) && fs.rmdirSync(tempDir)); - }), - it("should substitute a single placeholder", async () => { - (fs.writeFileSync(testFile, "Hello __NAME__!", "utf8"), await substitutePlaceholders({ file: testFile, substitutions: { NAME: "World" } })); - const content = fs.readFileSync(testFile, "utf8"); - expect(content).toBe("Hello World!"); - }), - it("should substitute multiple placeholders", async () => { - (fs.writeFileSync(testFile, "Repository: __REPO__\nActor: __ACTOR__\nBranch: __BRANCH__", "utf8"), await substitutePlaceholders({ file: testFile, substitutions: { REPO: "test/repo", ACTOR: "testuser", BRANCH: "main" } })); - const content = fs.readFileSync(testFile, "utf8"); - expect(content).toBe("Repository: test/repo\nActor: testuser\nBranch: main"); - }), - it("should handle special characters safely", async () => { - (fs.writeFileSync(testFile, "Command: __CMD__", "utf8"), await substitutePlaceholders({ file: testFile, substitutions: { CMD: "$(malicious) `backdoor` ${VAR} | pipe" } })); - const content = fs.readFileSync(testFile, "utf8"); - expect(content).toBe("Command: $(malicious) `backdoor` ${VAR} | pipe"); - }), - it("should handle placeholders appearing multiple times", async () => { - (fs.writeFileSync(testFile, "__NAME__ is great. I love __NAME__!", "utf8"), await substitutePlaceholders({ file: testFile, substitutions: { NAME: "Testing" } })); - const content = fs.readFileSync(testFile, "utf8"); - expect(content).toBe("Testing is great. I love Testing!"); - }), - it("should leave unmatched placeholders unchanged", async () => { - (fs.writeFileSync(testFile, "__FOO__ and __BAR__", "utf8"), await substitutePlaceholders({ file: testFile, substitutions: { FOO: "foo" } })); - const content = fs.readFileSync(testFile, "utf8"); - expect(content).toBe("foo and __BAR__"); - }), - it("should handle empty values", async () => { - (fs.writeFileSync(testFile, "Value: __VAL__", "utf8"), await substitutePlaceholders({ file: testFile, substitutions: { VAL: "" } })); - const content = fs.readFileSync(testFile, "utf8"); - expect(content).toBe("Value: "); - }), - it("should throw error if file parameter is missing", async () => { - await expect(substitutePlaceholders({ substitutions: { NAME: "test" } })).rejects.toThrow("file parameter is required"); - }), - it("should throw error if substitutions parameter is missing", async () => { - await expect(substitutePlaceholders({ file: testFile })).rejects.toThrow("substitutions parameter must be an object"); - }), - it("should throw error if file does not exist", async () => { - await expect(substitutePlaceholders({ file: "/nonexistent/file.txt", substitutions: { NAME: "test" } })).rejects.toThrow("Failed to read file"); - }), - it("should handle undefined values as empty strings", async () => { - (fs.writeFileSync(testFile, "Value: __VAL__", "utf8"), await substitutePlaceholders({ file: testFile, substitutions: { VAL: undefined } })); - const content = fs.readFileSync(testFile, "utf8"); - expect(content).toBe("Value: "); - }), - it("should handle null values as empty strings", async () => { - (fs.writeFileSync(testFile, "Value: __VAL__", "utf8"), await substitutePlaceholders({ file: testFile, substitutions: { VAL: null } })); - const content = fs.readFileSync(testFile, "utf8"); - expect(content).toBe("Value: "); - }), - it("should handle mixed undefined and defined values", async () => { - (fs.writeFileSync(testFile, "Repo: __REPO__\nComment: __COMMENT__\nIssue: __ISSUE__", "utf8"), await substitutePlaceholders({ file: testFile, substitutions: { REPO: "test/repo", COMMENT: undefined, ISSUE: null } })); - const content = fs.readFileSync(testFile, "utf8"); - expect(content).toBe("Repo: test/repo\nComment: \nIssue: "); - })); + /** @type {string} */ + let tempDir; + /** @type {string} */ + let testFile; + + beforeEach(() => { + tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "substitute-test-")); + testFile = path.join(tempDir, "test.txt"); + }); + + afterEach(() => { + if (fs.existsSync(testFile)) fs.unlinkSync(testFile); + if (fs.existsSync(tempDir)) fs.rmdirSync(tempDir); + }); + + it("should substitute a single placeholder", async () => { + fs.writeFileSync(testFile, "Hello __NAME__!", "utf8"); + await substitutePlaceholders({ file: testFile, substitutions: { NAME: "World" } }); + expect(fs.readFileSync(testFile, "utf8")).toBe("Hello World!"); + }); + + it("should substitute multiple placeholders", async () => { + fs.writeFileSync(testFile, "Repository: __REPO__\nActor: __ACTOR__\nBranch: __BRANCH__", "utf8"); + await substitutePlaceholders({ + file: testFile, + substitutions: { REPO: "test/repo", ACTOR: "testuser", BRANCH: "main" }, + }); + expect(fs.readFileSync(testFile, "utf8")).toBe("Repository: test/repo\nActor: testuser\nBranch: main"); + }); + + it("should handle special characters safely", async () => { + fs.writeFileSync(testFile, "Command: __CMD__", "utf8"); + await substitutePlaceholders({ + file: testFile, + substitutions: { CMD: "$(malicious) `backdoor` ${VAR} | pipe" }, + }); + expect(fs.readFileSync(testFile, "utf8")).toBe("Command: $(malicious) `backdoor` ${VAR} | pipe"); + }); + + it("should handle placeholders appearing multiple times", async () => { + fs.writeFileSync(testFile, "__NAME__ is great. I love __NAME__!", "utf8"); + await substitutePlaceholders({ file: testFile, substitutions: { NAME: "Testing" } }); + expect(fs.readFileSync(testFile, "utf8")).toBe("Testing is great. I love Testing!"); + }); + + it("should leave unmatched placeholders unchanged", async () => { + fs.writeFileSync(testFile, "__FOO__ and __BAR__", "utf8"); + await substitutePlaceholders({ file: testFile, substitutions: { FOO: "foo" } }); + expect(fs.readFileSync(testFile, "utf8")).toBe("foo and __BAR__"); + }); + + it("should handle empty values", async () => { + fs.writeFileSync(testFile, "Value: __VAL__", "utf8"); + await substitutePlaceholders({ file: testFile, substitutions: { VAL: "" } }); + expect(fs.readFileSync(testFile, "utf8")).toBe("Value: "); + }); + + it("should throw error if file parameter is missing", async () => { + // @ts-expect-error - testing missing file param + await expect(substitutePlaceholders({ substitutions: { NAME: "test" } })).rejects.toThrow("file parameter is required"); + }); + + it("should throw error if substitutions parameter is missing", async () => { + // @ts-expect-error - testing missing substitutions param + await expect(substitutePlaceholders({ file: testFile })).rejects.toThrow("substitutions parameter must be an object"); + }); + + it("should throw error if file does not exist", async () => { + await expect(substitutePlaceholders({ file: "/nonexistent/file.txt", substitutions: { NAME: "test" } })).rejects.toThrow("Failed to read file"); + }); + + it("should handle undefined values as empty strings", async () => { + fs.writeFileSync(testFile, "Value: __VAL__", "utf8"); + await substitutePlaceholders({ file: testFile, substitutions: { VAL: undefined } }); + expect(fs.readFileSync(testFile, "utf8")).toBe("Value: "); + }); + + it("should handle null values as empty strings", async () => { + fs.writeFileSync(testFile, "Value: __VAL__", "utf8"); + await substitutePlaceholders({ file: testFile, substitutions: { VAL: null } }); + expect(fs.readFileSync(testFile, "utf8")).toBe("Value: "); + }); + + it("should handle mixed undefined and defined values", async () => { + fs.writeFileSync(testFile, "Repo: __REPO__\nComment: __COMMENT__\nIssue: __ISSUE__", "utf8"); + await substitutePlaceholders({ + file: testFile, + substitutions: { REPO: "test/repo", COMMENT: undefined, ISSUE: null }, + }); + expect(fs.readFileSync(testFile, "utf8")).toBe("Repo: test/repo\nComment: \nIssue: "); + }); }); From b50208e1a00199197f6f4176fed0c8a7486b8e6c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 3 Mar 2026 03:18:47 +0000 Subject: [PATCH 2/6] ci: trigger checks From 2f137dee8046fafe59bad45d8b085c373eefe141 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Mar 2026 03:31:12 +0000 Subject: [PATCH 3/6] jsweep: import shim.cjs and simplify logging in substitute_placeholders.cjs Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- actions/setup/js/substitute_placeholders.cjs | 59 ++------------------ 1 file changed, 4 insertions(+), 55 deletions(-) diff --git a/actions/setup/js/substitute_placeholders.cjs b/actions/setup/js/substitute_placeholders.cjs index 2815c314564..e648ee75ea8 100644 --- a/actions/setup/js/substitute_placeholders.cjs +++ b/actions/setup/js/substitute_placeholders.cjs @@ -1,15 +1,11 @@ // @ts-check /// +require("./shim.cjs"); const fs = require("fs"); const { getErrorMessage } = require("./error_helpers.cjs"); const { ERR_SYSTEM } = require("./error_codes.cjs"); -/** @param {string} msg */ -const log = msg => { - if (typeof core !== "undefined") core.info(msg); -}; - /** * Substitutes `__KEY__` placeholders in a file with values from the substitutions map. * Undefined/null values are treated as empty strings. @@ -18,85 +14,38 @@ const log = msg => { * @returns {Promise} */ const substitutePlaceholders = async ({ file, substitutions }) => { - log("========================================"); - log("[substitutePlaceholders] Starting placeholder substitution"); - log("========================================"); - // Validate parameters if (!file) { - const error = new Error("file parameter is required"); - log(`[substitutePlaceholders] ERROR: ${error.message}`); - throw error; + throw new Error("file parameter is required"); } if (!substitutions || typeof substitutions !== "object") { - const error = new Error("substitutions parameter must be an object"); - log(`[substitutePlaceholders] ERROR: ${error.message}`); - throw error; + throw new Error("substitutions parameter must be an object"); } - log(`[substitutePlaceholders] File: ${file}`); - log(`[substitutePlaceholders] Substitution count: ${Object.keys(substitutions).length}`); + core.info(`[substitutePlaceholders] ${file} (${Object.keys(substitutions).length} substitution(s))`); // Read the file let content; try { - log(`[substitutePlaceholders] Reading file...`); content = fs.readFileSync(file, "utf8"); - log(`[substitutePlaceholders] File read successfully`); - log(`[substitutePlaceholders] Original content length: ${content.length} characters`); - log(`[substitutePlaceholders] First 200 characters: ${content.substring(0, 200).replace(/\n/g, "\\n")}`); } catch (error) { const errorMessage = getErrorMessage(error); - log(`[substitutePlaceholders] ERROR reading file: ${errorMessage}`); throw new Error(`${ERR_SYSTEM}: Failed to read file ${file}: ${errorMessage}`); } // Perform substitutions - log("\n========================================"); - log("[substitutePlaceholders] Processing Substitutions"); - log("========================================"); - - let totalReplacements = 0; - const beforeLength = content.length; - for (const [key, value] of Object.entries(substitutions)) { const placeholder = `__${key}__`; // Convert undefined/null to empty string to avoid leaving "undefined" or "null" in the output const safeValue = value == null ? "" : value; - - // Count occurrences before replacement - const occurrences = (content.match(new RegExp(placeholder.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length; - - if (occurrences > 0) { - log(`[substitutePlaceholders] Replacing ${placeholder} (${occurrences} occurrence(s))`); - log(`[substitutePlaceholders] Value: ${safeValue.substring(0, 100)}${safeValue.length > 100 ? "..." : ""}`); - } else { - log(`[substitutePlaceholders] Placeholder ${placeholder} not found in content (unused)`); - } - content = content.split(placeholder).join(safeValue); - totalReplacements += occurrences; } - const afterLength = content.length; - log(`[substitutePlaceholders] Substitution complete: ${totalReplacements} total replacement(s)`); - log(`[substitutePlaceholders] Content length change: ${beforeLength} -> ${afterLength} (${afterLength > beforeLength ? "+" : ""}${afterLength - beforeLength})`); - // Write back to the file try { - log("\n========================================"); - log("[substitutePlaceholders] Writing Output"); - log("========================================"); - log(`[substitutePlaceholders] Writing processed content back to: ${file}`); fs.writeFileSync(file, content, "utf8"); - log(`[substitutePlaceholders] File written successfully`); - log(`[substitutePlaceholders] Last 200 characters: ${content.substring(Math.max(0, content.length - 200)).replace(/\n/g, "\\n")}`); - log("========================================"); - log("[substitutePlaceholders] Processing complete - SUCCESS"); - log("========================================"); } catch (error) { const errorMessage = getErrorMessage(error); - log(`[substitutePlaceholders] ERROR writing file: ${errorMessage}`); throw new Error(`${ERR_SYSTEM}: Failed to write file ${file}: ${errorMessage}`); } From d43c55523e7822c8a606b83e8d6905aa47177236 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Mar 2026 03:32:04 +0000 Subject: [PATCH 4/6] jsweep: add comment explaining shim.cjs import Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- actions/setup/js/substitute_placeholders.cjs | 1 + 1 file changed, 1 insertion(+) diff --git a/actions/setup/js/substitute_placeholders.cjs b/actions/setup/js/substitute_placeholders.cjs index e648ee75ea8..368729bfe93 100644 --- a/actions/setup/js/substitute_placeholders.cjs +++ b/actions/setup/js/substitute_placeholders.cjs @@ -1,6 +1,7 @@ // @ts-check /// +// Ensures global.core is available when running outside github-script context require("./shim.cjs"); const fs = require("fs"); const { getErrorMessage } = require("./error_helpers.cjs"); From d903fc3e11f0c75cf245442a394472461e9e6ac7 Mon Sep 17 00:00:00 2001 From: Codex Date: Tue, 3 Mar 2026 03:47:43 +0000 Subject: [PATCH 5/6] Add changeset for substitute placeholder cleanup [skip-ci] --- .changeset/patch-clean-substitute-placeholders.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/patch-clean-substitute-placeholders.md diff --git a/.changeset/patch-clean-substitute-placeholders.md b/.changeset/patch-clean-substitute-placeholders.md new file mode 100644 index 00000000000..58ff06d3398 --- /dev/null +++ b/.changeset/patch-clean-substitute-placeholders.md @@ -0,0 +1,5 @@ +--- +"gh-aw": patch +--- + +Documented the substitute placeholder cleanup (ts-check, shim import, logging simplification, and test cleanup). From 5fc1dcb2991de3d68600eb160d8bf4beb3edd2c7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 3 Mar 2026 03:49:07 +0000 Subject: [PATCH 6/6] ci: trigger checks