From 0b0af39a014ce7807e8a87c6367a0ce2eb3c1c1e Mon Sep 17 00:00:00 2001 From: HarryZhou <2373256746@qq.com> Date: Sat, 22 Aug 2026 14:39:35 +0800 Subject: [PATCH 01/13] feat(status): warn when config.json diverges from the running proxy (CLI + GUI) --- gui/src/i18n/de.ts | 1 + gui/src/i18n/en.ts | 1 + gui/src/i18n/fr.ts | 1 + gui/src/i18n/ja.ts | 1 + gui/src/i18n/ko.ts | 1 + gui/src/i18n/ru.ts | 1 + gui/src/i18n/tr.ts | 1 + gui/src/i18n/zh-TW.ts | 1 + gui/src/i18n/zh.ts | 1 + gui/src/pages/dashboard-core-poll.ts | 40 ++++++++++ gui/src/pages/dashboard-overview-head.tsx | 13 ++- gui/src/pages/use-dashboard-data.ts | 16 ++++ gui/tests/dashboard-contracts.test.ts | 29 +++++++ src/cli/index.ts | 4 + src/cli/status.ts | 38 +++++++++ src/config.ts | 38 +++++++++ src/lib/local-management-capability.ts | 4 +- src/server/management/config-routes.ts | 5 ++ tests/config-divergence.test.ts | 97 +++++++++++++++++++++++ 19 files changed, 290 insertions(+), 3 deletions(-) create mode 100644 tests/config-divergence.test.ts diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index 12fa962020..2871cc597a 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -212,6 +212,7 @@ export const de: Record = { "dash.providers": "Anbieter", "dash.tokens30d": "Tokens (30d)", "dash.coverage": "{pct} Abdeckung", + "dash.configDiverged": "config.json wurde nach dem Laden durch den Proxy geändert — Neustart zum Anwenden", "dash.mem.title": "Speicherbeobachtung", "dash.mem.hint": "Schreibgeschützte Laufzeitdiagnose. Beobachteter Speicher ist max(RSS, external, ArrayBuffers), damit Windows-Working-Set-Trimming gebundenen Speicher nicht versteckt.", "dash.mem.rss": "Resident Set (RSS)", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index d0acc18dde..c940ec10e5 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -223,6 +223,7 @@ export const en = { "dash.providers": "Providers", "dash.tokens30d": "Tokens (30d)", "dash.coverage": "{pct} coverage", + "dash.configDiverged": "config.json changed on disk after the proxy loaded it — restart to apply", // memory observability card (read-only /api/system/memory) "dash.mem.title": "Memory observability", "dash.mem.hint": "Read-only runtime diagnostics. Observed memory is max(RSS, external, ArrayBuffers) so Windows working-set trimming does not hide committed retention.", diff --git a/gui/src/i18n/fr.ts b/gui/src/i18n/fr.ts index 983ac2a23b..a367c3001a 100644 --- a/gui/src/i18n/fr.ts +++ b/gui/src/i18n/fr.ts @@ -214,6 +214,7 @@ export const fr: Record = { "dash.providers": "Fournisseurs", "dash.tokens30d": "Jetons (30 j)", "dash.coverage": "Couverture : {pct}", + "dash.configDiverged": "config.json a changé sur le disque après le chargement du proxy — redémarrez pour appliquer", "dash.mem.title": "Observabilité de la mémoire", "dash.mem.hint": "Diagnostics d’exécution en lecture seule. La mémoire observée correspond à max(RSS, external, ArrayBuffers), afin que la réduction de l’ensemble de travail Windows ne masque pas la rétention allouée.", "dash.mem.rss": "Ensemble résident (RSS)", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index 05215462be..96e1c37a3e 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -221,6 +221,7 @@ export const ja: Record = { "dash.providers": "プロバイダー", "dash.tokens30d": "トークン (30日)", "dash.coverage": "{pct} カバレッジ", + "dash.configDiverged": "config.json がプロキシ読み込み後に変更されました — 再起動して適用", "dash.mem.title": "メモリ可観測性", "dash.mem.hint": "読み取り専用のランタイム診断。観測メモリは max(RSS, external, ArrayBuffers) で、Windows の working set trimming がコミット済み保持を隠さないようにします。", "dash.mem.rss": "常駐メモリ (RSS)", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index f3cd6fe9ec..83c98e8c49 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -216,6 +216,7 @@ export const ko: Record = { "dash.providers": "프로바이더", "dash.tokens30d": "토큰 (30일)", "dash.coverage": "커버리지 {pct}", + "dash.configDiverged": "config.json이 프록시 로드 후 변경되었습니다 — 재시작하여 적용", "dash.mem.title": "메모리 관찰", "dash.mem.hint": "읽기 전용 런타임 진단. 관측 메모리는 max(RSS, external, ArrayBuffers)라 Windows working set trimming이 커밋된 보존 메모리를 숨기지 못합니다.", "dash.mem.rss": "상주 메모리 (RSS)", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index 2cf73ba065..ea8a2f7fb9 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -221,6 +221,7 @@ export const ru: Record = { "dash.providers": "Провайдеры", "dash.tokens30d": "Токены (30 дн.)", "dash.coverage": "{pct} покрытия", + "dash.configDiverged": "config.json изменился на диске после загрузки прокси — перезапустите для применения", "dash.mem.title": "Наблюдение за памятью", "dash.mem.hint": "Диагностика среды выполнения только для чтения. Наблюдаемая память — max(RSS, external, ArrayBuffers), чтобы trimming рабочего набора Windows не скрывал удержанную память.", "dash.mem.rss": "Резидентная память (RSS)", diff --git a/gui/src/i18n/tr.ts b/gui/src/i18n/tr.ts index 4b84ddeaf5..6878cdc5f5 100644 --- a/gui/src/i18n/tr.ts +++ b/gui/src/i18n/tr.ts @@ -222,6 +222,7 @@ export const tr: Record = { "dash.providers": "Sağlayıcılar", "dash.tokens30d": "Jetonlar (30 gün)", "dash.coverage": "%{pct} kapsam", + "dash.configDiverged": "config.json, proxy yüklendikten sonra diskte değişti — uygulamak için yeniden başlatın", "dash.mem.title": "Bellek izlenebilirliği", "dash.mem.hint": "Salt okunur çalışma zamanı tanılamaları. Gözlemlenen bellek max(RSS, harici, ArrayBuffers) değeridir.", "dash.mem.rss": "Yerleşik küme (RSS)", diff --git a/gui/src/i18n/zh-TW.ts b/gui/src/i18n/zh-TW.ts index f4d226c4dd..2e8340ffcc 100644 --- a/gui/src/i18n/zh-TW.ts +++ b/gui/src/i18n/zh-TW.ts @@ -119,6 +119,7 @@ export const zhTW: Record = { "dash.providers": "供應商", "dash.tokens30d": "Token (30 天)", "dash.coverage": "覆蓋率 {pct}", + "dash.configDiverged": "config.json 在代理載入後已被修改 — 重啟後生效", "dash.mem.title": "記憶體可觀測性", "dash.mem.hint": "只讀執行時診斷。觀測記憶體為 max(RSS, external, ArrayBuffers),避免 Windows working set trimming 隱藏已提交的保留記憶體。", "dash.mem.rss": "常駐記憶體 (RSS)", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index 02c774fc16..2c172b1079 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -216,6 +216,7 @@ export const zh: Record = { "dash.providers": "提供方", "dash.tokens30d": "Token (30 天)", "dash.coverage": "覆盖率 {pct}", + "dash.configDiverged": "config.json 在代理加载后已被修改 — 重启后生效", "dash.mem.title": "内存可观测性", "dash.mem.hint": "只读运行时诊断。观测内存为 max(RSS, external, ArrayBuffers),避免 Windows working set trimming 隐藏已提交的保留内存。", "dash.mem.rss": "常驻内存 (RSS)", diff --git a/gui/src/pages/dashboard-core-poll.ts b/gui/src/pages/dashboard-core-poll.ts index 5198801889..8b1d281996 100644 --- a/gui/src/pages/dashboard-core-poll.ts +++ b/gui/src/pages/dashboard-core-poll.ts @@ -76,6 +76,16 @@ export type DashboardSettingsPoll = { startupHealthSeed: SettingsData["startupHealth"] | null | undefined; }; +export type DashboardConfigStatusPoll = { + /** Null when the endpoint is unavailable (older server) or the fetch failed. */ + configDivergence: { + available: boolean; + residentVersion: string | null; + diskVersion: string | null; + diverged: boolean; + } | null; +}; + export type DashboardMaModePoll = { maMode: "v1" | "default" | "v2"; }; @@ -248,6 +258,36 @@ export async function fetchDashboardMaMode( } } +/** + * Resident-vs-disk config divergence from the running proxy. Older servers without + * /api/config/status report null; the dashboard must keep showing the normal state. + */ +export async function fetchDashboardConfigStatus( + apiBase: string, + signal: AbortSignal, +): Promise { + try { + const response = await fetch(`${apiBase}/api/config/status`, { signal }); + if (!response.ok) return { configDivergence: null }; + const data = await response.json() as { + residentVersion?: unknown; + diskVersion?: unknown; + diverged?: unknown; + }; + return { + configDivergence: { + available: true, + residentVersion: typeof data.residentVersion === "string" ? data.residentVersion : null, + diskVersion: typeof data.diskVersion === "string" ? data.diskVersion : null, + diverged: data.diverged === true, + }, + }; + } catch (error) { + if (isAbortError(error, signal)) throw error; + return { configDivergence: null }; + } +} + export async function fetchDashboardOverview( apiBase: string, signal: AbortSignal, diff --git a/gui/src/pages/dashboard-overview-head.tsx b/gui/src/pages/dashboard-overview-head.tsx index 9cccc0e26c..74557f5f81 100644 --- a/gui/src/pages/dashboard-overview-head.tsx +++ b/gui/src/pages/dashboard-overview-head.tsx @@ -16,14 +16,15 @@ export function DashboardOverviewHead({ healthLoading, startupHealth, projectConfigWarnings, + configDivergence, maMode, maBusy, maHelpTriggerRef, maHelpOpen, setMaHelpOpen, - switchMaMode, + switchMaMode, maError, -}: Pick) { +}: Pick) { const t = useT(); const online = health?.status === "ok"; @@ -111,6 +112,14 @@ export function DashboardOverviewHead({ )} + {configDivergence?.available === true && configDivergence.diverged && ( +
+ +
+ )} {projectConfigWarnings.length > 0 && ( diff --git a/gui/src/pages/use-dashboard-data.ts b/gui/src/pages/use-dashboard-data.ts index 9e2c4cda3a..5a96d4eafc 100644 --- a/gui/src/pages/use-dashboard-data.ts +++ b/gui/src/pages/use-dashboard-data.ts @@ -18,10 +18,12 @@ import { fetchDashboardSettings, fetchDashboardSidecars, fetchDashboardUsage, + fetchDashboardConfigStatus, fetchProjectConfigDiagnostics, fetchStartupHealth, normalizeInjectionSelection, type DashboardEpochRefs, + type DashboardConfigStatusPoll, } from "./dashboard-core-poll"; import { usageSummary30dResourceKey } from "../usage-summary-resource"; import { @@ -124,6 +126,7 @@ export function useDashboardData(apiBase: string) { const [settingsSaving, setSettingsSaving] = useState(false); const [syncing, setSyncing] = useState(false); const [maMode, setMaMode] = useState(() => cachedMaMode ?? "default"); + const [configDivergence, setConfigDivergence] = useState(null); const [maBusy, setMaBusy] = useState(false); const [maError, setMaError] = useState(null); const [maHelpOpen, setMaHelpOpen] = useState(false); @@ -234,6 +237,13 @@ export function useDashboardData(apiBase: string) { { pollMs: 5000 }, ); + const configStatusPoll = useKeyedClientResource( + `dashboard-config-status:${apiBase}`, + [apiBase], + (signal) => fetchDashboardConfigStatus(apiBase, signal), + { pollMs: 15000 }, + ); + const sidecarPoll = useKeyedClientResource( `dashboard-sidecars:${apiBase}`, [apiBase], @@ -324,6 +334,11 @@ export function useDashboardData(apiBase: string) { writeSessionListCache(`${MA_MODE_CACHE_PREFIX}${apiBase}`, maModePoll.data.maMode); }, [maModePoll.data, apiBase]); + useEffect(() => { + if (configStatusPoll.data === undefined) return; + setConfigDivergence(configStatusPoll.data.configDivergence); + }, [configStatusPoll.data]); + // Derived — avoids setState-on-prop-change for the resolved flag. Cache / poll / optimistic // save (which writes the same cache key) all count as resolved for MA UI. const maModeResolved = maModePoll.data !== undefined || cachedMaMode !== null; @@ -774,6 +789,7 @@ export function useDashboardData(apiBase: string) { modelQuery, setModelQuery, expandedProviders, setExpandedProviders, health, startupHealth, providers, models, settings, sidecar, shadowCall, usage30d, + configDivergence, usageLoading: usagePoll.loading && !usage30d, healthLoading: overviewPoll.loading && !health, sidecarSaving, shadowCallSaving, modelsLoading, settingsSaving, syncing, diff --git a/gui/tests/dashboard-contracts.test.ts b/gui/tests/dashboard-contracts.test.ts index a1ccca9890..78a5ce62cf 100644 --- a/gui/tests/dashboard-contracts.test.ts +++ b/gui/tests/dashboard-contracts.test.ts @@ -179,6 +179,35 @@ test("fetchStartupHealth does not map abort into a sticky error status", async ( } }); +test("dashboard config-divergence status is fetched from /api/config/status and wired into the hook", async () => { + const core = await Bun.file(new URL("../src/pages/dashboard-core-poll.ts", import.meta.url)).text(); + const hook = await Bun.file(new URL("../src/pages/use-dashboard-data.ts", import.meta.url)).text(); + const head = await Bun.file(new URL("../src/pages/dashboard-overview-head.tsx", import.meta.url)).text(); + expect(core).toContain("/api/config/status"); + expect(core).toContain("export async function fetchDashboardConfigStatus"); + expect(hook).toContain("fetchDashboardConfigStatus(apiBase, signal)"); + expect(hook).toContain("configStatusPoll"); + expect(hook).toContain("configDivergence,"); + expect(head).toContain("configDivergence?.available === true"); + expect(head).toContain("dash.configDiverged"); +}); + +test("fetchDashboardConfigStatus normalizes diverged and tolerates old servers", async () => { + const { fetchDashboardConfigStatus } = await import("../src/pages/dashboard-core-poll"); + const originalFetch = globalThis.fetch; + try { + globalThis.fetch = (async () => Response.json({ residentVersion: "a", diskVersion: "b", diverged: true })) as typeof fetch; + await expect(fetchDashboardConfigStatus("http://test", new AbortController().signal)).resolves.toEqual({ + configDivergence: { available: true, residentVersion: "a", diskVersion: "b", diverged: true }, + }); + globalThis.fetch = (async () => new Response("nope", { status: 404 })) as typeof fetch; + await expect(fetchDashboardConfigStatus("http://test", new AbortController().signal)).resolves.toEqual({ configDivergence: null }); + } finally { + globalThis.fetch = originalFetch; + } +}); + + // The chip used to sit on the server's conservative placeholder until the next 30s tick, which is // why an unrelated action (refresh quota, tab hop) looked like the thing that fixed it. The probe // has to carry `stale` through so the caller can re-ask in seconds. diff --git a/src/cli/index.ts b/src/cli/index.ts index 85d4b61a94..1ce02073d4 100755 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -884,6 +884,10 @@ async function handleStatus() { console.log(` ⚠️ ${status.json.codexHome.warning}`); console.log(` Action: ${status.json.codexHome.action}`); } + if (status.json.configDivergence.available && status.json.configDivergence.diverged) { + console.log(" ⚠️ config.json changed on disk after the running proxy loaded it; the proxy is still serving the older settings."); + console.log(" Action: restart the service to apply: 'ocx service restart'."); + } console.log(` Catalog clamp: ${status.json.codexRuntime.catalogClamp.active ? "active" : "inactive"}`); if (status.json.codexRuntime.catalogClamp.removedEfforts.length > 0) { console.log(` Removed efforts: ${status.json.codexRuntime.catalogClamp.removedEfforts.join(", ")}`); diff --git a/src/cli/status.ts b/src/cli/status.ts index 1ba11f96a3..ad951fd625 100644 --- a/src/cli/status.ts +++ b/src/cli/status.ts @@ -1,6 +1,8 @@ import { durableBunRuntime } from "../lib/bun-runtime"; import { codexAutoStartEnabled, getConfigPath, readConfigDiagnostics } from "../config"; import { getPidPath, readPid, readRuntimePort, type RuntimePortState } from "../config/process-state"; +import { LOCAL_MANAGEMENT_READ_PATHS } from "../lib/local-management-capability"; +import { fetchBoundLocalManagementRead } from "../server/local-management-read-client"; import { diagnoseCodexBundledPlugins, type CodexPluginsDiagnostic } from "../codex/plugins-doctor"; import { findLiveProxy, isOpencodexHealthz, probeHostname } from "../server/proxy-liveness"; import { directLocalHttpFetch } from "../server/direct-local-http"; @@ -54,6 +56,13 @@ export type CliStatusJson = { source: "default" | "file" | "fallback"; error: string | null; }; + configDivergence: { + /** True when the running proxy answered; false when it is down or unreadable. */ + available: boolean; + residentVersion: string | null; + diskVersion: string | null; + diverged: boolean; + }; service: { summary: string }; codexShim: { summary: string }; codexPlugins: CodexPluginsDiagnostic; @@ -198,6 +207,34 @@ export async function collectStatus(): Promise { label: `${listen.healthUrl} ok (live)`, } : await checkProxyHealth(listen); + // The resident config identity lives only in the proxy process. Ask it directly via + // the loopback management-read capability; a down/unreadable proxy means "unknown", + // never a fabricated divergence claim. + const configDivergence = await (async () => { + const unavailable = { available: false, residentVersion: null, diskVersion: null, diverged: false }; + if (!live) return unavailable; + try { + const read = await fetchBoundLocalManagementRead( + live, + LOCAL_MANAGEMENT_READ_PATHS.configStatus, + { timeoutMs: 4_000 }, + ); + if (read.kind !== "response" || !read.response.ok) return unavailable; + const body = await read.response.json() as { + residentVersion?: unknown; + diskVersion?: unknown; + diverged?: unknown; + }; + return { + available: true, + residentVersion: typeof body.residentVersion === "string" ? body.residentVersion : null, + diskVersion: typeof body.diskVersion === "string" ? body.diskVersion : null, + diverged: body.diverged === true, + }; + } catch { + return unavailable; + } + })(); const bunRuntime = durableBunRuntime(); const service = diagnoseService(); // A service can be registered and still not serve: the manager reports the job @@ -342,6 +379,7 @@ export async function collectStatus(): Promise { source: configDiagnostics.source, error: configDiagnostics.error, }, + configDivergence, service: { summary: serviceSummary }, codexShim: { summary: codexShimSummary }, codexPlugins, diff --git a/src/config.ts b/src/config.ts index dcff748799..b322ee6f8d 100644 --- a/src/config.ts +++ b/src/config.ts @@ -2223,9 +2223,42 @@ export function readConfigAdmissionSnapshot(): ConfigAdmissionSnapshot { }; } +export interface ConfigDivergenceStatus { + /** SHA-256 of the config bytes the running process last loaded or wrote. */ + residentVersion: string | null; + /** SHA-256 of the current config.json bytes on disk (null when unreadable). */ + diskVersion: string | null; + /** True only when a resident version exists and differs from the current disk bytes. */ + diverged: boolean; +} + +/** + * Compare the running process's resident config identity to the current file. A CLI + * process without an armed live config reports `residentVersion: null` and never claims + * divergence; only the proxy process can answer this truthfully. + */ +export function readConfigDivergenceStatus(): ConfigDivergenceStatus { + const admission = readConfigAdmissionSnapshot(); + const diskVersion = admission.kind === "read" ? admission.contentSha256 : null; + return { + residentVersion: residentConfigSha256, + diskVersion, + diverged: residentConfigSha256 !== null && diskVersion !== null && residentConfigSha256 !== diskVersion, + }; +} + const CONFIG_MUTATION_DB_FILENAME = "config-mutation.sqlite"; const CONFIG_MUTATION_DB_SIDECARS = ["-journal", "-wal", "-shm"] as const; let warnedConfigMutationDirectoryAcl = false; +// SHA-256 of the config bytes the running process last loaded or wrote (armed at server +// start, refreshed on every changed in-process save). Compared to the current file digest +// by `ocx status` / the dashboard to warn when config.json changed without a reload. +let residentConfigSha256: string | null = null; + +/** Test-only seam: reset the resident identity so isolated test files cannot leak state. */ +export function setResidentConfigSha256ForTests(value: string | null): void { + residentConfigSha256 = value; +} export class ConfigMutationLockError extends Error { readonly code = "CONFIG_MUTATION_LOCK_UNAVAILABLE"; @@ -2450,6 +2483,7 @@ function persistConfigUnlocked(config: OcxConfig): boolean { return false; } atomicWriteFile(configPath, bytes); + residentConfigSha256 = createHash("sha256").update(bytes).digest("hex"); // For changed saves, refresh only AFTER the write succeeded so a failed // write cannot leave estimates reflecting configuration never persisted. refreshUserCostOverlays(persisted); @@ -2601,6 +2635,10 @@ const persistedLiveServerBinding = new WeakMap { + previousHome = process.env.OPENCODEX_HOME; + testRoot = mkdtempSync(join(import.meta.dir, ".tmp-config-divergence-")); + process.env.OPENCODEX_HOME = testRoot; + setResidentConfigSha256ForTests(null); +}); + +afterEach(() => { + if (previousHome === undefined) delete process.env.OPENCODEX_HOME; + else process.env.OPENCODEX_HOME = previousHome; + rmSync(testRoot, { recursive: true, force: true }); +}); + +function config(port = 10100): OcxConfig { + return { + port, + defaultProvider: "openai", + providers: { + openai: { + adapter: "openai-chat", + baseUrl: "https://api.example.test/v1", + apiKey: "sk-secret", + }, + }, + } as unknown as OcxConfig; +} + +describe("config divergence status", () => { + test("unarmed process reports no divergence (resident unknown)", () => { + // A process that never armed a live baseline nor saved (e.g. `ocx status`) has no + // resident identity to compare; it must never claim divergence. + writeFileSync(getConfigPath(), JSON.stringify(config(), null, 2) + "\n"); + const status = readConfigDivergenceStatus(); + expect(status.residentVersion).toBeNull(); + expect(status.diskVersion).not.toBeNull(); + expect(status.diverged).toBe(false); + }); + + test("external disk edit after arming flips diverged", async () => { + saveConfig(config()); + const armed = loadConfig(); + armClaudeCodeBaseline(armed); + expect(readConfigDivergenceStatus().diverged).toBe(false); + // Simulate an external editor / another process rewriting config.json. + const path = getConfigPath(); + const current = JSON.parse(await Bun.file(path).text()); + current.port = 20200; + writeFileSync(path, JSON.stringify(current, null, 2) + "\n"); + const status = readConfigDivergenceStatus(); + expect(status.diverged).toBe(true); + expect(status.residentVersion).not.toBe(status.diskVersion); + }); + + test("an in-process save refreshes the resident version", () => { + saveConfig(config()); + const armed = loadConfig(); + armClaudeCodeBaseline(armed); + armed.port = 20200; + saveConfig(armed); + const status = readConfigDivergenceStatus(); + expect(status.diverged).toBe(false); + expect(status.residentVersion).toBe(status.diskVersion); + }); + + test("GET /api/config/status exposes resident and disk versions", async () => { + saveConfig(config()); + const armed = loadConfig(); + armClaudeCodeBaseline(armed); + const response = await handleManagementAPI( + new Request("http://127.0.0.1:10100/api/config/status", { headers: { Host: "127.0.0.1:10100" } }), + new URL("http://127.0.0.1:10100/api/config/status"), + armed, + ); + expect(response).not.toBeNull(); + const body = await response!.json() as { residentVersion?: unknown; diskVersion?: unknown; diverged?: unknown }; + expect(body.diverged).toBe(false); + expect(typeof body.residentVersion).toBe("string"); + expect(typeof body.diskVersion).toBe("string"); + }); +}); From 2f708ba3408638f0f3d563bd038771848a57f9af Mon Sep 17 00:00:00 2001 From: HarryZhou <2373256746@qq.com> Date: Sat, 22 Aug 2026 14:39:54 +0800 Subject: [PATCH 02/13] docs: add config-divergence card preview screenshot --- docs/pr-assets/config-divergence-card.png | Bin 0 -> 22756 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/pr-assets/config-divergence-card.png diff --git a/docs/pr-assets/config-divergence-card.png b/docs/pr-assets/config-divergence-card.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc238b18cb4b355b1b565bb1445e58db75887b6 GIT binary patch literal 22756 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 Date: Sat, 22 Aug 2026 14:47:42 +0800 Subject: [PATCH 03/13] fix(status): address CodeRabbit findings (payload validation, resident digest, de wording) --- gui/src/i18n/de.ts | 2 +- gui/src/pages/dashboard-core-poll.ts | 14 ++++++++--- gui/tests/dashboard-contracts.test.ts | 6 +++++ src/cli/status.ts | 14 ++++++++--- src/config.ts | 16 ++++++++---- tests/config-divergence.test.ts | 35 +++++++++++++++++++++++++++ 6 files changed, 75 insertions(+), 12 deletions(-) diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index 2871cc597a..5ce4247c23 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -212,7 +212,7 @@ export const de: Record = { "dash.providers": "Anbieter", "dash.tokens30d": "Tokens (30d)", "dash.coverage": "{pct} Abdeckung", - "dash.configDiverged": "config.json wurde nach dem Laden durch den Proxy geändert — Neustart zum Anwenden", + "dash.configDiverged": "config.json wurde nach dem Laden durch den Proxy extern auf der Festplatte geändert — Neustart zum Anwenden", "dash.mem.title": "Speicherbeobachtung", "dash.mem.hint": "Schreibgeschützte Laufzeitdiagnose. Beobachteter Speicher ist max(RSS, external, ArrayBuffers), damit Windows-Working-Set-Trimming gebundenen Speicher nicht versteckt.", "dash.mem.rss": "Resident Set (RSS)", diff --git a/gui/src/pages/dashboard-core-poll.ts b/gui/src/pages/dashboard-core-poll.ts index 8b1d281996..caff3eedee 100644 --- a/gui/src/pages/dashboard-core-poll.ts +++ b/gui/src/pages/dashboard-core-poll.ts @@ -274,12 +274,20 @@ export async function fetchDashboardConfigStatus( diskVersion?: unknown; diverged?: unknown; }; + const residentVersion = data.residentVersion ?? null; + const diskVersion = data.diskVersion ?? null; + const diverged = data.diverged; + if ( + !(residentVersion === null || typeof residentVersion === "string") + || !(diskVersion === null || typeof diskVersion === "string") + || typeof diverged !== "boolean" + ) return { configDivergence: null }; return { configDivergence: { available: true, - residentVersion: typeof data.residentVersion === "string" ? data.residentVersion : null, - diskVersion: typeof data.diskVersion === "string" ? data.diskVersion : null, - diverged: data.diverged === true, + residentVersion, + diskVersion, + diverged, }, }; } catch (error) { diff --git a/gui/tests/dashboard-contracts.test.ts b/gui/tests/dashboard-contracts.test.ts index 78a5ce62cf..f494b2965c 100644 --- a/gui/tests/dashboard-contracts.test.ts +++ b/gui/tests/dashboard-contracts.test.ts @@ -202,6 +202,12 @@ test("fetchDashboardConfigStatus normalizes diverged and tolerates old servers", }); globalThis.fetch = (async () => new Response("nope", { status: 404 })) as typeof fetch; await expect(fetchDashboardConfigStatus("http://test", new AbortController().signal)).resolves.toEqual({ configDivergence: null }); + + // Malformed successful payloads must not be trusted as available data. + globalThis.fetch = (async () => Response.json({})) as typeof fetch; + await expect(fetchDashboardConfigStatus("http://test", new AbortController().signal)).resolves.toEqual({ configDivergence: null }); + globalThis.fetch = (async () => Response.json({ residentVersion: "a", diskVersion: "b", diverged: "yes" })) as typeof fetch; + await expect(fetchDashboardConfigStatus("http://test", new AbortController().signal)).resolves.toEqual({ configDivergence: null }); } finally { globalThis.fetch = originalFetch; } diff --git a/src/cli/status.ts b/src/cli/status.ts index ad951fd625..4f58d6e3f6 100644 --- a/src/cli/status.ts +++ b/src/cli/status.ts @@ -225,11 +225,19 @@ export async function collectStatus(): Promise { diskVersion?: unknown; diverged?: unknown; }; + const residentVersion = body.residentVersion ?? null; + const diskVersion = body.diskVersion ?? null; + const diverged = body.diverged; + if ( + !(residentVersion === null || typeof residentVersion === "string") + || !(diskVersion === null || typeof diskVersion === "string") + || typeof diverged !== "boolean" + ) return unavailable; return { available: true, - residentVersion: typeof body.residentVersion === "string" ? body.residentVersion : null, - diskVersion: typeof body.diskVersion === "string" ? body.diskVersion : null, - diverged: body.diverged === true, + residentVersion, + diskVersion, + diverged, }; } catch { return unavailable; diff --git a/src/config.ts b/src/config.ts index b322ee6f8d..5dbc0f4227 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1778,7 +1778,11 @@ export function loadConfig(): OcxConfig { return withRefreshedCostOverlays(getDefaultConfig()); } try { - const raw = readFileSync(configPath, "utf-8").replace(/^\uFEFF/, ""); + // Keep the pre-strip bytes: the resident identity must hash exactly what the + // process parsed, including a leading BOM, so it matches the admission digest. + const rawWithBom = readFileSync(configPath, "utf-8"); + const raw = rawWithBom.replace(/^\uFEFF/, ""); + residentConfigSha256 = createHash("sha256").update(rawWithBom).digest("hex"); const parsed = JSON.parse(raw); sanitizeRetryOn429ForLoad(parsed); sanitizeModelCostsForLoad(parsed); @@ -1844,9 +1848,11 @@ export function loadConfig(): OcxConfig { } // Merge couldn't fix it — truly broken config warnAndBackupInvalidConfig(configPath, result.error); + residentConfigSha256 = null; return getDefaultConfig(); } catch (error) { warnAndBackupInvalidConfig(configPath, error); + residentConfigSha256 = null; return getDefaultConfig(); } } @@ -2635,10 +2641,10 @@ const persistedLiveServerBinding = new WeakMap { expect(status.residentVersion).toBe(status.diskVersion); }); + test("resident digest comes from the loaded bytes, not a post-load re-read", async () => { + const first = JSON.stringify(config(), null, 2) + "\n"; + writeFileSync(getConfigPath(), first); + const loaded = loadConfig(); + // The file changes between load and arming (e.g. another process saves during startup). + const second = JSON.stringify(config(20200), null, 2) + "\n"; + writeFileSync(getConfigPath(), second); + armClaudeCodeBaseline(loaded); + const status = readConfigDivergenceStatus(); + // Resident identity is the bytes that PRODUCED the live config (first), so the + // newer disk bytes are a real divergence the running process has not applied. + expect(status.residentVersion).toBe(createHash("sha256").update(first).digest("hex")); + expect(status.diverged).toBe(true); + }); + + test("a save that preserves disk-only providers does not false-positive", () => { + const onDisk = JSON.stringify({ + ...config(), + defaultProvider: "diskOnly", + providers: { + diskOnly: { adapter: "openai-chat", baseUrl: "https://disk.example/v1", apiKey: "sk-disk" }, + }, + }, null, 2) + "\n"; + writeFileSync(getConfigPath(), onDisk); + const loaded = loadConfig(); + armClaudeCodeBaseline(loaded); + // Live edit adds a provider; persistConfigUnlocked preserves the disk-only row. + loaded.providers.live = { adapter: "openai-chat", baseUrl: "https://live.example/v1", apiKey: "sk-live" }; + saveConfig(loaded); + const status = readConfigDivergenceStatus(); + expect(status.diverged).toBe(false); + expect(status.residentVersion).toBe(status.diskVersion); + }); + test("GET /api/config/status exposes resident and disk versions", async () => { saveConfig(config()); const armed = loadConfig(); From db3ee0ffba4129ce7f9e2f0e221abf6ca871d252 Mon Sep 17 00:00:00 2001 From: HarryZhou <2373256746@qq.com> Date: Sat, 22 Aug 2026 14:53:53 +0800 Subject: [PATCH 04/13] fix(status): clear resident identity when config is missing; strengthen disk-only regression --- src/config.ts | 3 +++ tests/config-divergence.test.ts | 39 +++++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/config.ts b/src/config.ts index 5dbc0f4227..126b92c7ef 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1775,6 +1775,9 @@ export function loadConfig(): OcxConfig { hardenExistingSecret(configPath); hardenExistingSecret(join(dir, "auth.json")); if (!existsSync(configPath)) { + // No file means the process is serving defaults, not the previously loaded bytes; + // a reload after deletion must not retain the old resident identity. + residentConfigSha256 = null; return withRefreshedCostOverlays(getDefaultConfig()); } try { diff --git a/tests/config-divergence.test.ts b/tests/config-divergence.test.ts index d95a3a9aab..04392b8f6a 100644 --- a/tests/config-divergence.test.ts +++ b/tests/config-divergence.test.ts @@ -11,6 +11,7 @@ import { setResidentConfigSha256ForTests, } from "../src/config"; import { handleManagementAPI } from "../src/server/management-api"; +import { reconcileUserCostOverlaysFromDisk } from "../src/usage/user-cost-overlay-reconciler"; import type { OcxConfig } from "../src/types"; let testRoot = ""; @@ -54,6 +55,23 @@ describe("config divergence status", () => { expect(status.diverged).toBe(false); }); + test("deleting the config clears the resident identity instead of retaining stale bytes", async () => { + const bytes = JSON.stringify(config(), null, 2) + "\n"; + writeFileSync(getConfigPath(), bytes); + const loaded = loadConfig(); + armClaudeCodeBaseline(loaded); + expect(readConfigDivergenceStatus().residentVersion).not.toBeNull(); + rmSync(getConfigPath()); + loadConfig(); + expect(readConfigDivergenceStatus().residentVersion).toBeNull(); + // Restoring the original bytes must not resurrect a stale divergence claim: with + // no resident identity the process cannot assert the file differs from it. + writeFileSync(getConfigPath(), bytes); + const status = readConfigDivergenceStatus(); + expect(status.diskVersion).not.toBeNull(); + expect(status.diverged).toBe(false); + }); + test("external disk edit after arming flips diverged", async () => { saveConfig(config()); const armed = loadConfig(); @@ -95,23 +113,30 @@ describe("config divergence status", () => { expect(status.diverged).toBe(true); }); - test("a save that preserves disk-only providers does not false-positive", () => { - const onDisk = JSON.stringify({ + test("a save that preserves disk-only providers does not false-positive", async () => { + // Start with only the existing provider; the disk-only row arrives as an EXTERNAL + // edit after the process armed its resident identity. + writeFileSync(getConfigPath(), JSON.stringify(config(), null, 2) + "\n"); + const loaded = loadConfig(); + armClaudeCodeBaseline(loaded); + writeFileSync(getConfigPath(), JSON.stringify({ ...config(), - defaultProvider: "diskOnly", providers: { + ...(config().providers as Record), diskOnly: { adapter: "openai-chat", baseUrl: "https://disk.example/v1", apiKey: "sk-disk" }, }, - }, null, 2) + "\n"; - writeFileSync(getConfigPath(), onDisk); - const loaded = loadConfig(); - armClaudeCodeBaseline(loaded); + }, null, 2) + "\n"); + // The production server notices the external edit via its cost-overlay reconciler + // poll; drive that same step so the save below preserves the disk-only row. + reconcileUserCostOverlaysFromDisk(loaded); // Live edit adds a provider; persistConfigUnlocked preserves the disk-only row. loaded.providers.live = { adapter: "openai-chat", baseUrl: "https://live.example/v1", apiKey: "sk-live" }; saveConfig(loaded); const status = readConfigDivergenceStatus(); expect(status.diverged).toBe(false); expect(status.residentVersion).toBe(status.diskVersion); + const persisted = JSON.parse(await Bun.file(getConfigPath()).text()) as { providers: Record }; + expect(persisted.providers.diskOnly).toBeDefined(); }); test("GET /api/config/status exposes resident and disk versions", async () => { From 54b32ae0bc8310773a7dbc350cbf9fe7bbb8abfc Mon Sep 17 00:00:00 2001 From: HarryZhou <2373256746@qq.com> Date: Sat, 22 Aug 2026 14:58:41 +0800 Subject: [PATCH 05/13] fix(status): hash raw config bytes for the resident identity --- src/config.ts | 8 ++++++-- tests/config-divergence.test.ts | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/config.ts b/src/config.ts index 126b92c7ef..8af90ff055 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1783,9 +1783,13 @@ export function loadConfig(): OcxConfig { try { // Keep the pre-strip bytes: the resident identity must hash exactly what the // process parsed, including a leading BOM, so it matches the admission digest. - const rawWithBom = readFileSync(configPath, "utf-8"); + // Hash the RAW bytes (not the decoded string): decoding can map malformed + // UTF-8 sequences onto replacement characters, which would make the digest + // disagree with the file's true byte SHA-256 and misreport divergence. + const fileBytes = readFileSync(configPath); + residentConfigSha256 = createHash("sha256").update(fileBytes).digest("hex"); + const rawWithBom = fileBytes.toString("utf-8"); const raw = rawWithBom.replace(/^\uFEFF/, ""); - residentConfigSha256 = createHash("sha256").update(rawWithBom).digest("hex"); const parsed = JSON.parse(raw); sanitizeRetryOn429ForLoad(parsed); sanitizeModelCostsForLoad(parsed); diff --git a/tests/config-divergence.test.ts b/tests/config-divergence.test.ts index 04392b8f6a..d644e02605 100644 --- a/tests/config-divergence.test.ts +++ b/tests/config-divergence.test.ts @@ -113,6 +113,23 @@ describe("config divergence status", () => { expect(status.diverged).toBe(true); }); + test("resident digest hashes the raw file bytes, not the decoded string", () => { + // A malformed UTF-8 byte inside a JSON string value decodes to U+FFFD; the + // digest must still match the file's exact byte SHA-256. + const rawBytes = Buffer.concat([ + Buffer.from('{"port":10100,"note":"'), + Buffer.from([0xff]), + Buffer.from('"}\n'), + ]); + writeFileSync(getConfigPath(), rawBytes); + loadConfig(); + const status = readConfigDivergenceStatus(); + const byteDigest = createHash("sha256").update(rawBytes).digest("hex"); + const decodedDigest = createHash("sha256").update(rawBytes.toString("utf-8")).digest("hex"); + expect(byteDigest).not.toBe(decodedDigest); + expect(status.residentVersion).toBe(byteDigest); + }); + test("a save that preserves disk-only providers does not false-positive", async () => { // Start with only the existing provider; the disk-only row arrives as an EXTERNAL // edit after the process armed its resident identity. From efa4c93d50b1deb178127702c4756b84bc359b9b Mon Sep 17 00:00:00 2001 From: HarryZhou <2373256746@qq.com> Date: Sat, 22 Aug 2026 15:05:28 +0800 Subject: [PATCH 06/13] test(status): pin disk-only row edit as a real divergence --- tests/config-divergence.test.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/config-divergence.test.ts b/tests/config-divergence.test.ts index d644e02605..de4765c281 100644 --- a/tests/config-divergence.test.ts +++ b/tests/config-divergence.test.ts @@ -156,6 +156,30 @@ describe("config divergence status", () => { expect(persisted.providers.diskOnly).toBeDefined(); }); + test("an external edit to a preserved disk-only row still flips diverged", async () => { + writeFileSync(getConfigPath(), JSON.stringify(config(), null, 2) + "\n"); + const loaded = loadConfig(); + armClaudeCodeBaseline(loaded); + writeFileSync(getConfigPath(), JSON.stringify({ + ...config(), + providers: { + ...(config().providers as Record), + diskOnly: { adapter: "openai-chat", baseUrl: "https://disk.example/v1", apiKey: "sk-disk" }, + }, + }, null, 2) + "\n"); + reconcileUserCostOverlaysFromDisk(loaded); + saveConfig(loaded); + // The file the proxy last wrote includes the preserved disk-only row; editing that + // row is still a real file change that a restart applies (the row becomes live + // routing after restart), so the warning must not be hidden. + const path = getConfigPath(); + const current = JSON.parse(await Bun.file(path).text()) as { providers: Record }; + current.providers.diskOnly.baseUrl = "https://disk.example/v2"; + writeFileSync(path, JSON.stringify(current, null, 2) + "\n"); + const status = readConfigDivergenceStatus(); + expect(status.diverged).toBe(true); + }); + test("GET /api/config/status exposes resident and disk versions", async () => { saveConfig(config()); const armed = loadConfig(); From 5316b33defc2404e328e4f434f1fdd55d6129ac5 Mon Sep 17 00:00:00 2001 From: HarryZhou <2373256746@qq.com> Date: Sat, 22 Aug 2026 15:09:01 +0800 Subject: [PATCH 07/13] fix(status): state explicitly that config changes are not auto-reloaded --- gui/src/i18n/de.ts | 2 +- gui/src/i18n/en.ts | 2 +- gui/src/i18n/fr.ts | 2 +- gui/src/i18n/ja.ts | 2 +- gui/src/i18n/ko.ts | 2 +- gui/src/i18n/ru.ts | 2 +- gui/src/i18n/tr.ts | 2 +- gui/src/i18n/zh-TW.ts | 2 +- gui/src/i18n/zh.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index 5ce4247c23..3233ef5871 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -212,7 +212,7 @@ export const de: Record = { "dash.providers": "Anbieter", "dash.tokens30d": "Tokens (30d)", "dash.coverage": "{pct} Abdeckung", - "dash.configDiverged": "config.json wurde nach dem Laden durch den Proxy extern auf der Festplatte geändert — Neustart zum Anwenden", + "dash.configDiverged": "config.json wurde nach dem Laden durch den Proxy extern geändert — kein automatisches Neuladen; Neustart zum Anwenden", "dash.mem.title": "Speicherbeobachtung", "dash.mem.hint": "Schreibgeschützte Laufzeitdiagnose. Beobachteter Speicher ist max(RSS, external, ArrayBuffers), damit Windows-Working-Set-Trimming gebundenen Speicher nicht versteckt.", "dash.mem.rss": "Resident Set (RSS)", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index c940ec10e5..727af6b86b 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -223,7 +223,7 @@ export const en = { "dash.providers": "Providers", "dash.tokens30d": "Tokens (30d)", "dash.coverage": "{pct} coverage", - "dash.configDiverged": "config.json changed on disk after the proxy loaded it — restart to apply", + "dash.configDiverged": "config.json changed on disk after the proxy loaded it — no automatic reload; restart to apply", // memory observability card (read-only /api/system/memory) "dash.mem.title": "Memory observability", "dash.mem.hint": "Read-only runtime diagnostics. Observed memory is max(RSS, external, ArrayBuffers) so Windows working-set trimming does not hide committed retention.", diff --git a/gui/src/i18n/fr.ts b/gui/src/i18n/fr.ts index a367c3001a..3e7c903e94 100644 --- a/gui/src/i18n/fr.ts +++ b/gui/src/i18n/fr.ts @@ -214,7 +214,7 @@ export const fr: Record = { "dash.providers": "Fournisseurs", "dash.tokens30d": "Jetons (30 j)", "dash.coverage": "Couverture : {pct}", - "dash.configDiverged": "config.json a changé sur le disque après le chargement du proxy — redémarrez pour appliquer", + "dash.configDiverged": "config.json a changé sur le disque après le chargement du proxy — pas de rechargement automatique ; redémarrez pour appliquer", "dash.mem.title": "Observabilité de la mémoire", "dash.mem.hint": "Diagnostics d’exécution en lecture seule. La mémoire observée correspond à max(RSS, external, ArrayBuffers), afin que la réduction de l’ensemble de travail Windows ne masque pas la rétention allouée.", "dash.mem.rss": "Ensemble résident (RSS)", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index 96e1c37a3e..80ae789acc 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -221,7 +221,7 @@ export const ja: Record = { "dash.providers": "プロバイダー", "dash.tokens30d": "トークン (30日)", "dash.coverage": "{pct} カバレッジ", - "dash.configDiverged": "config.json がプロキシ読み込み後に変更されました — 再起動して適用", + "dash.configDiverged": "config.json がプロキシ読み込み後に変更されました — 自動再読み込みはされません。再起動して適用", "dash.mem.title": "メモリ可観測性", "dash.mem.hint": "読み取り専用のランタイム診断。観測メモリは max(RSS, external, ArrayBuffers) で、Windows の working set trimming がコミット済み保持を隠さないようにします。", "dash.mem.rss": "常駐メモリ (RSS)", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index 83c98e8c49..0d6a9c3211 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -216,7 +216,7 @@ export const ko: Record = { "dash.providers": "프로바이더", "dash.tokens30d": "토큰 (30일)", "dash.coverage": "커버리지 {pct}", - "dash.configDiverged": "config.json이 프록시 로드 후 변경되었습니다 — 재시작하여 적용", + "dash.configDiverged": "config.json이 프록시 로드 후 변경되었습니다 — 자동 재로드되지 않습니다. 재시작하여 적용", "dash.mem.title": "메모리 관찰", "dash.mem.hint": "읽기 전용 런타임 진단. 관측 메모리는 max(RSS, external, ArrayBuffers)라 Windows working set trimming이 커밋된 보존 메모리를 숨기지 못합니다.", "dash.mem.rss": "상주 메모리 (RSS)", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index ea8a2f7fb9..fc80ffaff0 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -221,7 +221,7 @@ export const ru: Record = { "dash.providers": "Провайдеры", "dash.tokens30d": "Токены (30 дн.)", "dash.coverage": "{pct} покрытия", - "dash.configDiverged": "config.json изменился на диске после загрузки прокси — перезапустите для применения", + "dash.configDiverged": "config.json изменился на диске после загрузки прокси — автоперезагрузки нет; перезапустите для применения", "dash.mem.title": "Наблюдение за памятью", "dash.mem.hint": "Диагностика среды выполнения только для чтения. Наблюдаемая память — max(RSS, external, ArrayBuffers), чтобы trimming рабочего набора Windows не скрывал удержанную память.", "dash.mem.rss": "Резидентная память (RSS)", diff --git a/gui/src/i18n/tr.ts b/gui/src/i18n/tr.ts index 6878cdc5f5..7c953c0a5d 100644 --- a/gui/src/i18n/tr.ts +++ b/gui/src/i18n/tr.ts @@ -222,7 +222,7 @@ export const tr: Record = { "dash.providers": "Sağlayıcılar", "dash.tokens30d": "Jetonlar (30 gün)", "dash.coverage": "%{pct} kapsam", - "dash.configDiverged": "config.json, proxy yüklendikten sonra diskte değişti — uygulamak için yeniden başlatın", + "dash.configDiverged": "config.json, proxy yüklendikten sonra diskte değişti — otomatik yeniden yükleme yok; uygulamak için yeniden başlatın", "dash.mem.title": "Bellek izlenebilirliği", "dash.mem.hint": "Salt okunur çalışma zamanı tanılamaları. Gözlemlenen bellek max(RSS, harici, ArrayBuffers) değeridir.", "dash.mem.rss": "Yerleşik küme (RSS)", diff --git a/gui/src/i18n/zh-TW.ts b/gui/src/i18n/zh-TW.ts index 2e8340ffcc..2e7559b9fc 100644 --- a/gui/src/i18n/zh-TW.ts +++ b/gui/src/i18n/zh-TW.ts @@ -119,7 +119,7 @@ export const zhTW: Record = { "dash.providers": "供應商", "dash.tokens30d": "Token (30 天)", "dash.coverage": "覆蓋率 {pct}", - "dash.configDiverged": "config.json 在代理載入後已被修改 — 重啟後生效", + "dash.configDiverged": "config.json 在代理載入後被修改 — 不會自動重載;請重啟後生效", "dash.mem.title": "記憶體可觀測性", "dash.mem.hint": "只讀執行時診斷。觀測記憶體為 max(RSS, external, ArrayBuffers),避免 Windows working set trimming 隱藏已提交的保留記憶體。", "dash.mem.rss": "常駐記憶體 (RSS)", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index 2c172b1079..f10dce8898 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -216,7 +216,7 @@ export const zh: Record = { "dash.providers": "提供方", "dash.tokens30d": "Token (30 天)", "dash.coverage": "覆盖率 {pct}", - "dash.configDiverged": "config.json 在代理加载后已被修改 — 重启后生效", + "dash.configDiverged": "config.json 在代理加载后被修改 — 不会自动重载;请重启后生效", "dash.mem.title": "内存可观测性", "dash.mem.hint": "只读运行时诊断。观测内存为 max(RSS, external, ArrayBuffers),避免 Windows working set trimming 隐藏已提交的保留内存。", "dash.mem.rss": "常驻内存 (RSS)", From 0f22c2da6989669f43d66f5eba45c41b5a8db5d7 Mon Sep 17 00:00:00 2001 From: HarryZhou <2373256746@qq.com> Date: Sun, 23 Aug 2026 10:03:18 +0800 Subject: [PATCH 08/13] fix(status): bind resident digest to served snapshot; capture only at admission; CLI/GUI divergence contract tests --- gui/tests/dashboard-contracts.test.ts | 49 +++++++++++++++++++++ src/cli/status.ts | 63 +++++++++++++++------------ src/config.ts | 26 ++++++++--- src/server/index.ts | 2 +- tests/cli-status-json.test.ts | 56 +++++++++++++++++++++++- tests/config-divergence.test.ts | 44 ++++++++++++++----- 6 files changed, 194 insertions(+), 46 deletions(-) diff --git a/gui/tests/dashboard-contracts.test.ts b/gui/tests/dashboard-contracts.test.ts index f494b2965c..447ac03035 100644 --- a/gui/tests/dashboard-contracts.test.ts +++ b/gui/tests/dashboard-contracts.test.ts @@ -1,6 +1,10 @@ import { expect, test } from "bun:test"; +import { createElement } from "react"; +import { renderToStaticMarkup } from "react-dom/server"; import { en } from "../src/i18n/en"; +import { I18nContext } from "../src/i18n/shared"; import { normalizeInjectionSelection } from "../src/pages/dashboard-core-poll"; +import { DashboardOverviewHead } from "../src/pages/dashboard-overview-head"; import { PROJECT_CONFIG_DIAGNOSTICS_POLL_MS, beginPollEpoch, beginPollEpochs } from "../src/startup-health-ui"; test("project-config diagnostics poll cadence is owned by the shared constant", () => { @@ -213,6 +217,51 @@ test("fetchDashboardConfigStatus normalizes diverged and tolerates old servers", } }); +test("dashboard config-divergence alert renders from a fake /api/config/status response", async () => { + const { fetchDashboardConfigStatus } = await import("../src/pages/dashboard-core-poll"); + const originalFetch = globalThis.fetch; + const t = (key: string) => key; + const i18n = { locale: "en" as const, setLocale: () => {}, t } as never; + const baseProps = { + locale: "en", + health: { status: "ok", version: "9.9.9", uptime: 60 }, + providers: [], + usage30d: null, + usageLoading: false, + healthLoading: false, + startupHealth: "protected", + projectConfigWarnings: [], + maMode: "v1", + maBusy: false, + maHelpTriggerRef: { current: null }, + maHelpOpen: false, + setMaHelpOpen: () => {}, + switchMaMode: async () => {}, + maError: null, + } as never; + try { + globalThis.fetch = (async () => Response.json({ residentVersion: "a", diskVersion: "b", diverged: true })) as typeof fetch; + const { configDivergence } = await fetchDashboardConfigStatus("http://test", new AbortController().signal); + const html = renderToStaticMarkup( + createElement(I18nContext.Provider, { value: i18n }, + createElement(DashboardOverviewHead, { ...baseProps, configDivergence })), + ); + expect(html).toContain("dash.configDiverged"); + expect(html).toContain("role=\"alert\""); + + // A settled (non-diverged) answer must not render the alert. + globalThis.fetch = (async () => Response.json({ residentVersion: "a", diskVersion: "a", diverged: false })) as typeof fetch; + const settled = await fetchDashboardConfigStatus("http://test", new AbortController().signal); + const settledHtml = renderToStaticMarkup( + createElement(I18nContext.Provider, { value: i18n }, + createElement(DashboardOverviewHead, { ...baseProps, configDivergence: settled.configDivergence })), + ); + expect(settledHtml).not.toContain("dash.configDiverged"); + } finally { + globalThis.fetch = originalFetch; + } +}); + // The chip used to sit on the server's conservative placeholder until the next 30s tick, which is // why an unrelated action (refresh quota, tab hop) looked like the thing that fixed it. The probe diff --git a/src/cli/status.ts b/src/cli/status.ts index 4f58d6e3f6..4bb71eb789 100644 --- a/src/cli/status.ts +++ b/src/cli/status.ts @@ -56,13 +56,7 @@ export type CliStatusJson = { source: "default" | "file" | "fallback"; error: string | null; }; - configDivergence: { - /** True when the running proxy answered; false when it is down or unreadable. */ - available: boolean; - residentVersion: string | null; - diskVersion: string | null; - diverged: boolean; - }; + configDivergence: CliConfigDivergence; service: { summary: string }; codexShim: { summary: string }; codexPlugins: CodexPluginsDiagnostic; @@ -81,6 +75,39 @@ export type CliStatusJson = { codexHome: OrcaCodexHomeDiagnostic; }; +export type CliConfigDivergence = { + /** True when the running proxy answered; false when it is down or unreadable. */ + available: boolean; + residentVersion: string | null; + diskVersion: string | null; + diverged: boolean; +}; + +/** + * Normalize the proxy's /api/config/status body into the CLI JSON contract. A + * missing/down proxy, a 404 from an older server, or a malformed body all collapse + * to available:false so the CLI never fabricates a divergence claim. + */ +export function normalizeConfigDivergence(body: unknown): CliConfigDivergence { + const unavailable: CliConfigDivergence = { + available: false, + residentVersion: null, + diskVersion: null, + diverged: false, + }; + if (!body || typeof body !== "object") return unavailable; + const record = body as { residentVersion?: unknown; diskVersion?: unknown; diverged?: unknown }; + const residentVersion = record.residentVersion ?? null; + const diskVersion = record.diskVersion ?? null; + const diverged = record.diverged; + if ( + !(residentVersion === null || typeof residentVersion === "string") + || !(diskVersion === null || typeof diskVersion === "string") + || typeof diverged !== "boolean" + ) return unavailable; + return { available: true, residentVersion, diskVersion, diverged }; +} + export type CliStatusView = { json: CliStatusJson; proxyLabel: string; @@ -211,7 +238,7 @@ export async function collectStatus(): Promise { // the loopback management-read capability; a down/unreadable proxy means "unknown", // never a fabricated divergence claim. const configDivergence = await (async () => { - const unavailable = { available: false, residentVersion: null, diskVersion: null, diverged: false }; + const unavailable = normalizeConfigDivergence(null); if (!live) return unavailable; try { const read = await fetchBoundLocalManagementRead( @@ -220,25 +247,7 @@ export async function collectStatus(): Promise { { timeoutMs: 4_000 }, ); if (read.kind !== "response" || !read.response.ok) return unavailable; - const body = await read.response.json() as { - residentVersion?: unknown; - diskVersion?: unknown; - diverged?: unknown; - }; - const residentVersion = body.residentVersion ?? null; - const diskVersion = body.diskVersion ?? null; - const diverged = body.diverged; - if ( - !(residentVersion === null || typeof residentVersion === "string") - || !(diskVersion === null || typeof diskVersion === "string") - || typeof diverged !== "boolean" - ) return unavailable; - return { - available: true, - residentVersion, - diskVersion, - diverged, - }; + return normalizeConfigDivergence(await read.response.json()); } catch { return unavailable; } diff --git a/src/config.ts b/src/config.ts index 8af90ff055..9c2b53bbe6 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1768,7 +1768,7 @@ function warnInheritedFastWireConflicts(configPath: string, config: OcxConfig): * until a valid config or a genuinely missing file is observed. A partially- * invalid config is merged with defaults so providers and pool accounts survive. */ -export function loadConfig(): OcxConfig { +export function loadConfig(options?: { captureResident?: boolean }): OcxConfig { const dir = getConfigDir(); const configPath = getConfigPath(); hardenConfigDir(); @@ -1777,7 +1777,7 @@ export function loadConfig(): OcxConfig { if (!existsSync(configPath)) { // No file means the process is serving defaults, not the previously loaded bytes; // a reload after deletion must not retain the old resident identity. - residentConfigSha256 = null; + if (options?.captureResident) residentConfigSha256 = null; return withRefreshedCostOverlays(getDefaultConfig()); } try { @@ -1787,7 +1787,9 @@ export function loadConfig(): OcxConfig { // UTF-8 sequences onto replacement characters, which would make the digest // disagree with the file's true byte SHA-256 and misreport divergence. const fileBytes = readFileSync(configPath); - residentConfigSha256 = createHash("sha256").update(fileBytes).digest("hex"); + if (options?.captureResident) { + residentConfigSha256 = createHash("sha256").update(fileBytes).digest("hex"); + } const rawWithBom = fileBytes.toString("utf-8"); const raw = rawWithBom.replace(/^\uFEFF/, ""); const parsed = JSON.parse(raw); @@ -1855,11 +1857,11 @@ export function loadConfig(): OcxConfig { } // Merge couldn't fix it — truly broken config warnAndBackupInvalidConfig(configPath, result.error); - residentConfigSha256 = null; + if (options?.captureResident) residentConfigSha256 = null; return getDefaultConfig(); } catch (error) { warnAndBackupInvalidConfig(configPath, error); - residentConfigSha256 = null; + if (options?.captureResident) residentConfigSha256 = null; return getDefaultConfig(); } } @@ -2253,6 +2255,11 @@ export interface ConfigDivergenceStatus { export function readConfigDivergenceStatus(): ConfigDivergenceStatus { const admission = readConfigAdmissionSnapshot(); const diskVersion = admission.kind === "read" ? admission.contentSha256 : null; + // A missing/unreadable file has no disk identity to compare, so the resident + // identity must not linger as a stale byte claim. Incidental loadConfig() calls + // never touch this identity (only the admission capture does), so the clear is + // done here where the file absence is actually observed. + if (diskVersion === null) residentConfigSha256 = null; return { residentVersion: residentConfigSha256, diskVersion, @@ -2266,6 +2273,8 @@ let warnedConfigMutationDirectoryAcl = false; // SHA-256 of the config bytes the running process last loaded or wrote (armed at server // start, refreshed on every changed in-process save). Compared to the current file digest // by `ocx status` / the dashboard to warn when config.json changed without a reload. +// Only the server admission load (loadConfig({ captureResident: true })) arms this +// identity; incidental loads during runtime must not wipe it. let residentConfigSha256: string | null = null; /** Test-only seam: reset the resident identity so isolated test files cannot leak state. */ @@ -2496,7 +2505,12 @@ function persistConfigUnlocked(config: OcxConfig): boolean { return false; } atomicWriteFile(configPath, bytes); - residentConfigSha256 = createHash("sha256").update(bytes).digest("hex"); + // Keep the resident identity bound to the SERVED document, not the merged bytes: + // withPreservedDiskOnlyProviders() folds hand-added disk rows into the file, but + // those rows are still unrouted until the process reloads. Hashing the pre-merge + // config keeps diverged=true for exactly that gap (and matches the file hash when + // there is nothing disk-only to preserve). + residentConfigSha256 = createHash("sha256").update(JSON.stringify(config, null, 2) + "\n").digest("hex"); // For changed saves, refresh only AFTER the write succeeded so a failed // write cannot leave estimates reflecting configuration never persisted. refreshUserCostOverlays(persisted); diff --git a/src/server/index.ts b/src/server/index.ts index f59b4d0ae3..da2b3463c3 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -510,7 +510,7 @@ export function warnAgentTaskRecoveryStartup(config: { export function startServer(port?: number, deps: StartServerDeps = {}): Server { const localAttestationSecret = deps.localAttestationSecret ?? createLocalAttestationSecret(); - const config = runModelRenameStartupMigration(runAlibabaRegionStartupMigration(runOpenAiTierStartupMigration(loadConfig()))); + const config = runModelRenameStartupMigration(runAlibabaRegionStartupMigration(runOpenAiTierStartupMigration(loadConfig({ captureResident: true })))); warnAgentTaskRecoveryStartup(config); setLiveStateStoreConfig(config); applyProxyEnv(config); diff --git a/tests/cli-status-json.test.ts b/tests/cli-status-json.test.ts index f959223342..c80d05c3c8 100644 --- a/tests/cli-status-json.test.ts +++ b/tests/cli-status-json.test.ts @@ -4,7 +4,7 @@ import { existsSync, mkdtempSync, readdirSync, rmSync, writeFileSync, mkdirSync import { tmpdir } from "node:os"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; -import { proxyHealthFailureReason, resolveStatusPid, selectListenTarget } from "../src/cli/status"; +import { normalizeConfigDivergence, proxyHealthFailureReason, resolveStatusPid, selectListenTarget } from "../src/cli/status"; const repoRoot = dirname(fileURLToPath(new URL("../package.json", import.meta.url))); const cliPath = join(repoRoot, "src", "cli", "index.ts"); @@ -66,6 +66,12 @@ describe("CLI status JSON", () => { }; defaultProvider?: unknown; config?: { source?: unknown; error?: unknown }; + configDivergence?: { + available?: unknown; + residentVersion?: unknown; + diskVersion?: unknown; + diverged?: unknown; + }; service?: { summary?: unknown }; codexShim?: { summary?: unknown }; codexRuntime?: { @@ -111,6 +117,14 @@ describe("CLI status JSON", () => { expect(parsed.defaultProvider).toBe("openai"); expect(parsed.config?.source).toBe("file"); expect(parsed.config?.error).toBeNull(); + // No live proxy: the CLI JSON must still carry the configDivergence contract + // and report it as unavailable rather than omitting or fabricating a claim. + expect(parsed.configDivergence).toEqual({ + available: false, + residentVersion: null, + diskVersion: null, + diverged: false, + }); expect(typeof parsed.service?.summary).toBe("string"); expect(typeof parsed.codexShim?.summary).toBe("string"); expect(typeof parsed.codexRuntime?.path).toBe("string"); @@ -325,4 +339,44 @@ describe("CLI status JSON", () => { expect(target.healthUrl).toBe("http://127.0.0.1:10100/healthz"); expect(target.dashboardUrl).toBe("http://localhost:10100/"); }); + + test("normalizeConfigDivergence maps a missing/404/empty body to unavailable", () => { + const unavailable = { + available: false, + residentVersion: null, + diskVersion: null, + diverged: false, + }; + // A 404 from an older server yields a non-ok response (body never parsed); an + // empty object body is the malformed-success case. Both must collapse the same way. + expect(normalizeConfigDivergence(undefined)).toEqual(unavailable); + expect(normalizeConfigDivergence(null)).toEqual(unavailable); + expect(normalizeConfigDivergence({})).toEqual(unavailable); + expect(normalizeConfigDivergence("nope")).toEqual(unavailable); + // Malformed field types must not be trusted as available data. + expect(normalizeConfigDivergence({ residentVersion: "a", diskVersion: "b", diverged: "yes" })).toEqual(unavailable); + }); + + test("normalizeConfigDivergence keeps a valid proxy answer available", () => { + expect(normalizeConfigDivergence({ + residentVersion: "sha-a", + diskVersion: "sha-b", + diverged: true, + })).toEqual({ + available: true, + residentVersion: "sha-a", + diskVersion: "sha-b", + diverged: true, + }); + expect(normalizeConfigDivergence({ + residentVersion: null, + diskVersion: null, + diverged: false, + })).toEqual({ + available: true, + residentVersion: null, + diskVersion: null, + diverged: false, + }); + }); }); diff --git a/tests/config-divergence.test.ts b/tests/config-divergence.test.ts index de4765c281..dc8eb7e70b 100644 --- a/tests/config-divergence.test.ts +++ b/tests/config-divergence.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test"; -import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; import { join } from "node:path"; import { createHash } from "node:crypto"; import { @@ -58,7 +58,7 @@ describe("config divergence status", () => { test("deleting the config clears the resident identity instead of retaining stale bytes", async () => { const bytes = JSON.stringify(config(), null, 2) + "\n"; writeFileSync(getConfigPath(), bytes); - const loaded = loadConfig(); + const loaded = loadConfig({ captureResident: true }); armClaudeCodeBaseline(loaded); expect(readConfigDivergenceStatus().residentVersion).not.toBeNull(); rmSync(getConfigPath()); @@ -74,7 +74,7 @@ describe("config divergence status", () => { test("external disk edit after arming flips diverged", async () => { saveConfig(config()); - const armed = loadConfig(); + const armed = loadConfig({ captureResident: true }); armClaudeCodeBaseline(armed); expect(readConfigDivergenceStatus().diverged).toBe(false); // Simulate an external editor / another process rewriting config.json. @@ -87,6 +87,25 @@ describe("config divergence status", () => { expect(status.residentVersion).not.toBe(status.diskVersion); }); + test("an incidental loadConfig call does not wipe the armed divergence", () => { + saveConfig(config()); + const armed = loadConfig({ captureResident: true }); + armClaudeCodeBaseline(armed); + expect(readConfigDivergenceStatus().diverged).toBe(false); + // Simulate an external editor / another process rewriting config.json. + const path = getConfigPath(); + const current = JSON.parse(readFileSync(path, "utf8")) as { port: number }; + current.port = 20200; + writeFileSync(path, JSON.stringify(current, null, 2) + "\n"); + expect(readConfigDivergenceStatus().diverged).toBe(true); + // Runtime components re-read the file (sync, catalog, injection) without capture; + // that must not make the armed process believe it already runs the new bytes. + loadConfig(); + const status = readConfigDivergenceStatus(); + expect(status.diverged).toBe(true); + expect(status.residentVersion).not.toBe(status.diskVersion); + }); + test("an in-process save refreshes the resident version", () => { saveConfig(config()); const armed = loadConfig(); @@ -101,7 +120,7 @@ describe("config divergence status", () => { test("resident digest comes from the loaded bytes, not a post-load re-read", async () => { const first = JSON.stringify(config(), null, 2) + "\n"; writeFileSync(getConfigPath(), first); - const loaded = loadConfig(); + const loaded = loadConfig({ captureResident: true }); // The file changes between load and arming (e.g. another process saves during startup). const second = JSON.stringify(config(20200), null, 2) + "\n"; writeFileSync(getConfigPath(), second); @@ -122,7 +141,7 @@ describe("config divergence status", () => { Buffer.from('"}\n'), ]); writeFileSync(getConfigPath(), rawBytes); - loadConfig(); + loadConfig({ captureResident: true }); const status = readConfigDivergenceStatus(); const byteDigest = createHash("sha256").update(rawBytes).digest("hex"); const decodedDigest = createHash("sha256").update(rawBytes.toString("utf-8")).digest("hex"); @@ -130,11 +149,11 @@ describe("config divergence status", () => { expect(status.residentVersion).toBe(byteDigest); }); - test("a save that preserves disk-only providers does not false-positive", async () => { + test("a save that preserves disk-only providers stays diverged until the row is routed", async () => { // Start with only the existing provider; the disk-only row arrives as an EXTERNAL // edit after the process armed its resident identity. writeFileSync(getConfigPath(), JSON.stringify(config(), null, 2) + "\n"); - const loaded = loadConfig(); + const loaded = loadConfig({ captureResident: true }); armClaudeCodeBaseline(loaded); writeFileSync(getConfigPath(), JSON.stringify({ ...config(), @@ -150,15 +169,18 @@ describe("config divergence status", () => { loaded.providers.live = { adapter: "openai-chat", baseUrl: "https://live.example/v1", apiKey: "sk-live" }; saveConfig(loaded); const status = readConfigDivergenceStatus(); - expect(status.diverged).toBe(false); - expect(status.residentVersion).toBe(status.diskVersion); + // The served config does not route diskOnly yet, so the warning stays on even + // though the merged file on disk includes the row (Option A: resident identity + // is bound to the served snapshot, not the last merged write). + expect(status.diverged).toBe(true); + expect(status.residentVersion).not.toBe(status.diskVersion); const persisted = JSON.parse(await Bun.file(getConfigPath()).text()) as { providers: Record }; expect(persisted.providers.diskOnly).toBeDefined(); }); test("an external edit to a preserved disk-only row still flips diverged", async () => { writeFileSync(getConfigPath(), JSON.stringify(config(), null, 2) + "\n"); - const loaded = loadConfig(); + const loaded = loadConfig({ captureResident: true }); armClaudeCodeBaseline(loaded); writeFileSync(getConfigPath(), JSON.stringify({ ...config(), @@ -182,7 +204,7 @@ describe("config divergence status", () => { test("GET /api/config/status exposes resident and disk versions", async () => { saveConfig(config()); - const armed = loadConfig(); + const armed = loadConfig({ captureResident: true }); armClaudeCodeBaseline(armed); const response = await handleManagementAPI( new Request("http://127.0.0.1:10100/api/config/status", { headers: { Host: "127.0.0.1:10100" } }), From 29e3033142318e436bf314e2a27d99bf52c1b722 Mon Sep 17 00:00:00 2001 From: HarryZhou <2373256746@qq.com> Date: Sun, 23 Aug 2026 10:14:40 +0800 Subject: [PATCH 09/13] fix(status): keep resident identity on read/disk-first mutations; served-snapshot digest for binding overrides --- gui/tests/dashboard-contracts.test.ts | 10 ++--- src/config.ts | 39 +++++++++++++---- tests/config-divergence.test.ts | 62 ++++++++++++++++++++++++--- 3 files changed, 91 insertions(+), 20 deletions(-) diff --git a/gui/tests/dashboard-contracts.test.ts b/gui/tests/dashboard-contracts.test.ts index 447ac03035..9e3430fe02 100644 --- a/gui/tests/dashboard-contracts.test.ts +++ b/gui/tests/dashboard-contracts.test.ts @@ -1,8 +1,8 @@ import { expect, test } from "bun:test"; -import { createElement } from "react"; +import { createElement, type ComponentProps } from "react"; import { renderToStaticMarkup } from "react-dom/server"; import { en } from "../src/i18n/en"; -import { I18nContext } from "../src/i18n/shared"; +import { I18nContext, type I18nContextValue } from "../src/i18n/shared"; import { normalizeInjectionSelection } from "../src/pages/dashboard-core-poll"; import { DashboardOverviewHead } from "../src/pages/dashboard-overview-head"; import { PROJECT_CONFIG_DIAGNOSTICS_POLL_MS, beginPollEpoch, beginPollEpochs } from "../src/startup-health-ui"; @@ -220,8 +220,8 @@ test("fetchDashboardConfigStatus normalizes diverged and tolerates old servers", test("dashboard config-divergence alert renders from a fake /api/config/status response", async () => { const { fetchDashboardConfigStatus } = await import("../src/pages/dashboard-core-poll"); const originalFetch = globalThis.fetch; - const t = (key: string) => key; - const i18n = { locale: "en" as const, setLocale: () => {}, t } as never; + const t: I18nContextValue["t"] = key => key; + const i18n: I18nContextValue = { locale: "en", setLocale: () => {}, t }; const baseProps = { locale: "en", health: { status: "ok", version: "9.9.9", uptime: 60 }, @@ -238,7 +238,7 @@ test("dashboard config-divergence alert renders from a fake /api/config/status r setMaHelpOpen: () => {}, switchMaMode: async () => {}, maError: null, - } as never; + } satisfies ComponentProps; try { globalThis.fetch = (async () => Response.json({ residentVersion: "a", diskVersion: "b", diverged: true })) as typeof fetch; const { configDivergence } = await fetchDashboardConfigStatus("http://test", new AbortController().signal); diff --git a/src/config.ts b/src/config.ts index 9c2b53bbe6..d08e4435c5 100644 --- a/src/config.ts +++ b/src/config.ts @@ -2255,11 +2255,6 @@ export interface ConfigDivergenceStatus { export function readConfigDivergenceStatus(): ConfigDivergenceStatus { const admission = readConfigAdmissionSnapshot(); const diskVersion = admission.kind === "read" ? admission.contentSha256 : null; - // A missing/unreadable file has no disk identity to compare, so the resident - // identity must not linger as a stale byte claim. Incidental loadConfig() calls - // never touch this identity (only the admission capture does), so the clear is - // done here where the file absence is actually observed. - if (diskVersion === null) residentConfigSha256 = null; return { residentVersion: residentConfigSha256, diskVersion, @@ -2483,7 +2478,25 @@ export const withExpectedConfigGenerationSync: WithExpectedConfigGenerationSync * cost-overlay registry from the persisted config so runtime estimates follow * every save path. */ -function persistConfigUnlocked(config: OcxConfig): boolean { +export type PersistConfigUnlockedOptions = { + /** + * The served snapshot whose serialization owns the resident divergence digest. + * Defaults to `config`; pass the pre-binding live projection when the persisted + * document deliberately carries a different desired next-start binding. + */ + servedSnapshot?: OcxConfig; + /** + * Set false for disk-first writers whose result the live server has not adopted + * (for example mutatePersistedConfig): the resident identity must stay bound to + * what the running process actually serves. + */ + refreshResident?: boolean; +}; + +function persistConfigUnlocked( + config: OcxConfig, + options: PersistConfigUnlockedOptions = {}, +): boolean { const configPath = getConfigPath(); // External editors can add provider rows the live config deliberately does // not route with yet; merge them at the serialization boundary so an @@ -2510,7 +2523,10 @@ function persistConfigUnlocked(config: OcxConfig): boolean { // those rows are still unrouted until the process reloads. Hashing the pre-merge // config keeps diverged=true for exactly that gap (and matches the file hash when // there is nothing disk-only to preserve). - residentConfigSha256 = createHash("sha256").update(JSON.stringify(config, null, 2) + "\n").digest("hex"); + const servedSnapshot = options.servedSnapshot ?? config; + if (options.refreshResident !== false) { + residentConfigSha256 = createHash("sha256").update(JSON.stringify(servedSnapshot, null, 2) + "\n").digest("hex"); + } // For changed saves, refresh only AFTER the write succeeded so a failed // write cannot leave estimates reflecting configuration never persisted. refreshUserCostOverlays(persisted); @@ -2609,7 +2625,9 @@ export function mutatePersistedConfig( commitBase.diagnostics.config, confirmedConfig, ); - if (persistConfigUnlocked(projected)) bumpGenerationForCooperatingConfigWrite(); + // Disk-first mutation: the live server has not adopted this snapshot, so the + // resident divergence identity must stay bound to the served config. + if (persistConfigUnlocked(projected, { refreshResident: false })) bumpGenerationForCooperatingConfigWrite(); return { status: "committed", value: confirmed.value }; } return { status: "unavailable", reason: "conflict" }; @@ -2999,7 +3017,10 @@ export function saveConfigPreservingClaudeCode(config: OcxConfig): void { const persistedConfig: OcxConfig = { ...projectedConfig, port: persistedBinding.port }; if (persistedBinding.hostname === undefined) delete persistedConfig.hostname; else persistedConfig.hostname = persistedBinding.hostname; - if (persistConfigUnlocked(persistedConfig)) bumpGenerationForCooperatingConfigWrite(); + // The file carries the operator's desired next-start binding, but the running + // process still serves the live projection with its ACTUAL binding; the resident + // digest must follow the served snapshot so a binding difference stays divergent. + if (persistConfigUnlocked(persistedConfig, { servedSnapshot: projectedConfig })) bumpGenerationForCooperatingConfigWrite(); persistedLiveServerBinding.set(config, persistedBinding); } else { if (persistConfigUnlocked(projectedConfig)) bumpGenerationForCooperatingConfigWrite(); diff --git a/tests/config-divergence.test.ts b/tests/config-divergence.test.ts index dc8eb7e70b..319c196a61 100644 --- a/tests/config-divergence.test.ts +++ b/tests/config-divergence.test.ts @@ -6,8 +6,11 @@ import { armClaudeCodeBaseline, getConfigPath, loadConfig, + mutatePersistedConfig, readConfigDivergenceStatus, + reconcileLiveConfigFromDisk, saveConfig, + saveConfigPreservingClaudeCode, setResidentConfigSha256ForTests, } from "../src/config"; import { handleManagementAPI } from "../src/server/management-api"; @@ -55,21 +58,29 @@ describe("config divergence status", () => { expect(status.diverged).toBe(false); }); - test("deleting the config clears the resident identity instead of retaining stale bytes", async () => { + test("a missing config file reports no divergence and a different restore is caught", async () => { const bytes = JSON.stringify(config(), null, 2) + "\n"; writeFileSync(getConfigPath(), bytes); const loaded = loadConfig({ captureResident: true }); armClaudeCodeBaseline(loaded); expect(readConfigDivergenceStatus().residentVersion).not.toBeNull(); + // Deleting the file: no disk identity to compare, so no divergence claim — but + // the read must NOT destroy the resident identity (the GUI polls every 15s). rmSync(getConfigPath()); - loadConfig(); - expect(readConfigDivergenceStatus().residentVersion).toBeNull(); - // Restoring the original bytes must not resurrect a stale divergence claim: with - // no resident identity the process cannot assert the file differs from it. + let status = readConfigDivergenceStatus(); + expect(status.diskVersion).toBeNull(); + expect(status.diverged).toBe(false); + expect(status.residentVersion).not.toBeNull(); + // Restoring the original bytes: still in sync. writeFileSync(getConfigPath(), bytes); - const status = readConfigDivergenceStatus(); + status = readConfigDivergenceStatus(); expect(status.diskVersion).not.toBeNull(); expect(status.diverged).toBe(false); + // Restoring DIFFERENT bytes without a reload must flip diverged: the running + // process still serves the admission snapshot. + writeFileSync(getConfigPath(), JSON.stringify(config(20200), null, 2) + "\n"); + status = readConfigDivergenceStatus(); + expect(status.diverged).toBe(true); }); test("external disk edit after arming flips diverged", async () => { @@ -106,6 +117,45 @@ describe("config divergence status", () => { expect(status.residentVersion).not.toBe(status.diskVersion); }); + test("a disk-first mutation keeps divergence for an unrouted disk-only row", () => { + saveConfig(config()); + const armed = loadConfig({ captureResident: true }); + armClaudeCodeBaseline(armed); + // An external editor adds a provider the live config never saw. + const path = getConfigPath(); + const current = JSON.parse(readFileSync(path, "utf8")) as { providers: Record }; + current.providers.diskOnly = { adapter: "openai-chat", baseUrl: "https://disk.example/v1", apiKey: "sk-disk" }; + writeFileSync(path, JSON.stringify(current, null, 2) + "\n"); + // A disk-first mutation preserves the disk-only row but does not adopt it into + // the running config; the resident identity must not be refreshed to the file. + const outcome = mutatePersistedConfig(persisted => { + persisted.port = 10600; + return { changed: true, value: true }; + }); + expect(outcome.status).toBe("committed"); + expect(readConfigDivergenceStatus().diverged).toBe(true); + }); + + test("a guarded save keeps divergence when the persisted binding differs from the live socket", () => { + saveConfig(config()); + const armed = loadConfig({ captureResident: true }); + armClaudeCodeBaseline(armed); + // Another process changes the disk port: the desired next-start binding. + const path = getConfigPath(); + const current = JSON.parse(readFileSync(path, "utf8")) as { port: number }; + current.port = 20200; + writeFileSync(path, JSON.stringify(current, null, 2) + "\n"); + // OAuth reconciliation adopts the new desired binding on disk while the live + // socket keeps its actual binding. + reconcileLiveConfigFromDisk(armed, structuredClone(armed)); + armed.streamMode = "eager-relay"; + saveConfigPreservingClaudeCode(armed); + const status = readConfigDivergenceStatus(); + // The file says port 20200; the running proxy still serves port 10100, so the + // resident digest must follow the served snapshot and keep diverged=true. + expect(status.diverged).toBe(true); + }); + test("an in-process save refreshes the resident version", () => { saveConfig(config()); const armed = loadConfig(); From e0dcf990ac41110c1705aa1924ef6446d2fb573a Mon Sep 17 00:00:00 2001 From: HarryZhou <2373256746@qq.com> Date: Mon, 24 Aug 2026 15:27:55 +0800 Subject: [PATCH 10/13] fix(status): re-anchor resident identity when disk-first mutations are adopted --- src/codex/plan-from-token.ts | 6 +++ src/config.ts | 15 ++++++ .../management/agent-settings-routes.ts | 5 ++ tests/codex-plan.test.ts | 39 +++++++++++++- tests/config-divergence.test.ts | 51 +++++++++++++++++++ 5 files changed, 114 insertions(+), 2 deletions(-) diff --git a/src/codex/plan-from-token.ts b/src/codex/plan-from-token.ts index be2585ec4e..d3df580094 100644 --- a/src/codex/plan-from-token.ts +++ b/src/codex/plan-from-token.ts @@ -2,6 +2,7 @@ import { ConfigMutationLockError, loadConfig, mutatePersistedConfig, + refreshResidentConfigIdentity, } from "../config"; import type { CodexAccount, OcxConfig } from "../types"; import { isSelectableCodexPoolAccount, isValidCodexAccountId } from "./account-id"; @@ -90,6 +91,7 @@ function persistJwtPlanUpdates(runtimeConfig: OcxConfig, updates: FreshPoolPlanU throw error; } if (outcome.status === "unavailable") return; + let adoptedAny = false; for (const update of outcome.value) { if (!isCodexAccountGenerationLive(update.accountId, update.credentialGeneration)) continue; const liveAccount = configuredPoolAccount(runtimeConfig, update.accountId); @@ -98,8 +100,12 @@ function persistJwtPlanUpdates(runtimeConfig: OcxConfig, updates: FreshPoolPlanU liveAccount.planSource = "jwt"; liveAccount.planCredentialGeneration = update.credentialGeneration; appliedJwtPlans.set(update.accountId, update.plan); + adoptedAny = true; } } + // The long-lived runtime config now serves the persisted plan, so the resident + // divergence identity must follow it (the disk-first mutation skipped the refresh). + if (adoptedAny) refreshResidentConfigIdentity(runtimeConfig); } /** diff --git a/src/config.ts b/src/config.ts index d08e4435c5..749c99c4a2 100644 --- a/src/config.ts +++ b/src/config.ts @@ -2277,6 +2277,21 @@ export function setResidentConfigSha256ForTests(value: string | null): void { residentConfigSha256 = value; } +/** + * Re-anchor the resident identity to the exact serialized served snapshot. + * + * Disk-first mutations (\`mutatePersistedConfig\`) deliberately skip the resident + * refresh because the server has not adopted their document yet. Adopters that + * then mirror the committed change into the long-lived config must call this so + * \`ocx status\` / the dashboard stop claiming divergence once disk matches what + * the running process actually serves. No-op when no identity is armed (CLI + * processes cannot truthfully claim divergence). + */ +export function refreshResidentConfigIdentity(config: OcxConfig): void { + if (residentConfigSha256 === null) return; + residentConfigSha256 = createHash("sha256").update(JSON.stringify(config, null, 2) + "\n").digest("hex"); +} + export class ConfigMutationLockError extends Error { readonly code = "CONFIG_MUTATION_LOCK_UNAVAILABLE"; diff --git a/src/server/management/agent-settings-routes.ts b/src/server/management/agent-settings-routes.ts index bddbd37fe1..936b531a8d 100644 --- a/src/server/management/agent-settings-routes.ts +++ b/src/server/management/agent-settings-routes.ts @@ -12,6 +12,7 @@ import { mutatePersistedConfig, providerBaseUrlConfigError, providerHeadersConfigError, + refreshResidentConfigIdentity, saveConfigPreservingClaudeCode, subagentDefaultSyncEffective, } from "../../config"; @@ -122,6 +123,10 @@ function persistDesktopProfileField( // `unavailable` outcome must not leave the snapshot claiming a saved profile. if (outcome.status === "unavailable") return { ok: false, reason: outcome.reason }; config.claudeCode = { ...(config.claudeCode ?? {}), desktopProfile }; + // The long-lived server snapshot now serves the persisted value, so the resident + // divergence identity must follow it (the disk-first mutation itself skipped the + // refresh because it could not know whether the caller would adopt the write). + refreshResidentConfigIdentity(config); return { ok: true }; } diff --git a/tests/codex-plan.test.ts b/tests/codex-plan.test.ts index 0c4b9c0936..9cb48a1f5c 100644 --- a/tests/codex-plan.test.ts +++ b/tests/codex-plan.test.ts @@ -8,7 +8,12 @@ import { reconcileCodexPlansFromTokens, resetJwtPlanNotesForTests, } from "../src/codex/plan-from-token"; -import { loadConfig, saveConfig } from "../src/config"; +import { + armClaudeCodeBaseline, + loadConfig, + readConfigDivergenceStatus, + saveConfig, +} from "../src/config"; import type { OcxConfig } from "../src/types"; const TEST_DIR = join(import.meta.dir, ".tmp-codex-plan-test"); @@ -89,6 +94,37 @@ describe("reconcileCodexPlansFromTokens", () => { expect(loadConfig().codexAccounts?.[0]?.plan).toBe("pro"); }); + test("re-anchors the resident divergence identity after adopting a JWT plan write", () => { + const config: OcxConfig = { + port: 10100, + providers: {}, + defaultProvider: "openai", + codexAccounts: [{ id: "pool-jwt-plan", email: "pool@example.test", plan: "free", isMain: false }], + }; + saveConfig(config); + saveCodexAccountCredential("pool-jwt-plan", { + accessToken: chatgptPlanJwt("pro", "acct-pool-jwt-plan"), + refreshToken: "refresh-pool-jwt-plan", + expiresAt: Date.now() + 5 * 60_000, + chatgptAccountId: "acct-pool-jwt-plan", + }); + + // The server armed its resident identity at admission and reuses the same + // long-lived object for runtime reconciliation. + const armed = loadConfig({ captureResident: true }); + armClaudeCodeBaseline(armed); + expect(readConfigDivergenceStatus().diverged).toBe(false); + + reconcileCodexPlansFromTokens(armed); + + expect(armed.codexAccounts?.[0]?.plan).toBe("pro"); + const status = readConfigDivergenceStatus(); + // The plan write was adopted into the served snapshot, so the identity must + // follow it instead of reporting a persistent false-positive divergence. + expect(status.diverged).toBe(false); + expect(status.residentVersion).toBe(status.diskVersion); + }); + test("leaves a non-JWT pool credential's stored plan alone", () => { const config: OcxConfig = { port: 10100, @@ -197,4 +233,3 @@ describe("WHAM-wins plan provenance gate (release-audit fix)", () => { expect(loadConfig().codexAccounts?.[0]?.plan).toBe("pro"); }); }); - diff --git a/tests/config-divergence.test.ts b/tests/config-divergence.test.ts index 319c196a61..4fc90b8913 100644 --- a/tests/config-divergence.test.ts +++ b/tests/config-divergence.test.ts @@ -9,6 +9,7 @@ import { mutatePersistedConfig, readConfigDivergenceStatus, reconcileLiveConfigFromDisk, + refreshResidentConfigIdentity, saveConfig, saveConfigPreservingClaudeCode, setResidentConfigSha256ForTests, @@ -136,6 +137,56 @@ describe("config divergence status", () => { expect(readConfigDivergenceStatus().diverged).toBe(true); }); + test("an adopter re-anchors the resident identity after mirroring a disk-first mutation", () => { + saveConfig(config()); + const armed = loadConfig({ captureResident: true }); + armClaudeCodeBaseline(armed); + // A disk-first mutation writes the change but cannot refresh the resident + // identity: the server may or may not adopt the document. + const outcome = mutatePersistedConfig(persisted => { + persisted.port = 10600; + return { changed: true, value: true }; + }); + expect(outcome.status).toBe("committed"); + expect(readConfigDivergenceStatus().diverged).toBe(true); + // The adopter mirrors the committed change into the long-lived served config + // and then re-anchors the identity to that served snapshot. + armed.port = 10600; + refreshResidentConfigIdentity(armed); + const status = readConfigDivergenceStatus(); + expect(status.diverged).toBe(false); + expect(status.residentVersion).toBe(status.diskVersion); + }); + + test("the refresh helper keeps divergence while a preserved disk-only row is unrouted", () => { + saveConfig(config()); + const armed = loadConfig({ captureResident: true }); + armClaudeCodeBaseline(armed); + // An external editor adds a provider the live config never saw. + const path = getConfigPath(); + const current = JSON.parse(readFileSync(path, "utf8")) as { providers: Record }; + current.providers.diskOnly = { adapter: "openai-chat", baseUrl: "https://disk.example/v1", apiKey: "sk-disk" }; + writeFileSync(path, JSON.stringify(current, null, 2) + "\n"); + const outcome = mutatePersistedConfig(persisted => { + persisted.port = 10600; + return { changed: true, value: true }; + }); + expect(outcome.status).toBe("committed"); + // The adopter mirrors only the mutation it knows about; the disk-only row is + // still not routed, so re-anchoring to the served snapshot must keep diverged. + armed.port = 10600; + refreshResidentConfigIdentity(armed); + expect(readConfigDivergenceStatus().diverged).toBe(true); + }); + + test("the refresh helper no-ops when no resident identity is armed", () => { + // A fresh process that never saved nor ran an admission load has no identity. + writeFileSync(getConfigPath(), JSON.stringify(config(), null, 2) + "\n"); + const unarmed = loadConfig(); + refreshResidentConfigIdentity(unarmed); + expect(readConfigDivergenceStatus().residentVersion).toBeNull(); + }); + test("a guarded save keeps divergence when the persisted binding differs from the live socket", () => { saveConfig(config()); const armed = loadConfig({ captureResident: true }); From 13a178b4459001ef23f95dab89f898bc75275a0e Mon Sep 17 00:00:00 2001 From: HarryZhou <2373256746@qq.com> Date: Mon, 24 Aug 2026 15:54:31 +0800 Subject: [PATCH 11/13] docs(pr-assets): refresh config-divergence card with current i18n copy --- docs/pr-assets/config-divergence-card.png | Bin 22756 -> 23583 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/pr-assets/config-divergence-card.png b/docs/pr-assets/config-divergence-card.png index ebc238b18cb4b355b1b565bb1445e58db75887b6..ed8d2d3e23a129d206a19a5dffbbc504761f21df 100644 GIT binary patch literal 23583 zcmeFYXIPWjyYJ8ZoRJw3nGq2cff*4&X-e+-VH3HI` zq1Qx2K)Q578W13~5NaR^NlyIjy|44X&WrPEpLhRPck(1x)_PX%wbu9hx!05Mz{*7U z)TL7b0s_LO_wPOw5cuVTfWV3W`1N1>E3+y;y%Z4mUBLA29lOZfO^(Pj`@`pQNA7YD zTg-}ny`^-kOnQcW_jO72w_W|OU#e6zw9kWNVqJf!b5kjla!-o>>p#ltOhM^+*`!l7 znGPYO4P;*St%kjmUPEU>HO@Sc__O7Fl!eHEvU`HFkOt{*^+0CZBSjC1g7XQ=O0t`+ zh^znc`gSkxNET&X?9p;a2!m50aB3)m90teQKI56a4sV?mzzy`Tu|T zzYPIN+WB+H&i7_4BfYA46jBVTpHHWZsthX~O@X94FSKj9>F*CYguR3wv73oG&pxsl z`t{*s4g(n0b{K#+Ur#EIp?=^=N#Xp80op8z4+gVenWWm@wi+M;V9=zcb*CCBIk;=v z2UHQ*@9ZT@+h$ZiC53Vy@hJf2#PH29XsR4VpAa}YaTs;-@|vw4CZFx6Td-MaBTda2 zx&^EO7&b4cP$B&KaoueG$dWux4KqO2pd-FEqzDRMjUQsL@z44&t zw{U60eH>KS7c3yK9kU?S9!r_KJ=v#2Xo8uC!8k0sH2Btmh$Zw6E&FNIinaM0;YQh8 z@Km?84Q;sQVV{oqrEHgMi8le74VwBbSJ8hSdMtMRvNP**yYhs;omcUR>`CHkGm{E$3c67;+{fVsKc!AU?2Io zSngW8rusVoF0%nM&L~P3m18M@AfR=L?6;1)^Bk0=M2m^DB){Kif&}E*kSUy=(#)gO z!oj&klL2yGNg&_lvs1! z8z{U+>s)WVq>?jMuHvJDTTDI>t6o8_4L)8|NL9LoI$k>Z=$W>KKX8QSj(2BislNUA zPR>6-blLWrX~Me79J5wsc-q~r56D}IB*M1$Kya`>6SQd;QSwrOB7sjM&pM!V!r3~S zi|FSyC(CoI5k4 z5Pcr)fZ{VegNlNW4vVRg;;^itQ9w)RPGoSiYLKjLyr_>=#8wK(a3+6%bFew0kr3FO z>Kx5l97RR7aK|)KuLaB;M?Mt&mMemr(5SEQ!AR#-OCRfNW%bhJfbT7dR(@ayq+up1 zNp=Pa+9ZroF%g3j5Z{v!?ecnX8aw);3b|(|Y_XDj%)RLB3Ysd*D73CdZ1quOQVgHdKM#pN2}Y_$BRe(e#tgE0D0=R*7|?ugp;37~ag3*{YfS^> zwsUj1^VHF5KS{b~PpGH6YPUPfqjAvPNr&nF`nl04ps6zk8g#-(Z>}jk{4xl^uANqH zX}xXa25==$=K!|@shCwneEZxP?CxFe`ffS}5bTE|MR_i9KjTIinR_MNuiekPWu=DZBMG`@85)zy zuZT6{R>p$-fwfjM*?*}a*{9}GnK)W_pZU@o@}1851|P4@h(Mg8b(D3f`02%HhV4qPcg#Y0N982& zQDlwfJFSMR^(rGJ7ndv`4}CC`7@o!8UD5sw5E=6{Xgy=^F+-vaHcZ`Ejx|zg(4WwZ z0%v7pC2B!SqnuW_#W+y#8wEE#XDsu}$CIk(U=@_j?{8M78|_h_A&;*Cg5380Hh~Kp z5ha6&lJOaew*vT5ChBm-*6#dOt*U;=--Re_`SC#~Tf#XfKuu;ZKw`R~p~2#G26h^c zp*&-R2(2aM(I_1HE=xnHS}EX7V}cG^=Rm@_6d7&`hKRgdy2n+yD4p_pu9-3&@Xn~S zlljZrgq`KNW-L@6Qogr1MjK5jl?cnYn&aX;J()o@oN48>N?YkC$+$N%^a2V;GZo8I zABj~5K#Pp>^diEoI&(fid^V0$*uIUjV<2{tB!Ihc7oe0zw1P3edJeem!=I!H

fAoX!pR~b0WF^F$*tUX(LYK9YH?$ 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°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

fs3cI(wmXNn|waI*y$FHXkZ7&fqDK83Nl(|w* znrwXvn6O(J{x|yfaoOB%g&^}(%Bm_`WJ%YntFB8L5^)e6AjiOAaARXY)pl8mNVYw? zKiFG3V=o+WIkFkhtdeeC=>e1Md)Ol~rIfq&>rlgppNmbyGy8^TTVF4&0finJZUlO>9gJ6G}`yHBKEH9Pi#QA za*uoeGpkVb^}7F+Rd18ef91(*jrvaUI9L{OwNa=P>DIZwkjXRc0dSmmQPnto^w4Cg zn38)Z{D8zD0*?647=|1_2N|;WjWkjuOmtIeynZbACi_=p$#n0~{)=vOYKi>V?0EPy z`UW7goN~fE3ZAQwx*>b#0|zKIW%L_nJ#PN)72YhrEZ@-U1^PGa*JrS5hX>a4Y0kv zSLT*~Dj$Ux=KIF1r3|@V+%c}yG$gjP{IBg;^-%ii?)yJH(>A!)1jfdOM*g32_Wb(l zRjF_00(X(~#dx@j?tOJ~`R2u+(+l6)-AW3+yYB8y=~s`rv-{z;x z>z=T(5jdPKD%!fSvD05a?r+GaL+hB?wfBF0;{5aCAJ?g?rQ|I>oLjfQBD+Fo-;c(O z`^$Ek#m$M>Xmhd7;MUSj?fbWW{rGCxv}MW1`}Tfo-gf5ekDZ~uv!f=Z8jJ5LNUYto z>3zbpOzWS^SDXPR+R$fDT)Cd<>B!oB5wZtkrax$}bG_pkKWW)oVmX7gM2 zx6_Y3;?54+p40Ox;m4Q8=J(?3vtr`}Q!`*w854I-U8?ahp!CmOVb|5G@-APVS2uU# zjV)_eY)EoV-jrW{oB!TfpA!*Vx1Wz9LOt8JX~ z{n^+0%}GfgfxV!#U4|LI9tTylTWR)OHB~z=fAjaNlP?}jzjoz{j?HxGuOZiW{5rD^ z*x-1cpOQ8!GHR~=ixWTl?!IL{xpsE`KL3=gr|a`O_kKR7Usv?xu+L=8)zw9hCx1QK zZ2P-BeSX-~$cL+@xf`9gpIPJdcXj@qpMQGq7IFF8oJl?P`tpBagO!`oem$G>^3I&2 zme#9_1sEFq57%B_AKzaqcj@KrukVk$t$Q|K#Ck4ppdxiv!{g0GpmA+$?IQmu$@0gB z8=o@%TQoPX|HqZyWqo_B{s~<0zi?t_{GPIeg3#Bw?Z*xr2M)!Y%ijH4Zk83_v+u`z zo$}I@s9F-pONM37V;lD9dU)WUn>z-`ewvcO@i&`zM~i+bm~y`Q}V5kC171 zr?4(z|J|PK`my?B-Hexa3;Q`P1J}Lv&D(f{t3U5Su!&89;Jv@;q|{(0|)V*uD$yC@Xx*Vvu%}p4llnQfAenf)`W+jdUdDD-94~8 zLa5ORoI5I{fU^D`N&Fj%>VKfLvQ^9CP0EWP5Mi>o((Nr*;GQxrXC;Mb4fPBR9 z>;Ep<#&f_iPuqi_J;HA|fyZhwB>00@99K7ib_d?zW?=aLpH*yH5s=Ir>mdKI;Vst0LJn~k^lez literal 22756 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 Date: Mon, 24 Aug 2026 16:52:00 +0800 Subject: [PATCH 12/13] docs(pr-assets): show the divergence warning on the full dashboard --- docs/pr-assets/config-divergence-card.png | Bin 23583 -> 211224 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/pr-assets/config-divergence-card.png b/docs/pr-assets/config-divergence-card.png index ed8d2d3e23a129d206a19a5dffbbc504761f21df..71fe1fb1321218537470b6ac8f879242b340d0d1 100644 GIT binary patch literal 211224 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 z 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 literal 23583 zcmeFYXIPWjyYJ8ZoRJw3nGq2cff*4&X-e+-VH3HI` zq1Qx2K)Q578W13~5NaR^NlyIjy|44X&WrPEpLhRPck(1x)_PX%wbu9hx!05Mz{*7U z)TL7b0s_LO_wPOw5cuVTfWV3W`1N1>E3+y;y%Z4mUBLA29lOZfO^(Pj`@`pQNA7YD zTg-}ny`^-kOnQcW_jO72w_W|OU#e6zw9kWNVqJf!b5kjla!-o>>p#ltOhM^+*`!l7 znGPYO4P;*St%kjmUPEU>HO@Sc__O7Fl!eHEvU`HFkOt{*^+0CZBSjC1g7XQ=O0t`+ zh^znc`gSkxNET&X?9p;a2!m50aB3)m90teQKI56a4sV?mzzy`Tu|T zzYPIN+WB+H&i7_4BfYA46jBVTpHHWZsthX~O@X94FSKj9>F*CYguR3wv73oG&pxsl z`t{*s4g(n0b{K#+Ur#EIp?=^=N#Xp80op8z4+gVenWWm@wi+M;V9=zcb*CCBIk;=v z2UHQ*@9ZT@+h$ZiC53Vy@hJf2#PH29XsR4VpAa}YaTs;-@|vw4CZFx6Td-MaBTda2 zx&^EO7&b4cP$B&KaoueG$dWux4KqO2pd-FEqzDRMjUQsL@z44&t zw{U60eH>KS7c3yK9kU?S9!r_KJ=v#2Xo8uC!8k0sH2Btmh$Zw6E&FNIinaM0;YQh8 z@Km?84Q;sQVV{oqrEHgMi8le74VwBbSJ8hSdMtMRvNP**yYhs;omcUR>`CHkGm{E$3c67;+{fVsKc!AU?2Io zSngW8rusVoF0%nM&L~P3m18M@AfR=L?6;1)^Bk0=M2m^DB){Kif&}E*kSUy=(#)gO z!oj&klL2yGNg&_lvs1! z8z{U+>s)WVq>?jMuHvJDTTDI>t6o8_4L)8|NL9LoI$k>Z=$W>KKX8QSj(2BislNUA zPR>6-blLWrX~Me79J5wsc-q~r56D}IB*M1$Kya`>6SQd;QSwrOB7sjM&pM!V!r3~S zi|FSyC(CoI5k4 z5Pcr)fZ{VegNlNW4vVRg;;^itQ9w)RPGoSiYLKjLyr_>=#8wK(a3+6%bFew0kr3FO z>Kx5l97RR7aK|)KuLaB;M?Mt&mMemr(5SEQ!AR#-OCRfNW%bhJfbT7dR(@ayq+up1 zNp=Pa+9ZroF%g3j5Z{v!?ecnX8aw);3b|(|Y_XDj%)RLB3Ysd*D73CdZ1quOQVgHdKM#pN2}Y_$BRe(e#tgE0D0=R*7|?ugp;37~ag3*{YfS^> zwsUj1^VHF5KS{b~PpGH6YPUPfqjAvPNr&nF`nl04ps6zk8g#-(Z>}jk{4xl^uANqH zX}xXa25==$=K!|@shCwneEZxP?CxFe`ffS}5bTE|MR_i9KjTIinR_MNuiekPWu=DZBMG`@85)zy zuZT6{R>p$-fwfjM*?*}a*{9}GnK)W_pZU@o@}1851|P4@h(Mg8b(D3f`02%HhV4qPcg#Y0N982& zQDlwfJFSMR^(rGJ7ndv`4}CC`7@o!8UD5sw5E=6{Xgy=^F+-vaHcZ`Ejx|zg(4WwZ z0%v7pC2B!SqnuW_#W+y#8wEE#XDsu}$CIk(U=@_j?{8M78|_h_A&;*Cg5380Hh~Kp z5ha6&lJOaew*vT5ChBm-*6#dOt*U;=--Re_`SC#~Tf#XfKuu;ZKw`R~p~2#G26h^c zp*&-R2(2aM(I_1HE=xnHS}EX7V}cG^=Rm@_6d7&`hKRgdy2n+yD4p_pu9-3&@Xn~S zlljZrgq`KNW-L@6Qogr1MjK5jl?cnYn&aX;J()o@oN48>N?YkC$+$N%^a2V;GZo8I zABj~5K#Pp>^diEoI&(fid^V0$*uIUjV<2{tB!Ihc7oe0zw1P3edJeem!=I!H

fAoX!pR~b0WF^F$*tUX(LYK9YH?$ z5!x`$=vg&{`cX2ktWc?%87@_?!6Vv#p)y<=xjme#EH=NshTQb2_ulw;w zkuxxa3#QgSKM>~UgCBIcR2T0tzb!OMTT7BHY`NmXm4DQ4`A5`_opS#-nmveG9=H}4 zt;Y(LsB~-HY+~LE{Lrqa0oU%U6%n~i3MtbvsJybAnLTv}in}YDo)uvxd*Yr!-j3C~^QHi;KJ$3Po{Phj1o?v?LMua;}G$5cJacNy& zJtV??%^(-0_7Uo}H^BC+4>}puoIg3H(@15D8gP$sS+C|cl*UF)=Dr677`DrlM(C^Y z`+}7(GLo#;mBvFq4in`mLZiv060Ox*T6f7W!~ACq)AZ^ATad@BSQy}VA+jwE)mYs0 zbbb@JW@{rLz!f0IK%PAvHrJ0tm@48$S|fKBAHcsPM=1dHp^TWl^GocmHH_qjG`wKX zxx_Q(2H2~cv*%$XUb|Euw*=v>`;hyAejTAZX2;XGQ`DRnksh#dMqU$wG(I%)Ptm^`z=1BE3*1e%&@^U0Vmz7i8=?uH~V*boyY02hk?P)~%0Sa~C`@ll7af z*}7I$Yg1__WYx}ReL(cEkA*}HOg#xQ@=gt|jlipj_%wr;CsSRdi21~WBsZH4$MY!5 zG)%i<`*S_%efgx;${&e5i;K`kbX)BfH;2jHy9!%23nX;}jva1pbQb5vV>++JRNAk9 zM|R__&jrML;eVc6hnZ9xIN*k>DUCvmA0+M5%Kjw$kk>jy_g;p`RvNstUxHiSP`FN zs*JluBuvt@w`?c^{LKt|kG3w&v>2<=@{gQaq&V2bl?iXhoT#&uo{|4FJ`X4e= ztjG4}PA=`G?8dFc4Sh%@A!~Lj*~@554WXK~79cw&w&*K;(h6*R@r&hw>-cNQpTazw zw}7}@m0(a`K|MZ0DXFw=_Ym}spnakFg6>qvjTwZ~GsL19eTUNO;JIg}%9GZ^PeFFt z11@FAMtC#Sr>4@)X52S62hORWLoLHtkuh|fT}k+$ha1ztu`Upox0e#v$doW!vDZ+a z45n|61n$p0&<*?OZS!%q&b10$8VjE>VZ;{2Fu)~Sg`N%%+nWv&T)ekB->eU0dX8B3 zT`>ef6~|ISYdUR4mP%IU7#89O&Xb0!!akv$)0(L>PxR9Q%TkDT@n~GqKn5aWBPHyX zu3wH;HMF&zqN(w$8JwdO64Whv0N6x^{!>t67tXZgve`Xl-BFcC_;69D&z zZ&G!~VJ3&0{^Xgc3Kej~W0rJ-&?5whno)DWY_GJ<(`&wpk7(%FA281eUK>-ozjU(8 zr}>Z6QNqFvr%&^}FN7+#P@;o`v#=m}wFKXDRi}w$bp}R&oR5oGgt+p-B zW;=`X9)hUTae^Oh-@dk>o$qh?QSZ$1`prKMI_mOT6~y-(rfb3Uz#x(i*k~rMWN7iy zfpKZ?uR?`2VTGMR`U_=B^f|43P@wPo>!J5Wgp=tp{^X_=SThC?u4F*(it}0yDla?o z(TlMaUfcZna)MXCpmYc0F>|E;gile84Nw=+sE@8HShuoXxo$d{VO>#kl-qv?UzPZd zR!wAnAk)$;4<+GIG5EYVUke{ARdfWcu3SW@HDY-&T#4DsxHjPQ=KbWGm2?Ls`2?@U z_yFzxigu6^x`W=7QOY{RDo3{(H1mZ8gJP0o*iH(x;!Dd zj?<*)xJzDmU$*&++9bV?btXBx>vN=9SsNN*qvrSkj`tQ2_$>W8Mt%OmdS1)r_hrMx zVVHj(OGCwikf>j(|Hna9;oyL6{Dg`lvxtL*KI=oevCn{geAe6fs*W~RLt?Bt&s&O1 zQr``+f0p`Lmx|0RtjAJnFY~yp0~Kr6cX_s$kN$U{@>6;gu_K)@Gw-kzJ*k{9cChC= z0s;Pf|LA8q1+A)~Gk>;DH_{`?u|^c;JtOnbuCKkpG6rCUoydMAk;+$Rks9W6s*un7 z5tr#f?l<#6$s!z-pPUC|HZ;N`PSBiToVgcos13exO0BT&ot;uU_T$w~#alk)+u`NM zc0gUNFwdxWAOief$l0TFze!i#m*#vRcRbgDNd8Jlm&j?;Bt8O(|Fl9Fztd?e3IACw zw>)fX>vX;wu~+V7u<&I7Vaj1VeN^jO$-7s>H5b2L6N6-kokfKOqyfg`f`NMw=-B}i z0>Pq|xH-W(vwz!1Kp?n9PVS;5;u#cZ!i6*E8gXoa8p3rcdfZd4~`NVq4cC{^Kc#FFCAlxtdxM(d2CcOkN7`@)Vq%6DF zt8x-(L3F%PKl}MeV|;h$bb(t8V;O-{@e87-m?3r@u)4>)k!xFu?y7K`@ITYrwEgtT z3j&&Xu2J0BnUkz*uwZ#-^Q}~&irvhn`euixnVWhYbSkqnMbT*@7kjYWo1dZ8jN-(* z920@n7*GG#lBXwM>pg|VpP}i!YySh&@uYiz?SmFV&(ZQuGzT7yBZe#*&jN26j;-DX z&FpM`D!3aI9;KWA?X>ei@(z7-b8suPKUR3q+h!b}<(BrtFfqQ3xNrve`=MLw{-EVV z^2tQjSBerdcCyE>t#a(;uB%C?{1l|97?_Z4&pltj7DY`@=*p!B?K(vStupMxXTW;g zoz2hHn|mL;^Vb?3RMwGdA(it1_J-0n(&!=qPM@DhfMxRSt#LgzT;{7d(( z_qc9>%5aKRds$s+zoH=n@_6!eF9_cC;5!6-q-5 zm;<#2MI0NmVv$YVOdRiQW7e(HJFasK{U+R9b@<`L^)_&u<=)(qZG5}E&0G;l>n64NQd2`0eRMKB!G_od~=C?6)s1a;o zg8s9$;IDR-6Q#PndnpMC@~Sayip`}bB!eVvzZ5EntBllzQl|{ZaxJxM@@T8815!(6 z5>fcC1y>#7(?~Fiy}mMRc`==kK}ql$tWZTyC_*eZFZ>TU(uo z%X?diWeMrS-WN_{ei4G4n$%6XKz9!(!>+dJPRcS2CaRa-zhCooLksn1Pqc{TyS>;E zH;P*7BUxz+C?UGj61Q6#;)DO{biVjQUbA%JUdVPx}cg zN°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

fs3cI(wmXNn|waI*y$FHXkZ7&fqDK83Nl(|w* znrwXvn6O(J{x|yfaoOB%g&^}(%Bm_`WJ%YntFB8L5^)e6AjiOAaARXY)pl8mNVYw? zKiFG3V=o+WIkFkhtdeeC=>e1Md)Ol~rIfq&>rlgppNmbyGy8^TTVF4&0finJZUlO>9gJ6G}`yHBKEH9Pi#QA za*uoeGpkVb^}7F+Rd18ef91(*jrvaUI9L{OwNa=P>DIZwkjXRc0dSmmQPnto^w4Cg zn38)Z{D8zD0*?647=|1_2N|;WjWkjuOmtIeynZbACi_=p$#n0~{)=vOYKi>V?0EPy z`UW7goN~fE3ZAQwx*>b#0|zKIW%L_nJ#PN)72YhrEZ@-U1^PGa*JrS5hX>a4Y0kv zSLT*~Dj$Ux=KIF1r3|@V+%c}yG$gjP{IBg;^-%ii?)yJH(>A!)1jfdOM*g32_Wb(l zRjF_00(X(~#dx@j?tOJ~`R2u+(+l6)-AW3+yYB8y=~s`rv-{z;x z>z=T(5jdPKD%!fSvD05a?r+GaL+hB?wfBF0;{5aCAJ?g?rQ|I>oLjfQBD+Fo-;c(O z`^$Ek#m$M>Xmhd7;MUSj?fbWW{rGCxv}MW1`}Tfo-gf5ekDZ~uv!f=Z8jJ5LNUYto z>3zbpOzWS^SDXPR+R$fDT)Cd<>B!oB5wZtkrax$}bG_pkKWW)oVmX7gM2 zx6_Y3;?54+p40Ox;m4Q8=J(?3vtr`}Q!`*w854I-U8?ahp!CmOVb|5G@-APVS2uU# zjV)_eY)EoV-jrW{oB!TfpA!*Vx1Wz9LOt8JX~ z{n^+0%}GfgfxV!#U4|LI9tTylTWR)OHB~z=fAjaNlP?}jzjoz{j?HxGuOZiW{5rD^ z*x-1cpOQ8!GHR~=ixWTl?!IL{xpsE`KL3=gr|a`O_kKR7Usv?xu+L=8)zw9hCx1QK zZ2P-BeSX-~$cL+@xf`9gpIPJdcXj@qpMQGq7IFF8oJl?P`tpBagO!`oem$G>^3I&2 zme#9_1sEFq57%B_AKzaqcj@KrukVk$t$Q|K#Ck4ppdxiv!{g0GpmA+$?IQmu$@0gB z8=o@%TQoPX|HqZyWqo_B{s~<0zi?t_{GPIeg3#Bw?Z*xr2M)!Y%ijH4Zk83_v+u`z zo$}I@s9F-pONM37V;lD9dU)WUn>z-`ewvcO@i&`zM~i+bm~y`Q}V5kC171 zr?4(z|J|PK`my?B-Hexa3;Q`P1J}Lv&D(f{t3U5Su!&89;Jv@;q|{(0|)V*uD$yC@Xx*Vvu%}p4llnQfAenf)`W+jdUdDD-94~8 zLa5ORoI5I{fU^D`N&Fj%>VKfLvQ^9CP0EWP5Mi>o((Nr*;GQxrXC;Mb4fPBR9 z>;Ep<#&f_iPuqi_J;HA|fyZhwB>00@99K7ib_d?zW?=aLpH*yH5s=Ir>mdKI;Vst0LJn~k^lez From bbea693a1afe55826cd98e8ffff3061323ae69d3 Mon Sep 17 00:00:00 2001 From: HarryZhou <2373256746@qq.com> Date: Mon, 24 Aug 2026 21:35:08 +0800 Subject: [PATCH 13/13] fix(config): surface missing-config divergence; re-anchor WHAM plans --- src/cli/index.ts | 8 +++++- src/codex/auth-api.ts | 10 +++++-- src/config.ts | 38 ++++++++++++++++++++++---- src/server/management/config-routes.ts | 2 +- tests/codex-plan.test.ts | 33 ++++++++++++++++++++++ tests/config-divergence.test.ts | 21 +++++++++++--- 6 files changed, 98 insertions(+), 14 deletions(-) diff --git a/src/cli/index.ts b/src/cli/index.ts index 1ce02073d4..d3a270970a 100755 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -885,7 +885,13 @@ async function handleStatus() { console.log(` Action: ${status.json.codexHome.action}`); } if (status.json.configDivergence.available && status.json.configDivergence.diverged) { - console.log(" ⚠️ config.json changed on disk after the running proxy loaded it; the proxy is still serving the older settings."); + if (status.json.configDivergence.diskVersion === null) { + console.log(" ⚠️ config.json was removed after the running proxy loaded it; the proxy is still serving the loaded settings."); + } else if (status.json.configDivergence.residentVersion === null) { + console.log(" ⚠️ config.json appeared after the running proxy started with defaults; restart to apply it."); + } else { + console.log(" ⚠️ config.json changed on disk after the running proxy loaded it; the proxy is still serving the older settings."); + } console.log(" Action: restart the service to apply: 'ocx service restart'."); } console.log(` Catalog clamp: ${status.json.codexRuntime.catalogClamp.active ? "active" : "inactive"}`); diff --git a/src/codex/auth-api.ts b/src/codex/auth-api.ts index 8ac2411323..6c213f940c 100644 --- a/src/codex/auth-api.ts +++ b/src/codex/auth-api.ts @@ -2,6 +2,7 @@ import { ConfigMutationLockError, loadConfig, mutatePersistedConfig, + refreshResidentConfigIdentity, saveConfigPreservingClaudeCode, withConfigMutationLockSync, } from "../config"; @@ -860,7 +861,7 @@ export interface CodexAuthAccountDto { quotaProbeSkipped?: true; } -interface FreshPoolPlanUpdate { +export interface FreshPoolPlanUpdate { accountId: string; plan: string; credentialGeneration: number; @@ -872,7 +873,7 @@ interface FreshPoolPlanUpdate { * WHAM requests were in flight. Missing or malformed files fail closed: a read path must not * recreate a deleted config from the server's older in-memory snapshot. */ -function reconcileFreshPoolAccountPlans(runtimeConfig: OcxConfig, updates: FreshPoolPlanUpdate[]): void { +export function reconcileFreshPoolAccountPlans(runtimeConfig: OcxConfig, updates: FreshPoolPlanUpdate[]): void { if (updates.length === 0) return; let outcome: ReturnType>; try { @@ -908,6 +909,7 @@ function reconcileFreshPoolAccountPlans(runtimeConfig: OcxConfig, updates: Fresh throw error; } if (outcome.status === "unavailable") return; + let adoptedAny = false; for (const update of outcome.value) { // A replacement immediately after the durable commit is allowed to supersede the result, but // the long-lived object must never be updated from that stale generation. @@ -917,8 +919,12 @@ function reconcileFreshPoolAccountPlans(runtimeConfig: OcxConfig, updates: Fresh liveAccount.plan = update.plan; liveAccount.planSource = "wham"; liveAccount.planCredentialGeneration = update.credentialGeneration; + adoptedAny = true; } } + // The long-lived runtime config now serves the persisted plan, so the resident + // divergence identity must follow it (the disk-first mutation skipped the refresh). + if (adoptedAny) refreshResidentConfigIdentity(runtimeConfig); } async function fetchFreshPoolAccountQuota( diff --git a/src/config.ts b/src/config.ts index 749c99c4a2..51b56fa024 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1777,7 +1777,10 @@ export function loadConfig(options?: { captureResident?: boolean }): OcxConfig { if (!existsSync(configPath)) { // No file means the process is serving defaults, not the previously loaded bytes; // a reload after deletion must not retain the old resident identity. - if (options?.captureResident) residentConfigSha256 = null; + if (options?.captureResident) { + residentConfigSha256 = null; + residentConfigSource = "default"; + } return withRefreshedCostOverlays(getDefaultConfig()); } try { @@ -1789,6 +1792,7 @@ export function loadConfig(options?: { captureResident?: boolean }): OcxConfig { const fileBytes = readFileSync(configPath); if (options?.captureResident) { residentConfigSha256 = createHash("sha256").update(fileBytes).digest("hex"); + residentConfigSource = "file"; } const rawWithBom = fileBytes.toString("utf-8"); const raw = rawWithBom.replace(/^\uFEFF/, ""); @@ -1857,11 +1861,17 @@ export function loadConfig(options?: { captureResident?: boolean }): OcxConfig { } // Merge couldn't fix it — truly broken config warnAndBackupInvalidConfig(configPath, result.error); - if (options?.captureResident) residentConfigSha256 = null; + if (options?.captureResident) { + residentConfigSha256 = null; + residentConfigSource = "file"; + } return getDefaultConfig(); } catch (error) { warnAndBackupInvalidConfig(configPath, error); - if (options?.captureResident) residentConfigSha256 = null; + if (options?.captureResident) { + residentConfigSha256 = null; + residentConfigSource = "file"; + } return getDefaultConfig(); } } @@ -2243,7 +2253,8 @@ export interface ConfigDivergenceStatus { residentVersion: string | null; /** SHA-256 of the current config.json bytes on disk (null when unreadable). */ diskVersion: string | null; - /** True only when a resident version exists and differs from the current disk bytes. */ + /** True when a restart would serve something different: bytes changed, a file-backed + * resident lost its file, or a defaults-backed resident gained a config.json. */ diverged: boolean; } @@ -2255,13 +2266,23 @@ export interface ConfigDivergenceStatus { export function readConfigDivergenceStatus(): ConfigDivergenceStatus { const admission = readConfigAdmissionSnapshot(); const diskVersion = admission.kind === "read" ? admission.contentSha256 : null; + const diskFile = admission.kind === "read"; + let diverged = false; + if (residentConfigSource === "file" && residentConfigSha256 !== null) { + // A file-backed resident diverges when the file vanished/unreadable or its + // bytes differ: a restart would serve something else. + diverged = !diskFile || diskVersion !== residentConfigSha256; + } else if (residentConfigSource === "default") { + // A defaults-backed resident diverges when a config.json now exists. + diverged = diskFile; + } return { residentVersion: residentConfigSha256, diskVersion, - diverged: residentConfigSha256 !== null && diskVersion !== null && residentConfigSha256 !== diskVersion, + diverged, }; } - + const CONFIG_MUTATION_DB_FILENAME = "config-mutation.sqlite"; const CONFIG_MUTATION_DB_SIDECARS = ["-journal", "-wal", "-shm"] as const; let warnedConfigMutationDirectoryAcl = false; @@ -2271,10 +2292,13 @@ let warnedConfigMutationDirectoryAcl = false; // Only the server admission load (loadConfig({ captureResident: true })) arms this // identity; incidental loads during runtime must not wipe it. let residentConfigSha256: string | null = null; +/** Whether the resident identity came from a real config.json or from serving defaults. */ +let residentConfigSource: "file" | "default" | null = null; /** Test-only seam: reset the resident identity so isolated test files cannot leak state. */ export function setResidentConfigSha256ForTests(value: string | null): void { residentConfigSha256 = value; + residentConfigSource = value === null ? null : "file"; } /** @@ -2289,6 +2313,7 @@ export function setResidentConfigSha256ForTests(value: string | null): void { */ export function refreshResidentConfigIdentity(config: OcxConfig): void { if (residentConfigSha256 === null) return; + residentConfigSource = "file"; residentConfigSha256 = createHash("sha256").update(JSON.stringify(config, null, 2) + "\n").digest("hex"); } @@ -2540,6 +2565,7 @@ function persistConfigUnlocked( // there is nothing disk-only to preserve). const servedSnapshot = options.servedSnapshot ?? config; if (options.refreshResident !== false) { + residentConfigSource = "file"; residentConfigSha256 = createHash("sha256").update(JSON.stringify(servedSnapshot, null, 2) + "\n").digest("hex"); } // For changed saves, refresh only AFTER the write succeeded so a failed diff --git a/src/server/management/config-routes.ts b/src/server/management/config-routes.ts index 94382896a8..17a9f5046c 100644 --- a/src/server/management/config-routes.ts +++ b/src/server/management/config-routes.ts @@ -251,7 +251,7 @@ export async function handleConfigRoutes(ctx: ManagementContext): Promise { }); describe("WHAM-wins plan provenance gate (release-audit fix)", () => { + test("WHAM plan adoption re-anchors the resident config identity", () => { + const config: OcxConfig = { + port: 10100, + providers: {}, + defaultProvider: "openai", + codexAccounts: [{ + id: "pool-wham-reanchor", email: "reanchor@example.test", plan: "pro", + planSource: "wham", planCredentialGeneration: 1, isMain: false, + }], + }; + saveConfig(config); + const armed = loadConfig({ captureResident: true }); + armClaudeCodeBaseline(armed); + expect(readConfigDivergenceStatus().diverged).toBe(false); + saveCodexAccountCredential("pool-wham-reanchor", { + accessToken: chatgptPlanJwt("plus", "acct-pool-wham-reanchor"), + refreshToken: "refresh-pool-wham-reanchor", + expiresAt: Date.now() + 5 * 60_000, + chatgptAccountId: "acct-pool-wham-reanchor", + }); + // A WHAM refresh persists plan=plus and adopts it into the long-lived config; + // without re-anchoring, status would keep claiming a divergence. + const updates: FreshPoolPlanUpdate[] = [{ + accountId: "pool-wham-reanchor", plan: "plus", credentialGeneration: 1, + }]; + reconcileFreshPoolAccountPlans(armed, updates); + expect(armed.codexAccounts?.[0]?.plan).toBe("plus"); + const status = readConfigDivergenceStatus(); + expect(status.diverged).toBe(false); + expect(status.residentVersion).toBe(status.diskVersion); + }); + test("a same-generation JWT cannot overwrite a WHAM-sourced plan", () => { const config: OcxConfig = { port: 10100, diff --git a/tests/config-divergence.test.ts b/tests/config-divergence.test.ts index 4fc90b8913..9f98e05141 100644 --- a/tests/config-divergence.test.ts +++ b/tests/config-divergence.test.ts @@ -59,18 +59,18 @@ describe("config divergence status", () => { expect(status.diverged).toBe(false); }); - test("a missing config file reports no divergence and a different restore is caught", async () => { + test("a missing config file after arming is divergent and a different restore is caught", async () => { const bytes = JSON.stringify(config(), null, 2) + "\n"; writeFileSync(getConfigPath(), bytes); const loaded = loadConfig({ captureResident: true }); armClaudeCodeBaseline(loaded); expect(readConfigDivergenceStatus().residentVersion).not.toBeNull(); - // Deleting the file: no disk identity to compare, so no divergence claim — but - // the read must NOT destroy the resident identity (the GUI polls every 15s). + // Deleting a file-backed config diverges: a restart would serve defaults, so + // the read must report it AND keep the resident identity (the GUI polls every 15s). rmSync(getConfigPath()); let status = readConfigDivergenceStatus(); expect(status.diskVersion).toBeNull(); - expect(status.diverged).toBe(false); + expect(status.diverged).toBe(true); expect(status.residentVersion).not.toBeNull(); // Restoring the original bytes: still in sync. writeFileSync(getConfigPath(), bytes); @@ -84,6 +84,19 @@ describe("config divergence status", () => { expect(status.diverged).toBe(true); }); + test("a config that appears after a defaults-backed start is divergent", () => { + // No config.json exists yet: the server arms a defaults-backed resident. + const loaded = loadConfig({ captureResident: true }); + armClaudeCodeBaseline(loaded); + expect(readConfigDivergenceStatus().diverged).toBe(false); + // A config.json now appears: a restart would serve it instead of defaults. + writeFileSync(getConfigPath(), JSON.stringify(config(), null, 2) + "\n"); + const status = readConfigDivergenceStatus(); + expect(status.residentVersion).toBeNull(); + expect(status.diskVersion).not.toBeNull(); + expect(status.diverged).toBe(true); + }); + test("external disk edit after arming flips diverged", async () => { saveConfig(config()); const armed = loadConfig({ captureResident: true });