Repository navigation
Plan: semantic search without jarvis — strut keeps the graph's vectors - #138
Merged
Merged
Conversation
Findings from swarm38 (2026-10-11), after a seeded explore run never used the graph: code nodes written by stakgraph's ingest got a Domain label and a vector only from one-off jarvis migrations (nothing since April: 10,261 of hive's 13,581 Functions have neither); the vectors that exist embed the name alone, because the live Function Schema's `index` is "name" while jarvis's own library (and strut's bundled snapshot) has said [name, summary, description] since 2026-04-10 — schema seeding is add-only, so 47 live types trail the library; and search never reads the label-free Data_Bank vector index strut's own seed creates. The proposed shape: the Schema's `index` is the mark; a pass in the strut process embeds every marked node whose vector is missing or misses a field that now has a value; a widen-only reconcile brings live `index` lists up to the bundled library; search reads one vector index with the type, domain and hidden-domain filters in the query, over-fetching for Neo4j 5's post-filter. Five rulings proposed, none made.
…ass, not jarvis's Schema API Review the same day. Turn, StrutToolCall and StrutTurn get no vector (decided): too fine-grained. The mark lives in strut's code while jarvis is on a graph — jarvis reads any Schema property outside its core list as an attribute, About.hidden_types withholds Domain_strut (strut's soft-delete scope), and removing `index` gives the catch-all text, not none. The pass removes their existing vectors (410,738 on Turn, 37,128 on StrutToolCall) and writes what strut's writer would, the resolver's domain label included, so jarvis's search (hive's kgSearch, mcp's graph_agent) sees the code strut embeds. §2 records why updating `index` through jarvis's Schema API is not the route: an in-request re-embed of the whole type, a rebuild of jarvis's shared keyword index on every PUT, nothing for nodes written afterwards, no labels. First catch-up without Turn: at most ~144k nodes, code first.
…t, the pass in the background, nothing by hand The pass's first tick no longer holds up boot (today's awaited backfillEmbeddings in openGraphBackend becomes the start of the timer), the reconcile is an inline boot step beside the existing migrations, and the validation reads the pass's log instead of a query run by hand.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A plan only:
plans/semantic-search.md. No code.What it answers. Why
graph/graph-searchfinds nothing by meaning on swarm38, so a seededexploreanswers from grep alone, and what strut needs so semantic search works from strut itself on any Neo4j 5, with no jarvis.Findings (swarm38, 2026-10-11).
Domain_*label and a vector only from one-off jarvis migrations. Nothing has embedded a code node since April: 10,261 of hive's 13,581 Functions have neither. Graph-wide, 206k of 985k nodes have no vector, 132k of themTurn._search_fields_used: ["name"]; a route handler's text is"POST"). swarm38's live Function Schema hasindex: "name". jarvis's library, and strut's bundled snapshot of it, have said[name, summary, description]since 2026-04-10. Schema seeding only adds, so 47 live types trail the library.Turnvectors of tool names ("shell"), and strut's own writer embeds everyStrutToolCallit projects (37,128).Domain_*label. It never readstext_embeddings_vector_index, the index over every node that strut's own seed creates. Neo4j 5.19 has no filtered vector search.The shape: one source of truth, one rule, one repair job.
indexdecides a node's text. strut brings staleindexlists up to the bundled library by writing that one property directly. It only adds fields, and a re-run changes nothing.Revised after review (same day).
Turn,StrutToolCallandStrutTurnget no vector; they're too fine-grained. The mark lives in strut's code while jarvis is on a graph, because jarvis reads any Schema property it doesn't know as an attribute. It isn'tAbout.hidden_types, which stripsDomain_strut, the label strut's soft delete is scoped by. It isn't removingindexeither, which would give the catch-all text, not none. The pass also deletes these types' existing vectors (~448k).indexthrough jarvis's Schema API isn't the route. That API does re-embed the type, but inside the request, and every update rebuilds jarvis's shared keyword index. It does nothing for nodes written afterwards, and adds no labels.To rule on. Rulings 1, 3, 4 and 5 are proposed, not made; ruling 2 (no vectors for execution records) is decided. Without
Turn, the first catch-up on swarm38 is at most ~144k nodes, code (~40k) first.