# Технический аудит портала Лидерра — Этап 2: находки

**Дата:** 15.06.2026. **Тип:** наблюдательный сквозной аудит локальной dev-копии (поиск
скрытых хвостов). **Канал:** церемония спека→план под стеной «роутер-наставник» (командные
фазы как опечатанный план; MCP/субагент-фазы недоступны под стеной — вынесены).

Связанные артефакты: спека `docs/superpowers/specs/2026-06-15-portal-tech-audit-stage2-v2.md`
+ `…-followup.md`; план `…/plans/2026-06-15-portal-tech-audit-stage2-run.md` + `…-followup-run.md`;
хендофф поиска хвостов `…/plans/2026-06-15-tails-audit-handoff.md`.

## Серьёзность

P0 — блокирует production / порча данных / инцидент безопасности. P1 — нарушение
функциональности / упавший тест / уязвимость. P2 — предупреждение / тех-долг / дрейф
инструмента. P3 — косметика / docs.

## Находки

### F-1 [P1, security] 14 CVE-advisory на 9 пакетах зависимостей

`composer audit --locked` → 14 advisories. Установлены уязвимые версии:

- `laravel/framework 13.8.0` — CRLF-инъекция в default email rule (CVE-2026-48019); патч 13.10.0.
- `guzzlehttp/psr7 2.9.0` — Host Confusion (CVE-2026-48998) + CRLF Injection (CVE-2026-49214); патч 2.10.2.
- `symfony/yaml 7.4.10` — Billion Laughs (CVE-2026-45304) + ReDoS (CVE-2026-45305) + stack-exhaustion (CVE-2026-45133); патч 7.4.12.
- `symfony/http-foundation 7.4.8` — IpUtils PRIVATE-ranges (CVE-2026-48736).

**Причина:** зависимости отстали от пропатченных версий (накопилось с мая 2026 — в прежних
аудитах было чисто). **Лечение:** `composer update` до пропатченных + перепрогон тестов.
Новый хвост — в доках/TODO не значился.

### F-2 [P1, тесты] 2 упавших frontend-теста (untracked, незавершённая a11y-работа)

`vitest run` → 944 passed / 3 skipped / **2 failed**:

- `tests/Frontend/TenantsFilters.spec.ts` — a11y: у поля поиска нет `<label>` (`.search-input label` не найден).
- `tests/Frontend/TenantsStatsHeader.spec.ts` — a11y: счётчик использует низкоконтрастный `text-success` вместо AA-класса `stat-success`.

**Причина:** оба файла **untracked** (`??` в git status) — a11y-тесты написаны (TDD red), но
реализация в компонентах админ-страницы Tenants не сделана и не закоммичена. Возможна связь с
веткой `wt-a11y-fullpg`. Новый хвост.

### F-3 [P2, тех-долг] Статанализ: коммиты прошли мимо style/format-хуков

Системная причина — lefthook не был в PATH в worktree (зафиксировано в CLAUDE.md про
lead-region): часть коммитов не прогналась через Pint/Prettier.

- **Pint:** 19 файлов не проходят стиль (`Snapshot*`, `CsvReconcileJob`, миграции `2026_05_26/27`, тесты `LeadRouter`/`Supplier`). Лечение: `composer pint`.
- **Prettier:** 68 файлов не отформатированы (41 `resources/js` + 27 `tests/Frontend`). Лечение: `npm run format`.
- **vue-tsc:** 3 ошибки типов в тестах регионов (`NewProjectDialog.regions.spec.ts`, `RegionsBulkDialog.spec.ts`) — `.props()` на `WrapperLike`, нужен `findComponent`.

### F-4 [P2, нужна сверка] Larastan: 200 ошибок — вероятно дрейф baseline / config-dir

`composer stan` → 200 ошибок (вывод обрезан). Все видимые — `larastan.noEnvCallsOutsideOfConfig`
на самих `config/*.php` (app/auth/cache). Правило «env() вне config-каталога», срабатывающее на
файлах config/, указывает на **сбой определения config-каталога / дрейф baseline** (вложенный
`app/` + кириллический путь), а не на 200 реальных дефектов. **Нужна сверка с baseline**, чтобы
отделить настоящие ошибки от инструментального шума.

### F-5 [P3, docs] markdownlint / cspell / eslint warnings

- **markdownlint:** 1443 ошибки в 576 файлах (MD022/MD032/MD058/MD029 — пустые строки вокруг заголовков/списков/таблиц). Авто-фикс `npm run lint:md:fix`.
- **cspell:** масса unknown-words, но это легитимный жаргон (дедицированных, Ahrefs, Klaviyo, хелперы, вьюхи…) — пробелы словаря `cspell-words.txt`.
- **ESLint:** 7 warnings (vue/require-default-prop, vue/v-slot-style), 0 errors.

### F-6 [P3, не инцидент] gitleaks: 1 leak в истории — false positive

`gitleaks detect --redact` → 1 leak: `tools/enforce-read-path-deny.test.mjs:88`, правило
`private-key`, коммит `acc90450`. Это **тест-фикстура** (фейковый ключ, которым тест проверяет
секрет-сканер), а не реальный секрет. Файл удалён из рабочего дерева (снос тест-слоя мозга
`3aeedb8a`), но остался в истории. **Не инцидент.** Опционально — allowlist исторического
fingerprint в `.gitleaks.toml`.

## Чисто

- **squawk** (DDL `db/schema.sql`) — 0 issues.
- **Схема БД** (dev `liderra`, PG 16.13) — 106 таблиц, 4.05 MB; партиции m05–m10 на месте, дрейфа нет.
- **schedule:list** — 16 задач, состав здоровый (partitions, billing sweeps, supplier sync/refresh/cleanup, CsvReconcile, incidents watch, audit verify-chains, heartbeats).

## Не выполнено (нужен отдельный канал)

- **Backend-тесты (Pest)** — 2 попытки неуспешны: `composer test` упёрся в composer
  process-timeout 300с (последовательный прогон большой сюиты); `php app/artisan test --parallel`
  из корня сломался (paratest ожидает cwd=app: `Could not open input file: vendor/.../pest`).
  Нужен `cd app && php artisan test --parallel` (cwd=app + обход composer-таймаута) или терминал
  владельца. Частичный сигнал из первой попытки: `VerifyAuditChainsTest` показал audit-chain
  mismatch в dev тест-БД (`tenant_operations_log_y2026_m06: 7`, `pd_processing_log_y2026_m06: 1`)
  — перекликается с известным хвостом audit-chain-algorithm-divergence; подтвердить нельзя.
- **Semgrep SAST** — не установлен на dev-машине (Python-тул; только CI).
- **Схема-deep** (Boost MCP), **UI-smoke 24 маршрута** (Playwright MCP + портал не поднят),
  **Pa11y** (нужен сервер), **корректный knip** (запуск дал 359 false-positive из-за неверного
  scope — сканировал всю репу), **coverage** — требуют MCP (недоступны под стеной) либо
  поднятого dev-сервера.

## Сверка с хендоффом поиска хвостов

- F-1 (CVE), F-2 (2 untracked failing a11y-теста), F-3/F-4 (статанализ-долг) — **новые**, в
  хендоффе Этапов 0/1/3 их не было.
- F-6 (gitleaks) — оказался false-positive, не хвост.
- audit-chain mismatch в тест-БД — согласуется с уже известным хвостом (но это dev тест-БД, не прод).
- Известный долг «3 чужих console-теста взаимозагрязняются» — подтвердить не удалось (backend не догнал).

## Открытые вопросы реестра

Не закрывались (требуют явного решения владельца). Известные из хендоффа: Б-1 (P0, реквизиты
ООО), SEC-3/4/5 (сервер), прод-хвосты (Perplexity Pack не запушен — 403; webhook signal_type
sync; AuditRebuildChain права). Аудит их не трогал.

## Рекомендации (приоритет)

1. **F-1** — `composer update` пропатчить 4 пакета (security), перепрогнать backend-сюиту.
2. **F-2** — доделать a11y-реализацию Tenants (label + stat-success) под 2 untracked-теста, либо удалить тесты, если фича отменена; решить судьбу `wt-a11y-fullpg`.
3. **F-3** — `composer pint` + `npm run format` (massовый авто-фикс), починить 3 type-ошибки в тестах регионов.
4. **F-4** — сверить Larastan baseline (отделить реальные ошибки от config-dir шума).
5. Добрать backend-тесты и MCP-фазы отдельным каналом (maintenance/терминал).
