@yemi33/minions 0.1.786 → 0.1.788

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,13 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.786 (2026-04-10)
3
+ ## 0.1.788 (2026-04-10)
4
4
 
5
5
  ### Features
6
6
  - cap review→fix cycles at evalMaxIterations (default 3)
7
7
 
8
8
  ### Fixes
9
+ - human feedback fixes are never capped (only minion review→fix loop is)
10
+ - 5 bugs from comprehensive audit
9
11
  - stale ADO build detection + merge conflict auto-fix for both platforms
10
12
  - don't overwrite reviewStatus when platform vote hasn't propagated
11
13
  - don't overwrite approval with 'waiting' when platform API lags
package/engine/ado.js CHANGED
@@ -395,8 +395,9 @@ async function pollPrStatus(config) {
395
395
  pr.buildStatus = buildStatus;
396
396
  if (buildFailReason) pr.buildFailReason = buildFailReason;
397
397
  else delete pr.buildFailReason;
398
- // Build transitioned — clear grace period so next failure can trigger immediately
398
+ // Build transitioned — clear grace period and auto-complete flag
399
399
  delete pr._buildFixPushedAt;
400
+ if (buildStatus === 'failing') delete pr._autoCompleted;
400
401
  if (buildStatus !== 'failing') {
401
402
  delete pr._buildFailNotified;
402
403
  delete pr.buildErrorLog;
package/engine/github.js CHANGED
@@ -400,8 +400,9 @@ async function pollPrStatus(config) {
400
400
  pr.buildStatus = buildStatus;
401
401
  if (buildFailReason) pr.buildFailReason = buildFailReason;
402
402
  else delete pr.buildFailReason;
403
- // Build transitioned — clear grace period so next failure can trigger immediately
403
+ // Build transitioned — clear grace period and auto-complete flag
404
404
  delete pr._buildFixPushedAt;
405
+ if (buildStatus === 'failing') delete pr._autoCompleted; // allow re-merge after fix
405
406
  if (buildStatus !== 'failing') {
406
407
  delete pr._buildFailNotified;
407
408
  delete pr.buildErrorLog;
package/engine.js CHANGED
@@ -1576,10 +1576,11 @@ async function discoverFromPrs(config, project) {
1576
1576
  // The poller holds reviewStatus at 'waiting' until the reviewer acts on the new code.
1577
1577
  const awaitingReReview = reviewStatus === 'waiting' && !!pr.minionsReview?.fixedAt;
1578
1578
 
1579
- // Review→fix cycle cap — stop after N iterations, alert human
1579
+ // Review→fix cycle cap — stop review/fix dispatch after N iterations, but allow build fixes and conflict fixes
1580
1580
  const evalMax = config.engine?.evalMaxIterations ?? DEFAULTS.evalMaxIterations;
1581
1581
  const evalCycles = pr._reviewFixCycles || 0;
1582
- if (evalCycles >= evalMax && !pr._evalEscalated) {
1582
+ const evalEscalated = evalCycles >= evalMax;
1583
+ if (evalEscalated && !pr._evalEscalated) {
1583
1584
  writeInboxAlert(`eval-escalated-${pr.agent || 'unassigned'}-${pr.id}`,
1584
1585
  `# Review Loop Escalation\n\n**PR ${pr.id}** on branch \`${pr.branch || 'unknown'}\` has gone through **${evalCycles}** review→fix cycles without approval.\n\n` +
1585
1586
  `Last review: ${pr.minionsReview?.note ? pr.minionsReview.note.slice(0, 200) : 'See PR thread'}\n\n` +
@@ -1591,13 +1592,12 @@ async function discoverFromPrs(config, project) {
1591
1592
  });
1592
1593
  } catch (e) { log('warn', 'mark eval escalated: ' + e.message); }
1593
1594
  log('warn', `PR ${pr.id}: review→fix escalated after ${evalCycles} cycles — suspending auto-dispatch`);
1594
- continue;
1595
1595
  }
1596
1596
 
1597
1597
  // PRs needing review: pending review status and not already reviewed without new commits
1598
1598
  const autoReview = config.engine?.autoReview !== false;
1599
1599
  const alreadyReviewed = pr.lastReviewedAt && (!pr.lastPushedAt || pr.lastPushedAt <= pr.lastReviewedAt);
1600
- const needsReview = autoReview && reviewStatus === 'pending' && !alreadyReviewed;
1600
+ const needsReview = autoReview && reviewStatus === 'pending' && !alreadyReviewed && !evalEscalated;
1601
1601
  if (needsReview) {
1602
1602
  const key = `review-${project?.name || 'default'}-${pr.id}`;
1603
1603
  if (isAlreadyDispatched(key) || isOnCooldown(key, cooldownMs)) continue;
@@ -1634,7 +1634,7 @@ async function discoverFromPrs(config, project) {
1634
1634
 
1635
1635
  // PRs with changes requested → route back to author for fix
1636
1636
  let fixDispatched = false;
1637
- if (reviewStatus === 'changes-requested' && !awaitingReReview) {
1637
+ if (reviewStatus === 'changes-requested' && !awaitingReReview && !evalEscalated) {
1638
1638
  const key = `fix-${project?.name || 'default'}-${pr.id}`;
1639
1639
  if (isAlreadyDispatched(key) || isOnCooldown(key, cooldownMs)) continue;
1640
1640
  const agentId = resolveAgent('fix', config, pr.agent);
@@ -1683,7 +1683,7 @@ async function discoverFromPrs(config, project) {
1683
1683
  reviewer: 'Human Reviewer',
1684
1684
  review_note: reviewNote,
1685
1685
  }, `Fix PR ${pr.id} — human feedback`, { dispatchKey: key, source: 'pr-human-feedback', pr, branch: pr.branch, project: projMeta });
1686
- if (item) { newWork.push(item); setCooldown(key); }
1686
+ if (item) { newWork.push(item); setCooldown(key); fixDispatched = true; }
1687
1687
  }
1688
1688
 
1689
1689
  // PRs with build failures — route to author (has session context from implementing)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.786",
3
+ "version": "0.1.788",
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"