Skip to content

Commit c92ebd6

Browse files
authored
fix(ci): preserve Barnacle proof labels (#83735)
* fix(ci): preserve sufficient proof override * fix(ci): keep sufficient proof on label churn
1 parent 1fb0906 commit c92ebd6

2 files changed

Lines changed: 56 additions & 4 deletions

File tree

scripts/github/barnacle-auto-response.mjs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -798,10 +798,16 @@ function shouldRemoveProofSufficientLabel(context, proofEvaluation, hasExactHead
798798
if (hasExactHeadClawSweeperProof) {
799799
return false;
800800
}
801+
if (proofEvaluation.status === "override") {
802+
return false;
803+
}
804+
if (!["edited", "synchronize"].includes(context.payload.action)) {
805+
return false;
806+
}
801807
if (proofEvaluation.status !== "passed") {
802808
return true;
803809
}
804-
return ["edited", "synchronize"].includes(context.payload.action);
810+
return true;
805811
}
806812

807813
async function applyPullRequestCandidateLabels(github, context, core, pullRequest, labelSet) {

test/scripts/barnacle-auto-response.test.ts

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
runBarnacleAutoResponse,
77
} from "../../scripts/github/barnacle-auto-response.mjs";
88
import {
9+
PROOF_OVERRIDE_LABEL,
910
PROOF_SUFFICIENT_LABEL,
1011
PROOF_SUPPLIED_LABEL,
1112
} from "../../scripts/github/real-behavior-proof-policy.mjs";
@@ -716,7 +717,7 @@ describe("barnacle-auto-response", () => {
716717
expect(calls.update).toStrictEqual([]);
717718
});
718719

719-
it("removes stale proof labels when override is present", async () => {
720+
it("removes stale structural proof labels but preserves sufficient proof when override is present", async () => {
720721
const { calls, github } = barnacleGithub([file("src/gateway/server.ts")]);
721722

722723
await runBarnacleAutoResponse({
@@ -726,7 +727,7 @@ describe("barnacle-auto-response", () => {
726727
candidateLabels.mockOnlyProof,
727728
PROOF_SUPPLIED_LABEL,
728729
PROOF_SUFFICIENT_LABEL,
729-
"proof: override",
730+
PROOF_OVERRIDE_LABEL,
730731
]),
731732
core: {
732733
info: () => undefined,
@@ -737,11 +738,38 @@ describe("barnacle-auto-response", () => {
737738
expectedRemoveLabel(123, candidateLabels.needsRealBehaviorProof),
738739
expectedRemoveLabel(123, candidateLabels.mockOnlyProof),
739740
expectedRemoveLabel(123, PROOF_SUPPLIED_LABEL),
740-
expectedRemoveLabel(123, PROOF_SUFFICIENT_LABEL),
741741
]);
742742
expect(calls.update).toStrictEqual([]);
743743
});
744744

745+
it("preserves manually applied sufficient proof label when override is added", async () => {
746+
const { calls, github } = barnacleGithub([file("src/gateway/server.ts")]);
747+
748+
await runBarnacleAutoResponse({
749+
github,
750+
context: barnacleContext(
751+
{
752+
body: realBehaviorProofBody(
753+
"![after](https://github.com/user-attachments/assets/gateway-ready)",
754+
),
755+
},
756+
[PROOF_OVERRIDE_LABEL, PROOF_SUFFICIENT_LABEL],
757+
{
758+
action: "labeled",
759+
label: { name: PROOF_OVERRIDE_LABEL },
760+
sender: { login: "maintainer", type: "User" },
761+
},
762+
),
763+
core: {
764+
info: () => undefined,
765+
},
766+
});
767+
768+
expect(calls.removeLabel).toEqual([]);
769+
expect(calls.addLabels).toEqual([]);
770+
expect(calls.update).toEqual([]);
771+
});
772+
745773
it("removes stale negative proof labels and adds supplied when proof is present", async () => {
746774
const { calls, github } = barnacleGithub([file("src/gateway/server.ts")]);
747775

@@ -887,6 +915,24 @@ describe("barnacle-auto-response", () => {
887915
expect(calls.removeLabel).toEqual([]);
888916
});
889917

918+
it("preserves sufficient proof on unrelated label events even without body proof", async () => {
919+
const { calls, github } = barnacleGithub([file("src/gateway/server.ts")]);
920+
921+
await runBarnacleAutoResponse({
922+
github,
923+
context: barnacleContext({}, [PROOF_SUFFICIENT_LABEL], {
924+
action: "labeled",
925+
label: { name: "status: ready for maintainer look" },
926+
sender: { login: "openclaw-clawsweeper[bot]", type: "Bot" },
927+
}),
928+
core: {
929+
info: () => undefined,
930+
},
931+
});
932+
933+
expect(calls.removeLabel).toEqual([]);
934+
});
935+
890936
it("does not let Barnacle veto ClawSweeper's sufficient proof label add", async () => {
891937
const { calls, github } = barnacleGithub([file("src/gateway/server.ts")]);
892938

0 commit comments

Comments
 (0)