Skip to content

Commit 3077801

Browse files
authored
Merge pull request #21 from Litenova-Solutions/feature/v3.1
V3.1: open-ended floor (S3 signal-sufficiency contract first)
2 parents 6bd5be9 + dd8f403 commit 3077801

114 files changed

Lines changed: 36123 additions & 6450 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ jobs:
2828
run: |
2929
# Keep in sync with NuGetAuditSuppress entries in Directory.Build.props.
3030
$suppressedAdvisories = @(
31-
'https://github.com/advisories/GHSA-hv8m-jj95-wg3x'
31+
'https://github.com/advisories/GHSA-hv8m-jj95-wg3x',
32+
'https://github.com/advisories/GHSA-vh6j-jc39-fggf',
33+
'https://github.com/advisories/GHSA-h4j7-5rxr-p4wc'
3234
)
3335
$failed = $false
3436
Get-ChildItem -Path src -Recurse -Filter *.csproj | ForEach-Object {

AGENTS.md

Lines changed: 13 additions & 18 deletions
Large diffs are not rendered by default.

CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,30 @@
22

33
All notable changes to Fuse are documented here. The format is based on Keep a Changelog. Fuse 3.0 is a product overhaul; backward compatibility with 2.x output, commands, and the MCP tool surface is not a goal.
44

5+
## [3.1.0] - 2026-06-30
6+
7+
Fuse 3.1 sharpens the .NET semantic engine on the modes where 3.0 was weakest: open-ended discovery, language breadth, and first-call latency. Dense retrieval is now on by default and fully offline, the open-ended path refuses and routes instead of guessing on a vague request, and more of the codebase's own vocabulary is searchable without a model. The numbers behind every claim are on the [benchmarks page](https://fuse.codes/docs/project/benchmarks).
8+
9+
### Added
10+
11+
- **Dense retrieval, on by default and offline.** A small local embedding model (all-MiniLM-L6-v2, about 23 MB) is fetched once and cached on the first index; every later run and all query-time work is offline, and the query is embedded as written, never paraphrased. It blends with the lexical and graph signals so a prose task finds a file by meaning. When the model is genuinely absent the path falls back to the deterministic lexical floor. Opt out with `FUSE_DENSE` set to a falsy value.
12+
- **Signal-sufficiency contract on the open-ended path.** `fuse_localize` now grades every request from the candidate score distribution into confident (return the tight set), partial (a small flagged set plus a navigation map), or insufficient (refuse and return only a navigation map and an explicit ask for a symbol, route, service, request, config section, or git base). On a no-signal title Fuse hands back a map instead of guessing. A `strict` option hard-requires an anchor; the default stays best-effort so a one-shot client is never stranded.
13+
- **Offline vocabulary bridges.** Identifier subword indexing (so the prose word `rounding` matches `ApplyRoundingMode`), Porter stemming, and a weighted comment field make the codebase's own vocabulary searchable without a model.
14+
- **Structural ranking signals.** A dependency-centrality prior and a git co-change prior (mined from a bounded git-history window at index time) nudge ambiguous candidates by where a file sits in the graph and which files it historically changes with. Both are capped so they tune rather than dominate.
15+
- **Iterative exploration tool.** `fuse_neighbors` returns the graph neighborhood of a file, the callers and implementers of a symbol, or the structurally central files of an area, ranked, bounded, and body-free.
16+
- **Multi-language breadth.** A provider seam drives the syntax tier; Python and JavaScript/TypeScript are supported at the syntax tier (token-efficient context and search) alongside C#. Each indexed file carries a `language` tag so retrieval can filter or blend by language. The deep typed graph remains .NET-only.
17+
- **Opt-in fast cold start.** In the `mcp serve` host, `FUSE_BG_UPGRADE=1` serves the syntax tier on the first read (no MSBuild wait) and upgrades to the full semantic graph in the background; the first answer drops from about 70 seconds to about 20 seconds on a mid-size repository.
18+
19+
### Changed
20+
21+
- **Open-ended localization is a graded contract, not a fixed candidate list.** Precision when the engine answers is up and false rejections on answerable queries are down; bare-title recall is no longer the headline for this path (the contract metrics are). With a git base, the routed mode remains change-impact review, which is where recall and precision are strongest.
22+
- **Persistent index schema bumped to version 14.** The index rebuilds on the first run after upgrade (it adds the subword, stem, and comment full-text fields and the file language tag). No action is needed; the rebuild is automatic.
23+
- **Benchmark corpus rebuilt and peer comparison expanded.** The corpus now uses repositories that restore and index in semantic or partial mode on the .NET 10 SDK, and the peer comparison runs Fuse against CodeGraph, coa-codesearch, and Serena head-to-head. The benchmarks page and the docs are rewritten as current-state snapshots.
24+
25+
### Fixed
26+
27+
- **Directory walk no longer escapes the collection root through a symlinked or junctioned directory.** A file reached by descending through a reparse-point directory that points outside the root is now excluded, matching the existing handling for file symlinks.
28+
529
## [3.0.0] - 2026-06-26
630

731
Fuse 3.0 turns Fuse from a token-reduction context optimizer into a Roslyn-backed .NET semantic context engine for AI agents. It maintains a warm, persistent semantic index of a workspace and serves precise, provenance-backed context from it: which implementation is injected, which endpoint handles a route, which handler processes a request, which options type binds a config section, and what a git diff semantically impacts. Token reduction is now a rendering and transport feature, not the product.

Directory.Build.props

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
<ItemGroup>
2525
<!-- MessagePack arrives only as a transitive of StreamJsonRpc (the UI host transport) and flows into every
2626
project that references Fuse.Cli, including the test projects. It is never exercised: the host uses the
27-
System.Text.Json formatter, not the MessagePack formatter, so the MessagePack deserialization advisory
28-
(GHSA-hv8m-jj95-wg3x) is unreachable. Suppressed repo-wide with that documented intent rather than
29-
pinning a 3.x MessagePack that StreamJsonRpc 2.x does not accept. -->
27+
System.Text.Json formatter, not the MessagePack formatter, so the MessagePack deserialization advisories
28+
are unreachable. Suppressed repo-wide with that documented intent rather than pinning a 3.x MessagePack
29+
that StreamJsonRpc 2.x does not accept. GHSA-hv8m-jj95-wg3x is the moderate untrusted-data advisory;
30+
GHSA-vh6j-jc39-fggf is the high-severity advisory on the same package and code path. -->
3031
<NuGetAuditSuppress Include="https://github.com/advisories/GHSA-hv8m-jj95-wg3x" />
32+
<NuGetAuditSuppress Include="https://github.com/advisories/GHSA-vh6j-jc39-fggf" />
3133
<!-- Microsoft.Build.Tasks.Core 17.7.2 arrives only as a reference-only transitive of
3234
Microsoft.CodeAnalysis.Workspaces.MSBuild. At runtime the real MSBuild assemblies are
3335
resolved from the installed SDK via MSBuildLocator.RegisterDefaults(), not this restored

LAUNCH.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# Launch post and demo script
2+
3+
This file is the launch material drawn from the [messaging source of truth](site/content/docs/project/messaging.mdx). Every number is quoted from `tests/benchmarks/results` and linked to the [benchmarks page](https://fuse.codes/docs/project/benchmarks); no head-to-head ranking is claimed beyond what the peer harness measures. The 30-to-60-second screen-capture demo is recorded from the script below (see "Status" at the end for what remains a manual step).
4+
5+
## Launch blog post (draft)
6+
7+
### AI coding assistants get lost in .NET codebases, and it costs you tokens
8+
9+
Watch an AI assistant start a task in a real .NET solution. Before it changes a line, it explores: it lists directories, greps for a name, and opens file after file trying to learn which ones matter. On a solution with hundreds of C# files, most of the context window goes to the hunt, not the change. And there is a class of question it cannot answer by grepping at all: which class does the container actually inject for this interface? Which handler runs this request? Which action does this route hit? Those answers live in the wiring, not in the file names, so the assistant guesses, and a wrong guess sends it opening more files.
10+
11+
That is the problem Fuse attacks.
12+
13+
Fuse is a Model Context Protocol server for .NET. It reads your code with Roslyn and builds a typed graph of how the code is wired, then serves your assistant the files a task needs, scoped and reduced, in one call. The assistant answers from the real graph instead of guessing, spends fewer tokens, and stops paying for the explore loop.
14+
15+
What that looks like in practice, on the eShopOnWeb sample application:
16+
17+
- Ask "what implements `IBasketService`, and what would a change to it touch?" Without Fuse, the assistant greps `IBasketService`, gets a page of hits, and opens files to work out which is the real implementation. With Fuse, `fuse_resolve service="IBasketService"` returns `BasketService` directly, tagged with the `di_resolves_to` edge and the registration that proves it.
18+
- Ask it to review a branch. `fuse_review changedSince="main"` returns the changed files plus their semantic blast radius (the interface a changed type implements, its consumers) with provenance for each file, in about 958 tokens, keeping 100 percent of the changed files.
19+
20+
The numbers, measured over a commit-pinned corpus (Scrutor, Ardalis.Specification, NodaTime, and eShopOnWeb), counted with `o200k_base`, and reproduced with `fuse eval`:
21+
22+
- The extracted wiring graph matches the hand-built ground truth exactly on the wiring fixture: 22 of 22 edges, recall and precision 1.0.
23+
- `fuse review` over 53 real merged pull requests keeps 100 percent of the changed files at 79.8 percent precision in a median 958 returned tokens; a grep baseline reaches 53 percent recall at 14 percent precision.
24+
- Driving Claude (sonnet-4-6) over 12 pull requests, the Fuse MCP arm edged out bare filesystem tools on file recall (30 versus 26 percent) at comparable token cost, on a small, model-dependent sample.
25+
26+
And the honest part, because honesty is the point of a tool you trust with your codebase: the weakest mode is open-ended localization from a bare task title with no git base, where Fuse recalls about 15 percent of the changed files. Rather than return a low-precision guess on a title that names no code, Fuse refuses and hands back a navigation map asking for a symbol, a route, or a git base. Every number above, including that one, is on the [benchmarks page](https://fuse.codes/docs/project/benchmarks) with the reproduction command, and the peer comparison there is the only place a head-to-head is stated, because that is the only place the harness backs it.
27+
28+
Install it, connect it to your agent, and give your assistant a map of your code:
29+
30+
```bash
31+
dotnet tool install -g Fuse
32+
fuse mcp install --rules
33+
```
34+
35+
It works with Claude Code, Cursor, and GitHub Copilot. The deepest support is on .NET; other languages are covered at the syntax tier today.
36+
37+
### Channels
38+
39+
- The .NET communities: r/dotnet, the .NET Discord, and a dev.to / blog cross-post.
40+
- The MCP ecosystem: the MCP Registry (the manifest is in `mcp-registry/server.json`) and the awesome-mcp-servers lists.
41+
- A Show HN with the honest-benchmarks angle (lead with the problem and the reproducible numbers, including the weak mode, not a ranking).
42+
43+
## Demo script (eShopOnWeb, reproducible)
44+
45+
A 30-to-60-second screen capture follows this script. It is a real session on a recognizable .NET application already in the corpus, showing the same two questions answered with and without Fuse. The point is correct-and-cheap with Fuse versus lost-without-it; it does not assert a head-to-head win over another tool.
46+
47+
Setup (once):
48+
49+
```bash
50+
git clone https://github.com/dotnet-architecture/eShopOnWeb
51+
cd eShopOnWeb
52+
dotnet tool install -g Fuse
53+
fuse index .
54+
```
55+
56+
Scene 1, without Fuse (bare tools): ask the agent "what implements IBasketService and what does a change to it touch?" Show it grepping, getting many hits, and opening several files to guess the implementation and consumers.
57+
58+
Scene 2, with Fuse: ask the same question. Show:
59+
60+
```bash
61+
fuse resolve --service IBasketService
62+
# -> BasketService (src/ApplicationCore/Services/BasketService.cs), edge di_resolves_to
63+
64+
fuse review --changed-since main
65+
# -> changed files + support files (the IBasketService interface, its consumers),
66+
# 100% of changed files kept, ~958 tokens median, with provenance
67+
```
68+
69+
End on the contrast: one scoped, provenance-backed answer instead of a file-opening hunt.
70+
71+
## Status
72+
73+
- Written and sourced: the launch post, the channel list, and the reproducible demo script (above).
74+
- Remaining manual steps (cannot be produced from the build environment): record the screen capture from the demo script, publish the post to the chosen channels, and link the published asset from the landing page hero and the README. Until the recording exists, the landing page and README link the sourced benchmarks rather than a video, to avoid linking an asset that is not yet published.

0 commit comments

Comments
 (0)