fix(compaction): guard model update during compaction and validate checkpoint model

This commit is contained in:
YeonGyu-Kim
2026-03-11 21:57:06 +09:00
parent d4232c9eac
commit f7085450f1
7 changed files with 280 additions and 29 deletions
+37 -3
View File
@@ -1,7 +1,7 @@
declare const require: (name: string) => any
const { afterEach, describe, expect, test } = require("bun:test")
import { afterEach, describe, expect, it } from "bun:test"
import { _resetForTesting, getSessionAgent, updateSessionAgent } from "../features/claude-code-session-state"
import { clearSessionModel, getSessionModel, setSessionModel } from "../shared/session-model-state"
import { createEventHandler } from "./event"
function createMinimalEventHandler() {
@@ -51,9 +51,11 @@ function createMinimalEventHandler() {
describe("createEventHandler compaction agent filtering", () => {
afterEach(() => {
_resetForTesting()
clearSessionModel("ses_compaction_poisoning")
clearSessionModel("ses_compaction_model_poisoning")
})
test("does not overwrite the stored session agent with compaction", async () => {
it("does not overwrite the stored session agent with compaction", async () => {
// given
const sessionID = "ses_compaction_poisoning"
updateSessionAgent(sessionID, "atlas")
@@ -80,4 +82,36 @@ describe("createEventHandler compaction agent filtering", () => {
// then
expect(getSessionAgent(sessionID)).toBe("atlas")
})
it("does not overwrite the stored session model with compaction", async () => {
// given
const sessionID = "ses_compaction_model_poisoning"
setSessionModel(sessionID, { providerID: "openai", modelID: "gpt-5" })
const eventHandler = createMinimalEventHandler()
const input: Parameters<ReturnType<typeof createEventHandler>>[0] = {
event: {
type: "message.updated",
properties: {
info: {
id: "msg-compaction-model",
sessionID,
role: "user",
agent: "compaction",
providerID: "anthropic",
modelID: "claude-opus-4-1",
time: { created: Date.now() },
},
},
},
}
// when
await eventHandler(input)
// then
expect(getSessionModel(sessionID)).toEqual({
providerID: "openai",
modelID: "gpt-5",
})
})
})
+3 -2
View File
@@ -317,12 +317,13 @@ export function createEventHandler(args: {
const agent = info?.agent as string | undefined;
const role = info?.role as string | undefined;
if (sessionID && role === "user") {
if (agent && !isCompactionAgent(agent)) {
const isCompactionMessage = agent ? isCompactionAgent(agent) : false;
if (agent && !isCompactionMessage) {
updateSessionAgent(sessionID, agent);
}
const providerID = info?.providerID as string | undefined;
const modelID = info?.modelID as string | undefined;
if (providerID && modelID) {
if (providerID && modelID && !isCompactionMessage) {
lastKnownModelBySession.set(sessionID, { providerID, modelID });
setSessionModel(sessionID, { providerID, modelID });
}