# Root cause: upgrade 2.2.0 Runtime Error

## Stary przepływ

`GET /upgrade_2_2_0.php` wykonywał:

1. bootstrap,
2. kontrolę administratora,
3. `balt220_release_preflight_checks()`,
4. renderowanie strony.

Krok 3 uruchamiał helpery modułów przed wykonaniem `balt220_release_apply()`. Niektóre helpery zakładały, że schemat 2.2.0 już istnieje.

## Pierwszy odtworzony wyjątek

```text
SELECT COUNT(*) FROM enterprise_preop_lab_ai_rules WHERE active=1
```

Tabela nie istniała jeszcze, ponieważ upgrade nie został uruchomiony. Wyjątek opuszczał Preflight i trafiał do globalnego Runtime Error Guard.

## Naprawiony przepływ

- każdy helper sprawdza istnienie tabeli;
- każdy helper ma lokalny `try/catch` dla odczytów diagnostycznych;
- agregator release’u izoluje wyjątki helperów;
- Preflight na stronie upgrade nie mutuje schematu;
- brak schematu jest prezentowany jako `BRAK`, a nie HTTP 500;
- instalacja tworzy schemat dopiero po świadomym POST administratora.
