Skip to content

Pulse Assistant module missing from public release — /assistant/* endpoints all return 404, dashboard shows misleading 'DA Identity is empty' state #1173

Description

@nbost130

Summary

Pulse/pulse.ts line 117 dynamically imports ./Assistant/module to handle all /assistant/* routes (identity, personality, diary, tasks, opinions, health). The import is wrapped in try/catch and fails silently when the module file doesn't exist:

try {
  assistantModule = await import("./Assistant/module")
} catch (err) {
  log("warn", "Assistant module not available", { error: String(err) })
}

On a fresh install of the public PAI release, ~/.claude/PAI/Pulse/Assistant/ does not exist on disk. Result: assistantModule stays null, and every /assistant/* request returns 404. The /assistant Pulse dashboard page reads its data via React Query against those endpoints, sees nothing, and renders the empty-state onboarding template ("DA Identity is empty — let's fill it in") even though the user's DA identity is fully populated at ~/.claude/PAI/USER/DA_IDENTITY.md.

Repro

  1. Fresh PAI install (5.0.0 / Pulse from current public release).
  2. Populate ~/.claude/PAI/USER/DA_IDENTITY.md with real DA identity (name, voice ID, motto, persona, etc.) — or use the default Carson template.
  3. Start Pulse, navigate to localhost:31337/assistant.
  4. Page renders the "DA Identity is empty" onboarding banner.
  5. Confirm endpoint state:
    $ curl -s -o /dev/null -w "%{http_code}\n" http://localhost:31337/assistant/identity
    404
    $ curl -s -o /dev/null -w "%{http_code}\n" http://localhost:31337/assistant/personality
    404
    $ curl -s -o /dev/null -w "%{http_code}\n" http://localhost:31337/assistant/diary
    404
    
  6. Confirm cause:
    $ ls ~/.claude/PAI/Pulse/Assistant/
    ls: ~/.claude/PAI/Pulse/Assistant/: No such file or directory
    

Audit of other Pulse modules

Only Assistant/module.ts is missing. All other dynamically imported modules are present:

Module Path Present?
VoiceServer Pulse/VoiceServer/voice.ts
Observability Pulse/Observability/observability.ts
Wiki Pulse/modules/wiki.ts
Telegram Pulse/modules/telegram.ts
iMessage Pulse/modules/imessage.ts
Assistant Pulse/Assistant/module.ts ✗ MISSING
Performance Pulse/Performance/module.ts
Syslog Pulse/modules/syslog.ts
Hooks Pulse/modules/hooks.ts

So this is a single specific shipping gap, not a pattern of missing modules.

Endpoint surface the module needs to provide

From Pulse/Observability/src/app/assistant/page.tsx:203-208:

useQuery<Identity>({ queryFn: () => localApiCall("/assistant/identity"), refetchInterval: 30_000 });
useQuery<Health>({ queryFn: () => localApiCall("/assistant/health"), refetchInterval: 10_000 });
useQuery<Personality>({ queryFn: () => localApiCall("/assistant/personality"), refetchInterval: 60_000 });
useQuery<TasksResponse>({ queryFn: () => localApiCall("/assistant/tasks"), refetchInterval: 15_000 });
useQuery<{ entries: DiaryEntry[] }>({ queryFn: () => localApiCall("/assistant/diary"), refetchInterval: 60_000 });
useQuery<{ raw: string }>({ queryFn: () => localApiCall("/assistant/opinions"), refetchInterval: 60_000 });

Plus a health export consumed by pulse.ts:278:

subsystems.assistant = assistantModule.assistantHealth()

So the module needs to export:

  • handleAssistantRequest(req, pathname) — main router for /assistant/identity, /assistant/personality, /assistant/diary, /assistant/tasks, /assistant/opinions, /assistant/health
  • assistantHealth() — returns Pulse subsystem health

The natural data sources are:

  • ~/.claude/PAI/USER/DA_IDENTITY.md — identity, personality, voice
  • ~/.claude/PAI/USER/DAWRITINGSTYLE.md — voice/tone deep-dive
  • ~/.claude/PAI/USER/OUR_STORY.md — relationship lore
  • ~/.claude/PAI/USER/OPINIONS.md — opinions
  • Diary location TBD — could be MEMORY/RELATIONSHIP/ or a dedicated MEMORY/DA-DIARY/
  • Tasks: MEMORY/STATE/work.json (already used elsewhere)

Suggested fix

Two acceptable shapes:

A. Ship the missing module in the public release. This appears to be the intended path — pulse.ts already references it, the dashboard page is built around it, the data sources exist. The module just isn't bundled. Likely a release-tooling oversight rather than an incomplete feature.

B. If the module is intentionally not yet built, surface the gap in the dashboard onboarding banner: "Pulse Assistant module not installed — see [docs link]" instead of the misleading "DA Identity is empty — let's fill it in" (which makes the user think their data is the problem).

Why this matters

The empty-state UI sends the user down the wrong remediation path. They see "DA Identity is empty — run /interview or edit USER/DA/" — but their identity IS populated, and editing those files (or running the interview) won't fix the actual problem. Time gets spent populating the already-populated, with no improvement to the dashboard. The user discovers the real cause only by reading source code.

Related

Verified locally

Module absence + 404 responses confirmed. DA_IDENTITY.md presence + content confirmed (5343 bytes, fully populated Carson identity). Audit of other Pulse modules confirms the gap is specific to Assistant.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions