A product feature can be rewritten next sprint. A shared layer or module cannot: twenty apps have imported its component names, read its app.config keys and set its options in their own configs. Everything in this section follows from that asymmetry. The interview signal is whether you think in terms of consumers — their upgrade cost, their debugging experience, their production risk — rather than in terms of your own repository.
app.config keys, runtimeConfig keys, routes and layouts, and the modules in the preset. For a module it is the options object, the injected runtime APIs, the hooks it exposes and the types it augments. Everything else is internal, and saying so explicitly is what allows you to change it.overrides option cost you little and prevent forks."The cost of a mistake moves from your repository into theirs. So I design a small public surface and say out loud which parts are internal, I give consumers escape hatches — hooks, an alias, an overrides option — so they do not fork when I did not anticipate their case, and I treat any change to that surface as a breaking change that needs a deprecation window, a migration note and adoption data before removal. I also carry their production risk: every server route or plugin I ship runs in every app, so security advisories and upgrade cadence are part of my job rather than theirs."