diff --git a/server/src/__tests__/heartbeat-comment-wake-batching.test.ts b/server/src/__tests__/heartbeat-comment-wake-batching.test.ts index bf4bef7266..8a0344b81b 100644 --- a/server/src/__tests__/heartbeat-comment-wake-batching.test.ts +++ b/server/src/__tests__/heartbeat-comment-wake-batching.test.ts @@ -3239,7 +3239,16 @@ describeEmbeddedPostgres("heartbeat comment wake batching", () => { expect(runs[1]?.contextSnapshot).toMatchObject({ retryReason: "missing_issue_comment", }); - expect(runs[1]?.contextSnapshot).not.toHaveProperty("modelProfile"); + for (const key of [ + "modelProfile", + "paperclipModelProfile", + "recoveryIntent", + "allowDeliverableWork", + "allowDocumentUpdates", + "resumeRequiresNormalModel", + ]) { + expect(runs[1]?.contextSnapshot).not.toHaveProperty(key); + } } finally { gateway.releaseFirstWait(); await gateway.close(); @@ -3444,9 +3453,19 @@ describeEmbeddedPostgres("heartbeat comment wake batching", () => { ), ); expect(missingCommentRetries).toHaveLength(1); - expect(missingCommentRetries[0]?.payload).not.toHaveProperty( + expect(missingCommentRetries[0]?.payload).toMatchObject({ + retryReason: "missing_issue_comment", + }); + for (const key of [ "modelProfile", - ); + "paperclipModelProfile", + "recoveryIntent", + "allowDeliverableWork", + "allowDocumentUpdates", + "resumeRequiresNormalModel", + ]) { + expect(missingCommentRetries[0]?.payload).not.toHaveProperty(key); + } } finally { gateway.releaseFirstWait(); await gateway.close(); diff --git a/server/src/services/heartbeat.ts b/server/src/services/heartbeat.ts index 3de2209b3c..3031f0c949 100644 --- a/server/src/services/heartbeat.ts +++ b/server/src/services/heartbeat.ts @@ -13786,6 +13786,8 @@ export function heartbeatService( const contextSnapshot = parseObject(run.contextSnapshot); const taskKey = deriveTaskKeyWithHeartbeatFallback(contextSnapshot, null); const sessionBefore = await resolveSessionBeforeForWakeup(agent, taskKey); + // Missing-comment retries continue the original deliverable work, so they + // must not inherit the status-only mutation guards. const retryContextSnapshot = withRecoveryContext( { ...contextSnapshot, @@ -13794,7 +13796,7 @@ export function heartbeatService( retryReason: "missing_issue_comment", missingIssueCommentForRunId: run.id, }, - "status_only", + "normal_model", ); const responsibleUserId = await resolveResponsibleUserIdForRunContext( run, @@ -13833,7 +13835,7 @@ export function heartbeatService( retryOfRunId: run.id, retryReason: "missing_issue_comment", }, - "status_only", + "normal_model", ), status: "queued", requestedByActorType: "system",