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.
- package/README.md +145 -128
- package/dist/canonical-event-writer.d.ts +20 -0
- package/dist/canonical-event-writer.d.ts.map +1 -0
- package/dist/canonical-event-writer.js +131 -0
- package/dist/canonical-event-writer.js.map +1 -0
- package/dist/canonical-state.d.ts +20 -16
- package/dist/canonical-state.d.ts.map +1 -1
- package/dist/canonical-state.js +170 -61
- package/dist/canonical-state.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +11 -10
- package/dist/cli.js.map +1 -1
- package/dist/cognitive-governance.d.ts +48 -0
- package/dist/cognitive-governance.d.ts.map +1 -0
- package/dist/cognitive-governance.js +226 -0
- package/dist/cognitive-governance.js.map +1 -0
- package/dist/compiler-subgoals.d.ts +7 -0
- package/dist/compiler-subgoals.d.ts.map +1 -0
- package/dist/compiler-subgoals.js +93 -0
- package/dist/compiler-subgoals.js.map +1 -0
- package/dist/derive-id.d.ts +12 -0
- package/dist/derive-id.d.ts.map +1 -0
- package/dist/derive-id.js +31 -0
- package/dist/derive-id.js.map +1 -0
- package/dist/evidence-provider.d.ts +23 -21
- package/dist/evidence-provider.d.ts.map +1 -1
- package/dist/evidence-provider.js +34 -74
- package/dist/evidence-provider.js.map +1 -1
- package/dist/generate-schema.js +90 -2
- package/dist/generate-schema.js.map +1 -1
- package/dist/index.d.ts +22 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -16
- package/dist/index.js.map +1 -1
- package/dist/loop-compiler.d.ts +1 -1
- package/dist/loop-compiler.d.ts.map +1 -1
- package/dist/loop-compiler.js +250 -337
- package/dist/loop-compiler.js.map +1 -1
- package/dist/loop-extras-parser.d.ts +2 -2
- package/dist/loop-extras-parser.d.ts.map +1 -1
- package/dist/loop-extras-parser.js +2 -2
- package/dist/loop-extras-parser.js.map +1 -1
- package/dist/loop-store.d.ts +20 -58
- package/dist/loop-store.d.ts.map +1 -1
- package/dist/loop-store.js +232 -309
- package/dist/loop-store.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -3
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +83 -13
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/session-projection.d.ts +5 -0
- package/dist/mcp/session-projection.d.ts.map +1 -0
- package/dist/mcp/session-projection.js +18 -0
- package/dist/mcp/session-projection.js.map +1 -0
- package/dist/mcp/session-queue.d.ts +3 -0
- package/dist/mcp/session-queue.d.ts.map +1 -0
- package/dist/mcp/session-queue.js +18 -0
- package/dist/mcp/session-queue.js.map +1 -0
- package/dist/mcp/session-types.d.ts +72 -0
- package/dist/mcp/session-types.d.ts.map +1 -0
- package/dist/mcp/session-types.js +2 -0
- package/dist/mcp/session-types.js.map +1 -0
- package/dist/mcp/session.d.ts +49 -93
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +544 -245
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/tools.d.ts +26 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +399 -274
- package/dist/mcp/tools.js.map +1 -1
- package/dist/policy-metrics.d.ts +17 -1
- package/dist/policy-metrics.d.ts.map +1 -1
- package/dist/policy-metrics.js +164 -1
- package/dist/policy-metrics.js.map +1 -1
- package/dist/policy.d.ts +34 -18
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +113 -18
- package/dist/policy.js.map +1 -1
- package/dist/prompt-assembler.d.ts +5 -3
- package/dist/prompt-assembler.d.ts.map +1 -1
- package/dist/prompt-assembler.js +126 -77
- package/dist/prompt-assembler.js.map +1 -1
- package/dist/prompt-policy.d.ts +8 -1
- package/dist/prompt-policy.d.ts.map +1 -1
- package/dist/prompt-policy.js +26 -8
- package/dist/prompt-policy.js.map +1 -1
- package/dist/protocol.d.ts +232 -192
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +15 -100
- package/dist/protocol.js.map +1 -1
- package/dist/replay.d.ts +11 -3
- package/dist/replay.d.ts.map +1 -1
- package/dist/replay.js +51 -14
- package/dist/replay.js.map +1 -1
- package/dist/round-commit-store.d.ts +12 -0
- package/dist/round-commit-store.d.ts.map +1 -0
- package/dist/round-commit-store.js +13 -0
- package/dist/round-commit-store.js.map +1 -0
- package/dist/round-coordinator.d.ts +25 -18
- package/dist/round-coordinator.d.ts.map +1 -1
- package/dist/round-coordinator.js +83 -71
- package/dist/round-coordinator.js.map +1 -1
- package/dist/round-driver.d.ts +14 -10
- package/dist/round-driver.d.ts.map +1 -1
- package/dist/round-driver.js +9 -13
- package/dist/round-driver.js.map +1 -1
- package/dist/round-gate.d.ts +31 -0
- package/dist/round-gate.d.ts.map +1 -0
- package/dist/round-gate.js +259 -0
- package/dist/round-gate.js.map +1 -0
- package/dist/round-recovery.d.ts +17 -0
- package/dist/round-recovery.d.ts.map +1 -0
- package/dist/round-recovery.js +117 -0
- package/dist/round-recovery.js.map +1 -0
- package/dist/round-report.d.ts +16 -0
- package/dist/round-report.d.ts.map +1 -0
- package/dist/round-report.js +401 -0
- package/dist/round-report.js.map +1 -0
- package/dist/round-transaction.d.ts +19 -12
- package/dist/round-transaction.d.ts.map +1 -1
- package/dist/round-transaction.js +102 -88
- package/dist/round-transaction.js.map +1 -1
- package/dist/runtime-services.d.ts +59 -0
- package/dist/runtime-services.d.ts.map +1 -0
- package/dist/runtime-services.js +460 -0
- package/dist/runtime-services.js.map +1 -0
- package/dist/storage.d.ts +3 -9
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +6 -17
- package/dist/storage.js.map +1 -1
- package/dist/token-utils.d.ts +9 -8
- package/dist/token-utils.d.ts.map +1 -1
- package/dist/token-utils.js +50 -10
- package/dist/token-utils.js.map +1 -1
- package/dist/vault-format.d.ts +4 -0
- package/dist/vault-format.d.ts.map +1 -0
- package/dist/vault-format.js +4 -0
- package/dist/vault-format.js.map +1 -0
- package/dist/vault-types.d.ts +24 -0
- package/dist/vault-types.d.ts.map +1 -0
- package/dist/vault-types.js +2 -0
- package/dist/vault-types.js.map +1 -0
- package/loop_policy.json +10 -12
- package/loopforge-policy.json +340 -0
- package/package.json +12 -6
- package/skills/perception/SKILL.md +199 -164
- package/dist/backends/interface.d.ts +0 -39
- package/dist/backends/interface.d.ts.map +0 -1
- package/dist/backends/interface.js +0 -6
- package/dist/backends/interface.js.map +0 -1
- package/dist/enforcement-gate.d.ts +0 -71
- package/dist/enforcement-gate.d.ts.map +0 -1
- package/dist/enforcement-gate.js +0 -744
- package/dist/enforcement-gate.js.map +0 -1
- package/dist/engine.d.ts +0 -59
- package/dist/engine.d.ts.map +0 -1
- package/dist/engine.js +0 -596
- package/dist/engine.js.map +0 -1
- package/dist/self-eval.d.ts +0 -23
- package/dist/self-eval.d.ts.map +0 -1
- package/dist/self-eval.js +0 -181
- package/dist/self-eval.js.map +0 -1
- package/dist/verification-gate.d.ts +0 -56
- package/dist/verification-gate.d.ts.map +0 -1
- package/dist/verification-gate.js +0 -563
- 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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"}
|