Доска
Канбан
История
Баги
Задачи
Планы
Г
гость
выйти
0
в работе
23
горит
81
открытых багов
42
задач в очереди
820
сделано всего
История работ
Всё, что сделано, — записями журнала, свежее сверху.
сначала новые
№ 424
Служебный вход стал общим: доска получила форму админки ядра
16.08.2026
№ 423
Выкатка доски на прод и снос последних следов Vikunja
16.08.2026
№ 422
Своя доска задач в ядре: витрина над `docs/` вместо Vikunja
16.08.2026
№ 421
Доска задач уходит из Vikunja в ядро: данные забраны в git, домен переключён
16.08.2026
№ 420
Дверь доски задач переделана по образцу входа в наблюдение
16.08.2026
№ 419
Тема доски задач переписана целиком: перестала быть набором заплаток
16.08.2026
№ 418
Сверки после дня деплоев: схема догнана, конфигурация разошлась в двух местах
16.08.2026
№ 417
«Сопоставлено» и «есть с чем сравнивать» — разные числа, и второе меньше втрое
16.08.2026
№ 416
Проверка сохранности сопоставлений: работа цела, но 1267 связок не доходили до офферов
16.08.2026
№ 415
«Сопоставлено» считалось тремя способами и ни одним честно
16.08.2026
№ 414
Админка Kitcube выключена: `/admin` у тенанта больше нет
16.08.2026
№ 413
Раздел «Kitcube» в кабинете ядра: пять админских экранов свелись к одному
16.08.2026
№ 412
«Убранные офферы» в кабинете випера: бан из песочницы стал обратимым
16.08.2026
№ 411
Песочница переехала к виперу в кабинет, разбор офферов вынесен в модель
16.08.2026
№ 410
Двойные ассеты страницы: виновата не логика подключения, а сборщик, который ничего не удаляет
16.08.2026
№ 409
Кабинет ядра: разделы «Тенанты» и «Логи»
16.08.2026
№ 408
Журнал очереди показывает ход запросов, а не служебные строки воркера — и сразу нашёл потерю товаров
16.08.2026
№ 407
Очереди парсинга переименованы в `kitcube:*`, журнал очереди стал читаемым и ищется
16.08.2026
№ 406
Очередь карточек товара крутилась вхолостую: чужой пользователь у воркеров и перевёрнутый zadd
16.08.2026
№ 405
Песочница: раздел для разбора того, что парсинг нашёл, но сопоставить не смог
16.08.2026
№ 404
Две цены рядом: прайсовая попала на экран и в сравнение, снимок рынка получил свой крон
16.08.2026
№ 403
В Метрику вместо IP уходит идентификатор посетителя, счётчик стал одним на все сайты
16.08.2026
№ 402
Два инлайновых скрипта из разметки: один переехал в бандл, второй оказался мёртвым
16.08.2026
№ 401
Баннер cookie: одна форма на все сайты, палитра — токенами тенанта
16.08.2026
№ 400
Стили ушли из разметки в собираемые ассеты — по всему дереву вьюх
16.08.2026
№ 399
Новый клиент Витрины получает базовый шаблон магазина — проверено; по ходу найден 404 на теме тенанта
16.08.2026
№ 398
Сверка бэкапов всей экосистемы: у почты и доски была одна копия, у сторожа — одна машина
16.08.2026
№ 397
Вход в наблюдение: заголовок в одну строку с индикатором, адрес стал `/login`
16.08.2026
№ 396
Строка списка на доске задач разъехалась — сетка держалась на числе элементов в чужой разметке
16.08.2026
№ 395
MX `brovin.su` переведён на `mail.ligamail.ru`, лишняя зона убрана из Selectel
16.08.2026
№ 394
Закрыт последний пункт аудита: CSRF на шести действиях и гард авторизации в конструкторе
16.08.2026
№ 393
Загрузка прайс-листов конкурентов вернулась в интерфейс — и сразу нашла свой баг
15.08.2026
№ 392
Второй проход аудита приложения: авторизация, SSO, загрузки, платежи — новых дыр нет
15.08.2026
№ 391
BUG-454 закрыт: справочник маркетплейсов разведён на общий каталог платформы и строки тенанта
15.08.2026
№ 390
Зависимости и первый проход аудита приложения — 11 уязвимостей закрыто, одна утечка между тенантами найдена
15.08.2026
№ 389
fail2ban по всей экосистеме: конфиг уехал в git, а jail'ы на kasey оказались слепыми
15.08.2026
№ 388
Воркеры очередей Kitcube: конфиг ядра, ниша в CLI и третий ручной список источников
15.08.2026
№ 387
Крон легаси-сайтов сутки ходил с чужим ключом — заказы не приходили (2026-08-15)
15.08.2026
№ 386
Расписание парсинга уехало из файлов на сервере в БД, крон стал будильником на одну строку
15.08.2026
№ 385
Панель наблюдения: время по Москве и своя форма входа вместо всплывайки basic-auth
15.08.2026
№ 384
Выкатка переноса Kitcube на прод — и две находки, которые ловились только там
15.08.2026
№ 383
Шаги 6 и 7: Kitcube отвязан от каталога витрины — колонки сняты, `products` тенанта удалён
15.08.2026
№ 382
Широкая проверка безопасности инфраструктуры — по слоям, которых не касалась запись 381
15.08.2026
№ 381
Проверка безопасности инфраструктуры по вопросу «а сейчас у нас точно всё безопасно?» — root по паролю на десяти машинах
15.08.2026
№ 380
Проверка Kitcube в браузере после перевода на источники — и три находки, из них одна на весь проект
15.08.2026
№ 379
Kitcube переведён с `marketplace_id` на `source_id` — от списков до парсинга, реестр источников уехал в БД
15.08.2026
№ 378
Почтовые скрипты ligamail заведены в git, пароль БД убран из их тела
14.08.2026
№ 377
`claude_rw` получил `DELETE` на шести таблицах — чистка после тенантов перестала возвращаться к человеку
14.08.2026
№ 376
`tenant-deprovision` доведён до полного сноса: почта, DNS-зона и хвосты в БД внутри одной команды
14.08.2026
№ 375
Услуги слайдером на главной — и найденный по дороге BUG-431: слайдеры не работали нигде
14.08.2026
№ 374
Парсинг Kitcube перестал вести каталог витрины — и пять классов ушли как мёртвые
14.08.2026
№ 373
Проверка Kitcube в браузере после перевода на позиции ниши — и HTTP 500 в двух разделах админки (BUG-430)
14.08.2026
№ 372
Полный снос тестового магазина `ligapnl.ru` — все семь слоёв, а не только строка в `tenants`
14.08.2026
№ 371
Доска задач на своей машине: Vikunja на board.ligameind.ru
14.08.2026
№ 370
Шаг 5 архитектуры 357, часть 5: запись парсера — иначе переведённое чтение осталось бы без данных
14.08.2026
№ 369
Шаг 5 архитектуры 357, часть 4: списки сопоставления — и конец пути `products` в аналитике
14.08.2026
№ 368
Шаг 5 архитектуры 357, часть 3: пересчёт снимков обходит нишу, а не каталог витрины
14.08.2026
№ 367
Карточка товара: характеристики в правую колонку, галерея не залипает, порядок секций
14.08.2026
№ 366
Шаг 5 архитектуры 357, часть 2: стакан на позициях ниши, хардкод продавцов — в данные
14.08.2026
№ 365
Шаг 5 архитектуры 357, часть 1: «Рынок» читает позиции ниши, а не каталог витрины
14.08.2026
№ 364
Раздел «Услуги» витрины — подключаемый модуль `services`
14.08.2026
№ 363
Вся экосистема переведена на московское время
14.08.2026
№ 362
Шаг 4 архитектуры 357: аналитика получила ссылки на источник и позицию ниши (BUG-429)
14.08.2026
№ 361
Шаг 3 архитектуры 357: характеристики позиции ниши и воскрешённые фильтры LEGO
14.08.2026
№ 360
Страница состояния: история суток, хроника и приборный вид вместо дашборда
14.08.2026
№ 359
Шаг 2 архитектуры 357: позиция ниши (`niche_items`) и её артикулы на источниках
14.08.2026
№ 358
Шаг 1 архитектуры 357: таблица источников `analytics_sources` — и два прод-дефекта, вскрытых по пути (BUG-427, BUG-428)
14.08.2026
№ 357
Архитектура Kitcube: позиция ниши вместо товара клиента, источники вместо маркетплейсов
14.08.2026
№ 356
Страница состояния всей инфраструктуры на стороже — и три дефекта наблюдения, которые она обнажила (BUG-424, BUG-425, BUG-426)
14.08.2026
№ 355
Слой конфигурации сведён локаль→прод: 22 запроса, две реальные поломки на проде (BUG-422, BUG-423)
14.08.2026
№ 354
BUG-421: ноутбук переведён на симлинки — правка в git наконец меняет то, что исполняется
14.08.2026
№ 353
Демо-услуги demoliga на прод, минус 5.5 ГБ дублей фото Kitcube — и находка про `check-tenant-media`
14.08.2026
№ 352
Репозиторий скриптов переименован `kasey` → `infra`: имя догнало содержимое
14.08.2026
№ 351
BUG-419: страница ошибки жила через редирект на `/error` — у Киткуба и Лигамайнда это была петля
14.08.2026
№ 350
Инфраструктура в git и собственный мониторинг всей экосистемы
14.08.2026
№ 349
BUG-413: workspace-scoped уникальности раскатаны на 11 таблиц; на `market_offers` упёрлись в испорченные данные
14.08.2026
№ 348
Блог встроен в темы Киткуба и Лигамайнда: свои шаблоны вместо fallback (BUG-415, BUG-416)
14.08.2026
№ 347
Бэкапы: ненулевой код возврата, алерты в Telegram, сторож свежести снапшотов
14.08.2026
№ 346
Схема БД переведена в git: миграции `db/migrations/` + раннер + сверщик локаль↔прод
14.08.2026
№ 345
Баги вынесены из `docs/history/` в отдельный реестр `docs/bugs/`
13.08.2026
№ 344
Перенос обложек блога на прод: те же разъехавшиеся id, плюс три ловушки bash
13.08.2026
№ 343
Обложки для всех 20 статей блога + `og:image` статьи больше не подменяется дефолтом темы
13.08.2026
№ 342
`sync-tenant-media` сопоставлял товары по `id` — ложные расхождения, промахи мимо цели и риск порчи; переведён на артикул
13.08.2026
№ 341
`PageMetaTrait::sanitizeCanonicalQueryParams()` — чёрный список пропускал произвольные
13.08.2026
№ 340
Новый `check-tenant-config` — сверка конфигурации локаль↔прод; нашлось 9 разделов админки, которых на проде нет
13.08.2026
№ 339
Аудит статей блога: разметка `BlogPosting`, перелинковка, CTA и описания — 17 статей приведены к норме
13.08.2026
№ 338
kepeidapump-ru: семейства `4SS`/`4SSM` (72 товара, 337) не найдены ни в одном из 5
13.08.2026
№ 337
kepeidapump-ru: второй класс бага `cdr2xhtml` (смешанные текстовые прогоны), реальные
13.08.2026
№ 336
Блог ligameind-ru не был включён на проде — RSS-лента отдавала 404 при живом коде
13.08.2026
№ 335
`sync-tenant-media` не мог писать на прод: `~/.my.cnf` перебивал `MYSQL_PWD`; заодно выяснилось, что «90 расхождений по фото» — не про фото
13.08.2026
№ 334
kepeidapump-ru: найдена и починена настоящая причина "битых" даташитов CDR (не шрифты —
13.08.2026
№ 333
Семантические ядра kitcube.ru и vittrina.ru + разведение трёх ядер экосистемы между собой
13.08.2026
№ 332
Сплошная ревизия кодовой базы под CODE_STYLE.md — что нашлось помимо форматирования
13.08.2026
№ 331
Три FormData-загрузки в админке слали POST без CSRF-заголовка
13.08.2026
№ 330
kepeidapump-ru: сверка фото с torneri.ru — KPD001 получил реальное фото, 9 карточек
13.08.2026
№ 329
Починены `check-tenant-media`/`sync-tenant-media` — сверка фото локаль↔прод не работала вообще; вскрылось расхождение по 90 товарам
13.08.2026
№ 328
Блог включён тенанту `ligameind-ru` + RSS-лента блога (`/blog/rss.xml`) для импорта в Дзен
13.08.2026
№ 327
Локальное окружение легло на 503 — разошлись пароли MySQL/Redis между `.env` и конфигами; попутно найден боевой пароль БД в git
13.08.2026
№ 326
kepeidapump-ru: QG/QGD/SK/SKm (38 товаров) подтверждены визуальным рендером второй
13.08.2026
№ 325
kepeidapump-ru: закрыты все 3 отложенных расхождения из 317/320 — JS flow_max
13.08.2026
№ 324
kepeidapump-ru: реальные даташиты для 238 товаров семейств SP/SEM/SHM (переиспользование
13.08.2026
№ 323
kepeidapump-ru: фото-аудит 1252 товаров (выборка по 113 семействам) — 1 подтверждённый
13.08.2026
№ 322
kepeidapump-ru: 2 из 4 «дублей» CDR-каталога Kepeida оказались уникальным
13.08.2026
№ 321
kepeidapump-ru: сверка «погружные для чистой воды» (118) + «канализационные» (80) с
13.08.2026
№ 320
kepeidapump-ru: сверка «поверхностные» + «повышения давления» (165 товаров, 2 категории
12.08.2026
№ 319
kepeidapump-ru: сверка категории «циркуляционные» (69 товаров) с kepeidapump.com — 100%
12.08.2026
№ 318
Security-аудит всей кодовой базы (8 параллельных агентов по подсистемам) — 15 находок,
12.08.2026
№ 317
kepeidapump-ru: сверка категории «скважинные» (820 товаров) с официальным сайтом
12.08.2026
№ 316
`ApiOzonService::getApiKey()` — фатальная ошибка из-за отсутствующего `use Marketplace`,
12.08.2026
№ 315
kepeidapump-ru: страница «О компании» дополнена реальной историей бренда — найден
12.08.2026
№ 314
kepeidapump-ru: включён и наполнен блок SEO-текста на хаб-страницах категорий каталога
12.08.2026
№ 313
kepeidapump-ru: Яндекс исключил 550 товарных страниц из поиска («малоценная или
12.08.2026
№ 312
`system-health`: видимость ligacloud-бэкапов и превентивное предупреждение о cron-окне
12.08.2026
№ 311
Коллизия расписания cron с авторебутом 02:00 — файловый бэкап kasey→ligacloud молча
12.08.2026
№ 310
Тот же restic→ligacloud паттерн распространён на `gitea-vps` и `ligamail`
11.08.2026
№ 309
Третья независимая offsite-копия бэкапов kasey — домашний Synology NAS (ligacloud) по SFTP
11.08.2026
№ 308
kasey: `/var/backups` встал на 0 байт — не залипший лок, а неверная retention-политика restic-mysql
11.08.2026
№ 307
Провайдер оплаты МодульБанк — третий в общей платёжной архитектуре (Payment)
10.08.2026
№ 306
kepeidapump.ru заведён как клиент Витрины (`vitrina_shops`) + внутренний бесплатный тариф VIP
10.08.2026
№ 305
Интеграция с 1С — универсальный модуль платформы (OData, первый тенант kepeidapump-ru)
10.08.2026
№ 304
Третий commerce_mode Витрины — «Каталог с платными услугами»
09.08.2026
№ 303
Отдельный раздел «Услуги» в админке — форма товара переросла свою универсальность
09.08.2026
№ 302
Артикул вида «ELECTR-001» молча ломал роутинг страницы товара — валидация на входе
09.08.2026
№ 301
Интеграция доставки СДЭК в чекаут (общий шаблон + kepeidapump-ru) — курьер и ПВЗ
09.08.2026
№ 300
kepeidapump-ru: реквизиты юрлица в чекауте + автозаполнение по ИНН (AhunterSuggest.Company.Solid)
09.08.2026
№ 299
Self-serve режим «магазин/каталог» в Витрине + продажа услуг (Product.type)
09.08.2026
№ 298
Новый профиль тенанта `catalog` — витрина без покупки; попутно найден мёртвый CSS и незакрытый чекаут
07.08.2026
№ 297
kepeidapump-ru: «Купить» показывалось и без остатка — вместе с бейджем «Под заказ» и блоком «Нет на складе, сообщите о поступлении» получалось противоречиво
07.08.2026
№ 296
Удалён `workers/migrate-vegway-blog.php` — одноразовая миграция уже выполнена и сверена
07.08.2026
№ 295
Страничный JS `kepeidapump-ru`/`vittrina-ru` целиком на нативном DOM API, не на jQuery-делегировании
06.08.2026
№ 294
`/order/success` безусловно писал «Заказ оплачен!» даже при отменённой пользователем оплате (2026-08-06)
06.08.2026
№ 293
`/order/success`/`/order/fail` для kepeidapump-ru — общий bootstrap-фолбэк вместо стиля тенанта (2026-08-06)
06.08.2026
№ 292
`deploy` на kasey не пересобирал общие area-ассеты — правка 291 не долетела бы до прода даже деплоем (2026-08-06)
06.08.2026
№ 291
«Оплатить заказ» в кабинете/админке вела на несуществующий `/paykeeper/get-pay-link` (2026-08-06)
06.08.2026
№ 290
«Отменить заказ» в кабинете клиента была нерабочей — недостающий метод контроллера и шаблон, найдено живым тестом (2026-08-06)
06.08.2026
№ 289
Молчаливо проглоченный `Unknown column 'payment_token'` в `orders` на проде — заказ не создавался, но в Telegram уходило уведомление об «успехе» с `order_id: 0` (2026-08-06)
06.08.2026
№ 288
У `market_offers`/`offer_history` не было индекса по `workspace_id` — `/cabinet` грузился 3+ секунды (2026-08-06)
06.08.2026
№ 287
500-я на `kitcube.ru/cabinet` — модели создавались напрямую через `new`, минуя проброс сессии (2026-08-06)
06.08.2026
№ 286
Механизм self-serve провижининга Витрины (DNS/почта/деprovisioning) нигде не описан целиком — восстановлено по памяти сессии (2026-08-06)
06.08.2026
№ 285
Расхождение закоммиченных `.min.css/.min.js` с реальной пересборкой на проде блокировало `git pull` в деплое (2026-08-06)
06.08.2026
№ 284
`vitrina-provision-worker.php`: `exec()` копил вывод предыдущих магазинов пачки в лог ошибки следующего (2026-08-05)
05.08.2026
№ 283
kasey: `scripts-sync` — автоматический `git pull` `/opt/scripts` вместо ручного (2026-08-04)
04.08.2026
№ 282
kasey: `/opt/scripts` заведён под git + вынос cron-бэкапов в `/etc/cron.d` — продолжение 276/279 (2026-08-04)
04.08.2026
№ 281
Витрина: общий хедер лендинга/кабинета, футер в кабинете, страница настроек аккаунта (2026-08-04)
04.08.2026
№ 280
Ещё одна дыра того же класса, что 278: `/reviews/store` не закрыт в `robots.txt`, живой 302 на kepeidapump.ru (2026-08-04)
04.08.2026
№ 279
kasey: поправка к 276 — ретеншен MySQL-дампов и restic-репозиториев на самом деле работает штатно (2026-08-04)
04.08.2026
№ 278
kitcube.ru: приватный клиентский кабинет (`/market` и др.) не закрыт от индексации в `robots.txt` — Яндекс поймал 302 (2026-08-04)
04.08.2026
№ 277
Кабинет Витрины: визуальный редизайн (хедер/хлебные крошки/степпер/дашборд) — и найденный по пути системный баг двойного разделителя в `.breadcrumb` (2026-08-04)
04.08.2026
№ 276
kasey: `/var/backups` забился до 97% — скрипт ретеншена MySQL-дампов существовал, но не был подключён ни к cron, ни к systemd (2026-08-04)
04.08.2026
№ 275
Кабинет Витрины: дашборд/продление/несколько доменов/модули — и найденный по пути баг обоих воркеров провижининга (2026-08-04)
04.08.2026
№ 274
Общий воркер очередей ронял ВСЕ легаси-тенанты (bricktales.ru и др.) уже неделю — из-за этого ВБ сам доставил цены до -90% на bricktales.ru (2026-08-04)
04.08.2026
№ 273
Перенос методов Ozon Finance API из `ligapnl.ru` перед выводом сайта из эксплуатации (2026-08-04)
04.08.2026
№ 272
Кипейда: `<h2>` «Характеристики» шёл в DOM раньше `<h1>` на странице товара — некорректная иерархия заголовков (2026-08-04)
04.08.2026
№ 271
Кипейда: кнопка «Запросить КП» не работала на карточках в «Вы недавно смотрели» — статический biding вместо делегирования (2026-08-04)
04.08.2026
№ 270
Кипейда: баг резолвинга `layout: ''` в `Controller` — AJAX-фрагмент «Вы недавно смотрели» с самого начала возвращал полную страницу вместо голого фрагмента (2026-08-04)
04.08.2026
№ 269
Кипейда: расхождение фото товаров локаль↔прод (263 из 1251) + постоянные инструменты `check-tenant-media`/`sync-tenant-media` (2026-08-04)
04.08.2026
№ 268
PDF-документы к товарам Кипейды — реальные даташиты производителя + автогенерация (2026-08-03)
03.08.2026
№ 267
Система рейтингов и отзывов (товар + компания) добавлена в ядро платформы (2026-08-03)
03.08.2026
№ 266
Кипейда: torneri.ru — реальный опт-поставщик насосов (не только tooling), сверка артикул/цена/остаток + реальные фото по 94 товарам (2026-08-03)
03.08.2026
№ 265
Кипейда: дописаны оставшиеся 4 статьи из content_gaps_summary (ядро, запись 256) + полная перелинковка всех 23 статей блога (2026-08-03)
03.08.2026
№ 264
Kitcube: свернуть блок распределения + фильтры «Рынка» по метке/зоне цены/конкурентам/нашей цене + найден и исправлен баг подсчёта (2026-08-03)
03.08.2026
№ 263
Kitcube: тумблеры зелёный/жёлтый/красный в стакане + кружки-метки на «Рынке» (2026-08-03)
03.08.2026
№ 262
Kitcube: в стакане поменять местами колонки «Оффер»/«Источник» + клик по SKU не должен разворачивать деталь-панель строки (2026-08-03)
03.08.2026
№ 261
Кипейда: 4 новые статьи блога под пробелы из семантического ядра + стилизация пагинации + находка — числовые характеристики в каталоге синтетические (2026-08-03)
03.08.2026
№ 260
Kitcube: миниатюры/лайтбокс стакана распространены на «Рынок»/«Анализ цен»/«Сопоставление SKU», но в табличных списках фото сжимались не квадратом (2026-08-03)
03.08.2026
№ 259
Kitcube: «стакан» (`/market`) — липкий заголовок таблицы, лайтбокс фото, полировка UI; находка sku_code=0 у части офферов оказалась ещё одним случаем известной prod-порчи (2026-08-03)
03.08.2026
№ 258
Kitcube: «Позиция в диапазоне» на `/market` могла показывать нашу цену не крайней при том, что она ниже/выше всех конкурентов (2026-08-03)
03.08.2026
№ 257
Kitcube: поиск в хедере на `/market` не работал — форма всегда уводила на `/price-analysis` (2026-08-03)
03.08.2026
№ 256
Кипейда: дубли SEO title/description у всего блога (21 URL) + латентный баг шаблона `{name}` у каталог-групп, семантическое ядро (2026-08-03)
03.08.2026
№ 255
Восстановлены AI-рекомендации на проде (predicted_reference_id) + найден материализованный (не live) снапшот «Рынка» + аудит «чёрного списка URL» (2026-08-03)
03.08.2026
№ 254
Прямая связь `offer_match.market_offer_id` + довершение расцепления (product_id/is_checked) + восстановление `sku_code` на проде (2026-08-03)
03.08.2026
№ 253
Kitcube: чистка мусорного AI-процента 40% в tooling + найден разъезд offer_match/market_offers без общего ключа на проде (2026-08-03)
03.08.2026
№ 252
Kitcube: админка «Клиенты»/«Продавцы клиентов» + найден и обойдён баг с отсутствующей кнопкой формы (2026-08-03)
03.08.2026
№ 251
Kepeida: адресная книга клиента на чекауте + аудит цепочки заказа и доставки писем (2026-08-03)
03.08.2026
№ 250
MySQL локали приведён к прод-версии (9.7.1 → 8.4.11) + реальный найденный баг биндинга `sku_code` в RedBeanPHP (2026-08-03)
03.08.2026
№ 249
Второй этап 245 — чтение сопоставлений/сравнения цен переведено на `client_references` (2026-08-02)
02.08.2026
№ 248
Раскатка миграции `client_references`/`analytics_clients` (245) на прод + деплой (2026-08-02)
02.08.2026
№ 247
Кнопка "Назад" в админке могла увести на витрину вместо ожидаемого места — коллизия cookie `referrer` (2026-08-02)
02.08.2026
№ 246
Разделение заказа задваивало доставку/наложенный платёж в учёте прибыли каждого под-заказа (2026-08-02)
02.08.2026
№ 245
Аудит и первый этап миграции Kitcube-сопоставления с `product_id` на `client_references`/SKU-референса (2026-08-02)
02.08.2026
№ 244
`/order`, `/cabinet` и другие корневые страницы shop/client area сломаны у kepeidapump-ru легаси catch-all'ом блога (2026-08-02)
02.08.2026
№ 243
Полный аудит ядра по запросу: боевые секреты открытым текстом в git, задеплоенная чужая заготовка (2026-07-31)
31.07.2026
№ 242
Kitcube: самостоятельная регистрация без назначенного workspace показывала клиенту чужие данные (2026-07-30)
30.07.2026
№ 241
Реквизиты vittrina-ru на проде так и не применились ни в одном из прошлых деплоев (2026-07-30)
30.07.2026
№ 240
Плавающая кнопка «Задать вопрос» на Витрине перекрывала заголовок карточки блога на мобильных (2026-07-30)
30.07.2026
№ 239
SEO-дефолты offer/privacy/returns пустые на проде, blog отсутствовал — легал-страницы показывали title главной (2026-07-30)
30.07.2026
№ 238
Kitcube: добавлены страницы политик, шапка/футер вынесены в partials (2026-07-30)
30.07.2026
№ 237
robots.txt/sitemap.xml не отражали реальный Disallow-список ни на одном из 6 прод-доменов (2026-07-30)
30.07.2026
№ 236
Полная синхронизация 234/235 с продом (2026-07-30)
30.07.2026
№ 235
Self-serve регистрация на Витрине: домен → тариф → оплата → автоматический тенант (2026-07-30)
30.07.2026
№ 234
Конфиг тенанта перенесён из файла в БД (`tenants.config`) — подготовка к self-serve регистрации на Витрине (2026-07-30)
30.07.2026
№ 233
Генеральная зачистка комментариев в `.sass` + попутно найдены задвоенные переменные и orphaned-файл в kitcube-ru (2026-07-29)
29.07.2026
№ 232
Бейджи сигналов на лендинге kitcube-ru не были окрашены по важности (2026-07-29)
29.07.2026
№ 231
`$mono` на лендинге kitcube-ru ссылался на Monaco вместо загруженного JetBrains Mono (2026-07-29)
29.07.2026
№ 230
Telegram-превью (og:image/title) не показываются ни для одного тенанта на kasey — Selectel блокирует IP-диапазоны Telegram (2026-07-29)
29.07.2026
№ 229
Кнопка «Забанить» в клиентском «Анализ цен» падала с SQL-ошибкой для алфавитно-цифровых SKU
29.07.2026
№ 228
Перенос редизайна в клиентский кабинет Kitcube: найден захардкоженный workspace `lego` в
29.07.2026
№ 227
Чистка PHPDoc от истории правок — "Исправлено ГГГГ-ММ-ДД" убрано по всей кодовой базе
29.07.2026
№ 226
Playwright-парсер-сервер: неверные хост/порт в ServerResolver ломали весь playwright-путь
29.07.2026
№ 225
Аудит @todo: низкая серьёзность — Service (FeedOffers/ApiService/ApiOzonService/RedisQueueService/XlsxService/ImagesService)
29.07.2026
№ 224
Аудит @todo: низкая серьёзность — Support (Currency/Number/Str/Arr/helpers)
29.07.2026
№ 223
Аудит @todo: низкая серьёзность — TenantConfig/TenantAssets/Router/Controller/Model/View
29.07.2026
№ 222
Аудит @todo: низкая серьёзность — DataConnectionManager/RedisFacade
29.07.2026
№ 221
Аудит @todo: 17 устаревших ссылок на уже несуществующие/исправленные @todo
29.07.2026
№ 220
Аудит @todo: ErrorResponder не передавал $isDev, OrderController::fail() показывал неверный breadcrumb
29.07.2026
№ 219
Аудит @todo: ProxyService не реализовывал ApiCallable — заявленный /api/request был недоступен
29.07.2026
№ 218
Аудит @todo: OpenAIService::processTextWithPrompts() слал payload legacy API на Chat Completions эндпоинт
29.07.2026
№ 217
Аудит @todo: Marketplace::getAll()/getAllVisible() делили один статический кэш
29.07.2026
№ 216
Аудит @todo: Brickeconomy опечатка used_value → value_used
29.07.2026
№ 215
Code review: задвоенные PHPDoc-блоки в 4 файлах парсеров после миграции на PayloadFactory
29.07.2026
№ 214
Code review: hash_equals-сравнение задублировано в PaymentController
29.07.2026
№ 213
Code review: Veeper-guard задублирован 22 раза вместо одной точки в AdminController
29.07.2026
№ 212
Code review: YooKassaProvider и PaykeeperProvider дважды запрашивали один и тот же заказ
29.07.2026
№ 211
Code review: OrderCheckoutService держал Redis-лок и MySQL-транзакцию через синхронные Telegram+email
29.07.2026
№ 210
Code review: тройное дублирование проверки ApiCallable, разошедшееся строгостью
29.07.2026
№ 209
Code review: veeper-log — match() без default падал на всех реальных значениях method
29.07.2026
№ 208
Code review: убраны избыточные getById()-оверрайды, ставшие точными дублями нового базового метода
29.07.2026
№ 207
Code review: FrontendModel::getById() не фильтровал по tenant_id/workspace_id — базовый класс ~64 моделей
29.07.2026
№ 206
Второй аудит: Response::back() — открытый редирект через сырой Referer
29.07.2026
№ 205
Второй аудит: AbstractProductConfig::getData() тихо возвращал [] при дрейфе slug/БД
29.07.2026
№ 204
Второй аудит: BrickeconomyRefresh::catchProduct() падал с TypeError в JSON-LD фолбэке
29.07.2026
№ 203
Второй аудит: PayloadValidator не требовал поле dispatch
29.07.2026
№ 202
Второй аудит: SourceConfig — handler_class VseinstrumentiRu сырой строкой вместо ::class, лживый комментарий
29.07.2026
№ 201
Второй аудит: CleanupSkus::findDuplicateImagesAndDelete() удалял ВСЕ изображения SKU, а не только дубли
29.07.2026
№ 200
Второй аудит: ApiOzonService::getNewOrders() читал неверный ключ ответа
29.07.2026
№ 199
Второй аудит: удалён мёртвый файл app/StaticData/cities.php
29.07.2026
№ 198
Второй аудит: мёртвый фолбэк product_link в OzonSearch::catch()
29.07.2026
№ 197
Второй аудит: $log без null-safe в catch-блоках трёх парсинг-обработчиков
29.07.2026
№ 196
Второй аудит: OfferProcessor::process() — закомментирована проверка only_excel_history
29.07.2026
№ 195
Второй аудит: ParserRender::renderStatus() перезаписывал $remaining вместо суммирования
29.07.2026
№ 194
Второй аудит: SliderService::getProductsByQueryCondition() без фильтра is_visible=1
29.07.2026
№ 193
Второй аудит: ApiWildberriesService::getStickersByParams() читал неверный ключ ответа
29.07.2026
№ 192
Второй аудит: VseinstrumentiRu::getPrice() без ?? 0 после intVal()
29.07.2026
№ 191
Второй аудит: CaptchaGenerator использовал shuffle() вместо CSPRNG
29.07.2026
№ 190
Второй аудит: Json::decode() бросал TypeError вместо JsonException на JSON-скаляре
29.07.2026
№ 189
Второй аудит: непоследовательное экранирование имени товара в XML-фидах FeedOffers
29.07.2026
№ 188
Второй аудит: LinksCrawler::BLOCKED_PATH_REGEX не блокировал /admin
29.07.2026
№ 187
Второй аудит: TOCTOU race в дедупе QueueManager::enqueueTask()
29.07.2026
№ 186
Второй аудит: задвоение прибыли на multi-investor заказах в ReportFinanceDetailed
29.07.2026
№ 185
Второй аудит: Calculation::calculateProductProfitSum() не учитывал commission_additional
29.07.2026
№ 184
Второй аудит: неверная формула отката ADV-цены в Product::getAdvPriceWithChangePercent()
29.07.2026
№ 183
Второй аудит: OfferHistory::insertIfChanged() не учитывал price_excel_retail в дедупе
29.07.2026
№ 182
Второй аудит: 8 диспетчеров парсинга слали запрос в устаревшей схеме — весь парсинг маркетплейсов был молча сломан
29.07.2026
№ 181
Второй аудит: AdminModel — tenant_id по умолчанию в базовом getWhereClause()
29.07.2026
№ 180
Второй аудит: Request::ip() слепо доверял X-Forwarded-For
29.07.2026
№ 179
Второй аудит: OfferAnalysis::getWhereClause() ссылался на удалённые колонки tenant_id
29.07.2026
№ 178
Второй аудит: ProductPriceManagement::updateAdv() без изоляции по tenant_id
29.07.2026
№ 177
Второй аудит: PriceSync::sync() без защиты от price<=0
29.07.2026
№ 176
Второй аудит: BrandingController::upload() без CSRF-проверки
29.07.2026
№ 175
Второй аудит: IDOR оплаты marketplace-заказов без сессии — добавлен payment_token
29.07.2026
№ 174
Второй аудит: OfferMatch не фильтровал getById() по workspace_id
29.07.2026
№ 173
Второй аудит: TenantResolver отравлял APCu-кэш чужого домена
28.07.2026
№ 172
Второй аудит: race condition в OrderCheckoutService даёт двойной заказ
28.07.2026
№ 171
Второй аудит: Product::article — проверка уникальности до slug-нормализации
28.07.2026
№ 170
Второй аудит: reflected XSS в PaginationService и notification-эндпоинте, без CSRF
28.07.2026
№ 169
Второй аудит: жизненный цикл заказа без проверки статуса (confirmed/transited/completed/returned)
28.07.2026
№ 168
Второй аудит: хранимый XSS в UnknownFunctions::generateSortOptions()
28.07.2026
№ 167
Второй аудит: обход роли Veeper на мутирующих экшенах create/save/delete
28.07.2026
№ 166
Второй аудит: дублирующий безусловный investor_id в Storage::getWhereClause()
28.07.2026
№ 165
Второй аудит: User и SidebarMenu не фильтровали getById() по tenant_id
28.07.2026
№ 164
Второй аудит: SQL injection через s_snapshot_flag в MarketSnapshot
28.07.2026
№ 163
Второй аудит: YooKassa webhook брал order_id и сумму из недоверенного тела
28.07.2026
№ 162
Второй аудит: path traversal через image_name в ImagesService::deleteImage()
28.07.2026
№ 161
Второй аудит: path traversal через sku_code в ImageFetcher::catch()
28.07.2026
№ 160
Исправление собственной регрессии фикса 158 — реальные callback-классы парсинга не реализовывали ApiCallable
28.07.2026
№ 159
Второй аудит: ResponseDecoder доверял payload.response.file без песочницы
28.07.2026
№ 158
Второй аудит: нет allowlist ApiCallable для колбэков парсинга в PayloadValidator
28.07.2026
№ 157
Второй аудит: сравнение access key не было тайминг-безопасным
28.07.2026
№ 156
Второй аудит: секретный `system.api_access_key` отдавался без авторизации
28.07.2026
№ 155
Второй полный аудит: захват тенанта через самостоятельную регистрацию (`role_id`)
28.07.2026
№ 154
Раздел «Заказы» в админке кепейды — не перенесён из легаси, карточка рендерилась как
28.07.2026
№ 153
Фаза 6: Http/Controllers батч 13 — Category/Settings/UserController (Admin) — без
28.07.2026
№ 152
Фаза 6: Http/Controllers батч 12 — все 3 Shop/{Basket,Product,Order}Controller — без
28.07.2026
№ 151
Фаза 6: Http/Controllers батч 11 — Client/UserController, Client/AuthController,
28.07.2026
№ 150
Фаза 6: Http/Controllers батч 10 — Guest/TemplateController, Client/CabinetController
28.07.2026
№ 149
Фаза 6: Http/Controllers батч 9 — AutopriceGroups/AutopriceKeys/AutopriceSettings/
28.07.2026
№ 148
Фаза 6: Http/Controllers батч 8 — все 6 чёрных/белых списков Kitcube (контроллеры) —
28.07.2026
№ 147
Фаза 6: Http/Controllers батч 7 — SidebarMenu/Storage/InvestorPayout/
28.07.2026
№ 146
Фаза 6: Http/Controllers батч 6 — Showcase/InfoBlock/Payment/DeliveryProviders/
28.07.2026
№ 145
Фаза 6: Http/Controllers батч 5 — Supplier/Tags/Warehouse/CostCategory/
28.07.2026
№ 144
Фаза 6: Http/Controllers батч 4 — MarketSnapshot/OfferAnalysis/OfferMatch/Marketplace/
28.07.2026
№ 143
Фаза 6: Http/Controllers батч 3 — OfferHistory/Paykeeper/Investor/BannedOffersController
28.07.2026
№ 142
Фаза 6: Http/Controllers батч 2 — Brickeconomy/Veeper/VeeperLog/ReportFinanceSummary/
28.07.2026
№ 141
Фаза 6: начало Http/Controllers — Parser/Dashboard/Blacklist/ProductPriceManagement/
28.07.2026
№ 140
Фаза 6: `declare(strict_types=1)` в Auth.php — ЗАКРЫВАЕТ ВСЮ ДИРЕКТОРИЮ Models/Frontend;
28.07.2026
№ 139
Фаза 6: `declare(strict_types=1)` в ShopCatalog.php — найден реальный логический баг в
28.07.2026
№ 138
Фаза 6: `declare(strict_types=1)` в TemplateBuilder.php — без находок (2026-07-28)
28.07.2026
№ 137
Фаза 6: `declare(strict_types=1)` в ShopProduct.php — два реальных риска на боевой
28.07.2026
№ 136
Фаза 6: `declare(strict_types=1)` в Basket.php — без находок (2026-07-28)
28.07.2026
№ 135
Фаза 6: `declare(strict_types=1)` в Cabinet.php/ShopCategory.php (2026-07-28)
28.07.2026
№ 134
Фаза 6: `declare(strict_types=1)` в Models/Frontend — начало (Index/AuthHandle/UserRole/
28.07.2026
№ 133
Фаза 6: `declare(strict_types=1)` в Arbitrary/Parser/ParserRender/ProductParameters/
28.07.2026
№ 132
Фаза 6: `declare(strict_types=1)` в Veeper/VeeperLog/DeliveryProvider/Paykeeper —
28.07.2026
№ 131
Фаза 6: `declare(strict_types=1)` в Brand/ReportHashes/Showcase/Statistics — найдена
28.07.2026
№ 130
Фаза 6: `declare(strict_types=1)` в AutopriceGroups/AutopriceKeys/AutopriceSettings/
28.07.2026
№ 129
Фаза 6: `declare(strict_types=1)` в чёрных/белых списках Kitcube — найдена одна
28.07.2026
№ 128
Фаза 6: `declare(strict_types=1)` в `User.php`/`Warehouse.php`/`Supplier.php`/
28.07.2026
№ 127
Фаза 6: `declare(strict_types=1)` в `DeliveryServices.php`/`Payment.php`/`Costs.php`/
28.07.2026
№ 126
Фаза 6: `declare(strict_types=1)` в `OrderItem.php`/`OrderLog.php` — найден скрытый
28.07.2026
№ 125
Фаза 6: `declare(strict_types=1)` в `Order.php` — ещё одна живая регрессия в уже
28.07.2026
№ 124
Фаза 6: `declare(strict_types=1)` в `Product.php` — плюс живая регрессия, задеплоенная
28.07.2026
№ 123
Транзакционные письма не отправлялись ни на одном тенанте — не было пароля `mail.noreply.password` (2026-07-28)
28.07.2026
№ 122
Фаза 6: `declare(strict_types=1)` в `Frontend/{ShopOrder,ShopUser}.php` — закрывает список grep-находок 119-120 (2026-07-28)
28.07.2026
№ 121
Фаза 6: `declare(strict_types=1)` ещё в 5 файлах Models — 9 экземпляров того же `R::getCell()`-бага, попутно найден и исправлен `=== 0` баг сравнения (2026-07-28)
28.07.2026
№ 120
Фаза 6: живой тест поймал реальную регрессию до коммита — цепочка `ProductPrice`→`MarketplacePackagePrice`→`Calculation` (2026-07-28)
28.07.2026
№ 119
Фаза 6, начало Models: систематический баг `R::getCell()` → типизированный `int`/`string` возврат без каста — найден в 9 файлах через широкий скан (2026-07-28)
28.07.2026
№ 118
Фаза 6 завершена для Service: `declare(strict_types=1)` в `XlsxService.php` (1601 строка), 8 непоследовательных мест без каста (2026-07-28)
28.07.2026
№ 117
Фаза 6: `declare(strict_types=1)` в `Service/FeedOffers.php`, найден реальный баг типа возврата в `Marketplace::checkFeedStatusByMarketplaceId()` (2026-07-28)
28.07.2026
№ 116
Фаза 6: `declare(strict_types=1)` в `Service/Media/ImagesService.php` (2026-07-28)
28.07.2026
№ 115
Фаза 6: `declare(strict_types=1)` в `Service/FeedService.php` (2026-07-28)
28.07.2026
№ 114
Фаза 6 продолжена: `declare(strict_types=1)` ещё в 4 файлах Service (2026-07-28)
28.07.2026
№ 113
Фаза 6: `declare(strict_types=1)` в 3 сервисах маркетплейсов, 2 реальных бага с TypeError (2026-07-28)
28.07.2026
№ 112
Попап истории статусов заказа в личном кабинете был недоступен с тач-устройств (2026-07-28)
28.07.2026
№ 111
Фаза 6 продолжена: `declare(strict_types=1)` в 3 файлах, 1 реальный найденный баг (2026-07-28)
28.07.2026
№ 110
Начало Фазы 6 нормализации ядра: `declare(strict_types=1)` в 12 файлах (Core/StaticData/Libs/Support) (2026-07-28)
28.07.2026
№ 109
Критично: чекаут игнорировал реально отправленные способ оплаты и адрес — заказы уходили в поломанную онлайн-оплату (2026-07-28)
28.07.2026
№ 108
Ещё ~22 висячих ссылки "(см. @todo класса)" на уже несуществующие @todo — Фаза 5 продолжена (2026-07-28)
28.07.2026
№ 107
4 «зеркальных» устаревших докблока: класс лгал про открытый critical-баг, хотя он уже исправлен — начало Фазы 5 (2026-07-28)
28.07.2026
№ 106
`Model::responseArray()`/`responseEcho()` игнорировали параметр `$status` — реальный HTTP-код всегда 200 (2026-07-28, закрывает Фазу 4)
28.07.2026
№ 105
`AdminPageTrait::$breadcrumbUri` — мёртвое свойство без наблюдаемого эффекта, удалено (2026-07-28)
28.07.2026
№ 104
`AbstractDBConnectionManager::validateConfigKeys()` сравнивал конфиг сам с собой — проверка обязательных ключей была фиктивной (2026-07-28)
28.07.2026
№ 103
`RedisConnectionManager::addConnection()`: retry-цикл PING мог молча признать мёртвое соединение рабочим (2026-07-28)
28.07.2026
№ 102
`Costs::save()` сбрасывал время суток расхода на 00:00:00 при редактировании (2026-07-28)
28.07.2026
№ 101
`XlsxService::getXlsxForMegamarket()`: дублирующая запись в ту же ячейку (2026-07-28)
28.07.2026
№ 100
`ApiWildberriesService::getOrdersByParams()`/`getStickersByParams()`: захардкоженные месяц/год/ID заказа вместо параметров (2026-07-28)
28.07.2026
№ 99
`Response::clearCookie()` реально не удалял cookie — превращал её в сессионную (2026-07-28)
28.07.2026
№ 98
`ProductController::handleSetPrice()`: поле «Бонус за покупку» на форме цен ничего не сохраняло (2026-07-28)
28.07.2026
№ 97
`AutopriceSettingsController::create()`: не было проверки уникальности комбинации маркетплейс+группа+ключ (2026-07-28)
28.07.2026
№ 96
`OrderController::setSplit()`: отключённая валидация могла удалить заказ, не создав ни одного под-заказа — начало Фазы 4 (2026-07-28)
28.07.2026
№ 95
Blacklist-контроллеры (Skus/Brands/Sellers): дубликаты создавались молча, без ошибки пользователю — последний пункт Фазы 3 (2026-07-28)
28.07.2026
№ 94
Кнопки «Добавить»/«Редактировать» в 2 админ-разделах вели в никуда (2026-07-28)
28.07.2026
№ 93
`AntiFraudSystem`: конструктор мог упасть TypeError на ботах/curl без стандартных заголовков (2026-07-28)
28.07.2026
№ 92
`ApiWildberriesService::putStocks()`/`setPricesAndDiscounts()`: неверный регистр неймспейса класса `Product` (2026-07-28)
28.07.2026
№ 91
`Investor::getProfitOf{Confirmed,Transited}Orders()` — не баг, а неверное имя: переименованы в `getRevenueOf...` (2026-07-28)
28.07.2026
№ 90
`XlsxService::getXlsxForOrdersByInvestorId()`: терялись все позиции заказа кроме последней (2026-07-28)
28.07.2026
№ 89
`Http::isCurrentRequestApi()`/`isApi()` всегда возвращали false — неверный префикс `/public/api/` вместо `/api/` (2026-07-28)
28.07.2026
№ 88
Загрузка изображений в админке — no-op: неверная структура `$_FILES` (нормализация ядра, фаза 3, 2026-07-28)
28.07.2026
№ 87
Личный кабинет kepeidapump-ru после редизайна: заголовок настроек, отступ у иконки статуса, бесконечное мигание попапа (2026-07-28)
28.07.2026
№ 86
Подтверждение ЛЮБОГО заказа у ЛЮБОГО тенанта могло рушиться из-за безусловного вызова нерабочего Ozon-синка (2026-07-28)
28.07.2026
№ 85
`MarketSnapshotController::updateData()` вызывал удалённый метод модели — гарантированный Fatal error по кнопке «Обновить данные» (2026-07-28)
28.07.2026
№ 84
`ProductController::uploadDataToOzon()`: вызов несуществующего метода модели — гарантированный Fatal error по клику (2026-07-28)
28.07.2026
№ 83
`CatalogController::category()`: canonical-редирект мог упасть необработанным исключением вместо 301 (2026-07-28)
28.07.2026
№ 82
Личный кабинет kepeidapump-ru: 3 реальных бага (не только визуальный редизайн) (2026-07-28)
28.07.2026
№ 81
`SliderService`: слайдер маркетинговой группы мог показать товары чужого тенанта + фильтр группы не работал вообще (2026-07-28)
28.07.2026
№ 80
4 захардкоженных секрета в исходном коде вынесены в `.env` — начало полной нормализации ядра (2026-07-28)
28.07.2026
№ 79
`og:image` вёл на 404 у `ligameind-ru`/`sacredlegacy-ru`/`demoliga-ru` — битый дефолт в схеме настроек (2026-07-28)
28.07.2026
№ 78
Полная синхронизация БД и `storage/tenants/*` локаль→прод: Kepeida/Kitcube/Vittrina (2026-07-28)
28.07.2026
№ 77
`deploy.sh` не ставит npm-зависимости — первый деплой с новым JS-пакетом (`chart.js`, см. 73) упал на проде (2026-07-28)
28.07.2026
№ 76
Регрессия фавиконки kitcube-ru от собственного `tenant-build-assets` + бренд "Kitcube"/"Киткуб" разъехался в title/OG (2026-07-28)
28.07.2026
№ 75
Витрина: рассинхрон с мокапом — отсутствие тёмной темы, + повтор паттерна из 74 на hover кнопок-ссылок (2026-07-28)
28.07.2026
№ 74
Скролл к якорям на главной kitcube-ru реально был сломан: специфичность против правила самого Bootstrap 5 (2026-07-28)
28.07.2026
№ 73
Графики Chart.js на оставшихся 4 страницах кабинета Kitcube: Рынок/Анализ цен/Сопоставление SKU/Списки (2026-07-28)
28.07.2026
№ 72
Пустой `<title>` на всех страницах клиентского кабинета Kitcube + редизайн дашборда/layout + баг со скроллом к якорю на гостевой (2026-07-28)
28.07.2026
№ 71
Сайдбар кабинета Kitcube растягивался вместе с длинным списком + пагинация не в стиле (2026-07-28)
28.07.2026
№ 70
`/sku-matching` у нового vipера был пуст, хотя связок 13 942 — `OfferMatch` принудительно фильтрует список по своему `veeper_id` (2026-07-28)
28.07.2026
№ 69
Пост-логин редирект `/auth` уводил vipера в `/admin` вместо клиентского кабинета Kitcube (2026-07-28)
28.07.2026
№ 68
Раздел «Рынок» для workspace `tooling`: редизайн `MarketSnapshot` под произвольное число конкурентов + 2 реальных пользователя kitcube-ru (2026-07-28)
28.07.2026
№ 67
Клиентский кабинет Kitcube (Фаза 4, финал): сайдбар/топбар в layout, реальные ассеты, старый SPA-макет удалён (2026-07-28)
28.07.2026
№ 66
Клиентский кабинет Kitcube (Фаза 3): маршруты/контроллеры + 6 сопутствующих багов чёрных/белых списков + КРИТИЧНО найден системный баг типа `sku_code` (2026-07-28)
28.07.2026
№ 65
Клиентский кабинет Kitcube (Фаза 2): `WorkspaceContext` резолвится по назначенному пользователю + поле выбора workspace в админке (2026-07-28)
28.07.2026
№ 64
Клиентский кабинет Kitcube (Фаза 1 — схема БД): `OfferMatch` смешивал workspace lego/tooling + сломанная колонка `comment_admin` (2026-07-28)
28.07.2026
№ 63
`maxlength="150"` на форме не совпадал со схемой (255) + КРИТИЧНО: личный кабинет открывается не у всех новых пользователей (2026-07-28)
28.07.2026
№ 62
Проверка регистрации/авторизации на всех тенантах + аудит безопасности (2026-07-28)
28.07.2026
№ 61
Единая раскладка кнопок + два реальных регресса от layout `auth` (58): поля не подсвечивались, toast не показывался (2026-07-28)
28.07.2026
№ 60
Три мелкие правки после 59: битая кнопка "Назад", вёрстка кнопок восстановления, cookie-баннер (2026-07-28)
28.07.2026
№ 59
Доработка layout `auth`: брендинг, типографика, подчёркивание ссылок (2026-07-28)
28.07.2026
№ 58
Единый layout `auth` для входа/регистрации/восстановления пароля на всех тенантах (2026-07-28)
28.07.2026
№ 57
`kepeidapump-ru`: не было ссылки на вход в личный кабинет (2026-07-28)
28.07.2026
№ 56
Юридические документы + уведомление о cookie на всех сайтах (2026-07-28)
28.07.2026
№ 55
КРИТИЧНО: `R::begin()/commit()/rollback()` были тихим no-op везде в проекте — найдено сквозной проверкой оформления заказа на всех тенантах (2026-07-28)
28.07.2026
№ 54
Редизайн страницы оформления заказа (Фаза 5, 2026-07-27)
27.07.2026
№ 53
Способы доставки (админ self-service) + заготовка СДЭК (Фаза 4, 2026-07-27)
27.07.2026
№ 52
Объединение online-провайдера оплаты со страницей "Способы оплаты" (Фаза 3, 2026-07-27)
27.07.2026
№ 51
`OrderCheckoutService` — выделение чекаута из `Order.php` (Фаза 2, 2026-07-27)
27.07.2026
№ 50
Оформление заказа: адрес клиента никогда не сохранялся в реальный заказ + баги валидации/логирования (Фаза 0-1, 2026-07-27)
27.07.2026
№ 49
Форма "Запросить КП" — реальная отправка (Telegram + email), Telegram-темы (topics) для уведомлений (2026-07-27)
27.07.2026
№ 48
"Хиты продаж" на главной Kepeida — реальная логика по просмотрам вместо хардкода (2026-07-27)
27.07.2026
№ 47
Универсальный шаблон главной страницы guest — `app/Views/areas/guest/index/` был мёртвым черновиком (2026-07-27)
27.07.2026
№ 46
Аудит шаблонов/ассетов: переименование areas `site→guest`/`app→client` (23) было доделано только в роутинге (2026-07-27)
27.07.2026
№ 45
`blacklist_brands/sellers/skus/words` и `whitelist_brands/sellers` — исключительно Kitcube, `tenant_id` выпилен, tenant-level guard в админке (2026-07-27)
27.07.2026
№ 44
Докрутка `workspace_id` до конца слоя таблиц конкурентного анализа (2026-07-27)
27.07.2026
№ 43
`tenant_id` → `workspace_id` в пяти чисто-Kitcube таблицах + `WorkspaceContext` (2026-07-27)
27.07.2026
№ 42
Консолидация парсинг-данных tornerix в Kitcube как второй workspace (2026-07-27)
27.07.2026
№ 41
Перенос LEGO-данных Kitcube с прода + первая реализация `workspace_id` (2026-07-27)
27.07.2026
№ 40
Полный перенос прод-данных tornerix + баг `offer_match.sku_code` (2026-07-26)
26.07.2026
№ 39
Загрузка Excel-прайса конкурента-агрегатора в OfferAnalysis (2026-07-26)
26.07.2026
№ 38
Callback маркетплейс-краулеров указывал на чужой сайт legmir.ru (2026-07-26)
26.07.2026
№ 37
Страница `/admin/parser` не работала вообще: class-mismatch + отсутствие ApiCallable (2026-07-26)
26.07.2026
№ 36
КРИТИЧНО: JS 8 админ-разделов вообще не подключался на странице (2026-07-26)
26.07.2026
№ 35
Аудит хелперов `Support/Functions` — замена дублирующей inline-логики (2026-07-26)
26.07.2026
№ 34
Унификация двух конвейеров ImagesService (2026-07-26)
26.07.2026
№ 33
Повторный аудит безопасности ядра — второй раунд, 8 находок исправлено (2026-07-26)
26.07.2026
№ 32
Полный аудит безопасности ядра (админка + клиент) — 15 находок, все исправлены (2026-07-26)
26.07.2026
№ 31
Sitemap для модуля `blog` + автогенерация favicon/og-картинки из одной загрузки (2026-07-26)
26.07.2026
№ 30
Перенос englitutor.ru и brovin.su (портфолио + wb + brief) — 2026-07-26
26.07.2026
№ 29
Перенос loto.brovin.su и vegway.brovin.su (новый модуль `blog`) — 2026-07-26
26.07.2026
№ 28
Точка правды кода переехала на self-hosted Gitea; прод отставал на 76 коммитов (2026-07-26)
26.07.2026
№ 27
Единая self-service архитектура онлайн-оплаты — `app/Service/Payment/` (2026-07-26)
26.07.2026
№ 26
Безопасность `public/yookassa/*` (тенант "Уклимана") — не проверялось раньше, найдено 2026-07-26
26.07.2026
№ 25
Визуальная регрессия после переименования areas: стухшие скомпилированные ассеты + отдельный найденный баг в `admin/Order.js`/`Product.js` (2026-07-26)
26.07.2026
№ 24
Механизм профилей тенантов: `app/Core/Config/Profiles/{shop,landing}.php` (2026-07-26)
26.07.2026
№ 23
Переименование areas: `site` → `guest`, `app` → `client`, убрана area `kitcube` (2026-07-26)
26.07.2026
№ 22
Kitcube: реальный механизм "клиента аналитики" — роль в `admin`, а не area `kitcube`; area `kitcube` — тупиковая, часть UI-прототипа мертва (найдено 2026-07-26, при подготовке переименования areas)
26.07.2026
№ 21
SEO-аудит title/description: живой баг с пустым H1 у `tornerix-ru`, товары без бренда в title (2026-07-25)
25.07.2026
№ 20
Проверка готовности `tornerix-ru` к переносу на прод — найден и исправлен платформенный баг с баннером (2026-07-25)
25.07.2026
№ 19
SEO-аудит: sitemap.xml, robots.txt, rich snippets, rel=prev/next (2026-07-25)
25.07.2026
№ 18
Сквозной аудит межтенантных утечек во всех `AdminModel`-наследниках (2026-07-25)
25.07.2026
№ 17
SSO-переход супер-администратора между тенантами (2026-07-25)
25.07.2026
№ 16
Единый супер-админ во всех тенантах (2026-07-25)
25.07.2026
№ 15
Реальные фото товаров tornerix-ru — массовая загрузка с torneri.ru (2026-07-25)
25.07.2026
№ 14
Визуальная витрина tornerix-ru — полный магазин локально (2026-07-25)
25.07.2026
№ 13
Перенос парсинга tornerix.ru в ядро — тенант `tornerix-ru` (2026-07-24/25, локально)
24.07.2026
№ 12
`sitemap.xml` пустой у всех тенантов — генератор мёртвый и упал бы с фатальной ошибкой
24.07.2026
№ 11
Полная сверка и синхронизация локали и прода по всему проекту (2026-07-24)
24.07.2026
№ 10
Прод отставал от локали по общим (не тенант-специфичным) файлам — найдено при переносе тенанта `kepeidapump-ru`
24.07.2026
№ 9
Сломанные страницы в `app/Http/Controllers/Admin/` (найдено при проходе по контроллерам, исправлено 2026-07-26)
24.07.2026
№ 8
Хардкод секретов и tenant-специфичной (Сочи/uklimana-ru) логики в общем коде
24.07.2026
№ 7
Конкретные логические баги
24.07.2026
№ 6
Мёртвые дублирующие методы (оставлены, не удалены — код не закомментирован)
24.07.2026
№ 5
Таблицы без колонки `tenant_id` (архитектурный пробел, не просто забытый фильтр)
24.07.2026
№ 4
SQL injection: сортировка/список без allowlist
24.07.2026
№ 3
`$this->bindings` vs `$this->params` — фильтры молча не применяются
24.07.2026
№ 2
Критично: SQL обращается к несуществующим таблицам (`m_`-префикс)
24.07.2026
№ 1
Критично: утечки данных между тенантами
24.07.2026
№ 0
Критично: IDOR + фрод — отмена чужого заказа и кража его бонусов
24.07.2026
✕
источник: