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