diff --git a/src/main/claude/claude-structured-dispatch.test.ts b/src/main/claude/claude-structured-dispatch.test.ts index 0b15daf800d..4e8289a89e3 100644 --- a/src/main/claude/claude-structured-dispatch.test.ts +++ b/src/main/claude/claude-structured-dispatch.test.ts @@ -24,6 +24,7 @@ function sessionFor(send = vi.fn().mockResolvedValue(undefined)): ClaudeSession options: new Map(), reportedOptions: {}, reportedModelMutation: 0, + confirmedOptions: new Set(), restoreSkippedOptions: new Set(), capabilities: [], events: undefined, diff --git a/src/main/claude/claude-structured-effort-reporting.test.ts b/src/main/claude/claude-structured-effort-reporting.test.ts index 61ff1700bf6..887338c9807 100644 --- a/src/main/claude/claude-structured-effort-reporting.test.ts +++ b/src/main/claude/claude-structured-effort-reporting.test.ts @@ -70,6 +70,7 @@ describe('Claude effort readback', () => { session: { options: new Map(), optionMutationSequence: 0, + confirmedOptions: new Set(), connection: { applyFlagSettings: async (settings: { effortLevel?: string }) => { // The measured behaviour: an unknown effort is accepted and ignored. diff --git a/src/main/claude/claude-structured-model-confirmation.test.ts b/src/main/claude/claude-structured-model-confirmation.test.ts index b06aab17edd..a5ec41d21c6 100644 --- a/src/main/claude/claude-structured-model-confirmation.test.ts +++ b/src/main/claude/claude-structured-model-confirmation.test.ts @@ -97,6 +97,7 @@ describe('Claude effort the settings readback cannot report', () => { session: { options: new Map(), optionMutationSequence: 0, + confirmedOptions: new Set(), connection: { applyFlagSettings: async (settings: { effortLevel?: string }) => { calls.push(`apply:${settings.effortLevel}`) diff --git a/src/main/claude/claude-structured-options.test.ts b/src/main/claude/claude-structured-options.test.ts index bd93a70d40d..bc18a589e10 100644 --- a/src/main/claude/claude-structured-options.test.ts +++ b/src/main/claude/claude-structured-options.test.ts @@ -19,6 +19,7 @@ function sessionFor(setModel: ClaudeSession['connection']['setModel']): ClaudeSe options: new Map(), reportedOptions: {}, reportedModelMutation: 0, + confirmedOptions: new Set(), restoreSkippedOptions: new Set(), capabilities: [], events: undefined, diff --git a/src/main/claude/claude-structured-options.ts b/src/main/claude/claude-structured-options.ts index f170c89b286..63124c6d256 100644 --- a/src/main/claude/claude-structured-options.ts +++ b/src/main/claude/claude-structured-options.ts @@ -96,6 +96,10 @@ export async function restoreClaudeStructuredSessionOptions( // Any write that was already in flight belongs to the previous acquisition // state and must not repopulate this map after restore starts. session.optionMutationSequence += 1 + // The fence bump is not a write, so the report the session already holds is still + // current as of this instant; leaving the stamp behind would make every restored + // session read as unconfirmed until its next turn. + session.reportedModelMutation = session.optionMutationSequence const options = [...session.options.entries()] session.options.clear() for (const [key, value] of options) { diff --git a/src/main/claude/claude-structured-session-adapter.test.ts b/src/main/claude/claude-structured-session-adapter.test.ts index 693b08f5e47..3a94ea444da 100644 --- a/src/main/claude/claude-structured-session-adapter.test.ts +++ b/src/main/claude/claude-structured-session-adapter.test.ts @@ -573,7 +573,7 @@ describe('ClaudeStructuredSessionAdapter turns and controls', () => { }, { id: 'sonnet', label: 'Sonnet', isDefault: false, efforts: [] } ], - current: { model: 'sonnet', effort: 'high' } + current: { model: 'sonnet', effort: 'high', confirmed: ['model', 'effort'] } }) }) @@ -596,7 +596,11 @@ describe('ClaudeStructuredSessionAdapter turns and controls', () => { 'haiku', 'custom-model' ]) - expect(result.current).toEqual({ model: 'custom-model', effort: 'high' }) + expect(result.current).toEqual({ + model: 'custom-model', + effort: 'high', + confirmed: ['model', 'effort'] + }) }) })