danielmiessler / danielmiessler/LifeOS
Interview.md doesn't point at TELOS.md as canonical; onboarding-state check is stricter than GenerateTelosSummary, so Pulse keeps showing the template banner after a real interview
- Dominant language
- TypeScript
- Stars
- 19k
- Forks
- 2.5k
- Avg merge
- 8d 17h
- Merged PRs (30d)
- 1
Description
## What happened
Ran a fresh install (bootstrap + `/LifeOS setup` + `/LifeOS interview`) via an AI agent following the shipped `Workflows/Setup.md` / `Workflows/Interview.md` literally. Interview step 3/4 just says "Write to TELOS/" (no specific file named), so the agent wrote real content into the split per-dimension files — `TELOS/MISSION.md`, `GOALS.md`, `STRATEGIES.md`, `CHALLENGES.md` — replacing every `(sample)` entry.
`TELOS/PRINCIPAL_TELOS.md` (generated by `GenerateTelosSummary.ts`) then correctly showed the real mission/goals/strategies/challenges. But the Pulse dashboard kept showing the "You're looking at template content" onboarding banner, and `GET /api/onboarding/state` kept returning `templateMode: true` — because `TELOS/TELOS.md` (the actual file that file's own header calls "the single source of truth... the split files ... are legacy samples") was never touched.
## Root cause (two issues)
1. **Docs gap** — `Workflows/Interview.md` sequence steps 3/4 say "Write to TELOS/" without naming `TELOS.md` specifically, even though `TELOS/TELOS.md`'s own bootstrap-template header says it's canonical and the split files are legacy. An agent following the workflow doc alone has no signal to prefer `TELOS.md`.
2. **Inconsistent fallback between two readers of "the same" data** — `PULSE/Observability/observability.ts`, `telosPersonalized()` / its `sectionOrFile()` helper (around the `handleOnboardingState()` function, `/api/onboarding/state`):
```ts
const sectionOrFile = (key: string, legacyFile: string): string =>
sections[key] || readMd(join(TELOS_DIR, legacyFile));
```
`sections[key]` comes from parsing `TELOS.md`. If that section exists but is still sample/template text (a truthy non-empty string), the `||` never falls through to the populated legacy file — so `realEntries()` finds 0 non-sample entries in the sample text, `templateMode` stays `true` forever, and the DA name lookup has the same class of bug (was reading `USER/DA_IDENTITY.md` at the wrong path before, now reads the right path but a `**Name:**` line with any trailing parenthetical gets captured whole by the naive regex).
Whatever `GenerateTelosSummary.ts` does to produce a correct `PRINCIPAL_TELOS.md` in this exact scenario evidently *does* fall back past sample `TELOS.md` sections to the real split files — so the two "is this personalized" checks disagree with each other on identical on-disk state.
## Suggested fix
- `Interview.md`: name `TELOS/TELOS.md` explicitly as the file to write (or state the precedence) rather than the generic "TELOS/".
- `sectionOrFile()`/`telosPersonalized()`: apply the same sample-detection (`SAMPLE_ENTRY_RE`) to `TELOS.md`'s own section text before trusting it, so a still-template `TELOS.md` section correctly falls through to a populated legacy file — matching whatever `GenerateTelosSummary.ts` already does.
Happy to share the exact diff of what I filled in if useful. Found via an AI-agent-driven install, reported here per the project's own convention of tracking these as public issues.
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with Workflows/Interview.md and the named sectionOrFile()/telosPersonalized() logic in PULSE/Observability/observability.ts, then compare its sample handling with GenerateTelosSummary.ts. Reproduce the setup and interview flow described in the issue and check GET /api/onboarding/state. Done means the workflow names TELOS/TELOS.md and personalized split-file content no longer leaves templateMode true.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- api, backend, documentation
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 68/100