diff --git a/tests/runner-e2e/chat-catalog-domains/runtime-capability-audit.json b/tests/runner-e2e/chat-catalog-domains/runtime-capability-audit.json
index ec16adecef8..55b5e77ff6b 100644
--- a/tests/runner-e2e/chat-catalog-domains/runtime-capability-audit.json
+++ b/tests/runner-e2e/chat-catalog-domains/runtime-capability-audit.json
@@ -101,8 +101,8 @@
},
{
"scenarioId": "agent-chat.multiple-handoffs",
- "readinessClass": "local",
- "needs": "Real active website and completed logo handoffs; source-bound update once; logo output immutable; queued vs consumed verified."
+ "readinessClass": "implemented",
+ "needs": "Real Riley Logo task/native SVG artifact completes first; genuine source setup human/native turn retains distinct completed Logo and active Morgan Website references. Canonical own-run reply and one source-attributed headline queue entry precede one normal consuming Website continuation. Exact native saved comment input/latest headline revision and retained original revision are checked; Logo task, SVG bytes, attachment identity and every document revision remain unchanged. No live qualification claimed."
},
{
"scenarioId": "agent-chat.conference-room",
diff --git a/tests/runner-e2e/chat-catalog-domains/runtime-multiple-handoffs.test.ts b/tests/runner-e2e/chat-catalog-domains/runtime-multiple-handoffs.test.ts
new file mode 100644
index 00000000000..1a357a740ac
--- /dev/null
+++ b/tests/runner-e2e/chat-catalog-domains/runtime-multiple-handoffs.test.ts
@@ -0,0 +1,29 @@
+import { expect, it } from "vitest";
+import { gradeMultipleHandoffs } from "./runtime-multiple-handoffs.js";
+function valid() {
+ const logo = { id: "logo", title: "Logo", companyId: "company", status: "done", assigneeAgentId: "riley" };
+ const artifact = { contentVerified: true, attachmentId: "logo-file", sha256: "same", content: "" };
+ return { scenarioId: "agent-chat.multiple-handoffs", companyId: "company", leadId: "ceo", agents: [], links: [], activity: [], humanQueries: [], reply: "",
+ tasks: [logo, { id: "website", assigneeAgentId: "morgan", status: "done" }],
+ runs: [{ id: "logo-run", agentId: "riley", status: "succeeded" }, { id: "prior", agentId: "morgan", status: "succeeded" },
+ { id: "setup", agentId: "ceo", status: "succeeded" }, { id: "canonical", agentId: "ceo", status: "succeeded" }, { id: "consumer", agentId: "morgan", status: "succeeded" }],
+ state: { task: { id: "website" }, worker: { id: "morgan" }, logoWorker: { id: "riley" }, workerRunId: "prior", canonicalRunId: "canonical",
+ queueAtReply: { issueId: "website", targetRunId: "prior", state: "queued", entries: [{ comment: { id: "headline", authorAgentId: "ceo", createdByRunId: "canonical", body: "Change the headline to Launch sooner." } }] },
+ sourceHistoryBound: true, workerRunningAtReply: true, nativeDeliveryBound: true, queueEmptyAfterDelivery: true, logoBefore: logo, logoAfter: structuredClone(logo),
+ logoArtifactBefore: artifact, logoArtifactAfter: { ...artifact }, logoMarker: "real-marker", logoRevisionsUnchanged: true,
+ queryReply: "I saved the headline feedback in the existing Website queue while Morgan is busy. The logo remains unchanged.",
+ finalHeadlineRevision: true, originalWebsiteRevisionRetained: true } };
+}
+it("accepts one Website delivery with real completed Logo preservation", () => expect(gradeMultipleHandoffs(valid()).passed).toBe(true));
+it("accepts natural pending-delivery wording for the exact affected work", () => { const o = valid(); o.state.queryReply = "Website's new headline requirement will wait for Morgan's next turn; I left Riley's completed logo alone."; expect(gradeMultipleHandoffs(o).passed).toBe(true); });
+it("rejects missing independent two-task evidence", () => expect(gradeMultipleHandoffs(undefined).passed).toBe(false));
+it("rejects routing headline feedback to Logo instead", () => { const o = valid(); o.state.queueAtReply.issueId = "logo"; expect(gradeMultipleHandoffs(o).passed).toBe(false); });
+it("rejects duplicate saved headline requirements", () => { const o = valid(); o.state.queueAtReply.entries.push({ ...o.state.queueAtReply.entries[0]! }); expect(gradeMultipleHandoffs(o).passed).toBe(false); });
+it("rejects feedback attributed to the earlier source setup turn", () => { const o = valid(); o.state.queueAtReply.entries[0]!.comment.createdByRunId = "setup"; expect(gradeMultipleHandoffs(o).passed).toBe(false); });
+it("rejects a consuming run without the exact saved comment", () => { const o = valid(); o.state.nativeDeliveryBound = false; expect(gradeMultipleHandoffs(o).passed).toBe(false); });
+it("rejects changing the actual delivered Logo bytes", () => { const o = valid(); o.state.logoArtifactAfter.content = ""; expect(gradeMultipleHandoffs(o).passed).toBe(false); });
+it("rejects retaining a Logo filename but replacing its artifact", () => { const o = valid(); o.state.logoArtifactAfter.attachmentId = "replacement"; expect(gradeMultipleHandoffs(o).passed).toBe(false); });
+it("rejects erasing an earlier Logo revision", () => { const o = valid(); o.state.logoRevisionsUnchanged = false; expect(gradeMultipleHandoffs(o).passed).toBe(false); });
+it("rejects claiming implementation before active-run consumption", () => { const o = valid(); o.state.queryReply = "The Website headline has been changed; the queued request is complete."; expect(gradeMultipleHandoffs(o).passed).toBe(false); });
+it("rejects redirection to a different worker", () => { const o = valid(); o.tasks[1]!.assigneeAgentId = "riley"; expect(gradeMultipleHandoffs(o).passed).toBe(false); });
+it("rejects losing the original Website work", () => { const o = valid(); o.state.originalWebsiteRevisionRetained = false; expect(gradeMultipleHandoffs(o).passed).toBe(false); });
diff --git a/tests/runner-e2e/chat-catalog-domains/runtime-multiple-handoffs.ts b/tests/runner-e2e/chat-catalog-domains/runtime-multiple-handoffs.ts
new file mode 100644
index 00000000000..6d038b3212f
--- /dev/null
+++ b/tests/runner-e2e/chat-catalog-domains/runtime-multiple-handoffs.ts
@@ -0,0 +1,106 @@
+import { expect } from "@playwright/test";
+import { writeFile } from "node:fs/promises";
+import type { IssueQueuedCommentQueue } from "../../../packages/shared/src/types/issue.js";
+import { pollUntil } from "../api.js";
+import { sendChatMessage } from "../chat-flow.js";
+import { readRegisteredArtifacts } from "../registered-artifact.js";
+import { checks, sameTask, type Entity } from "./internal-support.js";
+import { openStandingChat } from "./identity-support.js";
+import { busyRuntimeWorker, releaseRuntimeWorker } from "./runtime-busy-worker.js";
+import { runtimeQueueCases } from "./runtime-queue.js";
+import { runtimeDefinition, runtimeObservation, observeRuntime, runtimeWorker } from "./runtime-support.js";
+type Artifact = Awaited>[number];
+export function gradeMultipleHandoffs(value: unknown) {
+ const c = checks(), o = runtimeObservation(value);
+ c.add("actual-two-task-history-and-delivery-evidence", !!o, "Separate real website/logo work, saved source references and exact consuming native input are required."); if (!o) return c.result();
+ const s = o.state, queue = s.queueAtReply as IssueQueuedCommentQueue, target = queue?.entries[0], logoBefore = s.logoBefore as Entity, logo = s.logoAfter as Entity;
+ const before = s.logoArtifactBefore as Artifact, after = s.logoArtifactAfter as Artifact;
+ c.add("existing-website-worker-receives-one-saved-requirement", s.sourceHistoryBound === true && queue?.issueId === (s.task as Entity).id
+ && queue.targetRunId === s.workerRunId && queue.entries.length === 1 && ["queued", "deferred"].includes(queue.state ?? "")
+ && target?.comment.authorAgentId === o.leadId && target.comment.createdByRunId === s.canonicalRunId && target.comment.body.includes("Launch sooner")
+ && s.workerRunningAtReply === true && s.nativeDeliveryBound === true && s.queueEmptyAfterDelivery === true,
+ "One CEO-attributed headline instruction is saved against the actual active Website owner, then reaches exactly one ordinary native continuation.");
+ c.add("logo-task-and-delivered-logo-unchanged", !!logoBefore && !!logo && sameTask(logoBefore, logo) && logo.status === "done" && logo.assigneeAgentId === (s.logoWorker as Entity).id
+ && before?.contentVerified === true && after?.contentVerified === true && before.attachmentId === after.attachmentId && before.sha256 === after.sha256
+ && before.content === after.content && after.content.includes(String(s.logoMarker)) && /