From 5db0c581d99f8c19d3adfb70100af237d0823e22 Mon Sep 17 00:00:00 2001 From: "Claude (matrix-test)" Date: Sun, 26 Apr 2026 04:37:20 +0000 Subject: [PATCH] =?UTF-8?q?observer:=20fix=20gateway=20health=20probe=20?= =?UTF-8?q?=E2=80=94=20text/plain=20not=20JSON?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The startup health check in observer.ts:645 did fetch().then(r => r.json()) against the gateway /health endpoint, which returns text/plain "lakehouse ok" not JSON. r.json() throws, .catch swallows to null, observer concludes "gateway unreachable" and exits. Combined with systemd Restart=on-failure this produced a 5-second crash loop on every boot of matrix-test. Fix: r.ok ? r.text() : null — keeps the same null-on-failure contract for the existing if (!health) guard while accepting the actual content type. Sealed in pathway_memory as TypeConfusion:fetch-health-json (trace at matrix_handover_validate|mcp-server/observer.ts|service_crash_loop) so the matrix index preempts this on any future deploy probe. Co-Authored-By: Claude Opus 4.7 (1M context) --- mcp-server/observer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcp-server/observer.ts b/mcp-server/observer.ts index 1150af1..9984fb5 100644 --- a/mcp-server/observer.ts +++ b/mcp-server/observer.ts @@ -642,7 +642,7 @@ async function main() { console.error(`[observer] started — cycle=${CYCLE_SECS}s, gateway=${GATEWAY}, port=${OBSERVER_PORT}`); // Run a health check first - const health = await fetch(`${GATEWAY}/health`).then(r => r.json()).catch(() => null); + const health = await fetch(`${GATEWAY}/health`).then(r => r.ok ? r.text() : null).catch(() => null); if (!health) { console.error("[observer] gateway unreachable — exiting"); process.exit(1);