История коммитов

.
refactor(http): give the layout page facts instead of the request
The layout needs one fact — whether the homepage is being served. CurrentPage answers it over the RequestStack (the is_homepage attribute, falling back to the path), and the template resolves that service the way it already resolves Theme.
.
refactor(http): pass the boot request from the bootstrap to the front controller
The bootstrap returns the request it builds, so the front controller no longer has to resolve one.
.
fix(install): build the request in the installer instead of resolving it
The installer does not include system/bootstrap.php, so nothing published the synthetic Request service and di(Request::class) threw: /install/ answered 500. It now builds its own request with RequestFactory and passes it to the steps, which are included into the same scope.
.
refactor(http): drop the dead di('route') branch
No caller in modules, themes or system files; it was the last deprecated shim resolving the request from the container inside di().
.
docs: record stage 5c in the migration plan
Stage 5 is closed. Also corrects what the Render debt actually is: addData() without a template list is shareWithAll(), so the whole head meta of a page — not just the title and the theme — stays in the engine for the rest of the process, which is what the isolation test caught.
.
test(http): pin the request isolation of two sequential handle() calls
Acceptance test of stage 5: breadcrumbs do not accumulate, a controller answers the request it is serving, pagination follows the current page, the visitor facts do not survive the cycle, and the request stack returns to its boot entry. Records the rule for how a class gets the current request in .agents/architecture.md, and drops the last di(Request::class): FileStorage::saveFromRequest() takes the request as a parameter.

The comparisons take the body of the page, not the whole response: controllers call Render::addData() without a template list, which is shareWithAll(), so the head meta of one page stays in the engine for the rest of the process. That belongs to the Render rewrite, deliberately outside this stage.
.
docs: record stage 5b in the migration plan
The request is now an action argument everywhere; records the rules the three subagent batches converged on, how the eight non-controller services were split between a method parameter and the RequestStack, and the six live bugs that were hiding under PHPStan baseline entries.
.
refactor(modules): pass the request as an action argument
Closes the remaining modules: contacts, mail, collections, consent, community, help, language, login, notifications, redirect and registration. Controllers no longer hold a Request from the container; private helpers and the ContactForm / HelpLegacyRedirectHandler services take it as a parameter.

Fixes two identical defects found under baseline entries: ContactSettingsController::postedTranslations() and CookieBannerController::buildDto() read multilingual array fields with body(), which returns a string and makes InputBag throw a BadRequestException, so saving either settings page answered 400 whenever a translated field was filled in. Both now use bodyList().
.
refactor(http): read the current request from the stack in shared services
PaginationFactory, PaginationGuard and Theme outlive a request but were built with one. They now read the current request from the RequestStack, the line already taken for Environment, Ads, Counters and LocaleResolver: passing it as an argument would mean touching ~70 files whose actions never take a Request, and Theme is resolved straight from templates where no request exists.
.
refactor(library): pass the request as an action argument
Controllers are container singletons, so a Request injected into the constructor outlives the request it belongs to. Every library controller now takes it as the first action argument; private helpers receive it as a parameter, and LegacyRedirectHandler::handle() takes it from its caller.

Fixes CreateArticleController::renderForm(), called with 9 of its 10 required arguments on both validation-error branches: a flood-control hit or an empty title raised an ArgumentCountError instead of re-rendering the form. The matching PHPStan baseline entry is gone.