From cece8501201b92e28c076d0acd9aae740a5e1241 Mon Sep 17 00:00:00 2001 From: Dotta Date: Fri, 6 Nov 2026 05:35:00 -0600 Subject: [PATCH] fix(evals): observe visible current skill-review completion Co-Authored-By: Paperclip --- .../integrator-skill-review-visible.test.ts | 25 ++++++++ .../integrator-skill-update.test.ts | 31 +++++++++- .../integrator-skill-update.ts | 59 +++++++++++++++++-- 3 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 tests/runner-e2e/chat-catalog-domains/integrator-skill-review-visible.test.ts diff --git a/tests/runner-e2e/chat-catalog-domains/integrator-skill-review-visible.test.ts b/tests/runner-e2e/chat-catalog-domains/integrator-skill-review-visible.test.ts new file mode 100644 index 00000000000..daa0f6f1484 --- /dev/null +++ b/tests/runner-e2e/chat-catalog-domains/integrator-skill-review-visible.test.ts @@ -0,0 +1,25 @@ +// @vitest-environment jsdom +import { afterEach, beforeEach, expect, it, vi } from "vitest"; +import { readVisibleSkillReview } from "./integrator-skill-update.js"; +const input = { runId: "run", humanCommentId: "human" }; +const thread = (body: string) => `
Review before updating.
${body}
`; +const response = '
Installed 0.4

Regression tests; split forms into smaller steps. No update applied yet.

'; +beforeEach(() => { + vi.spyOn(Element.prototype, "getClientRects").mockReturnValue([{}] as unknown as DOMRectList); + // jsdom does not implement rendered innerText; the browser collector uses the real property. + Object.defineProperty(HTMLElement.prototype, "innerText", { configurable: true, get() { return this.textContent ?? ""; } }); + document.body.innerHTML = thread(response); +}); +afterEach(() => vi.restoreAllMocks()); +it("reads rendered current completion only, excluding reasoning and tool output", () => { + document.querySelector('[data-thread-anchor]')!.insertAdjacentHTML("afterbegin", '
PRIVATE REASONING
TOOL STDOUT
'); + expect(readVisibleSkillReview(input)).toContain("Installed 0.4"); + expect(readVisibleSkillReview(input)).not.toMatch(/PRIVATE|STDOUT|/); +}); +it("rejects hidden, foreign, old and ambiguously anchored conversation surfaces", () => { + for (const body of [response.replace('run:turn:0', 'old:turn:0'), response.replace('