loopforge 2.11.0 → 3.0.0

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 (166) hide show
  1. package/README.md +145 -128
  2. package/dist/canonical-event-writer.d.ts +20 -0
  3. package/dist/canonical-event-writer.d.ts.map +1 -0
  4. package/dist/canonical-event-writer.js +131 -0
  5. package/dist/canonical-event-writer.js.map +1 -0
  6. package/dist/canonical-state.d.ts +20 -16
  7. package/dist/canonical-state.d.ts.map +1 -1
  8. package/dist/canonical-state.js +170 -61
  9. package/dist/canonical-state.js.map +1 -1
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +11 -10
  12. package/dist/cli.js.map +1 -1
  13. package/dist/cognitive-governance.d.ts +48 -0
  14. package/dist/cognitive-governance.d.ts.map +1 -0
  15. package/dist/cognitive-governance.js +226 -0
  16. package/dist/cognitive-governance.js.map +1 -0
  17. package/dist/compiler-subgoals.d.ts +7 -0
  18. package/dist/compiler-subgoals.d.ts.map +1 -0
  19. package/dist/compiler-subgoals.js +93 -0
  20. package/dist/compiler-subgoals.js.map +1 -0
  21. package/dist/derive-id.d.ts +12 -0
  22. package/dist/derive-id.d.ts.map +1 -0
  23. package/dist/derive-id.js +31 -0
  24. package/dist/derive-id.js.map +1 -0
  25. package/dist/evidence-provider.d.ts +23 -21
  26. package/dist/evidence-provider.d.ts.map +1 -1
  27. package/dist/evidence-provider.js +34 -74
  28. package/dist/evidence-provider.js.map +1 -1
  29. package/dist/generate-schema.js +90 -2
  30. package/dist/generate-schema.js.map +1 -1
  31. package/dist/index.d.ts +22 -19
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +15 -16
  34. package/dist/index.js.map +1 -1
  35. package/dist/loop-compiler.d.ts +1 -1
  36. package/dist/loop-compiler.d.ts.map +1 -1
  37. package/dist/loop-compiler.js +250 -337
  38. package/dist/loop-compiler.js.map +1 -1
  39. package/dist/loop-extras-parser.d.ts +2 -2
  40. package/dist/loop-extras-parser.d.ts.map +1 -1
  41. package/dist/loop-extras-parser.js +2 -2
  42. package/dist/loop-extras-parser.js.map +1 -1
  43. package/dist/loop-store.d.ts +20 -58
  44. package/dist/loop-store.d.ts.map +1 -1
  45. package/dist/loop-store.js +232 -309
  46. package/dist/loop-store.js.map +1 -1
  47. package/dist/mcp/server.d.ts +3 -3
  48. package/dist/mcp/server.d.ts.map +1 -1
  49. package/dist/mcp/server.js +83 -13
  50. package/dist/mcp/server.js.map +1 -1
  51. package/dist/mcp/session-projection.d.ts +5 -0
  52. package/dist/mcp/session-projection.d.ts.map +1 -0
  53. package/dist/mcp/session-projection.js +18 -0
  54. package/dist/mcp/session-projection.js.map +1 -0
  55. package/dist/mcp/session-queue.d.ts +3 -0
  56. package/dist/mcp/session-queue.d.ts.map +1 -0
  57. package/dist/mcp/session-queue.js +18 -0
  58. package/dist/mcp/session-queue.js.map +1 -0
  59. package/dist/mcp/session-types.d.ts +72 -0
  60. package/dist/mcp/session-types.d.ts.map +1 -0
  61. package/dist/mcp/session-types.js +2 -0
  62. package/dist/mcp/session-types.js.map +1 -0
  63. package/dist/mcp/session.d.ts +49 -93
  64. package/dist/mcp/session.d.ts.map +1 -1
  65. package/dist/mcp/session.js +544 -245
  66. package/dist/mcp/session.js.map +1 -1
  67. package/dist/mcp/tools.d.ts +26 -1
  68. package/dist/mcp/tools.d.ts.map +1 -1
  69. package/dist/mcp/tools.js +399 -274
  70. package/dist/mcp/tools.js.map +1 -1
  71. package/dist/policy-metrics.d.ts +17 -1
  72. package/dist/policy-metrics.d.ts.map +1 -1
  73. package/dist/policy-metrics.js +164 -1
  74. package/dist/policy-metrics.js.map +1 -1
  75. package/dist/policy.d.ts +34 -18
  76. package/dist/policy.d.ts.map +1 -1
  77. package/dist/policy.js +113 -18
  78. package/dist/policy.js.map +1 -1
  79. package/dist/prompt-assembler.d.ts +5 -3
  80. package/dist/prompt-assembler.d.ts.map +1 -1
  81. package/dist/prompt-assembler.js +126 -77
  82. package/dist/prompt-assembler.js.map +1 -1
  83. package/dist/prompt-policy.d.ts +8 -1
  84. package/dist/prompt-policy.d.ts.map +1 -1
  85. package/dist/prompt-policy.js +26 -8
  86. package/dist/prompt-policy.js.map +1 -1
  87. package/dist/protocol.d.ts +232 -192
  88. package/dist/protocol.d.ts.map +1 -1
  89. package/dist/protocol.js +15 -100
  90. package/dist/protocol.js.map +1 -1
  91. package/dist/replay.d.ts +11 -3
  92. package/dist/replay.d.ts.map +1 -1
  93. package/dist/replay.js +51 -14
  94. package/dist/replay.js.map +1 -1
  95. package/dist/round-commit-store.d.ts +12 -0
  96. package/dist/round-commit-store.d.ts.map +1 -0
  97. package/dist/round-commit-store.js +13 -0
  98. package/dist/round-commit-store.js.map +1 -0
  99. package/dist/round-coordinator.d.ts +25 -18
  100. package/dist/round-coordinator.d.ts.map +1 -1
  101. package/dist/round-coordinator.js +83 -71
  102. package/dist/round-coordinator.js.map +1 -1
  103. package/dist/round-driver.d.ts +14 -10
  104. package/dist/round-driver.d.ts.map +1 -1
  105. package/dist/round-driver.js +9 -13
  106. package/dist/round-driver.js.map +1 -1
  107. package/dist/round-gate.d.ts +31 -0
  108. package/dist/round-gate.d.ts.map +1 -0
  109. package/dist/round-gate.js +259 -0
  110. package/dist/round-gate.js.map +1 -0
  111. package/dist/round-recovery.d.ts +17 -0
  112. package/dist/round-recovery.d.ts.map +1 -0
  113. package/dist/round-recovery.js +117 -0
  114. package/dist/round-recovery.js.map +1 -0
  115. package/dist/round-report.d.ts +16 -0
  116. package/dist/round-report.d.ts.map +1 -0
  117. package/dist/round-report.js +401 -0
  118. package/dist/round-report.js.map +1 -0
  119. package/dist/round-transaction.d.ts +19 -12
  120. package/dist/round-transaction.d.ts.map +1 -1
  121. package/dist/round-transaction.js +102 -88
  122. package/dist/round-transaction.js.map +1 -1
  123. package/dist/runtime-services.d.ts +59 -0
  124. package/dist/runtime-services.d.ts.map +1 -0
  125. package/dist/runtime-services.js +460 -0
  126. package/dist/runtime-services.js.map +1 -0
  127. package/dist/storage.d.ts +3 -9
  128. package/dist/storage.d.ts.map +1 -1
  129. package/dist/storage.js +6 -17
  130. package/dist/storage.js.map +1 -1
  131. package/dist/token-utils.d.ts +9 -8
  132. package/dist/token-utils.d.ts.map +1 -1
  133. package/dist/token-utils.js +50 -10
  134. package/dist/token-utils.js.map +1 -1
  135. package/dist/vault-format.d.ts +4 -0
  136. package/dist/vault-format.d.ts.map +1 -0
  137. package/dist/vault-format.js +4 -0
  138. package/dist/vault-format.js.map +1 -0
  139. package/dist/vault-types.d.ts +24 -0
  140. package/dist/vault-types.d.ts.map +1 -0
  141. package/dist/vault-types.js +2 -0
  142. package/dist/vault-types.js.map +1 -0
  143. package/loop_policy.json +10 -12
  144. package/loopforge-policy.json +340 -0
  145. package/package.json +12 -6
  146. package/skills/perception/SKILL.md +199 -164
  147. package/dist/backends/interface.d.ts +0 -39
  148. package/dist/backends/interface.d.ts.map +0 -1
  149. package/dist/backends/interface.js +0 -6
  150. package/dist/backends/interface.js.map +0 -1
  151. package/dist/enforcement-gate.d.ts +0 -71
  152. package/dist/enforcement-gate.d.ts.map +0 -1
  153. package/dist/enforcement-gate.js +0 -744
  154. package/dist/enforcement-gate.js.map +0 -1
  155. package/dist/engine.d.ts +0 -59
  156. package/dist/engine.d.ts.map +0 -1
  157. package/dist/engine.js +0 -596
  158. package/dist/engine.js.map +0 -1
  159. package/dist/self-eval.d.ts +0 -23
  160. package/dist/self-eval.d.ts.map +0 -1
  161. package/dist/self-eval.js +0 -181
  162. package/dist/self-eval.js.map +0 -1
  163. package/dist/verification-gate.d.ts +0 -56
  164. package/dist/verification-gate.d.ts.map +0 -1
  165. package/dist/verification-gate.js +0 -563
  166. package/dist/verification-gate.js.map +0 -1
@@ -1,563 +0,0 @@
1
- /** Verification Gate — Layer 1 cross-round consistency checks.
2
- *
3
- * Pure-function module. Validates an agent's SelfEvaluation against the
4
- * loop's own lineage before it enters the compiler.
5
- *
6
- * Verdict semantics:
7
- * - trusted: all checks passed; flags are informational only.
8
- * - suspect: one or more warn-level flags; flags become warnings in
9
- * the next prompt so the agent can clarify.
10
- * - contradicted: one or more error-level flags; the success flag for
11
- * this round is excluded from the success trend (NOT
12
- * modified). Flags become hard constraints — the agent
13
- * must respond in the next round.
14
- */
15
- import { getPolicy } from "./policy.js";
16
- import { makeVerificationFlag, makeVerificationResult } from "./protocol.js";
17
- import { jaccardSimilarity, entryRound as sharedEntryRound } from "./token-utils.js";
18
- // ═══════════════════════════════════════════════════════════════════════════
19
- // Helpers
20
- // ═══════════════════════════════════════════════════════════════════════════
21
- /** Extract the round number from a vault entry's loop_lineage.
22
- * Returns 0 if the entry has no lineage or no round field.
23
- * In practice, persistLoopLineage always writes round ≥ 1, so 0
24
- * unambiguously means "not a valid round entry" in this context.
25
- * Exported for reuse by enforcement-gate.ts. */
26
- export function entryRound(entry) {
27
- return sharedEntryRound(entry);
28
- }
29
- /** Read constraint_violations from a vault entry (entry-level, stored from
30
- * the previous round's last_round_result at persist time). */
31
- function entryViolations(entry) {
32
- const viols = entry.constraint_violations;
33
- if (Array.isArray(viols))
34
- return viols.filter((v) => typeof v === "string");
35
- return [];
36
- }
37
- // ═══════════════════════════════════════════════════════════════════════════
38
- // Individual checks — each returns a VerificationFlag or null
39
- // ═══════════════════════════════════════════════════════════════════════════
40
- function checkProgressRegression(selfEval, prevSelfEval) {
41
- if (!prevSelfEval?.execution_evidence)
42
- return null;
43
- if (!selfEval.execution_evidence)
44
- return null;
45
- const prevProgress = prevSelfEval.execution_evidence.progress_estimate;
46
- const currProgress = selfEval.execution_evidence.progress_estimate;
47
- if (typeof prevProgress !== "number" || typeof currProgress !== "number")
48
- return null;
49
- // Use delta with epsilon to avoid IEEE 754 rounding issues (0.8 - 0.2 > 0.6 in float)
50
- if (prevProgress - currProgress <= 0.2 + 1e-10)
51
- return null;
52
- return makeVerificationFlag({
53
- severity: "warn",
54
- field: "progress_estimate",
55
- check: "progress_regression",
56
- detail: `Progress dropped from ${prevProgress.toFixed(2)} to ` +
57
- `${currProgress.toFixed(2)} (delta: ${(currProgress - prevProgress).toFixed(2)})`,
58
- });
59
- }
60
- function checkEmptyChangeWithPassing(selfEval) {
61
- const ev = selfEval.execution_evidence;
62
- if (!ev)
63
- return null;
64
- const filesEmpty = ev.files_changed.length === 0;
65
- const testsAllPass = ev.test_results !== null &&
66
- ev.test_results.failed === 0 &&
67
- ev.test_results.passed > 0;
68
- if (!filesEmpty || !testsAllPass || !selfEval.success)
69
- return null;
70
- return makeVerificationFlag({
71
- severity: "warn",
72
- field: "execution_evidence",
73
- check: "empty_change_with_passing",
74
- detail: "Agent claims success with no files changed and all tests passing — " +
75
- "verify that work was actually performed",
76
- });
77
- }
78
- function checkSuccessWithRemainingCriteria(selfEval) {
79
- if (!selfEval.success)
80
- return null;
81
- const remaining = selfEval.execution_evidence?.success_criteria_remaining;
82
- if (!remaining || remaining.length === 0)
83
- return null;
84
- return makeVerificationFlag({
85
- severity: "error",
86
- field: "success",
87
- check: "success_with_remaining_criteria",
88
- detail: `Agent claims success but ${remaining.length} criteria remain unmet: ` +
89
- remaining.slice(0, 3).join("; "),
90
- });
91
- }
92
- function checkDuplicateConstraintDiscovery(selfEval, prevSelfEval, olderViolations) {
93
- const discovered = selfEval.discovered_constraints;
94
- if (!discovered || discovered.length === 0)
95
- return null;
96
- // Collect all previously-known constraints
97
- const known = new Set();
98
- for (const v of olderViolations)
99
- known.add(v.toLowerCase().trim());
100
- if (prevSelfEval) {
101
- for (const d of prevSelfEval.discovered_constraints ?? []) {
102
- known.add(d.toLowerCase().trim());
103
- }
104
- // Also treat previous violations as implicitly discovered
105
- for (const v of prevSelfEval.constraint_violations) {
106
- known.add(v.toLowerCase().trim());
107
- }
108
- }
109
- for (const d of discovered) {
110
- if (known.has(d.toLowerCase().trim())) {
111
- return makeVerificationFlag({
112
- severity: "warn",
113
- field: "discovered_constraints",
114
- check: "duplicate_constraint_discovery",
115
- detail: `Constraint "${d}" was already known from a previous round`,
116
- });
117
- }
118
- }
119
- return null;
120
- }
121
- function checkRecurringViolation(selfEval, prevSelfEval, vaultEntries, currentRound) {
122
- const currViols = selfEval.constraint_violations;
123
- if (!currViols || currViols.length === 0)
124
- return null;
125
- // Build the violation history: [round N-2, round N-1, round N]
126
- const violationsByRound = [];
127
- // Round N-2 violations come from the vault entry for round N-1
128
- // (persistLoopLineage stores the PREVIOUS round's violations on each entry)
129
- if (currentRound >= 3) {
130
- const entryNMinus1 = vaultEntries.find((e) => entryRound(e) === currentRound - 1);
131
- if (entryNMinus1) {
132
- const viols = entryViolations(entryNMinus1);
133
- if (viols.length)
134
- violationsByRound.push(viols.map((v) => v.toLowerCase().trim()));
135
- }
136
- }
137
- // Round N-1 violations from prevSelfEval
138
- if (prevSelfEval) {
139
- const prevViols = prevSelfEval.constraint_violations;
140
- violationsByRound.push(prevViols.map((v) => v.toLowerCase().trim()));
141
- }
142
- // Round N violations from current selfEval
143
- violationsByRound.push(currViols.map((v) => v.toLowerCase().trim()));
144
- // Need at least 3 rounds of data
145
- if (violationsByRound.length < 3)
146
- return null;
147
- // Check each current violation against the previous 2 rounds
148
- const [rNMinus2, rNMinus1, rN] = violationsByRound.slice(-3);
149
- for (const v of rN) {
150
- if (rNMinus1.includes(v) && rNMinus2.includes(v)) {
151
- return makeVerificationFlag({
152
- severity: "error",
153
- field: "constraint_violations",
154
- check: "recurring_violation",
155
- detail: `Constraint violation "${v}" has appeared in 3 consecutive rounds ` +
156
- `(rounds ${currentRound - 2}–${currentRound}) without resolution`,
157
- });
158
- }
159
- }
160
- return null;
161
- }
162
- function checkRetractFreshConstraint(selfEval, prevSelfEval, currentRound) {
163
- const retracted = selfEval.retracted_constraints;
164
- if (!retracted || retracted.length === 0)
165
- return null;
166
- if (!prevSelfEval)
167
- return null;
168
- const lastRoundDiscoveries = new Set();
169
- for (const d of prevSelfEval.discovered_constraints ?? []) {
170
- lastRoundDiscoveries.add(d.toLowerCase().trim());
171
- }
172
- for (const r of retracted) {
173
- if (lastRoundDiscoveries.has(r.toLowerCase().trim())) {
174
- return makeVerificationFlag({
175
- severity: "warn",
176
- field: "retracted_constraints",
177
- check: "retract_fresh_constraint",
178
- detail: `Retracting constraint "${r}" that was just discovered in round ` +
179
- `${currentRound - 1} — may indicate rapid flip-flopping`,
180
- });
181
- }
182
- }
183
- return null;
184
- }
185
- /** v1.18: Cross-validate agent-reported files_changed against git evidence
186
- * from the configured evidence providers (ProviderSnapshot array). */
187
- function checkEvidenceIntegrity(selfEval, evidenceSnapshots) {
188
- if (!selfEval.execution_evidence)
189
- return null;
190
- if (evidenceSnapshots.length === 0)
191
- return null;
192
- const gitSnap = evidenceSnapshots.find((s) => s.provider === "git");
193
- if (!gitSnap)
194
- return null;
195
- const reported = [...selfEval.execution_evidence.files_changed].sort();
196
- const actual = [...gitSnap.files].sort();
197
- if (reported.length === 0 && actual.length === 0)
198
- return null;
199
- if (reported.length === 0 && actual.length > 0) {
200
- return makeVerificationFlag({
201
- severity: "warn",
202
- field: "files_changed",
203
- check: "evidence_integrity",
204
- detail: `Agent reported no files changed but evidence shows: ${actual.join(", ")}`,
205
- });
206
- }
207
- const ghostFiles = reported.filter((f) => !actual.includes(f));
208
- const missedFiles = actual.filter((f) => !reported.includes(f));
209
- if (ghostFiles.length > 0 || missedFiles.length > 0) {
210
- const parts = [];
211
- if (ghostFiles.length > 0)
212
- parts.push(`unconfirmed: [${ghostFiles.join(", ")}]`);
213
- if (missedFiles.length > 0)
214
- parts.push(`unreported: [${missedFiles.join(", ")}]`);
215
- return makeVerificationFlag({
216
- severity: "warn",
217
- field: "files_changed",
218
- check: "evidence_integrity",
219
- detail: `Agent files_changed doesn't match evidence: ${parts.join("; ")}`,
220
- });
221
- }
222
- return null;
223
- }
224
- /** A required, explicitly configured verification command is authoritative
225
- * when the Agent claims success. Optional commands remain observational. */
226
- function checkRequiredCommandEvidence(selfEval, evidenceSnapshots) {
227
- if (!selfEval.success)
228
- return null;
229
- for (const snapshot of evidenceSnapshots) {
230
- if (snapshot.data.kind !== "command")
231
- continue;
232
- if (snapshot.data.phase !== "after" || snapshot.data.required !== true)
233
- continue;
234
- const status = snapshot.data.status;
235
- if (status === "passed")
236
- continue;
237
- const name = typeof snapshot.data.commandName === "string"
238
- ? snapshot.data.commandName
239
- : snapshot.provider;
240
- const exitCode = typeof snapshot.data.exitCode === "number"
241
- ? ` (exit ${snapshot.data.exitCode})`
242
- : "";
243
- return makeVerificationFlag({
244
- severity: "error",
245
- field: "execution_evidence",
246
- check: "required_command_failed",
247
- detail: `Agent claims success but required command "${name}" ${String(status)}${exitCode}`,
248
- });
249
- }
250
- return null;
251
- }
252
- // ── Test output parsing ────────────────────────────────────────────────────
253
- // jaccardSimilarity() imported from token-utils.ts (v2.1 — intent-action drift detection)
254
- /** v2.1 (check 11): Compare the previous round's declared next_action with
255
- * the current round's actual output_summary. Detect when the agent says it
256
- * will do X but then does Y — silent drift without explanation.
257
- *
258
- * Only fires when both next_action and output_summary are non-empty.
259
- * Uses configurable Jaccard token similarity threshold from policy. */
260
- function checkIntentDrift(selfEval, prevSelfEval) {
261
- if (!prevSelfEval?.next_action?.trim())
262
- return null;
263
- if (!selfEval.output_summary.trim())
264
- return null;
265
- const intent = prevSelfEval.next_action.trim();
266
- const actual = selfEval.output_summary.trim();
267
- const score = jaccardSimilarity(intent, actual);
268
- const threshold = getPolicy().evolution.intent_drift_threshold;
269
- if (score >= threshold)
270
- return null;
271
- return makeVerificationFlag({
272
- severity: "warn",
273
- field: "output_summary",
274
- check: "intent_drift",
275
- detail: `Declared intent was "${intent.slice(0, 120)}" ` +
276
- `but actual output "${actual.slice(0, 120)}" — ` +
277
- `similarity ${(score * 100).toFixed(0)}% below threshold ${(threshold * 100).toFixed(0)}%`,
278
- });
279
- }
280
- /** Best-effort parse of test counts from common test-runner output formats.
281
- *
282
- * Scans the last 2000 characters of stdout (where summary lines typically
283
- * appear) and tries patterns in descending specificity order. Returns null
284
- * when the output format is unrecognized, stdout is empty, or a confident
285
- * parse cannot be made.
286
- *
287
- * Recognized formats: Jest verbose/compact, Mocha, pytest/unittest, Go test,
288
- * and PHPUnit OK summaries. */
289
- export function parseTestOutput(stdout) {
290
- if (!stdout)
291
- return null;
292
- const tail = stdout.length > 2000 ? stdout.slice(-2000) : stdout;
293
- let match;
294
- // 1. Jest verbose: "Tests: 1 failed, 8 passed, 9 total"
295
- match = tail.match(/Tests:\s*(\d+)\s+failed,\s*(\d+)\s+passed,\s*(\d+)\s+total/i);
296
- if (match) {
297
- return { failed: Number(match[1]), passed: Number(match[2]), total: Number(match[3]), skipped: 0 };
298
- }
299
- // 2. Jest compact: "Tests: 8 passed, 9 total"
300
- match = tail.match(/Tests:\s*(\d+)\s+passed,\s*(\d+)\s+total/i);
301
- if (match) {
302
- const passed = Number(match[1]);
303
- const total = Number(match[2]);
304
- return { passed, failed: total - passed, total, skipped: 0 };
305
- }
306
- // 3. Mocha: "8 passing" + optional "2 failing"
307
- const mochaPass = tail.match(/(\d+)\s+passing/i);
308
- if (mochaPass) {
309
- const mochaFail = tail.match(/(\d+)\s+failing/i);
310
- const passed = Number(mochaPass[1]);
311
- const failed = mochaFail ? Number(mochaFail[1]) : 0;
312
- return { passed, failed, total: passed + failed, skipped: 0 };
313
- }
314
- // 4. Go test: count "--- PASS:" and "--- FAIL:" lines
315
- const goPassCount = (tail.match(/---\s+PASS:/g) || []).length;
316
- const goFailCount = (tail.match(/---\s+FAIL:/g) || []).length;
317
- if (goPassCount > 0 || goFailCount > 0) {
318
- return { passed: goPassCount, failed: goFailCount, total: goPassCount + goFailCount, skipped: 0 };
319
- }
320
- // 5. pytest / unittest: "8 passed, 1 failed" or "8 passed"
321
- match = tail.match(/(\d+)\s+passed[,;\s]+(\d+)\s+failed/i);
322
- if (match) {
323
- return { passed: Number(match[1]), failed: Number(match[2]), total: Number(match[1]) + Number(match[2]), skipped: 0 };
324
- }
325
- // pytest compact: "8 passed" (with a reasonable context hint)
326
- match = tail.match(/(?:=\s+test session|\b(?:passed|failed)\b)/i);
327
- if (match) {
328
- const pCount = tail.match(/(\d+)\s+passed/i);
329
- const fCount = tail.match(/(\d+)\s+failed/i);
330
- if (pCount || fCount) {
331
- const passed = pCount ? Number(pCount[1]) : 0;
332
- const failed = fCount ? Number(fCount[1]) : 0;
333
- return { passed, failed, total: passed + failed, skipped: 0 };
334
- }
335
- }
336
- // 6. PHPUnit: "OK (8 tests, 16 assertions)"
337
- match = tail.match(/OK\s*\((\d+)\s+tests?/i);
338
- if (match) {
339
- const total = Number(match[1]);
340
- return { passed: total, failed: 0, total, skipped: 0 };
341
- }
342
- return null;
343
- }
344
- /** Cross-validate agent-reported test_results against command evidence output.
345
- *
346
- * For each command provider whose status is "passed" and output is not
347
- * truncated, attempts to parse test counts from stdout. Mismatched counts
348
- * produce a warn-level flag; failures hidden by the agent (reported 0 failed
349
- * when the command shows >0) produce an error-level flag.
350
- *
351
- * Non-command evidence providers are skipped (no structural cross-check is
352
- * defined for them yet). */
353
- function checkCommandEvidenceIntegrity(selfEval, evidenceSnapshots) {
354
- const reported = selfEval.execution_evidence?.test_results;
355
- if (!reported)
356
- return null;
357
- for (const snapshot of evidenceSnapshots) {
358
- if (snapshot.data.kind !== "command")
359
- continue;
360
- if (snapshot.data.status !== "passed")
361
- continue;
362
- if (snapshot.data.truncated === true)
363
- continue;
364
- const stdout = typeof snapshot.data.stdout === "string" ? snapshot.data.stdout : "";
365
- const parsed = parseTestOutput(stdout);
366
- if (!parsed)
367
- continue;
368
- const mismatches = [];
369
- if (parsed.passed !== reported.passed) {
370
- mismatches.push(`passed: reported ${reported.passed}, command shows ${parsed.passed}`);
371
- }
372
- if (parsed.failed !== reported.failed) {
373
- mismatches.push(`failed: reported ${reported.failed}, command shows ${parsed.failed}`);
374
- }
375
- if (mismatches.length === 0) {
376
- // Counts match exactly — evidence supports the agent's claim.
377
- continue;
378
- }
379
- const name = typeof snapshot.data.commandName === "string"
380
- ? snapshot.data.commandName
381
- : snapshot.provider;
382
- // Agent hides failures → error. Other mismatch → warn.
383
- const severity = parsed.failed > 0 && reported.failed === 0 ? "error" : "warn";
384
- return makeVerificationFlag({
385
- severity,
386
- field: "test_results",
387
- check: "command_evidence_mismatch",
388
- detail: `Agent test_results don't match "${name}" output: ${mismatches.join("; ")}`,
389
- });
390
- }
391
- return null;
392
- }
393
- /** v2.2: Check if the agent's declared next_action aligns with any pending
394
- * or in_progress sub-goal. When 3+ pending sub-goals exist but the agent
395
- * plans work unrelated to any of them, it may indicate task drift.
396
- * This is a warn-level advisory — the agent always owns prioritization. */
397
- function checkSubGoalDrift(selfEval, prevSelfEval, vaultEntries, currentRound) {
398
- const nextAction = selfEval.next_action?.trim();
399
- if (!nextAction)
400
- return null;
401
- // Reconstruct pending sub-goal descriptions from vault entries
402
- const pendingSubGoals = new Set();
403
- const completedOrCanceled = new Set();
404
- for (const entry of vaultEntries) {
405
- const emerged = Array.isArray(entry.emerged_subtasks)
406
- ? entry.emerged_subtasks.filter((v) => typeof v === "string")
407
- : [];
408
- for (const desc of emerged) {
409
- pendingSubGoals.add(desc.trim());
410
- }
411
- const done = Array.isArray(entry.completed_subtasks)
412
- ? entry.completed_subtasks.filter((v) => typeof v === "string")
413
- : [];
414
- for (const desc of done) {
415
- completedOrCanceled.add(desc.trim());
416
- }
417
- const canceled = Array.isArray(entry.canceled_subtasks)
418
- ? entry.canceled_subtasks.filter((v) => typeof v === "string")
419
- : [];
420
- for (const desc of canceled) {
421
- completedOrCanceled.add(desc.trim());
422
- }
423
- }
424
- // Also process current selfEval
425
- for (const desc of selfEval.emerged_subtasks ?? []) {
426
- pendingSubGoals.add(desc.trim());
427
- }
428
- for (const desc of selfEval.completed_subtasks ?? []) {
429
- completedOrCanceled.add(desc.trim());
430
- }
431
- for (const desc of selfEval.canceled_subtasks ?? []) {
432
- completedOrCanceled.add(desc.trim());
433
- }
434
- // Remove completed/canceled from pending
435
- for (const desc of completedOrCanceled) {
436
- pendingSubGoals.delete(desc);
437
- }
438
- // Need at least 3 pending sub-goals for the check to be meaningful
439
- if (pendingSubGoals.size < 3)
440
- return null;
441
- // Check if next_action aligns with any pending sub-goal
442
- let aligns = false;
443
- for (const sg of pendingSubGoals) {
444
- const score = jaccardSimilarity(nextAction, sg);
445
- if (score >= getPolicy().evolution.subgoal_drift_alignment_threshold) {
446
- aligns = true;
447
- break;
448
- }
449
- }
450
- if (!aligns) {
451
- const sample = [...pendingSubGoals].slice(0, 3).join(", ");
452
- return makeVerificationFlag({
453
- severity: "warn",
454
- field: "next_action",
455
- check: "subgoal_drift",
456
- detail: `Agent's next_action doesn't align with any of ${pendingSubGoals.size} pending sub-goals. ` +
457
- `Pending: ${sample}… Consider completing existing sub-goals before starting new work, ` +
458
- `or cancel outdated sub-goals via canceled_subtasks.`,
459
- });
460
- }
461
- return null;
462
- }
463
- /** v2.13: After a backtrack, check that the agent restored the workspace
464
- * before working. If the agent's files_changed overlaps with files from
465
- * skipped (failed) rounds, the workspace was likely not clean. */
466
- function checkBacktrackWorkspaceRestore(selfEval, backtrackSkippedFiles) {
467
- if (backtrackSkippedFiles.length === 0)
468
- return null;
469
- const ev = selfEval.execution_evidence;
470
- if (!ev || ev.files_changed.length === 0)
471
- return null;
472
- // Check overlap: files the agent changed vs. files from skipped rounds
473
- const overlap = ev.files_changed.filter((f) => backtrackSkippedFiles.some((sf) => sf === f || f.endsWith(sf) || sf.endsWith(f)));
474
- if (overlap.length === 0)
475
- return null;
476
- // Agent is modifying files that were part of failed rounds without
477
- // having properly restored the workspace first.
478
- if (overlap.length >= 3 || overlap.length === ev.files_changed.length) {
479
- return makeVerificationFlag({
480
- severity: "error",
481
- field: "files_changed",
482
- check: "backtrack_workspace_not_restored",
483
- detail: `Agent modified ${overlap.length} file(s) that were part of ` +
484
- `the skipped (failed) rounds: ${overlap.slice(0, 5).join(", ")}. ` +
485
- `The workspace was likely not restored before working.`,
486
- });
487
- }
488
- // Minor overlap — warn only
489
- return makeVerificationFlag({
490
- severity: "warn",
491
- field: "files_changed",
492
- check: "backtrack_workspace_not_restored",
493
- detail: `Agent modified files that overlap with skipped rounds: ` +
494
- `${overlap.join(", ")}. Verify the workspace was restored.`,
495
- });
496
- }
497
- // ═══════════════════════════════════════════════════════════════════════════
498
- // Main entry point
499
- // ═══════════════════════════════════════════════════════════════════════════
500
- /** Verify a SelfEvaluation against the loop's cross-round lineage.
501
- *
502
- * @param selfEval The agent's self-evaluation for the current round.
503
- * @param currentRound The current round number (1-based).
504
- * @param vaultEntries Vault entries for this loop (non-feedback only).
505
- * @param prevSelfEval The agent's self-evaluation from the previous round
506
- * (null for round 1).
507
- * @param evidenceSnapshots v1.18: Evidence snapshots from configured providers.
508
- * Used by checkEvidenceIntegrity for multi-provider
509
- * cross-validation. Defaults to empty array. */
510
- export function verifySelfEvaluation(selfEval, currentRound, vaultEntries, prevSelfEval = null, evidenceSnapshots = [],
511
- /** v2.13: Files from skipped backtrack rounds. If the agent's
512
- * files_changed overlaps significantly with these, the workspace
513
- * was not properly restored before working. */
514
- backtrackSkippedFiles = []) {
515
- const flags = [];
516
- // Collect violations from all previous vault entries for duplicate-discovery
517
- // and other checks that need deeper history.
518
- const olderViolations = [];
519
- for (const entry of vaultEntries) {
520
- for (const v of entryViolations(entry))
521
- olderViolations.push(v);
522
- }
523
- // Run all checks
524
- const checks = [
525
- () => checkProgressRegression(selfEval, prevSelfEval),
526
- () => checkEmptyChangeWithPassing(selfEval),
527
- () => checkSuccessWithRemainingCriteria(selfEval),
528
- () => checkDuplicateConstraintDiscovery(selfEval, prevSelfEval, olderViolations),
529
- () => checkRecurringViolation(selfEval, prevSelfEval, vaultEntries, currentRound),
530
- () => checkRetractFreshConstraint(selfEval, prevSelfEval, currentRound),
531
- // v1.18: Cross-validate agent-reported files_changed against git evidence
532
- () => checkEvidenceIntegrity(selfEval, evidenceSnapshots),
533
- () => checkRequiredCommandEvidence(selfEval, evidenceSnapshots),
534
- // v2.0: Cross-validate agent-reported test_results against command output
535
- () => checkCommandEvidenceIntegrity(selfEval, evidenceSnapshots),
536
- // v2.1: Detect intent-action drift — agent said X but did Y
537
- () => checkIntentDrift(selfEval, prevSelfEval),
538
- // v2.2: Detect sub-goal drift — next_action doesn't align with pending sub-goals
539
- () => checkSubGoalDrift(selfEval, prevSelfEval, vaultEntries, currentRound),
540
- // v2.13: Post-backtrack workspace restore check
541
- () => checkBacktrackWorkspaceRestore(selfEval, backtrackSkippedFiles),
542
- ];
543
- for (const run of checks) {
544
- const flag = run();
545
- if (flag)
546
- flags.push(flag);
547
- }
548
- // Determine verdict from the most severe flag present
549
- const hasError = flags.some((f) => f.severity === "error");
550
- const hasWarn = flags.some((f) => f.severity === "warn");
551
- let verdict;
552
- if (hasError) {
553
- verdict = "contradicted";
554
- }
555
- else if (hasWarn) {
556
- verdict = "suspect";
557
- }
558
- else {
559
- verdict = "trusted";
560
- }
561
- return makeVerificationResult({ verdict, flags });
562
- }
563
- //# sourceMappingURL=verification-gate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verification-gate.js","sourceRoot":"","sources":["../src/verification-gate.ts"],"names":[],"mappings":"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"}