@yemi33/minions 0.1.1913 → 0.1.1915
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/README.md +0 -2
- package/docs/deprecated.json +19 -1
- package/docs/pr-review-fix-loop.md +3 -11
- package/engine/ado.js +1 -4
- package/engine/github.js +1 -5
- package/engine/shared.js +0 -1
- package/engine.js +0 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -565,14 +565,12 @@ Engine behavior is controlled via `config.json`. Key settings:
|
|
|
565
565
|
| `autoDecompose` | true | Auto-decompose `implement:large` items into sub-tasks before dispatch |
|
|
566
566
|
| `autoApprovePlans` | false | Auto-approve PRDs without waiting for human approval |
|
|
567
567
|
| `evalLoop` | true | Auto-dispatch review → fix cycles after implementation completes |
|
|
568
|
-
| `evalMaxIterations` | 3 | Max minion review → fix cycles before pausing minion review automation; human feedback, build fixes, and conflict fixes continue |
|
|
569
568
|
| `evalMaxCost` | null | USD ceiling per work item across all eval iterations (null = no limit) |
|
|
570
569
|
| `meetingRoundTimeout` | 600000 (10min) | Timeout per meeting round before auto-advance |
|
|
571
570
|
| `ccModel` | `sonnet` | Model for Command Center and doc-chat (sonnet/haiku/opus) |
|
|
572
571
|
| `ccEffort` | null | Effort level for CC/doc-chat (null/low/medium/high) |
|
|
573
572
|
| `agentEffort` | null | Override effort level for all agent dispatches |
|
|
574
573
|
| `maxTurnsByType` | `{}` | Per-type max-turns override (e.g., `{"explore": 40, "fix": 100}`) |
|
|
575
|
-
| `maxBuildFixAttempts` | 3 | Max auto-fix dispatches per PR before escalating |
|
|
576
574
|
|
|
577
575
|
Per-type max-turns defaults (when `maxTurnsByType` not set): explore=30, ask=20, review=30, plan=30, decompose=15, plan-to-prd=20, implement=75, fix=75, test=50, verify=100. Configurable from the Settings page.
|
|
578
576
|
|
package/docs/deprecated.json
CHANGED
|
@@ -1 +1,19 @@
|
|
|
1
|
-
[
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "config-poll-key-migration",
|
|
4
|
+
"location": "engine/queries.js:123-162",
|
|
5
|
+
"function": "migrateDeprecatedConfigPollKeysOnce",
|
|
6
|
+
"reason": "One-time boot migration that renames legacy engine config keys (adoPollStatusEvery → prPollStatusEvery, adoPollCommentsEvery → prPollCommentsEvery). Keys were renamed on 2026-04-16; this shim ensures any persisted config.json on a long-lived host gets transparently rewritten on next boot.",
|
|
7
|
+
"targetRemovalDate": "2026-08-09",
|
|
8
|
+
"notes": "Safe to delete on or after 2026-08-09 (3 months after the rename) once we are confident every engine has rebooted at least once and the closure-flagged migration (_configPollKeyMigrationChecked at line 123) is no longer reachable on any persisted config. Removal is one function + the call site in getConfig() at engine/queries.js:165."
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": "legacy-done-aliases",
|
|
12
|
+
"location": "engine/cleanup.js:799-894",
|
|
13
|
+
"constants": ["LEGACY_DONE_ALIASES", "LEGACY_NEEDS_REVIEW_STATUS"],
|
|
14
|
+
"reason": "Read-side tolerance: cleanup sweep auto-migrates four obsolete work-item / PRD status strings ('in-pr', 'implemented', 'complete', 'needs-human-review') to the canonical 'done' / 'failed' values. The aliases are no longer written anywhere in the engine; the constants exist only to repair stale on-disk values from old engine versions.",
|
|
15
|
+
"targetRemovalDate": null,
|
|
16
|
+
"notes": "Keep indefinitely until telemetry / a sweep log shows zero migrations performed for 30 consecutive days across all known projects (work-items.json + prd/*.json). At that point the constants and both _migrateLegacyItem branches in engine/cleanup.js (definitions at :799-800; usage at :803-815 for work items and :880-887 for PRD missing_features) can be deleted. Total cost on disk today: 4 strings."
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
|
|
@@ -34,7 +34,7 @@ How the engine manages the lifecycle of a PR from creation through review, fix,
|
|
|
34
34
|
|
|
35
35
|
When multiple problems coexist, earlier triggers get the first chance to enqueue work. The local `fixDispatched` flag is declared before the fix triggers and set after human-feedback, review-feedback, and build-failure dispatches. Conflict fixes run last and explicitly require `!fixDispatched`, so any earlier successful fix dispatch suppresses the conflict fix for that PR in the same discovery pass. Build fixes are evaluated after human and minion review feedback, but the build-fix condition itself is not gated by `!fixDispatched`.
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
The engine does not cap review→fix cycles or build-fix attempts. Each trigger evaluates its own gates on every discovery pass; loops stop only when the underlying condition clears (reviewer approves, build passes, conflict resolves, human feedback handled). Operators who need to halt automation on a runaway PR should disable the relevant feature flag (`evalLoop`, `autoFixBuilds`, `autoFixConflicts`) or close the PR.
|
|
38
38
|
|
|
39
39
|
### A. Human comments (`humanFeedback.pendingFix`)
|
|
40
40
|
|
|
@@ -42,16 +42,14 @@ When multiple problems coexist, earlier triggers get the first chance to enqueue
|
|
|
42
42
|
- Agent comments filtered out via `/\bMinions\s*\(/i` regex on comment body
|
|
43
43
|
- Coalesces multiple comments arriving during cooldown into single fix
|
|
44
44
|
- Routes to author
|
|
45
|
-
- Not gated by `_evalEscalated` — humans can always force more fixes via PR comments even after the minion review loop escalates.
|
|
46
45
|
- Fix agents must treat human comments as claims to verify, not commands. They inspect or reproduce each claimed issue, make the smallest correct fix only when the claim is valid, and otherwise reply with evidence-backed rationale.
|
|
47
46
|
|
|
48
47
|
### B. Review feedback (`changes-requested`)
|
|
49
48
|
|
|
50
|
-
- Gate: `reviewStatus === 'changes-requested'` + `!awaitingReReview` +
|
|
49
|
+
- Gate: `reviewStatus === 'changes-requested'` + `!awaitingReReview` + not dispatched + not on cooldown
|
|
51
50
|
- Routes to PR author via `_author_` routing token
|
|
52
51
|
- `review_note` = reviewer's feedback
|
|
53
52
|
- Sets `fixDispatched = true` — prevents the later conflict fix from also firing this pass
|
|
54
|
-
- **Review-loop escalation**: after `evalMaxIterations` review→fix cycles (default 3), `_evalEscalated` is set on the PR and *only this trigger plus minion review/re-review* stop. Triggers A (human comments), C (build failures), and D (merge conflicts) keep running. The dashboard PR row distinguishes the two states with separate badges (review badge `review-escalated` vs. build badge `build-escalated`).
|
|
55
53
|
- Fix agents validate each requested-change claim before editing. Invalid, stale, already-addressed, out-of-scope, or harmful feedback should get a respectful evidence-backed rebuttal rather than a success-shaped code change.
|
|
56
54
|
|
|
57
55
|
### C. Build failures (`buildStatus === 'failing'`)
|
|
@@ -59,8 +57,6 @@ When multiple problems coexist, earlier triggers get the first chance to enqueue
|
|
|
59
57
|
- Gate: provider polling enabled (`adoPollEnabled` or `ghPollEnabled`) + `autoFixBuilds` + `buildStatus === 'failing'` + grace period expired
|
|
60
58
|
- **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).
|
|
61
59
|
- **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).
|
|
62
|
-
- **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`.
|
|
63
|
-
- Not gated by `_evalEscalated` — build-fix is mechanical and runs even if the review loop has escalated.
|
|
64
60
|
- Sets `fixDispatched = true` after dispatch so the later conflict trigger is suppressed in the same pass.
|
|
65
61
|
|
|
66
62
|
### D. Merge conflicts (`_mergeConflict`)
|
|
@@ -88,7 +84,7 @@ When multiple problems coexist, earlier triggers get the first chance to enqueue
|
|
|
88
84
|
- Fix agent pushes → `_buildFixPushedAt` stamped
|
|
89
85
|
- Poller detects new commit → CI starts → `buildStatus` transitions (`failing` → `running`)
|
|
90
86
|
- `_buildFixPushedAt` cleared on any transition
|
|
91
|
-
- If CI passes → `
|
|
87
|
+
- If CI passes → `buildErrorLog` cleared → done
|
|
92
88
|
- If CI fails again → fresh error logs fetched → new fix dispatches immediately (grace already cleared by transition)
|
|
93
89
|
|
|
94
90
|
## Race prevention
|
|
@@ -125,10 +121,6 @@ When multiple problems coexist, earlier triggers get the first chance to enqueue
|
|
|
125
121
|
| `reviewStatus` | Poller + post-completion | `pending` / `approved` / `changes-requested` / `waiting` |
|
|
126
122
|
| `buildStatus` | Poller | `none` / `passing` / `failing` / `running` |
|
|
127
123
|
| `buildErrorLog` | Poller | Actual CI error output for fix agents |
|
|
128
|
-
| `buildFixAttempts` | Discovery (on dispatch) | Counter for build-fix escalation cap |
|
|
129
|
-
| `buildFixEscalated` | Discovery (on cap) | Stops *build-fix* auto-dispatch only (review/re-review and other fix triggers continue) |
|
|
130
|
-
| `_reviewFixCycles` | Discovery (on dispatch) | Counter for review→fix cycle cap (`evalMaxIterations`) |
|
|
131
|
-
| `_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. |
|
|
132
124
|
| `_buildFixPushedAt` | Discovery (on dispatch) | Grace period timestamp |
|
|
133
125
|
| `_buildFailNotified` | Discovery | Dedup for inbox alert |
|
|
134
126
|
| `lastPushedAt` | Poller (new commit) | Tracks latest push for re-review logic |
|
package/engine/ado.js
CHANGED
|
@@ -714,7 +714,6 @@ async function pollPrStatus(config) {
|
|
|
714
714
|
delete pr._buildStatusStale;
|
|
715
715
|
delete pr._buildStatusDetail;
|
|
716
716
|
delete pr.buildFixAttempts;
|
|
717
|
-
delete pr.buildFixEscalated;
|
|
718
717
|
}
|
|
719
718
|
// Cancel any pending review/fix dispatches — they're stale now that the PR is closed
|
|
720
719
|
try {
|
|
@@ -862,8 +861,6 @@ async function pollPrStatus(config) {
|
|
|
862
861
|
updated = true;
|
|
863
862
|
shared.trackReviewMetric(pr, newReviewStatus, config);
|
|
864
863
|
if (newReviewStatus === 'approved') {
|
|
865
|
-
delete pr._reviewFixCycles;
|
|
866
|
-
delete pr._evalEscalated;
|
|
867
864
|
// Teams notification for PR approval — non-blocking, edge-triggered (only on transition)
|
|
868
865
|
try {
|
|
869
866
|
const teams = require('./teams');
|
|
@@ -975,7 +972,7 @@ async function pollPrStatus(config) {
|
|
|
975
972
|
delete pr.buildErrorLog;
|
|
976
973
|
delete pr.buildFailureSignature;
|
|
977
974
|
// Reset build fix retry counter on recovery — allows fresh auto-fix cycles if build breaks again
|
|
978
|
-
if (pr.buildFixAttempts) { delete pr.buildFixAttempts;
|
|
975
|
+
if (pr.buildFixAttempts) { delete pr.buildFixAttempts; }
|
|
979
976
|
}
|
|
980
977
|
}
|
|
981
978
|
updated = true;
|
package/engine/github.js
CHANGED
|
@@ -592,7 +592,6 @@ async function pollPrStatus(config) {
|
|
|
592
592
|
delete pr.buildFailureSignature;
|
|
593
593
|
delete pr._buildFailNotified;
|
|
594
594
|
delete pr.buildFixAttempts;
|
|
595
|
-
delete pr.buildFixEscalated;
|
|
596
595
|
}
|
|
597
596
|
// Cancel any pending review/fix dispatches — they're stale now that the PR is closed
|
|
598
597
|
try {
|
|
@@ -647,10 +646,7 @@ async function pollPrStatus(config) {
|
|
|
647
646
|
pr.reviewStatus = newReviewStatus;
|
|
648
647
|
updated = true;
|
|
649
648
|
shared.trackReviewMetric(pr, newReviewStatus, config);
|
|
650
|
-
// Reset review→fix cycle counter on approval (loop succeeded)
|
|
651
649
|
if (newReviewStatus === 'approved') {
|
|
652
|
-
delete pr._reviewFixCycles;
|
|
653
|
-
delete pr._evalEscalated;
|
|
654
650
|
// Teams notification for PR approval — non-blocking, edge-triggered (only on transition)
|
|
655
651
|
try {
|
|
656
652
|
const teams = require('./teams');
|
|
@@ -717,7 +713,7 @@ async function pollPrStatus(config) {
|
|
|
717
713
|
delete pr.buildErrorLog;
|
|
718
714
|
delete pr.buildFailureSignature;
|
|
719
715
|
// Reset build fix retry counter on recovery — allows fresh auto-fix cycles if build breaks again
|
|
720
|
-
if (pr.buildFixAttempts) { delete pr.buildFixAttempts;
|
|
716
|
+
if (pr.buildFixAttempts) { delete pr.buildFixAttempts; }
|
|
721
717
|
}
|
|
722
718
|
}
|
|
723
719
|
updated = true;
|
package/engine/shared.js
CHANGED
package/engine.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1915",
|
|
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"
|