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

.
refactor(comments,downloads): pass the request globals explicitly
Johncms\Comments took its sub-action and page offset through $mod and $start globals,
which the four calling controllers set right before constructing it. Both are now keys of
the parameter array Comments already accepts, and the class casts the offset itself — it is
interpolated into a LIMIT clause, so that safety used to rest on all four callers
remembering to cast.

- The same controllers read $_REQUEST['page'] and $_GET['start'] directly; they now read
the request. A page number arriving in the body no longer counts, only the query string.
- $GLOBALS['old'], the "new file" threshold of the downloads module, is gone: FilePresenter
derives it from FilePresenter::NEW_FILE_PERIOD. This fixes the mark on eight of the ten
pages using the presenter — only two set the global, everywhere else the fallback of 0
made every file new.
- CommentsPageTest covers the four pages as far as the harness allows: they sit behind
preconditions a guest cannot satisfy, so it asserts they never answer 5xx and checks the
full page only when the stand serves one.
.
docs: drop migration-plan references from code comments
Comments pointed at .claude/http-kernel-migration-plan.md and its stage numbers, which
say nothing once the plan is gone. Rewritten to describe the code itself: "a worker
runtime" instead of "stage 6", "until the request scope is explicit" instead of
"until stage 5".
.
refactor(session): swap the facade implementation to HttpFoundation
The session facade now wraps Symfony\Component\HttpFoundation\Session instead of
reading and writing the root of $_SESSION. Session data of existing installs stops
being readable, so every visitor is logged out once — noted in CHANGELOG.md together
with the loss of dot notation in the facade API.

- SessionFactory picks the storage by runtime: native under HTTP, in-memory under
CONSOLE_MODE, so cron runs and console commands no longer open a real PHP session
and leave sess_* files behind. The service is registered explicitly in
system/config/services.php instead of being autowired from a default argument.
- The session is started explicitly in the web bootstrap, before anything reads a key:
a read starts it implicitly, and the translator factory reads 'lng' during boot.
Kernel::handle() keeps an idempotent start() as the per-request entry point.
- Csrf keeps its tokens in one nested array: the facade stores flat keys.
- Session::invalidate() added and used on logout — clear() kept the old session id valid.
- Tests drive the session through its API on in-memory storage.
.
refactor(session): complete stage 4a facade rollout
Replace remaining direct \ usage in modules with Johncms\Http\Session so data access stays unified before the 4b backend swap.

This avoids split storage risk during SessionInterface migration and updates the HTTP kernel migration plan to reflect 4a completion.
.
refactor(profile): replace raw $_SESSION with Session facade
3 files: SettingsController ($_SESSION['lng'] → set(), set_ok/reset_ok → flash()), EditProfileController (success_message → flash()), RestorePasswordController ($_SESSION['code'] → set/remove).
.
refactor(downloads): replace raw $_SESSION with Session facade
IndexController.php and DownloadCategoryController.php: $_SESSION['sort_down'] / $_SESSION['sort_down2'] → $this->session->get(..., 0) / $this->session->set(), lazy init via default argument dropped.
.
refactor(collections,system): replace raw $_SESSION with Session facade
Collections (4 admin controllers): $_SESSION['success_message'] → $this->session->flash()/getFlash(), removed pullFlash() helper.

System (4 files):
- Comments.php: $_SESSION['code'] → $this->session->set/get, fixed $owner type (bool→int) for isBlockedBy()
- TranslatorServiceFactory.php: $_SESSION['lng'] → $session->set/get/has, injected via $container
- Validator/Rules/Captcha.php: $_SESSION[$this->sessionField] → $session->has/get via di()
- Security/Csrf.php: $_SESSION['_csrf'][$token_id] → $this->session->set/get, constructor injection
.
refactor(admin): replace raw $_SESSION with Session facade
- 14 admin controllers now inject Johncms\Http\Session\n- Use session->flash()/getFlash() for success messages\n- All files are final readonly classes with constructor injection
.
refactor(news): replace raw $_SESSION with Session facade
- Inject Johncms\Http\Session into AdminController, AdminSectionController, AdminArticleController, Article

- Use flash()/getFlash() for success messages, set()/get() for delete_token and view tracking

- Remove redundant $services->set(Article::class) that lacked autowire

- Make Article final readonly with promoted constructor properties
.
refactor(system): remove PHP version check from bootstrap
Composer's autoloader already enforces the PHP version requirement via platform config, making this check redundant.