






















@@ -223,6 +223,68 @@ describe("qa tool coverage report", () => {
223223);
224224});
225225226+it("keeps searchable OpenClaw dynamic tool rows report-only by default", () => {
227+const report = buildQaToolCoverageReport({
228+scenarios: [
229+makeScenario("tool-searchable-web-search", "web-search", {
230+toolName: "web_search",
231+toolCoverage: {
232+bucket: "openclaw-dynamic-integration",
233+expectedLayer: "openclaw-dynamic",
234+capabilityLayer: "openclaw-dynamic-searchable",
235+},
236+}),
237+],
238+summary: {
239+scenarios: [
240+{
241+name: "tool web_search searchable",
242+status: "fail",
243+runtimeParity: {
244+scenarioId: "tool-searchable-web-search",
245+drift: "tool-call-shape",
246+driftDetails: "searchable discovery was report-only",
247+cells: {
248+pi: {
249+runtime: "pi",
250+transcriptBytes: "",
251+toolCalls: [{ tool: "web_search", argsHash: "a", resultHash: "r" }],
252+finalText: "",
253+usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
254+wallClockMs: 1,
255+bootStateLines: [],
256+},
257+codex: {
258+runtime: "codex",
259+transcriptBytes: "",
260+toolCalls: [],
261+finalText: "",
262+usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
263+wallClockMs: 1,
264+bootStateLines: [],
265+},
266+},
267+},
268+},
269+],
270+},
271+generatedAt: "2026-05-10T00:00:00.000Z",
272+});
273+274+expect(report.pass).toBe(true);
275+expect(report.failures).toEqual([]);
276+expect(report.reportOnlyTools).toBe(1);
277+expect(report.passingTools).toBe(0);
278+expect(report.searchableDynamicTools).toBe(1);
279+expect(report.rows[0]).toEqual(
280+expect.objectContaining({
281+capabilityLayer: "openclaw-dynamic-searchable",
282+required: false,
283+drift: "tool-call-shape",
284+}),
285+);
286+});
287+226288it("passes required OpenClaw dynamic tool coverage when both runtimes exercise the tool", () => {
227289const report = buildQaToolCoverageReport({
228290scenarios: [
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。