#3688 set Vary in middleware believing that was "the layer that holds".
It is not. Next overwrites vary on any app-rendered response
(base-server.js setVaryHeader), so the value never reached a client.
| probe | middleware ratelimit-* | middleware Vary |
|---|---|---|
/llms.txt | arrives | absent |
/favicon.svg (not app-rendered) | - | arrives |
So it is not that middleware headers are dropped. It is Vary specifically.
The layer that works is a handler building its own Response, and both
Markdown handlers already do. That is the direction that matters: the Markdown entry is
the one a cache must never hand to a browser, and it is correctly keyed.
Residual, stated not hidden: the HTML entry carries only Next's RSC tokens, so a cache may serve stored HTML to a crawler. That degrades the bot-Markdown feature; it does not leak Markdown to readers.
/pricing.md and /api-policy.md returned 200 with frontmatter and
llms.txt advertised them, but mdTarget() did not know them, so a crawler asking
for /pricing got HTML.
#3688 replaced a config-grep with a response assertion, then asserted on middleware's own return value rather than the client's response. Green in unit-land, absent on the wire. A response assertion is only worth as much as the response you assert on.