惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MyScale Blog
MyScale Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
Y
Y Combinator Blog
月光博客
月光博客
IT之家
IT之家
T
Tailwind CSS Blog
Last Week in AI
Last Week in AI
L
LangChain Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
博客园 - Franky
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
V
Visual Studio Blog
小众软件
小众软件
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
test(qa): harden all-profile evidence scenarios (#96003) ...
RomneyDa · 2026-06-23 · via Recent Commits to openclaw:main
Original file line numberDiff line numberDiff line change

@@ -243,6 +243,9 @@ jobs:

243243

NODE_OPTIONS: --max-old-space-size=8192

244244

run: node scripts/build-all.mjs qaRuntime

245245
246+

- name: Ensure Playwright Chromium

247+

run: node scripts/ensure-playwright-chromium.mjs

248+
246249

- name: Run QA profile

247250

id: run_profile

248251

env:

Original file line numberDiff line numberDiff line change

@@ -3314,7 +3314,7 @@ describe("qa mock openai server", () => {

33143314

const toolPlanOutput = outputItem(await response.json());

33153315

expect(toolPlanOutput.type).toBe("function_call");

33163316

expect(toolPlanOutput.name).toBe("web_search");

3317-

expect(String(toolPlanOutput.arguments)).toContain("denied-input");

3317+

expect(String(toolPlanOutput.arguments)).toContain("OPENCLAW_QA_WEB_SEARCH_DENIED_INPUT");

33183318

});

33193319
33203320

it("plans QA subagent handoff calls even when Codex dynamic tools are not in body.tools", async () => {

Original file line numberDiff line numberDiff line change

@@ -5,6 +5,7 @@ import { setTimeout as sleep } from "node:timers/promises";

55

import { escapeRegExp } from "openclaw/plugin-sdk/text-utility-runtime";

66

import { readRequestBodyWithLimit } from "openclaw/plugin-sdk/webhook-ingress";

77

import { closeQaHttpServer } from "../../bus-server.js";

8+

import { QA_LAB_WEB_SEARCH_DENIED_INPUT_QUERY } from "../../qa-web-search-provider.js";

89

import { writeJson } from "../shared/http-json.js";

910
1011

type ResponsesInputItem = Record<string, unknown>;

@@ -860,6 +861,9 @@ function extractToolSearchTarget(text: string): string | null {

860861

}

861862
862863

function buildQaToolSearchArgs(targetTool: string, failureMode: boolean): Record<string, unknown> {

864+

if (failureMode && targetTool === "web_search") {

865+

return { query: QA_LAB_WEB_SEARCH_DENIED_INPUT_QUERY };

866+

}

863867

if (failureMode) {

864868

return { __qaFailureMode: "denied-input" };

865869

}

@@ -1535,49 +1539,57 @@ function buildToolCallEvents(prompt: string): StreamEvent[] {

15351539

function buildReleaseAuditJson() {

15361540

return `${JSON.stringify(

15371541

{

1538-

verified: true,

1542+

verified: false,

15391543

findings: [

15401544

{

15411545

id: "REL-GATEWAY-417",

15421546

source: "src/gateway/reconnect.ts",

15431547

status: "retry jitter verified, resume token fallback still needs manual spot check",

1548+

verified: true,

15441549

},

15451550

{

15461551

id: "REL-CHANNEL-238",

15471552

source: "src/channels/delivery.ts",

15481553

status: "thread replies preserve ordering, root-channel fallback needs handoff note",

1554+

verified: true,

15491555

},

15501556

{

15511557

id: "REL-CRON-904",

15521558

source: "src/scheduling/cron.ts",

15531559

status: "single-run lock verified for restart wakeups",

1560+

verified: true,

15541561

},

15551562

{

15561563

id: "REL-MEMORY-552",

15571564

source: "src/memory/recall.ts",

15581565

status:

15591566

"fallback summary survives empty memory search; ranking sample needs second reviewer",

1567+

verified: true,

15601568

},

15611569

{

15621570

id: "REL-PLUGIN-319",

15631571

source: "src/plugins/runtime.ts",

15641572

status: "bundled runtime manifest loads cleanly after restart",

1573+

verified: true,

15651574

},

15661575

{

15671576

id: "REL-INSTALL-846",

15681577

source: "install/update.ts",

15691578

status: "update smoke passed from previous stable tag",

1579+

verified: true,

15701580

},

15711581

{

15721582

id: "REL-DOCS-611",

15731583

source: "docs/operator-notes.md",

15741584

status:

15751585

"docs mention reconnect, cron, memory, plugin, and installer checks; channel ordering and UI notes need maintainer handoff",

1586+

verified: true,

15761587

},

15771588

{

15781589

id: "REL-UI-BLOCKED",

15791590

source: "ui/control-panel.ts",

15801591

status: "blocked: source file was referenced by checklist but missing from the fixture",

1592+

verified: false,

15811593

},

15821594

],

15831595

},

Original file line numberDiff line numberDiff line change

@@ -3,6 +3,7 @@ import { describe, expect, it } from "vitest";

33

import { createQaLabWebSearchProvider as createQaLabWebSearchContractProvider } from "../web-search-contract-api.js";

44

import {

55

createQaLabWebSearchProvider,

6+

QA_LAB_WEB_SEARCH_DENIED_INPUT_QUERY,

67

QA_LAB_WEB_SEARCH_PROVIDER_ID,

78

} from "./qa-web-search-provider.js";

89

@@ -55,4 +56,16 @@ describe("qa-lab web search provider", () => {

5556
5657

await expect(tool.execute({ __qaFailureMode: "denied-input" })).rejects.toThrow(/query/i);

5758

});

59+
60+

it("keeps the QA failure sentinel as a deterministic tool failure", async () => {

61+

const provider = createQaLabWebSearchProvider();

62+

const tool = provider.createTool({});

63+

if (!tool) {

64+

throw new Error("expected QA Lab web search tool");

65+

}

66+
67+

await expect(tool.execute({ query: QA_LAB_WEB_SEARCH_DENIED_INPUT_QUERY })).rejects.toThrow(

68+

/denied input sentinel/i,

69+

);

70+

});

5871

});

Original file line numberDiff line numberDiff line change

@@ -9,6 +9,7 @@ import {

99

} from "openclaw/plugin-sdk/provider-web-search";

1010
1111

export const QA_LAB_WEB_SEARCH_PROVIDER_ID = "qa-lab-search";

12+

export const QA_LAB_WEB_SEARCH_DENIED_INPUT_QUERY = "OPENCLAW_QA_WEB_SEARCH_DENIED_INPUT";

1213
1314

const QaLabWebSearchSchema = {

1415

type: "object",

@@ -64,6 +65,9 @@ export function createQaLabWebSearchProvider(): WebSearchProviderPlugin {

6465

parameters: QaLabWebSearchSchema,

6566

execute: async (args) => {

6667

const query = readStringParam(args, "query", { required: true });

68+

if (query === QA_LAB_WEB_SEARCH_DENIED_INPUT_QUERY) {

69+

throw new Error("QA Lab web_search denied input sentinel");

70+

}

6771

const count =

6872

readPositiveIntegerParam(args, "count", {

6973

max: MAX_SEARCH_COUNT,

Original file line numberDiff line numberDiff line change

@@ -55,7 +55,7 @@ flow:

5555

- call: reset

5656

- set: beforeHeartbeatTs

5757

value:

58-

expr: "((await env.gateway.call('last-heartbeat', {}, { timeoutMs: liveTurnTimeoutMs(env, 30000) }))?.ts ?? 0)"

58+

expr: "((await env.gateway.call('last-heartbeat', {}, { timeoutMs: liveTurnTimeoutMs(env, 15000) }))?.ts ?? 0)"

5959

- set: sessionKey

6060

value:

6161

expr: "`agent:qa:qa-channel:${config.conversationId}`"

@@ -106,7 +106,7 @@ flow:

106106

args:

107107

- lambda:

108108

async: true

109-

expr: "(async () => { const last = await env.gateway.call('last-heartbeat', {}, { timeoutMs: liveTurnTimeoutMs(env, 30000) }); return last && last.ts > beforeHeartbeatTs ? last : undefined; })()"

109+

expr: "(async () => { const last = await env.gateway.call('last-heartbeat', {}, { timeoutMs: liveTurnTimeoutMs(env, 15000) }); return last && last.ts > beforeHeartbeatTs ? last : undefined; })()"

110110

- expr: liveTurnTimeoutMs(env, 45000)

111111

- 250

112112

- call: sleep

Original file line numberDiff line numberDiff line change

@@ -44,6 +44,7 @@ scenario:

4444

action: hard gate in the standard direct-loading tier

4545

reason: web_search is an OpenClaw integration tool and must stay visible and callable under OpenClaw and Codex direct runtime parity.

4646

promptSnippet: "target=web_search"

47+

failurePrompt: "tool search qa failure target=web_search. Call web_search exactly once with query OPENCLAW_QA_WEB_SEARCH_DENIED_INPUT and then summarize the failure."

4748

failurePromptSnippet: "failure target=web_search"

4849
4950

flow:

Original file line numberDiff line numberDiff line change

@@ -14,6 +14,7 @@ scenario:

1414

- Agent starts from the seeded project README instead of guessing.

1515

- Agent inspects docs and source files across multiple directories.

1616

- Agent writes a JSON audit and a Markdown handoff with all required findings.

17+

- Each JSON finding carries a boolean verified field; missing current source evidence is verified false.

1718

- Agent verifies the generated JSON before finalizing.

1819

docsRefs:

1920

- docs/help/testing.md

@@ -131,7 +132,8 @@ scenario:

131132

Do a release readiness audit for the small project under `audit-fixture/`.

132133

Start from `audit-fixture/README.md`, find the current checklist, inspect the referenced docs/source, then create `audit-fixture/release-audit.json` and `audit-fixture/release-handoff.md`.

133134
134-

The JSON should include current finding ids, source files, statuses, and a boolean `verified`.

135+

The JSON should include current finding ids, source files, statuses, and a boolean `verified` on each finding.

136+

If a current checklist source is referenced but missing from the fixture, include that source as a finding with `verified: false`.

135137

The Markdown handoff should summarize what is ready and what needs follow-up.

136138

Check your generated JSON before finalizing.

137139

Final reply exactly: RELEASE-AUDIT-COMPLETE

@@ -211,14 +213,20 @@ flow:

211213

expr: "!JSON.stringify(Array.isArray(report.findings) ? report.findings : report).includes('REL-STALE-000') && !handoffText.includes('REL-STALE-000')"

212214

message:

213215

expr: "`stale archive finding leaked into audit: report=${reportText}\\nhandoff=${handoffText}`"

216+

- set: reportFindings

217+

value:

218+

expr: "Array.isArray(report) ? report : (Array.isArray(report.findings) ? report.findings : [])"

219+

- set: uiFinding

220+

value:

221+

expr: "reportFindings.find((finding) => JSON.stringify(finding).includes('ui/control-panel.ts'))"

214222

- assert:

215-

expr: "JSON.stringify(report).includes('ui/control-panel.ts') && /blocked|missing|not found|no current source file|no matching source file/i.test(`${reportText}\\n${handoffText}`)"

223+

expr: "uiFinding && uiFinding.verified === false"

216224

message:

217-

expr: "`missing UI evidence was not explicitly blocked: report=${reportText}\\nhandoff=${handoffText}`"

225+

expr: "`missing UI evidence was not marked unverified: report=${reportText}\\nhandoff=${handoffText}`"

218226

- assert:

219-

expr: "JSON.stringify(report).includes('verified')"

227+

expr: "reportFindings.length > 0 && reportFindings.every((finding) => typeof finding?.verified === 'boolean')"

220228

message:

221-

expr: "`report did not include a verification field: ${reportText}`"

229+

expr: "`each report finding must include a boolean verified field: ${reportText}`"

222230

- call: waitForAgentHistoryReply

223231

saveAs: outbound

224232

args:

Original file line numberDiff line numberDiff line change

@@ -619,6 +619,10 @@ describe("ci workflow guards", () => {

619619

"taxonomy.profiles.find((entry) => entry.id === requested)",

620620

);

621621

expect(validateProfileStep.run).toContain("profile=${profile.id}");

622+

const ensurePlaywrightStep = qaRunJob.steps.find(

623+

(step) => step.name === "Ensure Playwright Chromium",

624+

);

625+

expect(ensurePlaywrightStep.run).toBe("node scripts/ensure-playwright-chromium.mjs");

622626

expect(generateJob.if).toBe("${{ inputs.qa_evidence_run_id == '' }}");

623627

expect(generateJob.uses).toBe("./.github/workflows/qa-profile-evidence.yml");

624628

expect(generateJob.with).toMatchObject({