intermediateEvolvability

Nine Files For One Tax Rate

Decide what you would do from the brief alone, including whether you would change anything at all. Everything below it is available, but the exercise stops working if you open it first.

The brief you were given

Adding a reduced VAT rate for one product category is estimated at two weeks. The rule itself is four lines. The branch touches nine files: checkout, the invoice renderer, the quote endpoint, the CSV export, the admin edit screen, the refund path, the reporting job, a fixture builder and a seed script.

The trap — the fix that looks like good design and is not

Extracting the rate into config/constants.ts as TAX_RATES and having all nine sites import it. The next *rate* change really is a one-line edit, so the fix looks proven by the very next ticket. It is not the rate that was duplicated, it is the rule — the qualifying categories, the exemption interaction, the shipping treatment, the rounding step. Those nine sites still each implement that, they already disagree in two places, and now they disagree while visibly sharing a constant, which makes the divergence harder to spot and easier to argue is impossible. A constants file extracts the part of the knowledge that was never the problem.

Read this even if you are confident. It is here rather than behind a button because it is the answer most teams actually ship, it passes review, and the cost of it does not arrive until the change after this one.