@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 CHANGED
@@ -1,11 +1,11 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.1618 (2026-04-29)
3
+ ## 0.1.1619 (2026-04-29)
4
4
 
5
5
  ### Features
6
- - fix protected-file guard (#1858)
7
- - fix canonical active PR gate (#1857)
8
- - document PR auto-fix trigger precedence (#1855)
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 reviewClass = reviewSource === 'approved' ? 'approved' : (reviewSource === 'changes-requested' || reviewSource === 'rejected') ? 'rejected' : reviewSource === 'waiting' ? 'building' : 'draft';
14
- const reviewLabel = sq.status === 'waiting' ? 'reviewing (minions)' : sq.status ? sq.status + ' (minions)' : (effectiveReviewStatus || 'pending');
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>' +
@@ -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
- - **Escalation**: after 3 failed attempts, writes inbox alert, sets `buildFixEscalated = true`, stops auto-dispatch. Counter resets when build recovers.
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 |
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "runtime": "copilot",
3
3
  "models": null,
4
- "cachedAt": "2026-04-29T01:10:58.853Z"
4
+ "cachedAt": "2026-04-29T01:13:06.848Z"
5
5
  }
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 auto-dispatch`);
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.1618",
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"