Позначки: [ФАКТ ✔] виміряно (аудитором або лінзою власним запуском) · [ФАКТ ◔] прочитано в коді, з адресою · [ГІПОТЕЗА] без прямого доказу · [ПИТАННЯ] вирішує власник. Адреси — файл:рядок у vs-cad/src (= web-app/src). Сервер, авторизація й інтеграції не оцінювались (сторона ІТ). Секунди — з хмарної пісочниці без відеокарти.
Звіт аудиту
Відповіді Богдану, 12 знахідок, розкрій, ядро і кромки, гроші, мертве, старт, доки, історія, пропозиції · 00_ЗВІТ_АУДИТУ_13-10.md

Що аудитовано. Код C:\Works\slabcut-agent-pack\vs-cad (VS CAD + Studio на ядрі OCCT, ?mode=studio; саме його піднімає кнопка ПІДНЯТИ_СТУДІЮ_OCCT_7177.bat) станом на 12.10, вечір. Знімок звірено з диском: усі 666 файлів src/ на місці, розміри збігаються, два файли відрізняються лише закінченням рядка (CRLF). web-app на диску має ті самі 666 файлів з тими самими розмірами, крім одного: constructor/docs/DocsTab.tsx. Тобто сьогодні це одна програма у двох теках. Документація: знімок InstructionsRules — 223 md/txt. Не брали кейси клієнтів, а також частину архіву 08 і ринкові дослідження, бо вони не про код. Бази для порівняння:

Як. Сім лінз паралельно, кожна — окремий звіт з адресами файл:рядок (додатки L1–L7, ≈3 100 рядків фактури):

Окремо зроблено реєстри: 03 (мертве й задвоєне), 04 (дерево коду), 05 (стан знахідок 02.09). Зонди (пробні тести й скрипти) жили лише у власних копіях:

Код проєкту не змінювався. Потім аудитор (Лео) власноруч перевірив ключові знахідки — список у розділі 9.

Позначки достовірності.

Рішень у цьому документі немає. Пропозиції зібрані окремим блоком наприкінці (розділ 10).

Межі. Не оцінювались (сторона ІТ; де торкається — позначено «[сторона ІТ]»):

Усе міряно в хмарній пісочниці: 2 ядра, графіку малює процесор. Абсолютні секунди там гірші, ніж на твоєму ПК, тому порівнювати варто між собою.

Ворота на момент аудиту [ФАКТ ✔]:

13.10 02.09
vitest 1 856 пройшли / 2 впали / 19 пропущено (217 файлів, 407 с) 1 203 / 1
tsc 418 430
eslint 609 повідомлень (564 помилки, 45 попереджень) 482 помилки
Код src/ 666 файлів / 146 898 рядків 343 / 88 543

Два червоні тести — ті самі «відомі»:

Пропущені 19 тестів — нативні тести Бруно, вмикаються змінною CAD_PROFILED_BASE_NATIVE=1.


0. Відповіді на твої питання — коротко

«Може, все через те, що в Студії вшиті CAD і білдінг? Чи вони мертві, поки ми в них не зайшли?»

Вони сплять і не гальмують [ФАКТ ✔, L7 + L3].

Вкладки конструктора лінуються — їхній код вантажиться лише при вході, до того його в браузері немає:

Що від них таки лежить на старті:

Що Обсяг на старті Хто тягне Виконується
Модуль креслень CAD 107 КБ діалог DXF-експорту на дошці 8 % коду
Бічна панель BUILDING 37 КБ — 6 % коду

Виконується лише оголошення — без дотику вони нічого не роблять.

MES-симуляції (src/mes, 3 090 рядків) у збірці немає взагалі: її ніхто не імпортує.

«Може, файли з кодом великі, ми тисячу років аудитів не робили?»

Так, код подвоївся за 41 день, а мертве з 02.09 не прибрано [ФАКТ ✔, L3]. Але старт від цього повільний на пів секунди, а не на десятки секунд [ФАКТ ✔, L7].

Що виросло:

Що 02.09 13.10
Рядків коду 88,5 тис. 146,9 тис.
Редактор деталі в 3D (Detail3DPreview.tsx) 2 914 3 530
Редактор виробу (ProductEditorWorkspace.tsx) 2 558 2 974, з них один компонент — 2 298 рядків
Мертвих файлів 9 17

Ще сім функцій довші за тисячу рядків. З мертвого, знайденого 02.09, не видалено жодного файла.

Старт:

Де насправді довгі секунди [ФАКТ ✔, заміри 12.10 + L2 + L7]:

  1. Перше 3D-вікно: створення полотна і карти відблисків — 9 с у пісочниці. На справжній відеокарті має бути в рази менше [ГІПОТЕЗА].
  2. Холодне ядро OCCT: запуск 4,5–6 с і ~0,5 ГБ пам'яті до закриття вкладки.
  3. Зміна кромки на дузі: 82 % часу — віднімання. Перший спосіб віднімання на стику дуги з прямою щоразу ламається, тож ядро робить три віднімання поспіль.

«Що ще можна зробити з кромками?» Є реальний важіль [ФАКТ ✔, зонд L2]. Інструмент фрези вздовж «пряма → дуга → пряма» можна будувати однією трубою, а не шматками. На твоїй Г 1200 (R350, кромки на B–D):

Кромка Зараз Однією трубою
L20 4,4 с 0,39 с
xd_20 4,7 с 0,44 с
ar_20 1,6 с 0,26 с
d_20 26,6 с 0,73 с

Для L20, xd_20 і ar_20 тіло виходить те саме до кубічного міліметра. Для d_20 різниця −186 мм³ — це хорди старого лофта, на який тепер відкочується ядро.

Інші варіанти секунд на зміні кромки не дадуть: кеш інструментів, два потоки ядра, менша збірка OCCT (розділ 3).

План Б (кромка кольором) тепер не обов'язковий. Гроші, метраж, розкрій, DXF і PDF від 3D-тіла не залежать — вони рахуються з 2D. План Б дав би лише миттєву картинку ціною 3D без профілю.


1. Головне — дванадцять знахідок

  1. Після зсуву вирізу DXF на верстат бере отвір зі старого місця. [ФАКТ ✔ — перевірено аудитором власноруч]

    • Причина. Кеш точних контурів упізнає деталь за зовнішнім контуром і кількістю вирізів, а не за їх місцем (kernel/exactParts.ts:24–27). Скидання кешу немає (kernel/cutOutlines.ts:65–72).
    • Що зачіпає. Якщо в межах сесії посунути чи змінити виріз, до перезавантаження сторінки виріз зі старого місця беруть:
      • дошка;
      • колізії;
      • DXF на верстат;
      • креслення PDF і бланк;
      • CombiCut.
    • Доказ. Зонд з реальним ядром: отвір у DXF на x≈450 замість ≈1450.
    • Кого стосується. Будь-якої деталі з дугою (радіус кута, круглий отвір) — тобто майже кожної стільниці з мийкою.
    • Де ще. Та сама вада є в знімку MR !8 (kernel/exactParts.ts:167–170). Чи вона на проді — не перевіряв [ПИТАННЯ].
    • Виправлення. Один рядок ключа плюс тест-сторож — пропозиція 10.1.
  2. Розкрій, поки чекає ядро, губить правки людини. [ФАКТ ✔ — перевірено]

    • Як губить. Розкрій бере знімок проєкту до очікування (store/slices/packingSlice.ts:105–115) і після приходу контурів записує його назад (:204–205).
    • Що зникає. Доданий сляб, правка шапки, посунута деталь, навіть Ctrl+Z.
    • Друга вада — «вішає» розкрій. Правка під час роботи потоку розкрою відкидає його відповідь (projectSlice.ts:20 → packingSlice.ts:224), а крутилка isPacking лишається увімкненою. Кнопки сірі, «Зберегти в кабінет» відмовляє.
    • Без межі. Очікування ядра не має ні таймауту, ні обробки помилки.
  3. Гроші: метраж кромки №250 на Г/П з радіусом чи фаскою кута завищений на 43–50 %. [ФАКТ ✔ зонд L6]

    • Приклад. Г 2400×1600 з R100 при припуску 0: сума кромки 11 357 мм при периметрі 7 957. Сторона F рахується як 4 000 замість ~1 600.
    • З припуском 10. У метраж іде контур уже з припуском.
    • Адреса. engines/geometryUtils.ts:435–458.
    • Чому тест не бачить. Тест №250 перевіряє Г лише без кутів.
  4. Гроші: прямокутний виріз зі скругленими кутами рахується як круглий отвір. [ФАКТ ✔ — код + зонд L6]

    • Причина. Перевірка «схожий на коло» дивиться, чи вершини рівновіддалені від центру (engines/productionFacts.ts:171–184). У скругленого прямокутника всі вершини стоять біля кутів — і він «стає колом».
    • Наслідок — інша послуга:
      • варильна 562×492 R5 → «великий отвір» 2,1 м замість «периметра вирізу»;
      • розетка 80×80 R10 → «малий отвір» 1 шт;
      • мийка R10 — так само.
    • Регрес після 25.09 [ФАКТ ◔].
  5. Гроші: метал рахується як камінь, і 39 з 70 профілів кромок дають нуль. [ФАКТ ✔/◔ L6]

    • Метал. Факти виробництва відсівають лише фанеру (productionFacts.ts:245–250). Труба 2 м дає 4,08 м «різу пилою». Її площа йде в «Матеріал», «Монтаж», «Пакування» і в замовлення ERP.
    • Профілі без правила. 39 з 70 профілів кромок (серед них l_20) не мають правила й мовчки дають нуль у кошторисі (domain/serviceMapping.ts:313–349). На 02.09 таких було 38.
  6. Кромки: усі секунди йдуть на віднімання, і найгірший випадок ніхто не сторожить. [ФАКТ ✔ зонд L2]

    • Розклад часу. На Г власника: віднімання 82 %, перевірки 7–12 %, інструменти 6–9 %.
    • Три віднімання замість одного. Перший спосіб («одним списком») на стику дуги з прямою завжди дає зламане тіло. Тому кожна правка платить три булеві операції (occtBuilder.ts:941–990).
    • Найгірший випадок. Г власника з d_20: перевірка не сходиться, ядро відкочується на старий лофт — 26,6 с (occtBuilder.ts:863–869). Сторожі цього не тримають.
    • Вихід. «Одна труба» — розділ 0.
  7. Кеш плити з кромками (№278) витісняється точними контурами розкрою. [ФАКТ ✔ — перевірено]

    • Причина. Кеш має лише 2 місця на ядро (kernel/occt/profiledBaseCache.ts:13). У нього ж пишуть точні контури розкрою (kernel/occt/outline2D.ts:206).
    • Наслідок. Після двох контурів деталей з вирізами зсув вирізу в редакторі займає 3,9 с замість 0,2 с.
    • Чия помилка. Це недогляд у моїй №278: плиту без кромок кешувати нема сенсу.
  8. Старт: 6,1 МБ коду на кожну сторінку, і 71 % з нього не виконується. [ФАКТ ✔ L7 + перевірено]

    Що лежить на старті Обсяг Звідки
    Бібліотеки документів (pdf.js, xlsx, jspdf, html2canvas, react-dom/server) 1,67 МБ потрібні лише за кнопками
    3D-рушій 1,21 МБ App.tsx:38 статично імпортує редактор
    Вшиті дані (креслення кромок, переклад, довідка, теми Стоуника) ~1 МБ —
    Тестові дані — main.tsx:14 → engines/__tests__/mockData.ts:103

    Тестові дані потрапили в бойову збірку (є в карті джерел main-*.js), і з ними на кожному старті ганяється explodeDetails.

  9. Що працює без дотику. [ФАКТ ✔ L7]

    • 3D малює кадри безперервно, поки відкрите, навіть коли нічого не змінюється. У коді жодного frameloop, тож працює режим за замовчуванням «завжди».
    • Очі Стоуника анімуються 45 с після кожного дотику. У пісочниці це дорого, бо графіку малює процесор; на справжній відеокарті — копійки [ГІПОТЕЗА].
    • Схована плашка ядра оновлюється таймером кожні 0,7 с.
    • Чого немає: мережевих опитувань і потоків на старті.
  10. Персональні дані в коді. [ФАКТ ✔ — лише лічильник, значень не відкривав]

    • Що. mes/data/orders.ts містить поля customer з прізвищами клієнтів п'яти реальних кейсів.
    • Чому ризик. Файл лежить у src/ і їде в GitLab разом із кодом. Сам модуль MES ніким не підключений. Правило «персональні дані — не в репозиторій» порушене.
  11. Процес: робота лише на диску, дві теки, «відомі» червоні тести. [ФАКТ ✔ L5 + перевірено]

    • Не в GitLab. 44 файли (+4 358 / −285 рядків, №270–№278) лежать лише на диску.
    • Знімок MR !8. Він уже містить №267–№269, хоча журнал і ПАМ'ЯТЬ кажуть, що ні.
    • Дві теки. web-app і vs-cad — одна програма. Кожну правку робимо двічі руками. Правило «файли патчу різні в копіях» (ПАМ'ЯТЬ_ЛЕО §2.8) застаріло.
    • Червоні тести. Два тести 5+ тижнів пишуться як «відомі» — новий червоний тест сховається серед них.
  12. Доки відстали від коду на місяць. [ФАКТ ✔ L4]

    • OCCT мовчить. Головні доки не згадують OCCT жодного разу: АРХІТЕКТУРА, MANIFEST, БІЗНЕС, КАРТА_МОДУЛІВ, ПЛАН_І_СТАН, README, СТАРТ, ДЛЯ_НАСТУПНОГО, КАРТА_ПАПОК.
    • Неописані теки. Вісім нових тек коду (149 модулів, ~29 тис. рядків) не описані.
    • Числа не збігаються:
      • у доках 17 різних кількостей тестів (факт — 1 856);
      • тем Стоуника 71 + 21, а не 66 + 21.
    • Вхід адміна. Доки пишуть «PIN», а з №263 це логін і пароль.
    • Ціни на сервері. СПІЛЬНІ_НАЛАШТУВАННЯ пишуть «гроші на сервер не їдуть», а код возить прайс-бук разом із калібрувальними цінами (store/settingsSync.ts:63–86).

Що стало краще з 02.09 — чесно, теж виміряне:


2. Розкрій — що змінилось і де тонко (L1)

Конвеєр сьогодні. Кнопки на дошці (SlabBoard.tsx:1044–1111) запускають runPacking → triggerPackingAsync (packingSlice.ts:56). Далі:

  1. нормалізація проєкту;
  2. getAllProjectDetails;
  3. explodeDetails (engines/geometry.ts:2588);
  4. нове з №246 — чекаємо точні контури ядра: cutOutlineProvider().prepare (:100);
  5. finishPacking, у якому на сляби йде лише камінь (stoneParts, №256);
  6. потік розкрою autoPack (engines/packing.ts:1851);
  7. колізії по точному контуру (detectConflicts, :1916);
  8. текстури.

Повна схема з адресами — 02_МАРШРУТИ_ОПЕРАЦІЙ_13-10.md, розділ 2.

Очікування ядра [ФАКТ ◔ + ✔]:

Перший розкрій після відкриття проєкту:

Сторінка Результат
До №277 висла 5,5 с на 6,8 с
Тепер жива на 8,2 с

Заміри 12.10, пісочниця. З прогрівом ядра — 0,5 с (проба, пропозиція 10.5).

Відкрите з 02.09 [ФАКТ ✔]:

Нове:

Тести розкрою: 20 файлів, 142 тести, усі зелені [ФАКТ ✔].


3. Геометрія, ядро OCCT і кромки (L2)

Ланцюг від чернетки до тіла [ФАКТ ◔]: чернетка → modelFromDraft → KernelModel → черга прев'ю → кеш складань №275 → потік ядра №277 → occtBuilder.buildAssembly → кеш плити №278 → buildShapeUncached → тіла → three.js.

Паралельно живуть:

Схема з адресами — 02_МАРШРУТИ розділ 1 і L2 §1.1.

Скільки «правд» про контур. Дві живі незалежні математики: розкрій (engines/geometry.ts:1749) і 3D/ядро (baseContour → shapeBuilder). Ще одна схована: бланк approvalSplit, під адмін-щитком. На 02.09 їх було шість.

Одна й та сама дуга розбивається сімома способами — 12 / 28 / 36 / 42 / 64 / 256 хорд і точна дуга.

Де ядро головне, де легасі [ФАКТ ◔]:

Що Хто будує
Плита, вирізи, вус, кромки, доповнення, гнуті смуги ядро — і в редакторі, і в 3D Підборі
Мийки й метал у 3D Підборі досі старий будівник (ProductElement3DNode.tsx:479–519)
Решітка зливу в редакторі не малюється
Переріз кромки в «Документах» каталог SVG, а не тіло

Відкат усього на старий будівник — ?kernel=legacy / VITE_KERNEL=legacy.

Кромка в 3D — лише картинка [ФАКТ ✔]. Тіло з кромками читають лише показ і стенд. Точний 2D-контур для цеху будується без кромок (kernel/occt/outline2D.ts:205).

Заміри (node, синтетичні деталі) [ФАКТ ✔]:

Деталь Перша побудова Що всередині
Прямокутник з ar_20 0,23–0,45 с —
Г власника R350 + L20 на B–D 4,07 с віднімання 3,35 с, 8 булевих
Те саме + виріз 4,31 с зсув вирізу з кешу — 0,24 с
Прямокутник з чотирма різними кромками 2,09 с —

Г зі старим лофтом (?arcs=0) — 11,1 с.

Кеш складань №275 повторює ту саму модель за 1 мс. Але жоден кеш не допомагає зміні самої кромки: це завжди нова модель.

Варіанти для кромок, з числами [ПРОПОЗИЦІЯ, виміряно]:

Варіант Виграш на зміні кромки Ціна / ризик
(д) Одна труба вздовж гладкого ланцюга секунди: Г 3,5–4,4 → 0,3–0,4 с; найгірший 26,6 → 0,7 с; тіло те саме треба повторити всю логіку шляху фрези: часткові кромки, «наскрізь», drop, кільце вирізу, овал; скан як у №276
Злиття однакових станцій на прямих + призма −50…−70 % (сотні мс) мала
Фаска/радіус самим ядром (43 з 70 профілів) 0,06–0,15 с інша поведінка на дотичних дугах — потрібні правила
План Б (кромка кольором) 0,01–0,14 с 3D без профілю; гроші, розкрій, DXF не змінюються
Інкрементальне віднімання 0,3–1,4 с базу «без зміненої сторони» треба рахувати наперед — вона коштує як повна побудова
Кеш інструментів не секунди (інструменти — 6–30 % часу) —
Два потоки ядра не про кромки +~0,5 ГБ на потік
Менша збірка OCCT лише холодний старт —

Діри, що перейшли в ядро [ФАКТ ✔]:


4. Гроші — два рушії і їхні дірки (L6)

Після 03.09 рушіїв два — «Комерційну пропозицію» видалено [ФАКТ ✔]:

Кошторис Прорахунок
Рушій engines/estimate.ts engines/quoteCalc.ts
Звідки кількості факти → правила власна математика за площею партів

Ядро OCCT гроші не використовують. Правило ціни одне для обох (manual ?? erp ?? 0, ручна — лише в калібруванні), але функцій дві (estimate.ts:176, quoteCalc.ts:191).

Три закони метражу кромки і три площі [ФАКТ ✔ зонд]:

Площа на синтетичному проєкті:

Документ Площа
Кошторис 8,871 м²
Прорахунок 8,044 м²
«Загальна площа» в бланку 8,871 м²

Різниця — чаша мийки й метал.

Відкрите з 02.09 і нове [ФАКТ ✔ зонди L6]:

Закрито: коди радіусних послуг за матеріалом — обидва документи дають один код [ФАКТ ✔].


5. Мертве, важке, хардкод — і що вшито в Студію (L3)

Розміри [ФАКТ ✔]:

02.09 13.10
Файлів / рядків 343 / 88 543 666 / 146 898
Код без тестів 227 / 72 218 431 / 117 217
Тестових файлів 103 218

Функцій довших за 1 000 рядків — 7:

Чотири UI-гіганти (SlabBoard, Viewer3D, ProductEditorWorkspace, Detail3DPreview) дають 192 із 418 помилок tsc — 46 %, як і 02.09. Повний топ-25 — L3 §3.2. Дерево — 04_ДЕРЕВО_КОДУ_13-10.md.

Мертве [ФАКТ ✔ knip + граф]:

Реєстр — 03_МЕРТВЕ_І_ЗАДВОЄНЕ_13-10.md.

Задвоєння [ФАКТ ✔]:

Що 02.09 13.10
Однойменні функції 116 245
З ідентичним тілом 42 77
«Точка в полігоні» 7 11
Площа полігона 5 15
Округлення 10 23
Межі полігона 4 19

Блочного копіпасту мало (jscpd 0,54 %).

Межа «ядро не знає UI» порушена [ФАКТ ✔]:

Хардкод [ФАКТ ✔]:

Що вшито в Студію (статика + живі заміри, L3 + L7) [ФАКТ ✔]:

Частина На старті? Робить щось без дотику? Скільки
CAD / конструктор (вкладки) ні, ліниві ні 0
Модуль креслень CAD так, через діалог DXF на дошці ні (8 %) 107 КБ
BUILDING (план, розкладка, відомість) ні, ліниві ні 0
Бічна панель BUILDING так ні (6 %) 37 КБ
MES-симуляція немає в збірці ні 0
CombiCut / верстат ні, лінивий ні 0,9 КБ типів
Стоуник так так: очі 45 с після дотику, 1 запит ШІ на старті, таймер дрімоти 178 КБ
Ядро OCCT, код у головному потоці так (будівник — 29 КБ зайвих) плашка-таймер 0,7 с 112 КБ
Ядро OCCT, потік + wasm ні — стартує за першою потребою після запуску — тиша потім 50 МБ wasm, +324…444 МБ пам'яті
3D-рушій так, через статичний імпорт редактора відкрите 3D малює безперервно 1 214 КБ
Бібліотеки документів так ні 1 671 КБ
Дані в коді так ні ~1 006 КБ

6. Швидкість, старт і пам'ять (L7 + заміри 12.10)

Секунди 12.10 — «до» — це прод, MR !8; «після» — диск, №274–№278; пісочниця:

Сценарій До Після
Зсув мийки на Г з L20 8,6 с (висне 8,6) 0,8 с (не висне)
Редактор кухні — відкрити 37,1 с 1,3 с
3D Підбір — перший вхід 28,2 с 4,2 с
3D Підбір — повторно 26,8 с 1,5 с
Перше відкриття редактора, ядро холодне 21–33 с 17–24 с
Додати L20 на сторону 7,9 с 5,9 с (не висне)

Таблиця на 17 сценаріїв — 02_БАГИ_І_БОРГИ\ЗАМІРИ_12-10_ШВИДКІСТЬ_І_СТОУНИК.md.

Де довго і куди Стоуника — вирішено 12.10:

  1. редактор, перша деталь на холодному ядрі: 17–24 с порожньої сітки;
  2. зміна кромки — 2,4–5,9 с;
  3. перший розкрій після відкриття — чекає ядро 5,6 с;
  4. 3D Підбір — Стоуник уже стоїть (№274).

Проба прогріву ядра — лише пісочниця, requestIdleCallback після старту [ФАКТ ✔]:

Без прогріву З прогрівом
Редактор, перша деталь 16,7–17,3 с 9,6–10,0 с
Перший розкрій 5,6 с 0,5 с
Старт сторінки не висне не висне

Ціна прогріву — ~0,3–0,5 ГБ пам'яті в кожного користувача одразу.

Звідки пам'ять ядра [ФАКТ ✔ L7]:

Частина Розмір
Файл wasm 50,3 МБ (13,9 gzip / 9,6 brotli), 207 968 функцій
Купа JS потоку ядра 148 МБ зайнято з 192 (24 878 прив'язок OpenCascade.js до C++)
Пам'ять wasm 100 МБ зарезервовано, 13–20 зайнято

Як прод віддає .wasm — стиснення, кеш — у репозиторії не описано [сторона ІТ].

Що прибрати зі старту [байти — ФАКТ ✔ з розмірів; час — ГІПОТЕЗА]:

Крок Що Обсяг Складність
А Бібліотеки документів і довідка — по кнопці −1,95 МБ (32 %) мала
А + Б Плюс креслення кромок, словник en/pl, теми Стоуника −2,83 МБ (46 %) —
А + Б + В Плюс 3D-рушій −3,86 МБ (63 %) велика

Що дасть А + Б: ≈ −0,85 МБ стисненого, −0,1…0,17 с процесора на старті, −1,4 с на каналі 5 Мбіт/с.

Це прибирання для порядку і повільних каналів — не ліки від 10–20-секундних очікувань.


7. Доки проти коду (L4)

Звірено 216 тверджень живих доків:

Вердикт Тверджень
Збігається 103
Розходиться 73
Частково 38
Не перевірити кодом 2

Головне [ФАКТ ✔] — крім знахідки 12:

Вхідні точки розірвані:

Борги не збігаються:

Терміни:

Стоуник учить застарілому. Тема «Кнопки й пуш» (stounik/leoTopics.ts:146) і ПАМ'ЯТЬ §3 досі вчать пушити скриптами 05.10, які №261 заборонив.

Карта «ядро / легасі» в ПАМ'ЯТЬ_ЛЕО §4 збігається з кодом у 12 пунктах з 13. Хибний один: бандажі по дугах уже на ядрі (№251).


8. Історія 02.09 → 12.10 і стан знахідок 02.09 (L5)

За 40 днів — 196 записів журналу (№86–№278). Майже весь код написала одна лінія (Мікеланджело → Да Вінчі → Лео). Бруно — пакетами через рев'ю, ІТ — через чотири зведення.

Помічники майже не працювали:

12 знахідок 02.09 [ФАКТ ✔ — перевірено в коді]:

Стан Скільки Які
Закрито 4 №2, №3, №8 — кодом; №1 — рішенням А-1
Змінилось 2 №5, №12
Відкрито 6 №4 (профілі без грошей), №6 («Групувати деталі»), №7 (проточки й решітка не в грошах), №9 (подвійний рахунок), №10 (три моделі стику), №11 (тест боргу №2)

10 пропозицій 02.09: зроблено 1, майже 1, частково 4, не зроблено 4.

54 питання 02.09 — у файлі їх 54, а не 46, як писав журнал №85:

Стан Скільки
Відповідь або зроблено 13
Частково 8
Без відповіді 29
Не перевірено 4

Таблиця з адресами — 05_СТАН_ЗНАХІДОК_02-09.md.

Майже-втрати. За 6 тижнів було щонайменше 5 майже-втрат того самого класу, що 22–23.08: №226, №233, №244, №261 (двічі). Усі спіймані звірками, тож механізм ризику живий, а запобіжник працює [ФАКТ ◔].

Рішення власника. ≈35 рішень з 02.09 живуть лише в журналі й ПАМ'ЯТЬ_ЛЕО §5. MANIFEST заморожений на 2.60 (01.09), і його пункт 2.54 суперечить коду.


9. Що не перевірено і де межа

Що аудитор перевірив власноруч [ФАКТ ✔]:

Межі:


10. Пропозиції — не рішення, для розгляду

Термінове і дешеве — кожне кілька рядків плюс тест-сторож:

  1. Ключ кешу точного контуру — додати геометрію отворів (координати, а не кількість) і сторож «зсув вирізу → новий контур у DXF і PDF». Перевірити, чи робили експорти після правки вирізу без перезавантаження (01_ПИТАННЯ А-1).

  2. Розкрій після очікування ядра — зливати результат у поточний проєкт, а не в знімок. Також:

    • Ctrl+Z скидає квиток очікування;
    • межа очікування з переходом на ламану і чесним повідомленням;
    • відповідь потоку розкрою не відкидати через дії, що не міняють деталей, або скидати isPacking.
  3. Кеш плити №278 — не кешувати плиту без кромок (точні контури розкрою) і/або дати більше місць. Це моя доробка до №278.

  4. Червоні тести:

    • прибрати import type у engines/shapeBuilder.ts:2 (тип винести в domain/);
    • DXF-тест з чужим шляхом — skip з поясненням.

    Тоді «2 відомі» стануть «0».

  5. Прогрів ядра після відкриття сторінки — лише на комп'ютерах, ?warm=0 вимикає (проба готова, №279). Плюс Стоуник у трьох місцях з 12.10.

  6. Тестові дані з бойової збірки — mockData лише в DEV (динамічний імпорт).

  7. Прізвища клієнтів з mes/data/orders.ts — знеособити або не везти непідключений MES у GitLab.

Секунди на кромках:

  1. «Одна труба» для інструмента фрези на гладкому ланцюзі, плюс злиття станцій на прямих. Як перевіряти:

    • скан як у №276: усі кути, обидва дзеркала, профілі L20 / ar_20 / xd_20 / d_20 / t_20 / lv_40_inv, коло, П, виріз R40;
    • об'єм — не більше похибки перерізу;
    • перерізи — не більше 0,1 мм;
    • тіло валідне, одне.

    Сторож на d_20, бо зараз — 26 с.

Гроші — після твоїх відповідей на 01_ПИТАННЯ розділ Г:

  1. Виріз зі скругленими кутами — «виріз», а не «отвір»: класифікація за формою, не за вершинами.
  2. Метал — з фактів каменю.
  3. Метраж кромки №250 для Г/П з кутами і припуском — плюс тест на Г з радіусом і фаскою.
  4. Правила для 39 профілів, або читати EdgeProfileDef.operations, плюс тест «кожен профіль має правило».
  5. Стоп або попередження на замовлення в ERP з ручними цінами.
  6. Одна функція ціни для двох рушіїв.

Старт і фон:

  1. Ліниво вантажити бібліотеки документів (pdf.js / xlsx / jspdf / html2canvas / react-dom/server) і довідку: −1,95 МБ, мала складність.
  2. 3D — режим «малювати лише при змінах» (frameloop="demand"). Ризик: усе, що рухається, має саме просити кадр. Перевіряти оком.
  3. Будівник ядра — з головного потоку.

Процес:

  1. Пакет №270–№278 у GitLab — окремою гілкою поверх MR !8, до наступного зведення з ІТ.
  2. Одна тека замість двох (web-app = vs-cad): спершу вирішити, який DocsTab.tsx правильний.
  3. Ревізія живих доків під OCCT:
    • числа (тести, tsc, теми Стоуника) — в одному місці (ПАМ'ЯТЬ §3), решта посилається;
    • закрити 17 боргів, закритих кодом;
    • поправити розірвані посилання.
  4. Мертве (17 файлів, ≈900 рядків мертвих блоків, 9 npm-пакетів) — пакетом після твого «так». Рішення 23.08 «не чіпати» досі чинне.

Додатки:

Код не змінювався. Зонди жили у власних копіях пісочниці й на диск не йдуть.


11. Дописи агентів — що змінено і як тепер працює

Розділ для майбутніх правок за цим аудитом. Як у 02.09: кожна правка — зелений блок «ВИПРАВЛЕНО <дата> · <номер журналу> · рішення власника», що зроблено і як тепер працює. На 13.10 правок за аудитом ще не було.

Питання власнику
Питання у 7 групах — рішення твої · 01_ПИТАННЯ_ВЛАСНИКУ_13-10.md

Кожне питання побудоване так:

Зібрано із семи лінз, дублі злиті. Рішень тут немає.

Нумерація розділів:

Відповідати можна одним словом на номер, наприклад «А-1: так, Б-1: попередження».


А. Термінове

А-1. Експорти після зсуву вирізу.

А-2. Поки «рахую точні контури», правки губляться.

А-3. Прізвища клієнтів у коді.

А-4. Пакет №270–№278 не в GitLab.


Б. Розкрій

Б-1. Перепил 70 мм — без відповіді з 02.09 (Б-3).

Б-2. CombiCut: номінальний контур чи з припуском?

Б-3. «Перерахувати слеб».

Б-4. Ліва Г.

Б-5. Залишки 02.09 без рішення:

  1. Радіус кута робить деталь «кривою» для «Повної текстури» — розгортка підвороту вимикається (packing.ts:587–590). Так задумано?
  2. Дзеркалення з умовою «без обробки кромки» — доки кажуть три умови, код має дві (packing.ts:466–471). Додаємо?
  3. «Підбір текстури» має групувати вироби так само, як пакер? Зараз два ключі груп (geometryUtils.ts:20 і textureLayout.ts:37).

В. Кромки і ядро

В-1. «Одна труба» для кромок.

В-2. Профіль лише на одній стороні біля опуклої дуги.

В-3. Швидка картинка, поки ядро рахує.

В-4. Кромка під ногою і гнутий елемент на увігнутому куті.

В-5. Прогрів ядра.

В-6. CombiCut і легасі-підворот.

В-7. Межа верстата NC300.


Г. Гроші

Г-1. Калібрувальні ціни на сервері.

Г-2. Замовлення в ERP у калібруванні.

Г-3. Метал і фанера в грошах.

Г-4. Виріз зі скругленими кутами.

Г-5. Метраж кромки.

Г-6. «Стикування в площині».

Г-7. Профілі кромок без грошей.


Д. Старт, фон, що вшито

Д-1. Очі Стоуника.

Д-2. Імпорт бланка погодження.

Д-3. 3D малює безперервно.

Д-4. Ядро і CAD у бойовій Studio.

Д-5. Не підключене.

Д-6. Що їде в продакшн.

Д-7. [сторона ІТ] Віддача ядра на проді.


Е. Мертве і процес

Е-1. Мертвий код.

Е-2. Дві теки.

Е-3. Хвости, які бачать клієнт чи цех.

Е-4. 29 питань 02.09 без відповіді.


Ж. Доки

Ж-1. Де живе опис архітектури.

Ж-2. Числа в одному місці.

Ж-3. Борги, закриті кодом.

Ж-4. Де жити рішенням.

Маршрути операцій
Куди звертається кожна дія; «одна операція — два коди» · 02_МАРШРУТИ_ОПЕРАЦІЙ_13-10.md

Зведено з лінз L1 (розкрій), L2 (геометрія і ядро), L6 (гроші), L7 (старт). Адреси — від src/. [ФАКТ ◔] — прочитано в коді з адресою, якщо не позначено інше. Порівняння — з 09_АУДИТ_02-09/02_МАРШРУТИ_ОПЕРАЦІЙ_02-09.md.


0. Уявлення деталі — ланцюг сьогодні

Чернетка редактора (DetailDraft: розміри, кути, вирізи, кромки, мийки, проточки, доповнення-слоти, mirrorL)
 │
 ├─► 3D і ЯДРО ─ kernel/modelFromDraft.ts:158 → KernelModel
 │      контур: domain/baseContour → engines/shapeBuilder (точні ребра line/arc/ellipse)
 │      кромки: engines/edgeCutters.buildEdgeCutters → edgeLofts;  доповнення: engines/miterAssembly (план стиків)
 │   → kernel/useKernelAssembly.ts (пауза 300 мс №271; поки рахує — старе тіло на екрані)
 │   → kernel/previewScheduler (лише остання версія; запущену побудову НЕ скасовує)
 │   → кеш складань №275 (kernel/occt/assemblyCache.ts; ключ — уся модель; ≤8 / 64 МіБ)
 │   → потік ядра №277 (kernel/occt/workerClient.ts:30; один на сторінку; таймаут 120 с; стартує за першою потребою)
 │   → occtBuilder.buildAssembly (:1366) → buildShape (:791)
 │        є вирізи → кеш плити з кромками №278 (occt/profiledBaseCache.ts, 2 місця на ядро) + запобіжник
 │        інакше buildShapeUncached (:679): призма → вирізи → вус/фаска → cutEdgeTools (:839)
 │             без дуг: cutMany (одна булева);  з дугами: cutArcToolsChecked №276 (список → по черзі → нечітке)
 │   → сітка → передача в головний потік → three.js (Detail3DPreview, DetailMesh)
 │
 ├─► 3D ПІДБІР ─ kernel/productKernel.ts:271 — той самий modelFromDraft і та сама черга;
 │      мийки й метал у Підборі — СТАРИЙ будівник (components/3d/ProductElement3DNode.tsx:479–519)
 │
 ├─► РОЗКРІЙ ─ domain/elementToDetail.buildGeometry (:80) → engines/geometry.explodeDetails (:2588) → парти (ламана)
 │      → точні контури ядра для колізій (№246, kernel/cutOutlines) → пакер (engines/packing)
 │
 ├─► ДОШКА / DXF / PDF / БЛАНК ─ kernel/exactPartInput.ts:10 → той самий modelFromDraft
 │      → kernel/occt/outline2D.exactBlankOutline (:204–206, БЕЗ кромок) + лінії стиків + точний офсет припуску
 │      кеш: kernel/cutOutlines.ts (ключ kernel/exactParts.ts:24–27 — БЕЗ місця вирізів!)
 │
 └─► ГРОШІ ─ engines/productionFacts.ts (2D-полігони) → кошторис / прорахунок; ядро не бере участі

Що змінилось з 02.09:


1. Створення і зміна деталі

Дія Маршрут Час (пісочниця, 12.10)
Відкрити редактор, ядро холодне редактор → полотно 3D (getContext ~2,6 с) → карта відблисків (SceneLighting ~6 с) → лише потім запит до ядра → запуск OCCT 5,6 с → деталь 17–24 с порожньої сітки
Відкрити редактор, ядро тепле той самий шлях без запуску OCCT; повтор тієї самої моделі — з кешу складань 1,3 с (кухня)
Змінити розмір / кут нова модель → пауза 300 мс → повна побудова 0,3–4 с залежно від кромок на дугах

Ядро стартує після полотна, а не паралельно з ним [ФАКТ ✔ 12.10]. Ефект редактора, що просить деталь, React виконує вже після важкого ефекту полотна.


2. Зміна кромки

  1. Профіль у довіднику (domain/edgeProfiles…).
  2. Переріз фрези: engines/edgeCutters.ts (злиття однакових сусідніх сторін у пробіг :999–1088).
  3. Інструменти: призма на прямій, обертання на дузі №273/№276.
  4. Віднімання:
    • без дуг — cutMany (одна булева);
    • з дугами — cutArcToolsChecked: «список» → «по черзі» → «нечітке», плюс перевірки.
  5. Сітка.

Де час — Г власника, R350, L20 на B–D [ФАКТ ✔ L2]:

Частина Частка Деталі
Віднімання 82 % «список» завжди ламається на стику дуги з прямою, тож три булеві підряд
Перевірки 7–12 % —
Інструменти 6–9 % —
Сітка 2 % —

Кеш складань і кеш плити зміну кромки не прискорюють, бо це нова модель. Головний важіль — «одна труба» (L2 §4 д): 4,4 → 0,39 с.


3. Зсув вирізу

  1. Нова модель з тими самими кромками.
  2. buildShape: ключ плити без вирізів збігся → копія плити з кешу №278 → вирізати лише отвір → запобіжник nativeShapeGuard.

Час на Г власника: 4,0 → 0,16–0,24 с [ФАКТ ✔].

Підводний камінь [ФАКТ ✔ L2]: кеш має 2 місця на ядро, і в нього ж пишуть точні контури розкрою (outline2D.ts:206). Після двох контурів деталей з вирізами зсув знову займає 3,9 с.

Другий підводний камінь [ФАКТ ✔ L1]: кеш точних контурів не бачить нового місця вирізу. Дошка, DXF і PDF беруть старе місце до перезавантаження сторінки.


4. Розкрій

  1. SlabBoard.tsx:1044–1111 — кнопки режимів, з підтвердженням.
  2. runPacking (packingSlice.ts:301) → triggerPackingAsync (:56):
    • знімок для Ctrl+Z → normalizeProject → getAllProjectDetails → explodeDetails;
    • cutOutlineProvider().prepare (:100) — чекаємо ядро без межі (:112–115, без .catch);
    • при цьому стор отримує знімок проєкту й isPacking = true (:106–111).
  3. finishPacking(ЗНІМОК, контури):
    • на сляби йде лише камінь (stoneParts, №256);
    • замок nestingLocked, або потік розкрою (дебаунс 200 мс, packingRequestId).
  4. workers/packing.worker → autoPack (engines/packing.ts:1851) → validatePlacement по точному контуру.
  5. Відповідь: requestId ≠ поточного → відкидається, isPacking не скидається (:224). Інакше:
    • колізії (detectConflicts, :1916);
    • текстури;
    • статус;
    • збереження.

Входи без перерахунку (finalizeProjectState, projectSlice.ts:14–21) — сляби, шапка, ручні дії — збільшують packingRequestId. Тому правка під час роботи потоку «вішає» розкрій [ФАКТ ✔ L1].

Відкриття проєкту — loadWithoutPacking (projectHelpers.ts:93–120), без матеріалу (:115). Через це гнутий акрил отримує запас 30 % замість 20 %.


5. Точні контури → дошка, колізії, DXF, PDF, бланк, CombiCut

Хто Звідки контур
Дошка SlabBoard.tsx:100–101 useExactOutlines → PartShape.tsx:64–84; коли все пораховано — applyCutOutlines у стор
Колізії, межі, дефекти DetailPart.cutOutline — точний контур ядра в ламаній зі стрілою ≤0,3 мм
DXF на верстат kernel/exportCutDxf.ts (профіль «Combicut» — контур з припуском :96,179)
PDF розкрою і бланк погодження blueprintOutlinesFor (№249)
Вкладка CombiCut (лише CAD) engines/combicut/plan.ts:146 — номінальний контур
Пакет для MES, експорт PNG ламана (engines/mesPack.ts:401, App.tsx:559)

Скрізь, де з ядра, — один кеш з ключем без місця вирізів.


6. Гроші — два документи

Кошторис («Послуги для виробництва / BOM») Прорахунок («для клієнта»)
Рушій engines/estimate.ts engines/quoteCalc.ts + domain/quoteCalc.ts
Кількості productionFacts → правила serviceMapping (матеріал проєкту) власна математика: Σ площ усіх партів; autoQuoteServices (радіуси, стики за формою, мийка)
Метраж кромки geometryUtils.edgeLengthForSide (№250; завищення на Г/П з кутами) не рахує
Ціна manual ?? erp ?? 0, ручна лише в калібруванні (:176) те саме правило, своя функція (:191)
Куди далі замовлення ERP (production, лише рядки з кодом), MES, техкарта PDF КП, бланк погодження (кромка — по контуру з припуском, без дуг), замовлення ERP (lines, total)
Хто бачить вкладка — адмін; паспорт деталі — будь-хто, і без калібрування усі; прайс і коди — адмін

7. Зведена таблиця «одна операція — два (і більше) коди» [ФАКТ ◔/✔]

Операція Код 1 Код 2 (і далі) Наслідок
Контур деталі розкрій engines/geometry.ts:1749–1792 3D/ядро domain/baseContour → engines/shapeBuilder дві живі математики (02.09 — шість); дефолти Г різні (geometry.ts:1781 900/500 проти 500/400 і 600/600)
Дуга кута 12 хорд (розкрій) 28 / 36 / 42 / 64 / 256 / точна сім дискретизацій
Ключ кешу складань — уся модель точних контурів — без місця вирізів старий виріз у DXF/PDF
Метраж кромки кошторис (geometryUtils) бланк (quotePdf.ts:1056–1063, з припуском, без дуг); прорахунок — немає три закони
Площа кошторис 8,871 м² прорахунок 8,044 м² різниця — чаша мийки й метал
Виріз / отвір класифікація «коло» за вершинами (productionFacts.ts:171) форма вирізу в чернетці (rect + cornerRadius) скруглений прямокутник = «отвір»
Камінь чи ні розкрій: stoneParts (фанера й метал не йдуть на сляб) факти грошей: відсівається лише фанера метал у «різі пилою»
Стики в грошах кошторис — фактичні шви прорахунок — за формою (Г→1, П→2, пряма→0) різні кількості
Перепил 70 мм колізії знають (packing.ts:1947) пакер — ні (:302–342) «червоні» деталі після авторозкрою
Текстурні групи geometryUtils.textureGroupKey :20 textureLayout.textureGroupKey :37 Підбір текстури групує інакше, ніж пакер
Контур для CombiCut DXF «Combicut» — з припуском вкладка CombiCut — номінальний дві програми на один сляб
Мийки й метал у 3D редактор — ядро 3D Підбір — старий будівник різна картинка
Підворот під 45° 3D і правило 29.09 — без вуса CombiCut — 45° для легасі-підвороту —
Вхід адміна логін і пароль (№263) поле PIN у сторі й «PIN» у доках мертве поле
Межа NC300 3000×1600 (materialRules.ts:52) 3100×1500 (manufacturability.ts:29) дві правди
Стан знахідок 02.09
12 знахідок, 10 пропозицій, 54 питання — що з ними сьогодні · 05_СТАН_ЗНАХІДОК_02-09.md

Лінза L5. Перевірено в коді /tmp/final/vs-cad/src (= диск 12.10), не в доках. Адреси — від src/. Повний розбір — L5_ІСТОРІЯ_І_СТАН_ЗНАХІДОК.md §2–§4. Підсумок: знахідки — закрито 4 · змінилось 2 · відкрито 6. Пропозиції — зроблено 1 · майже 1 · частково 4 · ні 4. Питання (54) — відповідь 13 · частково 8 · без відповіді 29 · не перевірено 4.

12 знахідок

# Знахідка 02.09 13.10 Адреса / №
1 Робота 22–23.08 з'їдена зведенням; лупа падає ✅ закрито рішенням (А-1, лупу видалено №87); хвости: запас на гнутий акрил при відкритті, PDF-текстура, 8×TS2307, console.log, translate store/projectHelpers.ts:115, utils/export/pdfGeometry.ts:196, components/forms/shapes/RectangleDesigner.tsx:14
2 Дві математики розкрою ✅ закрито (№90 «один ніж», №190) engines/geometry.ts:2242; buildComplexRectPoints — видалено
3 Ліва Г: 3D ліва, розкрій права ✅ закрито (№89) domain/elementToDetail.ts:112–113 + mirrorAndSides.test.ts
4 Профілі кромок без грошей (38/70) ❌ відкрито — тепер 39/70 domain/serviceMapping.ts:313–349 (факт зникає мовчки)
5 Три математики грошей, пріоритет навхрест ◐ змінилось: КП видалена (№86), правило одне, але дві копії; замовлення з ручними цінами не стримується engines/estimate.ts:176, engines/quoteCalc.ts:191, components/ui/QuoteOrderCard.tsx:150
6 «Групувати деталі» — без дії, мертвий блок ❌ відкрито (блок ще й правили №260) components/3d/Viewer3D.tsx:1778, 1840, 664–1404
7 Проточки й решітка зливу — лише картинка ❌ відкрито в грошах (3D — на ядрі) 0 згадок у productionFacts/estimate/quoteCalc/quotePdf; engines/geometry.ts:1481
8 Кутовий стик ігнорується при довільному ✅ закрито (№90) domain/joints.ts:421–427; сторож contourBaseline.test.ts:166
9 Подвійний рахунок кутів доповнень і дуги ❌ відкрито (чекає «угоди з цехом») engines/productionFacts.ts:419, 433–437, 451–470
10 Три моделі стику; Прорахунок «за формою» ❌ відкрито engines/quoteCalc.ts:528–534; components/assembly/AssemblyConnectionsPanel.tsx:15
11 Борг №2: код закрив, тест і доки — ні ❌ відкрито (як було) engines/__tests__/fireplaceEndToEnd.test.ts:229–233; MANIFEST:872
12 Мертвий код ≈2 600 рядків, 6+3 залежності ◐ змінилось: прибрано КП, лупу, старі гілки стиків, buildComplexRectPoints, originalCornerPoints; лишилось 888 р. мертвих файлів, блок Viewer3D, залежності; materialRules тепер читає Стоуник core/*, components/2d/PlacementPropertiesPanel.tsx, components/ui/useCostPrices.ts, utils/slabTexture.ts, engines/sketchupExport.ts; stounik/checks.ts:23

10 пропозицій

# Пропозиція 02.09 13.10 Адреса / №
1 Повернути 22–23.08 + тристороння звірка після зведення ◐ повернення відхилено; звірка — практика (№226, №261), не правило MANIFEST 2.56 (01.09) — останній
2 Одна правда про контур + mirrorL + сторож ✅ майже (№89, №189, №190); П «на бік» поза спільним контуром domain/baseContour.ts:35, 95, 166
3 Один шлях різу стиків ✅ зроблено (№90); сторожа «сума площ» нема engines/geometry.ts:2242
4 Одна мапа «профіль → послуга» + тест ❌ ні 39/70 без правила
5 Одна функція ціни; стоп замовленню з ручними ◐ правило одне, функцій дві; стопу нема estimate.ts:176, quoteCalc.ts:191, QuoteOrderCard.tsx:150
6 П-14 — одне джерело miterJointFor ◐ розбіжність знято рішенням 29.09, джерел два engines/miterAssembly.ts:31–34, components/ui/ProductEditorWorkspace.tsx:361–387
7 Дедуплікація фактів; reflexCornerIds ❌ ні productionFacts.ts:419/433; domain/radiusElement.ts:242
8 sawOvercut у пакері; «крива» за формою ❌ ні domain/defaults.ts:29; engines/packing.ts:587–590, 1935
9 Мертве — пакетом або шапки ◐ лише попутно; шапок нема див. знахідку 12
10 Ревізія доків, числа в одному місці, словник ❌ ні живі доки — дати ≤ 01.09; MANIFEST — 01.09

Питання власнику (54; у журналі №85 написано «46»)

Що поруч (не з аудиту 02.09, але з тієї ж історії)

Мертве і задвоєне
Реєстр: мертві файли, мертве в живих, імпорти, залежності, задвоєння, хардкод · 03_МЕРТВЕ_І_ЗАДВОЄНЕ_13-10.md

Джерела: knip 6.41 (--reporter json/compact, у probe-копії), власний граф імпортів на AST TypeScript від main.tsx (статичні, import(), React.lazy, ?worker, new URL(…import.meta.url)), склад чанків бойової збірки зі sourcemap (vite build --sourcemap у probe-копії), tsc (ворота: 418), eslint (ворота), jscpd 4, grep. Сирі виводи — /tmp/final/audit1310/probe-L3/_l3raw/ (L3_knip.json, L3_knip_compact.out, graph.json, reach.json, chunks.json, dups.json, hard.json, heavy.json, jscpd-report.json, скрипти *.cjs). Код: /tmp/final/vs-cad/src (знімок 12.10 вечір). Адреси — відносно src/.

«Рішень» тут немає: стовпець «Стан» — лише факт і порівняння з реєстром 02.09. Позначки: ✔ — перевірено запуском/grep у цьому аудиті; ◔ — прочитано в коді з адресою.


1. Мертві файли (0 імпортерів поза тестами)

Збіг knip і власного графа — повний: knip «Unused files» = 18 (17 у src + App.css), граф — ті самі 17 ts/tsx.

Файл Рядків Доказ Що це Стан проти 02.09
core/geometry.ts 98 knip ✔; граф ✔ — імпортує лише core/snapping.ts стара копія lib/project.ts; 11 ідентичних функцій (тепер і rotatePoint) без змін (02.09: мертвий)
core/snapping.ts 215 knip ✔; згадка лише в коментарі engines/geometryUtils.ts:8 17 функцій — ідентичні components/2d/canvasUtils.ts без змін
components/2d/PlacementPropertiesPanel.tsx 204 knip ✔ панель кромок 2D, знята з UI 10.08 без змін (рядків стільки ж)
components/ui/useCostPrices.ts 179 knip ✔; шапка «ВІД'ЄДНАНО 01.09» (:2) хук Cost Service [сторона ІТ] без змін
utils/slabTexture.ts 178 knip ✔ процедурна текстура сляба без змін
engines/sketchupExport.ts 14 knip ✔; вміст — «ВИДАЛЕНО 27.08» + export {} заглушка без змін
arGen.ts 123 knip ✔; у корені vs-cad нема ar-gen.html прототип AR 27.08 було «dev-вхід», тепер без жодного входу
buildFotozona.ts 143 knip ✔; у корені vs-cad нема fotozona.html збірка фотозони 27.08 було «dev-вхід», тепер без жодного входу
components/3d/SafeEnvironment.tsx 47 knip ✔ «студійне світло, яке не валить сцену» новий мертвий (02.09 — живий)
kernel/useKernelGeometry.ts 54 knip ✔; замінений kernel/useKernelAssembly.ts (шапка :6) хук ядра новий
mes/MesTab.tsx 304 knip ✔; граф — 0 імпортерів вкладка симуляції цеху МЕС новий; МЕС у застосунок не підключений
mes/render.ts 199 knip ✔ — імпортує лише мертвий MesTab малювання карти цеху новий
shell/workspaces.ts 23 knip ✔ ліниві входи робочих просторів vs3d / constructor / architecture новий; задуманий поділ не підключений
shell/useCan.ts 16 knip ✔ хук прав новий
workspaces/architecture/index.tsx, workspaces/constructor/index.tsx, workspaces/vs3d/index.tsx 9 + 11 + 5 knip ✔ — імпортує лише мертвий shell/workspaces.ts входи робочих просторів нові
App.css (не ts) 184 knip ✔ стилі легасі без змін

Разом мертвих ts/tsx: 17 файлів, 1 822 рядки (02.09: 9 файлів, ≈1 600). Видалено з реєстру 02.09: нічого — усі 7 мертвих файлів 02.09 лежать на місці.

Лише тести (у застосунку не використовуються, живуть завдяки тестам) — 6 файлів, 2 634 рядки ✔ (граф): mes/sim.ts 86, mes/data/codeArea.ts 1 304, mes/data/orders.ts 922, mes/data/shopMap.ts 103, mes/data/norms.ts 79 — увесь МЕС, крім мертвих MesTab/render; shell/capabilities.ts 140 (карта прав робочих просторів). Разом папка mes/ — 3 090 рядків, жоден не доходить до застосунку.

Ожили з 02.09:

Лише типи (у збірку не йдуть, це нормально): domain/types.ts, kernel/types.ts, constructor/drawing/model.ts.


2. Мертве всередині живих файлів

Адреса Що Розмір Доказ Стан проти 02.09
components/3d/Viewer3D.tsx:664–930 TexturedPart — використовується лише всередині двох наступних 267 граф викликів ◔ відкрито (02.09: 628–888)
Viewer3D.tsx:932–1096 EdgePartWrapper — лише в AssemblyGroup 165 ◔ відкрито
Viewer3D.tsx:1098–1396 function AssemblyGroup — ніде не рендериться 299 tsc TS6133 (1098,10) ✔ відкрито
разом блок 664–1396 733 було 726
Viewer3D.tsx:731 усередині мертвого TexturedPart — виклик неіснуючого useDetailShape 1 tsc TS2304 ✔ новий симптом мертвого блоку
Viewer3D.tsx:804, :838 умовні useMemo (eslint rules-of-hooks) — у мертвому TexturedPart — eslint ✔ —
Viewer3D.tsx:1778–1780 const groups = useMemo(buildAssemblyGroups…) — не читається; кнопка «Групувати деталі» :1840–1843 перемикає лише його — tsc TS6133 (1778,9) ✔ відкрито
components/ui/Detail3DPreview.tsx:79–100 ProfileMesh — 0 використань 22 tsc TS6133 ✔, grep ✔ відкрито (02.09: 63–84)
Detail3DPreview.tsx:3526–3530 export function useDetailGeometry — 0 викликів 5 knip ✔ відкрито
Detail3DPreview.tsx:1730, :1844 гілка бортика: const skirting = null + неіснуючий R3SkirtingGeometry ~100 tsc TS2304 ✔ відкрито
Detail3DPreview.tsx:34 імпорт ProductElement3DNode не використовується 1 tsc TS6133 ✔ новий
engines/packing.ts:543–553 groupedParts — не викликається 11 tsc TS6133 ✔ відкрито
engines/packing.ts:1130–1160 nearbyElementReliefPlacements — не викликається 31 tsc TS6133 ✔ відкрито
engines/packing.ts:106–108 rotatePoint — не викликається 3 tsc TS6133 ✔ новий
engines/geometry.ts:1659 jointNotices — масив лише поповнюється (:1686, :2489, :2550), ніхто не читає — grep ✔ відкрито
engines/geometry.ts:1469 «ОТВІР ПІД ВСТАВКУ ЗЛИВУ — ТИМЧАСОВО ВИМКНЕНИЙ (28.08, регресія)» — коментар ◔ відкрито (02.09: :1649)
engines/geometry.ts (02.09: :1880, :1913) блоки [CORNER-DEBUG]/[CUTOUT-DEBUG] з console.log — grep ✔ — у коді нема закрито; але ключі цих рядків лишились у словнику i18nStatic.ts:1757–1758
engines/geometry.ts (02.09: :80) scalePoints — grep ✔ — нема закрито
components/ui/HeaderToolbar.tsx:1, :9–10 весь перший імпорт + підписка packingMode/setPackingMode не використовуються 3 tsc TS6192/TS6133 ✔ відкрито
components/forms/shapes/RectangleDesigner.tsx:14 console.log("RECT SVG SRC:") рівня модуля 1 grep ✔ відкрито (два інших console.log 02.09 — закрито)
utils/edgeProfiles.ts:62–65 після return all; (:62) — недосяжні :64–65 з eslint-disable no-unreachable (eslint тепер каже, що директива зайва) 3 eslint ✔ відкрито (свідомо, 26.08)
store/useSettingsStore.ts:44, :70, :142, :279, :361 DEFAULT_ADMIN_PIN, поле adminPin, setAdminPin — після №263 (вхід логін+пароль, shell/adminLogin.ts) їх читає лише тест store/__tests__/adminPin.test.ts ~6 grep ✔ новий мертвий стан
engines/textureLayout.ts 22 експорти без споживачів — ті самі 22, що 02.09 (findMainLayout … buildViewBox) — knip ✔ відкрито, без змін
components/forms/import/approvalCanvasUtils.ts 12 експортів без споживачів — ті самі 12 — knip ✔ відкрито
domain/types.ts:69–74 поля [LEGACY] skirtings/wallPanels/legs; 14 типів без споживачів (було 15) — knip ✔ відкрито
Project.assembly.connections (domain/types.ts:1096) пише й читає лише сама AssemblyConnectionsPanel.tsx:15, :42 — grep ✔ відкрито
hooks/useIsMobile.ts useIsTouch, MOBILE_MAX_WIDTH, PHONE_MAX_SHORT_SIDE — без споживачів — knip ✔ відкрито
engines/miterAssembly.ts MITER_BIG, miterCutters, bottomMiterCutters — без споживачів назовні (miterJointFor ожив: kernel/shopSheets.ts:38) — knip ✔ змінилось
i18n.ts languageOptions, packingModeLabel — без споживачів — knip ✔ відкрито; невикористані ключі messages — не перевірено

Невикористані експорти (knip): 311 імен у 144 файлах src + 115 типів у 55 файлах + 15 файлів із дубльованим експортом (іменований і default — усі вкладки CAD для React.lazy). 02.09: 141 ім'я в 54 файлах + 58 типів у 26. Код виріс у 1,6 раза, невикористаних експортів — у 2,2 раза. Найбільші скупчення: engines/textureLayout.ts 22, kernel/occt/occtBuilder.ts 13 (використовуються всередині файла), approvalCanvasUtils.ts 12, domain/materialRules.ts 11, constructor/drawing/set.ts 7, domain/plywood.ts 6, utils/approvalImport.ts 6 + 6 типів, utils/export/zipArchive.ts 6, kernel/partCuts.ts 5. tsc «оголошено, але не читається» (TS6133/6196/6192/6199): 187 (02.09: 193).


3. Нерозв'язані імпорти (tsc TS2307 — 8; збірка Vite проходить, бо це import type)

Файл Хибний шлях Насправді Стан
components/ui/CornerContextMenu.tsx:3, JointContextMenu.tsx:3, CornerProcessingModal.tsx:7, CutoutProcessingModal.tsx:8, components/forms/shapes/RectangleDesigner.tsx:4, LDesigner.tsx:2 store/useDictionaryStore модуля нема; UiLanguage — domain/types.ts відкрито (6 з 6)
components/ui/LegModal.tsx:3, SkirtingModal.tsx:3 ../../../domain/types на рівень вище за потрібний відкрито
components/ui/DimensionsTable.tsx:8 — — закрито (у tsc нема)

Поруч — близькі до них помилки імен (TS2304/TS2305/TS2459): forms/shapes/*Designer.tsx:1 (6 файлів) — DetailDraft з domain/types не експортується; forms/import/DxfOverview.tsx:82–326 — типи DxfPoint/BindingAnchor не імпортовані; approvalCanvasUtils.ts:2 — EdgeProfileType не експортований з approvalImport.ts. Небезпечні для виконання (ім'я значення, не типу): components/ui/FormsPanel.tsx:1746 — slab не визначено (виконається, якщо в проєкті нема першого сляба з матеріалом) ◔; Viewer3D.tsx:731 і Detail3DPreview.tsx:1844 — у мертвому коді.


4. Залежності package.json

Пакет Імпортів у src/server/tools Стан
konva, react-konva, clsx, tailwind-merge, @tesseract.js-data/eng, @types/uuid (dependencies) 0 knip ✔ + grep ✔ — ті самі 6, що 02.09
autoprefixer, postcss, puppeteer (devDependencies) 0 ті самі 3
uuid 1 (utils/bugTickets.ts:2) без змін
jszip 6 файлів (BugReporterDialog, ServiceDialog, DxfExportDialog, CombiCutTab, measureZip, approvalImport) було 2

Механізмів ZIP — тепер три (02.09: два): самописний utils/export/zipArchive.ts (CRC32 + store), другий самописний engines/mesPack.ts:40–122 (CRC_TABLE, crc32, zipStore) і jszip.

Що з бібліотек у стартовому бандлі (сирцевий обсяг модулів у 9 стартових чанках, зі sourcemap ✔): three 2,4 МБ, react-dom 1,05 МБ, pdfjs-dist 1,03 МБ і xlsx 0,90 МБ (обидва — через utils/approvalImport.ts:2–3, імпорт бланка погодження), @react-three/fiber 0,66 МБ, html2canvas 0,44 МБ (BugReporterDialog.tsx:6), jspdf 0,34 МБ, troika-three-text, three-bvh-csg, three-mesh-bvh, lucide-react, jszip. Ліниво (лише за дією): rrweb, rrweb-player, tesseract.js, opencascade.js (WASM 50 МБ, 14 МБ gzip).


5. Задвоєння

5.1 Однойменні функції в різних файлах (не тести)

Метод 02.09 13.10
Імена, визначені в ≥2 файлах (функції на будь-якій глибині: function f і const f = () =>) 116 245
… з них з ідентичним тілом (нормалізація пробілів і коментарів) 42 77 (79 кластерів)
Лише функції верхнього рівня — 100 / 48

Метод 02.09 описаний лише словами («скрипт, нормалізація пробілів і коментарів»), тож порівняння — орієнтовне. Блочний копіпаст (jscpd, ≥15 рядків і ≥80 токенів, без тестів і словників): 22 клони, 537 рядків — 0,54 % коду. Тобто копіюють не великі шматки, а дрібні допоміжні функції.

5.2 Кластери

Кластер Файли Ідентичні? Стан проти 02.09
core/geometry.ts ↔ lib/project.ts 11 ідентичних (getStatusLabel, buildDetailCounters, getDimsLabel, normalizeRotation, isRotation, rotatePoint, rotatedSize, translatePoints, polygonBounds, pointString, labelFontSize); jscpd — 79 рядків так відкрито; rotatePoint/rotatedSize тепер теж ідентичні, placementPolygon — розійшлись
core/snapping.ts ↔ components/2d/canvasUtils.ts 17 ідентичних (segmentDistance, pointToSegmentDistance, polygonSegments, normalizeRect, closestPointOnSegment, snapValue, clampToSlab, polygonInsideRect, resolveSnappedPlacement, segmentAngle, defaultDefectPolygon, manualPointDistance, manualDimensionSegments, clampNumber, angleDelta, axis, normal); jscpd — 95 рядків так відкрито (мертвий core/ дає 28 із 79 ідентичних кластерів)
текстури: engines/textureLayout.ts ↔ utils/export/pdfGeometry.ts ↔ engines/packing.ts ↔ TextureLayoutPanel.tsx ідентичні: findMainLayout, findPart, getSourceX/Y/Rotation, findEdgeThickness, curvedEdgeOffset (textureLayout = pdfGeometry); curvedSideDirection, sideSegment (packing = pdfGeometry); buildViewBox, getDefaultScale, roundToGrid (TextureLayoutPanel = textureLayout) частково відкрито
approvalCanvasUtils.ts ↔ engines/approvalSplit.ts 8 ідентичних (approvalJointCrossesWholeDetail, approvalJointHasInteriorRun, distancePointToSegment, pointNearPolygonBoundary, nearMinX/MaxX/MinY/MaxY) + майже ідентична isPointInsidePreviewPolygon (approvalCanvasUtils.ts:8 / approvalSplit.ts:19); jscpd — 65 рядків так відкрито
isCircleLike domain/manufacturability.ts:180 = engines/productionFacts.ts:171 так відкрито
Точка в полігоні 11 реалізацій у 9 файлах: geometryUtils.ts:38, :56; room.ts:154; geometry.ts:570; approvalImport.ts:1483; approvalCanvasUtils.ts:8, :36; approvalSplit.ts:19; нові domain/plywood.ts:215, constructor/drawing/geom.ts:200, constructor/combicut/CombiCutTab.tsx:520 різні було 7 — зросло
Площа полігона (shoelace) 15 визначень в 11 файлах — той самий цикл a.x*b.y − b.x*a.y: engines/geometry.ts:84, :299, :559; utils/approvalImport.ts:1992, :2002; domain/room.ts:128; domain/baseContour.ts:201; нові — domain/plywood.ts:203, :208, domain/plywoodElements.ts:49, domain/architecture.ts:254, constructor/drawing/geom.ts:60, engines/combicut/plan.ts:76, kernel/occt/occtBuilder.ts:43, kernel/occt/outline2D.ts:290 різні було 5+ — зросло
Округлення 23 визначення в 21 файлі: round3 ×5 (metalTemplates.ts:140 = apsExport.ts:58 = mesPack.ts:169 = quoteCalc.ts:108, + constructor/docs/techCard.ts:201), round1 ×5, round2 ×3, r1 ×2, r2, round4, roundToGrid ×2, roundToMillimeters, round (utils/math.ts:3), fmtMm ×2 частково було 10 — зросло
Поворот точки/вектора 10 у 9 файлах (lib/project.ts:38 = core/geometry.ts:38; packing.ts:106 мертвий; Viewer3D.tsx:611; constructor/measure/measureOps.ts:163; parsers/dxf/geometry.ts:163; rotateVector ×3; tileLayout.ts:145) різні було 5 — зросло
Межі полігона (polygonBounds/bbox/bounds) 19 у 18 файлах різні було 4 — зросло
ZIP zipArchive.ts / mesPack.ts / jszip — було 2 — 3
Діалоги-близнюки EdgeAdditionModal ↔ LegModal (jscpd 71 р.), SkirtingModal ↔ WallPanelModal (28), LegModal ↔ WallPanelModal (23), DrainGratePanel ↔ SurfaceGroovesPanel (22) частково було — відкрито
Дрібне UI onDocMouseDown (BranchSelect.tsx:69 = OrganizationSearchInput.tsx:129), tabLabel (WorkspacePane.tsx:120 = WorkspaceTabs.tsx:98), getShortLabel (EdgeProfileMarks.tsx:10 = TexturePiece.tsx:22), num (QuotePanel.tsx:138 = QuoteSettingsModal.tsx:45), millingOn (ProductElement3DNode.tsx:726 = Viewer3D.tsx:809), ui (13 файлів), onKey (3), Check (AssemblyTab.tsx:115 = PlywoodTab.tsx:80) так частково нові
Нове в CAD rectPts, dim, pickDen, T (×4 у constructor/drawing/set.ts і sheetsExtra.ts), dist ×3 у engines/combicut/*, del (occtBuilder.ts:33 = outline2D.ts:25) так нові
Дві межі NC300 materialRules.ts:52 3000×1600 (тепер живий файл) ↔ manufacturability.ts:29 3100×1500 різні числа відкрито, тепер обидва в застосунку
Рушії грошей engines/estimate.ts і engines/quoteCalc.ts (pricing.ts видалено 03.09) — 3 → 2

6. Захардкоджені зони (фіксація, без оцінки; тести виключено)


7. Важкі файли — з чого складаються (топ-12; повний топ-25 — у звіті L3, §3)

Файл Рядків 02.09 → 13.10 Склад tsc Де
utils/approvalImport.ts 4 805 → 4 805 (байт у байт той самий розмір) 155 декларацій, 169 іменованих функцій; найдовша parseApprovalText 3658–3981 (324); 0 прямих тестів 15 старт (тягне pdfjs-dist, xlsx)
components/ui/Detail3DPreview.tsx 2 914 → 3 530 14 компонентів; Detail3DNode 821–1866 (1 046, було 798), DetailAssemblyGroup 2146–2739 (594), Detail3DPreview 2929–3474 (546) 41 старт
components/ui/ProductEditorWorkspace.tsx 2 558 → 2 974 один компонент 677–2974 (2 298, було 1 990) + buildProductFromSession 217–675 (459); 53 імпорти 38 старт
engines/geometry.ts 2 754 → 2 613 одне замикання createGeometryEngine 16–2585 (2 570); explodeDetails 2159–2582 (424, було 614) 4 старт + воркер OCCT
components/ui/FormsPanel.tsx 2 346 → 2 392 один компонент 166–2358 (2 193) 20 старт
components/3d/Viewer3D.tsx 1 974 → 2 102 Viewer3D 1648–2102, мертвий блок 664–1396 (733) 43 ліниво
i18nStatic.ts 1 993 → 2 095 (239 → 250 КБ) 1 866 записів словника 1 старт + обидва воркери
engines/packing.ts 2 029 → 2 042 123 декларації, 110 функцій 5 старт + воркер розкрою
components/2d/SlabBoard.tsx 1 556 → 1 642 один компонент 55–1642 (1 588) 70 старт
kernel/occt/occtBuilder.ts — → 1 628 87 функцій, 32 експорти 0 старт (через outline2D.ts:18) + воркер OCCT
components/ui/HelpDialog.tsx 535 → 1 154 (49 → 112 КБ) один компонент 43–1154 — текст довідки в JSX 0 старт
components/ui/Detail2DBlueprint.tsx 390 → 917 один компонент 149–917 (769) 8 старт

Файли-дані за байтами: domain/edgeProfileDrawings.ts 440 КБ (56 inline-SVG) — старт; i18nStatic.ts 250 КБ — старт + 2 воркери; components/ui/HelpDialog.tsx 112 КБ; stounik/topics.ts 99 КБ тексту — старт; domain/edgeProfileImages.ts 81 КБ base64 — старт; domain/viyarServiceCatalog.ts 41 КБ; stounik/leoTopics.ts 37 КБ; mes/data/codeArea.ts 31 КБ і mes/data/orders.ts 26 КБ — лише тести.


8. Тести

Vitest (ворота): 217 файлів (216 у src + 1 server), 1 877 тестів: 1 856 ✓, 2 ✗, 19 пропущено, 407 с. 02.09: 110 файлів, 1 203 ✓ / 1 ✗. Червоні: (1) parsers/dxf/parser.test.ts:7 — шлях C:/hhgh/… (без змін з 02.09); (2) новий __tests__/coreBoundary.test.ts — сторож «ядро не імпортує UI»: порушник engines/shapeBuilder.ts:2 (import type … components/forms/utils/draftHelpers). Шапка тесту каже, що цей місток «прибрано» 03.09 — тобто фікс втрачено. Пропущені: kernel/__tests__/profiledBaseCacheGeometry.integration.test.ts (13), profiledBaseRuntimeGuard.integration.test.ts (6). 236 із 431 модулів без прямого тесту (02.09: 137 із 227) — частка майже та сама (55 % проти 60 %). Найважчі без тестів: utils/approvalImport.ts 4 805, Detail3DPreview.tsx 3 530, Viewer3D.tsx 2 102, SlabBoard.tsx 1 642, QuotePanel.tsx 1 269, HelpDialog.tsx 1 154, SlabCatalogModal.tsx 1 123, ProductElement3DNode.tsx 983, Detail2DBlueprint.tsx 917, constructor/measure/MeasureTab.tsx 915, App.tsx 875, PlywoodTab.tsx 743, store/slices/projectSlice.ts 709. Рушії з тестами: geometry, packing, quoteCalc, edgeCutters, shapeBuilder, productionFacts, estimate, miterAssembly (02.09 — без тестів), mesPack, occtBuilder, constructor/drawing/set, domain/plywood, domain/joints. За папками без прямого тесту: components 111 з 135 модулів, constructor 36 з 57, workspaces 12 з 13, utils 12 з 20, kernel 15 з 37, engines 6 з 41, domain 5 з 48.

Дерево коду
666 файлів src/: рядки, зміна до 02.09, де вантажиться, опис · 04_ДЕРЕВО_КОДУ_13-10.md

Згенеровано лінзою L3 аудиту 13.10 зі знімка /tmp/final/vs-cad (12.10 вечір; за брифом — ті самі 666 файлів, що на диску, і ті самі, що в web-app, крім constructor/docs/DocsTab.tsx). Скрипт: probe-L3/_l3raw/tree.cjs (граф імпортів — graph.cjs на AST TypeScript, досяжність — reach.cjs). Формат — як 04_ДЕРЕВО_КОДУ_02-09.md, плюс два стовпці: «Δ до 02.09» і «Де». Не описує server/ (сторона ІТ).

Як читати.

Підсумок

02.09 (після 03.09) 13.10 Зміна
Файлів у src/ (усіх) 343 (340) 666 +323
Рядків у src/ (усіх) 88 543 (≈87 900) 146 898 +58 355 (+66 %)
Файлів ts/tsx без тестів 227 431 +204
Рядків ts/tsx без тестів 72 218 117 217 +44 999 (+62 %)
Тестових файлів ts/tsx у src/ 103 (105 з хелперами) 218 (216 наборів + 2 хелпери) +113
Рядків тестів — 26 917
css 5 8 (2 257 рядків) +3
Папок верхнього рівня src/ 13 21 (нові: constructor, kernel, features, mes, shell, stand, stounik, workspaces; у components/ — нова studio) +8

Розподіл коду (431 модуль, 117 217 рядків) за тим, коли він вантажиться:

Де Модулів Рядків Частка рядків
Г — стартовий набір 333 93 007 79 %
Л — лише ліниво (вкладки CAD, план/розкладка BUILDING, 3D Підбір, CombiCut, воркери) 69 17 505 15 %
С — лише стенд 3 720 0,6 %
Т — лише типи 3 1 529 1,3 %
лише тести 6 2 634 2,2 %
МЕРТВИЙ 17 1 822 1,6 %

Папки верхнього рівня

Папка Файлів (з них тестів) Рядків (з них тестів) 02.09: файлів / рядків Код: у стартовому наборі Код: лише ліниво Мертве / лише тести / лише типи / стенд
components/ui 81 (11) 27 962 (1 392) 76 / 24 405 69 ф. / 26 391 р. 0 ф. / 0 р. 1 мертв. (179 р.)
engines 102 (61) 25 978 (9 199) 53 / 16 643 29 ф. / 14 299 р. 11 ф. / 2 466 р. 1 мертв. (14 р.)
domain 90 (42) 18 008 (5 401) 64 / 12 410 46 ф. / 11 413 р. 1 ф. / 10 р. 1 лише типи
constructor 68 (11) 15 480 (1 370) — (нова) 14 ф. / 3 134 р. 42 ф. / 10 910 р. 1 лише типи
kernel 68 (31) 10 526 (3 899) — (нова) 32 ф. / 6 001 р. 2 ф. / 210 р. 1 мертв. (54 р.); 1 лише типи; 1 стенд
utils 33 (13) 10 113 (1 431) 27 / 9 634 19 ф. / 8 504 р. 0 ф. / 0 р. 1 мертв. (178 р.)
components/forms 27 (7) 5 213 (949) 27 / 5 126 20 ф. / 4 264 р. 0 ф. / 0 р. —
store 31 (15) 4 723 (1 557) 25 / 3 899 16 ф. / 3 166 р. 0 ф. / 0 р. —
components/3d 18 (3) 4 701 (198) 6 / 3 022 7 ф. / 1 592 р. 6 ф. / 2 812 р. 1 мертв. (47 р.)
(корінь src) 9 (0) 4 049 (0) 9 / 3 835 5 ф. / 3 575 р. 0 ф. / 0 р. 2 мертв. (266 р.)
components/2d 18 (1) 3 660 (190) 16 / 3 423 16 ф. / 3 266 р. 0 ф. / 0 р. 1 мертв. (204 р.)
stounik 25 (8) 3 210 (820) — (нова) 16 ф. / 2 236 р. 0 ф. / 0 р. —
mes 8 (1) 3 090 (93) — (нова) 0 ф. / 0 р. 0 ф. / 0 р. 2 мертв. (503 р.); 5 лише тести
styles 3 (0) 1 840 (0) 3 / 1 552 0 ф. / 0 р. 0 ф. / 0 р. —
workspaces/architecture 13 (1) 1 654 (36) — (нова) 6 ф. / 606 р. 4 ф. / 950 р. 1 мертв. (9 р.)
lib 9 (2) 967 (28) 5 / 776 6 ф. / 876 р. 1 ф. / 63 р. —
components/room 3 (0) 915 (0) 3 / 915 3 ф. / 915 р. 0 ф. / 0 р. —
parsers 6 (1) 659 (22) 6 / 660 5 ф. / 637 р. 0 ф. / 0 р. —
stand 2 (0) 637 (0) — (нова) 0 ф. / 0 р. 0 ф. / 0 р. 2 стенд
components/ (файли) 2 (0) 525 (0) 2 / 337 2 ф. / 525 р. 0 ф. / 0 р. —
shell 7 (3) 445 (196) — (нова) 1 ф. / 70 р. 0 ф. / 0 р. 2 мертв. (39 р.); 1 лише тести
components/studio 2 (0) 409 (0) — (нова) 2 ф. / 409 р. 0 ф. / 0 р. —
core 2 (0) 313 (0) 2 / 314 0 ф. / 0 р. 0 ф. / 0 р. 2 мертв. (313 р.)
features/order-registry 7 (2) 245 (55) — (нова) 4 ф. / 187 р. 0 ф. / 0 р. —
__tests__ 3 (3) 241 (241) 2 / 170 0 ф. / 0 р. 0 ф. / 0 р. —
components/auth 4 (1) 236 (53) 4 / 217 3 ф. / 183 р. 0 ф. / 0 р. —
components/mobile 3 (0) 215 (0) 2 / 162 3 ф. / 215 р. 0 ф. / 0 р. —
components/assembly 1 (0) 182 (0) 1 / 183 1 ф. / 182 р. 0 ф. / 0 р. —
features/server-project 4 (1) 158 (43) — (нова) 3 ф. / 115 р. 0 ф. / 0 р. —
assets 5 (0) 126 (0) 5 / 173 0 ф. / 0 р. 0 ф. / 0 р. —
features/object-link 3 (1) 115 (30) — (нова) 2 ф. / 85 р. 0 ф. / 0 р. —
hooks 1 (0) 106 (0) 1 / 106 1 ф. / 106 р. 0 ф. / 0 р. —
features/cad-release 2 (0) 85 (0) — (нова) 1 ф. / 45 р. 1 ф. / 40 р. —
workspaces/constructor 2 (0) 45 (0) — (нова) 0 ф. / 0 р. 0 ф. / 0 р. 1 мертв. (11 р.)
workers 1 (0) 44 (0) 1 / 44 0 ф. / 0 р. 1 ф. / 44 р. —
features/workspace-entry 2 (1) 18 (8) — (нова) 1 ф. / 10 р. 0 ф. / 0 р. —
workspaces/vs3d 1 (0) 5 (0) — (нова) 0 ф. / 0 р. 0 ф. / 0 р. 1 мертв. (5 р.)

Примітки до таблиці. «02.09: файлів / рядків» — з дерева 02.09 (після видалення трьох файлів 03.09). Нові папки з'явились між 03.09 і 12.10: constructor (CAD: замір, метал, фанера, збірка, зведення, документи, CombiCut), kernel (ядро OCCT і шви до нього), workspaces/architecture (BUILDING: план, розкладка, відомість), stounik (помічник-маскот), mes (симуляція цеху — не підключена), shell (права і робочі простори — підключено лише вхід адміна), stand (окрема сторінка стенду OCCT), features/* (інтеграції з реєстром/PLM/МЕС — [сторона ІТ]), components/studio (головна Studio).

Повне дерево з описами

src/ — 9 файл(ів), 4049 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
App.css 2.8 184 = Стилі каркаса застосунку (легасі; основне — styles/global.css) (опис 02.09)
App.tsx 49.1 875 +71 Г Каркас: шапка, меню файлу (JSON open/save), робоча область, модалки; rrweb підвантажується ліниво (опис 02.09) ⚠ статично імпортує редактор виробу, ArchitectureSidebar, AddLayoutWorkspace, StudioHome; Стоуник — через HeaderToolbar · tsc 12
arGen.ts 4.8 123 = МЕРТВИЙ Генератор AR-моделі виробу (прототип 27.08); окрема точка входу ar-gen.html (опис 02.09) ⚠ вхідної сторінки ar-gen.html у vs-cad нема
buildFotozona.ts 6.6 143 = МЕРТВИЙ Збірка фотозони (робочий інструмент 27.08); окрема точка входу fotozona.html (опис 02.09) ⚠ вхідної сторінки fotozona.html у vs-cad нема
i18n.ts 12.9 323 -3 Г Словники uk/en/pl для t()/ui(), список мов, statusLabel (опис 02.09) ⚠ при імпорті будує зворотний словник з усіх ~1 900 записів i18nStatic (:207–212)
i18nPatterns.ts 22.0 213 +15 Г ШАБЛОНИ ІНТЕРФЕЙСУ З ПІДСТАНОВКОЮ. Словник staticUiText міняє текст вузла тільки за точним збігом, тому підпис, зібраний із числом («Радіус: 12 мм», «Сторона A»),…
i18nStatic.ts 243.8 2095 +102 Г СЛОВНИК СТАТИЧНОГО ІНТЕРФЕЙСУ (українська → en/pl). Як це працює: LanguageDomTranslator обходить DOM і підміняє ТЕКСТ ВУЗЛА ЦІЛКОМ, звіряючи його з ключем цього… ⚠ 1 866 записів; у стартовому чанку і в обох воркерах; дубль ключа :2023 (tsc TS1117); статично тягне constructor/measure/i18n.measure (:16) · tsc 1
index.css 0.5 24 = Tailwind-вхід і базові правила (опис 02.09)
main.tsx 3.3 69 +29 Г Точка входу: AuthProvider + AuthGate (DEV і «без бекенда» — пропускає), ErrorBoundary (опис 02.09) ⚠ при старті реєструє ядро OCCT (registerProductKernel :46, registerCutOutlines :48) і статично тягне engines/tests/mockData (:14)

src/__tests__/ — 3 файл(ів), 241 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
coreBoundary.test.ts 3.1 71 нов. сторож межі ядра (2 it) ⚠ червоний: повернувся місток engines/shapeBuilder.ts:2 → draftHelpers
i18nPatterns.test.ts 4.1 74 = тести для i18nPatterns (11 it)
i18nStatic.test.ts 5.1 96 = тести для i18nStatic (13 it)

src/assets/ — 5 файл(ів), 126 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
hero.png 12.8 52 -46 ресурс
l-detail-template.svg 2.3 47 = ресурс
react.svg 4.0 0 -1 ресурс
rect-detail-template.svg 1.3 26 = ресурс
vite.svg 8.5 1 = ресурс

src/components/ — 2 файл(ів), 525 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
WorkspacePane.tsx 11.8 226 +77 Г Панель робочої області: рендер вкладки за PaneView (2d/3d/texture/estimate/quote/room), спліт (опис 02.09) ⚠ вкладки CAD/BUILDING ліниві (:20–27, :60–62), але сусідній SlabBoard тягне креслярку CAD у старт · tsc 13
WorkspaceTabs.tsx 18.0 299 +111 Г СМУГА ВКЛАДОК РОБОЧОЇ ОБЛАСТІ. (опис 02.09)

src/components/2d/ — 3 файл(ів), 2216 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
PlacementPropertiesPanel.tsx 9.6 204 = МЕРТВИЙ Панель властивостей розміщення (серії кромок 12/20). НЕ ІМПОРТУЄТЬСЯ НІКИМ — мертвий кандидат (опис 02.09) ⚠ без імпортерів з 10.08 (knip) · tsc 1
SlabBoard.tsx 89.3 1642 +86 Г Канвас слябів (SVG через React DOM): деталі, розміри, дефекти, драг, мультивибір, прилипання, лупа, буфер (опис 02.09) ⚠ один компонент 55–1642; useExactOutlines (:101) просить у воркера OCCT контури всіх партів; tsc 70 · tsc 70
canvasUtils.ts 19.2 370 = Г Геометрія полотна: snapValue(25 мм)/findSnap (жива копія), координати, дзеркалення (mirror) (опис 02.09)

src/components/2d/board/ — 14 файл(ів), 1254 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
BoardOverlays.tsx 10.4 219 -116 Г Оверлеї дошки: ManualDimensions, SlabDimensionHints, SlabMagnifierWindow (опис 02.09)
DragPreviews.tsx 2.6 59 -1 Г Прев'ю перетягування (група/одиночне), приймає mirror (опис 02.09)
DrainGrateMarks.tsx 2.3 58 = Г РЕШІТКА ЗЛИВУ НА КАРТІ КРОЮ (28.08). (опис 02.09)
DxfExportDialog.tsx 10.0 174 нов. Г ВИБІР ПРОФІЛЮ DXF (01.10.2026, власник: «коли натискаєш експорт — щоб давало вибір: загальний і під різні станки в тій формі, яку ти побачив у кейсах»). Загальний —… ⚠ статичний місток у CAD: kernel/shopSheets + constructor/docs/DrawingSetView → constructor/drawing/* і occtBuilder у стартовому наборі
EdgeProfileMarks.tsx 2.7 44 -1 Г Відступ підпису крайки від її лінії всередину деталі, мм. (опис 02.09)
FactHighlight.tsx 8.4 180 = Г Підсвітка ліній, за якими нараховано послугу. (опис 02.09)
PartShape.tsx 4.8 106 +39 Г Форма парта на дошці: контур, отвори, припуск, вибіг пили (опис 02.09)
PlacementStateBadges.tsx 1.3 23 -1 Г «T» янтарний — товщина деталі ≠ товщині слеба. Попередження, не (опис 02.09)
SelectionRect.tsx 0.5 14 -1 Г Рамка мультивибору (опис 02.09)
SlabHeaderTab.tsx 5.5 122 = Г КОРІНЕЦЬ СЛЕБА (27.08, задача власника). (опис 02.09)
SlabLayer.tsx 4.2 91 +1 Г Аркуш слеба на дошці розкрою. (опис 02.09)
useAutoCornerDefects.ts 3.5 63 = Г ЗРІЗ КУТА СТАЄ ДЕФЕКТОМ (27.08). (опис 02.09)
useSiteSlabTextures.ts 3.1 57 нов. Г ТЕКСТУРА З САЙТУ ДЛЯ СЛЕБІВ, ДОДАНИХ РАНІШЕ (25.09.2026). Новий слеб бере текстуру ще у вікні каталогу. А ті, що лежать у проєктах з попередніх днів, несуть прев'ю…
useSlabOutlines.ts 2.3 44 = Г Контури натуральних слебів для дошки розкрою. (опис 02.09)

src/components/2d/board/__tests__/ — 1 файл(ів), 190 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
FactHighlight.test.tsx 9.4 190 = тести для FactHighlight (13 it)

src/components/3d/ — 15 файл(ів), 4503 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
BacklightRig.tsx 12.4 232 нов. Л ПЛАВНА ПІДСВІТКА КАМЕНЮ (№160, власник 08.09: «кнопка Підсвітка щоб робила плавний перехід — затухання сцени і підсвічування каменю, в силу тої моделі, як працює,…
DetailEditor3D.tsx 6.7 130 = Г Редактор трансформацій деталі в 3D (позиція/поворот), використовується Sidebar3D (опис 02.09)
GlProbe.tsx 4.8 84 нов. Г ЗОНД WebGL — Б-153: «на стиках вилітає». Власник 08.09: «це погано, треба причина, чим я можу допомогти?». Ось чим: увімкнути режим «Стики», дочекатись вильоту і… ⚠ при імпорті патчить HTMLCanvasElement.prototype.getContext (:26–35); у старті через Detail3DPreview
PlywoodNode.tsx 8.8 145 нов. Л ФАНЕРНИЙ ПІДКЛАД У 3D (02.10.2026, журнал №223, Лео). Один вузол на всі в'ювери: конструктор «Фанера», «Збірка 3D», редактор виробу і 3D Підбір малюють деталі…
ProductElement3DNode.tsx 51.0 983 +199 Г Рекурсивний рендер елемента виробу з доповненнями через Detail3DNode; мітри (miterAssembly), extraCutters, різаки на розрізаній плиті (02.09) (опис 02.09) · tsc 1
SafeEnvironment.tsx 2.2 47 = МЕРТВИЙ СТУДІЙНЕ СВІТЛО, ЯКЕ НЕ ВАЛИТЬ СЦЕНУ. (опис 02.09) ⚠ новий мертвий з 02.09 (knip)
SceneLighting.tsx 11.8 239 нов. Г ОДНЕ СВІТЛО НА ВСЮ ПРОГРАМУ (№166, власник 09.09: «давай роби, тільки не забувай режим підсвітки»). Було: ambient 0.6 + directional 1.2 + .…
StounikLoader3D.tsx 7.2 126 нов. Л СТОУНИК ЗАВАНТАЖУЄ 3D ПІДБІР (12.10.2026, №274, Лео). Власник: «добав класну анімовану загрузку в 3D Підбір, типу щось зі Стоуником». Показуємо ПРАВДУ, а не прикрасу:…
Viewer3D.tsx 101.9 2102 +128 Л 3D Підбір після розкрою: ProductAssemblyWrapper → ProductElement3DNode (вироби) та AssemblyGroup/TexturedPart (легасі/DXF); знімки для PDF; dev-ручка __vs3dAssembly (опис 02.09) ⚠ мертвий блок TexturedPart/EdgePartWrapper/AssemblyGroup 664–1396 (733 р.); groups :1778 не читається; 2 rules-of-hooks у мертвому блоці · tsc 43
Viewer3DLazy.tsx 0.1 3 = Г Лінивий React.lazy-імпорт Viewer3D (опис 02.09)
kernelSeam.ts 6.9 121 нов. Г ШОВ ЯДРА ДЛЯ 3D ПІДБОРУ (08.10.2026, №242, Лео). Власник: «3D Підбір на тому самому modelFromDraft… тіко з головою». Файл спільний для Studio і VS CAD і НЕ знає про…
plywoodTextures.ts 6.1 123 нов. Л ТЕКСТУРИ ФАНЕРИ (02.10.2026, журнал №223, Лео) — власник: «гірчичний колір напрягає, підтягни текстуру і текстуру торця». Без бінарних картинок у репо: малюємо на…
stounikLoader.css 5.1 52 нов. №274 (12.10.2026): Стоуник завантажує 3D Підбір. Кольори — Стоуника в Studio (stounik.css, №240), фон — той самий #f0f4f8, що в сцені. Рух лише transform/opacity на…
useOwnedGeometries.ts 1.8 32 нов. Г ГЕОМЕТРІЇ, ЯКІ КОМПОНЕНТ СТВОРИВ САМ (12.10.2026, №271, Лео). Редактор переводить тіла ядра в локаль своїх мешів копією (geom.clone().applyMatrix4(...) у useMemo).…
useSafeTextures.ts 3.7 84 нов. Л ТЕКСТУРИ СЛЕБІВ ДЛЯ 3D, ЯКІ НЕ ВАЛЯТЬ ВЬЮВЕР (28.09.2026). useTexture з drei при помилці завантаження КИДАЄ — і ErrorBoundary гасить увесь «3D Підбір» («Could not…

src/components/3d/__tests__/ — 3 файл(ів), 198 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
DetailEditor3D.test.tsx 3.2 84 = тести для DetailEditor3D (1 it) · tsc 1
StounikLoader3D.test.tsx 3.7 60 нов. тести для StounikLoader3D (4 it)
useSafeTextures.test.tsx 2.2 54 нов. тести для useSafeTextures (2 it)

src/components/assembly/ — 1 файл(ів), 182 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
AssemblyConnectionsPanel.tsx 7.3 182 -1 Г Панель з'єднань у збірці (легасі-групування 3D), використовується Sidebar3D (опис 02.09)

src/components/auth/ — 3 файл(ів), 183 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
AuthContext.tsx 3.3 80 +19 Г Контекст сесії: user + backend state (present/absent/checking) — «без бекенда» = демо (01.09) [сторона ІТ] (опис 02.09)
AuthGate.tsx 2.4 59 = Г Гейт авторизації Keycloak; DEV і backend=absent пропускають [сторона ІТ] (опис 02.09)
LoginModal.tsx 1.7 44 = Г Модалка входу [сторона ІТ] (опис 02.09)

src/components/auth/__tests__/ — 1 файл(ів), 53 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
authBackend.test.tsx 2.5 53 = тести для authBackend (5 it)

src/components/forms/editors/ — 6 файл(ів), 1310 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
DrainGratePanel.tsx 8.6 183 = Г РЕШІТКА ЗЛИВУ — водоструменевий різ у дні мийки (28.08.2026). (опис 02.09)
EdgeProcessingDesigner.tsx 14.2 314 = Г Сховати колонку кромок — коли кромки живуть в окремому треї. (опис 02.09)
EdgeProfileOptions.tsx 2.6 52 = Г Значення пункту «Каталог з розрізами…» у випадачці (01.09, власник: (опис 02.09)
EdgeProfileThumb.tsx 6.1 126 = Г Мініатюра профілю торця — справжній розріз із каталогу цеху (вектор), а не (опис 02.09)
EdgeProfilesPanel.tsx 22.9 366 +13 Г КРОМКИ (ОБРОБКА ТОРЦІВ) — ОКРЕМИЙ ТРЕЙ РЕДАКТОРА ВИРОБУ. (опис 02.09)
SurfaceGroovesPanel.tsx 13.3 269 = Г ФРЕЗЕРУВАННЯ ПЛОЩИНИ — введення проточок для води і декоративних (опис 02.09)

src/components/forms/editors/__tests__/ — 2 файл(ів), 132 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
EdgeProfileOptions.test.tsx 3.3 58 = тести для EdgeProfileOptions (2 it)
EdgeProfilesPanel.test.tsx 3.7 74 +4 тести для EdgeProfilesPanel (4 it)

src/components/forms/import/ — 4 файл(ів), 1295 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
ApprovalItemEditors.tsx 6.9 150 -1 Г src/components/forms/import/ApprovalItemEditors.tsx (P2.1 — ФІНАЛ) Повертає у картку прев'ю редактори, втрачені при міграції: • Розміри сторін (ручні) →… · tsc 3
ApprovalOverview.tsx 8.9 204 -1 Г Огляд імпортованого бланка (опис 02.09)
DxfOverview.tsx 15.0 351 = Г Огляд імпорту DXF: ролі контурів, прив'язки (опис 02.09) · tsc 13
approvalCanvasUtils.ts 26.1 590 = Г Геометрія полотна бланка: полігони, попадання точки, прев'ю (опис 02.09) · tsc 6

src/components/forms/shapes/ — 7 файл(ів), 393 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
CircleDesigner.tsx 2.3 30 -1 Г 2D-конструктор круглої форми (опис 02.09) · tsc 1
EllipseDesigner.tsx 2.0 26 -1 Г 2D-конструктор овалу (опис 02.09) · tsc 1
LDesigner.tsx 3.7 34 +7 Г 2D-конструктор Г-форми (опис 02.09) ⚠ фантомний store/useDictionaryStore (:2) · tsc 4
RectangleDesigner.tsx 5.4 96 = Г 2D-конструктор прямокутника (опис 02.09) ⚠ console.log рівня модуля (:14); фантомний store/useDictionaryStore (:4) · tsc 6
SinkDesigner.tsx 3.1 32 -1 Г 2D-конструктор мийки (опис 02.09) · tsc 1
SvgComponents.tsx 4.3 110 = Г SVG-примітиви конструкторів: поля розмірів (Enter/blur), стрілки (опис 02.09) · tsc 1
UDesigner.tsx 5.8 65 -1 Г 2D-конструктор П-форми (опис 02.09) · tsc 1

src/components/forms/utils/ — 3 файл(ів), 1266 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
draftHelpers.ts 23.1 458 +70 Г Сесія редактора виробу (ProductEditorSession), DetailDraft, visibleDetailTypes, getSideSize, матеріал виробу (опис 02.09)
productTemplates.ts 40.5 774 = Г Шаблони виробів (адмін-фіча, на релізі схована за щитом). (опис 02.09) · tsc 1
sharedInputs.tsx 1.7 34 -1 Г Спільні поля вводу (DimInput) (опис 02.09) · tsc 1

src/components/forms/utils/__tests__/ — 5 файл(ів), 817 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
applySideEdit.test.ts 5.2 116 = тести для applySideEdit (11 it)
productTemplates.test.ts 29.1 522 = тести для productTemplates (22 it)
sideNames.test.ts 5.4 110 = тести для sideNames (5 it)
visibleBaseDesigns.test.ts 2.2 41 = тести для visibleBaseDesigns (5 it)
visibleDetailTypes.test.ts 1.3 28 = тести для visibleDetailTypes (4 it)

src/components/mobile/ — 3 файл(ів), 215 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
MobileBoardZoom.tsx 2.6 43 нов. Г МАСШТАБ ДОШКИ РОЗКРОЮ НА ТЕЛЕФОНІ (№239, 07.10.2026, Лео). Чому: SVG дошки має viewBox під десктопну ширину (~1160 од.) і фіксовану висоту в пікселях. На 390 px…
MobileBottomNav.tsx 2.9 68 +10 Г Нижня навігація — головний орган керування на телефоні. (опис 02.09)
MobileSheet.tsx 3.6 104 = Г Нижня шухляда (bottom sheet) — мобільна заміна бокової панелі. (опис 02.09)

src/components/room/ — 3 файл(ів), 915 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
RoomEditor.tsx 37.5 664 = Г РЕДАКТОР ПРИМІЩЕННЯ (БАЗИ) — 01.09.2026, рішення власника. (опис 02.09)
RoomSolids.tsx 9.1 169 = Г РЕНДЕР ПРИМІЩЕННЯ — спільний для редактора бази і шару в 3D Підборі. (опис 02.09)
roomGeometry.ts 3.5 82 = Г Геометрія тіл приміщення (без React) — щоб RoomSolids лишався чистим (опис 02.09)

src/components/studio/ — 2 файл(ів), 409 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
StudioHome.tsx 13.7 262 нов. Г VIYAR STONE STUDIO — стартова лінійки продуктів (04.09.2026). Поки що ЗАГЛУШКА: показує, з чого складається лінійка і на яке питання відповідає кожен продукт. Перші…
StudioReveal.tsx 7.6 147 нов. Г ПРОВАЛЮЄМОСЬ У СТУДІЮ (04.09.2026, задум власника). Після правильної фрази екран накриває кам'яна плита — і відсувається, а студія за нею наближається, ніби ми…

src/components/ui/ — 70 файл(ів), 26570 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
AddProductWorkspace.tsx 11.9 247 +8 Г Робоча область «Додати виріб» (легасі-варіант над FormsPanel) (опис 02.09) · tsc 3
AdminPinButton.tsx 7.3 161 -8 Г Кнопка супер-адміна в шапці. (опис 02.09)
AppStatusBar.tsx 4.2 101 +3 Г Нижній статус-бар: площа, стан цін/бекенда [ІТ] (опис 02.09)
BranchSelect.tsx 7.1 159 = Г Поле «Філія» — випадачка зі списку Locations Service з локальним пошуком. (опис 02.09)
BugReporterDialog.tsx 9.3 204 -1 Г Діалог баг-репорту з записом rrweb і blackbox-логом (опис 02.09)
CabinetSaveButton.tsx 3.4 60 нов. Г «Зберегти в Особистому кабінеті» — реальна дія, а не alert (№188, 25.09.2026). До цього пункт лише казав «автозбереження працює у фоні», а фон працював тільки для…
CabinetSyncBadge.tsx 1.8 36 нов. Г Індикатор стану кабінету в шапці (№188, 25.09.2026). До цього дізнатись, чи проєкт узагалі зберігається в кабінет, можна було лише відкривши кабінет і подивившись…
ConfirmDialog.tsx 2.5 64 -1 Г Діалог підтвердження (опис 02.09)
CornerContextMenu.tsx 1.9 48 = Г fixed, а не absolute: x/y приходять як clientX/clientY (координати ВІКНА). (опис 02.09) ⚠ фантомний store/useDictionaryStore (:3) · tsc 2
CornerProcessingModal.tsx 9.2 179 +11 Г Модалка обробки кута (радіус/фаска/Г-заріз, галочка «Обробка торців») (опис 02.09) ⚠ фантомний store/useDictionaryStore (:7) · tsc 2
CreateProductModal.tsx 21.4 422 +2 Г Значення <select> товщини для «іншої» (ручної) товщини натурального каменю. (опис 02.09)
CutoutProcessingModal.tsx 24.9 444 +125 Г Габарит деталі — для перевірки, що виріз не виходить за її межі (FG-16). (опис 02.09) ⚠ фантомний store/useDictionaryStore (:8) · tsc 1
Detail2DBlueprint.tsx 50.3 917 +527 Г Коло й овал (01.09): контур квадрантами, а не прямокутник за габаритом. (опис 02.09) · tsc 8
Detail3DPreview.tsx 182.6 3530 +616 Г 3D редактора виробу: Detail3DNode (єдиний вузол деталі), DetailAssemblyGroup, різаки торців/канавок, план мітр (з miterAssembly), SideChip3D, приміщення, dev-ручка __vs3dPreview (опис 02.09) ⚠ ProfileMesh 79–100 і useDetailGeometry 3526–3530 — мертві; гілка бортика з неіснуючим R3SkirtingGeometry :1844 · tsc 41
DetailContextMenu.tsx 1.7 48 = Г Контекстне меню деталі (fixed) (опис 02.09) · tsc 1
DetailPassportModal.tsx 20.4 402 +1 Г Паспорт деталі: факти → кошторис деталі, ціни 1С (опис 02.09) · tsc 2
DimensionsTable.tsx 7.2 128 -14 Г Сторони, закриті ногою/потовщенням/підворотом — форму не обрати (domain/edgeOccupancy). (опис 02.09)
DraggableDialog.tsx 5.8 124 +1 Г Немодальне вікно, яке можна пересунути за шапку. (опис 02.09) · tsc 1
EdgeAdditionModal.tsx 8.7 177 +47 Г ПОТОВЩЕННЯ І ПІДВОРОТ — ТИМ САМИМ ПРИНЦИПОМ, ЩО Й БОРТИК. (опис 02.09)
EdgeContextMenu.tsx 7.5 159 +9 Г Той самий порядок, що у випадачках редактора: універсальні → цей матеріал → потовщення → операції → інші → спадок (опис 02.09)
EdgeProfileCatalog.tsx 12.1 234 = Г КАТАЛОГ КРОМОК — вибір форми торця картками з розрізами (01.09.2026). (опис 02.09)
EdgeProfileSettingsModal.tsx 28.8 501 = Г ФІЛЬТРИ (01.09, власник: «вікно більше, щоб картинки були більші, і (опис 02.09) · tsc 4
ElementSettingsModal.tsx 31.5 553 +259 Г Налаштування елемента: розміри, товщина за матеріалом, сторони (зайняті — заблоковані) (опис 02.09)
ErrorBoundary.tsx 4.0 96 -1 Г Межа помилок React з екраном «Щось пішло не так» (опис 02.09) ⚠ дубль літерала ключа сховища (:81) · tsc 3
EstimatePanel.tsx 21.9 391 +109 Г Послуги для виробництва (BOM). (опис 02.09)
FormsPanel.tsx 120.0 2392 +46 Г Створення плоскої деталі + 2D-конструктор + імпорти DXF/бланку/SketchUp + слеби (serial max+1) (опис 02.09) ⚠ один компонент 166–2358; :1746 ім'я slab не визначене (TS2304) · tsc 20
HeaderToolbar.tsx 5.5 109 +9 Г Шапка: просунутий режим (значки), перемикачі (опис 02.09) · tsc 3
HelpDialog.tsx 109.4 1154 +619 Г Скріншот у довідці: файл із public/help (копіюється в збірку як є). (опис 02.09) ⚠ 112 КБ тексту в JSX, у стартовому наборі
JointContextMenu.tsx 1.9 56 = Г Контекстне меню стику (опис 02.09) ⚠ фантомний store/useDictionaryStore (:3) · tsc 3
JointOffsetPopup.tsx 5.1 124 +7 Г Віконечко «на скільки відсунути стик», що відкривається кліком по стороні в 3D. (опис 02.09)
LanguageDomTranslator.tsx 6.5 149 = Г ПЕРЕКЛАД ІНТЕРФЕЙСУ ПРЯМО В DOM. (опис 02.09) ⚠ MutationObserver на весь document.body (:103–118) — і для української
LegModal.tsx 6.0 133 = Г Довжина ребра, на якому створюється деталь. Стає шириною за (опис 02.09) ⚠ тип з неіснуючого ../../../domain/types (TS2307 :3) · tsc 1
ListsPanel.tsx 29.2 476 +21 Г Списки виробів/деталей/слебів («Слеб N» у списку проти SL-N на аркуші — П-А5) (опис 02.09) · tsc 2
ManufacturabilityNotice.tsx 4.4 94 = Г Технологічні попередження до проєкту. (опис 02.09)
MetalTemplateModal.tsx 11.1 229 +2 Г Шаблони металовиробів: вибір шаблона → параметри → жива промальовка → (опис 02.09)
NewProjectDialog.tsx 3.0 74 = Г СТВОРЕННЯ НОВОГО ПРОЄКТУ. (опис 02.09)
OrganizationSearchInput.tsx 11.7 262 +23 Г Поле «Контрагент» з пошуком по довіднику Customers Service. (опис 02.09)
PdfExportDialog.tsx 8.5 178 +4 Г Діалог експорту PDF карт крою (utils/export) (опис 02.09)
ProductEditorWorkspace.tsx 180.6 2974 +416 Г Редактор виробу: дерево, властивості, акордеони, 2D/3D, модалки; realEdgeLengths, buildProductFromSession — збирання виробу з сесії (типи стиків, сесія→Product) (опис 02.09) ⚠ один компонент 677–2974 (2 298 р.); 7 умовних хуків (eslint rules-of-hooks :848–1098) · tsc 38
ProductTemplateModal.tsx 28.7 544 = Г Вибір шаблону виробу (адмін-фіча, кнопка «Шаблони» у вікні «Новий виріб»). (опис 02.09)
ProjectLoadingOverlay.tsx 2.3 46 = Г ЩО ЗАРАЗ ВІДБУВАЄТЬСЯ ПРИ ВІДКРИТТІ ПРОЄКТУ (27.08, зауваження власника (опис 02.09)
ProjectsDashboard.tsx 7.7 180 = Г Кабінет проєктів з бекенда (/api/projects) [ІТ] (опис 02.09) · tsc 1
QuoteOrderCard.tsx 21.7 355 +11 Г Підтвердження прорахунку → замовлення в Orders Service. (опис 02.09)
QuotePanel.tsx 73.1 1269 +133 Г Прорахунок для клієнта: два проходи computeQuoteCalc, usePrices1c, метод оплати, замовлення, PDF (опис 02.09) · tsc 2
QuoteSettingsModal.tsx 21.5 391 +35 Г Налаштування прорахунку: коди номенклатур 1С і режим калібрування цін. (опис 02.09)
RemnantFinderModal.tsx 15.7 285 = Г ПІДБІР ЗАЛИШКІВ ЗІ СКЛАДУ — модалка з панелі нерозміщених деталей. (опис 02.09)
ServiceDialog.tsx 26.6 494 = Г rrweb-player підвантажується динамічно (див. ефект нижче) — з тієї ж причини, (опис 02.09) · tsc 1
ServiceMappingPanel.tsx 22.7 470 = Г Екран для керівника: які послуги нараховуються за яку обробку. (опис 02.09)
SettingsModal.tsx 21.3 428 +5 Г Налаштування: каталог послуг, PIN, пороги minSideMm, прив'язки (опис 02.09) · tsc 2
SettingsSyncBar.tsx 5.5 75 нов. Г ПАНЕЛЬ «ДЛЯ ВСІХ» У ВІКНАХ НАЛАШТУВАНЬ (08.10.2026, №241, Лео). Показує, що лежить на сервері (версія, хто й коли міняв), і дає «Зберегти для всіх». Замок — PIN…
SideAdditionsPanel.tsx 10.6 218 +7 Г ТРЕЙ «СТОРОНИ»: ЛИШЕ ДОПОВНЕННЯ — БОРТИКИ, ПОТОВЩЕННЯ, ПІДВОРОТИ. (опис 02.09)
SideLockButton.tsx 2.0 42 нов. Г ЗАМОЧОК БІЛЯ РОЗМІРУ (04.09.2026). Закритий замок = «це число не змінюється»: ні руками, ні само, коли міняють сусідні розміри. Зміну тоді поглинає перший незамкнений…
Sidebar.tsx 7.4 159 = Г Ліва панель 2D Розкрою. (опис 02.09)
Sidebar3D.tsx 14.2 238 = Г На телефоні — тільки рейка: широка панель на 300 px з'їдала б три (опис 02.09) · tsc 4
SkirtingModal.tsx 5.1 118 = Г Довжина ребра, на якому створюється деталь. Стає шириною за (опис 02.09) ⚠ тип з неіснуючого ../../../domain/types (TS2307 :3) · tsc 1
SlabCatalogModal.tsx 68.2 1123 +189 Г ДОДАВАННЯ СЛЯБА З ДОВІДНИКА НОМЕНКЛАТУР. (опис 02.09)
SlabCatalogWmsPanel.tsx 9.5 178 = Г ДЖЕРЕЛО «WMS» У ВІКНІ ВИБОРУ СЛЯБА (01.09.2026, власник: «ТЕСТ прибирай (опис 02.09)
SlabInspector.tsx 6.0 75 = Г Інспектор слеба (фото, дефект, товщина) (опис 02.09) · tsc 1
TextureLayoutPanel.tsx 32.7 671 = Г 2D Підбір: розкладка деталей на фото слеба (ручний підбір) (опис 02.09) · tsc 9
TexturePiece.tsx 4.5 93 +1 Г Шматок текстури на 2D Підборі (textureMatrix) (опис 02.09) · tsc 1
TextureScene.tsx 5.5 152 = Г Сцена 2D Підбору: кадр, драг, FrameDraft (опис 02.09) · tsc 1
UCutoutModal.tsx 6.8 161 = Г П-ПОДІБНИЙ ВИРІЗ (ніша) — ХВИЛЯ 4, крок 4.4 (FG-34). (опис 02.09)
UnplacedPartsPanel.tsx 11.3 271 = Г БУФЕР НЕРОЗМІЩЕНИХ ДЕТАЛЕЙ — права колонка 2D Розкрою. (опис 02.09)
WallPanelModal.tsx 5.7 120 +16 Г Довжина ребра, на якому створюється деталь. Стає шириною за (опис 02.09)
branchesCache.ts 1.1 25 = Г Кеш довідника філій на весь застосунок. (опис 02.09)
detailActions.ts 6.1 120 +24 Г ДІЇ НАД ВИБРАНОЮ ДЕТАЛЛЮ — спільні для списку і компактної панелі. (опис 02.09) · tsc 1
useCloseOnOutsideClick.ts 2.6 48 = Г Закрити спливне меню кліком повз нього. (опис 02.09)
useCommittedNumber.ts 2.4 49 = Г ЧИСЛОВЕ ПОЛЕ, ЯКЕ ЗАСТОСОВУЄТЬСЯ ПІСЛЯ НАБОРУ, А НЕ ПІД ЧАС. (опис 02.09)
useCostPrices.ts 8.9 179 = МЕРТВИЙ ЦІНИ З COST SERVICE — ВІД'ЄДНАНО 01.09.2026: цей хук ніхто не викликає. Інтеграція робоча й перевірена наживо: сервіс приймає запит, впізнає контрагента (cost_agent… ⚠ шапка: «ВІД'ЄДНАНО 01.09»; без імпортерів
usePrices1c.ts 12.7 204 = Г Ціни прорахунку з 1С (метод getDiscountPrice). (опис 02.09)

src/components/ui/__tests__/ — 11 файл(ів), 1392 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
BranchSelect.test.tsx 3.9 100 = тести для BranchSelect (5 it)
DetailPassportModal.test.tsx 3.2 106 -2 тести для DetailPassportModal (4 it)
EdgeProfileCatalog.test.tsx 4.1 72 = тести для EdgeProfileCatalog (3 it)
EdgeProfileSettingsModal.test.tsx 2.5 44 = тести для EdgeProfileSettingsModal (2 it)
OrganizationSearchInput.test.tsx 7.7 188 +29 тести для OrganizationSearchInput (10 it)
SettingsSyncBar.test.tsx 4.1 56 нов. тести для SettingsSyncBar (4 it)
detailSides.test.ts 1.7 38 = тести для detailSides (5 it)
edgeAdditions.test.ts 20.2 400 = тести для edgeAdditions (24 it)
quoteOrderCard.test.tsx 6.8 136 = тести для quoteOrderCard (10 it)
slabCatalogWms.test.tsx 3.5 53 = тести для slabCatalogWms (3 it)
usePrices1c.test.tsx 9.7 199 = тести для usePrices1c (14 it)

src/constructor/ — 4 файл(ів), 502 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
geometry.ts 11.0 209 нов. Л ГЕОМЕТРІЯ КОНСТРУКТОРА — 04.09.2026. Тонкий шар над ядром: бере контур деталі з тієї самої функції, що й розкрій (contourForDetail), і кладе його в координати заміру…
store.ts 7.5 174 нов. Г СТАН КОНСТРУКТОРА (пасхалка Студії) — 04.09.2026. Окремий zustand-стор: усе, що знає лише конструктор і що не має потрапляти в проєкт менеджера (інваріант «VS3D… ⚠ zustand-стор CAD — у стартовому наборі і у воркері OCCT (через kernel/plywoodFromDraft.ts:28)
toolbar.tsx 1.6 28 нов. Л ПАНЕЛЬ ІНСТРУМЕНТІВ СПРАВА (№253, 09.10.2026; винесено з PlywoodTab у №255, бо тепер її мають дві вкладки — «Фанера» і «CombiCut»). Квадратна кнопка з іконкою, як у…
ui.tsx 4.2 91 нов. Г Дрібні спільні елементи вкладок конструктора — 04.09.2026. Глобальний стиль

src/constructor/__tests__/ — 10 файл(ів), 1292 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
assemblyModel.test.ts 8.4 126 нов. тести для assemblyModel (13 it)
drawingSet.test.ts 11.4 163 нов. тести для drawingSet (11 it)
leicaDxf.test.ts 4.6 89 нов. тести для leicaDxf (7 it)
measureClean.test.ts 7.6 104 нов. тести для measureClean (5 it)
measureOps.test.ts 17.8 311 нов. тести для measureOps (21 it)
metalFit.test.ts 9.2 130 нов. тести для metalFit (13 it)
plywoodLayers.test.ts 7.5 115 нов. тести для plywoodLayers (5 it)
plywoodRules.test.ts 3.4 67 нов. тести для plywoodRules (9 it)
techCard.test.ts 4.9 82 нов. тести для techCard (6 it)
wallStrokes.test.ts 7.1 105 нов. тести для wallStrokes (7 it)

src/constructor/assembly/ — 4 файл(ів), 1180 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
AssemblyTab.tsx 42.0 642 нов. Л ВКЛАДКА «ЗБІРКА 3D» — стільниця + фанера + метал разом (02.10.2026, журнал №221). Власник: «хочу 3D бачити і могти підтягувати стільниця, фанера + метал». В…
MetalPartsPanel.tsx 14.1 202 нов. Л «ЗБІРКА 3D» → «ТРУБИ, ОТВОРИ, ВУШКА» (02.10.2026, журнал №222, Лео). Власник: «зроби збірку металу нормальною ) і отвори там якшо треба добавляти і тд» + «вушка для…
assemblyModel.ts 18.6 300 нов. Л МОДЕЛЬ «ЗБІРКИ 3D» — стільниця + фанера + метал в одних координатах (02.10.2026, №221). Власник: «хочу 3D бачити і могти підтягувати стільниця, фанера + метал»; у…
fields.tsx 1.7 36 нов. Л Поля «Збірки 3D» — спільні для вкладки і панелі труб/отворів/вушок (№222: винесено з AssemblyTab.tsx без змін, щоб панель металу брала ті самі).

src/constructor/builder3d/ — 3 файл(ів), 358 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
BuildScene.tsx 14.5 275 нов. Л СПІЛЬНА 3D-СЦЕНА БУДІВНИКА — виріб догори дном, клік по грані (02.10.2026, журнал №223, Лео). Власник: «3D-редактор, де навколо виробу схожим інтуїтивним способом…
InsetRulers.tsx 2.0 37 нов. Л РУЛЕТКИ ПРИПУСКІВ КАРКАСА — у 3D (02.10.2026, журнал №223; було в AssemblyTab, №221). Від краю площі до краю рами, посередині сторін; «Метал» і «Збірка 3D» малюють…
stone.ts 2.5 46 нов. Л КАМІНЬ ДЛЯ БУДІВНИКА — виріб у координатах плити (02.10.2026, журнал №223). Те саме, що «Збірка 3D» збирає для себе (головний елемент із рештою елементів як…

src/constructor/combicut/ — 2 файл(ів), 813 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
CombiCutSim.tsx 19.2 284 нов. Л СИМУЛЯЦІЯ COMBICUT У 3D — програвач плану (11.10.2026, №257, Лео). Власник, 11.10 (скрін Pegasus «Simulation»): «ти можеш таку симуляцію створити нам в CAD?». Стіл із…
CombiCutTab.tsx 41.1 529 нов. Л ВКЛАДКА «COMBICUT» — робочий стіл підготовки програми верстата (10.10.2026, №255, Лео). Власник (голосом, 10.10): «створюємо окремий робочий стіл, в якому готуємо…

src/constructor/docs/ — 10 файл(ів), 1635 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
AssemblySheet.tsx 1.8 42 нов. Л ЗБИРАЛЬНЕ ВИРОБНИЧЕ КРЕСЛЕННЯ — 04.09.2026. Тонка обгортка над «машиною креслень» (../drawing): компонувальник будує аркуш за правилами оформлення і конструктиву з…
DocsTab.tsx 39.2 530 нов. Л ВКЛАДКА «2D РОЗКРІЙ І ДОКУМЕНТИ» — 04.09.2026. Власник: «типу комерційної, але там формуються креслення, тех карта і т. д. з попереднім переглядом». Ліворуч — список…
DrawingSetView.tsx 13.0 208 нов. Г НАБІР КРЕСЛЕНЬ ЦЕХУ — перегляд і експорт (06.09.2026). Аркуші «як у кейсах», по одному на сюжет: збірка → деталі → смуги → мийка → стики/склейка → специфікація… ⚠ у старті через SlabBoard → DxfExportDialog:6
MetalSheet.tsx 1.2 25 нов. Л АРКУШ МЕТАЛОКАРКАСА у «Документах» — 02.10.2026 (журнал №222). Обгортка над drawing/metalSheet.ts: один аркуш на каркас (МК-1 — окреме замовлення зі своїм штампом),…
PlywoodSheet.tsx 1.1 25 нов. Л АРКУШ «ПІДКЛЕЙКА ФАНЕРИ» у «Документах» — 02.10.2026 (журнал №223). Обгортка над drawing/plywoodSheet.ts: один аркуш на виріб із записаним підкладом; під аркушем —…
RouteView.tsx 9.9 187 нов. Л МАПА РУХУ ПО ЦЕХУ І ТАБЛИЦЯ «ЩО РОБИЛИ З КОЖНОЮ ДЕТАЛЛЮ» — 04.09.2026. Вигляд — як у КЕЙСИ/<замовлення>/МАРШРУТ_<замовлення>.pdf з обучалочки: етапи підписами зверху,…
ServicesTab.tsx 1.6 31 нов. Л ВКЛАДКА «ФОРМУВАННЯ ДОКІВ» — 04.09.2026. Власник: «Послуги для виробництва — старий спліт з розкроєм». Тобто ліворуч дошка розкрою, праворуч повний перелік операцій з…
mesJson.ts 4.8 85 нов. Л JSON ДЛЯ MES — 04.09.2026. Чернетка контракту (ТЗ §7.2; формат приймача невідомий — Р1С-8: ділянки й маршрут живуть ТУТ, а не в заявці 1С). Правила: МЕС-2 шапка несе…
routeMap.ts 20.3 301 нов. Л МАРШРУТ ПО ЦЕХУ — по замовленню і по кожній деталі — 04.09.2026. За 06_ОБУЧАЛОЧКА/ПРАВИЛА_ВИРОБНИЦТВА.md (розділ A — мапа цеху ВЦ-1, розділ B — повернення…
techCard.ts 10.9 201 нов. Л ТЕХ КАРТА ДЛЯ ЦЕХУ — 04.09.2026. Бере рядки кошторису (computeEstimate — ті самі, що у вкладці «Послуги для виробництва») і розкладає їх по ділянках у порядку…

src/constructor/drawing/ — 15 файл(ів), 3526 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
compose.ts 24.3 340 нов. Л КОМПОНУВАЛЬНИК КРЕСЛЕННЯ — «машина», що робить аркуш за правилами — 04.09.2026. Вхід — проєкт VS3D (парти розкрою, деталі, шапка). Вихід — DrawingSheet із сутностями,…
exploded.ts 37.4 446 нов. Г ВИБУХОВА СХЕМА (ізометрія) — інструкція збірки «як рознос тумби у меблевиків» (07.09.2026). Два аркуші на виріб: · «Збірка в цеху» — що клеїться в цеху: мийка з…
geom.ts 12.4 229 нов. Г ГЕОМЕТРІЯ ДЛЯ КРЕСЛЕНЬ — спільні дрібниці компонувальників аркушів (06.09.2026). Усе в мм деталі, якщо не сказано інакше. Жодних рішень «що малювати» — лише…
index.ts 0.9 14 нов. Г Набір креслень цеху — один виклик: збірка, деталі, мийка, стики, специфікація. Див. set.ts (перелік аркушів і правила) та sheetsExtra.ts.
layoutSections.ts 1.8 34 нов. Г Розкладка розрізів біля штампа (РЗ-2) — одна функція для компонувальника (щоб знати висоту смуги знизу) і для рендера (щоб поставити блоки). Ряди заповнюються зліва…
metalSheet.ts 24.5 352 нов. Л АРКУШ МЕТАЛОКАРКАСА — генерація креслення (02.10.2026, журнал №222, Лео). Власник: «і окремо генерацію креслень металу». Зразок — аркуші цеху з кейса <№ кейса> («мет…
model.ts 4.3 66 нов. Т МОДЕЛЬ КРЕСЛЕННЯ — сутності аркуша — 04.09.2026. Компонувальник (compose.ts) перетворює проєкт на список сутностей у міліметрах аркуша; рендер (render.tsx) лише малює…
plywoodSheet.ts 13.9 168 нов. Л АРКУШ «ПІДКЛЕЙКА ФАНЕРИ» — генерація креслення підкладу (02.10.2026, журнал №223, Лео). Зразок — аркуші 7–9 кейса <№ кейса>: план виробу з деталями фанери…
render.tsx 14.5 213 нов. Г РЕНДЕР АРКУША — сутності → SVG за стилем цеху — 04.09.2026, розширено 06.09. Тут немає жодного рішення «що малювати» — лише «як»: шар дає колір, товщину і тип лінії…
sampleOrder.ts 6.5 104 нов. Л ТЕСТОВЕ ЗАМОВЛЕННЯ «Кухня Г-подібна» — фікстура для набору креслень (06.09.2026). Вигаданий виріб (не з кейсів), у якому є все, що показує набір: Г-стільниця…
sections.ts 16.8 210 нов. Г РОЗРІЗИ Й ВУЗЛИ — будівельники SectionView для аркушів (06.09.2026). Кожен розріз — маленька картинка в мм аркуша з власним заголовком (КР-3: над «Кромка N» —…
set.ts 70.0 892 нов. Г НАБІР КРЕСЛЕНЬ ЦЕХУ — «як у кейсах», один аркуш на один сюжет (06.09.2026). Замовлення власника: «щоб конструктор робив гарні виробничі креслення як у кейсах, на одну… ⚠ у старті через kernel/shopSheets.ts:34
sheetsExtra.ts 28.1 316 нов. Г ДОДАТКОВІ АРКУШІ НАБОРУ — мийка, стики/склейка, специфікація (06.09.2026). · МИЙКА (ОФ-МЙ): ліворуч — стільниця з вирізом під мийку і отворами сантехніки, розміри до…
style.ts 7.5 120 нов. Г СТИЛЬ КРЕСЛЕННЯ ЦЕХУ — «DWT» у коді — 04.09.2026. Усі числа — з 06_ОБУЧАЛОЧКА/ПРАВИЛА_ОФОРМЛЕННЯ_КРЕСЛЕНЬ.md, розділи ШАРИ / КЛ / ЛН / ШР / ШТ. Прочитано з DWG цеху,…
table.ts 1.7 22 нов. Л ТАБЛИЦЯ НА АРКУШІ (специфікація заготовок, ТБ-1) — спільна для металу й фанери (02.10.2026, журнал №223; було локально в metalSheet.ts, №222). Повертає висоту…

src/constructor/measure/ — 9 файл(ів), 3237 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
MeasureSvg.tsx 10.8 182 нов. Л SVG-полотно заміру — 04.09.2026. Малює відрізки/дуги заміру по шарах, мітки (МТ-1: як є), карту висот (ЗМ-Т9: точка + число). Y перевернуто (DXF → екран). Колесо —…
MeasureTab.tsx 72.2 915 нов. Л ВКЛАДКА «ЗАМІР» — 04.09.2026, переписано під 3D 07.09.2026 (журнал №126), покроково — 03.10.2026 (журнал №224). Власник (03.10): «тут треба обробити замір, зімкнути…
WallUnfoldSvg.tsx 8.6 140 нов. Л Розгортка стіни (u, z) — 07.09.2026 (журнал №126); рулетка і розміри відрізків, розетки зі штрихів — 03.10.2026 (журнал №225). ЗК-17/30: панель будують із 3D-контуру…
i18n.measure.ts 4.4 50 нов. Г СЛОВНИК ВКЛАДКИ «ЗАМІР» (07.09.2026, №126) — окремим файлом, бо вкладка живе своїм модулем constructor/measure. Підключається в src/i18nStatic.ts розгортанням… ⚠ у старті через i18nStatic.ts:16
leicaDxf.ts 45.9 881 нов. Л ЧИТАННЯ ЗАМІРУ З ПРИЛАДУ (Leica DISTO D2G + iCONtrades) — 04.09.2026, переписано під 3D 07.09.2026 (журнал №126). Окремий модуль, НЕ правка parsers/dxf/parser.ts…
measureClean.ts 16.2 283 нов. Л ОЧИЩЕННЯ ЗАМІРУ — ПОКРОКОВО (03.10.2026, журнал №224, Лео). Власник: «тут треба обробити замір, зімкнути контури та прибрати зайве, щоб потім звести виріб з реальними…
measureOps.ts 30.9 552 нов. Л ОПЕРАЦІЇ НАД ЗАМІРОМ — те, що конструктор робить руками в AutoCAD, а інструмент має робити нативно (07.09.2026, журнал №126). Кожна функція чиста: приймає…
measureZip.ts 2.9 63 нов. Л ZIP з приладу (iCONtrades) — 07.09.2026 (журнал №126). ЗК-1/ЗМ-Т12: замір приходить архівом iCONtrades_<замовлення>_Exports/: на кожен проєкт пара <проєкт>_2D.dxf +…
tape.tsx 9.7 171 нов. Л РУЛЕТКА І РОЗМІРИ ВІДРІЗКІВ (03.10.2026, журнал №225, Лео). Власник (на розгортці стіни): «добав тут інструмент рулетку і шоб коли на відрізок клацаєш, показувало…

src/constructor/merge/ — 3 файл(ів), 676 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
MergeTab.tsx 30.6 419 нов. Л ВКЛАДКА «ЗВЕДЕННЯ» — 04.09.2026; №224 (03.10): лише замір і виріб. Власник (03.10): «тут залишиться замір і виріб, і ми їх зводимо, а потім добавляємо фанеру і метал,…
discrepancy.ts 6.2 127 нов. Л ЛИСТ РОЗБІЖНОСТЕЙ — 04.09.2026. §9 «Першої версії конструктора»: один механізм на три сценарії (проєкт ↔ замір, проєкт ↔ креслення, креслення ↔ замір). Тут — перший:…
panelFit.ts 7.5 130 нов. Л РЕДАКТОР СТІНОВИХ ПАНЕЛЕЙ У «ЗВЕДЕННІ» — 12.10.2026, №270 (Лео). Власник після №269: «то зроби редактор для зведення стін панелей». Панель стоїть на стіні…

src/constructor/merge/__tests__/ — 1 файл(ів), 78 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
panelFit.test.ts 4.8 78 нов. тести для panelFit (7 it)

src/constructor/metal/ — 4 файл(ів), 1119 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
MetalTab.tsx 45.0 601 нов. Л ВКЛАДКА «МЕТАЛ» — конструктор металокаркаса під виріб. 04.09.2026 — перша версія: шаблон → ланцюг → окремий виріб. 02.10.2026 (журнал №220) — власник: «беру і…
frameProduct.ts 6.7 126 нов. Л КАРКАС → ВИРІБ ПРОЄКТУ — спільне для «Металу» і «Збірки 3D» (02.10.2026, №221). Каркас — окремий виріб (МК-1) типу «Металопрокат»: один ланцюг профілів…
frameTemplates.ts 2.6 47 нов. Л ШАБЛОНИ КАРКАСІВ КОНСТРУКТОРА — спільні для «Металу» і «Збірки 3D». Винесено з MetalTab.tsx 02.10.2026 (журнал №221): «Збірка 3D» перебудовує каркас після…
metalFit.ts 20.7 345 нов. Л ПІДГОНКА МЕТАЛОКАРКАСА ПІД ДЕТАЛЬ ВИРОБУ — 02.10.2026 (журнал №220). Власник: «беру і перекручую наш виріб верх ногами; обираю чотири кути — і в цю площу обираю…

src/constructor/plywood/ — 3 файл(ів), 1064 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
PlywoodTab.tsx 58.2 743 нов. Л ВКЛАДКА «ФАНЕРА» — 3D-конструктор підкладу (02.10.2026, журнал №223, Лео). Власник: «зроби людський конструктор фанери» + «3D-редактор, де навколо виробу схожим…
plywoodDraft.ts 10.2 184 нов. Л ЧЕРНЕТКА ПІДКЛАДУ — зв'язка запису з виробом (02.10.2026, журнал №223). Без React: з каменю (StoneView) і запису рахує розкладку, відступи з бортів (борт + зазор 3 —…
plywoodRules.ts 7.4 137 нов. Г ПРАВИЛА ФАНЕРНОГО ПІДКЛАДУ — 04.09.2026. Джерело: 06_ОБУЧАЛОЧКА/ПРАВИЛА_ФАНЕРА.md. Кожна функція носить код правила, за яким її можна знайти в обучалочці, тесті й…

src/core/ — 2 файл(ів), 313 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
geometry.ts 4.1 98 = МЕРТВИЙ МЕРТВИЙ ДУБЛЬ lib/project.ts (getStatusLabel, buildDetailCounters…) — не імпортується нікуди (опис 02.09) ⚠ стара копія lib/project.ts (10+ ідентичних функцій)
snapping.ts 9.5 215 -1 МЕРТВИЙ МЕРТВИЙ ДУБЛЬ canvasUtils.snapValue/findSnap — не імпортується нікуди (опис 02.09) ⚠ 16 функцій ідентичні components/2d/canvasUtils.ts

src/domain/ — 48 файл(ів), 12607 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
allowances.ts 8.4 148 = Г src/domain/allowances.ts Єдине джерело припусків, пропилів і вибігів інструменту. До цього модуля та сама матеріальна логіка жила у трьох місцях: ·…
architecture.ts 14.6 295 нов. Г VIYAR STONE АРХІТЕКТОР — МОДЕЛЬ (06.09.2026, перша версія). Третя дочка на тому самому ядрі, що VS3D і Конструктор (04_ВІЗІЯ_АРХІТЕКТУРИ/ВІЗІЯ_АРХІТЕКТУРА.md, рішення…
baseContour.ts 12.5 280 +70 Г БАЗОВИЙ КОНТУР ДЕТАЛІ В ІМЕНОВАНИХ РЕБРАХ — хвиля 4, ремонт ніші. (опис 02.09)
constants.ts 0.7 10 = Л Індекси ребер за іменами сторін — «сегментна» угода. ДЖЕРЕЛО ІСТИНИ ПЕРЕЇХАЛО в domain/sideNaming.ts (хвиля 3, крок 3.1): там воно лежить поруч із другою, «контурною»…
cornerClamp.ts 3.9 79 нов. Г domain/cornerClamp.ts — ПІДРІЗКА обробки кутів межами ребер (FG-11). 28.09.2026 (одна математика, пункт 4). Правило одне: два сусідні вторгнення на одному ребрі…
cutoutAnchor.ts 17.2 353 +61 Г ПРИВ'ЯЗКА ВИРІЗУ ДО КУТА ДЕТАЛІ — єдине джерело істини. (опис 02.09)
cutoutHole.ts 6.3 133 нов. Г domain/cutoutHole.ts — ОДИН полігон отвору вирізу в міліметрах. 25.09.2026 (Лео, захід «одна математика», крок 1). До цього дня форма отвору будувалась двічі: розкрій…
cutoutSideDistances.ts 7.9 152 нов. Г ВІДСТАНІ ВІД ВИРІЗУ ДО ЧОТИРЬОХ СТОРІН ДЕТАЛІ (02.10.2026, журнал №219). Власник: «новий механізм позиціонування вирізів: прив'язки до 4 сторін показано, коли обрано,…
defaults.ts 24.1 197 -31 Г referenceData (матеріали, типи, форми, сляби, 70 профілів кромок), MATERIALS_IN_USE, uid(), createEmptyProject(), DEFAULT_ALLOWANCES (нулі) (опис 02.09) · tsc 1
edgeOccupancy.ts 4.3 75 +6 Г ЗАЙНЯТІ ТОРЦІ (01.09, власник: «ми створили потовщення … і не врахували (опис 02.09)
edgeProfileClasses.ts 27.1 298 = Г КЛАСИФІКАЦІЯ ПРОФІЛІВ ТОРЦЯ ПО МАТЕРІАЛУ І СПОСОБУ ВИКОНАННЯ (01.09.2026). (опис 02.09)
edgeProfileDrawings.ts 429.3 117 = Г РОЗРІЗИ ПРОФІЛІВ ТОРЦЯ — ВЕКТОРНІ (SVG), з каталогу цеху «Все кромки» (PDF 17.09.25). НАВІЩО ДРУГИЙ МОДУЛЬ. edgeProfileImages.ts тримає ті самі креслення 1-бітними… ⚠ 440 КБ inline-SVG — у стартовому чанку
edgeProfileImages.ts 79.0 117 = Г РОЗРІЗИ ПРОФІЛІВ ТОРЦЯ — з каталогу цеху «Все кромки» (PDF 17.09.25). НАВІЩО. У бланку погодження назва профілю («Классік-2», «BullNose R12») нічого не каже ані… ⚠ 81 КБ base64-PNG — у стартовому чанку
edgeTreatment.ts 8.8 184 = Г ОБРОБКА ТОРЦЯ — ОДНЕ ЧИТАННЯ НА ВЕСЬ ЗАСТОСУНОК. (опис 02.09)
elementToDetail.ts 14.8 243 +25 Г Конвертер Елемент → Деталь (тільки для розкрою); anchorContextFor; fold/thickening свідомо не копіює (опис 02.09) · tsc 2
grooveCatalog.ts 9.4 151 = Г КАТАЛОГ ПРОТОЧОК ЦЕХУ (28.08.2026). (опис 02.09)
ids.ts 9.1 155 +38 Г buildElementPath/buildDetailPath/toSlot/findDetailByPathOrSlot, EDGE_KIND_LABEL (fold=Потовщення, thickening=Підворот), parseAdditionSlot (#n, ownerSlot) (опис 02.09)
joints.ts 40.6 805 +487 Г Спільна математика стиків — одна на рушій розкрою і на інтерфейс. (опис 02.09)
localSlabCatalog.ts 3.4 55 нов. Г ВЛАСНІ КАРТКИ КАТАЛОГУ СЛЯБІВ (№158, власник 08.09: «добав сюди 1 матеріал зразу з фотками»). Навіщо. Каталог тягнеться з довідника номенклатур; коли сервіс…
manufacturability.ts 23.5 458 +23 Г src/domain/manufacturability.ts Перевірка виробничості: чи можна це фізично зробити і чи не втрачає клієнт гарантію. Числа з…
materialRules.ts 18.9 426 = Г ТУ ЦЕХУ ПО МАТЕРІАЛАХ (28.08.2026). Джерело — «Деякі ТУ для стільниць зі штучного каменю. Все кромки» від 26.03.2025. Це не наші припущення, а межі, які цех… ⚠ з 02.09 ожив: stounik/checks.ts:23 бере 2 функції; решта — лише тести; NC300 3000×1600 (:52) проти 3100×1500 у manufacturability.ts:29
materialThickness.ts 9.5 160 = Г ТОВЩИНИ ЗА МАТЕРІАЛОМ (рішення власника 01.09.2026). (опис 02.09)
metalChain.ts 6.9 145 = Г Ланцюг профілів — проєктування каркаса «від торця» (MVP Viyar Metal). (опис 02.09) · tsc 1
metalCutList.ts 5.0 97 нов. Г МЕТАЛ У РОЗКРІЙ — реальні заготовки (журнал №222, Лео). До №222 розкрій брав width — осьову довжину ланцюга: рама 1154 між осями давала дві труби по 1154 і дві по…
metalHoles.ts 13.2 254 нов. Г ОТВОРИ І ВУШКА МЕТАЛОКАРКАСА — 02.10.2026 (журнал №222, Лео). Власник: «і отвори там якшо треба добавляти» + «вушка для кріплення». · МК-5 (ФАКТ, 1 кейс): наскрізні…
metalJoints.ts 23.2 436 нов. Г СТИКИ МЕТАЛОКАРКАСА — 02.10.2026 (журнал №222, Лео). Власник: «зроби збірку металу нормальною». На кутах рами були вирізи, а труби заходили одна в одну, бо ланцюг…
metalProfiles.ts 4.1 89 = Г Сортамент металопрокату — MVP Viyar Metal. Той самий принцип, що з каменем: менеджер обирає профіль і довжину, а все похідне (маса, площа фарбування, смужка в…
metalTemplates.ts 24.1 483 +74 Г Параметричні шаблони металовиробів (MVP Viyar Metal). (опис 02.09)
plywood.ts 52.0 835 нов. Г ФАНЕРНИЙ ПІДКЛАД — ЗАПИС У ВИРОБІ Й РОЗКЛАДКА ПО КОНТУРУ (02.10.2026, журнал №223, Лео). Власник: «тепер зроби людський конструктор фанери» + «3D-редактор, де навколо…
plywoodElements.ts 5.3 84 нов. Г ФАНЕРА У ВИРОБІ — похідні елементи (02.10.2026, журнал №223, Лео). Запис підкладу (ElementDefinition.plywood, див. domain/plywood) живе на головному елементі…
productSink.ts 6.2 128 +4 Г Мийка, ВСТАНОВЛЕНА в стільницю (нижній монтаж). (опис 02.09) · tsc 1
projectMigrations.ts 6.9 129 +40 Г ВЕРСІЯ ФОРМАТУ ПРОЄКТУ І МІГРАЦІЇ (28.08.2026, перед торцями в 3D). (опис 02.09)
quote1cCatalog.ts 5.7 107 = Г ЗГЕНЕРОВАНО з переліку номенклатур 1С «Виготовлення …» (05.08.2026). (опис 02.09)
quoteCalc.ts 34.4 620 +42 Г Прорахунок для клієнта — довідники й типи документа. Це ОКРЕМА математика від виробничого BOM: тут вартість формується від площі/довжини/штук виробів за…
quoteGuards.ts 2.1 34 нов. Г ЩО НЕ ДАЄ СФОРМУВАТИ КП (рішення власника 01.10.2026, фокус-група). Деталь на слебі іншої товщини (12 мм на 12.5 мм) — розкрій це дозволяє і лише попереджає (рішення…
quoteServiceCodes.ts 10.4 98 нов. Г КОДИ 1С ДОДАТКОВИХ ПОСЛУГ ПРОРАХУНКУ ЗА МАТЕРІАЛОМ (02.10.2026, журнал №217). Джерело — три файли власника InstructionsRules\Додаткові послуги: «додаткові послуги…
radiusElement.ts 13.3 272 = Г РАДІУСНІ (ГНУТІ) ЕЛЕМЕНТИ — FG-27, ТЗ від 19.08.2026. Смуга потовщення, підвороту, ноги чи панелі, яка проходить обидві сторони скругленого кута, мусить обійти його…
room.ts 22.3 501 = Г ПРИМІЩЕННЯ (БАЗА) — модель і чиста математика. 01.09.2026, рішення власника. Навіщо. Половина ТУ цеху — про стосунок деталі до кімнати: зазор до стіни 2 мм, панель…
roomPlacement.ts 6.8 138 = Г «ПОСТАВИТИ НА ПЛОЩИНУ» — прив'язка виробу до бази (01.09.2026, пункт 7). (опис 02.09)
serviceMapping.ts 30.9 468 +8 Г src/domain/serviceMapping.ts Таблиця відповідності «виробничий факт → послуга прайсу». Це ДАНІ, а не логіка. Додати послугу до обробки, вимкнути зайву, змінити…
services.ts 14.1 159 -4 Г Тип послуги + вбудований каталог (ціни ЗАВЖДИ 0) (опис 02.09)
sideLocks.ts 9.4 177 нов. Г ЗАМКИ НА СТОРОНАХ (04.09.2026, задум власника). Проблема, яку це лікує. У Г- і П-подібної сторони не незалежні: вони зв'язані рівнянням. У П по горизонталі це A = G +…
sideNaming.ts 11.5 211 +42 Г ІМЕНА СТОРІН — ЄДИНЕ ДЖЕРЕЛО (П-2, хвиля 3, крок 3.1). ═══ ГОЛОВНЕ, ЩО ТРЕБА ЗНАТИ ═══ Сторона «A» — це ПЕРШЕ ребро контуру. Одна угода на весь застосунок. Контур…
slabCatalog.ts 16.4 310 +118 Г Довідник номенклатур → картки каталогу слябів. (опис 02.09)
types.ts 58.8 1184 +137 Т Усі типи домену: ElementDefinition→ProductElement→Product, Joint, Detail, DetailPart, Placement, SlabInstance, Project (formatVersion, room, allowMirroring), EdgeTreatment, QuoteCalc (опис 02.09) ⚠ поля [LEGACY] skirtings/wallPanels/legs (:69)
uCutout.ts 14.8 301 = Г П-ПОДІБНИЙ ВИРІЗ (ніша) — ХВИЛЯ 4, крок 4.4 (FG-34). (опис 02.09)
viyarMapping.ts 15.6 210 +18 Г src/domain/viyarMapping.ts Прив'язки виробничих фактів до КОДІВ ВіярПро/1С. Вбудований набір правил (serviceMapping.ts) вказує на внутрішні послуги застосунку —…
viyarServiceCatalog.ts 39.7 246 = Г src/domain/viyarServiceCatalog.ts Довідник послуг ВіярПро/1С — 178 позицій з обліковими кодами. ЗГЕНЕРОВАНО з двох джерел: · excel_dump.csv (вивантаження «Послуги для…

src/domain/__tests__/ — 42 файл(ів), 5401 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
allowances.test.ts 9.1 224 = тести для allowances (20 it)
cutoutAnchor.test.ts 8.8 188 = тести для cutoutAnchor (23 it)
cutoutAnchorComplex.test.ts 6.4 134 = тести для cutoutAnchorComplex (12 it)
cutoutAxisSides.test.ts 4.4 86 нов. тести для cutoutAxisSides (3 it)
cutoutCornerRadiusMin.test.ts 0.9 18 нов. тести для cutoutCornerRadiusMin (2 it)
cutoutSideDistances.test.ts 7.3 118 нов. тести для cutoutSideDistances (10 it)
edgeKindNames.test.ts 4.5 83 = тести для edgeKindNames (7 it)
edgeOccupancy.test.ts 6.0 104 +15 тести для edgeOccupancy (10 it)
edgeProfileClasses.test.ts 6.1 98 = тести для edgeProfileClasses (7 it)
edgeProfilesCatalog.test.ts 7.2 144 = тести для edgeProfilesCatalog (16 it)
edgeTreatment.test.ts 5.3 107 = тести для edgeTreatment (14 it) · tsc 1
ids.test.ts 3.0 64 = тести для ids (9 it)
jointFieldPairs.test.ts 4.2 87 нов. тести для jointFieldPairs (9 it)
jointFieldPairsRadius.test.ts 4.1 74 нов. тести для jointFieldPairsRadius (3 it)
joints.test.ts 11.0 218 = тести для joints (18 it)
lcutEdgeLabels.test.ts 2.3 49 нов. тести для lcutEdgeLabels (5 it)
manufacturability.test.ts 13.4 292 +16 тести для manufacturability (27 it)
materialRules.test.ts 5.1 105 = тести для materialRules (16 it)
materialThickness.test.ts 4.5 87 = тести для materialThickness (11 it)
metalChain.test.ts 4.2 91 = тести для metalChain (7 it)
metalJoints.test.ts 13.6 221 нов. тести для metalJoints (13 it)
metalProfiles.test.ts 3.8 79 = тести для metalProfiles (7 it)
metalTemplates.test.ts 8.8 168 +1 тести для metalTemplates (15 it)
minSide.test.ts 2.0 36 = тести для minSide (4 it)
mirrorAndSides.test.ts 5.4 108 нов. тести для mirrorAndSides (10 it)
plywood.test.ts 24.7 338 нов. тести для plywood (24 it)
productSink.test.ts 5.8 124 +5 тести для productSink (10 it)
projectMigrations.test.ts 5.5 119 +54 тести для projectMigrations (12 it)
quoteGuards.test.ts 1.2 24 нов. тести для quoteGuards (2 it)
quoteServiceCodes.test.ts 11.8 176 нов. тести для quoteServiceCodes (10 it)
referenceSide.test.ts 3.0 57 = тести для referenceSide (8 it)
room.test.ts 8.7 171 = тести для room (18 it)
roomPlacement.test.ts 4.5 68 = тести для roomPlacement (6 it)
serviceMapping.test.ts 16.3 327 = тести для serviceMapping (40 it)
sideLocks.test.ts 7.7 152 нов. тести для sideLocks (20 it)
sideNaming.test.ts 4.6 107 = тести для sideNaming (12 it)
sinkCenter.test.ts 2.3 43 = тести для sinkCenter (3 it)
sinkFromProduct.test.ts 3.3 64 = тести для sinkFromProduct (4 it)
slabCatalog.test.ts 12.6 246 +119 тести для slabCatalog (30 it)
uCutout.test.ts 12.3 244 = тести для uCutout (18 it)
viyarServiceCatalog.test.ts 5.4 108 = тести для viyarServiceCatalog (15 it)
wallConsoleTemplate.test.ts 2.8 50 нов. тести для wallConsoleTemplate (4 it)

src/engines/ — 34 файл(ів), 14831 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
approvalSplit.ts 13.6 293 -1 Г src/engines/approvalSplit.ts (P1.2 — розбиття деталі по стику) Самодостатній модуль. Уся геометрія split-логіки, перенесена 1:1 з робочого застосунку (5174). Імпортує…
apsExport.ts 6.8 158 нов. Г src/engines/apsExport.ts №173 · Міст Студія → МЕС (APS). По той бік моста — C:\Works\MES\smart-factory-mes: aps_engine.py читає контракт «mes-aps-1» (parse_import →… ⚠ APS_BASE — адреса localhost літералом (:26)
arExport.ts 17.3 353 +50 Л ЕКСПОРТ ВИРОБУ В ДОПОВНЕНУ РЕАЛЬНІСТЬ (27.08.2026, задача власника). (опис 02.09) · tsc 1
arSceneRegistry.ts 2.5 47 нов. Л src/engines/arSceneRegistry.ts №177 · Доступ до живої 3D-сцени з інших вкладок. Пакет для МЕС збирається у вкладці «Документи», а модель виробу живе у «3D Підборі»:…
arcBands.ts 8.9 190 нов. Г ГНУТІ ДОПОВНЕННЯ ПО ДУГАХ — ПРАВИЛО (30.09.2026, Лео; винесено з Detail3DPreview без зміни поведінки, щоб ядро OCCT і старий ArcBand читали ОДНЕ рішення). Два…
assemblyPlan.ts 16.0 318 нов. Г src/engines/assemblyPlan.ts №178/№179 · Карта цехових склейок для МЕС. МЕС побачив у пакеті 20 заготовок і не мав чим відрізнити «двадцять штук на піраміду» від…
attachmentShrink.ts 32.3 533 нов. Г УСАДКА ВТОПЛЕНОГО ДОПОВНЕННЯ (Б-170, правило власника 09.09). Правило цеху, слово в слово: «якщо деталь-нога на краю, то вона примикає під 45°; а якщо втоплена —…
cutOutlineSeam.ts 4.4 68 нов. Г ШОВ «КОНТУР РІЗУ» ДЛЯ РОЗКРОЮ (09.10.2026, №246, Лео). Розкрій (engines/packing) і перевірка колізій уміють рахувати по DetailPart.cutOutline — точному контуру ядра.…
drainGrate.ts 10.0 203 = Г РЕШІТКА ЗЛИВУ — водоструменевий різ у дні мийки (28.08.2026). (опис 02.09)
edgeCutters.ts 60.1 1191 +101 Г РІЗАКИ ТОРЦІВ ДЛЯ 3D (28.08.2026, рішення власника). (опис 02.09)
estimate.ts 15.4 330 +26 Г src/engines/estimate.ts Один розрахунок вартості на весь застосунок. До цього модуля кошторис і комерційна пропозиція були двома різними математиками. Кошторис…
geometry.ts 137.6 2613 -141 Г Серце розкрою: єдиний експорт explodeDetails; контури, кути (reflex), різ хордами стиків, мийки (14 партів), метал, customPoints (опис 02.09) ⚠ одне замикання createGeometryEngine 16–2585; jointNotices (:1659) лише пишеться; «отвір під вставку зливу — тимчасово вимкнений» (:1469) · tsc 4
geometryUtils.ts 28.4 513 +118 Г Спільна геометрія: textureGroupKey (з tg:), sideContourRange (noGap/fullGapAfter), полігони, довжини прямих/кривих (опис 02.09)
grouping3d.ts 5.0 146 = Л Легасі-групування 3D зі плоских деталей (buildAssemblyGroups) — для виробів мертвий шлях (опис 02.09)
mesPack.ts 37.5 707 нов. Г src/engines/mesPack.ts №174 · «Зберегти для МЕС» — повний пакет vs3d-pack-1 одним ZIP. Канал 2 інтеграції з МЕС (C:\Works\MES\smart-factory-mes): якщо mes-aps-1… ⚠ власні CRC32+ZIP (:40–122) — третій механізм ZIP
metalGeometry.ts 8.6 165 нов. Г МЕТАЛ → THREE-ГЕОМЕТРІЯ ЗАГОТОВОК — 02.10.2026 (журнал №222, Лео). Стики (domain/metalJoints) кажуть, де і як обрізана кожна труба; тут з цього будується меш у локалі…
miterAssembly.ts 45.7 672 +430 Г СТИКИ 45° У ЗБІРЦІ ВИРОБУ — спільна математика для обох 3D (02.09.2026). (опис 02.09)
nestingScope.ts 1.4 18 нов. Г МЕЖА РОЗКРОЮ КАМЕНЮ (10.10.2026, №256, Лео). Власник, 10.10 (голосом): «у нас в розкрій залітає метал і фанера — бредятина. Метал віддаємо в цех металу кресленням як…
packing.ts 85.4 2042 +13 Г Нестинг: economy/optimal/full_texture, autoPack(preserveManual), nestingSavings, detectConflicts (thicknessWarning), buildTextureLayout, mirrorVariants/mirroringAllowed (3 умови: allowMirroring, !textureSelection, !textureGroupLabel) (опис 02.09) ⚠ groupedParts :543, nearbyElementReliefPlacements :1130, rotatePoint :106 — не викликаються · tsc 5
partsGlb.ts 4.8 111 нов. Л src/engines/partsGlb.ts №177 · GLB заготовок — щоб модель у пакеті для МЕС була ЗАВЖДИ. Головна модель береться з живої 3D-сцени (arSceneRegistry): там виріб…
productionFacts.ts 30.5 631 +54 Г src/engines/productionFacts.ts Рушій виробничих фактів. Факт — це величина, яку можна перевірити лінійкою: метри різу, штуки отворів, метри крайки, площа, кількість…
quoteCalc.ts 35.3 657 +10 Г Движок Прорахунку: 5 груп рядків; unitPrice = manual(калібрування) ?? erp ?? 0; source erp/manual/none; autoQuoteServices, mergeQuoteServices (>0), quoteItemsFromProject (опис 02.09)
quoteLayoutSync.ts 3.2 59 нов. Г ПРОРАХУНОК НЕ ВІДСТАЄ ВІД РОЗКРОЮ (фокус-група 01.10, п. 10; рішення П-7). Скарга: змінили розкрій, деталі чи послугу — а в «Прорахунку» лишились старі площі, доки…
renderContract.ts 5.9 112 нов. Л src/engines/renderContract.ts №179 · render-contract.json — карта 3D для адаптера МЕС. Брунеллескі (ТЗ 10.09, §4 шлях B і §10): якщо трансформації запечені в GLB —…
sceneLayout.ts 4.6 107 = Г РОЗСТАНОВКА ВИРОБІВ НА 3D-СЦЕНІ — хвиля 5, крок 5.1 (П-3). Скарга фокус-групи: «кілька виробів злипаються в центрі сцени, їх не розставити». Причин було дві: ·…
shapeBuilder.ts 29.8 633 -153 Г THREE.Shape із драфта, edgeMap[shape.curves.length-1] (інв. 2.33), contourPointsFor (інв. 2.35), contourForCutters (опис 02.09) ⚠ import type з components/forms/utils/draftHelpers (:2) — валить coreBoundary.test · tsc 2
sinkAssembly.ts 6.9 168 +59 Г Єдине джерело трансформацій збірки чаші (редактор, Підбір, ProductElement3DNode) (опис 02.09)
sketchupExport.ts 0.8 14 = МЕРТВИЙ ВИДАЛЕНО 27.08.2026. Тут жив самописний експорт у COLLADA (.dae) для SketchUp. Прожив кілька годин: SketchUp 2025 узяв із нього одну плиту без текстур. З'ясувалось,… ⚠ порожня заглушка «ВИДАЛЕНО 27.08»
slabOutline.ts 13.7 299 = Г КОНТУР НАТУРАЛЬНОГО СЛЕБА З ФОТО (27.08, задача власника). (опис 02.09)
surfaceGrooves.ts 17.4 361 +27 Г ФРЕЗЕРУВАННЯ ПЛОЩИНИ: проточки для води і декоративні канавки. (опис 02.09)
textureLayout.ts 17.2 408 -5 Г Математика 2D Підбору (опис 02.09) ⚠ 22 експорти без споживачів — споживачі мають свої копії
tileLayout.ts 23.8 423 нов. Г РУШІЙ РОЗКЛАДОК — Viyar Stone Архітектор (06.09.2026, перша версія). Що робить: бере поверхню (контур + отвори) і розкладку (патерн, формат, шов, старт, кут) →…
transform3d.ts 13.8 266 +112 Г РОЗМІЩЕННЯ ДОПОВНЕННЯ НА РЕБРІ БАТЬКА — спільна математика для обох 3D. (опис 02.09)
workerMapper.ts 0.8 22 = Г stripBase64 — прибирає photo і photoBacklit перед воркером (опис 02.09)

src/engines/__tests__/ — 59 файл(ів), 8905 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
allowanceOffset.test.ts 6.5 78 нов. тести для allowanceOffset (5 it)
apsExport.test.ts 3.3 64 нов. тести для apsExport (4 it)
arExportNames.test.ts 2.6 57 нов. тести для arExportNames (1 it)
arcSideProbe.test.ts 3.7 80 = тести для arcSideProbe (3 it)
assemblyPlan.test.ts 7.9 118 нов. тести для assemblyPlan (4 it)
attachmentInsideEdge.test.ts 3.9 74 нов. тести для attachmentInsideEdge (4 it)
attachmentOrientation.test.ts 5.8 114 = тести для attachmentOrientation (5 it) · tsc 2
attachmentPlacement.test.ts 3.7 65 = тести для attachmentPlacement (7 it)
attachmentShrink.test.ts 10.9 194 нов. тести для attachmentShrink (17 it)
combicut.test.ts 18.0 249 нов. тести для combicut (11 it)
combicutOrder.test.ts 7.9 107 нов. тести для combicutOrder (7 it)
combicutSim.test.ts 6.9 109 нов. тести для combicutSim (6 it)
contourBaseline.test.ts 18.4 315 нов. тести для contourBaseline (20 it)
cornerOverflow.test.ts 5.1 111 = тести для cornerOverflow (4 it)
cutOutline.test.ts 8.6 129 нов. тести для cutOutline (8 it) · tsc 1
cutoutOnJoint.test.ts 6.2 109 нов. тести для cutoutOnJoint (5 it)
cutoutRotation.test.ts 4.2 85 нов. тести для cutoutRotation (4 it)
drainGrate.test.ts 4.6 94 = тести для drainGrate (13 it)
edgeCutters.test.ts 6.2 140 = тести для edgeCutters (9 it)
edgeCuttersProfiles.test.ts 2.7 47 = тести для edgeCuttersProfiles (4 it)
edgeCuttersRadius.test.ts 14.8 298 = тести для edgeCuttersRadius (15 it)
edgeLengthNominal.test.ts 4.3 62 нов. тести для edgeLengthNominal (5 it)
edgeLengthOnCutParts.test.ts 4.5 90 нов. тести для edgeLengthOnCutParts (5 it)
estimate.test.ts 11.4 237 -17 тести для estimate (15 it) · tsc 1
fireplaceEndToEnd.test.ts 12.0 243 = тести для fireplaceEndToEnd (11 it)
geometry.test.ts 5.3 162 = тести для geometry (6 it) · tsc 2
grouping3d.test.ts 5.3 86 = тести для grouping3d (4 it) · tsc 3
inwardOnLShape.test.ts 4.1 87 нов. тести для inwardOnLShape (4 it)
jointFactsUnique.test.ts 4.1 86 нов. тести для jointFactsUnique (4 it)
jointFieldScope.test.ts 3.3 87 нов. тести для jointFieldScope (4 it)
jointMoney.test.ts 6.5 146 +5 тести для jointMoney (7 it)
jointSideNames.test.ts 6.8 108 нов. тести для jointSideNames (3 it)
jointSplit.test.ts 9.7 261 = тести для jointSplit (11 it)
lcutSides.test.ts 6.0 140 нов. тести для lcutSides (6 it)
mathUnify25-09.test.ts 10.3 174 нов. тести для mathUnify25-09 (6 it)
mesPack.test.ts 9.5 184 нов. тести для mesPack (9 it)
mirroring.test.ts 10.3 191 = тести для mirroring (13 it)
miterInsetLeg.test.ts 4.8 111 нов. тести для miterInsetLeg (3 it)
mockData.ts 3.0 114 = тестові дані/хелпер ⚠ імпортується з main.tsx:14 — у бойовій збірці на старті виконується explodeDetails(mock) (:103)
nestingPersistence.test.ts 8.1 157 = тести для nestingPersistence (10 it)
nestingScope.test.ts 0.8 15 нов. тести для nestingScope (1 it)
packing.test.ts 1.7 44 = тести для packing (1 it)
partsGlb.test.ts 3.0 70 нов. тести для partsGlb (3 it)
pidvorot29-09.test.ts 35.7 558 нов. тести для pidvorot29-09 (27 it)
productionFacts.test.ts 20.5 479 = тести для productionFacts (36 it)
quoteCalc.test.ts 39.4 854 +2 тести для quoteCalc (70 it)
quoteLayoutSync.test.ts 2.4 41 нов. тести для quoteLayoutSync (5 it)
radiusElement.test.ts 14.9 300 = тести для radiusElement (26 it)
radiusProductPath.test.ts 5.4 121 = тести для radiusProductPath (4 it)
renderContract.test.ts 4.0 73 нов. тести для renderContract (3 it)
sceneLayout.test.ts 4.2 90 = тести для sceneLayout (8 it)
shapeBuilder.test.ts 6.1 130 +38 тести для shapeBuilder (12 it) · tsc 1
sinkAssembly.test.ts 5.0 95 = тести для sinkAssembly (8 it)
slabOutline.test.ts 6.6 128 = тести для slabOutline (10 it)
surfaceGrooves.test.ts 5.5 122 = тести для surfaceGrooves (14 it)
thicknessBan.test.ts 4.0 84 = тести для thicknessBan (5 it)
tileLayout.test.ts 11.7 194 нов. тести для tileLayout (24 it)
wave2Money.test.ts 4.4 99 = тести для wave2Money (6 it)
workerBoundary.test.ts 1.7 45 = тести для workerBoundary (1 it)

src/engines/__tests__/__snapshots__/ — 2 файл(ів), 294 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
geometry.test.ts.snap 4.3 229 -18 знімок vitest
packing.test.ts.snap 1.6 65 = знімок vitest

src/engines/combicut/ — 7 файл(ів), 1948 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
machine.ts 4.7 73 нов. Л ВЕРСТАТ BRETON COMBICUT — ЧИСЛА З ЕТАЛОНІВ (10.10.2026, №255). Три повні програми з цеху (LST_14011 — диск Ø397,5, сляб 20; SLAB13189 — Ø406, сляб 6, два проходи;…
pegasusDxf.ts 7.9 108 нов. Л DXF ДЛЯ PEGASUS (CAM Breton) — ПЛАН У ШАРАХ (10.10.2026, №255). Власник: «у проді даємо Pegasus готовий файл, щоб там уже було видно, де вода, де що; оператор лише…
plan.ts 33.2 542 нов. Л ПЛАН ПРОГРАМИ COMBICUT ДЛЯ ОДНОГО СЛЯБА (10.10.2026, №255). Чиста математика. розкрій (сляб + розміщення + контури партів) → відрізки контурів CcSeg → автомат…
sim.ts 17.5 290 нов. Л СИМУЛЯЦІЯ ПРОГРАМИ COMBICUT — «час → поза голови» (11.10.2026, №257, Лео). Власник, 11.10 (скрін Pegasus «Simulation»): «ти можеш таку симуляцію створити нам в CAD?».…
txt.ts 14.1 284 нов. Л ЗАПИС ПЛАНУ У TXT COMBICUT — ПРОГРАМА SINUMERIK 840D (10.10.2026, №255). Власник: «на стійці є XML у списку, а виконується TXT — підготуємо пару». Структура — 1:1 з…
types.ts 12.7 251 нов. Г COMBICUT — ПІДГОТОВКА ПРОГРАМИ ДЛЯ BRETON COMBICUT З РОЗКРОЮ (10.10.2026, №255). Власник, 10.10 (голосом): «окремий робочий стіл, в якому готуємо файли CombiCut: коли…
xml.ts 26.8 400 нов. Л ЗАПИС ПЛАНУ У XML COMBICUT (10.10.2026, №255). Структура — за еталонами 09.10 (LST_14002/14011/14015, SLAB_13189): Program → Versions → Configuration (Tools,…

src/features/cad-release/ — 2 файл(ів), 85 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
CadReleaseActions.tsx 3.9 40 нов. Л експорт: downloadBuiltPackage, CadReleaseActions ⚠ адреса PLM літералом (:24, :31) [сторона ІТ]
OrderFolderSave.tsx 4.9 45 нов. Г ПАПКИ ЗАМОВЛЕНЬ НА СЕРВЕРІ MES (08.10.2026, Бруно; перенесено Лео №244 з review-only.patch без зміни логіки). Кнопка «Зберегти пакет у папку замовлення»: той самий… ⚠ адреса МЕС за замовчуванням (:12) [сторона ІТ]

src/features/object-link/ — 2 файл(ів), 85 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
ObjectLinkEntry.tsx 2.1 46 нов. Г Відкриває проєкт, на який вела кнопка з ERP (?object_id=…). Чекає, доки стор підніме локальний проєкт з IndexedDB, — інакше той перезаписав би щойно відкритий. Чужий…
objectLink.ts 1.8 39 нов. Г Перехід з ERP у сервіс: кнопка в замовленні веде на https://slabcutplanner.viyar.tech/?object_id=<id проєкту в кабінеті> (посилання збирає бекенд — objectUrlFor у…

src/features/object-link/__tests__/ — 1 файл(ів), 30 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
objectLink.test.ts 1.3 30 нов. тести для objectLink (2 it)

src/features/order-registry/ — 7 файл(ів), 245 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
NewRegistryOrder.tsx 2.4 35 нов. Г експорт: NewRegistryOrder
RegistryDesk.tsx 9.3 78 нов. Г Update header only: never re-import an editor that may have changed while saving. ⚠ адреса PLM літералом (:74); стиснений однорядковий код [сторона ІТ]
client.test.ts 2.6 29 нов. тести для client (6 it)
client.ts 2.9 33 нов. Г Quote fields are authoritative when present, including deliberate clearing.
forkProject.test.ts 2.7 26 нов. тести для forkProject (3 it)
forkProject.ts 2.0 41 нов. Г Fail before touching the editor if a recovery snapshot cannot be stored.
registry.css 2.0 3 нов. —

src/features/server-project/ — 4 файл(ів), 158 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
ServerProjectEntry.tsx 3.1 53 нов. Г Preserve a recoverable local snapshot before replacing the editor.
ServerSaveButton.tsx 0.1 1 нов. Г —
transport.test.ts 2.5 43 нов. тести для transport (5 it)
transport.ts 4.3 61 нов. Г експорт: SaveSession, Receipt, serverBase, handoffToken, ProjectTransport · tsc 2

src/features/workspace-entry/ — 2 файл(ів), 18 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
initializeWorkspace.test.ts 0.9 8 нов. тести для initializeWorkspace (2 it)
initializeWorkspace.ts 0.5 10 нов. Г Explicit links select the workspace independently of a PLM handoff.

src/hooks/ — 1 файл(ів), 106 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
useIsMobile.ts 5.1 106 = Г Мобільний режим — коли вмикається. (опис 02.09)

src/kernel/ — 27 файл(ів), 3923 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
KernelBadge.tsx 2.7 44 нов. Г ПЛАШКА АКТИВНОГО ЯДРА (30.09.2026, Лео). Умова брата №4: який будівник активний — видно завжди, а не лише в коді. У VS CAD плашка висить у кутку кожного екрана; веде… ⚠ setInterval 700 мс (:12) назавжди, і в Studio, де плашка схована (hidden)
assemblyPreview.ts 0.5 8 нов. Г Both editor and pickup views share this queue. Only visible previews use it; exports and exact production outlines keep their original requested version.
attachmentsFromPlan.ts 28.1 412 нов. Г СІМЕЙСТВО 2 — ДОПОВНЕННЯ З ПЛАНУ СТИКІВ → МОДЕЛЬ ЯДРА (30.09.2026, Лео). Правила лишаються в Studio (engines/miterAssembly: де стоїть смуга, чи на вус, як сходяться…
config.ts 5.2 77 нов. Г АКТИВНИЙ БУДІВНИК (30.09.2026, Лео). Умова брата №4: після приймання сімейства — один активний будівник, старий лише для порівняння, і ніколи як прихована підміна.… ⚠ IS_VS_CAD = true (:30); cadEnabled()/isStudioMode() — єдиний вимикач CAD у бойовій збірці
convertProject.ts 4.3 83 нов. С КОНВЕРТЕР ПРОЄКТУ STUDIO → МОДЕЛІ ЯДРА (30.09.2026, Лео). Вхід — той самий файл проєкту, що його зберігає Studio (exportProject: JSON Project з…
cutOutlines.ts 7.7 148 нов. Г КОНТУР РІЗУ ДЛЯ РОЗКРОЮ — ПРОВАЙДЕР ЯДРА (09.10.2026, №246, Лео). Власник: «нестинг на точних контурах — давай, з головою». Розкрій (engines/packing) кладе деталі й… ⚠ провайдер контурів різу; реєструється в main.tsx:48 для всіх режимів, і Studio
dxfGeometry.ts 4.3 92 нов. Г ГЕОМЕТРІЯ ДЛЯ DXF (01.10.2026, за рецензією Бруно, п. 3). «Прибрати непомітну заміну кіл ламаними»: там, де точний контур від ядра відомий, він і їде у файл (дуги…
dxfWriter.ts 8.3 163 нов. Г ЗАПИС DXF (30.09.2026 — перший DXF-вихід; 01.10.2026 — переписано за рецензією Бруно). Що було не так (Бруно, незалежна перевірка ezdxf 1.4.4): 1. файл оголошував…
exactPartInput.ts 3.2 45 нов. Г Shared pre-WASM guards and preparation, extracted verbatim from exactParts. No OCCT loading, no worker initialization, no network access.
exactParts.ts 1.5 27 нов. Г OCCT worker lab: the existing outline algorithm lives unchanged in the core. Browser callers share the same worker/kernel as 3D, sections and STEP export.
exactPartsCore.ts 7.8 136 нов. Л ПАРТИ РОЗКРОЮ → ТОЧНІ КОНТУРИ З ЯДРА (30.09.2026, ніч, Лео). Розкрій (engines/geometry.explodeDetails) лишається джерелом правил: які парти, де лінії стиків, які…
exportCutDxf.ts 18.4 321 нов. Г ЕКСПОРТ РОЗКРОЮ В DXF (30.09.2026 — перша версія; 01.10.2026 — профілі верстатів і точна геометрія за рецензією Бруно). ТРИ ПРОФІЛІ (власник 01.10: «щоб давало вибір…
metalFromDraft.ts 5.5 97 нов. Г СІМЕЙСТВО 4 — МЕТАЛОПРОКАТ → МОДЕЛЬ ЯДРА (30.09.2026, Лео; №222 — 02.10.2026). Правило одне і в Studio: domain/metalChain.metalChainPieces — ланцюг «черепашкою»…
modelFromDraft.ts 27.3 411 нов. Г КОНВЕРТЕР STUDIO → МОДЕЛЬ ЯДРА (30.09.2026, Лео). Спільне зі Studio (не дублюється, імпортується як є): DetailDraft, getDetailPointsAndBounds / buildDetailShape /…
partCuts.ts 7.1 125 нов. Г ЛІНІЇ СТИКІВ ПАРТА (06.10.2026, №232 — винесено з exactParts, без змін математики). Розкрій (engines/geometry.explodeDetails) лишається джерелом правил: які парти, де…
partsFromDraft.ts 3.7 55 нов. Г СТИКИ → ЧАСТИНИ ПЛИТИ ДЛЯ ЯДРА (06.10.2026, №232, Лео). Власник: «7177 ріже і в розкрій падають деталі» — так, розкрій ріже (engines/geometry.explodeDetails), а тіло…
place.ts 4.3 69 нов. Г РАМКИ Й ЖОРСТКІ ПЕРЕМІЩЕННЯ (30.09.2026, Лео) — сімейство 4. Дві рамки живуть поруч: · рамка ПЛАНУ тіла (мм): x вправо, y вглиб, z вниз від верхньої площини — у ній…
plywoodFromDraft.ts 7.5 103 нов. Г СІМЕЙСТВО 4 — ФАНЕРНИЙ ПІДКЛАД (Конструктор) → МОДЕЛЬ ЯДРА (30.09, ніч). Правила — у Studio: constructor/plywood/plywoodRules (КП-1…КП-6, з обучалочки… ⚠ бере PLYWOOD_DEFAULTS із constructor/store.ts (:28) — zustand-стор UI потрапляє у воркер OCCT
previewScheduler.ts 2.4 68 нов. Г Only visual previews belong in this queue. Exports/validation call the kernel directly and retain every requested version. One scheduler instance owns one active…
productKernel.ts 21.4 372 нов. Г 3D ПІДБІР НА ЯДРІ OCCT (08.10.2026, №242, Лео). Власник: «те, що бачите у редакторі, і те, що бачите в 3D Підборі, будують два різні коди… давай, тіко з головою».…
shopSheets.ts 23.2 320 нов. Г СУПРОВІДНІ АРКУШІ ДО DXF ДЛЯ ВЕРСТАТІВ (02.10.2026, журнал №218). Власник: «у нас є супровідні файли до станків, чому ми їх не готуємо?». У кожному кейсі поруч із DXF…
sinkFromDraft.ts 5.7 90 нов. Г СІМЕЙСТВО 4 — МИЙКА ЯК СКЛАДАННЯ → МОДЕЛЬ ЯДРА (30.09.2026, Лео). Правило одне і воно в Studio: engines/sinkAssembly.sinkAssemblyPieces — ті самі деталі розкрою…
toThree.ts 6.1 116 нов. Г ТІЛО ЯДРА → THREE (30.09.2026, Лео). three.js тут — лише показ. Розміщення в сцені повторює старий будівник (Detail3DPreview): мм → м (×0.001), центр деталі в нулі,…
types.ts 18.0 279 нов. Т ЯДРО ТІЛ VS CAD — КОНТРАКТ «МОДЕЛЬ → ТІЛО» (30.09.2026, Лео). Це межа між правилами каменю (domain/, лишаються спільними зі Studio) і будівником 3D-тіл. Будівник —…
useExactOutlines.ts 2.8 55 нов. Г ХУК ДОШКИ РОЗКРОЮ: точні контури партів від ядра (30.09.2026, ніч). Рахує лише для партів з дугами (exactParts вирішує), кешує за ламаною парта, не блокує рендер:…
useKernelAssembly.ts 10.3 153 нов. Г ХУК: МОДЕЛЬ ЯДРА → СКЛАДАННЯ THREE-ГЕОМЕТРІЙ (30.09.2026, Лео). Плита + тіла доповнень (сімейство 2) з одного виклику ядра. Усі геометрії — у просторі сцени плити…
useKernelGeometry.ts 2.6 54 нов. МЕРТВИЙ ХУК: МОДЕЛЬ ЯДРА → THREE-ГЕОМЕТРІЯ (30.09.2026, Лео). Будівник асинхронний (wasm вантажиться раз, тіло рахується ~0.2–2 с), а редактор синхронний. Тому: · поки нове… ⚠ замінений useKernelAssembly; без імпортерів

src/kernel/__tests__/ — 31 файл(ів), 3899 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
assemblyCache.test.ts 9.1 203 нов. тести для assemblyCache (13 it)
cutOutlines.test.ts 9.8 134 нов. тести для cutOutlines (6 it)
cutOutlinesRecovery.test.ts 4.3 99 нов. тести для cutOutlinesRecovery (5 it)
dxfExport.test.ts 18.2 309 нов. тести для dxfExport (16 it)
exactPartsWorkerEligibility.test.ts 4.2 96 нов. тести для exactPartsWorkerEligibility (8 it)
nativeShapeGuard.test.ts 6.0 121 нов. тести для nativeShapeGuard (8 it)
occt2D.test.ts 9.7 124 нов. тести для occt2D (5 it)
occtArcTools.test.ts 7.7 112 нов. тести для occtArcTools (4 it)
occtAttachments.test.ts 8.4 127 нов. тести для occtAttachments (9 it)
occtComplex.test.ts 5.5 80 нов. тести для occtComplex (3 it)
occtEdges.test.ts 5.7 91 нов. тести для occtEdges (6 it)
occtEllipse.test.ts 5.7 83 нов. тести для occtEllipse (7 it)
occtFireplace.test.ts 10.7 140 нов. тести для occtFireplace (4 it)
occtKernel.test.ts 7.7 137 нов. тести для occtKernel (8 it)
occtMetalJoints.test.ts 4.3 72 нов. тести для occtMetalJoints (2 it)
occtPanelFold.test.ts 5.1 78 нов. тести для occtPanelFold (4 it)
occtParts.test.ts 4.2 64 нов. тести для occtParts (3 it)
occtPlywoodRecord.test.ts 7.5 91 нов. тести для occtPlywoodRecord (3 it)
occtSink.test.ts 11.9 166 нов. тести для occtSink (4 it)
previewScheduler.test.ts 6.2 132 нов. тести для previewScheduler (6 it)
productKernel.test.ts 12.9 168 нов. тести для productKernel (6 it)
productKernelSession.test.ts 2.9 43 нов. тести для productKernelSession (1 it)
profiledBaseCache.test.ts 8.6 178 нов. тести для profiledBaseCache (8 it)
profiledBaseCacheGeometry.integration.test.ts 13.1 233 нов. тести для profiledBaseCacheGeometry (інтеграційний) (2 it)
profiledBaseExactArcs.test.ts 7.9 134 нов. тести для profiledBaseExactArcs (3 it)
profiledBaseFixtures.ts 2.9 49 нов. тестові дані/хелпер
profiledBaseRuntimeGuard.integration.test.ts 8.3 162 нов. тести для profiledBaseRuntimeGuard (інтеграційний) (6 it)
shopSheets.test.ts 8.5 121 нов. тести для shopSheets (8 it)
useExactOutlinesRecovery.test.tsx 2.9 73 нов. тести для useExactOutlinesRecovery (3 it)
useKernelAssemblyDelay.test.tsx 4.8 85 нов. тести для useKernelAssemblyDelay (5 it)
workerClient.test.ts 9.1 194 нов. тести для workerClient (11 it)

src/kernel/occt/ — 10 файл(ів), 2704 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
assemblyCache.ts 6.0 158 нов. Г Collision-free structural key for the plain data in the kernel contract. Include every property (including IDs/options), never round dimensions or use a short hash.…
geometry.worker.ts 3.1 74 нов. Л Keep the app tsconfig's DOM library unchanged; this structural surface is all the dedicated worker needs, with no Window/document dependency.
index.ts 2.6 61 нов. Г OCCT як KernelBuilder для браузера (30.09.2026, Лео). Один активний будівник: у VS CAD ним є цей. Старий (three-bvh-csg) лишається лише для порівняння на стенді.
loadOcct.ts 2.4 55 нов. Г ЗАВАНТАЖЕННЯ OCCT У БРАУЗЕРІ (30.09.2026, Лео). OpenCascade.js 2.0 beta: opencascade.full.js (0.4 МБ) + opencascade.full.wasm (50 МБ повна збірка; стиснена сервером —…
nativeShapeGuard.ts 2.6 77 нов. Г A topology guard, not proof of geometric equivalence to another builder.
occtBuilder.ts 87.5 1628 нов. Г OCCT-БУДІВНИК ТІЛ (30.09.2026, Лео) — перше сімейство: ПЛИТА. контур (з дугами, розбитими на точки) → грань → призма на товщину; наскрізні вирізи → призми →… ⚠ у стартовому наборі через kernel/shopSheets.ts:42 → outline2D.ts:18
outline2D.ts 14.9 295 нов. Г 2D-КОНТУР ДЕТАЛІ З ЯДРА — ТОЧНИМИ ДУГАМИ (30.09.2026, ніч, Лео). Власник: «2D розкрій — це основа». Розкрій у Studio працює ламаними (радіус кута — 12 відрізків, коло… ⚠ статичний import з occtBuilder (:18) — ламає ліниве завантаження, задумане в kernel/occt/index.ts
profiledBaseCache.ts 5.1 126 нов. Г Full structural identity, no rounded dimensions or collision-prone hash.
workerClient.ts 6.8 174 нов. Г One active kernel call; queued jobs never execute concurrently in WASM. UI latest-only policy lives above this transport. Export jobs are not dropped.
workerProtocol.ts 2.2 56 нов. Г The worker owns these new result arrays. Do not use for cached main-thread results: transferring a buffer detaches it from its sender.

src/lib/ — 9 файл(ів), 967 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
api.ts 24.3 540 +123 Г Клієнт до власного бекенда (server/) — Keycloak-сесія в httpOnly-куці, тому всі запити йдуть same-origin з credentials.
loadWithProgress.ts 3.5 63 = Л Виконує кроки завантаження, показуючи людині кожен із них. (опис 02.09)
money.test.ts 0.9 18 нов. тести для money (2 it)
money.ts 1.9 34 нов. Г ГРОШІ В ТЕКСТ — один форматер на весь Studio/CAD (11.10.2026, №258, Лео). Власник, 11.10: «коли мова йде про гроші, має бути так: 1 000 000, а не 1000000 — перевір…
project.ts 6.0 136 = Г Живі геометричні помічники розміщень: rotatedLocalPoints, mirroredLocalPoints, placementPolygon, getStatusLabel (опис 02.09)
settingsTransport.test.ts 0.7 10 нов. тести для settingsTransport (2 it)
settingsTransport.ts 0.4 6 нов. Г Ocean build uses the existing authenticated MES registry. GitLab keeps Leo's Node API.
textureMatrix.ts 1.7 35 = Г Матриця UV текстури (спільна для TexturePiece і pdfPages) (опис 02.09)
wmsStock.ts 5.6 125 = Г ЗАЛИШКИ ЗІ СКЛАДУ (Stone WMS) — клієнт пошуку листів за артикулом. Заведено 26.08.2026 разом із кнопкою «Підібрати залишки» в панелі нерозміщених деталей. Контракт… · tsc 2

src/mes/ — 3 файл(ів), 589 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
MesTab.tsx 25.1 304 нов. МЕРТВИЙ ВКЛАДКА «ЦЕХ» (MES v0) — 06.09.2026. Пасхалка Студії поруч із Конструктором. Карта цеху 202 (ізометрія) + навантаження на п'яти живих заявках 1С за умовними нормами.… ⚠ ніким не імпортується — МЕС у застосунок не підключений
render.ts 14.1 199 нов. МЕРТВИЙ РЕНДЕР КАРТИ ЦЕХУ — ізометрія в SVG-рядок (06.09.2026). Рішень «що» тут немає — лише «як намалювати» дані з data/shopMap.ts. Диметрія: x (потік) під 14°, y (глиб) під… ⚠ лише з MesTab (мертвого)
sim.ts 4.6 86 нов. лише тести СИМУЛЯТОР ЦЕХУ v0 — статика (06.09.2026). План MES §5. Що рахує: завантаження ділянки за добу (наладка + штучний × к-сть, ТЗ §4.3), фонд ділянки (ТЗ §4.4),…

src/mes/__tests__/ — 1 файл(ів), 93 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
sim.test.ts 5.5 93 нов. тести для sim (9 it)

src/mes/data/ — 4 файл(ів), 2408 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
codeArea.ts 30.0 1304 нов. лише тести КОД ПОСЛУГИ 1С → ДІЛЯНКА (06.09.2026). Злиття двох номенклатур: «Актуальні послуги 2026 цех 202» (146 кодів, нова, має пріоритет) і бланк обліку матеріалів (150…
norms.ts 5.0 79 нов. лише тести УМОВНІ НОРМИ І ШЛЯХ ПО ЦЕХУ (06.09.2026). [УМОВНО] усі числа тут — заглушки «щоб потицяти», за словами власника 04.09 («навантаження, пропускну і продуктивність…
orders.ts 25.9 922 нов. лише тести ЖИВІ ЗАМОВЛЕННЯ — заявки 1С п'яти кейсів обучалочки (06.09.2026). [ФАКТ] рядки, коди, одиниці, кількості — з xlsx «Замовлення 15-…» (06_ОБУЧАЛОЧКА/КЕЙСИ/<номер>/),… ⚠ прізвища клієнтів і номери замовлень реальних кейсів у полі customer (:17, :179, :376, :566, :742) — лише тести, але в репозиторії
shopMap.ts 14.4 103 нов. лише тести КАРТА ЦЕХУ 202 — дані (06.09.2026). Насіння ПАСПОРТ_ДІЛЯНОК.json з плану MES (12_ВИРОБНИЦТВО_І_МЕС/04_ПЛАН_MES_ФУНДАМЕНТ_04-09.md, E1). [ФАКТ, скрін власника 06.09]…

src/parsers/dxf/ — 6 файл(ів), 659 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
geometry.ts 7.4 184 = Г Геометрія DXF: межі, дуги з bulge, нормалізація контурів (опис 02.09)
index.ts 0.1 4 = Г Ре-експорт парсера DXF (опис 02.09)
inference.ts 6.9 152 = Г Здогади про тип і роль контуру DXF (опис 02.09)
parser.test.ts 0.7 22 = проба з абсолютним шляхом C:/hhgh (1 it) ⚠ червоний з 02.09
parser.ts 9.9 233 -1 Г Розбір DXF: контури, відсів стрілок розмірів, текстові мітки (опис 02.09)
types.ts 2.0 64 = Г Типи DXF-імпорту (DxfPoint, DxfContour, DxfImportRole …) (опис 02.09)

src/shell/ — 4 файл(ів), 249 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
adminLogin.ts 4.0 70 нов. Г ВХІД СУПЕР-АДМІНА — ЛОГІН І ПАРОЛЬ (12.10.2026, №263, Лео). Власник: «там, де , зробити вхід» — замість PIN (він лежав у коді відкритим рядком і в…
capabilities.ts 7.3 140 нов. лише тести КАРТА ПРАВ — «що можна в цьому робочому просторі» (03.09.2026). Рішення власника: одне ядро — кілька дочок (VS3D менеджеру, Конструктор технологу першим, Архітектура… ⚠ лише тести
useCan.ts 0.8 16 нов. МЕРТВИЙ Хук для екранів: «чи можна це в цій дочці цьому користувачу». Єдине місце, де права зустрічаються зі стором (ПІН супер-адміна). ⚠ без імпортерів
workspaces.ts 1.2 23 нов. МЕРТВИЙ РЕЄСТР ДОЧОК — хто як вантажиться (03.09.2026). Кожна дочка — своя тека src/workspaces/ і свій динамічний імпорт: у браузер їде лише та, яку відкрили. Сьогодні… ⚠ задуманий лінивий поділ на робочі простори — не підключений

src/shell/__tests__/ — 3 файл(ів), 196 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
adminLogin.test.ts 3.1 46 нов. тести для adminLogin (4 it)
capabilities.test.ts 2.9 53 нов. тести для capabilities (5 it)
studioOnly.test.ts 4.8 97 нов. тести для studioOnly (5 it)

src/stand/ — 2 файл(ів), 637 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
fixtures.ts 18.5 282 нов. С ЧОТИРИ КЕЙСИ СТЕНДУ (30.09.2026) — ті самі форми, на яких 29.09 ламався саморобний будівник (журнал №197–№200). Драфти — справжні DetailDraft Studio, через…
main.tsx 21.1 355 нов. С СТЕНД OCCT — VS CAD, порт 7177 (30.09.2026, Лео). Що доводить: OCCT будує тіла з наших драфтів Studio (умова брата №3): 4 кейси 29.09 → тіло → зміна параметрів →…

src/store/ — 11 файл(ів), 1677 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
cabinetActions.ts 2.2 35 нов. Г ЗБЕРЕГТИ В ОСОБИСТИЙ КАБІНЕТ — одна дія на двох (07.10.2026, №235). Логіка пункту меню «Зберегти в Особистому кабінеті» (№188) винесена з CabinetSaveButton, щоб…
cabinetSync.ts 6.6 111 нов. Г src/store/cabinetSync.ts №188 · Особистий кабінет: стан збереження і прив'язка (25.09.2026). До цього дня кабінет працював «мовчки»: автозбереження йшло лише коли…
highlightSync.ts 4.0 86 = Г Синхронізація підсвітки між вікнами. (опис 02.09)
persistence.ts 3.6 81 +29 Г IndexedDB (+localStorage фолбек), BroadcastChannel slabcutplanner-sync, дебаунс 1 с (опис 02.09) ⚠ при імпорті: слухач beforeunload (:10) і BroadcastChannel (:21)
projectHelpers.ts 15.1 305 -7 Г Нога (опора) клеїться під 45° — «водоспад». Старі проєкти створені до (опис 02.09)
settingsSync.ts 9.7 173 нов. Г СИНХРОНІЗАЦІЯ СПІЛЬНИХ НАЛАШТУВАНЬ (08.10.2026, №241, Лео). Власник: «щоб послуги лежали на сервері, і керівник продажів міг поміняти — і вони змінились у всіх».…
useEdgeCatalog.ts 1.8 39 = Г КАТАЛОГ КРОМОК — один на весь застосунок (01.09.2026). (опис 02.09)
useEdgeSourceSide.ts 2.6 55 = Г ВЗІРЕЦЬ ОБРОБКИ ТОРЦЯ (01.09, власник): клік по літері сторони в панелі (опис 02.09)
useProjectStore.ts 0.9 18 -2 Г Композиція 6 слайсів через immer (опис 02.09)
useSettingsStore.ts 19.3 376 +23 Г Налаштування прайсу й прив'язок послуг до обробок. (опис 02.09) ⚠ adminPin/DEFAULT_ADMIN_PIN (:44) — мертвий стан після №263
useStore.ts 22.2 398 +78 Г UI-стор без персисту: PaneView/MainView, сесія редактора зі своїм undo (800 мс), isAdminUnlocked, isBacklightMode, selectedProductId3d, expertMode (localStorage vs3d.expertMode) (опис 02.09) ⚠ при імпорті підписка subscribeHighlight (:396)

src/store/__tests__/ — 15 файл(ів), 1557 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
adminPin.test.ts 1.5 33 = тести для adminPin (4 it)
cabinetSync.test.ts 2.7 57 нов. тести для cabinetSync (5 it)
cutOutlines.test.ts 7.3 125 нов. тести для cutOutlines (3 it)
deleteSlab.test.ts 4.1 101 = тести для deleteSlab (4 it) · tsc 1
highlightSync.test.ts 5.4 126 = тести для highlightSync (8 it)
history.test.ts 4.9 120 = тести для history (8 it)
nestingLock.test.ts 7.6 191 = тести для nestingLock (6 it)
newProject.test.ts 1.8 47 = тести для newProject (3 it)
normalizeProject.test.ts 2.7 71 = тести для normalizeProject (4 it) · tsc 5
projectSlice.test.ts 1.6 55 = тести для projectSlice (1 it) · tsc 1
sessionHistory.test.ts 4.4 97 = тести для sessionHistory (7 it)
settingsSync.test.ts 7.5 116 нов. тести для settingsSync (9 it)
textureGroups.test.ts 11.0 214 = тести для textureGroups (6 it) · tsc 7
unfoldLayout.test.ts 5.9 129 = тести для unfoldLayout (2 it)
useStoreHighlight.test.ts 2.9 75 = тести для useStoreHighlight (4 it)

src/store/slices/ — 5 файл(ів), 1489 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
editorUISlice.ts 2.3 59 = Г Виділення і драг на карті крою (опис 02.09)
historySlice.ts 5.6 117 = Г ГЛОБАЛЬНИЙ UNDO/REDO — один стек на весь проєкт. (опис 02.09)
packingSlice.ts 18.7 385 +82 Г FG-32 — замок розкладки. Див. Project.nestingLocked. (опис 02.09) ⚠ коментар :95 «без провайдера (Studio)» — провайдер реєструється завжди
projectSlice.ts 28.9 709 +4 Г Джерело проєкту: CRUD слябів/деталей/виробів, розміщення (manualPlaced), scenePlacement, import/export, loadWithoutPacking (опис 02.09)
textureSlice.ts 9.5 219 = Г Ручні правки текстурної розкладки (опис 02.09)

src/stounik/ — 17 файл(ів), 2390 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
StoneMascot.tsx 3.9 15 нов. Г Персонаж Стоуника — як у PLM (C:/Works/PLM/PLM module/frontend/src/StoneMascot.tsx, Сфорца): той самий персонаж на всі програми. 07.10.2026 (№237): навушники…
StoneRadio.tsx 11.4 192 нов. Г STONE RADIO — радіо Стоуника (07.10.2026, №237, Лео). Перенесено з PLM без змін логіки: C:/Works/MES/output/plm-stounyk-radio/StoneRadio.tsx (автономний плеєр, без… ⚠ 6 адрес інтернет-радіо літералами (:29–34)
Stounik.tsx 21.2 290 нов. Г СТОУНИК — ОБОЛОНКА В ШАПЦІ STUDIO (07.10.2026, №235, Лео). Домік у шапці (личко без ніжок: очі рухаються, через 45 с без натискань дрімає). Клік — вікно: пошук по…
StounikAi.tsx 9.2 86 нов. Г «ЗАПИТАТИ ШІ» — КАРТКА СТОУНИКА (Бруно, 09.10.2026; перенесено в оригінали — Лео, №248). Перший шар візії «Лео у Стоунику» (Відповідач): запитання + до 4 уривків…
StounikWelcome.tsx 8.5 133 нов. Г ЗНАЙОМСТВО ЗІ СТОУНИКОМ (07.10.2026, №237, Лео; власник: «коли відкриваєш додаток — Стоуник посередині розказує, що таке VSS і хто він, що може, що живе у правому…
actions.ts 4.6 82 нов. Г СТОУНИК — ДІЇ ПЕРЕХОДУ (07.10.2026, Лео). Усе — через чинні команди Studio: setMainView, openHelp, openDetailEditor, requestEditorPanel, saveProjectToCabinet.…
aiEndpoint.ts 1.8 43 нов. Г ШІ-ПОМІЧНИК СТОУНИКА — ЧИ Є БЕКЕНД (09.10.2026, №248, Лео). Бруно 09.10 поставив у публічну Studio (Vercel) функцію /api/stounik/ask (Gemini, ключ на сервері, вхід…
checks.ts 18.5 275 нов. Г СТОУНИК — КОНТРОЛЕР ПРОЄКТУ (07.10.2026, Лео). Чиста функція над моделлю проєкту (не над 3D-сценою): збирає проблеми з ЧИННИХ валідаторів Studio —…
leoTopics.ts 35.9 191 нов. Г ЗНАННЯ ЛЕО У СТОУНИКУ (08.10.2026, №243, Лео). Власник: «вшити Стоунику знання Лео в мозги, якщо воно не займає гігабайти». Не займає: це кілька десятків тем із…
nextStep.ts 2.2 20 нов. Г СТОУНИК — «ЩО ДАЛІ?» (07.10.2026, Лео). Одна доречна підказка за станом проєкту: від порожнього до прорахунку. Без геометрії, без вигадок.
photoAttachment.ts 1.8 18 нов. Г Фото для «Запитати ШІ» (Бруно, 09.10.2026; №248): JPG/PNG/WebP до 10 МБ → JPEG без метаданих, до 1800 px, ліміт сервера 1,5 МБ.
projectSnapshot.ts 3.7 34 нов. Г Огляд проєкту для «Запитати ШІ» (Бруно, 09.10.2026; №248): до 80 деталей, 40 слебів, 40 деталей чернетки редактора; розміри, матеріал, вирізи, кути, коди кромок,…
saveState.ts 4.2 40 нов. Г СТОУНИК — КОНТРОЛЬ ЗБЕРЕЖЕННЯ (07.10.2026, Лео). Шість станів із чинного механізму кабінету (store/cabinetSync + store/persistence): «Збережено» — ТІЛЬКИ після…
search.ts 5.9 107 нов. Г СТОУНИК — ПОШУК ПО ДОВІДНИКУ (07.10.2026, Лео). Локальний пошук без ШІ: нормалізація українського тексту, легке відкидання закінчень (словоформи: «мийки» → «мийк»,…
stounik.css 18.2 154 нов. СТОУНИК у Studio (07.10.2026, №235; №237 — радіо, навушники, знайомство). Домік у шапці, вікно-підказка, анімації — за зразком PLM (stone-assistant.css, Сфорца),…
topics.ts 96.3 596 нов. Г СТОУНИК — ДОВІДНИК ТЕМ (07.10.2026, Лео; за промптом Богдана/Бруно; розширено 07.10 №236). Чистий модуль: без React, без стору. Тема = що це в Studio, як зробити… ⚠ 98 КБ тексту в стартовому наборі; у ключових словах — старий PIN (:464)
useStounik.ts 5.9 114 нов. Г СТОУНИК — ПІДКЛЮЧЕННЯ ДО СТАНУ STUDIO (07.10.2026, Лео). Один хук: збирає зі сторів усе, що потрібно оболонці — проблеми з контролера (checks.ts, з паузою 1,5 с після… ⚠ перевірки всього проєкту через 1,5 с після кожної зміни (:78–84)

src/stounik/__tests__/ — 8 файл(ів), 820 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
StoneRadio.test.tsx 9.5 165 нов. тести для StoneRadio (7 it)
Stounik.test.tsx 16.2 237 нов. тести для Stounik (13 it)
checks.test.ts 9.7 122 нов. тести для checks (11 it)
leoTopics.test.ts 3.3 56 нов. тести для leoTopics (4 it)
projectSnapshot.test.ts 1.1 10 нов. тести для projectSnapshot (1 it)
saveState.test.ts 2.4 34 нов. тести для saveState (6 it)
search.test.ts 6.5 84 нов. тести для search (11 it)
stounikAi.test.tsx 7.3 112 нов. тести для stounikAi (4 it)

src/styles/ — 3 файл(ів), 1840 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
bottega.css 9.1 99 = ОФОРМЛЕННЯ BOTTEGA В ІНТЕРФЕЙСІ (01.09.2026). Ті самі кольори й ритм, що в наших документах (Works/Bottega/_ШАБЛОН.html, МАНІФЕСТ §9.2): акцент #0084ff — лінія під…
global.css 66.3 841 +24 Глобальні стилі застосунку (тема Viyar) (опис 02.09)
mobile.css 42.3 900 +264 ═══════════════════════════════════════════════════════════════════ МОБІЛЬНИЙ ШАР — 31.08.2026 Вмикається класом is-mobile на , який ставить хук useIsMobile.…

src/utils/ — 14 файл(ів), 6072 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
approvalImport.ts 197.0 4805 = Г Імпорт бланка погодження: ZIP/PDF/XLSX → вектор або OCR → елементи; цехові слова «потовщ
blackbox.ts 2.5 101 = Г Blackbox Logger Перехоплює console.error та window.onerror для збереження останніх N помилок Це допомагає при формуванні баг-репорту.
bugTickets.ts 1.4 52 -1 Г Тікети баг-репортів: типи і статуси (опис 02.09)
edgeMarkerLabel.ts 2.5 43 +8 Г Підпис маркера сторони в 3D (FG-29). buildDetailShape роздає ребрам контуру технічні id: прості сторони — це A/B/C/D (або літера вершини для складних форм), а…
edgeProfiles.ts 16.7 353 = Г Одиничний вектор ВСЕРЕДИНУ деталі в точці підпису (28.08, власник: (опис 02.09)
export.ts 3.5 66 +2 Г PDF карт крою (exportProjectPdf), PNG, calculateTotalArea, ZIP (опис 02.09)
file.ts 0.9 27 = Г downloadTextFile / readFileAsText (опис 02.09)
math.ts 0.3 10 = Г MM_TO_M2 і округлення (3 знаки) (опис 02.09)
sceneActivity.ts 2.1 46 нов. Г ЩО ЗАРАЗ ВАНТАЖИТЬСЯ В 3D (12.10.2026, №274, Лео). Власник: «добав класну анімовану загрузку в 3D Підбір, типу щось зі Стоуником». Щоб Стоуник показував правду, а не…
siteSlabTexture.ts 3.7 58 нов. Г Текстура сляба в орієнтації сцени — довгою стороною вздовж. Слеб на сцені лежить горизонтально (width — довга сторона, див. landscapeSize у domain/slabCatalog), а…
sketchupImport.ts 8.3 212 = Г Імпорт виробу, експортованого плагіном SketchUp (опис 02.09)
slabPhotoFit.ts 1.9 34 нов. Г Як фото слеба лягає на сам слеб. Фото НЕ розтягується під габарит: лист на ньому має ті самі пропорції, що й на сайті (власник, 09.10.2026). Воно вписується в…
slabTexture.ts 7.0 178 = МЕРТВИЙ Процедурна текстура слябу для демонстрації каталогу. ⚠ ЦЕ ЗАГЛУШКА ДЛЯ ПОКАЗУ МЕХАНІКИ. У бойовій версії фото слябу приходить із довідника номенклатур (керамограніт,… ⚠ без імпортерів
webglContextRecovery.ts 4.3 87 = Г Відновлення WebGL-контексту після Context Lost. ЧОМУ ЦЕ ОКРЕМИЙ МОДУЛЬ (не дописка в Viewer3D.tsx). Інваріант 2.48: новий клопіт — свій модуль, підключення — рівно…

src/utils/__tests__/ — 5 файл(ів), 442 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
edgeMarkerLabel.test.ts 2.6 46 = тести для edgeMarkerLabel (7 it)
edgeMarkersRotation.test.ts 9.3 182 = тести для edgeMarkersRotation (11 it)
sideVertexIndices.test.ts 6.1 117 = тести для sideVertexIndices (8 it)
slabPhotoFit.test.ts 1.4 24 нов. тести для slabPhotoFit (4 it)
webglContextRecovery.test.ts 3.3 73 = тести для webglContextRecovery (7 it)

src/utils/export/ — 6 файл(ів), 2610 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
pdfGeometry.ts 9.8 225 +3 Г Геометрія для PDF карт крою (дзеркалення отворів) (опис 02.09)
pdfPages.ts 35.8 673 +24 Г SVG-сторінки карт крою A4/A3, контрагент у документах (опис 02.09) · tsc 17
pdfTypes.ts 1.6 74 = Г Типи експорту PDF (формат, орієнтація, опції) (опис 02.09)
pdfUtils.ts 7.5 199 = Г svgStringToPngData, pageSvg, поля, escapeXml (опис 02.09)
quotePdf.ts 75.6 1363 +99 Г PDF Прорахунку: КП, візуалізації (сторінка на виріб), бланк погодження (PNG-розрізи з edgeProfileImages — Д-2), список деталей (опис 02.09)
zipArchive.ts 2.7 76 = Г Мінімальний ZIP-пакувальник (CRC32) без залежностей (опис 02.09)

src/utils/export/__tests__/ — 8 файл(ів), 989 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
approvalCutoutDims.test.ts 3.6 80 = тести для approvalCutoutDims (5 it)
approvalEdgeProfiles.test.ts 8.3 168 = тести для approvalEdgeProfiles (14 it)
approvalJointSplit.test.ts 5.7 83 нов. тести для approvalJointSplit (6 it)
blueprintExact.test.ts 7.0 99 нов. тести для blueprintExact (4 it)
customerPdf.test.ts 4.6 89 = тести для customerPdf (7 it)
quotePdf.test.ts 13.1 258 = тести для quotePdf (14 it)
quotePdfCalibration.test.ts 4.2 81 = тести для quotePdfCalibration (5 it)
quotePdfLanguage.test.ts 6.2 131 = тести для quotePdfLanguage (7 it)

src/workers/ — 1 файл(ів), 44 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
packing.worker.ts 1.3 44 = Л Воркер: проєкт → autoPack(mode, preserveManual) → розміщення (опис 02.09)

src/workspaces/architecture/ — 5 файл(ів), 287 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
ArchitectureSidebar.tsx 8.6 133 нов. Г ЛІВА ПАНЕЛЬ АРХІТЕКТОРА (06.09.2026) — та сама колонка 300 px, що у VS3D, з двома головними діями поруч: «Додати виріб» (той самий редактор виробу, що у VS3D —…
README.md 4.1 53 нов. ресурс
index.tsx 0.6 9 нов. МЕРТВИЙ Viyar Stone BUILDING (тех. id простору лишається architecture) — дочка для об'єктів: «скільки коштує облицювати». Каркас заведено 03.09.2026 під паралельну роботу.… ⚠ вхід робочого простору — без імпортерів
store.ts 2.2 47 нов. Г Стан сеансу АРХІТЕКТОРА (06.09.2026) — те, що НЕ належить проєкту: який інструмент у руці на плані, яка поверхня/розкладка вибрана, чи відкрите меню створення…
useArchitecture.ts 2.3 45 нов. Г Доступ до project.architecture з екранів архітектора. Модель лежить у проєкті поруч із виробами (одна пачка — рішення власника 06.09), тож пишемо через…

src/workspaces/architecture/__tests__/ — 1 файл(ів), 36 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
planArc.test.ts 2.0 36 нов. тести для planArc (4 it)

src/workspaces/architecture/documents/ — 1 файл(ів), 143 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
BoqPanel.tsx 9.9 143 нов. Л ВІДОМІСТЬ ОБСЯГІВ (BOQ) — 06.09.2026. Усі розкладки проєкту → рядки по групах: матеріал, роботи, витратні, логістика. Це підкладка під КП: квадратури, листи, шви,…

src/workspaces/architecture/layouts/ — 4 файл(ів), 510 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
AddLayoutWorkspace.tsx 13.0 179 нов. Г МЕНЮ «СТВОРИТИ РОЗКЛАДКУ» — окреме, на основі меню створення виробу (рішення власника 06.09: «на основі меню створення виробів зробити меню створення розкладок,…
LayoutControls.tsx 9.8 128 нов. Г Ручки розкладки — усе, що людина крутить: патерн, формат, шов, розбіжка, кут, старт, зсув, бордюр, матеріал, запас. Одні й ті самі в редакторі розкладки і в меню…
LayoutEditor.tsx 8.9 129 нов. Л РОЗКЛАДКА — головне вікно архітектора (06.09.2026). Зліва картинка: поверхня з плану, на ній плитки — цілі світлі, підрізані штрихом. Справа ручки (патерн, формат,…
LayoutPreview.tsx 4.5 74 нов. Г Картинка розкладки: контур поверхні, отвори, плитки (цілі — світлі, підрізані — штрихом), бордюр «периметр + центр». Одна на редактор розкладки і на меню створення;…

src/workspaces/architecture/plan/ — 2 файл(ів), 678 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
PlanEditor.tsx 40.8 638 нов. Л ПЛАН — перше вікно архітектора (06.09.2026, рішення власника). Не редактор стін, а план: підвантажили PDF (або картинку) архітектурного плану / дизайн-проєкту, задали…
arc.ts 2.5 40 нов. Л ДУГА ПО ТРЬОХ ТОЧКАХ (07.09.2026, №131, прохання власника: план із аркою — «добав радіус, шоб мож було відмалювати»). Модель плану лишається полігоном (points), бо на…

src/workspaces/constructor/ — 2 файл(ів), 45 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
README.md 2.3 34 нов. ресурс
index.tsx 0.9 11 нов. МЕРТВИЙ Viyar Stone CAD (тех. id простору лишається constructor) — дочка технолога: «як це зробити». v0 (03.09.2026): той самий застосунок, але з правами технолога без ПІНа… ⚠ вхід робочого простору — без імпортерів

src/workspaces/vs3d/ — 1 файл(ів), 5 рядків

Файл КБ Рядків Δ до 02.09 Де Що це (шапка файла / опис 02.09 / експорти; ⚠ — знахідка)
index.tsx 0.3 5 нов. МЕРТВИЙ Viyar Stone Studio (тех. id простору лишається vs3d) — дочка менеджера: «скільки це коштує». Сьогодні це весь застосунок як є; права — shell/capabilities.ts → vs3d. ⚠ вхід робочого простору — без імпортерів
L1 · Розкрій
Конвеєр, очікування ядра, точний контур проти ламаної, CombiCut · L1_РОЗКРІЙ.md

Що. Код /tmp/final/vs-cad/src (знімок 12.10, вечір; та сама копія відкривається як Studio через ?mode=studio і як прод GitLab) проти доків /tmp/final/audit1310/docs і проти L1 аудиту 02.09. Як. Читання коду з адресами, повний прогін воріт (його запускав ведучий: gates/vitest.txt), точковий прогін тестів розкрою, сім файлів зондів (≈20 сценаріїв) у власній копії /tmp/final/audit1310/probe-L1/src/__audit_L1__/ (код проєкту не змінювався; два файли — з реальним ядром OCCT, під спільним замком). Позначки. [ФАКТ ✔] — перевірено запуском/зондом/grep; [ФАКТ ◔] — прочитано в коді, адреса дана; [ГІПОТЕЗА] — правдоподібно, без прямого доказу; [ПИТАННЯ] — вирішує власник. Рішень у документі немає; пропозиції — окремим блоком. Межі. server/, lib/api.ts, auth, WMS/1С, MES Бруно — сторона ІТ (позначено «[сторона ІТ]»). 3D-модель деталі — лінза L2; гроші — L6. Усі адреси — відносно src/.


0. Коротко для власника

  1. «Дві математики» розкрою з 02.09 закриті. Прямокутник іде тим самим будівником кутів, що Г і П (engines/geometry.ts:913); старі гілки «Г двома прямокутниками» і «вісім гілок П» видалені 03.09; кутовий стик Г і омега/лямбда П перекладаються в звичайні довільні стики й ріжуться одним ножем (domain/joints.ts:367–427). Та сама Г з радіусом на увігнутому куті тепер дає 0,452 м² у всіх варіантах стику (02.09: 0,4520 / 0,4520 / 0,4480). [ФАКТ ✔, зонди A1/O2]
  2. З'явилась нова двоїстість — «ламана Studio» і «точний контур ядра OCCT». З 09.10 (№246) розкрій і перевірка колізій беруть точний контур ядра, а для цього чекають, поки ядро порахує (перший раз після відкриття — секунди). Це очікування асинхронне й нічим не обмежене в сторі. [ФАКТ ◔]
  3. Найважче, що знайшов: кеш точних контурів упізнає деталь за зовнішнім контуром і кількістю вирізів, а не їх місцем. Якщо в межах сесії посунути (чи змінити) виріз мийки на стільниці з радіусом або з отвором під кран — дошка, колізії, DXF на верстат і креслення PDF/бланк беруть виріз зі старого місця до перезавантаження сторінки. Зонд із реальним ядром: DXF пише отвір на x≈450 замість ≈1450. [ФАКТ ✔, зонди C1/O1/O3]
  4. Під час очікування ядра дії людини губляться: доданий сляб, правка номера замовлення, посунута деталь і навіть Ctrl+Z перезаписуються знімком, зробленим до очікування. А дія під час роботи воркера розкрою «вішає» розкрій: кнопки сірі зі спінером, збереження в кабінет відмовляє, нова деталь ні на слябі, ні в буфері. [ФАКТ ✔, зонди R1/R2/R4]
  5. Відкритими з 02.09 лишились: перепил 70 мм без UI (6–8 із 10 деталей «червоні» після авторозкрою), радіус кута вимикає розгортку підвороту, режим розкрою не зберігається, дзеркалення без умови «без кромки», два ключі текстурних груп, loadWithoutPacking без матеріалу. [ФАКТ ✔/◔]

1. Модулі розкрою сьогодні і хто їх імпортує

Метод: grep імпортів по src/ без тестів [ФАКТ ✔]. Рядки — wc -l.

Модуль Рядків (02.09) Імпортують Що реально викликається
engines/packing.ts 2042 (2029) store/slices/packingSlice.ts, workers/packing.worker.ts, store/projectHelpers.ts, store/slices/projectSlice.ts, components/2d/SlabBoard.tsx autoPack :1851, detectConflicts :1916, buildTextureLayout :1976, nestingSavings :1892
engines/geometry.ts 2613 (2754) packingSlice, projectHelpers, kernel/exactPartInput.ts, kernel/partsFromDraft.ts, constructor/geometry.ts, engines/sinkAssembly.ts explodeDetails :2588, contourForDetail :2606, contourWithSidesForDetail :2611
engines/cutOutlineSeam.ts (новий, №246) 68 packingSlice, kernel/cutOutlines.ts, PdfExportDialog, QuotePanel, utils/export.ts, pdfPages.ts, quotePdf.ts реєстр провайдера :38–43, withCutOutlines :51, blueprintOutlines :65
kernel/cutOutlines.ts (новий, №246/№249) 148 main.tsx (реєстрація) registerCutOutlines :137, ensureExactOutlines :84, кеш :64–75
kernel/useExactOutlines.ts 55 SlabBoard.tsx:101, constructor/combicut/CombiCutTab.tsx:83 хук дошки: точні контури + applyCutOutlines
kernel/exactParts.ts / exactPartInput.ts / exactPartsCore.ts 27 / 45 / 136 PartShape, DxfExportDialog, engines/combicut/plan.ts (типи), провайдер exactPartOutline :10, exactPartKey :24, критерії :10–45, розрахунок :38
kernel/occt/workerClient.ts (Бруно, №277) 174 exactParts, 3D-ядро черга, watchdog 120 с, перезапуск потоку
engines/nestingScope.ts (новий, №256) 18 packingSlice, AppStatusBar stoneParts — камінь на сляби, фанера/метал ні
store/slices/packingSlice.ts 385 (303) useProjectStore; triggerPackingAsync — 10 входів у projectSlice.ts конвеєр (розділ 2)
workers/packing.worker.ts, engines/workerMapper.ts 44, 22 packingSlice autoPack у воркері; stripBase64 без змін
engines/textureLayout.ts 408 (400) TextureLayoutPanel, TexturePiece, TextureScene екранна розкладка; власний textureGroupKey :37
engines/combicut/* (нові, №255–259) 1948 constructor/combicut/CombiCutTab.tsx (529), CombiCutSim.tsx (284) план різу, XML/TXT/DXF Pegasus, симуляція
core/geometry.ts, core/snapping.ts 98+215 (98+216) ніхто мертві, як 02.09 (лінза L3)

[ФАКТ ✔] components/ui/HeaderToolbar.tsx:9–10 досі підписується на packingMode/setPackingMode і не використовує їх.


2. Конвеєр «натиснув Економний / Оптимальний / Повна текстура → розкладка на слябі»

SlabBoard.tsx:1044–1111  три кнопки (Економний :1045, Оптимальний :1067, Повна текстура :1089)
   disabled = isPacking || nestingLocked; confirm «позиції зміняться» (:1051–1059) → setPackingMode + runPacking(mode)
   (контекстне меню сляба «Перерахувати слеб» :1544 → runPacking() БЕЗ підтвердження — розділ 6.6)
      ▼
packingSlice.ts:301  runPacking → triggerPackingAsync(project, mode, parts, set, get, fullRepack = true)
      ▼
packingSlice.ts:56   triggerPackingAsync
   :76   pushHistorySnapshot()                      — 1 виклик = 1 крок Ctrl+Z
   :78   normalizeProject()                         projectHelpers.ts:65 (міграції, referenceData з sawOvercut 70)
   :79   getAllProjectDetails()                     projectHelpers.ts:281 (легасі-деталі + flattenProductToDetails :243)
   :80–87 деталям 'prod_' вимикаються fold/thickening (доповнення виробу — окремі елементи)
   :91   explodeDetails(details, allowances, projectMaterial)    engines/geometry.ts:2588 → цикл :2159
   :92   remapStoredPartReferences()                projectHelpers.ts:131 (partIdentity :122)
   :100  cutOutlineProvider().prepare(parts, details)   ← НОВЕ (№246)
           null (нема провайдера / ?kernel=legacy) → :101–104 finishPacking синхронно, як до 09.10
           Promise (ядро активне — у VS CAD і Studio на OCCT ЗАВЖДИ: kernel/config.ts:15–22; у знімку нема .env, VITE_KERNEL ніде не задано)
   :105  квиток cutOutlineTicket
   :106–111 одразу в стор: project = знімок, parts = ламана, isPacking = true
   :112–115 pending.then(outlines → finishPacking(ЗНІМОК, withCutOutlines(parts, outlines)))   — без .catch і таймауту
      ▼
packingSlice.ts:119  finishPacking
   :142  nest = stoneParts(parts)                   ← НОВЕ (№256): фанера й метал не йдуть на сляби
   :143–200 замок (nestingLocked): autoPack у ГОЛОВНОМУ потоці лише для новачків (:165) → detectConflicts (:189) → persist
   :204–213 стор: project = ЗНІМОК, parts, isPacking = true
   :215–216, :284 дебаунс 200 мс → :218 packingRequestId + 1
   :274–282 postMessage({ project: stripBase64, parts: stoneParts, mode, preserveManual: !fullRepack })
      ▼
workers/packing.worker.ts:24–44  autoPack(project, parts, mode, preserveManual)   engines/packing.ts:1851
   :1862 buildContext :1697 (manualLocked завжди; manualPlaced при preserveManual; pinnedToSlab)
   :1865–1867 full_texture :1770 | optimal :1754 | economy :1733
   :1869 retryLegallyPlaceableUnplaced :514;  :1870 sanitizeAutoPlacements :1816
   validatePlacement :302 — межі, відступ, дефекти, перетин, interPartSpacing — ПО cutOutline, якщо є (:129–154)
      ▼ postMessage({ requestId, result })
packingSlice.ts:222  onmessage: requestId ≠ поточного → return (isPacking НЕ скидається — розділ 3.5)
   :235  detectConflicts(project, stoneParts, placements)   packing.ts:1916 — у головному потоці, по cutOutline
   :237–250 buildTextureLayout (packing.ts:1976) + злиття зі старими позиціями текстури
   :260–266 calcStatus, persist, isPacking = false

Паралельно на дошці: SlabBoard.tsx:100–101 useExactOutlines(parts, allDetails) рахує точні контури для малювання (PartShape.tsx:64–84) і, коли все пораховано, віддає їх у стор applyCutOutlines (packingSlice.ts:323–339) — колізії перераховуються тим самим контуром, розкладка не чіпається. [ФАКТ ◔]

Інші входи в той самий конвеєр (усі з fullRepack = false): projectSlice.ts:166 (припуски), :295 addProduct, :308 updateProduct, :318 removeProduct, :323 addDetail, :329 addDetails, :337 updateProductDetails, :345 updateDetailRecord, :353 deleteDetail. Без перерахунку (лише finalizeProjectState :14–21 = колізії + статус + packingRequestId += 1): addSlab :169, updateSlab :198, deleteSlab :210, ручні дії з розміщеннями, правки шапки/мови. Відкриття проєкту — loadWithoutPacking (projectHelpers.ts:93–120): explodeDetails без матеріалу (:115) + detectConflicts (:116), розкрій не перескладається. [ФАКТ ◔]

Що змінилось з 02.09 [ФАКТ ◔, журнал №189–190, №209, №246–247, №249, №255–256, №277]:


3. Очікування ядра: механізм, межі, збої, що бачить людина

3.1. Де саме чекає [ФАКТ ◔]

packingSlice.ts:100 → провайдер kernel/cutOutlines.ts:139–141 → ensureExactOutlines :84–114: по партах по черзі (for … await job, :85–113). Для кожного парта — дешеві перевірки без ядра (kernel/exactPartInput.ts:10–45: лише головні парти, без мийок/металу/customPoints, і лише якщо є дуга або круглий отвір — :32–33). Парт із дугою → exactPartOutline (kernel/exactParts.ts:10–21) → requestGeometry (kernel/occt/workerClient.ts:168) → черга з однією активною задачею (:69–75) → перший запит створює потік viyar-occt (:77–125, :148–166), той вантажить WASM (occt/geometry.worker.ts:43–52, occt/loadOcct.ts:28–55; 50 МБ, gzip 13,8 МБ за ЗАМІРИ_12-10). Лише коли всі парти пораховані, .then (packingSlice.ts:112–115) запускає пакування. Хто першим будить ядро після відкриття проєкту — сама дошка (SlabBoard.tsx:101 → хук), тому клік через 2,5 с чекає залишок завантаження: у пісочниці 5,6 с, результат на 8,2 с (ЗАМІРИ_12-10…md, рядок «Відкрили проєкт → Економний»). Мій замір у node: перший парт із холодним ядром — 5,1 с, другий (кеш) — 0 мс [ФАКТ ✔, зонд O1]. Прогріву ядра в коді немає (пропозиція Б із ЗАМІРИ не впроваджена; grep warm/requestIdleCallback — 0) [ФАКТ ✔].

3.2. Таймаути [ФАКТ ◔ + ✔]

3.3. Ядро впало / повільне [ФАКТ ◔]

3.4. Що бачить людина [ФАКТ ◔]

3.5. Гонитви [ФАКТ ✔, зонди в probe-L1]

Зонд Сценарій Результат
R1 поки розкрій чекає контури: додали сляб, змінили номер замовлення, посунули деталь після приходу контурів: слябів 1 замість 2, номер «ПОЧАТОК», деталь на старому місці (10,10) — finishPacking(remappedProject…) перезаписує проєкт знімком (packingSlice.ts:112–115 → 193–194 / 204–205)
R4 Ctrl+Z під час очікування undo скидає isPacking і packingRequestId (historySlice.ts:96–98), але не квиток cutOutlineTicket → прихід контурів повертає скасовану деталь (деталей 2, розміщень 2), а стек future лишається з записом
R2 під час роботи воркера посунули деталь / змінили шапку (finalizeProjectState → packingRequestId += 1, projectSlice.ts:20) відповідь воркера відкинута (packingSlice.ts:224) без isPacking = false → через 0,5 с і далі isPacking = true; нова деталь є в parts, але ні на слябі, ні в буфері. Вихід — Ctrl+Z або наступна правка виробу. Ця вада існувала й до 09.10; тепер перед воркером ще секунди очікування ядра, і вікно ширше

4. Маршрут за типом деталі: explodeDetails сьогодні

Порядок гілок у циклі (engines/geometry.ts:2159–2582); перша, що спрацювала, робить continue [ФАКТ ◔]:

# Умова Куди
1–2 мийка slot / rect :2202 / :2207 pushSlotSinkParts :1546 / pushRectSinkParts :1429
3 g.plywoodPart :2214 (новий, №223) прямокутник з part.plywood → stoneParts відсіює зі слябів
4 g.metalProfileId :2225 смужка з part.metal = true (:2234, №256)
5 будь-які стики allJointsOf(shape, g) і не «цілком» :2242 contourForDetail :1739 → manualJointCuts :1796 (кутовий Г і омега/лямбда П перекладаються legacyJointsToManual, domain/joints.ts:367) → splitContourByJoints :634 → distributeHoles :2029 → pushRingParts :2091
6 customPoints :2261 довільний контур (ніша, шаблон, імпорт)
7 Прямокутна :2388 buildRectPart :892 → buildComplexPolygonPoints :704 (:913)
8–9 Кругла :2414 / Овальна :2422 circlePoints (36) / ellipsePoints (42)
10 Г-подібна :2433 ціла :2438; інакше — «стик не вдався» → ціла деталь + console.warn('[СТИК]') :2456–2491
11 П-подібна :2494 ціла :2498; інакше — ціла + console.warn :2514–2552 (вісім старих гілок і «три прямокутники» видалені)

wholeDetail нормалізується в рушії (:2196–2200). Текстурний кластер tg: ставиться після побудови (:2562–2579). pendingRectMeta — глобальна «поштова скринька» між buildRectPart і buildPart (:73, :338–339, :895, :946) — живий, крихкий механізм, як 02.09. Шматки після ножа досі всі звуться 'Г-подібна' (L_PART_SHAPE :28, :2150), навіть прямокутні (зонди A1/A2) [ФАКТ ✔].

4.1. Зонд: Г 1000×600, виріз 500×300, R100 на увігнутому куті, припуски 0 (порівняння з 02.09)

Варіант 02.09 (Σ part.area) Сьогодні, ламана Studio Сьогодні, точний контур ядра Стик
ціла 0,4520 0,452168 (1 парт) 0,452146 (= теорія 0,45 + r² − πr²/4) —
кутовий вертикальний 0,4520 0,452168 (600×600 + 400×300) 0,452146 500 → 600 (зсунуто з дуги)
кутовий горизонтальний 0,4480 0,452168 (1000×400 + 500×200) 0,452146 300 → 400
довільний x = 500 0,4520 0,452168 0,452146 500 → 600
ліва Г (BL), три варіанти — 0,452168 у всіх — так само

[ФАКТ ✔, зонди A1 (без ядра) і O2 (з ядром)] «0,4520» у 02.09 — це part.area, округлений до 3 знаків (utils/math.ts:8–10); сьогодні part.area дає 0,452 у всіх варіантах. Різниця ламаної й ядра — 22 мм² (хорди на увігнутій дузі). Про зсув стику людина дізнається лише з консолі: snapJointOffArcs (:1668–1690) пише в jointNotices (:1659) — масив ніхто не читає, як і 02.09; так само «деталь пішла в розкрій ЦІЛОЮ» (:2488–2490, :2549–2551).

4.2. Інші зонди маршруту [ФАКТ ✔]

Дрібне [ФАКТ ◔]: типові розміри Г записані в чотирьох місцях по-різному — ніж geometry.ts:1780–1781 (1200/1200/900/500), ціла Г :2434–2437 (1800/1200/900/500), domain/joints.ts:375–377, domain/baseContour.ts:99–102 (1200/1200/600/600, через ||). Для П це звели 28.09 (uShapeDims), для Г — ні. Спрацьовує лише на деталі без розмірів.


5. Точний контур проти ламаної: хто що бере і де розходиться

5.1. Хто з чого рахує [ФАКТ ◔]

Споживач Контур Адреса
Пошук місця, межі сляба, відступ, дефекти, перетин, interPartSpacing точний (cutOutline), без нього — ламана engines/packing.ts:129–154, :302–342, :363–366
detectConflicts (червоне на дошці) точний; перепил 70 мм — по ребрах того ж контуру packing.ts:1916–1974
Сітка пошуку, габарит, сторони, кріплення доповнень, текстурні групи, «крива» група ламана / width×height packing.ts:433–436, :587–590, :183–191
Малювання парта на дошці точний з дугами (SVG A) з кешу хука; без нього — ламана; лінії перепилу — завжди з ламаної components/2d/board/PartShape.tsx:55–84, :9–38
Виділення рамкою, прилипання, обертання, межі в PDF ламана (+ computedAllowances) lib/project.ts:124–126; canvasUtils.ts:228–314; SlabBoard.tsx:559, 708, 1240, 1417; pdfPages.ts:437
DXF на верстат (Загальний / Combicut / NC300) точний з кешу хука на момент кліку, з припуском (exact.actual); чого нема в кеші — ламаною, з чесним звітом kernel/exportCutDxf.ts:92–111, 148–202; DxfExportDialog.tsx:53–56, 139–145
PDF дошок розкрою (№249) чекає ядро (blueprintOutlines), дуги дугами PdfExportDialog.tsx:82–83; pdfPages.ts:404–448
Бланк погодження (№249) чекає ядро, контур з припуском, розмірні лінії — номінал (питання №249 відкрите) QuotePanel.tsx:438; quotePdf.ts:1159
Експорт PNG ламана (без кілець) App.tsx:559
Аркуші цеху Combicut/NC300 (PDF до DXF) точний з кешу хука, інакше ламана kernel/shopSheets.ts:74–77
Вкладка CombiCut (XML/TXT/DXF Pegasus) точний exact.nominal — БЕЗ припуску, інакше nominalPoints engines/combicut/plan.ts:145–147
Пакет для MES ламана part.points (коментар обіцяє дуги через bulge, але рушій bulge не ставить — grep bulge у geometry.ts = 0) engines/mesPack.ts:377–404 [MES — сторона ІТ]
«Підібрати залишки» WMS габарит ламаної + відступ, без форми components/ui/RemnantFinderModal.tsx:43–57

5.2. Де вони розходяться

  1. Кеш точного контуру не бачить зміни вирізу [ФАКТ ✔ — найважче]. exactPartKey = detailId | width×height | вершини зовнішнього контуру | КІЛЬКІСТЬ отворів (kernel/exactParts.ts:24–27); інвалідації кешу немає, лише витіснення після 400 записів (kernel/cutOutlines.ts:64–72). Зонд C1 (без ядра): виріз 500×400 посунуто на 1000 мм на стільниці 2400×600 з двома R100 — ключ той самий, id парта той самий. Зонд O1 (реальне ядро): кеш після зсуву віддає отвір на x ≥ 350 (старе місце), cutOutline для колізій — 350, свіжий розрахунок ядра без кешу — 1350. Зонд O3: DXF для верстата з кешем пише отвір на x ≈ 450 (на слябі), правильно ≈ 1450; кільця для PDF/бланка — 350 замість 1350. Отже до перезавантаження сторінки дошка малює виріз на старому місці, колізії міряють старим отвором, а DXF, бланк погодження, PDF розкрою, аркуші цеху й CombiCut віддають старе місце (з коду; зміна розміру/форми вирізу при тій самій кількості — той самий механізм [ФАКТ ◔]). Під удар — будь-яка деталь із радіусом на куті або круглим отвором (exactPartInput.ts:32), тобто майже кожна стільниця з краном. Сьогодні цей кеш годує дошку і DXF, з №246 (09.10) — розкрій, з №249 — PDF і бланк. [ГІПОТЕЗА] вада старша за 09.10: хук із 30.09 описаний як «кешує за ламаною парта» (useExactOutlines.ts:3–4), а ключ позначено «retained verbatim» (exactParts.ts:23); код до 12.10 не зберігся — не перевірено. [ГІПОТЕЗА] чому не помітили: після перезавантаження кеш порожній і все правильно.
  2. Два контури для одного верстата [ФАКТ ◔]: DXF-профіль «Combicut» з дошки ріже exact.actual (з припуском, exportCutDxf.ts:96, 179), вкладка CombiCut — exact.nominal (без припуску, combicut/plan.ts:146). При припуску 0 (domain/defaults.ts:159–171) різниці нема; при ненульовому (FormsPanel.tsx:1636) дві програми на один сляб різнитимуться на припуск з кожного боку.
  3. Перепил на дугах [ФАКТ ✔, зонд B3]: перевірка пропускає лише відрізки з bulge (packing.ts:1951, так само лінії на дошці PartShape.tsx:15), але ні ламана рушія, ні контур різу bulge не несуть (kernel/cutOutlines.ts:34–57 віддає {x,y}) → кожна хорда дуги подовжується на 70 мм як прямий різ пилою. Деталь 1000×600 з R30 на кутах і сусід праворуч за 15 або 40 мм, верх/низ урівень: конфлікт; та сама деталь із гострими кутами — ні; з sawOvercut = 0 — ні. CombiCut при цьому сам віддає дуги воді (combicut/plan.ts, №255).
  4. Три функції «полігон розміщеного парта» (packing.ts:140, canvasUtils.ts:27, lib/project.ts:124) живі; тепер вони ще й з різних джерел: колізії — точний контур, прилипання й виділення — ламана. computedAllowances пише лише незмонтована PlacementPropertiesPanel (projectSlice.ts:646–686; 0 імпортів панелі) — працює тільки на старих проєктах [ФАКТ ✔ grep]. [ГІПОТЕЗА] магніт кладе «впритул» по ламаній, а на дузі точний контур виходить за неї до 0,9 мм (НЕСТИНГ_НА_ТОЧНИХ_КОНТУРАХ.md §3) → можливий червоний конфлікт після прилипання.
  5. Доки vs код [ФАКТ ◔]: НЕСТИНГ_НА_ТОЧНИХ_КОНТУРАХ.md §3 обґрунтовує стрілу 0,3 мм тим, що це «в 30 разів менше за відступ між деталями (10 мм)», але типовий interPartSpacing = 0 (domain/defaults.ts:168). §5 обіцяє «Розкроїти … без конфліктів» — при sawOvercut = 70 це не так (розділ 6.3).

6. Режими, групи, дзеркало, колізії

6.1. Три режими [ФАКТ ◔]

Логіка та сама, що 02.09, змістились лише рядки: autoPackEconomy :1733 (жорсткі групи лише мийки й імпорт, решта packIndependent … 'remnant'), autoPackOptimal :1754 (група на один сляб, інакше головні разом + елементи окремо), autoPackFullTexture :1770 (розгортка доповнень). Вибір режиму — лише SlabBoard.tsx:1044–1111; packingMode живе в пам'яті (packingSlice.ts:293, у persistence не пишеться) → після перезавантаження завжди «Економний».

6.2. «Крива» група за кількістю точок [ФАКТ ✔, зонд A5]

isCurvedTextureGroup = main.points.length > 8 (packing.ts:587–590) → у «Повній текстурі» група йде в tryPlaceGroupOnOneSlab без розгортки (:1783–1784), а canSplitElementsAcrossSlabs (:654–659) — false. Зонд: прямокутник 1000×600 з підворотом на A — без радіуса підворот ліг над стороною A ((10,60), деталь (10,160)); з R100 на куті CD (не на стороні A!) — праворуч (1010,10); з фаскою — як без радіуса. Сторожа немає.

6.3. Перепил 70 мм і «більшість деталей червоні» [ФАКТ ✔, зонди B1/B1b]

sawOvercut: 70 у domain/defaults.ts:29, доливається в кожен проєкт normalizeProject (projectHelpers.ts:76–80); UI немає (читачі — packing.ts:1935, PartShape, SlabBoard.tsx:1303). Пакер про нього не знає (validatePlacement :302–342), detectConflicts знає (:1947–1969). Зонд: 10 однакових 1000×600 на двох слябах 3000×1400, новий проєкт → «конфлікт» у economy 0, optimal 6, full_texture 6; 10 змішаних розмірів → 8 / 7 / 7; з sawOvercut = 0 — 0. Сторож packing.test.ts:20–43 досі ганяє mockProject без referenceData (engines/__tests__/mockData.ts — grep sawOvercut = 0). Питання Б-3 із 02.09 без відповіді в доках.

6.4. «Перевірити розкладку» рахує фанеру й метал [ФАКТ ✔, зонд B2]

SlabBoard.tsx:1122 → nestingSavings(project, parts, …) (packing.ts:1892–1914) отримує всі parts; №256 фільтрує лише стор (stoneParts — packingSlice.ts:142, 234, 277). Зонд: сляб майже повністю зайнятий каменем + 6 смуг фанери 1295×80 + метал → «оптимальних слябів 2, виграш −1», тобто на екрані «Ваша розкладка КРАЩА за автоматичну на 1 — перескладати не варто»; лише каменем — 1/1, «вже оптимальна». Так само без фільтра applyCutOutlines (packingSlice.ts:333) і loadWithoutPacking (projectHelpers.ts:116) — розміщення фанери, збережені до 10.10, після відкриття лишаються на слябі до наступного розкрою [ФАКТ ◔].

6.5. Дзеркало і групи [ФАКТ ◔]

mirroringAllowed — три умови: allowMirroring, не «підбір текстури», не в текстурній групі (packing.ts:466–471). Умови «без обробки кромки» немає, а 01_МЕЙН/АРХІТЕКТУРА_І_СТЕК.md:450–453 її досі обіцяє. Ключ групи: пакер — geometryUtils.textureGroupKey :20 (знає tg:), екран «Підбір текстури» — textureLayout.textureGroupKey :37 + textureInteractionKey :42 (не знає tg:); коментар geometryUtils.ts:7 досі «єдина реалізація на весь проєкт».

6.6. «Перерахувати слеб» [ФАКТ ◔]

Контекстне меню сляба (SlabBoard.tsx:1544, підпис i18n.ts:45) викликає runPacking() — це fullRepack = true (packingSlice.ts:301–306): перескладається весь проєкт, ручні позиції (крім замкнених) губляться, без підтвердження, яке питають три кнопки режимів. Замок розкладки (nestingLocked) при цьому діє (:143). Кнопка не сіріє під час isPacking.


7. CombiCut / верстат (№255–259)


8. Тести розкрою

Точковий прогін у probe-копії (той самий src/), під замком: 20 файлів, 142 тести — усі зелені, 16,4 с (L1_tests.out) [ФАКТ ✔]. Повний прогін воріт: 1856 ✓ / 2 відомі ✗ (coreBoundary — shapeBuilder тягне тип з UI; DXF-файл C:/hhgh) / 19 пропущено (gates/vitest.txt).

Група Файли (тестів) Що сторожать
База 02.09 (та сама, 48) packing 1, geometry 6, jointSplit 11, workerBoundary 1, nestingPersistence 10, mirroring 13, store/nestingLock 6 знімок авторозкрою, «ніяких колізій» (без referenceData!), стики = різ, межа воркера, ручні позиції, дзеркало (три умови), замок
Контур різу №246/№249 (17) engines/cutOutline 8, store/cutOutlines 3, kernel/cutOutlines 6 (OCCT) шов без провайдера, прив'язка 0/180/дзеркало, межі, отвори; стор: «спершу ламана, потім контур», старіша обіцянка не перекриває новішу, applyCutOutlines; ядро: стріла ≤ 0,3, 2020 проти 2016,5, R40 проти фаски, кільця PDF
Ядро/транспорт, Бруно (27) workerClient 11, cutOutlinesRecovery 5, useExactOutlinesRecovery 3, exactPartsWorkerEligibility 8 розділ 3.3
Припуск і межа розкрою (6) allowanceOffset 5 (№247), nestingScope 1 (№256) напівколо 2020, R30/R15/R10 — дуги, камінь проти фанери/металу
Контур деталі (20) contourBaseline 20 форми, Г ліва/права, стики Г/П, коло 36 / овал 42, довільний контур
CombiCut (24) combicut 11, combicutOrder 7, combicutSim 6 лінії диска/води/45°, XML/TXT, хвости, черговість, симуляція

Поза точковим прогоном, але в воротах зелені й дотичні: contourBaseline-сусіди mathUnify25-09 8, cutoutOnJoint 5, jointFieldScope 4, lcutSides 6, thicknessBan 5, store/textureGroups 6, unfoldLayout 2, deleteSlab 4, history 8, blueprintExact 4, kernel/dxfExport 16, shopSheets 8.

Чого не сторожить ніхто [ФАКТ ✔ — зонди пройшли «як є»]: кеш після зміни вирізу (C1/O1/O3); дії людини під час очікування ядра і Ctrl+Z (R1/R4); відкинута відповідь воркера і isPacking (R2); стор без таймауту (R3); nestingSavings з фанерою (B2); перепил із referenceData і на дугах (B1/B3); поріг «кривої» групи (A5); підтвердження в контекстному меню; збереження режиму. Застаріле в самих тестах: назви contourBaseline.test.ts:140, 147 «два прямокутники (старий шлях)» — старого шляху вже немає (3 і 4 шматки ріже ніж).


9. Стан знахідок 02.09 у цій лінзі

Знахідка 02.09 Сьогодні Адреса / доказ
«Дві математики контуру»: buildComplexRectPoints проти buildComplexPolygonPoints закрито 28.09 (№190): один будівник; R100 на прямокутнику 16 точок без дублів engines/geometry.ts:913; grep buildComplexRectPoints — лише коментар :909; зонд A4
Г зі стиком у куті — старим шляхом «два прямокутники» закрито 03.09: кутовий стик → довільний, один ніж; площа однакова у всіх варіантах; стик зсувається з дуги (§2.16) domain/joints.ts:367–391, geometry.ts:2242–2259; зонди A1/O2. Залишок: про зсув — лише console.warn
Вісім старих гілок П (+ «три прямокутники» для виїмки збоку) закрито 03.09: видалено; якщо ніж не спрацював — ціла деталь + console.warn geometry.ts:2514–2552; contourBaseline.test.ts:215
sawOvercut = 70 без UI і «9 з 10 конфліктів» відкрито: 6–8 із 10; пакер не знає; сторож без referenceData; нове — хорди дуг рахуються як прямі різи domain/defaults.ts:29, packing.ts:1935–1969, :302–342; зонди B1/B1b/B3
isCurvedTextureGroup за кількістю точок відкрито (прямокутник із радіусом — 16 > 8) packing.ts:587–590; зонд A5
textureGroupKey у двох версіях відкрито geometryUtils.ts:20 vs textureLayout.ts:37, 42; коментар geometryUtils.ts:7
Полігон розміщеного парта — три функції змінилось: досі три, тепер ще й з різних джерел (колізії — точний контур, прилипання/виділення/PDF — ламана); computedAllowances пише лише незмонтована панель packing.ts:140, canvasUtils.ts:27, lib/project.ts:124; projectSlice.ts:646–686
Режим розкрою не зберігається після перезавантаження відкрито (+ мертва підписка в шапці) packingSlice.ts:293; HeaderToolbar.tsx:9–10
Дзеркалення без умови «без обробки кромки» відкрито; доки досі обіцяють три умови з кромкою packing.ts:466–471; АРХІТЕКТУРА_І_СТЕК.md:450–453
mirrorL: ліва Г у розкрої права закрито 03.09; нове відкрите питання — дзеркало міняє ширину вирізу (1100 → 900), «угода, яку треба підтвердити» domain/elementToDetail.ts:112–114; зонд A3; contourBaseline.test.ts:120, 129–138
Кутовий стик ігнорується при довільному закрито 03.09: 3 / 4 шматки domain/joints.ts:421–427; зонд A2; contourBaseline.test.ts:166
loadWithoutPacking без projectMaterial відкрито projectHelpers.ts:115
Дебаг-логи [CORNER-DEBUG]/[CUTOUT-DEBUG] закрито у рушії; лишились мертві ключі перекладу i18nStatic.ts:1757–1758
jointNotices — лише запис відкрито, і тепер туди ж іде «деталь пішла ЦІЛОЮ» geometry.ts:1659, 1686, 2489, 2550
Виріз на лінії стику — цілком шматку за центром змінилось: виїмка в обох шматках, шов коротшає; для вузького шматка між двома стиками — старий спосіб + console.warn geometry.ts:2029–2082; зонд A6
Довільний контур не ріжеться стиком закрито 03.09 geometry.ts:1749–1764; зонд A6
Мертві groupedParts, nearbyElementReliefPlacements, scalePoints; core/* scalePoints прибрано; інші — відкрито (по 1 згадці — оголошення) packing.ts:543, 1130; core/geometry.ts, core/snapping.ts
Головний потік: замок, nestingSavings, detectConflicts як було (пакування при замку і «Перевірити розкладку» — синхронно) packingSlice.ts:165; SlabBoard.tsx:1122
8 старих гілок П — чи досяжні (ГІПОТЕЗА 02.09) знято — гілок немає —

10. Ключові знахідки

  1. [ФАКТ ✔, зонди C1/O1/O3] Застарілий точний контур після зміни вирізу. exactPartKey (kernel/exactParts.ts:24–27) не містить координат отворів, кеш (kernel/cutOutlines.ts:64–75) не інвалідується → після зсуву мийки/крана на деталі з дугою чи круглим отвором дошка, колізії, DXF на верстат (отвір на x≈450 замість ≈1450), бланк/PDF (№249), аркуші цеху й CombiCut беруть старе місце до перезавантаження сторінки.
  2. [ФАКТ ✔, зонди R1/R4] Дії під час очікування ядра перезаписуються. finishPacking(remappedProject…) (packingSlice.ts:112–115 → 193–194/204–205) повертає проєкт до знімка: зникає доданий сляб, правка шапки, переміщення; Ctrl+Z відкочується назад (квиток cutOutlineTicket undo не чіпає, historySlice.ts:96–98).
  3. [ФАКТ ✔, зонд R2] «Завислий» розкрій після дії під час роботи воркера. finalizeProjectState збільшує packingRequestId (projectSlice.ts:20), відповідь відкидається без isPacking = false (packingSlice.ts:224) → кнопки сірі зі спінером, «Зберегти в кабінет» відмовляє (cabinetActions.ts:20), нова деталь ні на слябі, ні в буфері.
  4. [ФАКТ ✔, зонди R3/K] Очікування без меж і без голосу. Стор без таймауту й .catch (packingSlice.ts:112–115); провайдер рахує парти по черзі й не кешує збої (kernel/cutOutlines.ts:84–114) → при завислому ядрі N × 120 с (workerClient.ts:31) на кожен розкрій; людина бачить лише Loader2 (SlabBoard.tsx:1062), плашка ядра в Studio схована (KernelBadge.tsx:31), збій ядра — лише в консолі, розкрій мовчки йде по ламаній.
  5. [ФАКТ ✔, зонди B1/B1b] Перепил 70 мм: після авторозкрою нового проєкту 6–8 із 10 деталей «конфлікт»; пакер не знає перепилу (packing.ts:302–342), detectConflicts знає (:1947–1969); сторож packing.test.ts без referenceData.
  6. [ФАКТ ✔, зонд B3] Хорди дуги — як прямий пропил. Пропуск лише для bulge (packing.ts:1951, PartShape.tsx:15), якого немає ні в ламаній, ні в контурі різу → деталь із R30 «конфліктує» з сусідом за 40 мм, з гострими кутами — ні.
  7. [ФАКТ ✔, зонд B2] «Перевірити розкладку» рахує фанеру й метал (SlabBoard.tsx:1122, packing.ts:1892; №256 фільтрує лише стор) → хибне «Ваша розкладка КРАЩА за автоматичну».
  8. [ФАКТ ◔] Два контури для CombiCut: DXF «Combicut» з дошки — з припуском (exportCutDxf.ts:96, 179), вкладка CombiCut — номінал (combicut/plan.ts:146); MES отримує ламану при коментарі про дуги (mesPack.ts:377–401), PNG — ламану (App.tsx:559).
  9. [ФАКТ ✔, зонди A1–A6/O2] «Дві математики» розкрою закриті: один будівник (geometry.ts:913), один ніж для всіх стиків (joints.ts:367–427), однакова площа Г у всіх стиках (0,452168 / ядро 0,452146), ліва Г — ліва, довільний контур ріжеться; але зсув стику з дуги й «деталь пішла ЦІЛОЮ» — лише в консоль (jointNotices, geometry.ts:1659).
  10. [ФАКТ ✔, зонд A5] Радіус на будь-якому куті вимикає розгортку підвороту в «Повній текстурі» (packing.ts:587–590).
  11. [ФАКТ ◔] «Перерахувати слеб» перескладає весь проєкт без підтвердження (SlabBoard.tsx:1544 → packingSlice.ts:301–306, fullRepack = true).
  12. [ФАКТ ◔] Відкрите з 02.09: режим розкрою не зберігається (packingSlice.ts:293), дзеркало без «кромки» (packing.ts:466–471 проти АРХІТЕКТУРА_І_СТЕК.md:450–453), два ключі текстурних груп (geometryUtils.ts:20 / textureLayout.ts:37), loadWithoutPacking без матеріалу (projectHelpers.ts:115).

11. Питання власнику

  1. [ПИТАННЯ] Мийка/кран, зсунуті в межах сесії. Чи були з 06.10 (DXF з ядра) / 09.10 (бланк із ядра) випадки, коли DXF, бланк погодження або PDF розкрою робили після правки вирізу без перезавантаження сторінки? Їх варто перевірити до різу (знахідка 1).
  2. [ПИТАННЯ] Що правильно, поки «рахую точні контури»: не давати нічого робити на дошці й у шапці (і чесно показати «зачекайте») чи доробити, щоб правки не губились? Обидва варіанти змінюють поведінку для менеджера.
  3. [ПИТАННЯ] Перепил 70 мм (Б-3 з 02.09, без відповіді): це правило для пакувальника (тоді він сам має тримати відступ) чи лише попередження? І чи рахувати перепил на дугах, які на CombiCut ріже вода?
  4. [ПИТАННЯ] Який контур різати на CombiCut — номінальний чи з припуском? Зараз DXF з дошки і вкладка CombiCut ріжуть різне.
  5. [ПИТАННЯ] «Перерахувати слеб» має перекладати лише цей сляб і/або питати підтвердження, як кнопки режимів?
  6. [ПИТАННЯ] Прогрів ядра після відкриття сторінки (пропозиція Б із ЗАМІРИ_12-10: перший розкрій 5,6 → 0,5 с, ціна ≈ 500 МБ пам'яті на кожного): так / лише на комп'ютерах / ні?
  7. [ПИТАННЯ] Г ліва/права: дзеркало дає не дзеркальну деталь, а іншу ширину вирізу (1100 → 900, contourBaseline.test.ts:129–138) — це угода чи помилка?
  8. [ПИТАННЯ] Залишки з 02.09 без рішення: радіус кута робить деталь «кривою» для «Повної текстури» (Б-4)? Дзеркало з умовою «без кромки» (Б-5)? «Підбір текстури» має групувати як пакер (Б-6)?

12. Пропозиції (не рішення)


Додаток. Що запускалось

L2 · Геометрія, ядро OCCT і кромки
Ланцюг деталі, заміри кромок, «що ще можна зробити з кромками» · L2_ГЕОМЕТРІЯ_ЯДРО_КРОМКИ.md

Аудит коду Viyar Stone Studio / VS CAD станом на 13.10.2026 (знімок /tmp/final/vs-cad/src, 12.10 вечір; web-app — та сама копія). Лінза: як сьогодні народжується тіло деталі, скільки ще живих «правд» про контур, де ядро OCCT головне, а де легасі, і що ще можна зробити з кромками (зміна кромки в редакторі зараз 2,4–5,9 с у пісочниці, замір 12.10).

Як: читання коду з адресами (файл:рядок відносно src/), grep, чотири зонди OCCT у node (vitest у власній копії probe-L2, під спільним замком, у фоні) і один легкий зонд без OCCT. У копії зонда в kernel/occt/occtBuilder.ts додано лише лічильники часу й булевих операцій (диф — у додатку); геометрія та сама. Оригінал не змінювався.

Позначки: [ФАКТ ✔] — перевірив сам запуском/grep/зондом; [ФАКТ ◔] — прочитано в коді з адресою; [ГІПОТЕЗА]; [ПИТАННЯ] — вирішує власник; [ПРОПОЗИЦІЯ] — лише в розділах 4 і 9, не рішення.

Межі: server/, auth, 1С/WMS — [сторона ІТ], не дивився. Гроші — лише там, де вони стикаються з геометрією (решта — лінза L6). Заміри — у node, не в браузері: без воркера, передачі масивів, three.js і відеокарти. Порівнюйте рядки між собою; браузер 12.10 на тій самій «Г власника» давав 5,9 с проти 4,2 с у node — різниця ≈1,7 с припадає на паузу 0,3 с, передачу, перетворення в three і програмну відеокарту [ГІПОТЕЗА]. Машина пісочниці — 2 ядра і ще 6 лінз паралельно: абсолютні мс завищені, співвідношення стабільні між прогонами (F2: 4,07 / 3,87 / 3,58 / 4,38 с у чотирьох прогонах).


0. Коротко для власника

  1. Кромка в 3D сьогодні — це «імітація фрези»: переріз фрези протягується вздовж сторони і віднімається від плити булевою операцією OCCT. Гроші, метраж, розкрій, DXF і PDF від цього 3D-тіла не залежать — вони рахуються з 2D-контуру [ФАКТ ✔].
  2. Час іде майже весь на віднімання, а не на «малювання»: на Г власника (R350, L20 на B–D) 82 % — булеві операції, і з них дві третини — перестраховка: ядро рахує віднімання трьома способами, бо перший («одним списком») на стику дуги з прямою щоразу дає зламане тіло [ФАКТ ✔].
  3. Зонд показав реальні секунди: якщо інструмент фрези вздовж «пряма → дуга → пряма» будувати однією трубою (а не шматками), та сама деталь будується за 0,26–0,73 с замість 1,6–26,6 с, об'єм тіла той самий до кубічного міліметра [ФАКТ ✔]. Це головна відповідь на «що ще можна зробити з кромками».
  4. Дешеві виправлення на прямих сторонах дають ще −50…−70 % (сотні мілісекунд). Кеш інструментів, два потоки ядра і менша збірка OCCT секунд на зміні кромки не дадуть (розділ 4).
  5. Контур деталі сьогодні будують дві незалежні математики (розкрій і 3D/ядро), а не шість, як 02.09.

1. Ланцюг уявлень деталі сьогодні

1.1. Шлях «чернетка → тіло на екрані» [ФАКТ ◔]

Чернетка редактора (DetailDraft / ElementDefinition: kind, розміри, mirrorL, corners, cutouts,
edgeProfiles, sinks, surfaceGrooves, subDetails-слоти, легасі fold/thickening)
 │
 ├─► 3D / ЯДРО ─ kernel/modelFromDraft.ts:158  (головний потік, 1–6 мс на деталь у зонді)
 │     контур: engines/shapeBuilder.getDetailPointsAndBounds (:455) ← domain/baseContour (:95/:166/:247)
 │             → buildDetailShape (:13, THREE.Shape, кути — domain/cornerClamp)
 │             → contourForCutters(…, 32) (:548): ламана — 64 хорди на кутову дугу (EllipseCurve → divisions·2)
 │             + точні ребра contourEdges з кривих three (line / arc / ellipse) — modelFromDraft.ts:218–245
 │     вирізи: domain/cutoutHole.cutoutHoleEdges (точні дуги) / коло — cylinder (modelFromDraft.ts:252–276)
 │     доповнення: attachmentsFromPlan ← engines/miterAssembly (план стиків) + legacyLocalAttachments (:64)
 │     КРОМКИ: engines/edgeCutters.buildEdgeCutters у режимі collectLoftDecisions → edgeLofts (:336–363)
 │     проточки, гнуті смуги (engines/arcBands), мийки (sinkFromDraft ← sinkAssembly ← explodeDetails),
 │     метал, фанера, частини по стиках (partsFromDraft ← kernel/partCuts ← лінії стиків розкрою)
 │   → KernelModel
 │   → useKernelAssembly (kernel/useKernelAssembly.ts:54; пауза 300 мс №271, :52; поки рахує — старе тіло)
 │   → assemblyPreview / previewScheduler (latest-wins у черзі; ЗАПУЩЕНУ побудову не скасовує)
 │   → occtKernel.buildAssembly → кеш складань №275 (occt/assemblyCache.ts; ключ — уся модель; LRU 8 / 64 МіБ)
 │   → workerClient №277 (occt/workerClient.ts:30; один worker на сторінку, одна задача за раз, таймаут 120 с)
 │   → geometry.worker.ts:19 → occtBuilder.buildAssembly (:1366) → buildShape (:791)
 │        є вирізи → кеш плити з профілями №278 (profiledBaseCache.ts; ≤2 плити на ядро) + nativeShapeGuard
 │        buildShapeUncached (:679): призма з точних ребер → вирізи (по одному) → вус/фаска (по одному)
 │        → cutEdgeTools (:839): інструменти фрези → без дуг cutMany (одна булева на список)
 │                                              → з дугами cutArcToolsChecked №276 (список + по черзі [+ нечітке])
 │        → тіла доповнень, частини по стиках, бандажі, мийка, метал, фанера → meshShape (:1476, BRepMesh 0,2 мм)
 │   → postMessage (передача масивів) → toThree.bodyToGeometry → DetailMesh `kernelGeometry`
 │     (Detail3DPreview.tsx:353, 459–461: коли тіло дає ядро, старий будівник не рахує нічого)
 │
 ├─► 3D ПІДБІР ─ kernel/productKernel.useProductKernel (:271): той самий modelFromDraft на «сесії» виробу
 │     → та сама черга → bodyToLocalGeometry (UV парта розкрою)
 │
 ├─► РОЗКРІЙ ─ domain/elementToDetail.buildGeometry (:80) → Detail.geometry
 │     → engines/geometry.explodeDetails: власні розкладки + buildComplexPolygonPoints + припуски offsetPolygon
 │     → DetailPart.points → пакер; колізії — по точному контуру з ядра (cutOutline, №246)
 │
 ├─► DXF / PDF / ДОШКА ─ kernel/exactPartInput.ts:10 → modelFromDraft (той самий) → outline2D.exactBlankOutline
 │     (:204: edgeLofts = [], кромок НЕМА) + лінії стиків з partCuts + припуск точним офсетом
 │
 └─► ГРОШІ / МЕТРАЖ ─ engines/productionFacts.ts:289–330 → geometryUtils.edgeLengthForSide (:409; номінал з
       половинами кутових дуг, №250) — 2D, без 3D-тіла; у Прорахунку окремої послуги на профіль кромки нема
       (перелік послуг domain/quoteCalc.ts) — гроші профілю лише в кошторисі (деталі — L6)

[ФАКТ ✔] Хто читає 3D-тіло з кромками: лише показ (редактор, 3D Підбір) і стенд (stand/main.tsx:197 переріз, :206 STEP). volumeMm3 тіла читає тільки стенд (stand/main.tsx:256, 327). Точний 2D-контур для розкрою/DXF/PDF кромок не містить (outline2D.ts:205). Тобто кромка в 3D — суто візуальна; на гроші й цех вона не впливає.

1.2. Скільки сьогодні незалежних джерел контуру деталі

02.09 — «щонайменше шість» (L2_ГЕОМЕТРІЯ.md §8, §11). Захід «Одна математика» (25–28.09) звів більшість.

# Джерело розкладки Адреса Хто їсть Дискретизація дуг
1 Розкрій: власні rectPoints, lShapePoints (4 орієнтації), uShapePoints (виріз з 4 боків, нерівні ноги), circlePoints, ellipsePoints + buildComplexPolygonPoints engines/geometry.ts:75, 283, 291, 704, 1027, 1036; збір — contourBuildForDetail :1749–1792 explodeDetails → парти, гроші, підписи PDF, лінії стиків для ядра (kernel/partCuts) 12 хорд/дуга (:784), коло 36 (дно мийки 28), овал 42
2 3D/ядро: baseContour → shapeBuilder (THREE.Shape) domain/baseContour.ts:95/166/247; engines/shapeBuilder.ts:13/455/548 modelFromDraft (ядро, точні контури DXF/PDF/колізій), легасі-3D, Detail2DBlueprint, jointAnchorPoints, ніша у ядро — точні дуги; ламана фрези — 64 на кутову дугу, криві форми — 256; CURVE_CONTOUR_SEGMENTS = 64
3 Бланк погодження approvalSplit (третій ніж) engines/approvalSplit.ts імпорт бланка — схований під адмін-щиток з 28.09 свої евристики

[ФАКТ ◔] Живих незалежних — два (розкрій і 3D/ядро) + один схований. Похідні, не незалежні: точні контури ядра (джерело 2, обрізане лініями стиків із джерела 1 через partShift, exactPartInput.ts:35–42), Detail2DBlueprint (тепер baseContour + cornerClamp, Detail2DBlueprint.tsx:3–4, 219–229), jointAnchorPoints. [ФАКТ ◔] Свідомо не зведене (журнал 28.09): П «на бік» (innerCutSide left/right) уміє лише джерело 1. [ФАКТ ◔] Дефолти Г у розкрої інші: innerHorizontal ?? 900, innerVertical ?? 500 (geometry.ts:1781) проти createDraft 500/400 і defaultsForKind('l') 600/600 — спрацює лише на деталі без цих полів. [ФАКТ ◔] Дуги: 12 / 28 / 36 / 42 / 64 / 256 хорд і точні дуги — сім дискретизацій однієї дуги в різних місцях.

1.3. Де ядро вже головне, а де ще легасі [ФАКТ ◔]

Що Редактор виробу 3D Підбір Розкрій / 2D Експорт
Плита: контур, вирізи, вус 45° ядро ядро (ціла / частини по стиках) легасі explodeDetails; колізії — точний контур ядра (№246) DXF, PDF, дошка — точний контур ядра (без кромок)
Кромки, фрезерування кутів/вирізів, проточки ядро ядро лише маркери 2D профіль у DXF не йде; NC300 — коди в імені файлу
Доповнення (нога, потовщення, підворот, панель, бортик), вкладені ядро (план стиків) ядро легасі-парти —
Гнуті смуги по дугах ядро ядро (№251) легасі radiusElementParts —
Мийки ядро (частини з розкрою) легасі: гілка isSinkElement (ProductElement3DNode.tsx:479–519); коментар productKernel.ts:20–23 легасі (14 / 9 партів) —
Метал ядро легасі домен —
Фанера у редакторі не малюється, лише стенд — парти ply_* —
Решітка зливу не малюється (ні легасі, ні ядро) легасі (ріже круглу деталь дна) DrainGrateMarks —
Переріз, STEP лише стенд — — —
Переріз кромки на кресленні «Документи» — — constructor/drawing/sections.ts:19 — з каталогу SVG edgeProfileDrawings, не з тіла —
Гроші, метраж 2D — productionFacts, quoteCalc —
Повний відкат ?kernel=legacy або VITE_KERNEL=legacy (kernel/config.ts:15–22) — усе на старий будівник

[ФАКТ ◔] Коментар у kernel/config.ts:8–11 («сімейства 2–4 поки на старому будівнику») застарів з 30.09. [ФАКТ ✔] kernel/useKernelGeometry.ts — без імпортерів (grep), мертвий хук (для L3).


2. КРОМКИ — повний шлях з адресами

Крок Що відбувається Адреса
1. Довідник 70 профілів: referenceData.edgeProfiles (id, підпис, припуск розкрою, operations) domain/defaults.ts:30–134
2. Вибір панель «Кромки» → draft.edgeProfiles (рядок або EdgeTreatment верх/низ/довжина/відступ) → normalizeEdgeTreatment components/forms/editors/EdgeProfilesPanel.tsx; domain/edgeTreatment.ts
3. Переріз фрези PROFILE_CUTS — 70 id → 6 форм (фаска, радіус, півбульноз, бульноз, cove, shark); дуга перерізу — 10 відрізків (ARC_SEGMENTS); закус 0,2 мм (BITE_MM), ядро повертає до 0,02 (KERNEL_BITE_MM) engines/edgeCutters.ts:60, 63, 88–166, 266–354; kernel/modelFromDraft.ts:42, 355
4. Шлях фрези сторони в порядку контуру; сусіди з однаковим профілем зливаються в один пробіг, профіль по всьому контуру — замкнене кільце; подовження за опуклий кут max(4, t); на увігнутому >20° — розрив; увігнута дуга, менша за глибину профілю, — не ріжеться (drop); на опуклій дузі без «Обробки торців» профіль дугу не проходить — вибігає по дотичній; часткові кромки; кут «Стандарт» = tech_chamfer; периметр вирізу edgeCutters.ts:879–1188 (злиття 999–1088, «наскрізь» 964–982, прапорці 656–705, STANDARD_MILL_PROFILE :441)
5. Рішення замість геометрії collectLoftDecisions → edgeLofts: {cross, stations{p, ox, oy, scale}, closed} edgeCutters.ts:450–463; modelFromDraft.ts:343–356
6. Інструменти в ядрі точні кола моделі (knownCircles :431); ділянка на колі — обертання перерізу (revolveTool :490, №273); прямі ≤ 8 станцій — призми зшиванням граней (sweepSegmentTool :343, BRepBuilderAPI_Sewing); > 8 — лінійчатий лофт (loftTool :601) kernel/occt/occtBuilder.ts:343–633
7. Віднімання без дуг — cutMany (одна булева на список, SetUseOBB) :188; з дугами — cutArcToolsChecked :941: на свіжих копіях «одним списком» і «по черзі» мусять зійтись (≤200 мм³ / 0,0005 %), інакше суддя «нечітке» 1e-4; ніхто — старий лофт (:863–869) occtBuilder.ts:839–990
8. Кеш плити з профілями плита з кромками без вирізів у worker (≤2 шт., ключ — модель без вирізів + режим дуг); при зсуві вирізу — копія + лише виріз; охорона BRepCheck плити й результату; кільце фрезерування вирізу — після вирізу occtBuilder.ts:754–832; occt/profiledBaseCache.ts:13, 63–106; occt/nativeShapeGuard.ts:11–77
9. Тіло → екран meshShape (BRepMesh 0,2 мм + ребра B-rep) → передача з worker → кеш складань → useKernelAssembly → bodyToGeometry occtBuilder.ts:1476; geometry.worker.ts:55–58; useKernelAssembly.ts:81–131
10. Паралельно (без 3D) метраж/гроші edgeLengthForSide; 2D-маркери utils/edgeProfiles.ts; припуск профільованого ребра в розкрої; DXF/PDF — контур без кромок productionFacts.ts:289–330; geometryUtils.ts:409–447

[ФАКТ ✔] Вбудовані фази побудови (setShapeBuildDiagnostics, occtBuilder.ts:662–669) не розділяють будову інструментів і віднімання: поле edgeToolsMs оголошене, але ніде не міряється (завжди 0), усе йде в cutManyMs. Звідси й формулювання Бруно «cutMany — 86–93 %»: воно включає й будову інструментів, і перевірки. Для цього аудиту в копії зонда додано власні лічильники (додаток).

[ФАКТ ✔] Кромка під ногою: панель каже «зайнято: Нога (B)» (domain/edgeOccupancy.ts:45), а ядро однаково будує 2 лофти фрези на B (легкий зонд) — профіль прорізається під ногою; у фактах перевірки зайнятості теж нема (productionFacts.ts:289–330). edgeOccupancy читають лише компоненти (grep).


3. ЗАМІРИ — де час (node, OCCT 7.x opencascade.js, синтетичні деталі)

Фікстури: F1 прямокутник 2000×600×20, ar_20 на A · F2 Г 1200×1200, ноги 600, R350 на C, l_20 на B, C, D (та сама, що в occtArcTools.test.ts:90) · F3 прямокутник 2000×600 з вирізом 500×400 R10 і ar_20 на A, B · F4a 2000×600, ar_20 на A–D (кільце) · F4b 2000×600, A ar_20, B l_20, C xd_20, D t_20 · F5 = F2 + виріз 500×400 R10.

3.1. Повна побудова складання (як у worker), мс [ФАКТ ✔]

Деталь 1-ша побудова повтор без кешу складання плита без кромок («план Б») інструменти віднімання (булеві) перевірки + копії сітка + об'єм булевих / інструментів
F1 450¹ 225 10 111 102 — 8 1 / 6
F2 4 070 3 869 14 257 3 352 292 + 57 83 8 / 6
F3 376 114 (плита з кешу №278) 136 129 124 + виріз 79 охорона 20 17 2 / 8
F4a 318 — — 126 167 — 8 1 / 8
F4b 2 088 — — 625 1 406 — 40 1 / 18
F5 4 313 зсув вирізу 244 — 231 3 562 274; охорона 127 80 9 / 6

¹ перша взагалі побудова з кромкою після старту ядра (прогрів). Кеш складань №275: повтор тієї самої моделі F2 — 1 мс (ключ 1,9 мс + копія 0,6 мс) замість 3,5 с. Старт OCCT у node — 4,9–6,4 с; купа wasm — 100 МБ після старту, 299 МБ після першого зонда (не зменшується), RSS процесу 0,7–0,9 ГБ.

3.2. Зміна кромки (повна перебудова, як сьогодні), мс [ФАКТ ✔]

Сценарій node браузер 12.10
F1: A ar_20 → l_20 282 «проста + кромка» 0,84 с
F2: додати l_20 на E 4 171 5,9 с
F2: D l_20 → ar_20 3 517 —
F3: B ar_20 → l_20 (кеш плити не діє — змінився ключ) 656 —
F4b: B l_20 → r_5 1 996 —
F5: D l_20 → ar_20 4 217 —
F2 зі старим лофтом (?arcs=0, як до №273) 11 094 (1 булева 9,3 с, 679 граней) —
F2 з d_20 (бульноз) — перевірка не зійшлась → відкат на старий лофт 26 635 —

3.3. Чому F2 — 4 секунди: розклад «перевіреного віднімання» №276 [ФАКТ ✔]

Деталь «одним списком» «по черзі» «нечітке» (суддя) перевірки результат
F2 1 527 мс → невалідне, 3 тіла 1 372 мс ✓ 1 036 мс ✓ 494 мс взято «по черзі»
F5 1 097 → невалідне, 3 тіла 1 252 ✓ 931 ✓ 636 «по черзі»
F2, D→ar_20 1 065 → невалідне, 2 тіла 1 104 ✓ 900 ✓ 302 «по черзі»
F2 з xd_20 1 588 → 2 тіла 1 290 ✓ 1 068 ✓ — «по черзі»
F2 з ar_20 666 ✓ 651 ✓ не потрібне — «списком»

Висновок [ФАКТ ✔]: на Г власника перший спосіб завжди провалюється (дотичний стик обертання з прямим інструментом — той корінь, що Лео описав у №276), тому кожна правка платить три булеві підряд + перевірки. Інструменти — 6–9 % часу, віднімання — 82 %, перевірки — 7–12 %, сітка — 2 %.

3.4. Що з цього випливає


4. «ЩО ЩЕ МОЖНА ЗРОБИТИ З КРОМКАМИ» — варіанти з числами

Шкала чесності: «секунди» — виміряно, знімає секунди на зміні кромки; «сотні мс»; «не про це» — не скорочує зміну кромки (може допомогти деінде). Усе — пропозиції, не рішення.

(д) Один свіп профілю вздовж гладкого ланцюга — СЕКУНДИ [ПРОПОЗИЦІЯ, виміряно]

Сьогодні рішення фрези вже зливають однакові сусідні сторони в один пробіг (edgeCutters.ts:999–1088), а ядро віднімає все однією булевою — але будує інструмент шматками: призми на прямих, обертання на дузі, і саме стик «обертання ↔ призма» ламає «список» (розділ 3.3). Зонд №3: той самий полігон перерізу фрези, але однією трубою (BRepOffsetAPI_MakePipe) уздовж точних ребер «C → дуга R350 → D» з подовженням за опуклі кути, пряма B — призмою; одна булева «списком»:

Профіль на B, C, D (Г власника) сьогодні трубою об'єм тіла
l_20 (L20) 4 378 мс 385 мс той самий (ΔV = 0 мм³), валідне, 1 тіло
xd_20 4 683 438 ΔV = 0
ar_20 1 640 262 ΔV = 0
d_20 26 635 (відкат на лофт) 729 −186 мм³ проти тіла старого лофта (його хорди)

Окремо (зонд №2): L20 точними примітивами (циліндр R10 по B + труба кола по C–дуга–D) — 0,42 с, ΔV = −861 мм³ = 0,52 мм² × 1 650 мм шляху = рівно похибка 10-кутника перерізу + закус 0,02 (очікувано) — тобто тіло ще точніше.

(а) План Б: кромка спершу лише кольором, геометрія — кнопкою «Промалювати кромки» — СЕКУНДИ, але ціною картинки

(в) Інкрементальне віднімання: база «плита з усіма кромками, крім зміненої» — секунди лише з наперед порахованою базою

(б) Кеш тіла інструмента кожної кромки (ключ: профіль + геометрія сторони) — не секунди

Прямі сторони: злиття колінеарних станцій і призма замість «зшивання» — сотні мс, дешево [ПРОПОЗИЦІЯ, виміряно]

(е) Фаска/радіус самим ядром (BRepFilletAPI_MakeChamfer / MakeFillet) — секунди для 43 з 70 профілів, але інша поведінка

(г) Швидкий наближений меш кромки без OCCT одразу + точне тіло пізніше — сотні мс видимої затримки, але друга правда

(є) Два потоки ядра — не про зміну кромки

Менша збірка OCCT (50 МБ → ~7 МБ) — не про зміну кромки

Ще дрібне, але реальне

Підсумок: секунди на зміні кромки дає лише (д) — інструмент однією трубою вздовж гладкого ланцюга (і, ширше, точні примітиви); дешеве (прямі сторони) — сотні мс; план Б — питання вигляду, не швидкості; кеш інструментів, два потоки, менша збірка — не про це.


5. Дірки ядра і запобіжники

Діра / запобіжник Що робить код Адреса Позначка
Еліпс і довільні вирізи ламаною, у звіті partial: еліпс/довільний виріз — ламаною modelFromDraft.ts:274–276 [ФАКТ ◔]
Скруглення прямокутного вирізу точні дуги (cutoutHoleEdges), не ламана modelFromDraft.ts:262–267; domain/cutoutHole.ts:87–132 [ФАКТ ◔] — рядок Ц-14 у 04_ПРАВИЛА_ЦЕХУ_ДЛЯ_ЯДРА застарів
Еліптичні дуги контуру (овал) тіло — точний еліпс (№234), але фреза на еліпсі — старий лофт (обертання лише на колах) occtBuilder.ts:431–442, 585–599 [ФАКТ ◔]
Вус 45° на дузі (потовщення/нога на радіусній стороні) unsupported: вус на дузі ще не переносився modelFromDraft.ts:290–297; Ц-11 ⬜ [ФАКТ ◔]
Мийка з помилкою збірки unsupported у звіті; чаша не малюється (без легасі-підміни) kernel/sinkFromDraft.ts:67–75; Detail3DPreview.tsx:2871–2873 [ФАКТ ◔]
Мийка збирається за іменами партів name.includes('задня стінка')…; ядро бере ті самі частини engines/sinkAssembly.ts:52–94 → sinkFromDraft.ts:30 [ФАКТ ◔] (відкрито з 02.09)
Відкат на старий лофт перевірене віднімання не зійшлось → лофт (F2 з d_20: 26,6 с) occtBuilder.ts:863–869 [ФАКТ ✔]
Охорона кешу плити BRepCheck плити й результату; невдача → один раз старим порядком; WASM-помилка не ховається nativeShapeGuard.ts:50–77 [ФАКТ ◔]; на F5 охорона коштує 127 мс з 4,3 с
Помилка одного доповнення у errors, решта будується; складання з помилками не кешується occtBuilder.ts:1249–1252; assemblyCache.ts:80–84 [ФАКТ ◔]
Таймаут / падіння worker 120 с, усі задачі відхиляються, worker перезапускається workerClient.ts:31, 45–67 [ФАКТ ◔]; F2 з d_20 (26 с) до межі не дотягує
Режим швидких дуг у worker за замовчуванням увімкнено, ?arcs=0 вимикає; розбіжність, про яку попереджав Бруно, закрита workerClient.ts:151–156 [ФАКТ ◔]
Ключ кешу складань без режиму дуг режим сталий до перезавантаження сторінки — прийнятно occt/index.ts:12–18 [ФАКТ ◔] (як у №275)
Статус Бруно «INCONCLUSIVE» L20 R350 повна різниця A\B «кеш ↔ пряма побудова» не дораховується (5 хв у Бруно, 20 хв у №278). Є непрямі докази: об'єм, габарит, 8 перерізів (Бруно), сторож profiledBaseExactArcs.test.ts, і незалежна побудова трубою в цьому аудиті дала той самий об'єм до 1 мм³ ЗВІТ-ДЛЯ-ЛЕО-20261012.txt; журнал №278 лишається INCONCLUSIVE [ФАКТ ✔]
Перетини тіл у редакторі вимкнено (overlaps: false) заради швидкості; у сторожах і на стенді — увімкнено assemblyPreview.ts:7 [ФАКТ ◔]
Кромка під ногою ядро ріже профіль, панель забороняє розділ 2 [ФАКТ ✔]

6. Стан знахідок 02.09 у цій лінзі

Знахідка 02.09 Стан сьогодні Адреса / доказ
mirrorL не доходить до buildGeometry (ліва Г ріжеться правою) закрито 03.09 domain/elementToDetail.ts:94–114 (cornerOrientation з mirrorL); сторож mirrorAndSides.test.ts:34–59
Три моделі стику (ManualJoint / Joint / AssemblyConnection) змінилось: кутові Г і омега/лямбда П на вході в рушій перекладаються в довільні — один ніж (03.09); ядро ріже частини тими ж лініями (№232). AssemblyConnection — досі глухий кут: панель у 3D Підборі пише, читачів нема engines/geometry.ts:1795–1800; kernel/partCuts.ts; components/ui/Sidebar3D.tsx:224; domain/types.ts:1085
Кутовий стик ігнорується, якщо є довільний закрито (один вид стику) geometry.ts:1796–1800
Вирізи в розкрої без cornerRadius закрито 25.09 (cutoutHolePolygon — одна функція для розкрою і 3D); у ядрі — точні дуги geometry.ts:854–885; domain/cutoutHole.ts:28, 87
Мийки збираються за іменами партів відкрито, і тепер те саме правило несе ядро (частини мийки — звідти ж) engines/sinkAssembly.ts:52–94; kernel/sinkFromDraft.ts:30
Гнутий елемент на увігнутому куті відкрито [ФАКТ ✔]: Г, кут C R100, потовщення на C і D → spec для C; ядро будує смугу C_radius:auto-fold domain/radiusElement.ts:242 (досі corner.reflex); engines/arcBands.ts:114; легкий зонд
Шість каталогів кромок відкрито [ФАКТ ✔]: довідник 70 = класи 70 = перерізи 70; креслення 56, картинки 56; правил грошей edge 34 (32 варіанти + «Стандарт»); 39 з 70 профілів без вбудованого правила грошей — серед них l_20 (той самий L20, що гальмує в 3D); EDGE_PROFILES_BY_USAGE — 37 id, з них 4 неіснуючі (zr_20, a20r5, a_20, acr_r2), читачів нема; EdgeProfileDef.operations читає лише модалка domain/defaults.ts:30–134; domain/edgeProfileClasses.ts:87; engines/edgeCutters.ts:88; domain/serviceMapping.ts:75; domain/materialRules.ts:180
Зайнятість торця лише в UI відкрито, тепер і в ядрі: профіль під ногою прорізається domain/edgeOccupancy.ts:45 (читачі — лише компоненти); легкий зонд
Доповнення з двох джерел (fold/thickening і слоти) відкрито; ядро повторює обидва: withoutShadowedSlots (№242) + legacyLocalAttachments (коробка на всю сторону, без вуса, partial) kernel/modelFromDraft.ts:64–96, 128–139; ProductEditorWorkspace.tsx:282, 572–610
П-14: підворот на кераміці 45° у 3D, прямий у грошах закрито 29.09: miterJointFor('thickening') = false на всіх матеріалах — і 3D, і гроші «пряма склейка» engines/miterAssembly.ts:31–34; легкий зонд (thickening → false, fold → true)
Подвійний рахунок кутів доповнень і дуги з «Обробкою торців» відкрито (свідомо, чекає власника — журнал 28–29.09) [ФАКТ ✔]: R100 на AB з «Стандарт», ar_20 лише на A — метраж A 1 978,5 мм (з половиною дуги) + факт дуги 157,1 мм = дуга 1,5 раза; 3D профілює дугу один раз engines/productionFacts.ts:419–447, 449–460; geometryUtils.ts:447
Попередження про зсув стику з дуги губиться (jointNotices) відкрито geometry.ts:1659, 1686, 2489
Отвір під злив у дні мийки вимкнено відкрито (drainRadius = 0) geometry.ts:1481
Проточки й решітка — лише картинка проточки тепер ріже ядро в 3D; у гроші/PDF — досі ні (grep порожній); решітку ядро не знає modelFromDraft.ts:364–369; productionFacts/quoteCalc/utils/export
Діагностика [CORNER-DEBUG]/[CUTOUT-DEBUG] закрито (grep порожній) engines/geometry.ts
≥6 побудов контуру змінилось: 2 живі незалежні + 1 схований (розділ 1.2)

7. Ключові знахідки

  1. [ФАКТ ✔] Кромка в 3D впливає лише на картинку. Гроші, метраж, розкрій, DXF, PDF рахуються з 2D-контуру; точний контур ядра для цеху будується без кромок (outline2D.ts:205); 3D-тіло читають лише показ і стенд. Тому «план Б» безпечний для цифр (розділ 4а).
  2. [ФАКТ ✔] 4 секунди на Г власника — це перестраховка віднімання. «Одним списком» на стику дуги з прямою щоразу дає невалідне тіло (3 тіла), тож кожна правка платить три булеві + перевірки (occtBuilder.ts:941–990): 1,5 + 1,4 + 1,0 с + 0,5 с перевірок; інструменти — лише 0,26 с.
  3. [ФАКТ ✔] Інструмент однією трубою вздовж гладкого ланцюга дає те саме тіло в 6–36 разів швидше (L20 4,4 → 0,39 с, xd_20 4,7 → 0,44, ar_20 1,6 → 0,26, d_20 26,6 → 0,73; ΔV = 0 мм³) — головна відповідь на «що ще можна зробити з кромками».
  4. [ФАКТ ✔] Найгірший випадок — відкат на старий лофт: Г власника з d_20 будується 26,6 с, 1 349 граней (occtBuilder.ts:863–869); сторожі №276 цей профіль на цій деталі не тримають.
  5. [ФАКТ ✔] Прямі сторони будуються втричі більшим числом інструментів, ніж треба, і кожен — «зшиванням» граней (occtBuilder.ts:343–385): злиття станцій + призма — F4b 1,87 → 0,76 с, F1 0,19 → 0,06 с, ΔV = 0.
  6. [ФАКТ ✔] Кеш плити №278 (2 місця) витісняють точні контури розкрою й тіла доповнень з вирізами: зсув вирізу на Г власника 0,2 с → 3,9 с після двох точних контурів інших деталей (profiledBaseCache.ts:13, outline2D.ts:206, occtBuilder.ts:1069).
  7. [ФАКТ ✔] Діагностика фаз Бруно не розділяє інструменти й віднімання (edgeToolsMs ніколи не міряється, occtBuilder.ts:662–669) — «cutMany 86–93 %» включає будову інструментів і перевірки.
  8. [ФАКТ ◔] Контур деталі — дві живі математики, не шість: розкрій (geometry.ts — власні розкладки, 12 хорд/дуга) і 3D/ядро (baseContour → shapeBuilder); точні контури DXF/PDF — гібрид обох через partShift. Сім різних дискретизацій однієї дуги (12…256 і точна).
  9. [ФАКТ ◔] У 3D Підборі мийки й метал досі на легасі, решітка зливу не малюється ніде, крім легасі-Підбору; переріз кромки в «Документах» — з каталогу SVG, не з тіла (друга «правда про форму» профілю).
  10. [ФАКТ ✔] Три старі діри перейшли в ядро: профіль під ногою прорізається; гнутий елемент на увігнутому куті будується; мийка збирається за іменами партів (edgeOccupancy.ts:45, radiusElement.ts:242, sinkAssembly.ts:52–94).
  11. [ФАКТ ✔] Гроші й 3D розходяться на опуклій дузі: профіль лише на A, R100 без «Обробки торців» — метраж 1 978,5 мм (з половиною дуги), а в 3D дуга без профілю (фреза «наскрізь» по дотичній, edgeCutters.ts:964–982); з «Стандарт» — дуга в метражі 1,5 раза.
  12. [ФАКТ ✔] 39 з 70 профілів без вбудованого правила грошей, серед них l_20 — саме L20, на якому вимірювали гальма 3D, у кошторисі дає нуль, поки керівник не додасть правило (serviceMapping.ts:75); і досі мовчки — жовта плашка є лише для правил, що вказують на неіснуючу послугу (EstimatePanel.tsx:333–340). Деталі — L6.

8. Питання власнику

  1. План Б: менеджеру прийнятно бачити кромку спершу кольором (без форми) і натискати «промалювати», чи 3D має завжди показувати профіль? Якщо зробимо «одну трубу» (4д), різниця 0,3 с проти миттєвої — чи потрібен план Б взагалі?
  2. Профіль лише на одній стороні біля опуклої дуги: цех справді не фрезерує дугу (як у 3D, «наскрізь по дотичній»), а клієнт платить за половину дуги (як у метражі)? Що з цього правда — 3D чи гроші?
  3. Швидка прев'ю-картинка старим будівником на 0,3–5 с, поки ядро рахує, — дозволяєте попри умову Бруно №4 «жодної підміни старим», чи краще Стоуник «перебудовую» і старе тіло?
  4. l_20 і ще 38 профілів у кошторисі дають нуль — додаємо правила (як у EdgeProfileDef.operations) чи цех рахує їх інакше?
  5. Фаска/радіус точним ядром дають точніші радіуси, ніж каталожний 10-кутник (різниця ≈1,5 % знятого матеріалу): для цеху важлива точність форми профілю в 3D/STEP, чи досить «схоже»?
  6. Гнутий елемент на увігнутому куті і кромка під ногою — перекрити правилом у ядрі й фактах, чи це рідкість і лишаємо?

9. Пропозиції (не рішення)

  1. Інструмент фрези однією трубою вздовж гладкого ланцюга ребер (4д) — перший кандидат, бо єдиний дає секунди на зміні кромки й знімає корінь №276. Спершу сторожі-скан (як №276) з порівнянням об'єму й перерізів із сьогоднішнім тілом, потім заміна під перемикачем на кшталт ?arcs=0.
  2. Прямі сторони: злиття колінеарних станцій і призма замість зшивання (−50…−70 % на прямокутниках).
  3. Кеш плити №278: окреме місце для превʼю редактора (або облік за байтами), щоб дошка/DXF його не витісняли.
  4. Діагностика фаз: міряти окремо інструменти, віднімання, перевірки, сітку (як у зонді) — щоб наступні рішення приймались за правильною розбивкою.
  5. Сторож на найгірший випадок: Г власника з d_20 (сьогодні відкат, 26,6 с) і кромка під ногою — у kernel/__tests__.
  6. Одна правда про переріз профілю: PROFILE_CUTS (3D) і edgeProfileDrawings (креслення) звірити тестом або брати переріз креслення з тіла (план VS CAD §4 «перерізи з тіла у комплект креслень» — не зроблено).
  7. Узгодити гроші й 3D на дузі після відповіді на питання 2 — одне правило «чи профілюється дуга» для edgeLengthForSide і buildEdgeCutters.
  8. Доки: 04_ПРАВИЛА_ЦЕХУ_ДЛЯ_ЯДРА Ц-14 (вирізи вже точні), kernel/config.ts:8–11, loadOcct.ts:3–10 (розмір стиснутого файлу) — оновити.

Додаток: що запускалось

Копія зонда: /tmp/final/audit1310/probe-L2 (за брифом: tar без node_modules/dist + cp -al node_modules). У копії src/kernel/occt/occtBuilder.ts додано лише лічильники (__L2, __L2attempts, export для cutEdgeTools): час і кількість булевих у cut/cutMany/cutListKeep, будова інструментів і віднімання в cutEdgeTools, перевірки й копії в cutArcToolsChecked, BRepMesh у meshShape. Геометрію не змінено — об'єми збігаються з сторожами (F2 = 21 997 205 мм³ у всіх прогонах).

Зонд Файл Що Час Результат
№1 (під замком) src/kernel/__tests__/L2probe.edges.test.ts фази F1–F5, зміни кромок, план Б, легасі-CSG, кеш складань, інкрементальне віднімання, фаска/радіус ядром, старий лофт 75 с 9 ✓; L2_results.json
№2 (під замком) L2probe2.edges.test.ts розклад способів №276, злиття станцій, призми, L20 примітивами, фаска на дотичній дузі 32 с 4 ✓; L2_results2.json
№3 (під замком) L2probe3.sweep.test.ts одна труба перерізу вздовж G1-ланцюга: l_20, xd_20, ar_20, d_20 46 с 1 ✓; L2_results3.json
№4 (під замком) L2probe4.cache.test.ts витіснення плити з кешу №278 точними контурами 15 с 1 ✓; L2_results4.json
легкий (без OCCT) L2probe.light.test.ts каталоги кромок, класи перерізів, гнутий на увігнутому куті, кромка під ногою, П-14, гроші проти 3D на дузі 2 с 1 ✓; L2_light.json

Виводи — /tmp/final/audit1310/L2_probe*.out. Ворота ведучого не дублював: gates/vitest.txt — 1856 ✓ / 2 відомі ✗ (coreBoundary, DXF C:/hhgh) / 19 пропущено; ядро — 34 файли тестів у kernel/__tests__, найдовший occtArcTools.test.ts 141 с.

Не перевірено: браузер (воркер, передача, three, GPU — числа лише з заміру 12.10); овал і замкнений контур трубою; повна семантика шляху фрези для «труби» (часткові кромки, drop, кільце вирізу); симетрична різниця A\B для L20 R350 (INCONCLUSIVE лишився); пам'ять браузера на два worker'и; як часто дошка й редактор реально ділять кеш №278.

L3 · Мертве, важке, хардкод
Що вшито в Студію, великі файли, задвоєння, tsc/eslint · L3_МЕРТВЕ_ВАЖКЕ_ХАРДКОД.md

Питання власника (дослівно): «може то все через те, що в нас у Студії захардкоджено CAD і білдінг і т.д., чи вони мертві, поки ми в них не зайшли? Може в нас файли з кодом великі, ми 1000 років аудити не робили».

Що аудитувалось. /tmp/final/vs-cad/src — знімок 12.10 вечір (666 файлів; за брифом — той самий набір, що на диску, і той самий, що web-app, крім constructor/docs/DocsTab.tsx). Порівняння — з аудитом 02.09 (09_АУДИТ_02-09/L3_…, 03_МЕРТВЕ…, 04_ДЕРЕВО…; код 02.09 не зберігся, тож беру їхні числа й адреси). Адреси — відносно src/.

Як. (1) Власний граф імпортів на AST TypeScript: статичні import/export … from, import type (окремо), import()/React.lazy, ?worker, new URL(…, import.meta.url), new Worker(…); досяжність від main.tsx окремо «статично» і «з лінивими». (2) knip 6.41 у probe-копії (--reporter json і compact). (3) vite build --sourcemap у probe-копії — склад кожного чанка зі sourcemap: що реально лежить у стартовому наборі. (4) jscpd 4 (копіпаст). (5) grep/AST-скрипти на хардкод і задвоєння. (6) Ворота ведучого: gates/tsc.txt (418), gates/vitest.txt (+vitest.done), gates/eslint.json — дочекався всіх трьох. Важке — під спільним замком. Сирі виводи і скрипти: /tmp/final/audit1310/probe-L3/_l3raw/ (секрети з них вичищено).

Позначки. [ФАКТ ✔] — перевірив сам запуском/grep/збіркою; [ФАКТ ◔] — прочитано в коді з адресою; [ГІПОТЕЗА]; [ПИТАННЯ] — вирішує власник; [ПРОПОЗИЦІЯ] — лише в кінці. Рішень немає.

Межі. server/, lib/api.ts, auth/Keycloak, features/* (реєстр, PLM, МЕС-папки) — [сторона ІТ]: лише фіксую, що вони в бандлі й де адреси. Живий старт (час, пам'ять, що реально вантажиться в браузері) — лінза L7; тут — статична карта. Геометрія/розкрій по суті — L1/L2.

Супровідні файли: реєстр 03_МЕРТВЕ_І_ЗАДВОЄНЕ_13-10.md, дерево 04_ДЕРЕВО_КОДУ_13-10.md (усі 666 файлів з описами, рядками, Δ до 02.09 і позначкою, де файл вантажиться).


0. Коротко для власника (простими словами)

  1. Так, частина CAD і «будівника» (ядра OCCT) вшита в Студію. Вкладки CAD (замір, метал, фанера, збірка, зведення, документи, CombiCut) і BUILDING (план, розкладка, відомість) — справді «сплять», поки в них не зайшли: їхній код вантажиться лише при відкритті. Але креслярка CAD (≈3 100 рядків) і майже все ядро OCCT (≈6 000 рядків, разом із будівником тіл) потрапили в стартовий набір через «містки»: дошку 2D-розкрою (діалог експорту DXF), реєстрацію ядра в main.tsx і бічну панель BUILDING. Цей код вантажиться при кожному відкритті сторінки.
  2. Ядро OCCT у Студії не спить. При старті main.tsx реєструє ядро для всіх режимів, і 2D-дошка та розкрій просять у нього точні контури деталей, щойно на дошці є деталь із дугою (заокруглений кут, круглий виріз, еліпс). Сам 50-мегабайтний файл ядра вантажиться не на старті, а при першій такій потребі — тобто при першому відкритті майже будь-якого реального проєкту. Скільки це коштує в секундах — міряє L7.
  3. МЕС (симуляція цеху) — мертва: вкладку ніхто не підключив; 3 090 рядків лежать лише заради тестів. Задуманий поділ «Студія / CAD / BUILDING як окремі робочі простори» теж написаний, але не підключений.
  4. Код подвоївся за 41 день (88,5 тис. → 146,9 тис. рядків), а з мертвого, знайденого 02.09, не видалено жодного файла. Мертвих файлів стало 17 (було 9).
  5. Великі файли стали ще більшими: редактор деталі в 3D — 3 530 рядків (+616), редактор виробу — 2 974 (+416, один компонент на 2 298 рядків), довідка — 1 154 (×2). Сім функцій довші за тисячу рядків.
  6. На старті кожної сторінки вантажиться ≈6,1 МБ JavaScript (≈1,9 МБ стисненого) — 79 % усього коду, і в ньому бібліотеки читання PDF і Excel (≈2 МБ сирця), потрібні лише для імпорту бланка погодження, а також тестові дані, з якими при кожному старті ганяється розрахунок геометрії.
  7. Нові папки (CAD, ядро, Стоуник, BUILDING) написані чистіше за старі: 0 помилок tsc у них; 416 із 418 помилок — у папках, що були ще 02.09 (з них 327 — у components, тобто в 2D/3D-редакторах), 2 — у features [ІТ].

1. Що вшито в Студію — статична карта

1.1 Як стартує сторінка

index.html → main.tsx → App.tsx. Усе, що досяжне від main.tsx статичними імпортами, вантажиться і виконується (код верхнього рівня модулів) при кожному відкритті, незалежно від режиму і вкладки. React.lazy/import() — лише за дією.

Що main.tsx робить до першого рендера [ФАКТ ◔]:

1.2 Таблиця «папка → у стартовому наборі? → щось робить без дотику?»

«Старт» — досяжно статично від main.tsx (підтверджено складом стартових чанків збірки); «ліниво» — лише через React.lazy/import()/воркер. Числа — файлів коду (без тестів) / рядків.

Папка Код (тести) У стартовому наборі Лише ліниво Мертве / лише тести Щось робить без дотику? [ФАКТ ◔]
components/ui 70 / 26 570 (11) 69 / 26 391 — уся — useCostPrices.ts LanguageDomTranslator — спостерігач за всім DOM; Detail3DPreview тягне GlProbe (патч)
engines 41 / 16 779 (61) 29 / 14 299 11 / 2 466 (combicut/*, arExport, grouping3d, partsGlb …) sketchupExport.ts mesPack.ts:40 таблиця CRC (дрібниця)
domain 48 / 12 607 (42) 46 / 11 413 1 / 10 — (типи — types.ts) ні (лише константи)
constructor (CAD) 57 / 14 110 (11) 14 / 3 134: drawing/* 9 файлів 2 474 р., docs/DrawingSetView, store.ts, plywood/plywoodRules, ui.tsx, measure/i18n.measure 42 / 10 910 — 8 вкладок і їхні модулі — store.ts створює zustand-стор при імпорті (і у воркері OCCT)
kernel (ядро OCCT) 37 / 6 627 (31) 32 / 6 001, вкл. occt/occtBuilder.ts 1 628 2 / 210 (geometry.worker, exactPartsCore) useKernelGeometry.ts так: реєстрація в main.tsx:46, :48; KernelBadge — інтервал 700 мс; WASM 50 МБ — лише за першою потребою
utils 20 / 8 682 (13) 19 / 8 504 — slabTexture.ts approvalImport.ts:8 ставить workerSrc pdf.js; :563 читає window.location
components/forms 20 / 4 264 (7) 20 / 4 264 — — RectangleDesigner.tsx:14 — console.log при імпорті
store 16 / 3 166 (15) 16 / 3 166 — — так: persistence.ts:10 слухач beforeunload, :21 BroadcastChannel; useStore.ts:396 підписка; zustand-persist читає localStorage
components/3d 14 / 4 503 (3) 7 / 1 592 (ProductElement3DNode 983, SceneLighting, GlProbe, DetailEditor3D, kernelSeam …) 6 / 2 812 (Viewer3D 2 102 — «3D Підбір» …) SafeEnvironment.tsx так: GlProbe.tsx:26–35 патчить HTMLCanvasElement.prototype.getContext
(корінь src) 7 / 3 841 5 / 3 575 (main, App, i18n*) — arGen.ts, buildFotozona.ts i18n.ts:207–212 будує зворотний словник (~1 900 × 3)
components/2d 17 / 3 470 (1) 16 / 3 266 — PlacementPropertiesPanel.tsx SlabBoard.tsx:101 просить у ядра контури (при рендері дошки з деталями, що мають дуги)
stounik (помічник) 16 / 2 236 (8) 16 / 2 236 — увесь, змонтований завжди (HeaderToolbar) — — так: слухачі pointerdown/up/keydown на window (Stounik.tsx:69–77); перевірка всього проєкту через 1,5 с після кожної зміни (useStounik.ts:78–84); тексти 135 КБ у старті
mes (симуляція цеху) 7 / 2 997 (1) 0 0 увесь: MesTab, render — мертві; sim, data/* — лише тести ні (не підключений)
workspaces/architecture (BUILDING) 11 / 1 565 (1) 6 / 606 (ArchitectureSidebar, AddLayoutWorkspace, LayoutControls, LayoutPreview, store, useArchitecture) 4 / 950 (PlanEditor, LayoutEditor, BoqPanel, arc) index.tsx store.ts — zustand-стор при імпорті
workspaces/constructor, workspaces/vs3d 2 / 16 0 0 обидва index.tsx мертві —
shell 4 / 249 (3) 1 / 70 (adminLogin.ts — вхід адміна) — workspaces.ts, useCan.ts мертві; capabilities.ts — лише тести ні
lib [ІТ] 7 / 939 (2) 6 / 876 1 / 63 (loadWithProgress) — ні
components/room 3 / 915 3 / 915 — — ні
parsers 5 / 637 (1) 5 / 637 — — ні
stand 2 / 637 0 (окрема сторінка stand.html, але йде в бойову збірку: vite.config.ts input.stand) — — —
components/studio, components/mobile, components/auth [ІТ], components/assembly, components/ (2 файли), hooks 12 / 1 620 усі — — AuthContext.tsx:56 запускає синхронізацію налаштувань: зараз + кожні 10 хв + при поверненні у вкладку (store/settingsSync.ts:162–169) [сторона ІТ]
features/* [ІТ] 12 / 482 (5) 11 / 442 (реєстр, сервер-проєкт, object-link, OrderFolderSave) 1 / 40 (CadReleaseActions) — captureObjectId у main.tsx:45
workers 1 / 44 0 (окремий воркер розкрою) 1 / 44 — —
core 2 / 313 0 0 обидва мертві —

Підсумок по коду (431 модуль, 117 217 рядків) [ФАКТ ✔]: стартовий набір — 333 модулі / 93 007 рядків (79 %); лише ліниво — 69 / 17 505 (15 %); стенд — 3 / 720; лише типи — 3 / 1 529; лише тести — 6 / 2 634; мертві — 17 / 1 822.

1.3 Містки, якими CAD і ядро потрапили в старт [ФАКТ ✔ — граф + склад чанків]

# Ланцюг статичних імпортів Що тягне в старт
1 App.tsx:34 → components/WorkspacePane.tsx:5 → components/2d/SlabBoard.tsx:33 → components/2d/board/DxfExportDialog.tsx:5–10 → kernel/shopSheets.ts:33–37 + constructor/docs/DrawingSetView.tsx креслярку CAD: constructor/drawing/{set 892, exploded 446, sheetsExtra 316, geom 229, render 213, sections 210, style 120, layoutSections 34, index 14}, DrawingSetView 208, kernel/{exportCutDxf, dxfWriter, dxfGeometry}, jspdf
2 kernel/shopSheets.ts:42 (бере лише expandRing) → kernel/occt/outline2D.ts:18 (import { buildShape, cut } from './occtBuilder') kernel/occt/occtBuilder.ts 1 628 р. — хоча kernel/occt/index.ts:16–57 навмисно вантажить його через import(). Лінивість зламана одним рядком. Сам WASM — ні, він лише через loadOcct()
3 main.tsx:21 → kernel/productKernel.ts:35 → kernel/modelFromDraft.ts → kernel/plywoodFromDraft.ts:26, :28 constructor/plywood/plywoodRules.ts, constructor/store.ts (zustand-стор CAD — заради константи PLYWOOD_DEFAULTS); те саме потрапляє у воркер OCCT
4 main.tsx:22 → kernel/cutOutlines.ts:23 → kernel/exactParts.ts:5 → kernel/occt/workerClient.ts клієнт воркера OCCT (воркер стартує при першому запиті)
5 App.tsx:39 → workspaces/architecture/ArchitectureSidebar.tsx:15 → constructor/ui.tsx; App.tsx:40 → AddLayoutWorkspace панелі BUILDING і кнопки CAD
6 App.tsx:17 → AppStatusBar.tsx:2 → i18n.ts:2 → i18nStatic.ts:16 → constructor/measure/i18n.measure.ts словник CAD-заміру всередині головного словника
7 App.tsx:34 → WorkspacePane.tsx:9 → EstimatePanel.tsx:6–7 → engines/mesPack.ts (707 р.), engines/apsExport.ts, engines/assemblyPlan.ts вивантаження для МЕС/APS — у старті, хоча вкладка МЕС мертва

Шапка WorkspacePane.tsx прямо обіцяє: «Ліниві — код конструктора не вантажиться, доки менеджер працює у VS3D» — для вкладок це правда, але містки 1–3, 5–6 тягнуть шматки CAD повз неї.

1.4 Що в бойовій збірці [ФАКТ ✔ — vite build --sourcemap у probe-L3, 11 с]

1.5 «Робить без дотику» — що вмикається само [ФАКТ ◔]

Що Де Коли Примітка
Інтервал 700 мс — перемальовує плашку ядра kernel/KernelBadge.tsx:12 завжди, з першої секунди у Studio плашка hidden (:31), але змонтована й тікає
Патч HTMLCanvasElement.prototype.getContext (лічильник WebGL-контекстів) components/3d/GlProbe.tsx:26–35 при імпорті модуля = на старті діє на всі канви, і 2D (pdf, html2canvas); сам зонд «мовчить, поки не ввімкнений» — але патч ставиться завжди
MutationObserver на весь document.body (subtree, текст, атрибути) components/ui/LanguageDomTranslator.tsx:103–118, змонтований у App.tsx:295, :320 завжди, і для української (раннього виходу нема) кожна зміна DOM → обхід вузлів у наступному кадрі
Слухач beforeunload + BroadcastChannel('slabcutplanner-sync') store/persistence.ts:10, :21 при імпорті
Підписка на підсвітку послуг (канал між вкладками) store/useStore.ts:396 при імпорті
Реєстрація ядра й провайдера контурів різу main.tsx:46, :48 старт, усі режими далі див. 1.6
Розрахунок геометрії тестових деталей engines/__tests__/mockData.ts:103 через main.tsx:14 старт у бойовій збірці
Перевірки Стоуника по всьому проєкту stounik/useStounik.ts:78–84 (CHECK_DELAY_MS = 1500, :21) через 1,5 с після кожної зміни проєкту/партів + глобальні слухачі Stounik.tsx:69–77
Синхронізація спільних налаштувань store/settingsSync.ts:162–169 через AuthContext.tsx:56 після входу + кожні 10 хв + при поверненні у вкладку [сторона ІТ]
Перехоплення console.error/warn + глобальні error/unhandledrejection utils/blackbox.ts:25–58 через App.tsx:209 після першого рендера для баг-репорту; так задумано

1.6 Ядро OCCT у Studio-режимі: чи «спить»? [ФАКТ ◔], живий замір — L7


2. Невикористане (мертве)

2.1 Мертві файли — 17 ts/tsx, 1 822 рядки [ФАКТ ✔ — knip + граф, повний збіг]

Старі (з реєстру 02.09, усі на місці): core/geometry.ts 98, core/snapping.ts 215, components/2d/PlacementPropertiesPanel.tsx 204, components/ui/useCostPrices.ts 179, utils/slabTexture.ts 178, engines/sketchupExport.ts 14, arGen.ts 123, buildFotozona.ts 143 (у корені vs-cad нема ar-gen.html/fotozona.html — тепер у них не лишилось навіть dev-входу). Нові: mes/MesTab.tsx 304, mes/render.ts 199, components/3d/SafeEnvironment.tsx 47, kernel/useKernelGeometry.ts 54, shell/workspaces.ts 23, shell/useCan.ts 16, workspaces/{architecture,constructor,vs3d}/index.tsx 25. Плюс App.css 184 (не ts). Лише тести — 6 файлів / 2 634 р.: mes/sim.ts, mes/data/{codeArea 1 304, orders 922, shopMap 103, norms 79}, shell/capabilities.ts 140.

2.2 Мертве в живих файлах [ФАКТ ✔ — tsc/knip/grep]

2.3 Нерозв'язані імпорти — 8 (02.09: 9) [ФАКТ ✔]

store/useDictionaryStore ×6 (CornerContextMenu.tsx:3, JointContextMenu.tsx:3, CornerProcessingModal.tsx:7, CutoutProcessingModal.tsx:8, forms/shapes/RectangleDesigner.tsx:4, LDesigner.tsx:2); ../../../domain/types ×2 (LegModal.tsx:3, SkirtingModal.tsx:3). Закрито один: DimensionsTable.tsx. Збірка проходить (це import type).

2.4 Залежності [ФАКТ ✔ — knip + grep]

Ті самі 6+3, що 02.09: konva, react-konva, clsx, tailwind-merge, @tesseract.js-data/eng, @types/uuid; dev — autoprefixer, postcss, puppeteer (0 імпортів у src/server/tools). OCR шукає мову в /tesseract (utils/approvalImport.ts:563) — у public/ такої теки нема (як і 02.09).


3. Важкі файли

3.1 Загальні числа [ФАКТ ✔ — wc -l]

02.09 13.10
src/ усього 343 файли / 88 543 р. 666 / 146 898
ts/tsx без тестів 227 / 72 218 431 / 117 217
тестові ts/tsx 103 218 (26 917 р.)
файлів ≥ 3 000 р. / 2 000–3 000 / 1 000–2 000 / 500–1 000 — 2 / 6 / 9 / 37
функцій > 1 000 р. / > 500 / > 300 3 компоненти > 1 000 + замикання geometry 7 / 16 / 46

3.2 Топ-25 за рядками (без тестів) [ФАКТ ✔]

Склад: декларацій верхнього рівня / компонентів / іменованих функцій усіх рівнів. «Де»: старт / ліниво / лише тести / лише типи.

# Файл 13.10 02.09 Δ КБ Склад Найдовша функція (рядки, довжина) tsc Де
1 utils/approvalImport.ts 4 805 4 805 0 197 155/0/169 parseApprovalText 3658–3981 (324) 15 старт
2 components/ui/Detail3DPreview.tsx 3 530 2 914 +616 183 27/14/42 Detail3DNode 821–1866 (1 046) 41 старт
3 components/ui/ProductEditorWorkspace.tsx 2 974 2 558 +416 181 7/2/42 ProductEditorWorkspace 677–2974 (2 298) 38 старт
4 engines/geometry.ts 2 613 2 754 −141 138 4/0/98 createGeometryEngine 16–2585 (2 570) 4 старт + воркер OCCT
5 components/ui/FormsPanel.tsx 2 392 2 346 +46 120 11/3/74 FormsPanel 166–2358 (2 193) 20 старт
6 components/3d/Viewer3D.tsx 2 102 1 974 +128 102 11/9/31 Viewer3D 1648–2102 (455) 43 ліниво
7 i18nStatic.ts 2 095 1 993 +102 244 1 словник — (1 866 записів) 1 старт + 2 воркери
8 engines/packing.ts 2 042 2 029 +13 85 123/0/110 tryPlaceFullTextureGroup 1322–1415 (94) 5 старт + воркер
9 components/2d/SlabBoard.tsx 1 642 1 556 +86 89 2/1/19 SlabBoard 55–1642 (1 588) 70 старт
10 kernel/occt/occtBuilder.ts 1 628 — нов. 88 87/0/87 buildAssemblyShapes 1237–1333 (97) 0 старт + воркер
11 utils/export/quotePdf.ts 1 363 1 264 +99 76 48/0/43 renderApprovalBodies 923–1268 (346) 0 старт
12 mes/data/codeArea.ts 1 304 — нов. 30 дані — 0 лише тести
13 components/ui/QuotePanel.tsx 1 269 1 136 +133 73 8/5/16 QuotePanel 145–1219 (1 075) 2 старт
14 engines/edgeCutters.ts 1 191 1 090 +101 60 46/0/41 buildEdgeCutters 879–1188 (310) 0 старт
15 domain/types.ts 1 184 1 047 +137 59 59 типів — 0 лише типи
16 components/ui/HelpDialog.tsx 1 154 535 +619 109 4/3/3 HelpDialog 43–1154 (1 112, текст) 0 старт
17 components/ui/SlabCatalogModal.tsx 1 123 934 +189 68 17/4/11 SlabCatalogModal 256–1123 (868) 0 старт
18 components/3d/ProductElement3DNode.tsx 983 784 +199 51 5/2/13 ProductElement3DNode 232–983 (752) 1 старт
19 mes/data/orders.ts 922 — нов. 26 дані — 0 лише тести
20 components/ui/Detail2DBlueprint.tsx 917 390 +527 50 6/3/7 Detail2DBlueprint 149–917 (769) 8 старт
21 constructor/measure/MeasureTab.tsx 915 — нов. 72 11/6/31 MeasureTab 52–529 (478) 0 ліниво
22 constructor/drawing/set.ts 892 — нов. 70 38/0/44 drawHoles 294–426 (133) 0 старт (місток 1)
23 constructor/measure/leicaDxf.ts 881 — нов. 46 47/0/40 parseEntities 270–431 (162) 0 ліниво
24 App.tsx 875 804 +71 49 2/1/12 App 51–873 (823) 12 старт
25 domain/plywood.ts 835 — нов. 52 68/0/54 layoutPlywood 474–744 (271) 0 старт

Поза топом, але виросли найсильніше: domain/joints.ts 318 → 805 (+487), engines/miterAssembly.ts 242 → 672 (+430), styles/mobile.css 636 → 900, ElementSettingsModal.tsx 294 → 553, lib/api.ts 417 → 540 [ІТ]. Зменшились: engines/shapeBuilder.ts 786 → 633, engines/geometry.ts 2 754 → 2 613, components/2d/board/BoardOverlays.tsx 335 → 219.

3.3 Вісім файлів, названих у 02.09 — що з ними [ФАКТ ✔]

approvalImport 4 805 → 4 805 (і розмір той самий до байта — 201 730 Б, як 02.09; 0 прямих тестів) · Detail3DPreview 2 914 → 3 530 · geometry 2 754 → 2 613 (explodeDetails 614 → 424 рядки) · ProductEditorWorkspace 2 558 → 2 974 · FormsPanel 2 346 → 2 392 · packing 2 029 → 2 042 · Viewer3D 1 974 → 2 102 · SlabBoard 1 556 → 1 642 (tsc — ті самі 70). Чотири UI-гіганти (SlabBoard, Viewer3D, ProductEditorWorkspace, Detail3DPreview) дають 192 із 418 помилок tsc (46 %, як і 02.09).

3.4 Функції-гіганти (> 1 000 рядків) [ФАКТ ✔ — AST]

createGeometryEngine 2 570 (engines/geometry.ts:16), ProductEditorWorkspace 2 298, FormsPanel 2 193, SlabBoard 1 588, HelpDialog 1 112 (текст), QuotePanel 1 075, Detail3DNode 1 046. Наступні: SlabCatalogModal 868, App 823, Detail2DBlueprint 769, ProductElement3DNode 752. Найбільша в CAD — PlywoodTab 590; у ядрі — attachmentsFromPlan 365.

3.5 Файли-дані (за байтами) [ФАКТ ✔]

domain/edgeProfileDrawings.ts 440 КБ (56 inline-SVG, 117 р.) — старт · i18nStatic.ts 250 КБ (1 866 записів, 02.09 — 1 769) — старт + 2 воркери; дубль ключа :2023 (TS1117) · components/ui/HelpDialog.tsx 112 КБ тексту в JSX — старт · stounik/topics.ts 99 КБ і stounik/leoTopics.ts 37 КБ — старт · domain/edgeProfileImages.ts 81 КБ base64 — старт · domain/viyarServiceCatalog.ts 41 КБ · domain/edgeProfileClasses.ts 28 КБ · mes/data/codeArea.ts 31 КБ і orders.ts 26 КБ — лише тести. Разом тексту/даних у стартовому наборі ≈1,1 МБ сирця.


4. Хардкод (фіксація, без оцінки; тести виключено)

Що 02.09 13.10 Адреси / приклади
мм-літерали в components/**/*.tsx (той самий шаблон) 299 364 Detail3DPreview 68, Viewer3D 33, ProductElement3DNode 23, HelpDialog 22, ProductEditorWorkspace 17; поза components — ще 172 у нових tsx (MeasureTab 19, stand/main 17, AssemblyTab 11). Дефолти в модалках без змін: LegModal.tsx:23, SkirtingModal.tsx:20, WallPanelModal.tsx:27, :31, ListsPanel.tsx:31, :51, JointOffsetPopup.tsx:38, Detail3DPreview.tsx:2059, :2612, canvasUtils.ts:255. Прибрано — Detail2DBlueprint
матеріали літералами поза domain/ 13 15 (+5 у словнику) 'Акриловий камінь' у QuotePanel.tsx:458, quoteCalc.ts:352, :384, quotePdf.ts:232 проти 'Акрил' у домені — без змін; нові 'Кварцит' у constructor/docs/DocsTab.tsx:157, :159, constructor/drawing/sampleOrder.ts:57, :67, :101
абсолютні URL у src 0 13 у 7 файлах domain/slabCatalog.ts:247, engines/apsExport.ts:26 (localhost), features/cad-release/CadReleaseActions.tsx:24, :31 і RegistryDesk.tsx:74 (PLM), OrderFolderSave.tsx:12 (МЕС), stounik/StoneRadio.tsx:29–34 (6 інтернет-радіо), stounik/leoTopics.ts:146
префікси ключів сховищ браузера 4 9+ slab_cut_planner_*, slabcutplanner-*/slabcutplanner.*, vs3d.*, slabcut_*, m-*, stounik-*, vss-*, registry-revision:*, plm-project-handoff (токен передачі з PLM у sessionStorage — features/server-project/transport.ts:18–22, [ІТ]); дубль літерала ErrorBoundary.tsx:81 — без змін
PIN/паролі (лише місця) PIN літералом логін+пароль сіль і PBKDF2-відбиток — shell/adminLogin.ts:28–32 (у бандлі; шапка: «замок інтерфейсу, а не захист сервера»); старий PIN — store/useSettingsStore.ts:44 (мертвий стан) і в ключових словах довідки Стоуника stounik/topics.ts:464
as any / : any 53 / 86 52 / 87 domain/elementToDetail.ts 17, approvalImport.ts 9, Viewer3D.tsx 8; ProductElement3DNode.tsx 19 : any
@ts-ignore / @ts-expect-error / @ts-nocheck 0 0 —
eslint-disable 12 44 у 24 файлах нові — constructor/* (DocsTab 4, PlywoodTab 4, AssemblyTab 2, MeasureTab 2, MetalTab 2), Detail3DPreview 5, GlProbe 2; 7 директив eslint називає зайвими
console.log / warn / error / info 3 / 19 / 35 / — 1 / 21 / 38 / 3 console.log лише RectangleDesigner.tsx:14; два DEBUG-блоки geometry.ts прибрано (але їхні рядки лишились у словнику i18nStatic.ts:1757–1758)
«ТИМЧАСОВО» / TODO латиницею 5 / 0 3 (+1 текст помилки) / 0 engines/geometry.ts:1469 (отвір зливу), EdgeProfilesPanel.tsx:65, edgeTreatment.ts:6
персональні дані клієнтів у коді (лише місця) — 5 замовлень mes/data/orders.ts:17, :179, :376, :566, :742 — поле customer з прізвищами і номери замовлень реальних кейсів (шапка :2: «ЖИВІ ЗАМОВЛЕННЯ — заявки 1С п'яти кейсів обучалочки»); файл лише для тестів, але лежить у коді, що їде в GitLab; правило пам'яті Лео §2.3 — «персональні дані клієнтів — не в публічний репозиторій»
дві межі NC300 1 живий + 1 мертвий обидві живі domain/materialRules.ts:52 3000×1600 (тепер через Стоуника) ↔ domain/manufacturability.ts:29 3100×1500

Окремо: features/* написані «стисненим» стилем (середня довжина рядка 87–121 символ, рядки до 523 символів, без шапок — RegistryDesk.tsx, client.ts, CadReleaseActions.tsx) — [сторона ІТ], лише фіксація.


5. Задвоєння

Метрика 02.09 13.10
Імена функцій, визначені в ≥2 файлах (усі рівні вкладеності) 116 245
… з ідентичним тілом 42 77 (79 кластерів)
те саме лише для верхнього рівня — 100 / 48
point-in-polygon (за назвою) 7 11 у 9 файлах (нові: domain/plywood.ts:215, constructor/drawing/geom.ts:200, constructor/combicut/CombiCutTab.tsx:520)
площа полігона (той самий цикл shoelace) 5+ 15 в 11 файлах (нові — у plywood, plywoodElements, architecture, drawing/geom, combicut/plan, occtBuilder, outline2D)
округлення round*/r1/fmtMm 10 23 у 21 файлі; round3 ідентичний у 4 файлах (metalTemplates.ts:140, apsExport.ts:58, mesPack.ts:169, quoteCalc.ts:108)
поворот точки/вектора 5 10 у 9
межі полігона (polygonBounds/bbox/bounds) 4 19 у 18
механізми ZIP 2 3 (utils/export/zipArchive.ts, engines/mesPack.ts:40–122, jszip)
блочний копіпаст (jscpd ≥15 р.) не міряли 22 клони, 537 р. — 0,54 %

[ФАКТ ✔ — AST-скрипт dups.cjs, jscpd]. Метод 02.09 описаний лише словами — порівняння орієнтовне. Головне: 28 із 79 ідентичних кластерів — це пари з мертвою папкою core/ (core/geometry.ts ↔ lib/project.ts — 11, core/snapping.ts ↔ components/2d/canvasUtils.ts — 17); далі текстури (textureLayout ↔ pdfGeometry ↔ packing ↔ TextureLayoutPanel, 12), approvalCanvasUtils ↔ approvalSplit (8), модалки-близнюки (EdgeAdditionModal ↔ LegModal 71 р. за jscpd). Нові папки додали свої копії геометрії (точка в полігоні, площа, bbox) замість спільних engines/geometryUtils.ts/utils/math.ts. Повний перелік — реєстр §5.


6. tsc і eslint

6.1 tsc — 418 (02.09: 430) [ФАКТ ✔ — gates/tsc.txt]

6.2 eslint — 609 повідомлень: 564 помилки, 45 попереджень (02.09: 482 / 27) [ФАКТ ✔ — gates/eslint.json, 653 файли]

Правила: no-unused-vars 202 · no-explicit-any 177 · react-refresh/only-export-components 53 · exhaustive-deps 38 · set-state-in-effect 33 · react-hooks/refs 22 · rules-of-hooks 19 (02.09: 15) · prefer-const 15 · no-useless-assignment 11 · 7 зайвих eslint-disable. Порушення порядку хуків: ProductEditorWorkspace.tsx:848, :852, :854, :881, :1013, :1092, :1098 (умовні useMemo/useCallback — у React це може зламати стан компонента), TextureLayoutPanel.tsx:432, Viewer3D.tsx:804, :838 (мертвий блок), utils/export/quotePdf.ts ×9 (функції use… поза компонентами). За папками: components 355 · utils 69 · constructor 35 · engines 33 · store 30 · stounik 27 · domain 26 · (корінь) 16 · stand 9 · kernel 3 · features 3 · workspaces 3.


7. Тести [ФАКТ ✔ — gates/vitest.txt, vitest.done: exit=1 за 408 с]


8. Дві копії [ФАКТ процесу — з брифу; на диску не перевіряв]


Стан знахідок 02.09 у цій лінзі

Знахідка 02.09 Стан 13.10 Адреса / доказ
Мертвий core/geometry.ts (99) відкрито 98 р.; knip ✔
Мертвий core/snapping.ts (216) відкрито 215 р.; knip ✔
Мертвий domain/materialRules.ts (лише тест) змінилось — частково ожив stounik/checks.ts:23 (2 функції); 11 експортів досі без споживачів; NC300 розходиться з manufacturability.ts:29
Мертвий PlacementPropertiesPanel.tsx відкрито 204 р.; knip ✔
Мертвий useCostPrices.ts відкрито 179 р.; knip ✔
Мертвий utils/slabTexture.ts відкрито 178 р.; knip ✔
Порожній engines/sketchupExport.ts відкрито 14 р.
arGen.ts / buildFotozona.ts — dev-входи змінилось — входів (ar-gen.html, fotozona.html) у vs-cad нема; тепер просто мертві knip ✔
Viewer3D AssemblyGroup/TexturedPart/EdgePartWrapper (726 р.) + groups відкрито (733 р.) Viewer3D.tsx:664–1396, :1778
Detail3DPreview ProfileMesh, useDetailGeometry, гілка бортика відкрито :79–100, :3526–3530, :1730/:1844
packing groupedParts, nearbyElementReliefPlacements відкрито packing.ts:543, :1130
geometry scalePoints закрито grep — нема
geometry jointNotices (лише запис) відкрито geometry.ts:1659
[CORNER-DEBUG]/[CUTOUT-DEBUG] + console.log у geometry.ts закрито (рядки лишились у словнику i18nStatic.ts:1757–1758) grep ✔
console.log у RectangleDesigner.tsx:14 відкрито grep ✔
«ОТВІР ПІД ВСТАВКУ ЗЛИВУ — ТИМЧАСОВО ВИМКНЕНИЙ» відкрито geometry.ts:1469
9 TS2307 (useDictionaryStore ×6, ../../../domain/types ×3) змінилось: 8 (закрито DimensionsTable) gates/tsc.txt
Невикористані залежності 6+3 (konva, react-konva, clsx, tailwind-merge…) відкрито, ті самі knip ✔
engines/__tests__/mockData.ts — тестові дані без споживача змінилось на гірше: імпортується з main.tsx:14, виконується в бойовій збірці mockData.ts:103; dist/main-*.js ✔
141 невикористаний експорт / 58 типів зросло: 311 / 115 knip ✔
22 невикористані експорти textureLayout.ts (споживачі мають копії) відкрито, ті самі 22 knip ✔
12 невикористаних approvalCanvasUtils.ts, 5 ідентичних з approvalSplit.ts відкрито (ідентичних — 8) knip, dups ✔
[LEGACY] поля Detail.skirtings/wallPanels/legs відкрито domain/types.ts:69
Кнопка «Групувати деталі» без ефекту відкрито Viewer3D.tsx:1840–1843
Project.assembly.connections — пишуть, не читають відкрито AssemblyConnectionsPanel.tsx:15, :42
Важкі: approvalImport 4 805 без змін (той самий розмір) wc ✔
Detail3DPreview 2 914 / ProductEditorWorkspace 2 558 / FormsPanel 2 346 / Viewer3D 1 974 / SlabBoard 1 556 зросли: 3 530 / 2 974 / 2 392 / 2 102 / 1 642 wc ✔
geometry 2 754 / packing 2 029 2 613 (−141) / 2 042 wc ✔
Файли-дані: drawings 440 КБ, i18nStatic 239 КБ, images 81 КБ 440 / 250 / 81 КБ; додались тексти Стоуника 135 КБ і довідка 112 КБ wc ✔
299 рядків мм-літералів у tsx зросло: 364 (+172 поза components) скрипт ✔
13 літералів матеріалів поза domain/ 15 (2 прибрано, 4 нові в CAD) скрипт ✔
URL у src — 0 змінилось: 13 у 7 файлах grep ✔
4 префікси ключів сховищ, дубль у ErrorBoundary.tsx:81 зросло: 9+; дубль на місці grep ✔
PIN адміна за замовчуванням літералом у коді змінилось: вхід логін+пароль (№263); старий PIN — мертвий стан + у ключових словах Стоуника adminLogin.ts:28–32, useSettingsStore.ts:44, topics.ts:464
as any 53 / @ts-ignore 0 / eslint-disable 12 52 / 0 / 44 скрипт ✔
116 однойменних / 42 ідентичних функцій зросло: 245 / 77 dups.cjs ✔
7 point-in-polygon, 5 shoelace, 10 округлень, 5 rotatePoint, 4 polygonBounds, 2 ZIP зросло: 11 / 15 / 23 / 10 / 19 / 3 AST ✔
Три рушії грошей змінилось: два (pricing.ts видалено 03.09) —
tsc 430 (4 UI-файли — 46 %) 418 (ті самі 4 файли — 46 %) gates/tsc.txt
eslint 482 / 27, rules-of-hooks 15 зросло: 564 / 45, rules-of-hooks 19 gates/eslint.json
vitest 1 203 ✓ / 1 ✗ (parser.test.ts) 1 856 ✓ / 2 ✗ (+ coreBoundary) gates/vitest.txt
137 із 227 модулів без прямого тесту 236 із 431 граф ✔
eng.traineddata / OCR шукає /tesseract OCR — відкрито (approvalImport.ts:563; теки нема); eng.traineddata у корені vs-cad нема ls ✔
Невикористані ключі i18n.ts messages (гіпотеза) не перевірено —

Ключові знахідки

  1. [ФАКТ ✔] Код майже подвоївся за 41 день, а мертве не прибирали. src: 343 → 666 файлів, 88 543 → 146 898 рядків; код без тестів 227 → 431 модуль, 72 218 → 117 217 рядків. З реєстру мертвого 02.09 не видалено жодного файла; мертвих тепер 17 (1 822 р.) + 6 лише-тестових (2 634 р.). Адреси — §2.1, реєстр §1.
  2. [ФАКТ ✔] CAD і ядро OCCT частково вшиті в стартовий набір Студії. Вкладки CAD (42 файли, 10 910 р.) і план/розкладка BUILDING (950 р.) — ліниві. Але 14 файлів constructor/ (3 134 р., креслярка) і 32 файли kernel/ (6 001 р., з occtBuilder.ts 1 628) досяжні статично: SlabBoard.tsx:33 → DxfExportDialog.tsx:5–10; kernel/occt/outline2D.ts:18 (ламає задумане ліниве kernel/occt/index.ts:16); main.tsx:21 → kernel/plywoodFromDraft.ts:28 → constructor/store.ts; App.tsx:39 → constructor/ui.tsx; i18nStatic.ts:16. §1.3.
  3. [ФАКТ ◔] Ядро OCCT у Studio-режимі не «спить». main.tsx:46, :48 реєструє ядро і провайдер контурів різу для всіх режимів; ядро за замовчуванням occt (kernel/config.ts:15–21); SlabBoard.tsx:101 і packingSlice.ts:100 просять у воркера OCCT контури партів із дугами (exactPartInput.ts:10–34) → перше відкриття дошки з такою деталлю вантажить WASM 50 МБ (14 МБ gzip). Коментар packingSlice.ts:95 «без провайдера (Studio)» застарів. Ціну в секундах міряє L7. §1.6.
  4. [ФАКТ ✔] Стартовий набір — 9 чанків, 6,1 МБ JS (≈1,9 МБ gzip), 79 % усього коду. У ньому pdfjs-dist (1,03 МБ сирця) і xlsx (0,90 МБ) — лише через utils/approvalImport.ts:2–3 (імпорт бланка), html2canvas (баг-репорт), тексти довідки й Стоуника (≈250 КБ), креслення профілів (440 КБ). Словник i18nStatic.ts (250 КБ) лежить тричі: старт + обидва воркери. §1.4.
  5. [ФАКТ ✔] Тестові дані в бойовій збірці: main.tsx:14 статично імпортує engines/__tests__/mockData.ts, і explodeDetails(mock…) (mockData.ts:103) рахується при кожному старті сторінки (знайдено в dist/assets/main-*.js).
  6. [ФАКТ ◔] Що працює без дотику: інтервал 700 мс KernelBadge.tsx:12 (і в Studio, де плашка схована); патч HTMLCanvasElement.prototype.getContext при імпорті GlProbe.tsx:26–35; MutationObserver на весь body, і для української, LanguageDomTranslator.tsx:103–118; beforeunload + BroadcastChannel при імпорті persistence.ts:10, :21; перевірки Стоуника по всьому проєкту через 1,5 с після кожної зміни useStounik.ts:78–84; опитування налаштувань кожні 10 хв settingsSync.ts:168 [ІТ]. §1.5.
  7. [ФАКТ ✔] МЕС у застосунок не підключений: mes/MesTab.tsx (304 р.) без імпортерів, mes/render.ts — лише з нього, mes/sim.ts і mes/data/* (2 494 р.) — лише тести. Задуманий поділ на робочі простори (shell/workspaces.ts, shell/useCan.ts, workspaces/*/index.tsx) теж не підключений; App.tsx:1–45 імпортує все статично. При цьому вивантаження для МЕС (engines/mesPack.ts, 707 р.) — у старті через EstimatePanel.tsx:7.
  8. [ФАКТ ✔] Великі файли виросли: Detail3DPreview.tsx 2 914 → 3 530 (Detail3DNode 798 → 1 046 р.), ProductEditorWorkspace.tsx 2 558 → 2 974 (компонент 1 990 → 2 298 р.), HelpDialog.tsx 535 → 1 154, Detail2DBlueprint.tsx 390 → 917, domain/joints.ts 318 → 805, miterAssembly.ts 242 → 672; approvalImport.ts 4 805 — не змінювався. 7 функцій > 1 000 рядків, 16 > 500. §3.
  9. [ФАКТ ✔] Межа «ядро не знає UI» порушена й сторож червоний: coreBoundary.test.ts падає на engines/shapeBuilder.ts:2 (фікс 03.09 втрачено). Сторож не дивиться в kernel/, а звідти 18 імпортів у components/, constructor/, store/ (12 — не лише типи): exactPartInput.ts:5 і plywoodFromDraft.ts:28 — у воркер OCCT потрапляють draftHelpers і zustand-стор CAD constructor/store.ts. §7.
  10. [ФАКТ ✔] Мертве в живих файлах не прибрано: Viewer3D.tsx:664–1396 (733 р.) з неіснуючим useDetailShape :731; groups :1778 і кнопка «Групувати деталі» без ефекту; Detail3DPreview.tsx:79, :3526, :1730/:1844; packing.ts:543, :1130, :106; мертвий стан PIN useSettingsStore.ts:44; 8 нерозв'язаних імпортів (TS2307); ті самі 6+3 зайві npm-пакети. §2.
  11. [ФАКТ ✔] Задвоєння росте разом із кодом: однойменних функцій 116 → 245, ідентичних 42 → 77; точка в полігоні 7 → 11, площа 5+ → 15, округлення 10 → 23, межі полігона 4 → 19, ZIP 2 → 3 (engines/mesPack.ts:40–122). Блочний копіпаст малий (jscpd 0,54 %). 28 ідентичних кластерів — з мертвою core/. §5.
  12. [ФАКТ ✔] Старий борг стоїть, новий код чистіший; хардкод розповзається: tsc 430 → 418, з них 416 — у папках, що були 02.09 (components 327), нові constructor/kernel/stounik/workspaces/mes/shell/stand — 0; eslint 509 → 609 (rules-of-hooks 15 → 19, 7 — умовні хуки в ProductEditorWorkspace.tsx:848–1098); FormsPanel.tsx:1746 — невизначене slab. URL у src 0 → 13 (PLM/МЕС/радіо), префіксів ключів сховищ 4 → 9+, старий PIN у ключових словах довідки stounik/topics.ts:464, прізвища клієнтів реальних кейсів у mes/data/orders.ts (5 замовлень). §4, §6.

Питання власнику

  1. [ПИТАННЯ] Studio-збірка має працювати на ядрі OCCT (точні контури деталей із дугами на 2D-дошці, розкрій через воркер, 50 МБ при першому відкритті такого проєкту), чи це лише для VS CAD? Сьогодні один перемикач — змінна збірки VITE_KERNEL (kernel/config.ts:15–21); за замовчуванням ядро ввімкнене всюди, а реєстрація в main.tsx:46, :48 не залежить від режиму.
  2. [ПИТАННЯ] CAD і BUILDING у бойовій Studio: вхід закритий (cadEnabled()), але код їде в збірку, а креслярка CAD і ядро — ще й у стартовий набір. Тримати так «до виокремлення CAD» (як каже kernel/config.ts:58–69), чи виокремлювати зараз?
  3. [ПИТАННЯ] МЕС-вкладка (mes/, 3 090 рядків, не підключена; у mes/data/orders.ts — прізвища клієнтів і номери замовлень п'яти реальних кейсів) і задуманий поділ на робочі простори (shell/workspaces.ts, workspaces/*/index.tsx): підключати, переносити в окремий застосунок, чи прибирати?
  4. [ПИТАННЯ] Рішення 23.08 «мертве не чіпати, розібратись» досі чинне — дозволити видалення перевіреного мертвого (17 файлів, 1 822 р. + блоки в живих файлах ≈900 р. + 9 npm-пакетів)? Окремо — що з mockData у main.tsx:14 (тестові дані в бою).
  5. [ПИТАННЯ] Що має бути в продакшн-Студії з «додатків»: сторінка стенду OCCT (stand.html — у бойовій збірці), шість сторонніх інтернет-радіо в Стоунику (StoneRadio.tsx:29–34), плашка ядра з інтервалом 700 мс, тексти довідки/Стоуника на старті кожної сторінки?
  6. [ПИТАННЯ] Дві межі NC300 тепер обидві в застосунку: 3000×1600 (materialRules.ts:52, підказки Стоуника) і 3100×1500 (manufacturability.ts:29, перевірки деталі). Яка правильна?

Пропозиції (не рішення)

  1. [ПРОПОЗИЦІЯ] Розірвати п'ять містків CAD/ядра в старт (найбільша віддача при найменшому ризику): DxfExportDialog — через React.lazy/import() за кнопкою «DXF» у SlabBoard.tsx:33; у kernel/shopSheets.ts:42 брати expandRing з модуля без статичного occtBuilder (або outline2D.ts:18 — динамічно); PLYWOOD_DEFAULTS перенести з constructor/store.ts у domain/; кнопки constructor/ui.tsx — у спільні components/; measureUiText — підвантажувати з вкладкою заміру. Перевірка — склад стартових чанків до/після (скрипт chunks.cjs).
  2. [ПРОПОЗИЦІЯ] utils/approvalImport.ts (з pdfjs-dist і xlsx) і html2canvas — підвантажувати динамічно за дією (імпорт бланка, баг-репорт). Словник i18nStatic — не тягнути у воркери (воркеру розкрою підписи не потрібні; lib/project.ts:2 → i18n.ts — єдиний місток).
  3. [ПРОПОЗИЦІЯ] Прибрати mockData з main.tsx:14 (або підвантажувати динамічно лише в import.meta.env.DEV); KernelBadge не монтувати в Studio-режимі або тікати лише поки state === 'loading'; GlProbe — патч ставити лише коли зонд увімкнений; LanguageDomTranslator — не спостерігати DOM для української.
  4. [ПРОПОЗИЦІЯ] Пакет видалень без впливу на збірку (кандидати, підтверджені knip + графом + tsc): core/, PlacementPropertiesPanel, useCostPrices [узгодити з ІТ], slabTexture, sketchupExport, SafeEnvironment, useKernelGeometry, arGen, buildFotozona, App.css, мертвий блок Viewer3D.tsx:664–1396 + groups + кнопка, ProfileMesh, useDetailGeometry, groupedParts, nearbyElementReliefPlacements, стан adminPin, 6+3 npm-пакети. Окремо за рішенням власника — mes/, shell/workspaces, workspaces/*/index.tsx.
  5. [ПРОПОЗИЦІЯ] Повернути фікс 03.09 для coreBoundary (тип DetailDraft — у domain/) і розширити сторож на kernel/ (звідти 12 не-типових імпортів у UI-папки).
  6. [ПРОПОЗИЦІЯ] Сторожі від повторного наростання: knip (мертві файли/залежності) і chunks.cjs (розмір і склад стартового набору) — як тести або крок перевірки перед пушем; правило «нова геометрія — лише через engines/geometryUtils.ts/utils/math.ts» для точки в полігоні, площі, bbox, округлень.
  7. [ПРОПОЗИЦІЯ] Великі компоненти (ProductEditorWorkspace 2 298 р., FormsPanel 2 193, SlabBoard 1 588, Detail3DNode 1 046) — різати поступово, починаючи з умовних хуків ProductEditorWorkspace.tsx:848–1098 (eslint rules-of-hooks — реальний ризик зламати стан) і 70 tsc-помилок SlabBoard.
  8. [ПРОПОЗИЦІЯ] Оновити правило «файли патчу різні в копіях» у пам'яті Лео §2.8 і коментар packingSlice.ts:95 під фактичний стан (одна копія + змінні збірки) — для L4.

Додаток: що запускалось

Крок Команда / інструмент Де Час Результат
probe-копія tar → tar x + cp -al node_modules (за брифом) /tmp/final/audit1310/probe-L3 <1 с ок
інструменти npm install knip@6.41.0 jscpd@4 під замком scratchpad (не в probe node_modules) 14 с ок
knip node …/knip/bin/knip.js --reporter json і --reporter compact під замком probe-L3 2 с 18 unused files, 6+3 deps, 8 unresolved, 311 exports / 144 файли, 115 types / 55, 15 duplicate exports → L3_knip.json, L3_knip_compact.out
граф імпортів graph.cjs (AST TypeScript з vs-cad/node_modules/typescript, лише читання) + reach.cjs, why.cjs /tmp/final/vs-cad/src (read-only) <10 с 666 вузлів; класифікація старт/ліниво/стенд/типи/тести/мертві
збірка npx vite build --sourcemap під замком probe-L3 11 с 9 стартових чанків 6 099 356 Б; склад зі sourcemap — chunks.cjs → chunks.json; пошук Det5 у main-*.js
важкі heavy.cjs (AST: декларації, компоненти, найдовша функція) read-only <5 с heavy.json
задвоєння dups.cjs (AST, нормалізація тіл) read-only <10 с 245 / 77; dups.json
копіпаст jscpd src --min-lines 15 --min-tokens 80 (без тестів і словників) під замком probe-L3 14 с 22 клони, 537 р., 0,54 %
хардкод hardcode.cjs (рядкові шаблони 02.09 + URL, сховища, секрети) read-only <5 с hard.json (значення секретів вичищено)
дерево tree.cjs + notes.json read-only <5 с 04_ДЕРЕВО_КОДУ_13-10.md
ворота gates/tsc.txt (418), gates/vitest.txt (vitest.done: exit=1 за 408 с), gates/eslint.json (eslint.done: exit=1 за 64 с) ведучий — прочитано; дублювань прогонів не робив

Не робив / не перевірено: живий старт у браузері (час, пам'ять, мережа — L7); вміст web-app на диску (лише за брифом); невикористані ключі i18n.ts messages; server/ і features/* по суті ([ІТ]); точний вплив MutationObserver і перевірок Стоуника на швидкість (лише статично).

L4 · Доки проти коду
216 тверджень з вердиктами, борги, терміни, застарілі доки · L4_ДОКИ_ПРОТИ_КОДУ.md

Лінза: кожне перевірюване твердження живих документів звірено з фактичним кодом. Код: /tmp/final/vs-cad/src — знімок C:\Works\slabcut-agent-pack\vs-cad (VS CAD + Studio на ядрі OCCT, ?mode=studio); за брифом web-app на диску має ті самі 666 файлів src/, крім constructor/docs/DocsTab.tsx. Код не змінювався, зондів у дереві немає. Доки: /tmp/final/audit1310/docs (знімок InstructionsRules). «Живі» = 01_МЕЙН/*, 03_КРОМКИ/*, 10_VIYAR_STONE_КОНСТРУКТОР/*, 14_МАЙСТЕР_БОТІЧЕЛЛІ/*, 16_ДЖОВАННІ_CAD/*, 12_ВИРОБНИЦТВО_І_МЕС/* (лише про код Студії), 02_БАГИ_І_БОРГИ/{РЕЄСТР_БАГІВ, BUGS_AND_TECH_DEBT, ЗАМІРИ_12-10…}. Журнал дебагінгу — історія, а не опис: він використовується як джерело дат, але «описаним» модуль вважається лише тоді, коли його пояснює живий документ. База для порівняння: 09_АУДИТ_02-09/L4_ДОКИ_ПРОТИ_КОДУ.md і §7 00_ЗВІТ_АУДИТУ_02-09.md. Позначки: [ФАКТ ✔] — перевірено самостійно (grep/wc/читання файла/скрипт у цій сесії); [ФАКТ ◔] — прочитано в коді з адресою, без запуску; [ГІПОТЕЗА]; [ПИТАННЯ]; [ПРОПОЗИЦІЯ] — окремим блоком наприкінці. У таблицях: ✔ збігається · ✖ розходиться · ◔ частково · ? перевірити кодом неможливо. Якщо не сказано інакше, вердикти таблиць — [ФАКТ ✔]. Адреси коду — відносно src/, доків — файл:рядок. Межі: server/, lib/api.ts, auth/Keycloak, 1С/WMS/Products/Orders, MES Бруно — позначено «[сторона ІТ]», не оцінювалось. Значення PIN, солі/відбитку пароля, адреси серверів і прізвища клієнтів у звіт не винесено.

Виміряні гейти (прогони запускав ведучий: gates/tsc.txt, gates/vitest.txt, vitest.done = exit 1 за 408 с):

npx vitest run → Test Files 2 failed | 213 passed | 2 skipped (217)
                 Tests      2 failed | 1856 passed | 19 skipped (1877)    407 с
   з них src/  → 216 файлів, 1862 тести: 1841 passed + 2 failed + 19 skipped; server/src/__tests__/settings.test.js — 15
   червоні     → __tests__/coreBoundary.test.ts:69 (engines/shapeBuilder.ts:2 імпортує тип з components/forms/utils/draftHelpers)
                 parsers/dxf/parser.test.ts:8 (C:/hhgh/…)
   пропущені   → kernel/__tests__/profiledBase{CacheGeometry,RuntimeGuard}.integration.test.ts (19, лише з CAD_PROFILED_BASE_NATIVE=1)
npx tsc        → 418 помилок (TS6133 154 + TS6196 23 = 177 «не використовується»; TS2307 фантомних модулів 8)

Доки кажуть: tsc 418 (ПАМ'ЯТЬ_ЛЕО, Джованні) — збігається; тести — 17 різних чисел від 1152 до 1751 (розділ 1.1), найсвіжіше — 1719 (ПАМ'ЯТЬ_ЛЕО §3).


1. Числа і дерево файлів

1.1. Кількість тестів і tsc у живих доках

Документ:рядок Що написано Факт Вердикт
ПАМ'ЯТЬ_ЛЕО.md:73–75 vitest src 1719 + 2 відомі (coreBoundary, DXF), tsc 418 src 1841 ✓ + 2 (ті самі) + 19 skipped; tsc 418 ◔ (тести відстали на 122)
16_ДЖОВАННІ_CAD/01_МАНІФЕСТ_ДЖОВАННІ.md:118–120, 00_СТАРТЕР_ДЖОВАННІ.md:38 kernel 74 (13 файлів); vitest 1751 + 2; tsc 418 kernel 194 тести у 30 файлах (19 skipped); 1856 + 2; 418 ✖ / ✖ / ✔
16_ДЖОВАННІ_CAD/02_КАРТА_ДЖОВАННІ.md:62 __tests__/ — 16 файлів, 74 + 8 shopSheets 30 тест-файлів + profiledBaseFixtures.ts ✖ (і 13 ≠ 16 між двома доками Джованні)
НЕСТИНГ_НА_ТОЧНИХ_КОНТУРАХ.md:94–95 09.10: 1688 ✓ + 2, tsc 417 знімок дня; сьогодні 1856 / 418 ◔ (датовано)
10_…/ПЛАН_VS_CAD_OCCT_30-09.md:49 1554 + 2, tsc 422 знімок 30.09 ◔
00_СТАРТЕР_ДА_ВІНЧІ.md:22 очікування: vitest 1171/2, tsc 424, дерево /tmp/final/web-app 1856/2, 418, дерево /tmp/final/vs-cad ✖
MANIFEST…:944 (§5.13), ПЛАН_І_СТАН.md:16–22, СТАРТ…:48–50, АРХІТЕКТУРА…:15–16 1195 (+1), tsc 430 1856 / 418 ✖
АРХІТЕКТУРА…:35, :79–86 гейт 754 / 1; база 249 історичні числа в живому розділі ✖
14_МАЙСТЕР_БОТІЧЕЛЛІ/01_МАНІФЕСТ_БОТІЧЕЛЛІ.md:167,172 1171 passed — ✖
СТОУНИК.md:20 сторожі Стоуника — 46 тестів 48 у п'яти названих файлах; у всіх 8 файлах stounik/__tests__ — 57 ◔
СПІЛЬНІ_НАЛАШТУВАННЯ.md:51–53 сервер 12, settingsSync 9, SettingsSyncBar 4 15 [сторона ІТ] / 9 / 4 ◔
— (ніде, крім журналу) 19 пропущених інтеграційних тестів ядра і змінна CAD_PROFILED_BASE_NATIVE kernel/__tests__/profiledBaseRuntimeGuard.integration.test.ts:58 describe.skipIf(…) не описано

[ФАКТ ✔] Окремо: фантомні модулі (СТАРТ §9 :432 «useDictionaryStore у 6 компонентах, domain/types ще 4») — сьогодні 6 + 2 (gates/tsc.txt, TS2307 ×8: LDesigner, RectangleDesigner, CornerContextMenu, CornerProcessingModal, CutoutProcessingModal, JointContextMenu; LegModal, SkirtingModal).

1.2. Обсяг коду

Джерело Що написано Факт 12.10
КАРТА_МОДУЛІВ_01-09.md:5, README.md:10 235 модулів, 111 тестових файлів 433 ts/tsx без тестів, 216 тестових файлів
АРХІТЕКТУРА…:15–16 226 модулів / 72 004 рядки 433 / 117 380 рядків (тести — ще 26 754)
АРХІТЕКТУРА…:104–105 (2.0, аудит 02.09) 343 файли / 88 543 рядки; тестових 103 + 7 666 файлів (433 модулі + 216 тестів + 8 css + 9 інших); тестових 216 + 1 серверний

[ФАКТ ✔] Порівняння списку файлів 04_ДЕРЕВО_КОДУ_02-09.md (343) з сьогоднішнім src/ (скрипт у додатку): +326 файлів, −3 (engines/pricing.ts, components/ui/CommercialQuoteDialog.tsx, store/slices/pricingSlice.ts — видалені 03.09 рішенням Е-1). Модулів (без тестів) додалось 208. Вісім тек верхнього рівня, яких немає ні в КАРТА_МОДУЛІВ, ні в АРХІТЕКТУРА_І_СТЕК:

Тека Модулів Рядків Тест-файлів Де описано
constructor/ 57 14 110 11 СТАРТЕР_КОНСТРУКТОР (04.09, перша версія); пізніші вкладки — журнал, ПАМ'ЯТЬ §5–6 рядками
kernel/ 38 6 676 30 16_ДЖОВАННІ/02_КАРТА (06.10, неповна), ПАМ'ЯТЬ §4/§6, НЕСТИНГ
mes/ 7 2 997 1 12_…/04_ПЛАН_MES (план 04.09); код не підключений
stounik/ 16 2 236 8 СТОУНИК.md
workspaces/ 13 1 581 1 workspaces/*/README.md у коді; 14_…/02_КАРТА_ДЛЯ_БОТІЧЕЛЛІ одним рядком
stand/ 2 637 0 16_ДЖОВАННІ
features/ 12 482 5 ORDER_REGISTRY_15-09, STUDIO_REGISTRY_IDENTITY_FIX (нотатки Бруно) [сторона ІТ/Бруно]
shell/ 4 249 3 ЩО_ВИНОСИМО_З_VS3D (каже «відкочено»), ПАМ'ЯТЬ №262–263
Разом 149 28 968 59 —

1.3. Розміри великих файлів (рядків)

Файл АРХІТЕКТУРА 2.0 (02.09) КАРТА (01.09) Інші доки Факт
utils/approvalImport.ts 4805 4805 РЕЄСТР SC-22: 4798 4805 ✔
components/ui/Detail3DPreview.tsx 2914 3066 SC-22: 1412 3530
components/ui/ProductEditorWorkspace.tsx 2558 2549 — 2974
engines/geometry.ts 2754 2754 — 2613 (зменшився: 28.09 видалено buildComplexRectPoints)
components/ui/FormsPanel.tsx 2346 2346 SC-22: 2211 2392
components/3d/Viewer3D.tsx 1974 1964 — 2102
engines/packing.ts 2029 2029 — 2042
components/2d/SlabBoard.tsx 1556 1556 — 1642
App.tsx 804 798 Ботічеллі карта: 832 875
components/3d/ProductElement3DNode.tsx — 715 — 983
engines/miterAssembly.ts (242 — аудит 02.09) — — 672
workers/packing.worker.ts 44 44 — 44 ✔

Нові великі, яких немає в жодній таблиці розмірів: kernel/occt/occtBuilder.ts 1628, utils/export/quotePdf.ts 1363, mes/data/codeArea.ts 1304, components/ui/QuotePanel.tsx 1269.

1.4. Стоуник, налаштування, стабільні ідентифікатори

1.5. Копії коду і «файли патчу»

[ФАКТ ◔] ПАМ'ЯТЬ_ЛЕО.md:41–46 (§2.8): «Файли патчу (vs-cad-patch): src/kernel/**, src/stand/**, src/main.tsx, SlabBoard.tsx, Detail3DPreview.tsx, WorkspaceTabs.tsx, DxfExportDialog.tsx, PartShape.tsx — різні в копіях, між копіями не копіювати». Факт брифу (звірено ведучим з диском): web-app = vs-cad по всіх 666 файлах src/, крім constructor/docs/DocsTab.tsx, якого в переліку §2.8 немає. Журнал №261 (ЖУРНАЛ_ДЕБАГІНГУ.md:10394–10396) тим часом прямо називає DocsTab точкою підміни і пише «тепер web-app = vs-cad крім заголовка/порту/назви пакета»; те саме — ПАМ'ЯТЬ_ЛЕО.md:200–201. Отже §2.8 суперечить §6 того ж файла і факту, а єдиний файл, що реально розходиться, — поза переліком. Ті самі «п'ять екранних файлів патчу, у Studio вони теж є, правки дублюються вручну» — у 16_ДЖОВАННІ_CAD/01_МАНІФЕСТ_ДЖОВАННІ.md:38–41; модель «VS CAD = web-app + патч» — у ДЛЯ_ВАНІ_КОНСТРУКТОР_СТАРТ.md:25–26,33–35 і 10_…/ПЛАН_VS_CAD_OCCT_30-09.md §2. [ГІПОТЕЗА] DocsTab змінили в одній копії вже після №261; яка версія новіша — не перевірено (копії web-app у пісочниці немає; vs-cad-версія від 09.10, без shopSheets).


2. Таблиця тверджень з вердиктами

2.1. 01_МЕЙН/ПАМ'ЯТЬ_ЛЕО.md (вхідна точка, 08.10 → дописано до №278)

№ Твердження (рядок) Що в коді Вердикт
A-1 §2.5 :35–36 «останній на 08.10 — №241» журнал закінчується №278 (ЖУРНАЛ…:10879); §6 :241 «наступний №279» ◔ (застаріло всередині файла)
A-2 §2.8 :41–46 файли патчу різні в копіях розділ 1.5 ✖
A-3 §3 :52–53 vs-cad = VS CAD + Studio на OCCT, ?mode=studio kernel/config.ts:40–56 ✔
A-4 §3 :56 локалка …7177/?mode=studio vite.config.ts port: 7177, strictPort; назва кнопки — ? (у kernel/config.ts:38 інша: ТЕСТОВА_СТУДІЯ_НА_OCCT.bat) ◔
A-5 §3 :57–58 пуш push-gitlab-0510-console.txt, потім OCCT №261 (:200–201) і §7 :281: один скрипт 12.10, «05.10 більше не пушити»; стара процедура живе ще й у темі Стоуника stounik/leoTopics.ts:146 ✖
A-6 §3 :73 tsc 418 gates/tsc.txt 418 ✔
A-7 §3 :73–74 vitest src 1719 + 2 відомі 1841 + 2 (ті самі) + 19 skipped ◔
A-8 §3 :75 повний прогін ~6 хв 407 с ✔
A-9 §4 :81–83 useSettingsStore, persist-ключ, SETTINGS_VERSION 7 store/useSettingsStore.ts:38,335 ✔
A-10 §4 :82 isAdminUnlocked — PIN з №263 — логін і пароль: components/ui/AdminPinButton.tsx:5,57, shell/adminLogin.ts ✖
A-11 §4 :84–85 стабільні data-stounik 25/25 (1.4) ✔
A-12 §4 :86–87 мобільний: «≤1024 px або тач» hooks/useIsMobile.ts:21–49: ≤1024 АБО (тач і коротка сторона ≤520) ◔
A-13 §4 :87 ?mobile=1 / ?desktop=1 useIsMobile.ts:25–33 ✔
A-14 §4 :88 MobileBoardZoom fit/read/large components/mobile/MobileBoardZoom.tsx:18–20 ✔
A-15 §4 :89 редактор: modelFromDraft → useKernelAssembly components/ui/Detail3DPreview.tsx:2356,2366 ✔
A-16 §4 :90 Підбір: kernelSeam → kernel/productKernel components/3d/kernelSeam.ts, kernel/productKernel.ts, main.tsx:46 ✔
A-17 §4 :90–91 №251 — смуги по дугах через arcBandFor kernel/productKernel.ts:332, components/3d/ProductElement3DNode.tsx:374 ✔
A-18 §4 :92 2D: useExactOutlines → PartShape components/2d/SlabBoard.tsx:32,101 ✔
A-19 §4 :92–94 розкрій і колізії по контуру різу (№246) domain/types.ts:896, engines/packing.ts:130–148, main.tsx:48 ✔
A-20 §4 :94–95 креслення бланка й дошки в PDF з ядра (№249) engines/cutOutlineSeam.ts:65; components/ui/QuotePanel.tsx:438; PdfExportDialog.tsx:82; utils/export/quotePdf.ts:930, pdfPages.ts:423 ✔
A-21 §4 :95–96 «Легасі: у Підборі — бандажі по дугах» суперечить A-17; та сама застаріла фраза — у шапці kernel/productKernel.ts:20–22 ✖
A-22 §4 :96 легасі у Підборі: мийки, метал productKernel.ts:20–22; у редакторі — ядро (Detail3DPreview.tsx:2455,2469) ✔
A-23 §4 :96–97 пакувальник легасі, тепер по контуру різу packing.ts:121–148 ✔
A-24 §4 :97–99 TextureLayoutPanel, quoteCalc/BOM, бланк, конструктор, кімната — не на OCCT у constructor/builder3d, constructor/assembly звернень до ядра 0 ✔
A-25 §4 :99–100 дірки ядра: еліпс/довільні вирізи — ламана kernel/modelFromDraft.ts:275 ✔
A-26 §4 :100 вус на дузі не будується modelFromDraft.ts:292, kernel/attachmentsFromPlan.ts:173 (unsupported) ✔
A-27 §4 :100 мийка з помилкою збірки → unsupported kernel/sinkFromDraft.ts:73,87 ✔
A-28 §4 :101 довідник 66 тем + 21 71 + 21 ✖
A-29 §4 :102–103 вкладка «ШІ» лише там, де є функція stounik/aiEndpoint.ts:21–25, Stounik.tsx:186 ✔
A-30 §4 :104–105 ключі quote/production, версія проти затирання (409) lib/api.ts:371–388, store/settingsSync.ts:63–67 ✔
A-31 §4 :105 «Зберегти для всіх» після PIN SettingsSyncBar.tsx:26 — isAdminUnlocked, який з №263 дає логін ◔
A-32 §5 :110–111 «PIN один … без ролей» №263 замінив PIN логіном (:207 того ж файла) ✖
A-33 §5 :114–115 на телефоні плашка ядра не показується kernel/KernelBadge.tsx:31 hidden={studio} — схована в Studio на всіх пристроях; у CAD на телефоні видима, лише зсунута (styles/mobile.css:655) ◔
A-34 §5 :130–132 площа з припуском, кромка по номіналу (№250) engines/geometryUtils.ts:411 ✔
A-35 §5 :137–140 фанера й метал — не на сляби (№256) engines/nestingScope.ts (isStonePart), DetailPart.metal у domain/types.ts ✔
A-36 §5 :141–145 Pegasus отримує DXF у шарах (вода, 45°, −45°, полка, кут) engines/combicut/pegasusDxf.ts:32–41 ✔
A-37 §5 :151–153 автомат: пряма → диск, дуга/отвір → вода, стик miter45 → 45° engines/combicut/plan.ts:168; плюс легасі thickening.sides теж → 45° (:156–157) — розділ 4 ◔
A-38 §6 :203–205 №262: cadEnabled(), isViewAvailable, режими не вмикаються, Стоуник cadOnly, довідка без «Замір», сторож kernel/config.ts:70; store/useStore.ts:51–53,369,377; Stounik.tsx:139; HelpDialog.tsx:166; shell/__tests__/studioOnly.test.ts (5) ✔
A-39 §6 :207–209 №263: сіль + PBKDF2, 600k ітерацій, пароля в коді нема shell/adminLogin.ts:29–33 (лише відбиток; значення не цитую) ✔
A-40 §6 :226–227 №271: KERNEL_REBUILD_DELAY_MS 300, useOwnedGeometries kernel/useKernelAssembly.ts:52; grep useOwnedGeometries ✔
A-41 §6 :231 №274: StounikLoader3D, utils/sceneActivity, «Перезапустити 3D» components/3d/StounikLoader3D.tsx (лише у Viewer3D), utils/sceneActivity.ts ✔
A-42 §6 :233 №275: кеш складання ≤ 8 / 64 МіБ kernel/occt/assemblyCache.ts:63 ✔
A-43 §6 :235 №276: ?arcs=0 вимикає швидкі дуги kernel/occt/occtBuilder.ts:414, workerClient.ts:156 ✔
A-44 §6 :237 №277: ядро у фоновому потоці kernel/occt/geometry.worker.ts, workerClient.ts, workerProtocol.ts ✔
A-45 §6 :239 №278: плита з профілями — з кешу ядра kernel/occt/profiledBaseCache.ts; occtBuilder.ts:812 ✔
A-46 §6 №258–№270 (гроші пробілом, Черговість/шар ORDER, __none__, текстури сайту, panelFit) lib/money.ts; engines/combicut/{types,pegasusDxf}.ts; components/3d/Viewer3D.tsx; grep /api/products/slabs/texture/file, photoSource: 'site'; constructor/merge/panelFit.ts (wallRun, fitPanel, withPanelFields, attachNominal) ✔
A-47 §7 :258 «shopSheets у DocsTab» — не зроблено у constructor/docs/DocsTab.tsx немає; kernel/shopSheets лише в components/2d/board/DxfExportDialog.tsx:5 ✔
A-48 §7 :250–253 прогрів ядра — чекає «го» функції прогріву в kernel/ нема ✔
A-49 §7 :262–263 фанера в 3D — three.js-призми, не тіла ядра components/3d/PlywoodNode.tsx; kernelAsm.plywood ніде не читається ✔

2.2. 01_МЕЙН/СТОУНИК.md (07–09.10)

№ Твердження Що в коді Вердикт
S-1 :11 персонаж і оболонка; домік у HeaderToolbar components/ui/HeaderToolbar.tsx:6,72 ✔
S-2 :11,105 вкладки Підказки / Перевірка / Збереження (+ ШІ) stounik/Stounik.tsx (role="tab") ✔
S-3 :11 тихий режим stounik-muted, дрімота 45 с Stounik.tsx:36–37 ✔
S-4 :12 66 тем 71 ✖
S-5 :12 adminOnly/vsCadOnly ховають теми Stounik.tsx:139; cadOnly (№262) не описано ◔
S-6 :12 пошук: синоніми, помилка в 1–2 букви stounik/search.ts:13 (SYNONYMS), :46 (levenshtein) ✔
S-7 :13 перевірка через 1,5 с; «Зрозумів» у sessionStorage stounik-ack:<projectId> stounik/useStounik.ts:21,57,62 ✔
S-8 :14 runStounikChecks({project, details, parts}) stounik/checks.ts:238 ✔
S-9 :15 «шість станів» збереження stounik/saveState.ts:12 — сім (no-backend, unbound, dirty, saving, saved, failed, unauthorized); той самий файл у :82–83 теж перелічує сім ◔
S-10 :15 saveProjectToCabinet — один код для меню і Стоуника store/cabinetActions.ts:16 ✔
S-11 :16 дії setMainView/openHelp/openDetailEditor/requestEditorPanel, підсвітка 3 с stounik/actions.ts:29,38,43 ✔
S-12 :17 25 стабільних id 25/25 (1.4) ✔
S-13 :18 знайомство через 0,7 с; не у ?popup=; stounik-welcome = off Stounik.tsx:38; StounikWelcome.tsx:12,21 ✔
S-14 :19 6 хвиль, stounik-radio-station, «Міксер» 0,6 / 0,9 с, 15 с без потоку stounik/StoneRadio.tsx:39–42, STONE_STATIONS ✔
S-15 :20 сторожі — 46 тестів 48 (57 у теці) ◔
S-16 :25 TOPICS = [...BASE_TOPICS, ...LEO_TOPICS] topics.ts:594 ✔
S-17 :35 сторож leoTopics.test.ts (4) 4 ✔
S-18 :65–66 числа перевірок лише з чинних модулів checks.ts:22–29 (manufacturability, materialRules, materialThickness, quoteGuards, cutoutAnchor, drainGrate) ✔
S-19 :74–76 пороги 12,5 / 50 / 100 / R60 / R15 / 60–100 → технолог domain/manufacturability.ts (HOLE_LIMITS, CUTOUT_LIMITS, RADIUS_LIMITS, technologistConsultMin: 100 :107) ✔
S-20 :87–91 чого бракує (MISSING_RULES) checks.ts:269–275 ✔
S-21 :110 зонд: GET → 405 JSON = є функція aiEndpoint.ts:21–25 ✔
S-22 :113–118 до 1200 символів; фото ≤10 МБ → ≤1800 px; огляд 80 / 40 / 40 StounikAi.tsx:44; photoAttachment.ts:5,9; projectSnapshot.ts:29–30 ✔
S-23 :124 stounikAi.test.tsx (4) 4 ✔

2.3. 01_МЕЙН/СПІЛЬНІ_НАЛАШТУВАННЯ.md (08.10)

№ Твердження Що в коді Вердикт
C-1 :12–14 «хто має PIN адміна, натискає…» з №263 — вхід логіном (AdminPinButton.tsx:57) ◔
C-2 :16–18 «на сервер їдуть коди, правила й мінімальні сторони, не гроші» store/settingsSync.ts:65 відправляє весь quotePriceBook разом із калібрувальними цінами (domain/quoteCalc.ts:247–261: fabrication, measure, montage, deliveryZones…) ◔
C-3 :17–18 режим калібрування і PIN на сервер не їдуть pickSharedDoc (settingsSync.ts:63–67) їх не бере ✔
C-4 :24–25 сервер settings.js, таблиці, GET/PUT/history server/src/settings.js у знімку є [сторона ІТ] ?
C-5 :26 getSharedSettings/putSharedSettings; 404 без JSON = бекенда нема lib/api.ts:371–388 ✔
C-6 :27 фон: старт, visibilitychange, кожні 10 хв; запускає AuthContext settingsSync.ts:31,162–169; components/auth/AuthContext.tsx:56 ✔
C-7 :28 sharedVersions useSettingsStore.ts:82,145 ✔
C-8 :30 «PDF для клієнта» пише sharedSettingsVersions.quote QuotePanel.tsx:444; domain/types.ts:1174 ✔
C-9 :31 підказка Стоуника про стару версію checks.ts:256–264 ✔
C-10 :51–53 кількість сторожів 15 / 9 / 4 / +2 ◔
C-11 транспорт через реєстр MES (VITE_SHARED_SETTINGS_TRANSPORT=mes, POST /api/registry/orders?settings=…) — у документі не описаний lib/settingsTransport.ts:2–6; лише рядок у ПАМ'ЯТЬ №244 [сторона ІТ/Бруно] ◔

2.4. 01_МЕЙН/НЕСТИНГ_НА_ТОЧНИХ_КОНТУРАХ.md (09.10)

№ Твердження Що в коді Вердикт
N-1 :33–35 DetailPart.cutOutline domain/types.ts:896 ✔
N-2 :36–42 polygonForPlacement / holesForPlacement беруть cutOutline engines/packing.ts:130–148,313–314,364,1926 ✔
N-3 :43–46 cutOutlineSeam: провайдер, withCutOutlines engines/cutOutlineSeam.ts:32–51 ✔
N-4 :47–53 квиток cutOutlineTicket, applyCutOutlines store/slices/packingSlice.ts:17,100–113,323 ✔
N-5 :54–58 CUT_SAG_MM 0,3; кеш за exactPartKey; registerCutOutlines() у main.tsx kernel/cutOutlines.ts:27,86,137; main.tsx:48 ✔
N-6 :62–63 воркер розкрою не змінювався workers/packing.worker.ts 44 рядки ✔
N-7 :85,88 сторожі 8 і 3 8 і 3 ✔
N-8 :91 сторож ядра 5 6 (+ cutOutlinesRecovery.test.ts 5, не описаний) ◔

2.5. 16_ДЖОВАННІ_CAD/* (06–07.10)

№ Твердження Що в коді / знімку Вердикт
G-1 00_СТАРТЕР…:22, 02_КАРТА…:13 — тека InstructionsRules\16_ДЖОВАННІ\ у знімку тека 16_ДЖОВАННІ_CAD (так її називає й ДЛЯ_ВАНІ…:14) ✖
G-2 00_СТАРТЕР…:25–26, 02_КАРТА…:94–95 адреси: 7177/?mode=studio, 7177/ (CAD), /stand.html, ?kernel=legacy kernel/config.ts:15–21,40–56; main.tsx:54–58; vite.config.ts (input stand.html) ✔
G-3 01_МАНІФЕСТ…:118 гейт ядра 74 (13 файлів) 194 тести / 30 файлів ✖
G-4 01_МАНІФЕСТ…:119–120 1751 + 2; tsc 418 1856 + 2; 418 ✖ / ✔
G-5 02_КАРТА… §2 — перелік ядра (25 файлів) бракує 12 файлів після 06.10: productKernel, cutOutlines, exactPartInput, exactPartsCore, previewScheduler, assemblyPreview, occt/{assemblyCache, geometry.worker, workerClient, workerProtocol, nativeShapeGuard, profiledBaseCache} ✖
G-6 02_КАРТА…:53 outline2D: «еліпс — ламана 16» з №234 еліптичні дуги → ланцюг дуг кіл з допуском 0,02 (kernel/occt/outline2D.ts:43,104–107); 16 точок — лише інші криві (:113) ✖
G-7 02_КАРТА…:32 baseContour — 64 хорди domain/baseContour.ts:225 ✔
G-8 02_КАРТА…:50 клямп 40 мм на доповненнях domain/ids.ts:96 ADDITION_STRIP_MAX_MM = 40; kernel/attachmentsFromPlan.ts:103 ✔
G-9 02_КАРТА…:60 useKernelGeometry.ts — «тіла → меші для редактора» 0 імпортерів (grep; knip L3 — unused) ✖
G-10 02_КАРТА…:62 __tests__ 16 файлів, 74 + 8 30 + fixtures, 194 ✖
G-11 02_КАРТА…:63 стенд — 12 кейсів stand/fixtures.ts — 16 записів (1–12 і 9а/9б/11б/11в) ◔
G-12 02_КАРТА…:65–68 точка підміни DetailMesh/kernelModel; 2D — SlabBoard + PartShape; DXF — DxfExportDialog Detail3DPreview.tsx:2356; SlabBoard.tsx:101; три профілі general/combicut/nc300 (kernel/exportCutDxf.ts:55) ✔
G-13 04_ПРАВИЛА… Ц-5 «на доповненні ≤ 40 мм»; Ц-13 «коло й овал точні, допуск 0,02» domain/ids.ts:96; outline2D.ts:43 ✔
G-14 04_ПРАВИЛА… Ц-11 «вус на дузі — не ввімкнено» unsupported (A-26) ✔
G-15 01_МАНІФЕСТ…:38–41 «п'ять екранних файлів … правки Studio сюди дублюються вручну» файли однакові в обох копіях (1.5) ◔
G-16 02_КАРТА…:61 config.ts: IS_VS_CAD, activeKernelName, isStudioMode є (:15,30,40); cadEnabled() (№262, :70) у карті відсутній ◔

2.6. 01_МЕЙН/АРХІТЕКТУРА_І_СТЕК.md (ревізія 03.09)

№ Твердження Що в коді Вердикт
R-1 :15–16 226 модулів / 72 004 рядки / 111 тест-файлів / 1195 433 / 117 380 / 216 / 1862 ✖
R-2 :104–105 343 файли / 88 543; 103 + 7 тестових 666; 216 + 1 ✖
R-3 :34 npm run dev → localhost:5173 vs-cad: 7177 (package.json, vite.config.ts); web-app — ? (за №261 порт там інший) ◔
R-4 :35, :79–86 гейт 754 / 249; «мертвий verify_quantity.test.ts» 1856 / 418; файла нема ✖
R-5 :49–65 стек: версії react/ts/vite/vitest/three/fiber/drei/csg/zustand/immer/idb/konva/jspdf/rrweb/tailwind/lucide package.json — збігаються ✔
R-6 :49–65 (чого нема в таблиці) opencascade.js ^2.0.0-beta — ядро OCCT (50 МБ wasm, kernel/occt/loadOcct.ts:4–6), uuid, puppeteer ✖
R-7 :67 немає big.js/decimal.js немає ✔
R-8 :111 розміри 10 файлів 2 з 10 збігаються (1.3) ✖
R-9 :112 historySlice 50, глобальний store/slices/historySlice.ts:46 ✔
R-10 :113 miterAssembly — «тестів на модуль немає» є: engines/__tests__/pidvorot29-09.test.ts, miterInsetLeg.test.ts, mathUnify25-09.test.ts, kernel/__tests__/occtAttachments.test.ts ✖
R-11 :114 materialRules не імпортується нічим, крім тесту; два максимуми NC300 імпортує stounik/checks.ts:23 (checkLShapeInnerCorner, rulesForMaterial); 3100×1500 (manufacturability.ts:29) проти 3000×1600 (materialRules.ts:52) — досі два ◔
R-12 :115 проточки/решітка — без фактів у гроші у productionFacts, estimate, serviceMapping, quoteCalc слів groove/drain — 0 ✔
R-13 :117–118 core/geometry.ts, core/snapping.ts, PlacementPropertiesPanel — 0 імпортерів 0 (knip L3 підтверджує) ✔
R-14 :119 board/* 12 файлів, «BoardOverlays (лупа, розміри)» 14 файлів (+DxfExportDialog, useSiteSlabTextures); лупу видалено 03.09 (BoardOverlays.tsx:210–216 «Тут жив…») ✖
R-15 :120 мобільний шар (≤1024 або дотик + ≤520) useIsMobile.ts:21–49 ✔
R-16 :140 manufacturability — 11 правил 14 повідомлень message: ✖
R-17 :144 viyarServiceCatalog — 178 178 ✔
R-18 :164 productionFacts — 14 видів 20 (ProductionFactKind: + radius_element, radius_matrix, plywood_frame, plywood_sheet, plywood_sanding, wedi) ✖
R-19 :165–166 ручна ціна лише в калібруванні в обох рушіях engines/estimate.ts:176–177 (manualPricing && …, manual ?? erp ?? 0) ✔
R-20 :180 useProjectStore — 5 слайсів store/useProjectStore.ts:13–17 ✔
R-21 :187 BroadcastChannel('slabcutplanner-sync'), дебаунс 1 с store/persistence.ts:21,79 ✔
R-22 :189 adminPin дефолт у сторі константа є (useSettingsStore.ts:44), але замок — логін (№263) ◔
R-23 :197 WorkspacePane: «2D / 3D / Текстура / Послуги / Прорахунок» 17 видів (store/useStore.ts:18–37, набори :40,42): 6 Studio + 8 CAD + 3 BUILDING ✖
R-24 :215 торці — «віднімається CSG (three-bvh-csg)» у Studio на OCCT профіль ріже ядро; CSG лише коли ядро вимкнене (Detail3DPreview.tsx:2342 withCutters: !kernelOn) ◔
R-25 :218 70 профілів, 56 розрізів domain/edgeProfileClasses.ts:87 (70), edgeProfileDrawings.ts (56) ✔
R-26 :224 HelpDialog + public/help/edges/* у знімку public/ є лише favicon.svg, icons.svg, manifest.webmanifest; код посилається на /help/… (HelpDialog.tsx:422) і /apple-touch-icon.png (index.html:19) ?
R-27 :231,233 воркер 44, approvalImport 4805 44, 4805 ✔
R-28 §4.2 «радіус — дуга з 12 сегментів» легасі engines/geometry.ts:784; ядро — точні дуги, криві 256 точок (kernel/modelFromDraft.ts:99) ◔
R-29 весь документ: ядро OCCT, kernel/, VS CAD жодної згадки ✖

2.7. 01_МЕЙН/MANIFEST_architecture_and_logic.md (01.09; 2.7 — 29.09)

№ Твердження Що в коді Вердикт
M-1 :10–14 оновлено 01.09; інваріанти до 2.60 немає жодного інваріанта про ядро (шов kernelSeam, cadEnabled, воркер, кеші, «один активний будівник») ✖
M-2 2.1 toSlot() у domain/ids.ts є ✔
M-3 2.7 attachmentLay, flatAttachmentPose, bottomMiterCutters, edgeCornerConvexity, insideMiterCutter, underPlateTrim domain/ids.ts:80; engines/miterAssembly.ts:187,230,481,504; engines/attachmentShrink.ts:174 ✔
M-4 2.29 i18nStatic ≈1670 записів 1823 у i18nStatic.ts:18… + словник заміру ✖
M-5 2.31 / 2.51 підписи лише з EDGE_KIND_LABEL порушення: utils/export/quotePdf.ts:478,508; forms/import/ApprovalOverview.tsx:198–199; engines/combicut/plan.ts:180 (розділ 4) ✖
M-6 2.36 (:47, :565–567) три умови дзеркала engines/packing.ts:466–471 — дві (без «обробки кромки») ✖
M-7 2.54 :806–807 «Підворот — мітра лише на керамограніті» engines/miterAssembly.ts:31–34 — ніколи; суперечить 2.7 того ж файла ✖
M-8 2.55 приміщення — база domain/room.ts є; з 11.09 вкладка лише для адміна (components/WorkspaceTabs.tsx:201) — не записано ◔
M-9 §3 :867,869 getAllProjectDetails у двох файлах; mapCorners/CutoutsToRect двічі одне визначення; mapCornersToRect/mapCutoutsToRect у geometry.ts уже немає ✖
M-10 §3 (чого нема) живі дублі textureGroupKey (engines/geometryUtils.ts:20 / engines/textureLayout.ts:37); findPart/attachedCurvedPosition/attachedDisplayPosition (textureLayout.ts:26,101,119 / utils/export/pdfGeometry.ts:33,102,118) ✖
M-11 §4.2 :888 стики дерева не доходять до фактів engines/productionFacts.ts:337–380 обходить products; тест-сторож fireplaceEndToEnd.test.ts:230 «ВІДОМО» ✖
M-12 §4.8 шрифти Text з CDN drei Text — Detail3DPreview.tsx:608,687,705,745 ✔ (борг відкритий)
M-13 §4.9 :895 core/* мертві + verify_quantity.test.ts core — так; verify_quantity нема ◔
M-14 §4.10 45° — «свіп, не CSG» клин CSG (miterAssembly.ts:50) + тіло OCCT (kernel/attachmentsFromPlan.ts) ✖
M-15 §4.11 подвійний prod_ components/ui/FormsPanel.tsx:192 uid('prod') + domain/ids.ts:2 ✔ (відкритий)
M-16 §4.14 :905–907 «Viewer3D відстає» закрито 02.09 (miterAssembly), Підбір на ядрі з №242 ✖
M-17 §4.15 :908 «тип стику потовщення … glued (П-14)» ProductEditorWorkspace.tsx:367–373: fold → miter45, thickening (Підворот) → glued — це рішення 29.09 ✖
M-18 §4.16 :910 П-16 «кут підворотів — ус чи встик» вирішено 29.09 «як у гіпотезі» (2.7 того ж файла) ✖
M-19 §4.22 :921 tsc 430 418 ✖
M-20 §4.23 :923 увігнутий кут — порожній квадрат №199: insideMiterCutter (miterAssembly.ts:504), edgeCornerConvexity ✖
M-21 §5.13 :944 гейт 1195 + 1, 430 1856 + 2, 418 ✖
M-22 §6 :961 «Detail3DPreview.miterPlan — орієнтація рамки ребра» план — engines/miterAssembly.ts ✖

2.8. 01_МЕЙН/БІЗНЕС_ЛОГІКА.md (01.09; §2.2, §9.1–9.2 — 29.09)

№ Твердження Що в коді Вердикт
B-1 §0 :36–38 метал «схований під супер-адміном і не розвивається» вкладка «Метал» CAD (WorkspaceTabs.tsx:22), constructor/metal/metalFit.ts, domain/metalJoints.ts, metalHoles.ts, metalCutList.ts, engines/metalGeometry.ts ✖
B-2 §1.1 :49 «прав немає, налаштування в браузері (борг)» №241 — на сервері; №263 — вхід адміна ◔
B-3 §2.2 :102–103 Потовщення = fold (вертикальна, 45°), Підворот = thickening (під плитою) domain/ids.ts:53–56,80–84 ✔
B-4 §9.1 70 профілів, 56 розрізів 70 / 56 ✔
B-5 §9.2 :616–618 підворот — площинна склейка на будь-якому матеріалі miterAssembly.ts:31–34 ✔
B-6 §9.4 :658 товщина деталі ≠ сляба — попередження domain/quoteGuards.ts:11–18; QuotePanel.tsx:555–563 (№267) ✔
B-7 §9.4 :663–664 від матеріалу залежить «ТУ здійсненності (materialRules.ts)» діє лише в Стоунику (checks.ts:23), не в редакторі/розкрої ◔
B-8 §9.5 :668–670 нездійсненні проточки «не ріжуться і не рахуються» здійсненні теж не рахуються — фактів нема (R-12) ◔

2.9. 01_МЕЙН/КАРТА_МОДУЛІВ_01-09.md

№ Твердження Факт Вердикт
K-1 :5 235 модулів, 111 тестових 433 / 216 ✖
K-2 уся карта — перелік тек немає 8 тек, 149 модулів (1.2) ✖
K-3 :237 core/geometry.ts, :325 parsers/dxf/geometry.ts, :330 parsers/dxf/types.ts — описи чужим текстом без змін з 02.09 ✖
K-4 :87 ProductElement3DNode 715; :177 Detail3DPreview 3066 983; 3530 ✖
K-5 :15 стики 45° — Detail3DPreview.miterPlan, «thickening на кераміці» engines/miterAssembly.ts; підворот без вуса ✖
K-6 :230 useCostPrices «ніхто не викликає» 0 імпортерів ✔

2.10. Стартові, планові й агентські доки

№ Док:рядок — твердження Що в коді Вердикт
P-1 ПЛАН_І_СТАН.md:16–22 «стан на 01.09 (останнє оновлення)»: 1195, сервер 160, tsc 430 1856 / 15 у знімку [сторона ІТ] / 418 ✖
P-2 ПЛАН_І_СТАН.md:39–40 «кераміка — усе; кварцит — підворот прямо» підворот прямо на всіх матеріалах (29.09) ✖
P-3 ПЛАН_І_СТАН.md:58–59 черга: 45° у Viewer3D; П-14 зроблено 02.09 / вирішено 29.09 ✖
P-4 СТАРТ…:24–28 код у /home/claude/work/app, доки «пласко 75 файлів» пісочниця /tmp/final/vs-cad (ПАМ'ЯТЬ §3); доки — 20 тек ✖
P-5 СТАРТ…:48–54 web-app, 1195/1196, tsc 430, vite на 5240 vs-cad, 1856, 418, 7177/7188 ✖
P-6 СТАРТ…:292–293 надгробок verify_quantity.test.ts нема ✖
P-7 СТАРТ…:425 «index.html уже має translate="no"» index.html:2 — лише lang="uk" ✖
P-8 СТАРТ…:432 фантоми 6 + 4 6 + 2 ◔
P-9 СТАРТ…:577 «лупа … перевірені, працюють» лупу видалено цілком 03.09 ✖
P-10 ДЛЯ_НАСТУПНОГО_АГЕНТА.md:40 .vs3d — «робоче» модуля нема; рішення 03.09 «не відновлюємо» ✖
P-11 ДЛЯ_НАСТУПНОГО…:42 імпорт DXF/бланка — «робоче» кнопки сховані під адміна 28.09 (код є) ◔
P-12 ДЛЯ_НАСТУПНОГО…:43,45 «Viewer3D — борг», «кошторис П-14 — борг» закрито ✖
P-13 ДЛЯ_НАСТУПНОГО…:63 Архітектура «ще не в коді» workspaces/architecture/* + вкладки План/Розкладка/Відомість (useStore.ts:37,42) ✖
P-14 ДЛЯ_НАСТУПНОГО…:89–95 прибрати вшиті ціни і фолбек costPrice ?? bookPrice зроблено 25.08/03.09 ✖
P-15 ДЛЯ_НАСТУПНОГО…:107 перевірка через POST /api/cost/prices ціни — /api/prices (lib/api.ts) [сторона ІТ] ✖
P-16 ДЛЯ_НАСТУПНОГО…:97–100 довідники винести з браузера №241: quote/production на сервері ◔
P-17 ДЛЯ_НАСТУПНОГО Б-4 — мертві кандидати core/*, PlacementPropertiesPanel — досі 0 імпортерів ✔
P-18 README.md:10 КАРТА — «інвентар 235 модулів» 433 ✖
P-19 README.md:28 «Крок 0» — СТАРТ §0–0.1 ПАМ'ЯТЬ_ЛЕО, СТОУНИК, НЕСТИНГ, СПІЛЬНІ, 16_* у README не згадані жодного разу ✖
P-20 КАРТА_ПАПОК.md:13–26 структура тек немає 09_АУДИТ_02-09, 12_ВИРОБНИЦТВО_І_МЕС, 16_ДЖОВАННІ_CAD, «Глухий виріз» ✖
P-21 ДЛЯ_ВАНІ_КОНСТРУКТОР_СТАРТ.md:25 Studio — «старе ядро», 5173 Studio = vs-cad на OCCT (№261) ✖
P-22 ДЛЯ_ВАНІ…:26,33–35 VS CAD = web-app + патч кнопкою СТВОРИТИ_VS_CAD навпаки: web-app = vs-cad (№261) ✖
P-23 ПЛАН_VS_CAD_OCCT_30-09.md §2 «будівник 3D-тіл — своє у VS CAD» ядро в обох копіях, їде в GitLab (№261) ✖
P-24 СТАРТЕР_КОНСТРУКТОР.md «клік по stone → фраза → картка», «шість нових вкладок» вхід — подвійний клік по логотипу лише де cadEnabled() (App.tsx:343–344); вкладок CAD 8 (useStore.ts:40); у vs-cad dev — одразу «Замір» (main.tsx:54–58) ✖
P-25 14_…/ЗАДАЧІ_БОТІЧЕЛЛІ.md Б-002 «Активні» зроблено: domain/sideNaming.ts:189 lcutEdgeLabels + 2 тести ✖
P-26 14_…/02_КАРТА_ДЛЯ_БОТІЧЕЛЛІ.md:60 components/studio/StudioGate.tsx (код доступу) файла нема ✖
P-27 14_…/02_КАРТА_ДЛЯ_БОТІЧЕЛЛІ.md App.tsx 832 875 ✖
P-28 ЩО_ВИНОСИМО_З_VS3D.md:9–14 «код не змінено / відкочено» shell/workspaces.ts, shell/useCan.ts, workspaces/{vs3d,constructor,architecture}/index.tsx є, 0 імпортерів ◔
P-29 ЩО_ВИНОСИМО… «46 перевірок isAdminUnlocked у 12 файлах» 54 у 16 ◔
P-30 БОРГ_ДОВІДНИКИ_В_БРАУЗЕРІ.md:3–5 «нічого не змінювалось» №241 ✖
P-31 WORK_MANIFEST.md:43,53 записи в STABILIZATION_BUGS.md такого файла нема ✖
P-32 ПРАВИЛА_АДАПТИВНОГО_UI.md:166–167 поріг 2D у core/snapping.ts; 3D Viewer3D.tsx:303–304 жива копія components/2d/canvasUtils.ts:116; 3D — Viewer3D.tsx:336–337 (0,05 / π/12) ◔
P-33 12_…/04_ПЛАН_MES_ФУНДАМЕНТ_04-09.md:147,211 «усе в src/mes/ + вкладка, як Конструктор» mes/* є, MesTab нікуди не підключена (0 імпортерів) ◔
P-34 ORDER_REGISTRY_15-09.md «Studio/BUILDING: Зберегти на сервері» features/order-registry/RegistryDesk.tsx [сторона Бруно] ✔

2.11. 03_КРОМКИ/* (01.09) і 02_БАГИ_І_БОРГИ/ЗАМІРИ_12-10…

№ Твердження Що в коді Вердикт
E-1 ТУ §5 — 16 тестів materialRules.test.ts 16 ✔
E-2 ТУ §5 — «перевірки не підключені до інтерфейсу» підключено частково — Стоуник (checks.ts:23) ◔
E-3 МАТЕРІАЛ_І_ТОВЩИНИ: модалка 880 px, 11 тестів CreateProductModal.tsx:149; 11 ✔
E-4 ЛОГІКА_ОБРОБОК §4: edgeCuttersRadius 14 + 9 старих 15 + 9 ◔
E-5 ЛОГІКА_ОБРОБОК §5: розрізані деталі профіль не ріжуть (isSplit) закрито 02.09 ✖
E-6 ЛОГІКА_ОБРОБОК §4 «як організовані в 3D СЬОГОДНІ» — CSG у Studio на OCCT — тіла ядра (R-24) ◔
E-7 ЛОГІКА_ОБРОБОК §5: поля «кишеня» нема у domain/types.ts нема ✔
E-8 ЗАМІРИ_12-10: Стоуник-завіса є лише в Підборі StounikLoader3D імпортує лише Viewer3D.tsx ✔
E-9 ЗАМІРИ_12-10: прив'язка — useKernelAssembly.state, occtLoadInfo.state kernel/occt/workerClient.ts:160–161 ✔
E-10 ЗАМІРИ_12-10: прогрів (warm) не зроблено нема ✔

Разом у розділі 2 — 216 тверджень (порахував скриптом по рядках таблиць): ✔ 103 · ✖ 73 · ◔ 38 · ? 2. Найбільше розходжень (✖ + ◔): стартові й планові доки — 32 із 34, MANIFEST — 18 із 22, КАРТА_МОДУЛІВ — 5 із 6, АРХІТЕКТУРА — 16 із 29, доки Джованні — 10 із 16. Найточніші: НЕСТИНГ — 7 із 8 ✔, СТОУНИК — 19 із 23 ✔, ПАМ'ЯТЬ_ЛЕО — 36 із 49 ✔ (її карта «ядро / легасі», A-15…A-27, — 12 із 13 ✔).


3. Борги: стан за кодом

3.1. У коді закрито (або змінено), у доках — відкрито

Борг Де відкритий у доках Що в коді Стан
FG-12 «сторона-компенсатор із замком» РЕЄСТР_БАГІВ.md (статус «Відкрито»), СТАРТ §13 domain/sideLocks.ts:1–22 (04.09); підключено в Detail2DBlueprint.tsx:5, DimensionsTable.tsx:3, ElementSettingsModal.tsx:9; довідка HelpDialog.tsx:422–457 закрито в коді [ГІПОТЕЗА: прийняття кліком не записано]
№2 стики дерева → факти MANIFEST §4.2, BUGS Critical productionFacts.ts:337–380; сторож fireplaceEndToEnd.test.ts:230 «ВІДОМО» досі будує проєкт без products без змін з 02.09: у коді закрито, док і тест кажуть протилежне
№10 / SC-28 «45° — свіп, не CSG» MANIFEST §4.10, РЕЄСТР SC-28 CSG-клин (miterAssembly.ts:50) + тіла OCCT закрито іншим методом
№14 Viewer3D відстає MANIFEST §4.14, ПЛАН черга 2, ДЛЯ_НАСТУПНОГО А-0 02.09 + №242 (Підбір на ядрі) закрито
№15 / П-14 тип стику MANIFEST §4.15, ПЛАН черга 3, ДЛЯ_НАСТУПНОГО ProductEditorWorkspace.tsx:370–373 (Підворот — glued свідомо, 29.09) закрито рішенням, формулювання хибне
№16 / П-16 кут двох підворотів MANIFEST §4.16 MANIFEST 2.7 / БІЗНЕС §9.2 (29.09) закрито
№23 увігнутий кут між смугами MANIFEST §4.23 miterAssembly.ts:504 insideMiterCutter, attachmentShrink.ts:174 закрито (№199)
А-2 вшиті ціни і фолбек ДЛЯ_НАСТУПНОГО:89–95 ціни прибрано; estimate.ts:176–177 закрито
довідники в браузері БОРГ_ДОВІДНИКИ_В_БРАУЗЕРІ.md №241 (store/settingsSync.ts) закрито для quote/production
Б-002 Ботічеллі ЗАДАЧІ_БОТІЧЕЛЛІ «Активні» sideNaming.ts:189 + тести закрито
SC-35 мовчазне падіння «Завантажити JSON» РЕЄСТР «Відкрито» App.tsx:534 — повідомлення «файл пошкоджений або це не проєкт…» закрито [ФАКТ ◔]
SC-05 PIN за замовчуванням у коді РЕЄСТР «Відкрито» замок інтерфейсу — логін (№263); константа useSettingsStore.ts:44 лишилась без споживача змінилось
Б-Д1 дебаг-логи в розкрої BUGS Б-Д1 engines/geometry.ts — [CORNER-DEBUG]/[CUTOUT-DEBUG] немає; лишився components/forms/shapes/RectangleDesigner.tsx:14 майже закрито
Б-Д5 товщина в розкрої BUGS «мінімум — лише на сляб своєї товщини» попередження (packing.ts thicknessWarning; №267 — і КП лише попереджає) змінено рішенням власника
FG-08 втрата WebGL РЕЄСТР «Відкрито» utils/webglContextRecovery.ts + «3D зупинилось / Перезапустити 3D» (№274) частково
SC-20 «два 3D-рушії» РЕЄСТР обидва 3D малюють тіла одного ядра (A-15/A-16) змінилось
SC-18 tsc 249 РЕЄСТР 418 повних число застаріло

3.2. У доках закрито (або «працює»), у коді — ні

Твердження Де Що в коді Стан
Б-Д7 translate="no" («виправлено, чекає пушу»; «уже має») BUGS Б-Д7 :262, СТАРТ :425 index.html:2 лише lang="uk" відкрито (з 02.09)
підписи доповнень лише з EDGE_KIND_LABEL (інв. 2.31/2.51; П-3 02.09) MANIFEST, БІЗНЕС §9.1 quotePdf.ts:478,508, ApprovalOverview.tsx:198–199, combicut/plan.ts:180 відкрито
.vs3d «робоче» ДЛЯ_НАСТУПНОГО:40 модуля нема; «не відновлюємо» (03.09) док не оновлено
«лупа працює» СТАРТ:577 видалено док не оновлено
Б-Д6 імпорт без розкрою BUGS (відкрито) projectSlice.ts:122,565 loadWithoutPacking, підказки нема збігається (відкрито)
useKernelGeometry — робочий модуль ядра 02_КАРТА_ДЖОВАННІ:60, ПЛАН_VS_CAD §1 0 імпортерів мертвий
вкладка МЕС «як Конструктор» 04_ПЛАН_MES mes/MesTab.tsx не підключена мертва

3.3. Без змін з 02.09 (відкрито і в коді, і в доках — збігається)

[ФАКТ ✔] №8 шрифти Text з CDN (Detail3DPreview.tsx:608,687,705,745); №9 мертві core/*; №11 подвійний prod_; Б-Д3 'unknown' (domain/elementToDetail.ts:210); SC-19 дублі findPart/attached*; SC-21; SC-24 waterfall; SC-25 dominant; два максимуми NC300; проточки/решітка без фактів; DXF-тест C:/hhgh.


4. Терміни: доки проти коду

4.1. fold / thickening (інв. 2.31, 2.51: fold = Потовщення, thickening = Підворот)

Місце Що написано Узгоджено?
domain/ids.ts:53–56,80–84 EDGE_KIND_LABEL, attachmentLay: thickening → 'flat' джерело
components/ui/ProductEditorWorkspace.tsx:367–373 коментарі виправлені: «ПОТОВЩЕННЯ (код fold) — водоспад», «ПІДВОРОТ … площинна склейка» ✔ (з 02.09 виправлено)
ProductEditorWorkspace.tsx:376 «Нога … клеїться під 45°, як підворот» ✖ старе значення слова
utils/export/quotePdf.ts:478 ['thickening_', 'Потовщення'] — у бланку погодження обидва види — «Потовщення» ✖ (з 02.09 не змінено)
utils/export/quotePdf.ts:508 detail.thickening → 'Потовщення' (легасі-деталі) ✖
components/forms/import/ApprovalOverview.tsx:198–199 thickening → «Потовщення», fold → «Підворот» ✖ навхрест
components/ui/DimensionsTable.tsx літерали прибрано ✔ (з 02.09 виправлено)
нове: engines/combicut/plan.ts:121,156–157,180, types.ts:104,138 прапорець slopedFromThickening; сторони легасі-thickening (= Підворот) → 45°; повідомлення «Є смуги потовщення…» для edgeKind === 'thickening' ✖ суперечить 29.09 («підворот — без вуса», miterAssembly.ts:31–34) і назві партів (engines/geometry.ts:983 — EDGE_KIND_LABEL) [ГІПОТЕЗА]: на легасі-проєктах CombiCut пропонує 45° там, де клеїться Підворот
MANIFEST 2.54 :806–807 «Підворот — лише на керамограніті» ✖ суперечить 2.7 того ж файла
MANIFEST §4.15, ПЛАН черга 3, ДЛЯ_НАСТУПНОГО А-0 «тип стику потовщення … glued» ✖ старе значення (glued — це Підворот)
БІЗНЕС §2.2 таблиця доповнень ✔ (з 02.09 виправлено)
Стоуник topics.ts:227,234, leoTopics.ts:53–56 Потовщення — вертикальна, Підворот — під плитою ✔

4.2. Інші розбіжності слів

Що У доках У коді / UI Примітка
Документ для цеху «Послуги для виробництва» / «Кошторис» / «BOM» (ПАМ'ЯТЬ §4: «quoteCalc/BOM») вкладка «Послуги для виробництва», заголовок «… (BOM)» (EstimatePanel.tsx:198), текст «Кошторис рахує…» (:314), вкладка CAD «Послуги» (WorkspaceTabs.tsx:26) без змін з 02.09: три назви + четверта в CAD
«Комерційна пропозиція» / «КП» «КП» = PDF Прорахунку меню «Комерційна пропозиція» прибрано 03.09; «Сформувати КП» (QuotePanel.tsx:563) ✔ розв'язано
Назва продукту «Viyar Stone 3D» (README, БІЗНЕС, ДЛЯ_НАСТУПНОГО), «SlabCutPlanner 3D» (MANIFEST, WORK_MANIFEST), «Viyar Stone Studio»/«Studio» (ПАМ'ЯТЬ, СТОУНИК), «Viyar Stone CAD»/«VS CAD» (Джованні) VS3D у коді (workspaces/vs3d, vs3d.expertMode, ?workspace=vs3d), «Studio», «CAD», «Тестова Studio» (KernelBadge.tsx:33,41 — хоча №239: «тестова вона більше не є») одна копія коду з трьома режимами і п'ятьма назвами
Третій режим «Архітектура» / «Архітектор» (ДЛЯ_НАСТУПНОГО, ЩО_ВИНОСИМО) architectureMode, «BUILDING» (WorkspaceTabs.tsx:267, №262), ?workspace=architecture два слова
«Прод» «прод GitLab» (№262), «Продакшн сьогодні — Ocean (Бруно)» (ПАМ'ЯТЬ §3), «прод = MR !8» (ЗАМІРИ_12-10), Vercel як «публічне демо/MES» — три різні розгортання одним словом [сторона ІТ]
Верстат «Combicut» (DXF-профіль, Джованні, ДЛЯ_ВАНІ), «CombiCut» (вкладка, ПАМ'ЯТЬ) «Combicut» 84, «CombiCut» 51, «Combicat» 27 (каталог 1С, domain/viyarServiceCatalog.ts) три написання
Сляб/слеб доки — переважно «сляб» у components/constructor/stounik/App.tsx: «слеб» 150 збігів, «сляб» 113 без змін
Кромка/крайка/торець усі три «Крайка …» лишилось у словнику i18nStatic.ts:1316–1325… без змін
Опора/Нога обидва тип деталі «Опора», доповнення «Нога» без змін
PIN / вхід «після PIN» (СПІЛЬНІ, ПАМ'ЯТЬ, коментар SettingsSyncBar.tsx:5–6) компонент досі AdminPinButton, а це форма логіну застаріле слово
Ядро «легасі», «старий будівник», «не на OCCT» KernelName = 'occt' | 'legacy', плашка «старий будівник (порівняння)» узгоджено

Окремо: нові модулі Бруно (kernel/previewScheduler.ts, kernel/occt/nativeShapeGuard.ts, features/*) прокоментовані англійською — правило «українською» (ПАМ'ЯТЬ §2.1, Джованні №10) стосується агентів Лео; для коду Бруно правила в доках немає [ПИТАННЯ].


5. Що є в коді, але не описане в живих доках

Модуль / режим Що це (з коду) Де хоч якось згадано
Ядро: черга, воркер і кеші — kernel/previewScheduler.ts (68), kernel/assemblyPreview.ts (8), kernel/occt/{geometry.worker.ts, workerClient.ts, workerProtocol.ts} (304), assemblyCache.ts (158: 8 складань, 64 МіБ, ≤8 у черзі, ключ ≤512 КіБ — :63), profiledBaseCache.ts (126), nativeShapeGuard.ts (77: перевірка тіла + один запасний легасі-шлях), exactPartInput.ts, exactPartsCore.ts одна черга прев'ю на сторінку (старі ще не початі запити замінюються останнім, експорти — ні); кеш складання; кеш плити з профілями ПАМ'ЯТЬ §6 №275/277/278 одним рядком кожен; ЗАМІРИ_12-10; решта — журнал і лист Бруно (docs-extra, поза доками)
kernel/productKernel.ts (372) + components/3d/kernelSeam.ts 3D Підбір на ядрі: виріб → той самий драфт, що в редакторі; запасний шлях — легасі ПАМ'ЯТЬ §4/§6 рядком; у карті Джованні нема
components/3d/StounikLoader3D.tsx, utils/sceneActivity.ts, components/3d/GlProbe.tsx завіса «3D вантажиться / зупинилось» ПАМ'ЯТЬ №274, ЗАМІРИ_12-10; у СТОУНИК.md нема
engines/combicut/* (7 файлів, 1 948) + constructor/combicut/* (2, 813) робочий стіл CombiCut: сегменти → автомат → операції → XML/TXT Breton, симуляція, Pegasus-DXF ПАМ'ЯТЬ §5–7 абзацами; ні теми Стоуника, ні розділу довідки, ні опису в АРХІТЕКТУРА/БІЗНЕС
constructor/* після 04.09: assembly/* («Збірка 3D»), builder3d/*, measure/{measureClean, tape}.tsx, metal/{metalFit, frameProduct}, plywood/plywoodDraft, drawing/{metalSheet, plywoodSheet, sections}, toolbar.tsx конструктор каркаса, фанери, збірка, аркуші цеху СТАРТЕР_КОНСТРУКТОР описує версію 04.09; далі — журнал №220–254 і ПАМ'ЯТЬ рядками
domain/{sideLocks, cutoutSideDistances, cornerClamp, cutoutHole, metalJoints, metalHoles, metalCutList, plywood, plywoodElements, quoteServiceCodes, quoteGuards, architecture, localSlabCatalog}.ts замки сторін (FG-12), рулетки вирізу, підрізка кутів, отвір вирізу, стики/отвори/розкрій металу, фанера як сутність виробу, коди 1С за матеріалом, гард КП розкидано: аудит 02.09 §11 (зелені блоки), журнал, 04_ПРАВИЛА_ЦЕХУ_ДЛЯ_ЯДРА (метал); жодної таблиці в АРХІТЕКТУРА
engines/{apsExport, arSceneRegistry, assemblyPlan, metalGeometry, partsGlb, quoteLayoutSync, renderContract, mesPack, tileLayout, nestingScope}.ts експорти APS/GLB, контракт рендера, синхронізація прорахунку з розкроєм (П-7), тайли, розкрій лише каменю журнал; nestingScope — ПАМ'ЯТЬ №256 рядком
features/* (12 модулів): server-project (передача з PLM через #handoff=, /api/integration), order-registry (RegistryDesk, forkProject), object-link (?object_id= з ERP), cad-release, workspace-entry збереження в реєстр, відкриття з PLM/ERP нотатки Бруно ORDER_REGISTRY_15-09 / STUDIO_REGISTRY_IDENTITY_FIX; features/server-project/ServerSaveButton.tsx — однорядковий псевдонім RegistryDesk [сторона Бруно/ІТ]
lib/settingsTransport.ts (6) транспорт спільних налаштувань через реєстр MES ПАМ'ЯТЬ №244 рядком; у СПІЛЬНІ_НАЛАШТУВАННЯ нема
workspaces/architecture/* (BUILDING: план, розкладки, відомість) третя «дочка» workspaces/architecture/README.md у коді; ДЛЯ_НАСТУПНОГО каже «не в коді»
shell/capabilities.ts (140), shell/useCan.ts, shell/workspaces.ts, workspaces/{vs3d,constructor,architecture}/index.tsx «карта прав» і реєстр дочок мертві: 0 імпортерів у застосунку (knip L3 — unused; capabilities читають лише ці мертві файли і тест)
mes/* (7 модулів, 2 997) вкладка «Цех» (MES v0, 06.09): карта цеху, норми, симуляція не підключена (0 імпортерів MesTab); у mes/data/orders.ts — 5 полів customer з прізвищами клієнтів поруч із номерами замовлень (не цитую)
components/3d/{BacklightRig, SceneLighting, PlywoodNode, plywoodTextures, useSafeTextures, SafeEnvironment} світло/підсвітка, фанера в 3D, безпечні текстури журнал; SafeEnvironment.tsx — 0 імпортерів
components/ui/{CabinetSaveButton, CabinetSyncBadge, SideLockButton}, utils/{siteSlabTexture, slabPhotoFit} кабінет, замки, текстури слябів із сайту (ІТ 12.10) журнал / карта Ботічеллі / ПАМ'ЯТЬ №261
domain/projectMigrations.ts — CURRENT_PROJECT_FORMAT_VERSION = 3 (:34) версія формату проєкту (v3 — від ІТ 05.10) ПАМ'ЯТЬ №266 «JSON v3»; ЩО_ВИНОСИМО досі «формат .vs3d»
Вкладки «Приміщення», «3D Прев'ю», «Послуги для виробництва» — лише для адміна WorkspaceTabs.tsx:167,183,201 Стоунику відомо (topics.ts:363,458); MANIFEST 2.55 / БІЗНЕС 9.3 — ні
19 інтеграційних тестів ядра під CAD_PROFILED_BASE_NATIVE=1 нативна перевірка кешу плити ніде, крім журналу

[ФАКТ ✔] Підсумок за скриптом (добірка за назвою файла, тому генеричні імена на кшталт types, index, store дають хибні «згадки» — читати як оцінку): із 208 модулів, доданих після 02.09, 69 згадані лише в журналі, 2 — ніде (features/object-link/objectLink.ts, features/server-project/ServerSaveButton.tsx), решта — хоча б рядком у живому доці.


6. Застарілі доки — що в них неправда сьогодні

Документ (дата стану) Що неправда на 12.10
КАРТА_МОДУЛІВ_01-09.md (01.09) 235 модулів (433); немає 8 тек; три описи чужим текстом; розміри; «miterPlan у Detail3DPreview»
ПЛАН_І_СТАН.md («оновлено 01.09») гейти 1195/430; черга 2–3 виконана; «кварцит — підворот прямо»
СТАРТ_НАСТУПНОЇ_СЕСІЇ.md (23.08 + §0.1 01.09) контейнер /home/claude/work/*, «доки пласко», web-app, порт 5240, 1195/430, verify_quantity, «translate="no" уже є», «лупа працює». ПАМ'ЯТЬ_ЛЕО §9 (:302–303) досі шле сюди за «правилами повністю»
ДЛЯ_НАСТУПНОГО_АГЕНТА.md (01.09) .vs3d робоче; Viewer3D і П-14 — борги; Архітектура «не в коді»; задача А-2 вже виконана; перевірка через /api/cost/prices
README.md (01.09) порядок читання починається зі СТАРТ; нема ПАМ'ЯТЬ_ЛЕО, СТОУНИК, НЕСТИНГ, СПІЛЬНІ, 16_*; «235 модулів»
КАРТА_ПАПОК.md (07.09) нема тек 09_АУДИТ_02-09, 12_…, 16_…, «Глухий виріз»
АРХІТЕКТУРА_І_СТЕК.md (03.09) ні слова про OCCT/ядро/VS CAD/Стоуника/спільні налаштування; обсяг, розміри, вкладки, «лупа», «miterAssembly без тестів», «materialRules не імпортується», opencascade.js відсутній у таблиці стеку
MANIFEST_architecture_and_logic.md (01.09; 2.7 — 29.09) 2.54 суперечить 2.7; §3 таблиця дублів; §4 борги 2, 10, 14, 15, 16, 22, 23; §5.13; §6 miterPlan; нема інваріантів ядра
БІЗНЕС_ЛОГІКА.md (01.09; §2.2/§9 — 29.09) §0 «метал не розвивається»; §1.1 «прав немає»; нема CombiCut, фанери/металу як виробів, «площа з припуском — кромка по номіналу» (№250)
ОДНА_МАТЕМАТИКА_ДЕТАЛІ.md (03.09) §2 «що зараз: шість копій, три ножі» — зведено 25–28.09 (14 → 2 точки, аудит 02.09 §11); originalCornerPoints, buildComplexRectPoints видалено; блоку «стан» у документі нема. Карта Джованні посилається на нього як на чинний
00_СТАРТЕР_ДА_ВІНЧІ.md (07.09; п. 0 — 08.10) п. 6: /tmp/final/web-app, 1171/2, tsc 424
ДЛЯ_ВАНІ_КОНСТРУКТОР_СТАРТ.md (02.10/06.10) «Studio — старе ядро, 5173»; «VS CAD = web-app + патч»
16_ДЖОВАННІ_CAD/* (06–07.10) шлях 16_ДЖОВАННІ\; гейти 74/1751; карта ядра без 12 файлів; «еліпс — ламана 16»; useKernelGeometry
10_…/ПЛАН_VS_CAD_OCCT_30-09.md, СТАРТЕР_КОНСТРУКТОР.md (04.09) модель «копія + патч»; вхід через фразу; 6 вкладок
14_МАЙСТЕР_БОТІЧЕЛЛІ/* (07–08.09) StudioGate.tsx; Б-002 «активна»; гейт 1171
BUGS_AND_TECH_DEBT.md (19.08; Б-Д* — 20.08), РЕЄСТР_БАГІВ.md (24.08) розділ 3 — 17 позицій закрито/змінено без запису
БОРГ_ДОВІДНИКИ_В_БРАУЗЕРІ.md (24.08), ЩО_ВИНОСИМО_З_VS3D.md (03.09) «нічого не змінювалось» (№241); «код оболонки відкочено» (файли є, мертві)
03_КРОМКИ/* (01.09) лише легасі-CSG; isSplit; без OCCT-профілів і №273/№276
СТОУНИК.md, СПІЛЬНІ_НАЛАШТУВАННЯ.md (07–09.10) 66 тем, без cadOnly; «PIN»; «не гроші»; без транспорту MES
ПАМ'ЯТЬ_ЛЕО.md (вхідна точка) §2.5 (№241), §2.8 (патч), §3 (пуш 05.10, vitest 1719), §4 (PIN, «бандажі легасі», 66 тем), §5 (PIN) — свіжі §6–7 цим рядкам суперечать

7. Стан знахідок 02.09 у цій лінзі

Знахідка 02.09 (L4 §0, звіт §7) Стан 12.10 Адреса
1. Робота 23.08 і .vs3d відсутні, а доки кажуть «працює» змінилось: рішення 03.09 «не відновлюємо», лупу видалено; АРХІТЕКТУРА 2.0 це записала. Відкрито в доках: ДЛЯ_НАСТУПНОГО:40 (.vs3d), СТАРТ:577 (лупа), :425 (translate) BoardOverlays.tsx:210–216
2. Пріоритет ціни навхрест закрито в коді й доках estimate.ts:176–177; АРХІТЕКТУРА:165–166
3. Fold/thickening навхрест частково: БІЗНЕС §2.2, коментарі PEW, DimensionsTable — виправлено; бланк і огляд імпорту — ні; нове порушення в CombiCut quotePdf.ts:478,508; ApprovalOverview.tsx:198–199; combicut/plan.ts:156–157,180
4. materialRules не підключений; два максимуми NC300 змінилось: підключено лише в Стоуник; два максимуми лишились stounik/checks.ts:23; manufacturability.ts:29 / materialRules.ts:52
5. Проточки/решітка без фактів відкрито в коді; АРХІТЕКТУРА 2.9 тепер пише чесно; БІЗНЕС §9.5 двозначна R-12, B-8
6. Борг №2 закритий у коді, тест-сторож вводить в оману відкрито (без змін) fireplaceEndToEnd.test.ts:230; MANIFEST:888
7. Дзеркалення — дві умови, не три відкрито packing.ts:466–471; MANIFEST:47,565
8. Дубль textureGroupKey відкрито geometryUtils.ts:20, textureLayout.ts:37
9. index.html без translate="no" відкрито index.html:2
10. КАРТА/АРХІТЕКТУРА не знають miterAssembly; КАРТА описує 3 файли чужим текстом частково: АРХІТЕКТУРА 2.0/2.9 знають; КАРТА не оновлювалась; MANIFEST §6 досі miterPlan КАРТА:237,325,330; MANIFEST:961
§7: розміри файлів трьома числами погіршилось: тепер чотири джерела, жодне не збігається (1.3) —
§7: числа (тести, historySlice, manufacturability, i18nStatic) historySlice у АРХІТЕКТУРА виправлено; тести — 17 різних чисел; «11 правил» і «≈1670» без змін R-9, R-16, M-4
§7: три назви документа цеху; «Комерційна пропозиція» «КП» розв'язано (меню прибрано 03.09); «Послуги / BOM / Кошторис» + «Послуги» в CAD EstimatePanel.tsx:198,314
§7: борги закриті в коді, відкриті в доках (№2, А-2, №12, Б-Д5) відкрито в доках усі чотири розділ 3.1
§7: закриті в доках, відкриті в коді (Б-Д1, лупа, loadWithoutPacking, DXF-skip, Б-Д7) Б-Д1 майже закрито; лупа видалена; DXF-тест тепер «відоме падіння»; loadWithoutPacking і Б-Д7 — відкрито розділ 3
§7: MANIFEST §3 таблиця дублів відкрито (і застаріла більше: mapCorners/CutoutsToRect уже немає) M-9, M-10
§7: не описано (мобільний шар, демо без входу, board/*, буфер, міграції, technologistConsultMin, miterAssembly, __vs3dAssembly) частково закрито: усе записане рядком у таблиці АРХІТЕКТУРА 2.0 (03.09); ПАМ'ЯТЬ §4 описує мобільний шар АРХІТЕКТУРА:116–123
П-11 «тримати числа в одному місці» не зроблено 1.1
П-14 мертві файли / адреса порогу в ПРАВИЛА_АДАПТИВНОГО_UI файли досі мертві; адреса не виправлена P-32
П-19 miterAssembly без тестів закрито в коді (4 сторожі); у доках (АРХІТЕКТУРА:113, MANIFEST 2.54/§6) — ні R-10
П-20 README/WORK_MANIFEST посилаються не туди відкрито P-19, P-31

8. Ключові знахідки

  1. [ФАКТ ✔] Студія з 12.10 працює на ядрі OCCT, а головні доки про це не знають. Studio = vs-cad (№261), з src/kernel вона їде в GitLab. Водночас АРХІТЕКТУРА_І_СТЕК (03.09), MANIFEST (01.09/29.09), БІЗНЕС_ЛОГІКА, КАРТА_МОДУЛІВ, ПЛАН_І_СТАН, README, СТАРТ, ДЛЯ_НАСТУПНОГО і КАРТА_ПАПОК не згадують OCCT жодного разу (grep 0). Вісім тек — 149 модулів / 28 968 рядків — в інвентарі відсутні (розділ 1.2). Ядро описують лише ПАМ'ЯТЬ_ЛЕО §4/§6, НЕСТИНГ, 16_ДЖОВАННІ (06.10) і 10_* (30.09).
  2. [ФАКТ ◔] ПАМ'ЯТЬ_ЛЕО §2.8 «файли патчу різні в копіях, між копіями не копіювати» — неправда. Копії однакові, крім constructor/docs/DocsTab.tsx, а саме його в переліку §2.8 немає (хоча журнал №261 називає його точкою підміни). §6 того ж файла каже «web-app = vs-cad». Агент, який іде за §2.8, може не перенести правку в другу копію або «полагодити» Studio, прибравши з неї ядро (ПАМ'ЯТЬ_ЛЕО.md:41–46, ЖУРНАЛ…:10394–10396).
  3. [ФАКТ ✔] У живих доках 17 різних кількостей тестів, і жодна не збігається з фактом. Факт: 1856 ✓ / 2 відомі падіння / 19 пропущено (у src — 1841 ✓); тестів ядра 194 у 30 файлах. Найсвіжіше число в ПАМ'ЯТЬ_ЛЕО — 1719, у Джованні — 1751 і 74. 19 тестів, що вмикаються лише змінною CAD_PROFILED_BASE_NATIVE, не описані. tsc 418 збігається в ПАМ'ЯТЬ і в Джованні, а в MANIFEST, ПЛАН і стартері лишилися 430 / 424.
  4. [ФАКТ ✔] Стоуник: у довіднику 71 тема, а не 66 (stounik/topics.ts:72–593). Прапорець cadOnly не описаний. Усі 25 стабільних data-stounik на місці. Тема «Кнопки й пуш» (stounik/leoTopics.ts:146) і ПАМ'ЯТЬ §3 досі вчать пушити скриптами 05.10, які №261 заборонив. Для вкладки CombiCut теми немає.
  5. [ФАКТ ✔] Вхід адміна змінився (№263: логін і пароль), а доки все ще кажуть «PIN». Це ПАМ'ЯТЬ §4/§5, СПІЛЬНІ_НАЛАШТУВАННЯ, АРХІТЕКТУРА, РЕЄСТР SC-05, коментар SettingsSyncBar.tsx:5–6. Константа PIN лишилась у store/useSettingsStore.ts:44, але як замок нічим не використовується. Окремо: СПІЛЬНІ_НАЛАШТУВАННЯ пише «на сервер не їдуть гроші», а store/settingsSync.ts:65 відправляє весь прайс-бук разом із калібрувальними цінами.
  6. [ФАКТ ✔] Слова «Потовщення/Підворот» досі переплутані, і з'явилось нове місце. Бланк погодження підписує thickening_* як «Потовщення» (utils/export/quotePdf.ts:478,508), огляд імпорту — навхрест (ApprovalOverview.tsx:198–199). CombiCut називає thickening «смугою потовщення» і ставить її сторони під 45° (engines/combicut/plan.ts:156–157,180), хоча за правилом 29.09 підворот не має вуса (miterAssembly.ts:31–34). MANIFEST 2.54 суперечить 2.7 того ж файла.
  7. [ФАКТ ✔] 17 боргів у коді закрито або змінено, а в реєстрах вони записані як відкриті. Серед них FG-12 «замки сторін» (domain/sideLocks.ts, 04.09), №10, №14–16, №23 (29.09), А-2, довідники на сервері (№241), Б-002, SC-35. Навпаки, «виправлено» в доках, але немає в коді: translate="no" (index.html:2), підписи бланка, .vs3d (розділ 3).
  8. [ФАКТ ✔] Мертві скелети, які доки подають як робочі або «відкочені». Це shell/workspaces.ts, shell/useCan.ts, workspaces/{vs3d,constructor,architecture}/index.tsx, вкладка МЕС (mes/MesTab.tsx, mes/render.ts), kernel/useKernelGeometry.ts. Імпортерів у них 0; knip лінзи L3 показує те саме.
  9. [ФАКТ ✔] Персональні дані клієнтів у коді, який іде в репозиторій. У mes/data/orders.ts 5 полів customer з прізвищами поруч із номерами замовлень. Це суперечить правилу ПАМ'ЯТЬ §2.3 / Джованні №9. Значення не цитую.
  10. [ФАКТ ✔] Вхідні точки документації розірвані. Стартер і карта Джованні ведуть у теку 16_ДЖОВАННІ\, а вона зветься 16_ДЖОВАННІ_CAD. КАРТА_ПАПОК не знає 09_АУДИТ_02-09, 12_…, 16_…. README не знає ПАМ'ЯТЬ_ЛЕО. ПАМ'ЯТЬ §9 відсилає «за правилами повністю» до СТАРТ §0.1 зі станом на 23.08–01.09.
  11. [ФАКТ ✔] Більшість знахідок L4 від 02.09 досі відкриті. Це дзеркалення «три умови» проти двох (packing.ts:466–471), дубль textureGroupKey, тест-сторож боргу №2, три чужі описи в КАРТА, таблиця дублів MANIFEST §3, «11 правил» (насправді 14), «≈1670» (насправді 1823), факти проточок, translate. Закрито: пріоритет ціни, «Комерційна пропозиція», БІЗНЕС §2.2, тести miterAssembly, лупа, mirrorL.
  12. [ФАКТ ✔] Карта «що на ядрі, що легасі» в ПАМ'ЯТЬ_ЛЕО §4 загалом збігається з кодом: 12 із 13 пунктів (A-15…A-27). Розходиться один: «бандажі по дугах — легасі» суперечить №251 (kernel/productKernel.ts:332, ProductElement3DNode.tsx:374); та сама стара фраза стоїть у шапці productKernel.ts:20–22. Поруч, у §5: плашка ядра схована не лише на телефоні, а в Studio на всіх пристроях (KernelBadge.tsx:31).

9. Питання власнику

  1. Яка копія constructor/docs/DocsTab.tsx правильна, і чи живе ще поняття «патч»? Копії web-app і vs-cad сьогодні однакові, а кнопки СТВОРИТИ_VS_CAD.bat і тека vs-cad-patch описані як робочий механізм у ПАМ'ЯТЬ §2.8, ДЛЯ_ВАНІ і в доках Джованні. Не вирішую сам, бо це процес зведення (інв. 2.56).
  2. Де надалі живе опис архітектури? Варіанти: оновити АРХІТЕКТУРА/MANIFEST/КАРТА під ядро OCCT, або позначити їх «знімок до 30.09» і лишити ПАМ'ЯТЬ_ЛЕО єдиним живим описом.
  3. Що робити з прізвищами клієнтів у mes/data/orders.ts? Знеособити, чи не везти мертвий модуль МЕС у GitLab узагалі?
  4. CombiCut: чи правильно, що сторони з легасі-галочкою thickening (= Підворот) іде під 45°? Можливо, це навмисно, бо в старих проєктах ця галочка означала «потовщення», а можливо — помилка.
  5. FG-12 «замки сторін», №23 «увігнутий кут», П-16 — чи прийняті кліком? Якщо так, їх можна закрити в РЕЄСТР/MANIFEST однією ревізією разом із рештою розділу 3.1.
  6. Числа гейтів і тем Стоуника — тримати в одному місці (ПАМ'ЯТЬ §3) і в інших доках лише посилатися? Сюди ж питання, чи оновлювати тему «Кнопки й пуш» у Стоунику з §6, а не з §3.
  7. Б-Д7: повернути translate="no" в index.html? Це один рядок, питання повторюється з 02.09.
  8. Код Бруно з англійськими коментарями (kernel/previewScheduler.ts, features/*) — допустимо, чи правило «українською» поширюється й на нього?

10. Пропозиції (не рішення)

  1. [ПРОПОЗИЦІЯ] Банер на дев'яти застарілих доках (розділ 6): «знімок <дата>, до OCCT; актуальне — ПАМ'ЯТЬ_ЛЕО §4–7». Це дешевше за переписування і прибирає пастки для нового агента.
  2. [ПРОПОЗИЦІЯ] Генерований інвентар замість трьох ручних дерев (КАРТА_МОДУЛІВ, АРХІТЕКТУРА §2, карта Джованні §2): скрипт із шапок файлів плюс позначка «0 імпортерів» з knip. Скрипт порівняння з деревом 02.09 уже лежить у пісочниці лінзи (додаток).
  3. [ПРОПОЗИЦІЯ] Один рядок «гейт» з датою в ПАМ'ЯТЬ_ЛЕО §3, з окремим рядком про пропущені тести (19, CAD_PROFILED_BASE_NATIVE=1). Інші доки лише посилаються на нього.
  4. [ПРОПОЗИЦІЯ] Переписати §2.8: «копії однакові; різниця — заголовок, порт, назва пакета; перед і після зведення — побайтне порівняння src/». У §2.5 замінити «№241» на «див. §6».
  5. [ПРОПОЗИЦІЯ] Словник термінів у MANIFEST §0: fold/thickening, документ цеху, назва продукту і режимів, «прод» (три розгортання), написання верстата. Плюс сторож-тест «у utils/export і engines/combicut нема літералів Потовщення/Підворот».
  6. [ПРОПОЗИЦІЯ] Стоуник: сторож «кількість тем = число в СТОУНИК.md», тема про CombiCut, тема «Кнопки й пуш» — з ПАМ'ЯТЬ §6.
  7. [ПРОПОЗИЦІЯ] Одна ревізія реєстрів (РЕЄСТР_БАГІВ, BUGS_AND_TECH_DEBT, MANIFEST §4) за розділом 3: 17 позицій закрити або переформулювати, і переписати fireplaceEndToEnd.test.ts:230 на суми (як просить сам тест).
  8. [ПРОПОЗИЦІЯ] Мертві скелети (shell/workspaces, useCan, workspaces/*/index.tsx, mes/*, useKernelGeometry, SafeEnvironment): або шапка «не підключено станом на 12.10», або рішення про видалення через _ВИДАЛЕНЕ.

Додаток: що запускалось

L5 · Історія і стан знахідок
02.09 → 12.10, рішення власника, ризик втрати при зведенні · L5_ІСТОРІЯ_І_СТАН_ЗНАХІДОК.md

Лінза: що збудовано за шість тижнів після аудиту 02.09 і ким; що сталося з 12 знахідками, 10 пропозиціями і питаннями власнику 02.09 (перевірено в коді, а не в доках); які рішення власник ухвалив з 02.09 і чи вони в коді; чи не повторюється «втрата 22–23.08» при наступному зведенні; як ведуться журнали, бекапи, пуші й рішення.

Джерела. 02_БАГИ_І_БОРГИ/ЖУРНАЛ_ДЕБАГІНГУ.md (записи №84–№278, рядки 1763–10913; межа аудиту — №85, 02.09), 01_МЕЙН/ЖУРНАЛ_АГЕНТІВ.md, 01_МЕЙН/ПАМ'ЯТЬ_ЛЕО.md (§2, §5–§7), 14_МАЙСТЕР_БОТІЧЕЛЛІ/*, 16_ДЖОВАННІ_CAD/*, 02_БАГИ_І_БОРГИ/{АУДИТ_СТУДІЇ_24-09, ДІАГНОЗ_25-09_СТИКИ_П_ОВАЛ, ЗАМІРИ_12-10_ШВИДКІСТЬ_І_СТОУНИК, BUGS_AND_TECH_DEBT, РЕЄСТР_БАГІВ}.md, 07_ІТ_І_ДЕПЛОЙ/{ДЛЯ_БРУНО_08-10 §16–17, ВІД_БРУНО_12-10_CAD_257_258.txt}, 01_МЕЙН/{ORDER_REGISTRY_15-09, STUDIO_REGISTRY_IDENTITY_FIX, КУРС_07-09, MANIFEST_architecture_and_logic}.md, docs-extra/ЗВІТ-ДЛЯ-ЛЕО-20261012.txt; аудит 02.09 — 00_ЗВІТ (з §11 «Дописи агентів»), 01_ПИТАННЯ, L5_АРХІВ_ІСТОРІЯ (шаблон).

Код. /tmp/final/vs-cad/src — робоча копія (= диск 12.10, 666 файлів). /tmp/final/studio-merge/src — знімок «MR !8» (635 файлів). Для довідки: vs-cad-warm (проба прогріву ядра), web-app-merge (main ІТ 12.10, без ядра), server-push (сервер ІТ + вставки №264), /tmp/final/zvirka_bruno.json (SHA256 файлів після №261–№265). Адреси нижче — відносно src/, якщо не сказано інше.

Перевірки. grep/читання з адресами; власні скрипти в /tmp/final/audit1310/probe-L5/: tree_diff.sh (діф двох дерев із підрахунком рядків), sha_vs_manifest.py (звірка з SHA 12.10), journal_parse.py (розбір журналу на записи, дати, тижні), edge_rules.py (профілі кромок без правила грошей). Ворота ведучого (gates/) — прочитані, не дублювались: tsc 418, vitest 1856 passed / 2 failed / 19 skipped (217 файлів), eslint 564 errors / 45 warnings.

Позначки. [ФАКТ ✔] — перевірив сам (скрипт/grep/ворота); [ФАКТ ◔] — прочитано в коді чи журналі з адресою; [ГІПОТЕЗА]; [ПИТАННЯ] — вирішує власник. Рішень у звіті немає; пропозиції — окремим блоком наприкінці.

Межі. Живий продукт не клікав. Диска власника (web-app, _БЕКАПИ, gilab\*-скрипти, vs-cad-patch) не бачив — лише описи в журналі. server/, Keycloak, 1С/WMS/Orders, Python-MES і Ocean/Vercel Бруно — [сторона ІТ], не оцінювались.


0. Головне за дванадцять рядків

  1. [ФАКТ ✔] За 40 днів після аудиту (03.09–12.10) — 196 записів журналу (№86–№278 + відкат №96 + 7 «Б-» записів); код виріс 343 → 666 файлів, 88 543 → 146 898 рядків; нові теки kernel, constructor, stounik, features, shell, workspaces, stand — 204 файли / 32 623 рядки. Майже весь код — одна лінія (Мікеланджело → Да Вінчі → Лео); Бруно — пакетами через рев'ю; ІТ — через чотири зведення.
  2. [ФАКТ ✔] 12 знахідок 02.09: закрито 4 (2, 3, 8 — кодом; 1 — рішенням власника), змінилось/частково 2 (5, 12), відкрито 6 (4, 6, 7, 9, 10, 11). 10 пропозицій: зроблено 1, майже 1, частково 4, не зроблено 4.
  3. [ФАКТ ✔] 54 питання 02.09 (у файлі їх 54, у журналі №85 і HTML написано «46»): відповідь/зроблено — 13, частково — 8, без відповіді — 29, не перевірено — 4.
  4. [ФАКТ ✔] «Втрата 22–23.08» у коді не повторилась: робоча копія містить усе, що є в знімку MR !8 (0 файлів лише в знімку; 285 «зниклих» рядків — це рядки, переписані №270–№278; поза src/ — лише 2 рядки коментаря в server/src/settings.js). Але 44 файли (+4 358 / −285 рядків) — лише на диску і чекають наступного пушу.
  5. [ФАКТ ✔] Знімок «MR !8» у пісочниці вже містить №267–№269 (components/ui/QuotePanel.tsx:562, utils/siteSlabTexture.ts:45, constructor/geometry.ts:22), хоча журнал і ПАМ'ЯТЬ кажуть «№267–№274 у MR !8 нема». Отже виміряна різниця — це №270–№278; точний стан GitLab-гілки з пісочниці не встановити.
  6. [ФАКТ ◔] За 6 тижнів зафіксовано щонайменше 5 майже-втрат того самого класу, що 22–23.08 — усі спіймані звірками (№226, №233, №244, №261 двічі). Механізм ризику живий, запобіжник теж.
  7. [ФАКТ ✔] «Дві копії» на диску (web-app = vs-cad, крім назви/порту/1 файла) — тепер це одна програма у двох теках: кожна правка №260–№278 робилась «в обидві копії»; правило ПАМ'ЯТЬ §2.8 про «різні файли патчу» застаріло з №261.
  8. [ФАКТ ✔] Сторож межі ядра coreBoundary.test.ts червоний 5+ тижнів через один рядок engines/shapeBuilder.ts:2, який №96 прибрав, а відкат №96 повернув; записи журналу з 06.09 щоразу пишуть «+2 відомі старі».
  9. [ФАКТ ◔] Рішення власника з 02.09 (≈35) живуть у журналі й ПАМ'ЯТЬ_ЛЕО §5; MANIFEST заморожений на 2.60 (01.09), а 2.54 тепер суперечить коду; живі доки (README, ПЛАН_І_СТАН, СТАРТ_НАСТУПНОЇ_СЕСІЇ, ДЛЯ_НАСТУПНОГО_АГЕНТА, КАРТА_МОДУЛІВ) — без жодної дати після 01.09; реєстри боргів — 19.08/24.08; §11 аудиту — до 05.10.
  10. [ФАКТ ◔] Шість рішень переграні протягом тижнів (КП при різній товщині; PIN → логін; кромка на зайнятій стороні; VS CAD окремо → Studio на OCCT; «worker після презентації» → того ж дня; оболонка №96 → відкат → мовчки в коді).
  11. [ФАКТ ◔] Клієнтський бланк погодження досі підписує Підворот як «Потовщення» (utils/export/quotePdf.ts:477, :508) — питання З-1 від 02.09 без відповіді.
  12. [ФАКТ ✔] Лінії помічників майже не працювали: Ботічеллі — одна задача (Б-002, 07.09); Джованні — заведений 06.10, жодної сесії, його К-003 зробив Лео (№234); ЖУРНАЛ_АГЕНТІВ після 06.10 не вівся.

1. Хронологія 02.09 → 12.10

1.0. Обсяг по тижнях [ФАКТ ✔ journal_parse.py]

Тиждень Записів Номери Головне Хто, крім Лео
36: 03–06.09 36 №86–№120 (+№96-відкат) відповіді на аудит; «пасхалка» Studio; Конструктор v1; Лабораторія; MES v0 → окремо —
37: 07–13.09 66 №121–№184 (+Б-153…Б-170) Б-002; вікно деталі і стики з парою сторін; вирізи в панелі; світло; пакет для МЕС; довідка Ботічеллі (Б-002), Бруно (ТЗ пакета МЕС)
38: 14–20.09 2 №185–№186 плитки MES/Лабораторії прибрано; зведення з main ІТ Бруно (реєстр замовлень → PLM, 15.09), Сфорца (PLM)
39: 21–27.09 3 №187–№189 зведення з ІТ 23.09; кабінет; «одна математика» кроки 1–5 ІТ (гроші в копійках)
40: 28.09–04.10 36 №190–№225 одна математика закрита; підворот; VS CAD на OCCT (сім'ї 1–4); DXF під верстати; фокус-група; метал/фанера/збірка/замір Бруно (рецензія ядра і DXF)
41: 05–11.10 33 №226–№258 зведення з ІТ 05.10; Studio на ядрі; Стоуник; спільні налаштування; Підбір/нестинг/креслення з ядра; фанера-шари; CombiCut Бруно (адаптери MES, Ocean, Gemini)
42: 12.10 20 №259–№278 MR !8; прод лише Studio; вхід адміна; налаштування на сервері ІТ; швидкість (№271–№278) Бруно (кеш, worker, кеш плити)

Тиші 14–27.09 у коді Studio відповідає курс 07.09 (КУРС_07-09.md: Supabase, PLM у хмарі, зв'язка Studio↔PLM) — ця робота йшла в PLM (Сфорца) і в реєстрі Бруно, не в журналі Studio.

1.1. 03–06.09: відповіді на аудит і «пасхалки» [ФАКТ ◔ журнал]

1.2. 07–13.09: редактор деталі, стики, МЕС-пакет [ФАКТ ◔ журнал]

1.3. 14–27.09: тихі два тижні Studio

1.4. 28.09–04.10: геометрія закрита, VS CAD на OCCT, верстати, конструктор

1.5. 05–11.10: Studio на ядрі, Стоуник, Підбір/нестинг/креслення з ядра, CombiCut

1.6. 12.10: MR !8 і швидкість

1.7. Хто що робив [ФАКТ ◔]

Хто Що з 02.09 Як потрапило в код
Лео (Мікеланджело → Да Вінчі з 07.09 → «Лео») усі записи №86–№278: геометрія, ядро OCCT, Стоуник, конструктор, CombiCut, зведення, доки, скрипти пушу напряму; приймає чуже
Бруно (GPT) ТЗ пакета МЕС (№179); реєстр замовлень і PLM-передача (15.09); рецензії ядра й DXF (№203, №216); адаптери, Ocean (№244–№245); Gemini (№248); кеш складання, worker, кеш плити (№275, №277, №278); Vercel-деплої; доставка CombiCut (лише у своїй копії) пакети for-leo → рев'ю за хешами → ручне злиття
ІТ (Рома та ін.) замовлення в копійках, INV_PENDING; текстури з сайту, наявність, міграція v3; object_id-вхід з ERP, slabPhotoFit зведення №186, №187, №226, №261
Ботічеллі Б-002 (07.09) — і все прийнято №127
Джованні нічого: лінія заведена 06.10, «перша сесія ще не стартувала»; К-003 зробив Лео (№234) —
Веспуччі кейси і зводи правил 06_ОБУЧАЛОЧКА (7 кейсів на 07.09) як джерело правил, не код
Сфорца PLM (11.09+); правку PLM-меню №265 зробив Лео окреме репо PLM

1.8. Ворота і обсяг: 02.09 → 12.10 [ФАКТ ✔]

02.09 (аудит) 12.10 (ворота ведучого / мій підрахунок)
tsc 430 418 (найнижче за весь час; 03.09 — 428, 07.09 — 424, 25.09 — 422, 06.10 — 418)
vitest 1203 passed / 1 failed 1856 / 2 failed / 19 skipped; червоні: coreBoundary і DXF C:/hhgh
eslint 482 errors 564 errors / 45 warnings
файли src/ 343 / 88 543 рядки 666 / 146 898
тест-файли 103 216 (26 754 рядки)

2. Стан 12 знахідок аудиту 02.09 (перевірено в коді)

# Знахідка 02.09 Стан 13.10 Доказ / адреса
1 Робота 22–23.08 з'їдена зведенням 26.08; лупа падає закрито рішенням власника (А-1, 03.09: «не повертаємо»; лупу видалено №87). Хвости — див. нижче components/2d/board/BoardOverlays.tsx:210 — надгробок лупи [ФАКТ ✔]
2 Дві математики розкрою (старий будівник прямокутника, старий шлях стику Г) закрито (№90 «один ніж», №190 будівник прямокутника видалено) engines/geometry.ts:2242 гілка allJointsOf; :2458, :2516 — «СТИК НЕ ВДАВСЯ» замість старих гілок; buildComplexRectPoints — 0 визначень [ФАКТ ✔]
3 Ліва Г: 3D ліва, розкрій права закрито (№89, 03.09) domain/elementToDetail.ts:112–113 (mirrorL → 'BL'/'BR'); сторож domain/__tests__/mirrorAndSides.test.ts (10 ✓ у воротах) [ФАКТ ✔]
4 38 із 70 профілів кромок — нуль у кошторисі відкрито, тепер 39 із 70 edge_rules.py: 32 варіанти правил на 70 профілів; domain/serviceMapping.ts:313–349 мовчки відкидає факт; EdgeProfileDef.operations читає лише модалка components/ui/EdgeProfileSettingsModal.tsx:256…438 [ФАКТ ✔]
5 Три математики грошей, пріоритет навхрест змінилось: КП видалена (№86); правило ціни однакове за змістом, але дві копії; замовлення в ERP з ручними цінами не блокується engines/estimate.ts:176–179 і engines/quoteCalc.ts:191–194; components/ui/QuoteOrderCard.tsx:150 (disabled без перевірки manual), QuotePanel.tsx:1138 [ФАКТ ◔]
6 «Групувати деталі» нічого не робить; 726 мертвих рядків відкрито; мертвий блок ще й правили (№260 у TexturedPart) components/3d/Viewer3D.tsx:1778 groups (TS6133), :1840–1845 кнопка, :1098 AssemblyGroup (TS6133); мертвий ланцюг :664–1404 ≈741 рядок [ФАКТ ✔ tsc+grep]
7 Проточки й решітка зливу — лише картинка відкрито в грошах; змінилось у 3D (тіла в ядрі, №203) 0 згадок surfaceGrooves/drainGrate у engines/{productionFacts,estimate,quoteCalc}.ts, utils/export/quotePdf.ts; отвір зливу engines/geometry.ts:1481 drainRadius = 0 [ФАКТ ✔]
8 Кутовий стик ігнорується при довільному закрито (№90) domain/joints.ts:421–427 allJointsOf; сторож engines/__tests__/contourBaseline.test.ts:166 «три шматки» [ФАКТ ✔]
9 Подвійний рахунок кутів доповнень і дуги з «Обробкою торців» відкрито (за §11 28–29.09 — «угода з цехом, чекає власника») engines/productionFacts.ts:419 (кути з дерева) + :433–437 (пропуск лише isProduct, який = головна: domain/elementToDetail.ts:237); дуга — у метражі сторін (engines/geometryUtils.ts:409–434) і окремо productionFacts.ts:451–470 [ФАКТ ◔]
10 Три моделі стику; AssemblyConnection без читачів; Прорахунок «за формою» відкрито engines/quoteCalc.ts:528–534 (Г→1, П→2); components/assembly/AssemblyConnectionsPanel.tsx:15 — єдиний читач assembly.connections [ФАКТ ✔]
11 Борг №2 закритий у коді, а тест і доки кажуть «відкритий» відкрито (як було) код: engines/productionFacts.ts:337–372; тест «ВІДОМО…» engines/__tests__/fireplaceEndToEnd.test.ts:229–233 на проєкті без products (:188–192); MANIFEST:872, BUGS_AND_TECH_DEBT.md:28 [ФАКТ ✔]
12 ≈1 600 рядків мертвих файлів + ≈1 000 у живих; 6+3 зайві залежності змінилось: прибрано рішеннями КП, лупу, buildComplexRectPoints, originalCornerPoints, старі гілки Г/П; решта на місці; materialRules.ts тепер читає Стоуник 0 імпортерів: core/{geometry,snapping}.ts, components/2d/PlacementPropertiesPanel.tsx, components/ui/useCostPrices.ts, utils/slabTexture.ts, engines/sketchupExport.ts (разом 888 р.); stounik/checks.ts:23 ← materialRules; konva, react-konva, clsx, tailwind-merge — 0 імпортів, у package.json [ФАКТ ✔]

Хвости знахідки 1, які рішення А-1 зняло разом із пакетом, але не окремим словом [ФАКТ ◔]:

Блоки §11 аудиту, що розійшлися з кодом: під знахідкою 3 стоїть «ВИПРАВЛЕНО 03.09 · у коді нічого не змінено, mirrorL так само не доїжджає» — того ж дня №89 це змінив, блок не оновлено [ФАКТ ✔].


3. Стан 10 пропозицій аудиту 02.09

# Пропозиція 02.09 Стан Доказ
1 Повернути 22–23.08 + тристороння звірка після кожного зведення частково: повернення відхилено (А-1); звірка — на практиці (№226, №228, №261: три точки, хеші, СТОП у скрипті), інваріантом не записана MANIFEST 2.56 (01.09) — останній; [ФАКТ ◔]
2 Одна правда про контур деталі + mirrorL + сторож майже зроблено (№89, №189, №190) domain/baseContour.ts:35, 95, 166; joints.jointAnchorPoints зі спільного контуру; сторожі contourBaseline (20 ✓), mathUnify25-09 (8 ✓); лишився П «на бік» (innerCutSide) поза спільним контуром (§11, 28.09)
3 Один шлях різу стиків зроблено (№90) engines/geometry.ts:2242; сторож «три шматки» є, сторожа «сума площ = ціла з увігнутим радіусом» не знайшов [ФАКТ ✔ grep]
4 Одна мапа «профіль → послуга» + тест на всі id не зроблено 39/70 без правила (edge_rules.py)
5 Одне правило ціни в одній функції; заборона замовлення з ручними цінами частково правило одне, функцій дві (estimate.ts:176, quoteCalc.ts:191); у замовленні перевірки нема (QuoteOrderCard.tsx:150)
6 П-14 — одне джерело miterJointFor змінилось: розходження зняте рішенням 29.09 (обидва «склейка»), але джерел два engines/miterAssembly.ts:31–34 і окреме дерево рішень components/ui/ProductEditorWorkspace.tsx:361–387 («3D з цим згодне» — коментар, не виклик)
7 Дедуплікація фактів; reflexCornerIds у гнутих не зроблено productionFacts.ts:419/433; domain/radiusElement.ts:242 досі чекає прапорець reflex, який ніхто не ставить (0 присвоєнь поза тестами)
8 sawOvercut у пакері або сторож з referenceData; «крива» за формою не зроблено domain/defaults.ts:29 (70, без UI); пакер знає лише в detectConflicts (engines/packing.ts:1935); isCurvedTextureGroup за кількістю точок (:587–590)
9 Мертве — пакетом або шапки «не імпортується» частково: прибрано лише рішеннями по інших темах; шапок нема; залежності на місці див. знахідку 12
10 Одна ревізія доків; числа в одному місці; словник не зроблено живі доки без дат після 01.09; словника нема; MANIFEST — 01.09

4. 54 питання власнику 02.09 [ФАКТ ◔, де «відкрито» — перевірено в коді]

У файлі 01_ПИТАННЯ_ВЛАСНИКУ_02-09.md — 54 пронумеровані питання (А-1…З-10) і 5 позначок ІТ; у журналі №85 і в HTML — «46 питань».

Група Відповідь/зроблено Частково/змінилось Без відповіді (у коді як було) Не перевірено
А (2) А-1 (03.09) А-2 (звірка — практика, не правило) — —
Б (8) Б-1, Б-2 (№90, №89), Б-7 (№95), Б-8 (№94) — Б-3 sawOvercut; Б-4 «крива»; Б-5 дзеркалення (packing.ts:466–471, дві умови); Б-6 textureLayout.ts:37 без tg: —
В (8) В-1 (29.09: підворот — склейка), В-2 (№90), В-5 (09.09 №172: «кромка диктує примикання») В-8 (план стиків спільний з №197/№242; питання товщин не закрите) В-3 AssemblyConnection; В-4 стики в Прорахунку; В-6 легасі «пишемо ОБА» (ProductEditorWorkspace.tsx:1935); В-7 #2 (elementToDetail.ts:190–202, власний розбір слота) —
Г (4) — — Г-1 профілі без правил; Г-2 «Стандарт» = tech_chamfer (engines/edgeCutters.ts:441); Г-3 подвійна дуга Г-4
Д (7) — Д-4 (отвір із радіусом у розкрої — №189; периметр у фактах гострий productionFacts.ts:479–481); Д-5 (ядро підтвердило проникнення стінок мийки, №205; рішення нема); Д-7 (materialRules — лише Стоуник; два максимуми NC300: manufacturability.ts:29 проти materialRules.ts:52) Д-1 проточки/решітка; Д-2 гнутий на увігнутому; Д-3 матеріал проєкту (productionFacts.ts:502, quoteCalc.ts:473); Д-6 відступи 50 (manufacturability.ts:89) —
Е (8) Е-1, Е-2 (03.09), Е-4 (№217) Е-3 (09.10: «площа з припуском»; «головні чи всі парти» не зведено — productionFacts.ts:247, 573) Е-5 замовлення з ручними; Е-6 svc:surface_processing без коду (quoteCalc.ts:365); Е-7 автозапит 400 мс (usePrices1c.ts:52) Е-8
Ж (7) Ж-6 (знято в самому аудиті) Ж-2 (Стоуник читає 2 функції) Ж-1 мертве; Ж-3 useCostPrices; Ж-4 arGen.ts, buildFotozona.ts у src/; Ж-7 анімація в Viewer3D.tsx:396, 1995 Ж-5 (eng.traineddata: у корені vs-cad нема, у main ІТ — є)
З (10) З-10 (03.09/28.09: «старі проєкти не бережемо») З-9 (сторожі є: pidvorot29-09 27 ✓, miterInsetLeg; MANIFEST 2.54 не оновлено) З-1 бланк «Потовщення» (quotePdf.ts:477, 508); З-2 словник; З-3 закриті борги в доках; З-4 числа; З-6 архівні ТЗ «курс»; З-7 мобільна/PWA в доках; З-8 translate="no" З-5
Разом 54 13 8 29 4

І (сторона ІТ) — не оцінювалось; з видимого: DXF-фікстура не покладена (тест червоний), AuthGate «бекенда нема → без входу» лишається гіпотезою 24.09 [сторона ІТ].


5. Рішення власника з 02.09 — реєстр

# Дата Рішення (коротко; цитата — де є) Джерело Стан у коді
1 03.09 22–23.08 не повертаємо; формат .vs3d — «на майбутнє» аудит А-1 виконано; але Стоуник згадує .vs3d (stounik/saveState.ts:29)
2 03.09 «лупу видаляй і зразу» №87 виконано (BoardOverlays.tsx:210)
3 03.09 ручна ціна — лише калібрування; КП — видалити №86 виконано (estimate.ts:176); замовлення з ручними не стримується
4 03.09 дзеркало Г — «я тобі довіряю, роби» №89 виконано (elementToDetail.ts:112)
5 03.09 лишаються тільки довільні стики; прораховані проєкти не бережемо №90 виконано (joints.ts:421)
6 03.09 «ми мали лише обговорювати» (оболонка дочок) №96-відкат відкочено, але shell/* у коді; карта прав не підключена: can() — 0 викликів, isAdminUnlocked читають 13 екранних файлів (24.09 — 11; нові — SettingsSyncBar, Stounik) [ФАКТ ✔]
7 06.09 MES — окрема система, не вкладка №108 виконано
8 09.09 пароль Studio прибрати, вхід подвійним кліком №165 12.10 у прод-збірці подвійного кліку нема (№262)
9 09.09 «кромка диктує примикання» (переграє 01.09) №172 виконано (attachStraight у 8 файлах)
10 11.09 «Приміщення» під щиток №184 виконано (WorkspaceTabs.tsx:201)
11 16.09 плитки MES/Лабораторії — «з коду також прибери» №185 виконано (StudioHome.tsx:222)
12 25.09 «не захардкоджуємо, а виправляємо те, що зроблено не так» №189 виконано (domain/cutoutHole.ts, domain/cornerClamp.ts)
13 28.09 «закривай»; імпорт DXF і бланка — «поки хоронимо» №190 виконано (FormsPanel.tsx:1600–1607 під щитком)
14 29.09 підворот — горизонтальна смуга; без кромки — вус 45° №197–№198 виконано (miterAssembly.ts:31–34); MANIFEST 2.7 оновлено, 2.54 — ні
15 30.09 VS CAD на OCCT окремою копією; «це має бути CAD, а не студія» №201, №207 переграно 05.10/12.10: прод = Studio на OCCT, CAD — під прапорцем
16 01.10 П-2: КП не формувати при різній товщині №212 переграно 12.10 (№267 — лише попередження, QuotePanel.tsx:562)
17 01.10 П-4: мін. радіус кута вирізу 15 з обробкою; П-7 прорахунок за розкроєм №212, №214 виконано (manufacturability.ts:98, 128; engines/quoteLayoutSync.ts)
18 05.10 Studio на новому ядрі — на сервер і в GitLab №228 виконано через MR !8 (№261)
19 05.10 на доповненнях — не більше 40 мм №231 виконано (EdgeAdditionModal.tsx:61)
20 07.10 у бланк — обидві половинки стику №238 виконано (quotePdf.ts:1017; сторож approvalJointSplit.test.ts)
21 08.10 PIN один, без ролей («лишай той PIN, потім допиляємо») ПАМ'ЯТЬ §5 переграно 12.10 (№263: логін і пароль; старе поле PIN лишилось у сторі без читачів — store/useSettingsStore.ts:44)
22 08.10 налаштування прорахунку/послуг — на сервері, «змінилось у всіх» №241, №264 виконано в клієнті (store/settingsSync.ts); сервер ІТ — лише в MR !8
23 08–09.10 візії «Лео у Стоунику», «Рельєф і CAM» — без «го» ПАМ'ЯТЬ §5 коду під візією нема (окремі кроки №243, №248 зроблені на прохання)
24 09.10 старий припуск на дугах — правити для всіх, збережені не берегти №247 виконано
25 09.10 площа — з припуском, кромка — по номіналу №250 кромка: engines/geometryUtils.ts:409–434; площа — не перевірено
26 09.10 фанера — шари; каркас на ребро під підклад №252 виконано (domain/plywood.ts)
27 10.10 фанера й метал — не в розкрої каменю №256 виконано (engines/nestingScope.ts:2)
28 10.10 CombiCut — окремий стіл; у проді — через Pegasus №255, ПАМ'ЯТЬ §5 вкладка є; на проді GitLab CAD/CombiCut вимкнені (№262)
29 11.10 тисячі пробілом усюди №258 виконано (lib/money.ts:22)
30 12.10 зводимо лише Studio, CAD ведемо разом, виокремимо пізніше №261 виконано (kernel/config.ts:70)
31 12.10 на прод GitLab — без CAD і переходу через логотип №262 виконано (shell/__tests__/studioOnly.test.ts)
32 12.10 «ядро у фоновий потік — після презентації» №271 переграно того ж дня («складай і дай поклацати») → №277
33 12.10 «9 с після правки кромки — вирішити, а не вписати у звіт» №276 виконано (перевірене віднімання в kernel/occt/occtBuilder.ts)
34 12.10 прогрів ядра (проба Б) — чекає «го» ПАМ'ЯТЬ §7 лише в пісочниці vs-cad-warm/src/main.tsx:60–65 [ФАКТ ✔]

6. Ризик втрати при зведенні

6.1. Де живе код 12.10 [ФАКТ ◔ журнал + ФАКТ ✔ пісочниця]

  1. Диск: web-app (Studio) і vs-cad — однаковий код, крім назви/порту/DocsTab.tsx (факт брифу); ще vs-cad-patch (останній синк — №233, 06.10).
  2. GitLab: main ІТ (наше — до №225, гілка 01–03.10) і MR !8 merge/zvedennia-12-10 (№226–№266, Studio на OCCT; за ЗАМІРИ_12-10 — «те, що зараз на проді»).
  3. Vercel Бруно (mes-1-seven, з VITE_CAD=1) — збирається з його знімків нашого диска плюс його власні зміни: CombiCutDelivery, CRM-кнопка, BASE_URL фото. CombiCutDelivery у нашому коді — 0 збігів [ФАКТ ✔ grep]. Ocean — статична копія, стара.
  4. Пісочниця: vs-cad, studio-merge, vs-cad-warm (прогрів — лише тут), web-app-merge (main ІТ), server-push (сервер ІТ + 13 рядків вставок /api/settings).

6.2. Робоча копія ↔ знімок MR !8: що показав скрипт [ФАКТ ✔ tree_diff.sh]

Файлів Рядків
лише в робочій копії 31 3 317 (з них тести — 2 009)
змінені 13 +1 041 / −285
лише в знімку MR !8 0 —

Поза src/: index.html, package.json, vite.config.ts — лише назва/порт (так задумано, №261); server/src/settings.js — 2 рядки коментаря (у знімку — про вхід адміна №263, у vs-cad — старе «PIN»).

6.3. Що з цього — №267–№278 [ФАКТ ✔ шапки файлів + журнал]

№ Нові файли (рядків) Змінені
№270 constructor/merge/panelFit.ts + тест (208) constructor/geometry.ts (+20/−2), constructor/merge/MergeTab.tsx (+143/−18)
№271 components/3d/useOwnedGeometries.ts, kernel/__tests__/useKernelAssemblyDelay.test.tsx (117) components/3d/SceneLighting.tsx (+64/−8), components/ui/Detail3DPreview.tsx (+90/−33), kernel/useKernelAssembly.ts (+45/−6)
№272, №273, №276, №278 kernel/__tests__/occtArcTools.test.ts (112) kernel/occt/occtBuilder.ts (+540/−36)
№274 StounikLoader3D.tsx, stounikLoader.css, тест, utils/sceneActivity.ts (284) Viewer3D.tsx (+54/−1), useSafeTextures.ts (+5), kernel/productKernel.ts (+10/−5)
№275 (Бруно) kernel/occt/assemblyCache.ts + тест (361) kernel/occt/index.ts (+22/−3)
№277 (Бруно) worker, черга, exactPartsCore, exactPartInput + 5 тестів (1 155) kernel/exactParts.ts (+17/−160 — винесено в exactPartsCore), kernel/cutOutlines.ts, kernel/useExactOutlines.ts
№278 (Бруно + Лео) profiledBaseCache.ts, nativeShapeGuard.ts + 6 тестових файлів (1 080) occtBuilder.ts

6.4. Що є в MR !8 і нема в робочій копії

  1. server/src/index.js ІТ (main 12.10 + 3 вставки) — живе лише в скрипті пушу / MR; на диску web-app/server/src/index.js — старий (за №264 — 554 рядки різниці з main ІТ). Наступне зведення, якщо візьме сервер з диска, загубить маршрути /api/settings; від цього страхують SERVER_ALLOW і звірка хешу index.js у скрипті [ФАКТ ◔ №264].
  2. Коментар у server/src/settings.js (2 рядки) — є в web-app/MR, нема у vs-cad [ФАКТ ✔].
  3. Більше нічого в src/ [ФАКТ ✔].

6.5. Майже-втрати за 6 тижнів (усі спіймані) [ФАКТ ◔ журнал]

6.6. «Дві копії» web-app = vs-cad: що це означає для процесу


7. Процесні спостереження (не пропозиції)

  1. Журнал — справжнє джерело правди. 196 записів за 40 днів, майже всі з «запит власника → корінь → зроблено → перевірка (tsc/vitest/build) → бекап → обидві копії». Пропуски нумерації: №159, №167–№170 (замість них «Б-159», «Б-168…170» — префікс «Б-» водночас означає записи Ботічеллі); №150–№172 — без дат у заголовках [ФАКТ ✔].
  2. Відкрите більше не живе в реєстрах. Шапка журналу каже «BUGS_AND_TECH_DEBT → що болить ЗАРАЗ», але BUGS_AND_TECH_DEBT.md — стан 19.08, РЕЄСТР_БАГІВ.md — «Оновлено 24.08»; відкрите тепер — у ПАМ'ЯТЬ_ЛЕО §7 і в рядках «Не зроблено / далі» записів [ФАКТ ✔].
  3. Рішення не стають інваріантами. MANIFEST: «Оновлено 01.09», останній інваріант 2.60; після 02.09 змінено лише 2.7 (29.09). 2.54 («підворот — вус на керамограніті», «увігнуті кути не чіпаються») суперечить miterAssembly.ts:31–34 і №199. Рішення власника тепер — у ПАМ'ЯТЬ_ЛЕО §5 (≈15 пунктів) і в тексті записів [ФАКТ ✔].
  4. Аудит 02.09 як живий документ працював до 05.10. Блоки §11 — 07.09…05.10; №227–№278 (Підбір/нестинг/креслення з ядра, CombiCut, налаштування на сервері, прод лише Studio, швидкість) не описані; блок під знахідкою 3 застарів того ж дня [ФАКТ ✔].
  5. Бекапи — систематично: _БЕКАПИ\<дата>_<назва>_до_правок\{web-app,vs-cad} перед кожною правкою (у пісочниці bk/ — 9 тек для №270–№278); на пристрої нічого не видаляється — лише _ВИДАЛЕНЕ\<дата> [ФАКТ ◔].
  6. Пуш — кнопкою власника, і скрипт став розумнішим: .bat (06–08.09) → консольні скрипти v2…v11 (01–03.10) → два скрипти 05.10 (не запушені, замінені) → один скрипт 12.10 зі звіркою хешів main, SERVER_ALLOW, СТОП при дрейфі, маніфестом SHA. Тристороння звірка робиться при кожному описаному в журналі зведенні з ІТ (№186, №226, №228, №261), але після злиття «робоча тека = результат файл у файл» звіряє не скрипт, а людина (сьогодні — ведучий аудиту) [ФАКТ ◔].
  7. Червоне стало фоном. «+2 відомі старі» у кожному записі з 06.09; пропозицію 24.09 «один рядок — і coreBoundary позеленіє» не виконано; будь-який третій червоний ховатиметься в «відомих» [ФАКТ ✔ ворота].
  8. Мертвий код і далі правлять: TexturedPart (мертвий ланцюг Viewer3D) — №260; shell/capabilities.ts (0 робочих імпортерів) — №262 [ФАКТ ✔].
  9. Чужий код заходить через рев'ю за хешами (Б-002, пакети Бруно №244/№248/№275/№277/№278, зведення ІТ) — з упійманими конфліктами політик (?arcs у worker Бруно, №277). Підпис у файлах — лише в коді Лео.
  10. Агентська «майстерня» звелась до однієї лінії. Ботічеллі — 1 задача; у ЗАДАЧІ_БОТІЧЕЛЛІ Б-002 «здано (чекає кліку)», у ЗАЙНЯТІ_ФАЙЛИ — «прийнято №127» (статуси розійшлись); Джованні — 0 сесій; ЖУРНАЛ_АГЕНТІВ — останній запис Лео 06.10, у Бруно розділу нема [ФАКТ ✔].
  11. Рішення переграються швидко і чесно записуються (§5: №15, №16, №21, №32), але в «правилах» (MANIFEST, БІЗНЕС_ЛОГІКА) лишається перша версія.
  12. Числа в самому аудиті 02.09 розійшлись: 46 питань (журнал №85, HTML) проти 54 у файлі питань.

Стан знахідок L5 02.09 у цій лінзі (§0 L5_АРХІВ_ІСТОРІЯ)

# Знахідка L5 02.09 Стан 13.10 Адреса / №
1 Робота 21–23.08 відсутня, лупа падає на проді закрито рішенням (А-1, №87); 5 хвостів лишились §2 «Хвости знахідки 1»
2 Робота ІТ 27.08/01.09 у коді є так і є; далі ще 4 зведення без втрат (№186, №187, №226, №261) журнал
3 pricing.ts — «труп», не виконано закрито (№86) файлів нема [ФАКТ ✔]
4 Мертве на місці; PlacementPropertiesPanel правлять відкрито; тепер правлять ще й TexturedPart (№260) Viewer3D.tsx:664–1404
5 Доки 01.09 кажуть «.vs3d робоче» відкрито ДЛЯ_НАСТУПНОГО_АГЕНТА.md:40; stounik/saveState.ts:29
6 Борг №2 доведений тестом без products відкрито fireplaceEndToEnd.test.ts:188–192, 229–233
7 «Діма»/«15 рефакторингів» в архіві нема; DXF-тест — з машини прототипу як було; тест червоний ворота
8 Вісім старих гілок П-форми закрито (№90) engines/geometry.ts:2516
9 Два правила про кромку на зайнятій стороні суперечать закрито новим правилом 09.09 (№172) attachStraight
10 CORE §3.3 / §5.2 / §7.2 не реалізовано §5.2 закрито (№95, geometry.ts:2029); dominant — лише тип (domain/types.ts:283); розгортки нема; big.js нема; round2 без isFinite (engines/quoteCalc.ts:107) —

Ключові знахідки

  1. [ФАКТ ✔] 44 файли (+4 358 / −285 рядків, №270–№278; плюс за доками №267–№269) — лише на диску, не в GitLab; серед них ядро у фоновому потоці і два кеші (код Бруно); 61 % нових рядків — тести. — probe-L5/tree_diff.sh, §6.2–6.3.
  2. [ФАКТ ✔] Знімок «MR !8» уже містить №267–№269 — розходиться з журналом/ПАМ'ЯТЬ («№267–№274 у MR !8 нема»). — components/ui/QuotePanel.tsx:562, utils/siteSlabTexture.ts:45, constructor/geometry.ts:22.
  3. [ФАКТ ✔] Втрати з MR !8 у робочій копії нема, крім 2 рядків коментаря server/src/settings.js; серверний index.js ІТ з маршрутами налаштувань живе лише в скрипті/MR, а на диску лежить старий (554 рядки різниці). — §6.4.
  4. [ФАКТ ✔] Знахідки 02.09: 4 закрито, 2 змінились, 6 відкриті — відкриті: профілі кромок без грошей (39/70, domain/serviceMapping.ts:313–349), «Групувати деталі» (components/3d/Viewer3D.tsx:1778, 1840), проточки/решітка поза грошима, подвійні кути/дуга (engines/productionFacts.ts:419, 433), стики «за формою» (engines/quoteCalc.ts:528–534), борг №2 у тесті й доках.
  5. [ФАКТ ✔] 29 із 54 питань 02.09 без відповіді, код по них такий, як був. — §4.
  6. [ФАКТ ◔] Бланк погодження підписує Підворот «Потовщенням» (клієнтський документ). — utils/export/quotePdf.ts:477, 508 (порівняй domain/ids.ts EDGE_KIND_LABEL).
  7. [ФАКТ ◔] Хвіст 23.08 у грошах/розкрої: після відкриття проєкту запас на гнутий акрил — 30 % замість 20 %. — store/projectHelpers.ts:115 vs store/slices/packingSlice.ts:91.
  8. [ФАКТ ✔] Сторож межі ядра червоний 5+ тижнів через рядок, який повернув відкат №96. — engines/shapeBuilder.ts:2; __tests__/coreBoundary.test.ts:69.
  9. [ФАКТ ✔] Карта прав не підключена, хоча її двічі правили (№96, №262): can() — 0 викликів, isAdminUnlocked читають 13 екранних файлів (24.09 — 11). Старе поле PIN лишилось у сторі без читачів. — shell/capabilities.ts, store/useSettingsStore.ts:44.
  10. [ФАКТ ◔] «Дві копії» на диску — одна програма у двох теках; дрейф уже почався (DocsTab.tsx, коментар settings.js); правило ПАМ'ЯТЬ §2.8 застаріло. — §6.6.
  11. [ФАКТ ✔] Рішення власника (≈35) не дійшли до MANIFEST (2.60 від 01.09; 2.54 суперечить engines/miterAssembly.ts:31–34); живі доки без дат після 01.09; реєстри боргів — 19.08/24.08. — §7.
  12. [ФАКТ ✔] Майстерня — одна лінія: Ботічеллі 1 задача, Джованні 0 сесій, ЖУРНАЛ_АГЕНТІВ після 06.10 мовчить; код Бруно в файлах без підпису. — §1.7, §7.

Питання власнику

  1. [ПИТАННЯ] Пакет №267–№278 (44+ файли, ядро у фоновому потоці, кеші Бруно) — коли і як іде в GitLab: окремою гілкою поверх MR !8 до того, як ІТ зіллють MR !8 і підуть далі? Від відповіді залежить, чи не повториться 22–23.08.
  2. [ПИТАННЯ] Друга тека web-app — лишаємо дзеркалом (і подвоюємо кожну правку) чи працюємо в одній vs-cad (прод-Studio вже збирається з неї прапорцем)? І яка з двох версій DocsTab.tsx правильна?
  3. [ПИТАННЯ] Хвости 02.09, що бачить клієнт або цех: «Потовщення» замість «Підворот» у бланку; запас на гнутий акрил після відкриття; DXF-тест і сторож ядра, що червоні тижнями — правимо (кожне — кілька рядків) чи «так і задумано»?
  4. [ПИТАННЯ] 29 питань 02.09 без відповіді (Б-3…Б-6, В-3/В-4/В-6/В-7, Г-1…Г-3, Д-1…Д-3/Д-6, Е-5…Е-7, Ж-1/Ж-3/Ж-4/Ж-7, З-1…З-4/З-6…З-8) — пройти пакетом чи закрити як «живемо так»?
  5. [ПИТАННЯ] Де живуть рішення: журнал + ПАМ'ЯТЬ_ЛЕО (як зараз) чи MANIFEST лишається «джерелом істини» і його треба дописати з 03.09 по 12.10?
  6. [ПИТАННЯ] Помічники: лінії Ботічеллі і Джованні — живі (тоді хто й коли дає задачі) чи згорнути, щоб доки не обіцяли того, чого нема?

Пропозиції (не рішення)


Додаток: що запускалось

L6 · Гроші
Два рушії, факти, коди 1С, спільні налаштування, зонди · L6_ГРОШІ.md

Що. Код /tmp/final/vs-cad/src (VS CAD + Studio, ?mode=studio; той самий код, що в web-app) станом на 12.10.2026 вечір. Лінза: що код робить із кількостями й цінами — кошторис («Послуги для виробництва / BOM»), прорахунок (КП для клієнта), PDF, замовлення в ERP, спільні налаштування, метраж кромок. Порівняння — з аудитом 02.09 (docs/09_АУДИТ_02-09/L6_ГРОШІ.md, знахідки 4, 5, 7, 9, 10 і блоки «ВИПРАВЛЕНО» в 00_ЗВІТ…, питання Е-1…Е-8).

Як. Читання коду з адресами; grep; зонди у власній копії /tmp/final/audit1310/probe-L6 (синтетичні проєкти через ті самі функції, якими працює редактор: buildProductFromSession → getAllProjectDetails → explodeDetails → extractProductionFacts → computeEstimate / quoteItemsFromProject + autoQuoteServices → computeQuoteCalc), прогін 25 тестових файлів грошей. Оригінальне дерево не змінювалось. Ядро OCCT у зондах не вантажилось (гроші його не використовують).

Позначки. [ФАКТ ✔] — перевірено самим запуском/grep/зондом; [ФАКТ ◔] — прочитано в коді з адресою; [ГІПОТЕЗА] — правдоподібно без прямого доказу; [ПИТАННЯ] — вирішує власник. Рішень немає; пропозиції — окремим блоком наприкінці. Адреси — відносно src/. Гроші — у форматі «1 000 000».

Межі. server/, lib/api.ts, auth/Keycloak, клієнти 1С/Orders/WMS, MES Бруно — [сторона ІТ], не оцінювались: що бекенд робить із рядками замовлення, як перевіряє ціни й версії налаштувань — не перевірено. Живий браузер/1С не відкривались — числа грошей у зондах умовні (усім кодам однакова ціна 100 ₴ за одиницю), щоб порівнювати кількості й маршрути, а не прайс.


1. Карта рушіїв грошей сьогодні

1.0. Зведена таблиця

02.09 було три математики, 03.09 «Комерційну пропозицію» (engines/pricing.ts) видалено [ФАКТ ✔ grep: файлу немає, імпортів 0]. Сьогодні два рушії, але в одного з них з'явились нові споживачі.

(a) Кошторис «Послуги для виробництва (BOM)» (b) Прорахунок «Прорахунок для клієнта»
Рушій engines/estimate.ts engines/quoteCalc.ts + domain/quoteCalc.ts + domain/quoteServiceCodes.ts + domain/quote1cCatalog.ts
Звідки кількості факти виробництва engines/productionFacts.ts → таблиця правил domain/serviceMapping.ts (+ domain/viyarMapping.ts, вимкнена в коробці) власна математика: quoteItemsFromProject (Σ part.area усіх партів деталі, quoteCalc.ts:574-657), autoQuoteServices (:451-554); спільне з фактами лише jointLengthMm і позначки part.radiusElement
Ядро OCCT не використовується (полігони JS) не використовується
Звідки ціни 1С за externalId через usePrices1c; ручна з serviceCatalog[].price — лише в калібруванні (estimate.ts:176-179) 1С за кодом: ручний codes1c → вбудована таблиця за матеріалом документа (quoteCalc.ts:207-216); ручна з quotePriceBook — лише в калібруванні (:191-194)
Де видно вкладка «Послуги для виробництва» (components/ui/EstimatePanel.tsx); паспорт деталі (DetailPassportModal.tsx) вкладка «Прорахунок» (QuotePanel.tsx), PDF КП + бланк погодження (utils/export/quotePdf.ts), картка замовлення (QuoteOrderCard.tsx)
Хто бачить Studio: вкладка — лише після входу адміна (components/WorkspaceTabs.tsx:183-197); паспорт деталі з цінами — будь-хто (правий клік по деталі в 3D редактора, Detail3DPreview.tsx:1246, 1276 → ProductEditorWorkspace.tsx:1722-1742, без перевірки прав; карта прав і так дає detailPassport менеджеру, shell/capabilities.ts:83). VS CAD (режим конструктора): вкладка «Послуги» без входу (WorkspaceTabs.tsx:26, main.tsx:54-57); на проді GitLab CAD закритий (№262, kernel/config.ts:41-42) усі (WorkspaceTabs.tsx:216-229); шестерня «прайс і коди» — лише адмін (QuotePanel.tsx:584-592)
Куди ще йдуть кількості у замовлення ERP (production, QuotePanel.tsx:288-304 → QuoteOrderCard.tsx:163, лише рядки з кодом, без цін); черга й пакет МЕС (EstimatePanel.tsx:123-161); техкарта (constructor/docs/DocsTab.tsx:63) замовлення ERP (lines, total, QuoteOrderCard.tsx:158-167)
Збереження налаштування — useSettingsStore (localStorage, v7) + сервер (№241); результат не зберігається документ — project.quoteCalc; налаштування — те саме

Вхід адміна [ФАКТ ◔]: з 12.10 (№263) — логін і пароль, перевірка відбитком PBKDF2 у браузері (shell/adminLogin.ts, components/ui/AdminPinButton.tsx:54-66); поле PIN у сторі лишилось і ніде не перевіряється (store/useSettingsStore.ts:41-44, 70, 279, 361 — значень тут не наводжу). Це замок інтерфейсу: сервер налаштувань пускає будь-кого з сесією, звуження — змінна SETTINGS_EDITORS [сторона ІТ].

1a. Кошторис — маршрут

EstimatePanel.tsx:59-65   computeEstimate(project, parts, {details, catalog, rules, manualPricing})   (прохід 1, кількості)
  estimate.ts:209          extractProductionFacts(project, parts, {details})
  estimate.ts:210          resolveMapping(facts, rules, project.projectMaterial)     ← матеріал ПРОЄКТУ
EstimatePanel.tsx:67-70   estimatePriceRequests (сума кількостей за кодом) → usePrices1c(…, quoteCalc.contragentId)
EstimatePanel.tsx:73-79   computeEstimate(…, {erpPrices, manualPricing})                (прохід 2, гроші)
  estimate.ts:164-196      buildLine: qty round3 → unit = manual ?? erp ?? 0 → total round2(qty·unit)

Паспорт деталі — той самий рушій розрізом по деталі (estimate.ts:293-330), але без прапорця калібрування (DetailPassportModal.tsx:58-83). Внутрішній рахунок ERP — той самий кошторис без цін (QuotePanel.tsx:288-304), рядки з externalId → production.

1b. Прорахунок — маршрут

QuotePanel.tsx:248-251  quoteItemsFromProject(details, parts)   площа = Σ part.area УСІХ партів деталі (quoteCalc.ts:581)
QuotePanel.tsx:256-259  autoQuoteServices(project, details, parts): радіуси, joint_leg, joint_flat (за ФОРМОЮ), texture_match, sink_cutout
QuotePanel.tsx:268-273  syncLinkedItems — позиції «з розкрою» оновлюються самі (П-7, №214)
QuotePanel.tsx:317-341  матеріал = слеби за артикулом (півлиста 0,5; матеріал замовника не йде)
QuotePanel.tsx:358-364  матеріал і виробник замкнуті на project.slabs[0]
QuotePanel.tsx:379-398  computeQuoteCalc ×2 (коди → usePrices1c → ціни)
  quoteCalc.ts:177-206   push: unit = manual ?? erp ?? 0; qty round3 (показ), sum round2(qty·unit) з НЕокругленої qty
QuoteOrderCard.tsx:153-183  api.createOrder({lines, production, total, …})  [сторона ІТ]

1c. Ціни 1С і кеш

usePrices1c — один хук для обох рушіїв [ФАКТ ◔]: автозапит з паузою 400 мс (usePrices1c.ts:52), кешу в localStorage немає, без контрагента питає загальний прайс (PRICES_REQUIRE_CUSTOMER = false, :49), при помилці 1С попередні ціни лишаються (:160-166 не скидає prices) — так задумано і записано в БІЗНЕС §4.7. Кошторис питає код один раз із сумою кількостей (estimate.ts:150-157); прорахунок — кожним рядком окремо (QuotePanel.tsx:388-393), і два рядки з однаковим кодом (стінова панель ≥12 і <12 мм мають одну номенклатуру, domain/quote1cCatalog.ts:83-84) дають два запити з різною кількістю на один код [ФАКТ ◔]; яку ціну поверне 1С при знижці від обсягу — [ГІПОТЕЗА / сторона ІТ]. useCostPrices.ts досі ніким не викликається [ФАКТ ✔ grep].

1d. Налаштування: браузер + сервер (№241, №264)

useSettingsStore (ключ slabcutplanner-settings-storage, версія 7) персистить весь стан без partialize (store/useSettingsStore.ts:134-370), у тому числі прапорець калібрування. Спільні документи на сервері [ФАКТ ✔ зонд, розділ 3.2]: quote = {quotePriceBook, minSideMm}, production = {serviceCatalog, mappingOverrides, customRules} (store/settingsSync.ts:63-67). Тягнеться при старті, поверненні у вкладку і раз на 10 хв (:162-170); новіша версія на сервері застосовується тихо (:105); запис — з версією, 409 → «Взяти його / Перезаписати своєю» (:123-150).


2. Стан знахідок 02.09 у цій лінзі

# Знахідка 02.09 Стан 13.10 Адреса / доказ
1 Три математики живі (КП pricing.ts доступна всім) закрито 03.09 (№86): КП видалено; лишилось два рушії файлу engines/pricing.ts немає [ФАКТ ✔]
2 Пріоритет ручна/1С навхрест; у кошторисі ручна без перемикача закрито в обох рушіях: manual ?? erp ?? 0, ручна лише в калібруванні. Залишок: паспорт деталі не передає прапорець → у калібруванні паспорт показує ціну 1С, а кошторис — ручну estimate.ts:176-179, quoteCalc.ts:191-194; DetailPassportModal.tsx:60-64, 76-81; зонд [9]: кошторис/прорахунок вимк. → 100 erp, увімк. → 50 manual (+1С 100 поряд); паспорт → 100 erp [ФАКТ ✔]
3 «Ціна з пам'яті браузера» в кошторисі закрито як тихий канал (поза калібруванням ручних цін не видно). Змінилось: у калібруванні ручні ціни тепер можуть прийти із сервера від іншої людини (розділ 3.2) settingsSync.ts:63-86; зонд L6_shared_out.txt [ФАКТ ✔]
4 Одна площа — два числа (detail_area лише головних партів vs усі парти) змінилось: для виробів підворот — окрема деталь і йде в обидва числа; розходження тепер через чашу мийки і метал (зонд), а деталі фанери — лише в «Загальній площі» бланка (quotePdf.ts:944, за кодом); легасі-смуги (імпорт) — як було зонд: кошторис 8,871 м², прорахунок 8,044, PDF 8,871 (розділ 4) [ФАКТ ✔]
5 38 із 70 профілів кромок без правила; повна мапа EdgeProfileDef.operations мертва відкрито: 39 із 70 (32 акрилові + tech_chamfer, zr_12, l_20, lv_40, lv_40_inv, o_40, u_40; 02.09 рахувало 31 акрилову). operations тепер не читає ніхто (єдиний споживач pricing.ts видалений), лише редагується в модалці domain/defaults.ts:30-133; EdgeProfileSettingsModal.tsx:256-297, 397-438; зонд [0] [ФАКТ ✔]
6 Радіусні коди: кошторис за матеріалом, прорахунок — завжди керамограніт закрито 02.10 (№217): таблиці збігаються код у код (298634…298648), складний радіус на кварциті 298648 в обох domain/quoteServiceCodes.ts:50-54 = domain/services.ts:100-122; зонд: обидва документи 298644 × 1 [ФАКТ ✔]
7 Множники «верх/низ» у трьох таблицях (×1 / ×2 / ×2) змінилось: ×2 у defaults.ts тепер мертві; розбіжність ×1 (вбудовані) проти ×2 (ВіярПро) лишилась serviceMapping.ts:116, 118 проти viyarMapping.ts:61-62, 89-90 [ФАКТ ◔]
8 Дублі id правил ВіярПро відкрито: viyar:edge_45:ceramic, viyar:edge_45:quartz viyarMapping.ts:63/105, 91/122; тест унікальності лише для вбудованих (serviceMapping.test.ts:45-48) [ФАКТ ✔]
9 Замовлення в ERP з ручними (калібрувальними) цінами відкрито (Е-5); плюс прапорець калібрування живе в браузері після виходу адміна QuoteOrderCard.tsx:147-167 (перевірки source==='manual' немає, grep порожньо) [ФАКТ ✔]
10 svc:surface_processing без коду 1С відкрито (Е-6); у файлах послуг власника акрилу немає взагалі quoteCalc.ts:365 (code1c без вбудованої таблиці) [ФАКТ ◔]
11 Проточки й решітка зливу не в грошах відкрито: жоден рушій не читає surfaceGrooves/drainGrate; у прорахунку radiator_grooves/water_grooves — лише руками і без кодів grep по `engines/estimate
12 Подвійний рахунок у фактах: кути на доповненнях; дуга з галочкою відкрито обидва зонд: радіус на стіновій панелі — 2 факти corner (productionFacts.ts:419-448); дуга R100 — 78,5 + 78,5 мм у сторонах + 157 мм окремим edge:Стандарт (:457-474) [ФАКТ ✔]
13 joint_flat за формою, а не за швами відкрито; тест закріплює поведінку quoteCalc.ts:528-534; quoteCalc.test.ts:565-573; зонд P4 (розділ 4) [ФАКТ ✔]
14 Матеріал проєкту замість матеріалу виробу (радіуси) змінилось: спосіб і запас гнутого елемента — з матеріалу виробу (вшиваються при збереженні виробу, ProductEditorWorkspace.tsx:345, 811, 941, 953); коди й матеріальні правила — і далі з матеріалу проєкту/першого слеба estimate.ts:207, productionFacts.ts:502-509 (фолбек), QuotePanel.tsx:358-364; Product.material у грошах не читається (domain/types.ts:307) [ФАКТ ◔]
15 Радіусні правила невидимі на екрані прив'язок відкрито і ширше: тепер ще й 4 види фанерних фактів ServiceMappingPanel.tsx:28-32 [ФАКТ ◔]
16 Тест fireplaceEndToEnd «ВІДОМО: стики дерева не доходять» відкрито — тест досі стверджує 0, бо будує проєкт без products engines/__tests__/fireplaceEndToEnd.test.ts:188-192, 230-242 [ФАКТ ◔]
17 Дрібне: QuotePanel вижимка «0.00 м²» (TS2339), round2 без NaN-захисту, сума з неокругленої qty відкрито все QuotePanel.tsx:729 (у gates/tsc.txt 2 × TS2339); quoteCalc.ts:107; :198, :203 [ФАКТ ✔]
18 useCostPrices нікому не потрібен відкрито (мертвий файл) grep [ФАКТ ✔]
Е-3 Яка площа «фактична» частково вирішено власником 09.10 (№250): площа з припуском («підуть у сміття»). Відкрито, чи входять чаша мийки, метал, фанера розділ 4
Е-7 Ціни 1С по кнопці чи автозапит без змін: автозапит 400 мс usePrices1c.ts:52
Е-8 ПДВ/націнка без змін: у коді немає grep `ПДВ

Доки проти коду (гроші) [ФАКТ ◔]: БІЗНЕС §4.7 «клієнтський PDF без контрагента не дається» — скасовано 03.09 (№91), коментар usePrices1c.ts:28-30 про pdfBlocked теж застарів; §6.5 «в кодах коди керамограніту, точний код підставляє кошторис» — застаріло з 02.10; §7 «обидва шари один до одного не звертаються» — з 18.09 прорахунок викликає кошторис для production (QuotePanel.tsx:288-304); §8.3 «стики дерева не доходять до фактів» — застаріло ще 02.09; §4.2 «bounding box з припусками» — код бере площу полігона з припуском. Коментарі в самому рушії прорахунку (quoteCalc.ts:50-55, 161-164) досі кажуть, що локальний прайс — фолбек, хоча його вимкнено.


3. Нове з 02.09

3.1. Метраж кромок за «законом вимірювання» (№250)

Звідки довжини [ФАКТ ◔]: не з ядра OCCT. engines/geometryUtils.ts:409-476 (edgeLengthForSide) іде по part.nominalPoints — ламаній JS (дуга ≈ 12 хорд на 90°); журнал №250 це й каже («з ядра тут нічого не додає»). Читають її: факти кошторису (productionFacts.ts:306), різаки кромок у 3D лише для часткових кромок (edgeCutters.ts:1004, 1108), підписи кромок (utils/edgeProfiles.ts:304). Прорахунок кромок не тарифікує (§11 ТЗ, domain/quoteCalc.ts:4-7), хоча журнали №223 і №250 називають «прорахунком» саме факти кошторису — для власника це різні документи [ПИТАННЯ].

Закон ламається на Г- і П-подібних із обробкою кута [ФАКТ ✔ зонд L6_edgeLU_out.txt]. Для них nominalPoints — контур без дуги/фаски кута (6 вершин у Г, 8 у П), а контур різу — з ними (18–20 вершин). Коли кількість вершин розходиться, код бере «сирий» номінал без прапорців сторін (:435-439), і пошук кінців сторін по ньому дає чужі ділянки:

Деталь (кромка ar_20 на всіх сторонах) Припуск Сторони, мм (рушій) Σ факт edge Периметр парта Бланк PDF
Г 2400×1600, R100 на куті A 0 A 2378 · B 978 · C 2800 (має 1800) · D 600 · E 600 · F 4000 (має 1600) 11 357 7 957 7 800
те саме 10 A 2398 · B 998 · C 1800 · D 600 · E 620 · F 1620 8 037 8 037 (з припуском) 7 880
Г, фаска 50×50 на куті start 0 A 2350 · B 3400 (має 1000) · C 1800 · D 600 · E 2200 (має 600) · F 1621 11 971 7 971 7 900
П 2400×1200 (виріз 1200×600), R100 на куті A 0 A 2378 · B 1178 · C 1800 (має 600) · D 600 · E 1200 · F 600 · G 600 · H 3600 (має 1200) 11 957 8 357 8 200
прямокутник 2000×600, R100 на AB 0 і 10 A 1978,5 · B 578,5 · C 2000 · D 600 (правильно) — — —

Тобто без припуску (у нового проєкту припуски нульові, domain/defaults.ts:159-171) кромка на Г/П з радіусом чи фаскою кута завищується на 43–50 %, з припуском 10 — входить припуск (+1 %). Сторож №250 (engines/__tests__/edgeLengthNominal.test.ts:57) перевіряє Г лише без кутів.

Бланк погодження — третій закон [ФАКТ ✔ зонд]: PDF рахує довжину кромки як відстань між кінцями сегмента сторони на контурі з припуском і без дуг (utils/export/quotePdf.ts:1056-1063): прямокутник 2000×600 з припуском 10 → у бланку 2020/620, у кошторисі 2000/600; Г з R100 → 2300 проти 2378,5 без припуску. Клієнт підписує бланк з одним метражем, цех/ERP отримують інший.

CombiCut — свої метри різу [ФАКТ ◔]: план верстата бере номінальний контур (точні дуги — з ядра) і ділить різ так: прямі зовнішні відрізки — диск, дуги й отвори — вода (engines/combicut/plan.ts:146, 168); факти кошторису — контур з припуском і «осьове — пила, все неосьове — вода» (productionFacts.ts:253-257, geometryUtils.ts:106-120). Скіс/фаска кута: верстат — диском, кошторис — водою. У гроші CombiCut не йде.

3.2. Спільні налаштування (№241, №264)

Що Код Стан
Що їде на сервер settingsSync.ts:63-67 quote = весь quotePriceBook (коди і калібрувальні ціни) + minSideMm; production = serviceCatalog (з полем price) + прив'язки + свої правила [ФАКТ ✔ зонд]
Що каже документ 01_МЕЙН/СПІЛЬНІ_НАЛАШТУВАННЯ.md:16-17 «на сервер їдуть коди, правила й мінімальні сторони, не гроші» — не відповідає коду; коментар settingsSync.ts:6 чесно пише «калібрувальні ціни»
Прийняття з сервера settingsSync.ts:70-86 ціни не обнуляються (зонд: 777 / 1 234 / 4 321 доїхали як є), а імпорт файлу той самий прайс обнуляє (useSettingsStore.ts:321; зонд: 0 / 0, але serviceCatalog.price лишається 4 321) [ФАКТ ✔]
Режим калібрування settingsSync.ts:8, useSettingsStore.ts:325, 360 не їде, але персиститься в браузері: вхід адміна скидається при перезавантаженні, а ввімкнене ним калібрування лишається для будь-кого за цим браузером (скидає лише зміна версії сховища) [ФАКТ ◔]
Версія і 409 settingsSync.ts:123-150, тест settingsSync.test.ts:90 запис із версією; чужий новіший запис → вибір людини [ФАКТ ◔ + тест]
Локальні незбережені правки settingsSync.ts:103-105 якщо на сервері новіша версія — локальна правка тихо затирається при поверненні у вкладку / раз на 10 хв; ознаки «є незбережене» в панелі немає (SettingsSyncBar.tsx). Зонд: адмін вписав код svc:joint_flat і ціну 555, не зберіг «для всіх» → чужа версія 2 → код і ціна зникли без жодного вікна [ФАКТ ✔ L6_sharedpull_out.txt]
Хто пише SettingsSyncBar.tsx:27-33, 50-58 кнопка — після входу адміна; сервер — будь-хто з сесією, SETTINGS_EDITORS за бажанням [сторона ІТ]
Знімок у проєкті QuotePanel.tsx:441-444, stounik/checks.ts:251-264 при PDF пишеться версія quote; Стоуник підказує, коли для всіх новіша
Історія/відкат — ендпоїнт є, вікна в Студії немає (№241, свідомо)

Наслідок у грошах [ФАКТ ◔]: будь-яка машина, де ввімкнули калібрування, рахує за ручними цінами того, хто останнім натиснув «Зберегти для всіх»; замовлення в ERP з такими цінами не блокується (§2, рядок 9).

3.3. Нові послуги і як вони в гроші

Що Кошторис Прорахунок Доказ
17 нових послуг прорахунку і коди за матеріалом (№217) — 40 послуг; без коду 1С: керамограніт 10, штучний кварцит 12, натуральний камінь 24, акриловий камінь 37 (у кварциту: calibration, lifting, metal_frame, hob_cutout, sink_cutout, customer_socket_clad, drain_button_clad, radiator_grooves, water_grooves, radius_edge, stone_socket, stone_switch). Авто-послуга «Виріз під мийку» завжди «ціни немає» зонд [0], [6]; domain/quoteServiceCodes.ts:34-76 [ФАКТ ✔]
Акрил правила акрилу лише для гнуття/матриці замір і монтаж акрилу без кодів — у файлах власника акрилу немає quoteServiceCodes.ts:19-22 [ФАКТ ◔]
Фанера / WEDI (№223, №252) факти plywood_frame/sheet/sanding, wedi (м² під підкладом); правила є лише в наборі ВіярПро (вимкнений) і лише для кварциту й кераміки → у вбудованому наборі мовчки зникають немає (позиції не створюються; журнал №223 «м² у прорахунку» має на увазі факти кошторису) зонд [5]: plywood_frame=1.2, plywood_sanding=1.2 → «факти без правила»; viyarMapping.ts:126-141 [ФАКТ ✔]
Металокаркас (№220–222, №256) метал-парт не відсіюється з фактів каменю: різ пилою по периметру труби, площа — у «Матеріал», «Монтаж», «Пакування» лише ручна послуга «Розробка металокаркасу», без коду зонд: труба 2000 → saw_cut 4,08 м, площа 0,08 м²; productionFacts.ts:245-250 (фільтр лише фанери) проти engines/nestingScope.ts:16 (камінь = не фанера й не метал) [ФАКТ ✔]
CombiCut (№255, №259) — — у гроші не йде; свій поділ диск/вода (3.1) [ФАКТ ◔]
Внутрішній рахунок ERP з операціями (№186) кількості кошторису з кодом → production — QuotePanel.tsx:288-304 [ФАКТ ◔]
«Додаткові послуги» деталі в паспорті не читаються жодним рушієм не читаються customServices: DetailPassportModal.tsx:45-124, 280-302; grep у engines/ порожньо [ФАКТ ✔]
Гроші пробілами (№258) fmtMoney fmtMoney, fmtMoneyPdf lib/money.ts; тест 2 [ФАКТ ✔]
КП при іншій товщині слеба (№267) — попередження замість заборони QuotePanel.tsx:555-569, domain/quoteGuards.ts [ФАКТ ◔]

3.4. Новий дефект класифікації вирізів (регрес після 25.09)

[ФАКТ ✔ зонд L6_cutouts_out.txt] Факти розрізняють «круглий отвір» і «виріз» за евристикою «усі вершини рівновіддалені від центру» (productionFacts.ts:171-184, 266-275). З 25.09 (№189, крок 1) розкрій отримав радіус кутів прямокутного вирізу — і прямокутник зі скругленими кутами має вершини лише на кутах, які всі рівновіддалені від центру. До того виріз ішов гострим прямокутником із 4 вершин (аудит 02.09, §4 «Вирізи»; журнал №189) і евристика його не чіпала — тому це регрес [ФАКТ ◔ за документами; код 02.09 не зберігся]. Результат сьогодні:

Виріз Вершин Факт сьогодні Мав би бути
мийка 500×400 R10 (усі мийки, domain/productSink.ts:22, 37) 28 hole_large 1,783 м cutout_perimeter
варильна 562×492 R5 28 hole_large 2,099 м cutout_perimeter 2,108 м (як R0)
виріз 900×200 R15 (мінімум R15 з обробкою торців, №211) 28 hole_large 2,174 м cutout_perimeter
розетка 80×80 R10 28 hole_small 1 шт cutout_perimeter 0,303 м
змішувач Ø35 28 hole_small 1 шт так і є

У кодах ВіярПро це інша номенклатура: кварцит 219981 «Прямокутний виріз» → 219980 «Отвір великий», кераміка 195304 → 195311, розетка — 195310/219979 за штуку замість метрів. Тестів на скруглений виріз немає.

3.5. Інше нове


4. Зонд — синтетичний проєкт обома рушіями

Склад (кварцит, 1 слеб з артикулом, probe-L6/src/__probe__/l6money.probe.test.ts): P1 — прямокутник 2000×600, кромки A = ar_20, B = l_20, підворот 60 на C, запис фанери 1,2 м²; P2 — Г 2400×1600 (сторони A–F: 2400/1000/1800/600/600/1600), R100 на куті A з «Обробкою торців», ar_20 на A і B, мийка 500×400; P3 — прямокутник 1600×600, R150 на AB, підворот 60 на A і B (гнутий елемент на дузі); P4 — прямокутник 3600×600 з ручним стиком на 1800 + стінова панель на A з R50 на куті; P5 — металокаркас: труба 40×40 довжиною 2000. Усім кодам — однакова ціна 100 ₴ за одиницю; вимкнене калібрування.

Кількості — без припуску / з припуском 10 [ФАКТ ✔ L6_probe_out.txt]:

Величина Кошторис (факти) Прорахунок PDF / бланк Коментар
Площа, м² 8,871 / 9,427 8,044 / 8,445 8,871 / 9,427 різниця 0,827 = чаша мийки 0,747 (14 партів) + метал 0,08
Радіусний елемент 1 × 298644 1 × 298644 — збіг (єдиний спільний код двох документів)
Мийка 14 партів чаші: різи, площа; виріз у стільниці як hole_large 1,783 м 1 шт «Виготовлення мийки» + «Виріз під мийку» 1 шт без коду — розд. 3.4
Стик на прямій стільниці P4 (0,6 м) шов 0,6 м + 2 пропили joint_flat = 0 — за формою: прямокутник → 0
Пропили для стику (JOINT_SAWCUT) 12 шт = 6 з'єднань × 2, з них 4 — підвороти — — Баг 3 ПРАВИЛА_ПОСЛУГ (ПС-6)
Кути (факт corner) 4, з них радіус на панелі P4 — двічі — — productionFacts.ts:419-448
Дуга R100 з «Обробкою торців» 78,5 + 78,5 мм у сторонах + 157 мм окремо — дуги немає подвійний рахунок
Кромка P2: A / B, мм 2378,5 / 978,5 (з припуском 2398,5 / 998,5) — 2300 / 900 (2320 / 920) три закони
Кромка l_20 (P1 B) факт 0,6 м → жодного рядка — 600 мм у бланку профіль без правила
Фанера 1,2 м² вбудовані правила: зникає; ВіярПро: 195706 + 224694 немає — розд. 3.3
Метал P5 saw_cut 4,08 м + 0,08 м² у матеріалі/монтажі — 0,08 м² у «Загальній площі» розд. 3.3
Підворот (P1, P3) склейка glued 4,136 м, пропили лише площа в «з потовщенням»; «Виконання підвороту» (179425) — тільки руками — autoQuoteServices його не знає

Гроші при однаковій ціні 100 ₴ (без припуску): кошторис із вбудованими правилами — 100 ₴ (з 10 рядків код має лише радіус), кошторис після «Перевести на коди ВіярПро» — 9 120,10 ₴ (11 з 15 рядків з кодом; найбільший — 219977 «Порізка кварциту» 55,74 м, з них 4,08 м — труба), прорахунок — 2 008,80 ₴ (10 з 11 рядків з кодом). Документи не мають збігатися в сумі (це різна номенклатура), але показово: у стандартному стані кошторис і рядки production для ERP майже порожні за кодами, доки адмін не перемкне набір і не збереже «для всіх».

Коди ВіярПро проти «Актуальних послуг 2026 цех 202» [ФАКТ ✔ скрипт]: з 50 кодів, які використовує viyarMapping.ts, 7 відсутні в CSV цеху (12_ВИРОБНИЦТВО_І_МЕС/02_ПОСЛУГИ_НА_ДІЛЯНКАХ.md): 219977 (різ кварциту; у CSV — 195663), 219979 і 219980 (отвори кварциту; ПС-4 і ПС-17 дають 195669 і 195670), 219981 (виріз кварциту), 219969 і 219998 (пакування; у CSV — 195724/195390), 195311 (отвір >100, кераміка).


5. Тести грошей

Прогін у копії (probe-L6, під замком): 25 файлів, 336 тестів — усі зелені, 15,6 с [ФАКТ ✔]. У воротах ведучого (gates/vitest.txt) ті самі файли зелені; загалом 1 856 passed / 2 failed (старі: coreBoundary, DXF C:/hhgh/…).

Файл Тестів Що сторожить Чого НЕ сторожить
engines/__tests__/estimate.test.ts 15 різ із периметра, отвір Ø60 = шт, торець по стороні, матеріал без ×1.2, сума = рядки = групи, калібрування вимк./увімк., розріз по деталі estimatePriceRequests; паспорт у калібруванні; скруглені вирізи
engines/__tests__/productionFacts.test.ts 36 пила/вода, пороги 100 і 500 мм, торець по ділянці, стики з products, кути, сляби/відхід метал і фанера поза фактами каменю; подвійні кути на доповненнях; дуга з галочкою
engines/__tests__/quoteCalc.test.ts 70 площі, злиття, нога, замір/монтаж, піраміда, пріоритет ціни, 70 кодів «Виготовлення», авто-послуги, бортик закріплює joint_flat за формою (:565-573); прямокутник зі стиком; stripQuotePrices
domain/__tests__/serviceMapping.test.ts 40 цілісність таблиць, resolveMapping, правки керівника, ВіярПро унікальність id у ВіярПро; покриття 70 профілів; закріплює «факт без правила просто зникає» (:127-130)
domain/__tests__/viyarServiceCatalog.test.ts 15 довідник ВіярПро: 178 позицій (100 зі старого прайсу + 78 актуальних 2026), без цін, коди унікальні які коди бере набір прив'язок: 7 з 50 — зі старого прайсу, яких немає в CSV цеху 2026 (розд. 4)
domain/__tests__/quoteServiceCodes.test.ts 10 78 кодів за матеріалом, пріоритет ручного коду, чистка старих кодів послуги без кодів (24 у натурального каменю)
engines/__tests__/edgeLengthNominal.test.ts 5 №250: прямокутник, дуги, R30×4, шматки, Г без кутів Г/П з обробкою кута (розд. 3.1)
engines/__tests__/edgeLengthOnCutParts.test.ts, jointFactsUnique.test.ts, jointMoney.test.ts, wave2Money.test.ts 5 + 4 + 7 + 6 метраж на шматках, дедуплікація стиків, шви, торець на дугах/вирізах, поверхня акрилу код surface_processing; пропил ×2 на підворотах
store/__tests__/settingsSync.test.ts, components/ui/__tests__/SettingsSyncBar.test.tsx 9 + 4 pull/push, 409, калібрування не їде, склад документів (:84-88) що ціни їдуть на сервер і не чистяться; затирання незбережених правок
components/ui/__tests__/quoteOrderCard.test.tsx 10 без контрагента/оплати/на нуль, підтвердження, рядок без коду заборона/попередження для manual
components/ui/__tests__/usePrices1c.test.tsx 14 дебаунс, контрагент, збереження цін при відпаданні, тексти помилок —
utils/export/__tests__/quotePdf*.test.ts 14 + 8 + 5 мова, калібрування бланку арифметика itemFabCost, метраж кромки в бланку проти фактів
engines/__tests__/radiusElement.test.ts, fireplaceEndToEnd.test.ts 26 + 11 категорії радіусів, матриці; камін fireplace досі стверджує «0 стиків» (:230-242)
apsExport, mesPack, quoteGuards, quoteLayoutSync, lib/money 4 + 9 + 2 + 5 + 2 пакети МЕС, попередження товщини, П-7, формат «1 000 000» метал/фанера в пакеті кошторису

Немає тестів [ФАКТ ✔ grep]: на класифікацію скругленого прямокутного вирізу; на відсіювання металу з фактів; на customServices; на паспорт у калібруванні; на міграцію v7 / stripQuotePrices; на унікальність id VIYAR_MAPPING_RULES.


6. Ключові знахідки

  1. [ФАКТ ✔ зонд] Метраж кромки (№250) завищується на 43–50 % на Г/П з радіусом чи фаскою кута. engines/geometryUtils.ts:435-458: номінальний контур Г/П — без обробки кута, і пошук сторін по ньому дає чужі ділянки (Г 2400×1600 з R100: Σ кромки 11 357 мм при периметрі 7 957; сторона F 4000 замість 1600). З припуском 10 — входить припуск. Сторож перевіряє Г лише без кутів (edgeLengthNominal.test.ts:57).
  2. [ФАКТ ✔ зонд] Скруглений прямокутний виріз рахується як круглий отвір — усі мийки (R10), варильні з радіусом, вирізи з обробкою торців (R15+), розетки. productionFacts.ts:171-184, 266-275: мийка → hole_large, розетка 80×80 → hole_small 1 шт. За документами — регрес після №189 (25.09), коли розкрій отримав радіус кутів вирізу; тестів немає.
  3. [ФАКТ ✔ зонд] Металокаркас потрапляє в гроші каменю. productionFacts.ts:245-250 відсіює лише фанеру; метал-парт (engines/geometry.ts:2225-2237, isMain) дає «різ пилою» по периметру труби (4,08 м на 2 м) і площу в «Матеріал», «Монтаж», «Пакування»; ці кількості їдуть і в замовлення ERP. Межу «камінь = не фанера й не метал» уже має engines/nestingScope.ts:16, але факти її не кличуть.
  4. [ФАКТ ✔ зонд] Спільні налаштування возять гроші, а документ каже, що ні. store/settingsSync.ts:63-67 шле весь quotePriceBook з калібрувальними цінами і serviceCatalog з цінами; прийняття з сервера їх не чистить (:70-86), на відміну від імпорту файлу (useSettingsStore.ts:321). 01_МЕЙН/СПІЛЬНІ_НАЛАШТУВАННЯ.md:16-17 — «не гроші». Новіша версія на сервері тихо затирає незбережені локальні правки (settingsSync.ts:105).
  5. [ФАКТ ✔] Замовлення в ERP за ручними цінами досі не блокується (Е-5): QuoteOrderCard.tsx:147-167 не дивиться на source; прапорець калібрування живе в браузері після виходу адміна (useSettingsStore.ts:134-370 без partialize), а ручні ціни тепер можуть прийти із сервера.
  6. [ФАКТ ✔ зонд] 39 із 70 профілів кромок і всі фанерні факти у вбудованих правилах мовчки зникають. Факт є, рядка немає, попередження немає (serviceMapping.ts:313-349, estimate.ts:212-224 ловить лише «послуги немає в каталозі»). Повна мапа EdgeProfileDef.operations (domain/defaults.ts:30-133) після видалення КП не читається ніким. Екран прив'язок не показує ні радіусних, ні фанерних фактів (ServiceMappingPanel.tsx:28-32).
  7. [ФАКТ ✔ зонд] Подвійний рахунок у фактах лишається: обробка кута на доповненні — двічі (productionFacts.ts:419-448, isProduct лише на головному елементі виробу); дуга з «Обробкою торців» — половинами в сторонах і ще раз повністю (:457-474).
  8. [ФАКТ ✔ зонд] Три закони метражу кромки і три площі. Кошторис — номінал із дугами (крім п. 1); бланк погодження в PDF — хорда сегмента на контурі з припуском, без дуг (quotePdf.ts:1056-1063); прорахунок кромок не рахує. Площа: кошторис 8,871 м² (з чашею мийки й металом), прорахунок 8,044, «Загальна площа виробу» в бланку 8,871 (усі парти, quotePdf.ts:944, 952).
  9. [ФАКТ ✔ зонд] Стики в прорахунку — за формою, не за швами (quoteCalc.ts:528-534, тест закріплює quoteCalc.test.ts:565): пряма стільниця зі стиком → 0 «Стикування в площині» (зонд P4); за кодом П з одним стиком дає 2, Г з двома — 1. У кошторисі пропил ×2 на кожне з'єднання, включно з підворотами (12 пропилів на 6 з'єднань, з них 4 підвороти); ребро стику (Z20/Z12) не мапиться (viyarMapping.ts:205-210). «Виконання підвороту» (нова послуга 02.10) — лише руками.
  10. [ФАКТ ✔ зонд] Нові послуги прорахунку (№217) здебільшого без кодів 1С: з 40 — без коду 10 (кераміка), 12 (кварцит), 24 (натуральний камінь), 37 (акрил); серед них авто-послуга «Виріз під мийку» і surface_processing. Радіусні коди за матеріалом — закрито (обидва документи 298644).
  11. [ФАКТ ✔ скрипт + зонд] Кошторис — джерело кількостей для ERP і МЕС, а набір кодів слабкий: у вбудованих правилах код має лише радіус (1 з 10 рядків зонду) → production у замовленні майже порожній; набір ВіярПро для кварциту використовує 7 кодів, яких немає в «Актуальних послугах 2026 цех 202» (зокрема 219977 замість 195663 для прямого різу).
  12. [ФАКТ ✔ grep + зонд] Паспорт деталі: «Додаткові послуги» нікуди не йдуть, а ціни не враховують калібрування. customServices (DetailPassportModal.tsx:45-124, 280-302) зберігаються у виробі, але жоден рушій грошей їх не читає; паспорт кличе кошторис без manualPricing (:58-83). Паспорт відкритий менеджеру без входу.

7. Питання власнику

  1. Ціни в спільних налаштуваннях. Калібрувальні ціни прорахунку і ціни каталогу послуг мають їхати на сервер «для всіх» (так у коді) чи ні (так у документі №241)? Якщо так — чи окремий замок для production (технолог) і quote (продажі), як питав №241?
  2. Замовлення в ERP у режимі калібрування (Е-5, досі відкрите): блокувати чи лише попереджати?
  3. Металокаркас і фанера в грошах. Метал зараз рахується як різ і площа каменю — прибрати з фактів до «правил металу» (№256)? Фанера: увімкнути її правила у вбудованому наборі чи лише через коди ВіярПро? Чи має фанера бути в прорахунку для клієнта (журнал №223 пише «м² у прорахунку»)?
  4. Виріз зі скругленими кутами (мийка, варильна, розетка) — у прайсі це «виріз» (195304/219981, м.п.), а не «отвір» (195311/219980; розетка — штуки)? Підтвердіть, щоб правка не змінила гроші без вашого слова.
  5. Метраж кромки для бланка погодження: як у кошторисі (готова деталь, з половинами дуг) чи як зараз у бланку (по сегменту, з припуском, без дуг)? І дуга з «Обробкою торців» між двома профільованими сторонами — одна операція чи дві?
  6. Стики в прорахунку: рахувати «Стикування в площині» за фактичними швами (пряма стільниця зі стиком теж) чи за формою, як зараз? Пропил ×2 — лише між деталями специфікації чи й на підворотах/потовщеннях?
  7. 39 профілів без правила (32 акрилові + 7 нових з каталогу 17.09.25): які послуги/коди? Для акрилу в файлах «Додаткові послуги» кодів немає взагалі (замір, монтаж теж).
  8. «Додаткові послуги» в паспорті деталі — мають іти в кошторис і замовлення чи це нотатка?
  9. Площа (Е-3, продовження): чаша мийки (окремі 14 деталей) і метал/фанера мають входити в «площу виробу» кошторису й бланка?
  10. Коди ВіярПро для кварциту: 219977/219979/219980/219981/219998 ще живі в 1С 2026 чи замінити на коди з «Актуальних послуг 2026» (195663, 195669, 195670 …)?

Пропозиції (не рішення)


Додаток: що запускалось

Що Де Результат
Читання коду і доків, grep /tmp/final/vs-cad/src, /tmp/final/audit1310/docs адреси вище
Копія для зондів (tar + cp -al node_modules) /tmp/final/audit1310/probe-L6 оригінал не змінювався
Зонд «два рушії» src/__probe__/l6money.probe.test.ts перший прогін під замком — падіння в розділі [9] (пошук id деталі), виправлено в зонді; повторно 5,8 с без замка probe-L6/L6_probe_out.txt, L6_probe_out.json
Зонд отворів l6holes.probe.test.ts, вирізів l6cutouts.probe.test.ts ~1–6 с кожен L6_holes_out.txt, L6_cutouts_out.txt
Зонди спільних налаштувань l6shared.probe.test.ts, l6sharedpull.probe.test.ts (API підмінено vi.mock, як у штатному тесті) 1,8 с і 1,2 с L6_shared_out.txt, L6_sharedpull_out.txt
Зонди метражу l6edge250.probe.test.ts, l6edgeLU.probe.test.ts ~6 с кожен L6_edge250_out.txt, L6_edgeLU_out.txt
25 тестових файлів грошей під heavy.lock, у фоні 25 / 336 passed, 15,6 с — /tmp/final/audit1310/L6_moneytests.out
Звірка кодів viyarMapping.ts з CSV цеху 202 bash (grep/comm) 7 з 50 кодів відсутні в CSV
Ворота ведучого gates/tsc.txt, gates/vitest.txt прочитано: TS2339 ×2 у QuotePanel.tsx:729; 1 856 passed / 2 failed (старі)

Не перевірено: живий сервер налаштувань і 1С (чи стоїть модуль №241 на проді ІТ, що там уже збережено, чи ввімкнено набір ВіярПро «для всіх»); що бекенд замовлень робить із production і ручними цінами [сторона ІТ]; кліком у браузері — PDF бланка з Г-деталлю і реальні кейси з диска (зонди — на синтетиці).

L7 · Швидкість, старт, пам'ять
Що качається на старті, що живе без дотику, пам'ять ядра · L7_ШВИДКІСТЬ_СТАРТ_ПАМЯТЬ.md

Наскрізний аудит Viyar Stone Studio / VS CAD, 13.10.2026. Лінза L7. Код: /tmp/final/vs-cad (знімок диска 12.10, усі адреси — відносно src/). Код не змінювався; усі зонди — у /tmp/final/audit1310/probe-L7 (копія за брифом).

Питання власника, дослівно: «може то все через те, що в нас у Студії захардкоджено CAD і білдінг і т.д., чи вони мертві, поки ми в них не зайшли? Може в нас файли з кодом великі».

Як міряв.

  1. Прод-збірка npx vite build --sourcemap у своїй копії (під замком) → розміри кожного файла збірки (сирий / gzip-9 / brotli-11) і, через карти джерел, скільки байт кожного файла належить кожній папці src/ і кожній бібліотеці.
  2. Прод-збірку віддавав простим статичним сервером (порт 7302, як хостинг, без бекенда) і відкривав у Chromium (Playwright, програмна відеокарта SwiftShader — та сама пісочниця, що 12.10): що вантажиться, що з цього виконалось (V8 coverage + карти джерел), хто ставить таймери і потоки, що відбувається за 30 с простою (процесор кожного процесу браузера, головний потік, мережа, кадри), пам'ять (купа JS, PSS процесів, розклад smaps).
  3. Dev-сервер: 7188 був мертвий (curl → 000), тож підняв свій на 7301 з копії probe-L7 (не з vs-cad, щоб не писати кеш Vite у знімок; src/ у копії ідентичний — diff -rq порожній). У dev кожен модуль — окремий запит, тож видно точний список модулів на кожному кроці: старт → кейс 81 → редактор → 3D Підбір → назад у 2D.
  4. Секунди 12.10 не переміряв (машина зайнята іншими лінзами) — зведені з 02_БАГИ_І_БОРГИ/ЗАМІРИ_12-10_…md. Мої часові числа — лише там, де вони потрібні для порівняння «до/після» в одному прогоні.

Позначки. [ФАКТ ✔] — виміряв/перевірив сам; [ФАКТ ◔] — прочитано в коді (адреса); [ГІПОТЕЗА]; [ПИТАННЯ]; [ПРОПОЗИЦІЯ] — лише блоком наприкінці. Одиниці коду й файлів: КБ = 1000 байт, МБ = 1 000 000 байт (як друкує Vite); пам'ять (PSS, купа JS) — у МіБ, як її показує система (різниця ~5 %, для висновків неважлива). «Виконалось» = V8 хоч раз запустив цей шматок коду (для файлів-даних — це просто «прочитав при старті»).

Межі. SwiftShader у пісочниці малює процесором: числа процесора «GPU-процесу» тут завищені в рази проти справжньої відеокарти — порівнювати рядки між собою, не з ПК менеджера. Хостинг (стиснення, кеш), server/, lib/api.ts, Keycloak — [сторона ІТ]. Кейс 81 — лише як навантаження, жодних даних з нього тут нема.


0. Коротко для власника

Ні, CAD і «білдінг» не живуть, поки в них не зайшли, і гальмує не вони. Вкладки конструктора (замір, метал, фанера, збірка, зведення, документи, CombiCut) і редактори архітектури вантажаться лише при вході — до того їх у браузері немає взагалі. На старті від CAD лежить 107 КБ (модуль креслень, який тягне діалог експорту в 2D), від «білдінгу» — 37 КБ бічної панелі; обидва за весь сеанс не виконують нічого, крім оголошення себе. Папки src/mes (симуляція MES) у збірці немає зовсім — її ніхто не імпортує. Стенд ядра — окрема сторінка, у Студію не потрапляє.

Файли з кодом справді великі, але старт від цього — пів секунди, а не десятки. На старті браузер качає 6,1 МБ JS (1,87 МБ стиснено) — і 71 % цього коду на стартовому екрані не виконується жодного разу. Найважче на старті — не CAD, а бібліотеки документів (читання PDF/Excel бланка погодження, створення PDF, знімок екрана — разом 1,7 МБ), 3D-рушій (1,2 МБ) і дані, вшиті в код (креслення кромок, переклад, довідка — ~1 МБ). Але сам старт у пісочниці — перший малюнок за 0,66–0,81 с.

Довгі секунди — в інших місцях (заміри 12.10): перше 3D (створення полотна і карти відблисків — 9 с у пісочниці) і холодне ядро OCCT (запуск 4,5–5,6 с, з першою деталлю 5,8–7,4 с у моїх прогонах + 324–500 МБ пам'яті, яку воно тримає до закриття вкладки).

Що реально «живе без дотику» (виміряно): (1) очі Стоуника в шапці — анімація змушує браузер малювати кадри безперервно 45 с після кожного кліку; (2) 3D у редакторі й Підборі малює кадри безперервно, поки відкрите, навіть коли нічого не міняється; (3) приховану плашку ядра оновлює таймер кожні 0,7 с (це майже нічого не коштує). Мережевих опитувань за 30 с простою — нуль. Потоків на старті — нуль.

Таблиця для власника

Частина Вантажиться на старті? Робить щось без дотику? Скільки на старті (код) Пам'ять, коли працює
CAD / конструктор (constructor/) Вкладки — ні (ліниві). Модуль креслень — так, 107 КБ (через діалог експорту 2D) Ні (виконалось 8 % — лише оголошення) 107 КБ із 6 099 (1,8 %) не міряв окремо (у проді вхід закритий)
Білдінг / архітектура (workspaces/architecture) Бічна панель і розкладка — так; план, розкладка, відомість — ні (ліниві) Ні (6 %) 37 КБ (0,6 %) —
MES-симуляція (mes/) Ні — її немає в збірці (0 імпортерів) Ні 0 0
Пакет JSON для MES (engines/mesPack.ts) Так Ні (1 %) 17 КБ —
CombiCut / верстат Ні (лінивий, 52 + 20 КБ); на старті лише типи 0,9 КБ Ні 0,9 КБ —
Кімната (components/room, domain/room*) Так Ні, поки не відкрили (полотна нема) 30 КБ (0,5 %) як 3D (нижче)
Стоуник (stounik/) Так Так: анімація очей → кадри безперервно 45 с після кожного дотику; 1 запит /api/stounik/ask на старті; таймер дрімоти 45 с 178 КБ (2,9 %) —
Ядро OCCT — код у головному потоці (kernel/) Так, 112 КБ (у т. ч. будівник 29 КБ, який працює лише в потоці ядра) Ні; плашка-таймер 0,7 с (див. нижче) 112 КБ (1,8 %) —
Ядро OCCT — потік + wasm Ні. Стартує, коли треба геометрія: відкрили проєкт з деталями, редактор, 3D, розкрій Після запуску — тиша (0,04 с CPU за 15 с) 0 (потім 50,3 МБ wasm + 0,8 МБ потоку) +324…+444 МБ до закриття вкладки (12.10: ~500)
Стенд ядра (stand/) Ні (окрема сторінка stand.html) Ні 0 0
3D-рушій (three.js + R3F + drei + …) Так, 1 214 КБ (через редактор, що вшитий статично) Поки 3D закрите — ні. Відкрите — малює безперервно 1 214 КБ (19,9 %) GPU-процес +95…+104 МБ, після виходу з 3D −80 МБ
Бібліотеки документів (pdf.js, xlsx, jspdf, html2canvas, react-dom/server, zip) Так Ні (12–22 %) 1 671 КБ (27,4 %) + наш approvalImport 78 —
Дані в коді (креслення кромок, переклад en/pl, довідка, теми Стоуника, каталог послуг) Так Ні ~1 006 КБ (16,5 %) —
Плашка ядра (kernel/KernelBadge.tsx) Так Так: таймер 0,7 с, хоча в Студії плашка схована 1,4 КБ ~0,1 % головного потоку

1. Прод-збірка: що качається на старті, що — ліниво

1.1 Стартові файли [ФАКТ ✔]

dist/index.html вантажить main-*.js і ще 8 файлів через modulepreload (усі — статичні імпорти входу). Ліниво (лише за кнопкою/вкладкою) — решта 39 JS-файлів, 3 файли потоків (ядро, розкрій, pdf.js) і wasm.

Файл збірки (назва — випадкова, див. примітку) Сирий, КБ gzip-9, КБ brotli-11, КБ
main-*.js 4 494,2 1 402,0 1 076,0
metalTemplates-*.js (насправді: three.js 576 + переклад 224 + …) 1 121,1 310,0 249,9
modelFromDraft-*.js (CSG 95 + engines 42 + kernel 35) 195,8 63,8 54,5
occt-*.js (насправді: react-dom 175) 178,7 55,7 48,4
useProjectStore-*.js 70,7 22,4 19,7
occtBuilder-*.js (будівник ядра, у головному потоці не працює) 29,4 10,7 9,5
useStore-*.js, workerClient-*.js, createLucideIcon-*.js 9,5 4,0 3,5
Разом JS на старті 6 099,4 1 868,6 1 461,5
main-*.css 186,6 34,4 28,5

1.2 З чого складаються стартові 6,1 МБ (карти джерел) [ФАКТ ✔]

Наш код — 2 762 КБ (45 %), бібліотеки — 3 153 КБ (52 %), службовий код збирача — 184 КБ (3 %). Колонка «виконалось» — частка байтів, які V8 хоч раз запустив на стартовому екрані (прод, 15 с після відкриття).

Група КБ на старті Виконалось
three (3D-рушій) 825 7 %
src/domain (з них креслення кромок 435 + 77) 734 88 % (дані)
src/components/ui 687 5 %
pdfjs-dist (читання PDF) 478 9 %
react-dom (з них сервер-рендер 184) 362 21 %
xlsx (читання Excel) 332 20 %
jspdf (створення PDF) 326 12 %
src/i18nStatic.ts (словник en/pl) 224 100 % (дані)
html2canvas (знімок екрана для баг-репорту) 200 49 %
src/engines 183 5 %
src/stounik 178 75 % (теми — дані)
@react-three/fiber 149 10 %
src/utils (з них approvalImport 78) 142 2 %
src/kernel 112 5 %
src/constructor 107 8 %
jszip 97 17 %
src/components/forms 89 10 %
troika-three-text (3D-текст) 76 2 %
src/components/2d 66 13 %
three-bvh-csg / three-mesh-bvh 56 / 39 6 / 8 %
pako 47 11 %
src/workspaces 27 2 %
src/components/room / 3d 23 / 22 7 / 2 %

Топ окремих файлів на старті: pdfjs-dist/legacy/build/pdf.mjs 478, domain/edgeProfileDrawings.ts 435 (56 SVG), three.core.js 380, xlsx.mjs 332, jspdf 326, three/examples/jsm/lights/RectAreaLightTexturesLib.js 247 (таблиці для одного типу світла в 3D), i18nStatic.ts 224, html2canvas 200, three.module.js 196, react-dom-client 174, react-dom-server 95 + 88, components/ui/HelpDialog.tsx 97 (текст довідки), jszip 97, stounik/topics.ts 87, utils/approvalImport.ts 78, domain/edgeProfileImages.ts 77.

Покриття старту [ФАКТ ✔, covmap.mjs]: із 6 099 КБ виконалось 1 774 КБ (29,1 %), не виконалось ні разу — 4 326 КБ (70,9 %). Бібліотеки: виконалось 15 % (476 з 3 153 КБ). Наш код: 41 % (1 142 з 2 762 КБ), але з цих виконаних ~1 МБ — файли-дані (їх «виконання» — це читання літерала при старті, а не потреба). Dev-покриття (інший спосіб, некомпільовані модулі) дає те саме: 33 % із 17,4 МБ.

1.3 Чому це на старті — ланцюжки [ФАКТ ◔]

Що Хто тягне статично Коли насправді потрібне
pdf.js 478 + xlsx 332 + jszip 97 + approvalImport 78 App.tsx:10 Sidebar → components/ui/Sidebar.tsx:5 → FormsPanel.tsx:16-20 → utils/approvalImport.ts:1-3 лише кнопка «Імпорт бланка погодження»
html2canvas 200 + jszip App.tsx:33 → components/ui/BugReporterDialog.tsx:6-7 лише «повідомити про помилку»
react-dom/server 184 + креслення конструктора ~100 + jspdf components/2d/SlabBoard → components/2d/board/DxfExportDialog.tsx:5-6 → kernel/shopSheets.ts:32-37 (листи CombiCut/NC300 з constructor/drawing/*) і constructor/docs/DrawingSetView.tsx:11,13 лише експорт пакета креслень (PDF/DXF)
jspdf 326 utils/export.ts:1 (з App.tsx:20), utils/export/quotePdf.ts:1 (Прорахунок) лише експорт PDF
three/R3F/drei/troika ~1 214 App.tsx:38 ProductEditorWorkspace (статично) → Detail3DPreview → components/3d/SceneLighting.tsx:5 (RectAreaLight 247); App.tsx:11 Sidebar3D → DetailEditor3D; components/WorkspacePane.tsx:11 → components/room/RoomEditor.tsx:368 (<Canvas>); three core потрібен і рушіям (engines/edgeCutters.ts, engines/shapeBuilder.ts, kernel/*.ts) 3D-частина — лише в редакторі/3D/кімнаті
Довідка 97 App.tsx:27 HelpDialog лише кнопка «Довідка»
Словник en/pl 224 i18n.ts:2 → LanguageDomTranslator (App.tsx:25) лише англ./польська (обережно: перекладач DOM шукає за словником і в uk)
Креслення кромок 435 + 77 components/forms/editors/EdgeProfileThumb.tsx:3, EdgeProfileCatalog.tsx:11, EdgeProfileSettingsModal.tsx:7, constructor/drawing/sections.ts:19 каталог/мініатюри кромок
Будівник ядра 29 kernel/exportCutDxf.ts:52, kernel/shopSheets.ts:42 → kernel/occt/outline2D.ts:18 (import { buildShape, cut } from './occtBuilder') лише в потоці ядра
Тестові дані 0,8 main.tsx:14 import … from './engines/__tests__/mockData' лише для dev-зондів
Дрібне з constructor/ (~10) constructor/ui ← бічна панель архітектури (workspaces/architecture/ArchitectureSidebar.tsx:15); constructor/plywood/plywoodRules і constructor/store ← kernel/plywoodFromDraft.ts:26,28; constructor/measure/i18n.measure ← i18nStatic.ts:16 спільні дрібниці, не «CAD»

Ліниве вже зроблене правильно [ФАКТ ◔]: вкладки конструктора components/WorkspacePane.tsx:20-27, архітектура :60-62, 3D Підбір components/3d/Viewer3DLazy.tsx:3, симуляція CombiCut constructor/combicut/CombiCutTab.tsx:43, rrweb App.tsx:232, rrweb-player components/ui/ServiceDialog.tsx:130, tesseract utils/approvalImport.ts:578, pdf.js у плані workspaces/architecture/plan/PlanEditor.tsx:33, ядро kernel/occt/loadOcct.ts:34-35.

Не підключене [ФАКТ ◔]: реєстр «дочок» shell/workspaces.ts:13-21 (03.09: «у браузер їде лише та дочка, яку відкрили») — workspaceComponent ніде не викликається; workspaces/vs3d/index.tsx і workspaces/constructor/index.tsx обидва віддають той самий App; main.tsx:60-69 рендерить App напряму. Тобто «CAD вшитий» у тому сенсі, що Студія і CAD — один застосунок з однією точкою входу, а CAD у проді просто закритий прапорцем (kernel/config.ts cadEnabled() — без VITE_CAD у прод-збірці false). Але ліниві вкладки від цього не вантажаться.

1.4 Де кожна частина лежить у збірці (усі файли, не лише старт) [ФАКТ ✔]

Частина Разом у збірці Де
src/constructor 467 КБ старт 107 (креслення); решта — ліниві вкладки (DocsTab 85, MeasureTab 56, PlywoodTab 38, AssemblyTab 32, MeasureSvg 31, CombiCutTab 26, MetalTab 25, MergeTab 21, CombiCutSim 12 …); 7 + 3,5 КБ — у потоках
src/workspaces 65 КБ старт 27; PlanEditor 25, BoqPanel 8, LayoutEditor 6 — ліниві
src/mes 0 у збірці відсутня
src/stand 26 КБ лише stand-*.js (окрема сторінка)
src/stounik 178 КБ усе на старті
src/kernel 187 КБ старт 112; потік ядра 71; решта дрібниця
opencascade.js (обгортка JS) 456 КБ двічі по 228: у geometry.worker і окремий лінивий файл для стенду
i18nStatic.ts 224 КБ × 3 старт + geometry.worker + packing.worker (через lib/project.ts:2 → i18n.ts:2)

2. Старт у браузері: що завантажилось, що крутиться без дотику

2.1 Стартовий екран ?mode=studio без проєкту

Прод [ФАКТ ✔, prod_start.mjs, prod_trace.mjs × 3]:

Dev [ФАКТ ✔, dev_stages.mjs, стан S0]: 382 запити, з них 343 файли з src/: components/ui 69, domain 46, kernel 32, engines 30, components/forms 20, utils 19, stounik 17, store 16, components/2d 16, constructor 14 (усі — constructor/drawing/*, docs/DrawingSetView, measure/i18n.measure, plywood/plywoodRules, store, ui), features 12, components/3d 7, workspaces 6, components/room 3 … Бібліотеки, що пішли на старті: three, R3F, drei, three-bvh-csg, pdf.js, xlsx, jspdf, jszip, html2canvas, react-dom/server. У тому числі kernel/occt/occtBuilder.ts (будівник ядра) — у головному потоці. PSS у dev — 604 МБ (dev важчий за прод на ~215 МБ: немініфіковані модулі і карти джерел).

2.2 Хто ставить таймери, кадри, потоки [ФАКТ ✔ — підміна setInterval/setTimeout/requestAnimationFrame/Worker/fetch у addInitScript, місце — за стеком; у проді — через карти джерел]

Хто Що За 30 с простою Ціна
kernel/KernelBadge.tsx:12 setInterval 700 мс, назавжди; у Студії плашка hidden (:31) 43 спрацювання головний потік зайнятий 0,011–0,13 с за 15–30 с усім разом (≤ 0,4 %)
stounik/Stounik.tsx:71 setTimeout 45 с — «дрімота» Стоуника, перезапускається кожним кліком/клавішею 1 —
stounik/useStounik.ts:82 setTimeout 1,5 с — перевірка проєкту після змін 1 на старті —
components/ui/LanguageDomTranslator.tsx:109 кадр лише при зміні DOM (MutationObserver на весь body, :103) 1 —
/@vite/client пінг dev-сервера 30 с 1 лише dev
store/settingsSync.ts:168 setInterval 10 хв — тягне спільні налаштування (лише з сесією або транспортом MES, components/auth/AuthContext.tsx:56) у пісочниці не стартує (нема бекенда) [ФАКТ ◔] 2 GET на 10 хв
components/3d/StounikLoader3D.tsx:71, components/3d/GlProbe.tsx:68, stounik/StoneRadio.tsx:86 інтервали лише поки показаний завантажувач 3D / ввімкнений режим «Стики» / грає радіо 0 —

2.3 Що крутить процесор, коли ніхто нічого не робить — перевірка «А/Б» [ФАКТ ✔, idle_ab.mjs, прод]

Процесорні секунди кожного процесу браузера за 15 с простою на стартовому екрані:

Стан GPU-процес Процес сторінки Головний потік
А. Стоуник «не спить» (перші 45 с після відкриття/кліку), очі анімуються 15,76 с 0,21 с 0,017 с
Б. Стоуник «заснув» (після 45 с без дотику — is-sleeping, анімацію знято) 0,01 с 0,02 с 0,011 с
В. Розбудили кліком, але всі анімації поставили на паузу вручну 0,00 с 0,02 с 0,012 с
Г. Порожня сторінка about:blank 0,01 с 0,00 с 0,002 с

Висновок: єдине, що на стартовому екрані працює без дотику, — анімація очей Стоуника. Вона не навантажує головний потік (стилі не перераховуються — 5 разів за 15 с), але змушує браузер складати кадри безперервно. У пісочниці (програмна відеокарта) це ціле ядро процесора; на справжній відеокарті — у рази менше, але кадри все одно йдуть 45 с після кожного кліку, а під час роботи людина клікає частіше, ніж раз на 45 с. [ГІПОТЕЗА: на ноутбуці — помітно для батареї й вентилятора, на настільному ПК — непомітно.] З prefers-reduced-motion анімація вимкнена (stounik/stounik.css:154).


3. Після відкриття проєкту, редактора, 3D Підбору [ФАКТ ✔, dev, dev_stages.mjs + kernmem.mjs]

Крок Довантажилось модулів Потоки PSS усього, МБ (сторінка / GPU) Купа JS сторінки Що робить у простої (15 с)
S0 старт 343 з src/ (382 запити) 0 604 (273 / 109) 58,4 МБ GPU 28,5 с CPU за 30 с — анімація Стоуника
S1 кейс 81 (2D-дошка) +2: kernel/occt/geometry.worker.ts, kernel/exactPartsCore.ts +1 — потік ядра, ядро готове за 4,5 с; wasm-пам'ять 100 МБ 1 044 (726 / 102) 60,3 сторінка 0,94 с CPU, головний потік — 0,03 с ([ГІПОТЕЗА] потік ядра дораховує контури / фонова компіляція), GPU 0 — Стоуник уже спить
S2 редактор (кухня) +0 — редактор уже був завантажений на старті — 1 059 (640 / 204) 64,1 3D малює безперервно: GPU 26,2 с CPU, 49 кадрів (SwiftShader)
S3 3D Підбір +11: components/3d/Viewer3D.tsx, BacklightRig, StounikLoader3D, useSafeTextures, engines/arExport.ts + USDZ/GLTF-експортери (AR), arSceneRegistry, grouping3d — 1 078 (650 / 213) 67,6 GPU 24,9 с CPU, 138 кадрів
S4 назад у 2D +0 ядро лишається 996 (647 / 134) 67,1 тиша: GPU 0,01 с, сторінка 0,04 с

4. Пам'ять: звідки ~500 МБ ядра [ФАКТ ✔, kernmem.mjs, kernmem2.mjs, wasminfo.mjs, wasmcomp.mjs]

4.1 Сам файл ядра

opencascade.full.wasm 50 305 130 байт (50,3 МБ)
стиснений gzip-9 / brotli-5 / brotli-11 13,9 / 11,7 / 9,6 МБ (коментар у kernel/occt/loadOcct.ts:5 — «~9 МБ» — підтверджено)
функцій у модулі 207 968
секція коду / секція даних 37,3 МБ / 12,0 МБ
пам'ять wasm: початкова / максимум 100 МБ (1 600 сторінок) / 4 ГБ
прив'язок OCCT до JS (embind), створюються при запуску 24 878 (8 027 класів, 62 996 методів)

Як хостинг віддає .wasm (чи стискає, чи кешує надовго) — у репозиторії не описано: ні vercel.json, ні налаштувань сервера статики нема [сторона ІТ]. Від цього залежить, скільки качає перше відкриття редактора/3D: 50 МБ чи 10–14 МБ. Плюс loadOcct.ts:38 робить окремий HEAD-запит заради розміру файла (дрібниця).

4.2 Розклад пам'яті процесу сторінки до/після запуску ядра (/proc/<pid>/smaps)

До ядра Після ядра (до прибирання) Після ядра (після прибирання пам'яті)
PSS усього браузера 587–592 1 031 (+444) 916 (+324)
Процес сторінки (у ньому й потік ядра) 239–243 692 572
— анонімна пам'ять (купи JS, буфери) 180–185 610 491
— купа JS потоку ядра (CDP Runtime.getHeapUsage) — — 148 МБ зайнято / 192 МБ виділено
— лінійна пам'ять wasm (зарезервовано 100 МБ) — 13 реально зайнято 13–20 (кейс 81, редактор, 3D)
— код JIT (JS + wasm) 1 9 8–14
Купа JS головної сторінки 56,2 56,3 56,2 — не змінюється

Що це означає простою мовою:

4.3 Хто ще тримає пам'ять


5. Секунди 12.10 (зведено з ЗАМІРИ_12-10_ШВИДКІСТЬ_І_СТОУНИК.md, не переміряно)

До/після №271–№278 (прод MR !8 → сьогоднішній код; пісочниця, SwiftShader):

Довгі місця зараз і куди Стоуника (з 12.10):

  1. Редактор, перша деталь при холодному ядрі — 17–24 с, у 3D порожня сітка → Стоуник-завіса в 3D редактора (як №274).
  2. Зміна кромки 2,4–5,9 с, сторінка жива, але стара картинка → малий Стоуник «перебудовую…» з порогом ~0,5 с.
  3. Перший розкрій після відкриття — кнопка чекає ядро ~5,6 с → Стоуник біля дошки.
  4. 3D Підбір вперше 4–12 с — Стоуник уже стоїть (№274).

Розклад холодного редактора (проста стільниця): 0,2–3,0 с — створення WebGL-полотна (у профілі getContext 2,6 с); 3,1–9,1 с — карта відблисків (PMREM + зчитування, readRenderTargetPixels 5,8 с); лише на 9,1 с створюється потік ядра; 9,1–16,3 с — ядро вантажиться 5,6 с і будує. Ядро стартує після роботи полотна, а не паралельно.

Проба прогріву ядра (пісочниця, не в коді): редактор вперше 16,7 → 9,6 с (клік через 9 с після старту), 17,3 → 10,0 с (через 3 с); перший розкрій 5,6 → 0,5 с; 3D Підбір одразу після кейсу 11,6 → 13,2 с (без змін — там гальмує графіка); старт не висне. Ціна — пам'ять ядра для кожного одразу. Залишок ~9,5 с першого редактора — графіка пісочниці (полотно 3,0 + відблиски 5,7 с); [ГІПОТЕЗА 12.10] на справжній відеокарті — у рази менше.

Що додають сьогоднішні заміри L7 до цієї картини:

5.1 Що ще можна прибрати зі старту і скільки це дасть

Байти — розрахунок з виміряних розмірів (карти джерел, прод); час і пам'ять — [ГІПОТЕЗА].

Крок Що Мінус зі старту, КБ сирого Складність
А1 pdf.js + xlsx + approvalImport — вантажити по кнопці імпорту бланка (виклики вже асинхронні: utils/approvalImport.ts:3985,4359,4616,4630) 889 мала
А2 jspdf — у момент експорту (utils/export.ts:1, utils/export/quotePdf.ts:1, DrawingSetView.tsx:13) 326 мала
А3 html2canvas — у момент баг-репорту (BugReporterDialog.tsx:6,36) 200 мала
А4 пакет креслень (react-dom/server + constructor/drawing) — у момент експорту (DxfExportDialog.tsx:5-6,48; kernel/shopSheets.ts:32-37) ~290 мала
А5 jszip/pako/fflate — коли всі користувачі вище стануть лінивими 151 мала
А6 Довідка — React.lazy 97 мала
А разом ≈ 1 953 (32 %)
Б1 креслення кромок — по першому показу каталогу/мініатюри 512 середня
Б2 словник en/pl — лише при виборі мови (обережно з перекладачем DOM) 241 середня
Б3 теми Стоуника (topics, leoTopics) — при відкритті вікна 121 середня
А + Б ≈ 2 827 (46 %)
В 3D-рушій з редактором — React.lazy для редактора, Sidebar3D, кімнати; three core лишиться (його тягнуть рушії) ≈ 1 030 велика
А + Б + В ≈ 3 860 (63 %)
дрібне будівник ядра з головного потоку (29), тестові дані з main.tsx:14 (0,8), словник із двох потоків (2 × 224 — не старт, а потоки) 30 (+448 у потоках) мала

[ГІПОТЕЗА] що дасть А + Б: стиснено ≈ −0,85 МБ із 1,87 МБ; компіляція+виконання на старті ≈ 0,33–0,38 с у пісочниці → мінус ~0,1–0,17 с; перше відкриття на повільному інтернеті (5 Мбіт/с) — мінус ~1,4 с, на 20 Мбіт/с — ~0,35 с (повторні відкриття — з кешу, якщо хостинг його дає); пам'ять старту — мінус 20–40 МБ. Тобто це прибирання «заради порядку і повільних каналів», а не ліки від 10–20-секундних очікувань — ті сидять у першому 3D і в холодному ядрі.


6. Стан знахідок 02.09 у цій лінзі

Окремої лінзи «швидкість» 02.09 не було; про вагу і старт писали L3 (важкі файли, файли-дані) і план 03.09 01_МЕЙН/ЩО_ВИНОСИМО_З_VS3D.md. Порівнюю з тим, що записано там.

# Знахідка 02.09 / 03.09 Стан 13.10 Доказ
1 Файли-дані в коді: edgeProfileDrawings.ts 440 КБ (56 SVG), i18nStatic.ts 239 КБ, edgeProfileImages.ts 81 КБ (L3, 00_ЗВІТ §6) Відкрито: 439,6 / 249,7 (+10,7) / 80,9 КБ; у збірці всі три — на старті (435 / 224 / 77 КБ), словник ще й у двох потоках wc -c, grep -c "<svg" = 56; карти джерел
2 Важкі файли (рядки): approvalImport 4 805, Detail3DPreview 2 914, geometry 2 754, ProductEditorWorkspace 2 558, FormsPanel 2 346, packing 2 029, Viewer3D 1 974, SlabBoard 1 556 Змінилось — ростуть: 4 805 / 3 530 / 2 613 / 2 974 / 2 392 / 2 042 / 2 102 / 1 642; новий важкий — kernel/occt/occtBuilder.ts 1 628 wc -l
3 ProductEditorWorkspace.tsx — невикористані імпорти, залежність від FormsPanel лише заради sideOptionsFor (L3) Відкрито: TS6133 на :2, :6, :21, :58; через FormsPanel редактор (і старт) тягне pdf.js + xlsx gates/tsc.txt
4 Мертвий блок Viewer3D.tsx:628-1353 (L3) Не перевірено тут (лінза L3). Для швидкості: Viewer3D — лінивий файл 34 КБ, мертвий код важить лише там —
5 eng.traineddata 5 МБ у корені web-app (L3) У знімку vs-cad файла нема; tesseract — лінивий (17 КБ, utils/approvalImport.ts:578) ls
6 lib/loadWithProgress.ts живий через динамічний імпорт (L3 #20) Без змін; плюс Vite попереджає: utils/file.ts імпортується і динамічно (App.tsx:517), і статично — динамічний імпорт марний L7_build.out
7 «Головний чанк ≈ 5 МБ; 3D уже в окремому чанку» (03.09) Змінилось: 9 файлів, усі на старті — 6,1 МБ; 3D Підбір лінивий, але three/R3F/drei (1,2 МБ) на старті через редактор розділ 1
8 «pdfjs статично в головному чанку, 0,5 МБ» (03.09, ПИТАННЯ 2) Відкрито: pdf.js 478 + xlsx 332 КБ на старті FormsPanel.tsx:16-20
9 «У браузер їде лише та дочка, яку відкрили» (03.09, shell/) Відкрито: реєстр є, але не підключений shell/workspaces.ts:19; main.tsx:60-69

7. Ключові знахідки

  1. [ФАКТ ✔] Старт = 6,1 МБ JS (1,87 МБ gzip / 1,46 МБ brotli) + 187 КБ CSS, 9 файлів, усі одразу; 71 % цього коду на стартовому екрані не виконується жодного разу (4,33 МБ). — dist/index.html, covmap.mjs.
  2. [ФАКТ ✔] CAD, білдінг, MES, CombiCut, стенд — не причина ваги й не «живі»: на старті CAD 107 КБ (креслення через components/2d/board/DxfExportDialog.tsx:5-6), білдінг 37 КБ, CombiCut 0,9 КБ, MES і стенд — 0; виконалось 8 % / 6 % (лише оголошення). Вкладки — ліниві (components/WorkspacePane.tsx:20-27, 60-62). src/mes у збірці відсутня.
  3. [ФАКТ ✔] Важке на старті — бібліотеки документів 1,67 МБ (pdf.js 478, xlsx 332, jspdf 326, html2canvas 200, react-dom/server 184, zip 151), потрібні лише за кнопками; тягнуть їх components/ui/FormsPanel.tsx:16-20, components/ui/BugReporterDialog.tsx:6-7, constructor/docs/DrawingSetView.tsx:11,13, utils/export.ts:1, utils/export/quotePdf.ts:1.
  4. [ФАКТ ✔] 3D-рушій (1,21 МБ) і весь редактор деталі на старті, бо App.tsx:38 імпортує ProductEditorWorkspace статично (+ App.tsx:11 Sidebar3D, components/WorkspacePane.tsx:11 RoomEditor); відкриття редактора не довантажує жодного модуля. Лише для одного світла в 3D на старті 247 КБ таблиць (components/3d/SceneLighting.tsx:5).
  5. [ФАКТ ✔] Дані в коді ≈ 1,0 МБ на старті: креслення кромок 435 + 77, словник en/pl 224 (+17), довідка 97, теми Стоуника 121, каталог послуг 35. Словник ще й у кожному з двох потоків (lib/project.ts:2 → i18n.ts:2).
  6. [ФАКТ ✔] Без дотику на стартовому екрані працює лише анімація очей Стоуника (stounik/stounik.css:17-18): GPU-процес 15,8 с CPU за 15 с, поки Стоуник «не спить» (45 с після кожного кліку, stounik/Stounik.tsx:37,71); заснув / анімації на паузі / порожня сторінка — 0,00–0,01 с. Головний потік не зачеплений.
  7. [ФАКТ ✔] 3D у редакторі й Підборі малює кадри безперервно, поки відкрите (нема frameloop: components/3d/Viewer3D.tsx:1943, components/ui/Detail3DPreview.tsx:3343, components/room/RoomEditor.tsx:368): GPU 25–26 с CPU за 15 с простою в пісочниці; вийшли з 3D — тиша.
  8. [ФАКТ ✔] Плашка ядра схована, але її таймер 700 мс крутиться завжди (kernel/KernelBadge.tsx:12, main.tsx:65): 43 спрацювання за 30 с, ≤ 0,4 % головного потоку — «живе, але не гальмує». Мережевих опитувань за 30 с — 0, потоків на старті — 0.
  9. [ФАКТ ✔] Ядро OCCT спить до першої потреби (потік — kernel/occt/workerClient.ts:152), стартує саме при відкритті проєкту з деталями, далі тримає +324…+444 МБ до закриття вкладки (12.10: ~500). Найбільше — купа JS потоку 148/192 МБ: 24 878 прив'язок OCCT (повна збірка); wasm-пам'ять 100 МБ зарезервовано, 13–20 МБ зайнято; код JIT 8–14 МБ.
  10. [ФАКТ ✔] Файл ядра 50,3 МБ → 13,9 МБ gzip / 9,6 МБ brotli-11; 207 968 функцій, початкова пам'ять 100 МБ. Як його віддає прод-хостинг — невідомо [сторона ІТ].
  11. [ФАКТ ✔] Будівник ядра (29 КБ) їде в головний потік на старті, хоча працює лише в потоці: kernel/occt/outline2D.ts:18 імпортує occtBuilder статично, а outline2D беруть заради expandRing kernel/exportCutDxf.ts:52 і kernel/shopSheets.ts:42. Також тестові дані в проді: main.tsx:14.
  12. [ФАКТ ✔] Сам старт швидкий: перший змістовний малюнок 0,66–0,81 с, load 0,51–0,66 с, JS на головному потоці 0,33–0,38 с (пісочниця, локальний сервер). Довгі секунди — перше 3D (графіка, 12.10: ~9 с у пісочниці) і холодне ядро (запуск 4,5–5,6 с; з першою деталлю 5,8–7,4 с).

8. Питання власнику

  1. [ПИТАННЯ] Очі Стоуника. Анімація змушує браузер малювати кадри 45 с після кожного кліку (виміряно; на справжньому ПК — дешевше, ніж у пісочниці, але постійно). Лишаємо як є, чи нехай рухаються лише при наведенні / коротким «моргом» раз на хвилину?
  2. [ПИТАННЯ] Імпорт бланка погодження (PDF/Excel) — 0,9 МБ на старті в кожного менеджера (те саме ПИТАННЯ 2 з 03.09). Він живий у роботі? Якщо рідкісний — вантажити по кнопці.
  3. [ПИТАННЯ] Прогрів ядра (№279). Ціна: +324…444 МБ пам'яті й 10–14 МБ завантаження (або 50 МБ, якщо хостинг не стискає) для кожного, хто відкрив Студію. Для всіх — чи лише на ПК і лише коли проєкт порожній (бо з деталями ядро й так стартує саме)?
  4. [ПИТАННЯ] 3D, що малює безперервно. Чи є в редакторі/Підборі щось, що мусить рухатися саме по собі (плавна підсвітка, плавна камера)? Якщо ні — малювати лише при змінах.
  5. [ПИТАННЯ, сторона ІТ] Як прод віддає .wasm і JS: стиснення (gzip/brotli), довгий кеш для файлів з хешем?
  6. [ПИТАННЯ] (відкрите з 12.10) Справжні секунди з ПК Богдана — ті самі сценарії в його Chrome; і чи є серед менеджерів ноутбуки/слабкі машини (для них анімації й безперервне 3D важать більше).

9. Пропозиції (не рішення)

[ПРОПОЗИЦІЯ] Усе нижче — варіанти; нічого не зроблено.

  1. Ліниві бібліотеки документів (крок А, ≈ −1,95 МБ зі старту, ризик малий). await import() у місці виклику: pdf.js/xlsx/jszip усередині utils/approvalImport.ts (функції вже асинхронні), html2canvas/jszip у BugReporterDialog, renderPackagePdfBytes у DxfExportDialog, jspdf у utils/export.ts і quotePdf.ts; React.lazy для HelpDialog. Перевірка — розміри dist/ і ті самі зонди prod_start.mjs/covmap.mjs.
  2. Дані — по потребі (крок Б, ≈ −0,87 МБ). Креслення кромок — по першому показу каталогу/мініатюри; теми Стоуника — при відкритті вікна; словник en/pl — при виборі мови (перевірити LanguageDomTranslator в uk).
  3. 3D з редактором — лінивим (крок В, ≈ −1 МБ, робота більша). React.lazy для ProductEditorWorkspace, Sidebar3D/DetailEditor3D, RoomEditor; three core лишиться (рушії). Розумно робити разом із підключенням реєстру «дочок» shell/workspaces.ts (03.09).
  4. Стоуник: менше кадрів. Рух очей — коротким імпульсом або лише при наведенні; або пауза анімації, коли вкладка не в фокусі. Перевірка — idle_ab.mjs (стан А має наблизитись до Б).
  5. 3D «за потреби»: frameloop="demand" + invalidate() при змінах (камера, підсвітка BacklightRig, завантаження текстур). Ризик: місця з useFrame, що чекають кадр (components/3d/Viewer3D.tsx:41,500, BacklightRig.tsx:204) — потребують invalidate; перевірити очима.
  6. Плашка ядра в Студії — не монтувати або не крутити таймер, коли hidden (kernel/KernelBadge.tsx:12); дрібниця, але це 1,4 тіки/с назавжди.
  7. Потоки й головний потік без зайвого: statusLabel з lib/project.ts винести, щоб словник не їхав у потоки (−224 КБ у кожному); expandRing винести з outline2D.ts, щоб будівник не їхав у головний потік; прибрати mockData з main.tsx:14 у dev-гілку.
  8. Ядро: (а) прогрів №279 — лише на ПК і лише без деталей у проєкті; (б) [ГІПОТЕЗА] зупиняти потік ядра після довгого простою (звільнить 324–444 МБ, ціна — 5,6 с при наступному запуску); (в) довго — своя збірка OCCT під наші класи (менше файл, менше прив'язок → менша купа потоку).
  9. Хостинг [сторона ІТ]: заздалегідь стиснений .wasm.br (9,6 МБ замість 50,3) і довгий кеш для файлів із хешем.
  10. Повторний замір після будь-якого з кроків — тими самими зондами з додатку (окремо прод і dev).

10. Додаток: що запускалось

Усе — у /tmp/final/audit1310/probe-L7/_l7/, результати — у _l7/out/. Важке — під heavy.lock, у фоні.

Що Команда / скрипт Результат
Копія за брифом tar … | (cd probe-L7 …) + cp -al node_modules diff -rq vs-cad/src probe-L7/src — порожньо
Прод-збірка npx vite build --sourcemap (замок; 13 с) L7_build.out, probe-L7/dist/
Розклад збірки node smap.mjs dist > smap.json; node report.mjs smap.json dist start.json report.txt, start.json
Частини для власника node parts.cjs таблиця розділу 0
Склад wasm node wasminfo.mjs …opencascade.full.wasm розділ 4.1
Стиснення wasm node wasmcomp.mjs …wasm (замок; brotli-11 — 135 с) L7_pw3.out
Статичний сервер прод node static.mjs dist 7302 (/api/* → 404, як хостинг без бекенда) —
Dev-сервер npx vite --port 7301 з probe-L7 (7188 мертвий) L7_vite7301.log
Прод-старт prod_start.mjs 7302 (замок) — ресурси, таймери/потоки/fetch, анімації, coverage, 30 с простою з профілем, пам'ять out/prod_start.json, out/prod_coverage.json
Покриття → джерела covmap.mjs dist out/prod_coverage.json out/prod_covmap.json розділ 1.2
Місця таймерів у проді lookup.mjs dist "/assets/main-….js:1128:52308" … KernelBadge.tsx:12, Stounik.tsx:71, useStounik.ts:82, aiEndpoint.ts:21, api.ts:324
Чотири стани в dev dev_stages.mjs 7301 (замок) — S0…S4 out/dev_stages.json, out/dev_coverage_S0_старт.json
А/Б простою idle_ab.mjs 7302 (замок) out/idle_ab.json
Пам'ять ядра kernmem.mjs 7301, kernmem2.mjs 7301 (CDP браузера на 9555 — купа потоку) (замок) out/kernmem.json, out/kernmem2.json
Холодний старт прод prod_trace.mjs 7302 out 3 (трасування Chromium, 3 прогони) (замок) out/prod_trace.json

Спільне в усіх зондах: Chromium /opt/pw-browsers/chromium-1194, SwiftShader (--use-gl=angle --use-angle=swiftshader --enable-unsafe-swiftshader --ignore-gpu-blocklist), вікно 1600×1000, uk-UA, усі зовнішні адреси заблоковані, localStorage stounik-welcome=off. Процесор і PSS — лише процеси Chromium, нащадки свого скрипта (/proc).

Не перевірено / межі: