- src/App.php broken down 9690→~7600 lines: ResponseMiddleware, CLI, CGI\Dispatcher,
Middleware\Pipeline\*, LocationHeaderMiddleware, TemplateUnavailableException extracted
(run() decomposed into registerOnRequest/WorkerStart/WorkerStop — zero logic change)
- route() ergonomics: handler accepted as the last positional arg (no handler: keyword)
- Per-route + App::when() path-scoped middleware, in-file $middleware for api files
- Dev route hot-reload (--dev / ZEALPHP_DEV=1 / App::devReload) + CLI docs
- phpinfo redesign: Apache-parity system/extension/environment sections + sticky TOC
- Per-user log-dir fallback (resolve_log_dir) when /tmp/zealphp is root-owned
- ext-zealphp pinned to v0.3.25 across setup.sh + Dockerfile
- Fixes: #164 (RequestContext array superglobal __get), #157 (root-level api 404),
#155 (registerCgiBackend exec_paths validation)