weft
MIT · foundryside-dev GitHub

Loomweave · code structure + identity authority · Rust

The federation's map — and its coordinate system.

Turns a codebase into a queryable, identity-stable structural graph an agent reads instead of re-deriving by grep — and mints the SEI every other member keys on. Deterministic structural extraction; no LLM needed to build the graph.

Rust version v1.2.1 · latest release
$ loomweave entity_orientation_pack_get
resolving entity → one SEI, typed facts from every present peer…
loomweave:eid:7f3a9c2e1b… loomweavepresent wardlinepresent warplinepresent legisabsent plainweaveunavailable

What it is · the now

A structural graph an agent queries instead of re-grepping.

Loomweave walks a codebase, extracts entities — functions, classes, modules (the Rust plugin extends this with struct, enum, trait, type_alias, const, static, macro, impl) — and the edges between them (contains, calls, references, imports, plus implements/derives in Rust and inherits_from/decorates in Python). The structural graph persists to a local SQLite store and is served over CLI, MCP (stdio), and a loopback HTTP read API. Loomweave owns the now: the current structure of the code.

Deterministic structural extraction — no LLM required to build the graph.
loomweave analyze extracts entities and edges with no model and no credentials — it is the fastest way to verify an install. The LLM is dispatched lazily, one entity at a time, only on an explicit entity_summary_get call after live-provider opt-in. Every traversal result also carries a scope_excludes block naming exactly what was not searched, so an empty answer reads as "none found among the edges I can see," never a guaranteed true negative.

Key capabilities

Structure, identity, and one-call orientation.

Structural extraction

Entities and typed edges across first-party Python and Rust plugins, persisted to a local graph. Subsystem clustering groups modules into navigable first-class entities; a BLAKE3 content_hash per entity body is the drift signal every cross-tool binding checks.

SEI — minting, persistence, resolution, lineage

The keystone. Loomweave mints a durable SEI for every entity, persists it across re-analysis, re-binds it through renames and moves, and serves resolve / lineage for the suite. The {plugin}:{kind}:{qualname} locator is the address; SEI is the identity (ADR-038).

One-shot orientation

entity_orientation_pack_get returns find + at + source + neighborhood + issues + freshness in a single call — the read a consult-mode agent makes first. SARIF import folds external findings into the graph.

Freshness, stated honestly

Graph answers carry completeness and staleness, never an implied "complete" — the same honesty the whole suite keys on.

graph completeness86%
staleness: 2 commits behind

The full MCP surface (≈46 tools — snapshot, see the repo) is grouped by family: navigation and graph traversal, briefing and source inspection, guidance / findings / federation context, analyze lifecycle, and faceted shortcut queries. The exact count moves with the release — the repo is authoritative.

Usage snapshot · install → analyze → serve

Install, walk the corpus, serve the graph.

analyze needs no LLM credentials — it is the fastest way to verify the install end-to-end. The deep CLI and MCP reference lives in the repo.

# install the loomweave CLI (+ Python & Rust plugins) from PyPI
uv tool install loomweave    # or: pipx install loomweave

# wire the agent, walk the corpus, serve the graph over MCP
loomweave install --path .   # init .weft/loomweave/, wire the MCP client + skill + hook
loomweave analyze            # extract entities + edges (no LLM credentials needed)
loomweave serve              # expose the consult-mode MCP surface

A full walkthrough — fresh machine, a small public project, an MCP client, three questions — is in docs/operator/getting-started.md. Prefer to build from source? cargo install --path crates/loomweave-cli; see the README.

How it composes · value is the weave

Each pairing lights up a capability neither tool has alone.

These are Loomweave's rows of the combination matrix. Every pairing's status is honest on its face — a partial or planned pair is never rendered as live. Each partner links to its own site; the matrix is the sanctioned cross-link channel (IA §2.2).

Loomweave Wardline live

Structure + trust posture in one view — the dossier.

Loomweave Filigree live

Issues bound to live code, surviving refactors.

Drift-aware entity⇄issue binding shipped: filigree stores content_hash_at_attach; loomweave issues_for detects + reports drift, integration-tested. Asterisk until a two-real-daemon drift dogfood lands.

Loomweave Legis live

Governance attestations keyed to stable code identity.

Loomweave Warpline live

"Now" + "over time" — change history keyed on the SEI spine.

Shipped: warpline resolves loomweave SEIs (entity_resolve) and keys its temporal surfaces on them, default-on at ingest. Asterisk until an automated live round-trip e2e gate lands.

Loomweave Plainweave partial

Intent bound to stable code identity — every requirement keys on the SEI.

Consumes Loomweave SEI via a catalog adapter; the intent graph reproduced on two LIVE peer catalogs (Lacuna, Loomweave), not stubs (Plainweave PDR-008). Still maturing — not yet a shipped seam: catalog public-surface tagging is degraded off Loomweave, and it falls back to file/symbol refs when Loomweave is absent.

SEI · THE CONNECTIVE TISSUE

One durable identity. Facts survive the rename.

Loomweave mints a Stable Entity Identity (SEI) for every function, class and module. Every other member keys its facts on that SEI — so a dossier stays correct when the code is refactored tomorrow. SEI is LOCKED (2026-06-05): the interface is frozen; remaining member backfills are conformance tasks.

entity · minted here
loomweave:eid:7f3a9c2e1b…
typed facts · one call
Loomweave callers · neighborhood present
Wardline EXTERNAL_RAW taint present
Filigree 2 open issues present
Legis no attestation yet absent
Warpline last change · 9d ago stale
Plainweave peer unreachable unavailable
present peer present, fact attached
absent peer present, no fact — explicitly missing, never "clean"
unavailable peer unreachable
stale fact attached but past its freshness window
Status & honest limits — stated in the open.
  • Rust analysis is parse-only. Macro expansions and external-crate edge targets are not resolved; closures and nested functions fold into the nearest named item. See rust-known-limitations.md.
  • Rust references has a narrow deferred envelope. Match/let pattern paths and enum-variant discriminant expressions are not emitted yet.
  • Public registries are not the release source yet. Tagged GitHub Release assets remain canonical until a later ADR introduces PyPI / crates.io publication.
  • Loomweave↔Filigree is partial. The drift-aware entity⇄issue binding is still maturing — it is not rounded up to live.
  • SEI is the connective tissue: every binding keys on it; a tool keying on a mutable locator silently orphans every combination it is in.
  • There is no weft:// URI scheme and no federation registry/broker — identity is closed by SEI.

Want to see it actually run?

make tour the whole federation against Lacuna, the demonstration specimen — Loomweave catalogs its structural findings (dead entity, circular import, duplicate locator) alongside every other member at once.

See it on the specimen →