Skip to content

Commit 72628f9

Browse files
committed
refactor(config): dedupe observe suspicion checks
1 parent 804e5f2 commit 72628f9

3 files changed

Lines changed: 52 additions & 86 deletions

File tree

src/config/io.observe-recovery.ts

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
persistBoundedClobberedConfigSnapshot,
1313
persistBoundedClobberedConfigSnapshotSync,
1414
} from "./io.clobber-snapshot.js";
15+
import { resolveConfigObserveSuspiciousReasons } from "./io.observe-suspicious.js";
1516
import { formatConfigIssueSummary } from "./issue-format.js";
1617
import { resolveStateDir } from "./paths.js";
1718
import {
@@ -510,49 +511,6 @@ function createBackupRestoreAuditAppendParams(params: {
510511
});
511512
}
512513

513-
function isUpdateChannelOnlyRoot(value: unknown): boolean {
514-
if (!isRecord(value)) {
515-
return false;
516-
}
517-
const keys = Object.keys(value);
518-
if (keys.length !== 1 || keys[0] !== "update") {
519-
return false;
520-
}
521-
const update = value.update;
522-
if (!isRecord(update)) {
523-
return false;
524-
}
525-
const updateKeys = Object.keys(update);
526-
return updateKeys.length === 1 && typeof update.channel === "string";
527-
}
528-
529-
function resolveConfigObserveSuspiciousReasons(params: {
530-
bytes: number;
531-
hasMeta: boolean;
532-
gatewayMode: string | null;
533-
parsed: unknown;
534-
lastKnownGood?: ConfigHealthFingerprint;
535-
}): string[] {
536-
const reasons: string[] = [];
537-
const baseline = params.lastKnownGood;
538-
if (!baseline) {
539-
return reasons;
540-
}
541-
if (baseline.bytes >= 512 && params.bytes < Math.floor(baseline.bytes * 0.5)) {
542-
reasons.push(`size-drop-vs-last-good:${baseline.bytes}->${params.bytes}`);
543-
}
544-
if (baseline.hasMeta && !params.hasMeta) {
545-
reasons.push("missing-meta-vs-last-good");
546-
}
547-
if (baseline.gatewayMode && !params.gatewayMode) {
548-
reasons.push("gateway-mode-missing-vs-last-good");
549-
}
550-
if (baseline.gatewayMode && isUpdateChannelOnlyRoot(params.parsed)) {
551-
reasons.push("update-channel-only-root");
552-
}
553-
return reasons;
554-
}
555-
556514
function resolveSuspiciousSignature(
557515
current: ConfigHealthFingerprint,
558516
suspicious: string[],
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { isRecord } from "../utils.js";
2+
3+
export type ConfigObserveSuspiciousBaseline = {
4+
bytes: number;
5+
hasMeta: boolean;
6+
gatewayMode: string | null;
7+
};
8+
9+
function isUpdateChannelOnlyRoot(value: unknown): boolean {
10+
if (!isRecord(value)) {
11+
return false;
12+
}
13+
const keys = Object.keys(value);
14+
if (keys.length !== 1 || keys[0] !== "update") {
15+
return false;
16+
}
17+
const update = value.update;
18+
if (!isRecord(update)) {
19+
return false;
20+
}
21+
const updateKeys = Object.keys(update);
22+
return updateKeys.length === 1 && typeof update.channel === "string";
23+
}
24+
25+
export function resolveConfigObserveSuspiciousReasons(params: {
26+
bytes: number;
27+
hasMeta: boolean;
28+
gatewayMode: string | null;
29+
parsed: unknown;
30+
lastKnownGood?: ConfigObserveSuspiciousBaseline;
31+
}): string[] {
32+
const reasons: string[] = [];
33+
const baseline = params.lastKnownGood;
34+
if (!baseline) {
35+
return reasons;
36+
}
37+
if (baseline.bytes >= 512 && params.bytes < Math.floor(baseline.bytes * 0.5)) {
38+
reasons.push(`size-drop-vs-last-good:${baseline.bytes}->${params.bytes}`);
39+
}
40+
if (baseline.hasMeta && !params.hasMeta) {
41+
reasons.push("missing-meta-vs-last-good");
42+
}
43+
if (baseline.gatewayMode && !params.gatewayMode) {
44+
reasons.push("gateway-mode-missing-vs-last-good");
45+
}
46+
if (baseline.gatewayMode && isUpdateChannelOnlyRoot(params.parsed)) {
47+
reasons.push("update-channel-only-root");
48+
}
49+
return reasons;
50+
}

src/config/io.ts

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ import {
7070
promoteConfigSnapshotToLastKnownGood as promoteConfigSnapshotToLastKnownGoodWithDeps,
7171
recoverConfigFromLastKnownGood as recoverConfigFromLastKnownGoodWithDeps,
7272
} from "./io.observe-recovery.js";
73+
import { resolveConfigObserveSuspiciousReasons } from "./io.observe-suspicious.js";
7374
import { retainGeneratedOwnerDisplaySecret } from "./io.owner-display-secret.js";
7475
import {
7576
collectChangedPaths,
@@ -638,49 +639,6 @@ function setConfigHealthEntry(
638639
};
639640
}
640641

641-
function isUpdateChannelOnlyRoot(value: unknown): boolean {
642-
if (!isRecord(value)) {
643-
return false;
644-
}
645-
const keys = Object.keys(value);
646-
if (keys.length !== 1 || keys[0] !== "update") {
647-
return false;
648-
}
649-
const update = value.update;
650-
if (!isRecord(update)) {
651-
return false;
652-
}
653-
const updateKeys = Object.keys(update);
654-
return updateKeys.length === 1 && typeof update.channel === "string";
655-
}
656-
657-
function resolveConfigObserveSuspiciousReasons(params: {
658-
bytes: number;
659-
hasMeta: boolean;
660-
gatewayMode: string | null;
661-
parsed: unknown;
662-
lastKnownGood?: ConfigHealthFingerprint;
663-
}): string[] {
664-
const reasons: string[] = [];
665-
const baseline = params.lastKnownGood;
666-
if (!baseline) {
667-
return reasons;
668-
}
669-
if (baseline.bytes >= 512 && params.bytes < Math.floor(baseline.bytes * 0.5)) {
670-
reasons.push(`size-drop-vs-last-good:${baseline.bytes}->${params.bytes}`);
671-
}
672-
if (baseline.hasMeta && !params.hasMeta) {
673-
reasons.push("missing-meta-vs-last-good");
674-
}
675-
if (baseline.gatewayMode && !params.gatewayMode) {
676-
reasons.push("gateway-mode-missing-vs-last-good");
677-
}
678-
if (baseline.gatewayMode && isUpdateChannelOnlyRoot(params.parsed)) {
679-
reasons.push("update-channel-only-root");
680-
}
681-
return reasons;
682-
}
683-
684642
async function readConfigFingerprintForPath(
685643
deps: Required<ConfigIoDeps>,
686644
targetPath: string,

0 commit comments

Comments
 (0)