Code Graph
Connect deploys and code to incidents — without giving anyone your source code
The Code Graph connects what changed to what broke. A one-line addition to your CI pipeline builds a map of your repo inside your own build environment and pushes only that map to Dstl8. Möbius then answers questions like:
Errors began at 14:02. The
checkoutdeploy at 13:58 changedpayments/client.go— and the erroring log pattern is emitted from that exact file, line 212, inchargeCard().
That works from logs alone — no APM agent, no tracing, no stack traces required. It's the join fabric between your deploys, your third-party dependencies, and your incidents - the graph ties it all together.
How it works
Dstl8 already distills your logs into patterns, each with a stable fingerprint. The Code Graph extractor computes the same fingerprints from the source side: it parses your repo locally, finds every log statement, and derives the same pattern IDs from the format strings. Dstl8 links the two — so every runtime error pattern resolves to the repo/file:line and function that emits it, and every deploy resolves to the files and log statements it shipped.
your environment │ your Dstl8 org
│
git repo ──▶ dstl8 graph push │ snapshot store
(parses locally, in CI) │ │
│ │ ├─▶ log patterns ⇄ log sites
▼ │ │ (pattern links)
metadata artifact (JSON) ─────────┼──▶ ▼
paths · service names · log │ Möbius investigations · portal
format strings — never source │ Code page · MCP tools · CLIEverything on the left runs in your environment. The only thing that crosses the line is the metadata artifact - which you can read in full before anything is sent.
What leaves your repo (and what never does)
The pushed artifact contains, exhaustively:
Repo identity: remote URL, default branch, commit SHA, branch name.
Service manifest: declared/inferred service names this repo builds.
File inventory: relative paths, language, line counts, content hashes. No file contents.
Log-call sites: file, line, enclosing function name, logger callee name, severity hint, and the format string of the log statement (plus its normalized token form and ID).
Symbol names + kinds + locations; import/call edges between symbols/files; external dependency identifiers (package names from manifests, e.g.
stripe-go).Diff summary vs previously pushed commit: changed file paths, added/removed/modified symbols and log sites.
What it never contains: function bodies, comments, string literals other than log/error format strings, secrets/config values, embedded data files, git history/authors (author names deliberately excluded).
The only "code" content in the artifact is log format strings. The graph adds where they live, not what they say. Everything else is names and paths. Unlike other tools, Dstl8 never fetches source server-side: there is no repo cloning, no SCM tokens, etc.
.gitignore is always respected, and a .dstl8ignore plus --exclude flags let you carve out anything else. Only git-tracked files are ever scanned.
Audit it yourself
Nothing is sent until you run push, and the artifact is plain JSON you can read first:
The --dry-run summary looks like this:
and each log site in the artifact is exactly this shape - the format string, where it lives, and its pattern fingerprint:
A push uploads those same bytes: dstl8 graph build -o graph.json followed by dstl8 graph push --file graph.json sends exactly the file you reviewed.
Quick start
GitHub Actions
The action is fail-open: it never breaks your build. It uses the same dstl8_ token as the events action. Full inputs and non-GitHub recipes: CI integration.
Any CI, or locally
What you get
Pattern → source: every distilled log pattern gets linked to the code that emits it. Incident evidence resolves to
repo/file:line, with the function name and last-shipped commit.Deploy → change set: a deploy event with a commit SHA expands into the files and log statements that deploy shipped.
Cause with receipts: when a deploy changed a file that emits the erroring pattern, Möbius cites the event, the file, and the line together.
Blast radius: symbol search, dependency traversal, and per-repo third-party SDK inventories - so a Stripe outage correlates to exactly the services that import the Stripe SDK.
The same six MCP tools Möbius uses (list_code_repos, code_for_pattern, code_changes, find_symbol, code_impact, service_dependencies) are available in Claude Code, Cursor, and anything else connected through MCP integration - see MCP tools.
Going deeper
CLI reference — every
dstl8 graphflag, exit-code behavior, and copy-paste examples.Configuration —
.dstl8.yamlservices,.dstl8ignore, built-in excludes, and language coverage.CI integration — the GitHub Action, GitLab and Jenkins recipes, and token setup.
MCP tools — the six code tools and the deploy-correlation workflow.
Last updated