fix(FN-2117): log swallowed engine runtime errors

- Add structured warning logs in silent catch paths for IPC worker shutdown, plugin unregistration cleanup, child runtime metrics polling, and merger build rollback reset
- Improve merger rollback warning context to make build-verification reset and retry failures easier to diagnose
- Add regression tests covering each new warning path to ensure errors are surfaced without changing existing control flow
- Add StepSessionExecutor test coverage for cherry-pick abort logging when conflict cleanup fails
This commit is contained in:
Fusion
2026-04-19 02:55:04 -07:00
committed by gsxdsm
parent 12f1e7fa32
commit f7bd321d42
9 changed files with 196 additions and 11 deletions

View File

@@ -6,6 +6,7 @@ import type {
RuntimeMetrics,
RuntimeStatus,
} from "../project-runtime.js";
import { runtimeLog } from "../logger.js";
import {
START_RUNTIME,
STOP_RUNTIME,
@@ -673,6 +674,36 @@ describe("ChildProcessRuntime", () => {
});
});
it("logs warning when GET_METRICS IPC query fails", async () => {
const warnSpy = vi.spyOn(runtimeLog, "warn").mockImplementation(() => {});
queueChild({
sendCallbackErrors: {
[GET_METRICS]: new Error("metrics unavailable"),
},
});
await runtime.start();
runtimeAny.lastMetrics = {
inFlightTasks: 1,
activeAgents: 0,
lastActivityAt: "2026-04-08T04:00:00.000Z",
};
const metrics = runtime.getMetrics();
expect(metrics.inFlightTasks).toBe(1);
expect(metrics.activeAgents).toBe(0);
await vi.waitFor(() => {
expect(warnSpy).toHaveBeenCalledWith(
expect.stringContaining("GET_METRICS IPC query failed, using cached value"),
);
});
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining("metrics unavailable"));
warnSpy.mockRestore();
});
it("getTaskStore() always throws not accessible error", () => {
expect(() => runtime.getTaskStore()).toThrow("not accessible in ChildProcessRuntime");
});

View File

@@ -450,8 +450,9 @@ export class ChildProcessRuntime
.then((metrics: unknown) => {
this.lastMetrics = metrics as RuntimeMetrics;
})
.catch(() => {
// Ignore errors, use cached value
.catch((err: unknown) => {
const msg = err instanceof Error ? err.message : String(err);
runtimeLog.warn(`GET_METRICS IPC query failed, using cached value: ${msg}`);
});
}