Notes created by the automatic memory writer all get the placeholder tag untagged, and two other parts of the system then treat that placeholder as if it were a real tag. The combination quietly breaks two features for exactly the notes the system wrote on its own.
What happens
-
LifeOS/install/LIFEOS/TOOLS/MemorySystem.ts (line 522) writes every new automatic note with tags: [untagged], because the captured item doesn't carry tags at that point. Fair enough on its own.
-
Contradiction detection in LifeOS/install/LIFEOS/TOOLS/KnowledgeHarvester.ts (around line 1190) only compares notes that share two or more tags. Two untagged notes share exactly one ("untagged"), so no pair of them is ever checked. In my archive, 57 notes (18%) had built up this way — and a real contradiction was sitting among them that the detector could never find.
-
Search scoring in LifeOS/install/LIFEOS/TOOLS/MemoryRetriever.ts (line 380) gives a bonus for query words that match a tag. "untagged" contains the word "tag", so any search containing "tag" boosts every one of these notes at once — and no other search ever boosts them, so they also rank below properly tagged notes on real queries.
Suggested fix
The small, safe fix is one line in the retriever: skip the untagged placeholder when scoring tags. That's what I did locally:
for (const tag of tags) {
if (tag === "untagged") continue; // placeholder, not a real tag
...
I'd leave the writer itself alone. It's deterministic code with no language model in that path, so it can't invent good tags at capture time, and wrong tags would be worse than the placeholder (they'd create false matches in both features above). The placeholder is actually useful as an honest "this note still needs tags" marker — the missing piece is that nothing downstream ever clears it. A tagging step in a curation pass (the weekly distill is a natural home) would close the loop.
Happy to send a PR for the one-line retriever fix if wanted. Found on current main (7.40.4).
Notes created by the automatic memory writer all get the placeholder tag
untagged, and two other parts of the system then treat that placeholder as if it were a real tag. The combination quietly breaks two features for exactly the notes the system wrote on its own.What happens
LifeOS/install/LIFEOS/TOOLS/MemorySystem.ts(line 522) writes every new automatic note withtags: [untagged], because the captured item doesn't carry tags at that point. Fair enough on its own.Contradiction detection in
LifeOS/install/LIFEOS/TOOLS/KnowledgeHarvester.ts(around line 1190) only compares notes that share two or more tags. Two untagged notes share exactly one ("untagged"), so no pair of them is ever checked. In my archive, 57 notes (18%) had built up this way — and a real contradiction was sitting among them that the detector could never find.Search scoring in
LifeOS/install/LIFEOS/TOOLS/MemoryRetriever.ts(line 380) gives a bonus for query words that match a tag. "untagged" contains the word "tag", so any search containing "tag" boosts every one of these notes at once — and no other search ever boosts them, so they also rank below properly tagged notes on real queries.Suggested fix
The small, safe fix is one line in the retriever: skip the
untaggedplaceholder when scoring tags. That's what I did locally:I'd leave the writer itself alone. It's deterministic code with no language model in that path, so it can't invent good tags at capture time, and wrong tags would be worse than the placeholder (they'd create false matches in both features above). The placeholder is actually useful as an honest "this note still needs tags" marker — the missing piece is that nothing downstream ever clears it. A tagging step in a curation pass (the weekly distill is a natural home) would close the loop.
Happy to send a PR for the one-line retriever fix if wanted. Found on current main (7.40.4).