Add external plugin quality gates and maintainer override flow (#1860)

* Add external plugin quality gates and override flow

Introduce a dedicated reusable quality-gates workflow for external plugin submissions and wire intake/rerun orchestration to consume its results. Add quality-aware intake state handling, including a submitter-fix blocker state and richer intake comments.

Also add a maintainer /mark-ready-for-review command workflow for explicit overrides, update related approval-label handling, and document the new external plugin review flow in CONTRIBUTING and AGENTS guidance.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix: use specific auth/network patterns in classifySmokeFailure

Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com>

* refactor: hoist INFRA_ERROR_PATTERNS to module level, fix timeout regex

Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com>

* fix: install Copilot CLI in external-plugin-quality-gates workflow

Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com>
This commit is contained in:
Aaron Powell
2026-05-28 15:50:13 +10:00
committed by GitHub
parent f98dcc1c1f
commit 47701d25f4
10 changed files with 933 additions and 49 deletions
+13 -3
View File
@@ -11,6 +11,10 @@ export const EXTERNAL_PLUGIN_INTAKE_LABELS = Object.freeze({
color: "0E8A16",
description: "Submission passed intake validation and is ready for maintainer review",
},
"requires-submitter-fixes": {
color: "D93F0B",
description: "Submission has quality-gate findings that submitter must fix before maintainer review",
},
approved: {
color: "1D76DB",
description: "Submission was approved by a maintainer",
@@ -25,6 +29,7 @@ const EXTERNAL_PLUGIN_INTAKE_SYNC_LABELS = Object.freeze([
"external-plugin",
"awaiting-review",
"ready-for-review",
"requires-submitter-fixes",
"rejected",
]);
@@ -138,9 +143,14 @@ export async function applyExternalPluginIntakeEvaluation({
issueNumber,
evaluation,
}) {
const desiredLabels = evaluation.valid
? new Set(["external-plugin", "ready-for-review"])
: new Set(["external-plugin", "rejected"]);
const state = evaluation.intakeState ?? (evaluation.valid ? "ready-for-review" : "rejected");
const desiredLabelsByState = {
"ready-for-review": new Set(["external-plugin", "ready-for-review"]),
"requires-submitter-fixes": new Set(["external-plugin", "requires-submitter-fixes"]),
"awaiting-review": new Set(["external-plugin", "awaiting-review"]),
rejected: new Set(["external-plugin", "rejected"]),
};
const desiredLabels = desiredLabelsByState[state] ?? desiredLabelsByState.rejected;
await syncExternalPluginIntakeLabels({
github,