Skip to content

Commit 423c893

Browse files
committed
test: add unit test for clamped stale usage tail pressure in memory compaction
1 parent 76942f7 commit 423c893

2 files changed

Lines changed: 59 additions & 1 deletion

File tree

src/auto-reply/reply/agent-runner-memory.test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,64 @@ describe("runMemoryFlushIfNeeded", () => {
898898
expect(compactCall.currentTokenCount).toBeGreaterThanOrEqual(96_000);
899899
});
900900

901+
it("keeps trailing tail pressure when stale usage is clamped to message estimates", async () => {
902+
const sessionFile = path.join(rootDir, "clamped-stale-usage-tail-pressure-session.jsonl");
903+
await fs.writeFile(
904+
sessionFile,
905+
[
906+
JSON.stringify({
907+
message: {
908+
role: "assistant",
909+
content: "small answer",
910+
usage: { input: 86_000, output: 2_000 },
911+
},
912+
}),
913+
JSON.stringify({
914+
message: {
915+
role: "tool",
916+
content: `moderate interrupted tool output ${"x".repeat(48_000)}`,
917+
},
918+
}),
919+
].join("\n"),
920+
"utf8",
921+
);
922+
registerMemoryFlushPlanResolverForTest(() => ({
923+
softThresholdTokens: 4_000,
924+
forceFlushTranscriptBytes: 1_000_000_000,
925+
reserveTokensFloor: 0,
926+
prompt: "Pre-compaction memory flush.\nNO_REPLY",
927+
systemPrompt: "Write memory to memory/YYYY-MM-DD.md.",
928+
relativePath: "memory/2023-11-14.md",
929+
}));
930+
const sessionEntry: SessionEntry = {
931+
sessionId: "session",
932+
sessionFile,
933+
updatedAt: Date.now(),
934+
totalTokensFresh: false,
935+
};
936+
937+
await runPreflightCompactionIfNeeded({
938+
cfg: { agents: { defaults: { compaction: { memoryFlush: {} } } } },
939+
followupRun: createTestFollowupRun({
940+
sessionId: "session",
941+
sessionFile,
942+
sessionKey: "main",
943+
}),
944+
defaultModel: "anthropic/claude-opus-4-6",
945+
agentCfgContextTokens: 24_000,
946+
sessionEntry,
947+
sessionStore: { main: sessionEntry },
948+
sessionKey: "main",
949+
storePath: path.join(rootDir, "sessions.json"),
950+
isHeartbeat: false,
951+
replyOperation: createReplyOperation(),
952+
});
953+
954+
expect(compactEmbeddedPiSessionMock).toHaveBeenCalledTimes(1);
955+
const compactCall = requireCompactEmbeddedPiSessionCall();
956+
expect(compactCall.currentTokenCount).toBeGreaterThanOrEqual(20_000);
957+
});
958+
901959
it("does not count bytes from a large latest usage record as post-usage tail pressure", async () => {
902960
const sessionFile = path.join(rootDir, "large-usage-record-session.jsonl");
903961
await fs.writeFile(

src/auto-reply/reply/agent-runner-memory.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ async function estimatePromptTokensFromSessionTranscript(params: {
473473
usagePromptTokens >
474474
estimatedMessageTokens * STALE_USAGE_ESTIMATE_MULTIPLIER +
475475
STALE_USAGE_ESTIMATE_BUFFER_TOKENS
476-
? estimatedMessageTokens
476+
? estimatedMessageTokens + trailingBytesTokens
477477
: usagePromptTokens;
478478
return {
479479
promptTokens: Math.max(boundedUsagePromptTokens, estimatedMessageTokens ?? 0),

0 commit comments

Comments
 (0)