agentfootprint 6.25.0 → 6.26.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 +183 -0
- package/dist/esm/lib/context-bisect/ablation.js.map +1 -0
- package/dist/esm/lib/context-bisect/bisect.js +129 -0
- package/dist/esm/lib/context-bisect/bisect.js.map +1 -0
- package/dist/esm/lib/context-bisect/index.js +22 -0
- package/dist/esm/lib/context-bisect/index.js.map +1 -0
- package/dist/esm/lib/context-bisect/llmEdgeWeigher.js +0 -0
- package/dist/esm/lib/context-bisect/llmEdgeWeigher.js.map +1 -0
- package/dist/esm/lib/context-bisect/localize.js +555 -0
- package/dist/esm/lib/context-bisect/localize.js.map +1 -0
- package/dist/esm/lib/context-bisect/types.js +56 -0
- package/dist/esm/lib/context-bisect/types.js.map +1 -0
- package/dist/esm/observe.js +7 -0
- package/dist/esm/observe.js.map +1 -1
- package/dist/lib/context-bisect/ablation.js +192 -0
- package/dist/lib/context-bisect/ablation.js.map +1 -0
- package/dist/lib/context-bisect/bisect.js +133 -0
- package/dist/lib/context-bisect/bisect.js.map +1 -0
- package/dist/lib/context-bisect/index.js +40 -0
- package/dist/lib/context-bisect/index.js.map +1 -0
- package/dist/lib/context-bisect/llmEdgeWeigher.js +0 -0
- package/dist/lib/context-bisect/llmEdgeWeigher.js.map +1 -0
- package/dist/lib/context-bisect/localize.js +563 -0
- package/dist/lib/context-bisect/localize.js.map +1 -0
- package/dist/lib/context-bisect/types.js +59 -0
- package/dist/lib/context-bisect/types.js.map +1 -0
- package/dist/observe.js +42 -20
- package/dist/observe.js.map +1 -1
- package/dist/types/lib/context-bisect/ablation.d.ts +97 -0
- package/dist/types/lib/context-bisect/ablation.d.ts.map +1 -0
- package/dist/types/lib/context-bisect/bisect.d.ts +76 -0
- package/dist/types/lib/context-bisect/bisect.d.ts.map +1 -0
- package/dist/types/lib/context-bisect/index.d.ts +22 -0
- package/dist/types/lib/context-bisect/index.d.ts.map +1 -0
- package/dist/types/lib/context-bisect/llmEdgeWeigher.d.ts +125 -0
- package/dist/types/lib/context-bisect/llmEdgeWeigher.d.ts.map +1 -0
- package/dist/types/lib/context-bisect/localize.d.ts +119 -0
- package/dist/types/lib/context-bisect/localize.d.ts.map +1 -0
- package/dist/types/lib/context-bisect/types.d.ts +356 -0
- package/dist/types/lib/context-bisect/types.d.ts.map +1 -0
- package/dist/types/observe.d.ts +1 -0
- package/dist/types/observe.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/esm/observe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/observe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,4BAA4B;AAC5B,OAAO,EAAE,eAAe,EAA+B,MAAM,qCAAqC,CAAC;AACnG,OAAO,EAAE,cAAc,EAA8B,MAAM,oCAAoC,CAAC;AAEhG,+BAA+B;AAC/B,OAAO,EACL,mBAAmB,GAEpB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,aAAa,EAA6B,MAAM,mCAAmC,CAAC;AAC7F,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GAgBjB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,GAQhB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,eAAe,EACf,cAAc,GAQf,MAAM,gDAAgD,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,oBAAoB,GAKrB,MAAM,gDAAgD,CAAC;AAExD,6BAA6B;AAC7B,OAAO,EAAE,YAAY,EAA4B,MAAM,kCAAkC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAA6B,MAAM,mCAAmC,CAAC;AAC7F,OAAO,EACL,wBAAwB,GAEzB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,YAAY,EAA4B,MAAM,kCAAkC,CAAC;AAC1F,OAAO,EAAE,cAAc,EAA8B,MAAM,oCAAoC,CAAC;AAChG,OAAO,EACL,kBAAkB,GAEnB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,aAAa,EAA6B,MAAM,mCAAmC,CAAC;AAC7F,OAAO,EACL,aAAa,EACb,cAAc,GAIf,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,YAAY,GAGb,MAAM,6CAA6C,CAAC;AACrD,4EAA4E;AAC5E,gFAAgF;AAChF,OAAO,EACL,mBAAmB,GAMpB,MAAM,kDAAkD,CAAC;AAC1D,gFAAgF;AAChF,gFAAgF;AAChF,OAAO,EACL,kBAAkB,GAQnB,MAAM,yDAAyD,CAAC;AAEjE,uDAAuD;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,uEAAuE;AACvE,uEAAuE;AACvE,uEAAuE;AACvE,oEAAoE;AACpE,oEAAoE;AACpE,kEAAkE;AAClE,eAAe;AACf,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,EAC7B,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,WAAW,EACX,mBAAmB,GAiBpB,MAAM,+BAA+B,CAAC;AACvC,uEAAuE;AACvE,2EAA2E;AAC3E,mEAAmE;AACnE,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,aAAa,GAGd,MAAM,+BAA+B,CAAC;AACvC,wEAAwE;AACxE,8EAA8E;AAC9E,qEAAqE;AACrE,wEAAwE;AACxE,uEAAuE;AACvE,gEAAgE;AAChE,gDAAgD;AAChD,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,+BAA+B,EAC/B,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,GAepB,MAAM,0BAA0B,CAAC;AAClC,sEAAsE;AACtE,uEAAuE;AACvE,qEAAqE;AACrE,oEAAoE;AACpE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAOnB,MAAM,iDAAiD,CAAC"}
|
|
1
|
+
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/observe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ablation — the counterfactual seam (RFC-003 Part B, D8 stage 4 + the
|
|
4
|
+
* D9 stats engine).
|
|
5
|
+
*
|
|
6
|
+
* Three pieces:
|
|
7
|
+
*
|
|
8
|
+
* 1. **Adapters** — `ablationForSuspect` maps a classified suspect to
|
|
9
|
+
* the spec that removes it (tool → drop from catalog; injection /
|
|
10
|
+
* fact / skill → exclude the `Injection.id`; memory → filter the
|
|
11
|
+
* `MemoryEntry.id`; arg → consumer-override note).
|
|
12
|
+
*
|
|
13
|
+
* 2. **The seam** — `applyAblations` filters the inputs an agent is
|
|
14
|
+
* BUILT from. Documented here because the seam did not previously
|
|
15
|
+
* exist: `AgentOptions` has no `ignoredTools` runtime kill-switch, so
|
|
16
|
+
* tool ablation happens at construction (the consumer's
|
|
17
|
+
* `AblationRunner` rebuilds the agent from filtered inputs). Same for
|
|
18
|
+
* injections and memory entries.
|
|
19
|
+
*
|
|
20
|
+
* 3. **The probe engine** — `runAblationProbe` calls the consumer's
|
|
21
|
+
* runner N seeded times, measures embedding similarity to the
|
|
22
|
+
* original output, counts outcome flips, and returns variance —
|
|
23
|
+
* never a single-run verdict (D9 discipline).
|
|
24
|
+
*
|
|
25
|
+
* §B2: only `runAblationProbe`-derived verdicts are causal claims; every
|
|
26
|
+
* score elsewhere is a correlational proxy.
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.verdictFor = exports.probeFlipped = exports.runAblationProbe = exports.defaultOutcomeComparator = exports.applyAblations = exports.ablationForSuspect = void 0;
|
|
30
|
+
const cosine_js_1 = require("../../memory/embedding/cosine.js");
|
|
31
|
+
const types_js_1 = require("./types.js");
|
|
32
|
+
// ─── Adapters: suspect → spec ────────────────────────────────────────
|
|
33
|
+
/**
|
|
34
|
+
* The spec that removes one suspect — or `undefined` for kind `'stage'`
|
|
35
|
+
* (plain pipeline stages have no removable input; re-rank or refactor).
|
|
36
|
+
*/
|
|
37
|
+
function ablationForSuspect(suspect) {
|
|
38
|
+
switch (suspect.kind) {
|
|
39
|
+
case 'tool':
|
|
40
|
+
return suspect.detail?.toolName !== undefined
|
|
41
|
+
? { kind: 'tool', ignoredTools: [suspect.detail.toolName] }
|
|
42
|
+
: undefined;
|
|
43
|
+
case 'injection':
|
|
44
|
+
return suspect.detail?.injectionId !== undefined
|
|
45
|
+
? { kind: 'injection', excludeInjectionIds: [suspect.detail.injectionId] }
|
|
46
|
+
: undefined;
|
|
47
|
+
case 'memory':
|
|
48
|
+
return suspect.detail?.injectionId !== undefined
|
|
49
|
+
? { kind: 'memory', excludeMemoryIds: [suspect.detail.injectionId] }
|
|
50
|
+
: undefined;
|
|
51
|
+
case 'arg':
|
|
52
|
+
return {
|
|
53
|
+
kind: 'arg',
|
|
54
|
+
source: suspect.source,
|
|
55
|
+
note: `step ${suspect.source} consumed untracked run input ($getArgs()/env) — ` +
|
|
56
|
+
`the runner must override the input itself; the library cannot filter it.`,
|
|
57
|
+
};
|
|
58
|
+
case 'stage':
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.ablationForSuspect = ablationForSuspect;
|
|
63
|
+
/**
|
|
64
|
+
* Apply ablation specs to the inputs an agent is constructed from —
|
|
65
|
+
* THE documented seam (see module docs). Generic over the concrete tool /
|
|
66
|
+
* injection / memory-entry types so it filters without importing them.
|
|
67
|
+
*
|
|
68
|
+
* `'arg'` specs are deliberately NOT handled here: run input belongs to
|
|
69
|
+
* the consumer's runner (`spec.note` says so).
|
|
70
|
+
*
|
|
71
|
+
* @example inside an AblationRunner
|
|
72
|
+
* ```ts
|
|
73
|
+
* const { tools, injections } = applyAblations(specs, {
|
|
74
|
+
* tools: ALL_TOOLS, injections: ALL_FACTS,
|
|
75
|
+
* });
|
|
76
|
+
* const agent = Agent.create({ provider: freshProvider(), model })
|
|
77
|
+
* .tools([...tools]);
|
|
78
|
+
* for (const inj of injections) agent.fact(inj);
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
function applyAblations(specs, targets) {
|
|
82
|
+
const ignoredTools = new Set();
|
|
83
|
+
const excludedInjections = new Set();
|
|
84
|
+
const excludedMemory = new Set();
|
|
85
|
+
for (const spec of specs) {
|
|
86
|
+
if (spec.kind === 'tool')
|
|
87
|
+
for (const name of spec.ignoredTools)
|
|
88
|
+
ignoredTools.add(name);
|
|
89
|
+
if (spec.kind === 'injection')
|
|
90
|
+
for (const id of spec.excludeInjectionIds)
|
|
91
|
+
excludedInjections.add(id);
|
|
92
|
+
if (spec.kind === 'memory')
|
|
93
|
+
for (const id of spec.excludeMemoryIds)
|
|
94
|
+
excludedMemory.add(id);
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
tools: (targets.tools ?? []).filter((tool) => !ignoredTools.has(tool.schema.name)),
|
|
98
|
+
injections: (targets.injections ?? []).filter((injection) => !excludedInjections.has(injection.id)),
|
|
99
|
+
memoryEntries: (targets.memoryEntries ?? []).filter((entry) => !excludedMemory.has(entry.id)),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
exports.applyAblations = applyAblations;
|
|
103
|
+
// ─── The probe engine (D9 stats) ─────────────────────────────────────
|
|
104
|
+
function similarityStats(values) {
|
|
105
|
+
if (values.length === 0)
|
|
106
|
+
return { mean: 0, min: 0, max: 0, stdev: 0 };
|
|
107
|
+
const mean = values.reduce((sum, v) => sum + v, 0) / values.length;
|
|
108
|
+
const variance = values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / values.length;
|
|
109
|
+
return {
|
|
110
|
+
mean,
|
|
111
|
+
min: Math.min(...values),
|
|
112
|
+
max: Math.max(...values),
|
|
113
|
+
stdev: Math.sqrt(variance),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/** The default comparator: embedding similarity below the threshold. */
|
|
117
|
+
function defaultOutcomeComparator(embedder, flipThreshold) {
|
|
118
|
+
return async (original, ablated) => {
|
|
119
|
+
const [a, b] = await Promise.all([
|
|
120
|
+
embedder.embed({ text: original }),
|
|
121
|
+
embedder.embed({ text: ablated }),
|
|
122
|
+
]);
|
|
123
|
+
return (0, cosine_js_1.cosineSimilarity)(a, b) < flipThreshold;
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
exports.defaultOutcomeComparator = defaultOutcomeComparator;
|
|
127
|
+
/**
|
|
128
|
+
* Run ONE probe: call the consumer's runner with `specs` once per seed
|
|
129
|
+
* (0..samples-1), measure each output's embedding similarity to the
|
|
130
|
+
* original, and count outcome flips. Variance is always reported.
|
|
131
|
+
*
|
|
132
|
+
* `samples` is clamped to ≥ 2 — D9: never single-run verdicts.
|
|
133
|
+
*/
|
|
134
|
+
async function runAblationProbe(config, specs) {
|
|
135
|
+
const samples = Math.max(2, config.rerun.samples ?? types_js_1.CONTEXT_BISECT_DEFAULTS.samples);
|
|
136
|
+
const flipThreshold = config.rerun.flipThreshold ?? types_js_1.CONTEXT_BISECT_DEFAULTS.flipThreshold;
|
|
137
|
+
const outcomeChanged = config.rerun.outcomeChanged ?? defaultOutcomeComparator(config.embedder, flipThreshold);
|
|
138
|
+
const similarities = [];
|
|
139
|
+
let flips = 0;
|
|
140
|
+
const originalVec = await config.embedder.embed({ text: config.rerun.originalOutput });
|
|
141
|
+
for (let seed = 0; seed < samples; seed++) {
|
|
142
|
+
const output = await config.rerun.runner(specs, { seed });
|
|
143
|
+
const outputVec = await config.embedder.embed({ text: output });
|
|
144
|
+
similarities.push((0, cosine_js_1.cosineSimilarity)(originalVec, outputVec));
|
|
145
|
+
if (await outcomeChanged(config.rerun.originalOutput, output))
|
|
146
|
+
flips++;
|
|
147
|
+
}
|
|
148
|
+
return { samples, flips, similarity: similarityStats(similarities) };
|
|
149
|
+
}
|
|
150
|
+
exports.runAblationProbe = runAblationProbe;
|
|
151
|
+
/** Majority-flip rule shared by D8 verdicts and D9 probes. */
|
|
152
|
+
function probeFlipped(stats) {
|
|
153
|
+
return stats.flips * 2 > stats.samples;
|
|
154
|
+
}
|
|
155
|
+
exports.probeFlipped = probeFlipped;
|
|
156
|
+
/**
|
|
157
|
+
* Translate probe evidence into the verdict — the ONLY causal claim tier
|
|
158
|
+
* (§B2). `baselineStable=false` (the un-ablated scenario itself flipped)
|
|
159
|
+
* forces `'inconclusive'`: no ablation verdict is trustworthy on an
|
|
160
|
+
* unstable baseline.
|
|
161
|
+
*/
|
|
162
|
+
function verdictFor(label, stats, baselineStable) {
|
|
163
|
+
if (!baselineStable) {
|
|
164
|
+
return {
|
|
165
|
+
verdict: 'inconclusive',
|
|
166
|
+
claim: `INCONCLUSIVE: the un-ablated baseline itself changed outcome across seeded reruns — ` +
|
|
167
|
+
`no ablation verdict for ${label} is trustworthy on an unstable scenario.`,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if (probeFlipped(stats)) {
|
|
171
|
+
return {
|
|
172
|
+
verdict: 'confirmed',
|
|
173
|
+
claim: `CAUSAL: ablating ${label} flipped the outcome in ${stats.flips}/${stats.samples} ` +
|
|
174
|
+
`seeded reruns (mean similarity to original ${stats.similarity.mean.toFixed(3)} ` +
|
|
175
|
+
`± ${stats.similarity.stdev.toFixed(3)}).`,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
if (stats.flips > 0) {
|
|
179
|
+
return {
|
|
180
|
+
verdict: 'inconclusive',
|
|
181
|
+
claim: `INCONCLUSIVE: ablating ${label} flipped only ${stats.flips}/${stats.samples} seeded ` +
|
|
182
|
+
`reruns — below majority; raise samples or check scenario stability.`,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
verdict: 'not-confirmed',
|
|
187
|
+
claim: `NOT CONFIRMED: ablating ${label} did not change the outcome in ${stats.samples} seeded ` +
|
|
188
|
+
`reruns — its ranking remains a correlational proxy only.`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
exports.verdictFor = verdictFor;
|
|
192
|
+
//# sourceMappingURL=ablation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ablation.js","sourceRoot":"","sources":["../../../src/lib/context-bisect/ablation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* bisectCulprits — multi-culprit bisection over the ranked suspect set
|
|
4
|
+
* (RFC-003 Part B, block D9). The "git bisect" of the localizer.
|
|
5
|
+
*
|
|
6
|
+
* When single-suspect ablations don't flip the outcome — redundant causes
|
|
7
|
+
* (two facts that EACH justify the wrong answer), or interacting ones —
|
|
8
|
+
* the culprit is a SET. This harness finds a minimal culprit set by
|
|
9
|
+
* recursive halving over the ranked suspects (delta-debugging style,
|
|
10
|
+
* Zeller's ddmin specialized to two-way splits), then keeps searching the
|
|
11
|
+
* remainder for INDEPENDENT culprits until the remainder stops flipping.
|
|
12
|
+
*
|
|
13
|
+
* Probe semantics (the D9 discipline):
|
|
14
|
+
* - every probe = N seeded reruns of the consumer's `AblationRunner`
|
|
15
|
+
* with the probe's combined specs; "flipped" = MAJORITY of runs
|
|
16
|
+
* changed outcome; similarity mean ± spread is always reported —
|
|
17
|
+
* never single-run verdicts;
|
|
18
|
+
* - probe 0 is the BASELINE (no ablation): if it flips, the scenario
|
|
19
|
+
* itself is unstable and the result is honestly `'inconclusive'`;
|
|
20
|
+
* - probes are cached by spec-set, and budgeted (`maxProbes`) — running
|
|
21
|
+
* out of budget yields `'inconclusive'`, never a partial claim
|
|
22
|
+
* dressed up as a finding.
|
|
23
|
+
*
|
|
24
|
+
* §B2: the returned `verdict`/`culprits` are CAUSAL claims — they rest
|
|
25
|
+
* exclusively on counterfactual reruns. The input ranking only chooses
|
|
26
|
+
* the SEARCH ORDER (better ranking = fewer probes), it never decides the
|
|
27
|
+
* outcome.
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.bisectCulprits = void 0;
|
|
31
|
+
const ablation_js_1 = require("./ablation.js");
|
|
32
|
+
const types_js_1 = require("./types.js");
|
|
33
|
+
const localize_js_1 = require("./localize.js");
|
|
34
|
+
// ─── The harness ─────────────────────────────────────────────────────
|
|
35
|
+
class ProbeBudgetExceeded extends Error {
|
|
36
|
+
constructor() {
|
|
37
|
+
super('probe budget exceeded');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Find minimal culprit set(s) by seeded counterfactual bisection. See
|
|
42
|
+
* module docs for semantics and the §B2 claim tier.
|
|
43
|
+
*/
|
|
44
|
+
async function bisectCulprits(options) {
|
|
45
|
+
const candidates = options.suspects.filter((suspect) => suspect.ablation !== undefined && suspect.ablation.kind !== 'arg');
|
|
46
|
+
const maxProbes = options.maxProbes ?? types_js_1.CONTEXT_BISECT_DEFAULTS.maxProbes;
|
|
47
|
+
const maxCulprits = options.maxCulprits ?? types_js_1.CONTEXT_BISECT_DEFAULTS.maxCulprits;
|
|
48
|
+
const config = { rerun: options.rerun, embedder: options.embedder };
|
|
49
|
+
const probes = [];
|
|
50
|
+
const cache = new Map();
|
|
51
|
+
let runsUsed = 0;
|
|
52
|
+
const keyOf = (set) => set
|
|
53
|
+
.map((suspect) => (0, localize_js_1.suspectLabel)(suspect))
|
|
54
|
+
.sort()
|
|
55
|
+
.join('|');
|
|
56
|
+
async function probe(set) {
|
|
57
|
+
const key = keyOf(set);
|
|
58
|
+
const cached = cache.get(key);
|
|
59
|
+
if (cached !== undefined)
|
|
60
|
+
return cached;
|
|
61
|
+
if (probes.length >= maxProbes)
|
|
62
|
+
throw new ProbeBudgetExceeded();
|
|
63
|
+
const stats = await (0, ablation_js_1.runAblationProbe)(config, set.flatMap((suspect) => (suspect.ablation !== undefined ? [suspect.ablation] : [])));
|
|
64
|
+
runsUsed += stats.samples;
|
|
65
|
+
const flipped = (0, ablation_js_1.probeFlipped)(stats);
|
|
66
|
+
probes.push({ ablated: set.map((suspect) => (0, localize_js_1.suspectLabel)(suspect)), stats, flipped });
|
|
67
|
+
cache.set(key, flipped);
|
|
68
|
+
return flipped;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Minimal subset of `candidates` that — together with `context` — flips
|
|
72
|
+
* the outcome. Precondition: probe(candidates ∪ context) flipped.
|
|
73
|
+
* Two-way ddmin: try each half; on interference (neither half alone
|
|
74
|
+
* suffices) minimize each half with the other as context.
|
|
75
|
+
*/
|
|
76
|
+
async function minimize(set, context) {
|
|
77
|
+
if (set.length <= 1)
|
|
78
|
+
return [...set];
|
|
79
|
+
const mid = Math.ceil(set.length / 2);
|
|
80
|
+
const top = set.slice(0, mid); // ranked order: the likelier half first
|
|
81
|
+
const rest = set.slice(mid);
|
|
82
|
+
if (await probe([...top, ...context]))
|
|
83
|
+
return minimize(top, context);
|
|
84
|
+
if (await probe([...rest, ...context]))
|
|
85
|
+
return minimize(rest, context);
|
|
86
|
+
// Interference: parts of BOTH halves are needed jointly.
|
|
87
|
+
const fromTop = await minimize(top, [...rest, ...context]);
|
|
88
|
+
const fromRest = await minimize(rest, [...fromTop, ...context]);
|
|
89
|
+
return [...fromTop, ...fromRest];
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
// Baseline: an unstable scenario invalidates everything downstream.
|
|
93
|
+
// ZERO-TOLERANCE (review Finding 1): a single un-ablated flip marks the
|
|
94
|
+
// scenario unstable — the majority-rule probeFlipped() gate would let a
|
|
95
|
+
// 1-in-3-flaky scenario through to a 'confirmed' CAUSAL verdict, which
|
|
96
|
+
// violates the §B2 honest-claims discipline. Same gate localize.ts uses.
|
|
97
|
+
{
|
|
98
|
+
const baselineStats = await (0, ablation_js_1.runAblationProbe)(config, []);
|
|
99
|
+
runsUsed += baselineStats.samples;
|
|
100
|
+
const unstable = baselineStats.flips > 0;
|
|
101
|
+
probes.push({ ablated: [], stats: baselineStats, flipped: unstable });
|
|
102
|
+
cache.set(keyOf([]), (0, ablation_js_1.probeFlipped)(baselineStats));
|
|
103
|
+
if (unstable) {
|
|
104
|
+
return { verdict: 'inconclusive', culprits: [], probes, runsUsed };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Reproduction gate: the full ranked set must flip at all.
|
|
108
|
+
if (candidates.length === 0 || !(await probe(candidates))) {
|
|
109
|
+
return { verdict: 'not-reproducible', culprits: [], probes, runsUsed };
|
|
110
|
+
}
|
|
111
|
+
// Find minimal sets; then keep searching the remainder for
|
|
112
|
+
// INDEPENDENT culprits until it stops flipping.
|
|
113
|
+
const culprits = [];
|
|
114
|
+
let remaining = candidates;
|
|
115
|
+
for (let round = 0; round < maxCulprits; round++) {
|
|
116
|
+
const found = await minimize(remaining, []);
|
|
117
|
+
culprits.push(found);
|
|
118
|
+
const foundKeys = new Set(found.map((suspect) => (0, localize_js_1.suspectLabel)(suspect)));
|
|
119
|
+
remaining = remaining.filter((suspect) => !foundKeys.has((0, localize_js_1.suspectLabel)(suspect)));
|
|
120
|
+
if (remaining.length === 0 || !(await probe(remaining)))
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
return { verdict: 'confirmed', culprits, probes, runsUsed };
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (error instanceof ProbeBudgetExceeded) {
|
|
127
|
+
return { verdict: 'inconclusive', culprits: [], probes, runsUsed };
|
|
128
|
+
}
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
exports.bisectCulprits = bisectCulprits;
|
|
133
|
+
//# sourceMappingURL=bisect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bisect.js","sourceRoot":"","sources":["../../../src/lib/context-bisect/bisect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* context-bisect — RFC-003 Part B: the contextual-bug LOCALIZER,
|
|
4
|
+
* "git bisect for context".
|
|
5
|
+
*
|
|
6
|
+
* Assembly over shipped pieces: footprintjs 9.8.0's complete causal DAG
|
|
7
|
+
* (control edges, honesty markers, `EdgeWeigher` hook) × influence-core
|
|
8
|
+
* scoring (D6) × consumer-run counterfactual ablation.
|
|
9
|
+
*
|
|
10
|
+
* D7 — `llmEdgeWeigher` influence-weighted LLM-call slice edges
|
|
11
|
+
* D8 — `localizeContextBug` trigger → slice → ranked suspects → ablation
|
|
12
|
+
* D9 — `bisectCulprits` seeded multi-culprit bisection + variance
|
|
13
|
+
*
|
|
14
|
+
* §B2 claim tiers (spelled out on every type): weights/scores are
|
|
15
|
+
* embedding-geometry PROXIES; ablation verdicts are the ONLY causal
|
|
16
|
+
* claims; slice completeness is bounded by tracking — and says so.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.CONTEXT_BISECT_DEFAULTS = exports.bisectCulprits = exports.verdictFor = exports.runAblationProbe = exports.probeFlipped = exports.defaultOutcomeComparator = exports.applyAblations = exports.ablationForSuspect = exports.suspectLabel = exports.localizeContextBug = exports.llmCallIdsFromEvents = exports.formatContextBugReport = exports.defaultSuspectClassifier = exports.stepOutputText = exports.llmEdgeWeigher = void 0;
|
|
20
|
+
var llmEdgeWeigher_js_1 = require("./llmEdgeWeigher.js");
|
|
21
|
+
Object.defineProperty(exports, "llmEdgeWeigher", { enumerable: true, get: function () { return llmEdgeWeigher_js_1.llmEdgeWeigher; } });
|
|
22
|
+
Object.defineProperty(exports, "stepOutputText", { enumerable: true, get: function () { return llmEdgeWeigher_js_1.stepOutputText; } });
|
|
23
|
+
var localize_js_1 = require("./localize.js");
|
|
24
|
+
Object.defineProperty(exports, "defaultSuspectClassifier", { enumerable: true, get: function () { return localize_js_1.defaultSuspectClassifier; } });
|
|
25
|
+
Object.defineProperty(exports, "formatContextBugReport", { enumerable: true, get: function () { return localize_js_1.formatContextBugReport; } });
|
|
26
|
+
Object.defineProperty(exports, "llmCallIdsFromEvents", { enumerable: true, get: function () { return localize_js_1.llmCallIdsFromEvents; } });
|
|
27
|
+
Object.defineProperty(exports, "localizeContextBug", { enumerable: true, get: function () { return localize_js_1.localizeContextBug; } });
|
|
28
|
+
Object.defineProperty(exports, "suspectLabel", { enumerable: true, get: function () { return localize_js_1.suspectLabel; } });
|
|
29
|
+
var ablation_js_1 = require("./ablation.js");
|
|
30
|
+
Object.defineProperty(exports, "ablationForSuspect", { enumerable: true, get: function () { return ablation_js_1.ablationForSuspect; } });
|
|
31
|
+
Object.defineProperty(exports, "applyAblations", { enumerable: true, get: function () { return ablation_js_1.applyAblations; } });
|
|
32
|
+
Object.defineProperty(exports, "defaultOutcomeComparator", { enumerable: true, get: function () { return ablation_js_1.defaultOutcomeComparator; } });
|
|
33
|
+
Object.defineProperty(exports, "probeFlipped", { enumerable: true, get: function () { return ablation_js_1.probeFlipped; } });
|
|
34
|
+
Object.defineProperty(exports, "runAblationProbe", { enumerable: true, get: function () { return ablation_js_1.runAblationProbe; } });
|
|
35
|
+
Object.defineProperty(exports, "verdictFor", { enumerable: true, get: function () { return ablation_js_1.verdictFor; } });
|
|
36
|
+
var bisect_js_1 = require("./bisect.js");
|
|
37
|
+
Object.defineProperty(exports, "bisectCulprits", { enumerable: true, get: function () { return bisect_js_1.bisectCulprits; } });
|
|
38
|
+
var types_js_1 = require("./types.js");
|
|
39
|
+
Object.defineProperty(exports, "CONTEXT_BISECT_DEFAULTS", { enumerable: true, get: function () { return types_js_1.CONTEXT_BISECT_DEFAULTS; } });
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/context-bisect/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAEH,yDAM6B;AAL3B,mHAAA,cAAc,OAAA;AACd,mHAAA,cAAc,OAAA;AAMhB,6CAUuB;AATrB,uHAAA,wBAAwB,OAAA;AACxB,qHAAA,sBAAsB,OAAA;AACtB,mHAAA,oBAAoB,OAAA;AACpB,iHAAA,kBAAkB,OAAA;AAClB,2GAAA,YAAY,OAAA;AAOd,6CASuB;AARrB,iHAAA,kBAAkB,OAAA;AAClB,6GAAA,cAAc,OAAA;AACd,uHAAA,wBAAwB,OAAA;AACxB,2GAAA,YAAY,OAAA;AACZ,+GAAA,gBAAgB,OAAA;AAChB,yGAAA,UAAU,OAAA;AAKZ,yCAKqB;AAJnB,2GAAA,cAAc,OAAA;AAMhB,uCAqBoB;AApBlB,mHAAA,uBAAuB,OAAA"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llmEdgeWeigher.js","sourceRoot":"","sources":["../../../src/lib/context-bisect/llmEdgeWeigher.ts"],"names":[],"mappings":"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"}
|