SIMULATED

Change Impact Explorer

Pick a requirement change and see what it costs under two designs of the same system: how many modules you must edit, how far you must re-verify, which tests run, and whether the edit lands in one place. Every figure is a count read off a dependency graph, never a judgement about quality.

RequirementConstraintsInvariantsResponsibilitiesBoundariesInterfacesStateDependenciesFailureImplementationTestsFeedbackEvolution

The claim this domain makes is that good design controls the cost of change, and this page is where that claim is made falsifiable rather than asserted. It is also where the claim is allowed to lose: work through every change below and you will find one where the tangled design edits fewer modules than the bounded one. That case is the most useful thing here. A design makes the changes it anticipated cheap; it cannot make every change cheap, and anybody who tells you otherwise has not tried to price one.

The change request

Eight things a business plausibly asks for. Two of them are much harder than they sound, and one of them is harder in the well-designed system.

Apply VAT to European orders
lands on one concept
What it really demands
One rule about how a total is computed, which must apply everywhere a total is shown or charged.
reasons to change it touchestax rules change

What it costs, side by side

The same requirement, priced against a design that knows everything and a design where each piece of knowledge has one address.

tangled
One service that knows everything

The shape most systems reach after two years without deliberate boundaries: a single class that computes, persists, charges, notifies and audits, plus thin wrappers around the things it talks to.

modules edited
3
must re-verify
3
test files run
4
Modules you must edit
AdminToolsExportJobOrderManager
Also re-verified — depends on something that moved

Nothing beyond the edited modules.

Tests that must run
admin_testcheckout_e2e_testexport_testorder_manager_test
deploysapp
not contained The edit is spread across 3 modules, so no single unit can be read to know what this change does.
bounded
Modules with owned responsibilities

The same system with each piece of knowledge given one address. Still one deployable unit — this is a modular monolith, not a set of services.

modules edited
1
must re-verify
3
test files run
3
Modules you must edit
Tax
Also re-verified — depends on something that moved
AdminToolsOrders
Tests that must run
admin_testorders_testtax_test
deploysapp
contained Every edit lands inside one module, so one person can hold the whole change in their head and one test file proves it.
  • 2 more module(s) must be re-verified than edited, because they depend on something that moved.

The reading

Edits and re-verification are different sets, and the second is usually larger. Teams estimate the first.

What the boundaries bought

The bounded design edits 1 module(s) against 3. This is a change the boundaries anticipated: the knowledge has one address, so the edit has one address.

How to read this page honestly

What the model is, and what it deliberately refuses to be.

  • SIMULATEDThe two designs below are models written for this lab, not a real codebase. Every number on this page is a count read off a dependency graph you can inspect — modules that declare a reason to change, modules that depend on those, the test files those modules own. Nothing here is a quality number, because a design reduced to one would tell you nothing you could act on.
  • CONTESTEDThe argument that boundaries are worth their cost is not universally accepted, and the strongest form of the objection is on this page rather than hidden from it: separation buys locality for the changes it anticipated and charges for the ones it did not. Pick a cross-cutting change below and the bounded design edits *more* modules than the tangled one. That result is the lab working, not the lab failing.

Take it further