loopforge 3.0.0 → 3.2.1

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 (178) hide show
  1. package/README.md +128 -145
  2. package/dist/audit.d.ts +50 -0
  3. package/dist/audit.d.ts.map +1 -0
  4. package/dist/audit.js +158 -0
  5. package/dist/audit.js.map +1 -0
  6. package/dist/canonical-state.d.ts +28 -20
  7. package/dist/canonical-state.d.ts.map +1 -1
  8. package/dist/canonical-state.js +82 -173
  9. package/dist/canonical-state.js.map +1 -1
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +25 -16
  12. package/dist/cli.js.map +1 -1
  13. package/dist/cognitive-governance.d.ts +25 -33
  14. package/dist/cognitive-governance.d.ts.map +1 -1
  15. package/dist/cognitive-governance.js +38 -138
  16. package/dist/cognitive-governance.js.map +1 -1
  17. package/dist/enforcement-gate.d.ts +76 -0
  18. package/dist/enforcement-gate.d.ts.map +1 -0
  19. package/dist/enforcement-gate.js +1071 -0
  20. package/dist/enforcement-gate.js.map +1 -0
  21. package/dist/engine.d.ts +99 -0
  22. package/dist/engine.d.ts.map +1 -0
  23. package/dist/engine.js +839 -0
  24. package/dist/engine.js.map +1 -0
  25. package/dist/evidence-claims.d.ts +50 -0
  26. package/dist/evidence-claims.d.ts.map +1 -0
  27. package/dist/evidence-claims.js +134 -0
  28. package/dist/evidence-claims.js.map +1 -0
  29. package/dist/evidence-provider.d.ts +21 -23
  30. package/dist/evidence-provider.d.ts.map +1 -1
  31. package/dist/evidence-provider.js +74 -34
  32. package/dist/evidence-provider.js.map +1 -1
  33. package/dist/generate-schema.js +1 -84
  34. package/dist/generate-schema.js.map +1 -1
  35. package/dist/index.d.ts +19 -22
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +16 -15
  38. package/dist/index.js.map +1 -1
  39. package/dist/loop-compiler.d.ts +41 -3
  40. package/dist/loop-compiler.d.ts.map +1 -1
  41. package/dist/loop-compiler.js +632 -273
  42. package/dist/loop-compiler.js.map +1 -1
  43. package/dist/loop-extras-parser.d.ts +2 -2
  44. package/dist/loop-extras-parser.d.ts.map +1 -1
  45. package/dist/loop-extras-parser.js +2 -2
  46. package/dist/loop-extras-parser.js.map +1 -1
  47. package/dist/loop-projection.d.ts +26 -0
  48. package/dist/loop-projection.d.ts.map +1 -0
  49. package/dist/loop-projection.js +142 -0
  50. package/dist/loop-projection.js.map +1 -0
  51. package/dist/loop-store.d.ts +112 -24
  52. package/dist/loop-store.d.ts.map +1 -1
  53. package/dist/loop-store.js +365 -218
  54. package/dist/loop-store.js.map +1 -1
  55. package/dist/mcp/round-lifecycle.d.ts +216 -0
  56. package/dist/mcp/round-lifecycle.d.ts.map +1 -0
  57. package/dist/mcp/round-lifecycle.js +926 -0
  58. package/dist/mcp/round-lifecycle.js.map +1 -0
  59. package/dist/mcp/server.d.ts +2 -1
  60. package/dist/mcp/server.d.ts.map +1 -1
  61. package/dist/mcp/server.js +28 -42
  62. package/dist/mcp/server.js.map +1 -1
  63. package/dist/mcp/session.d.ts +53 -101
  64. package/dist/mcp/session.d.ts.map +1 -1
  65. package/dist/mcp/session.js +306 -1105
  66. package/dist/mcp/session.js.map +1 -1
  67. package/dist/mcp/tools.d.ts +13 -16
  68. package/dist/mcp/tools.d.ts.map +1 -1
  69. package/dist/mcp/tools.js +479 -413
  70. package/dist/mcp/tools.js.map +1 -1
  71. package/dist/policy-metrics.d.ts +12 -17
  72. package/dist/policy-metrics.d.ts.map +1 -1
  73. package/dist/policy-metrics.js +95 -161
  74. package/dist/policy-metrics.js.map +1 -1
  75. package/dist/policy.d.ts +44 -35
  76. package/dist/policy.d.ts.map +1 -1
  77. package/dist/policy.js +31 -115
  78. package/dist/policy.js.map +1 -1
  79. package/dist/prompt-assembler.d.ts +37 -6
  80. package/dist/prompt-assembler.d.ts.map +1 -1
  81. package/dist/prompt-assembler.js +389 -160
  82. package/dist/prompt-assembler.js.map +1 -1
  83. package/dist/prompt-policy.d.ts +1 -8
  84. package/dist/prompt-policy.d.ts.map +1 -1
  85. package/dist/prompt-policy.js +8 -26
  86. package/dist/prompt-policy.js.map +1 -1
  87. package/dist/protocol.d.ts +357 -229
  88. package/dist/protocol.d.ts.map +1 -1
  89. package/dist/protocol.js +139 -15
  90. package/dist/protocol.js.map +1 -1
  91. package/dist/replay.d.ts +5 -13
  92. package/dist/replay.d.ts.map +1 -1
  93. package/dist/replay.js +19 -55
  94. package/dist/replay.js.map +1 -1
  95. package/dist/round-coordinator.d.ts +20 -24
  96. package/dist/round-coordinator.d.ts.map +1 -1
  97. package/dist/round-coordinator.js +99 -92
  98. package/dist/round-coordinator.js.map +1 -1
  99. package/dist/round-driver.d.ts +14 -13
  100. package/dist/round-driver.d.ts.map +1 -1
  101. package/dist/round-driver.js +26 -14
  102. package/dist/round-driver.js.map +1 -1
  103. package/dist/round-transaction.d.ts +15 -18
  104. package/dist/round-transaction.d.ts.map +1 -1
  105. package/dist/round-transaction.js +38 -47
  106. package/dist/round-transaction.js.map +1 -1
  107. package/dist/self-eval.d.ts +53 -0
  108. package/dist/self-eval.d.ts.map +1 -0
  109. package/dist/self-eval.js +284 -0
  110. package/dist/self-eval.js.map +1 -0
  111. package/dist/storage.d.ts +9 -4
  112. package/dist/storage.d.ts.map +1 -1
  113. package/dist/storage.js +18 -6
  114. package/dist/storage.js.map +1 -1
  115. package/dist/token-utils.d.ts +15 -3
  116. package/dist/token-utils.d.ts.map +1 -1
  117. package/dist/token-utils.js +24 -5
  118. package/dist/token-utils.js.map +1 -1
  119. package/dist/verification-gate.d.ts +108 -0
  120. package/dist/verification-gate.d.ts.map +1 -0
  121. package/dist/verification-gate.js +971 -0
  122. package/dist/verification-gate.js.map +1 -0
  123. package/loop_policy.json +44 -15
  124. package/package.json +5 -10
  125. package/skills/perception/SKILL.md +182 -199
  126. package/dist/canonical-event-writer.d.ts +0 -20
  127. package/dist/canonical-event-writer.d.ts.map +0 -1
  128. package/dist/canonical-event-writer.js +0 -131
  129. package/dist/canonical-event-writer.js.map +0 -1
  130. package/dist/compiler-subgoals.d.ts +0 -7
  131. package/dist/compiler-subgoals.d.ts.map +0 -1
  132. package/dist/compiler-subgoals.js +0 -93
  133. package/dist/compiler-subgoals.js.map +0 -1
  134. package/dist/derive-id.d.ts +0 -12
  135. package/dist/derive-id.d.ts.map +0 -1
  136. package/dist/derive-id.js +0 -31
  137. package/dist/derive-id.js.map +0 -1
  138. package/dist/mcp/session-projection.d.ts +0 -5
  139. package/dist/mcp/session-projection.d.ts.map +0 -1
  140. package/dist/mcp/session-projection.js +0 -18
  141. package/dist/mcp/session-projection.js.map +0 -1
  142. package/dist/mcp/session-queue.d.ts +0 -3
  143. package/dist/mcp/session-queue.d.ts.map +0 -1
  144. package/dist/mcp/session-queue.js +0 -18
  145. package/dist/mcp/session-queue.js.map +0 -1
  146. package/dist/mcp/session-types.d.ts +0 -72
  147. package/dist/mcp/session-types.d.ts.map +0 -1
  148. package/dist/mcp/session-types.js +0 -2
  149. package/dist/mcp/session-types.js.map +0 -1
  150. package/dist/round-commit-store.d.ts +0 -12
  151. package/dist/round-commit-store.d.ts.map +0 -1
  152. package/dist/round-commit-store.js +0 -13
  153. package/dist/round-commit-store.js.map +0 -1
  154. package/dist/round-gate.d.ts +0 -31
  155. package/dist/round-gate.d.ts.map +0 -1
  156. package/dist/round-gate.js +0 -259
  157. package/dist/round-gate.js.map +0 -1
  158. package/dist/round-recovery.d.ts +0 -17
  159. package/dist/round-recovery.d.ts.map +0 -1
  160. package/dist/round-recovery.js +0 -117
  161. package/dist/round-recovery.js.map +0 -1
  162. package/dist/round-report.d.ts +0 -16
  163. package/dist/round-report.d.ts.map +0 -1
  164. package/dist/round-report.js +0 -401
  165. package/dist/round-report.js.map +0 -1
  166. package/dist/runtime-services.d.ts +0 -59
  167. package/dist/runtime-services.d.ts.map +0 -1
  168. package/dist/runtime-services.js +0 -460
  169. package/dist/runtime-services.js.map +0 -1
  170. package/dist/vault-format.d.ts +0 -4
  171. package/dist/vault-format.d.ts.map +0 -1
  172. package/dist/vault-format.js +0 -4
  173. package/dist/vault-format.js.map +0 -1
  174. package/dist/vault-types.d.ts +0 -24
  175. package/dist/vault-types.d.ts.map +0 -1
  176. package/dist/vault-types.js +0 -2
  177. package/dist/vault-types.js.map +0 -1
  178. package/loopforge-policy.json +0 -340
@@ -5,8 +5,10 @@
5
5
  *
6
6
  * verify → enforce → stop decision
7
7
  *
8
- * The RoundCoordinator is the single source of truth for this pipeline;
9
- * transport adapters only prepare input and route the resulting decision.
8
+ * Before this module, runtime.ts and session.ts each maintained their
9
+ * own copy of the pipeline (~60 lines each). Drift between the two
10
+ * paths (e.g. git verification only wired into one side) was a known
11
+ * risk. The RoundCoordinator is the single source of truth.
10
12
  *
11
13
  * State transitions:
12
14
  * RoundStarted → EvidenceCaptured → EvaluationSubmitted
@@ -15,18 +17,28 @@
15
17
  * Persistence is owned by round-transaction.ts so reject paths remain
16
18
  * side-effect free and accepted decisions can be replayed idempotently.
17
19
  */
18
- import { makeRoundGateContext, verifyRoundReport, enforceRoundReport } from "./round-gate.js";
19
- import { buildRejectionPrompt, collectSkippedRoundFiles, findSafeRestorePoint, buildBacktrackPrompt, findBacktrackTargetGitHead, } from "./round-recovery.js";
20
+ import { queryLoopEntries } from "./loop-store.js";
21
+ import { CHECK_SUCCESS_UNVERIFIED, verifySelfEvaluation, entryRound } from "./verification-gate.js";
22
+ import { effectiveSuccess } from "./self-eval.js";
23
+ import { enforceRound, buildRejectionPrompt, findSafeRestorePoint, buildBacktrackPrompt, findBacktrackTargetGitHead, } from "./enforcement-gate.js";
20
24
  import { logEvent } from "./observability.js";
21
25
  import { getPolicy } from "./policy.js";
22
- import { deriveCompilerProjection } from "./round-report.js";
26
+ /** v3.2: Whether a round's success enters the success trajectory. Excluded
27
+ * when the gate contradicted the round, or when the success claim carries no
28
+ * machine-verified observation (success_unverified warn) — an
29
+ * accepted-but-unverified round is not evidence of progress. */
30
+ function shouldPushSuccess(gateContradicted, verificationFlags) {
31
+ if (gateContradicted)
32
+ return false;
33
+ return !verificationFlags.some((flag) => flag.severity === "warn" && flag.check === CHECK_SUCCESS_UNVERIFIED);
34
+ }
23
35
  // ── RoundCoordinator ───────────────────────────────────────────────────────
24
36
  export class RoundCoordinator {
25
- backend;
26
- constructor(backend) {
27
- this.backend = backend;
37
+ store;
38
+ constructor(store) {
39
+ this.store = store;
28
40
  }
29
- /** Process a single round's round report through the decision pipeline:
41
+ /** Process a single round's self-evaluation through the decision pipeline:
30
42
  * verify → enforce → stop decision.
31
43
  *
32
44
  * This is the single entry point called by SessionManager.
@@ -34,36 +46,30 @@ export class RoundCoordinator {
34
46
  * - Compiling the next prompt (if action is "continue")
35
47
  * - Managing heartbeat / signal handlers (runtime only)
36
48
  * - Memory injection (both paths, before calling processRound)
37
- * - Transactional round-event commit (accepted rounds only)
49
+ * - Transactional feedback commit (accepted rounds only)
38
50
  * - State file I/O (both paths, after compiling)
39
51
  *
40
52
  * @param driftClarificationStreak v2.12: Current clarification streak
41
53
  * from session state. Passed through to enforceRound for R7 escalation. */
42
54
  processRound(input, driftClarificationStreak = 0) {
43
- const { loopId, task, currentRound, maxRounds, roundReport: suppliedReport, previousProjection, consecutiveRejections, evidenceSnapshots, } = input;
44
- const roundReport = suppliedReport;
45
- const roundSuccess = roundReport.outcome === "success";
55
+ const { loopId, task, currentRound, maxRounds, selfEval, extractionSucceeded, lastSelfEval, consecutiveRejections, evidenceSnapshots, } = input;
56
+ const roundSuccess = selfEval.success ?? false;
46
57
  // ── 1. Query vault entries ──────────────────────────────────────────
47
- // Merge lineage and canonical RoundEvent entries for replayable checks.
58
+ // Lineage entries (constraint violations, output summaries) and feedback
59
+ // entries (execution_evidence, progress estimates) are both needed by
60
+ // the enforcement gate. queryLoopEntries excludes feedback by default,
61
+ // so we issue a second query and merge both result sets.
48
62
  const prefix = `loop:${loopId}:r`;
49
- const vaultEntries = this.backend
50
- ? this.backend.queryLoopEvents(loopId).filter((entry) => String(entry.task_id ?? "").startsWith(prefix))
63
+ const vaultEntries = this.store
64
+ ? [
65
+ ...queryLoopEntries(this.store, loopId, { prefix }),
66
+ ...queryLoopEntries(this.store, loopId, { prefix, feedbackOnly: true }),
67
+ ]
51
68
  : [];
52
69
  // ── 2. Verification gate ────────────────────────────────────────────
53
- const gateContext = makeRoundGateContext(roundReport, currentRound, vaultEntries, evidenceSnapshots ?? [], input.remainingCriteria ?? [], {
54
- previous: previousProjection ?? null,
55
- expectedAction: input.expectedAction,
56
- backtrackSkippedFiles: input.backtrackSkippedFiles,
57
- backtrackTargetGitHead: input.backtrackTargetGitHead,
58
- consecutiveRejections,
59
- driftClarificationStreak,
60
- escalatedRejectionChecks: input.escalatedRejectionChecks,
61
- });
62
- const currentProjection = deriveCompilerProjection(roundReport, currentRound, input.remainingCriteria ?? [], evidenceSnapshots ?? []);
63
- const verifyResult = verifyRoundReport(gateContext);
70
+ const verifyResult = verifySelfEvaluation(selfEval, currentRound, vaultEntries, lastSelfEval ?? null, evidenceSnapshots ?? [], input.backtrackSkippedFiles ?? [], input.backtrackTargetGitHead);
64
71
  const verificationFlags = verifyResult.flags;
65
72
  const gateContradicted = verifyResult.verdict === "contradicted";
66
- const clarificationAccepted = verificationFlags.some((item) => item.check === "intent_drift" && item.severity === "warn");
67
73
  if (gateContradicted) {
68
74
  logEvent("gate_contradicted", {
69
75
  loopId,
@@ -72,8 +78,10 @@ export class RoundCoordinator {
72
78
  });
73
79
  }
74
80
  // ── 3. Enforcement gate ──────────────────────────────────────────
75
- // Enforcement consumes the same normalized Gate context as verification.
76
- const enforceResult = enforceRoundReport(gateContext, verifyResult);
81
+ // v2.5: heuristic extractions now run partial enforcement. Rules that
82
+ // depend on execution_evidence (R3/R4/R5) self-skip when evidence is
83
+ // missing. Rules that don't need evidence (R1/R2/R6/R7) always run.
84
+ const enforceResult = enforceRound(selfEval, verifyResult, currentRound, vaultEntries, consecutiveRejections, !extractionSucceeded, driftClarificationStreak);
77
85
  if (enforceResult.action === "reject") {
78
86
  const newRejections = consecutiveRejections + 1;
79
87
  const rejectionPrompt = buildRejectionPrompt(currentRound, task, enforceResult, verificationFlags);
@@ -94,10 +102,9 @@ export class RoundCoordinator {
94
102
  roundSuccess,
95
103
  gateContradicted,
96
104
  newConsecutiveRejections: newRejections,
97
- // Don't update lastRoundView on reject — the agent redoes the same round
98
- newRoundProjection: undefined,
105
+ // Don't update lastSelfEval on reject — the agent redoes the same round
106
+ newLastSelfEval: undefined,
99
107
  shouldPushSuccessTrajectory: false,
100
- escalationIssued: enforceResult.escalation_issued ?? false,
101
108
  };
102
109
  }
103
110
  if (enforceResult.action === "terminate") {
@@ -116,7 +123,7 @@ export class RoundCoordinator {
116
123
  roundSuccess,
117
124
  gateContradicted,
118
125
  newConsecutiveRejections: 0,
119
- newRoundProjection: currentProjection,
126
+ newLastSelfEval: selfEval,
120
127
  shouldPushSuccessTrajectory: false,
121
128
  };
122
129
  }
@@ -141,18 +148,34 @@ export class RoundCoordinator {
141
148
  roundSuccess,
142
149
  gateContradicted,
143
150
  newConsecutiveRejections: 0,
144
- newRoundProjection: currentProjection,
151
+ newLastSelfEval: selfEval,
145
152
  shouldPushSuccessTrajectory: false,
146
153
  };
147
154
  }
148
- // Collect files changed in skipped rounds for the restore prompt.
149
- const skippedFiles = collectSkippedRoundFiles(restorePoint.round, currentRound, vaultEntries);
150
- // v2.13: Git HEAD the workspace must be restored to. Taken from the
151
- // restore round's committed transaction snapshot.
152
- const backtrackTargetGitHead = findBacktrackTargetGitHead(restorePoint.round, vaultEntries);
155
+ // v2.13: Collect files changed in skipped rounds for the restore prompt
156
+ const skippedFiles = [];
157
+ for (let r = restorePoint.round + 1; r < currentRound; r++) {
158
+ // v3.2.1: match the feedback entry (execution_evidence lives there) —
159
+ // the compile-time lineage entry for the same round precedes it in
160
+ // the flat view and carries no evidence.
161
+ const entry = vaultEntries.find((e) => entryRound(e) === r && e.task_type !== "loop_lineage");
162
+ if (entry?.execution_evidence) {
163
+ const ev = entry.execution_evidence;
164
+ const files = Array.isArray(ev.files_changed)
165
+ ? ev.files_changed.filter((f) => typeof f === "string")
166
+ : [];
167
+ for (const f of files) {
168
+ if (!skippedFiles.includes(f))
169
+ skippedFiles.push(f);
170
+ }
171
+ }
172
+ }
173
+ // v2.12: Capture the restore point's git HEAD so the next round's
174
+ // verification can confirm the workspace returned to this commit.
175
+ const targetGitHead = findBacktrackTargetGitHead(restorePoint.round, vaultEntries);
153
176
  const backtrackPrompt = buildBacktrackPrompt(currentRound, restorePoint.round, enforceResult.check ?? "progress_stall", getPolicy().engine.backtrack_preserve_discoveries
154
177
  ? restorePoint.skippedDiscoveries
155
- : [], skippedFiles);
178
+ : [], skippedFiles, targetGitHead ?? undefined);
156
179
  logEvent("enforcement_backtrack", {
157
180
  loopId,
158
181
  round: currentRound,
@@ -165,11 +188,11 @@ export class RoundCoordinator {
165
188
  action: "backtrack",
166
189
  backtrackPrompt,
167
190
  backtrackTarget: restorePoint.round,
168
- backtrackTargetGitHead,
169
191
  backtrackSkippedDiscoveries: getPolicy().engine.backtrack_preserve_discoveries
170
192
  ? restorePoint.skippedDiscoveries
171
193
  : [],
172
194
  backtrackSkippedFiles: skippedFiles,
195
+ backtrackTargetGitHead: targetGitHead ?? undefined,
173
196
  backtrackTriggerRule: enforceResult.check,
174
197
  verificationFlags,
175
198
  enforcementAction: "backtrack",
@@ -178,22 +201,35 @@ export class RoundCoordinator {
178
201
  roundSuccess,
179
202
  gateContradicted,
180
203
  newConsecutiveRejections: 0, // reset — fresh start
181
- newRoundProjection: undefined,
204
+ newLastSelfEval: undefined,
182
205
  shouldPushSuccessTrajectory: false,
183
206
  };
184
207
  }
185
208
  // Accept: reset rejection counter
186
209
  // (consecutiveRejections reset to 0 — caller persists)
187
- // ── 4. Canonical round-report commit (AFTER enforcement) ────────────
210
+ // ── 4. Auto-feedback (AFTER enforcement, only if accepted) ──────────
188
211
  // ── 5. Stop condition checks ────────────────────────────────────────
189
- // 5a. The Agent requests a stop. Runtime evidence and gate checks have
190
- // already decided whether that stop can be accepted as completion.
191
- if (roundReport.continuation === "stop") {
212
+ // 5a. Extraction failed → stalled
213
+ if (!extractionSucceeded) {
214
+ return {
215
+ action: "stop",
216
+ stopReason: "stalled",
217
+ verificationFlags,
218
+ roundSuccess,
219
+ gateContradicted,
220
+ newConsecutiveRejections: 0,
221
+ newLastSelfEval: selfEval,
222
+ shouldPushSuccessTrajectory: shouldPushSuccess(gateContradicted, verificationFlags),
223
+ };
224
+ }
225
+ // 5b. Agent says stop
226
+ if (!selfEval.should_continue) {
192
227
  let reason;
193
- if (roundSuccess) {
228
+ if (effectiveSuccess(selfEval)) {
194
229
  reason = "completed";
195
230
  }
196
- else if (roundReport.outcome === "blocked") {
231
+ else if (selfEval.outcome === "blocked" ||
232
+ selfEval.stop_reason === "blocked" || selfEval.stop_reason === "needs_human_input") {
197
233
  reason = "blocked";
198
234
  }
199
235
  else {
@@ -206,47 +242,18 @@ export class RoundCoordinator {
206
242
  roundSuccess,
207
243
  gateContradicted,
208
244
  newConsecutiveRejections: 0,
209
- newRoundProjection: currentProjection,
210
- clarificationAccepted,
211
- shouldPushSuccessTrajectory: !gateContradicted,
245
+ newLastSelfEval: selfEval,
246
+ shouldPushSuccessTrajectory: shouldPushSuccess(gateContradicted, verificationFlags),
212
247
  };
213
248
  }
214
- // 5b. Circuit breaker — max consecutive failed rounds.
215
- //
216
- // When the last N accepted rounds (including this one) all reported
217
- // failure with no recovery, the loop is failing faster than it can
218
- // self-correct. Stop before errors compound (p^N). The trajectory only
219
- // contains committed, non-contradicted rounds, so this never fires on
220
- // an enforcement-rejected round (those never reach this point).
221
- const breakerMax = getPolicy().engine.max_circuit_breaker;
222
- if (breakerMax > 0) {
223
- const breakerWindow = [...(input.successTrajectory ?? []), roundSuccess]
224
- .slice(-breakerMax);
225
- if (breakerWindow.length === breakerMax &&
226
- breakerWindow.every((value) => value === false)) {
227
- logEvent("session_end", {
228
- loopId,
229
- stopReason: "circuit_breaker",
230
- round: currentRound,
231
- });
232
- return {
233
- action: "stop",
234
- stopReason: "circuit_breaker",
235
- verificationFlags,
236
- roundSuccess,
237
- gateContradicted,
238
- newConsecutiveRejections: 0,
239
- newRoundProjection: currentProjection,
240
- clarificationAccepted,
241
- shouldPushSuccessTrajectory: false,
242
- };
243
- }
244
- }
245
249
  // 5c. Max rounds reached
246
250
  //
247
- // Genuine agent stalls are detected by the enforcement gate. The
248
- // coordinator deliberately does not infer completion from a binary
249
- // success flag or from an agent-supplied progress estimate.
251
+ // NOTE: The binary-success circuit breaker previously at 5c is removed.
252
+ // Genuine agent stalls are now detected by the enforcement gate via
253
+ // enforceProgressStall (R4: delta < 5% → reject → terminate on repeat)
254
+ // and enforceProgressStallTerminal (R5: delta = 0 for N rounds → terminate).
255
+ // These use progress_estimate, not the binary success flag, so they
256
+ // correctly distinguish "task not done yet" from "agent is stuck".
250
257
  if (currentRound >= maxRounds) {
251
258
  return {
252
259
  action: "stop",
@@ -255,9 +262,8 @@ export class RoundCoordinator {
255
262
  roundSuccess,
256
263
  gateContradicted,
257
264
  newConsecutiveRejections: 0,
258
- newRoundProjection: currentProjection,
259
- clarificationAccepted,
260
- shouldPushSuccessTrajectory: !gateContradicted,
265
+ newLastSelfEval: selfEval,
266
+ shouldPushSuccessTrajectory: shouldPushSuccess(gateContradicted, verificationFlags),
261
267
  };
262
268
  }
263
269
  // ── 6. Continue — caller compiles next round ────────────────────────
@@ -268,9 +274,10 @@ export class RoundCoordinator {
268
274
  roundSuccess,
269
275
  gateContradicted,
270
276
  newConsecutiveRejections: 0,
271
- newRoundProjection: currentProjection,
272
- shouldPushSuccessTrajectory: !gateContradicted,
273
- clarificationAccepted,
277
+ newLastSelfEval: selfEval,
278
+ shouldPushSuccessTrajectory: shouldPushSuccess(gateContradicted, verificationFlags),
279
+ // v2.12: Propagate clarification acceptance signal for streak tracking
280
+ clarificationAccepted: enforceResult.clarification_accepted ?? false,
274
281
  };
275
282
  }
276
283
  }
@@ -1 +1 @@
1
- {"version":3,"file":"round-coordinator.js","sourceRoot":"","sources":["../src/round-coordinator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"round-coordinator.js","sourceRoot":"","sources":["../src/round-coordinator.ts"],"names":[],"mappings":"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"}
@@ -6,9 +6,9 @@
6
6
  * in their adapters.
7
7
  */
8
8
  import type { LoopStore } from "./loop-store.js";
9
- import { RuntimeServices } from "./runtime-services.js";
9
+ import { LoopForgeEngine } from "./engine.js";
10
10
  import type { ProviderSnapshot } from "./evidence-provider.js";
11
- import type { CompilerRoundProjection, LoopForgeRequest, PromptArtifact, RoundReport } from "./protocol.js";
11
+ import type { LoopForgeRequest, LoopForgeResponse, PromptArtifact, SelfEvaluation } from "./protocol.js";
12
12
  import type { RoundTransactionOutcome, RoundTransactionSnapshot } from "./round-transaction.js";
13
13
  export interface PreparedRound {
14
14
  prompt: string;
@@ -18,28 +18,26 @@ export interface PreparedRound {
18
18
  snapshot: RoundTransactionSnapshot;
19
19
  stateFileContent?: string;
20
20
  warnings?: string[];
21
- canonicalState?: unknown;
21
+ /** v3.0.1: The full compile response. Callers may cache it (e.g. for the
22
+ * typed projection) instead of recompiling for derived views. */
23
+ compileResponse?: LoopForgeResponse;
22
24
  }
23
25
  export interface CompleteRoundInput {
24
26
  snapshot: RoundTransactionSnapshot;
25
27
  loopId: string;
26
28
  task: string;
27
29
  maxRounds: number;
28
- roundReport: RoundReport;
29
- previousProjection?: CompilerRoundProjection;
30
+ selfEval: SelfEvaluation;
31
+ extractionSucceeded: boolean;
32
+ lastSelfEval?: SelfEvaluation;
30
33
  consecutiveRejections: number;
31
34
  successTrajectory: boolean[];
32
35
  /** v2.12: Current clarification streak for R7 escalation. */
33
36
  driftClarificationStreak?: number;
34
- /** Terminal enforcement checks that already consumed their guided retry. */
35
- escalatedRejectionChecks?: string[];
36
37
  /** v2.13: Files from skipped backtrack rounds for restore check. */
37
38
  backtrackSkippedFiles?: string[];
38
- /** v2.13: Git HEAD of the active backtrack restore point. Passed to the
39
- * verification gate; the post-backtrack round must match it. */
39
+ /** v2.12: Git HEAD of the backtrack restore point (workspace restore check). */
40
40
  backtrackTargetGitHead?: string;
41
- expectedAction?: string;
42
- remainingCriteria?: string[];
43
41
  }
44
42
  export interface CompletedRound {
45
43
  outcome: RoundTransactionOutcome;
@@ -47,9 +45,12 @@ export interface CompletedRound {
47
45
  }
48
46
  export declare class RoundDriver {
49
47
  private readonly engine;
50
- private readonly backend;
51
- constructor(engine: RuntimeServices, backend?: LoopStore);
48
+ private readonly store;
49
+ constructor(engine: LoopForgeEngine, store?: LoopStore);
52
50
  prepare(request: LoopForgeRequest, loopId: string, round: number): Promise<PreparedRound | null>;
51
+ /** Synchronous fallback for legacy embedding APIs. Async evidence providers
52
+ * are deliberately skipped by EvidenceCollector.collect(). */
53
+ prepareSync(request: LoopForgeRequest, loopId: string, round: number): PreparedRound | null;
53
54
  private compile;
54
55
  /** Compile a fresh prompt for a zero-commit enforcement retry. The logical
55
56
  * round ID and before-evidence snapshot remain stable; only attempt changes. */
@@ -1 +1 @@
1
- {"version":3,"file":"round-driver.d.ts","sourceRoot":"","sources":["../src/round-driver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,KAAK,EACV,uBAAuB,EACvB,gBAAgB,EAEhB,cAAc,EACd,WAAW,EACZ,MAAM,eAAe,CAAC;AAMvB,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,kBAAkB,CAAC,EAAE,uBAAuB,CAAC;IAC7C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iBAAiB,EAAE,OAAO,EAAE,CAAC;IAC7B,6DAA6D;IAC7D,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,4EAA4E;IAC5E,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC;qEACiE;IACjE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,uBAAuB,CAAC;IACjC,cAAc,EAAE,gBAAgB,EAAE,CAAC;CACpC;AAED,qBAAa,WAAW;IAGV,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;gBAEP,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,SAAS;IAInE,OAAO,CACX,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAOhC,OAAO,CAAC,OAAO;IAgBf;oFACgF;IAC1E,YAAY,CAChB,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,wBAAwB,EAClC,eAAe,EAAE,MAAM,EACvB,qBAAqB,EAAE,MAAM,GAC5B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAwBhC,OAAO,CAAC,aAAa;IAyBf,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IAyBlE,OAAO,CAAC,QAAQ,EAAE,wBAAwB,GAAG,uBAAuB,GAAG,IAAI;IAO3E,OAAO,CAAC,eAAe;CAMxB"}
1
+ {"version":3,"file":"round-driver.d.ts","sourceRoot":"","sources":["../src/round-driver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACf,MAAM,eAAe,CAAC;AAMvB,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;sEACkE;IAClE,eAAe,CAAC,EAAE,iBAAiB,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iBAAiB,EAAE,OAAO,EAAE,CAAC;IAC7B,6DAA6D;IAC7D,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,gFAAgF;IAChF,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,uBAAuB,CAAC;IACjC,cAAc,EAAE,gBAAgB,EAAE,CAAC;CACpC;AAED,qBAAa,WAAW;IAGV,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;gBAEL,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,SAAS;IAIjE,OAAO,CACX,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAYhC;kEAC8D;IAC9D,WAAW,CACT,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI;IASvB,OAAO,CAAC,OAAO;IAgBf;oFACgF;IAC1E,YAAY,CAChB,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,wBAAwB,EAClC,eAAe,EAAE,MAAM,EACvB,qBAAqB,EAAE,MAAM,GAC5B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAwBhC,OAAO,CAAC,aAAa;IAyBf,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IAuBlE,OAAO,CAAC,QAAQ,EAAE,wBAAwB,GAAG,uBAAuB,GAAG,IAAI;IAO3E,OAAO,CAAC,eAAe;CAMxB"}
@@ -6,20 +6,34 @@
6
6
  * in their adapters.
7
7
  */
8
8
  import { EvidenceCollector } from "./evidence-provider.js";
9
- import { writeStateFile } from "./policy.js";
9
+ import { getPolicy, writeStateFile } from "./policy.js";
10
10
  import { prepareRejectedAttempt, prepareRoundTransaction, RoundTransactionCoordinator, } from "./round-transaction.js";
11
11
  export class RoundDriver {
12
12
  engine;
13
- backend;
14
- constructor(engine, backend) {
13
+ store;
14
+ constructor(engine, store) {
15
15
  this.engine = engine;
16
- this.backend = backend ?? engine.getBackend();
16
+ this.store = store ?? engine.getStore();
17
17
  }
18
18
  async prepare(request, loopId, round) {
19
+ // v3.0.1: compile (CPU-bound) and before-evidence collection (external
20
+ // process spawns) run concurrently — the git/command spawns were the
21
+ // latency tail behind the old compile-first, evidence-second order.
22
+ const [response, evidenceBaseline] = await Promise.all([
23
+ Promise.resolve().then(() => this.compile(request, loopId, true)),
24
+ this.collectEvidence(loopId, "before"),
25
+ ]);
26
+ if (!response)
27
+ return null;
28
+ return this.finishPrepare(response, loopId, round, evidenceBaseline);
29
+ }
30
+ /** Synchronous fallback for legacy embedding APIs. Async evidence providers
31
+ * are deliberately skipped by EvidenceCollector.collect(). */
32
+ prepareSync(request, loopId, round) {
19
33
  const response = this.compile(request, loopId, true);
20
34
  if (!response)
21
35
  return null;
22
- const evidenceBaseline = await this.collectEvidence(loopId, "before");
36
+ const evidenceBaseline = EvidenceCollector.fromProviderNames(getPolicy().evidence.providers).collect({ loopId });
23
37
  return this.finishPrepare(response, loopId, round, evidenceBaseline);
24
38
  }
25
39
  compile(request, loopId, persistLineage) {
@@ -53,7 +67,7 @@ export class RoundDriver {
53
67
  snapshot,
54
68
  stateFileContent: response.state_file_content,
55
69
  warnings: response.warnings,
56
- canonicalState: response.canonical_state,
70
+ compileResponse: response,
57
71
  };
58
72
  }
59
73
  finishPrepare(response, loopId, round, evidenceBaseline) {
@@ -67,32 +81,30 @@ export class RoundDriver {
67
81
  snapshot,
68
82
  stateFileContent: response.state_file_content,
69
83
  warnings: response.warnings,
70
- canonicalState: response.canonical_state,
84
+ compileResponse: response,
71
85
  };
72
86
  }
73
87
  async complete(input) {
74
88
  const actualEvidence = await this.collectEvidence(input.loopId, "after");
75
- const transaction = new RoundTransactionCoordinator(this.engine, this.backend);
89
+ const transaction = new RoundTransactionCoordinator(this.engine, this.store);
76
90
  const outcome = transaction.process({
77
91
  snapshot: input.snapshot,
78
92
  task: input.task,
79
93
  maxRounds: input.maxRounds,
80
- roundReport: input.roundReport,
81
- previousProjection: input.previousProjection,
94
+ selfEval: input.selfEval,
95
+ extractionSucceeded: input.extractionSucceeded,
96
+ lastSelfEval: input.lastSelfEval,
82
97
  consecutiveRejections: input.consecutiveRejections,
83
98
  successTrajectory: input.successTrajectory,
84
99
  actualEvidence,
85
100
  driftClarificationStreak: input.driftClarificationStreak,
86
101
  backtrackSkippedFiles: input.backtrackSkippedFiles,
87
102
  backtrackTargetGitHead: input.backtrackTargetGitHead,
88
- expectedAction: input.expectedAction,
89
- escalatedRejectionChecks: input.escalatedRejectionChecks,
90
- remainingCriteria: input.remainingCriteria,
91
103
  });
92
104
  return { outcome, actualEvidence };
93
105
  }
94
106
  recover(snapshot) {
95
- return new RoundTransactionCoordinator(this.engine, this.backend).recover(snapshot);
107
+ return new RoundTransactionCoordinator(this.engine, this.store).recover(snapshot);
96
108
  }
97
109
  collectEvidence(loopId, phase) {
98
110
  return EvidenceCollector.fromPolicy().collectAsync({ loopId, phase });
@@ -1 +1 @@
1
- {"version":3,"file":"round-driver.js","sourceRoot":"","sources":["../src/round-driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"round-driver.js","sourceRoot":"","sources":["../src/round-driver.ts"],"names":[],"mappings":"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"}
@@ -2,20 +2,20 @@
2
2
  *
3
3
  * A logical round has one deterministic roundId. Rejected attempts keep the
4
4
  * same identity and before snapshot; only accepted decisions are committed to
5
- * round-event storage. The committed event embeds the decision so replay after
5
+ * feedback storage. The committed feedback embeds the decision so replay after
6
6
  * a process crash is idempotent.
7
7
  */
8
8
  import type { LoopStore } from "./loop-store.js";
9
- import { RuntimeServices } from "./runtime-services.js";
9
+ import { LoopForgeEngine } from "./engine.js";
10
10
  import type { ProviderSnapshot } from "./evidence-provider.js";
11
- import type { CompilerRoundProjection, RoundReport } from "./protocol.js";
11
+ import type { SelfEvaluation } from "./protocol.js";
12
12
  import type { PromptArtifact } from "./protocol.js";
13
13
  import { type RoundProcessResult } from "./round-coordinator.js";
14
- import type { RoundCommitStore } from "./round-commit-store.js";
15
- export declare const ROUND_TRANSACTION_FORMAT: "loopforge.round-transaction";
14
+ import type { RoundCommitStore } from "./storage.js";
15
+ export declare const ROUND_TRANSACTION_SCHEMA_VERSION: 1;
16
16
  export type RoundTransactionPhase = "prepared" | "prompted" | "evaluated" | "rejected" | "committed" | "terminated";
17
17
  export interface RoundTransactionSnapshot {
18
- format: typeof ROUND_TRANSACTION_FORMAT;
18
+ schemaVersion: typeof ROUND_TRANSACTION_SCHEMA_VERSION;
19
19
  roundId: string;
20
20
  loopId: string;
21
21
  round: number;
@@ -24,7 +24,7 @@ export interface RoundTransactionSnapshot {
24
24
  beforeEvidence: ProviderSnapshot[];
25
25
  afterEvidence?: ProviderSnapshot[];
26
26
  roundEvidence?: ProviderSnapshot[];
27
- roundReport?: RoundReport;
27
+ evaluation?: SelfEvaluation;
28
28
  result?: RoundProcessResult;
29
29
  createdAt: number;
30
30
  updatedAt: number;
@@ -35,22 +35,18 @@ export interface RoundTransactionInput {
35
35
  snapshot: RoundTransactionSnapshot;
36
36
  task: string;
37
37
  maxRounds: number;
38
- roundReport?: RoundReport;
39
- previousProjection?: CompilerRoundProjection;
38
+ selfEval: SelfEvaluation;
39
+ extractionSucceeded: boolean;
40
+ lastSelfEval?: SelfEvaluation;
40
41
  consecutiveRejections: number;
41
42
  successTrajectory: boolean[];
42
43
  /** v2.12: Current clarification streak for R7 escalation. */
43
44
  driftClarificationStreak?: number;
44
- /** Terminal enforcement checks that already consumed their guided retry. */
45
- escalatedRejectionChecks?: string[];
46
45
  /** v2.13: Files from skipped backtrack rounds for restore check. */
47
46
  backtrackSkippedFiles?: string[];
48
- /** v2.13: Git HEAD of the active backtrack restore point. Passed to the
49
- * verification gate; the post-backtrack round must match it. */
47
+ /** v2.12: Git HEAD of the backtrack restore point. The verification gate
48
+ * checks the workspace returns to this commit before accepting work. */
50
49
  backtrackTargetGitHead?: string;
51
- expectedAction?: string;
52
- /** Criteria still open when this prompt was compiled. */
53
- remainingCriteria?: string[];
54
50
  actualEvidence: ProviderSnapshot[];
55
51
  }
56
52
  export interface RoundTransactionOutcome {
@@ -65,13 +61,14 @@ export declare function prepareRoundTransaction(loopId: string, round: number, b
65
61
  * its identity or evidence baseline. Evaluation fields belong to the previous
66
62
  * attempt and are cleared before the Agent receives the retry prompt. */
67
63
  export declare function prepareRejectedAttempt(rejected: RoundTransactionSnapshot, promptArtifact: PromptArtifact): RoundTransactionSnapshot;
64
+ export declare function isProcessResult(value: unknown): value is RoundProcessResult;
68
65
  /** Parse a persisted snapshot without trusting arbitrary vault data. */
69
66
  export declare function parseRoundTransactionSnapshot(value: unknown): RoundTransactionSnapshot | null;
70
67
  export declare class RoundTransactionCoordinator {
71
68
  private readonly engine;
72
- private readonly backend;
69
+ private readonly store;
73
70
  private readonly commitStore;
74
- constructor(engine: RuntimeServices, backend?: LoopStore, commitStore?: RoundCommitStore);
71
+ constructor(engine: LoopForgeEngine, store?: LoopStore, commitStore?: RoundCommitStore);
75
72
  process(input: RoundTransactionInput): RoundTransactionOutcome;
76
73
  /** Recover an already committed decision without evaluating or writing. */
77
74
  recover(snapshot: RoundTransactionSnapshot): RoundTransactionOutcome | null;