<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>GraphSlice Blog</title>
    <link>https://graphslice.com/blog/</link>
    <atom:link href="https://graphslice.com/blog/feed.xml" rel="self" type="application/rss+xml" />
    <description>Notes on semantic code graphs, C# code intelligence, and feeding LLMs the context they actually need.</description>
    <language>en</language>
    <lastBuildDate>Tue, 21 Jul 2026 09:00:00 GMT</lastBuildDate>
    <item>
      <title>The codebase nobody fully remembers</title>
      <link>https://graphslice.com/blog/the-codebase-nobody-remembers/</link>
      <guid isPermaLink="true">https://graphslice.com/blog/the-codebase-nobody-remembers/</guid>
      <pubDate>Tue, 21 Jul 2026 09:00:00 GMT</pubDate>
      <description>Every long-lived .NET shop has one: a solution that works, ships, and quietly outlived everyone who ever understood it. A story about institutional memory and the one participant that never forgot.</description>
      <content:encoded><![CDATA[<p>Somewhere in your company there is a solution file that opens 120 projects,
and nobody alive can tell you why all 120 are there.</p>
<p>It works. It ships. It has paid salaries for a decade. And it has slowly
crossed the line from <em>understood</em> to <em>inherited</em>. The developer who knew why
<code>OrderProcessor</code> has three separate retry paths took that knowledge to another
company. The reason the scheduler lives in its own process became a story that
shrank with every retelling. Now it is a sticky note that says
<strong>don&#39;t touch the scheduler</strong>.</p>
<p>You know this codebase. You might be its maintainer. That job teaches a
particular kind of care. You move slowly. You read twice. You carry a private
map in your head of which floors creak. That knowledge in your head is the
real asset. It is also the thing that walks out the door with every
resignation.</p>
<h2 id="memory-decays-code-doesnt">Memory decays. Code doesn&#39;t.</h2>
<p>Here is the asymmetry that makes legacy software feel haunted: the humans
forget, but the code never does. The three retry paths still know exactly who
calls them. The scheduler still knows exactly which types it touches. Every
dependency, every override, every subscription is still <em>there</em>, fully
determined, sitting in the source.</p>
<p>The knowledge did not vanish. It just stopped being legible to people.</p>
<h2 id="the-participant-that-never-forgot">The participant that never forgot</h2>
<p>And here is the strange part. One participant in your team re-derives all of
that knowledge, perfectly, several times a day: the compiler.</p>
<p>Every build, it resolves every reference, binds every call to its exact
target, and checks every implementation against its interface. The result is
a complete, correct graph of how the whole 120-project organism fits
together. The compiler must build that graph, or it could not compile a
single file.</p>
<p>Then it throws the graph away.</p>
<p>The most complete institutional memory your codebase has ever had is built
and discarded on every build, while the humans get by on folklore and sticky
notes.</p>
<p>That leaves a question which, once asked, refuses to leave. What if that
graph were not thrown away? What if it were readily accessible — not only to
the compiler, but also to the newest reader on your team: the agent in your
editor, about to plan an edit in a codebase it has never seen?</p>
<p>Everything the veterans took with them is still derivable. Who calls the
three retry paths. What the scheduler actually touches. Why project 87 is in
the solution at all. Hand the agent the graph, and day one starts to look
like year five.</p>
<p>That question is the idea that got us to found GraphSlice: stop throwing the
graph away, and give it to the agent that needs it most.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Are we still talking loops, or did we shift to graphs yet?</title>
      <link>https://graphslice.com/blog/loops-or-graphs/</link>
      <guid isPermaLink="true">https://graphslice.com/blog/loops-or-graphs/</guid>
      <pubDate>Sun, 19 Jul 2026 09:00:00 GMT</pubDate>
      <description>The godfather of the agentic scene dropped a six-word tweet about loops and graphs, and 2.5 million people looked up. He didn't mean us. Probably. Here's what a graph-shaped question could mean, and why the arrow points our way.</description>
      <content:encoded><![CDATA[<p>At 00:34 on a Friday, a six-word tweet went up. Two and a half million
people looked at it. No thread. No diagram. No product. Just a question,
thrown at the timeline like a coin into a fountain:</p>
<blockquote>
<p>Are we still talking loops or did we shift to graphs yet?</p>
</blockquote>
<p><em>Peter Steinberger (<a href="https://x.com/steipete">@steipete</a>), 18 July 2026 · 2.5M views · 362 reposts</em></p>
<p>It got 1,200 replies. We read a lot of them. Nobody agreed on what he meant.
That is exactly why we can&#39;t stop thinking about it.</p>
<h2 id="whos-asking">Who&#39;s asking</h2>
<p>If you&#39;ve spent any time with the <em>openclaw</em> crowd, you know what&#39;s going on
here. These are the people who point a coding agent at their own repo and
yell <strong>go</strong>. Peter is not selling anything with that tweet. That&#39;s what gives
it weight. When the godfather of the loop starts wondering, in public,
whether the loop was ever the whole story, you don&#39;t scroll past it. You
screenshot it.</p>
<p>So we did. And then we did the thing you&#39;re not supposed to do with an
ambiguous tweet: we tried to figure out what it <em>meant</em>.</p>
<h2 id="what-could-it-mean">What could it mean?</h2>
<p>Honestly? Nobody knows, including the author, probably. &quot;graphs&quot; is one of
those words that is specific enough to feel like a thesis and vague enough
to be four different ones. Read the replies and you&#39;ll find at least these
camps, each convinced they&#39;re the one he meant:</p>
<table>
<thead>
<tr>
<th>The reading</th>
<th>&quot;Graphs&quot; means…</th>
<th>The itch it&#39;s scratching</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Workflow graphs</strong></td>
<td>Run the agent&#39;s steps as a DAG, not a <code>while</code> loop</td>
<td>The loop wanders; a graph is a plan you can see</td>
</tr>
<tr>
<td><strong>GraphRAG</strong></td>
<td>Retrieve over an entity graph, not a pile of embeddings</td>
<td>Embeddings return <em>nearby</em>, not <em>related</em></td>
</tr>
<tr>
<td><strong>Knowledge graphs</strong></td>
<td>Give the model structured facts to reason over</td>
<td>Text is lossy; structure survives</td>
</tr>
<tr>
<td><strong>Code graphs</strong></td>
<td>Feed the agent how the software actually connects</td>
<td>The answer lives <em>between</em> the files</td>
</tr>
</tbody></table>
<p>Four readings, one shape. Notice what they have in common: every single one
is a quiet admission that <strong>the loop, on its own, is running blind.</strong></p>
<h2 id="the-loop-was-never-the-problem-the-blindfold-was">The loop was never the problem. The blindfold was.</h2>
<p>Let&#39;s be fair to the loop. The loop is <em>great</em>. The model calls a tool,
reads the result, decides what to do next, goes again. That inner engine is
most of why 2025 felt like magic. Nobody sane wants to throw it out.</p>
<p>But a loop is an engine, and an engine is not a map. Point a tireless agent
at a million-line C# solution and tell it to loop. What you get is a machine
that can <code>grep</code>, guess, and <code>grep</code> again — very fast, forever — and never
ship. It doesn&#39;t know that <code>IPaymentProcessor</code> has four implementations, or
that one of them only appears in a DI container three projects away. It
learns that the expensive way: it loops into the wall until the wall gives.</p>
<p>That&#39;s the itch under Steinberger&#39;s question. &quot;Did we shift to graphs yet?&quot;
is the polite version of <em>how long will we let these things run in circles
because we never handed them the map?</em></p>
<h2 id="weve-been-the-graph-the-whole-time">We&#39;ve been the graph the whole time</h2>
<p>We&#39;ll say the quiet part, because it&#39;s the only part we&#39;re qualified to say:
for GraphSlice, this was never a &quot;shift.&quot; There was no loop era we&#39;re now
leaving. We started with a graph.</p>
<p>GraphSlice is a compiler-grade
<a href="/blog/why-ai-assistants-should-query-architecture/">semantic code graph</a> of
your C# solution. Real types, methods, references, inheritance, calls edges
(<code>CALLS</code>), package boundaries. The compiler builds this graph on every build
and then throws it away. We keep it. And we don&#39;t hand the agent the whole
graph, because that just bloats the context. Instead, we hand the agent a
<a href="/blog/what-is-a-context-slice/">context slice</a>: the minimal connected
subgraph that answers <em>one</em> question, and nothing else.</p>
<pre><code class="language-text">&gt; what breaks if I change IPaymentProcessor?

IPaymentProcessor (interface, Billing.Core)
├── implemented by StripeProcessor       (Billing.Stripe)
├── implemented by InvoiceProcessor      (Billing.Invoicing)
├── injected into CheckoutService..ctor  (Web.Checkout)
└── mocked in PaymentProcessorTests      (Billing.Tests)
</code></pre>
<p>Put that in front of the loop, and the loop stops being a blindfolded
sprint. It becomes what it was always meant to be: a fast engine with its
headlights on. The graph does not replace the loop. It is what the loop
should have been running <em>over</em> the entire time. And because the graph is
served over the <a href="https://modelcontextprotocol.io">Model Context Protocol (MCP)</a>,
any agent already stuck in a loop can ask for it without changing a thing
about how it loops.</p>
<h2 id="so-what-did-he-mean">So what did he mean?</h2>
<p>Honestly? He probably didn&#39;t mean us. He didn&#39;t @ us, he didn&#39;t link us, and
a tweet that vague is a Rorschach test. Everyone selling a graph this week
will read it as a horoscope written personally for their launch. We know how
that looks. We&#39;re doing it right now, on purpose, with a wink.</p>
<p>But here&#39;s the thing about tea leaves: sometimes the arrow really does point
somewhere. &quot;Are we still talking loops or did we shift to graphs yet?&quot; is
not a neutral question. It has a <em>direction</em> baked in. The direction is away
from <em>run it again and hope</em>, and toward <em>hand it the graph.</em> Six words, and
every reasonable reading of them lands next to the thing we&#39;ve been quietly
shipping since before it was a tweet.</p>
<p>So, are we still talking loops, or did we shift to graphs yet?</p>
]]></content:encoded>
    </item>
    <item>
      <title>Compu-Global-Hyper-Mega-Net (or, how GraphSlice got its name)</title>
      <link>https://graphslice.com/blog/Compu-Global-Hyper-Mega-Net/</link>
      <guid isPermaLink="true">https://graphslice.com/blog/Compu-Global-Hyper-Mega-Net/</guid>
      <pubDate>Thu, 09 Jul 2026 09:00:00 GMT</pubDate>
      <description>Naming a company is the worst part of starting one. Ask Homer Simpson, who got as far as Interslice before losing his nerve and going with Compu-Global-Hyper-Mega-Net...</description>
      <content:encoded><![CDATA[<p>Every company starts with a blank page and a problem worse than the product:
what do we <em>call</em> this thing? Homer Simpson worked the exact same problem we 
did in season 9 of the Simpsons. He sat at his dining-room table — which was 
also, for the length of one episode, his company&#39;s global headquarters — and 
hunted for a name that sounded like the future. He tried <strong>CutCo</strong>. He tried 
<strong>EdgeCom</strong>. And then, for one shining beat, he considered <strong>Interslice</strong> but 
settled for <strong>Compu-Global-Mega-Net</strong>.</p>
<figure class="post-video">
  <div class="post-video-frame">
    <iframe src="https://www.youtube-nocookie.com/embed/ZMnTSpxyuM8"
      title="The Simpsons — Homer names his internet company"
      loading="lazy"
      allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
      referrerpolicy="strict-origin-when-cross-origin"
      allowfullscreen></iframe>
  </div>
  <figcaption>The Simpsons, <em>“Das Bus”</em> (1998). Homer talks himself out of <em>Interslice</em> and into Compu-Global-Hyper-Mega-Net. We doctored the clip with text-to-speech. Did you catch Homer saying <strong>GraphSlice</strong>? Must be an omen! Right?</figcaption>
</figure>

<p>Homer is proof that we&#39;re not the first people to reach for <code>-slice</code>. But we like 
to think we&#39;re the first with a good reason.</p>
<h2 id="were-actually-in-the-slicing-business">We&#39;re actually in the slicing business</h2>
<p>Nobody in that episode could say what Compu-Global-Hyper-Mega-Net <em>did</em>. Not
Homer, not Marge, not Bill Gates himself. That was the whole joke: pure 1998
internet vaporware, headquartered in a dining room, selling nothing but air
and momentum.</p>
<p>We can name what we sell in one sentence. GraphSlice serves <strong>context
slices</strong>: the <a href="/blog/what-is-a-context-slice/">minimal connected subgraph</a> of
your codebase that answers one question about the code, and nothing else.</p>
<p>The <code>-slice</code> in our name isn&#39;t a suffix we bolted on because it sounded
provocative. It <em>is</em> the product. An agent asks &quot;who calls this method?&quot; or
&quot;what breaks if I change this interface?&quot; We don&#39;t hand it your repository and
hope. We walk the graph, cut the exact context slice that answers the
question, and serve it. The name is the spec.</p>
<p>And the <code>graph-</code> half is every bit as literal. Underneath is a
<a href="https://github.com/dotnet/roslyn">Roslyn</a>-grade semantic code graph of your
C# solution: real types, methods, references, and calls edges (<code>CALLS</code>), all
resolved by the compiler. Not a bag of text that happens to sit near your
cursor. Homer never could explain his company. Ours is two nouns, and both of
them are true.</p>
<h2 id="the-part-where-bill-gates-trashes-the-office">The part where Bill Gates trashes the office</h2>
<p>You know how the episode ends. Gates turns up at Evergreen Terrace. He
cheerfully admits he can&#39;t figure out what the company does, and he offers to
buy Homer out. Homer accepts gleefully. Then comes the line:</p>
<blockquote>
<p>&quot;Oh, I didn&#39;t get rich by writing a lot of checks.&quot; — <em>Buy &#39;em out, boys!</em></p>
</blockquote>
<p>And his men take the dining room apart.</p>
<p>It&#39;s one of the sharpest cold jabs at 1990s Microsoft ever put on television.
The OS giant doesn&#39;t so much <em>compete</em> with the little guy as <em>disassemble</em>
him — then bills it as an acquisition.</p>
<h2 id="why-microsoft-would-get-it-and-why-wed-play-along">Why Microsoft would get it — and why we&#39;d play along</h2>
<p>Which is exactly why the joke is safe for <em>us</em> to make. Point that scene at
GraphSlice and it stops being a threat and becomes a wink. Everything we build
sits <strong>on</strong> Microsoft&#39;s stack, not across the table from it:</p>
<ul>
<li><strong>The graph is Roslyn&#39;s.</strong> We read your solution with the same compiler
platform Microsoft ships. Our fidelity is their fidelity. Every C# feature
they add, we understand for free the day it lands.</li>
<li><strong>The language is theirs.</strong> GraphSlice exists to make C# and .NET <em>legible
to agents.</em> The better an agent can reason about a million-line .NET
codebase, the safer a bet it is to keep writing .NET at all in the AI era.
We make Microsoft&#39;s languages age well.</li>
<li><strong>The protocol is the one they&#39;ve adopted.</strong> We serve over the
<a href="https://modelcontextprotocol.io">Model Context Protocol</a> (MCP) — the same
MCP that VS Code, GitHub Copilot, and Azure now speak natively. Serving
structural code context over MCP isn&#39;t slipping past the platform. It&#39;s
walking in the front door they built and left open on purpose.</li>
</ul>
<p>Add it up and the cartoon inverts. If Gates walked into <em>our</em> dining room, he
wouldn&#39;t need the goons. He&#39;d just get it. GraphSlice runs on-premise: your
source never leaves your building, and your agents give better answers along
the way. The entire point is to make the Microsoft ecosystem <em>more</em> valuable
in the age of AI, not to carve a piece off it. (Well, one piece. Per question,
per context slice. That&#39;s our product.)</p>
<p>So we&#39;ll happily play the homage straight, TTS and all. A company genuinely
afraid of Redmond couldn&#39;t afford this joke. We can, because we know which
side of the office-trashing we&#39;re on. We named ourselves after the one thing
Homer never could explain. Then we built it on the very stack the man with the
checkbook would recognize on sight.</p>
<p>Homer, roll the tape.</p>
<figure class="post-video">
  <div class="post-video-frame">
    <iframe src="https://www.youtube-nocookie.com/embed/H27rfr59RiE"
      title="The Simpsons — Bill Gates buys out Homer's company"
      loading="lazy"
      allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
      referrerpolicy="strict-origin-when-cross-origin"
      allowfullscreen></iframe>
  </div>
  <figcaption>The Simpsons, <em>“Das Bus”</em> (1998) — the buy-out. Recommended viewing before your next term sheet.</figcaption>
</figure>
]]></content:encoded>
    </item>
    <item>
      <title>We like Goose</title>
      <link>https://graphslice.com/blog/we-like-goose/</link>
      <guid isPermaLink="true">https://graphslice.com/blog/we-like-goose/</guid>
      <pubDate>Sat, 04 Jul 2026 09:00:00 GMT</pubDate>
      <description>Goose is Block's open-source AI agent. It's a CLI, plus a desktop app that's really just a GUI over the same config, plus a genuinely useful set of MCP servers in the box. Here's why it's the harness we keep reaching for.</description>
      <content:encoded><![CDATA[<figure class="post-hero">
  <img loading="lazy" decoding="async" src="/blog/assets/hero-goose.png" width="1200" height="800"
       alt="Neon geese in flight over Jellyfin C# source code"
       title="We like Goose — neon geese in flight over C#"
       data-source="https://freesvg.org/gaggle-of-geese"
       data-license="CC0-1.0"
       data-generator="OpenAI" />
  <figcaption>A gaggle, migrating. Geese from <a href="https://freesvg.org/gaggle-of-geese">freesvg.org</a> (CC0); composite rendered with OpenAI.</figcaption>
</figure>

<p>We spend a lot of time thinking about what to <em>feed</em> a coding agent. That&#39;s
the whole point of GraphSlice. But the thing on the other end of the pipe
matters too: the harness that holds the model, runs the tools, and decides
what to do with the context it gets handed. Lately, the one we keep reaching
for is <a href="https://block.github.io/goose/">Goose</a>.</p>
<h2 id="one-agent-two-front-doors">One agent, two front doors</h2>
<p>Goose ships in two forms. The relationship between them is the part worth
understanding.</p>
<p>There&#39;s a <strong>CLI</strong>: a proper terminal agent that runs shell commands, edits
files, and drives multi-step work from where you already live. And there&#39;s a
<strong>desktop app</strong>, which the marketing quite reasonably presents as a separate
&quot;distro.&quot; Install one or the other, pick your interface, off you go.</p>
<p>Here&#39;s the bit that made us trust it: the desktop app isn&#39;t a fork, it&#39;s a
face. Both front doors read the same <code>config.yaml</code>: your provider, your model,
your enabled extensions, your keys. Configure them once and both the terminal
and the GUI pick them up. The desktop app is a graphical skin over the same
engine and the same configuration. It&#39;s not a second product that happens to
share a name. That isn&#39;t obvious at first glance, and it isn&#39;t a bug. It&#39;s a
feature.</p>
<p>It&#39;s a small architectural decision with a big payoff in trust and UX. You
never have to wonder which Goose you&#39;re talking to. There&#39;s one agent. You
just choose whether to look at it through a prompt or a window.</p>
<h2 id="batteries-included-and-the-batteries-are-mcp">Batteries included, and the batteries are MCP</h2>
<p>Most agents make you go shopping before they&#39;re useful. Goose ships with a set
of <a href="https://deepwiki.com/block/goose/5.2-built-in-extensions">built-in extensions</a>
that are really just Model Context Protocol (MCP) servers wearing a friendlier
name. The defaults are unusually good:</p>
<ul>
<li><strong><code>developer</code></strong> does the core loop: run shell commands, write and edit
files, walk the directory tree. This is the one that makes Goose an <em>agent</em>
and not a chat window. (<a href="https://block.github.io/goose/docs/mcp/developer-mcp/">docs</a>)</li>
<li><strong><code>computercontroller</code></strong> gives you platform-aware control of the machine
itself. Its instructions adapt to the host OS.</li>
<li><strong><code>memory</code></strong> keeps durable preferences and facts across sessions, split
between a project-local <code>.goose/memory</code> and a global store.</li>
<li><strong><code>tutorial</code></strong> and <strong><code>autovisualiser</code></strong> round out the defaults.</li>
</ul>
<p>Because these are MCP servers, adding your own is the same motion as everyone
else&#39;s. Goose exposes official servers for GitHub, Postgres, Slack, and Jira.
The community has built <a href="https://www.openaitoolshub.org/en/blog/goose-ai-agent-block-review">a hundred-plus more</a>.
The out-of-the-box catalog is wider than most competitors expose on day one.
&quot;Install and it does something real&quot; is true before you&#39;ve configured
anything.</p>
<p>This is also where Goose and GraphSlice speak the same language. GraphSlice
serves context slices over MCP, and Goose consumes MCP. Point Goose at
GraphSlice and the agent stops hallucinating answers about your architecture.
It starts asking structural questions instead: <em>who calls this?</em> and <em>what
breaks if I change that?</em> That&#39;s exactly the kind of context a <code>developer</code>
extension can&#39;t grep its way to.</p>
<h2 id="why-people-actually-love-it">Why people actually love it</h2>
<p>Read around and the enthusiasm keeps landing on a few themes. They&#39;re not the
usual hype:</p>
<ul>
<li><strong>It runs on your machine.</strong> Goose executes locally and is
<a href="https://www.openaitoolshub.org/en/blog/goose-ai-agent-block-review">LLM-agnostic across 15+ providers</a>:
Anthropic, OpenAI, Google, Ollama, Bedrock, and more. Pair it with a local
model and your code never leaves the building. For regulated work, that&#39;s
one of the <a href="https://vibecodinghub.org/tools/goose">few viable ways to have an AI coding agent at all</a>.</li>
<li><strong>It goes beyond suggestions.</strong> The pitch on the <a href="https://github.com/block/goose">tin</a>
is &quot;install, execute, edit, and test.&quot; It does the work, not just the
autocomplete.</li>
<li><strong>It&#39;s extensible by design.</strong> Goose is MCP-native from the ground up, so
you never fight the tool to make it talk to your stack.</li>
</ul>
<p>And then there&#39;s the provenance. Goose comes out of <strong>Block</strong>, Jack Dorsey&#39;s
company (the one behind Square and Cash App), and it&#39;s
<a href="https://block.xyz/inside/block-open-source-introduces-codename-goose">open source under Apache 2.0</a>.
But the part that actually sold us is <em>why</em> it exists. As
<a href="https://www.wired.com/story/jack-dorseys-block-made-an-ai-agent-to-boost-its-own-productivity/">Wired reported</a>,
Block didn&#39;t build Goose to ship a product. They built it to make themselves
faster. They ran it internally for something like a year and a half before
opening it up. By the company&#39;s own numbers, roughly three-quarters of its
engineers say it saves them eight to ten hours a week. A majority of the whole
company reaches for it weekly. That&#39;s the opposite of a launch-day demo. The
tool had to earn its keep in-house first, which is a much better reason to
trust it than any pitch deck.</p>
<p>The newer development is the interesting one. Block has handed Goose to the
<strong>Linux Foundation&#39;s Agentic AI Foundation</strong>. That puts it under neutral,
community-driven governance, with backing from AWS, Anthropic, Google,
Microsoft, and OpenAI. So it&#39;s not just open source in the license sense any
more. It&#39;s <em>fully</em> open, out from under any single vendor&#39;s roadmap. A tool
you build into your daily work deserves governance you can trust, and Goose
just moved in the right direction on exactly that axis.</p>
<h2 id="the-short-version">The short version</h2>
<p>Goose is a well-built open-source agent with one brain and two faces. It has a
genuinely useful default toolkit, local-first execution, provider freedom, and
governance headed somewhere durable. It also speaks MCP, the same protocol
GraphSlice serves context slices over. That makes it a natural harness for
putting the right context in front of a model.</p>
<p>We like Goose. If you haven&#39;t given it a real afternoon, give it one.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why your AI assistant should query your architecture, not your files</title>
      <link>https://graphslice.com/blog/why-ai-assistants-should-query-architecture/</link>
      <guid isPermaLink="true">https://graphslice.com/blog/why-ai-assistants-should-query-architecture/</guid>
      <pubDate>Thu, 02 Jul 2026 09:00:00 GMT</pubDate>
      <description>File dumps and embeddings break down on large C# codebases. A semantic code graph gives an LLM the exact dependency paths a question needs — nothing more.</description>
      <content:encoded><![CDATA[<p>Every AI coding assistant faces the same bottleneck: it can only reason about
what fits in its context window. On a small project that is no problem —
paste the repo, ask the question. On a real C# monorepo with thousands of
types, it becomes <em>the</em> problem.</p>
<h2 id="the-two-default-strategies-and-why-they-fail">The two default strategies, and why they fail</h2>
<h3 id="strategy-one-dump-the-files">Strategy one: dump the files</h3>
<p>The brute-force approach hands the model whole files — the one you are
editing, plus whatever looks related. It fails in both directions at once:</p>
<ul>
<li><strong>Too much:</strong> most of every file is irrelevant to the question. You pay
for tokens that carry no signal.</li>
<li><strong>Too little:</strong> the behavior you ask about usually lives <em>between</em> files —
an interface here, three implementations there, a decorator registered in
a DI container nobody remembers.</li>
</ul>
<h3 id="strategy-two-embeddings">Strategy two: embeddings</h3>
<p>Embeddings retrieve text that <em>resembles</em> the question. But resemblance is
not relevance. The method that breaks when you change an interface does not
share vocabulary with that interface. It shares a <strong>compile-time
relationship</strong> with it. No embedding captures that reliably, and the index
goes stale the moment the code changes.</p>
<h2 id="what-the-compiler-already-knows">What the compiler already knows</h2>
<p>Here is the thing: a complete, precise graph of your codebase already
exists. The C# compiler builds it on every compilation — every symbol, every
type, every call, every dependency. Then it throws that graph away the
moment it has emitted IL.</p>
<p>GraphSlice builds that graph and keeps it. A purpose-built tree walker reads
your solution&#39;s source directly. It resolves symbols, types, and calls
across projects, then writes the result as a <strong>semantic code graph</strong>: nodes
for solutions, projects, types, and methods; edges for the relationships
between them — calls edges (<code>CALLS</code>), inheritance, references, and package
dependencies.</p>
<h2 id="context-slices-not-searches">Context slices, not searches</h2>
<p>A graph that cannot fit in a context window is no better than a repo that
cannot fit in a context window. The unit of delivery matters. GraphSlice
serves <strong>context slices</strong> — the minimal subgraph that answers one question:</p>
<pre><code class="language-text">&gt; what breaks if I change IPaymentProcessor?

IPaymentProcessor (interface, Billing.Core)
├── implemented by StripeProcessor       (Billing.Stripe)
├── implemented by InvoiceProcessor      (Billing.Invoicing)
├── injected into CheckoutService..ctor  (Web.Checkout)
└── mocked in PaymentProcessorTests      (Billing.Tests)
</code></pre>
<p>That is the whole answer. Four dependency paths, a few hundred tokens —
instead of forty files and a prayer.</p>
<h2 id="why-mcp-is-the-right-delivery-channel">Why MCP is the right delivery channel</h2>
<p>GraphSlice serves context slices over the
<a href="https://modelcontextprotocol.io">Model Context Protocol</a> (MCP), so any
MCP-compatible agent can request them as tools:</p>
<ul>
<li>The agent asks a <strong>structural question</strong> (&quot;who calls this?&quot;, &quot;trace this
dependency&quot;) instead of a text query.</li>
<li>The graph does the reasoning about <em>structure</em>, so the agent can spend its
reasoning budget on <em>intent</em>.</li>
<li>Your repository is never uploaded or indexed by a third party. The graph
runs where your code runs.</li>
</ul>
<h2 id="the-payoff">The payoff</h2>
<p>Correct context, not just nearby context. Smaller windows, flatter costs as
the repo grows, and answers grounded in how the software actually fits
together. Your AI assistant stops being a very confident text search. It
becomes an engineer with the graph in hand.</p>
]]></content:encoded>
    </item>
    <item>
      <title>What is a context slice?</title>
      <link>https://graphslice.com/blog/what-is-a-context-slice/</link>
      <guid isPermaLink="true">https://graphslice.com/blog/what-is-a-context-slice/</guid>
      <pubDate>Thu, 25 Jun 2026 09:00:00 GMT</pubDate>
      <description>A context slice is the minimal subgraph of your codebase that answers one question. Here's how GraphSlice extracts one, and why the boundaries matter.</description>
      <content:encoded><![CDATA[<p>&quot;Context slice&quot; is the core noun in GraphSlice, so it deserves a precise
definition. A context slice is the <strong>minimal connected subgraph</strong> of your
semantic code graph that is sufficient to answer one question.</p>
<h2 id="anatomy-of-a-context-slice">Anatomy of a context slice</h2>
<p>Every context slice has three parts:</p>
<h3 id="the-anchor">The anchor</h3>
<p>The symbol the question is about — a method, a type, an interface, a project.
Anchors resolve by real symbol identity, not by name matching. So <code>Process</code>
on <code>OrderService</code> never gets confused with <code>Process</code> on <code>ImagePipeline</code>.</p>
<h3 id="the-traversal">The traversal</h3>
<p>From the anchor, GraphSlice walks the edges the question calls for:</p>
<table>
<thead>
<tr>
<th>Question</th>
<th>Edges walked</th>
</tr>
</thead>
<tbody><tr>
<td>&quot;Who calls this?&quot;</td>
<td>incoming <code>CALLS</code> edges</td>
</tr>
<tr>
<td>&quot;What breaks if I change this?&quot;</td>
<td>implementations, overrides, references</td>
</tr>
<tr>
<td>&quot;Trace this dependency&quot;</td>
<td>project and package dependencies</td>
</tr>
<tr>
<td>&quot;Show the flow&quot;</td>
<td><code>CALLS</code> edges, in execution order</td>
</tr>
</tbody></table>
<p>The traversal is bounded — by depth, by project boundary, or by relevance.
A hub symbol with ten thousand references cannot flood the window.</p>
<h3 id="the-rendering">The rendering</h3>
<p>The subgraph is rendered in a form the agent consumes efficiently: compact,
hierarchical, deduplicated. File-and-line anchors let the agent jump from
structure to source when it needs the actual code.</p>
<h2 id="what-a-context-slice-deliberately-leaves-out">What a context slice deliberately leaves out</h2>
<p>The discipline is in the omissions. A context slice does <strong>not</strong> include:</p>
<ul>
<li>Method bodies that are not on the dependency path.</li>
<li>Symbols that merely share a file with something relevant.</li>
<li>Anything retrieved because it was <em>textually similar</em> to the question.</li>
</ul>
<p>Proximity in a file is an accident of formatting. Proximity in the graph is a
fact about your software.</p>
<h2 id="why-minimal-is-a-feature">Why &quot;minimal&quot; is a feature</h2>
<p>It is tempting to pad context &quot;just in case&quot;. But every irrelevant symbol in
the window can pull the agent toward the wrong thing. Precision in, precision
out. Minimal context slices keep token costs flat as the repository grows:
the graph gets bigger, but the answers do not.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
