codebase-design-axes
Codebase Design: Variant Axes
The dual of a codebase-design principle. That skill's seam rule is restraint: one adapter means a hypothetical seam; two adapters means a real one — don't build abstraction before something varies. This skill is the forcing direction: the moment something varies, the owner module is mandatory. Restraint without forcing produces sprawl one compliant-looking diff at a time.
Uses the codebase-design vocabulary — module, interface, seam, depth, leverage, locality. Load that skill for definitions.
Glossary
Variant axis — a concept whose values enumerate: states, scenarios, modes, tiers, providers, formats, channels. If you can say "we support N of them and will add an (N+1)th," it's an axis.
Owner module (registry) — the single module that owns an axis. Everything the codebase knows about the axis's values is derivable from it.
Touchpoint — a place a consumer varies with the axis (a route param, a catalog row, a config entry, a switch branch, a fixture flag).
Shallow-by-diffusion — the failure mode: the axis has no module, so its de-facto interface is the union of its touchpoints, each with nothing behind it. Interface as complex as the implementation — shallowness, produced upstream of any module you could point at.
The rule
Every variant axis gets one owner module, and the second variant is the design deadline.