gaearon/woodshed/connective
Claude Code and agent skill by gaearon/woodshed
- community
Checking that the SKILL.md file is still in the repository.
Use when building a deciduous decision graph to capture design evolution, architecture history, or how a codebase's design changed over time. Provides the deciduous CLI commands and graph structure guidelines.
Install
npx vskill@latest install gaearon/woodshed/connectiveSKILL.md
Decision Graph Construction
You are building a deciduous decision graph - a DAG that captures the evolution of design decisions in a codebase.
Use the deciduous CLI (at ~/.cargo/bin/deciduous) to build the graph. Run deciduous commands in the current directory (not inside the source repo).
For git commands to explore commit history, use git -C <repo-path> to target the source repo.
CRITICAL: Only use information from the repository itself (commits, code, comments, tests). Do not use your prior knowledge about the project. Everything must be grounded in what you find in the repo.
Commit Exploration
Use a layered strategy to find all relevant commits:
Layer 1: See all commits. Start with the full list when building narratives.
Layer 2: Keyword expansion. Once you have narratives, search for spelling variations and related terms you might have missed (e.g., "cache" → "caching", "cached", "LRU", "invalidate"). For each key identifier in your narratives, trace its full lifecycle:
- Introduction
- Changes and modifications
- Renames
- Deprecation or removal
- Replacement by other mechanisms
- Becoming stable/public API
If there's a feature flag controlling the feature, search for commits mentioning that flag.
Layer 3: Follow authors. If a narrative has a key author, check their commits ±1 month from known commits. They often work on related things.
DO NOT:
git log ... | head -100— NO. You will miss commits in the middle.git log ... | tail -200— NO. Same problem.- Start with keyword filtering — NO. You'll miss things with unexpected names.
DO:
- See all commits first, filter mentally while building narratives
- Include "remove", "delete", "disable", "deprecate" in keyword searches — removals explain transitions
- Check the commit count first (
| wc -l), but then see them all - Read full commit messages for any commit whose title mentions an identifier or concept relevant to your narrative — you need precise understanding of what happened to each one you care about
Finding the Story
Not every commit matters. Look for commits that change the model - how the system conceptualizes the problem:
- Existing tests modified (contract changing, not just bugs fixed)
- Data structures replaced or reworked
- Heuristics changed significantly
- New abstractions introduced
- API behavior shifts
Skip commits that are pure implementation (same model, different code) or routine fixes that just add tests.
Among model-changing commits, find the spine: what question keeps getting re-answered? What approach keeps getting replaced or refined? That's your central thread - build the graph around it.
Narrative Tracking
Don't build the graph as you explore. First, collect commits into narratives.
Maintain narratives.md as you explore:
- For each significant commit, read
narratives.md - Ask: "Does this commit evolve an existing narrative?"
- If yes: append the commit to that narrative's section
- If no: add a new narrative section
Example narratives.md:
The Arc tells the narrative as a story: what problem started it, what was tried, what went wrong, what insight emerged, and where it ended up. If your arc has gaps ("then somehow we ended up with X"), you're missing commits.
Before building the graph, take a critical pass over narratives.md:
- Merge narratives that are essentially the same evolving thing
- Ensure each narrative clearly explains how one independent piece evolved
- Note where narratives branch from or feed into each other
Hardening Phase
After building initial narratives, harden them to ensure nothing is missed.
Assume the commit list is incomplete. Your first pass probably missed things. Before synthesizing the narrative into a graph, actively search for what's missing. If a commit mentions a new term or concept you hadn't searched for, search for that too. Follow the trail until searches stop turning up new relevant commits.
Step 1: Extract concepts per narrative
For each narrative, list the key concepts/APIs/identifiers and their lifecycle stage:
- Introduced: First appearance of the concept
- Changed: Modifications to behavior or implementation
- Renamed/Deprecated/Removed: End of life or replacement
- Marked stable: Became public API or removed "unstable\_" prefix
Example addition to narrative:
Step 2: Exhaustive search per concept
For each concept, search full commit messages (not just subject lines):
For each match, read the full commit message:
Step 3: Follow replacements
When something is removed or deprecated, trace what replaced it. The replacement mechanism is its own concept that needs lifecycle tracking.
Example: If you find "Remove ManualCache in favor of AutoCache", then:
- Add
AutoCacheto your concepts list - Search for all commits mentioning
AutoCache - Track its full lifecycle (introduced, changed, etc.)
Replacements often represent a distinct design phase. Don't collapse "X removed, Y introduced" into a single node - model Y's introduction and evolution as its own chain.
Step 4: Rewrite narratives with gaps filled
Rewrite narratives.md integrating any newly discovered commits. The rewritten version should:
- Include ALL commits found for each concept
- Include replacement mechanisms as first-class concepts
- Update the lifecycle tracking for each concept
- Ensure the arc is complete (if something was introduced, when was it changed/removed?)
If a concept has an incomplete arc (e.g., introduced but never removed, yet it's not in current code), investigate further.
Cross-Narrative Connections
When building the graph, capture how narratives relate - but only connect things that are causally related.
The Causality Test
Before connecting A → B, ask: Would B have happened anyway if A hadn't existed?
- Yes, B would happen anyway → They're parallel concerns. Both branch from their common parent (often the goal).
- No, B only exists because of A → Sequential. A leads_to B.
Examples:
Types of Causal Connections
Prerequisite: B literally couldn't exist without A. B extends, refines, or builds on A.
- Connect: outcome(A) → decision(B)
- Example: "Add cache eviction policies" requires the cache to exist first
- Example: "Optimize query batching" requires the query layer to exist first
- This is the most common causal connection - features building on features
Caused problem: A working revealed a new problem that B addresses.
- Connect: outcome(A) → observation("problem") → decision(B)
- Example: Cache works → but causes stale reads → how to invalidate?
Made obsolete: A's success made B unnecessary.
- Connect: outcome(A) → observation("B no longer needed")
- Example: Auto-scaling works → observation: manual capacity planning no longer needed
Informed by: Learning from A directly shaped how B was designed.
- Connect: observation(from A) → decision(B)
- Example: Observation about user behavior from A informed the API design of B
NOT Causal (Keep Parallel)
Same timeframe: A and B happened around the same time, but neither caused the other.
- Both branch from common parent.
Same area: A and B both touch the same code, but are independent concerns.
- Both branch from common parent.
Same author: Same person worked on both, but they're separate problems.
- Both branch from common parent.
Before Building the Graph
List cross-narrative connections explicitly, but only include causal ones:
If you can't articulate WHY one caused the other, they're probably parallel.
Node Types
| Type | Purpose | |
|---|---|---|
| goal | High-level objective being pursued | |
| decision | A choice point with multiple possible paths | |
| option | A possible approach to a decision | |
| observation | Learning, insight, or new information discovered | |
| action | Something that was done (must reference a commit) | |
| outcome | Result or consequence of an action | |
| revisit | Pivot point where a previous approach is reconsidered |
CLI Commands
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingexample/skills/decision-graph/connective/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/gaearon/woodshed/connective)