
























@@ -340,6 +340,8 @@ describe("qa cli runtime", () => {
340340repoRoot: process.cwd(),
341341outputDir: path.join(process.cwd(), ".artifacts", "qa-e2e", "scenario-test"),
342342transportId: "qa-channel",
343+channelDriver: undefined,
344+channelDriverSelection: undefined,
343345primaryModel: "mock-openai/gpt-5.5",
344346alternateModel: undefined,
345347fastMode: undefined,
@@ -431,6 +433,7 @@ describe("qa cli runtime", () => {
431433profile: "smoke-ci",
432434surface: "agent-runtime-and-provider-execution",
433435category: "agent-runtime-and-provider-execution.agent-turn-execution",
436+scenarioIds: ["dm-chat-baseline"],
434437transportId: "qa-channel",
435438fastMode: true,
436439concurrency: 2,
@@ -442,12 +445,16 @@ describe("qa cli runtime", () => {
442445repoRoot: path.resolve("/tmp/openclaw-repo"),
443446outputDir: path.resolve("/tmp/openclaw-repo", ".artifacts/qa-e2e/smoke-ci"),
444447transportId: "qa-channel",
448+channelDriver: "crabline",
445449providerMode: "mock-openai",
446450fastMode: true,
447451concurrency: 2,
448452});
449-expect(suiteArgs.scenarioIds).toEqual(expect.arrayContaining(["dm-chat-baseline"]));
450-expect(suiteArgs.scenarioIds).not.toContain("thinking-slash-model-remap");
453+expect(suiteArgs.channelDriverSelection).toMatchObject({
454+channel: "telegram",
455+channelDriver: "crabline",
456+});
457+expect(suiteArgs.scenarioIds).toEqual(["dm-chat-baseline"]);
451458expect(process.env.OPENCLAW_QA_PROFILE).toBe("release");
452459const evidence = JSON.parse(await fs.readFile(suiteEvidencePath, "utf8")) as {
453460evidenceMode?: unknown;
@@ -493,6 +500,20 @@ describe("qa cli runtime", () => {
493500}
494501});
495502503+it("passes non-Crabline profile channel drivers as declarative suite metadata", async () => {
504+await runQaProfileCommand({
505+repoRoot: "/tmp/openclaw-repo",
506+profile: "release",
507+surface: "agent-runtime-and-provider-execution",
508+category: "agent-runtime-and-provider-execution.agent-turn-execution",
509+providerMode: "mock-openai",
510+});
511+512+const suiteArgs = mockFirstObjectArg(runQaSuite);
513+expect(suiteArgs.channelDriver).toBe("live");
514+expect(suiteArgs.channelDriverSelection).toBeUndefined();
515+});
516+496517it("rejects qa profile runs that do not match taxonomy categories", async () => {
497518await expect(
498519runQaProfileCommand({
@@ -506,6 +527,20 @@ describe("qa cli runtime", () => {
506527expect(runQaSuite).not.toHaveBeenCalled();
507528});
508529530+it("rejects qa profile scenario filters outside the selected taxonomy categories", async () => {
531+await expect(
532+runQaProfileCommand({
533+repoRoot: "/tmp/openclaw-repo",
534+profile: "smoke-ci",
535+category: "agent-runtime-and-provider-execution.agent-turn-execution",
536+scenarioIds: ["not-a-real-scenario"],
537+}),
538+).rejects.toThrow(
539+"qa run did not find taxonomy scenarios for --qa-profile smoke-ci --category agent-runtime-and-provider-execution.agent-turn-execution --scenario not-a-real-scenario.",
540+);
541+expect(runQaSuite).not.toHaveBeenCalled();
542+});
543+509544it("rejects qa profile runs whose profile is not declared in taxonomy.yaml", async () => {
510545await expect(
511546runQaProfileCommand({
@@ -532,6 +567,8 @@ describe("qa cli runtime", () => {
532567repoRoot: path.resolve("/tmp/openclaw-repo"),
533568outputDir: path.resolve("/tmp/openclaw-repo", ".artifacts/qa/frontier"),
534569transportId: "qa-channel",
570+channelDriver: undefined,
571+channelDriverSelection: undefined,
535572providerMode: "live-frontier",
536573primaryModel: "openai/gpt-5.5",
537574alternateModel: "anthropic/claude-sonnet-4-6",
@@ -541,6 +578,48 @@ describe("qa cli runtime", () => {
541578});
542579});
543580581+it("uses the Crabline default channel when selected scenarios do not request one", async () => {
582+await runQaSuiteCommand({
583+repoRoot: "/tmp/openclaw-repo",
584+outputDir: ".artifacts/qa/multipass-telegram",
585+providerMode: "mock-openai",
586+channelDriver: "crabline",
587+scenarioIds: ["channel-chat-baseline"],
588+});
589+590+expect(runQaSuite).toHaveBeenCalledWith({
591+repoRoot: path.resolve("/tmp/openclaw-repo"),
592+outputDir: path.resolve("/tmp/openclaw-repo", ".artifacts/qa/multipass-telegram"),
593+transportId: "qa-channel",
594+channelDriver: "crabline",
595+channelDriverSelection: {
596+capabilityMatrixPath: "crabline-fake-provider-capabilities.json",
597+channel: "telegram",
598+channelDriver: "crabline",
599+smokeArtifactPath: "crabline-fake-provider-smoke.json",
600+},
601+providerMode: "mock-openai",
602+primaryModel: undefined,
603+alternateModel: undefined,
604+fastMode: undefined,
605+scenarioIds: ["channel-chat-baseline"],
606+});
607+});
608+609+it("keeps Crabline channel-driver independent from the VM runner", async () => {
610+await expect(
611+runQaSuiteCommand({
612+repoRoot: "/tmp/openclaw-repo",
613+providerMode: "mock-openai",
614+channelDriver: "crabline",
615+channel: "telegram",
616+runner: "multipass",
617+}),
618+).rejects.toThrow("--channel-driver crabline requires --runner host.");
619+expect(runQaSuite).not.toHaveBeenCalled();
620+expect(runQaMultipass).not.toHaveBeenCalled();
621+});
622+544623it("passes explicit suite plugin enablements into the host gateway run", async () => {
545624await runQaSuiteCommand({
546625repoRoot: "/tmp/openclaw-repo",
@@ -553,6 +632,8 @@ describe("qa cli runtime", () => {
553632repoRoot: path.resolve("/tmp/openclaw-repo"),
554633outputDir: undefined,
555634transportId: "qa-channel",
635+channelDriver: undefined,
636+channelDriverSelection: undefined,
556637providerMode: "mock-openai",
557638primaryModel: undefined,
558639alternateModel: undefined,
@@ -574,6 +655,8 @@ describe("qa cli runtime", () => {
574655repoRoot: path.resolve("/tmp/openclaw-repo"),
575656outputDir: undefined,
576657transportId: "qa-channel",
658+channelDriver: undefined,
659+channelDriverSelection: undefined,
577660providerMode: "mock-openai",
578661primaryModel: undefined,
579662alternateModel: undefined,
@@ -624,6 +707,8 @@ describe("qa cli runtime", () => {
624707repoRoot: path.resolve("/tmp/openclaw-repo"),
625708outputDir: undefined,
626709transportId: "qa-channel",
710+channelDriver: undefined,
711+channelDriverSelection: undefined,
627712providerMode: "mock-openai",
628713primaryModel: undefined,
629714alternateModel: undefined,
@@ -2020,6 +2105,8 @@ describe("qa cli runtime", () => {
20202105repoRoot: path.resolve("/tmp/openclaw-repo"),
20212106outputDir: undefined,
20222107transportId: "qa-channel",
2108+channelDriver: undefined,
2109+channelDriverSelection: undefined,
20232110providerMode: "mock-openai",
20242111primaryModel: "openai/gpt-5.5",
20252112alternateModel: "anthropic/claude-opus-4-8",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。