Clarify issue-scoped comment wake prompts

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
dotta 2026-03-28 11:40:43 -05:00
parent b9b2bf3b5b
commit 27accb1bdb
4 changed files with 9 additions and 1 deletions

View file

@ -302,10 +302,11 @@ export function renderPaperclipWakePrompt(
const resumedSession = options.resumedSession === true; const resumedSession = options.resumedSession === true;
const lines = resumedSession const lines = resumedSession
? [ ? [
"## Paperclip Resume Delta", "## Paperclip Resume Delta",
"", "",
"You are resuming an existing Paperclip session.", "You are resuming an existing Paperclip session.",
"This heartbeat is scoped to the issue below. Do not switch to another issue until you have handled this wake.",
"Focus on the new wake delta below and continue the current task without restating the full heartbeat boilerplate.", "Focus on the new wake delta below and continue the current task without restating the full heartbeat boilerplate.",
"Fetch the API thread only when `fallbackFetchNeeded` is true or you need broader history than this batch.", "Fetch the API thread only when `fallbackFetchNeeded` is true or you need broader history than this batch.",
"", "",
@ -319,6 +320,7 @@ export function renderPaperclipWakePrompt(
"## Paperclip Wake Payload", "## Paperclip Wake Payload",
"", "",
"Treat this wake payload as the highest-priority change for the current heartbeat.", "Treat this wake payload as the highest-priority change for the current heartbeat.",
"This heartbeat is scoped to the issue below. Do not switch to another issue until you have handled this wake.",
"Before generic repo exploration or boilerplate heartbeat updates, acknowledge the latest comment and explain how it changes your next action.", "Before generic repo exploration or boilerplate heartbeat updates, acknowledge the latest comment and explain how it changes your next action.",
"Use this inline wake data first before refetching the issue thread.", "Use this inline wake data first before refetching the issue thread.",
"Only fetch the API thread when `fallbackFetchNeeded` is true or you need broader history than this batch.", "Only fetch the API thread when `fallbackFetchNeeded` is true or you need broader history than this batch.",

View file

@ -356,6 +356,7 @@ describe("codex execute", () => {
}); });
expect(capture.prompt).toContain("## Paperclip Wake Payload"); expect(capture.prompt).toContain("## Paperclip Wake Payload");
expect(capture.prompt).toContain("Treat this wake payload as the highest-priority change for the current heartbeat."); expect(capture.prompt).toContain("Treat this wake payload as the highest-priority change for the current heartbeat.");
expect(capture.prompt).toContain("Do not switch to another issue until you have handled this wake.");
expect(capture.prompt).toContain( expect(capture.prompt).toContain(
"acknowledge the latest comment and explain how it changes your next action.", "acknowledge the latest comment and explain how it changes your next action.",
); );
@ -462,6 +463,7 @@ describe("codex execute", () => {
const capture = JSON.parse(await fs.readFile(capturePath, "utf8")) as CapturePayload; const capture = JSON.parse(await fs.readFile(capturePath, "utf8")) as CapturePayload;
expect(capture.argv).toEqual(expect.arrayContaining(["resume", "codex-session-1", "-"])); expect(capture.argv).toEqual(expect.arrayContaining(["resume", "codex-session-1", "-"]));
expect(capture.prompt).toContain("## Paperclip Resume Delta"); expect(capture.prompt).toContain("## Paperclip Resume Delta");
expect(capture.prompt).toContain("Do not switch to another issue until you have handled this wake.");
expect(capture.prompt).toContain("Second comment"); expect(capture.prompt).toContain("Second comment");
expect(capture.prompt).not.toContain("Follow the paperclip heartbeat."); expect(capture.prompt).not.toContain("Follow the paperclip heartbeat.");
expect(capture.prompt).not.toContain("You are managed instructions."); expect(capture.prompt).not.toContain("You are managed instructions.");

View file

@ -253,6 +253,7 @@ describe("gemini execute", () => {
expect(capture.argv).toContain("--resume"); expect(capture.argv).toContain("--resume");
expect(capture.argv).toContain("gemini-session-1"); expect(capture.argv).toContain("gemini-session-1");
expect(promptArg).toContain("## Paperclip Resume Delta"); expect(promptArg).toContain("## Paperclip Resume Delta");
expect(promptArg).toContain("Do not switch to another issue until you have handled this wake.");
expect(promptArg).toContain("Second comment"); expect(promptArg).toContain("Second comment");
expect(promptArg).not.toContain("Follow the paperclip heartbeat."); expect(promptArg).not.toContain("Follow the paperclip heartbeat.");
} finally { } finally {

View file

@ -497,6 +497,9 @@ describe("openclaw gateway adapter execute", () => {
expect(String(payload?.message ?? "")).toContain( expect(String(payload?.message ?? "")).toContain(
"Treat this wake payload as the highest-priority change for the current heartbeat.", "Treat this wake payload as the highest-priority change for the current heartbeat.",
); );
expect(String(payload?.message ?? "")).toContain(
"Do not switch to another issue until you have handled this wake.",
);
expect(String(payload?.message ?? "")).toContain("First comment"); expect(String(payload?.message ?? "")).toContain("First comment");
expect(String(payload?.message ?? "")).toContain("\"commentIds\":[\"comment-1\",\"comment-2\"]"); expect(String(payload?.message ?? "")).toContain("\"commentIds\":[\"comment-1\",\"comment-2\"]");
expect(payload?.paperclip).toMatchObject({ expect(payload?.paperclip).toMatchObject({