Version: LifeOS 7.40.4 (ce046f2)
What
LIFEOS_STATE.json carries seven dimensions (health, money, freedom, creative, relationships, rhythms, infrastructure). The TELOS page's "Life Dimensions" band renders four surfaces built by averaging pairs: creative_freedom = avg(creative, freedom), finances = avg(money, finances), plus health and relationships. Two consequences:
rhythms and infrastructure never appear anywhere on the page, and the band's "average" is an average of the four composites, not of the seven captured values.
- A dimension whose source file is still the shipped template (
provenance: template) contributes its scaffold number as if it were captured. With creative = 0 (template) and freedom = 75, the page reads "Creative Freedom 38" — a number no file states.
Where
LIFEOS/PULSE/Observability/observability.ts, buildDimensionsFromIdealState (line 3408):
- the comment at line 3406: "Composite rule for creative_freedom: average the underlying creative and freedom percentages … Missing source dimension contributes 0";
- the surface table at lines 3442–3450: four entries (
health, creative_freedom, relationships, finances) with sources: ["CREATIVE.md", "FREEDOM.md"] etc.;
avg at lines 3425–3428 averages whatever numbers are present and returns 0 for none, with no provenance check on the source files.
Reproduce
- Fresh install, run the interview for one or two dimensions only, so the rest keep
provenance: template in USER/TELOS/IDEAL_STATE/*.md.
bun LIFEOS/TOOLS/UpdateLifeosState.ts (or wait for the Stop hook), then curl -s localhost:31337/api/telos/overview | jq '.dimensions'.
- Observe four entries, none for
rhythms or infrastructure, and a creative_freedom.cur that is the mean of a captured and a template value.
Expected
- One dimension list, shared by the state updater, the gap computer and Pulse, so every surface renders the same seven and cannot drift.
- A template dimension scores
null ("not captured"), never a number, and is never averaged into a composite; a composite with no captured source is null too.
- Rings, bars and the band average only captured dimensions and say "not captured" for the rest.
Fix shape
A LIFEOS/TOOLS/lib/dimensions.ts exporting the seven-entry DIMENSIONS list, the surface definitions and a composeSurface(pcts, sources) that returns the mean of captured sources or null; UpdateLifeosState.ts writes pct: null plus provenance for template files; observability.ts and the page consume the list and treat null as "not captured". Landed as one library file plus three consumer edits; a PR can follow.
Version: LifeOS 7.40.4 (
ce046f2)What
LIFEOS_STATE.jsoncarries seven dimensions (health, money, freedom, creative, relationships, rhythms, infrastructure). The TELOS page's "Life Dimensions" band renders four surfaces built by averaging pairs:creative_freedom= avg(creative, freedom),finances= avg(money, finances), plus health and relationships. Two consequences:rhythmsandinfrastructurenever appear anywhere on the page, and the band's "average" is an average of the four composites, not of the seven captured values.provenance: template) contributes its scaffold number as if it were captured. Withcreative= 0 (template) andfreedom= 75, the page reads "Creative Freedom 38" — a number no file states.Where
LIFEOS/PULSE/Observability/observability.ts,buildDimensionsFromIdealState(line 3408):health,creative_freedom,relationships,finances) withsources: ["CREATIVE.md", "FREEDOM.md"]etc.;avgat lines 3425–3428 averages whatever numbers are present and returns 0 for none, with no provenance check on the source files.Reproduce
provenance: templateinUSER/TELOS/IDEAL_STATE/*.md.bun LIFEOS/TOOLS/UpdateLifeosState.ts(or wait for the Stop hook), thencurl -s localhost:31337/api/telos/overview | jq '.dimensions'.rhythmsorinfrastructure, and acreative_freedom.curthat is the mean of a captured and a template value.Expected
null("not captured"), never a number, and is never averaged into a composite; a composite with no captured source isnulltoo.Fix shape
A
LIFEOS/TOOLS/lib/dimensions.tsexporting the seven-entryDIMENSIONSlist, the surface definitions and acomposeSurface(pcts, sources)that returns the mean of captured sources ornull;UpdateLifeosState.tswritespct: nullplusprovenancefor template files;observability.tsand the page consume the list and treatnullas "not captured". Landed as one library file plus three consumer edits; a PR can follow.