agentfootprint 6.31.0 → 6.32.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/dist/esm/lib/context-bisect/ablation.js +40 -2
- package/dist/esm/lib/context-bisect/ablation.js.map +1 -1
- package/dist/esm/lib/context-bisect/cost.js +61 -0
- package/dist/esm/lib/context-bisect/cost.js.map +1 -0
- package/dist/esm/lib/context-bisect/index.js +10 -1
- package/dist/esm/lib/context-bisect/index.js.map +1 -1
- package/dist/esm/lib/context-bisect/localize.js +43 -4
- package/dist/esm/lib/context-bisect/localize.js.map +1 -1
- package/dist/esm/lib/context-bisect/loop-recall.js +108 -0
- package/dist/esm/lib/context-bisect/loop-recall.js.map +1 -0
- package/dist/esm/lib/context-bisect/trajectory.js +221 -0
- package/dist/esm/lib/context-bisect/trajectory.js.map +1 -0
- package/dist/esm/lib/context-bisect/types.js.map +1 -1
- package/dist/esm/lib/context-bisect/walk-to-root.js +170 -0
- package/dist/esm/lib/context-bisect/walk-to-root.js.map +1 -0
- package/dist/esm/observe.js +1 -1
- package/dist/esm/observe.js.map +1 -1
- package/dist/lib/context-bisect/ablation.js +43 -3
- package/dist/lib/context-bisect/ablation.js.map +1 -1
- package/dist/lib/context-bisect/cost.js +66 -0
- package/dist/lib/context-bisect/cost.js.map +1 -0
- package/dist/lib/context-bisect/index.js +23 -1
- package/dist/lib/context-bisect/index.js.map +1 -1
- package/dist/lib/context-bisect/localize.js +43 -4
- package/dist/lib/context-bisect/localize.js.map +1 -1
- package/dist/lib/context-bisect/loop-recall.js +112 -0
- package/dist/lib/context-bisect/loop-recall.js.map +1 -0
- package/dist/lib/context-bisect/trajectory.js +227 -0
- package/dist/lib/context-bisect/trajectory.js.map +1 -0
- package/dist/lib/context-bisect/types.js.map +1 -1
- package/dist/lib/context-bisect/walk-to-root.js +176 -0
- package/dist/lib/context-bisect/walk-to-root.js.map +1 -0
- package/dist/observe.js +12 -1
- package/dist/observe.js.map +1 -1
- package/dist/types/lib/context-bisect/ablation.d.ts +6 -1
- package/dist/types/lib/context-bisect/ablation.d.ts.map +1 -1
- package/dist/types/lib/context-bisect/cost.d.ts +38 -0
- package/dist/types/lib/context-bisect/cost.d.ts.map +1 -0
- package/dist/types/lib/context-bisect/index.d.ts +6 -2
- package/dist/types/lib/context-bisect/index.d.ts.map +1 -1
- package/dist/types/lib/context-bisect/localize.d.ts +8 -0
- package/dist/types/lib/context-bisect/localize.d.ts.map +1 -1
- package/dist/types/lib/context-bisect/loop-recall.d.ts +98 -0
- package/dist/types/lib/context-bisect/loop-recall.d.ts.map +1 -0
- package/dist/types/lib/context-bisect/trajectory.d.ts +153 -0
- package/dist/types/lib/context-bisect/trajectory.d.ts.map +1 -0
- package/dist/types/lib/context-bisect/types.d.ts +68 -1
- package/dist/types/lib/context-bisect/types.d.ts.map +1 -1
- package/dist/types/lib/context-bisect/walk-to-root.d.ts +103 -0
- package/dist/types/lib/context-bisect/walk-to-root.d.ts.map +1 -0
- package/dist/types/observe.d.ts +1 -1
- package/dist/types/observe.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { commitValueAt, findLastWriter, parseRuntimeStageId, splitStageId } from 'footprintjs/trace';
|
|
2
|
+
import { STAGE_IDS, SUBFLOW_IDS } from '../../conventions.js';
|
|
3
|
+
import { stepOutputText } from './llmEdgeWeigher.js';
|
|
4
|
+
import { CONTEXT_BISECT_DEFAULTS } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Partition a commit log by a list of HEAD runtimeStageIds (taken as data — no agent
|
|
7
|
+
* knowledge). Each frame is the half-open range `[head[k], head[k+1])`; commits before
|
|
8
|
+
* the first head are the `prelude`. TOTAL: every commit lands in exactly one frame OR
|
|
9
|
+
* the prelude. Heads not found in the log are ignored; ordering follows the log, not the
|
|
10
|
+
* input list (an out-of-order or duplicate head list cannot reorder/duplicate commits).
|
|
11
|
+
*
|
|
12
|
+
* A head is anchored at the FIRST commit bearing its runtimeStageId — a single stage
|
|
13
|
+
* execution can flush MORE THAN ONE commit bundle under one runtimeStageId (parallel
|
|
14
|
+
* fork merges, multi-flush stages), and those repeats stay INSIDE the frame they open
|
|
15
|
+
* rather than each spawning a spurious one-commit frame.
|
|
16
|
+
*/
|
|
17
|
+
export function bucketByAnchors(commitLog, headRuntimeStageIds) {
|
|
18
|
+
const headSet = new Set(headRuntimeStageIds);
|
|
19
|
+
const headIdx = [];
|
|
20
|
+
const anchored = new Set();
|
|
21
|
+
for (let i = 0; i < commitLog.length; i++) {
|
|
22
|
+
const id = commitLog[i].runtimeStageId;
|
|
23
|
+
if (headSet.has(id) && !anchored.has(id)) {
|
|
24
|
+
headIdx.push(i);
|
|
25
|
+
anchored.add(id); // later commits sharing this id belong to the frame it opened
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (headIdx.length === 0) {
|
|
29
|
+
return { frames: [], prelude: commitLog.map((b) => b.runtimeStageId) };
|
|
30
|
+
}
|
|
31
|
+
const prelude = commitLog.slice(0, headIdx[0]).map((b) => b.runtimeStageId);
|
|
32
|
+
const frames = headIdx.map((head, k) => {
|
|
33
|
+
const end = k + 1 < headIdx.length ? headIdx[k + 1] : commitLog.length;
|
|
34
|
+
return { headArrayIdx: head, bodyIds: commitLog.slice(head, end).map((b) => b.runtimeStageId) };
|
|
35
|
+
});
|
|
36
|
+
return { frames, prelude };
|
|
37
|
+
}
|
|
38
|
+
// ─── findLoopHeads — flat-chart loop-head detection ──────────────────
|
|
39
|
+
/** True when a commit lives inside the injection-engine subflow (the loop head region). */
|
|
40
|
+
function inInjectionEngine(bundle) {
|
|
41
|
+
const { localStageId, subflowPath } = splitStageId(bundle.stageId);
|
|
42
|
+
if (localStageId === SUBFLOW_IDS.INJECTION_ENGINE)
|
|
43
|
+
return true; // the mount commit, if any
|
|
44
|
+
if (subflowPath === undefined)
|
|
45
|
+
return false;
|
|
46
|
+
// a commit nested anywhere under sf-injection-engine (handles nested subflow prefixes)
|
|
47
|
+
return subflowPath === SUBFLOW_IDS.INJECTION_ENGINE || subflowPath.startsWith(SUBFLOW_IDS.INJECTION_ENGINE + '/');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The flat-chart loop heads: the FIRST commit of each injection-engine ENTRY (one per
|
|
51
|
+
* ReAct iteration, since the loop is branch-sourced back to the injection engine). A head
|
|
52
|
+
* is a commit that is in the injection engine while the previous commit was not — so a
|
|
53
|
+
* multi-commit injection-engine body yields exactly one head per loop.
|
|
54
|
+
*
|
|
55
|
+
* Returns the runtimeStageIds to feed `bucketByAnchors`. Empty when the run never enters
|
|
56
|
+
* the injection engine (e.g. the grouped chart, where the loop lives in sf-llm-call —
|
|
57
|
+
* the caller degrades with an honesty flag).
|
|
58
|
+
*/
|
|
59
|
+
export function findLoopHeads(commitLog) {
|
|
60
|
+
const heads = [];
|
|
61
|
+
let wasIn = false;
|
|
62
|
+
for (const bundle of commitLog) {
|
|
63
|
+
const isIn = inInjectionEngine(bundle);
|
|
64
|
+
if (isIn && !wasIn)
|
|
65
|
+
heads.push(bundle.runtimeStageId);
|
|
66
|
+
wasIn = isIn;
|
|
67
|
+
}
|
|
68
|
+
return heads;
|
|
69
|
+
}
|
|
70
|
+
/** Build the per-runtimeStageId read-key map from the snapshot execution tree
|
|
71
|
+
* (same walk as the localizer's `buildArtifactIndex`). */
|
|
72
|
+
function buildReadsOf(executionTree) {
|
|
73
|
+
const readsOf = new Map();
|
|
74
|
+
const visit = (node) => {
|
|
75
|
+
if (!node)
|
|
76
|
+
return;
|
|
77
|
+
const id = node.runtimeStageId;
|
|
78
|
+
if (id && !readsOf.has(id))
|
|
79
|
+
readsOf.set(id, node.stageReads ? Object.keys(node.stageReads) : []);
|
|
80
|
+
for (const child of node.children ?? [])
|
|
81
|
+
visit(child);
|
|
82
|
+
visit(node.next);
|
|
83
|
+
};
|
|
84
|
+
visit(executionTree);
|
|
85
|
+
return readsOf;
|
|
86
|
+
}
|
|
87
|
+
function safeStringify(value) {
|
|
88
|
+
if (typeof value === 'string')
|
|
89
|
+
return value;
|
|
90
|
+
try {
|
|
91
|
+
return JSON.stringify(value) ?? String(value);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return String(value);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Project ONE loop frame from a given commit log + readsOf — the shared core used by BOTH
|
|
99
|
+
* the flat path (over the run commit log) and the grouped path (over a subflow's OWN inner
|
|
100
|
+
* commit log). `headArrayIdx`/`bodyIds` bound the frame WITHIN `log`; `subflowScope`, when
|
|
101
|
+
* set, records that all indices are relative to that subflow's inner log.
|
|
102
|
+
*/
|
|
103
|
+
function projectFrame(loopIndex, log, lastIdxOf, readsOf, headArrayIdx, bodyIds, maxTextChars, subflowScope) {
|
|
104
|
+
// Locate the call-llm commit WITHIN this frame's body (the LLM-step pointer).
|
|
105
|
+
let llmCallId;
|
|
106
|
+
let llmCallArrayIdx;
|
|
107
|
+
let llmBundle;
|
|
108
|
+
for (let i = headArrayIdx; i < headArrayIdx + bodyIds.length; i++) {
|
|
109
|
+
if (splitStageId(log[i].stageId).localStageId === STAGE_IDS.CALL_LLM) {
|
|
110
|
+
llmCallId = log[i].runtimeStageId;
|
|
111
|
+
llmCallArrayIdx = i;
|
|
112
|
+
llmBundle = log[i];
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const intermediateText = llmCallId !== undefined ? stepOutputText(log, lastIdxOf, llmCallId, maxTextChars) : undefined;
|
|
117
|
+
const keys = llmCallId !== undefined ? (readsOf.get(llmCallId) ?? []) : [];
|
|
118
|
+
const contextSources = keys.map((key) => {
|
|
119
|
+
// EXCLUSIVE beforeIdx — finds the PRIOR writer, never call-llm's own write-back.
|
|
120
|
+
const writer = llmCallArrayIdx !== undefined ? findLastWriter(log, key, llmCallArrayIdx) : undefined;
|
|
121
|
+
const writerId = writer?.runtimeStageId;
|
|
122
|
+
const writerArrayIdx = writerId !== undefined ? lastIdxOf.get(writerId) : undefined;
|
|
123
|
+
const value = writerArrayIdx !== undefined ? commitValueAt(log, writerArrayIdx, key) : undefined;
|
|
124
|
+
const text = value === undefined ? '' : safeStringify(value).slice(0, maxTextChars);
|
|
125
|
+
return {
|
|
126
|
+
key,
|
|
127
|
+
writerId,
|
|
128
|
+
writerArrayIdx,
|
|
129
|
+
value,
|
|
130
|
+
evidence: { id: `${llmCallId}::${key}`, text, ancestorTexts: [] },
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
const incompleteSources = llmBundle?.untrackedSources;
|
|
134
|
+
const untrackedReadsPresent = incompleteSources !== undefined && incompleteSources.length > 0;
|
|
135
|
+
return {
|
|
136
|
+
loopIndex,
|
|
137
|
+
llmCallId,
|
|
138
|
+
llmCallArrayIdx,
|
|
139
|
+
headArrayIdx,
|
|
140
|
+
bodyIds,
|
|
141
|
+
intermediateText,
|
|
142
|
+
contextSources,
|
|
143
|
+
...(subflowScope !== undefined ? { subflowScope } : {}),
|
|
144
|
+
...(untrackedReadsPresent ? { incompleteSources } : {}),
|
|
145
|
+
untrackedReadsPresent,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/** The sf-llm-call mount keys in `subflowResults`, in loop order (by execution index). */
|
|
149
|
+
function llmCallMountKeys(subflowResults) {
|
|
150
|
+
return Object.keys(subflowResults)
|
|
151
|
+
.filter((k) => k.includes('#') && splitStageId(k.split('#')[0]).localStageId === SUBFLOW_IDS.LLM_CALL)
|
|
152
|
+
.sort((a, b) => parseRuntimeStageId(a).executionIndex - parseRuntimeStageId(b).executionIndex);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* GROUPED chart projection (`reactMode: 'dynamic-grouped'`). The LLM turn runs inside an
|
|
156
|
+
* `sf-llm-call` subflow, so its `call-llm` + slot writes live in the subflow's OWN commit log
|
|
157
|
+
* — retained per-iteration under `subflowResults['sf-llm-call#k']` (footprintjs
|
|
158
|
+
* subflow-commit-visibility). Each loop is a frame projected PER-SCOPE over its inner log; no
|
|
159
|
+
* cross-scope merge, so `findLastWriter`/`commitValueAt` run correctly over the isolated log.
|
|
160
|
+
*/
|
|
161
|
+
function assembleGroupedTrajectory(artifacts, mountKeys, maxTextChars, maxFrames) {
|
|
162
|
+
const sr = (artifacts.snapshot.subflowResults ?? {});
|
|
163
|
+
const runLog = (artifacts.snapshot.commitLog ?? []);
|
|
164
|
+
// Run-level prelude: commits before the first sf-llm-call mount (seed / memory-read setup).
|
|
165
|
+
const firstMountRunIdx = runLog.findIndex((b) => b.runtimeStageId === mountKeys[0]);
|
|
166
|
+
const prelude = firstMountRunIdx > 0 ? runLog.slice(0, firstMountRunIdx).map((b) => b.runtimeStageId) : [];
|
|
167
|
+
const kept = maxFrames !== undefined ? mountKeys.slice(0, maxFrames) : mountKeys;
|
|
168
|
+
const truncated = maxFrames !== undefined && mountKeys.length > maxFrames;
|
|
169
|
+
const frames = kept.map((key, loopIndex) => {
|
|
170
|
+
const innerLog = (sr[key]?.treeContext?.history ?? []);
|
|
171
|
+
const innerReadsOf = buildReadsOf(sr[key]?.treeContext?.stageContexts);
|
|
172
|
+
const innerLastIdxOf = new Map();
|
|
173
|
+
for (let i = 0; i < innerLog.length; i++)
|
|
174
|
+
innerLastIdxOf.set(innerLog[i].runtimeStageId, i);
|
|
175
|
+
const bodyIds = innerLog.map((b) => b.runtimeStageId);
|
|
176
|
+
return projectFrame(loopIndex, innerLog, innerLastIdxOf, innerReadsOf, 0, bodyIds, maxTextChars, key);
|
|
177
|
+
});
|
|
178
|
+
return { frames, prelude, honestyFlags: [], ...(truncated ? { truncated: { byFrames: true } } : {}) };
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Slice a recorded agent run into a {@link Trajectory} — one {@link LoopFrame} per ReAct
|
|
182
|
+
* iteration, each carrying its `call-llm` pointer, the call's output text, and the live
|
|
183
|
+
* {@link ContextSource}s that fed it (traced via `findLastWriter` + `commitValueAt` from the
|
|
184
|
+
* SAME commit log — zero new capture).
|
|
185
|
+
*
|
|
186
|
+
* Takes the SAME `ContextBugArtifacts` bag the localizer takes — adopter call is just
|
|
187
|
+
* `assembleTrajectory(artifacts)`.
|
|
188
|
+
*
|
|
189
|
+
* Handles BOTH chart shapes:
|
|
190
|
+
* - FLAT (`reactMode: 'dynamic'`, default): `call-llm` is a parent-level stage; frames are
|
|
191
|
+
* bucketed over the run commit log by the `sf-injection-engine` loop heads.
|
|
192
|
+
* - GROUPED (`reactMode: 'dynamic-grouped'`): the LLM turn runs in an `sf-llm-call` subflow;
|
|
193
|
+
* each loop is projected PER-SCOPE over its own inner commit log (retained per-iteration by
|
|
194
|
+
* footprintjs subflow-commit-visibility). Such frames carry `subflowScope` and their array
|
|
195
|
+
* indices are inner-log-relative.
|
|
196
|
+
*
|
|
197
|
+
* Standing caveat on every result: contextSources show only sources re-committed to tracked
|
|
198
|
+
* state; context the model retained internally (carried in its own reasoning, never
|
|
199
|
+
* re-committed) leaves no read→write edge and is NOT represented.
|
|
200
|
+
*/
|
|
201
|
+
export function assembleTrajectory(artifacts, opts = {}) {
|
|
202
|
+
const maxTextChars = opts.maxTextChars ?? CONTEXT_BISECT_DEFAULTS.maxTextChars;
|
|
203
|
+
// Grouped agent ⟺ the LLM turn is wrapped in sf-llm-call (its mounts appear in subflowResults).
|
|
204
|
+
const mountKeys = llmCallMountKeys((artifacts.snapshot.subflowResults ?? {}));
|
|
205
|
+
if (mountKeys.length > 0) {
|
|
206
|
+
return assembleGroupedTrajectory(artifacts, mountKeys, maxTextChars, opts.maxFrames);
|
|
207
|
+
}
|
|
208
|
+
// FLAT path: project over the run commit log, bucketed by injection-engine loop heads.
|
|
209
|
+
const commitLog = (artifacts.snapshot.commitLog ?? []);
|
|
210
|
+
const lastIdxOf = new Map();
|
|
211
|
+
for (let i = 0; i < commitLog.length; i++)
|
|
212
|
+
lastIdxOf.set(commitLog[i].runtimeStageId, i);
|
|
213
|
+
const readsOf = buildReadsOf(artifacts.snapshot.executionTree);
|
|
214
|
+
const heads = findLoopHeads(commitLog);
|
|
215
|
+
const { frames: buckets, prelude } = bucketByAnchors(commitLog, heads);
|
|
216
|
+
const kept = opts.maxFrames !== undefined ? buckets.slice(0, opts.maxFrames) : buckets;
|
|
217
|
+
const truncated = opts.maxFrames !== undefined && buckets.length > opts.maxFrames;
|
|
218
|
+
const frames = kept.map((bucket, loopIndex) => projectFrame(loopIndex, commitLog, lastIdxOf, readsOf, bucket.headArrayIdx, bucket.bodyIds, maxTextChars));
|
|
219
|
+
return { frames, prelude, honestyFlags: [], ...(truncated ? { truncated: { byFrames: true } } : {}) };
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=trajectory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory.js","sourceRoot":"","sources":["../../../../src/lib/context-bisect/trajectory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/context-bisect/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/context-bisect/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAyZH,wEAAwE;AAExE,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,uDAAuD;IACvD,QAAQ,EAAE,EAAE;IACZ,sDAAsD;IACtD,QAAQ,EAAE,EAAE;IACZ,0CAA0C;IAC1C,WAAW,EAAE,EAAE;IACf,4DAA4D;IAC5D,YAAY,EAAE,IAAI;IAClB,yEAAyE;IACzE,OAAO,EAAE,CAAC;IACV,mEAAmE;IACnE,aAAa,EAAE,GAAG;IAClB,mDAAmD;IACnD,SAAS,EAAE,EAAE;IACb,8DAA8D;IAC9D,WAAW,EAAE,CAAC;CACN,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { ablationForSuspect, runAblationProbe, probeFlipped, verdictFor } from './ablation.js';
|
|
2
|
+
import { defaultSuspectClassifier } from './localize.js';
|
|
3
|
+
import { shortlistEarlyCulprits } from './loop-recall.js';
|
|
4
|
+
import { assembleTrajectory } from './trajectory.js';
|
|
5
|
+
/** Margin under which the top-2 narrowed candidates are "unseparated" (mirrors the toBacktrackTrace pattern). */
|
|
6
|
+
const UNSEPARATED_MARGIN = 0.05;
|
|
7
|
+
/**
|
|
8
|
+
* Resolve every `writerId` to the index of the frame whose `bodyIds` contains it (NOT via
|
|
9
|
+
* `parseRuntimeStageId` — that yields executionIndex, not loopIndex). A writer not in any frame
|
|
10
|
+
* (run prelude / root-seeded) maps to `undefined`. Invariant: each id lands in exactly one frame.
|
|
11
|
+
*/
|
|
12
|
+
export function buildWriterFrameIndex(trajectory) {
|
|
13
|
+
const map = new Map();
|
|
14
|
+
trajectory.frames.forEach((frame, idx) => {
|
|
15
|
+
for (const id of frame.bodyIds)
|
|
16
|
+
if (!map.has(id))
|
|
17
|
+
map.set(id, idx);
|
|
18
|
+
});
|
|
19
|
+
return map;
|
|
20
|
+
}
|
|
21
|
+
/** Map each suspectId present in a frame to the runtimeStageId that WROTE its slot (cross-loop provenance). */
|
|
22
|
+
function writtenByOf(frame) {
|
|
23
|
+
const map = new Map();
|
|
24
|
+
for (const src of frame.contextSources) {
|
|
25
|
+
const v = src.value;
|
|
26
|
+
if (Array.isArray(v)) {
|
|
27
|
+
// injection slots: an array of records keyed by sourceId
|
|
28
|
+
for (const rec of v) {
|
|
29
|
+
const id = typeof rec.sourceId === 'string' ? rec.sourceId : undefined;
|
|
30
|
+
if (id !== undefined && !map.has(id))
|
|
31
|
+
map.set(id, src.writerId);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else if (v !== null && typeof v === 'object' && typeof v.toolName === 'string') {
|
|
35
|
+
// lastToolResult: a { toolName, result } object → the tool suspect
|
|
36
|
+
const tool = v.toolName;
|
|
37
|
+
if (!map.has(tool))
|
|
38
|
+
map.set(tool, src.writerId);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return map;
|
|
42
|
+
}
|
|
43
|
+
/** A minimal Suspect for ablationForSuspect (only kind + detail identity are read). */
|
|
44
|
+
function suspectFor(suspectId, kind) {
|
|
45
|
+
const detail = kind === 'tool' ? { toolName: suspectId } : { injectionId: suspectId };
|
|
46
|
+
return {
|
|
47
|
+
source: suspectId, stageName: suspectId, kind, detail,
|
|
48
|
+
score: 0, structuralScore: 0, hasContentEvidence: false, edgePath: [],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Walk backward from the symptom to the root context source — from a recorded run.
|
|
53
|
+
* Thin wrapper: `assembleTrajectory` then {@link walkTrajectory}. See module docs for the honesty model.
|
|
54
|
+
*/
|
|
55
|
+
export async function walkToRoot(artifacts, opts) {
|
|
56
|
+
return walkTrajectory(assembleTrajectory(artifacts), opts);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The walk itself, over an already-assembled {@link Trajectory} (composable + directly testable).
|
|
60
|
+
* FLAT charts only for the cross-loop hop; grouped charts degrade (within-loop) with a flag.
|
|
61
|
+
*/
|
|
62
|
+
export async function walkTrajectory(trajectory, opts) {
|
|
63
|
+
const beamK = opts.beamK ?? 2;
|
|
64
|
+
const maxHops = opts.maxHops ?? 8;
|
|
65
|
+
const maxAblations = opts.maxAblations ?? 24;
|
|
66
|
+
const classify = opts.classifier ?? defaultSuspectClassifier;
|
|
67
|
+
const honestyFlags = [...trajectory.honestyFlags];
|
|
68
|
+
const grouped = trajectory.frames.some((f) => f.subflowScope !== undefined);
|
|
69
|
+
if (grouped) {
|
|
70
|
+
honestyFlags.push({
|
|
71
|
+
flag: 'untracked-sources',
|
|
72
|
+
note: 'cross-loop hop unavailable for the grouped chart — loop frames are scope-isolated; the walk degrades to within one loop.',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
const writerFrame = buildWriterFrameIndex(trajectory);
|
|
76
|
+
// Baseline stability (the un-ablated scenario must reproduce for any ablation verdict to be trusted).
|
|
77
|
+
let baselineStable = true;
|
|
78
|
+
let ablationsUsed = 0;
|
|
79
|
+
if (opts.rerun) {
|
|
80
|
+
const baseline = await runAblationProbe({ embedder: opts.embedder, rerun: opts.rerun }, []);
|
|
81
|
+
ablationsUsed++;
|
|
82
|
+
baselineStable = !probeFlipped(baseline);
|
|
83
|
+
}
|
|
84
|
+
const hops = [];
|
|
85
|
+
const visited = new Set();
|
|
86
|
+
let frameIdx = trajectory.frames.length - 1; // start at the symptom (final loop)
|
|
87
|
+
let byHops = false;
|
|
88
|
+
let byAblations = false;
|
|
89
|
+
while (frameIdx >= 0) {
|
|
90
|
+
if (hops.length >= maxHops) {
|
|
91
|
+
byHops = true;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
const frame = trajectory.frames[frameIdx];
|
|
95
|
+
// NARROW: rank THIS loop's suspects by per-loop influence (single-frame sub-trajectory).
|
|
96
|
+
const sub = { frames: [frame], prelude: [], honestyFlags: [] };
|
|
97
|
+
const shortlist = await shortlistEarlyCulprits(sub, {
|
|
98
|
+
embedder: opts.embedder,
|
|
99
|
+
...(opts.recencyDecay !== undefined ? { recencyDecay: opts.recencyDecay } : {}),
|
|
100
|
+
...(opts.k !== undefined ? { k: opts.k } : {}),
|
|
101
|
+
...(opts.signal ? { signal: opts.signal } : {}),
|
|
102
|
+
classifier: classify,
|
|
103
|
+
});
|
|
104
|
+
const beam = shortlist.candidates.slice(0, beamK);
|
|
105
|
+
if (beam.length === 0)
|
|
106
|
+
break;
|
|
107
|
+
const writtenBy = writtenByOf(frame);
|
|
108
|
+
const unseparated = beam.length >= 2 && Math.abs(beam[0].recallScore - beam[1].recallScore) < UNSEPARATED_MARGIN;
|
|
109
|
+
// ISOLATE: run-wide ablation of each beam candidate; ablation is the only discriminator.
|
|
110
|
+
let chosen = beam[0];
|
|
111
|
+
let chosenVerdict;
|
|
112
|
+
let convicted = false;
|
|
113
|
+
if (opts.rerun) {
|
|
114
|
+
for (const cand of beam) {
|
|
115
|
+
if (ablationsUsed >= maxAblations) {
|
|
116
|
+
byAblations = true;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
const spec = ablationForSuspect(suspectFor(cand.suspectId, cand.kind));
|
|
120
|
+
if (spec === undefined)
|
|
121
|
+
continue;
|
|
122
|
+
const stats = await runAblationProbe({ embedder: opts.embedder, rerun: opts.rerun }, [spec]);
|
|
123
|
+
ablationsUsed++;
|
|
124
|
+
const flipped = baselineStable && probeFlipped(stats);
|
|
125
|
+
if (flipped) {
|
|
126
|
+
chosen = cand;
|
|
127
|
+
chosenVerdict = verdictFor(`ablate ${cand.suspectId}`, stats, baselineStable);
|
|
128
|
+
convicted = true;
|
|
129
|
+
break; // ablation picked this hop's culprit
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const writer = writtenBy.get(chosen.suspectId);
|
|
134
|
+
const nextFrameIdx = writer !== undefined ? writerFrame.get(writer) : undefined;
|
|
135
|
+
// Cross-loop only: descend strictly backward to an unvisited earlier frame.
|
|
136
|
+
const descendIdx = nextFrameIdx !== undefined && nextFrameIdx < frameIdx ? nextFrameIdx : undefined;
|
|
137
|
+
const note = writer === undefined ? 'untracked-origin'
|
|
138
|
+
: opts.rerun && !convicted ? 'overdetermined-or-incomplete'
|
|
139
|
+
: unseparated ? 'unseparated-siblings'
|
|
140
|
+
: undefined;
|
|
141
|
+
hops.push({
|
|
142
|
+
loopIndex: frame.loopIndex,
|
|
143
|
+
suspectId: chosen.suspectId,
|
|
144
|
+
kind: chosen.kind,
|
|
145
|
+
narrowedBy: 'text-similarity',
|
|
146
|
+
...(chosenVerdict ? { verdict: chosenVerdict } : {}),
|
|
147
|
+
...(writer !== undefined ? { writtenBy: writer } : {}),
|
|
148
|
+
...(descendIdx !== undefined ? { cameFrom: trajectory.frames[descendIdx].loopIndex } : {}),
|
|
149
|
+
...(note ? { note } : {}),
|
|
150
|
+
});
|
|
151
|
+
// Stop conditions: root-seeded origin, no earlier frame, or a visited cycle.
|
|
152
|
+
const visitKey = `${chosen.suspectId}@${frame.loopIndex}`;
|
|
153
|
+
if (descendIdx === undefined || visited.has(visitKey))
|
|
154
|
+
break;
|
|
155
|
+
visited.add(visitKey);
|
|
156
|
+
frameIdx = descendIdx;
|
|
157
|
+
}
|
|
158
|
+
// root = the DEEPEST (last-walked) hop convicted by ablation.
|
|
159
|
+
let root;
|
|
160
|
+
for (const hop of hops)
|
|
161
|
+
if (hop.verdict?.verdict === 'confirmed')
|
|
162
|
+
root = hop;
|
|
163
|
+
return {
|
|
164
|
+
hops,
|
|
165
|
+
...(root ? { root } : {}),
|
|
166
|
+
honestyFlags,
|
|
167
|
+
...(byHops || byAblations ? { truncated: { byHops, byAblations } } : {}),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=walk-to-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk-to-root.js","sourceRoot":"","sources":["../../../../src/lib/context-bisect/walk-to-root.ts"],"names":[],"mappings":"AAoCA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAE,wBAAwB,EAA0B,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AA2DrD,iHAAiH;AACjH,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAsB;IAC1D,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACvC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,OAAO;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+GAA+G;AAC/G,SAAS,WAAW,CAAC,KAAgB;IACnC,MAAM,GAAG,GAAG,IAAI,GAAG,EAA8B,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QACpB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,yDAAyD;YACzD,KAAK,MAAM,GAAG,IAAI,CAAmC,EAAE,CAAC;gBACtD,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;gBACvE,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAQ,CAA4B,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7G,mEAAmE;YACnE,MAAM,IAAI,GAAI,CAA0B,CAAC,QAAQ,CAAC;YAClD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uFAAuF;AACvF,SAAS,UAAU,CAAC,SAAiB,EAAE,IAAiB;IACtD,MAAM,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IACtF,OAAO;QACL,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM;QACrD,KAAK,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;KAC3D,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,SAA8B,EAC9B,IAAuB;IAEvB,OAAO,cAAc,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAAsB,EACtB,IAAuB;IAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,wBAAwB,CAAC;IAC7D,MAAM,YAAY,GAAkB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAEjE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC;IAC5E,IAAI,OAAO,EAAE,CAAC;QACZ,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,0HAA0H;SACjI,CAAC,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAEtD,sGAAsG;IACtG,IAAI,cAAc,GAAG,IAAI,CAAC;IAC1B,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5F,aAAa,EAAE,CAAC;QAChB,cAAc,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,IAAI,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,oCAAoC;IACjF,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,OAAO,QAAQ,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;YAAC,MAAM,GAAG,IAAI,CAAC;YAAC,MAAM;QAAC,CAAC;QACrD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE1C,yFAAyF;QACzF,MAAM,GAAG,GAAe,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QAC3E,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE;YAClD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QAE7B,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,WAAW,GACf,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,kBAAkB,CAAC;QAE/F,yFAAyF;QACzF,IAAI,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,aAA0C,CAAC;QAC/C,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,IAAI,aAAa,IAAI,YAAY,EAAE,CAAC;oBAAC,WAAW,GAAG,IAAI,CAAC;oBAAC,MAAM;gBAAC,CAAC;gBACjE,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvE,IAAI,IAAI,KAAK,SAAS;oBAAE,SAAS;gBACjC,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7F,aAAa,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,cAAc,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtD,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,GAAG,IAAI,CAAC;oBACd,aAAa,GAAG,UAAU,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;oBAC9E,SAAS,GAAG,IAAI,CAAC;oBACjB,MAAM,CAAC,qCAAqC;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,4EAA4E;QAC5E,MAAM,UAAU,GAAG,YAAY,KAAK,SAAS,IAAI,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpG,MAAM,IAAI,GACR,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB;YACzC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,8BAA8B;gBAC3D,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,sBAAsB;oBACtC,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,CAAC,IAAI,CAAC;YACR,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,iBAAiB;YAC7B,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1F,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1B,CAAC,CAAC;QAEH,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAC1D,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,MAAM;QAC7D,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,QAAQ,GAAG,UAAU,CAAC;IACxB,CAAC;IAED,8DAA8D;IAC9D,IAAI,IAA8B,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,WAAW;YAAE,IAAI,GAAG,GAAG,CAAC;IAE7E,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,YAAY;QACZ,GAAG,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzE,CAAC;AACJ,CAAC"}
|
package/dist/esm/observe.js
CHANGED
|
@@ -81,7 +81,7 @@ export { buildSelfExplainSkill, buildSelfExplainToolProvider, SelfExplainBinding
|
|
|
81
81
|
// counterfactual ablation. §B2 claim tiers: scores/weights are
|
|
82
82
|
// embedding-geometry PROXIES; ablation verdicts are the ONLY causal
|
|
83
83
|
// claims; slice completeness is bounded by tracking — and says so.
|
|
84
|
-
export { ablationForSuspect, applyAblations, bisectCulprits, CONTEXT_BISECT_DEFAULTS, defaultOutcomeComparator, defaultSuspectClassifier, findDroppedContext, formatContextBugReport, llmCallIdsFromEvents, llmEdgeWeigher, localizeContextBug, probeFlipped, runAblationProbe, runRestorationProbe, stepOutputText, suspectLabel, verdictFor, } from './lib/context-bisect/index.js';
|
|
84
|
+
export { ablationForSuspect, applyAblations, assembleTrajectory, assignCostVerdicts, bisectCulprits, bucketByAnchors, shortlistEarlyCulprits, walkToRoot, walkTrajectory, buildWriterFrameIndex, DEFAULT_RECENCY_DECAY, classifySuspect, findLoopHeads, CONTEXT_BISECT_DEFAULTS, defaultOutcomeComparator, defaultSuspectClassifier, findDroppedContext, formatContextBugReport, llmCallIdsFromEvents, llmEdgeWeigher, localizeContextBug, probeFlipped, runAblationProbe, runRestorationProbe, stepOutputText, suspectLabel, verdictFor, } from './lib/context-bisect/index.js';
|
|
85
85
|
// BacktrackTrace serializer — feeds agentThinkingUI's <BacktrackView>
|
|
86
86
|
// (the "why?" board) straight off a localizer report. Pure mapping, no
|
|
87
87
|
// UI dependency; the interfaces mirror agentthinkingui's contract.
|
package/dist/esm/observe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/observe.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/observe.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* score elsewhere is a correlational proxy.
|
|
27
27
|
*/
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.verdictFor = exports.probeFlipped = exports.runAblationProbe = exports.defaultOutcomeComparator = exports.similarityStats = exports.resolveSamples = exports.applyAblations = exports.ablationForSuspect = void 0;
|
|
29
|
+
exports.verdictFor = exports.probeFlipped = exports.runAblationProbe = exports.defaultOutcomeComparator = exports.similarityStats = exports.costStatsFrom = exports.median = exports.resolveSamples = exports.applyAblations = exports.ablationForSuspect = void 0;
|
|
30
30
|
const cosine_js_1 = require("../../memory/embedding/cosine.js");
|
|
31
31
|
const types_js_1 = require("./types.js");
|
|
32
32
|
// ─── Adapters: suspect → spec ────────────────────────────────────────
|
|
@@ -108,6 +108,30 @@ function resolveSamples(samples) {
|
|
|
108
108
|
return Math.max(2, Number.isFinite(raw) ? Math.floor(raw) : types_js_1.CONTEXT_BISECT_DEFAULTS.samples);
|
|
109
109
|
}
|
|
110
110
|
exports.resolveSamples = resolveSamples;
|
|
111
|
+
/** Median of a numeric sample (mean of the two middles for even length). */
|
|
112
|
+
function median(values) {
|
|
113
|
+
if (values.length === 0)
|
|
114
|
+
return 0;
|
|
115
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
116
|
+
const mid = sorted.length >> 1;
|
|
117
|
+
return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
|
|
118
|
+
}
|
|
119
|
+
exports.median = median;
|
|
120
|
+
function costRange(values) {
|
|
121
|
+
return { median: median(values), min: Math.min(...values), max: Math.max(...values) };
|
|
122
|
+
}
|
|
123
|
+
/** Build a probe's CostStats from per-seed loop/token samples — undefined when
|
|
124
|
+
* the runner reported no cost (keeps quality-only behavior byte-identical). */
|
|
125
|
+
function costStatsFrom(samples, loops, tokens) {
|
|
126
|
+
if (loops.length === 0 && tokens.length === 0)
|
|
127
|
+
return undefined;
|
|
128
|
+
return {
|
|
129
|
+
samples,
|
|
130
|
+
...(loops.length > 0 ? { loops: costRange(loops) } : {}),
|
|
131
|
+
...(tokens.length > 0 ? { tokens: costRange(tokens) } : {}),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
exports.costStatsFrom = costStatsFrom;
|
|
111
135
|
function similarityStats(values) {
|
|
112
136
|
if (values.length === 0)
|
|
113
137
|
return { mean: 0, min: 0, max: 0, stdev: 0 };
|
|
@@ -144,16 +168,32 @@ async function runAblationProbe(config, specs) {
|
|
|
144
168
|
const flipThreshold = config.rerun.flipThreshold ?? types_js_1.CONTEXT_BISECT_DEFAULTS.flipThreshold;
|
|
145
169
|
const outcomeChanged = config.rerun.outcomeChanged ?? defaultOutcomeComparator(config.embedder, flipThreshold);
|
|
146
170
|
const similarities = [];
|
|
171
|
+
const loopsPerSeed = [];
|
|
172
|
+
const tokensPerSeed = [];
|
|
147
173
|
let flips = 0;
|
|
148
174
|
const originalVec = await config.embedder.embed({ text: config.rerun.originalOutput });
|
|
149
175
|
for (let seed = 0; seed < samples; seed++) {
|
|
150
|
-
|
|
176
|
+
// Normalize string | { output, cost } — backward-compatible (one ablation,
|
|
177
|
+
// two readouts: output for the flip, cost for the second score).
|
|
178
|
+
const raw = await config.rerun.runner(specs, { seed });
|
|
179
|
+
const output = typeof raw === 'string' ? raw : raw.output;
|
|
180
|
+
const cost = typeof raw === 'string' ? undefined : raw.cost;
|
|
181
|
+
if (cost?.loops !== undefined)
|
|
182
|
+
loopsPerSeed.push(cost.loops);
|
|
183
|
+
if (cost?.tokens !== undefined)
|
|
184
|
+
tokensPerSeed.push(cost.tokens);
|
|
151
185
|
const outputVec = await config.embedder.embed({ text: output });
|
|
152
186
|
similarities.push((0, cosine_js_1.cosineSimilarity)(originalVec, outputVec));
|
|
153
187
|
if (await outcomeChanged(config.rerun.originalOutput, output))
|
|
154
188
|
flips++;
|
|
155
189
|
}
|
|
156
|
-
|
|
190
|
+
const cost = costStatsFrom(samples, loopsPerSeed, tokensPerSeed);
|
|
191
|
+
return {
|
|
192
|
+
samples,
|
|
193
|
+
flips,
|
|
194
|
+
similarity: similarityStats(similarities),
|
|
195
|
+
...(cost !== undefined ? { cost } : {}),
|
|
196
|
+
};
|
|
157
197
|
}
|
|
158
198
|
exports.runAblationProbe = runAblationProbe;
|
|
159
199
|
/** Majority-flip rule shared by D8 verdicts and D9 probes. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ablation.js","sourceRoot":"","sources":["../../../src/lib/context-bisect/ablation.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;AAEH,gEAAoE;
|
|
1
|
+
{"version":3,"file":"ablation.js","sourceRoot":"","sources":["../../../src/lib/context-bisect/ablation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.classifySuspect = exports.assignCostVerdicts = exports.MIN_LOOPS_SAVED = void 0;
|
|
4
|
+
/** Minimum loops saved (over the placebo band) to call a piece a cost cause. */
|
|
5
|
+
exports.MIN_LOOPS_SAVED = 1;
|
|
6
|
+
function effectOf(suspect, baseline) {
|
|
7
|
+
const c = suspect.runs?.cost;
|
|
8
|
+
if (c === undefined)
|
|
9
|
+
return undefined;
|
|
10
|
+
const baseLoops = baseline.cost?.loops?.median;
|
|
11
|
+
const baseTokens = baseline.cost?.tokens?.median;
|
|
12
|
+
const loopsSaved = baseLoops !== undefined && c.loops !== undefined ? baseLoops - c.loops.median : 0;
|
|
13
|
+
const tokensSaved = baseTokens !== undefined && c.tokens !== undefined ? baseTokens - c.tokens.median : 0;
|
|
14
|
+
const consistent = baseLoops !== undefined && c.loops !== undefined ? c.loops.max <= baseLoops : false;
|
|
15
|
+
return { loopsSaved, tokensSaved, consistent };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Attach a `CostVerdict` to each suspect from the ablation reruns + a
|
|
19
|
+
* leave-one-out placebo control. Suspects without cost data are returned
|
|
20
|
+
* unchanged (quality-only). See the module honesty note.
|
|
21
|
+
*/
|
|
22
|
+
function assignCostVerdicts(suspects, baseline) {
|
|
23
|
+
// The placebo population: non-flipping suspects (removal didn't change the
|
|
24
|
+
// answer) with cost data. Their loops-saved is benign path variance.
|
|
25
|
+
const nonFlip = suspects
|
|
26
|
+
.filter((s) => s.verdict?.verdict !== 'confirmed')
|
|
27
|
+
.map((s) => ({ id: s.source, e: effectOf(s, baseline) }))
|
|
28
|
+
.filter((x) => x.e !== undefined);
|
|
29
|
+
return suspects.map((suspect) => {
|
|
30
|
+
const e = effectOf(suspect, baseline);
|
|
31
|
+
if (e === undefined)
|
|
32
|
+
return suspect; // no cost data → unchanged
|
|
33
|
+
// Leave-one-out placebo: exclude the suspect itself from its own band.
|
|
34
|
+
const band = nonFlip.filter((x) => x.id !== suspect.source).map((x) => x.e.loopsSaved);
|
|
35
|
+
const placeboExists = band.length > 0;
|
|
36
|
+
const placeboMax = placeboExists ? Math.max(...band) : 0;
|
|
37
|
+
const stable = placeboExists && e.consistent;
|
|
38
|
+
const reducedCostOnRemoval = stable && e.loopsSaved >= exports.MIN_LOOPS_SAVED && e.loopsSaved > placeboMax;
|
|
39
|
+
const cost = {
|
|
40
|
+
reducedCostOnRemoval,
|
|
41
|
+
loopsSaved: e.loopsSaved,
|
|
42
|
+
tokensSaved: e.tokensSaved,
|
|
43
|
+
stable,
|
|
44
|
+
};
|
|
45
|
+
return { ...suspect, cost };
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
exports.assignCostVerdicts = assignCostVerdicts;
|
|
49
|
+
/**
|
|
50
|
+
* Derive the 2×2 class from the flip verdict (quality) and the cost verdict.
|
|
51
|
+
* The no-bug cell is `'no-detected-effect'` — never "innocent" (a piece can
|
|
52
|
+
* matter in ways neither axis sees: overdetermination, same-loops-different-path).
|
|
53
|
+
*/
|
|
54
|
+
function classifySuspect(suspect) {
|
|
55
|
+
const flips = suspect.verdict?.verdict === 'confirmed';
|
|
56
|
+
const costCause = suspect.cost?.reducedCostOnRemoval === true && suspect.cost.stable;
|
|
57
|
+
if (flips && costCause)
|
|
58
|
+
return 'both';
|
|
59
|
+
if (flips)
|
|
60
|
+
return 'content-bug';
|
|
61
|
+
if (costCause)
|
|
62
|
+
return 'cost-cause';
|
|
63
|
+
return 'no-detected-effect';
|
|
64
|
+
}
|
|
65
|
+
exports.classifySuspect = classifySuspect;
|
|
66
|
+
//# sourceMappingURL=cost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost.js","sourceRoot":"","sources":["../../../src/lib/context-bisect/cost.ts"],"names":[],"mappings":"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"}
|