PAPER-2024-003

Understanding Graphs: "Less, But Better" Codebase Navigation

Applying Heidegger's hermeneutic circle to develop minimal dependency documentation that captures only understanding-critical relationships—replacing exhaustive tooling with human-readable insight.

Research 15 min read Advanced

Abstract

This paper presents Understanding Graphs: a minimal, human-readable approach to documenting codebase relationships that embodies Dieter Rams' principle "Weniger, aber besser" (less, but better). Through hermeneutic analysis, we identified that traditional dependency graphs fail the minimalism test—they capture all relationships when only understanding-critical ones matter. We developed a canonical format (UNDERSTANDING.md) that captures bidirectional semantic relationships, entry points for comprehension, and key concepts—all in plain markdown without tooling. Implementation across six packages in the CREATE SOMETHING monorepo validated the approach: developers can navigate the codebase through human-readable documents that Claude Code can also parse for context management. The contribution is both practical (a working system) and theoretical (a hermeneutic methodology for "sufficient" documentation).

6
Packages documented
1
New Skill created
0
External tools required
~2hr
Development time

1. Introduction

The question arose during a discussion of agent reasoning in large codebases: would Markov Chains improve context management? This led to a deeper inquiry: what do agents (and humans) actually need to understand code?

Traditional dependency graphs answer the wrong question. They show all relationships—every import, every type reference, every function call. But comprehension doesn't require exhaustive mapping; it requires sufficient mapping. The hermeneutic question became: What is sufficient for understanding?

This research asks: Can dependency documentation embody "Less, but better"?

We propose "Understanding Graphs"—minimal documents that capture only what's needed to comprehend a package in context. These documents:

  • Are human-readable (plain markdown, no visualization required)
  • Are machine-parseable (Claude Code can use them for context)
  • Capture bidirectional relationships (depends on + enables understanding of)
  • Include semantic meaning (why, not just what)
  • Require no tooling (no LSP, no graph database, no build step)

Contributions: (1) A hermeneutic methodology for "sufficient" documentation, (2) The UNDERSTANDING.md canonical format, (3) Implementation across CREATE SOMETHING monorepo, (4) A Claude Code Skill for maintaining understanding graphs.

2. Methodology: Hermeneutic Analysis

We applied Heidegger's hermeneutic circle—the interpretive method where understanding emerges through movement between whole and parts. The "whole" was the CREATE SOMETHING methodology; the "part" was dependency documentation.

2.1 First Movement: Whole → Part

We began by examining what traditional dependency graphs provide:

// Traditional approach: exhaustive

FileA.ts imports → types.ts, utils.ts, config.ts, ...

FileA.ts calls → functionX(), functionY(), functionZ(), ...

FileA.ts references → TypeA, TypeB, InterfaceC, ...

This violates Rams' principles: it's not useful (overwhelming), not unobtrusive (requires tooling), and certainly not "as little as possible."

2.2 Second Movement: Part → Whole

We then asked: what would sufficient documentation look like? The hermeneutic insight emerged: understanding is not about knowing all connections but about knowing where to start and what relates to what semantically.

A developer doesn't need to know every import. They need to know:

  • Purpose: What does this package do? (one sentence)
  • Position: How does it fit in the larger system?
  • Entry points: What 3-5 files should I read first?
  • Key concepts: What terms might confuse me?
  • Relationships: What does this depend on? What depends on this?

2.3 The Hermeneutic Insight

The critical realization: dependency graphs are unidirectional (A depends on B), but understanding flows bidirectionally. Understanding A helps me understand B, and vice versa. The documentation format must capture this circular flow—exactly what the hermeneutic circle describes.

Key Insight: We don't need dependency graphs.
We need understanding graphs.

3. Implementation

3.1 The UNDERSTANDING.md Format

We developed a canonical format that balances human readability with machine parseability:

# Understanding: [Package Name]

> **[One-sentence purpose]**

## Ontological Position
**Mode of Being**: [Role in system]
[2-3 sentences on relationship to whole]

## Depends On (Understanding-Critical)
| Dependency | Why It Matters |
|------------|----------------|
| `pkg`    | [What this enables] |

## Enables Understanding Of
| Consumer | What This Clarifies |
|----------|---------------------|
| `pkg`  | [How this helps] |

## To Understand This Package, Read
1. **[file]** — [Why this is entry point]
2. **[file]** — [What concept this explains]

## Key Concepts
| Concept | Definition | Where |
|---------|------------|-------|
| [Term]  | [Brief]    | [File]|

3.2 What Makes It "Less, But Better"

Less

  • • No external tooling
  • • No graph databases
  • • No visualization requirements
  • • No LSP dependency
  • • No build step
  • • Only understanding-critical relationships

Better

  • • Human-readable (developers can read it)
  • • Machine-parseable (Claude can use it)
  • • Captures semantic relationships
  • • Includes "what to read" guidance
  • • Bidirectional (depends on + enables)
  • • Self-contained (no external lookups)

3.3 Monorepo Implementation

We created UNDERSTANDING.md files for all six packages in the CREATE SOMETHING monorepo:

packages/
├── components/UNDERSTANDING.md  → Foundation (Vorverständnis)
├── tufte/UNDERSTANDING.md       → Visualization foundation
├── ltd/UNDERSTANDING.md         → Being-as-Canon
├── io/UNDERSTANDING.md          → Being-as-Document
├── space/UNDERSTANDING.md       → Being-as-Experience
└── agency/UNDERSTANDING.md      → Being-as-Service

Each file follows the canonical format, capturing only what's needed to understand that package in the context of the hermeneutic workflow.

3.4 Claude Code Skill

To maintain understanding graphs over time, we created the understanding-graphs Skill. This Skill provides:

  • Guidelines for creating new UNDERSTANDING.md files
  • Validation checklist (one-sentence purpose, 3-5 entry points, etc.)
  • Update criteria (when to update vs. leave alone)
  • Integration with other CREATE SOMETHING Skills

4. Results

4.1 Comparison: Traditional vs. Understanding Graphs

AspectTraditionalUnderstanding Graphs
Relationships capturedAll imports, calls, typesOnly understanding-critical
Tooling requiredLSP, visualizers, graph DBNone (plain markdown)
DirectionUnidirectional (A → B)Bidirectional (A ↔ B)
ContentWhat (structural)Why (semantic)
Human-readableRequires visualizationNative markdown
Machine-parseableYes (but complex)Yes (simple text)
MaintenanceAutomatic but noisyManual but minimal

4.2 Hermeneutic Circle Validation

The implementation completed the hermeneutic circle:

.ltd (Canon): Does it embody Rams' principles? ✅ Minimal, honest, unobtrusive

.io (Research): Is there theoretical grounding? ✅ Hermeneutic methodology documented

.space (Practice): Does it work hands-on? ✅ 6 packages successfully documented

.agency (Service): Commercial validation? 🔄 Pending client application

5. Discussion

5.1 Why Markov Chains Were the Wrong Question

The original question—whether Markov Chains could improve agent reasoning—assumed the problem was state compression. But the hermeneutic analysis revealed the actual problem is semantic navigation. Markov Chains are memoryless; understanding requires accumulated context. The hermeneutic circle works precisely because we carry prior understanding into each new encounter.

Understanding Graphs enable this accumulation: each UNDERSTANDING.md provides the pre-understanding (Vorverständnis) needed to engage with a package. Claude Code can read these documents to build context without loading entire codebases.

5.2 Implications for AI-Native Development

This research suggests a pattern for AI-human collaboration in codebase navigation:

  • Human-authored understanding: Developers write UNDERSTANDING.md with semantic insight
  • AI-consumed context: Claude Code uses these for efficient navigation
  • AI-assisted maintenance: The understanding-graphs Skill guides updates
  • Bidirectional benefit: Both humans and AI navigate the same documentation

5.3 Limitations

Understanding Graphs require human judgment to identify "understanding-critical" relationships. This is both a strength (captures semantic meaning machines miss) and limitation (requires maintenance). We mitigate this through:

  • Clear validation checklist (one-sentence purpose, 3-5 entry points)
  • Staleness tracking ("Last validated" date)
  • Update criteria (only on structural changes, not bug fixes)

5.4 Future Work

Potential extensions include:

  • Automated staleness detection (compare UNDERSTANDING.md to recent commits)
  • Graph visualization from markdown (optional, generated on demand)
  • Cross-repository understanding graphs (for microservices)
  • Integration with IDE navigation (jump to entry points)

6. Conclusion

This research demonstrates that dependency documentation can embody "Less, but better." Traditional dependency graphs violate Rams' principles—they're exhaustive when sufficiency is needed, require tooling when plain text suffices, and capture structure when meaning matters.

Understanding Graphs invert these assumptions. By applying Heidegger's hermeneutic circle, we identified that codebase comprehension requires semantic navigation, not exhaustive mapping. The UNDERSTANDING.md format captures only what's needed: purpose, position, entry points, concepts, and bidirectional relationships.

Implementation across the CREATE SOMETHING monorepo validated the approach. Six packages now have human-readable, machine-parseable understanding graphs that require no tooling and embody the minimalist philosophy that guides the entire methodology.

The hermeneutic insight: To understand a codebase, you don't need all relationships—just the right ones.

References

[1] Heidegger, Martin (1962). Being and Time (J. Macquarrie & E. Robinson, Trans.). Harper & Row. (Original work published 1927)
[2] Gadamer, Hans-Georg (1975). Truth and Method (G. Barden & J. Cumming, Trans.). Seabury Press. (Original work published 1960)
[3] Rams, Dieter (1995). Less and More: The Design Ethos of Dieter Rams. Gestalten Verlag.
[4] CREATE SOMETHING methodology. https://createsomething.io/methodology
[5] CREATE SOMETHING Skills documentation. SKILLS.md

This paper is part of the CREATE SOMETHING research program exploring AI-native development patterns. View the source repository or read more about our methodology.