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

Open
#2,117 0 comments 0 reactions 0 assignees View on GitHub
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.