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:
@@ -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
@@ -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": {}
|
||||
|
||||
Generated
+12
@@ -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",
|
||||
|
||||
@@ -46,5 +46,8 @@
|
||||
"vue-tsc": "^3.2.8",
|
||||
"vuedraggable": "^4.1.0",
|
||||
"vuetify": "^3.12.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"lucide-vue-next": "^1.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -1074,6 +1074,7 @@ vuetifyjs
|
||||
форкнулась
|
||||
tabler
|
||||
roh
|
||||
grep'нутых
|
||||
|
||||
# Фамилии лидов из примеров (с диакритикой как в исходниках)
|
||||
Бузо́ва
|
||||
|
||||
@@ -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.05–13.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.05–13.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.05–13.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.05–13.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.05–13.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.*
|
||||
|
||||
Reference in New Issue
Block a user