From ccb068875327a96d52abfa070aabb5bd7b7c4367 Mon Sep 17 00:00:00 2001 From: Gerald Starks Date: Mon, 4 May 2026 00:17:17 -0500 Subject: [PATCH] fix(observability): use canonical PULSE dir casing for Linux compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three hardcoded paths in the observability module used 'Pulse' (TitleCase) while the canonical install directory is 'PULSE' (uppercase). On macOS HFS+/APFS (case-insensitive default), 'Pulse' and 'PULSE' resolve to the same directory, so the bug is invisible. On Linux ext4/btrfs (case-sensitive), the dashboard directory is never found, every static-file lookup returns 404, and the Pulse server appears broken while the HTTP server is actually serving fine. Symptom: localhost:31337 returns 404 for / and every dashboard page on Linux; macOS users see no issue. Affected paths: - DEFAULT_DASHBOARD_DIR (line 69) - getDashboardDir() relative-path resolver (line 152) - handleUserIndexApi() user-index.json lookup (line 1650) Behavior on macOS unchanged — case-insensitive FS already resolved 'Pulse' to the canonical 'PULSE' directory. Signed-off-by: Gerald Starks --- .../v5.0.0/.claude/PAI/PULSE/Observability/observability.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Releases/v5.0.0/.claude/PAI/PULSE/Observability/observability.ts b/Releases/v5.0.0/.claude/PAI/PULSE/Observability/observability.ts index 984c1b4486..a55180e930 100644 --- a/Releases/v5.0.0/.claude/PAI/PULSE/Observability/observability.ts +++ b/Releases/v5.0.0/.claude/PAI/PULSE/Observability/observability.ts @@ -66,7 +66,7 @@ const SECURITY_LOG_DIR = join(MEMORY_DIR, "SECURITY") const SETTINGS_PATH = join(HOME, ".claude", "settings.json") const LADDER_DIR = join(HOME, "Projects", "Ladder") -const DEFAULT_DASHBOARD_DIR = join(PAI_DIR, "Pulse", "Observability", "out") +const DEFAULT_DASHBOARD_DIR = join(PAI_DIR, "PULSE", "Observability", "out") // ── In-Memory Store (hook-pushed state/events) ── @@ -149,7 +149,7 @@ function getDashboardDir(): string { const dir = config.dashboard_dir ?? DEFAULT_DASHBOARD_DIR // Resolve relative paths against Pulse directory if (!dir.startsWith("/")) { - return join(HOME, ".claude", "PAI", "Pulse", dir) + return join(HOME, ".claude", "PAI", "PULSE", dir) } return dir } @@ -1647,7 +1647,7 @@ function readDirMdFiles(dir: string): { name: string, content: string, sections: function handleUserIndexApi(filter: string | null): Response { try { const PAI_DIR = process.env.PAI_DIR || join(process.env.HOME || "", ".claude", "PAI") - const indexPath = join(PAI_DIR, "Pulse", "state", "user-index.json") + const indexPath = join(PAI_DIR, "PULSE", "state", "user-index.json") const raw = Bun.file(indexPath) if (!raw.size) { return Response.json(