From bbb7f280f97ff0b2938b29d734af2621b2f10538 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:02:58 +0000 Subject: [PATCH 1/4] Initial plan From 736f746643fcc8ff59530e59040fde13c7a02b66 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:10:48 +0000 Subject: [PATCH 2/4] Initial plan: Phase-2 queue and governance hardening Co-authored-by: Prekzursil <54636077+Prekzursil@users.noreply.github.com> --- backend/.coverage | Bin 69632 -> 69632 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/backend/.coverage b/backend/.coverage index 19b43725a5c3a1ef7a8f12ef40bc1211f6a305a1..9c7d21711bc7bec57ae10589ae208b6422e09feb 100644 GIT binary patch literal 69632 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 Date: Fri, 20 Feb 2026 23:13:16 +0000 Subject: [PATCH 3/4] Phase-2: queue idempotency, label-sync trigger, agent profile normalization, PR template hardening Co-authored-by: Prekzursil <54636077+Prekzursil@users.noreply.github.com> --- .github/PULL_REQUEST_TEMPLATE.md | 2 ++ .github/agents/release-assistant.agent.md | 2 +- .github/workflows/agent-label-sync.yml | 1 + .github/workflows/agent-task-queue.yml | 17 +++++++++++------ .gitignore | 1 + AGENTS.md | 4 +++- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 827e736b..2cee1a07 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -25,3 +25,5 @@ - [ ] Change is minimal and task-focused - [ ] No unrelated refactors included - [ ] No secrets or private tokens added +- [ ] Labels applied match risk level (`risk:low`, `risk:medium`, or `risk:high`) +- [ ] `agent:ready` label NOT applied until task packet is complete and authorized diff --git a/.github/agents/release-assistant.agent.md b/.github/agents/release-assistant.agent.md index 12f875fa..08ef50e2 100644 --- a/.github/agents/release-assistant.agent.md +++ b/.github/agents/release-assistant.agent.md @@ -1,7 +1,7 @@ --- name: release-assistant description: Prepare release notes, artifact checks, and rollback-ready release packets. -tools: ['read', 'search', 'edit'] +tools: ["read", "search", "edit"] --- You are the Release Steward. diff --git a/.github/workflows/agent-label-sync.yml b/.github/workflows/agent-label-sync.yml index 290e09f0..ed63f0d5 100644 --- a/.github/workflows/agent-label-sync.yml +++ b/.github/workflows/agent-label-sync.yml @@ -5,6 +5,7 @@ on: push: paths: - '.github/workflows/agent-label-sync.yml' + - '.github/ISSUE_TEMPLATE/agent_task.yml' permissions: contents: read diff --git a/.github/workflows/agent-task-queue.yml b/.github/workflows/agent-task-queue.yml index 1c8b5227..fd277a48 100644 --- a/.github/workflows/agent-task-queue.yml +++ b/.github/workflows/agent-task-queue.yml @@ -46,6 +46,11 @@ jobs: c.body?.includes(`- #${issue_number}:`) ); + if (existingContract && hadInProgress) { + core.info("Idempotency guard: contract already posted and agent:in-progress already set; skipping duplicate enqueue."); + return; + } + let addedInProgress = false; let removedReady = false; @@ -69,11 +74,11 @@ jobs: name: "agent:ready", }); removedReady = true; - } catch (error) { - if (error.status === 404) { + } catch (removeError) { + if (removeError.status === 404) { core.info("agent:ready was already removed."); } else { - throw error; + throw removeError; } } } @@ -104,7 +109,7 @@ jobs: body: lines.join("\n"), }); } catch (error) { - core.warning(`Queue transition failed: ${error.message}`); + core.error(`Queue transition failed: ${error.message}`); if (addedInProgress && !hadInProgress) { try { @@ -115,7 +120,7 @@ jobs: name: "agent:in-progress", }); } catch (rollbackError) { - core.warning(`Rollback remove agent:in-progress failed: ${rollbackError.message}`); + core.error(`Rollback remove agent:in-progress failed: ${rollbackError.message}`); } } @@ -128,7 +133,7 @@ jobs: labels: ["agent:ready"], }); } catch (rollbackError) { - core.warning(`Rollback add agent:ready failed: ${rollbackError.message}`); + core.error(`Rollback add agent:ready failed: ${rollbackError.message}`); } } diff --git a/.gitignore b/.gitignore index f3614305..daccb61c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ build/ # IDE .idea/ +.coverage diff --git a/AGENTS.md b/AGENTS.md index 7de2d4ab..e32fa622 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -33,4 +33,6 @@ bash scripts/verify ## Queue Trigger Warning -Applying label `agent:ready` triggers the queue workflow immediately. +> **⚠ WARNING:** Applying label `agent:ready` triggers the queue workflow **immediately and irreversibly**. +> The workflow will transition the issue to `agent:in-progress` and post an execution contract comment. +> Only apply this label when the task packet is complete and implementation is authorized. From cf0b7569a1fa84b69f5b5a17764c5c4c404eeee4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:59:28 +0000 Subject: [PATCH 4/4] Fix idempotency guard to clean up agent:ready on re-apply to in-progress issues Co-authored-by: Prekzursil <54636077+Prekzursil@users.noreply.github.com> --- .github/workflows/agent-task-queue.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/agent-task-queue.yml b/.github/workflows/agent-task-queue.yml index fd277a48..20ce0ca2 100644 --- a/.github/workflows/agent-task-queue.yml +++ b/.github/workflows/agent-task-queue.yml @@ -48,6 +48,23 @@ jobs: if (existingContract && hadInProgress) { core.info("Idempotency guard: contract already posted and agent:in-progress already set; skipping duplicate enqueue."); + if (hadReady) { + try { + await github.rest.issues.removeLabel({ + owner, + repo, + issue_number, + name: "agent:ready", + }); + } catch (removeError) { + if (removeError.status === 404) { + core.info("agent:ready was already removed."); + } else { + core.error(`Idempotency cleanup failed to remove agent:ready: ${removeError.message}`); + throw removeError; + } + } + } return; }