@yemi33/minions 0.1.797 → 0.1.799

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,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.797 (2026-04-10)
3
+ ## 0.1.799 (2026-04-10)
4
4
 
5
5
  ### Features
6
6
  - add open-source community sources to agentic research pipeline
@@ -8,6 +8,8 @@
8
8
  - cap review→fix cycles at evalMaxIterations (default 3)
9
9
 
10
10
  ### Fixes
11
+ - approved is permanent — no path can ever downgrade it
12
+ - allow fix dispatch on approved PRs (only guard is in updatePrAfterFix)
11
13
  - bot comment on approved PR can no longer reset vote
12
14
  - remove redundant 'PR' prefix from dispatch labels (id already has it)
13
15
  - include PR title in all dispatch labels and escalation alerts
package/engine/ado.js CHANGED
@@ -295,19 +295,18 @@ async function pollPrStatus(config) {
295
295
  const reviewers = prData.reviewers || [];
296
296
  const votes = reviewers.map(r => r.vote).filter(v => v !== undefined);
297
297
  let newReviewStatus = pr.reviewStatus || 'pending';
298
- if (votes.length > 0) {
298
+ // Once approved, it stays approved permanently
299
+ if (pr.reviewStatus === 'approved') {
300
+ newReviewStatus = 'approved';
301
+ } else if (votes.length > 0) {
299
302
  if (votes.some(v => v === -10)) {
300
- // Don't re-trigger 'changes-requested' if fix agent already responded (waiting state).
301
- // Only re-trigger if there's been a new push since the fix (reviewer re-reviewed).
302
303
  if (pr.reviewStatus === 'waiting' && pr.minionsReview?.fixedAt && (!pr.lastPushedAt || pr.lastPushedAt <= pr.minionsReview.fixedAt)) {
303
- newReviewStatus = 'waiting'; // fix was submitted, same vote still present — wait for re-review
304
+ newReviewStatus = 'waiting';
304
305
  } else {
305
306
  newReviewStatus = 'changes-requested';
306
307
  }
307
308
  }
308
309
  else if (votes.some(v => v >= 5)) newReviewStatus = 'approved';
309
- // Never downgrade from 'approved' — only -10 (reject) can override it
310
- else if (pr.reviewStatus === 'approved') newReviewStatus = 'approved';
311
310
  else if (votes.some(v => v === -5)) newReviewStatus = 'waiting';
312
311
  else newReviewStatus = 'pending';
313
312
  }
package/engine/github.js CHANGED
@@ -330,8 +330,10 @@ async function pollPrStatus(config) {
330
330
  }
331
331
 
332
332
  let newReviewStatus = pr.reviewStatus || 'pending';
333
- if (states.some(s => s === 'CHANGES_REQUESTED')) {
334
- // Don't re-trigger if fix agent already responded — wait for re-review
333
+ // Once approved, it stays approved permanently
334
+ if (pr.reviewStatus === 'approved') {
335
+ newReviewStatus = 'approved';
336
+ } else if (states.some(s => s === 'CHANGES_REQUESTED')) {
335
337
  if (pr.reviewStatus === 'waiting' && pr.minionsReview?.fixedAt && (!pr.lastPushedAt || pr.lastPushedAt <= pr.minionsReview.fixedAt)) {
336
338
  newReviewStatus = 'waiting';
337
339
  } else {
@@ -339,8 +341,6 @@ async function pollPrStatus(config) {
339
341
  }
340
342
  }
341
343
  else if (states.some(s => s === 'APPROVED')) newReviewStatus = 'approved';
342
- // Never downgrade from 'approved' — only CHANGES_REQUESTED can override it
343
- else if (pr.reviewStatus === 'approved') newReviewStatus = 'approved';
344
344
  else if (states.length > 0) newReviewStatus = 'pending';
345
345
  else if (states.length === 0 && reviews.length > 0 && newReviewStatus === 'pending') newReviewStatus = 'waiting';
346
346
 
@@ -751,8 +751,8 @@ async function updatePrAfterReview(agentId, pr, project, config, resultSummary)
751
751
  if (!Array.isArray(prs)) return prs;
752
752
  const target = prs.find(p => p.id === pr.id);
753
753
  if (!target) return prs;
754
- // Only update if live check returned decisive result; never downgrade from 'approved' unless explicitly rejected
755
- if (postReviewStatus && !(target.reviewStatus === 'approved' && postReviewStatus !== 'changes-requested')) {
754
+ // Once approved, stays approved permanently no path can downgrade
755
+ if (postReviewStatus && target.reviewStatus !== 'approved') {
756
756
  target.reviewStatus = postReviewStatus;
757
757
  }
758
758
  target.lastReviewedAt = ts();
package/engine.js CHANGED
@@ -1659,7 +1659,7 @@ async function discoverFromPrs(config, project) {
1659
1659
  // PRs with pending human feedback (skip if review-fix already dispatched above)
1660
1660
  const humanFixKey = `human-fix-${project?.name || 'default'}-${pr.id}`;
1661
1661
  const hasCoalescedFeedback = (dispatchCooldowns.get(humanFixKey)?.pendingContexts || []).length > 0;
1662
- if ((pr.humanFeedback?.pendingFix || hasCoalescedFeedback) && !awaitingReReview && !fixDispatched && reviewStatus !== 'approved') {
1662
+ if ((pr.humanFeedback?.pendingFix || hasCoalescedFeedback) && !awaitingReReview && !fixDispatched) {
1663
1663
  const key = humanFixKey;
1664
1664
  if (isAlreadyDispatched(key) || isOnCooldown(key, cooldownMs)) {
1665
1665
  // Coalesce: save feedback for next dispatch
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.797",
3
+ "version": "0.1.799",
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"