Systems Thinking
SkillDev toolsApply systems thinking: feedback loops, second-order effects, leverage points, intervention plan.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Systems Thinking skill
What this skill tells your AI
The instructions your AI receives, as published by liqiongyu/lenny_skills_plus in skills/systems-thinking/SKILL.md and read by ahel’s review.
A reasoning lens, not a gate. It produces no artifact of its own and blocks nothing. It shapes how the judgment agents reason about the system around a change. That system is the callers, consumers, sibling implementations, and conventions that live outside the diff. Locally correct work then also fits the whole.
Core Lenses
Four lenses sharpen every research answer, design decision, slice boundary, plan step, edit, and review finding:
- Blast radius over diff radius: The lines you change are rarely the whole change. Ask what else the system expects to move when this moves: callers, config, docs, tests, and sibling implementations. Treat that set as the real scope of the work.
- Callers and siblings first: Before judging or changing a component, find who calls it, who consumes its output, and which sibling implementations do the same job elsewhere. A change made without that map duplicates an existing solution or breaks a neighbor quietly.
- Conventions are contracts: The patterns established elsewhere in the codebase — naming, error handling, file layout, idioms — are implicit contracts with every reader and every future change. Diverging from one is a decision to surface and justify, never a silent default.
- Leave the system consistent: After the change, every sibling must still agree, every caller must still work, and every convention must still hold. Otherwise the divergence is named and deliberate.
When Researching
Facts to gather for each component a research answer touches — recorded as observations with file:line evidence, never as inferred intent:
- Who calls it, and who consumes its output? Map the callers and consumers of each component you answer about, so downstream phases see the full contact surface, not only the component itself.
- What siblings do the same job? Name the sibling implementations that follow the same pattern elsewhere, so later phases can keep them in agreement or reuse them instead of duplicating.
- What conventions govern it? Record the established conventions the component follows — as facts about the code as it stands, never as guesses about what the task might want.
When Designing
Questions to apply while writing a design's ## Current state and
## Decisions made sections:
- What are the adjacent components? Document the callers, consumers, and sibling implementations around the component being changed — not only the component itself.
- What must change together? For each decision, name the surfaces that must move with it — callers, siblings, config, docs. A decision that is silent about its neighbors is incomplete, not conservative.
- Which conventions does the approach touch? Where the design diverges from an established pattern, say so explicitly and give the reason.
When Slicing
Questions to apply while drawing slice boundaries:
- Does the slice include every co-changing surface? A slice's scope is its blast radius, not its diff. The callers, siblings, docs, and config that must move together belong in the same slice.
- Does any slice knowingly leave a caller or sibling broken? No slice ships a state where a neighbor of something it touched no longer works. Re-draw the boundary rather than defer the breakage.
When Planning
Questions to apply while writing file-level steps:
- Is every call site an explicit step? When a contract changes, enumerate each of its call sites as its own step — "update callers" is a hope, not a step.
- Are co-changing doc and config surfaces in the slice? Docs, schemas, and config that describe a changed surface move in the same slice as the change, never in a follow-up.
When Implementing
Discipline to apply before and during each slice:
- Does an implementation already exist? Search for an existing implementation before adding one — extending or reusing the sibling beats writing a divergent twin.
- Which callers does this edit affect? Update every affected caller in the same slice. A locally green diff that breaks a neighbor is not done.
- Does the edit match the local idiom? Follow the conventions of the surrounding code, even where a different style would also work.
When Reviewing
The questions behind the System Fit checklist item in
skills/reviewing-code/SKILL.md, and the ux-reviewer's adjacent-flow check:
- Does a sibling implementation now diverge? Two components that did the same job the same way should still agree after the diff — flag the one left behind.
- Does a caller or consumer outside the diff need updating? Review the changed files and the neighbors whose expectations they carry.
- Does the change follow the conventions established elsewhere? Cite the specific convention when flagging a divergence, so the finding is checkable rather than a taste claim. Convention governs where no written rule speaks. Where one does, the rule wins and the precedent is a second violation rather than a defence — a pattern's presence on the default branch says it shipped, not that it is permitted.
Lens, Not Dogma
This lens informs judgment. It never blocks the pipeline. On a greenfield or single-file target there can be no callers, siblings, or conventions to map. There, "none found" is a complete answer. Never manufacture findings to satisfy the lens. The point is to keep "does this fit the system around it?" in view — not to add ritual.
Signals
- GitHub stars
- 52
- Forks
- 8
- Last commit
- May 2026
Advanced
- Catalog kind
- skill
- Gateway key
systems-thinking- Source
- github.com/liqiongyu/lenny_skills_plus