agentfootprint 6.31.0 → 6.33.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 +237 -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 +193 -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 +243 -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 +199 -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 +169 -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 +101 -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,237 @@
|
|
|
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
|
+
// Proximate tool source (proposal 008) — the most recent `lastToolResult` committed BEFORE this
|
|
134
|
+
// loop's call-llm, surfaced WALK-ONLY (NOT in contextSources, so L3's narrow is untouched). Its
|
|
135
|
+
// writer is the PRODUCING loop's tool-calls stage — the cross-loop provenance edge L4's descent
|
|
136
|
+
// hops along. FLAT only: in the grouped chart `lastToolResult` lives in the run log outside the
|
|
137
|
+
// per-scope inner log, so the inner findLastWriter can't reach it (deferred). Honesty: the call-llm
|
|
138
|
+
// read `history` (the aggregate), NOT this key — so it's an INFERRED proximate (`proximate: true`).
|
|
139
|
+
let proximateToolSource;
|
|
140
|
+
if (subflowScope === undefined && llmCallArrayIdx !== undefined) {
|
|
141
|
+
const w = findLastWriter(log, 'lastToolResult', llmCallArrayIdx);
|
|
142
|
+
const wIdx = w !== undefined ? lastIdxOf.get(w.runtimeStageId) : undefined;
|
|
143
|
+
const v = wIdx !== undefined ? commitValueAt(log, wIdx, 'lastToolResult') : undefined;
|
|
144
|
+
if (w !== undefined && v !== undefined) {
|
|
145
|
+
proximateToolSource = { value: v, writerId: w.runtimeStageId, proximate: true };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const incompleteSources = llmBundle?.untrackedSources;
|
|
149
|
+
const untrackedReadsPresent = incompleteSources !== undefined && incompleteSources.length > 0;
|
|
150
|
+
return {
|
|
151
|
+
loopIndex,
|
|
152
|
+
llmCallId,
|
|
153
|
+
llmCallArrayIdx,
|
|
154
|
+
headArrayIdx,
|
|
155
|
+
bodyIds,
|
|
156
|
+
intermediateText,
|
|
157
|
+
contextSources,
|
|
158
|
+
...(proximateToolSource ? { proximateToolSource } : {}),
|
|
159
|
+
...(subflowScope !== undefined ? { subflowScope } : {}),
|
|
160
|
+
...(untrackedReadsPresent ? { incompleteSources } : {}),
|
|
161
|
+
untrackedReadsPresent,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/** The sf-llm-call mount keys in `subflowResults`, in loop order (by execution index). */
|
|
165
|
+
function llmCallMountKeys(subflowResults) {
|
|
166
|
+
return Object.keys(subflowResults)
|
|
167
|
+
.filter((k) => k.includes('#') && splitStageId(k.split('#')[0]).localStageId === SUBFLOW_IDS.LLM_CALL)
|
|
168
|
+
.sort((a, b) => parseRuntimeStageId(a).executionIndex - parseRuntimeStageId(b).executionIndex);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* GROUPED chart projection (`reactMode: 'dynamic-grouped'`). The LLM turn runs inside an
|
|
172
|
+
* `sf-llm-call` subflow, so its `call-llm` + slot writes live in the subflow's OWN commit log
|
|
173
|
+
* — retained per-iteration under `subflowResults['sf-llm-call#k']` (footprintjs
|
|
174
|
+
* subflow-commit-visibility). Each loop is a frame projected PER-SCOPE over its inner log; no
|
|
175
|
+
* cross-scope merge, so `findLastWriter`/`commitValueAt` run correctly over the isolated log.
|
|
176
|
+
*/
|
|
177
|
+
function assembleGroupedTrajectory(artifacts, mountKeys, maxTextChars, maxFrames) {
|
|
178
|
+
const sr = (artifacts.snapshot.subflowResults ?? {});
|
|
179
|
+
const runLog = (artifacts.snapshot.commitLog ?? []);
|
|
180
|
+
// Run-level prelude: commits before the first sf-llm-call mount (seed / memory-read setup).
|
|
181
|
+
const firstMountRunIdx = runLog.findIndex((b) => b.runtimeStageId === mountKeys[0]);
|
|
182
|
+
const prelude = firstMountRunIdx > 0 ? runLog.slice(0, firstMountRunIdx).map((b) => b.runtimeStageId) : [];
|
|
183
|
+
const kept = maxFrames !== undefined ? mountKeys.slice(0, maxFrames) : mountKeys;
|
|
184
|
+
const truncated = maxFrames !== undefined && mountKeys.length > maxFrames;
|
|
185
|
+
const frames = kept.map((key, loopIndex) => {
|
|
186
|
+
const innerLog = (sr[key]?.treeContext?.history ?? []);
|
|
187
|
+
const innerReadsOf = buildReadsOf(sr[key]?.treeContext?.stageContexts);
|
|
188
|
+
const innerLastIdxOf = new Map();
|
|
189
|
+
for (let i = 0; i < innerLog.length; i++)
|
|
190
|
+
innerLastIdxOf.set(innerLog[i].runtimeStageId, i);
|
|
191
|
+
const bodyIds = innerLog.map((b) => b.runtimeStageId);
|
|
192
|
+
return projectFrame(loopIndex, innerLog, innerLastIdxOf, innerReadsOf, 0, bodyIds, maxTextChars, key);
|
|
193
|
+
});
|
|
194
|
+
return { frames, prelude, honestyFlags: [], ...(truncated ? { truncated: { byFrames: true } } : {}) };
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Slice a recorded agent run into a {@link Trajectory} — one {@link LoopFrame} per ReAct
|
|
198
|
+
* iteration, each carrying its `call-llm` pointer, the call's output text, and the live
|
|
199
|
+
* {@link ContextSource}s that fed it (traced via `findLastWriter` + `commitValueAt` from the
|
|
200
|
+
* SAME commit log — zero new capture).
|
|
201
|
+
*
|
|
202
|
+
* Takes the SAME `ContextBugArtifacts` bag the localizer takes — adopter call is just
|
|
203
|
+
* `assembleTrajectory(artifacts)`.
|
|
204
|
+
*
|
|
205
|
+
* Handles BOTH chart shapes:
|
|
206
|
+
* - FLAT (`reactMode: 'dynamic'`, default): `call-llm` is a parent-level stage; frames are
|
|
207
|
+
* bucketed over the run commit log by the `sf-injection-engine` loop heads.
|
|
208
|
+
* - GROUPED (`reactMode: 'dynamic-grouped'`): the LLM turn runs in an `sf-llm-call` subflow;
|
|
209
|
+
* each loop is projected PER-SCOPE over its own inner commit log (retained per-iteration by
|
|
210
|
+
* footprintjs subflow-commit-visibility). Such frames carry `subflowScope` and their array
|
|
211
|
+
* indices are inner-log-relative.
|
|
212
|
+
*
|
|
213
|
+
* Standing caveat on every result: contextSources show only sources re-committed to tracked
|
|
214
|
+
* state; context the model retained internally (carried in its own reasoning, never
|
|
215
|
+
* re-committed) leaves no read→write edge and is NOT represented.
|
|
216
|
+
*/
|
|
217
|
+
export function assembleTrajectory(artifacts, opts = {}) {
|
|
218
|
+
const maxTextChars = opts.maxTextChars ?? CONTEXT_BISECT_DEFAULTS.maxTextChars;
|
|
219
|
+
// Grouped agent ⟺ the LLM turn is wrapped in sf-llm-call (its mounts appear in subflowResults).
|
|
220
|
+
const mountKeys = llmCallMountKeys((artifacts.snapshot.subflowResults ?? {}));
|
|
221
|
+
if (mountKeys.length > 0) {
|
|
222
|
+
return assembleGroupedTrajectory(artifacts, mountKeys, maxTextChars, opts.maxFrames);
|
|
223
|
+
}
|
|
224
|
+
// FLAT path: project over the run commit log, bucketed by injection-engine loop heads.
|
|
225
|
+
const commitLog = (artifacts.snapshot.commitLog ?? []);
|
|
226
|
+
const lastIdxOf = new Map();
|
|
227
|
+
for (let i = 0; i < commitLog.length; i++)
|
|
228
|
+
lastIdxOf.set(commitLog[i].runtimeStageId, i);
|
|
229
|
+
const readsOf = buildReadsOf(artifacts.snapshot.executionTree);
|
|
230
|
+
const heads = findLoopHeads(commitLog);
|
|
231
|
+
const { frames: buckets, prelude } = bucketByAnchors(commitLog, heads);
|
|
232
|
+
const kept = opts.maxFrames !== undefined ? buckets.slice(0, opts.maxFrames) : buckets;
|
|
233
|
+
const truncated = opts.maxFrames !== undefined && buckets.length > opts.maxFrames;
|
|
234
|
+
const frames = kept.map((bucket, loopIndex) => projectFrame(loopIndex, commitLog, lastIdxOf, readsOf, bucket.headArrayIdx, bucket.bodyIds, maxTextChars));
|
|
235
|
+
return { frames, prelude, honestyFlags: [], ...(truncated ? { truncated: { byFrames: true } } : {}) };
|
|
236
|
+
}
|
|
237
|
+
//# 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,193 @@
|
|
|
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
|
+
// The WALK-ONLY proximate tool source (proposal 008) — the cross-loop descent edge. NOT in
|
|
42
|
+
// contextSources (L3 never scored it); walkTrajectory adds it as a hop candidate.
|
|
43
|
+
const tool = frame.proximateToolSource;
|
|
44
|
+
if (tool && typeof tool.value?.toolName === 'string') {
|
|
45
|
+
const name = tool.value.toolName;
|
|
46
|
+
if (!map.has(name))
|
|
47
|
+
map.set(name, tool.writerId);
|
|
48
|
+
}
|
|
49
|
+
return map;
|
|
50
|
+
}
|
|
51
|
+
/** A minimal Suspect for ablationForSuspect (only kind + detail identity are read). */
|
|
52
|
+
function suspectFor(suspectId, kind) {
|
|
53
|
+
const detail = kind === 'tool' ? { toolName: suspectId } : { injectionId: suspectId };
|
|
54
|
+
return {
|
|
55
|
+
source: suspectId, stageName: suspectId, kind, detail,
|
|
56
|
+
score: 0, structuralScore: 0, hasContentEvidence: false, edgePath: [],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Walk backward from the symptom to the root context source — from a recorded run.
|
|
61
|
+
* Thin wrapper: `assembleTrajectory` then {@link walkTrajectory}. See module docs for the honesty model.
|
|
62
|
+
*/
|
|
63
|
+
export async function walkToRoot(artifacts, opts) {
|
|
64
|
+
return walkTrajectory(assembleTrajectory(artifacts), opts);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The walk itself, over an already-assembled {@link Trajectory} (composable + directly testable).
|
|
68
|
+
* FLAT charts only for the cross-loop hop; grouped charts degrade (within-loop) with a flag.
|
|
69
|
+
*/
|
|
70
|
+
export async function walkTrajectory(trajectory, opts) {
|
|
71
|
+
const beamK = opts.beamK ?? 2;
|
|
72
|
+
const maxHops = opts.maxHops ?? 8;
|
|
73
|
+
const maxAblations = opts.maxAblations ?? 24;
|
|
74
|
+
const classify = opts.classifier ?? defaultSuspectClassifier;
|
|
75
|
+
const honestyFlags = [...trajectory.honestyFlags];
|
|
76
|
+
const grouped = trajectory.frames.some((f) => f.subflowScope !== undefined);
|
|
77
|
+
if (grouped) {
|
|
78
|
+
honestyFlags.push({
|
|
79
|
+
flag: 'untracked-sources',
|
|
80
|
+
note: 'cross-loop hop unavailable for the grouped chart — loop frames are scope-isolated; the walk degrades to within one loop.',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const writerFrame = buildWriterFrameIndex(trajectory);
|
|
84
|
+
// Baseline stability (the un-ablated scenario must reproduce for any ablation verdict to be trusted).
|
|
85
|
+
let baselineStable = true;
|
|
86
|
+
let ablationsUsed = 0;
|
|
87
|
+
if (opts.rerun) {
|
|
88
|
+
const baseline = await runAblationProbe({ embedder: opts.embedder, rerun: opts.rerun }, []);
|
|
89
|
+
ablationsUsed++;
|
|
90
|
+
baselineStable = !probeFlipped(baseline);
|
|
91
|
+
}
|
|
92
|
+
const hops = [];
|
|
93
|
+
const visited = new Set();
|
|
94
|
+
let frameIdx = trajectory.frames.length - 1; // start at the symptom (final loop)
|
|
95
|
+
let byHops = false;
|
|
96
|
+
let byAblations = false;
|
|
97
|
+
while (frameIdx >= 0) {
|
|
98
|
+
if (hops.length >= maxHops) {
|
|
99
|
+
byHops = true;
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
const frame = trajectory.frames[frameIdx];
|
|
103
|
+
// NARROW: rank THIS loop's suspects by per-loop influence (single-frame sub-trajectory).
|
|
104
|
+
const sub = { frames: [frame], prelude: [], honestyFlags: [] };
|
|
105
|
+
const shortlist = await shortlistEarlyCulprits(sub, {
|
|
106
|
+
embedder: opts.embedder,
|
|
107
|
+
...(opts.recencyDecay !== undefined ? { recencyDecay: opts.recencyDecay } : {}),
|
|
108
|
+
...(opts.k !== undefined ? { k: opts.k } : {}),
|
|
109
|
+
...(opts.signal ? { signal: opts.signal } : {}),
|
|
110
|
+
classifier: classify,
|
|
111
|
+
});
|
|
112
|
+
const beam = shortlist.candidates.slice(0, beamK);
|
|
113
|
+
if (beam.length === 0)
|
|
114
|
+
break;
|
|
115
|
+
const writtenBy = writtenByOf(frame);
|
|
116
|
+
const unseparated = beam.length >= 2 && Math.abs(beam[0].recallScore - beam[1].recallScore) < UNSEPARATED_MARGIN;
|
|
117
|
+
// ISOLATE: run-wide ablation of each NARROWED injection candidate; ablation is the only
|
|
118
|
+
// discriminator (a wrong-branch narrow that doesn't flip is never the root).
|
|
119
|
+
let chosen = beam[0];
|
|
120
|
+
let chosenVerdict;
|
|
121
|
+
let convicted = false;
|
|
122
|
+
if (opts.rerun) {
|
|
123
|
+
for (const cand of beam) {
|
|
124
|
+
if (ablationsUsed >= maxAblations) {
|
|
125
|
+
byAblations = true;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
const spec = ablationForSuspect(suspectFor(cand.suspectId, cand.kind));
|
|
129
|
+
if (spec === undefined)
|
|
130
|
+
continue;
|
|
131
|
+
const stats = await runAblationProbe({ embedder: opts.embedder, rerun: opts.rerun }, [spec]);
|
|
132
|
+
ablationsUsed++;
|
|
133
|
+
if (baselineStable && probeFlipped(stats)) {
|
|
134
|
+
chosen = cand;
|
|
135
|
+
chosenVerdict = verdictFor(`ablate ${cand.suspectId}`, stats, baselineStable);
|
|
136
|
+
convicted = true;
|
|
137
|
+
break; // ablation picked this loop's root
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// The proximate tool source (walk-only, proposal 008) is the cross-loop DESCENT edge. When this
|
|
142
|
+
// loop did NOT convict, follow it back to the loop that PRODUCED the tool output the decision was
|
|
143
|
+
// conditioned on — that's where a buried root (e.g. the misdirecting instruction) scores + convicts.
|
|
144
|
+
const toolName = !convicted && frame.proximateToolSource && typeof frame.proximateToolSource.value?.toolName === 'string'
|
|
145
|
+
? frame.proximateToolSource.value.toolName
|
|
146
|
+
: undefined;
|
|
147
|
+
if (toolName !== undefined)
|
|
148
|
+
chosen = { suspectId: toolName, kind: 'tool' };
|
|
149
|
+
const writer = writtenBy.get(chosen.suspectId);
|
|
150
|
+
const nextFrameIdx = writer !== undefined ? writerFrame.get(writer) : undefined;
|
|
151
|
+
const descendIdx = nextFrameIdx !== undefined && nextFrameIdx < frameIdx ? nextFrameIdx : undefined; // strictly backward
|
|
152
|
+
// Per-hop honest note: untracked-origin (structural — no provenance writer to descend) is set
|
|
153
|
+
// regardless of a rerun; unseparated-siblings flags a narrow that couldn't separate the top-2.
|
|
154
|
+
const inlineNote = writer === undefined ? 'untracked-origin' : unseparated && !convicted ? 'unseparated-siblings' : undefined;
|
|
155
|
+
hops.push({
|
|
156
|
+
loopIndex: frame.loopIndex,
|
|
157
|
+
suspectId: chosen.suspectId,
|
|
158
|
+
kind: chosen.kind,
|
|
159
|
+
narrowedBy: 'text-similarity',
|
|
160
|
+
...(chosenVerdict ? { verdict: chosenVerdict } : {}),
|
|
161
|
+
...(writer !== undefined ? { writtenBy: writer } : {}),
|
|
162
|
+
...(descendIdx !== undefined ? { cameFrom: trajectory.frames[descendIdx].loopIndex } : {}),
|
|
163
|
+
...(inlineNote ? { note: inlineNote } : {}),
|
|
164
|
+
});
|
|
165
|
+
if (convicted)
|
|
166
|
+
break; // root found at this loop (injections are same-loop-seeded — terminal)
|
|
167
|
+
const visitKey = `${chosen.suspectId}@${frame.loopIndex}`;
|
|
168
|
+
if (descendIdx === undefined || visited.has(visitKey))
|
|
169
|
+
break; // dead end / cycle
|
|
170
|
+
visited.add(visitKey);
|
|
171
|
+
frameIdx = descendIdx;
|
|
172
|
+
}
|
|
173
|
+
// root = the ablation-convicted hop (the walk breaks there).
|
|
174
|
+
let root;
|
|
175
|
+
for (const hop of hops)
|
|
176
|
+
if (hop.verdict?.verdict === 'confirmed')
|
|
177
|
+
root = hop;
|
|
178
|
+
// Terminal honesty note: a rerun ran but the walk ended without a causal root, AND the last hop
|
|
179
|
+
// had a descendable provenance writer (so it's "could-not-convict", not "untracked-origin").
|
|
180
|
+
if (opts.rerun && root === undefined && hops.length > 0) {
|
|
181
|
+
const last = hops[hops.length - 1];
|
|
182
|
+
if (last.note === undefined && last.writtenBy !== undefined) {
|
|
183
|
+
hops[hops.length - 1] = { ...last, note: 'overdetermined-or-incomplete' };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
hops,
|
|
188
|
+
...(root ? { root } : {}),
|
|
189
|
+
honestyFlags,
|
|
190
|
+
...(byHops || byAblations ? { truncated: { byHops, byAblations } } : {}),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//# 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":"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"}
|
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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"}
|