Summary
Five bugs found during a fresh PAI install that prevent the Pulse dashboard from showing real user data. All were reproducible and fixed manually. Reporting so they can be fixed in the install/setup flow.
Bug 1: .template-mode marker not deleted after /interview completes
File: install.sh / interview completion hook
Symptom: After completing /interview (TELOS phase filled with real data), the dashboard still shows the "You're looking at template content" banner and renders all sample data instead of user data.
Root cause: PAI/USER/.template-mode is written on install but never deleted when the interview completes.
Fix: Delete ~/.claude/PAI/USER/.template-mode manually, or have the interview skill delete it on completion.
Bug 2: use-telos-data.ts always returns static fallback — never fetches the API
File: Observability/src/app/telos/_v7/use-telos-data.ts
Symptom: TELOS page always shows sample data from data.ts even when real data exists in the API.
Root cause: The hook is a stub — it ignores the version state and unconditionally returns FALLBACK:
void version;
return { telos: FALLBACK, refetch, error: null };
Fix: Implement useEffect to fetch /api/telos/overview and merge with fallback for null fields.
Bug 3: handleTelosOverview() parses TELOS bullet format incorrectly — missions, problems, challenges, strategies always empty
File: Observability/observability.ts → handleTelosOverview()
Symptom: /api/telos/overview returns empty arrays for missions, problems, challenges, strategies even when the TELOS markdown files are populated.
Root cause: The function calls parseSourceHeadings() which uses parseHeadingText() with regex /^(PREFIX\d+)\s*:\s*(.+)$/. But parseSections() produces { heading: "M0", body: "text" } for bullet items — the heading field is just the ID with no colon or title, so parseHeadingText never matches.
The actual TELOS markdown format is - **M0:** text, where ** wraps M0: (ID + colon), not just M0. The idBullet regex in parseSections (/^-\s+\*{0,2}([A-Z]{1,3}\d+[a-z]?)\*{0,2}:\s*(.+)$/) also fails to match this because it expects **M0**: not **M0:**.
Fix: Parse the raw markdown directly with a regex that handles - **M0:** text:
const bulletRe = /^-\s+\*{0,2}([A-Z]{1,3}\d+[a-z]?)\*{0,2}:?\*{0,2}\s*(.+)$/
Bug 4: yaml package missing from Observability/package.json
File: Observability/package.json
Symptom: After running bun install in the Observability directory, Pulse fails to start the observability module with: Cannot find package 'yaml' from '.../Observability/observability.ts'
Root cause: observability.ts imports yaml but it's not listed as a dependency in package.json.
Fix: Add "yaml" to dependencies in Observability/package.json.
Bug 5: pai-logo.png not in Observability/public/ — logo and favicon break after bun install
File: Observability/public/
Symptom: After running bun install in the Observability directory, pai-logo.png is missing from public/, so the logo in the nav header and the browser tab favicon both break (show broken image icon).
Root cause: pai-logo.png is not committed to Observability/public/. It lives in PAI-Install/public/assets/pai-logo.png but is not copied to the right location during install.
Fix: Either commit pai-logo.png to Observability/public/, or add a step in the install/build script to copy it from PAI-Install/public/assets/.
Environment
- macOS 15.x, Apple Silicon
- Bun latest
- PAI 5.0.0 / Pulse 2.0
Summary
Five bugs found during a fresh PAI install that prevent the Pulse dashboard from showing real user data. All were reproducible and fixed manually. Reporting so they can be fixed in the install/setup flow.
Bug 1:
.template-modemarker not deleted after/interviewcompletesFile:
install.sh/ interview completion hookSymptom: After completing
/interview(TELOS phase filled with real data), the dashboard still shows the "You're looking at template content" banner and renders all sample data instead of user data.Root cause:
PAI/USER/.template-modeis written on install but never deleted when the interview completes.Fix: Delete
~/.claude/PAI/USER/.template-modemanually, or have the interview skill delete it on completion.Bug 2:
use-telos-data.tsalways returns static fallback — never fetches the APIFile:
Observability/src/app/telos/_v7/use-telos-data.tsSymptom: TELOS page always shows sample data from
data.tseven when real data exists in the API.Root cause: The hook is a stub — it ignores the
versionstate and unconditionally returnsFALLBACK:Fix: Implement
useEffectto fetch/api/telos/overviewand merge with fallback for null fields.Bug 3:
handleTelosOverview()parses TELOS bullet format incorrectly — missions, problems, challenges, strategies always emptyFile:
Observability/observability.ts→handleTelosOverview()Symptom:
/api/telos/overviewreturns empty arrays formissions,problems,challenges,strategieseven when the TELOS markdown files are populated.Root cause: The function calls
parseSourceHeadings()which usesparseHeadingText()with regex/^(PREFIX\d+)\s*:\s*(.+)$/. ButparseSections()produces{ heading: "M0", body: "text" }for bullet items — the heading field is just the ID with no colon or title, soparseHeadingTextnever matches.The actual TELOS markdown format is
- **M0:** text, where**wrapsM0:(ID + colon), not justM0. TheidBulletregex inparseSections(/^-\s+\*{0,2}([A-Z]{1,3}\d+[a-z]?)\*{0,2}:\s*(.+)$/) also fails to match this because it expects**M0**:not**M0:**.Fix: Parse the raw markdown directly with a regex that handles
- **M0:** text:Bug 4:
yamlpackage missing fromObservability/package.jsonFile:
Observability/package.jsonSymptom: After running
bun installin the Observability directory, Pulse fails to start the observability module with:Cannot find package 'yaml' from '.../Observability/observability.ts'Root cause:
observability.tsimportsyamlbut it's not listed as a dependency inpackage.json.Fix: Add
"yaml"to dependencies inObservability/package.json.Bug 5:
pai-logo.pngnot inObservability/public/— logo and favicon break afterbun installFile:
Observability/public/Symptom: After running
bun installin the Observability directory,pai-logo.pngis missing frompublic/, so the logo in the nav header and the browser tab favicon both break (show broken image icon).Root cause:
pai-logo.pngis not committed toObservability/public/. It lives inPAI-Install/public/assets/pai-logo.pngbut is not copied to the right location during install.Fix: Either commit
pai-logo.pngtoObservability/public/, or add a step in the install/build script to copy it fromPAI-Install/public/assets/.Environment