Skip to content

Out-of-band backend writes don't reach the frontend store (identity after onboarding, person viewer title, playbook-installed types) #3257

Closed

Description

@malibio

Problem

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:

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

Activity

  1. malibio commented on Sep 28, 2026

    @malibio
    CollaboratorAuthor

    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.

  2. self-assigned this
    on Sep 29, 2026
  3. mstomar125 commented on Sep 29, 2026

    @mstomar125
    Contributor

    Frontend baseline: 280 files / 5225 tests passed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions