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
- Fresh PAI install (5.0.0 / Pulse from current public release).
- Populate
~/.claude/PAI/USER/DA_IDENTITY.md with real DA identity (name, voice ID, motto, persona, etc.) — or use the default Carson template.
- Start Pulse, navigate to
localhost:31337/assistant.
- Page renders the "DA Identity is empty" onboarding banner.
- 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
- 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.
Summary
Pulse/pulse.tsline 117 dynamically imports./Assistant/moduleto 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:On a fresh install of the public PAI release,
~/.claude/PAI/Pulse/Assistant/does not exist on disk. Result:assistantModulestaysnull, and every/assistant/*request returns 404. The/assistantPulse 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
~/.claude/PAI/USER/DA_IDENTITY.mdwith real DA identity (name, voice ID, motto, persona, etc.) — or use the default Carson template.localhost:31337/assistant.Audit of other Pulse modules
Only
Assistant/module.tsis missing. All other dynamically imported modules are present:Pulse/VoiceServer/voice.tsPulse/Observability/observability.tsPulse/modules/wiki.tsPulse/modules/telegram.tsPulse/modules/imessage.tsPulse/Assistant/module.tsPulse/Performance/module.tsPulse/modules/syslog.tsPulse/modules/hooks.tsSo 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:Plus a health export consumed by
pulse.ts:278:So the module needs to export:
handleAssistantRequest(req, pathname)— main router for/assistant/identity,/assistant/personality,/assistant/diary,/assistant/tasks,/assistant/opinions,/assistant/healthassistantHealth()— returns Pulse subsystem healthThe 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— opinionsMEMORY/RELATIONSHIP/or a dedicatedMEMORY/DA-DIARY/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.