Skip to content

v7.1.1: statusline caches host-local data in synced MEMORY/STATE — Syncthing conflict spam on multi-host #1702

Description

@gangwaydigital

Version: 7.1.1 (macOS, multi-host / Syncthing setup)

Summary

LIFEOS_StatusLine.sh writes host-local ephemeral caches into LIFEOS/MEMORY/STATE/ — a directory that is commonly Syncthing-synced between hosts. On a two-host setup (a primary DA host + a second/worker client), both machines' statuslines write the same synced files on every render, so Syncthing produces a stream of *.sync-conflict-* files.

Evidence

On a second host (neo) synced to the primary (ai), after bringing the statusline online, MEMORY/STATE/ accumulated conflict files on nearly every render:

MEMORY/STATE/model-cache.sync-conflict-20260729-160943-<id>.txt
MEMORY/STATE/model-cache.sync-conflict-20260729-162020-<id>.txt
MEMORY/STATE/model-cache.sync-conflict-20260729-165624-<id>.txt
MEMORY/STATE/model-cache.sync-conflict-20260729-170132-<id>.txt

Affected caches (host-local data in a synced dir)

Statusline-owned, self-contained (written + read only by the statusline):

  • MEMORY/STATE/model-cache.txt
  • MEMORY/STATE/location-cache.json
  • MEMORY/STATE/weather-cache.json
  • MEMORY/STATE/cc-version-cache.txt

Also host-local but shared with other components (hooks/tools), so they conflict too but need a coordinated move: session-name-cache.sh, learning-cache.sh, capabilities-statusline.txt, session-names.json.

Note: USAGE_CACHE/USAGE_LOCK already correctly live in /tmp — that's the right pattern; the other caches just didn't follow it.

Impact

Endless *.sync-conflict-* noise in the synced MEMORY tree on any multi-host install. Data isn't lost (the caches are trivially re-derivable), but the tree fills with conflict artifacts and it defeats the "one primary writer" model for MEMORY.

Proposed fix

Move the statusline's host-local caches out of the synced MEMORY/STATE into a host-local dir, e.g.:

STATUSLINE_LOCAL_STATE="${XDG_CACHE_HOME:-$HOME/.cache}/lifeos-statusline"
mkdir -p "$STATUSLINE_LOCAL_STATE"
MODEL_CACHE="$STATUSLINE_LOCAL_STATE/model-cache.txt"
# ...location/weather/cc-version likewise

The cross-component caches (session-name-cache, learning-cache, capabilities-statusline, session-names) need the same treatment applied at every writer, not just the statusline.

Local workaround applied on neo

Repointed the 4 self-contained caches (model/location/weather/cc-version) to $HOME/.cache/lifeos-statusline; verified the statusline now writes there and no longer touches the synced file.

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