SIMPLIFIED
Decomposition Visualizer
A problem at the root, subproblems below, the pieces you would build at the leaves. Edit the tree and the page scores its shape live — by capability or by layer, testable leaves or headings, seven children or seventeen.
Problem→Understand→Requirements→Constraints→Unknowns→Decomposition→Smallest Step→Model→Experiment→Observe→Debug→Learn→Iterate
The first decomposition most people draw is Frontend / Backend / Database. It is true of every application and therefore says nothing about this one. A decomposition earns its place when each piece is understandable, testable, meaningful and small enough — and the test for "testable" is a sentence: what would you see that shows this piece works? Load the anti-pattern, watch the score, then fix it one node at a time. Double-click a name to rename it; click a node for its controls.
Presets
By capability, not by layer: seven things a store does, with Checkout expanded into the six steps §20 walks through. Every leaf says how you would know it works.
score
100 / 100
nodes · leaves
29 · 21
testable leaves
21 / 21
depth
2
verdict
Every leaf is testable and the tree is by capability — the structure has nothing obviously wrong with it.
The tree — highlighted nodes carry a warning
- testable GET /products returns every active product with name and price.
- testable Opening a product shows its description, price and stock state.
- testable Searching "lamp" returns only products whose name contains it.
- testable Adding a product makes it appear in the cart with quantity 1.
- testable Setting quantity to 0 removes the line; the subtotal follows.
- testable Reloading the page shows the same cart.
- testable Checkout starts with exactly the lines the cart holds.
- testable A line whose product went out of stock is refused with a message naming it.
- testable Total equals the sum of line prices plus shipping, never negative.
- testable A payment intent exists for the total before any order does.
- testable A successful payment yields exactly one order with the cart's lines.
- testable The customer sees the order number and receives an email with it.
- testable A customer sees their own orders and nobody else's.
- testable An order moves placed → paid → shipped, and never backwards.
- testable A test card is charged the order total once.
- testable A declined card leaves no order and shows the decline reason.
- testable A payment confirmed by webhook marks its order paid, even if the browser closed.
- testable Ordering two of a product with stock 5 leaves stock 3.
- testable Two orders for the last unit produce one order and one refusal.
- testable A product created in admin appears in the catalog.
- testable Setting stock in admin changes what checkout allows.
As an outline — two spaces per level, "Name — testable observation"
How to read this page honestly
What the tool does, and what it deliberately refuses to do.
SIMPLIFIED
The score reads shape and names, not meaning. A leaf whose testable text is "it works" passes; a capability called "Orders" that should have been "Refunds" scores the same; "Persistence", "Rendering" and "Transport" are layers by another name and dodge the layer rule. A hundred means "nothing obviously wrong with the structure" — a well-shaped tree of nonsense scores a hundred too. And the to-do preset is deliberately boring: a problem that small barely needs a tree, and decomposing it further is decomposition for its own sake.
Take it further
Decomposition by Capability →
Why capabilities cut through layers, and layers cut through nothing.
What Makes a Good Subproblem →Understandable, testable, meaningful, small enough — the four tests behind the score.
What Should I Build First? →Turn the leaves into features with dependencies and pick an order.