

























@@ -223,6 +223,83 @@ describe("qa tool coverage report", () => {
223223);
224224});
225225226+it("fails untracked required OpenClaw dynamic tool drift", () => {
227+const report = buildQaToolCoverageReport({
228+scenarios: [
229+makeScenario("tool-web-search", "web-search", {
230+toolName: "web_search",
231+toolCoverage: {
232+bucket: "openclaw-dynamic-integration",
233+expectedLayer: "openclaw-dynamic",
234+capabilityLayer: "openclaw-dynamic-direct",
235+required: true,
236+},
237+}),
238+],
239+summary: {
240+scenarios: [
241+{
242+name: "tool web_search",
243+status: "fail",
244+runtimeParity: {
245+scenarioId: "tool-web-search",
246+drift: "tool-call-shape",
247+driftDetails: "Codex emitted no web_search call",
248+cells: {
249+pi: {
250+runtime: "pi",
251+transcriptBytes: "",
252+toolCalls: [{ tool: "web_search", argsHash: "a", resultHash: "r" }],
253+finalText: "",
254+usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
255+wallClockMs: 1,
256+bootStateLines: [],
257+},
258+codex: {
259+runtime: "codex",
260+transcriptBytes: "",
261+toolCalls: [],
262+finalText: "",
263+usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
264+wallClockMs: 1,
265+bootStateLines: [],
266+},
267+},
268+},
269+},
270+],
271+},
272+generatedAt: "2026-05-10T00:00:00.000Z",
273+});
274+275+expect(report.pass).toBe(false);
276+expect(report.failures).toEqual([
277+"web-search drift=tool-call-shape (Codex emitted no web_search call)",
278+]);
279+});
280+281+it("fails untracked required tools missing from an evaluated summary", () => {
282+const report = buildQaToolCoverageReport({
283+scenarios: [
284+makeScenario("tool-web-search", "web-search", {
285+toolCoverage: {
286+bucket: "openclaw-dynamic-integration",
287+expectedLayer: "openclaw-dynamic",
288+capabilityLayer: "openclaw-dynamic-direct",
289+required: true,
290+},
291+}),
292+],
293+summary: {
294+scenarios: [],
295+},
296+generatedAt: "2026-05-10T00:00:00.000Z",
297+});
298+299+expect(report.pass).toBe(false);
300+expect(report.failures).toEqual(["web-search drift=not-run"]);
301+});
302+226303it("rejects unknown runtime tool coverage buckets", () => {
227304expect(() =>
228305buildQaToolCoverageReport({
@@ -301,5 +378,13 @@ describe("qa tool coverage report", () => {
301378"#80173 Tavily tools are listed in the phase matrix but are not exposed by the current default tool surface.",
302379}),
303380);
381+expect(report.rows.find((row) => row.tool === "web-search")).toEqual(
382+expect.objectContaining({
383+bucket: "openclaw-dynamic-integration",
384+capabilityLayer: "openclaw-dynamic-direct",
385+required: true,
386+}),
387+);
388+expect(report.rows.find((row) => row.tool === "web-search")?.tracking).toBeUndefined();
304389});
305390});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。