mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-20 05:31:30 +00:00
fix(test): reduce node hotspot startup cost
Scope: conversation-binding/targets startup trimming + schema help isolation guardrail
This commit is contained in:
@@ -1,149 +1,15 @@
|
||||
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
||||
import type { ChannelOutboundAdapter } from "../../channels/plugins/types.js";
|
||||
import type { OpenClawConfig } from "../../config/config.js";
|
||||
import { setActivePluginRegistry } from "../../plugins/runtime.js";
|
||||
import { createOutboundTestPlugin, createTestRegistry } from "../../test-utils/channel-plugins.js";
|
||||
import { isWhatsAppGroupJid, normalizeWhatsAppTarget } from "../../whatsapp/normalize.js";
|
||||
import { resolveOutboundTarget } from "./targets.js";
|
||||
|
||||
type TelegramTargetParts = {
|
||||
chatId: string;
|
||||
messageThreadId?: number;
|
||||
chatType: "direct" | "group" | "unknown";
|
||||
};
|
||||
|
||||
function parseTelegramTestTarget(raw: string): TelegramTargetParts {
|
||||
const trimmed = raw
|
||||
.trim()
|
||||
.replace(/^(telegram|tg):/i, "")
|
||||
.trim();
|
||||
const topicMatch = /^(.+?):topic:(\d+)$/u.exec(trimmed);
|
||||
if (topicMatch) {
|
||||
const chatId = topicMatch[1];
|
||||
return {
|
||||
chatId,
|
||||
messageThreadId: Number.parseInt(topicMatch[2], 10),
|
||||
chatType: chatId.startsWith("-") ? "group" : "direct",
|
||||
};
|
||||
}
|
||||
|
||||
const threadMatch = /^(.+):(\d+)$/u.exec(trimmed);
|
||||
if (threadMatch) {
|
||||
const chatId = threadMatch[1];
|
||||
return {
|
||||
chatId,
|
||||
messageThreadId: Number.parseInt(threadMatch[2], 10),
|
||||
chatType: chatId.startsWith("-") ? "group" : "direct",
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
chatId: trimmed,
|
||||
chatType: trimmed.startsWith("-") ? "group" : "direct",
|
||||
};
|
||||
}
|
||||
|
||||
const telegramMessaging = {
|
||||
parseExplicitTarget: ({ raw }: { raw: string }) => parseTelegramTestMessagingTarget(raw),
|
||||
};
|
||||
|
||||
export function inferTelegramTestChatType(to: string): "direct" | "group" | undefined {
|
||||
const chatType = parseTelegramTestTarget(to).chatType;
|
||||
return chatType === "unknown" ? undefined : chatType;
|
||||
}
|
||||
|
||||
export function parseTelegramTestMessagingTarget(raw: string): {
|
||||
to: string;
|
||||
threadId?: number;
|
||||
chatType?: "direct" | "group";
|
||||
} {
|
||||
const target = parseTelegramTestTarget(raw);
|
||||
return {
|
||||
to: target.chatId,
|
||||
threadId: target.messageThreadId,
|
||||
chatType: target.chatType === "unknown" ? undefined : target.chatType,
|
||||
};
|
||||
}
|
||||
|
||||
const whatsappMessaging = {
|
||||
inferTargetChatType: ({ to }: { to: string }) => {
|
||||
const normalized = normalizeWhatsAppTarget(to);
|
||||
if (!normalized) {
|
||||
return undefined;
|
||||
}
|
||||
return isWhatsAppGroupJid(normalized) ? ("group" as const) : ("direct" as const);
|
||||
},
|
||||
targetResolver: {
|
||||
hint: "<E.164|group JID>",
|
||||
},
|
||||
};
|
||||
|
||||
export const telegramOutboundStub: ChannelOutboundAdapter = {
|
||||
deliveryMode: "direct",
|
||||
};
|
||||
|
||||
export const whatsappOutboundStub: ChannelOutboundAdapter = {
|
||||
deliveryMode: "gateway",
|
||||
resolveTarget: ({ to }) => {
|
||||
const normalized = typeof to === "string" ? normalizeWhatsAppTarget(to) : undefined;
|
||||
if (normalized) {
|
||||
return { ok: true as const, to: normalized };
|
||||
}
|
||||
return {
|
||||
ok: false as const,
|
||||
error: new Error("WhatsApp target required"),
|
||||
};
|
||||
},
|
||||
};
|
||||
import { createTargetsTestRegistry } from "./targets.test-helpers.js";
|
||||
|
||||
export function installResolveOutboundTargetPluginRegistryHooks(): void {
|
||||
beforeEach(() => {
|
||||
setActivePluginRegistry(
|
||||
createTestRegistry([
|
||||
{
|
||||
pluginId: "whatsapp",
|
||||
plugin: {
|
||||
...createOutboundTestPlugin({
|
||||
id: "whatsapp",
|
||||
label: "WhatsApp",
|
||||
outbound: whatsappOutboundStub,
|
||||
messaging: whatsappMessaging,
|
||||
}),
|
||||
config: {
|
||||
listAccountIds: () => [],
|
||||
resolveDefaultTo: ({ cfg }: { cfg: OpenClawConfig }) =>
|
||||
typeof cfg.channels?.whatsapp?.defaultTo === "string"
|
||||
? cfg.channels.whatsapp.defaultTo
|
||||
: undefined,
|
||||
},
|
||||
},
|
||||
source: "test",
|
||||
},
|
||||
{
|
||||
pluginId: "telegram",
|
||||
plugin: {
|
||||
...createOutboundTestPlugin({
|
||||
id: "telegram",
|
||||
label: "Telegram",
|
||||
outbound: telegramOutboundStub,
|
||||
messaging: telegramMessaging,
|
||||
}),
|
||||
config: {
|
||||
listAccountIds: () => [],
|
||||
resolveDefaultTo: ({ cfg }: { cfg: OpenClawConfig }) =>
|
||||
typeof cfg.channels?.telegram?.defaultTo === "string"
|
||||
? cfg.channels.telegram.defaultTo
|
||||
: undefined,
|
||||
},
|
||||
},
|
||||
source: "test",
|
||||
},
|
||||
]),
|
||||
);
|
||||
setActivePluginRegistry(createTargetsTestRegistry());
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
setActivePluginRegistry(createTestRegistry());
|
||||
setActivePluginRegistry(createTargetsTestRegistry([]));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
177
src/infra/outbound/targets.test-helpers.ts
Normal file
177
src/infra/outbound/targets.test-helpers.ts
Normal file
@@ -0,0 +1,177 @@
|
||||
import type {
|
||||
ChannelMessagingAdapter,
|
||||
ChannelOutboundAdapter,
|
||||
ChannelPlugin,
|
||||
} from "../../channels/plugins/types.js";
|
||||
import type { OpenClawConfig } from "../../config/config.js";
|
||||
import { createTestRegistry } from "../../test-utils/channel-plugins.js";
|
||||
|
||||
function parseTelegramTargetForTest(raw: string): {
|
||||
chatId: string;
|
||||
messageThreadId?: number;
|
||||
chatType: "direct" | "group" | "unknown";
|
||||
} {
|
||||
const trimmed = raw.trim();
|
||||
const withoutPrefix = trimmed.replace(/^telegram:/i, "").trim();
|
||||
const topicMatch = withoutPrefix.match(/^(.*):topic:(\d+)$/i);
|
||||
const chatId = topicMatch?.[1]?.trim() || withoutPrefix;
|
||||
const messageThreadId = topicMatch?.[2] ? Number.parseInt(topicMatch[2], 10) : undefined;
|
||||
const numericId = chatId.startsWith("-") ? chatId.slice(1) : chatId;
|
||||
const chatType =
|
||||
/^\d+$/.test(numericId) && !chatId.startsWith("-100")
|
||||
? "direct"
|
||||
: chatId.startsWith("-")
|
||||
? "group"
|
||||
: "unknown";
|
||||
return { chatId, messageThreadId, chatType };
|
||||
}
|
||||
|
||||
function normalizeWhatsAppTargetForTest(raw: string): string | null {
|
||||
const trimmed = raw.trim().replace(/^whatsapp:/i, "").trim();
|
||||
if (!trimmed) {
|
||||
return null;
|
||||
}
|
||||
const lowered = trimmed.toLowerCase();
|
||||
if (/@g\.us$/u.test(lowered)) {
|
||||
const normalized = lowered.replace(/\s+/gu, "");
|
||||
return /^\d+@g\.us$/u.test(normalized) ? normalized : null;
|
||||
}
|
||||
const digits = trimmed.replace(/\D/gu, "");
|
||||
const normalized = digits ? `+${digits}` : "";
|
||||
return /^\+\d{7,15}$/u.test(normalized) ? normalized : null;
|
||||
}
|
||||
|
||||
function createWhatsAppResolveTarget(
|
||||
label = "WhatsApp",
|
||||
): ChannelOutboundAdapter["resolveTarget"] {
|
||||
return ({ to }) => {
|
||||
const normalized = to ? normalizeWhatsAppTargetForTest(to) : null;
|
||||
if (!normalized) {
|
||||
return { ok: false, error: new Error(`${label} target is required`) };
|
||||
}
|
||||
return { ok: true, to: normalized };
|
||||
};
|
||||
}
|
||||
|
||||
function createTelegramResolveTarget(label = "Telegram"): ChannelOutboundAdapter["resolveTarget"] {
|
||||
return ({ to }) => {
|
||||
const trimmed = to?.trim();
|
||||
if (!trimmed) {
|
||||
return { ok: false, error: new Error(`${label} target is required`) };
|
||||
}
|
||||
return { ok: true, to: parseTelegramTargetForTest(trimmed).chatId };
|
||||
};
|
||||
}
|
||||
|
||||
export const telegramMessagingForTest: ChannelMessagingAdapter = {
|
||||
parseExplicitTarget: ({ raw }) => {
|
||||
const target = parseTelegramTargetForTest(raw);
|
||||
return {
|
||||
to: target.chatId,
|
||||
threadId: target.messageThreadId,
|
||||
chatType: target.chatType === "unknown" ? undefined : target.chatType,
|
||||
};
|
||||
},
|
||||
inferTargetChatType: ({ to }) => {
|
||||
const target = parseTelegramTargetForTest(to);
|
||||
return target.chatType === "unknown" ? undefined : target.chatType;
|
||||
},
|
||||
};
|
||||
|
||||
export const whatsappMessagingForTest: ChannelMessagingAdapter = {
|
||||
inferTargetChatType: ({ to }) => {
|
||||
const normalized = normalizeWhatsAppTargetForTest(to);
|
||||
if (!normalized) {
|
||||
return undefined;
|
||||
}
|
||||
return normalized.endsWith("@g.us") ? "group" : "direct";
|
||||
},
|
||||
targetResolver: {
|
||||
hint: "<E.164|group JID>",
|
||||
},
|
||||
};
|
||||
|
||||
export function createTestChannelPlugin(params: {
|
||||
id: ChannelPlugin["id"];
|
||||
label?: string;
|
||||
outbound?: ChannelOutboundAdapter;
|
||||
messaging?: ChannelMessagingAdapter;
|
||||
resolveDefaultTo?: (params: { cfg: OpenClawConfig }) => string | undefined;
|
||||
}): ChannelPlugin {
|
||||
return {
|
||||
id: params.id,
|
||||
meta: {
|
||||
id: params.id,
|
||||
label: params.label ?? String(params.id),
|
||||
selectionLabel: params.label ?? String(params.id),
|
||||
docsPath: `/channels/${params.id}`,
|
||||
blurb: "test stub.",
|
||||
},
|
||||
capabilities: { chatTypes: ["direct", "group"] },
|
||||
config: {
|
||||
listAccountIds: () => [],
|
||||
resolveAccount: () => ({}),
|
||||
...(params.resolveDefaultTo
|
||||
? {
|
||||
resolveDefaultTo: params.resolveDefaultTo,
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
...(params.outbound ? { outbound: params.outbound } : {}),
|
||||
...(params.messaging ? { messaging: params.messaging } : {}),
|
||||
};
|
||||
}
|
||||
|
||||
export function createTelegramTestPlugin(): ChannelPlugin {
|
||||
return createTestChannelPlugin({
|
||||
id: "telegram",
|
||||
label: "Telegram",
|
||||
outbound: {
|
||||
deliveryMode: "direct",
|
||||
sendText: async () => ({ channel: "telegram", messageId: "telegram-msg" }),
|
||||
resolveTarget: createTelegramResolveTarget(),
|
||||
},
|
||||
messaging: telegramMessagingForTest,
|
||||
resolveDefaultTo: ({ cfg }) =>
|
||||
typeof cfg.channels?.telegram?.defaultTo === "string" ? cfg.channels.telegram.defaultTo : undefined,
|
||||
});
|
||||
}
|
||||
|
||||
export function createWhatsAppTestPlugin(): ChannelPlugin {
|
||||
return createTestChannelPlugin({
|
||||
id: "whatsapp",
|
||||
label: "WhatsApp",
|
||||
outbound: {
|
||||
deliveryMode: "direct",
|
||||
sendText: async () => ({ channel: "whatsapp", messageId: "whatsapp-msg" }),
|
||||
resolveTarget: createWhatsAppResolveTarget(),
|
||||
},
|
||||
messaging: whatsappMessagingForTest,
|
||||
resolveDefaultTo: ({ cfg }) =>
|
||||
typeof cfg.channels?.whatsapp?.defaultTo === "string" ? cfg.channels.whatsapp.defaultTo : undefined,
|
||||
});
|
||||
}
|
||||
|
||||
export function createNoopOutboundChannelPlugin(
|
||||
id: "discord" | "imessage" | "slack",
|
||||
): ChannelPlugin {
|
||||
return createTestChannelPlugin({
|
||||
id,
|
||||
outbound: {
|
||||
deliveryMode: "direct",
|
||||
sendText: async () => ({ channel: id, messageId: `${id}-msg` }),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export function createTargetsTestRegistry(
|
||||
plugins: ChannelPlugin[] = [createWhatsAppTestPlugin(), createTelegramTestPlugin()],
|
||||
) {
|
||||
return createTestRegistry(
|
||||
plugins.map((plugin) => ({
|
||||
pluginId: plugin.id,
|
||||
plugin,
|
||||
source: "test",
|
||||
})),
|
||||
);
|
||||
}
|
||||
@@ -3,8 +3,6 @@ import type { ChannelOutboundAdapter } from "../../channels/plugins/types.js";
|
||||
import type { OpenClawConfig } from "../../config/config.js";
|
||||
import type { SessionEntry } from "../../config/sessions/types.js";
|
||||
import { setActivePluginRegistry } from "../../plugins/runtime.js";
|
||||
import { createOutboundTestPlugin, createTestRegistry } from "../../test-utils/channel-plugins.js";
|
||||
import { isWhatsAppGroupJid, normalizeWhatsAppTarget } from "../../whatsapp/normalize.js";
|
||||
import {
|
||||
resolveHeartbeatDeliveryTarget,
|
||||
resolveOutboundTarget,
|
||||
@@ -12,31 +10,19 @@ import {
|
||||
} from "./targets.js";
|
||||
import type { SessionDeliveryTarget } from "./targets.js";
|
||||
import {
|
||||
inferTelegramTestChatType,
|
||||
installResolveOutboundTargetPluginRegistryHooks,
|
||||
parseTelegramTestMessagingTarget,
|
||||
runResolveOutboundTargetCoreTests,
|
||||
telegramOutboundStub,
|
||||
whatsappOutboundStub,
|
||||
} from "./targets.shared-test.js";
|
||||
import {
|
||||
createNoopOutboundChannelPlugin,
|
||||
createTargetsTestRegistry,
|
||||
createTelegramTestPlugin,
|
||||
createWhatsAppTestPlugin,
|
||||
telegramMessagingForTest,
|
||||
} from "./targets.test-helpers.js";
|
||||
|
||||
runResolveOutboundTargetCoreTests();
|
||||
|
||||
const telegramMessaging = {
|
||||
parseExplicitTarget: ({ raw }: { raw: string }) => parseTelegramTestMessagingTarget(raw),
|
||||
inferTargetChatType: ({ to }: { to: string }) => inferTelegramTestChatType(to),
|
||||
};
|
||||
|
||||
const whatsappMessaging = {
|
||||
inferTargetChatType: ({ to }: { to: string }) => {
|
||||
const normalized = normalizeWhatsAppTarget(to);
|
||||
if (!normalized) {
|
||||
return undefined;
|
||||
}
|
||||
return isWhatsAppGroupJid(normalized) ? ("group" as const) : ("direct" as const);
|
||||
},
|
||||
};
|
||||
|
||||
const noopOutbound = (channel: "discord" | "imessage" | "slack"): ChannelOutboundAdapter => ({
|
||||
deliveryMode: "direct",
|
||||
sendText: async () => ({ channel, messageId: `${channel}-msg` }),
|
||||
@@ -44,40 +30,21 @@ const noopOutbound = (channel: "discord" | "imessage" | "slack"): ChannelOutboun
|
||||
|
||||
beforeEach(() => {
|
||||
setActivePluginRegistry(
|
||||
createTestRegistry([
|
||||
createTargetsTestRegistry([
|
||||
{
|
||||
pluginId: "discord",
|
||||
plugin: createOutboundTestPlugin({ id: "discord", outbound: noopOutbound("discord") }),
|
||||
source: "test",
|
||||
...createNoopOutboundChannelPlugin("discord"),
|
||||
outbound: noopOutbound("discord"),
|
||||
},
|
||||
{
|
||||
pluginId: "imessage",
|
||||
plugin: createOutboundTestPlugin({ id: "imessage", outbound: noopOutbound("imessage") }),
|
||||
source: "test",
|
||||
...createNoopOutboundChannelPlugin("imessage"),
|
||||
outbound: noopOutbound("imessage"),
|
||||
},
|
||||
{
|
||||
pluginId: "slack",
|
||||
plugin: createOutboundTestPlugin({ id: "slack", outbound: noopOutbound("slack") }),
|
||||
source: "test",
|
||||
},
|
||||
{
|
||||
pluginId: "telegram",
|
||||
plugin: createOutboundTestPlugin({
|
||||
id: "telegram",
|
||||
outbound: telegramOutboundStub,
|
||||
messaging: telegramMessaging,
|
||||
}),
|
||||
source: "test",
|
||||
},
|
||||
{
|
||||
pluginId: "whatsapp",
|
||||
plugin: createOutboundTestPlugin({
|
||||
id: "whatsapp",
|
||||
outbound: whatsappOutboundStub,
|
||||
messaging: whatsappMessaging,
|
||||
}),
|
||||
source: "test",
|
||||
...createNoopOutboundChannelPlugin("slack"),
|
||||
outbound: noopOutbound("slack"),
|
||||
},
|
||||
createTelegramTestPlugin(),
|
||||
createWhatsAppTestPlugin(),
|
||||
]),
|
||||
);
|
||||
});
|
||||
@@ -135,7 +102,7 @@ describe("resolveOutboundTarget defaultTo config fallback", () => {
|
||||
});
|
||||
|
||||
it("falls back to the active registry when the cached channel map is stale", () => {
|
||||
const registry = createTestRegistry([]);
|
||||
const registry = createTargetsTestRegistry([]);
|
||||
setActivePluginRegistry(registry, "stale-registry-test");
|
||||
|
||||
// Warm the cached channel map before mutating the registry in place.
|
||||
@@ -145,11 +112,7 @@ describe("resolveOutboundTarget defaultTo config fallback", () => {
|
||||
|
||||
registry.channels.push({
|
||||
pluginId: "telegram",
|
||||
plugin: createOutboundTestPlugin({
|
||||
id: "telegram",
|
||||
outbound: telegramOutboundStub,
|
||||
messaging: telegramMessaging,
|
||||
}),
|
||||
plugin: createTelegramTestPlugin(),
|
||||
source: "test",
|
||||
});
|
||||
|
||||
@@ -380,7 +343,7 @@ describe("resolveSessionDeliveryTarget", () => {
|
||||
});
|
||||
|
||||
it("keeps raw :topic: targets when the telegram plugin registry is unavailable", () => {
|
||||
setActivePluginRegistry(createTestRegistry([]));
|
||||
setActivePluginRegistry(createTargetsTestRegistry([]));
|
||||
|
||||
const resolved = resolveSessionDeliveryTarget({
|
||||
entry: {
|
||||
|
||||
@@ -7,12 +7,26 @@ import type {
|
||||
SessionBindingAdapter,
|
||||
SessionBindingRecord,
|
||||
} from "../infra/outbound/session-binding-service.js";
|
||||
import { createEmptyPluginRegistry } from "./registry-empty.js";
|
||||
import { setActivePluginRegistry } from "./runtime.js";
|
||||
|
||||
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-plugin-binding-"));
|
||||
const approvalsPath = path.join(tempRoot, "plugin-binding-approvals.json");
|
||||
|
||||
type PluginBindingRegistryStub = {
|
||||
conversationBindingResolvedHandlers: Array<{
|
||||
pluginId: string;
|
||||
pluginRoot?: string;
|
||||
handler: (event: unknown) => void | Promise<void>;
|
||||
source: string;
|
||||
rootDir?: string;
|
||||
}>;
|
||||
};
|
||||
|
||||
function createEmptyPluginRegistry(): PluginBindingRegistryStub {
|
||||
return {
|
||||
conversationBindingResolvedHandlers: [],
|
||||
};
|
||||
}
|
||||
|
||||
const sessionBindingState = vi.hoisted(() => {
|
||||
const records = new Map<string, SessionBindingRecord>();
|
||||
let nextId = 1;
|
||||
@@ -83,6 +97,10 @@ const sessionBindingState = vi.hoisted(() => {
|
||||
};
|
||||
});
|
||||
|
||||
const pluginRuntimeState = vi.hoisted(() => ({
|
||||
registry: createEmptyPluginRegistry() as PluginBindingRegistryStub,
|
||||
}));
|
||||
|
||||
vi.mock("../infra/home-dir.js", async (importOriginal) => {
|
||||
const actual = await importOriginal<typeof import("../infra/home-dir.js")>();
|
||||
return {
|
||||
@@ -96,6 +114,13 @@ vi.mock("../infra/home-dir.js", async (importOriginal) => {
|
||||
};
|
||||
});
|
||||
|
||||
vi.mock("./runtime.js", () => ({
|
||||
getActivePluginRegistry: () => pluginRuntimeState.registry,
|
||||
setActivePluginRegistry: (registry: PluginBindingRegistryStub) => {
|
||||
pluginRuntimeState.registry = registry;
|
||||
},
|
||||
}));
|
||||
|
||||
const {
|
||||
__testing,
|
||||
buildPluginBindingApprovalCustomId,
|
||||
@@ -107,6 +132,7 @@ const {
|
||||
} = await import("./conversation-binding.js");
|
||||
const { registerSessionBindingAdapter, unregisterSessionBindingAdapter } =
|
||||
await import("../infra/outbound/session-binding-service.js");
|
||||
const { setActivePluginRegistry } = await import("./runtime.js");
|
||||
|
||||
type PluginBindingRequest = Awaited<ReturnType<typeof requestPluginConversationBinding>>;
|
||||
type ConversationBindingModule = typeof import("./conversation-binding.js");
|
||||
|
||||
845
test/fixtures/test-parallel.behavior.json
vendored
845
test/fixtures/test-parallel.behavior.json
vendored
@@ -1,452 +1,321 @@
|
||||
{
|
||||
"base": {
|
||||
"threadPinned": [
|
||||
{
|
||||
"file": "src/commands/backup.test.ts",
|
||||
"reason": "Measured ~16% faster under threads than forks on base config after removing process.chdir() from the test."
|
||||
},
|
||||
{
|
||||
"file": "src/auto-reply/reply/commands-acp/install-hints.test.ts",
|
||||
"reason": "Measured ~35% faster under threads than forks on base config after removing process.chdir() from the test."
|
||||
},
|
||||
{
|
||||
"file": "src/agents/pi-extensions/compaction-safeguard.test.ts",
|
||||
"reason": "Measured ~27% faster under threads than forks on base config after removing process.chdir() from the test."
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": {
|
||||
"isolated": [
|
||||
{
|
||||
"file": "src/plugins/contracts/runtime.contract.test.ts",
|
||||
"reason": "Async runtime imports + provider refresh seams; keep out of the shared lane."
|
||||
},
|
||||
{
|
||||
"file": "src/security/temp-path-guard.test.ts",
|
||||
"reason": "Filesystem guard scans are sensitive to contention."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/git-commit.test.ts",
|
||||
"reason": "Mutates process.cwd() and core loader seams."
|
||||
},
|
||||
{
|
||||
"file": "src/config/doc-baseline.integration.test.ts",
|
||||
"reason": "Rebuilds bundled config baselines through many channel schema subprocesses; keep out of the shared lane."
|
||||
},
|
||||
{
|
||||
"file": "extensions/imessage/src/monitor.shutdown.unhandled-rejection.test.ts",
|
||||
"reason": "Touches process-level unhandledRejection listeners."
|
||||
},
|
||||
{
|
||||
"file": "src/secrets/runtime.integration.test.ts",
|
||||
"reason": "Passes alone but flakes in the shared fork lane; keep it in a dedicated fork worker."
|
||||
}
|
||||
],
|
||||
"forkBatched": [],
|
||||
"threadPinned": [
|
||||
"singletonIsolated": [
|
||||
{
|
||||
"file": "test/git-hooks-pre-commit.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on base config while keeping the file green."
|
||||
"file": "src/cli/command-secret-gateway.test.ts",
|
||||
"reason": "Clean in isolation, but can hang after sharing the broad lane."
|
||||
},
|
||||
{
|
||||
"file": "test/web-search-provider-boundary.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on base config while keeping the boundary checks green."
|
||||
},
|
||||
{
|
||||
"file": "test/scripts/test-runner-manifest.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on base config while keeping the manifest routing checks green."
|
||||
},
|
||||
{
|
||||
"file": "test/architecture-smells.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on base config while keeping the architecture guardrails green."
|
||||
},
|
||||
{
|
||||
"file": "test/scripts/test-extension.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on base config while keeping the extension script checks green."
|
||||
},
|
||||
{
|
||||
"file": "test/vitest-unit-config.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on base config while keeping the Vitest config checks green."
|
||||
},
|
||||
{
|
||||
"file": "test/release-check.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on base config while keeping the release checks green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/secrets-cli.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on base config while keeping secrets CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/plugin-registry.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on base config while keeping plugin registry CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/route.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on base config while keeping route CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/exec-approvals-cli.test.ts",
|
||||
"reason": "Measured ~15% faster under threads than forks on base config while keeping approvals CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/browser-cli-manage.timeout-option.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on base config while keeping browser manage timeout coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/browser-cli-manage.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on base config while keeping browser manage coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/deps.test.ts",
|
||||
"reason": "Measured ~81% faster under threads than forks on base config while keeping dependency checks green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/nodes-cli.coverage.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on base config while keeping nodes CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/daemon-cli/restart-health.test.ts",
|
||||
"reason": "Measured ~35% faster under threads than forks on base config while keeping daemon restart health coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/program/config-guard.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on base config while keeping program config guard coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/update-cli/restart-helper.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on base config while keeping update restart helper coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/security-cli.test.ts",
|
||||
"reason": "Measured ~31% faster under threads than forks on base config while keeping security CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/channel-options.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on base config while keeping channel options coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/log-level-option.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on base config while keeping log level option coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/plugin-install-plan.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on base config while keeping plugin install planning coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/memory-cli.test.ts",
|
||||
"reason": "Measured ~50% faster under threads than forks on base config while keeping memory CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/program.nodes-test-helpers.test.ts",
|
||||
"reason": "Measured ~22% faster under threads than forks on base config while keeping nodes test helper coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/skills-cli.test.ts",
|
||||
"reason": "Measured ~27% faster under threads than forks on base config while keeping skills CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/run-main.exit.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on base config while keeping run-main exit coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/completion-fish.test.ts",
|
||||
"reason": "Measured ~41% faster under threads than forks on base config while keeping fish completion coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/config-set-mode.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on base config while keeping config set mode coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/program/build-program.version-alias.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on base config while keeping version alias coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/program/register.agent.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on base config while keeping register agent coverage green."
|
||||
},
|
||||
{
|
||||
"file": "test/scripts/test-parallel.test.ts",
|
||||
"reason": "Measured ~44% faster under threads than forks on base config while keeping the parallel wrapper checks green."
|
||||
},
|
||||
{
|
||||
"file": "test/scripts/test-find-thread-candidates.test.ts",
|
||||
"reason": "Measured ~19% faster under threads than forks on base config while keeping the thread candidate helper checks green."
|
||||
},
|
||||
{
|
||||
"file": "test/openclaw-npm-release-check.test.ts",
|
||||
"reason": "Measured ~19% faster under threads than forks on base config while keeping the npm release checks green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/pairing-cli.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on base config while keeping pairing CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/daemon-cli.coverage.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on base config while keeping daemon CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/config-set-input.test.ts",
|
||||
"reason": "Measured ~43% faster under threads than forks on base config while keeping config set input coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/cron-cli.test.ts",
|
||||
"reason": "Measured ~18% faster under threads than forks on base config while keeping cron CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/plugins-config.test.ts",
|
||||
"reason": "Measured ~15% faster under threads than forks on base config while keeping plugin config coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/program/register.configure.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on base config while keeping register configure coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/program/command-tree.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on base config while keeping command tree coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/program/register.subclis.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on base config while keeping sub-CLI registration coverage green."
|
||||
},
|
||||
{
|
||||
"file": "test/vitest-unit-paths.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on base config while keeping unit path checks green."
|
||||
},
|
||||
{
|
||||
"file": "test/scripts/check-channel-agnostic-boundaries.test.ts",
|
||||
"reason": "Measured ~29% faster under threads than forks on base config while keeping channel-agnostic boundary checks green."
|
||||
},
|
||||
{
|
||||
"file": "test/plugin-npm-release.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on base config while keeping npm release checks green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/daemon-cli-compat.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on base config while keeping daemon CLI compatibility coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/program/command-registry.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on base config while keeping command registry coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/program.force.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on base config while keeping force option coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/cli-utils.test.ts",
|
||||
"reason": "Measured ~15% faster under threads than forks on base config while keeping CLI utility coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/devices-cli.test.ts",
|
||||
"reason": "Measured ~21% faster under threads than forks on base config while keeping devices CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/message-secret-scope.test.ts",
|
||||
"reason": "Measured ~16% faster under threads than forks on base config while keeping message secret scope coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/banner.test.ts",
|
||||
"reason": "Measured ~30% faster under threads than forks on base config while keeping banner rendering coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/gateway-cli.coverage.test.ts",
|
||||
"reason": "Measured ~18% faster under threads than forks on base config while keeping gateway CLI coverage green."
|
||||
},
|
||||
{
|
||||
"file": "src/channels/plugins/actions/actions.test.ts",
|
||||
"reason": "Terminates cleanly under threads, but not process forks on this host."
|
||||
},
|
||||
{
|
||||
"file": "test/extension-plugin-sdk-boundary.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/hooks/install.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/hooks/plugin-hooks.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/hooks/hooks-install.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/hooks/workspace.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/hooks/loader.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/conversation-binding.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/hooks/bundled/session-memory/handler.test.ts",
|
||||
"reason": "Measured ~16% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugin-sdk/subpaths.test.ts",
|
||||
"reason": "Measured ~23% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugin-sdk/channel-import-guardrails.test.ts",
|
||||
"reason": "Measured ~30% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/contracts/wizard.contract.test.ts",
|
||||
"reason": "Measured ~9% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/contracts/auth-choice.contract.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/channels/plugins/contracts/outbound-payload.contract.test.ts",
|
||||
"reason": "Measured ~15% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/install.test.ts",
|
||||
"reason": "Measured ~18% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/interactive.test.ts",
|
||||
"reason": "Measured ~9% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/marketplace.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/status.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/bundled-dir.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/sdk-alias.test.ts",
|
||||
"reason": "Measured ~17% faster under threads than forks on this host after removing process.chdir() from the test."
|
||||
},
|
||||
{
|
||||
"file": "src/config/config.plugin-validation.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/config/config.web-search-provider.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/config/config-misc.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/config/doc-baseline.integration.test.ts",
|
||||
"reason": "Builds the full bundled config schema graph and is safer outside the shared unit-fast heap."
|
||||
},
|
||||
{
|
||||
"file": "src/config/schema.help.quality.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
"reason": "Help quality coverage loads a broad schema/help data graph and retained a top shared unit-fast heap spike on Linux CI."
|
||||
},
|
||||
{
|
||||
"file": "src/config/sessions/store.pruning.integration.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/secrets/runtime.test.ts",
|
||||
"reason": "Secrets runtime coverage retained the largest unit-fast heap spike in CI and is safer outside the shared lane."
|
||||
},
|
||||
{
|
||||
"file": "src/config/sessions.test.ts",
|
||||
"reason": "Measured ~16% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/secrets/runtime.integration.test.ts",
|
||||
"reason": "Secrets runtime activation/write-through integration coverage is CPU-heavy and safer outside the shared unit-fast lane."
|
||||
},
|
||||
{
|
||||
"file": "src/config/sessions/store.pruning.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/memory/index.test.ts",
|
||||
"reason": "Memory index coverage retained nearly 1 GiB in unit-fast on Linux CI and is safer in its own fork."
|
||||
},
|
||||
{
|
||||
"file": "src/config/sessions/sessions.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/plugins/http-registry.test.ts",
|
||||
"reason": "Plugin HTTP registry coverage retained a broad plugin graph in unit-fast and is safer outside the shared lane."
|
||||
},
|
||||
{
|
||||
"file": "src/config/sessions/targets.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/infra/channel-summary.test.ts",
|
||||
"reason": "Channel summary coverage retained a large channel/plugin graph in unit-fast on Linux CI."
|
||||
},
|
||||
{
|
||||
"file": "src/config/config.nix-integration-u3-u5-u9.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/config/redact-snapshot.test.ts",
|
||||
"reason": "Snapshot redaction coverage produced a large retained heap jump in unit-fast on Linux CI."
|
||||
},
|
||||
{
|
||||
"file": "src/config/config.legacy-config-detection.accepts-imessage-dmpolicy.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/config/redact-snapshot.restore.test.ts",
|
||||
"reason": "Snapshot restore coverage retains a broad schema/redaction graph and is safer outside the shared lane."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/isolated-agent.uses-last-non-empty-agent-text-as.test.ts",
|
||||
"reason": "Measured ~15% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/config/redact-snapshot.schema.test.ts",
|
||||
"reason": "Schema-backed redaction round-trip coverage loads the full config schema graph and is safer outside the shared lane."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/isolated-agent.skips-delivery-without-whatsapp-recipient-besteffortdeliver-true.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/infra/outbound/message-action-runner.media.test.ts",
|
||||
"reason": "Outbound media action coverage retained a large media/plugin graph in unit-fast."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/isolated-agent/run.cron-model-override.test.ts",
|
||||
"reason": "Measured ~25% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/media-understanding/apply.echo-transcript.test.ts",
|
||||
"reason": "Media understanding echo transcript coverage retained a large processing graph in unit-fast."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/isolated-agent/run.skill-filter.test.ts",
|
||||
"reason": "Measured ~15% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/plugin-sdk/index.test.ts",
|
||||
"reason": "Plugin SDK index coverage retained a broad export graph in unit-fast and is safer outside the shared lane."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/isolated-agent/run.owner-auth.test.ts",
|
||||
"reason": "Measured ~19% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/plugin-sdk/index.bundle.test.ts",
|
||||
"reason": "Plugin SDK bundle validation builds and imports the full bundled export graph and is safer outside the shared lane."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/isolated-agent.lane.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/config/sessions.cache.test.ts",
|
||||
"reason": "Session cache coverage retained a large config/session graph in unit-fast on Linux CI."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/isolated-agent.direct-delivery-forum-topics.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/secrets/runtime.coverage.test.ts",
|
||||
"reason": "Secrets runtime coverage tests retained substantial heap in unit-fast and are safer isolated."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/isolated-agent.auth-profile-propagation.test.ts",
|
||||
"reason": "Measured ~22% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/channels/plugins/contracts/registry.contract.test.ts",
|
||||
"reason": "Plugin contract registry coverage retained a large cross-plugin graph in both failing unit-fast shards."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/isolated-agent.delivers-response-has-heartbeat-ok-but-includes.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/memory/manager.get-concurrency.test.ts",
|
||||
"reason": "Memory manager cache concurrency coverage can spike shared unit-fast heap on Linux Node 24."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/isolated-agent/delivery-dispatch.named-agent.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/memory/manager.vector-dedupe.test.ts",
|
||||
"reason": "Vector dedupe coverage exercises the memory manager/sqlite stack and is safer outside shared unit-fast forks."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/isolated-agent.subagent-model.test.ts",
|
||||
"reason": "Measured ~21% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/memory/manager.watcher-config.test.ts",
|
||||
"reason": "Watcher config coverage reuses memory manager caches and is safer outside shared unit-fast forks."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/service.store-load-invalid-main-job.test.ts",
|
||||
"reason": "Measured ~16% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/memory/manager.embedding-batches.test.ts",
|
||||
"reason": "Embedding batch coverage inflates memory manager state and is safer outside shared unit-fast forks."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/service.store-migration.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/memory/manager.readonly-recovery.test.ts",
|
||||
"reason": "Readonly recovery coverage exercises sqlite reopen flows and is safer outside shared unit-fast forks."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/service.failure-alert.test.ts",
|
||||
"reason": "Measured ~17% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/acp/persistent-bindings.test.ts",
|
||||
"reason": "Persistent bindings coverage retained a large unit-fast heap spike on Linux CI and is safer outside the shared lane."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/service.persists-delivered-status.test.ts",
|
||||
"reason": "Measured ~15% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/channels/plugins/setup-wizard-helpers.test.ts",
|
||||
"reason": "Setup wizard helper coverage retained the largest shared unit-fast heap spike on Linux Node 24 CI."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/session-reaper.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/cli/config-cli.integration.test.ts",
|
||||
"reason": "Config CLI integration coverage retained a large shared unit-fast heap spike on Linux CI."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/service.session-reaper-in-finally.test.ts",
|
||||
"reason": "Measured ~21% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/cli/config-cli.test.ts",
|
||||
"reason": "Config CLI coverage retained a large shared unit-fast heap spike on Linux Node 24 CI."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/loader.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/cli/plugins-cli.test.ts",
|
||||
"reason": "Plugins CLI coverage retained a broad plugin graph in shared unit-fast forks on Linux CI."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/discovery.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/config/plugin-auto-enable.test.ts",
|
||||
"reason": "Plugin auto-enable coverage retained a large shared unit-fast heap spike on Linux Node 22 CI."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/manifest-registry.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/cron/service.runs-one-shot-main-job-disables-it.test.ts",
|
||||
"reason": "One-shot cron service coverage retained a top shared unit-fast heap spike in the March 19, 2026 Linux Node 22 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/providers.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/cron/isolated-agent.direct-delivery-core-channels.test.ts",
|
||||
"reason": "Direct-delivery isolated-agent coverage retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/stage-bundled-plugin-runtime.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
"file": "src/cron/service.issue-regressions.test.ts",
|
||||
"reason": "Issue regression cron coverage retained the largest shared unit-fast heap spike in the March 20, 2026 Linux Node 22 and Node 24 OOM lanes."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/store.test.ts",
|
||||
"reason": "Cron store coverage retained a large shared unit-fast heap spike on Linux Node 24 CI."
|
||||
},
|
||||
{
|
||||
"file": "src/context-engine/context-engine.test.ts",
|
||||
"reason": "Context-engine coverage retained the largest shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 1 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/acp/control-plane/manager.test.ts",
|
||||
"reason": "ACP control-plane manager coverage retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 22 and Node 24 OOM lanes."
|
||||
},
|
||||
{
|
||||
"file": "src/acp/translator.stop-reason.test.ts",
|
||||
"reason": "ACP translator stop-reason coverage retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 2 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/exec-approval-forwarder.test.ts",
|
||||
"reason": "Exec approval forwarder coverage retained a top shared unit-fast heap spike in the March 19, 2026 Linux Node 22 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/restart-stale-pids.test.ts",
|
||||
"reason": "Restart-stale-pids coverage retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 1 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/heartbeat-runner.respects-ackmaxchars-heartbeat-acks.test.ts",
|
||||
"reason": "Heartbeat ack max chars coverage retained a recurring shared unit-fast heap spike across Linux CI lanes."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/heartbeat-runner.returns-default-unset.test.ts",
|
||||
"reason": "Heartbeat default-unset coverage retained a large shared unit-fast heap spike on Linux Node 22 CI."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/heartbeat-runner.ghost-reminder.test.ts",
|
||||
"reason": "Mocks jiti at file scope, so it is safer outside shared Vitest workers."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/heartbeat-runner.transcript-prune.test.ts",
|
||||
"reason": "Mocks jiti at file scope, so it is safer outside shared Vitest workers."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/heartbeat-runner.sender-prefers-delivery-target.test.ts",
|
||||
"reason": "Mocks jiti at file scope, so it is safer outside shared Vitest workers."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/heartbeat-runner.model-override.test.ts",
|
||||
"reason": "Mocks jiti at file scope, so it is safer outside shared Vitest workers."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/loader.git-path-regression.test.ts",
|
||||
"reason": "Constructs a real Jiti boundary and is safer outside shared workers that may have mocked jiti earlier."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/outbound/outbound-session.test.ts",
|
||||
"reason": "Outbound session coverage retained a large shared unit-fast heap spike on Linux Node 22 CI."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/outbound/payloads.test.ts",
|
||||
"reason": "Outbound payload coverage retained a large shared unit-fast heap spike on Linux Node 24 CI."
|
||||
},
|
||||
{
|
||||
"file": "src/memory/manager.mistral-provider.test.ts",
|
||||
"reason": "Mistral provider coverage retained a large shared unit-fast heap spike on Linux Node 24 CI."
|
||||
},
|
||||
{
|
||||
"file": "src/memory/manager.batch.test.ts",
|
||||
"reason": "Memory manager batch coverage retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 22 and Node 24 OOM lanes."
|
||||
},
|
||||
{
|
||||
"file": "src/memory/qmd-manager.test.ts",
|
||||
"reason": "QMD manager coverage retained recurring shared unit-fast heap spikes across Linux CI lanes."
|
||||
},
|
||||
{
|
||||
"file": "src/media-understanding/providers/image.test.ts",
|
||||
"reason": "Image provider coverage retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 2 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/contracts/auth.contract.test.ts",
|
||||
"reason": "Plugin auth contract coverage retained a large shared unit-fast heap spike on Linux Node 24 CI."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/contracts/discovery.contract.test.ts",
|
||||
"reason": "Plugin discovery contract coverage retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 1 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/hooks.phase-hooks.test.ts",
|
||||
"reason": "Phase hooks coverage retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 2 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/channels/plugins/plugins-core.test.ts",
|
||||
"reason": "Core plugin coverage retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 22 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/secrets/apply.test.ts",
|
||||
"reason": "Secrets apply coverage retained a large shared unit-fast heap spike on Linux Node 22 CI."
|
||||
},
|
||||
{
|
||||
"file": "src/tui/tui-command-handlers.test.ts",
|
||||
"reason": "TUI command handler coverage retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 2 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/node-host/invoke-system-run.test.ts",
|
||||
"reason": "Missing from unit timings and retained the largest shared unit-fast heap spike across the March 20, 2026 Linux Node 22 and Node 24 OOM lanes."
|
||||
},
|
||||
{
|
||||
"file": "src/media-understanding/apply.test.ts",
|
||||
"reason": "Missing from unit timings and retained a top shared unit-fast heap spike across the March 20, 2026 Linux Node 22 and Node 24 OOM lanes."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/commands.test.ts",
|
||||
"reason": "Missing from unit timings and retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 22 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/outbound/message-action-runner.plugin-dispatch.test.ts",
|
||||
"reason": "Missing from unit timings and retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 22 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/acp/translator.session-rate-limit.test.ts",
|
||||
"reason": "Missing from unit timings and retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 22 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/config/schema.hints.test.ts",
|
||||
"reason": "Missing from unit timings and retained a recurring shared unit-fast heap spike across the March 20, 2026 Linux Node 22 and Node 24 OOM lanes."
|
||||
},
|
||||
{
|
||||
"file": "src/tui/tui-event-handlers.test.ts",
|
||||
"reason": "Missing from unit timings and retained the largest shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 1 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/memory/manager.read-file.test.ts",
|
||||
"reason": "Missing from unit timings and retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 1 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/plugin-sdk/webhook-targets.test.ts",
|
||||
"reason": "Missing from unit timings and retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 1 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/daemon/systemd.test.ts",
|
||||
"reason": "Missing from unit timings and retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 1 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/isolated-agent/delivery-target.test.ts",
|
||||
"reason": "Missing from unit timings and retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 1 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/delivery.test.ts",
|
||||
"reason": "Missing from unit timings and retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 2 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/memory/manager.sync-errors-do-not-crash.test.ts",
|
||||
"reason": "Missing from unit timings and retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 2 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/tui/tui.test.ts",
|
||||
"reason": "Missing from unit timings and retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 2 OOM lane."
|
||||
},
|
||||
{
|
||||
"file": "src/cron/service.every-jobs-fire.test.ts",
|
||||
"reason": "Missing from unit timings and retained a top shared unit-fast heap spike in the March 20, 2026 Linux Node 24 shard 2 OOM lane."
|
||||
}
|
||||
],
|
||||
"threadSingleton": [
|
||||
{
|
||||
"file": "src/channels/plugins/actions/actions.test.ts",
|
||||
"reason": "Terminates cleanly under threads, but not process forks on this host."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/outbound/deliver.test.ts",
|
||||
@@ -468,226 +337,16 @@
|
||||
"file": "src/infra/outbound/message-action-runner.context.test.ts",
|
||||
"reason": "Terminates cleanly under threads, but not process forks on this host."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/provider-usage.test.ts",
|
||||
"reason": "Measured ~17% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/git-commit.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host after removing process.chdir() from related thread-blocking tests."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/provider-usage.auth.normalizes-keys.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/provider-usage.auth.plugin.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/provider-usage.load.plugin.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/outbound/targets.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/outbound/agent-delivery.test.ts",
|
||||
"reason": "Measured ~17% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/outbound/outbound-policy.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/outbound/outbound.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/update-runner.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/device-pairing.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/fs-pinned-write-helper.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/run-node.test.ts",
|
||||
"reason": "Measured ~9% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/fs-safe.test.ts",
|
||||
"reason": "Measured ~17% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/archive-staging.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/state-migrations.test.ts",
|
||||
"reason": "Measured ~17% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/matrix-legacy-crypto.test.ts",
|
||||
"reason": "Measured ~15% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/infra/matrix-migration-config.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/media/store.outside-workspace.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/media/input-files.fetch-guard.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/config/io.write-config.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/acp/server.startup.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/acp/client.test.ts",
|
||||
"reason": "Measured ~18% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/acp/translator.cancel-scoping.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/node-host/invoke-browser.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/node-host/invoke-system-run-plan.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/daemon-cli/install.integration.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/mcp-cli.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/channels/channels-misc.test.ts",
|
||||
"reason": "Measured ~12% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/channels/plugins/contracts/registry-backed.contract.test.ts",
|
||||
"reason": "Measured ~19% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/pairing/setup-code.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/daemon/schtasks.startup-fallback.test.ts",
|
||||
"reason": "Measured ~15% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/memory/embeddings.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/memory/batch-gemini.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/memory/embeddings-voyage.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/canvas-host/server.test.ts",
|
||||
"reason": "Measured ~10% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/web-search-providers.runtime.test.ts",
|
||||
"reason": "Measured ~17% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/plugins/contracts/registry.contract.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/media-understanding/runtime.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/media-understanding/resolve.test.ts",
|
||||
"reason": "Measured ~9% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/media-understanding/runner.skip-tiny-audio.test.ts",
|
||||
"reason": "Measured ~23% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/media-understanding/runner.proxy.test.ts",
|
||||
"reason": "Measured ~55% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/media-understanding/runner.auto-audio.test.ts",
|
||||
"reason": "Measured ~23% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/media-understanding/runner.video.test.ts",
|
||||
"reason": "Measured ~25% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/secrets/audit.test.ts",
|
||||
"reason": "Measured ~14% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/secrets/runtime-web-tools.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/entry.version-fast-path.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/security/audit.test.ts",
|
||||
"reason": "Measured ~40% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "ui/src/ui/views/chat.test.ts",
|
||||
"reason": "Measured ~25% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/tui/tui-session-actions.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/tui/gateway-chat.test.ts",
|
||||
"reason": "Measured ~11% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/program/preaction.test.ts",
|
||||
"reason": "Measured ~21% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/cli/program.smoke.test.ts",
|
||||
"reason": "Measured ~13% faster under threads than forks on this host while keeping the file green."
|
||||
},
|
||||
{
|
||||
"file": "src/tts/tts.test.ts",
|
||||
"reason": "Terminates cleanly under threads, but not process forks on this host."
|
||||
}
|
||||
],
|
||||
"vmForkPinned": []
|
||||
},
|
||||
"extensions": {
|
||||
"isolated": []
|
||||
"vmForkSingleton": [
|
||||
{
|
||||
"file": "src/channels/plugins/contracts/inbound.telegram.contract.test.ts",
|
||||
"reason": "Needs the vmForks lane when targeted."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user