From 20b67432b14a0c92fe15d8bb4a65c8bb1274dbda Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Mon, 26 Oct 2026 22:32:37 +0100 Subject: [PATCH] Maintainer peer-review skip marks the attempt peer_skipped so merge re-verification accepts it --- src/server/merge.js | 2 +- test/server.test.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/merge.js b/src/server/merge.js index 58d3a8b..b4268da 100644 --- a/src/server/merge.js +++ b/src/server/merge.js @@ -88,7 +88,7 @@ export class Merger { const approvals = this.store.get(`SELECT COUNT(*) AS n FROM reviews WHERE attempt_id = ? AND action = 'approve'`, attemptId).n; const needed = this.requiredApprovals(attempt) - approvals; if (hasRole(reviewer, 'maintainer') || needed <= 0) { - this.store.run(`UPDATE attempts SET state = 'approved' WHERE id = ?`, attemptId); + this.store.run(`UPDATE attempts SET state = 'approved'${skipsPeers ? ', peer_skipped = 1' : ''} WHERE id = ?`, attemptId); this.store.run(`UPDATE tasks SET state = 'approved', updated_at = ? WHERE id = ?`, now(), attempt.task_id); return { state: 'approved' }; } diff --git a/test/server.test.js b/test/server.test.js index 80254af..afe8c9a 100644 --- a/test/server.test.js +++ b/test/server.test.js @@ -932,6 +932,7 @@ test('maintainers can decide a function still in peer review; reviewers cannot', assert.throws(() => ctx.merger.review(ctx.accounts.byName('pmaint'), attempt, 'approve'), /attempt is peer_review/, 'skipping peer review must be asked for'); assert.equal(ctx.merger.review(ctx.accounts.byName('pmaint'), attempt, 'approve', null, { skipPeerReview: true }).state, 'approved'); assert.equal(ctx.store.get('SELECT state FROM tasks WHERE id = ?', task).state, 'approved'); + assert.ok(ctx.peers.confirmed(attempt), 'the merge re-check must accept a maintainer decision without peer verdicts'); assert.ok(ctx.store.get(`SELECT 1 FROM events WHERE type = 'review' AND data LIKE '%skippedPeerReview%'`)); });