Files
pikasTech-unidesk/scripts/gc-remote-growth-contract-test.ts
T
2026-06-09 03:12:34 +00:00

110 lines
4.6 KiB
TypeScript

const sourceText = await Bun.file(new URL("./src/gc-remote.ts", import.meta.url)).text();
function assertCondition(condition: unknown, message: string, detail: unknown = {}): void {
if (!condition) throw new Error(`${message}: ${JSON.stringify(detail)}`);
}
function functionBody(name: string): string {
const marker = `def ${name}(`;
const start = sourceText.indexOf(marker);
if (start < 0) return "";
const next = sourceText.indexOf("\ndef ", start + marker.length);
return sourceText.slice(start, next < 0 ? sourceText.length : next);
}
assertCondition(
sourceText.includes('if (subaction === "snapshot" || subaction === "growth")')
&& sourceText.includes('if (subaction === "trend")')
&& sourceText.includes('supportedActions: ["plan", "snapshot", "trend", "run", "status"]'),
"gc remote must expose snapshot/growth and trend actions",
);
assertCondition(
sourceText.includes("historyLimit: number")
&& sourceText.includes("saveSnapshot: boolean")
&& sourceText.includes("--history-limit")
&& sourceText.includes("--no-save"),
"gc remote snapshot must expose bounded history and no-save options",
);
const snapshotBody = functionBody("collect_growth_snapshot");
assertCondition(
snapshotBody.includes('"action": "gc remote snapshot"')
&& snapshotBody.includes('"diagnosticStateMutation"')
&& snapshotBody.includes("disk_source_snapshot()")
&& snapshotBody.includes("ci_storage_snapshot()")
&& snapshotBody.includes("registry_growth_snapshot()")
&& snapshotBody.includes("containerd_breakdown_snapshot()"),
"growth snapshot must include disk sources, CI PVC ownership, registry, containerd and diagnostic-state disclosure",
snapshotBody.slice(0, 1200),
);
const storageBody = functionBody("ci_storage_snapshot");
assertCondition(
storageBody.includes('"hwlab"')
&& storageBody.includes('"agentrun"')
&& storageBody.includes('"byOwnerGroup"')
&& storageBody.includes("hwlab g14 control-plane cleanup-runs")
&& storageBody.includes("agentrun v01 control-plane cleanup-runs")
&& storageBody.includes("hostPath")
&& storageBody.includes("activeMountPods")
&& storageBody.includes("estimatedBytes")
&& storageBody.includes('phase in set(["Succeeded", "Failed"])'),
"CI storage snapshot must keep HWLAB and AgentRun owner handoff plus reclaim visibility",
storageBody.slice(0, 1600),
);
const registryBody = functionBody("registry_growth_snapshot");
assertCondition(
registryBody.includes('"dryRun": "daily or before/after every v0.2 CI/CD burst"')
&& registryBody.includes('"maintenanceRun": "weekly, or when root >=80%, or when registry growth exceeds the agreed daily threshold"')
&& registryBody.includes("plan_registry_retention()")
&& registryBody.includes("protected tags")
&& registryBody.includes("newest N tags per repo"),
"registry growth snapshot must disclose dry-run cadence, maintenance trigger and retention protections",
registryBody,
);
const containerdBody = functionBody("containerd_breakdown_snapshot");
assertCondition(
containerdBody.includes('"state": "observation-only"')
&& containerdBody.includes('"cleanupSupported": False')
&& containerdBody.includes("reference-safe image/content classifier"),
"containerd section must stay observation-only until a safe classifier exists",
containerdBody,
);
const trendBody = functionBody("growth_trend_payload");
assertCondition(
trendBody.includes('"latestDelta"')
&& trendBody.includes('"windowDelta"')
&& trendBody.includes('"short-window-rate-noisy"')
&& trendBody.includes('"topGrowingBytes"')
&& trendBody.includes('"registryCounters"'),
"growth trend must expose latest/window delta and registry counters",
trendBody,
);
const compactPointBody = functionBody("compact_growth_point");
assertCondition(
compactPointBody.includes('"sourceCount"')
&& compactPointBody.includes('"registry"')
&& compactPointBody.includes('"ciStorage"')
&& compactPointBody.includes('"containerd"')
&& sourceText.includes("[compact_growth_point(item) for item in history[-min(len(history), 3):]]"),
"growth trend must default to compact history points unless --full is requested",
compactPointBody,
);
console.log(JSON.stringify({
ok: true,
checks: [
"gc remote exposes snapshot/growth and trend actions",
"snapshot history is bounded and can be disabled with --no-save",
"snapshot includes source sizes, owner-aware CI PVCs, registry cadence and containerd observation",
"HWLAB and AgentRun retention handoff commands are explicit",
"trend includes latest/window deltas and registry counters",
"trend returns compact history points by default",
],
}));