feat(icons): CTO-19 closed via Lucide migration (Vuetify custom IconSet)

Closes CTO-19 ⏸ from реестр v1.79 — иконочная система портала не была
подключена (`@mdi/font` отсутствовал в `package.json`, все `mdi-*`
рендерились пустыми glyph'ами).

PATH α (aliases-only, brand-compliant) approved заказчиком 13.05.2026
через `superpowers:brainstorming` → `superpowers:writing-plans` →
`superpowers:subagent-driven-development`:

— `npm i lucide-vue-next ^1.0.0` (~25-30 KB gzip tree-shakable)
— `app/resources/js/plugins/vuetify.ts`: custom `IconSet`
  (`liderraLucideSet`) с 103-entry `lucideMap`:
  · 78 user-grep'нутых mdi-* names из resources/js/**/*.vue
  · 25 Vuetify-internal defaults (pagination chevrons, v-checkbox
    squares, v-radio circles, v-select dropdown, date picker, paperclip)
— Fallback `HelpCircle` для unmapped
— 51 Vue/TS файл с `icon="mdi-*"` НЕ touched — semantic-ID via Lucide

CLAUDE.md §2 «Иконки: Lucide» бренд-spec compliance achieved.

VERIFICATION (comprehensive, 13.05.2026 day +1):
— vue-tsc 0 errors
— Pest --parallel --recreate-databases: **742/739/0/3**
— Vitest: 88 files / 683 passed / 3 skipped (baseline match)
— Vite build: exit 0, 3.52s
— Visual smoke 8 views via Playwright MCP — все glyph'ы рендерятся
— axe-core a11y scan /admin/billing: **0 iconography violations**
— Pagination + v-checkbox + v-radio fixes (Task 2.b extension)

РЕЕСТР v1.82 → v1.83:
— CTO-19 §3: ⏸ →  (Pravila §2.2 / §7.1 — явное «закрываем» получено)
— Сводка §0 CTO: 17/1⏸/1 P2 [?] → 18 /0⏸/0
— Сводка §0 Итого: 70/12⏸ → 71 /11 ⏸
— Header v1.82 → v1.83 + новый changelog block
— Footer v1.83 (match header)

CLAUDE.md §0 row sync v1.82 → v1.83 — прямой Edit per «registry version
sync» rationale, не content authoring (CLAUDE.md §5 п.10).

cspell-words.txt +1: «grep'нутых» (Russian-tech jargon).

Path (i) `npm i @mdi/font` REJECTED (250 KB CSS, против бренда).
Path β rename all strings REJECTED (большой diff 51 файл).

Spec: docs/superpowers/specs/2026-05-13-cto-19-lucide-icon-migration-design.md
Plan: docs/superpowers/plans/2026-05-13-cto-19-lucide-icon-migration.md

Quirk 64: app/dev-indices.json attached per Vite watcher auto-regen.
Memory updates — git-untracked, отдельный шаг.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-05-13 05:16:31 +03:00
parent 1f5aa0b103
commit 0832997b6e
7 changed files with 194 additions and 9 deletions
+1 -1
View File
@@ -17,7 +17,7 @@
| Полный реестр 33 формализованных позиций тулчейна (29 active + 3 off-phase + 1 historic) | [docs/Tooling_v8_3.md](docs/Tooling_v8_3.md) (**Прил. Н v1.16 от 12.05.2026** — §9.2 «Motion runtime библиотеки» переформулирован из regulatory denylist в technical guidance синхронно с PSR_v1 v2.0 (R15 снят): motion-v/gsap/anime.js/lottie-web/popmotion/@motionone/dom — ✅ разрешено без обоснования; framer-motion + react-spring — ❌ technical block (React-only peerDep), не regulatory rule. Cross-refs шапки sync: PSR_v1 v1.7+ → v2.0+, CLAUDE.md v1.86+ → v1.88+, Pravila v1.10+ → v1.11+; v1.15 наследие — sync cross-refs + «28 инструментов» → «33 формализованные позиции») |
| Главное ТЗ | [docs/CRM_bp-gr_Инструкция_v8_5.md](docs/CRM_bp-gr_Инструкция_v8_5.md) (v8.5 от 07.05.2026 — реализация 27 решений аудита C; in-place hygiene v1.20 от 08.05.2026 поздний вечер: §2.4/§5.5/§5.6/§6.5/§11/§20.12.3/§21.1/§27.1 синхронизированы под schema v8.6 двустадийный dedup) |
| Схема БД | [db/schema.sql](db/schema.sql) (**v8.19 от 11.05.2026** — Plan 4 (Billing+CSV+Admin): +1 таблица `supplier_csv_reconcile_log` SaaS-level, +3 колонки `tenants.delivered_in_month` / `lead_charges.charge_source` / `supplier_leads.recovered_from_csv_at`, +3 индекса, +2 CHECK. **Schema baseline (commit-факт):** 62 базовые таблицы + 12 партиций + 117 индексов + 39 RLS-политик + 5 функций (`audit_block_mutation`, `audit_chain_hash`, `calc_lead_score`, `report_jobs_log_export`, `set_pd_subject_request_deadline`) + 13 триггеров. **Dev `liderra` factual** после `migrate:fresh` + накопленных `partitions:create-months`: **75 root tables + 102 partition children + 289 indexes + 39 RLS + 5 user funcs + 19 triggers + 0 dev roles** (на prod 5 ролей через `db/00_create_roles.sql`). Verified 2026-05-12 audit Phase 3.) |
| Открытые вопросы | [docs/Открытые_вопросы_v8_3.md](docs/Открытые_вопросы_v8_3.md) (**v1.82 от 13.05.2026 (day) — Catch-up bump** v1.77 → v1.82 после hidden inconsistency: header заявлял v1.77, footer накопил v1.78/v1.79/v1.80/v1.81. Содержит v1.78 Plan 4 +7 Биз-25..31 ⏸ (section ## 14), v1.79 CTO-19 ⏸ иконочная система, v1.80 CTO-20 ⏸ ICU collation, v1.81 CTO-20 ✅ closed, v1.82 — post-Plan-4 context (Plan 5 frontend / Quiet Luxury / Q.DEFER closures audit-internal / R15 merge — не Q-items). **Сводка §0 после v1.82: 87 продуктовых / 70 ✅ / 5 🟦 / 12 ⏸ / 1 P0 + 5 P1 + 3 P2 + 2 P3 + 1 P2 [?]**. **Регрессия: Pest --parallel 742/739/0/3 / Vitest 88 files / 683 passed + 3 skipped / Vite build 2.67s / lychee 248 OK / gitleaks 0 (367 commits)**. v1.77 baseline — Sprint 4 «Audit tail» (Pest 421 / Vitest 416). Section ## 13 collision fixed: Plan 4 → ## 14, Аудит C сохраняется ## 13) |
| Открытые вопросы | [docs/Открытые_вопросы_v8_3.md](docs/Открытые_вопросы_v8_3.md) (**v1.83 от 13.05.2026 (day +1) — CTO-19 ✅ closed** через Lucide migration: `npm i lucide-vue-next ^1.0.0` + custom Vuetify `IconSet` в `app/resources/js/plugins/vuetify.ts` с 103-entry mapping (78 user-grep'нутых mdi-* + 25 Vuetify-internal defaults). 51 view untouched. CLAUDE.md §2 «Иконки: Lucide» бренд-spec compliance achieved. **Сводка §0 после v1.83: 87 продуктовых / 71 ✅ / 5 🟦 / 11 ⏸ / 1 P0 + 5 P1 + 3 P2 + 2 P3**. **Регрессия: Pest --parallel 742/739/0/3 / Vitest 88 files / 683 passed + 3 skipped / Vite build 3.52s / axe-core /admin/billing 0 iconography violations**. Spec/plan в docs/superpowers/. v1.82 — Catch-up bump v1.77 → v1.82. v1.77 — Sprint 4 «Audit tail» (Pest 421 / Vitest 416). Section ## 13 collision fixed: Plan 4 → ## 14, Аудит C ## 13) |
| **Брендбук** | [liderra_v8_handoff/docs/BRANDBOOK_v2.md](liderra_v8_handoff/docs/BRANDBOOK_v2.md) **(v2 Forest от 07.05.2026)** — старый `docs/brandbook.md` v1.1 удалён 08.05.2026 |
| **Дизайн-handoff (токены, компоненты, 25 экранов)** | [liderra_v8_handoff/docs/DEVELOPER_HANDOFF.md](liderra_v8_handoff/docs/DEVELOPER_HANDOFF.md) (v8 Forest от 07.05.2026) — **только дизайн/токены/компоненты**; функционал и состав экранов — по ТЗ v8.5 |
| Анализ оригинала | [docs/Analiz_originala_v8_3.md](docs/Analiz_originala_v8_3.md) (Прил. М v1.1) |
+17 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "./dev-indices.schema.json",
"version": 1,
"lastId": 1618,
"lastId": 1619,
"entries": {
"1": {
"file": "resources/js/components/AppShell.vue",
@@ -25249,6 +25249,22 @@
"key": null,
"ref": null,
"createdAt": "2026-05-12T19:01:41.778Z"
},
"1619": {
"file": "resources/js/components/deals/DealsTable.vue",
"line": 127,
"tag": "v-checkbox-btn",
"parentChain": [
"DealsTable",
"v-card",
"v-data-table",
"template"
],
"signature": "resources/js/components/deals/DealsTable::DealsTable>v-card>v-data-table>template::v-checkbox-btn[]::::0",
"text": null,
"key": null,
"ref": null,
"createdAt": "2026-05-13T02:09:00.166Z"
}
},
"deleted": {}
+12
View File
@@ -4,6 +4,9 @@
"requires": true,
"packages": {
"": {
"dependencies": {
"lucide-vue-next": "^1.0.0"
},
"devDependencies": {
"@eslint/js": "^10.0.1",
"@histoire/plugin-vue": "^1.0.0-beta.1",
@@ -6967,6 +6970,15 @@
"node": "20 || >=22"
}
},
"node_modules/lucide-vue-next": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-1.0.0.tgz",
"integrity": "sha512-V6SPvx1IHTj/UY+FrIYWV5faISsPSb8BnWSFDxAtezWKvWc9ZZ40PDrdu1/Qb5vg4lHWr1hs1BAMGVGm6V1Xdg==",
"license": "ISC",
"peerDependencies": {
"vue": ">=3.0.1"
}
},
"node_modules/magic-string": {
"version": "0.30.21",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+3
View File
@@ -46,5 +46,8 @@
"vue-tsc": "^3.2.8",
"vuedraggable": "^4.1.0",
"vuetify": "^3.12.5"
},
"dependencies": {
"lucide-vue-next": "^1.0.0"
}
}
+144 -1
View File
@@ -1,7 +1,22 @@
// @ts-expect-error vuetify/styles — CSS-импорт без d.ts
import 'vuetify/styles';
import { h, type Component } from 'vue';
import { createVuetify } from 'vuetify';
import type { ThemeDefinition } from 'vuetify';
import type { ThemeDefinition, IconSet, IconProps } from 'vuetify';
import {
Activity, AlertCircle, AlertTriangle, Archive, ArrowDown, ArrowLeft, ArrowRightLeft,
ArrowUp, Bell, BellOff, Calendar, CalendarDays, Camera, Check, CheckCircle, ChevronDown,
ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, ChevronsUpDown, ChevronUp,
Circle, CircleDot, CircleStop, Clock, Code,
Columns3, Copy, CreditCard, Download, Eye, EyeOff, FilterX, FileText, FlaskConical,
Folder, Folders, Globe, HelpCircle, Info, Key, KeyRound, LayoutDashboard, List, LogOut, Mail,
Megaphone, Menu, MessageSquare, MessageSquareText, Minus, MoreVertical, Paperclip, Pause,
Pencil, Phone, Play, Plus,
PlusCircle, Puzzle, ReceiptText, RefreshCw, RotateCcw, RotateCw, RussianRuble, Save, Search,
Settings, Shield, ShieldCheck, ShieldOff, Square, SquareCheck, SquareMinus, Star, StarHalf,
Tag, Trash2, User, UserCheck, UserCog, UserPlus,
Users, Wallet, Webhook, X, XCircle,
} from 'lucide-vue-next';
/**
* Палитра Forest extended (Iteration 1 — Quiet Luxury redesign).
@@ -32,11 +47,139 @@ const liderraForest: ThemeDefinition = {
},
};
/**
* Liderra Lucide IconSet (CTO-19 closure, v1.83).
* Spec: docs/superpowers/specs/2026-05-13-cto-19-lucide-icon-migration-design.md
*
* Maps 78 mdi-* semantic-ID strings (used across 51 Vue/TS files in resources/js/)
* to Lucide Vue components for rendering. Views НЕ touched — mdi-* строки остаются
* как semantic identifiers, рендерятся через Lucide stroke-based SVG icons.
*
* CLAUDE.md §2 «Иконки: Lucide» — бренд-spec compliance.
*/
const lucideMap: Record<string, Component> = {
'mdi-account-arrow-right-outline': UserCheck,
'mdi-account-group-outline': Users,
'mdi-account-outline': User,
'mdi-account-plus-outline': UserPlus,
'mdi-account-switch': UserCog,
'mdi-alert-circle': AlertCircle,
'mdi-alert-circle-outline': AlertCircle,
'mdi-alert-outline': AlertTriangle,
'mdi-api': Webhook,
'mdi-archive': Archive,
'mdi-arrow-down': ArrowDown,
'mdi-arrow-left': ArrowLeft,
'mdi-arrow-up': ArrowUp,
'mdi-autorenew': RotateCw,
'mdi-bell-off-outline': BellOff,
'mdi-bell-outline': Bell,
'mdi-bullhorn-outline': Megaphone,
'mdi-camera': Camera,
'mdi-cash-plus': PlusCircle,
'mdi-chart-box-outline': LayoutDashboard,
'mdi-check': Check,
'mdi-check-circle': CheckCircle,
'mdi-check-circle-outline': CheckCircle,
'mdi-chevron-right': ChevronRight,
'mdi-clock-check-outline': Clock,
'mdi-clock-outline': Clock,
'mdi-close': X,
'mdi-close-circle': XCircle,
'mdi-cog-outline': Settings,
'mdi-comment-outline': MessageSquare,
'mdi-content-copy': Copy,
'mdi-content-save-outline': Save,
'mdi-credit-card-outline': CreditCard,
'mdi-currency-rub': RussianRuble,
'mdi-delete-outline': Trash2,
'mdi-dots-vertical': MoreVertical,
'mdi-download': Download,
'mdi-email-outline': Mail,
'mdi-eye': Eye,
'mdi-eye-off': EyeOff,
'mdi-eye-outline': Eye,
'mdi-file-pdf-box': FileText,
'mdi-filter-off': FilterX,
'mdi-folder-multiple-outline': Folders,
'mdi-folder-outline': Folder,
'mdi-format-list-bulleted': List,
'mdi-key': Key,
'mdi-lock-reset': KeyRound,
'mdi-logout': LogOut,
'mdi-magnify': Search,
'mdi-message-text': MessageSquareText,
'mdi-pause': Pause,
'mdi-pencil': Pencil,
'mdi-pencil-outline': Pencil,
'mdi-phone': Phone,
'mdi-play': Play,
'mdi-plus': Plus,
'mdi-plus-circle-outline': PlusCircle,
'mdi-progress-clock': Clock,
'mdi-pulse': Activity,
'mdi-puzzle-outline': Puzzle,
'mdi-receipt-text-check-outline': ReceiptText,
'mdi-refresh': RefreshCw,
'mdi-restore': RotateCcw,
'mdi-shield-account-outline': ShieldCheck,
'mdi-shield-key': Shield,
'mdi-shield-lock-outline': ShieldCheck,
'mdi-shield-off': ShieldOff,
'mdi-stop-circle-outline': CircleStop,
'mdi-swap-horizontal': ArrowRightLeft,
'mdi-tag-arrow-right': Tag,
'mdi-test-tube': FlaskConical,
'mdi-trash-can-outline': Trash2,
'mdi-view-column-outline': Columns3,
'mdi-view-dashboard-outline': LayoutDashboard,
'mdi-wallet-outline': Wallet,
'mdi-web': Globe,
'mdi-xml': Code,
// Vuetify-internal default mdi-* aliases (CTO-19 closure extension)
'mdi-chevron-down': ChevronDown,
'mdi-chevron-left': ChevronLeft,
'mdi-menu-down': ChevronDown,
'mdi-menu-right': ChevronRight,
'mdi-menu-up': ChevronUp,
'mdi-menu': Menu,
'mdi-page-first': ChevronsLeft,
'mdi-page-last': ChevronsRight,
'mdi-checkbox-marked': SquareCheck,
'mdi-checkbox-blank-outline': Square,
'mdi-minus-box': SquareMinus,
'mdi-radiobox-marked': CircleDot,
'mdi-radiobox-blank': Circle,
'mdi-circle': Circle,
'mdi-information': Info,
'mdi-minus': Minus,
'mdi-calendar': Calendar,
'mdi-calendar-month': CalendarDays,
'mdi-paperclip': Paperclip,
'mdi-unfold-more-horizontal': ChevronsUpDown,
'mdi-window-close': X,
'mdi-cached': RefreshCw,
'mdi-star': Star,
'mdi-star-outline': Star,
'mdi-star-half-full': StarHalf,
};
const liderraLucideSet: IconSet = {
component: (props: IconProps) => {
const Icon = lucideMap[String(props.icon)] || HelpCircle;
return h(Icon, { size: 20, strokeWidth: 1.75 });
},
};
export const vuetify = createVuetify({
theme: {
defaultTheme: 'liderraForest',
themes: { liderraForest },
},
icons: {
defaultSet: 'liderra',
sets: { liderra: liderraLucideSet },
},
defaults: {
VBtn: {
variant: 'flat',
+1
View File
@@ -1074,6 +1074,7 @@ vuetifyjs
форкнулась
tabler
roh
grep'нутых
# Фамилии лидов из примеров (с диакритикой как в исходниках)
Бузо́ва
+16 -6
View File
@@ -2,7 +2,17 @@
**Назначение:** единый рабочий список вопросов, требующих решения заказчика для разблокировки разработки. Разбит по адресатам, внутри — по приоритету.
**Версия:** 1.82 от 13.05.2026 (day)**Catch-up bump v1.77 → v1.82** после обнаружения hidden inconsistency (header заявлял v1.77, но footer-trail накопил v1.78/v1.79/v1.80/v1.81 без обновления шапки + post-Plan-4 work на 12.0513.05.2026 не отражена в реестре). Catch-up закрывает: **v1.78** Plan 4 (Billing + CSV Reconcile + Admin) closure → +7 Биз-25..31 ⏸ (section ## 13 collision с Аудит C resolved → Plan 4 теперь ## 14); **v1.79** CTO-19 ⏸ open (иконочная система `@mdi/font` не подключена); **v1.80** CTO-20 ⏸ open (cyrillic case-insensitive search broken); **v1.81** CTO-20 ✅ closed (ICU collation fix на dev `liderra`). Plus post-Plan-4 context (12.0513.05): Plan 5 frontend Tasks 7-11 delivered (schema v8.20: `projects.archived_at` + `tenants.limits`), Quiet Luxury portal redesign 20 commits Direction A, Portal full audit 2026-05-12 ночь (14 audit + Q.DEFER.002 sub-B / Q.DEFER.003 sub-A+B+C / Q.DEFER.004 sub-A+B closures, 10/10 audit-internal closed — tracked в `docs/superpowers/audits/2026-05-12-portal-full-audit-blocked.md`), audit-cleanup tail (5 commits `54c69a6..d1b2f5d`), R15 motion-runtime cleanup merge `323957a` (plan5 ← origin/main; PSR_v1 v1.7 → v2.0, Pravila v1.10 → v1.11, Tooling v1.15 → v1.16, CLAUDE.md v1.89 → v1.90; framer-motion: regulatory hard-ban → technical block React-only peerDep). **Регрессия зелёная (на 13.05.2026 day): Pest --parallel 742/739/0/3 ✅ (после `--recreate-databases`), Vitest 88 files / 683 passed + 3 skipped, Vite build 2.67s, lychee 248 OK / 0 errors, gitleaks 0 leaks (367 commits)**. **Сводка §0 counters updated**: 78 → 87 продуктовых / 69 → 70 ✅ / 4 → 12 ⏸ / 1 P0 / 3 → 5 P1 / 0 → 3 P2 / +2 P3 (Биз-29/30). Pravila §2.2 строго соблюдена: ни один новый Q-item не закрыт без явного «закрываем» заказчика (Биз-25..31 + CTO-19 остаются ⏸; Plan 5 / Quiet Luxury / audit / R15 — feature delivery / audit-internal / regulatory, не Q-items registry). Предыдущая v1.81 — см. footer; v1.77 — Sprint 4 Audit tail (см. ниже).
**Версия:** 1.83 от 13.05.2026 (day +1) — **CTO-19 ✅ closed** через Lucide migration: `npm i lucide-vue-next` + custom Vuetify `IconSet` (`liderraLucideSet`) в `app/resources/js/plugins/vuetify.ts` с **103-entry mapping** (78 user-grep'нутых mdi-* + 25 Vuetify-internal defaults: pagination chevrons, v-select dropdown, v-checkbox squares, v-radio circles). 51 Vue/TS файл untouched. Fallback `HelpCircle` для unmapped. CLAUDE.md §2 «Иконки: Lucide» — бренд-spec compliance achieved. **Verification (13.05.2026 day +1):** Pest --parallel 742/739/0/3 ✅, Vitest 88 files / 683 passed + 3 skipped, Vite build 3.52s, axe-core scan `/admin/billing` **0 iconography violations**. Visual smoke 8 views (`/dashboard`, `/projects`, `/settings`, `/admin/billing`, `/no-such-404`, `/kanban`, `/deals`, `/admin/tenants`) — все glyph'ы рендерятся. **Сводка §0 update:** CTO 17✅/1⏸/1 P2 [?] → 18✅/0⏸/0; Итого 70✅/12⏸ → 71✅/11⏸ (без P2 [?] CTO-19). Spec/plan в [docs/superpowers/specs/2026-05-13-cto-19-lucide-icon-migration-design.md](superpowers/specs/2026-05-13-cto-19-lucide-icon-migration-design.md) + [docs/superpowers/plans/2026-05-13-cto-19-lucide-icon-migration.md](superpowers/plans/2026-05-13-cto-19-lucide-icon-migration.md). Через `superpowers:brainstorming``superpowers:writing-plans``superpowers:subagent-driven-development` (Task 1 install + Task 2 IconSet + Task 2.b extension через subagents; visual smoke + closure controller-driven). Path α (aliases-only, approved заказчиком). Path (i) `npm i @mdi/font` REJECTED (250 KB CSS, против бренда). Path β rename all strings REJECTED (большой diff 51 файл). Pravila §2.2 / §7.1 — явное «закрываем CTO-19 как ✅» получено от заказчика после comprehensive verification (pagination + 7+ views + axe-core a11y). Предыдущая v1.82**Catch-up bump v1.77 → v1.82** после обнаружения hidden inconsistency (header заявлял v1.77, но footer-trail накопил v1.78/v1.79/v1.80/v1.81 без обновления шапки + post-Plan-4 work на 12.0513.05.2026 не отражена в реестре). Catch-up закрывает: **v1.78** Plan 4 (Billing + CSV Reconcile + Admin) closure → +7 Биз-25..31 ⏸ (section ## 13 collision с Аудит C resolved → Plan 4 теперь ## 14); **v1.79** CTO-19 ⏸ open (иконочная система `@mdi/font` не подключена); **v1.80** CTO-20 ⏸ open (cyrillic case-insensitive search broken); **v1.81** CTO-20 ✅ closed (ICU collation fix на dev `liderra`). Plus post-Plan-4 context (12.0513.05): Plan 5 frontend Tasks 7-11 delivered (schema v8.20: `projects.archived_at` + `tenants.limits`), Quiet Luxury portal redesign 20 commits Direction A, Portal full audit 2026-05-12 ночь (14 audit + Q.DEFER.002 sub-B / Q.DEFER.003 sub-A+B+C / Q.DEFER.004 sub-A+B closures, 10/10 audit-internal closed — tracked в `docs/superpowers/audits/2026-05-12-portal-full-audit-blocked.md`), audit-cleanup tail (5 commits `54c69a6..d1b2f5d`), R15 motion-runtime cleanup merge `323957a` (plan5 ← origin/main; PSR_v1 v1.7 → v2.0, Pravila v1.10 → v1.11, Tooling v1.15 → v1.16, CLAUDE.md v1.89 → v1.90; framer-motion: regulatory hard-ban → technical block React-only peerDep). **Регрессия зелёная (на 13.05.2026 day): Pest --parallel 742/739/0/3 ✅ (после `--recreate-databases`), Vitest 88 files / 683 passed + 3 skipped, Vite build 2.67s, lychee 248 OK / 0 errors, gitleaks 0 leaks (367 commits)**. **Сводка §0 counters updated**: 78 → 87 продуктовых / 69 → 70 ✅ / 4 → 12 ⏸ / 1 P0 / 3 → 5 P1 / 0 → 3 P2 / +2 P3 (Биз-29/30). Pravila §2.2 строго соблюдена: ни один новый Q-item не закрыт без явного «закрываем» заказчика (Биз-25..31 + CTO-19 остаются ⏸; Plan 5 / Quiet Luxury / audit / R15 — feature delivery / audit-internal / regulatory, не Q-items registry). Предыдущая v1.81 — см. footer; v1.77 — Sprint 4 Audit tail (см. ниже).
**Что изменилось в v1.83 относительно v1.82:**
- **CTO-19 ⏸ → ✅ closed** через Lucide migration. Custom Vuetify `IconSet` (`liderraLucideSet`) в `app/resources/js/plugins/vuetify.ts` с 103-entry mapping (78 user-grep'нутых mdi-* + 25 Vuetify-internal defaults). 51 Vue/TS файл с `icon="mdi-*"` invariant. `npm i lucide-vue-next ^1.0.0` selective tree-shakable imports. Path α (aliases-only) approved заказчиком через brainstorming → writing-plans → subagent-driven-development workflow.
- **Сводка §0 counter update**: CTO 17✅/1⏸/1 P2 [?] → **18 ✅** / 0 ⏸ / 0 P2 [?] (CTO-19 priority TBD убрано); Итого 70✅/12⏸ → **71 ✅** / **11 ⏸** (CTO-19 closed).
- **Регрессия зелёная**: Pest --parallel 742/739/0/3 ✅ (после `--recreate-databases`), Vitest 88 files / 683 passed + 3 skipped, Vite build 3.52s exit 0, axe-core a11y scan `/admin/billing` 0 iconography violations.
- **Visual smoke 8 views** (5 plan-mandated + 3 additional): `/dashboard`, `/projects`, `/settings`, `/admin/billing`, `/no-such-404`, `/kanban`, `/deals`, `/admin/tenants` — все glyph'ы рендерятся правильно (Bell, Search, ChevronLeft/Right, ChevronsLeft/Right, ChevronDown, Square, SquareCheck, CircleDot, CreditCard, AlertTriangle, Users, UserCheck, Settings, RefreshCw, LayoutDashboard, ArrowLeft, Camera, ShieldCheck, Folder, Webhook, Puzzle, Clock, etc.). 0 «?» fallback icons.
- **Brand alignment**: CLAUDE.md §2 «Иконки: Lucide» — теперь visually реализован (был declaratory в spec'е до v1.83).
---
**Что изменилось в v1.82 относительно v1.77 — детально по trail:**
@@ -2205,7 +2215,7 @@
|---------|-------|------------|---------------|---------|----|----|-----|
| Юрист | 9 | 4 (Ю-1, Ю-6, Ю-7, Ю-9 v1.12) | 5 (Ю-2-доп, Ю-3-юр, Ю-4, Ю-5, Ю-8) | 0 | 0 | 0 | 0 |
| Бухгалтер / финансы | 6 | 5 (Б-2..6) | 0 | 1 (Б-1) | **1** | 0 | 0 |
| CTO / архитектор | **18** | **17** (CTO-1..16 + CTO-20 v1.81 ICU collation) | 0 | **1** (CTO-19 v1.79 ⏸ иконочная система `@mdi/font`) | 0 | 0 | 1 [?] |
| CTO / архитектор | **18** | **18** (CTO-1..16 + CTO-19 v1.83 Lucide migration + CTO-20 v1.81 ICU collation) | 0 | 0 | 0 | 0 | 0 |
| Бизнес / продакт | **24** | 17 (6 + Биз-3/4/8 авто + Биз-10..16 v1.10 + Биз-17..24 v1.12) | 0 | **7** (Биз-25..31 v1.78 Plan 4 deferred placeholders, см. §14) | 0 | **2** (Биз-25, Биз-28) | **3** (Биз-26, Биз-27, Биз-31) |
| Дизайнер / маркетинг | 4 | 3 (Диз-1 закрыт 08.05 handoff'ом, Диз-2, Диз-4) | 0 | 1 (Диз-3 ждёт Б-1) | 0 | 1 | 0 |
| DevOps / эксплуатация | 5 | 3 (DO-1, DO-3, DO-5) | 0 | 2 (DO-2, DO-4 ждут Б-1) | 0 | 2 | 0 |
@@ -2214,11 +2224,11 @@
| **Аудит партий 12–15** | **3** | **3** (Биз-14..16 закрыты v1.10) | 0 | 0 | 0 | 0 | 0 |
| **Аудит C — арх+sec (v1.12)** | **14** | **14** (OPEN-И-13..26 закрыты v1.12) | 0 | 0 | 0 | 0 | 0 |
| **Plan 4 (Billing+CSV+Admin, v1.78)** | **7** | 0 | 0 | **7** (Биз-25..31 ⏸ deferred placeholders, см. §14) | 0 | 2 | 3 |
| **Итого продуктовых** | **87** | **70** | **5 🟦** | **12** | **1 P0** | **5 P1** | **3 P2** + 2 P3 (Биз-29, Биз-30) + 1 P2 [?] (CTO-19, priority TBD) |
| **Итого продуктовых** | **87** | **71** | **5 🟦** | **11** | **1 P0** | **5 P1** | **3 P2** + 2 P3 (Биз-29, Биз-30) |
Плюс 65 OPEN-вопросов в приложениях Д/Ж/З/И — большинство ждут юридической редактуры (см. раздел 8). *В v1.10 закрыт OPEN-И-12 (контакты эскалации) → 66 → 65.*
**Истинные P0-блокеры на 13.05.2026 (после v1.82):**
**Истинные P0-блокеры на 13.05.2026 (после v1.83):**
- **Б-1** (реквизиты юр. лица) — единственный продуктовый P0 от заказчика. От него зависят Диз-3, DO-2, DO-4. **Все 8 P0 аудита C закрыты в v1.12** (см. §13.10), триггер фазы 1 (`composer create-project laravel/laravel app`) разблокирован архитектурно. Plan 4 +7 Биз-25..31 — все ⏸ deferred placeholders за дефолтами в коде, не блокеры старта, но **требуются до production** (по spec §7.6 + §14).
@@ -2282,7 +2292,7 @@
| ✅ **CTO-12** | **Pest 4** (не PHPUnit). Обоснование: datasets лаконично покрывают 14 статусов воронки и 34 RLS-политики; architecture testing закрепляет правила («integration тесты не должны мокировать БД» — линт вместо памяти); родной для Laravel/Boost (один guideline вместо разрыва); Pest 4 backward-compat с Pest 3 syntax + бонус: browser testing без Dusk, stress, mutation v2 | Закрыт 08.05 (Pest 3), переоткрыт+закрыт 08.05 поздний вечер (Pest 4 — проверка на live-стеке). Импакт: [Tooling_v8_3.md §3.3](Tooling_v8_3.md), [CLAUDE.md §3.2](../CLAUDE.md). composer.json в app/: `pestphp/pest: ^4.7`. На `boost:install` отключить guideline PHPUnit, оставить Pest |
| ⏸ **CTO-18** | **auth+tenant middleware на `/api/deals` на pre-prod миграции.** На MVP `/api/deals` использует `tenant_id` query-param для tenant-resolution (`app/routes/web.php:103-110`). Sprint 1 Phase B (`56195c8`) применил `tenant` middleware к `/api/notifications`, `/api/reminders`, `/api/reports/jobs` (auth:sanctum-группы). `/api/deals` остаётся без auth для MVP-flow. На prod-миграции **обязательно** перейти на `auth:sanctum + tenant` middleware с резолюцией через subdomain или header `X-Tenant-Id`. Trigger закрытия: prod-миграция (после Б-1, регистрации ООО). Связанная находка: [docs/audit_2026-05-09.md](audit_2026-05-09.md) P1-10 | Открыт 09.05.2026 |
| ✅ **CTO-20** | **Регистронезависимый поиск кириллицей — починен на уровне БД.** Корень: dev-БД `liderra` была создана с `datcollate='C'` / `datctype='C'` — Postgres `lower()/upper()` не делает case-folding для кириллицы. Закрытие 12.05.2026: dev-БД пересоздана с `LOCALE_PROVIDER icu ICU_LOCALE 'und'` (PG 16+ feature, кросс-платформенно). Backup `app/.backups/liderra_pre_icu_2026-05-12.dump` (pg_dump custom format, 394KB). Восстановление через `php artisan migrate:fresh && php artisan db:seed --class=DemoSeeder`. После: `lower('СПб')='спб'`, `'Окна СПб' ILIKE '%сп%'` → true. **Точечный workaround в `ProjectController::index` откатан** в той же сессии — больше не нужен. Все 5 endpoint'ов с `ILIKE` (`AdminBillingController`, `AdminTenantsController`, `DealController`, `ProjectController`, `ProjectService`) теперь работают с кириллицей без правки кода. **Регрессионный тест** в [ProjectsListShowTest.php:116-141](../app/tests/Feature/Plan5/Projects/ProjectsListShowTest.php#L116-L141) (10/10 / 37 assertions). **Для prod-deploy:** при создании Managed PG БД использовать ту же команду — `CREATE DATABASE liderra WITH OWNER postgres ENCODING 'UTF8' LOCALE_PROVIDER icu ICU_LOCALE 'und' LC_COLLATE 'C' LC_CTYPE 'C' TEMPLATE template0;` (см. `db/00_create_roles.sql` для обновления). | Закрыт 12.05.2026 |
| **CTO-19** | **Иконочная система портала не подключена — все `mdi-*` рендерятся пустыми.** Vuetify-конфиг создаёт `<i class="mdi-...">` (по умолчанию MDI), но CSS-пакет `@mdi/font` в `package.json` отсутствует — `document.fonts` не содержит `Material Design Icons`, `::before content: none`. Затронуты все места с `prepend-icon`/`append-icon`/`icon`/`clearable` в Vue-views: «+ Создать проект» (mdi-plus), поле поиска (mdi-magnify), clearable v-select/v-text-field (mdi-close-circle), notification bell, dropdown chevron'ы. Бренд предписывает **Lucide** (см. CLAUDE.md §2: «Иконки: Lucide»). Решение: либо `npm i @mdi/font` + `import '@mdi/font/css/materialdesignicons.css'` в `main.ts` (быстрый workaround), либо переключить Vuetify-config на `aliases` с Lucide-компонентами и заменить все `mdi-*` строки на Lucide-имена (бренд-соответствующая правка). Локальный workaround клиентский для clearable-крестика в `ProjectsView.vue` (`::after content '✕'`) применён 12.05.2026, не закрывает общую проблему. | Открыт 12.05.2026 |
| **CTO-19** | **Иконочная система — Lucide migration через Vuetify custom IconSet (закрыто 13.05.2026 day +1).** В `app/resources/js/plugins/vuetify.ts` добавлен custom `IconSet` (`liderraLucideSet`) с **103-entry mapping `mdi-*` → Lucide components** (78 user-grep'нутых + 25 Vuetify-internal defaults: pagination chevrons, v-select dropdown arrows, v-checkbox squares, v-radio circles). Все 51 Vue/TS файл с `icon="mdi-*"` остаются untouched — mdi-имена работают как semantic-ID для Lucide рендеринга. `npm i lucide-vue-next ^1.0.0` selective tree-shakable imports. Fallback `HelpCircle` для unmapped. CLAUDE.md §2 «Иконки: Lucide» — бренд-spec compliance achieved. **Verification (13.05.2026 day +1):** Pest --parallel 742/739/0/3 ✅, Vitest 88 files / 683 passed + 3 skipped, Vite build 3.52s, axe-core a11y scan на `/admin/billing` 0 iconography violations. Visual smoke на 8 views: `/dashboard`, `/projects`, `/settings`, `/admin/billing`, `/no-such-404`, `/kanban`, `/deals`, `/admin/tenants` — все glyph'ы рендерятся (Bell, Search, ChevronLeft/Right, ChevronsLeft/Right, CreditCard, AlertTriangle, Users, UserCheck, Settings, RefreshCw, LayoutDashboard, ArrowLeft, Camera, ShieldCheck, Folder, Webhook, Puzzle, Clock, Square, etc.). **Spec:** docs/superpowers/specs/2026-05-13-cto-19-lucide-icon-migration-design.md. **Plan:** docs/superpowers/plans/2026-05-13-cto-19-lucide-icon-migration.md. **Через:** `superpowers:brainstorming` `superpowers:writing-plans``superpowers:subagent-driven-development` (subagent для Task 1 install + Task 2 IconSet + Task 2.b extension; controller для visual smoke + closure). **Прежний контент:** Vuetify-конфиг создавал `<i class="mdi-...">` (default MDI), но CSS-пакет `@mdi/font` в `package.json` отсутствовал → `document.fonts` не содержит `Material Design Icons`, `::before content: none`. Затронуты все места с `prepend-icon`/`append-icon`/`icon`/`clearable` в Vue-views. Локальный workaround клиентский для clearable-крестика в `ProjectsView.vue` (`::after content '✕'`) применён 12.05.2026 — может быть убран в отдельной post-CTO-19 hygiene-task. | Закрыт 13.05.2026 |
---
@@ -2821,4 +2831,4 @@ reminders {
---
*Версия: 1.82 от 13.05.2026 (day) — Catch-up bump v1.77 → v1.82 после обнаружения hidden inconsistency (header заявлял v1.77, footer-trail накопил v1.78/v1.79/v1.80/v1.81 без обновления шапки). Section ## 13 collision fix → Plan 4 теперь ## 14 (Аудит C сохраняется ## 13). Сводка §0 counters updated: 78 → 87 продуктовых / 69 → 70 ✅ / 4 → 12 ⏸ / 1 P0 / 3 → 5 P1 / 0 → 3 P2 + 2 P3 (Биз-29/30) + 1 P2 [?] (CTO-19 priority TBD). Post-Plan-4 context (12.0513.05.2026) — Plan 5 frontend Tasks 7-11 delivered, Quiet Luxury portal redesign 20 commits, Portal full audit 2026-05-12 ночь (10/10 audit-internal Q.DEFER closed в blocked.md, не Q-items registry), audit-cleanup tail 5 commits, R15 motion-runtime cleanup merge `323957a` (plan5 ← origin/main; PSR_v1 v1.7 → v2.0, Pravila v1.10 → v1.11, Tooling v1.15 → v1.16, CLAUDE.md v1.89 → v1.90). framer-motion переведён из regulatory hard-ban в technical block (React-only peerDep). Pravila §2.2 строго: ни один Q-item не закрыт без явного «закрываем» — Биз-25..31 + CTO-19 остаются ⏸. Регрессия зелёная: Pest --parallel 742/739/0/3 ✅ (после --recreate-databases), Vitest 88 files / 683 passed + 3 skipped, Vite build 2.67s 0 warnings, lychee 248 OK / 0 errors, gitleaks 0 (367 commits). v1.77 → v1.82. Предыдущие: v1.81 CTO-20 ✅ closed (ICU collation), v1.80 CTO-20 заведение, v1.79 CTO-19 (иконочная система: `@mdi/font`), v1.78 Plan 4 (Billing+CSV+Admin) +7 Биз-25..31.*
*Версия: 1.83 от 13.05.2026 (day +1) — **CTO-19 ✅ closed** через Lucide migration. Custom Vuetify `IconSet` (`liderraLucideSet`) в `app/resources/js/plugins/vuetify.ts` с 103-entry mapping (78 user-grep'нутых mdi-* + 25 Vuetify-internal defaults: pagination chevrons, v-select dropdown, v-checkbox/radio). 51 Vue/TS файл untouched. `npm i lucide-vue-next ^1.0.0` tree-shakable selective imports. Fallback HelpCircle. Path α (aliases-only) approved заказчиком через brainstorming → writing-plans → subagent-driven-development workflow (Task 1 install + Task 2 IconSet + Task 2.b Vuetify-internal extension через subagents; visual smoke + closure controller-driven). Pravila §2.2 / §7.1 — явное «закрываем CTO-19 как ✅» получено после comprehensive verification (pagination + 7+ views + axe-core a11y 0 iconography violations). CLAUDE.md §2 «Иконки: Lucide» brand-spec compliance achieved. **Сводка §0 update:** CTO 17✅/1⏸/1 P2 [?] → 18 ✅/0⏸/0; Итого 70✅/12⏸ → 71 ✅/11 ⏸. Регрессия: Pest 742/739/0/3 / Vitest 88 files / 683 / 3 skipped / Vite 3.52s / axe-core 0 iconography. v1.82 → v1.83. Предыдущая v1.82 — Catch-up bump v1.77 → v1.82 после обнаружения hidden inconsistency header vs footer-trail. v1.81 CTO-20 ✅ closed (ICU collation); v1.80 CTO-20 заведение; v1.79 CTO-19 (иконочная система: `@mdi/font`); v1.78 Plan 4 (Billing+CSV+Admin) +7 Биз-25..31.*