Make the first run real: shared embedded storage, guided setup, and a release gate that installs the tarball - #37
Merged
Merged
Conversation
… release gate that installs the tarball Two processes on one embedded data directory used to spawn two database servers and silently overwrite each other; a controlled shutdown order erased an indexed graph. The first process now takes an atomic owner lease and records its socket; later processes attach as clients, so Claude Code and the dashboard share one database. Stale leases from killed owners reclaim safely, start races resolve to one owner, forged leases are rejected, and an owner vanishing surfaces as a plain error. An empty database is now a valid first run everywhere instead of a raw empty-key error. The dashboard opens on a guided setup flow when nothing is configured: storage status with platform guidance, the embedding profile, Browse, index, and live progress, landing on the explorer when done. Local embeddings are the no-key default with visible download progress, after fixing a runtime Response mismatch that broke the model loader on a clean install and that the old smoke hid by preloading a cache. Embedding profiles persist; switching providers requires an explicit migration that recreates the index at the new dimension, and wrong-dimension vectors are refused at the write boundary. The query and search panels keep their own input and results across tab switches. The built API boots from dist, and an occupied port exits with one plain line instead of a stack trace. The broken pack path now refuses with the canonical command, and the release gate installs the exact tarball into a clean consumer, boots both binaries, completes a real MCP handshake, indexes and restarts, runs both binaries concurrently on one data directory, and proves the graph survives shutdown in both orders. The README documents only what that gate proves. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The project-scoped embedding wrapper refused the Metadata read the continuation pass performs before updating nodes, so after indexing only the initial pass's nodes were embedded while the continuation reported completion with per-node warnings. Operational reads pass through; the scope applies to embeddable node queries only. The continuation test's stub now emits vectors at the persisted dimension, which is what surfaced this. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…age as a state, not a 500 The occupied-port test leaned on macOS dual-stack behavior; the server now binds an explicit host with its error handler attached before listen, and the test occupies that exact host, proven on Linux as well. On platforms without embedded storage and no external FalkorDB configured, reads return the setup-status guidance instead of a generic 500, and the installed-package smoke mirrors the driver's platform rules so Windows asserts the guidance path rather than an indexing flow it cannot run. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n MCP status Setting exitCode left termination to natural event-loop drain, which Linux CI under Turbo contention stretched past the test deadline; the server now flushes its one remediation line and exits. MCP status returned a transient starting state from background warmup instead of awaiting the connection outcome, so unsupported platforms reported starting where the API reported blocked with guidance. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.
Why this gates publishing
A scout ran the experiments instead of reasoning about them and found three release blockers: two processes on one embedded data directory spawned two database servers and a shutdown-order test erased an indexed graph; pnpm pack from the package directory produced a package with no server in it; and an empty database was not a working first run (500s and raw empty-key errors on both binaries, which is exactly what the first live dashboard load hit).
What changed, in five sequential waves
Review
One adversarial round: the lease and empty-graph work survived SIGKILL, races, forged leases, and mid-query owner death. Four blockers fell in the embedding and startup layers: the migration button did not migrate, the local default failed on a clean install while the smoke hid it behind a test-only cache preload (root cause: a Response constructor mismatch in the model loader's fetch path), wrong-dimension vectors were stored silently, and an occupied port crashed with a stack trace. All fixed red-first. The full suite then caught one more regression in the scoped continuation pass, fixed at the cause.
Verification
pnpm turbo build 21/21, test 36/36, typecheck 20/20, release:check green from the exact tarball. Core 281, graph 147 plus 60 embedded integration, api 267, mcp-server 107, dashboard 75, plugin-nlp 151.
🤖 Generated with Claude Code