weft
MIT · foundryside-dev GitHub

Filigree · work state / issue lifecycle · Python

Turns a swarm of stateless agents into a coordinated workforce.

Filigree owns issues, dependencies, and workflow state machines — giving an agent a race-free claim, a dependency-aware ready queue, and a pre-computed orientation file, so no two agents collide. Local-first: SQLite, no cloud, no accounts.

Python v3.0.0 shipped — version is the repo's, see the repo
Quick start → See the dashboard →
$ filigree session-context --json
one SEI, one ready-queue, typed facts from every present peer…
loomweave:eid:3ab7790f12 in progress warplinepresent wardlineabsent legisstale

What it is

The federation's work-state surface.

Traditional issue trackers are human-first; agents scrape CLI output or parse API responses. Filigree flips this — agents get a pre-computed context.md at session start, claim work with optimistic locking, and resume sessions via event streams without re-reading history. Each project gets a .weft/filigree/ directory (like .git/) holding a SQLite database, config, and the auto-generated context summary; legacy .filigree/ stores keep working and migrate on the next filigree init.

Standalone-first; the Weft surface is optional enrichment.
Filigree runs fully on its own. It hosts the named weft HTTP generation at /api/weft/* that siblings use as transport, and it keys its facts on the SEI — but it consumes that identity, never mints it. Loomweave is the identity authority; Filigree treats the SEI as opaque. (how the SEI spine works →)
task
open in progress closed
feature
proposed building reviewing done
bug · hard-gate
triage fixing verifying closed

The bug machine has a hard gate: verifying → closed requires a recorded fix_verification. A fix is not done because someone says so; it is done when the verification is on the record.

Key capabilities · the five things it gives you

Built so a swarm of agents does not collide.

Atomic claiming

work_start / work_start_next claim and transition in one optimistic-locked step. Do not chain a separate claim with a status update — the two-step form races; the combined verb does not.

Dependency-aware ready queue

Blockers, the ready-queue, and critical-path analysis — an agent asks for the next startable issue and gets one that is actually unblocked, not just open.

~118 MCP tools

Agents interact natively over MCP — no parsing text. The count is the repo's authority; see docs/mcp.md for the live surface.

Entity associations

entity_association_add binds an issue to an opaque external entity id (a loomweave:eid:… SEI or a legacy locator). The consumer does drift detection against the hash captured at attach time.

Pre-computed context

context.md is regenerated on every mutation and injected at session start, so an agent orients instantly instead of re-reading history.

The web dashboard

The only Weft member with a GUI — everything else is CLI/MCP-first. Real-time Kanban, a dependency graph, and Files/Health, local-first on localhost:8377. See it below ↓

The dashboard · unique to Filigree

The only Weft member with a web UI.

A local-first board on localhost:8377 — Kanban lanes with drag-and-drop, a Graph v2 dependency view, Files and Health, and a slide-in issue detail surfacing the federation's signature data vocabulary. Everything else in the suite is CLI/MCP-first; this is the one place a human on the loop can watch the board.

Ready 2
LAC-21 P2

Wire post-commit hook for `warpline changed`

open
LAC-05 P1

Wardline → Legis signed-scan handshake

approved
In progress 2
LAC-22 P0

elspeth judge-gate parity for the protected cell

in progress
LAC-12 P0

wl-log-injection reaches preview sink, unbaselined

fixing
Review 2
LAC-08 P1

SEI-keyed governed sign-off binding

reviewing
LAC-19 P1

Loomweave + Filigree orphans issue on rename

verifying
Done 1
LAC-03 P2

Backfill temporal store via warpline ingest

closed
Illustrative recreation of the Filigree dashboard against the Lacuna specimen — composed from the design-system kit, not a screenshot of the shipping localhost:8377 UI. Expect cosmetic divergence from the running dashboard.

Usage snapshot · curated, not the full reference

The atomic loop.

# at session start
filigree session-context

# claim the next startable issue (atomic: claim + transition)
filigree start-next-work --assignee me

# …do the work, commit, then
filigree close <id>

# watch the board (the one Weft GUI)
filigree dashboard --port=8377
Use the atomic verb — do not chain claim + status.
The two-step claim then status-update form races against other agents. start-work / start-next-work claim and transition in one step. The full CLI and MCP surface live in the repo — docs/cli.md and docs/mcp.md.

How it composes · value is the weave

Each pairing lights up a capability Filigree does not have alone.

Filigree's slice of the combination matrix. Every status is honest on its face: a partial or planned pair is never rendered as live. Each partner links across to its own site.

Filigree Wardline live

Findings become tracked work.

A-1: native emitter shipped; asterisk stays live until the Loomweave-absent path is proven end-to-end (currently unit/server-wiring tier).

Filigree Loomweave 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.

Filigree Legis live

Governed issue lifecycle — sign-offs, RTM, verification.

Filigree Warpline live

The re-verification worklist becomes tracked work.

Filigree consumer (warpline_worklist_ingest) shipped in Filigree 3.0.0 — the EARNED inbound seam.

Status & honest limits

What it is not.

A-1 asterisk: the Wardline → Filigree pairing is live, but watched.
The native findings-to-work emitter has shipped, but the asterisk stays live until the Loomweave-absent path is proven end-to-end — currently exercised only at the unit / server-wiring tier. The pair is not yet fully proven; we say so rather than round it up to a clean live.
Loomweave + Filigree is partial — and it orphans on rename.
Issues bound to live code should survive refactors. The drift-aware entity⇄issue binding still matures; today it can orphan an issue on a rename. This is the one partial in Filigree's matrix slice, and we render it as partial.
Consumes identity; never an authority.
Filigree keys its facts on the SEI but treats it as opaque and never mints it. When a sibling is absent, that slot reads absent — explicitly, never as an implied clean state.

Want to see it actually run?

Watch the whole federation analyze Lacuna, the demonstration specimen — tracked work, race-free claims, and the dashboard, on a small app with catalogued flaws.

See it on the specimen → Read the doctrine →