Following that: the thing that got me was an import, not a call.
We had a small helper that read a cookie to work out the current user. Somebody imported it into a shared component for an unrelated reason: it exposed a formatting function that happened to live in the same file. The cookie code was never called on those pages. It did not matter; the route was dynamic from then on.
That is why you cannot find when it changed by looking at the pages. The change is a line in a file you were not thinking about.
How to hunt it:
Search for the request-scoped imports across the tree, cookies, headers, anything auth-related: and see which components pull them in, directly or transitively.
Bisect if the search is too broad. Comment out half the imports in the suspect layout, build, look at the table. Three or four rounds and you have it.
Split the file once you find it. Formatting helpers and request-scoped helpers should not live together, and this is exactly why.
The wider habit worth taking from it: treat the build output table as something you look at, the way you would look at a bundle size. A route quietly moving from static to dynamic is a real regression with a real cost, and nothing else warns you about it.