CIRCUIT has deliberate edges. Here is where they are today. None of them block the golden path.
Java only. The code layer is built from a SCIP
index produced by scip-java, which drives your project's build to resolve symbols. The
graph model is language-neutral downstream of SCIP, but the indexer, build drivers, and
framework adapters (Spring, JAX-RS) are Java.
The repo must build. Indexing drives the build, so the first ingest compiles the target. On a large multi-module codebase that costs real time and heap (Fineract, all modules: ~28 min). Reads are fast afterward — the cost is front-loaded into building the graph once.
No incremental ingest. An ingest is a clean wipe-and-rebuild; every run reconstructs the graph from scratch. This trades a cheap re-sync for a graph with no stale nodes. (Commit-delta incremental ingest is the natural next step — the schema is already commit-addressable.)
One corpus per Neo4j. A graph holds one repository; ingesting a new corpus replaces it. Several corpora means several Neo4j instances — the CLI is built around a single active graph.
Schema changes need a re-ingest. The graph shape is versioned with the tool; you adopt a new schema by re-ingesting, not migrating in place. Under wipe-and-rebuild, that is the same cost as any ingest.
A future JDK may need a pinned ingest. scip-java's bundled Protocol Buffers calls
sun.misc.Unsafe::arrayBaseOffset, deprecated for removal. It is benign through Java 25
(a one-line warning at ingest). A JDK that removes the method would mean pinning an older
JDK for the ingest step until the toolchain updates — query and serve are unaffected.
Only PetClinic ships. The repo ships a ready-to-restore PetClinic dump — small,
public, no key. The Fineract graph behind the case-study numbers is not published;
reproduce it with circuit ingest <fineract-url>.
Embedding is the only thing that can touch the network, and only if you choose the cloud option:
- Cloud (default): Jina AI embeddings over HTTPS — the code text of the symbols being embedded, nothing else.
- Self-hosted (no egress, no key): a local endpoint serving the same model. Identical
vectors, nothing leaves the machine — see
docs/design/local-embedding-selfhost.md.
Structure, history, and graph queries are fully local against your Neo4j. CIRCUIT emits no telemetry.