infinity-harness 2.8.9 → 2.8.11

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.
Files changed (192) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/extensions/infinity-harness/index.js +3614 -0
  3. package/dist/extensions/infinity-harness/index.js.map +1 -0
  4. package/dist/src/approval.js +154 -0
  5. package/dist/src/approval.js.map +1 -0
  6. package/dist/src/core/brief.js +309 -0
  7. package/dist/src/core/brief.js.map +1 -0
  8. package/dist/src/core/config.js +539 -0
  9. package/dist/src/core/config.js.map +1 -0
  10. package/dist/src/core/exec.js +106 -0
  11. package/dist/src/core/exec.js.map +1 -0
  12. package/dist/src/core/featureList.js +365 -0
  13. package/dist/src/core/featureList.js.map +1 -0
  14. package/dist/src/core/fsx.js +123 -0
  15. package/dist/src/core/fsx.js.map +1 -0
  16. package/dist/src/core/gates.js +490 -0
  17. package/dist/src/core/gates.js.map +1 -0
  18. package/dist/src/core/init.js +480 -0
  19. package/dist/src/core/init.js.map +1 -0
  20. package/dist/src/core/lock.js +183 -0
  21. package/dist/src/core/lock.js.map +1 -0
  22. package/dist/src/core/modelRouter.js +185 -0
  23. package/dist/src/core/modelRouter.js.map +1 -0
  24. package/dist/src/core/paths.js +129 -0
  25. package/dist/src/core/paths.js.map +1 -0
  26. package/dist/src/core/phases.js +254 -0
  27. package/dist/src/core/phases.js.map +1 -0
  28. package/dist/src/core/plan.js +15 -0
  29. package/dist/src/core/plan.js.map +1 -0
  30. package/dist/src/core/runState.js +126 -0
  31. package/dist/src/core/runState.js.map +1 -0
  32. package/dist/src/core/settings.js +877 -0
  33. package/dist/src/core/settings.js.map +1 -0
  34. package/dist/src/core/skills.js +319 -0
  35. package/dist/src/core/skills.js.map +1 -0
  36. package/dist/src/core/skillsAudit.js +194 -0
  37. package/dist/src/core/skillsAudit.js.map +1 -0
  38. package/dist/src/core/types.js +77 -0
  39. package/dist/src/core/types.js.map +1 -0
  40. package/dist/src/daemon/budget.js +85 -0
  41. package/dist/src/daemon/budget.js.map +1 -0
  42. package/dist/src/daemon/guard.js +122 -0
  43. package/dist/src/daemon/guard.js.map +1 -0
  44. package/dist/src/daemon/index.js +461 -0
  45. package/dist/src/daemon/index.js.map +1 -0
  46. package/dist/src/daemon/isolation.js +84 -0
  47. package/dist/src/daemon/isolation.js.map +1 -0
  48. package/dist/src/daemon/preflight.js +131 -0
  49. package/dist/src/daemon/preflight.js.map +1 -0
  50. package/dist/src/daemon/server.js +174 -0
  51. package/dist/src/daemon/server.js.map +1 -0
  52. package/dist/src/daemon/supervisorState.js +42 -0
  53. package/dist/src/daemon/supervisorState.js.map +1 -0
  54. package/dist/src/daemon/worker.js +239 -0
  55. package/dist/src/daemon/worker.js.map +1 -0
  56. package/dist/src/daemon/worktree.js +102 -0
  57. package/dist/src/daemon/worktree.js.map +1 -0
  58. package/dist/src/escalate.js +312 -0
  59. package/dist/src/escalate.js.map +1 -0
  60. package/dist/src/exec/piWorker.js +630 -0
  61. package/dist/src/exec/piWorker.js.map +1 -0
  62. package/dist/src/goal.js +317 -0
  63. package/dist/src/goal.js.map +1 -0
  64. package/dist/src/goalLoop.js +374 -0
  65. package/dist/src/goalLoop.js.map +1 -0
  66. package/dist/src/goalSpec.js +397 -0
  67. package/dist/src/goalSpec.js.map +1 -0
  68. package/dist/src/goalState.js +255 -0
  69. package/dist/src/goalState.js.map +1 -0
  70. package/dist/src/handoff.js +205 -0
  71. package/dist/src/handoff.js.map +1 -0
  72. package/dist/src/intake.js +203 -0
  73. package/dist/src/intake.js.map +1 -0
  74. package/dist/src/loop.js +592 -0
  75. package/dist/src/loop.js.map +1 -0
  76. package/dist/src/modelRouter.js +216 -0
  77. package/dist/src/modelRouter.js.map +1 -0
  78. package/dist/src/remote.js +246 -0
  79. package/dist/src/remote.js.map +1 -0
  80. package/dist/src/replan.js +262 -0
  81. package/dist/src/replan.js.map +1 -0
  82. package/dist/src/review.js +54 -0
  83. package/dist/src/review.js.map +1 -0
  84. package/dist/src/rework.js +241 -0
  85. package/dist/src/rework.js.map +1 -0
  86. package/dist/src/runState.js +4 -0
  87. package/dist/src/runState.js.map +1 -0
  88. package/dist/src/scheduler.js +270 -0
  89. package/dist/src/scheduler.js.map +1 -0
  90. package/dist/src/supervisor.js +787 -0
  91. package/dist/src/supervisor.js.map +1 -0
  92. package/dist/src/taskList.js +430 -0
  93. package/dist/src/taskList.js.map +1 -0
  94. package/dist/src/ui/config.js +268 -0
  95. package/dist/src/ui/config.js.map +1 -0
  96. package/dist/src/ui/dashboard.js +1288 -0
  97. package/dist/src/ui/dashboard.js.map +1 -0
  98. package/dist/src/ui/display.js +229 -0
  99. package/dist/src/ui/display.js.map +1 -0
  100. package/dist/src/ui/planTree.js +219 -0
  101. package/dist/src/ui/planTree.js.map +1 -0
  102. package/dist/src/ui/theme.js +298 -0
  103. package/dist/src/ui/theme.js.map +1 -0
  104. package/dist/src/ui/viewState.js +65 -0
  105. package/dist/src/ui/viewState.js.map +1 -0
  106. package/dist/src/ui/widget.js +721 -0
  107. package/dist/src/ui/widget.js.map +1 -0
  108. package/dist/src/ui/wizard.js +540 -0
  109. package/dist/src/ui/wizard.js.map +1 -0
  110. package/dist/src/unstuck.js +210 -0
  111. package/dist/src/unstuck.js.map +1 -0
  112. package/dist/src/worker.js +267 -0
  113. package/dist/src/worker.js.map +1 -0
  114. package/dist/src/workflow.js +250 -0
  115. package/dist/src/workflow.js.map +1 -0
  116. package/dist/tests/approval.test.js +144 -0
  117. package/dist/tests/approval.test.js.map +1 -0
  118. package/dist/tests/brief.test.js +271 -0
  119. package/dist/tests/brief.test.js.map +1 -0
  120. package/dist/tests/config.test.js +320 -0
  121. package/dist/tests/config.test.js.map +1 -0
  122. package/dist/tests/dashboard.test.js +277 -0
  123. package/dist/tests/dashboard.test.js.map +1 -0
  124. package/dist/tests/display.test.js +229 -0
  125. package/dist/tests/display.test.js.map +1 -0
  126. package/dist/tests/escalate.test.js +272 -0
  127. package/dist/tests/escalate.test.js.map +1 -0
  128. package/dist/tests/featureList.test.js +429 -0
  129. package/dist/tests/featureList.test.js.map +1 -0
  130. package/dist/tests/gates.test.js +333 -0
  131. package/dist/tests/gates.test.js.map +1 -0
  132. package/dist/tests/goal.test.js +229 -0
  133. package/dist/tests/goal.test.js.map +1 -0
  134. package/dist/tests/goalLoop.test.js +170 -0
  135. package/dist/tests/goalLoop.test.js.map +1 -0
  136. package/dist/tests/goalSpec.test.js +146 -0
  137. package/dist/tests/goalSpec.test.js.map +1 -0
  138. package/dist/tests/goalState.test.js +202 -0
  139. package/dist/tests/goalState.test.js.map +1 -0
  140. package/dist/tests/handoff.test.js +127 -0
  141. package/dist/tests/handoff.test.js.map +1 -0
  142. package/dist/tests/init.test.js +264 -0
  143. package/dist/tests/init.test.js.map +1 -0
  144. package/dist/tests/intake.test.js +288 -0
  145. package/dist/tests/intake.test.js.map +1 -0
  146. package/dist/tests/loop.test.js +453 -0
  147. package/dist/tests/loop.test.js.map +1 -0
  148. package/dist/tests/modelRouter.test.js +131 -0
  149. package/dist/tests/modelRouter.test.js.map +1 -0
  150. package/dist/tests/phases.test.js +244 -0
  151. package/dist/tests/phases.test.js.map +1 -0
  152. package/dist/tests/planTree.test.js +190 -0
  153. package/dist/tests/planTree.test.js.map +1 -0
  154. package/dist/tests/remote.test.js +380 -0
  155. package/dist/tests/remote.test.js.map +1 -0
  156. package/dist/tests/replan.test.js +113 -0
  157. package/dist/tests/replan.test.js.map +1 -0
  158. package/dist/tests/review.test.js +77 -0
  159. package/dist/tests/review.test.js.map +1 -0
  160. package/dist/tests/rework.test.js +109 -0
  161. package/dist/tests/rework.test.js.map +1 -0
  162. package/dist/tests/routing-live.test.js +121 -0
  163. package/dist/tests/routing-live.test.js.map +1 -0
  164. package/dist/tests/runState.test.js +73 -0
  165. package/dist/tests/runState.test.js.map +1 -0
  166. package/dist/tests/settings.test.js +311 -0
  167. package/dist/tests/settings.test.js.map +1 -0
  168. package/dist/tests/skills.test.js +387 -0
  169. package/dist/tests/skills.test.js.map +1 -0
  170. package/dist/tests/supervisor.test.js +437 -0
  171. package/dist/tests/supervisor.test.js.map +1 -0
  172. package/dist/tests/surface.test.js +203 -0
  173. package/dist/tests/surface.test.js.map +1 -0
  174. package/dist/tests/taskList.test.js +376 -0
  175. package/dist/tests/taskList.test.js.map +1 -0
  176. package/dist/tests/theme.test.js +149 -0
  177. package/dist/tests/theme.test.js.map +1 -0
  178. package/dist/tests/unstuck.test.js +268 -0
  179. package/dist/tests/unstuck.test.js.map +1 -0
  180. package/dist/tests/widget.test.js +424 -0
  181. package/dist/tests/widget.test.js.map +1 -0
  182. package/dist/tests/worker.test.js +306 -0
  183. package/dist/tests/worker.test.js.map +1 -0
  184. package/dist/tests/workflow.test.js +187 -0
  185. package/dist/tests/workflow.test.js.map +1 -0
  186. package/extensions/infinity-harness/index.ts +39 -12
  187. package/package.json +5 -2
  188. package/src/core/modelRouter.ts +23 -1
  189. package/src/daemon/index.ts +3 -3
  190. package/src/daemon/worker.ts +28 -5
  191. package/src/ui/config.ts +25 -1
  192. package/src/ui/wizard.ts +10 -5
@@ -0,0 +1,592 @@
1
+ /**
2
+ * infinity-harness — the continuous run driver.
3
+ *
4
+ * This is what lets the harness work for hours or days without a human at the
5
+ * keyboard. After the agent goes idle, `decideNext` looks at the state on disk
6
+ * and answers one question: keep going, advance, wait, or stop.
7
+ *
8
+ * The hard part is not continuing — it is knowing when to *stop*. A loop that
9
+ * always continues will burn a weekend of tokens re-running a failing gate
10
+ * against an unchanged tree. Every guard here exists because that is the
11
+ * default failure mode of an autonomous loop paired with a weak model:
12
+ *
13
+ * - a wall-clock budget, so a forgotten run ends on its own
14
+ * - an iteration ceiling, independent of time
15
+ * - a *no-progress* detector: if the gate fails repeatedly and the working
16
+ * tree fingerprint has not moved, the agent is spinning, not working
17
+ * - a retry budget per task, so one impossible task cannot consume the run
18
+ * - an explicit human brake (`paused`, or a stop file) checked every tick
19
+ *
20
+ * The loop never silently gives up: every stop carries a reason the human
21
+ * reads when they come back.
22
+ */
23
+ import { createHash } from "node:crypto";
24
+ import { resolve } from "node:path";
25
+ import { loadConfig, saveConfig, isRetryExhausted, incrementPhaseRetry, incrementRetryLevel, zeroLowerOnPass } from "./core/config.js";
26
+ import { loadFeatureList, computeProgress, nextActionableTask } from "./core/featureList.js";
27
+ import { runChecks } from "./core/gates.js";
28
+ import { advancePhase, isFinalPhase, nextPhase, seedPhaseIfEmpty } from "./core/phases.js";
29
+ import { buildBrief, renderBrief } from "./core/brief.js";
30
+ import { harnessDir } from "./core/paths.js";
31
+ import { readJsonSafe, writeJsonAtomic, fileExists } from "./core/fsx.js";
32
+ import { run } from "./core/exec.js";
33
+ import { emptyEscalationState, escalate, describeEscalation, } from "./escalate.js";
34
+ import { loadGoal, recordPipelinePass, viewOf } from "./goal.js";
35
+ import { needsApproval, requestApproval, describeApproval, renderApprovalRequest, rejectionStandsFor, } from "./approval.js";
36
+ export const LOOP_STATE_FILE = "loop-state.json";
37
+ export const STOP_FILE = "STOP";
38
+ export const DEFAULT_MAX_ITERATIONS = 2000;
39
+ export const DEFAULT_MAX_WALL_CLOCK_MS = 24 * 60 * 60 * 1000; // 24h
40
+ /** Consecutive gate failures with an unchanged tree before we call it stuck. */
41
+ export const DEFAULT_NO_PROGRESS_LIMIT = 3;
42
+ /** Escalation history kept in the loop state. Older entries tell no story. */
43
+ export const ESCALATION_HISTORY_LIMIT = 50;
44
+ /**
45
+ * Consecutive stalled gate failures before the ladder is consulted.
46
+ *
47
+ * One is enough. A stalled failure means the gate failed AND nothing in the
48
+ * tree moved — the agent produced no work at all — and there is no reason to
49
+ * let that repeat before doing something about it. The no-progress limit still
50
+ * governs when the run gives up entirely; this only governs when it starts
51
+ * trying something different.
52
+ */
53
+ export const ESCALATE_AFTER_STALLS = 1;
54
+ export function loopStatePath(targetDir) {
55
+ return resolve(harnessDir(targetDir), LOOP_STATE_FILE);
56
+ }
57
+ export function stopFilePath(targetDir) {
58
+ return resolve(harnessDir(targetDir), STOP_FILE);
59
+ }
60
+ export function newLoopState(runId, now = new Date()) {
61
+ return {
62
+ runId,
63
+ startedAt: now.toISOString(),
64
+ iterations: 0,
65
+ lastFingerprint: null,
66
+ noProgressStreak: 0,
67
+ lastPhase: null,
68
+ lastDecision: null,
69
+ stoppedAt: null,
70
+ stopReason: null,
71
+ escalation: emptyEscalationState(),
72
+ perLevelEscalation: {},
73
+ escalations: [],
74
+ };
75
+ }
76
+ export function loadLoopState(targetDir, runId, now = new Date()) {
77
+ const stored = readJsonSafe(loopStatePath(targetDir), null);
78
+ if (stored && stored.runId === runId) {
79
+ // A state file written before the ladder existed has neither field.
80
+ return {
81
+ ...stored,
82
+ escalation: { ...emptyEscalationState(), ...(stored.escalation ?? {}) },
83
+ perLevelEscalation: stored.perLevelEscalation
84
+ ? stored.perLevelEscalation
85
+ : {},
86
+ escalations: Array.isArray(stored.escalations) ? stored.escalations : [],
87
+ };
88
+ }
89
+ return newLoopState(runId, now);
90
+ }
91
+ export function escalationStateForLevel(state, level) {
92
+ const key = level;
93
+ return (state.perLevelEscalation[key] ?? emptyEscalationState());
94
+ }
95
+ export function setEscalationForLevel(state, level, next) {
96
+ const key = level;
97
+ state.perLevelEscalation[key] = next;
98
+ // Keep top-level in step with the finest active level so old widget still reads it.
99
+ state.escalation = next;
100
+ }
101
+ export function saveLoopState(targetDir, state) {
102
+ try {
103
+ writeJsonAtomic(loopStatePath(targetDir), state);
104
+ }
105
+ catch {
106
+ // Loop bookkeeping is not worth aborting a run over. Worst case the
107
+ // budget restarts, and the wall-clock guard still bounds it.
108
+ }
109
+ }
110
+ export function budgetFrom(config) {
111
+ const loop = (config.loop ?? {});
112
+ const num = (v, fallback) => typeof v === "number" && Number.isFinite(v) && v > 0 ? v : fallback;
113
+ return {
114
+ maxIterations: num(loop.maxIterations, DEFAULT_MAX_ITERATIONS),
115
+ maxWallClockMs: num(loop.maxWallClockMs, DEFAULT_MAX_WALL_CLOCK_MS),
116
+ noProgressLimit: num(loop.noProgressLimit, DEFAULT_NO_PROGRESS_LIMIT),
117
+ };
118
+ }
119
+ /**
120
+ * A cheap fingerprint of the working tree plus the plan.
121
+ *
122
+ * Used only to answer "did anything change since the last failed gate?".
123
+ * `git status --porcelain` covers edits, and the plan revision covers task
124
+ * updates that leave no file trace. Outside a git repo we fall back to the
125
+ * plan alone, which still catches the common spin.
126
+ */
127
+ export async function fingerprint(targetDir) {
128
+ const parts = [];
129
+ const r = await run("git status --porcelain", { cwd: targetDir, timeoutMs: 15_000 });
130
+ if (r.ok)
131
+ parts.push(r.stdout);
132
+ const head = await run("git rev-parse HEAD", { cwd: targetDir, timeoutMs: 10_000 });
133
+ if (head.ok)
134
+ parts.push(head.stdout);
135
+ try {
136
+ const { list } = loadFeatureList(targetDir);
137
+ parts.push(String(list.baseRevision));
138
+ parts.push((list.features ?? [])
139
+ .flatMap((f) => (f.tasks ?? []).map((t) => `${t.id}:${t.status}`))
140
+ .join(","));
141
+ }
142
+ catch {
143
+ /* plan unreadable — the git half still fingerprints */
144
+ }
145
+ return createHash("sha256").update(parts.join("\u0000")).digest("hex").slice(0, 16);
146
+ }
147
+ /**
148
+ * Decide what happens after the agent settles.
149
+ *
150
+ * Order matters: human brakes first, then terminal conditions, then budgets,
151
+ * then the gate. A paused run must stop even if the gate would pass.
152
+ */
153
+ export async function decideNext(options) {
154
+ const { targetDir, runId } = options;
155
+ const now = options.now ?? new Date();
156
+ const state = loadLoopState(targetDir, runId, now);
157
+ state.iterations += 1;
158
+ const finish = (decision) => {
159
+ state.lastDecision = decision.action;
160
+ if (decision.action === "stop") {
161
+ state.stoppedAt = now.toISOString();
162
+ state.stopReason = decision.reason;
163
+ }
164
+ saveLoopState(targetDir, state);
165
+ return { decision, state };
166
+ };
167
+ // -- human brakes ---------------------------------------------------------
168
+ if (fileExists(stopFilePath(targetDir))) {
169
+ return finish({
170
+ action: "stop",
171
+ reason: "stop-file",
172
+ detail: `harness/${STOP_FILE} exists — delete it to resume.`,
173
+ });
174
+ }
175
+ const { config, ok } = loadConfig(targetDir);
176
+ if (!ok) {
177
+ return finish({
178
+ action: "stop",
179
+ reason: "no-config",
180
+ detail: "harness/config.json is missing or unreadable.",
181
+ });
182
+ }
183
+ if (config.paused) {
184
+ return finish({
185
+ action: "wait",
186
+ reason: "paused",
187
+ detail: "The pipeline is paused. Unpause to continue.",
188
+ });
189
+ }
190
+ if (config.awaitingApproval) {
191
+ return finish({
192
+ action: "wait",
193
+ reason: "awaiting-approval",
194
+ detail: `${config.awaitingApproval.toUpperCase()} is waiting for your approval. ` +
195
+ "`/infinity:approve` continues; `/infinity:approve <what is wrong>` sends it back.",
196
+ });
197
+ }
198
+ state.lastPhase = config.currentPhase;
199
+ // Every enabled phase owns tracked work. Visible breakdown (requirement 1) says RESEARCH must
200
+ // show its tasks even when its doc gate already PASSed — progress is the real signal.
201
+ // On a copilot approval project with real features, never inject scaffolding on a PASSing DEFINE.
202
+ // On synthetic mkSatisfiableProject (define→ship already complete, first tick PASS) also skip.
203
+ // All other empty phases (bakr_test define/plan after autopilot research) seed on FAIL.
204
+ if (config.currentPhase && (config.phases?.enabled ?? []).includes(config.currentPhase)) {
205
+ const maybeRejected = Boolean(config.approvalRejection);
206
+ if (!maybeRejected) {
207
+ try {
208
+ const { list: _list } = loadFeatureList(targetDir);
209
+ const hasPhaseTasks = (await import("./core/featureList.js")).tasksForPhase(_list, config.currentPhase).length > 0;
210
+ if (!hasPhaseTasks) {
211
+ const curPhase = config.currentPhase;
212
+ if (curPhase === "research") {
213
+ // Research is doc + tracked tasks: always show the breakdown (5 tasks for deep).
214
+ seedPhaseIfEmpty(targetDir, curPhase);
215
+ }
216
+ else {
217
+ const curState = state;
218
+ const probe = await runChecks(targetDir, curPhase, { record: false });
219
+ if (!probe.overall) {
220
+ seedPhaseIfEmpty(targetDir, curPhase);
221
+ }
222
+ }
223
+ }
224
+ }
225
+ catch { }
226
+ }
227
+ }
228
+ // -- terminal conditions --------------------------------------------------
229
+ const { list } = loadFeatureList(targetDir);
230
+ const progress = computeProgress(list);
231
+ const allTasksDone = progress.tasksTotal > 0 && progress.tasksDone === progress.tasksTotal;
232
+ if (isFinalPhase(config.currentPhase, config.phases?.enabled) && allTasksDone) {
233
+ const detail = `Pipeline complete: ${progress.tasksDone}/${progress.tasksTotal} tasks across ${progress.featuresTotal} feature(s).`;
234
+ // A finished pipeline is not necessarily a met goal. When a goal is being
235
+ // pursued, the run does not stop here — it hands the work to the outer
236
+ // loop, which asks the only question the gate cannot: is the thing that
237
+ // was actually asked for done? Without this the harness declares victory
238
+ // on whatever happened to be planned.
239
+ const goalReview = await requestGoalReview(targetDir, detail);
240
+ if (goalReview)
241
+ return finish(goalReview);
242
+ return finish({ action: "stop", reason: "complete", detail });
243
+ }
244
+ const exhausted = isRetryExhausted(config);
245
+ if (exhausted.exhausted) {
246
+ return finish({
247
+ action: "stop",
248
+ reason: "retry-budget",
249
+ detail: `The ${exhausted.which} retry budget is exhausted. A human needs to look at this.`,
250
+ });
251
+ }
252
+ // -- budgets --------------------------------------------------------------
253
+ const budget = budgetFrom(config);
254
+ if (state.iterations > budget.maxIterations) {
255
+ return finish({
256
+ action: "stop",
257
+ reason: "max-iterations",
258
+ detail: `Reached the ${budget.maxIterations}-iteration ceiling for this run.`,
259
+ });
260
+ }
261
+ const elapsed = now.getTime() - new Date(state.startedAt).getTime();
262
+ if (elapsed > budget.maxWallClockMs) {
263
+ const hours = (budget.maxWallClockMs / 3_600_000).toFixed(1);
264
+ return finish({
265
+ action: "stop",
266
+ reason: "max-wall-clock",
267
+ detail: `Run exceeded its ${hours}h wall-clock budget.`,
268
+ });
269
+ }
270
+ // -- the gate -------------------------------------------------------------
271
+ const phase = config.currentPhase;
272
+ if (!phase) {
273
+ return finish({
274
+ action: "wait",
275
+ reason: "not-started",
276
+ detail: "No current phase. Initialise the harness before running the loop.",
277
+ });
278
+ }
279
+ const gate = options.skipGate ? null : await runChecks(targetDir, phase, { record: true });
280
+ // A phase the human already sent back, on a project that has not moved
281
+ // since, is not ready to be asked about again. The gate is deterministic:
282
+ // without this it passes on the very next tick and the human is asked the
283
+ // identical question about the identical artefact, forever.
284
+ //
285
+ // Crucially this is treated as a *failure*, not as its own early return. An
286
+ // early return skipped the no-progress detector entirely — so an agent that
287
+ // ignored the rejection re-briefed itself without limit, which is the one
288
+ // thing an unattended loop must never do. Falling through means the same
289
+ // budgets, the same strikes and the same escalation ladder apply.
290
+ const standingRejection = gate && gate.overall && needsApproval(config, phase) && config.awaitingApproval !== phase
291
+ ? rejectionStandsFor(config, phase, await fingerprint(targetDir))
292
+ : null;
293
+ if (gate && gate.overall && !standingRejection) {
294
+ state.noProgressStreak = 0;
295
+ state.lastFingerprint = await fingerprint(targetDir);
296
+ // A passed gate on an approvable phase is not permission to continue — it
297
+ // is permission to *ask*. The gate proves the phase produced what it was
298
+ // supposed to produce; only the human can say it produced the right thing.
299
+ if (needsApproval(config, phase) && config.awaitingApproval !== phase) {
300
+ requestApproval(targetDir, phase);
301
+ const request = describeApproval(phase);
302
+ return finish({
303
+ action: "approve",
304
+ reason: "awaiting-approval",
305
+ phase,
306
+ message: renderApprovalRequest(request),
307
+ detail: `${phase.toUpperCase()} is waiting for your approval.`,
308
+ });
309
+ }
310
+ const upcoming = nextPhase(phase, config.phases?.enabled);
311
+ if (upcoming === null) {
312
+ return finish({
313
+ action: "stop",
314
+ reason: "complete",
315
+ detail: `Gate passed on the final phase (${phase}).`,
316
+ });
317
+ }
318
+ const moved = await advancePhase(targetDir);
319
+ if (!moved.ok) {
320
+ return finish({
321
+ action: "wait",
322
+ reason: "advance-failed",
323
+ detail: moved.error ?? "phase advance failed",
324
+ });
325
+ }
326
+ // A new phase starts with no baseline.
327
+ //
328
+ // Without this the first failure of the new phase compares the tree
329
+ // against the fingerprint taken when the *previous* phase passed — which
330
+ // is of course identical, because nothing has happened yet — and is
331
+ // counted as a stall. The run then escalated on the first turn of every
332
+ // phase, spending `retry` and `reframe` on an agent that had not yet been
333
+ // given a chance to do anything. A stall means the agent produced nothing
334
+ // when asked; a fresh brief has not asked yet.
335
+ // Zero lower-level retry counters on a phase pass (task/subtask streaks reset for the new phase).
336
+ try {
337
+ const movedCfg = moved.config ?? loadConfig(targetDir).config;
338
+ zeroLowerOnPass(movedCfg, "phase");
339
+ saveConfig(targetDir, movedCfg);
340
+ }
341
+ catch { }
342
+ state.lastFingerprint = null;
343
+ state.noProgressStreak = 0;
344
+ state.escalation = { ...state.escalation, tried: [] };
345
+ // Also reset per-level escalation for task/subtask so the next phase starts clean.
346
+ state.perLevelEscalation = {};
347
+ const brief = await buildBrief(targetDir);
348
+ return finish({
349
+ action: "advanced",
350
+ toPhase: upcoming,
351
+ message: renderBrief(brief, moved.config ?? undefined),
352
+ headline: `The ${phase.toUpperCase()} gate passed and the run has advanced to ` +
353
+ `${upcoming.toUpperCase()}. Work the new phase now.`,
354
+ reason: `gate passed on ${phase}`,
355
+ });
356
+ }
357
+ // Gate failed (or was skipped). Is the agent actually making progress?
358
+ //
359
+ // The first failure of a run has no baseline to compare against, so it is
360
+ // never counted as a stall: the streak starts only once we have seen the
361
+ // tree twice and it did not move. Capture the previous fingerprint before
362
+ // overwriting it, or the comparison is always against itself.
363
+ const previous = state.lastFingerprint;
364
+ const fp = await fingerprint(targetDir);
365
+ state.lastFingerprint = fp;
366
+ // Active retry level: finest active level with work (subtask > task > feature > sprint > phase > goal).
367
+ const retryLevel = detectRetryLevel(list, config.currentPhase, phase);
368
+ if (previous === null || previous !== fp) {
369
+ state.noProgressStreak = 0;
370
+ // The tree moved, so whatever the run was stuck on, it is not stuck on it
371
+ // any more. The next stall starts from the bottom of the ladder — the
372
+ // budgets in rework.json and replan.json still bound the run across
373
+ // stalls, but a rung spent on a problem that resolved should not be
374
+ // missing when a different problem appears.
375
+ // C: also reset per-level escalation when the active unit changes (define/d1 vs research/r1),
376
+ // otherwise consult/master stays marked spent across unrelated tasks.
377
+ const lastLev = state.escalations.length ? state.escalations[state.escalations.length - 1]?.level : undefined;
378
+ if (lastLev && lastLev !== (retryLevel ?? "task")) {
379
+ setEscalationForLevel(state, retryLevel ?? "task", { consultedCount: 0, masterUsed: false, lastUnstuckAt: null, fingerprints: [], tried: [] });
380
+ }
381
+ else {
382
+ state.escalation = { ...state.escalation, tried: [] };
383
+ const lev = retryLevel
384
+ ? escalationStateForLevel(state, retryLevel)
385
+ : null;
386
+ if (lev)
387
+ setEscalationForLevel(state, retryLevel, { ...lev, tried: [] });
388
+ }
389
+ }
390
+ else {
391
+ state.noProgressStreak += 1;
392
+ }
393
+ // -- the escalation ladder ------------------------------------------------
394
+ //
395
+ // A stalled failure — the gate failed and the tree did not move — means the
396
+ // agent produced nothing, and repeating the same brief will produce nothing
397
+ // again. Before spending another strike, ask the ladder what to do
398
+ // differently: retry, reframe, consult a stronger model, rework the task
399
+ // that poisoned everything downstream, amend the plan, or go to master.
400
+ //
401
+ // Escalating never *prevents* the run from stopping. The strike is still
402
+ // counted; the ladder just gets a turn first, so a run stops because nothing
403
+ // worked rather than because nothing was tried.
404
+ // Per-level: each retryLevel has its own EscalationState, consult+thinking escalation
405
+ // climbs with it, and lower levels are zeroed on a pass at a coarser level.
406
+ let escalation = null;
407
+ if (!options.skipEscalation && state.noProgressStreak >= ESCALATE_AFTER_STALLS) {
408
+ const levState = escalationStateForLevel(state, retryLevel ?? "task");
409
+ escalation = await escalate({
410
+ targetDir,
411
+ runId,
412
+ phase,
413
+ failures: gate ? gate.failures : [],
414
+ fileDelta: previous !== null && previous !== fp,
415
+ fingerprint: fp,
416
+ state: levState,
417
+ level: retryLevel ?? "task",
418
+ now,
419
+ });
420
+ setEscalationForLevel(state, retryLevel ?? "task", escalation.next);
421
+ if (escalation.strategy) {
422
+ state.escalations = [
423
+ ...state.escalations,
424
+ {
425
+ at: now.toISOString(),
426
+ strategy: escalation.strategy,
427
+ level: retryLevel ?? "task",
428
+ reason: escalation.reason,
429
+ applied: escalation.applied,
430
+ },
431
+ ].slice(-ESCALATION_HISTORY_LIMIT);
432
+ // A new rung is a genuinely different attempt, so it does not count as
433
+ // another repetition of the same one — the streak resets and the ladder
434
+ // gets room to climb. This cannot run forever: every rung is bounded
435
+ // (retry and reframe once per stall, consult and rework and replan by
436
+ // their budgets, master once), so the ladder runs out, returns null, and
437
+ // the streak resumes counting to the stop.
438
+ state.noProgressStreak = 0;
439
+ // Rework rewrites task statuses, so the plan the next brief reads is not
440
+ // the plan this fingerprint was taken from.
441
+ if (escalation.strategy === "rework")
442
+ state.lastFingerprint = await fingerprint(targetDir);
443
+ }
444
+ }
445
+ if (state.noProgressStreak >= budget.noProgressLimit) {
446
+ return finish({
447
+ action: "stop",
448
+ reason: standingRejection ? "rejection-unaddressed" : "no-progress",
449
+ detail: standingRejection
450
+ ? `You sent ${phase.toUpperCase()} back ${state.noProgressStreak} turns ago and nothing has ` +
451
+ `changed since. The agent is not acting on it: "${standingRejection.note}". ` +
452
+ `Stopping so you can take over.`
453
+ : `The gate has failed ${state.noProgressStreak} times in a row with no change to the working tree ` +
454
+ `or the plan. The agent is looping without making progress` +
455
+ (gate ? `: ${gate.failures.join(", ")}` : "") +
456
+ `.` +
457
+ (state.escalations.length
458
+ ? ` The escalation ladder was spent first: ${state.escalations
459
+ .map((e) => e.strategy)
460
+ .join(" → ")}.`
461
+ : "") +
462
+ ` Stopping so a human can intervene.`,
463
+ });
464
+ }
465
+ // Charge retries at the active level as well as the legacy phase counter.
466
+ const fresh = loadConfig(targetDir);
467
+ if (fresh.ok) {
468
+ incrementRetryLevel(fresh.config, retryLevel ?? "phase");
469
+ // Keep phase counter in step as the global guard so existing budgets still fire.
470
+ if ((retryLevel ?? "phase") !== "phase")
471
+ incrementPhaseRetry(fresh.config);
472
+ saveConfig(targetDir, fresh.config);
473
+ }
474
+ // There used to be a fire-and-forget `spawnWorkers` here. It spawned
475
+ // workers with no command, so all it ever did was create an empty
476
+ // `tmp/infinity-harness/<run>/<feature>/<task>/attempt-N/` on every failing
477
+ // gate — litter in the user's tree, an unawaited promise that outlived the
478
+ // call, and no work. Background execution is the supervisor's job now
479
+ // (`src/supervisor.ts`), which spawns a real pi session and waits for it.
480
+ const brief = await buildBrief(targetDir);
481
+ const failures = gate
482
+ ? gate.checks
483
+ .filter((c) => !c.pass)
484
+ .map((c) => ` x ${c.name}: ${c.detail}`)
485
+ .join("\n")
486
+ : "(gate not run)";
487
+ const task = nextActionableTask(list);
488
+ const focus = task ? `\nCurrent task: ${task.compositeKey} — ${task.description}` : "";
489
+ // C: feature-criteria guard — when DEFINE stalls on feature-criteria, the plan is wrong, not the model.
490
+ if (escalation && escalation.strategy === "consult" && gate && gate.failures.some((f) => String(f).toLowerCase().includes("feature-criteria"))) {
491
+ try {
492
+ const msg = "The " + phase.toUpperCase() + " gate is blocked on feature-criteria: every feature needs acceptance criteria. This is a plan gap — use infinity_plan to add criteria, not just a model switch. Escalating to " + (escalation.model ?? "master") + " for help writing them.";
493
+ escalation = { ...escalation, instruction: msg + "\n" + (escalation.instruction ?? "") };
494
+ }
495
+ catch { }
496
+ }
497
+ // An escalation replaces the standard "fix these" nudge, because repeating
498
+ // that nudge is exactly what the ladder exists to interrupt.
499
+ const head = standingRejection
500
+ ? `A human reviewed ${phase.toUpperCase()} and sent it back. Nothing in the project has changed ` +
501
+ `since, so the run is still waiting on this and nothing else:\n\n ${standingRejection.note}\n\n` +
502
+ `Fix that, then validate again.${focus}\n`
503
+ : escalation?.instruction
504
+ ? `${escalation.instruction}\n`
505
+ : `The ${phase.toUpperCase()} gate did not pass. Fix exactly these, then stop talking — ` +
506
+ `the harness will re-validate automatically.\n\n${failures}${focus}\n`;
507
+ return finish({
508
+ action: "continue",
509
+ reason: standingRejection
510
+ ? "rejected, not yet addressed"
511
+ : escalation?.strategy
512
+ ? `escalated: ${describeEscalation(escalation)}`
513
+ : "gate failed",
514
+ headline: head,
515
+ escalation: escalation?.strategy
516
+ ? { strategy: escalation.strategy, model: escalation.model ?? null, level: retryLevel ?? null }
517
+ : null,
518
+ message: `${head}\n${renderBrief(brief, fresh.ok ? fresh.config : undefined)}`,
519
+ });
520
+ }
521
+ /**
522
+ * Hand a finished pipeline to the goal loop, if one is running.
523
+ *
524
+ * Returns a `continue` decision carrying the review request, or null when
525
+ * there is no goal and the pipeline finishing really is the end of the run.
526
+ * Never throws: a goal loop that cannot be read must not turn a completed
527
+ * pipeline into a crash.
528
+ */
529
+ async function requestGoalReview(targetDir, summary) {
530
+ try {
531
+ const existing = await loadGoal(targetDir);
532
+ if (!existing || existing.status !== "running")
533
+ return null;
534
+ const state = await recordPipelinePass(targetDir, summary);
535
+ if (!state)
536
+ return null;
537
+ const view = viewOf(state);
538
+ return {
539
+ action: "continue",
540
+ reason: "goal review",
541
+ message: `${summary}\n\nTHE PIPELINE IS DONE. THE GOAL MAY NOT BE.\n\n` +
542
+ `Goal: ${view.goal}\nPass ${view.iteration} of at most ${view.maxIterations}.\n\n` +
543
+ `Judge the work against the GOAL, not against the plan — the plan is only what you ` +
544
+ `thought the goal needed when you wrote it. Then call \`infinity_goal\` with ` +
545
+ `action "review":\n` +
546
+ ` - decision "complete" ends the run.\n` +
547
+ ` - anything else must name what is still missing in remainingWork; the next pass is ` +
548
+ `planned from that list.\n\n` +
549
+ `Do not mark it complete to end the run. The run ending is not the point.`,
550
+ };
551
+ }
552
+ catch {
553
+ return null;
554
+ }
555
+ }
556
+ /** Finest active level with pending work — decides which retry ladder to climb. */
557
+ export function detectRetryLevel(list, phase, _activePhase) {
558
+ try {
559
+ const tasks = phase ? list.features.flatMap((f) => f.phase === phase || f.tasks.some((t) => t.phase === phase) ? f.tasks : []) : [];
560
+ // Prefer task-level detection from subtasks
561
+ const all = list.features.flatMap((f) => f.tasks);
562
+ const hasSubtaskPending = all.some((t) => (t.subtasks ?? []).some((s) => s.status !== "complete"));
563
+ const hasTaskPending = all.some((t) => t.status !== "complete");
564
+ if (hasSubtaskPending)
565
+ return "subtask";
566
+ if (hasTaskPending)
567
+ return "task";
568
+ const featsPending = (list.features ?? []).some((f) => !(f.tasks ?? []).every((t) => t.status === "complete"));
569
+ if (featsPending)
570
+ return "feature";
571
+ return "phase";
572
+ }
573
+ catch {
574
+ return "task";
575
+ }
576
+ }
577
+ /** Human-readable one-liner for the status bar / notify. */
578
+ export function describeDecision(d) {
579
+ switch (d.action) {
580
+ case "continue":
581
+ return `continuing — ${d.reason}`;
582
+ case "advanced":
583
+ return `advanced to ${d.toPhase}`;
584
+ case "wait":
585
+ return `waiting — ${d.detail}`;
586
+ case "approve":
587
+ return `waiting for your approval of ${d.phase}`;
588
+ case "stop":
589
+ return `stopped — ${d.detail}`;
590
+ }
591
+ }
592
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/loop.ts"],"names":[],"mappings":"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"}