You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Out-of-band backend writes don't reach the frontend store (identity after onboarding, person viewer title, playbook-installed types) #3257
Writes that reach the database without going through sharedNodeStore never show up in the UI, or only show up after an unrelated edit. Observed on a fresh database:
Onboarding identity. The identity step (prefilled from git/OS) → Save. Afterwards Settings → "Your identity" shows Not set, and "Edit identity" opens "Untitled Person" with all three fields empty. The database has the values (person title = "Michael Libio", first_name/last_name/email set), and nodespace node get returns them. The viewer header only showed the name after the user edited a title-template field, which triggers the client-side title preview. base-node-viewer.svelte → computeHeaderDisplayValue reads node.title from the store and never computes it on load, so "Untitled" means the store held a stale copy (the empty v1 seeded at startup).
Playbook install. Settings → Work Tracking → Spec-driven → Install reported success. The DB got 2 schemas (spec, plan), 4 plays, 5 skills and 2 query nodes, but the sidebar's type list still showed only Agent Guidance / Person / Project / Skill / Task, and the new plays didn't appear either. Only the skills showed up.
What's known
The wizard's handleSaveIdentity calls invoke('set_local_identity') (Tauri → gRPC SetLocalPersonIdentity → core set_local_person_identity → update_node) and never touches sharedNodeStore. The store can only learn about it through the node:updated watcher event → fetchAndUpdateNode (tauri-sync-listener.ts). That either didn't arrive or was rejected.
sharedNodeStore.ensureNode doesn't refetch a node it already has cached, so re-opening the node doesn't recover.
The sidebar type list and the plays list likewise don't refresh on node create events from a playbook install.
Still unconfirmed for the identity case: the person node reached version 2 exactly once (18:45:48). That's either the onboarding Save (and the store never refreshed), or the Save never persisted and v2 was the user's later field edit. The daemon logs don't show which. Resolve this first: reproduce onboarding on a fresh DB and check the node version before touching anything else.
Acceptance criteria
Determine whether the onboarding identity Save persists; if not, fix it and surface failures in the wizard
The onboarding identity step applies its result (the returned node) to sharedNodeStore, so Settings and the person viewer show it immediately
A node:updated event for a node already in the store refreshes it (verify the watcher → listener → store path end to end for out-of-band writes)
ensureNode revalidates a cached node when the backend has a newer version (or equivalent), so opening a node never shows a stale copy
The person viewer header shows the stored title on first open, with no field edit needed
After installing a playbook, its schemas appear in the sidebar type list and its plays appear wherever plays are listed, without a restart
Tests covering an out-of-band write (backend update not originated by the store) reaching a component that's already open
Likely root cause (from the architecture doc):nodespace-docs/architecture/frontend-state-and-persistence.md says the daemon never sends a client the events its own writes caused (same-origin echo suppression, ADR-026). The onboarding wizard's set_local_identity and the playbook install are writes made by this app's own gRPC client but outside sharedNodeStore, so their node:updated / node:created events are suppressed as echoes and the store never hears about them. The same doc (§ on title freshness) warns that a write going through backendAdapter instead of sharedNodeStore.updateNode has "no synchronous source for the backend-computed title at all", which is exactly the "Untitled Person" symptom.
That points the fix at the write paths, not the event listener: the onboarding identity save and the playbook install should apply their returned nodes to sharedNodeStore (or route through it, per ADR-049), rather than relying on events that are suppressed by design. The ensureNode revalidation criterion is still worth keeping as defense in depth.
Activity
malibio commentedon Sep 28, 2026
Likely root cause (from the architecture doc):
nodespace-docs/architecture/frontend-state-and-persistence.mdsays the daemon never sends a client the events its own writes caused (same-origin echo suppression, ADR-026). The onboarding wizard'sset_local_identityand the playbook install are writes made by this app's own gRPC client but outsidesharedNodeStore, so theirnode:updated/node:createdevents are suppressed as echoes and the store never hears about them. The same doc (§ on title freshness) warns that a write going throughbackendAdapterinstead ofsharedNodeStore.updateNodehas "no synchronous source for the backend-computed title at all", which is exactly the "Untitled Person" symptom.That points the fix at the write paths, not the event listener: the onboarding identity save and the playbook install should apply their returned nodes to
sharedNodeStore(or route through it, per ADR-049), rather than relying on events that are suppressed by design. TheensureNoderevalidation criterion is still worth keeping as defense in depth.mstomar125 commentedon Sep 29, 2026
Frontend baseline: 280 files / 5225 tests passed