The boundary-not-location framing is the right mental model. One sharp corner worth adding: the contagion through imports gets worse with barrel files, a Client Component importing one helper from a utils/index.ts can pull the whole barrel into the client graph, and tree-shaking doesn't bail you out if any of those modules have side effects. Also the dynamic import with ssr: false you mention for window guards isn't allowed inside a Server Component anymore, it has to sit in a Client Component, which catches people copying from older posts. No cacheComponents measurement from me, still on 15-style caching, but the thing I'd want in that comparison is cache invalidation behavior and build time, not just request latency.