diff --git a/src/main/codex/config-settings-baseline-v3.test.ts b/src/main/codex/config-settings-baseline-v3.test.ts index 78aba051fad..85ef6bf7a54 100644 --- a/src/main/codex/config-settings-baseline-v3.test.ts +++ b/src/main/codex/config-settings-baseline-v3.test.ts @@ -142,6 +142,29 @@ describe('Codex settings baseline v3 persistence', () => { expect(readCodexSettingsBaseline(runtimeHomePath)).not.toBeNull() }) + it('writes v2 when ordinary tracking is requested without source authority', () => { + writeCodexSettingsBaseline(runtimeHomePath, { + settings: new Map([ + ['model', '"gpt-5"'], + ['personality', '"local"'] + ]), + conflicts: new Map(), + knownPromotedKeys: new Set(['model']), + sourceIsAuthoritative: false, + tracksAllOrdinarySettings: true + }) + + expect(readStoredBaseline()).toMatchObject({ + version: 2, + settings: { model: '"gpt-5"', personality: '"local"' } + }) + expect(readStoredBaseline().sourceAuthority).toBeUndefined() + expect(readCodexSettingsBaseline(runtimeHomePath)).toMatchObject({ + tracksAllOrdinarySettings: false, + sourceIsAuthoritative: false + }) + }) + it('keeps promoted ancestors when an unlisted value forces v2 fallback', () => { const settings = new Map([ ['model', '"gpt-5"'], diff --git a/src/main/codex/config-settings-baseline.ts b/src/main/codex/config-settings-baseline.ts index 88f039b7b4e..2451212bb5e 100644 --- a/src/main/codex/config-settings-baseline.ts +++ b/src/main/codex/config-settings-baseline.ts @@ -197,7 +197,9 @@ function isCodexSettingsConflict(value: unknown): value is CodexSettingsConflict function buildStoredSettingsBaseline(baseline: CodexSettingsBaseline): StoredSettingsBaseline { const preferred: StoredSettingsBaseline = { - version: baseline.tracksAllOrdinarySettings ? 3 : 2, + // A complete ordinary-key snapshot is only authoritative when it came + // from a readable system mirror; otherwise v2 keeps absence ambiguous. + version: baseline.tracksAllOrdinarySettings && baseline.sourceIsAuthoritative ? 3 : 2, settings: Object.fromEntries(baseline.settings) } if (baseline.conflicts.size > 0) {