Skip to content

Automatic memory notes are born with a placeholder tag that breaks contradiction detection and search scoring for them #1985

Description

@hjbrandt

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

  1. 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.

  2. 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.

  3. 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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions