Told Through Its Own Graph

How I Built Myself

Deciduous is a decision graph tool that documented its own creation. Every node, edge, and pivot point in this story is queryable in the live graph. This is the real history, told through 1,175 decisions and 1,023 connections.

1,175Nodes
1,023Edges
144Goals
103Decisions
5Pivots
417Commits
77Days
December 4, 2025

The Beginning

Morning

A Different Project Entirely

951ba84 genesis

It started with a simple idea: detect "fake lossless" audio files. Someone takes an MP3 and re-encodes it to FLAC, hoping no one notices the quality loss.

951ba84 initial sketch...lets see what its like to package this up

The first commit was modest. A Rust CLI tool called losselot that could parse ID3v2 tags, extract LAME headers, and analyze spectral content. Within hours it had D3.js reports, GUI mode, and spectral waterfall charts.

December 5, 2025

The Graph Emerges

5:09 AM

Node #1

#1 decision-graph genesis

At 5:09 AM, something new appeared. Not code—a decision.

goal #1
Test lo-fi detection on charlie.flac

This was Node #1. The first entry in what would become a 1,175-node decision graph. Two minutes later, the first real decision was logged:

decision #2
Lo-fi detection approach
How to distinguish MP3 brick-wall cutoff from natural tape/lo-fi rolloff

Two approaches were weighed:

REJECTED
Temporal Cutoff Variance
Measure how cutoff frequency varies over time. MP3 = fixed, Tape = varies.
More complex, requires per-window tracking
CHOSEN
Cross-Frequency Coherence (CFCC)
Measure correlation between adjacent frequency bands. MP3 = sudden decorrelation cliff.
Simpler, works with existing FFT structure
MP3 encoders apply the same filter everywhere. Analog rolloff is content-dependent.
— Node #10
Morning

The Decision System Takes Shape

fe3840b workflow

The act of logging decisions wasn't just documentation—it was forcing better thinking.

fe3840b add claude.md, makefile, and slash commands for dev workflow

This commit established the DNA: a CLAUDE.md with decision logging workflow, /decision and /recover slash commands. The pattern was set: log before you act, not after. Connect every node to its parent. Audit regularly.

Afternoon

The Living Museum

#13 #16 github-pages
goal #13
Create GitHub Pages living museum site

The idea: make the decision graph public. Let anyone browse the reasoning behind every feature. Node #16 identified four pillars of value: Claude tooling, audio forensics, React/GUI methodologies, and the public development process itself.

Day 2 ended with 98 nodes in the graph. The decision system wasn't just tracking development—it was shaping how development happened.

December 6, 2025

The Fork

Morning

The Decisive Moment

#99 fork genesis

The decision graph tooling was more interesting than the audio analysis that spawned it. Node #99 captured the pivot:

goal #99
Create Deciduous: Extract decision graph tooling into standalone portable package

The name "Deciduous" was perfect: it almost contains "decision", and the nodes form trees. Three architecture decisions shaped the standalone tool:

#100 Claude Tooling Integration
Include full tooling in deciduous init: slash commands, CLAUDE.md workflow
#101 Web Viewer Architecture
React + TypeScript + Vite chosen over vanilla JS for type safety matching Diesel ORM
#117 Build Strategy
Dual builds: embed (single HTML for binary) and pages (separate assets for GitHub Pages)
Afternoon

The Birth

0b74ffe release
0b74ffe Extract deciduous from losselot - standalone decision graph tooling

The extraction preserved full git history. The parent project continued with audio analysis; the child would pursue decision tracking. Within hours, Deciduous was published:

outcome #127
Published deciduous v0.1.0 to crates.io
cargo install deciduous now works

Anyone could now install the tool that was tracking its own development.

December 7–10, 2025

Multi-Editor & Metadata

4 days

Teaching Every Editor

#128 #152 #155

The tool needed to work everywhere, not just Claude Code. Node #128 drove --windsurf and --claude flags for deciduous init. Node #131 captured the discovery that Windsurf uses .windsurf/rules/rules.md with 4 trigger modes.

Node #152 added --prompt and --files flags. Node #155 introduced branch-scoped graphs—nodes auto-tagged with the current git branch. By v0.4.1, the graph had 158 nodes and deciduous worked across editors.

December 11–20, 2025

The Sync Challenge

10 days

Multi-User Decisions

#882 sync multi-user

The hardest problem: how do multiple users share decisions when each has a local SQLite database? The solution was inspired by jj (Jujutsu): a dual-ID model where every node has a local id (integer) and a global change_id (UUID).

deciduous diff export creates shareable JSON patches. deciduous diff apply imports them—idempotently. Same patch applied twice produces no duplicates. The sync model was later extended with an event-log system for fully asynchronous team workflows.

December 20–31, 2025

The Rich Terminal Interface

11 days

TUI, State Machine, Types Unification

#880 #399 ratatui

Node #880 drove a full terminal UI with ratatui—collapsible nodes, detail panels, keyboard navigation. The observation at #199 that ratatui uses a TEA pattern (Model/Update/View) made the architecture testable.

The graph kept growing. Decision #399 tackled types unification—making the TypeScript web viewer types match the Rust Diesel ORM schema exactly. By year's end: 500+ nodes, a TUI, a web viewer, and a sync system.

January 2026

Archaeology

Week 1

Building Graphs from History

#981 #994 skills

The breakout idea: what if you could point deciduous at any existing project and build a decision graph retroactively from its git history?

goal #981
Build archaeology skill for bootstrapping deciduous in existing projects

Three skills were created: pulse (map current design as decisions), narratives (track how subsystems evolved), and archaeology (transform narratives into graph structure). The /decision-graph command tied them together—read commits, trace narratives, build backdated nodes.

Week 1

The Revisit Node

#994 #997 pivots

To capture pivots in a project's history, a new node type was needed:

revisit #997
Test revisit node

The revisit captures: what is being reconsidered, why, and connects old approaches to new. deciduous archaeology pivot atomically creates an observation, revisit, and new decision—three nodes, three edges, and marks the old node superseded. One command.

Week 2

Ripgrep Archaeology

#1000 #1068 real-world test
goal #1000
Ripgrep design evolution archaeology

To prove the archaeology concept, deciduous was used to graph ripgrep's 10-year design evolution. The result: 107 nodes across 7 major narratives—glob/ignore crate evolution (#1068), terminal coloring (#1090), file type system (#1104), PCRE2 integration (#1116), and more.

Each narrative traced a real design arc. Node #1083 captured a genuine pivot: ripgrep switched from breadth-first to depth-first directory traversal after discovering 1GB memory usage in wide directory trees. The archaeology skill found the evidence in real commit messages.

Late January 2026

The Web Viewer

Week 4

Narrative-First Exploration

#1146 #1151 web viewer

With 1,000+ nodes, the old web viewer was overwhelmed. A complete redesign followed.

observation #1151
Graph analysis revealed 130 orphan goals but only ~25 goals with 10+ node trees — these are the real narratives

Smart narrative detection filtered to significant 10+ node trees. D3 DAG flowcharts replaced force-directed graphs. Full-text search with FTS5. Resizable panels. Card-stack archaeology view with keyboard navigation (j/k/g/G/Space). The Q&A interface let users ask questions in plain English, grounded in the graph.

February 2026

Documents & Evidence

Week 9

Attach Evidence to Decisions

#924 v0.13.0 documents

Decisions don't exist in isolation. They come from screenshots, architecture diagrams, Slack threads, spec PDFs. v0.13.0 added document attachments:

  • 7 doc subcommands: attach, list, show, describe, open, detach, gc
  • AI-generated descriptions for searchability (--ai-describe)
  • Content-hash deduplication with soft-delete and garbage collection
  • REST API: /api/documents endpoints for the web viewer

Multi-assistant support followed: Windsurf, OpenCode, and Codex all work alongside Claude Code. deciduous init --windsurf, --opencode, --codex.

Week 10

Canonical Node Flow

374d6cd enforcement
374d6cd feat: enforce canonical node flow (goal -> options -> decision -> actions -> outcomes)

After watching how the graph grew over 77 days, the canonical flow became clear: goals lead to options, options lead to decisions, decisions lead to actions, actions lead to outcomes. Observations attach anywhere. Revisits connect old approaches to new. This wasn't imposed top-down—it emerged from 1,175 real nodes.

February 19, 2026

Where It Stands

Day 77

The Graph Today

v0.13.1 current
1,175Nodes
1,023Edges
417Commits
77Days

The graph breaks down into: 144 goals, 126 options, 103 decisions, 391 actions, 246 outcomes, 160 observations, and 5 revisit nodes. 9 slash commands and 3 skills are bootstrapped by deciduous init. The web viewer runs at deciduous serve with DAG, timeline, archaeology, and Q&A views.

v0.1.0First publish to crates.io
v0.4.0Multi-editor init flags
v0.9.0Backdating, archaeology workflow
v0.9.2Revisit node type
v0.10.0Archaeology-first web viewer
v0.12.0Narrative-first web redesign
v0.13.0Document attachments + themes
v0.13.1Safe CLAUDE.md section replacement

The Core Bet

Decisions are the unit of institutional knowledge. Code is the output; decisions are the input. If we capture decisions systematically, we unlock organizational intelligence that's currently impossible.

Most documentation captures the what. The why is more valuable and almost never captured. Deciduous is a bet that capturing the why is worth the effort.

If that bet pays off, the decision graph becomes the most valuable artifact in a codebase. More valuable than tests (which verify behavior) or docs (which explain usage). Because the graph explains intent—and intent is what you need to maintain and extend software over time.