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

推荐订阅源

T
The Blog of Author Tim Ferriss
IT之家
IT之家
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
C
Check Point Blog
T
Tailwind CSS Blog
博客园 - Franky
H
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google DeepMind News
Google DeepMind News
博客园 - 叶小钗
J
Java Code Geeks
腾讯CDC
罗磊的独立博客
爱范儿
爱范儿
阮一峰的网络日志
阮一峰的网络日志
Martin Fowler
Martin Fowler
酷 壳 – CoolShell
酷 壳 – CoolShell
I
InfoQ
B
Blog
V
Visual Studio Blog
F
Fortinet All Blogs

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-lab): expand telegram e2e defaults · openclaw/ope...
obviyus · 2026-05-08 · via Recent Commits to openclaw:main

@@ -13,6 +13,7 @@ import { DEFAULT_QA_LIVE_PROVIDER_MODE } from "../../providers/index.js";

1313

import {

1414

defaultQaModelForMode,

1515

normalizeQaProviderMode,

16+

type QaProviderMode,

1617

type QaProviderModeInput,

1718

} from "../../run-config.js";

1819

import {

@@ -46,11 +47,14 @@ type TelegramQaScenarioId =

4647

| "telegram-commands-command"

4748

| "telegram-tools-compact-command"

4849

| "telegram-whoami-command"

50+

| "telegram-status-command"

51+

| "telegram-other-bot-command-gating"

4952

| "telegram-context-command"

5053

| "telegram-current-session-status-tool"

5154

| "telegram-stream-final-single-message"

5255

| "telegram-long-final-three-chunks"

5356

| "telegram-long-final-reuses-preview"

57+

| "telegram-reply-chain-exact-marker"

5458

| "telegram-mentioned-message-reply"

5559

| "telegram-mention-gating";

5660

@@ -69,6 +73,9 @@ type TelegramQaScenarioRun = {

6973

type TelegramQaScenarioDefinition = LiveTransportScenarioDefinition<TelegramQaScenarioId> & {

7074

buildRun: (sutUsername: string) => TelegramQaScenarioRun;

7175

defaultEnabled?: boolean;

76+

defaultProviderModes?: readonly QaProviderMode[];

77+

regressionRefs?: readonly string[];

78+

rationale: string;

7279

};

73807481

type TelegramObservedMessage = {

@@ -231,6 +238,7 @@ const TELEGRAM_QA_SCENARIOS: TelegramQaScenarioDefinition[] = [

231238

id: "telegram-help-command",

232239

standardId: "help-command",

233240

title: "Telegram help command reply",

241+

rationale: "Canary-grade native command reply path.",

234242

timeoutMs: 45_000,

235243

buildRun: (sutUsername) => ({

236244

expectReply: true,

@@ -241,6 +249,7 @@ const TELEGRAM_QA_SCENARIOS: TelegramQaScenarioDefinition[] = [

241249

{

242250

id: "telegram-commands-command",

243251

title: "Telegram commands list reply",

252+

rationale: "Native command catalog must render in Telegram group replies.",

244253

timeoutMs: 45_000,

245254

buildRun: (sutUsername) => ({

246255

expectReply: true,

@@ -251,6 +260,7 @@ const TELEGRAM_QA_SCENARIOS: TelegramQaScenarioDefinition[] = [

251260

{

252261

id: "telegram-tools-compact-command",

253262

title: "Telegram tools compact reply",

263+

rationale: "Tool catalog rendering catches command dispatch plus model-tool inventory drift.",

254264

timeoutMs: 45_000,

255265

buildRun: (sutUsername) => ({

256266

expectReply: true,

@@ -261,16 +271,40 @@ const TELEGRAM_QA_SCENARIOS: TelegramQaScenarioDefinition[] = [

261271

{

262272

id: "telegram-whoami-command",

263273

title: "Telegram whoami reply",

274+

rationale: "Identity command proves Telegram channel context is attached to native commands.",

264275

timeoutMs: 45_000,

265276

buildRun: (sutUsername) => ({

266277

expectReply: true,

267278

input: `/whoami@${sutUsername}`,

268279

expectedTextIncludes: ["🧭 Identity", "Channel: telegram"],

269280

}),

270281

},

282+

{

283+

id: "telegram-status-command",

284+

title: "Telegram status command reply",

285+

rationale: "Recent Telegram group regressions broke /status while normal chat still worked.",

286+

regressionRefs: ["openclaw/openclaw#74698"],

287+

timeoutMs: 45_000,

288+

buildRun: (sutUsername) => ({

289+

expectReply: true,

290+

input: `/status@${sutUsername}`,

291+

expectedTextIncludes: ["OpenClaw", "Model:", "Session:", "Activation:"],

292+

}),

293+

},

294+

{

295+

id: "telegram-other-bot-command-gating",

296+

title: "Telegram command addressed to another bot is ignored",

297+

rationale: "Bot-to-bot groups must not let commands addressed to another bot wake the SUT.",

298+

timeoutMs: 8_000,

299+

buildRun: () => ({

300+

expectReply: false,

301+

input: "/status@OpenClawQaOtherBot",

302+

}),

303+

},

271304

{

272305

id: "telegram-context-command",

273306

title: "Telegram context reply",

307+

rationale: "Context command exercises native command routing into Telegram-specific help text.",

274308

timeoutMs: 45_000,

275309

buildRun: (sutUsername) => ({

276310

expectReply: true,

@@ -282,29 +316,49 @@ const TELEGRAM_QA_SCENARIOS: TelegramQaScenarioDefinition[] = [

282316

id: "telegram-current-session-status-tool",

283317

title: "Telegram current session_status tool call",

284318

defaultEnabled: false,

319+

rationale:

320+

"Opt-in threaded probe for current Telegram group session resolution through model tools.",

285321

timeoutMs: 60_000,

286322

buildRun: (sutUsername) => ({

287323

expectReply: true,

288324

input: `@${sutUsername} Telegram current session_status QA check. Call session_status with sessionKey set to current, then reply with the exact QA marker and resolved session key.`,

289325

expectedTextIncludes: ["QA-TELEGRAM-CURRENT-SESSION-OK", ":telegram:group:"],

326+

replyToLatestSutMessage: true,

290327

}),

291328

},

292329

{

293330

id: "telegram-mentioned-message-reply",

294331

title: "Telegram mentioned message gets a reply",

295-

defaultEnabled: false,

332+

rationale: "Bot-to-bot group mention routing must produce a threaded SUT reply.",

296333

timeoutMs: 45_000,

297334

buildRun: (sutUsername) => ({

298-

allowAnySutReply: true,

299335

expectReply: true,

300336

input: `@${sutUsername} Telegram QA mention routing check. Reply with a short acknowledgement.`,

301337

replyToLatestSutMessage: true,

302338

}),

303339

},

340+

{

341+

id: "telegram-reply-chain-exact-marker",

342+

title: "Telegram reply-chain exact marker",

343+

defaultProviderModes: ["mock-openai"],

344+

rationale: "Mock-backed reply-chain check proves quoted bot-to-bot follow-ups keep threading.",

345+

timeoutMs: 45_000,

346+

buildRun: (sutUsername) => ({

347+

expectReply: true,

348+

input: `@${sutUsername} Telegram reply-chain marker QA. Reply exactly: QA-TELEGRAM-REPLY-CHAIN-OK`,

349+

expectedTextIncludes: ["QA-TELEGRAM-REPLY-CHAIN-OK"],

350+

expectedJoinedSutTextIncludes: ["QA-TELEGRAM-REPLY-CHAIN-OK"],

351+

expectedSutMessageCount: 1,

352+

replyToLatestSutMessage: true,

353+

settleMs: 4_000,

354+

}),

355+

},

304356

{

305357

id: "telegram-stream-final-single-message",

306358

title: "Telegram streamed final stays one message",

307-

defaultEnabled: false,

359+

defaultProviderModes: ["mock-openai"],

360+

rationale: "Regression guard for duplicate final replies from Telegram streaming paths.",

361+

regressionRefs: ["openclaw/openclaw#39905"],

308362

timeoutMs: 45_000,

309363

buildRun: (sutUsername) => ({

310364

allowAnySutReply: true,

@@ -320,7 +374,9 @@ const TELEGRAM_QA_SCENARIOS: TelegramQaScenarioDefinition[] = [

320374

{

321375

id: "telegram-long-final-reuses-preview",

322376

title: "Telegram long final reuses the preview message",

323-

defaultEnabled: false,

377+

defaultProviderModes: ["mock-openai"],

378+

rationale: "Regression guard for long streamed finals leaving stale preview messages behind.",

379+

regressionRefs: ["openclaw/openclaw#39905"],

324380

timeoutMs: 60_000,

325381

buildRun: (sutUsername) => ({

326382

allowAnySutReply: true,

@@ -337,6 +393,8 @@ const TELEGRAM_QA_SCENARIOS: TelegramQaScenarioDefinition[] = [

337393

id: "telegram-long-final-three-chunks",

338394

title: "Telegram three-chunk final keeps only final chunks",

339395

defaultEnabled: false,

396+

rationale: "Opt-in stress probe for Telegram long final chunk accounting.",

397+

regressionRefs: ["openclaw/openclaw#39905"],

340398

timeoutMs: 60_000,

341399

buildRun: (sutUsername) => ({

342400

allowAnySutReply: true,

@@ -356,6 +414,7 @@ const TELEGRAM_QA_SCENARIOS: TelegramQaScenarioDefinition[] = [

356414

id: "telegram-mention-gating",

357415

standardId: "mention-gating",

358416

title: "Telegram group message without mention does not trigger",

417+

rationale: "Required group mention gate should suppress ordinary group chatter.",

359418

timeoutMs: 8_000,

360419

buildRun: () => {

361420

const token = `TELEGRAM_QA_NOMENTION_${randomUUID().slice(0, 8).toUpperCase()}`;

@@ -1020,18 +1079,45 @@ function buildObservedMessagesArtifact(params: {

10201079

});

10211080

}

102210811023-

function findScenario(ids?: string[]) {

1082+

function shouldRunTelegramScenarioByDefault(

1083+

scenario: TelegramQaScenarioDefinition,

1084+

providerMode: QaProviderMode,

1085+

) {

1086+

if (scenario.defaultEnabled === false) {

1087+

return false;

1088+

}

1089+

return !scenario.defaultProviderModes || scenario.defaultProviderModes.includes(providerMode);

1090+

}

1091+1092+

function findScenario(

1093+

ids?: string[],

1094+

providerMode: QaProviderMode = DEFAULT_QA_LIVE_PROVIDER_MODE,

1095+

) {

10241096

const scenarios =

10251097

ids && ids.length > 0

10261098

? TELEGRAM_QA_SCENARIOS

1027-

: TELEGRAM_QA_SCENARIOS.filter((scenario) => scenario.defaultEnabled !== false);

1099+

: TELEGRAM_QA_SCENARIOS.filter((scenario) =>

1100+

shouldRunTelegramScenarioByDefault(scenario, providerMode),

1101+

);

10281102

return selectLiveTransportScenarios({

10291103

ids,

10301104

laneLabel: "Telegram",

10311105

scenarios,

10321106

});

10331107

}

103411081109+

export function listTelegramQaScenarioCatalog(

1110+

providerMode: QaProviderMode = DEFAULT_QA_LIVE_PROVIDER_MODE,

1111+

) {

1112+

return TELEGRAM_QA_SCENARIOS.map((scenario) => ({

1113+

id: scenario.id,

1114+

title: scenario.title,

1115+

defaultEnabled: shouldRunTelegramScenarioByDefault(scenario, providerMode),

1116+

rationale: scenario.rationale,

1117+

regressionRefs: [...(scenario.regressionRefs ?? [])],

1118+

}));

1119+

}

1120+10351121

function matchesTelegramScenarioReply(params: {

10361122

groupId: string;

10371123

allowAnySutReply?: boolean;

@@ -1340,7 +1426,7 @@ export async function runTelegramQaLive(params: {

13401426

const primaryModel = params.primaryModel?.trim() || defaultQaModelForMode(providerMode);

13411427

const alternateModel = params.alternateModel?.trim() || defaultQaModelForMode(providerMode, true);

13421428

const sutAccountId = params.sutAccountId?.trim() || "sut";

1343-

const scenarios = findScenario(params.scenarioIds);

1429+

const scenarios = findScenario(params.scenarioIds, providerMode);

13441430

const progressEnabled = shouldLogTelegramQaLiveProgress();

13451431

writeTelegramQaProgress(

13461432

progressEnabled,

@@ -1754,6 +1840,7 @@ export const __testing = {

17541840

assertTelegramScenarioReply,

17551841

classifyCanaryReply,

17561842

findScenario,

1843+

listTelegramQaScenarioCatalog,

17571844

matchesTelegramScenarioReply,

17581845

normalizeTelegramObservedMessage,

17591846

parseTelegramQaProgressBooleanEnv,