mirror of
https://github.com/zap-proto/zip.git
synced 2026-10-19 15:38:57 +00:00
Three things a consumer migration surfaced. HEAD shadows. Declaration filtered ALL HEAD and OPTIONS, which also deleted an EXPLICITLY declared HEAD — a real door a host would then answer 405 on, which is the analytics-outage class this type exists to prevent. The doctrine was right and the mechanism was wrong: a declaration now projects the PROGRAM, not the materialised router, so shadows never appear (nothing wrote them) and declared HEAD does. App.All is the one entry that is genuinely many doors, so it expands. Consumers enumerating routes should read Declaration, not Fiber().GetRoutes — fiber's own method cannot apply a doctrine zip owns. Fiber() escapes. Fiber() hands out the CURRENT generation's router, and a generation is a projection, so app.Fiber().Use(cors.New(...)) was silently discarded by the next build — no error, no CORS headers. A doc line is weak medicine for a lost CORS policy, so the generation records its route count and a rebuild that finds more refuses, naming the count and pointing at app.Use. Listen. Serve is the one serving mechanism and Listen is now literally Serve followed by Wait — sugar, not a second path. The no-handle shape is deliberate and documented: a fixed program wants the terminal form, anything that loads at run time wants the handle. And a bug of my own, caught by TestLoad_EmbeddedBinary: the first cut of Serve left h.errc nil, so Wait returned immediately and Listen stopped serving at all. The test I wrote for Listen passed against that, so it has been strengthened to dial the socket and assert Listen has NOT returned — verified to fail without the fix. Co-authored-by: Hanzo Dev <[email protected]>