# Portal Full Audit #2 — Design (2026-05-13)

> **Версия:** 1.0 от 2026-05-13
> **Триггер:** заказчик «продолжим аудит экономия 0%» (continuation после CTO-19 closure + plan5→main merge `21262ef`)
> **Режим:** экономия 0% — максимальное всеобъемлющее качество, без любых скипов
> **HEAD на старте:** `main` `21262ef` (Merge plan5-frontend-projects → main, 120 commits ahead `615db99`)
> **Предыдущий аудит:** [../audits/2026-05-12-portal-full-audit-report.md](../audits/2026-05-12-portal-full-audit-report.md) (10/10 Q-items closed)

---

## 1. Цель

Полный 14-phase портальный аудит на main `21262ef` post-merge plan5→main. Сравнение с baseline 12.05.2026, обнаружение drift'а от 120 закоммиченных изменений (Plan 5 frontend Tasks 7-11, Quiet Luxury portal redesign, CTO-19 Lucide migration, Q.DEFER.003/004 closures, audit-fix tail). Закрытие residuals + новая Phase 14 pre-production readiness.

## 2. Scope-decisions (согласованы с заказчиком)

| Dimension | Выбрано | Альтернативы рассмотрены |
|---|---|---|
| Тип audit'а | Новый audit pass от main `21262ef` | (B) доразбор deferred / (C) Pa11y residual / (D) квирк 62 hygiene — отложены |
| Глубина | Full 13-phase + Phase 14 pre-prod readiness | (A) full 13 / (B) core 6 / (C) delta-mode — отвергнуты |
| Fix-стратегия | Hybrid: P0+P1 → atomic commits на main; P2/P3 → только findings.md | (A) fix-during-audit all / (B) audit-only / (C) per-phase gate — отвергнуты |
| Branch policy | main directly, atomic commits, push в конце через `Bash(git push origin main:*)` | feature branch + PR — отвергнут (continuation pattern) |

## 3. Artifacts (выходные)

Все в `docs/superpowers/audits/`:

- **`2026-05-13-portal-full-audit.md`** — план (адаптация 12.05 плана к 2026-05-13 HEAD)
- **`2026-05-13-portal-full-audit-findings.md`** — детальные findings per phase, P0/P1/P2/P3 + FIX-NOW/FIX-DEFER/BLOCKED tags, ≥3 гипотезы per non-trivial finding (per economy 0% + Pravila §4.5 systematic-debugging)
- **`2026-05-13-portal-full-audit-blocked.md`** — Q-items (Q.HARD/Q.PRODUCT/Q.DEFER/Q.INFO) с «что нужно от заказчика» + «план Б»
- **`2026-05-13-portal-full-audit-report.md`** — summary verdict 🟢/🟡/🔴 + метрики до/после + commits list + lessons captured

**Доп. артефакты:**

- Screenshots в `audit-screens/2026-05-13/` (24 views Phase 5).
- Memory updates: новые квирки в `feedback_environment.md`, baseline updates в `project_state.md` после Phase 9.

## 4. Phases (14 шт.)

### Phase 0 — Pre-flight (~5 мин)

- `git status --short` + `git log --oneline -10` → подтвердить HEAD = `21262ef`, working tree clean.
- `git diff HEAD~5 --stat` — что менялось в последних 5 коммитах.
- Skeleton 4 audit-файлов в `docs/superpowers/audits/2026-05-13-portal-full-audit-{plan,findings,blocked,report}.md`.
- Inventory untracked workdir после CTO-19 (Lucide migration screenshots, mapping changes).
- Verify deps installed: `composer install --quiet` + `npm ci --legacy-peer-deps` (per квирк 74).

### Phase 1 — Static analysis (parallel ×4 subagents, ~20 мин)

Single message с 4 параллельными `Agent` tool calls (per `superpowers:dispatching-parallel-agents`):

- **Subagent A (Backend) — `subagent_type: general-purpose`:** `composer pint:test` + `composer stan` + `composer audit --locked`. Return raw exit codes + полный stderr/stdout, не summary.
- **Subagent B (Frontend) — `subagent_type: general-purpose`:** `npm run lint:vue` + `npx vue-tsc --noEmit` + `npx prettier --check .` + `npx knip --production`. Raw output.
- **Subagent C (Docs) — `subagent_type: general-purpose`:** `npm run lint:md` + `npm run spell` + `npm run links`. Raw output.
- **Subagent D (SQL) — `subagent_type: general-purpose`:** `npx squawk lint app/database/migrations/` + `pg_format db/schema.sql > /tmp/schema-fmt.sql && diff db/schema.sql /tmp/schema-fmt.sql | wc -l`. Raw output.

**Я принимаю все решения по findings**, subagent'ы только собирают данные.

### Phase 2 — Test suites (sequential, ~10 мин)

В main session:

1. `composer test` без `--parallel` (квирк 62 — ожидаемые sequential failures из cumulative state). Полный output.
2. `composer test -- --parallel --recreate-databases` (per квирк 73 — для long sessions).
3. `cd app && npx vitest run --reporter=verbose` (без coverage — Phase 13 отдельно).
4. `cd app && npm run story:build` (Histoire full, не watch).
5. `cd app && npm run build` (Vite production).

### Phase 3 — Schema integrity (Boost MCP, ~5 мин)

Через `mcp__laravel-boost__database-query` к dev `liderra`:

```sql
SELECT count(*) FROM pg_tables WHERE schemaname='public';
SELECT count(*) FROM pg_indexes WHERE schemaname='public';
SELECT count(*) FROM pg_policies WHERE schemaname='public';
SELECT count(*) FROM pg_proc p JOIN pg_namespace n ON p.pronamespace=n.oid WHERE n.nspname='public';
SELECT count(*) FROM pg_trigger WHERE tgisinternal=false;
SELECT count(*) FROM pg_inherits;  -- partition relationships
```

Diff с CLAUDE.md §0/§2 dev-actual baseline (75/102/289/39/5/19/0). Orphan FK check через `mcp__laravel-boost__database-schema`.

### Phase 4 — Security (~10 мин)

**Methodology gap closure (Pravila v1.12 §4.6):**

1. **ПЕРВЫМ** `ls .github/workflows/` (enumerate CI infra ДО semgrep verdict) — закрывает audit gap от 12.05.
2. `./bin/gitleaks.exe detect --no-banner --redact` (full history).
3. `composer audit --locked`.
4. Production secrets grep:
   - `grep -rE "AKIA[0-9A-Z]{16}|SK[a-z0-9]{32}" app/ --include="*.php"`
   - проверка `.env.example` ↔ `app/config/*.php` references на полноту (нет ли missing env keys).

### Phase 5 — UI smoke (Playwright MCP, ~30 мин)

Main session (не subagent — MCP context inheritance не работает).

- DemoSeeder seed: `cd app && php artisan db:seed --class=DemoSeeder`.
- Laravel server: `cd app && php artisan serve` (background).
- Vite dev server: `cd app && npm run dev` (background).
- 24 views per 12.05 table (auth ×7, main ×8, admin ×8, error ×1).
- **CTO-19 verification:** Lucide icons rendering correctly на всех 24 views (custom Vuetify `IconSet` в `app/resources/js/plugins/vuetify.ts`, 103-entry mapping).
- Login flow: admin@demo.local / password → POST /api/auth/login → /dashboard.
- Logout flow: avatar dropdown → POST /api/auth/logout → /login.
- Screenshots → `audit-screens/2026-05-13/01-login.png` … `24-error-404.png`.

### Phase 6 — Cross-doc integrity (~10 мин)

Версии 7 нормативных файлов (factual vs memory claims):

| Документ | Path | Expected (memory) |
|---|---|---|
| CLAUDE.md | `CLAUDE.md` | v1.91 |
| Pravila | `docs/Pravila_raboty_Claude_v1_1.md` | v1.12 |
| PSR_v1 | `docs/Plugin_stack_rules_v1.md` | v2.0 |
| Tooling | `docs/Tooling_v8_3.md` | v1.16 |
| Реестр | `docs/Открытые_вопросы_v8_3.md` | v1.83 |
| Схема | `db/schema.sql` | v8.20 (per memory project_state) |
| README | `docs/README_АРХИВ_v8_5.md` | v8.5 |

Плюс:

- `routes/web.php` explicit `Route::view` list completeness check (12.05 finding — `/reset`, `/projects`, `/admin/*` были missing; fixed `b9038bc`).
- Vue Router routes inventory (`resources/js/router/index.ts`) vs views inventory (`resources/js/views/**`).
- Memory description ↔ файлы факт (forward-stale check как Q.DEFER.001).

### Phase 7 — Categorize (~5 мин)

Taxonomy:

- **Severity:** P0 (блокирует prod / data corruption / security) → P1 (failing test / type error / a11y) → P2 (warning / style / stale doc) → P3 (cosmetic).
- **Fix-eligibility:** FIX-NOW (≤30 мин) → FIX-DEFER (>1 час) → BLOCKED (hard-stop из decision-tree).

Severity rollup таблица per phase + total. Fix-queue ordered list для Phase 8.

### Phase 8 — Fix loop (hybrid policy)

- **Только P0+P1** атомарными коммитами на main.
- **P2+P3** → только запись в findings.md (без commits).
- Self-review §8 после каждых 3 коммитов: `git diff HEAD~3..HEAD --stat`.
- После каждого Edit/Write на code → relevant тесты (Pest/Vitest).
- Перед каждым commit → `lefthook run pre-commit --all-files`.
- Никаких `--no-verify`, `--amend`, `--no-gpg-sign`.

### Phase 9 — Final regression verification

Re-run baseline (per economy 0% — full output, не summary):

- `composer test -- --parallel --recreate-databases` — ожидаемо ≥742 / ≥739 passed / 0 failed / ≤3 skipped.
- `cd app && npx vitest run --reporter=verbose` — ожидаемо ≥88 files / ≥683 passed / 0 failed.
- `cd app && npm run build` — exit 0, без warnings.
- `cd app && npm run story:build` — ожидаемо ≥35 stories / ≥63 variants.
- Если регрессия → systematic-debugging (≥3 гипотезы) → fix или rollback.

### Phase 10 — Live Pa11y / axe-core (~20 мин)

**Guest URLs (4) через Pa11y CLI:**

- `npx pa11y --standard WCAG2AA --timeout 30000 --wait 1500 http://127.0.0.1:8000/login`
- `…/register`
- `…/forgot`
- `…/no-such-path-anywhere` (ErrorView 404)

**Auth-required views (16) через Playwright MCP + axe-core 4.10 CDN inject:**

Per Q.DEFER.004 false-alarm lesson + Pravila v1.12 §4.6 UI-refactor visual smoke:

1. `mcp__playwright__browser_navigate` → URL.
2. **`await new Promise((r) => setTimeout(r, 500))`** через `browser_evaluate` (HMR race quirk).
3. Hard reload (`browser_navigate` again).
4. `browser_evaluate` inject axe-core 4.10 CDN script.
5. `browser_evaluate` `axe.run()` + parse violations.

URLs: /dashboard, /deals, /kanban, /projects, /reports, /billing, /settings, /reminders + 8 admin (/admin/tenants, /admin/tenants/1, /admin/billing, /admin/incidents, /admin/system, /admin/pricing-tiers, /admin/supplier-prices, /admin/impersonation).

**Закрытие Q.DEFER.002 residual** — auth-required coverage gap.

### Phase 11 — TODO/FIXME sweep (~5 мин)

```bash
# В Grep tool (НЕ Bash):
pattern: '\b(TODO|FIXME|XXX|HACK)\b'
path: app/
output_mode: content
-n: true
head_limit: 0  # unlimited per economy 0%
```

Категоризация: MVP-defer ⏸ Б-1 / Feature-defer (Plan 6+) / Production-readiness / Test infra / False-positive.

### Phase 12 — Bundle analyzer (~10 мин)

1 subagent: `cd app && BUILD_ANALYZE=1 npm run build:analyze` → парсит `storage/bundle-analyze.html` (rollup-plugin-visualizer). Raw top-15 chunks list. Сравнение с 12.05 baseline (VBtn 184 kB / KanbanView 182 kB / app 131 kB).

### Phase 13 — Vitest coverage (~5 мин)

1 subagent: `cd app && npx vitest run --coverage --coverage.reporter=text-summary --coverage.reporter=text` через `@vitest/coverage-v8`. Raw coverage tables. Сравнение с 12.05 baseline (Stmts 75% / Branch 75% / Funcs 67% / Lines 77%) + Q.DEFER.003 post-closure (Stmts 78.67% / Branch 76.21% / Funcs 70.56% / Lines 80.89%).

### Phase 14 — Pre-production readiness (новое, ~20 мин)

Main session:

- **14.1 Sentry integration:** `Grep -E "TODO\(production\)|Sentry::captureException" app/`. Status `ProcessWebhookJob.php:375` (12.05 finding) + any new TODOs.
- **14.2 DB roles deployment:** Read `db/00_create_roles.sql` + `db/02_grants.sql`, проверка structure (5 ролей `crm_*` + grants matrix), prod parity expectations.
- **14.3 Mock-data prod-gate (Q.PRODUCT.002 revisit):** проверка что решение (B) prod-fallback всё ещё актуально; считаем gzip overhead `mockDeals.ts` + `mockAdmin.ts` в production bundle (Phase 12 cross-link).
- **14.4 CI workflows audit:** `ls .github/workflows/` + Read каждого workflow. Coverage: SAST (Semgrep `sast.yml` per Q.INFO.001), tests, build, deploy.
- **14.5 Environment validation:** diff `app/.env.example` keys vs `Grep "env\(.*['\"](\w+)['\"]" app/config/`. Missing keys → P1.
- **14.6 Queue/cron:** `php artisan schedule:list` + `php artisan queue:work --once --tries=1` smoke + verify `partitions:create-months` schedule entry.
- **14.7 Backup/log rotation:** Grep `BACKUP|log-rotation|logrotate` в `docs/`, `app/config/logging.php` channels review.
- **14.8 Deployment runbook:** `Glob deploy*.md DEPLOY*.md RUNBOOK*.md` — присутствие/отсутствие documented.

Финал: push на `origin/main`.

## 5. Subagent dispatch policy (raw output mandate per economy 0%)

| Phase | Subagent? | Single-message parallel? |
|---|---|---|
| 1 (Backend/Frontend/Docs/SQL) | ×4 parallel | YES — single message с 4 `Agent` calls |
| 5 (UI smoke) | NO — MCP context inheritance broken | n/a |
| 10 (Pa11y) | NO — MCP context | n/a |
| 11 (TODO sweep) | NO — direct Grep | n/a |
| 12 (Bundle analyzer) | YES — 1 | n/a |
| 13 (Vitest coverage) | YES — 1 | n/a |
| 14 (Pre-prod) | NO — main session | n/a |

Prompts всем subagent'ам: «верни **raw** exit codes + полный output stderr+stdout, **не summary**. Решения принимаю я».

## 6. Verification gates

**После Edit/Write:**

| Файл-тип | Тест |
|---|---|
| PHP code | `composer test -- --filter=<closest>` или full Pest `--parallel` |
| Vue/TS frontend | `npx vitest run <closest-spec>` или full Vitest |
| schema/migration | Pest RLS + model smoke + `mcp__laravel-boost__database-schema` re-check |
| routes/web.php | `php artisan route:list` + Pest feature tests |
| CLAUDE.md/Pravila/PSR_v1/Tooling | `claude-md-management:claude-md-improver` skill (не direct Edit) + markdownlint + lychee |

**Перед commit:** `lefthook run pre-commit --all-files`.

**Pre-push (один раз в конце):** `lefthook run pre-push` (gitleaks-full-history + lychee strict).

## 7. Error handling и lessons-applied

Guardrails из 12.05 audit + post-audit (Pravila v1.12 + memory квирки 74-76):

- **Pravila v1.12 §4.6 audit methodology gap:** Phase 4 SAST → `ls .github/workflows/` FIRST.
- **Pravila v1.12 §4.6 UI-refactor visual smoke:** если фикс задеёт UI → Playwright visual smoke + axe-core re-check (CTO-19 lesson — unit tests jsdom insufficient для Vuetify-internal defaults).
- **Q.DEFER.004 axe-core HMR race:** `setTimeout 500ms` + hard reload перед `axe.run()`.
- **Квирк 62/73 Pest cumulative state:** для full-suite после long session — `--recreate-databases` flag обязателен.
- **Pravila v1.12 §4.7 п.4 plans relative paths:** в audit-plan/spec ссылки на `app/` через `../../../app/...` (lychee semantics; прецедент CTO-19 fixup `f6e1e64`).
- **Квирк 74:** `npm install` требует `--legacy-peer-deps` (Histoire 1.0.0-beta.1 peerDep).
- **Квирк 75:** Vuetify-internal default mdi-* names — grep также по `node_modules/vuetify/lib/iconsets/mdi*`.

## 8. Decision-tree hard-stops (per Pravila §13 + PSR_v1 R0.6)

Эти findings автоматически → BLOCKED, не FIX:

- Schema.sql semantic changes (не cosmetic).
- New packages (composer require / npm install кроме devDependencies update — даже это требует согласования).
- ТЗ-правки (`docs/CRM_bp-gr_Инструкция_v8_5.md`).
- Реестр-вопросы closing (`Б-/CTO-/DO-/Ю-/Диз-/OPEN-`) без явного «закрываем».
- Force-push на main / `--no-verify` / hook bypass / `--no-gpg-sign`.
- Production DB connection.
- ПДн / токены / API-ключи в commits (gitleaks gate).

## 9. Testing/verification план

**Baseline (фиксируем в Phase 2 как точку отсчёта):**

| Метрика | Expected (post-merge `21262ef`) |
|---|---|
| Pest `--parallel --recreate-databases` | 742 / 739 passed / 0 failed / 3 skipped |
| Pest sequential | 742 / 736 passed / 3 failed (квирк 62) / 3 skipped |
| Vitest | 88 files / 683 passed / 3 skipped |
| Vite build | ~3.5s, 0 warnings |
| Histoire build | 35 stories / 63 variants |
| ESLint | 0 errors |
| vue-tsc | 0 errors |
| Prettier --check | 0 issues |
| markdownlint | 1 (untracked design.md из прошлой сессии) |
| cspell | ≤18 (mixed-script artifacts) |
| lychee | 0 broken |
| gitleaks (full history) | 0 leaks |
| RLS policies | 39 |

**Regression gate (Phase 9):** все метрики ≥ baseline. Регрессия → rollback или fix перед push.

## 10. Out of scope

Явно НЕ делаем в этой сессии:

- pgFormatter swap schema.sql (Q.HARD.002 — закрыт «не трогать»).
- Q.DEFER.003 sub-A api/* — уже closed `95f5f94`.
- Pest квирк 62 corrective hygiene (test-DB DROP+CREATE+ICU+migrate) — отдельная задача.
- CSS code-splitting KanbanView vuedraggable / NewDealDialog / DealDetailDrawer — Phase 12 P2 defer.
- Sentry actual integration (только аудит TODO statuses, не fix).
- Б-1 saas-admin SSO middleware (BLOCKED).

## 11. Success criteria

- 14 phases completed.
- All P0 + P1 findings либо fixed (atomic commit) либо BLOCKED (явно в blocked.md с reason).
- Phase 9 regression gate passed: 0 регрессий vs baseline.
- Pre-push lefthook clean (gitleaks-full-history + lychee).
- 4 audit-docs committed.
- Memory updates если найдены новые квирки.
- Push на `origin/main` через `Bash(git push origin main:*)`.
- Verdict 🟢 / 🟡 / 🔴 в report.md с обоснованием.

## 12. Известные ограничения этой сессии

- **Не верифицировал** до старта: production environment parity (Phase 14.4-14.7) — будет в Phase 14.
- **Не верифицировал** до старта: actual coverage delta после Q.DEFER.003 closure beyond memory claim — будет в Phase 13.
- **Зависит от MCP availability:** Playwright + Boost MCP должны быть запущены (default).
- **Зависит от dev servers:** Laravel + Vite background processes для Phase 5/10.

---

*Конец design'а. После approval — invoke writing-plans skill для конкретного implementation plan.*
