* refactor(isr): centralise HIT/STALE/MISS + Cache-Control decision in isr-decision.ts
Add server/isr-decision.ts as the single owner of the ISR cache policy
decision across all four call sites (app-page-cache, app-route-handler,
pages-page-data, dev-server). Every cache disposition, background-regen
flag, and Cache-Control string now flows through decideIsr() or its MISS
helpers.
Also eliminate all hardcoded Cache-Control literals outside cache-control.ts
(NEVER_CACHE_CONTROL, NO_STORE_CACHE_CONTROL, and raw s-maxage strings
in dev-server.ts, pages-page-response.ts, pages-page-handler.ts).
One deliberate behaviour change: dev STALE responses now emit
s-maxage=0, stale-while-revalidate (matching prod Pages Router) instead
of s-maxage=<revalidate>, stale-while-revalidate. This closes a dev/prod
parity gap that was masked by the duplication.
Closes#1783
* fix(isr): un-export IsrDisposition and IsrPolicyKind (knip unused-export)
* docs(isr): tighten isr-decision docstring and hoist resolveRevalidate
* refactor(isr): pass cacheState directly to decideIsr, drop hasUsableValue/isStale
Replace the two-field hasUsableValue+isStale decomposition with a single
cacheState: "HIT" | "STALE" | "MISS" parameter that callers already have.
Also remove the before/after equivalence table from the module docstring,
which is only relevant during the migration window.
All five call sites updated; tsc --noEmit passes with no errors.
* test(isr): update decideIsr tests for cacheState