Version: LifeOS 7.40.4 (ce046f2)
What
The "Projects and Work" band on /telos (and /, its alias) is built from the work board's In-Progress column and nothing else. On a populated install it renders:
- one pseudo-project row titled "Work in flight" for every card, never the projects TELOS § Projects declares;
- an empty strategy badge on the row and on every work cell (
strategy: "");
- a blank owner on every cell, because the owner matcher looks for a lowercase
agent: label while the sweep writes Agent:<name>;
[Goal] … mirror cards (the ones WorkSweep mints for active TELOS goals) listed as work in flight.
Where
LIFEOS/PULSE/Observability/observability.ts
agentFromLabels (line 4064): labels.find((x) => x.startsWith("agent:")) — case-sensitive, so Agent:<name> (the casing LIFEOS/TOOLS/WorkSweep.ts writes at lines 272, 395, 460, 531) never matches and owner is "".
buildProjectsFromStatus (line 4079): pushes a single { id: "WORK", title: "Work in flight", strategy: "" } and maps each card to { strategy: "", owner: agentFromLabels(...) }; no filter for [Goal] titles; no join to TELOS § Projects or PROJECTS.md.
Reproduce
- On an install with a work repo configured, take any card so it sits in the In-Progress column (
Status:in-progress); let the sweep mint a [Goal] mirror for an active goal and move it there too.
curl -s localhost:31337/api/telos/overview | jq '.projects'.
- Observe:
projects[0].title == "Work in flight", strategy == "" on the row and on each work[] entry, owner == "" on every card labelled Agent:<name>, and the [Goal] … card present in work[].
- Open
/telos, section "Projects and Work": the badge column is blank, the owner column is blank.
Expected
- Cards join the project they belong to (TELOS § Projects entry, matched by the card's
Property: label), with unmatched cards under a "Work in flight" row.
- Every strategy badge and owner carries a value (the project's served goal/strategy ID, else the property, else an explicit
unmapped).
- Owner labels match in any case.
[Goal] … mirrors never appear as work.
Fix shape
A pure module beside observability.ts (overview-work.ts) that takes the in-flight cards, the TELOS § Projects entries and the Bunker monitor state and returns the band rows: case-insensitive Agent:/Property: label readers, a [Goal] title filter, a badge that is never empty, grouping by matched project. observability.ts keeps a four-line wrapper. Unit-testable without a daemon; a PR can follow with the file and its tests as one hunk.
Version: LifeOS 7.40.4 (
ce046f2)What
The "Projects and Work" band on
/telos(and/, its alias) is built from the work board's In-Progress column and nothing else. On a populated install it renders:strategy: "");agent:label while the sweep writesAgent:<name>;[Goal] …mirror cards (the onesWorkSweepmints for active TELOS goals) listed as work in flight.Where
LIFEOS/PULSE/Observability/observability.tsagentFromLabels(line 4064):labels.find((x) => x.startsWith("agent:"))— case-sensitive, soAgent:<name>(the casingLIFEOS/TOOLS/WorkSweep.tswrites at lines 272, 395, 460, 531) never matches andowneris"".buildProjectsFromStatus(line 4079): pushes a single{ id: "WORK", title: "Work in flight", strategy: "" }and maps each card to{ strategy: "", owner: agentFromLabels(...) }; no filter for[Goal]titles; no join to TELOS § Projects orPROJECTS.md.Reproduce
Status:in-progress); let the sweep mint a[Goal]mirror for an active goal and move it there too.curl -s localhost:31337/api/telos/overview | jq '.projects'.projects[0].title == "Work in flight",strategy == ""on the row and on eachwork[]entry,owner == ""on every card labelledAgent:<name>, and the[Goal] …card present inwork[]./telos, section "Projects and Work": the badge column is blank, the owner column is blank.Expected
Property:label), with unmatched cards under a "Work in flight" row.unmapped).[Goal] …mirrors never appear as work.Fix shape
A pure module beside
observability.ts(overview-work.ts) that takes the in-flight cards, the TELOS § Projects entries and the Bunker monitor state and returns the band rows: case-insensitiveAgent:/Property:label readers, a[Goal]title filter, a badge that is never empty, grouping by matched project.observability.tskeeps a four-line wrapper. Unit-testable without a daemon; a PR can follow with the file and its tests as one hunk.