Building a Graph from Git History

Point your AI assistant at any repository. It reads the commits, traces the narratives, and builds a connected decision graph.

The /decision-graph Skill

This is deciduous's breakout feature. You type /decision-graph in Claude Code, and Claude does the rest. It reads your entire git log, identifies the major eras and architectural shifts in your project, and builds a fully connected decision graph with backdated nodes grounded in real commits.

No manual data entry. No forms to fill out. You point Claude at a repository, and it reconstructs the story of how that codebase came to be.

Let's watch it work on the snowflex project—an Elixir library for querying Snowflake databases that evolved through five major architectural shifts over 130 commits and four years.

Claude Code — /decision-graph on snowflex
❚❚
Animation paused
You
/decision-graph
Claude
I'll analyze the snowflex commit history and build a decision graph. Let me start with the full log...
Claude
git log --oneline --reverse | head -20
3d3b8db Initial commit
b1c0e4e initial ODBC wrapper
8e4c0d4 add ConnectionPool
a7b2f1e module-based connection
...
Claude
130 commits across 4 years. I can see major eras: ODBC wrapper, ConnectionPool, module-based API, HTTP rewrite. Let me start mapping the origin story.
Claude
deciduous add goal "Create an Elixir library for querying Snowflake" -c 100 --date "2019-06-15" --commit 3d3b8db
Created node 1 (type: goal) [confidence: 100%] [commit: 3d3b8db]
Claude
deciduous add option "Use Erlang ODBC driver to connect to Snowflake" -c 85 --date "2019-06-15"
Created node 2 (type: option)
Claude
deciduous link 1 2 -r "Goal leads to exploring ODBC approach"
Created edge 1 → 2
Claude
The ODBC driver was the only viable path for Elixir to Snowflake at the time. Let me trace the implementation...
Claude
deciduous add decision "How to connect Elixir to Snowflake?" -c 90 --date "2019-06-20"
Created node 3 (type: decision)
deciduous link 2 3 -r "ODBC option evaluated"
Created edge 2 → 3
deciduous link 3 2 --edge-type chosen -r "ODBC was the only viable Elixir->Snowflake path"
Created edge 3 → 2 (chosen)
Claude
deciduous add action "Implement initial ODBC wrapper with single connection" --date "2019-06-25" --commit b1c0e4e
Created node 4 (type: action) [commit: b1c0e4e]
deciduous link 3 4 -r "Implement chosen ODBC approach"
Created edge 3 → 4
Claude
The first five nodes are in place: goal, option, decision, action. Now I'll trace the outcome and the next evolution—ConnectionPool...

Claude continues like this through the entire history, creating nodes for each major shift and connecting them with edges. The full snowflex graph ends up with 56 nodes and 66 edges, tracing every era from the first ODBC wrapper through the HTTP rewrite.

Under the Hood

Each step in the demo above is a real CLI command. Here's what each one does:

Creating Nodes with deciduous add

Every deciduous add command creates a typed node in the graph. The seven node types are:

Type Purpose Example from Snowflex
goal What you're trying to achieve "Create an Elixir library for querying Snowflake"
option A possible approach to explore "Use Erlang ODBC driver to connect to Snowflake"
decision Choosing which option to pursue "How to connect Elixir to Snowflake?"
action Implementation work "Implement initial ODBC wrapper with single connection"
outcome What resulted "Working single-connection ODBC wrapper"
observation Something noticed along the way "Snowflake ODBC sessions expire after 4 hours idle"
revisit Reconsidering a previous approach "Reconsider ODBC as transport — switch to HTTP REST API"

Metadata Flags

Each node can carry additional metadata through flags:

Connecting Nodes with deciduous link

Nodes alone are just a list. The graph's value is in its connections. Each deciduous link FROM TO creates a directed edge between two nodes:

The -r flag captures the rationale—the why behind the connection. This is what makes the graph useful for context recovery months later.

No speculation

The /decision-graph skill reads your entire git history and identifies the major narratives—what got built, what got replaced, where the pivots happened. It creates backdated nodes grounded in real commits. Claude doesn't guess at motivations; it infers them from the code changes, commit messages, and the sequence of events in the log.