@yemi33/minions 0.1.1618 → 0.1.1619
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -4
- package/dashboard/js/render-prs.js +5 -3
- package/dashboard/styles.css +1 -0
- package/docs/pr-review-fix-loop.md +9 -4
- package/engine/copilot-models.json +1 -1
- package/engine.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.1619 (2026-04-29)
|
|
4
4
|
|
|
5
5
|
### Features
|
|
6
|
-
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
- surface partial PR escalation state (#1856)
|
|
7
|
+
|
|
8
|
+
## 0.1.1617 (2026-04-29)
|
|
9
9
|
|
|
10
10
|
### Fixes
|
|
11
11
|
- guard stale build & conflict auto-fixes with live pre-dispatch check (#1851)
|
|
@@ -10,8 +10,10 @@ function prRow(pr) {
|
|
|
10
10
|
// If PR is merged/abandoned, treat 'waiting' review as resolved
|
|
11
11
|
const effectiveReviewStatus = (pr.status === 'merged' || pr.status === 'abandoned') && pr.reviewStatus === 'waiting' ? (pr.status === 'merged' ? 'approved' : 'pending') : pr.reviewStatus;
|
|
12
12
|
const reviewSource = sq.status || effectiveReviewStatus || 'pending';
|
|
13
|
-
const
|
|
14
|
-
const
|
|
13
|
+
const reviewEscalated = !!pr._evalEscalated;
|
|
14
|
+
const reviewClass = reviewEscalated ? 'review-escalated' : reviewSource === 'approved' ? 'approved' : (reviewSource === 'changes-requested' || reviewSource === 'rejected') ? 'rejected' : reviewSource === 'waiting' ? 'building' : 'draft';
|
|
15
|
+
const reviewLabel = reviewEscalated ? 'review loop escalated (build/conflict may still run)' : sq.status === 'waiting' ? 'reviewing (minions)' : sq.status ? sq.status + ' (minions)' : (effectiveReviewStatus || 'pending');
|
|
16
|
+
const reviewTitle = reviewEscalated ? 'Review/re-review and review-fix automation stopped after evalMaxIterations; build-fix and conflict-fix automation may still run.' : '';
|
|
15
17
|
const buildClass = pr.buildFixEscalated ? 'build-escalated' : pr._buildStatusStale ? 'build-stale' : pr.buildStatus === 'passing' ? 'build-pass' : pr.buildStatus === 'failing' ? 'build-fail' : pr.buildStatus === 'running' ? 'building' : 'no-build';
|
|
16
18
|
const buildLabel = pr.buildFixEscalated ? 'escalated (' + (pr.buildFixAttempts || '?') + ' fixes)' : (pr.buildStatus || 'none') + (pr._buildStatusStale ? ' (stale)' : '');
|
|
17
19
|
const statusClass = pr.status === 'merged' ? 'merged' : pr.status === 'abandoned' ? 'rejected' : pr.status === 'active' ? 'active' : 'draft';
|
|
@@ -23,7 +25,7 @@ function prRow(pr) {
|
|
|
23
25
|
'<td><a class="pr-title" href="' + escapeHtml(safeUrl(url)) + '" target="_blank" rel="noopener">' + escapeHtml(pr.title || 'Untitled') + '</a>' + (pr.description ? '<div class="pr-desc">' + escapeHtml(pr.description.length > 120 ? pr.description.slice(0, 120) + '...' : pr.description) + '</div>' : '') + '</td>' +
|
|
24
26
|
'<td><span class="pr-agent">' + escapeHtml(pr.agent || '—') + '</span></td>' +
|
|
25
27
|
'<td><span class="pr-branch">' + escapeHtml(pr.branch || '—') + '</span></td>' +
|
|
26
|
-
'<td><span class="pr-badge ' + reviewClass + '">' + escapeHtml(reviewLabel) + '</span></td>' +
|
|
28
|
+
'<td><span class="pr-badge ' + reviewClass + '"' + (reviewTitle ? ' title="' + escapeHtml(reviewTitle) + '"' : '') + '>' + escapeHtml(reviewLabel) + '</span></td>' +
|
|
27
29
|
'<td>' + (sq.reviewer && sq.status !== 'waiting' ? '<span class="pr-agent" title="' + escapeHtml(sq.note || '') + '">' + escapeHtml(sq.reviewer) + '</span>' : sq.reviewer && sq.status === 'waiting' ? '<span class="pr-agent" style="color:var(--muted)" title="Vote pending confirmation">' + escapeHtml(sq.reviewer) + '…</span>' : pr.reviewedBy && pr.reviewedBy.length ? '<span class="pr-agent">' + escapeHtml(pr.reviewedBy.join(', ')) + '</span>' : '<span style="color:var(--muted);font-size:11px">—</span>') + '</td>' +
|
|
28
30
|
'<td><span class="pr-badge ' + buildClass + '">' + escapeHtml(buildLabel) + '</span></td>' +
|
|
29
31
|
'<td><span class="pr-badge ' + statusClass + '">' + escapeHtml(statusLabel) + '</span></td>' +
|
package/dashboard/styles.css
CHANGED
|
@@ -268,6 +268,7 @@
|
|
|
268
268
|
.pr-badge.approved { background: rgba(63,185,80,0.15); color: var(--green); border: 1px solid var(--green); }
|
|
269
269
|
.pr-badge.rejected { background: rgba(248,81,73,0.15); color: var(--red); border: 1px solid var(--red); }
|
|
270
270
|
.pr-badge.needs-review { background: rgba(227,179,65,0.15); color: var(--orange); border: 1px solid var(--orange); }
|
|
271
|
+
.pr-badge.review-escalated { background: rgba(227,179,65,0.22); color: var(--orange); border: 1px dashed var(--orange); font-weight: 700; }
|
|
271
272
|
.pr-badge.merged { background: rgba(188,140,255,0.15); color: var(--purple); border: 1px solid var(--purple); }
|
|
272
273
|
.pr-badge.building { background: rgba(210,153,34,0.15); color: var(--yellow); border: 1px solid var(--yellow); animation: pulse 1.5s infinite; }
|
|
273
274
|
.pr-badge.build-pass { background: rgba(63,185,80,0.15); color: var(--green); border: 1px solid var(--green); }
|
|
@@ -34,10 +34,11 @@ When multiple problems coexist, earlier triggers get the first chance to enqueue
|
|
|
34
34
|
|
|
35
35
|
### A. Review feedback (`changes-requested`)
|
|
36
36
|
|
|
37
|
-
- Gate: `reviewStatus === 'changes-requested'` + `!awaitingReReview` + not dispatched + not on cooldown
|
|
37
|
+
- Gate: `reviewStatus === 'changes-requested'` + `!awaitingReReview` + `!evalEscalated` + not dispatched + not on cooldown
|
|
38
38
|
- Routes to PR author via `_author_` routing token
|
|
39
39
|
- `review_note` = reviewer's feedback
|
|
40
40
|
- Sets `fixDispatched = true` — prevents human-feedback and conflict fixes from also firing this pass
|
|
41
|
+
- **Review-loop escalation**: after `evalMaxIterations` review→fix cycles (default 3), `_evalEscalated` is set on the PR and *only this trigger plus review/re-review* stop. Triggers B (human comments), C (build failures), and the merge-conflict fix path keep running. The dashboard PR row distinguishes the two states with separate badges (review badge `review-escalated` vs. build badge `build-escalated`).
|
|
41
42
|
|
|
42
43
|
### B. Human comments (`humanFeedback.pendingFix`)
|
|
43
44
|
|
|
@@ -45,13 +46,15 @@ When multiple problems coexist, earlier triggers get the first chance to enqueue
|
|
|
45
46
|
- Agent comments filtered out via `/\bMinions\s*\(/i` regex on comment body
|
|
46
47
|
- Coalesces multiple comments arriving during cooldown into single fix
|
|
47
48
|
- Routes to author
|
|
49
|
+
- Not gated by `_evalEscalated` — humans can always force more fixes via PR comments even after the review loop escalates.
|
|
48
50
|
|
|
49
51
|
### C. Build failures (`buildStatus === 'failing'`)
|
|
50
52
|
|
|
51
53
|
- Gate: `buildFixAttempts < maxBuildFixAttempts` (default 3) + grace period expired
|
|
52
54
|
- **Grace period** (`_buildFixPushedAt`): after fix dispatches, waits `buildFixGracePeriod` (default 10min, configurable in `ENGINE_DEFAULTS`) for CI to run before re-dispatching. Cleared when poller detects build status transition (CI actually ran).
|
|
53
55
|
- **Error logs**: GitHub fetches annotations (failures only, not warnings) + Actions job log (always). ADO queries builds API directly (not status checks), fetches build timeline → failed task logs (up to 10 per build, up to 10 failing pipelines).
|
|
54
|
-
- **
|
|
56
|
+
- **Build-fix escalation**: after 3 failed attempts, writes an inbox alert, sets `buildFixEscalated = true`, and stops *only this trigger* (auto-dispatch for build fixes). The counter resets when the build recovers. Independent of `_evalEscalated`.
|
|
57
|
+
- Not gated by `_evalEscalated` — build-fix is mechanical and runs even if the review loop has escalated.
|
|
55
58
|
- Sets `fixDispatched = true` after dispatch so the later conflict trigger is suppressed in the same pass.
|
|
56
59
|
|
|
57
60
|
### D. Merge conflicts (`_mergeConflict`)
|
|
@@ -116,8 +119,10 @@ When multiple problems coexist, earlier triggers get the first chance to enqueue
|
|
|
116
119
|
| `reviewStatus` | Poller + post-completion | `pending` / `approved` / `changes-requested` / `waiting` |
|
|
117
120
|
| `buildStatus` | Poller | `none` / `passing` / `failing` / `running` |
|
|
118
121
|
| `buildErrorLog` | Poller | Actual CI error output for fix agents |
|
|
119
|
-
| `buildFixAttempts` | Discovery (on dispatch) | Counter for escalation cap |
|
|
120
|
-
| `buildFixEscalated` | Discovery (on cap) | Stops auto-dispatch |
|
|
122
|
+
| `buildFixAttempts` | Discovery (on dispatch) | Counter for build-fix escalation cap |
|
|
123
|
+
| `buildFixEscalated` | Discovery (on cap) | Stops *build-fix* auto-dispatch only (review/re-review and other fix triggers continue) |
|
|
124
|
+
| `_reviewFixCycles` | Discovery (on dispatch) | Counter for review→fix cycle cap (`evalMaxIterations`) |
|
|
125
|
+
| `_evalEscalated` | Discovery (on cap) | Stops *review/re-review and review-feedback fix* auto-dispatch only (build-fix, conflict-fix, and human-feedback fix continue). Cleared when reviewer eventually approves the PR. |
|
|
121
126
|
| `_buildFixPushedAt` | Discovery (on dispatch) | Grace period timestamp |
|
|
122
127
|
| `_buildFailNotified` | Discovery | Dedup for inbox alert |
|
|
123
128
|
| `lastPushedAt` | Poller (new commit) | Tracks latest push for re-review logic |
|
package/engine.js
CHANGED
|
@@ -2081,7 +2081,7 @@ async function discoverFromPrs(config, project) {
|
|
|
2081
2081
|
if (target) target._evalEscalated = true;
|
|
2082
2082
|
});
|
|
2083
2083
|
} catch (e) { log('warn', 'mark eval escalated: ' + e.message); }
|
|
2084
|
-
log('warn', `PR ${pr.id}: review→fix escalated after ${evalCycles} cycles — suspending
|
|
2084
|
+
log('warn', `PR ${pr.id}: review→fix escalated after ${evalCycles} cycles — suspending review/re-review and review-fix dispatch; build/conflict fixes may continue`);
|
|
2085
2085
|
}
|
|
2086
2086
|
|
|
2087
2087
|
// PRs needing review: evalLoop gates the entire review+fix cycle; pollEnabled ensures reviewStatus is fresh
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1619",
|
|
4
4
|
"description": "Multi-agent AI dev team that runs from ~/.minions/ — five autonomous agents share a single engine, dashboard, and knowledge base",
|
|
5
5
|
"bin": {
|
|
6
6
|
"minions": "bin/minions.js"
|