From 65fe2c8122c8e1fc70e85a6afa804a89387f0347 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 18 Aug 2026 15:11:26 +0000 Subject: [PATCH 1/5] Add blocked-by issue dependencies Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/aw/safe-outputs-content.md | 3 + actions/setup/js/create_issue.cjs | 109 ++++++++++++++++++ actions/setup/js/create_issue.test.cjs | 64 ++++++++++ .../setup/js/safe_output_handler_manager.cjs | 59 +++++++++- .../js/safe_output_handler_manager.test.cjs | 10 ++ actions/setup/js/safe_outputs_tools.json | 8 ++ actions/setup/js/temporary_id.cjs | 8 ++ actions/setup/js/temporary_id.test.cjs | 11 ++ pkg/workflow/js/safe_outputs_tools.json | 8 ++ 9 files changed, 279 insertions(+), 1 deletion(-) diff --git a/.github/aw/safe-outputs-content.md b/.github/aw/safe-outputs-content.md index 341a0b74ce9..3a80b37e659 100644 --- a/.github/aw/safe-outputs-content.md +++ b/.github/aw/safe-outputs-content.md @@ -22,6 +22,7 @@ description: Safe-output reference for issue, discussion, comment, and pull requ close-older-key: "my-key" # Optional: explicit deduplication key for close-older matching (uses gh-aw-close-key marker) deduplicate-by-title: true # Optional: skip creating an issue when one with the same title exists; integer N allows fuzzy matches up to edit distance N (default: off) normalize-closing-keywords: true # Optional: strip backticks around recognized issue-closing keywords in body text + # create_issue output may set blocked_by to an issue reference or list of references footer: false # Optional: omit AI-generated footer while preserving XML markers (default: true) target-repo: "owner/repo" # Optional: cross-repository allowed-repos: [owner/other] # Optional: additional repos agent can target (agent uses `repo` field in output) @@ -54,6 +55,8 @@ description: Safe-output reference for issue, discussion, comment, and pull requ {"type": "create_issue", "parent": "aw_abc123", "title": "Sub-task", "body": "References #aw_abc123"} ``` + **Blocked-By Dependencies:** Set `blocked_by` in `create_issue` output to an issue number, temporary ID, `owner/repo#number` reference, GitHub issue URL, or a list of references. Temporary IDs are resolved before the issue is created, allowing dependent output to be emitted in any order. + **Setting Issue Fields on Creation**: Agents can include a `fields` array in the `create_issue` output to set custom field values immediately after creation. Each item is `{"name": , "value": }`. Use a number for numeric fields; string for single-select, iteration title, date `YYYY-MM-DD`, or text. Restrict allowed names with `allowed-fields:`. ```json diff --git a/actions/setup/js/create_issue.cjs b/actions/setup/js/create_issue.cjs index 4943252ffd0..9ef407da6e0 100644 --- a/actions/setup/js/create_issue.cjs +++ b/actions/setup/js/create_issue.cjs @@ -376,6 +376,78 @@ function buildIssueFieldMutationInput(requestedFields, availableFields) { }); } +/** + * Parse and resolve an issue reference used by create_issue.blocked_by. + * Supports issue numbers, cross-repository references, URLs, and temporary IDs. + * + * @param {string|number} value + * @param {Map} temporaryIdMap + * @param {string} defaultRepo + * @returns {{target: {repo: string, number: number}|null, deferred?: boolean, error?: string}} + */ +function resolveBlockedByReference(value, temporaryIdMap, defaultRepo) { + const raw = String(value).trim(); + if (isTemporaryId(raw)) { + const resolved = temporaryIdMap.get(normalizeTemporaryId(raw)); + if (!resolved) { + return { target: null, deferred: true, error: `Unresolved temporary ID: ${raw}` }; + } + return { target: { repo: resolved.repo, number: resolved.number } }; + } + + const numericMatch = raw.match(/^#?([1-9]\d*)$/); + const crossRepoMatch = raw.match(/^([\w.-]+\/[\w.-]+)#([1-9]\d*)$/); + const urlMatch = raw.match(/^https?:\/\/github\.com\/([\w.-]+\/[\w.-]+)\/issues\/([1-9]\d*)(?:[?#/].*)?$/); + const match = crossRepoMatch || urlMatch; + const repo = match ? match[1] : defaultRepo; + const numberString = match ? match[2] : numericMatch?.[1]; + const number = Number(numberString); + + if (!repo || !Number.isSafeInteger(number) || number < 1) { + return { + target: null, + error: `Invalid blocked_by reference '${raw}'. Expected an issue number, owner/repo#number, GitHub issue URL, or temporary ID.`, + }; + } + return { target: { repo, number } }; +} + +/** + * Normalize blocked_by to a list of resolved issue references. + * + * @param {unknown} blockedBy + * @param {Map} temporaryIdMap + * @param {string} defaultRepo + * @returns {{targets: Array<{repo: string, number: number}>, deferred?: boolean, error?: string}} + */ +function resolveBlockedByReferences(blockedBy, temporaryIdMap, defaultRepo) { + if (blockedBy === undefined || blockedBy === null) { + return { targets: [] }; + } + const values = Array.isArray(blockedBy) ? blockedBy : [blockedBy]; + const targets = []; + const seen = new Set(); + + for (const value of values) { + if (typeof value !== "string" && typeof value !== "number") { + return { targets: [], error: "create_issue 'blocked_by' must be an issue reference or an array of issue references" }; + } + const resolved = resolveBlockedByReference(value, temporaryIdMap, defaultRepo); + if (resolved.deferred) { + return { targets: [], deferred: true, error: resolved.error }; + } + if (!resolved.target) { + return { targets: [], error: resolved.error }; + } + const key = `${resolved.target.repo.toLowerCase()}#${resolved.target.number}`; + if (!seen.has(key)) { + seen.add(key); + targets.push(resolved.target); + } + } + return { targets }; +} + /** * Apply issue field values to a newly-created issue. * Resolves metadata and sends the setIssueFieldValue GraphQL mutation. @@ -669,6 +741,15 @@ async function main(config = {}) { } const { repo: qualifiedItemRepo, repoParts } = repoResult; + const blockedBy = resolveBlockedByReferences(message.blocked_by, temporaryIdMap, qualifiedItemRepo); + if (blockedBy.deferred) { + core.info(`Deferring create_issue: ${blockedBy.error}`); + return { success: false, deferred: true, error: blockedBy.error }; + } + if (blockedBy.error) { + return { success: false, error: blockedBy.error }; + } + // Get or generate the temporary ID for this issue const tempIdResult = getOrGenerateTemporaryId(message, "issue"); if (tempIdResult.error) { @@ -1073,6 +1154,34 @@ async function main(config = {}) { } } + for (const blockedIssue of blockedBy.targets) { + const [blockedOwner, blockedRepo] = blockedIssue.repo.split("/"); + try { + const { data: blocker } = await githubClient.rest.issues.get({ + owner: blockedOwner, + repo: blockedRepo, + issue_number: blockedIssue.number, + }); + if (!Number.isSafeInteger(blocker?.id) || blocker.id < 1) { + throw new Error(`${ERR_VALIDATION}: Issue ${blockedIssue.repo}#${blockedIssue.number} did not return a valid issue ID`); + } + await githubClient.request("POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by", { + owner: repoParts.owner, + repo: repoParts.repo, + issue_number: issue.number, + issue_id: blocker.id, + }); + core.info(`Added blocked-by dependency: ${qualifiedItemRepo}#${issue.number} <- ${blockedIssue.repo}#${blockedIssue.number}`); + } catch (error) { + const dependencyError = getErrorMessage(error); + core.error(`Failed to add blocked-by dependency ${blockedIssue.repo}#${blockedIssue.number} to ${qualifiedItemRepo}#${issue.number}: ${dependencyError}`); + return { + success: false, + error: `Issue ${qualifiedItemRepo}#${issue.number} was created, but blocked-by dependency ${blockedIssue.repo}#${blockedIssue.number} could not be added: ${dependencyError}`, + }; + } + } + // Store the mapping of temporary_id -> {repo, number} // temporaryId is guaranteed to be non-null because we checked tempIdResult.error above const normalizedTempId = normalizeTemporaryId(String(temporaryId)); diff --git a/actions/setup/js/create_issue.test.cjs b/actions/setup/js/create_issue.test.cjs index 456dafbe96e..f697fe2f112 100644 --- a/actions/setup/js/create_issue.test.cjs +++ b/actions/setup/js/create_issue.test.cjs @@ -55,6 +55,7 @@ describe("create_issue", () => { }, }, graphql: vi.fn(), + request: vi.fn().mockResolvedValue({ data: {} }), }; // Mock Core @@ -1167,6 +1168,69 @@ describe("create_issue", () => { }); }); + describe("blocked-by dependencies", () => { + it("should add dependencies for same-repository and cross-repository issue references", async () => { + mockGithub.rest.issues.get = vi.fn().mockImplementation(({ owner, repo, issue_number }) => Promise.resolve({ data: { id: issue_number === 42 ? 9001 : 9002, owner, repo } })); + const handler = await main({}); + + const result = await handler({ + title: "Blocked issue", + body: "Waits for other work.", + blocked_by: [42, "other-org/other-repo#7"], + }); + + expect(result.success).toBe(true); + expect(mockGithub.rest.issues.get).toHaveBeenCalledWith({ + owner: "test-owner", + repo: "test-repo", + issue_number: 42, + }); + expect(mockGithub.rest.issues.get).toHaveBeenCalledWith({ + owner: "other-org", + repo: "other-repo", + issue_number: 7, + }); + expect(mockGithub.request).toHaveBeenCalledWith("POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by", expect.objectContaining({ owner: "test-owner", repo: "test-repo", issue_number: 123, issue_id: 9001 })); + expect(mockGithub.request).toHaveBeenCalledWith("POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by", expect.objectContaining({ owner: "test-owner", repo: "test-repo", issue_number: 123, issue_id: 9002 })); + }); + + it("should resolve temporary IDs before adding dependencies", async () => { + mockGithub.rest.issues.get = vi.fn().mockResolvedValue({ data: { id: 9001 } }); + const handler = await main({}); + + await handler({ + title: "Prerequisite", + body: "Must finish first.", + temporary_id: "aw_prereq", + }); + const result = await handler({ + title: "Blocked issue", + body: "Waits for the prerequisite.", + blocked_by: "#aw_prereq", + }); + + expect(result.success).toBe(true); + expect(mockGithub.rest.issues.get).toHaveBeenCalledWith({ + owner: "test-owner", + repo: "test-repo", + issue_number: 123, + }); + expect(mockGithub.request).toHaveBeenCalledWith("POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by", expect.objectContaining({ issue_id: 9001 })); + }); + + it("should defer creation until blocked-by temporary IDs resolve", async () => { + const handler = await main({}); + const result = await handler({ + title: "Blocked issue", + body: "Waits for a later prerequisite.", + blocked_by: "aw_prereq", + }); + + expect(result).toMatchObject({ success: false, deferred: true }); + expect(mockGithub.rest.issues.create).not.toHaveBeenCalled(); + }); + }); + describe("body sanitization", () => { it("should neutralize @mentions in issue body", async () => { const handler = await main({}); diff --git a/actions/setup/js/safe_output_handler_manager.cjs b/actions/setup/js/safe_output_handler_manager.cjs index cc9ce324a84..df0729a7ea5 100644 --- a/actions/setup/js/safe_output_handler_manager.cjs +++ b/actions/setup/js/safe_output_handler_manager.cjs @@ -13,7 +13,7 @@ const { loadAgentOutput } = require("./load_agent_output.cjs"); const { getErrorMessage } = require("./error_helpers.cjs"); const { ERR_CONFIG, ERR_PARSE, ERR_VALIDATION } = require("./error_codes.cjs"); const { classifySafeOutputResult, computeSafeOutputsStatus, isFailedProcessingResult } = require("./safe_outputs_status.cjs"); -const { hasUnresolvedTemporaryIds, replaceTemporaryIdReferences, replaceArtifactUrlReferences, normalizeTemporaryId } = require("./temporary_id.cjs"); +const { hasUnresolvedTemporaryIds, replaceTemporaryIdReferences, replaceArtifactUrlReferences, normalizeTemporaryId, extractTemporaryIdReferences, getCreatedTemporaryId } = require("./temporary_id.cjs"); const { generateMissingInfoSections } = require("./missing_info_formatter.cjs"); const { setCollectedMissings } = require("./missing_messages_helper.cjs"); const { writeSafeOutputSummaries } = require("./safe_output_summary.cjs"); @@ -724,6 +724,61 @@ function buildSkippedResult(type, messageIndex, result) { }; } +/** + * Sort messages so temporary-ID producers run before consumers while preserving + * the original order for independent messages and dependency cycles. + * + * @param {Array>} messages + * @returns {Array>} + */ +function sortMessagesByTemporaryIdDependencies(messages) { + const producers = new Map(); + messages.forEach((message, index) => { + const temporaryId = getCreatedTemporaryId(message); + if (temporaryId && !producers.has(temporaryId)) { + producers.set(temporaryId, index); + } + }); + + /** @type {Array>} */ + const dependents = messages.map(() => []); + const inDegree = messages.map(() => 0); + messages.forEach((message, index) => { + const dependencies = message.type === "create_issue" ? extractTemporaryIdReferences({ blocked_by: message.blocked_by }) : new Set(); + for (const temporaryId of dependencies) { + const producerIndex = producers.get(temporaryId); + if (producerIndex !== undefined && producerIndex !== index) { + dependents[producerIndex].push(index); + inDegree[index]++; + } + } + }); + + const ready = []; + inDegree.forEach((degree, index) => { + if (degree === 0) ready.push(index); + }); + const sorted = []; + while (ready.length > 0) { + const index = ready.shift(); + sorted.push(index); + for (const dependentIndex of dependents[index]) { + inDegree[dependentIndex]--; + if (inDegree[dependentIndex] === 0) { + ready.push(dependentIndex); + } + } + } + + if (sorted.length !== messages.length) { + core.warning("Temporary ID dependency cycle detected; preserving original order for cyclic safe outputs"); + for (let index = 0; index < messages.length; index++) { + if (!sorted.includes(index)) sorted.push(index); + } + } + return sorted.map(index => messages[index]); +} + /** * Process all messages from agent output in the order they appear * Dispatches each message to the appropriate handler while maintaining shared state (temporary ID map) @@ -735,6 +790,7 @@ function buildSkippedResult(type, messageIndex, result) { * @returns {Promise<{success: boolean, results: Array, temporaryIdMap: Object, artifactUrlMap: Map, outputsWithUnresolvedIds: Array, missings: Object, codePushFailures: Array<{type: string, error: string}>}>} */ async function processMessages(messageHandlers, messages, onItemCreated = null) { + messages = sortMessagesByTemporaryIdDependencies(messages); const results = []; const detectionConclusion = process.env.GH_AW_DETECTION_CONCLUSION || ""; @@ -1835,6 +1891,7 @@ module.exports = { loadConfig, loadHandlers, processMessages, + sortMessagesByTemporaryIdDependencies, buildCommentMemoryMessagesFromFiles, rollbackReviewResults, rollbackReviewResultsForPR, diff --git a/actions/setup/js/safe_output_handler_manager.test.cjs b/actions/setup/js/safe_output_handler_manager.test.cjs index 313d7c8574e..626127d0a39 100644 --- a/actions/setup/js/safe_output_handler_manager.test.cjs +++ b/actions/setup/js/safe_output_handler_manager.test.cjs @@ -7,6 +7,7 @@ import { loadConfig, loadHandlers, processMessages, + sortMessagesByTemporaryIdDependencies, buildCommentMemoryMessagesFromFiles, rollbackReviewResults, rollbackReviewResultsForPR, @@ -62,6 +63,15 @@ describe("Safe Output Handler Manager", () => { expect(result.add_comment).toEqual({ max: 1 }); }); + describe("temporary ID dependency ordering", () => { + it("orders a blocked_by temporary-ID producer before its dependent issue", () => { + const prerequisite = { type: "create_issue", temporary_id: "aw_prereq", title: "Prerequisite" }; + const blocked = { type: "create_issue", temporary_id: "aw_blocked", blocked_by: "aw_prereq", title: "Blocked" }; + + expect(sortMessagesByTemporaryIdDependencies([blocked, prerequisite])).toEqual([prerequisite, blocked]); + }); + }); + describe("logCreatedItemFromResult", () => { it("should log finalized review results and skip buffered review metadata", () => { const onItemCreated = vi.fn(); diff --git a/actions/setup/js/safe_outputs_tools.json b/actions/setup/js/safe_outputs_tools.json index 553cefd158c..1d01739a07c 100644 --- a/actions/setup/js/safe_outputs_tools.json +++ b/actions/setup/js/safe_outputs_tools.json @@ -53,6 +53,14 @@ "type": ["number", "string"], "description": "Parent issue number for creating sub-issues. This is the numeric ID from the GitHub URL (e.g., 42 in github.com/owner/repo/issues/42). Can also be a temporary_id from a previously created issue in the same workflow run \u2014 use the '#aw_abc123' form (e.g., '#aw_Test123'); the bare 'aw_abc123' form is also accepted and normalised to '#aw_abc123'." }, + "blocked_by": { + "type": ["number", "string", "array"], + "items": { + "type": ["number", "string"] + }, + "description": "Issue dependencies that block this issue. Provide one issue number, temporary_id, owner/repo#number reference, GitHub issue URL, or an array of these references. Temporary IDs are resolved before the dependency is created.", + "x-synonyms": ["blockedBy", "blocked-by"] + }, "temporary_id": { "type": "string", "pattern": "^#?aw_[A-Za-z0-9_]{3,12}$", diff --git a/actions/setup/js/temporary_id.cjs b/actions/setup/js/temporary_id.cjs index 7eda3b9d5be..02398818cac 100644 --- a/actions/setup/js/temporary_id.cjs +++ b/actions/setup/js/temporary_id.cjs @@ -628,6 +628,7 @@ function replaceTemporaryProjectReferences(text, tempProjectMap) { * Checks fields that commonly contain temporary IDs: * - body (for create_issue, create_discussion, add_comment) * - parent_issue_number, sub_issue_number (for link_sub_issue) + * - blocked_by (for create_issue dependencies) * - issue_number (for add_comment, update_issue, etc.) * - discussion_number (for create_discussion, update_discussion) * @@ -665,6 +666,13 @@ function extractTemporaryIdReferences(message) { } } + const blockedBy = message.blocked_by; + for (const value of Array.isArray(blockedBy) ? blockedBy : [blockedBy]) { + if (value !== undefined && value !== null && isTemporaryId(String(value).trim())) { + tempIds.add(normalizeTemporaryId(String(value).trim())); + } + } + // Check URL fields that may contain temporary IDs instead of issue numbers // Format: https://github.com/owner/repo/issues/#aw_XXXXXXXXXXXX or just #aw_XXXXXXXXXXXX const urlFields = ["item_url"]; diff --git a/actions/setup/js/temporary_id.test.cjs b/actions/setup/js/temporary_id.test.cjs index 4171dd286e9..509d3e88a2f 100644 --- a/actions/setup/js/temporary_id.test.cjs +++ b/actions/setup/js/temporary_id.test.cjs @@ -817,6 +817,17 @@ describe("temporary_id.cjs", () => { expect(refs.has("aw_bbbb12")).toBe(true); }); + it("should extract temporary IDs from blocked_by dependencies", async () => { + const { extractTemporaryIdReferences } = await import("./temporary_id.cjs"); + + const refs = extractTemporaryIdReferences({ + type: "create_issue", + blocked_by: ["aw_prereq", "#aw_other"], + }); + + expect(refs).toEqual(new Set(["aw_prereq", "aw_other"])); + }); + it("should handle # prefix in ID fields", async () => { const { extractTemporaryIdReferences } = await import("./temporary_id.cjs"); diff --git a/pkg/workflow/js/safe_outputs_tools.json b/pkg/workflow/js/safe_outputs_tools.json index 553cefd158c..1d01739a07c 100644 --- a/pkg/workflow/js/safe_outputs_tools.json +++ b/pkg/workflow/js/safe_outputs_tools.json @@ -53,6 +53,14 @@ "type": ["number", "string"], "description": "Parent issue number for creating sub-issues. This is the numeric ID from the GitHub URL (e.g., 42 in github.com/owner/repo/issues/42). Can also be a temporary_id from a previously created issue in the same workflow run \u2014 use the '#aw_abc123' form (e.g., '#aw_Test123'); the bare 'aw_abc123' form is also accepted and normalised to '#aw_abc123'." }, + "blocked_by": { + "type": ["number", "string", "array"], + "items": { + "type": ["number", "string"] + }, + "description": "Issue dependencies that block this issue. Provide one issue number, temporary_id, owner/repo#number reference, GitHub issue URL, or an array of these references. Temporary IDs are resolved before the dependency is created.", + "x-synonyms": ["blockedBy", "blocked-by"] + }, "temporary_id": { "type": "string", "pattern": "^#?aw_[A-Za-z0-9_]{3,12}$", From d84111485baca831f924fcade9c13283a61a45b2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 18 Aug 2026 15:12:47 +0000 Subject: [PATCH 2/5] Optimize dependency ordering fallback Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- actions/setup/js/safe_output_handler_manager.cjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/actions/setup/js/safe_output_handler_manager.cjs b/actions/setup/js/safe_output_handler_manager.cjs index df0729a7ea5..3214c6ccbde 100644 --- a/actions/setup/js/safe_output_handler_manager.cjs +++ b/actions/setup/js/safe_output_handler_manager.cjs @@ -772,8 +772,9 @@ function sortMessagesByTemporaryIdDependencies(messages) { if (sorted.length !== messages.length) { core.warning("Temporary ID dependency cycle detected; preserving original order for cyclic safe outputs"); + const sortedIndices = new Set(sorted); for (let index = 0; index < messages.length; index++) { - if (!sorted.includes(index)) sorted.push(index); + if (!sortedIndices.has(index)) sorted.push(index); } } return sorted.map(index => messages[index]); From 7f8d11ab9323b3f3c089bb7cdceef4835c3eb81b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:11:40 +0000 Subject: [PATCH 3/5] Address review feedback on blocked-by dependency ordering and staged previews Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/aw/safe-outputs-content.md | 2 +- actions/setup/js/create_issue.cjs | 54 +++++++++++++------ actions/setup/js/create_issue.test.cjs | 30 +++++++++++ .../setup/js/safe_output_handler_manager.cjs | 45 ++++++++++++---- .../js/safe_output_handler_manager.test.cjs | 17 ++++++ 5 files changed, 121 insertions(+), 27 deletions(-) diff --git a/.github/aw/safe-outputs-content.md b/.github/aw/safe-outputs-content.md index 3a80b37e659..60f442af69d 100644 --- a/.github/aw/safe-outputs-content.md +++ b/.github/aw/safe-outputs-content.md @@ -55,7 +55,7 @@ description: Safe-output reference for issue, discussion, comment, and pull requ {"type": "create_issue", "parent": "aw_abc123", "title": "Sub-task", "body": "References #aw_abc123"} ``` - **Blocked-By Dependencies:** Set `blocked_by` in `create_issue` output to an issue number, temporary ID, `owner/repo#number` reference, GitHub issue URL, or a list of references. Temporary IDs are resolved before the issue is created, allowing dependent output to be emitted in any order. + **Blocked-By Dependencies:** Set `blocked_by` in `create_issue` output to an issue number, temporary ID, `owner/repo#number` reference, GitHub issue URL, or a list of references. Temporary IDs are resolved before the issue is created, allowing dependent output to be emitted in any order. Attaching a dependency is best-effort: if the dependency API call fails the issue is still reported as created and the failure is logged as a warning. **Setting Issue Fields on Creation**: Agents can include a `fields` array in the `create_issue` output to set custom field values immediately after creation. Each item is `{"name": , "value": }`. Use a number for numeric fields; string for single-select, iteration title, date `YYYY-MM-DD`, or text. Restrict allowed names with `allowed-fields:`. diff --git a/actions/setup/js/create_issue.cjs b/actions/setup/js/create_issue.cjs index 9ef407da6e0..22a45126cb2 100644 --- a/actions/setup/js/create_issue.cjs +++ b/actions/setup/js/create_issue.cjs @@ -383,13 +383,17 @@ function buildIssueFieldMutationInput(requestedFields, availableFields) { * @param {string|number} value * @param {Map} temporaryIdMap * @param {string} defaultRepo - * @returns {{target: {repo: string, number: number}|null, deferred?: boolean, error?: string}} + * @param {boolean} [allowUnresolvedTemporaryIds] - When true (staged mode), unresolved temporary IDs are reported instead of deferring + * @returns {{target: {repo: string, number: number}|null, deferred?: boolean, unresolvedTemporaryId?: string, error?: string}} */ -function resolveBlockedByReference(value, temporaryIdMap, defaultRepo) { +function resolveBlockedByReference(value, temporaryIdMap, defaultRepo, allowUnresolvedTemporaryIds = false) { const raw = String(value).trim(); if (isTemporaryId(raw)) { const resolved = temporaryIdMap.get(normalizeTemporaryId(raw)); if (!resolved) { + if (allowUnresolvedTemporaryIds) { + return { target: null, unresolvedTemporaryId: raw }; + } return { target: null, deferred: true, error: `Unresolved temporary ID: ${raw}` }; } return { target: { repo: resolved.repo, number: resolved.number } }; @@ -418,26 +422,35 @@ function resolveBlockedByReference(value, temporaryIdMap, defaultRepo) { * @param {unknown} blockedBy * @param {Map} temporaryIdMap * @param {string} defaultRepo - * @returns {{targets: Array<{repo: string, number: number}>, deferred?: boolean, error?: string}} + * @param {boolean} [allowUnresolvedTemporaryIds] - When true (staged mode), unresolved temporary IDs are collected instead of deferring + * @returns {{targets: Array<{repo: string, number: number}>, unresolvedTemporaryIds: Array, deferred?: boolean, error?: string}} */ -function resolveBlockedByReferences(blockedBy, temporaryIdMap, defaultRepo) { +function resolveBlockedByReferences(blockedBy, temporaryIdMap, defaultRepo, allowUnresolvedTemporaryIds = false) { if (blockedBy === undefined || blockedBy === null) { - return { targets: [] }; + return { targets: [], unresolvedTemporaryIds: [] }; } const values = Array.isArray(blockedBy) ? blockedBy : [blockedBy]; const targets = []; + const unresolvedTemporaryIds = []; const seen = new Set(); for (const value of values) { if (typeof value !== "string" && typeof value !== "number") { - return { targets: [], error: "create_issue 'blocked_by' must be an issue reference or an array of issue references" }; + return { targets: [], unresolvedTemporaryIds: [], error: "create_issue 'blocked_by' must be an issue reference or an array of issue references" }; } - const resolved = resolveBlockedByReference(value, temporaryIdMap, defaultRepo); + const resolved = resolveBlockedByReference(value, temporaryIdMap, defaultRepo, allowUnresolvedTemporaryIds); if (resolved.deferred) { - return { targets: [], deferred: true, error: resolved.error }; + return { targets: [], unresolvedTemporaryIds: [], deferred: true, error: resolved.error }; + } + if (resolved.unresolvedTemporaryId) { + if (!seen.has(resolved.unresolvedTemporaryId)) { + seen.add(resolved.unresolvedTemporaryId); + unresolvedTemporaryIds.push(resolved.unresolvedTemporaryId); + } + continue; } if (!resolved.target) { - return { targets: [], error: resolved.error }; + return { targets: [], unresolvedTemporaryIds: [], error: resolved.error }; } const key = `${resolved.target.repo.toLowerCase()}#${resolved.target.number}`; if (!seen.has(key)) { @@ -445,7 +458,7 @@ function resolveBlockedByReferences(blockedBy, temporaryIdMap, defaultRepo) { targets.push(resolved.target); } } - return { targets }; + return { targets, unresolvedTemporaryIds }; } /** @@ -741,7 +754,9 @@ async function main(config = {}) { } const { repo: qualifiedItemRepo, repoParts } = repoResult; - const blockedBy = resolveBlockedByReferences(message.blocked_by, temporaryIdMap, qualifiedItemRepo); + // In staged mode no issues are created, so temporary IDs never resolve; validate the + // references without deferring so dependent issues still get a staged preview. + const blockedBy = resolveBlockedByReferences(message.blocked_by, temporaryIdMap, qualifiedItemRepo, isStaged); if (blockedBy.deferred) { core.info(`Deferring create_issue: ${blockedBy.error}`); return { success: false, deferred: true, error: blockedBy.error }; @@ -1094,6 +1109,10 @@ async function main(config = {}) { // If in staged mode, preview the issue without creating it if (isStaged) { logStagedPreviewInfo(`Would create issue in ${qualifiedItemRepo} with title: ${title}`); + const stagedBlockedBy = [...blockedBy.targets.map(target => `${target.repo}#${target.number}`), ...blockedBy.unresolvedTemporaryIds]; + if (stagedBlockedBy.length > 0) { + logStagedPreviewInfo(`Would mark issue as blocked by: ${stagedBlockedBy.join(", ")}`); + } if (deduplicateByTitle.enabled) { recordSeenTitle(qualifiedItemRepo, title, normalizedTitle); } @@ -1109,6 +1128,7 @@ async function main(config = {}) { fields: issueFields, bodyLength: body.length, temporaryId, + ...(stagedBlockedBy.length > 0 ? { blockedBy: stagedBlockedBy } : {}), }, }; } @@ -1154,6 +1174,10 @@ async function main(config = {}) { } } + // Dependency attachment is best-effort: the issue already exists at this point, + // so a dependency API failure must not report the whole create_issue as failed. + /** @type {Array} */ + const blockedByFailures = []; for (const blockedIssue of blockedBy.targets) { const [blockedOwner, blockedRepo] = blockedIssue.repo.split("/"); try { @@ -1174,11 +1198,8 @@ async function main(config = {}) { core.info(`Added blocked-by dependency: ${qualifiedItemRepo}#${issue.number} <- ${blockedIssue.repo}#${blockedIssue.number}`); } catch (error) { const dependencyError = getErrorMessage(error); - core.error(`Failed to add blocked-by dependency ${blockedIssue.repo}#${blockedIssue.number} to ${qualifiedItemRepo}#${issue.number}: ${dependencyError}`); - return { - success: false, - error: `Issue ${qualifiedItemRepo}#${issue.number} was created, but blocked-by dependency ${blockedIssue.repo}#${blockedIssue.number} could not be added: ${dependencyError}`, - }; + blockedByFailures.push(`${blockedIssue.repo}#${blockedIssue.number}: ${dependencyError}`); + core.warning(`Issue ${qualifiedItemRepo}#${issue.number} was created, but blocked-by dependency ${blockedIssue.repo}#${blockedIssue.number} could not be added: ${dependencyError}`); } } @@ -1324,6 +1345,7 @@ async function main(config = {}) { number: issue.number, url: issue.html_url, temporaryId: temporaryId, + ...(blockedByFailures.length > 0 ? { blocked_by_errors: blockedByFailures } : {}), _repo: qualifiedItemRepo, // For tracking in the closure }; } catch (error) { diff --git a/actions/setup/js/create_issue.test.cjs b/actions/setup/js/create_issue.test.cjs index f697fe2f112..976351f16d5 100644 --- a/actions/setup/js/create_issue.test.cjs +++ b/actions/setup/js/create_issue.test.cjs @@ -1229,6 +1229,36 @@ describe("create_issue", () => { expect(result).toMatchObject({ success: false, deferred: true }); expect(mockGithub.rest.issues.create).not.toHaveBeenCalled(); }); + + it("should keep the issue successful when the dependency API fails", async () => { + mockGithub.rest.issues.get = vi.fn().mockResolvedValue({ data: { id: 9001 } }); + mockGithub.request = vi.fn().mockRejectedValue(new Error("dependency api unavailable")); + const handler = await main({}); + + const result = await handler({ + title: "Blocked issue", + body: "Waits for other work.", + blocked_by: 42, + }); + + expect(result.success).toBe(true); + expect(result.number).toBe(123); + expect(result.blocked_by_errors).toEqual([expect.stringContaining("dependency api unavailable")]); + }); + + it("should preview unresolved temporary IDs in staged mode instead of deferring", async () => { + const handler = await main({ staged: true }); + + const result = await handler({ + title: "Blocked issue", + body: "Waits for a prerequisite created in the same run.", + blocked_by: ["aw_prereq", 42], + }); + + expect(result).toMatchObject({ success: true, staged: true }); + expect(result.previewInfo.blockedBy).toEqual(["test-owner/test-repo#42", "aw_prereq"]); + expect(mockGithub.rest.issues.create).not.toHaveBeenCalled(); + }); }); describe("body sanitization", () => { diff --git a/actions/setup/js/safe_output_handler_manager.cjs b/actions/setup/js/safe_output_handler_manager.cjs index 3214c6ccbde..430a50babd8 100644 --- a/actions/setup/js/safe_output_handler_manager.cjs +++ b/actions/setup/js/safe_output_handler_manager.cjs @@ -725,13 +725,14 @@ function buildSkippedResult(type, messageIndex, result) { } /** - * Sort messages so temporary-ID producers run before consumers while preserving - * the original order for independent messages and dependency cycles. + * Compute the processing order (original message indices) so that temporary-ID + * producers run before consumers while preserving the original order for + * independent messages and dependency cycles. * * @param {Array>} messages - * @returns {Array>} + * @returns {Array} original message indices in processing order */ -function sortMessagesByTemporaryIdDependencies(messages) { +function sortMessageIndicesByTemporaryIdDependencies(messages) { const producers = new Map(); messages.forEach((message, index) => { const temporaryId = getCreatedTemporaryId(message); @@ -754,18 +755,29 @@ function sortMessagesByTemporaryIdDependencies(messages) { } }); + /** @type {Array} */ const ready = []; + /** @param {number} index */ + const pushReady = index => { + // Keep the ready queue ordered by original message index so independent + // messages keep their original relative order (stable topological sort). + let position = ready.length; + while (position > 0 && ready[position - 1] > index) position--; + ready.splice(position, 0, index); + }; inDegree.forEach((degree, index) => { - if (degree === 0) ready.push(index); + if (degree === 0) pushReady(index); }); + /** @type {Array} */ const sorted = []; while (ready.length > 0) { const index = ready.shift(); + if (index === undefined) break; sorted.push(index); for (const dependentIndex of dependents[index]) { inDegree[dependentIndex]--; if (inDegree[dependentIndex] === 0) { - ready.push(dependentIndex); + pushReady(dependentIndex); } } } @@ -777,7 +789,18 @@ function sortMessagesByTemporaryIdDependencies(messages) { if (!sortedIndices.has(index)) sorted.push(index); } } - return sorted.map(index => messages[index]); + return sorted; +} + +/** + * Sort messages so temporary-ID producers run before consumers while preserving + * the original order for independent messages and dependency cycles. + * + * @param {Array>} messages + * @returns {Array>} + */ +function sortMessagesByTemporaryIdDependencies(messages) { + return sortMessageIndicesByTemporaryIdDependencies(messages).map(index => messages[index]); } /** @@ -791,7 +814,7 @@ function sortMessagesByTemporaryIdDependencies(messages) { * @returns {Promise<{success: boolean, results: Array, temporaryIdMap: Object, artifactUrlMap: Map, outputsWithUnresolvedIds: Array, missings: Object, codePushFailures: Array<{type: string, error: string}>}>} */ async function processMessages(messageHandlers, messages, onItemCreated = null) { - messages = sortMessagesByTemporaryIdDependencies(messages); + const processingOrder = sortMessageIndicesByTemporaryIdDependencies(messages); const results = []; const detectionConclusion = process.env.GH_AW_DETECTION_CONCLUSION || ""; @@ -840,8 +863,9 @@ async function processMessages(messageHandlers, messages, onItemCreated = null) core.info(`Processing ${messages.length} message(s) in order of appearance...`); - // Process messages in order of appearance - for (let i = 0; i < messages.length; i++) { + // Process messages in dependency order while reporting original message indices + for (let position = 0; position < processingOrder.length; position++) { + const i = processingOrder[position]; const message = messages[i]; const messageType = message.type; @@ -1893,6 +1917,7 @@ module.exports = { loadHandlers, processMessages, sortMessagesByTemporaryIdDependencies, + sortMessageIndicesByTemporaryIdDependencies, buildCommentMemoryMessagesFromFiles, rollbackReviewResults, rollbackReviewResultsForPR, diff --git a/actions/setup/js/safe_output_handler_manager.test.cjs b/actions/setup/js/safe_output_handler_manager.test.cjs index 626127d0a39..8323755d15f 100644 --- a/actions/setup/js/safe_output_handler_manager.test.cjs +++ b/actions/setup/js/safe_output_handler_manager.test.cjs @@ -8,6 +8,7 @@ import { loadHandlers, processMessages, sortMessagesByTemporaryIdDependencies, + sortMessageIndicesByTemporaryIdDependencies, buildCommentMemoryMessagesFromFiles, rollbackReviewResults, rollbackReviewResultsForPR, @@ -70,6 +71,22 @@ describe("Safe Output Handler Manager", () => { expect(sortMessagesByTemporaryIdDependencies([blocked, prerequisite])).toEqual([prerequisite, blocked]); }); + + it("keeps independent messages in their original relative order", () => { + const dependent = { type: "create_issue", temporary_id: "aw_blocked", blocked_by: "aw_prereq", title: "Blocked" }; + const producer = { type: "create_issue", temporary_id: "aw_prereq", title: "Prerequisite" }; + const unrelated = { type: "create_issue", temporary_id: "aw_other", title: "Unrelated" }; + + expect(sortMessagesByTemporaryIdDependencies([dependent, producer, unrelated])).toEqual([producer, dependent, unrelated]); + }); + + it("returns original message indices in processing order", () => { + const dependent = { type: "create_issue", temporary_id: "aw_blocked", blocked_by: "aw_prereq", title: "Blocked" }; + const producer = { type: "create_issue", temporary_id: "aw_prereq", title: "Prerequisite" }; + const unrelated = { type: "create_issue", temporary_id: "aw_other", title: "Unrelated" }; + + expect(sortMessageIndicesByTemporaryIdDependencies([dependent, producer, unrelated])).toEqual([1, 0, 2]); + }); }); describe("logCreatedItemFromResult", () => { From 624d0d02f4dc14ad6df23fa335f5790349a41548 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:14:04 +0000 Subject: [PATCH 4/5] Preserve declared blocked_by order in staged preview Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- actions/setup/js/create_issue.cjs | 22 ++++++++++++---------- actions/setup/js/create_issue.test.cjs | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/actions/setup/js/create_issue.cjs b/actions/setup/js/create_issue.cjs index 22a45126cb2..12de7487195 100644 --- a/actions/setup/js/create_issue.cjs +++ b/actions/setup/js/create_issue.cjs @@ -422,43 +422,45 @@ function resolveBlockedByReference(value, temporaryIdMap, defaultRepo, allowUnre * @param {unknown} blockedBy * @param {Map} temporaryIdMap * @param {string} defaultRepo - * @param {boolean} [allowUnresolvedTemporaryIds] - When true (staged mode), unresolved temporary IDs are collected instead of deferring - * @returns {{targets: Array<{repo: string, number: number}>, unresolvedTemporaryIds: Array, deferred?: boolean, error?: string}} + * @param {boolean} [allowUnresolvedTemporaryIds] - When true (staged mode), unresolved temporary IDs are kept as display-only references instead of deferring + * @returns {{targets: Array<{repo: string, number: number}>, references: Array, deferred?: boolean, error?: string}} */ function resolveBlockedByReferences(blockedBy, temporaryIdMap, defaultRepo, allowUnresolvedTemporaryIds = false) { if (blockedBy === undefined || blockedBy === null) { - return { targets: [], unresolvedTemporaryIds: [] }; + return { targets: [], references: [] }; } const values = Array.isArray(blockedBy) ? blockedBy : [blockedBy]; const targets = []; - const unresolvedTemporaryIds = []; + // Display references in declared order, including temporary IDs left unresolved in staged mode + const references = []; const seen = new Set(); for (const value of values) { if (typeof value !== "string" && typeof value !== "number") { - return { targets: [], unresolvedTemporaryIds: [], error: "create_issue 'blocked_by' must be an issue reference or an array of issue references" }; + return { targets: [], references: [], error: "create_issue 'blocked_by' must be an issue reference or an array of issue references" }; } const resolved = resolveBlockedByReference(value, temporaryIdMap, defaultRepo, allowUnresolvedTemporaryIds); if (resolved.deferred) { - return { targets: [], unresolvedTemporaryIds: [], deferred: true, error: resolved.error }; + return { targets: [], references: [], deferred: true, error: resolved.error }; } if (resolved.unresolvedTemporaryId) { if (!seen.has(resolved.unresolvedTemporaryId)) { seen.add(resolved.unresolvedTemporaryId); - unresolvedTemporaryIds.push(resolved.unresolvedTemporaryId); + references.push(resolved.unresolvedTemporaryId); } continue; } if (!resolved.target) { - return { targets: [], unresolvedTemporaryIds: [], error: resolved.error }; + return { targets: [], references: [], error: resolved.error }; } const key = `${resolved.target.repo.toLowerCase()}#${resolved.target.number}`; if (!seen.has(key)) { seen.add(key); targets.push(resolved.target); + references.push(`${resolved.target.repo}#${resolved.target.number}`); } } - return { targets, unresolvedTemporaryIds }; + return { targets, references }; } /** @@ -1109,7 +1111,7 @@ async function main(config = {}) { // If in staged mode, preview the issue without creating it if (isStaged) { logStagedPreviewInfo(`Would create issue in ${qualifiedItemRepo} with title: ${title}`); - const stagedBlockedBy = [...blockedBy.targets.map(target => `${target.repo}#${target.number}`), ...blockedBy.unresolvedTemporaryIds]; + const stagedBlockedBy = blockedBy.references; if (stagedBlockedBy.length > 0) { logStagedPreviewInfo(`Would mark issue as blocked by: ${stagedBlockedBy.join(", ")}`); } diff --git a/actions/setup/js/create_issue.test.cjs b/actions/setup/js/create_issue.test.cjs index 976351f16d5..23bbfca684e 100644 --- a/actions/setup/js/create_issue.test.cjs +++ b/actions/setup/js/create_issue.test.cjs @@ -1256,7 +1256,7 @@ describe("create_issue", () => { }); expect(result).toMatchObject({ success: true, staged: true }); - expect(result.previewInfo.blockedBy).toEqual(["test-owner/test-repo#42", "aw_prereq"]); + expect(result.previewInfo.blockedBy).toEqual(["aw_prereq", "test-owner/test-repo#42"]); expect(mockGithub.rest.issues.create).not.toHaveBeenCalled(); }); }); From 084824bab0ae9fe8852422a29e73507e0a2d348c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 18 Aug 2026 19:40:26 +0000 Subject: [PATCH 5/5] Add blocked_by to create_issue validation config Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/ab-testing-advisor.lock.yml | 1 + .github/workflows/ace-editor.lock.yml | 1 + .github/workflows/agent-job-health.lock.yml | 1 + .../workflows/agent-performance-analyzer.lock.yml | 1 + .github/workflows/agent-persona-explorer.lock.yml | 1 + .github/workflows/agentic-token-audit.lock.yml | 1 + .github/workflows/agentic-token-optimizer.lock.yml | 1 + .../workflows/agentic-token-trend-audit.lock.yml | 1 + .github/workflows/architecture-guardian.lock.yml | 1 + .github/workflows/aw-failure-investigator.lock.yml | 1 + .github/workflows/bot-detection.lock.yml | 1 + .github/workflows/breaking-change-checker.lock.yml | 1 + .github/workflows/ci-doctor.lock.yml | 1 + .github/workflows/cli-consistency-checker.lock.yml | 1 + .github/workflows/cli-version-checker.lock.yml | 1 + .../workflows/codex-github-remote-mcp-test.lock.yml | 1 + .github/workflows/contribution-check.lock.yml | 1 + .../copilot-centralization-drilldown.lock.yml | 1 + .../copilot-centralization-optimizer.lock.yml | 1 + .../workflows/copilot-cli-deep-research.lock.yml | 1 + .github/workflows/copilot-opt.lock.yml | 1 + .../daily-action-setup-security-audit.lock.yml | 1 + .../daily-agentrx-trace-optimizer.lock.yml | 1 + .../daily-ambient-context-optimizer.lock.yml | 1 + .../workflows/daily-architecture-diagram.lock.yml | 1 + .../daily-aw-cross-repo-compile-check.lock.yml | 1 + .../daily-awf-spec-compiler-surfacing.lock.yml | 1 + .github/workflows/daily-byok-ollama-test.lock.yml | 1 + .../daily-cache-strategy-analyzer.lock.yml | 1 + .github/workflows/daily-cli-performance.lock.yml | 1 + .github/workflows/daily-cli-tools-tester.lock.yml | 1 + .../workflows/daily-community-attribution.lock.yml | 1 + .github/workflows/daily-credit-limit-test.lock.yml | 1 + .github/workflows/daily-doc-healer.lock.yml | 1 + .github/workflows/daily-evals-report.lock.yml | 1 + .github/workflows/daily-file-diet.lock.yml | 1 + .../workflows/daily-formal-spec-verifier.lock.yml | 1 + .github/workflows/daily-function-namer.lock.yml | 1 + .github/workflows/daily-geo-optimizer.lock.yml | 1 + .../daily-github-docs-seo-optimizer.lock.yml | 1 + .github/workflows/daily-graft-intelligence.lock.yml | 1 + .github/workflows/daily-hippo-learn.lock.yml | 1 + .../workflows/daily-max-ai-credits-test.lock.yml | 1 + .../daily-mcp-concurrency-analysis.lock.yml | 1 + .github/workflows/daily-model-inventory.lock.yml | 1 + .github/workflows/daily-model-resolution.lock.yml | 1 + .../daily-multi-device-docs-tester.lock.yml | 1 + .github/workflows/daily-pr-review-cursor.lock.yml | 1 + .../workflows/daily-regression-audit-kiro.lock.yml | 1 + .github/workflows/daily-reliability-review.lock.yml | 1 + .../workflows/daily-safe-output-optimizer.lock.yml | 1 + .../daily-safe-outputs-conformance.lock.yml | 1 + .../daily-safeoutputs-git-simulator.lock.yml | 1 + .../workflows/daily-schema-audit-cursor.lock.yml | 1 + .github/workflows/daily-security-red-team.lock.yml | 1 + .github/workflows/daily-spdd-spec-planner.lock.yml | 1 + .github/workflows/daily-spec-coverage-kiro.lock.yml | 1 + .github/workflows/daily-spending-forecast.lock.yml | 1 + .github/workflows/daily-squid-image-scan.lock.yml | 1 + .../workflows/daily-syntax-error-quality.lock.yml | 1 + .github/workflows/daily-team-status.lock.yml | 1 + .../daily-testify-uber-super-expert.lock.yml | 1 + .../daily-token-consumption-report.lock.yml | 1 + .github/workflows/daily-vulnhunter-scan.lock.yml | 1 + ...ly-windows-terminal-integration-builder.lock.yml | 1 + .github/workflows/deep-report.lock.yml | 1 + .github/workflows/deepsec-security-scan.lock.yml | 1 + .github/workflows/delight.lock.yml | 1 + .github/workflows/dependabot-go-checker.lock.yml | 1 + .../workflows/deployment-incident-monitor.lock.yml | 1 + .github/workflows/designer-drift-audit.lock.yml | 1 + .github/workflows/dev.lock.yml | 1 + .github/workflows/duplicate-code-detector.lock.yml | 1 + .github/workflows/eslint-monster.lock.yml | 1 + .github/workflows/eslint-refiner.lock.yml | 1 + .../example-failure-category-filter.lock.yml | 1 + .../workflows/example-permissions-warning.lock.yml | 1 + .github/workflows/firewall.lock.yml | 1 + .github/workflows/go-fan.lock.yml | 1 + .github/workflows/go-pattern-detector.lock.yml | 1 + .github/workflows/gpclean.lock.yml | 1 + .github/workflows/hippo-embed.lock.yml | 1 + .github/workflows/issue-arborist.lock.yml | 1 + .github/workflows/lint-monster.lock.yml | 1 + .github/workflows/metrics-collector.lock.yml | 1 + .github/workflows/notion-issue-summary.lock.yml | 1 + .github/workflows/objective-impact-report.lock.yml | 1 + .github/workflows/outcome-collector.lock.yml | 1 + .github/workflows/plan.lock.yml | 1 + .github/workflows/poem-bot.lock.yml | 1 + .github/workflows/pr-sous-chef.lock.yml | 1 + .github/workflows/pr-triage-agent.lock.yml | 1 + .github/workflows/refactoring-cadence.lock.yml | 1 + .github/workflows/ruflo-backed-task.lock.yml | 1 + .github/workflows/security-compliance.lock.yml | 1 + .../workflows/semantic-function-refactor.lock.yml | 1 + .github/workflows/sergo.lock.yml | 1 + .github/workflows/sighthound-security-scan.lock.yml | 1 + .github/workflows/smoke-aider.lock.yml | 1 + .github/workflows/smoke-ci.lock.yml | 1 + .github/workflows/smoke-claude.lock.yml | 1 + .github/workflows/smoke-codex.lock.yml | 1 + .../workflows/smoke-copilot-aoai-apikey.lock.yml | 1 + .github/workflows/smoke-copilot-aoai-entra.lock.yml | 1 + .github/workflows/smoke-copilot-arm.lock.yml | 1 + .github/workflows/smoke-copilot-mai.lock.yml | 1 + .github/workflows/smoke-copilot-sdk.lock.yml | 1 + .github/workflows/smoke-copilot-small.lock.yml | 1 + .github/workflows/smoke-copilot-sub-agents.lock.yml | 1 + .github/workflows/smoke-copilot.lock.yml | 1 + .../workflows/smoke-create-cross-repo-pr.lock.yml | 1 + .github/workflows/smoke-crush.lock.yml | 1 + .github/workflows/smoke-cursor.lock.yml | 1 + .github/workflows/smoke-deepseek-harness.lock.yml | 1 + .github/workflows/smoke-gemini.lock.yml | 1 + .github/workflows/smoke-goose.lock.yml | 1 + .github/workflows/smoke-kiro.lock.yml | 1 + .github/workflows/smoke-opencode.lock.yml | 1 + .github/workflows/smoke-otel-backends.lock.yml | 1 + .github/workflows/smoke-pi.lock.yml | 1 + .github/workflows/smoke-project.lock.yml | 1 + .github/workflows/smoke-pydantic.lock.yml | 1 + .github/workflows/smoke-temporary-id.lock.yml | 1 + .../workflows/smoke-update-cross-repo-pr.lock.yml | 1 + .../smoke-workflow-call-with-inputs.lock.yml | 1 + .github/workflows/spec-librarian.lock.yml | 1 + .github/workflows/squad-game-planner.lock.yml | 1 + .github/workflows/squad-plan.lock.yml | 1 + .github/workflows/squad.lock.yml | 1 + .github/workflows/stale-repo-identifier.lock.yml | 1 + .github/workflows/static-analysis-report.lock.yml | 1 + .github/workflows/step-name-alignment.lock.yml | 1 + .github/workflows/super-linter.lock.yml | 1 + .../workflows/uk-ai-operational-resilience.lock.yml | 1 + .github/workflows/video-analyzer.lock.yml | 1 + .github/workflows/workflow-health-manager.lock.yml | 1 + .github/workflows/workflow-normalizer.lock.yml | 1 + .github/workflows/workflow-skill-extractor.lock.yml | 1 + pkg/workflow/safe_outputs_validation_config.go | 13 ++++++++----- 139 files changed, 146 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ab-testing-advisor.lock.yml b/.github/workflows/ab-testing-advisor.lock.yml index 3c85e32d718..a5c260c949c 100644 --- a/.github/workflows/ab-testing-advisor.lock.yml +++ b/.github/workflows/ab-testing-advisor.lock.yml @@ -569,6 +569,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/ace-editor.lock.yml b/.github/workflows/ace-editor.lock.yml index 5db6d5ca804..1bbaf52f368 100644 --- a/.github/workflows/ace-editor.lock.yml +++ b/.github/workflows/ace-editor.lock.yml @@ -573,6 +573,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/agent-job-health.lock.yml b/.github/workflows/agent-job-health.lock.yml index ea734c03b23..e0bd505d47c 100644 --- a/.github/workflows/agent-job-health.lock.yml +++ b/.github/workflows/agent-job-health.lock.yml @@ -683,6 +683,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/agent-performance-analyzer.lock.yml b/.github/workflows/agent-performance-analyzer.lock.yml index e6f168a1434..2eaddd0d233 100644 --- a/.github/workflows/agent-performance-analyzer.lock.yml +++ b/.github/workflows/agent-performance-analyzer.lock.yml @@ -743,6 +743,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/agent-persona-explorer.lock.yml b/.github/workflows/agent-persona-explorer.lock.yml index 73916caabea..a18cd066afb 100644 --- a/.github/workflows/agent-persona-explorer.lock.yml +++ b/.github/workflows/agent-persona-explorer.lock.yml @@ -667,6 +667,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/agentic-token-audit.lock.yml b/.github/workflows/agentic-token-audit.lock.yml index 172187cf416..425da210ab9 100644 --- a/.github/workflows/agentic-token-audit.lock.yml +++ b/.github/workflows/agentic-token-audit.lock.yml @@ -646,6 +646,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/agentic-token-optimizer.lock.yml b/.github/workflows/agentic-token-optimizer.lock.yml index 4e3b066d0fb..5e341f6bdcd 100644 --- a/.github/workflows/agentic-token-optimizer.lock.yml +++ b/.github/workflows/agentic-token-optimizer.lock.yml @@ -571,6 +571,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/agentic-token-trend-audit.lock.yml b/.github/workflows/agentic-token-trend-audit.lock.yml index ec154bb6cc1..62a2f5661db 100644 --- a/.github/workflows/agentic-token-trend-audit.lock.yml +++ b/.github/workflows/agentic-token-trend-audit.lock.yml @@ -625,6 +625,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/architecture-guardian.lock.yml b/.github/workflows/architecture-guardian.lock.yml index d48b6c05b75..df787be342e 100644 --- a/.github/workflows/architecture-guardian.lock.yml +++ b/.github/workflows/architecture-guardian.lock.yml @@ -567,6 +567,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/aw-failure-investigator.lock.yml b/.github/workflows/aw-failure-investigator.lock.yml index b365e5d8548..21a51db3925 100644 --- a/.github/workflows/aw-failure-investigator.lock.yml +++ b/.github/workflows/aw-failure-investigator.lock.yml @@ -675,6 +675,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/bot-detection.lock.yml b/.github/workflows/bot-detection.lock.yml index f15aacf8531..ee420c0aa85 100644 --- a/.github/workflows/bot-detection.lock.yml +++ b/.github/workflows/bot-detection.lock.yml @@ -573,6 +573,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/breaking-change-checker.lock.yml b/.github/workflows/breaking-change-checker.lock.yml index 854831c8814..e02a5375818 100644 --- a/.github/workflows/breaking-change-checker.lock.yml +++ b/.github/workflows/breaking-change-checker.lock.yml @@ -592,6 +592,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/ci-doctor.lock.yml b/.github/workflows/ci-doctor.lock.yml index 4d3b0968964..f8f05f8c5fd 100644 --- a/.github/workflows/ci-doctor.lock.yml +++ b/.github/workflows/ci-doctor.lock.yml @@ -722,6 +722,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/cli-consistency-checker.lock.yml b/.github/workflows/cli-consistency-checker.lock.yml index d152eab80cb..55f1830e2cb 100644 --- a/.github/workflows/cli-consistency-checker.lock.yml +++ b/.github/workflows/cli-consistency-checker.lock.yml @@ -555,6 +555,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/cli-version-checker.lock.yml b/.github/workflows/cli-version-checker.lock.yml index 0149792393b..ff94fca8316 100644 --- a/.github/workflows/cli-version-checker.lock.yml +++ b/.github/workflows/cli-version-checker.lock.yml @@ -591,6 +591,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/codex-github-remote-mcp-test.lock.yml b/.github/workflows/codex-github-remote-mcp-test.lock.yml index 3e570b4f1ee..5fc4f4e9138 100644 --- a/.github/workflows/codex-github-remote-mcp-test.lock.yml +++ b/.github/workflows/codex-github-remote-mcp-test.lock.yml @@ -537,6 +537,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/contribution-check.lock.yml b/.github/workflows/contribution-check.lock.yml index d12785178fa..5870f2391f9 100644 --- a/.github/workflows/contribution-check.lock.yml +++ b/.github/workflows/contribution-check.lock.yml @@ -706,6 +706,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/copilot-centralization-drilldown.lock.yml b/.github/workflows/copilot-centralization-drilldown.lock.yml index ea238501378..b03502f4a1f 100644 --- a/.github/workflows/copilot-centralization-drilldown.lock.yml +++ b/.github/workflows/copilot-centralization-drilldown.lock.yml @@ -541,6 +541,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/copilot-centralization-optimizer.lock.yml b/.github/workflows/copilot-centralization-optimizer.lock.yml index 621bae3024d..b842f6b9ccf 100644 --- a/.github/workflows/copilot-centralization-optimizer.lock.yml +++ b/.github/workflows/copilot-centralization-optimizer.lock.yml @@ -575,6 +575,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/copilot-cli-deep-research.lock.yml b/.github/workflows/copilot-cli-deep-research.lock.yml index f00c9ade4ee..26dc763fb52 100644 --- a/.github/workflows/copilot-cli-deep-research.lock.yml +++ b/.github/workflows/copilot-cli-deep-research.lock.yml @@ -564,6 +564,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/copilot-opt.lock.yml b/.github/workflows/copilot-opt.lock.yml index 69538390760..fc5bed66179 100644 --- a/.github/workflows/copilot-opt.lock.yml +++ b/.github/workflows/copilot-opt.lock.yml @@ -596,6 +596,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-action-setup-security-audit.lock.yml b/.github/workflows/daily-action-setup-security-audit.lock.yml index 1a3a8620fc2..c57621d84d7 100644 --- a/.github/workflows/daily-action-setup-security-audit.lock.yml +++ b/.github/workflows/daily-action-setup-security-audit.lock.yml @@ -594,6 +594,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-agentrx-trace-optimizer.lock.yml b/.github/workflows/daily-agentrx-trace-optimizer.lock.yml index 544c82c7c06..d59f26eb856 100644 --- a/.github/workflows/daily-agentrx-trace-optimizer.lock.yml +++ b/.github/workflows/daily-agentrx-trace-optimizer.lock.yml @@ -746,6 +746,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-ambient-context-optimizer.lock.yml b/.github/workflows/daily-ambient-context-optimizer.lock.yml index 9df2054e327..06209eb8fd0 100644 --- a/.github/workflows/daily-ambient-context-optimizer.lock.yml +++ b/.github/workflows/daily-ambient-context-optimizer.lock.yml @@ -657,6 +657,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-architecture-diagram.lock.yml b/.github/workflows/daily-architecture-diagram.lock.yml index 26893b41d96..96c6c74e18c 100644 --- a/.github/workflows/daily-architecture-diagram.lock.yml +++ b/.github/workflows/daily-architecture-diagram.lock.yml @@ -641,6 +641,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-aw-cross-repo-compile-check.lock.yml b/.github/workflows/daily-aw-cross-repo-compile-check.lock.yml index adaf986a3e7..df3baf0502a 100644 --- a/.github/workflows/daily-aw-cross-repo-compile-check.lock.yml +++ b/.github/workflows/daily-aw-cross-repo-compile-check.lock.yml @@ -604,6 +604,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-awf-spec-compiler-surfacing.lock.yml b/.github/workflows/daily-awf-spec-compiler-surfacing.lock.yml index 253841adae5..20c2a3e96c2 100644 --- a/.github/workflows/daily-awf-spec-compiler-surfacing.lock.yml +++ b/.github/workflows/daily-awf-spec-compiler-surfacing.lock.yml @@ -587,6 +587,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-byok-ollama-test.lock.yml b/.github/workflows/daily-byok-ollama-test.lock.yml index 4ffd4187c2f..77e77395b2d 100644 --- a/.github/workflows/daily-byok-ollama-test.lock.yml +++ b/.github/workflows/daily-byok-ollama-test.lock.yml @@ -584,6 +584,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-cache-strategy-analyzer.lock.yml b/.github/workflows/daily-cache-strategy-analyzer.lock.yml index f73282992d7..9634c3d5ab7 100644 --- a/.github/workflows/daily-cache-strategy-analyzer.lock.yml +++ b/.github/workflows/daily-cache-strategy-analyzer.lock.yml @@ -757,6 +757,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-cli-performance.lock.yml b/.github/workflows/daily-cli-performance.lock.yml index 1f6745bdd40..771c76a1377 100644 --- a/.github/workflows/daily-cli-performance.lock.yml +++ b/.github/workflows/daily-cli-performance.lock.yml @@ -701,6 +701,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-cli-tools-tester.lock.yml b/.github/workflows/daily-cli-tools-tester.lock.yml index 7a18025142c..5b44b03e15a 100644 --- a/.github/workflows/daily-cli-tools-tester.lock.yml +++ b/.github/workflows/daily-cli-tools-tester.lock.yml @@ -647,6 +647,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-community-attribution.lock.yml b/.github/workflows/daily-community-attribution.lock.yml index fd7879f119a..00f733f6691 100644 --- a/.github/workflows/daily-community-attribution.lock.yml +++ b/.github/workflows/daily-community-attribution.lock.yml @@ -658,6 +658,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-credit-limit-test.lock.yml b/.github/workflows/daily-credit-limit-test.lock.yml index 28b6cdbad4c..1c491460dd2 100644 --- a/.github/workflows/daily-credit-limit-test.lock.yml +++ b/.github/workflows/daily-credit-limit-test.lock.yml @@ -529,6 +529,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-doc-healer.lock.yml b/.github/workflows/daily-doc-healer.lock.yml index 254d42d29c6..13ac376759f 100644 --- a/.github/workflows/daily-doc-healer.lock.yml +++ b/.github/workflows/daily-doc-healer.lock.yml @@ -676,6 +676,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-evals-report.lock.yml b/.github/workflows/daily-evals-report.lock.yml index 3689bd58d2f..5ba247c2f37 100644 --- a/.github/workflows/daily-evals-report.lock.yml +++ b/.github/workflows/daily-evals-report.lock.yml @@ -686,6 +686,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-file-diet.lock.yml b/.github/workflows/daily-file-diet.lock.yml index 15dc90edca5..dc76ef8f86a 100644 --- a/.github/workflows/daily-file-diet.lock.yml +++ b/.github/workflows/daily-file-diet.lock.yml @@ -592,6 +592,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-formal-spec-verifier.lock.yml b/.github/workflows/daily-formal-spec-verifier.lock.yml index 976e5fd1738..e47f7d54e75 100644 --- a/.github/workflows/daily-formal-spec-verifier.lock.yml +++ b/.github/workflows/daily-formal-spec-verifier.lock.yml @@ -593,6 +593,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-function-namer.lock.yml b/.github/workflows/daily-function-namer.lock.yml index e9007355877..62de00e2ab9 100644 --- a/.github/workflows/daily-function-namer.lock.yml +++ b/.github/workflows/daily-function-namer.lock.yml @@ -605,6 +605,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-geo-optimizer.lock.yml b/.github/workflows/daily-geo-optimizer.lock.yml index c315a066062..f91e8135e86 100644 --- a/.github/workflows/daily-geo-optimizer.lock.yml +++ b/.github/workflows/daily-geo-optimizer.lock.yml @@ -583,6 +583,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-github-docs-seo-optimizer.lock.yml b/.github/workflows/daily-github-docs-seo-optimizer.lock.yml index 6cf4cce41d9..80af2e263cc 100644 --- a/.github/workflows/daily-github-docs-seo-optimizer.lock.yml +++ b/.github/workflows/daily-github-docs-seo-optimizer.lock.yml @@ -499,6 +499,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-graft-intelligence.lock.yml b/.github/workflows/daily-graft-intelligence.lock.yml index d65f46ab94d..1bdfd797b86 100644 --- a/.github/workflows/daily-graft-intelligence.lock.yml +++ b/.github/workflows/daily-graft-intelligence.lock.yml @@ -544,6 +544,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-hippo-learn.lock.yml b/.github/workflows/daily-hippo-learn.lock.yml index aca4cc6106d..a8f4935f33a 100644 --- a/.github/workflows/daily-hippo-learn.lock.yml +++ b/.github/workflows/daily-hippo-learn.lock.yml @@ -595,6 +595,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-max-ai-credits-test.lock.yml b/.github/workflows/daily-max-ai-credits-test.lock.yml index a0b7023b1a9..7375b1ffed7 100644 --- a/.github/workflows/daily-max-ai-credits-test.lock.yml +++ b/.github/workflows/daily-max-ai-credits-test.lock.yml @@ -460,6 +460,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-mcp-concurrency-analysis.lock.yml b/.github/workflows/daily-mcp-concurrency-analysis.lock.yml index 5b31ce8beae..d241efbd110 100644 --- a/.github/workflows/daily-mcp-concurrency-analysis.lock.yml +++ b/.github/workflows/daily-mcp-concurrency-analysis.lock.yml @@ -615,6 +615,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-model-inventory.lock.yml b/.github/workflows/daily-model-inventory.lock.yml index 3c1e5e1b557..445fea85dce 100644 --- a/.github/workflows/daily-model-inventory.lock.yml +++ b/.github/workflows/daily-model-inventory.lock.yml @@ -571,6 +571,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-model-resolution.lock.yml b/.github/workflows/daily-model-resolution.lock.yml index 497243e14a8..c34c788ac0a 100644 --- a/.github/workflows/daily-model-resolution.lock.yml +++ b/.github/workflows/daily-model-resolution.lock.yml @@ -612,6 +612,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-multi-device-docs-tester.lock.yml b/.github/workflows/daily-multi-device-docs-tester.lock.yml index bb0b55a6eb3..52e5280395e 100644 --- a/.github/workflows/daily-multi-device-docs-tester.lock.yml +++ b/.github/workflows/daily-multi-device-docs-tester.lock.yml @@ -627,6 +627,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-pr-review-cursor.lock.yml b/.github/workflows/daily-pr-review-cursor.lock.yml index 258f38ca80d..d09997d13d1 100644 --- a/.github/workflows/daily-pr-review-cursor.lock.yml +++ b/.github/workflows/daily-pr-review-cursor.lock.yml @@ -543,6 +543,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-regression-audit-kiro.lock.yml b/.github/workflows/daily-regression-audit-kiro.lock.yml index b163ef13ce8..e154ac93473 100644 --- a/.github/workflows/daily-regression-audit-kiro.lock.yml +++ b/.github/workflows/daily-regression-audit-kiro.lock.yml @@ -544,6 +544,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-reliability-review.lock.yml b/.github/workflows/daily-reliability-review.lock.yml index 208d0a91e8c..7dcc35c1e83 100644 --- a/.github/workflows/daily-reliability-review.lock.yml +++ b/.github/workflows/daily-reliability-review.lock.yml @@ -542,6 +542,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-safe-output-optimizer.lock.yml b/.github/workflows/daily-safe-output-optimizer.lock.yml index 0d699a04eaf..3e4833b49b5 100644 --- a/.github/workflows/daily-safe-output-optimizer.lock.yml +++ b/.github/workflows/daily-safe-output-optimizer.lock.yml @@ -730,6 +730,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-safe-outputs-conformance.lock.yml b/.github/workflows/daily-safe-outputs-conformance.lock.yml index bbb7a76d1f3..9b7c831ce12 100644 --- a/.github/workflows/daily-safe-outputs-conformance.lock.yml +++ b/.github/workflows/daily-safe-outputs-conformance.lock.yml @@ -575,6 +575,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-safeoutputs-git-simulator.lock.yml b/.github/workflows/daily-safeoutputs-git-simulator.lock.yml index 3e04e835de8..5695f19052f 100644 --- a/.github/workflows/daily-safeoutputs-git-simulator.lock.yml +++ b/.github/workflows/daily-safeoutputs-git-simulator.lock.yml @@ -556,6 +556,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-schema-audit-cursor.lock.yml b/.github/workflows/daily-schema-audit-cursor.lock.yml index 243a6636c56..84c673890a9 100644 --- a/.github/workflows/daily-schema-audit-cursor.lock.yml +++ b/.github/workflows/daily-schema-audit-cursor.lock.yml @@ -542,6 +542,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-security-red-team.lock.yml b/.github/workflows/daily-security-red-team.lock.yml index 708babcd4cf..ab934630491 100644 --- a/.github/workflows/daily-security-red-team.lock.yml +++ b/.github/workflows/daily-security-red-team.lock.yml @@ -609,6 +609,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-spdd-spec-planner.lock.yml b/.github/workflows/daily-spdd-spec-planner.lock.yml index d4b76d826bb..1fb91d70341 100644 --- a/.github/workflows/daily-spdd-spec-planner.lock.yml +++ b/.github/workflows/daily-spdd-spec-planner.lock.yml @@ -570,6 +570,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-spec-coverage-kiro.lock.yml b/.github/workflows/daily-spec-coverage-kiro.lock.yml index 9d1302ce466..27d50e4d1bc 100644 --- a/.github/workflows/daily-spec-coverage-kiro.lock.yml +++ b/.github/workflows/daily-spec-coverage-kiro.lock.yml @@ -543,6 +543,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-spending-forecast.lock.yml b/.github/workflows/daily-spending-forecast.lock.yml index 03e1312e1e4..2f5d423abe1 100644 --- a/.github/workflows/daily-spending-forecast.lock.yml +++ b/.github/workflows/daily-spending-forecast.lock.yml @@ -656,6 +656,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-squid-image-scan.lock.yml b/.github/workflows/daily-squid-image-scan.lock.yml index 2a974cbd681..e4837b62bff 100644 --- a/.github/workflows/daily-squid-image-scan.lock.yml +++ b/.github/workflows/daily-squid-image-scan.lock.yml @@ -612,6 +612,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-syntax-error-quality.lock.yml b/.github/workflows/daily-syntax-error-quality.lock.yml index 0ce2c954cde..7ea61ab2e6b 100644 --- a/.github/workflows/daily-syntax-error-quality.lock.yml +++ b/.github/workflows/daily-syntax-error-quality.lock.yml @@ -551,6 +551,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-team-status.lock.yml b/.github/workflows/daily-team-status.lock.yml index ca2c896b4c1..9a6bf18e9ee 100644 --- a/.github/workflows/daily-team-status.lock.yml +++ b/.github/workflows/daily-team-status.lock.yml @@ -533,6 +533,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-testify-uber-super-expert.lock.yml b/.github/workflows/daily-testify-uber-super-expert.lock.yml index d07d43e6e41..e2215afafa7 100644 --- a/.github/workflows/daily-testify-uber-super-expert.lock.yml +++ b/.github/workflows/daily-testify-uber-super-expert.lock.yml @@ -588,6 +588,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-token-consumption-report.lock.yml b/.github/workflows/daily-token-consumption-report.lock.yml index d65ff783126..e687ebb9290 100644 --- a/.github/workflows/daily-token-consumption-report.lock.yml +++ b/.github/workflows/daily-token-consumption-report.lock.yml @@ -561,6 +561,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-vulnhunter-scan.lock.yml b/.github/workflows/daily-vulnhunter-scan.lock.yml index b0cbf8e91ab..4a3f461bd74 100644 --- a/.github/workflows/daily-vulnhunter-scan.lock.yml +++ b/.github/workflows/daily-vulnhunter-scan.lock.yml @@ -566,6 +566,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/daily-windows-terminal-integration-builder.lock.yml b/.github/workflows/daily-windows-terminal-integration-builder.lock.yml index 4fe112ec81b..6aaf61ff250 100644 --- a/.github/workflows/daily-windows-terminal-integration-builder.lock.yml +++ b/.github/workflows/daily-windows-terminal-integration-builder.lock.yml @@ -524,6 +524,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/deep-report.lock.yml b/.github/workflows/deep-report.lock.yml index 6c80d62d7ca..1c39acd4759 100644 --- a/.github/workflows/deep-report.lock.yml +++ b/.github/workflows/deep-report.lock.yml @@ -1000,6 +1000,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/deepsec-security-scan.lock.yml b/.github/workflows/deepsec-security-scan.lock.yml index c6355c0bc3a..dd4a6e0d63d 100644 --- a/.github/workflows/deepsec-security-scan.lock.yml +++ b/.github/workflows/deepsec-security-scan.lock.yml @@ -601,6 +601,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/delight.lock.yml b/.github/workflows/delight.lock.yml index 693f77a7a80..a08eb647fa9 100644 --- a/.github/workflows/delight.lock.yml +++ b/.github/workflows/delight.lock.yml @@ -596,6 +596,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/dependabot-go-checker.lock.yml b/.github/workflows/dependabot-go-checker.lock.yml index ef44ddeb119..7478f23b35b 100644 --- a/.github/workflows/dependabot-go-checker.lock.yml +++ b/.github/workflows/dependabot-go-checker.lock.yml @@ -636,6 +636,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/deployment-incident-monitor.lock.yml b/.github/workflows/deployment-incident-monitor.lock.yml index 0945e16c6a2..5666ae291b8 100644 --- a/.github/workflows/deployment-incident-monitor.lock.yml +++ b/.github/workflows/deployment-incident-monitor.lock.yml @@ -558,6 +558,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/designer-drift-audit.lock.yml b/.github/workflows/designer-drift-audit.lock.yml index 79e121df143..a190c64b01a 100644 --- a/.github/workflows/designer-drift-audit.lock.yml +++ b/.github/workflows/designer-drift-audit.lock.yml @@ -524,6 +524,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/dev.lock.yml b/.github/workflows/dev.lock.yml index 17c24029683..0f53d5938fd 100644 --- a/.github/workflows/dev.lock.yml +++ b/.github/workflows/dev.lock.yml @@ -604,6 +604,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/duplicate-code-detector.lock.yml b/.github/workflows/duplicate-code-detector.lock.yml index 588e8d96fb2..3090ed97949 100644 --- a/.github/workflows/duplicate-code-detector.lock.yml +++ b/.github/workflows/duplicate-code-detector.lock.yml @@ -583,6 +583,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/eslint-monster.lock.yml b/.github/workflows/eslint-monster.lock.yml index d735ed9f79c..0ede886cd5d 100644 --- a/.github/workflows/eslint-monster.lock.yml +++ b/.github/workflows/eslint-monster.lock.yml @@ -656,6 +656,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/eslint-refiner.lock.yml b/.github/workflows/eslint-refiner.lock.yml index 4599c9a0fc3..f9723d51554 100644 --- a/.github/workflows/eslint-refiner.lock.yml +++ b/.github/workflows/eslint-refiner.lock.yml @@ -597,6 +597,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/example-failure-category-filter.lock.yml b/.github/workflows/example-failure-category-filter.lock.yml index 4d1b13ef0ed..300e34bcda1 100644 --- a/.github/workflows/example-failure-category-filter.lock.yml +++ b/.github/workflows/example-failure-category-filter.lock.yml @@ -512,6 +512,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/example-permissions-warning.lock.yml b/.github/workflows/example-permissions-warning.lock.yml index e42e80446c8..2b97fd974ef 100644 --- a/.github/workflows/example-permissions-warning.lock.yml +++ b/.github/workflows/example-permissions-warning.lock.yml @@ -536,6 +536,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/firewall.lock.yml b/.github/workflows/firewall.lock.yml index 2858a8a6ae0..5001ad09b68 100644 --- a/.github/workflows/firewall.lock.yml +++ b/.github/workflows/firewall.lock.yml @@ -535,6 +535,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/go-fan.lock.yml b/.github/workflows/go-fan.lock.yml index 109fa9083c6..9fc5c5e47e1 100644 --- a/.github/workflows/go-fan.lock.yml +++ b/.github/workflows/go-fan.lock.yml @@ -591,6 +591,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/go-pattern-detector.lock.yml b/.github/workflows/go-pattern-detector.lock.yml index 5578e3a1bc3..23c0425e66b 100644 --- a/.github/workflows/go-pattern-detector.lock.yml +++ b/.github/workflows/go-pattern-detector.lock.yml @@ -559,6 +559,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/gpclean.lock.yml b/.github/workflows/gpclean.lock.yml index 99740e53ec7..fa047ce6b71 100644 --- a/.github/workflows/gpclean.lock.yml +++ b/.github/workflows/gpclean.lock.yml @@ -615,6 +615,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/hippo-embed.lock.yml b/.github/workflows/hippo-embed.lock.yml index 6de7f905d1c..6c1382064af 100644 --- a/.github/workflows/hippo-embed.lock.yml +++ b/.github/workflows/hippo-embed.lock.yml @@ -565,6 +565,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/issue-arborist.lock.yml b/.github/workflows/issue-arborist.lock.yml index b8ce5612690..23604ab0853 100644 --- a/.github/workflows/issue-arborist.lock.yml +++ b/.github/workflows/issue-arborist.lock.yml @@ -679,6 +679,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/lint-monster.lock.yml b/.github/workflows/lint-monster.lock.yml index 17313f71b12..7a71789c352 100644 --- a/.github/workflows/lint-monster.lock.yml +++ b/.github/workflows/lint-monster.lock.yml @@ -650,6 +650,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/metrics-collector.lock.yml b/.github/workflows/metrics-collector.lock.yml index d01f3e3f0fe..07ecf62bbd2 100644 --- a/.github/workflows/metrics-collector.lock.yml +++ b/.github/workflows/metrics-collector.lock.yml @@ -635,6 +635,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/notion-issue-summary.lock.yml b/.github/workflows/notion-issue-summary.lock.yml index 8d66763cdee..7c4893a982a 100644 --- a/.github/workflows/notion-issue-summary.lock.yml +++ b/.github/workflows/notion-issue-summary.lock.yml @@ -552,6 +552,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/objective-impact-report.lock.yml b/.github/workflows/objective-impact-report.lock.yml index 47f1b82a2ef..572b2ce7d69 100644 --- a/.github/workflows/objective-impact-report.lock.yml +++ b/.github/workflows/objective-impact-report.lock.yml @@ -595,6 +595,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/outcome-collector.lock.yml b/.github/workflows/outcome-collector.lock.yml index 35fc9f17a87..e290cf02773 100644 --- a/.github/workflows/outcome-collector.lock.yml +++ b/.github/workflows/outcome-collector.lock.yml @@ -579,6 +579,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/plan.lock.yml b/.github/workflows/plan.lock.yml index a8f1108205e..0f411bb4644 100644 --- a/.github/workflows/plan.lock.yml +++ b/.github/workflows/plan.lock.yml @@ -681,6 +681,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/poem-bot.lock.yml b/.github/workflows/poem-bot.lock.yml index 78689c7ed07..58abe5c6649 100644 --- a/.github/workflows/poem-bot.lock.yml +++ b/.github/workflows/poem-bot.lock.yml @@ -752,6 +752,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/pr-sous-chef.lock.yml b/.github/workflows/pr-sous-chef.lock.yml index bdca1393da5..93643b1af62 100644 --- a/.github/workflows/pr-sous-chef.lock.yml +++ b/.github/workflows/pr-sous-chef.lock.yml @@ -914,6 +914,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/pr-triage-agent.lock.yml b/.github/workflows/pr-triage-agent.lock.yml index 63d0c0b9051..5c725eeec50 100644 --- a/.github/workflows/pr-triage-agent.lock.yml +++ b/.github/workflows/pr-triage-agent.lock.yml @@ -874,6 +874,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/refactoring-cadence.lock.yml b/.github/workflows/refactoring-cadence.lock.yml index 71358e2c5ea..6e2840b4e35 100644 --- a/.github/workflows/refactoring-cadence.lock.yml +++ b/.github/workflows/refactoring-cadence.lock.yml @@ -570,6 +570,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/ruflo-backed-task.lock.yml b/.github/workflows/ruflo-backed-task.lock.yml index 5ab844d170c..e0579484fdf 100644 --- a/.github/workflows/ruflo-backed-task.lock.yml +++ b/.github/workflows/ruflo-backed-task.lock.yml @@ -636,6 +636,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/security-compliance.lock.yml b/.github/workflows/security-compliance.lock.yml index e67f8402b37..0b8780c65b8 100644 --- a/.github/workflows/security-compliance.lock.yml +++ b/.github/workflows/security-compliance.lock.yml @@ -581,6 +581,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/semantic-function-refactor.lock.yml b/.github/workflows/semantic-function-refactor.lock.yml index 2310a5b49a5..884a7ddba8d 100644 --- a/.github/workflows/semantic-function-refactor.lock.yml +++ b/.github/workflows/semantic-function-refactor.lock.yml @@ -616,6 +616,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/sergo.lock.yml b/.github/workflows/sergo.lock.yml index 1a3ea619b90..9014a9d57c0 100644 --- a/.github/workflows/sergo.lock.yml +++ b/.github/workflows/sergo.lock.yml @@ -614,6 +614,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/sighthound-security-scan.lock.yml b/.github/workflows/sighthound-security-scan.lock.yml index 877f7fa2f4b..73bcaf2c986 100644 --- a/.github/workflows/sighthound-security-scan.lock.yml +++ b/.github/workflows/sighthound-security-scan.lock.yml @@ -532,6 +532,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-aider.lock.yml b/.github/workflows/smoke-aider.lock.yml index 7709e5cd6a2..19d7de33a99 100644 --- a/.github/workflows/smoke-aider.lock.yml +++ b/.github/workflows/smoke-aider.lock.yml @@ -646,6 +646,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-ci.lock.yml b/.github/workflows/smoke-ci.lock.yml index a081bd3f1cd..f387236ae57 100644 --- a/.github/workflows/smoke-ci.lock.yml +++ b/.github/workflows/smoke-ci.lock.yml @@ -718,6 +718,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-claude.lock.yml b/.github/workflows/smoke-claude.lock.yml index 65040a2cd94..33cc6fe9e8d 100644 --- a/.github/workflows/smoke-claude.lock.yml +++ b/.github/workflows/smoke-claude.lock.yml @@ -964,6 +964,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-codex.lock.yml b/.github/workflows/smoke-codex.lock.yml index 4d8c64cd558..787d99498e1 100644 --- a/.github/workflows/smoke-codex.lock.yml +++ b/.github/workflows/smoke-codex.lock.yml @@ -810,6 +810,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-copilot-aoai-apikey.lock.yml b/.github/workflows/smoke-copilot-aoai-apikey.lock.yml index f967dd24f1e..fa58d6422ff 100644 --- a/.github/workflows/smoke-copilot-aoai-apikey.lock.yml +++ b/.github/workflows/smoke-copilot-aoai-apikey.lock.yml @@ -1029,6 +1029,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-copilot-aoai-entra.lock.yml b/.github/workflows/smoke-copilot-aoai-entra.lock.yml index f8fdcf645d7..7b00a154121 100644 --- a/.github/workflows/smoke-copilot-aoai-entra.lock.yml +++ b/.github/workflows/smoke-copilot-aoai-entra.lock.yml @@ -1045,6 +1045,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-copilot-arm.lock.yml b/.github/workflows/smoke-copilot-arm.lock.yml index c758fba9718..76f887cd6cf 100644 --- a/.github/workflows/smoke-copilot-arm.lock.yml +++ b/.github/workflows/smoke-copilot-arm.lock.yml @@ -877,6 +877,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-copilot-mai.lock.yml b/.github/workflows/smoke-copilot-mai.lock.yml index 1282525a8fa..f4c437d486e 100644 --- a/.github/workflows/smoke-copilot-mai.lock.yml +++ b/.github/workflows/smoke-copilot-mai.lock.yml @@ -642,6 +642,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-copilot-sdk.lock.yml b/.github/workflows/smoke-copilot-sdk.lock.yml index f34dc29a13a..d4c2f1f3c5e 100644 --- a/.github/workflows/smoke-copilot-sdk.lock.yml +++ b/.github/workflows/smoke-copilot-sdk.lock.yml @@ -599,6 +599,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-copilot-small.lock.yml b/.github/workflows/smoke-copilot-small.lock.yml index 75fb9db05a0..6bb6b02ffee 100644 --- a/.github/workflows/smoke-copilot-small.lock.yml +++ b/.github/workflows/smoke-copilot-small.lock.yml @@ -597,6 +597,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-copilot-sub-agents.lock.yml b/.github/workflows/smoke-copilot-sub-agents.lock.yml index aad9aee5451..dd857be885b 100644 --- a/.github/workflows/smoke-copilot-sub-agents.lock.yml +++ b/.github/workflows/smoke-copilot-sub-agents.lock.yml @@ -561,6 +561,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-copilot.lock.yml b/.github/workflows/smoke-copilot.lock.yml index 6c9d266a58d..1d6fefe6aa6 100644 --- a/.github/workflows/smoke-copilot.lock.yml +++ b/.github/workflows/smoke-copilot.lock.yml @@ -1049,6 +1049,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-create-cross-repo-pr.lock.yml b/.github/workflows/smoke-create-cross-repo-pr.lock.yml index e61a225caa5..ff83eba1453 100644 --- a/.github/workflows/smoke-create-cross-repo-pr.lock.yml +++ b/.github/workflows/smoke-create-cross-repo-pr.lock.yml @@ -666,6 +666,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-crush.lock.yml b/.github/workflows/smoke-crush.lock.yml index 71cf1fbe375..bea886066c6 100644 --- a/.github/workflows/smoke-crush.lock.yml +++ b/.github/workflows/smoke-crush.lock.yml @@ -664,6 +664,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-cursor.lock.yml b/.github/workflows/smoke-cursor.lock.yml index e5cbf061115..db10f92b342 100644 --- a/.github/workflows/smoke-cursor.lock.yml +++ b/.github/workflows/smoke-cursor.lock.yml @@ -663,6 +663,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-deepseek-harness.lock.yml b/.github/workflows/smoke-deepseek-harness.lock.yml index 6724e4f2a1f..8a7703965b7 100644 --- a/.github/workflows/smoke-deepseek-harness.lock.yml +++ b/.github/workflows/smoke-deepseek-harness.lock.yml @@ -663,6 +663,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-gemini.lock.yml b/.github/workflows/smoke-gemini.lock.yml index aeaf6d2186c..2a72cb546f7 100644 --- a/.github/workflows/smoke-gemini.lock.yml +++ b/.github/workflows/smoke-gemini.lock.yml @@ -738,6 +738,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-goose.lock.yml b/.github/workflows/smoke-goose.lock.yml index b5da9d9c022..0b07274b469 100644 --- a/.github/workflows/smoke-goose.lock.yml +++ b/.github/workflows/smoke-goose.lock.yml @@ -658,6 +658,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-kiro.lock.yml b/.github/workflows/smoke-kiro.lock.yml index 1847e8bf28b..54dd10e6b10 100644 --- a/.github/workflows/smoke-kiro.lock.yml +++ b/.github/workflows/smoke-kiro.lock.yml @@ -663,6 +663,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-opencode.lock.yml b/.github/workflows/smoke-opencode.lock.yml index 68d9a3e801d..b033bc409ee 100644 --- a/.github/workflows/smoke-opencode.lock.yml +++ b/.github/workflows/smoke-opencode.lock.yml @@ -671,6 +671,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-otel-backends.lock.yml b/.github/workflows/smoke-otel-backends.lock.yml index d8daa6a2bd1..b6f19aabb6c 100644 --- a/.github/workflows/smoke-otel-backends.lock.yml +++ b/.github/workflows/smoke-otel-backends.lock.yml @@ -641,6 +641,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-pi.lock.yml b/.github/workflows/smoke-pi.lock.yml index 0417641ebba..2013ba933b5 100644 --- a/.github/workflows/smoke-pi.lock.yml +++ b/.github/workflows/smoke-pi.lock.yml @@ -694,6 +694,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-project.lock.yml b/.github/workflows/smoke-project.lock.yml index db9239b7a2c..c256c808eb9 100644 --- a/.github/workflows/smoke-project.lock.yml +++ b/.github/workflows/smoke-project.lock.yml @@ -709,6 +709,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-pydantic.lock.yml b/.github/workflows/smoke-pydantic.lock.yml index 75ec53bd27c..493ece4edaa 100644 --- a/.github/workflows/smoke-pydantic.lock.yml +++ b/.github/workflows/smoke-pydantic.lock.yml @@ -646,6 +646,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-temporary-id.lock.yml b/.github/workflows/smoke-temporary-id.lock.yml index ff221606939..26264706d1f 100644 --- a/.github/workflows/smoke-temporary-id.lock.yml +++ b/.github/workflows/smoke-temporary-id.lock.yml @@ -685,6 +685,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-update-cross-repo-pr.lock.yml b/.github/workflows/smoke-update-cross-repo-pr.lock.yml index ab7adb8724e..830e502c2de 100644 --- a/.github/workflows/smoke-update-cross-repo-pr.lock.yml +++ b/.github/workflows/smoke-update-cross-repo-pr.lock.yml @@ -697,6 +697,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/smoke-workflow-call-with-inputs.lock.yml b/.github/workflows/smoke-workflow-call-with-inputs.lock.yml index d4d294caf47..32ba3cfedeb 100644 --- a/.github/workflows/smoke-workflow-call-with-inputs.lock.yml +++ b/.github/workflows/smoke-workflow-call-with-inputs.lock.yml @@ -619,6 +619,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/spec-librarian.lock.yml b/.github/workflows/spec-librarian.lock.yml index d84dfa2f864..2d4075f7bba 100644 --- a/.github/workflows/spec-librarian.lock.yml +++ b/.github/workflows/spec-librarian.lock.yml @@ -563,6 +563,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/squad-game-planner.lock.yml b/.github/workflows/squad-game-planner.lock.yml index 06180652e86..f4becd2f71c 100644 --- a/.github/workflows/squad-game-planner.lock.yml +++ b/.github/workflows/squad-game-planner.lock.yml @@ -588,6 +588,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/squad-plan.lock.yml b/.github/workflows/squad-plan.lock.yml index 4a834cb1b5c..2fe6e5e74f8 100644 --- a/.github/workflows/squad-plan.lock.yml +++ b/.github/workflows/squad-plan.lock.yml @@ -639,6 +639,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/squad.lock.yml b/.github/workflows/squad.lock.yml index 2b95b480816..541b918163b 100644 --- a/.github/workflows/squad.lock.yml +++ b/.github/workflows/squad.lock.yml @@ -1088,6 +1088,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/stale-repo-identifier.lock.yml b/.github/workflows/stale-repo-identifier.lock.yml index 3625fbb1e76..1ef3e64f6a2 100644 --- a/.github/workflows/stale-repo-identifier.lock.yml +++ b/.github/workflows/stale-repo-identifier.lock.yml @@ -762,6 +762,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/static-analysis-report.lock.yml b/.github/workflows/static-analysis-report.lock.yml index b2e9377208b..9a75c6c52dc 100644 --- a/.github/workflows/static-analysis-report.lock.yml +++ b/.github/workflows/static-analysis-report.lock.yml @@ -705,6 +705,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/step-name-alignment.lock.yml b/.github/workflows/step-name-alignment.lock.yml index 9ee236baf20..615b1676091 100644 --- a/.github/workflows/step-name-alignment.lock.yml +++ b/.github/workflows/step-name-alignment.lock.yml @@ -573,6 +573,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/super-linter.lock.yml b/.github/workflows/super-linter.lock.yml index 953aded3067..773a79f5476 100644 --- a/.github/workflows/super-linter.lock.yml +++ b/.github/workflows/super-linter.lock.yml @@ -590,6 +590,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/uk-ai-operational-resilience.lock.yml b/.github/workflows/uk-ai-operational-resilience.lock.yml index a2e0849ab3f..056952dc403 100644 --- a/.github/workflows/uk-ai-operational-resilience.lock.yml +++ b/.github/workflows/uk-ai-operational-resilience.lock.yml @@ -588,6 +588,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/video-analyzer.lock.yml b/.github/workflows/video-analyzer.lock.yml index 5f0029b7a4b..9de041fe38e 100644 --- a/.github/workflows/video-analyzer.lock.yml +++ b/.github/workflows/video-analyzer.lock.yml @@ -561,6 +561,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/workflow-health-manager.lock.yml b/.github/workflows/workflow-health-manager.lock.yml index 2a61f6e5406..8cd2dbe64ee 100644 --- a/.github/workflows/workflow-health-manager.lock.yml +++ b/.github/workflows/workflow-health-manager.lock.yml @@ -617,6 +617,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/workflow-normalizer.lock.yml b/.github/workflows/workflow-normalizer.lock.yml index 6c70b04b457..5cd89aceb26 100644 --- a/.github/workflows/workflow-normalizer.lock.yml +++ b/.github/workflows/workflow-normalizer.lock.yml @@ -645,6 +645,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/.github/workflows/workflow-skill-extractor.lock.yml b/.github/workflows/workflow-skill-extractor.lock.yml index 274d1416a55..d4444d27b55 100644 --- a/.github/workflows/workflow-skill-extractor.lock.yml +++ b/.github/workflows/workflow-skill-extractor.lock.yml @@ -573,6 +573,7 @@ jobs: "create_issue": { "defaultMax": 1, "fields": { + "blocked_by": {}, "body": { "required": true, "type": "string", diff --git a/pkg/workflow/safe_outputs_validation_config.go b/pkg/workflow/safe_outputs_validation_config.go index 9d5fb7ee2dd..b36a0b978c8 100644 --- a/pkg/workflow/safe_outputs_validation_config.go +++ b/pkg/workflow/safe_outputs_validation_config.go @@ -62,11 +62,14 @@ var ValidationConfig = map[string]TypeValidationConfig{ "create_issue": { DefaultMax: 1, Fields: map[string]FieldValidation{ - "title": {Required: true, Type: "string", Sanitize: true, MaxLength: 128}, - "body": {Required: true, Type: "string", Sanitize: true, MaxLength: MaxBodyLength, MinLength: MinIssueBodyLength}, - "labels": {Type: "array", ItemType: "string", ItemSanitize: true, ItemMaxLength: 128}, - "fields": {Type: "array"}, - "parent": {IssueOrPRNumber: true}, + "title": {Required: true, Type: "string", Sanitize: true, MaxLength: 128}, + "body": {Required: true, Type: "string", Sanitize: true, MaxLength: MaxBodyLength, MinLength: MinIssueBodyLength}, + "labels": {Type: "array", ItemType: "string", ItemSanitize: true, ItemMaxLength: 128}, + "fields": {Type: "array"}, + "parent": {IssueOrPRNumber: true}, + // blocked_by accepts an issue number, temporary ID, owner/repo#number, issue URL, + // or an array of these; reference parsing is handled by the create_issue handler. + "blocked_by": {}, "temporary_id": {Type: "string"}, "repo": {Type: "string", MaxLength: 256}, // Optional: target repository in format "owner/repo" },