файл:рядок у vs-cad/src (= web-app/src). Сервер, авторизація й інтеграції не оцінювались (сторона ІТ). Секунди — з хмарної пісочниці без відеокарти.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 і ринкові дослідження, бо вони не про код. Бази для порівняння:
- аудит 02.09 (його числа й адреси);
- знімок MR !8 — гілка зведення 12.10.
Як. Сім лінз паралельно, кожна — окремий звіт з адресами файл:рядок (додатки L1–L7, ≈3 100 рядків фактури):
- L1 — розкрій;
- L2 — геометрія, ядро OCCT і кромки;
- L3 — мертве, важке, хардкод і що вшито в Студію;
- L4 — доки проти коду;
- L5 — історія і стан знахідок 02.09;
- L6 — гроші;
- L7 — швидкість, старт і пам'ять.
Окремо зроблено реєстри: 03 (мертве й задвоєне), 04 (дерево коду), 05 (стан знахідок 02.09). Зонди (пробні тести й скрипти) жили лише у власних копіях:
- синтетичні деталі;
- ядро OCCT у node;
- Playwright на стендах;
- прод-збірка з картами джерел.
Код проєкту не змінювався. Потім аудитор (Лео) власноруч перевірив ключові знахідки — список у розділі 9.
Позначки достовірності.
[ФАКТ ✔]— виміряно запуском, grep, зондом або прогоном;[ФАКТ ◔]— прочитано в коді з адресою;[ГІПОТЕЗА]— правдоподібно, без прямого доказу;[ПИТАННЯ]— вирішує власник.
Рішень у цьому документі немає. Пропозиції зібрані окремим блоком наприкінці (розділ 10).
Межі. Не оцінювались (сторона ІТ; де торкається — позначено «[сторона ІТ]»):
server/,lib/api.ts;- авторизація, Keycloak;
- 1С / WMS / Orders;
- Python-MES Бруно.
Усе міряно в хмарній пісочниці: 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 |
Два червоні тести — ті самі «відомі»:
__tests__/coreBoundary.test.ts, межа ядра, падає через одинimport typeуengines/shapeBuilder.ts:2;parsers/dxf/parser.test.ts, шляхC:/hhgh/…з чужої машини.
Пропущені 19 тестів — нативні тести Бруно, вмикаються змінною CAD_PROFILED_BASE_NATIVE=1.
0. Відповіді на твої питання — коротко
«Може, все через те, що в Студії вшиті CAD і білдінг? Чи вони мертві, поки ми в них не зайшли?»
Вони сплять і не гальмують [ФАКТ ✔, L7 + L3].
Вкладки конструктора лінуються — їхній код вантажиться лише при вході, до того його в браузері немає:
- CAD: замір, метал, фанера, збірка, зведення, документи, CombiCut;
- BUILDING: план, розкладка, відомість.
Що від них таки лежить на старті:
| Що | Обсяг на старті | Хто тягне | Виконується |
|---|---|---|---|
| Модуль креслень 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, не видалено жодного файла.
Старт:
- браузер качає 6,1 МБ коду (1,87 МБ стисненого), і 71 % цього коду на стартовому екрані не виконується;
- перший малюнок з'являється за 0,66–0,81 с.
Де насправді довгі секунди [ФАКТ ✔, заміри 12.10 + L2 + L7]:
- Перше 3D-вікно: створення полотна і карти відблисків — 9 с у пісочниці. На справжній відеокарті має бути в рази менше
[ГІПОТЕЗА]. - Холодне ядро OCCT: запуск 4,5–6 с і ~0,5 ГБ пам'яті до закриття вкладки.
- Зміна кромки на дузі: 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. Головне — дванадцять знахідок
-
Після зсуву вирізу 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.
- Причина. Кеш точних контурів упізнає деталь за зовнішнім контуром і кількістю вирізів, а не за їх місцем (
-
Розкрій, поки чекає ядро, губить правки людини.
[ФАКТ ✔ — перевірено]- Як губить. Розкрій бере знімок проєкту до очікування (
store/slices/packingSlice.ts:105–115) і після приходу контурів записує його назад (:204–205). - Що зникає. Доданий сляб, правка шапки, посунута деталь, навіть Ctrl+Z.
- Друга вада — «вішає» розкрій. Правка під час роботи потоку розкрою відкидає його відповідь (
projectSlice.ts:20→packingSlice.ts:224), а крутилкаisPackingлишається увімкненою. Кнопки сірі, «Зберегти в кабінет» відмовляє. - Без межі. Очікування ядра не має ні таймауту, ні обробки помилки.
- Як губить. Розкрій бере знімок проєкту до очікування (
-
Гроші: метраж кромки №250 на Г/П з радіусом чи фаскою кута завищений на 43–50 %.
[ФАКТ ✔ зонд L6]- Приклад. Г 2400×1600 з R100 при припуску 0: сума кромки 11 357 мм при периметрі 7 957. Сторона F рахується як 4 000 замість ~1 600.
- З припуском 10. У метраж іде контур уже з припуском.
- Адреса.
engines/geometryUtils.ts:435–458. - Чому тест не бачить. Тест №250 перевіряє Г лише без кутів.
-
Гроші: прямокутний виріз зі скругленими кутами рахується як круглий отвір.
[ФАКТ ✔ — код + зонд L6]- Причина. Перевірка «схожий на коло» дивиться, чи вершини рівновіддалені від центру (
engines/productionFacts.ts:171–184). У скругленого прямокутника всі вершини стоять біля кутів — і він «стає колом». - Наслідок — інша послуга:
- варильна 562×492 R5 → «великий отвір» 2,1 м замість «периметра вирізу»;
- розетка 80×80 R10 → «малий отвір» 1 шт;
- мийка R10 — так само.
- Регрес після 25.09
[ФАКТ ◔].
- Причина. Перевірка «схожий на коло» дивиться, чи вершини рівновіддалені від центру (
-
Гроші: метал рахується як камінь, і 39 з 70 профілів кромок дають нуль.
[ФАКТ ✔/◔ L6]- Метал. Факти виробництва відсівають лише фанеру (
productionFacts.ts:245–250). Труба 2 м дає 4,08 м «різу пилою». Її площа йде в «Матеріал», «Монтаж», «Пакування» і в замовлення ERP. - Профілі без правила. 39 з 70 профілів кромок (серед них l_20) не мають правила й мовчки дають нуль у кошторисі (
domain/serviceMapping.ts:313–349). На 02.09 таких було 38.
- Метал. Факти виробництва відсівають лише фанеру (
-
Кромки: усі секунди йдуть на віднімання, і найгірший випадок ніхто не сторожить.
[ФАКТ ✔ зонд L2]- Розклад часу. На Г власника: віднімання 82 %, перевірки 7–12 %, інструменти 6–9 %.
- Три віднімання замість одного. Перший спосіб («одним списком») на стику дуги з прямою завжди дає зламане тіло. Тому кожна правка платить три булеві операції (
occtBuilder.ts:941–990). - Найгірший випадок. Г власника з d_20: перевірка не сходиться, ядро відкочується на старий лофт — 26,6 с (
occtBuilder.ts:863–869). Сторожі цього не тримають. - Вихід. «Одна труба» — розділ 0.
-
Кеш плити з кромками (№278) витісняється точними контурами розкрою.
[ФАКТ ✔ — перевірено]- Причина. Кеш має лише 2 місця на ядро (
kernel/occt/profiledBaseCache.ts:13). У нього ж пишуть точні контури розкрою (kernel/occt/outline2D.ts:206). - Наслідок. Після двох контурів деталей з вирізами зсув вирізу в редакторі займає 3,9 с замість 0,2 с.
- Чия помилка. Це недогляд у моїй №278: плиту без кромок кешувати нема сенсу.
- Причина. Кеш має лише 2 місця на ядро (
-
Старт: 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. -
Що працює без дотику.
[ФАКТ ✔ L7]- 3D малює кадри безперервно, поки відкрите, навіть коли нічого не змінюється. У коді жодного
frameloop, тож працює режим за замовчуванням «завжди». - Очі Стоуника анімуються 45 с після кожного дотику. У пісочниці це дорого, бо графіку малює процесор; на справжній відеокарті — копійки
[ГІПОТЕЗА]. - Схована плашка ядра оновлюється таймером кожні 0,7 с.
- Чого немає: мережевих опитувань і потоків на старті.
- 3D малює кадри безперервно, поки відкрите, навіть коли нічого не змінюється. У коді жодного
-
Персональні дані в коді.
[ФАКТ ✔ — лише лічильник, значень не відкривав]- Що.
mes/data/orders.tsмістить поляcustomerз прізвищами клієнтів п'яти реальних кейсів. - Чому ризик. Файл лежить у
src/і їде в GitLab разом із кодом. Сам модуль MES ніким не підключений. Правило «персональні дані — не в репозиторій» порушене.
- Що.
-
Процес: робота лише на диску, дві теки, «відомі» червоні тести.
[ФАКТ ✔ L5 + перевірено]- Не в GitLab. 44 файли (+4 358 / −285 рядків, №270–№278) лежать лише на диску.
- Знімок MR !8. Він уже містить №267–№269, хоча журнал і ПАМ'ЯТЬ кажуть, що ні.
- Дві теки.
web-appіvs-cad— одна програма. Кожну правку робимо двічі руками. Правило «файли патчу різні в копіях» (ПАМ'ЯТЬ_ЛЕО §2.8) застаріло. - Червоні тести. Два тести 5+ тижнів пишуться як «відомі» — новий червоний тест сховається серед них.
-
Доки відстали від коду на місяць.
[ФАКТ ✔ L4]- OCCT мовчить. Головні доки не згадують OCCT жодного разу: АРХІТЕКТУРА, MANIFEST, БІЗНЕС, КАРТА_МОДУЛІВ, ПЛАН_І_СТАН, README, СТАРТ, ДЛЯ_НАСТУПНОГО, КАРТА_ПАПОК.
- Неописані теки. Вісім нових тек коду (149 модулів, ~29 тис. рядків) не описані.
- Числа не збігаються:
- у доках 17 різних кількостей тестів (факт — 1 856);
- тем Стоуника 71 + 21, а не 66 + 21.
- Вхід адміна. Доки пишуть «PIN», а з №263 це логін і пароль.
- Ціни на сервері. СПІЛЬНІ_НАЛАШТУВАННЯ пишуть «гроші на сервер не їдуть», а код возить прайс-бук разом із калібрувальними цінами (
store/settingsSync.ts:63–86).
Що стало краще з 02.09 — чесно, теж виміряне:
- «Дві математики» розкрою закриті: один будівник кутів і один ніж для всіх стиків. Г з радіусом увігнутого кута дає 0,452 м² у всіх типах стику (02.09 — 0,4520 / 0,4520 / 0,4480).
mirrorLзакрито: ліва Г більше не стає правою в розкрої.- П-14 вирішено, вирізи в розкрої мають
cornerRadius. - Кутовий стик більше не губиться поруч із довільним.
- Ядро OCCT дало точні контури для розкрою, DXF і PDF.
- Нові теки (ядро, CAD, Стоуник) — 0 помилок tsc.
- Втрата на кшталт 22–23.08 не повторилась: робоча копія містить усе з MR !8.
- Секунди 12.10 стали в рази кращими. Наприклад, повторний вхід у 3D Підбір: 27 с → 1,5 с, і сторінка більше не висне.
2. Розкрій — що змінилось і де тонко (L1)
Конвеєр сьогодні. Кнопки на дошці (SlabBoard.tsx:1044–1111) запускають runPacking → triggerPackingAsync (packingSlice.ts:56). Далі:
- нормалізація проєкту;
getAllProjectDetails;explodeDetails(engines/geometry.ts:2588);- нове з №246 — чекаємо точні контури ядра:
cutOutlineProvider().prepare(:100); finishPacking, у якому на сляби йде лише камінь (stoneParts, №256);- потік розкрою
autoPack(engines/packing.ts:1851); - колізії по точному контуру (
detectConflicts,:1916); - текстури.
Повна схема з адресами — 02_МАРШРУТИ_ОПЕРАЦІЙ_13-10.md, розділ 2.
Очікування ядра [ФАКТ ◔ + ✔]:
- поки ядро рахує, людина бачить лише спінер
Loader2на кнопці; - межі очікування немає;
- при завислому потоці ядра кожна деталь з дугою чекає до 120 с (
kernel/cutOutlines.ts:84–114,workerClient.ts:31); - плашка ядра в Студії схована (
KernelBadge.tsx:31), тож про збій ніхто не дізнається, а розкрій мовчки йде по ламаній.
Перший розкрій після відкриття проєкту:
| Сторінка | Результат | |
|---|---|---|
| До №277 | висла 5,5 с | на 6,8 с |
| Тепер | жива | на 8,2 с |
Заміри 12.10, пісочниця. З прогрівом ядра — 0,5 с (проба, пропозиція 10.5).
Відкрите з 02.09 [ФАКТ ✔]:
- перепил 70 мм досі без налаштування в інтерфейсі, і після авторозкрою 6–8 з 10 деталей «червоні». Пакувальник про перепил не знає (
packing.ts:302–342), колізії знають (:1947–1969); - кожна хорда дуги перевіряється як прямий пропил пилою (
:1951), хоча дуги на CombiCut ріже вода; - радіус кута вимикає розгортку підвороту в «Повній текстурі» (
packing.ts:587–590); - режим розкрою не зберігається після перезавантаження (
packingSlice.ts:293); - дзеркалення без умови «без обробки кромки» (
packing.ts:466–471); - два ключі текстурних груп (
geometryUtils.ts:20іtextureLayout.ts:37); loadWithoutPackingбез матеріалу (projectHelpers.ts:115).
Нове:
- «Перевірити розкладку» рахує фанеру й метал як камінь (
SlabBoard.tsx:1122→packing.ts:1892); - «Перерахувати слеб» перескладає весь проєкт без підтвердження (
SlabBoard.tsx:1544); - для CombiCut є два різні контури: DXF «Combicut» з дошки — з припуском (
kernel/exportCutDxf.ts:96,179), вкладка CombiCut — номінальний (engines/combicut/plan.ts:146); - пакет для MES і експорт PNG беруть ламану (
mesPack.ts:401,App.tsx:559).
Тести розкрою: 20 файлів, 142 тести, усі зелені [ФАКТ ✔].
3. Геометрія, ядро OCCT і кромки (L2)
Ланцюг від чернетки до тіла [ФАКТ ◔]: чернетка → modelFromDraft → KernelModel → черга прев'ю → кеш складань №275 → потік ядра №277 → occtBuilder.buildAssembly → кеш плити №278 → buildShapeUncached → тіла → three.js.
Паралельно живуть:
- розкрій:
explodeDetailsз власною розкладкою; - гроші: 2D-полігони, ядро їх не бачить.
Схема з адресами — 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 | лише холодний старт | — |
Діри, що перейшли в ядро [ФАКТ ✔]:
- профіль прорізається під ногою (
edgeOccupancy.ts:45читає лише UI); - гнутий елемент будується на увігнутому куті (
radiusElement.ts:242,arcBands.ts:114); - мийка збирається за іменами частин (
sinkAssembly.ts:52–94); - на опуклій дузі гроші й 3D розходяться. Профіль лише на одній стороні дає половину дуги в метражі й дугу без профілю в 3D. З галочкою «Стандарт» дуга в метражі рахується 1,5 раза (
edgeCutters.ts:964–982протиgeometryUtils.ts:447).
4. Гроші — два рушії і їхні дірки (L6)
Після 03.09 рушіїв два — «Комерційну пропозицію» видалено [ФАКТ ✔]:
| Кошторис | Прорахунок | |
|---|---|---|
| Рушій | engines/estimate.ts |
engines/quoteCalc.ts |
| Звідки кількості | факти → правила | власна математика за площею партів |
Ядро OCCT гроші не використовують. Правило ціни одне для обох (manual ?? erp ?? 0, ручна — лише в калібруванні), але функцій дві (estimate.ts:176, quoteCalc.ts:191).
Три закони метражу кромки і три площі [ФАКТ ✔ зонд]:
- бланк погодження рахує кромку по контуру з припуском і без дуг (
quotePdf.ts:1056–1063); - прорахунок кромок не рахує взагалі.
Площа на синтетичному проєкті:
| Документ | Площа |
|---|---|
| Кошторис | 8,871 м² |
| Прорахунок | 8,044 м² |
| «Загальна площа» в бланку | 8,871 м² |
Різниця — чаша мийки й метал.
Відкрите з 02.09 і нове [ФАКТ ✔ зонди L6]:
- замовлення в ERP за ручними (калібрувальними) цінами не стримується (
QuoteOrderCard.tsx:147–167); - калібрування, ввімкнене адміном, лишається в браузері після його виходу;
- подвійний рахунок: кут на доповненні (
productionFacts.ts:419–448), дуга з «Обробкою торців» (:457–474); - «Стикування в площині» рахується за формою деталі (
quoteCalc.ts:528–534): пряма стільниця зі стиком дає 0; - пропил ×2 ставиться на кожне з'єднання, разом із підворотами;
- з 40 послуг прорахунку частина без коду 1С (керамограніт 10, кварцит 12, натуральний 24, акрил 37), серед них «Виріз під мийку» і
surface_processing; - набір ВіярПро для кварциту використовує 7 кодів, яких немає в «Актуальних послугах 2026 цех 202»;
- «Додаткові послуги» паспорта деталі (
customServices) не читає жоден рушій; - паспорт кличе кошторис без прапорця калібрування (
DetailPassportModal.tsx:58–83); - спільні налаштування №241: новіша версія з сервера тихо затирає незбережені локальні правки (
settingsSync.ts:105).
Закрито: коди радіусних послуг за матеріалом — обидва документи дають один код [ФАКТ ✔].
5. Мертве, важке, хардкод — і що вшито в Студію (L3)
Розміри [ФАКТ ✔]:
| 02.09 | 13.10 | |
|---|---|---|
| Файлів / рядків | 343 / 88 543 | 666 / 146 898 |
| Код без тестів | 227 / 72 218 | 431 / 117 217 |
| Тестових файлів | 103 | 218 |
Функцій довших за 1 000 рядків — 7:
createGeometryEngine— 2 570;ProductEditorWorkspace— 2 298;FormsPanel— 2 193;SlabBoard— 1 588;HelpDialog— 1 112 (текст);QuotePanel— 1 075;Detail3DNode— 1 046.
Чотири UI-гіганти (SlabBoard, Viewer3D, ProductEditorWorkspace, Detail3DPreview) дають 192 із 418 помилок tsc — 46 %, як і 02.09. Повний топ-25 — L3 §3.2. Дерево — 04_ДЕРЕВО_КОДУ_13-10.md.
Мертве [ФАКТ ✔ knip + граф]:
- 17 мертвих файлів, 1 822 рядки — зокрема все, що знайшов 02.09:
core/*,PlacementPropertiesPanel,useCostPrices,slabTexture,sketchupExport; - ще 6 файлів живуть лише в тестах (2 634 рядки);
- мертвий блок у
Viewer3D.tsx:664–1396(733 рядки) і кнопка «Групувати деталі» без ефекту; - 8 нерозв'язаних імпортів;
- ті самі 6+3 зайві npm-пакети;
- не підключені: вкладка MES (
mes/MesTab.tsx), поділ на робочі простори (shell/workspaces.ts,workspaces/*/index.tsx), хукkernel/useKernelGeometry.ts.
Реєстр — 03_МЕРТВЕ_І_ЗАДВОЄНЕ_13-10.md.
Задвоєння [ФАКТ ✔]:
| Що | 02.09 | 13.10 |
|---|---|---|
| Однойменні функції | 116 | 245 |
| З ідентичним тілом | 42 | 77 |
| «Точка в полігоні» | 7 | 11 |
| Площа полігона | 5 | 15 |
| Округлення | 10 | 23 |
| Межі полігона | 4 | 19 |
Блочного копіпасту мало (jscpd 0,54 %).
Межа «ядро не знає UI» порушена [ФАКТ ✔]:
coreBoundaryчервоний — фікс 03.09 втрачено відкатом №96;- сторож не дивиться в
kernel/, а звідти 12 не-типових імпортів у UI; - стор CAD і
draftHelpersпотрапляють навіть у потік ядра.
Хардкод [ФАКТ ✔]:
- URL у
src: 13 у 7 файлах (02.09 — жодного) — PLM, MES, 6 інтернет-радіо Стоуника; - префіксів ключів сховищ браузера — 9+ (було 4);
- старий PIN лежить мертвим полем у сторі й у ключових словах довідки Стоуника — значень не наводжу;
- межі NC300 дві: 3000×1600 (
materialRules.ts:52) і 3100×1500 (manufacturability.ts:29), і обидві тепер працюють.
Що вшито в Студію (статика + живі заміри, 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:
- редактор, перша деталь на холодному ядрі: 17–24 с порожньої сітки;
- зміна кромки — 2,4–5,9 с;
- перший розкрій після відкриття — чекає ядро 5,6 с;
- 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:
Вхідні точки розірвані:
- стартер і карта Джованні ведуть у теку
16_ДЖОВАННІ\, а вона зветься16_ДЖОВАННІ_CAD; - КАРТА_ПАПОК не знає тек аудиту 02.09, 12 і 16;
- README не знає ПАМ'ЯТЬ_ЛЕО;
- ПАМ'ЯТЬ §9 відсилає до СТАРТ зі станом 23.08–01.09.
Борги не збігаються:
- 17 боргів закриті в коді, але відкриті в реєстрах (FG-12 «замки сторін», №10, №14–16, №23, вшиті ціни, довідники на сервері, Б-002, SC-35 тощо);
- навпаки, «зроблене» в доках, якого нема в коді:
translate="no", формат.vs3d, лупа.
Терміни:
- бланк погодження підписує Підворот «Потовщенням» (
quotePdf.ts:477,508) — питання З-1 від 02.09 без відповіді; - CombiCut ставить легасі-підворот під 45° і зве його «смугою потовщення» (
engines/combicut/plan.ts:156–157,180), а правило 29.09 каже «підворот — без вуса».
Стоуник учить застарілому. Тема «Кнопки й пуш» (stounik/leoTopics.ts:146) і ПАМ'ЯТЬ §3 досі вчать пушити скриптами 05.10, які №261 заборонив.
Карта «ядро / легасі» в ПАМ'ЯТЬ_ЛЕО §4 збігається з кодом у 12 пунктах з 13. Хибний один: бандажі по дугах уже на ядрі (№251).
8. Історія 02.09 → 12.10 і стан знахідок 02.09 (L5)
За 40 днів — 196 записів журналу (№86–№278). Майже весь код написала одна лінія (Мікеланджело → Да Вінчі → Лео). Бруно — пакетами через рев'ю, ІТ — через чотири зведення.
Помічники майже не працювали:
- Ботічеллі — одна задача (Б-002);
- Джованні — жодної сесії, його К-003 зробив Лео;
- ЖУРНАЛ_АГЕНТІВ після 06.10 не вівся.
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. Що не перевірено і де межа
Що аудитор перевірив власноруч [ФАКТ ✔]:
- ключ кешу контурів — код і вивід зонда з ядром;
- те саме в MR !8;
- перезапис знімком і «завислий» розкрій — код;
- метраж кромки №250 і виріз «як коло» — вивід зондів і код;
mockDataу бойовій збірці — карта джерел;- 2 місця кешу плити — код і вивід зонда;
- «одна труба» — сирі результати зонда;
- відсутність
frameloop; - ворота tsc / vitest;
- червоні тести.
Межі:
- Твій ПК не міряли. Усі секунди — пісочниця з програмною графікою. На справжній відеокарті «перше 3D» має бути в рази коротшим
[ГІПОТЕЗА]. - Живий продукт не клікали, крім стендів Playwright.
- Сторона ІТ: сервер налаштувань, 1С, бекенд замовлень.
- Прод (Vercel/Ocean) — чи є там вада кешу контурів, не встановлено.
- «Одна труба» перевірена на 4 профілях Г власника. Часткові кромки,
drop, кільце вирізу, овал, замкнений контур — не перевірено. - Повне A\B для L20 R350 у Бруно — досі INCONCLUSIVE.
- Число тестів у доках порівнювалось з прогоном пісочниці (1 856), а не з комп'ютера.
10. Пропозиції — не рішення, для розгляду
Термінове і дешеве — кожне кілька рядків плюс тест-сторож:
-
Ключ кешу точного контуру — додати геометрію отворів (координати, а не кількість) і сторож «зсув вирізу → новий контур у DXF і PDF». Перевірити, чи робили експорти після правки вирізу без перезавантаження (
01_ПИТАННЯА-1). -
Розкрій після очікування ядра — зливати результат у поточний проєкт, а не в знімок. Також:
- Ctrl+Z скидає квиток очікування;
- межа очікування з переходом на ламану і чесним повідомленням;
- відповідь потоку розкрою не відкидати через дії, що не міняють деталей, або скидати
isPacking.
-
Кеш плити №278 — не кешувати плиту без кромок (точні контури розкрою) і/або дати більше місць. Це моя доробка до №278.
-
Червоні тести:
- прибрати
import typeуengines/shapeBuilder.ts:2(тип винести вdomain/); - DXF-тест з чужим шляхом —
skipз поясненням.
Тоді «2 відомі» стануть «0».
- прибрати
-
Прогрів ядра після відкриття сторінки — лише на комп'ютерах,
?warm=0вимикає (проба готова, №279). Плюс Стоуник у трьох місцях з 12.10. -
Тестові дані з бойової збірки —
mockDataлише в DEV (динамічний імпорт). -
Прізвища клієнтів з
mes/data/orders.ts— знеособити або не везти непідключений MES у GitLab.
Секунди на кромках:
-
«Одна труба» для інструмента фрези на гладкому ланцюзі, плюс злиття станцій на прямих. Як перевіряти:
- скан як у №276: усі кути, обидва дзеркала, профілі L20 / ar_20 / xd_20 / d_20 / t_20 / lv_40_inv, коло, П, виріз R40;
- об'єм — не більше похибки перерізу;
- перерізи — не більше 0,1 мм;
- тіло валідне, одне.
Сторож на d_20, бо зараз — 26 с.
Гроші — після твоїх відповідей на 01_ПИТАННЯ розділ Г:
- Виріз зі скругленими кутами — «виріз», а не «отвір»: класифікація за формою, не за вершинами.
- Метал — з фактів каменю.
- Метраж кромки №250 для Г/П з кутами і припуском — плюс тест на Г з радіусом і фаскою.
- Правила для 39 профілів, або читати
EdgeProfileDef.operations, плюс тест «кожен профіль має правило». - Стоп або попередження на замовлення в ERP з ручними цінами.
- Одна функція ціни для двох рушіїв.
Старт і фон:
- Ліниво вантажити бібліотеки документів (pdf.js / xlsx / jspdf / html2canvas / react-dom/server) і довідку: −1,95 МБ, мала складність.
- 3D — режим «малювати лише при змінах» (
frameloop="demand"). Ризик: усе, що рухається, має саме просити кадр. Перевіряти оком. - Будівник ядра — з головного потоку.
Процес:
- Пакет №270–№278 у GitLab — окремою гілкою поверх MR !8, до наступного зведення з ІТ.
- Одна тека замість двох (
web-app=vs-cad): спершу вирішити, якийDocsTab.tsxправильний. - Ревізія живих доків під OCCT:
- числа (тести, tsc, теми Стоуника) — в одному місці (ПАМ'ЯТЬ §3), решта посилається;
- закрити 17 боргів, закритих кодом;
- поправити розірвані посилання.
- Мертве (17 файлів, ≈900 рядків мертвих блоків, 9 npm-пакетів) — пакетом після твого «так». Рішення 23.08 «не чіпати» досі чинне.
Додатки:
- L1 розкрій · L2 геометрія, ядро OCCT і кромки · L3 мертве, важке, хардкод + що вшито · L4 доки проти коду · L5 історія і стан знахідок · L6 гроші · L7 швидкість, старт, пам'ять.
- Окремо: 01 питання власнику · 02 маршрути операцій · 03 реєстр мертвого й задвоєного · 04 дерево коду · 05 стан знахідок 02.09.
Код не змінювався. Зонди жили у власних копіях пісочниці й на диск не йдуть.
11. Дописи агентів — що змінено і як тепер працює
Розділ для майбутніх правок за цим аудитом. Як у 02.09: кожна правка — зелений блок «ВИПРАВЛЕНО <дата> · <номер журналу> · рішення власника», що зроблено і як тепер працює. На 13.10 правок за аудитом ще не було.
01_ПИТАННЯ_ВЛАСНИКУ_13-10.mdКожне питання побудоване так:
- що бачу — з адресою;
- чому не вирішую сам;
- саме питання;
- варіанти — не рекомендація.
Зібрано із семи лінз, дублі злиті. Рішень тут немає.
Нумерація розділів:
- А — термінове: те, що може дійти до цеху чи клієнта;
- Б — розкрій;
- В — кромки і ядро;
- Г — гроші;
- Д — старт, фон, що вшито;
- Е — мертве і процес;
- Ж — доки.
Відповідати можна одним словом на номер, наприклад «А-1: так, Б-1: попередження».
А. Термінове
А-1. Експорти після зсуву вирізу.
-
Що бачу. Кеш точних контурів упізнає деталь за зовнішнім контуром і кількістю вирізів, а не за їх місцем (
kernel/exactParts.ts:24–27). Після правки вирізу без перезавантаження сторінки зі старим вирізом виходять:- DXF на верстат;
- креслення PDF;
- бланк погодження;
- дошка й колізії.
Зонд: отвір на x≈450 замість ≈1450.
-
Чому не вирішую сам. Це вже могло піти в цех. Виправлення — один рядок, але робить його лише твоя кнопка.
-
Питання.
- Чи були з 06.10 (DXF з ядра) і 09.10 (бланк з ядра) експорти, зроблені після правки вирізу без перезавантаження сторінки? Їх варто перевірити до різу.
- Виправляємо ключ кешу першим ділом?
-
Варіанти:
- виправити зараз (+ тест-сторож);
- спершу перевірити, чи є вада на проді, потім виправити.
А-2. Поки «рахую точні контури», правки губляться.
-
Що бачу. Розкрій чекає ядро і потім записує знімок проєкту, зроблений до очікування (
store/slices/packingSlice.ts:105–115,:204–205). Губляться:- доданий сляб;
- номер замовлення;
- посунута деталь;
- навіть Ctrl+Z.
Ще одна вада: дія під час роботи потоку розкрою «вішає» розкрій — кнопки сірі, збереження в кабінет відмовляє.
-
Чому не вирішую сам. Обидва виходи змінюють поведінку для менеджера.
-
Питання. Що правильно на цей час?
-
Варіанти:
- не давати нічого робити на дошці й у шапці і чесно показати «зачекайте» (Стоуник);
- доробити так, щоб правки не губились: злиття з поточним проєктом;
- обидва.
А-3. Прізвища клієнтів у коді.
- Що бачу.
mes/data/orders.tsмістить поляcustomerз прізвищами клієнтів п'яти реальних кейсів (у звітах значень не наводимо). Файл уsrc/і їде в GitLab. Сам модуль MES ніким не підключений. - Питання. Що робимо з файлом?
- Варіанти:
- знеособити (Клієнт 1…5);
- не везти теку
mes/у GitLab узагалі; - видалити модуль.
А-4. Пакет №270–№278 не в GitLab.
- Що бачу. 44 файли (+4 358 / −285 рядків) лежать лише на диску: ядро у фоновому потоці, кеші Бруно, швидкість 12.10. При цьому знімок MR !8 уже містить №267–№269, хоча журнал і ПАМ'ЯТЬ кажуть, що ні.
- Питання. Як і коли пушимо?
- Варіанти:
- окремою гілкою поверх MR !8 до наступного зведення з ІТ;
- докласти в MR !8;
- чекати зведення.
Б. Розкрій
Б-1. Перепил 70 мм — без відповіді з 02.09 (Б-3).
- Що бачу. Пакувальник про перепил не знає (
engines/packing.ts:302–342), перевірка колізій знає (:1947–1969). Після авторозкрою 6–8 з 10 деталей «червоні». На дугах, які на CombiCut ріже вода, перепил теж рахується пилою (:1951). - Питання. Перепил — це правило для пакувальника (він тримає відступ сам) чи лише попередження? Рахувати його на дугах?
Б-2. CombiCut: номінальний контур чи з припуском?
- Що бачу. DXF «Combicut» з дошки ріже контур із припуском (
kernel/exportCutDxf.ts:96,179). Вкладка CombiCut ріже номінальний (engines/combicut/plan.ts:146). На один сляб виходять дві різні програми. - Питання. Який контур правильний?
Б-3. «Перерахувати слеб».
- Що бачу. Пункт контекстного меню перескладає весь проєкт без підтвердження (
SlabBoard.tsx:1544). Кнопки режимів при цьому питають. - Питання. Що має робити цей пункт?
- Варіанти:
- лише цей сляб;
- весь проєкт, але з підтвердженням;
- як є.
Б-4. Ліва Г.
- Що бачу. Дзеркало дає не дзеркальну деталь, а іншу ширину вирізу: 1100 → 900 (
__tests__/contourBaseline.test.ts:129–138). - Питання. Це угода чи помилка?
Б-5. Залишки 02.09 без рішення:
- Радіус кута робить деталь «кривою» для «Повної текстури» — розгортка підвороту вимикається (
packing.ts:587–590). Так задумано? - Дзеркалення з умовою «без обробки кромки» — доки кажуть три умови, код має дві (
packing.ts:466–471). Додаємо? - «Підбір текстури» має групувати вироби так само, як пакер? Зараз два ключі груп (
geometryUtils.ts:20іtextureLayout.ts:37).
В. Кромки і ядро
В-1. «Одна труба» для кромок.
-
Що бачу. Зонд: інструмент фрези вздовж «пряма → дуга → пряма» однією трубою дає те саме тіло.
Профіль на Г власника Зараз Однією трубою L20 4,4 с 0,39 с d_20 26,6 с 0,73 с -
Чому не вирішую сам. Це переписування будівника інструмента в ядрі, хай і з тим самим результатом. Потрібен скан на всіх формах.
-
Питання.
- Робимо?
- Якщо так, чи лишається потрібним план Б (кромка кольором + «промалювати»)?
-
Варіанти:
- лише «труба»;
- «труба» + план Б як запасний вимикач;
- лише план Б.
В-2. Профіль лише на одній стороні біля опуклої дуги.
- Що бачу. Гроші й 3D тут не сходяться (
engines/edgeCutters.ts:964–982протиengines/geometryUtils.ts:447):- у метражі — половина дуги;
- у 3D дуга без профілю;
- з галочкою «Стандарт» дуга в метражі рахується 1,5 раза.
- Питання. Що правда?
- Варіанти:
- дуга не фрезерується;
- клієнт платить за половину дуги.
В-3. Швидка картинка, поки ядро рахує.
- Що бачу. Старий будівник може показати форму за 5–200 мс, поки ядро рахує 0,3–5 с. Це суперечить умові Бруно №4 «не показувати дві правди».
- Питання. Дозволяємо?
В-4. Кромка під ногою і гнутий елемент на увігнутому куті.
- Що бачу. Обидві діри перейшли в ядро:
- профіль прорізається під ногою (
domain/edgeOccupancy.ts:45діє лише в UI); - гнутий елемент будується на увігнутому куті (
domain/radiusElement.ts:242).
- профіль прорізається під ногою (
- Питання. Перекриваємо правилом у ядрі й фактах чи лишаємо як рідкість?
В-5. Прогрів ядра.
-
Що бачу. Проба №279 у пісочниці:
- редактор вперше — 16,7 → 9,6 с;
- перший розкрій — 5,6 → 0,5 с;
- старт сторінки не висне.
Ціна — 0,3–0,5 ГБ пам'яті і 10–14 МБ завантаження одразу в кожного. Сьогодні ядро й так стартує, щойно відкрили проєкт з деталями.
-
Питання. Кому вмикати?
-
Варіанти:
- усім;
- лише на комп'ютерах;
- лише на порожньому проєкті;
- ні.
В-6. CombiCut і легасі-підворот.
- Що бачу. CombiCut ставить сторони легасі-підвороту під 45° і зве їх «смугою потовщення» (
engines/combicut/plan.ts:156–157,180). Правило 29.09 каже «підворот — без вуса» (engines/miterAssembly.ts:31–34). - Питання. Навмисно для старих проєктів чи помилка?
В-7. Межа верстата NC300.
- Що бачу. У коді дві межі, і обидві працюють:
- 3000×1600 (
domain/materialRules.ts:52); - 3100×1500 (
domain/manufacturability.ts:29).
- 3000×1600 (
- Питання. Яка правильна?
Г. Гроші
Г-1. Калібрувальні ціни на сервері.
- Що бачу. Код возить на сервер прайс-бук разом із калібрувальними цінами (
store/settingsSync.ts:63–86). Документ №241 каже «гроші на сервер не їдуть». Новіша версія з сервера тихо затирає незбережені локальні правки (:105). - Питання.
- Калібрувальні ціни мають їхати «для всіх»?
- Чи потрібен окремий замок для послуг цеху і для прорахунку?
Г-2. Замовлення в ERP у калібруванні.
- Що бачу. Замовлення за ручними цінами не стримується (
QuoteOrderCard.tsx:147–167). Калібрування лишається ввімкненим у браузері після виходу адміна. Питання Е-5 з 02.09. - Питання. Блокувати замовлення чи лише попереджати?
Г-3. Метал і фанера в грошах.
- Що бачу.
- Метал рахується як камінь: труба 2 м → 4,08 м «різу пилою», площа йде в матеріал, монтаж, пакування і ERP (
engines/productionFacts.ts:245–250). - Фанерні факти у вбудованих правилах мовчки зникають.
- Метал рахується як камінь: труба 2 м → 4,08 м «різу пилою», площа йде в матеріал, монтаж, пакування і ERP (
- Питання.
- Прибрати метал з фактів каменю до появи правил металу?
- Фанеру рахувати вбудованими правилами, через коди ВіярПро чи ще й у прорахунку для клієнта?
Г-4. Виріз зі скругленими кутами.
- Що бачу. Мийка R10, варильна, розетка класифікуються як круглий отвір (
engines/productionFacts.ts:171–184). Наприклад, варильна 562×492 R5 → «великий отвір» 2,1 м замість «периметра вирізу». - Питання. Це «виріз» у метрах чи «отвір»?
Г-5. Метраж кромки.
- Що бачу.
- Г/П з радіусом чи фаскою кута при припуску 0 дає +43–50 % (
engines/geometryUtils.ts:435–458). - З припуском — у метраж іде контур уже з припуском.
- Бланк рахує по контуру з припуском без дуг.
- Г/П з радіусом чи фаскою кута при припуску 0 дає +43–50 % (
- Питання.
- Який метраж правильний для кошторису і для бланка — номінальний?
- Дуга з «Обробкою торців» між двома профільованими сторонами — одна операція чи дві?
Г-6. «Стикування в площині».
- Що бачу. Прорахунок рахує стики за формою деталі (
engines/quoteCalc.ts:528–534): пряма стільниця зі стиком дає 0, Г — 1, П — 2. Пропил ×2 ставиться на кожне з'єднання, разом із підворотами. - Питання. Рахувати за фактичними швами? Пропил ×2 — лише між деталями специфікації?
Г-7. Профілі кромок без грошей.
- Що бачу. 39 з 70 профілів кромок (серед них l_20) у кошторисі дають нуль мовчки (
domain/serviceMapping.ts:313–349). Питання Г-1 з 02.09 без відповіді. - Питання. Що робимо?
- Варіанти:
- додати правила;
- читати повну мапу
EdgeProfileDef.operations; - показувати «факти без правила» на екрані.
Д. Старт, фон, що вшито
Д-1. Очі Стоуника.
- Що бачу. Очі анімуються 45 с після кожного дотику, і браузер увесь цей час малює кадри.
- Питання. Як лишаємо?
- Варіанти:
- як є;
- рухати лише при наведенні;
- коротке «моргання».
Д-2. Імпорт бланка погодження.
- Що бачу. Бібліотеки читання PDF і Excel — 0,9 МБ на старті в кожного менеджера (
utils/approvalImport.ts:1–3). Сам імпорт схований під адмін-щитком з 28.09. - Питання. Ним реально користуються? Вантажити по кнопці?
Д-3. 3D малює безперервно.
- Що бачу. Відкрите 3D малює кадри, навіть коли нічого не змінюється. У коді нема жодного
frameloop. - Питання. Чи є в 3D щось, що мусить рухатись само? Якщо ні — малювати лише при змінах?
Д-4. Ядро і CAD у бойовій Studio.
- Що бачу. Studio працює на ядрі OCCT за замовчуванням (
kernel/config.ts:15–22, перемикачVITE_KERNEL). Код CAD і BUILDING їде в збірку Studio. Вхід у CAD закриваєcadEnabled(), але код лишається. - Питання. Тримаємо CAD і BUILDING у збірці «до виокремлення CAD» чи виокремлюємо зараз?
Д-5. Не підключене.
- Що бачу. MES-вкладка (
mes/MesTab.tsx) і поділ на робочі простори (shell/workspaces.ts,workspaces/*/index.tsx) написані, але не підключені. - Питання. Що з ними?
- Варіанти:
- підключати;
- винести в окремий застосунок;
- прибрати.
Д-6. Що їде в продакшн.
- Питання. Чи мають бути в продакшн-Studio:
- сторінка стенду
stand.html; - 6 сторонніх інтернет-радіо Стоуника;
- схована плашка ядра з таймером 0,7 с?
- сторінка стенду
Д-7. [сторона ІТ] Віддача ядра на проді.
- Питання. Як прод віддає
.wasm(50 МБ сирого) і JS — стиснення, довгий кеш? Від цього залежить, скільки качатиме перший захід з прогрівом.
Е. Мертве і процес
Е-1. Мертвий код.
- Що бачу. Рішення 23.08 «мертве не чіпати, розібратись» досі чинне. Що набралось:
- 17 мертвих файлів;
- ≈900 рядків мертвих блоків у живих файлах (
Viewer3D.tsx:664–1396і «Групувати деталі»); - 9 зайвих npm-пакетів;
- тестові дані в бойовій збірці (
main.tsx:14).
- Питання. Дозволяєш видалити перевірене мертве пакетом (з бекапом і журналом)?
Е-2. Дві теки.
- Що бачу.
web-appіvs-cad— одна програма. Відрізняється лишеconstructor/docs/DocsTab.tsx. Кожну правку робимо двічі. - Питання.
- Лишаємо дзеркалом чи працюємо в одній теці?
- Який
DocsTab.tsxправильний? - Чи живе ще поняття «патч» (
vs-cad-patch,СТВОРИТИ_VS_CAD.bat)?
Е-3. Хвости, які бачать клієнт чи цех.
- Що бачу.
- Бланк підписує Підворот «Потовщенням» (
utils/export/quotePdf.ts:477,508, З-1 з 02.09). - Гнутий акрил після відкриття проєкту має запас 30 % замість 20 % (
store/projectHelpers.ts:115). - Два червоні тести «відомі» 5+ тижнів.
- Бланк підписує Підворот «Потовщенням» (
- Питання. Правимо (кожне — кілька рядків) чи «так і задумано»?
Е-4. 29 питань 02.09 без відповіді.
- Питання. Пройти їх пакетом чи закрити як «живемо так»?
- Де список.
05_СТАН_ЗНАХІДОК_02-09.md.
Ж. Доки
Ж-1. Де живе опис архітектури.
- Що бачу. АРХІТЕКТУРА, MANIFEST, БІЗНЕС, КАРТА_МОДУЛІВ, ПЛАН_І_СТАН, README, СТАРТ, ДЛЯ_НАСТУПНОГО і КАРТА_ПАПОК не згадують OCCT жодного разу. Вісім тек коду не описані.
- Питання. Що робимо з цими доками?
- Варіанти:
- оновити їх під OCCT;
- позначити «знімок до 30.09» і лишити ПАМ'ЯТЬ_ЛЕО єдиним живим описом.
Ж-2. Числа в одному місці.
- Що бачу. У доках 17 різних кількостей тестів; теми Стоуника 71 + 21, а не 66 + 21.
- Питання. Тримати числа лише в ПАМ'ЯТЬ_ЛЕО §3, а решті доків посилатися?
Ж-3. Борги, закриті кодом.
- Що бачу. 17 боргів закриті кодом, але відкриті в реєстрах. Серед них FG-12 «замки сторін», №23 (увігнутий кут), П-16 (кут двох підворотів).
- Питання. Їх прийнято кліком? Якщо так — закрити однією ревізією.
Ж-4. Де жити рішенням.
- Що бачу. ≈35 рішень з 02.09 записані лише в журналі й ПАМ'ЯТЬ_ЛЕО §5. MANIFEST — версія 2.60 від 01.09, його пункт 2.54 суперечить коду.
- Питання. Лишаємо як є (журнал + ПАМ'ЯТЬ) чи дописуємо MANIFEST за 03.09–12.10?
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:
- Ядро OCCT. 02.09 було чотири уявлення з конвертерами між ними. Тепер додався ще один шлях — ядро OCCT (з 30.09). Воно головне для 3D і точних 2D-контурів.
- Розкрій. Ріже деталь власною математикою (
engines/geometry.ts), але вже одним будівником кутів і одним ножем для стиків (закриті знахідки 2 і 8). - Кромка в 3D — лише картинка
[ФАКТ ✔]. Гроші, метраж, розкрій, DXF і PDF її тіла не читають.
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. Зміна кромки
- Профіль у довіднику (
domain/edgeProfiles…). - Переріз фрези:
engines/edgeCutters.ts(злиття однакових сусідніх сторін у пробіг:999–1088). - Інструменти: призма на прямій, обертання на дузі №273/№276.
- Віднімання:
- без дуг —
cutMany(одна булева); - з дугами —
cutArcToolsChecked: «список» → «по черзі» → «нечітке», плюс перевірки.
- без дуг —
- Сітка.
Де час — Г власника, R350, L20 на B–D [ФАКТ ✔ L2]:
| Частина | Частка | Деталі |
|---|---|---|
| Віднімання | 82 % | «список» завжди ламається на стику дуги з прямою, тож три булеві підряд |
| Перевірки | 7–12 % | — |
| Інструменти | 6–9 % | — |
| Сітка | 2 % | — |
Кеш складань і кеш плити зміну кромки не прискорюють, бо це нова модель. Головний важіль — «одна труба» (L2 §4 д): 4,4 → 0,39 с.
3. Зсув вирізу
- Нова модель з тими самими кромками.
buildShape: ключ плити без вирізів збігся → копія плити з кешу №278 → вирізати лише отвір → запобіжникnativeShapeGuard.
Час на Г власника: 4,0 → 0,16–0,24 с [ФАКТ ✔].
Підводний камінь [ФАКТ ✔ L2]: кеш має 2 місця на ядро, і в нього ж пишуть точні контури розкрою (outline2D.ts:206). Після двох контурів деталей з вирізами зсув знову займає 3,9 с.
Другий підводний камінь [ФАКТ ✔ L1]: кеш точних контурів не бачить нового місця вирізу. Дошка, DXF і PDF беруть старе місце до перезавантаження сторінки.
4. Розкрій
SlabBoard.tsx:1044–1111— кнопки режимів, з підтвердженням.runPacking(packingSlice.ts:301) →triggerPackingAsync(:56):- знімок для Ctrl+Z →
normalizeProject→getAllProjectDetails→explodeDetails; cutOutlineProvider().prepare(:100) — чекаємо ядро без межі (:112–115, без.catch);- при цьому стор отримує знімок проєкту й
isPacking = true(:106–111).
- знімок для Ctrl+Z →
finishPacking(ЗНІМОК, контури):- на сляби йде лише камінь (
stoneParts, №256); - замок
nestingLocked, або потік розкрою (дебаунс 200 мс,packingRequestId).
- на сляби йде лише камінь (
workers/packing.worker→autoPack(engines/packing.ts:1851) →validatePlacementпо точному контуру.- Відповідь:
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) |
дві правди |
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»)
- ✅ відповідь / зроблено (13): А-1 · Б-1, Б-2, Б-7, Б-8 · В-1, В-2, В-5 · Е-1, Е-2, Е-4 · Ж-6 · З-10.
- ◐ частково (8): А-2 · В-8 · Д-4, Д-5, Д-7 · Е-3 · Ж-2 · З-9.
- ❌ без відповіді, у коді як було (29): Б-3…Б-6 · В-3, В-4, В-6, В-7 · Г-1…Г-3 · Д-1…Д-3, Д-6 · Е-5…Е-7 · Ж-1, Ж-3, Ж-4, Ж-7 · З-1…З-4, З-6…З-8. Найпомітніше для клієнта — З-1: бланк підписує Підворот «Потовщенням» (
utils/export/quotePdf.ts:477, 508). - ❓ не перевірено (4): Г-4 · Е-8 · Ж-5 · З-5. Група І — сторона ІТ.
Що поруч (не з аудиту 02.09, але з тієї ж історії)
- Не в GitLab: №270–№278 — 44 файли, +4 358 / −285 рядків (ядро у фоновому потоці, кеші Бруно); №267–№269 за доками теж ще ні, хоча в знімку «MR !8» вони вже є. У знімку MR !8 нема нічого, чого нема в робочій копії (крім 2 рядків коментаря
server/src/settings.js). - Червоні тести 5+ тижнів:
coreBoundary(engines/shapeBuilder.ts:2) і DXFC:/hhgh— журнал щоразу пише «+2 відомі». - Рішення з 02.09 (≈35) — у журналі й ПАМ'ЯТЬ_ЛЕО §5; MANIFEST — 2.60 від 01.09, 2.54 суперечить коду.
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/materialRules.ts(426 р.) — тепер імпортуєstounik/checks.ts:23(checkLShapeInnerCorner,rulesForMaterial— підказки Стоуника) ✔. 11 експортів досі без споживачів поза тестами (knip):MAX_OVERHANG_MM,MIN_JOINT_TO_CUTOUT_MM,WALL_GAP_MM,SINK_TO_MODULE_MM,KEIL_MM,ACRYL_SIPHON_MIN_MM,ACCESSORY_HOLE_RULES,EDGE_USAGE_LABEL,EDGE_PROFILES_BY_USAGE,edgeProfilesFor,checkEdgeProfileUsage;checkPartSize(NC300 3000×1600,:52) — лише тест, а живий розкрій бере 3100×1500 зdomain/manufacturability.ts:29◔.engines/__tests__/mockData.ts(114 р.) — 02.09: «жоден тест не імпортує»; тепер імпортується зmain.tsx:14і потрапляє в бойовий стартовий чанк; рядок:103mockParts = explodeDetails(mockDetails, …)виконується при кожному старті сторінки ✔ (знайдено вprobe-L3/dist/assets/main-*.js).
Лише типи (у збірку не йдуть, це нормально): 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. Захардкоджені зони (фіксація, без оцінки; тести виключено)
- мм-літерали в
components/**/*.tsx: 364 рядки (02.09: 299; той самий шаблон і виключення):Detail3DPreview68,Viewer3D33,ProductElement3DNode23,HelpDialog22,ProductEditorWorkspace17,ProductTemplateModal13,SlabCatalogModal12,SlabBoard11,FormsPanel11. Позаcomponents— ще 172 рядки в нових tsx (constructor/measure/MeasureTab.tsx19,stand/main.tsx17,AssemblyTab11,PlywoodTab9 …). Дефолти габаритів досі в модалках:LegModal.tsx:23(|| 900),SkirtingModal.tsx:20(|| 50),WallPanelModal.tsx:27, :31(повна назва номенклатури,|| 12),ListsPanel.tsx:31, :51,JointOffsetPopup.tsx:38(600 : 400),Detail3DPreview.tsx:2059, :2612('leg' ? 900 …),canvasUtils.ts:255(sawOvercut = 2000).Detail2DBlueprint.tsx— дефолти|| 1200/600прибрано. - Матеріали літералами поза
domain/: 15 рядків у 9 файлах коду + 5 у словнику:EdgeProfileSettingsModal.tsx:54,SlabCatalogModal.tsx:290, :426,useSlabOutlines.ts:23, :29,QuotePanel.tsx:458+engines/quoteCalc.ts:352, :384+quotePdf.ts:232('Акриловий камінь'проти'Акрил'у домені — без змін), новіconstructor/docs/DocsTab.tsx:157, :159,constructor/drawing/sampleOrder.ts:57, :67, :101('Кварцит'),buildFotozona.ts:71.DimensionsTable.tsx:102іmiterAssembly.ts:26— прибрано. - URL у
src: 13 рядків у 7 файлах (02.09 — 0):domain/slabCatalog.ts:247(сайт Viyar),engines/apsExport.ts:26(localhost:8082),features/cad-release/CadReleaseActions.tsx:24, :31(PLM),features/cad-release/OrderFolderSave.tsx:12(МЕС, за замовчуванням),features/order-registry/RegistryDesk.tsx:74(PLM),stounik/StoneRadio.tsx:29–34(шість інтернет-радіо),stounik/leoTopics.ts:146(локальна адреса). Інтеграції — [сторона ІТ], лише фіксація. - Ключі сховищ браузера — 9+ префіксів (02.09: 4):
slab_cut_planner_current_project(persistence.ts:6; дубль літералаErrorBoundary.tsx:81— без змін),slab_cut_planner_cabinet_binding,slabcutplanner-settings-storage(useSettingsStore.ts:335),slabcutplanner.pendingObjectId, каналslabcutplanner-sync,vs3d.expertMode,vs3d.unplacedCollapsed,slabcut_bug_tickets,m-board-zoom,stounik-welcome,stounik-muted,stounik-radio-station,stounik-ack:<id>,vss-before-server-open,vss-before-new-server-order,registry-revision:<id>,plm-project-handoff(у sessionStorage лежить токен передачі з PLM,features/server-project/transport.ts:18–22— [сторона ІТ]). - Персональні дані клієнтів (лише місця):
mes/data/orders.ts:17, :179, :376, :566, :742— полеcustomerз прізвищами і номери замовлень п'яти реальних кейсів (шапка:2«ЖИВІ ЗАМОВЛЕННЯ»); файл лише для тестів, але в коді, що їде в GitLab. - PIN/паролі (лише місця): вхід адміна тепер — логін і пароль: у
shell/adminLogin.ts:28–32лежать сіль і PBKDF2-відбиток (їдуть у браузер; шапка файла чесно каже, що це «замок інтерфейсу, а не захист сервера»). Старий PIN за замовчуванням — літералом уstore/useSettingsStore.ts:44(мертвий стан) і у ключових словах довідки Стоуникаstounik/topics.ts:464(видимі користувачу). - Маркери стану: «ТИМЧАСОВО» —
engines/geometry.ts:1469(отвір зливу),forms/editors/EdgeProfilesPanel.tsx:65,domain/edgeTreatment.ts:6(«і це не тимчасово»);[LEGACY]—domain/types.ts:69; «ВІД'ЄДНАНО» —useCostPrices.ts:2; «ВИДАЛЕНО» —sketchupExport.ts:2; «ФІЛЬТР ВИМКНЕНИЙ» —utils/edgeProfiles.ts:50.TODO/FIXME/HACKлатиницею — 0.@ts-ignore/@ts-expect-error/@ts-nocheck— 0. as any— 52 у 16 файлах (02.09: 53/16;elementToDetail.ts17,approvalImport.ts9,Viewer3D.tsx8);: any— 87 (86).eslint-disable— 44 у 24 файлах (02.09: 12; нові — уconstructor/*,StudioReveal,GlProbe,QuotePanel).console.log— 1 (RectangleDesigner.tsx:14; 02.09: 3),console.warn21,console.error38,console.info3 (GlProbe.tsx).
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.
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/ (сторона ІТ).
Як читати.
- Рядків — як
wc -l. Δ до 02.09 — різниця з деревом 02.09 (=— та сама кількість рядків;нов.— файла 02.09 не було). Жоден файл із дерева 02.09 (стан після 03.09) не зник. - Опис — перший коментар-шапка файла; якщо шапки нема — опис із дерева 02.09 (позначено «(опис 02.09)»); інакше — перелік експортів.
⚠— знахідка аудиту 13.10 (адреси — у звітіL3_МЕРТВЕ_ВАЖКЕ_ХАРДКОД.md).tsc N— скільки помилок tsc у файлі (ворота 418). - Де (лише для коду, не для тестів):
Г — головний (стартовий) набір: файл досяжний СТАТИЧНИМИ імпортами від
main.tsx; його код вантажиться і виконується при кожному відкритті сторінки, навіть якщо людина туди не заходить; Л — лише ліниво: черезReact.lazy/import()або як воркер — вантажиться, коли відкрили вкладку/функцію; С — лише окрема сторінка стендуstand.html; Т — імпортується лише як тип (у збірку не йде); лише тести — у застосунку не використовується, живе тільки завдяки тестам; МЕРТВИЙ — ніхто не імпортує (підтверджено knip і графом). - Збірка (
vite build --sourcemapу probe-копії) підтвердила класифікацію: 329 файлів коду застосунку, тестовийengines/__tests__/mockData.tsі 2 svg лежать у 9 стартових чанках (6,1 МБ мініфікованого JS, ≈1,9 МБ gzip). Розбіжність із графом — лише 4 файли без власного коду (реекспорти/типи).
Підсумок
| 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, Лео). Власник: «там, де |
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_РОЗКРІЙ.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. Коротко для власника
- «Дві математики» розкрою з 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] - З'явилась нова двоїстість — «ламана Studio» і «точний контур ядра OCCT». З 09.10 (№246) розкрій і перевірка колізій беруть точний контур ядра, а для цього чекають, поки ядро порахує (перший раз після відкриття — секунди). Це очікування асинхронне й нічим не обмежене в сторі.
[ФАКТ ◔] - Найважче, що знайшов: кеш точних контурів упізнає деталь за зовнішнім контуром і кількістю вирізів, а не їх місцем. Якщо в межах сесії посунути (чи змінити) виріз мийки на стільниці з радіусом або з отвором під кран — дошка, колізії, DXF на верстат і креслення PDF/бланк беруть виріз зі старого місця до перезавантаження сторінки. Зонд із реальним ядром: DXF пише отвір на x≈450 замість ≈1450.
[ФАКТ ✔, зонди C1/O1/O3] - Під час очікування ядра дії людини губляться: доданий сляб, правка номера замовлення, посунута деталь і навіть Ctrl+Z перезаписуються знімком, зробленим до очікування. А дія під час роботи воркера розкрою «вішає» розкрій: кнопки сірі зі спінером, збереження в кабінет відмовляє, нова деталь ні на слябі, ні в буфері.
[ФАКТ ✔, зонди R1/R2/R4] - Відкритими з 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]:
- асинхронний крок «чекаємо контури ядра» між
explodeDetailsі пакуванням (№246, 09.10); - колізії, межі, дефекти, відступ — по
DetailPart.cutOutline(точний контур ядра, розгорнутий у ламану зі стрілою ≤ 0,3 мм), решта (габарит, сторони, текстура) — по ламанійpoints(№246); - на сляби йде лише камінь (
stoneParts, №256); фанера й метал лишаються вpartsдля документів і грошей; - у рушії один будівник кутів, Г/П ріжуться одним ножем, довільний контур теж ріжеться стиком, виріз на лінії стику стає виїмкою в обох шматках (25.09/28.09/03.09);
- виправлено подвійний припуск на прямокутнику з кутами (№209) і старий припуск на дугах (№247);
- ядро OCCT переїхало в окремий потік (№277, 12.10) — сторінка не завмирає, але розкрій чекає.
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. Таймаути [ФАКТ ◔ + ✔]
- У сторі й провайдері таймауту немає;
pending.thenбез.catch(packingSlice.ts:112–115). Зонд R3: обіцянка, що не приходить, →isPacking = trueбезстроково[ФАКТ ✔]. - Єдиний запобіжник — watchdog потоку ядра: 120 с на ініціалізацію і на кожен запит (
workerClient.ts:31, 64–67, 72, 121); після нього потік вбивається, черга відхиляється (:45–62), наступний запит стартує новий потік (:77–78). - Провайдер ловить збій кожного парта (
kernel/cutOutlines.ts:102–105) і не кешує його (щоб повторити після відновлення). Отже при завислому ядрі розкрій чекає N_дуг × 120 с і повторює це на кожному наступному розкрої. Зонд K (мок ядра, 6 партів × 100 мс зі збоєм): першийprepare603 мс, другий знову 602 мс, викликів ядра 12[ФАКТ ✔].
3.3. Ядро впало / повільне [ФАКТ ◔]
- Збій WASM (
RuntimeError) або падіння потоку →fatal→failAll(geometry.worker.ts:60–63, 69–73;workerClient.ts:85–120) → відхилення → провайдер пише в консоль «OCCT 2D: контур парта не побудовано —» (kernel/cutOutlines.ts:103) і віддає парт без контуру → розкрій іде по ламаній мовчки (для людини це не видно). - Тести Бруно тримають транспорт і кеш, а не стор:
kernel/__tests__/workerClient.test.ts(11: черга, статус, таймаут ініціалізації й операції, крах → новий потік, fatal, конфігурація),cutOutlinesRecovery.test.ts(5: збій не кешується й повторюється, паралельні збої діляться однією обіцянкою, «непідтримуваний» кешується як null, нема деталі — не кешується, синхронний виняток),useExactOutlinesRecovery.test.tsx(3: хук не крутить нескінченних повторів, оновлює UI після null, не губить зміни під час збою). Не тримають: що робить стор, коли контури не приходять/приходять пізно, і що буде з діями людини за цей час.
3.4. Що бачить людина [ФАКТ ◔]
isPacking = true(packingSlice.ts:110) → крихітнийLoader2на активній кнопці режиму (SlabBoard.tsx:1062–1064 / 1084–1086 / 1106–1108), три кнопки й «Перевірити розкладку» (:1119) сірі, «Очистити розрахунок» сіре (App.tsx:605), «Зберегти в кабінет» відмовляє «Дочекайтеся завершення розрахунку» (store/cabinetActions.ts:20), так само реєстр/форк замовлення (features/order-registry/forkProject.ts:33,RegistryDesk.tsx:35).- Жодного тексту на кшталт «рахую точні контури»; Стоуника біля дошки немає (є лише в 3D Підборі —
components/3d/Viewer3D.tsx:2066). - Плашка ядра (
kernel/KernelBadge.tsx:16–20: «OCCT вантажиться…», «OCCT помилка: …») схована в Studio (:31, №239) — у проді людина не дізнається ні про завантаження, ні про збій ядра. - Під час очікування нові парти вже в
parts, але не на слябі й не в буфері (unplacedPartIdsще старі) — на кілька секунд деталь «зникає» з екрана.
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. Інші зонди маршруту [ФАКТ ✔]
- A2 Г: кутовий вертикальний + довільний x = 250 → 3 шматки (02.09: 2). П: омега + лямбда + довільний → 4 (02.09: 2).
- A3 ліва Г з редактора (
mirrorL: true) →buildGeometryдаєcornerOrientation: 'BL'(domain/elementToDetail.ts:112–114) → контур розкрою(0,0)(2000,0)(2000,1200)(900,1200)(900,700)(0,700)= контур 3D/креслення (domain/baseContour.ts:108). - A6 довільний контур (
customPoints) зі стиком → 2 шматки (02.09: стик ігнорувався). Виріз 500×300 по лінії стику → дві виїмки, шов 600 → 300 мм (02.09: отвір цілком одному шматку). - A4 прямокутник із R100 на одному куті — 16 точок без дублів (02.09: 18 з дублями); фаска — 5.
Дрібне [ФАКТ ◔]: типові розміри Г записані в чотирьох місцях по-різному — ніж 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. Де вони розходяться
- Кеш точного контуру не бачить зміни вирізу
[ФАКТ ✔ — найважче].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 не зберігся — не перевірено.[ГІПОТЕЗА]чому не помітили: після перезавантаження кеш порожній і все правильно. - Два контури для одного верстата
[ФАКТ ◔]: DXF-профіль «Combicut» з дошки ріжеexact.actual(з припуском,exportCutDxf.ts:96, 179), вкладка CombiCut —exact.nominal(без припуску,combicut/plan.ts:146). При припуску 0 (domain/defaults.ts:159–171) різниці нема; при ненульовому (FormsPanel.tsx:1636) дві програми на один сляб різнитимуться на припуск з кожного боку. - Перепил на дугах
[ФАКТ ✔, зонд 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). - Три функції «полігон розміщеного парта» (
packing.ts:140,canvasUtils.ts:27,lib/project.ts:124) живі; тепер вони ще й з різних джерел: колізії — точний контур, прилипання й виділення — ламана.computedAllowancesпише лише незмонтованаPlacementPropertiesPanel(projectSlice.ts:646–686; 0 імпортів панелі) — працює тільки на старих проєктах[ФАКТ ✔ grep].[ГІПОТЕЗА]магніт кладе «впритул» по ламаній, а на дузі точний контур виходить за неї до 0,9 мм (НЕСТИНГ_НА_ТОЧНИХ_КОНТУРАХ.md§3) → можливий червоний конфлікт після прилипання. - Доки 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)
- Що це. Окремий робочий стіл: план різу сляба з погодженого розкрою (
engines/combicut/plan.ts: пряма → диск, дуга/отвір → вода,miter45→ 45° + щуп, хвости пропилу й «стоп на внутрішніх кутах» №259), черговість, XML/TXT Breton, DXF для Pegasus, 3D-симуляція (sim.ts,CombiCutSim.tsx). Тести:combicut.test.ts11,combicutOrder.test.ts7,combicutSim.test.ts6 — зелені.[ФАКТ ✔] - Звідки геометрія. З ядра через той самий хук і кеш, що дошка (
CombiCutTab.tsx:82–83→useExactOutlines), контурexact.nominal(без припуску), інакшеnominalPoints/points(plan.ts:145–147); розміщення —project.placements(CombiCutTab.tsx:86–99); сторона для 45° — зsideIdламаної (plan.ts:101–115). Тобто CombiCut успадковує знахідку 5.2.1 (старий виріз із кешу) і розходиться з DXF «Combicut» з дошки (5.2.2).[ФАКТ ◔] - Чи підключений у Студії. Ні. Вкладка лише серед вкладок конструктора (
components/WorkspaceTabs.tsx:28, 233;store/useStore.ts:40), аisViewAvailable(useStore.ts:52) у прод-збірці закриває CAD (№262,kernel/config.ts:70–77). У Studio для верстата є лише «Експорт DXF» на дошці з профілями «Загальний / Combicut / NC300» (SlabBoard.tsx:1132–1149). Рішення власника 10.10 (журнал №255): у проді — DXF у шарах для Pegasus, XML/TXT — лише для симуляції.[ФАКТ ◔]
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. Ключові знахідки
- [ФАКТ ✔, зонди C1/O1/O3] Застарілий точний контур після зміни вирізу.
exactPartKey(kernel/exactParts.ts:24–27) не містить координат отворів, кеш (kernel/cutOutlines.ts:64–75) не інвалідується → після зсуву мийки/крана на деталі з дугою чи круглим отвором дошка, колізії, DXF на верстат (отвір на x≈450 замість ≈1450), бланк/PDF (№249), аркуші цеху й CombiCut беруть старе місце до перезавантаження сторінки. - [ФАКТ ✔, зонди R1/R4] Дії під час очікування ядра перезаписуються.
finishPacking(remappedProject…)(packingSlice.ts:112–115 → 193–194/204–205) повертає проєкт до знімка: зникає доданий сляб, правка шапки, переміщення; Ctrl+Z відкочується назад (квитокcutOutlineTicketundo не чіпає,historySlice.ts:96–98). - [ФАКТ ✔, зонд R2] «Завислий» розкрій після дії під час роботи воркера.
finalizeProjectStateзбільшуєpackingRequestId(projectSlice.ts:20), відповідь відкидається безisPacking = false(packingSlice.ts:224) → кнопки сірі зі спінером, «Зберегти в кабінет» відмовляє (cabinetActions.ts:20), нова деталь ні на слябі, ні в буфері. - [ФАКТ ✔, зонди 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), збій ядра — лише в консолі, розкрій мовчки йде по ламаній. - [ФАКТ ✔, зонди B1/B1b] Перепил 70 мм: після авторозкрою нового проєкту 6–8 із 10 деталей «конфлікт»; пакер не знає перепилу (
packing.ts:302–342),detectConflictsзнає (:1947–1969); сторожpacking.test.tsбезreferenceData. - [ФАКТ ✔, зонд B3] Хорди дуги — як прямий пропил. Пропуск лише для
bulge(packing.ts:1951,PartShape.tsx:15), якого немає ні в ламаній, ні в контурі різу → деталь із R30 «конфліктує» з сусідом за 40 мм, з гострими кутами — ні. - [ФАКТ ✔, зонд B2] «Перевірити розкладку» рахує фанеру й метал (
SlabBoard.tsx:1122,packing.ts:1892; №256 фільтрує лише стор) → хибне «Ваша розкладка КРАЩА за автоматичну». - [ФАКТ ◔] Два контури для CombiCut: DXF «Combicut» з дошки — з припуском (
exportCutDxf.ts:96, 179), вкладка CombiCut — номінал (combicut/plan.ts:146); MES отримує ламану при коментарі про дуги (mesPack.ts:377–401), PNG — ламану (App.tsx:559). - [ФАКТ ✔, зонди A1–A6/O2] «Дві математики» розкрою закриті: один будівник (
geometry.ts:913), один ніж для всіх стиків (joints.ts:367–427), однакова площа Г у всіх стиках (0,452168 / ядро 0,452146), ліва Г — ліва, довільний контур ріжеться; але зсув стику з дуги й «деталь пішла ЦІЛОЮ» — лише в консоль (jointNotices,geometry.ts:1659). - [ФАКТ ✔, зонд A5] Радіус на будь-якому куті вимикає розгортку підвороту в «Повній текстурі» (
packing.ts:587–590). - [ФАКТ ◔] «Перерахувати слеб» перескладає весь проєкт без підтвердження (
SlabBoard.tsx:1544→packingSlice.ts:301–306,fullRepack = true). - [ФАКТ ◔] Відкрите з 02.09: режим розкрою не зберігається (
packingSlice.ts:293), дзеркало без «кромки» (packing.ts:466–471протиАРХІТЕКТУРА_І_СТЕК.md:450–453), два ключі текстурних груп (geometryUtils.ts:20/textureLayout.ts:37),loadWithoutPackingбез матеріалу (projectHelpers.ts:115).
11. Питання власнику
- [ПИТАННЯ] Мийка/кран, зсунуті в межах сесії. Чи були з 06.10 (DXF з ядра) / 09.10 (бланк із ядра) випадки, коли DXF, бланк погодження або PDF розкрою робили після правки вирізу без перезавантаження сторінки? Їх варто перевірити до різу (знахідка 1).
- [ПИТАННЯ] Що правильно, поки «рахую точні контури»: не давати нічого робити на дошці й у шапці (і чесно показати «зачекайте») чи доробити, щоб правки не губились? Обидва варіанти змінюють поведінку для менеджера.
- [ПИТАННЯ] Перепил 70 мм (Б-3 з 02.09, без відповіді): це правило для пакувальника (тоді він сам має тримати відступ) чи лише попередження? І чи рахувати перепил на дугах, які на CombiCut ріже вода?
- [ПИТАННЯ] Який контур різати на CombiCut — номінальний чи з припуском? Зараз DXF з дошки і вкладка CombiCut ріжуть різне.
- [ПИТАННЯ] «Перерахувати слеб» має перекладати лише цей сляб і/або питати підтвердження, як кнопки режимів?
- [ПИТАННЯ] Прогрів ядра після відкриття сторінки (пропозиція Б із
ЗАМІРИ_12-10: перший розкрій 5,6 → 0,5 с, ціна ≈ 500 МБ пам'яті на кожного): так / лише на комп'ютерах / ні? - [ПИТАННЯ] Г ліва/права: дзеркало дає не дзеркальну деталь, а іншу ширину вирізу (1100 → 900,
contourBaseline.test.ts:129–138) — це угода чи помилка? - [ПИТАННЯ] Залишки з 02.09 без рішення: радіус кута робить деталь «кривою» для «Повної текстури» (Б-4)? Дзеркало з умовою «без кромки» (Б-5)? «Підбір текстури» має групувати як пакер (Б-6)?
12. Пропозиції (не рішення)
- Ключ кешу точного контуру — додати геометрію отворів (координати, а не кількість) і, для певності, хеш вирізів деталі; сторож «зсув/зміна вирізу → новий контур у кеші, DXF, кільцях PDF».
- Асинхронна гілка розкрою — після приходу контурів зливати результат у поточний
get().project(як робить відповідь воркера), а не в знімок; undo/redo збільшує йcutOutlineTicket; таймаут/межа очікування з переходом на ламану й повідомленням; сторожі на R1/R2/R4. - Відкинута відповідь воркера — або не відкидати через дії, що не міняють складу деталей, або скидати
isPacking/перезапускати; сторож «дія під час розкрою → кнопки оживають, деталь не губиться». - Голос очікування — Стоуник біля дошки «рахую точні контури — перший раз довше» (як пропонує
ЗАМІРИ_12-10п. 3) і видимий збій ядра в Studio (плашка схована). - Перепил — після рішення власника: або в
validatePlacement, або лише попередження; дуги позначати в контурі різу (bulge/прапорець), щоб вода не рахувалась пилою; сторож ізreferenceData. nestingSavings,applyCutOutlines,loadWithoutPacking— черезstoneParts, як решта конвеєра.- Одне правило «який контур іде на верстат» для DXF-профілю Combicut і вкладки CombiCut; MES/PNG — з того самого джерела або чесний коментар.
jointNotices→ видимий список (Стоуник/панель стиків): «стик посунуто на 100 мм», «деталь пішла ЦІЛОЮ».isCurvedTextureGroup— за формою (коло/овал/довільний контур), не за кількістю точок; підтвердження в «Перерахувати слеб»; збереженняpackingModeу проєкт; прибрати мертву підпискуHeaderToolbar.tsx:9–10,groupedParts,nearbyElementReliefPlacements, ключі[CORNER-DEBUG]; звести типові розміри Г в одне місце (якuShapeDimsдля П).
Додаток. Що запускалось
- Читання: бриф, L1 і розділи 3/11 звіту 02.09,
01_ПИТАННЯ_ВЛАСНИКУ_02-09.md(Б-1…Б-8),НЕСТИНГ_НА_ТОЧНИХ_КОНТУРАХ.md,ЗАМІРИ_12-10_ШВИДКІСТЬ_І_СТОУНИК.md, журнал №246–№259 (+ №255 доповнення); код — адреси вище. - Ворота (запускав ведучий, не дублював):
gates/vitest.txt— 1856 ✓ / 2 відомі ✗ / 19 пропущено. - Точковий прогін у
probe-L1під замком: 20 файлів розкрою, 142 ✓ (/tmp/final/audit1310/L1_tests.out). - Зонди (
/tmp/final/audit1310/probe-L1/src/__audit_L1__/, лишені для ведучого):probeGeometry.test.ts— A1 площі Г у стиках (права/ліва), A2 кутовий+довільний (Г, П), A3mirrorL, A4 точки прямокутника з радіусом, A6 довільний контур зі стиком і виріз на шві;probePacking.test.ts— B1/B1b перепил після авторозкрою, B2nestingSavingsз фанерою/металом, B3 хорди дуги як пропил, A5 підворот у «Повній текстурі»;probeStore.test.ts(jsdom, фальшиві провайдер і воркер) — R1 дії під час очікування ядра, R2 дія під час воркера, R3 обіцянка не приходить, R4 Ctrl+Z під час очікування;probeKernelWait.test.ts(мок ядра) — K послідовність і повтор збоїв;probeCacheKey.test.ts(без ядра) — C1 ключ кешу після зсуву вирізу;- з ядром OCCT, під замком:
probeOcctCache.test.ts— O1 кеш після зсуву вирізу, O2 площа Г за точним контуром (L1_occtcache.out);probeOcctExport.test.ts— O3 DXF і кільця PDF після зсуву (L1_occtexport.out).
- Не перевірено: живий браузер (усі UI-висновки — за кодом); реальна тривалість воркера пакування на великих проєктах; як часто на практиці правлять виріз між першим показом дошки і експортом (знахідка 1 — частота
[ГІПОТЕЗА]); поведінкаfindSnap/магніту на дугах (5.2.4 —[ГІПОТЕЗА]); 3D-лінії стиків у редакторі (лінза L2; коментарDetail3DPreview.tsx:1316–1334про «НЕ зсуває» і «ріже ТІЛЬКИ по довільних» застарів, але гілка спрацьовує лише для чернетки зjointDirection, яку редактор із 03.09 сам перекладає в довільний стик —draftHelpers.ts:199–214).
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. Коротко для власника
- Кромка в 3D сьогодні — це «імітація фрези»: переріз фрези протягується вздовж сторони і віднімається від
плити булевою операцією OCCT. Гроші, метраж, розкрій, DXF і PDF від цього 3D-тіла не залежать — вони
рахуються з 2D-контуру
[ФАКТ ✔]. - Час іде майже весь на віднімання, а не на «малювання»: на Г власника (R350, L20 на B–D) 82 % — булеві
операції, і з них дві третини — перестраховка: ядро рахує віднімання трьома способами, бо перший
(«одним списком») на стику дуги з прямою щоразу дає зламане тіло
[ФАКТ ✔]. - Зонд показав реальні секунди: якщо інструмент фрези вздовж «пряма → дуга → пряма» будувати однією
трубою (а не шматками), та сама деталь будується за 0,26–0,73 с замість 1,6–26,6 с, об'єм тіла той
самий до кубічного міліметра
[ФАКТ ✔]. Це головна відповідь на «що ще можна зробити з кромками». - Дешеві виправлення на прямих сторонах дають ще −50…−70 % (сотні мілісекунд). Кеш інструментів, два потоки ядра і менша збірка OCCT секунд на зміні кромки не дадуть (розділ 4).
- Контур деталі сьогодні будують дві незалежні математики (розкрій і 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. Що з цього випливає
- Секунди живуть лише там, де профіль проходить дугу (F2, F5) або де багато різних профілів (F4b). Прямокутник з однією кромкою — 0,2–0,45 с, тут «гальма» — не ядро.
- Кеш складань (№275) знімає повтор тієї самої моделі повністю, кеш плити (№278) — зсув вирізу (4,2 с → 0,2 с), але жоден кеш не допомагає зміні самої кромки — це завжди нова модель і повна побудова.
[ФАКТ ✔]Кеш плити №278 має 2 місця на ядро на всіх: у нього ж пишуть точні контури розкрою/DXF (outline2D.ts:206→buildShape) і тіла доповнень із вирізами (occtBuilder.ts:1069). Зонд №4: зсув вирізу в Г власника — 197 мс; після двох точних контурів інших деталей з вирізами — 3 895 мс (плиту витіснено). Як часто це трапляється в живій роботі (дошка/розкрій і редактор в одному worker) —[ГІПОТЕЗА].[ФАКТ ◔]Черга превʼю скасовує лише ще не почату побудову (previewScheduler.ts:25–67); запущену 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 (очікувано) — тобто тіло ще точніше.
- Виграш: Г власника 3,5–4,4 с → 0,3–0,4 с; найгірший випадок (відкат) 26 с → 0,7 с. Перевірка «двома способами»
стає непотрібною або дешевою: «списком» тіло валідне з першого разу; навіть якщо лишити звірку двома способами —
≈0,6–0,8 с
[ГІПОТЕЗА](у зонді міряв один спосіб). - Ризик: треба повторити всю семантику шляху фрези (часткові кромки, «наскрізь» на опуклій дузі,
dropна малій увігнутій дузі, кільце вирізу, різні профілі на стику, овал —MakePipeпо еліпсу не перевіряв); труба по замкненому контуру —[ГІПОТЕЗА]. - Файли:
kernel/occt/occtBuilder.ts(новий будівник інструмента замістьedgeToolsWithArcs/sweepSegmentTool);engines/edgeCutters.ts(у рішення додати діапазон контуру пробігу, щоб ядро взяло точні ребра, а не ламану станцій);kernel/modelFromDraft.ts. - Перевірка: скан як у №276 (Г на всіх кутах, обидва дзеркала, профілі L20/ar_20/xd_20/d_20/t_20/lv_40_inv, коло, П, виріз R40) — об'єм ≤ похибки перерізу, перерізи площинами ≤0,1 мм, валідність, 1 тіло, час.
(а) План Б: кромка спершу лише кольором, геометрія — кнопкою «Промалювати кромки» — СЕКУНДИ, але ціною картинки
- Виграш
[ФАКТ ✔]: плита без кромок — 10–14 мс (F1, F2), 136 мс з вирізом (F3); зміна кромки миттєва. - Гроші, метраж (№250), розкрій, DXF, PDF від 3D-тіла не залежать
[ФАКТ ✔](розділ 1.1) — цифри не зміняться. Зміниться лише показ: 3D редактора й Підбору, знімки для клієнта, AR/GLB з того, що на екрані[ГІПОТЕЗА], переріз/STEP стенду. - Ризик: менеджер показує клієнту 3D без профілю; «кнопка» — ще один стан, який легко забути; власна умова ЛОГІКА_ОБРОБОК «симулюємо інструмент» перестає бути видимою за замовчуванням.
- Файли:
Detail3DPreview.tsx(накладка кольору на торець заedgeMap),useKernelAssembly.ts/modelFromDraft.ts(режим безedgeLofts), кнопка + Стоуник. - Після (д) різниця 0,3–0,7 с проти 0,01 с — потреба мала.
[ПИТАННЯ]до власника.
(в) Інкрементальне віднімання: база «плита з усіма кромками, крім зміненої» — секунди лише з наперед порахованою базою
- Зонд №1
[ФАКТ ✔]: F4b, Bl_20→r_5: повна 2 076 мс → 278 мс від готової бази; F2, Dl_20→ar_20: 3 343 → 1 410 мс; F2 «+L20 на E»: 3 857 → 301 мс. ΔV = 0 мм³, тіла валідні. Рішення фрези «база ∪ лише сторона» = «уся деталь» — так для F4b і F2/D; для «+E» рішення інші (E зливається в пробіг B–D), але тіло те саме. - Ціна: сама база коштує як повна побудова (1,3–3,6 с) — виграш лише якщо її порахувати заздалегідь у фоні (відкрили панель кромки сторони X → worker будує «без X»); пам'ять — ще одна плита в wasm на сторону.
- Ризик: порядок віднімання на дузі (№276 показав, що він важливий), злиття пробігів, охорона як у №278.
- Файли:
occtBuilder.ts, кеш на зразокprofiledBaseCache.ts,workerProtocol.ts(запит «підготуй базу»). - Після (д) зайве: повна побудова й так 0,3–0,7 с.
(б) Кеш тіла інструмента кожної кромки (ключ: профіль + геометрія сторони) — не секунди
- Інструменти — 6–9 % часу на дугах (F2: 0,26 с з 4,07), 30 % на прямих (F4b: 0,63 с з 2,09)
[ФАКТ ✔]; віднімання однаково рахується наново з усіма інструментами. Ключ «по стороні» некоректний: однакові сусіди зливаються в один пробіг, і зміна однієї сторони міняє інструмент сусідньої (F2 «+E»). - Виграш ≤0,3–0,6 с, а після дешевого виправлення прямих (нижче) — десятки мс. Не рекомендую як окрему роботу.
Прямі сторони: злиття колінеарних станцій і призма замість «зшивання» — сотні мс, дешево [ПРОПОЗИЦІЯ, виміряно]
- Сьогодні пряма сторона з подовженнями дає 3 інструменти на кожен переріз (подовження–сторона–подовження), і
кожен будується зшиванням граней (
sweepSegmentTool, ~18 мс шт.). - Зонд №2
[ФАКТ ✔]: злиття колінеарних станцій — F1 192 → 97 мс, F4b 1 870 → 902 мс; плюс призма (BRepPrimAPI_MakePrism) — F1 → 58 мс, F4b → 760 мс (будова інструментів 665 → 18 мс). ΔV = 0, валідне. - Ризик: низький (лише прямі з мітрою 1). Файли:
occtBuilder.ts:343–385, 579–599.
(е) Фаска/радіус самим ядром (BRepFilletAPI_MakeChamfer / MakeFillet) — секунди для 43 з 70 профілів, але інша поведінка
- Класи
PROFILE_CUTS(легкий зонд): фаска — 18, радіус — 25, shark — 15, бульноз — 4, cove — 4, півбульноз — 1, без різу — 3. - Зонд
[ФАКТ ✔]: F1 173 → 62 мс; F4a 275 → 148; Г R350 зar_20на B, C, дузі, D — 1 607 → 121 мс; прямокутник R100 зar_20на A і B (через дугу) — 1 475 → 57 мс; ΔV = 0. Радіус R3 по всьому контуру (t_20): 739 → 154 мс, ΔV = −296 мм³ (ядро точне, інструмент — 10-кутник). - Пастка
[ФАКТ ✔]: фаска лише на A прямокутника з R100 на куті AB — ядро саме переносить фаску по дотичній дузі на сторону B (знімає 10 021 мм³ проти 7 490 у інструмента). Тобто правило «наскрізь по дотичній» і часткові кромки треба відтворювати окремо. Після (д) окремий виграш малий; варто лише якщо цех захоче точні радіуси.
(г) Швидкий наближений меш кромки без OCCT одразу + точне тіло пізніше — сотні мс видимої затримки, але друга правда
- Легасі-шлях (ExtrudeGeometry + різаки +
three-bvh-csg) у node[ФАКТ ✔]: F1 42 мс, F2 198, F3 20, F4a 5, F4b 29 мс. Код живий (Detail3DPreview.tsx:347–445, гілка без ядра). - Ризик: порушує умову Бруно №4 «жодної прихованої підміни старим будівником» (
Detail3DPreview.tsx:454–459,kernel/types.ts:10–12) — два будівники в підтримці назавжди; на екрані на 0,3–5 с інша геометрія (зубці на дугах легасі — ТОРЦІ_НА_РАДІУСАХ §3).[ПИТАННЯ]власнику/Бруно. Після (д) не потрібен.
(є) Два потоки ядра — не про зміну кромки
- OCCT у wasm однопотоковий
[ФАКТ ✔](уopencascade.full.jsнема ніSharedArrayBuffer, ні pthread); одна побудова не ділиться між потоками. Другий worker допоможе лише паралельним незалежним задачам (Підбір з кількома виробами, точні контури дошки поряд із превʼю — заодно зняв би витіснення кешу №278) або фоновій базі для (в). - Ціна
[ФАКТ ◔, замір 12.10]: ~500 МБ пам'яті на ядро в браузері; у node купа wasm 100 → 299 МБ і не зменшується. На телефоні — ризик, що вкладку вб'є.
Менша збірка OCCT (50 МБ → ~7 МБ) — не про зміну кромки
- Лише холодний старт: файл 50 МБ (gzip 13,8 МБ, замір 12.10; коментар
loadOcct.ts:3–10каже «~9 МБ» — розходиться), старт 5,6 с у браузері / 4,9–6,4 с у node. Ядро вживає ≈58 класів OCCT (grepoc.*уkernel/) +MakePipe/MakeChamfer, якщо (д)/(е). Булеві від розміру збірки не прискоряться[ГІПОТЕЗА]; ризик — відсутній клас у власній збірці = помилка в рантаймі. Вимір компіляції wasm — лінза L7.
Ще дрібне, але реальне
- Порядок способів у перевірці №276
[ПРОПОЗИЦІЯ]: на Г власника «список» провалюється завжди — починати з «по черзі» + «нечітке» економить ≈1,1–1,5 с з 4 с; після (д) не потрібно. Файл:occtBuilder.ts:976–985. - Кеш плити №278: окреме місце для превʼю редактора або більше 2 місць (з обліком пам'яті) — знімає 0,2 → 3,9 с
на зсуві вирізу після роботи дошки. Файл:
profiledBaseCache.ts:13. - Скасування застарілої побудови:
Message_ProgressRangeз перериванням —[ГІПОТЕЗА], чи підтримує opencascade.js; після (д) неактуально.
Підсумок: секунди на зміні кромки дає лише (д) — інструмент однією трубою вздовж гладкого ланцюга (і, ширше, точні примітиви); дешеве (прямі сторони) — сотні мс; план Б — питання вигляду, не швидкості; кеш інструментів, два потоки, менша збірка — не про це.
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. Ключові знахідки
[ФАКТ ✔]Кромка в 3D впливає лише на картинку. Гроші, метраж, розкрій, DXF, PDF рахуються з 2D-контуру; точний контур ядра для цеху будується без кромок (outline2D.ts:205); 3D-тіло читають лише показ і стенд. Тому «план Б» безпечний для цифр (розділ 4а).[ФАКТ ✔]4 секунди на Г власника — це перестраховка віднімання. «Одним списком» на стику дуги з прямою щоразу дає невалідне тіло (3 тіла), тож кожна правка платить три булеві + перевірки (occtBuilder.ts:941–990): 1,5 + 1,4 + 1,0 с + 0,5 с перевірок; інструменти — лише 0,26 с.[ФАКТ ✔]Інструмент однією трубою вздовж гладкого ланцюга дає те саме тіло в 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 мм³) — головна відповідь на «що ще можна зробити з кромками».[ФАКТ ✔]Найгірший випадок — відкат на старий лофт: Г власника зd_20будується 26,6 с, 1 349 граней (occtBuilder.ts:863–869); сторожі №276 цей профіль на цій деталі не тримають.[ФАКТ ✔]Прямі сторони будуються втричі більшим числом інструментів, ніж треба, і кожен — «зшиванням» граней (occtBuilder.ts:343–385): злиття станцій + призма — F4b 1,87 → 0,76 с, F1 0,19 → 0,06 с, ΔV = 0.[ФАКТ ✔]Кеш плити №278 (2 місця) витісняють точні контури розкрою й тіла доповнень з вирізами: зсув вирізу на Г власника 0,2 с → 3,9 с після двох точних контурів інших деталей (profiledBaseCache.ts:13,outline2D.ts:206,occtBuilder.ts:1069).[ФАКТ ✔]Діагностика фаз Бруно не розділяє інструменти й віднімання (edgeToolsMsніколи не міряється,occtBuilder.ts:662–669) — «cutMany 86–93 %» включає будову інструментів і перевірки.[ФАКТ ◔]Контур деталі — дві живі математики, не шість: розкрій (geometry.ts— власні розкладки, 12 хорд/дуга) і 3D/ядро (baseContour→shapeBuilder); точні контури DXF/PDF — гібрид обох черезpartShift. Сім різних дискретизацій однієї дуги (12…256 і точна).[ФАКТ ◔]У 3D Підборі мийки й метал досі на легасі, решітка зливу не малюється ніде, крім легасі-Підбору; переріз кромки в «Документах» — з каталогу SVG, не з тіла (друга «правда про форму» профілю).[ФАКТ ✔]Три старі діри перейшли в ядро: профіль під ногою прорізається; гнутий елемент на увігнутому куті будується; мийка збирається за іменами партів (edgeOccupancy.ts:45,radiusElement.ts:242,sinkAssembly.ts:52–94).[ФАКТ ✔]Гроші й 3D розходяться на опуклій дузі: профіль лише на A, R100 без «Обробки торців» — метраж 1 978,5 мм (з половиною дуги), а в 3D дуга без профілю (фреза «наскрізь» по дотичній,edgeCutters.ts:964–982); з «Стандарт» — дуга в метражі 1,5 раза.[ФАКТ ✔]39 з 70 профілів без вбудованого правила грошей, серед нихl_20— саме L20, на якому вимірювали гальма 3D, у кошторисі дає нуль, поки керівник не додасть правило (serviceMapping.ts:75); і досі мовчки — жовта плашка є лише для правил, що вказують на неіснуючу послугу (EstimatePanel.tsx:333–340). Деталі — L6.
8. Питання власнику
- План Б: менеджеру прийнятно бачити кромку спершу кольором (без форми) і натискати «промалювати», чи 3D має завжди показувати профіль? Якщо зробимо «одну трубу» (4д), різниця 0,3 с проти миттєвої — чи потрібен план Б взагалі?
- Профіль лише на одній стороні біля опуклої дуги: цех справді не фрезерує дугу (як у 3D, «наскрізь по дотичній»), а клієнт платить за половину дуги (як у метражі)? Що з цього правда — 3D чи гроші?
- Швидка прев'ю-картинка старим будівником на 0,3–5 с, поки ядро рахує, — дозволяєте попри умову Бруно №4 «жодної підміни старим», чи краще Стоуник «перебудовую» і старе тіло?
l_20і ще 38 профілів у кошторисі дають нуль — додаємо правила (як уEdgeProfileDef.operations) чи цех рахує їх інакше?- Фаска/радіус точним ядром дають точніші радіуси, ніж каталожний 10-кутник (різниця ≈1,5 % знятого матеріалу): для цеху важлива точність форми профілю в 3D/STEP, чи досить «схоже»?
- Гнутий елемент на увігнутому куті і кромка під ногою — перекрити правилом у ядрі й фактах, чи це рідкість і лишаємо?
9. Пропозиції (не рішення)
- Інструмент фрези однією трубою вздовж гладкого ланцюга ребер (4д) — перший кандидат, бо єдиний дає секунди
на зміні кромки й знімає корінь №276. Спершу сторожі-скан (як №276) з порівнянням об'єму й перерізів із
сьогоднішнім тілом, потім заміна під перемикачем на кшталт
?arcs=0. - Прямі сторони: злиття колінеарних станцій і призма замість зшивання (−50…−70 % на прямокутниках).
- Кеш плити №278: окреме місце для превʼю редактора (або облік за байтами), щоб дошка/DXF його не витісняли.
- Діагностика фаз: міряти окремо інструменти, віднімання, перевірки, сітку (як у зонді) — щоб наступні рішення приймались за правильною розбивкою.
- Сторож на найгірший випадок: Г власника з
d_20(сьогодні відкат, 26,6 с) і кромка під ногою — уkernel/__tests__. - Одна правда про переріз профілю:
PROFILE_CUTS(3D) іedgeProfileDrawings(креслення) звірити тестом або брати переріз креслення з тіла (план VS CAD §4 «перерізи з тіла у комплект креслень» — не зроблено). - Узгодити гроші й 3D на дузі після відповіді на питання 2 — одне правило «чи профілюється дуга» для
edgeLengthForSideіbuildEdgeCutters. - Доки:
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_МЕРТВЕ_ВАЖКЕ_ХАРДКОД.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. Коротко для власника (простими словами)
- Так, частина CAD і «будівника» (ядра OCCT) вшита в Студію. Вкладки CAD (замір, метал, фанера, збірка, зведення, документи, CombiCut) і BUILDING (план, розкладка, відомість) — справді «сплять», поки в них не зайшли: їхній код вантажиться лише при відкритті. Але креслярка CAD (≈3 100 рядків) і майже все ядро OCCT (≈6 000 рядків, разом із будівником тіл) потрапили в стартовий набір через «містки»: дошку 2D-розкрою (діалог експорту DXF), реєстрацію ядра в
main.tsxі бічну панель BUILDING. Цей код вантажиться при кожному відкритті сторінки. - Ядро OCCT у Студії не спить. При старті
main.tsxреєструє ядро для всіх режимів, і 2D-дошка та розкрій просять у нього точні контури деталей, щойно на дошці є деталь із дугою (заокруглений кут, круглий виріз, еліпс). Сам 50-мегабайтний файл ядра вантажиться не на старті, а при першій такій потребі — тобто при першому відкритті майже будь-якого реального проєкту. Скільки це коштує в секундах — міряє L7. - МЕС (симуляція цеху) — мертва: вкладку ніхто не підключив; 3 090 рядків лежать лише заради тестів. Задуманий поділ «Студія / CAD / BUILDING як окремі робочі простори» теж написаний, але не підключений.
- Код подвоївся за 41 день (88,5 тис. → 146,9 тис. рядків), а з мертвого, знайденого 02.09, не видалено жодного файла. Мертвих файлів стало 17 (було 9).
- Великі файли стали ще більшими: редактор деталі в 3D — 3 530 рядків (+616), редактор виробу — 2 974 (+416, один компонент на 2 298 рядків), довідка — 1 154 (×2). Сім функцій довші за тисячу рядків.
- На старті кожної сторінки вантажиться ≈6,1 МБ JavaScript (≈1,9 МБ стисненого) — 79 % усього коду, і в ньому бібліотеки читання PDF і Excel (≈2 МБ сирця), потрібні лише для імпорту бланка погодження, а також тестові дані, з якими при кожному старті ганяється розрахунок геометрії.
- Нові папки (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 робить до першого рендера [ФАКТ ◔]:
:14— статичний імпорт тестових данихengines/__tests__/mockData.ts(дляwindow.mockProjectу DEV); у бойовій збірці лишається викликexplodeDetails(mockDetails, …)зmockData.ts:103— розрахунок геометрії п'яти тестових деталей на кожному старті[ФАКТ ✔ — рядокdet-5 … Det5знайдено вprobe-L3/dist/assets/main-*.js];:43initializeWorkspace(location.search),:45captureObjectId()(ERP-кнопка, [сторона ІТ]);:46registerProductKernel()і:48registerCutOutlines()— шов ядра OCCT і провайдер контурів різу реєструються завжди, і в Studio;:54якщо VS CAD і не Studio-режим — одразу CAD-режим, вкладка «замір» (лінивий чанк CAD вантажиться на старті саме в цьому режимі);:60рендер<App/>і<KernelBadge/>(плашка ядра — завжди, див. 1.5).
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 с]
- Стартовий набір: 9 чанків, 6 099 356 байт JS (≈1,89 МБ gzip):
main4,49 МБ (1,42 МБ gzip), спільнийmetalTemplates1,12 МБ (313 КБ gzip; у ньомуengines/geometry.ts,i18nStatic.ts,constructor/store.ts, 20 модулівdomain/*…),modelFromDraft196 КБ (ядро: шви тіл),occt179 КБ,useProjectStore71 КБ,occtBuilder29 КБ, ще 3 дрібних. Для порівняння,dist/у самомуvs-cad(12.10 06:15) —main4 488 541 байт, на 5,6 КБ менше. - Бібліотеки в стартовому наборі (сирцевий обсяг):
three2,40 МБ,react-dom1,05,pdfjs-dist1,03 іxlsx0,90 — обидва лише черезutils/approvalImport.ts:2–3(імпорт бланка погодження),@react-three/fiber0,66,html2canvas0,44 (BugReporterDialog.tsx:6, баг-репорт),jspdf0,34,troika-three-text0,20,three-bvh-csg0,15,three-mesh-bvh0,14,lucide-react0,10,jszip0,10. - Ліниві чанки CAD/BUILDING (вантажаться при відкритті вкладки):
DocsTab94 КБ,MeasureTab57,CombiCutTab52,PlywoodTab40,AssemblyTab34,MeasureSvg31,MetalTab26,PlanEditor26,MergeTab21,CombiCutSim20,BoqPanel8,LayoutEditor6; «3D Підбір»Viewer3D34 КБ. - Воркери: OCCT
geometry.worker798 КБ (65 модулів), розкрійpacking.worker255 КБ. Словникi18nStatic.ts(250 КБ) лежить у трьох місцях — у стартовому чанку і в обох воркерах (engines/packing.ts:3→lib/project.ts:2→i18n.ts:2; у воркер OCCT — черезkernel/exactPartInput.ts:6→engines/geometry.ts). Воркер розкрою — це здебільшого словник. - WASM OCCT 50 305 КБ (13 977 КБ gzip) — окремий файл, вантажиться лише
loadOcct()(kernel/occt/loadOcct.ts:33–36). - Сторінка стенду
stand.html(stand-*.js48 КБ) — у бойовій збірці; плашка ядра веде на неї (KernelBadge.tsx:23).
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
kernel/config.ts:15–21— ядро за замовчуванням'occt'(інакше лише?kernel=legacyабоVITE_KERNEL=legacy).IS_VS_CAD = true(:30) — константа.kernel/config.ts:40–55— бойова збірка безVITE_CAD= завжди Studio;cadEnabled()(:70–76) закриває вхід у CAD/BUILDING (логотип,?mode=cad, Стоуник), але не прибирає їхній код зі збірки.components/2d/SlabBoard.tsx:101useExactOutlines(parts, allDetails)→kernel/useExactOutlines.ts→cutOutlines.ensureExactOutlines→exactParts.ts:20requestGeometry('exactPartOutline')→ воркер OCCT →loadOcct()(WASM 50 МБ). Фільтрkernel/exactPartInput.ts:10–34пропускає до ядра лише головні парти з дугами (кути-радіуси, круглі/еліптичні вирізи, дугові ребра) — прямокутні деталі ядро не будять. Тобто перше відкриття 2D-дошки з деталлю, що має дугу, в Studio запускає ядро.store/slices/packingSlice.ts:100— кожен розкрій чекаєcutOutlineProvider().prepare(...)(для партів без дуг — швидко, без воркера). Коментар:95–99каже «Без провайдера (Studio) … все йде синхронно, рівно як було» — але провайдер реєструється вmain.tsx:48для всіх режимів, тож у Studio розкрій теж іде через ядро. Коментар застарів (для L4).components/ui/Detail3DPreview.tsx:75→kernel/useKernelAssembly.ts— 3D-прев'ю деталі в редакторі виробу теж через воркер OCCT (так задумано: «тестова Studio на OCCT»).[ГІПОТЕЗА]Раніше (до вирівнювання копій) уweb-app/main.tsxреєстрації ядра не було — за пам'яттю Лео §2.8main.tsxбув «файлом патчу, різним у копіях». Якщо, як каже бриф, сьогодніweb-app=vs-cad(крімDocsTab.tsx), то Studio-збірка теж реєструє ядро і рахує контури через OCCT. Перевірити на диску — L4/ведучий.
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]
components/3d/Viewer3D.tsx:664–1396—TexturedPart→EdgePartWrapper→AssemblyGroup(TS6133(1098,10)), 733 рядки (02.09: 726); усередині — виклик неіснуючогоuseDetailShape(:731, TS2304) і 2 умовні хуки (:804, :838).const groups:1778–1780не читається; кнопка «Групувати деталі»:1840–1843перемикає лише його.components/ui/Detail3DPreview.tsx:ProfileMesh:79–100,useDetailGeometry:3526–3530, гілка бортикаconst skirting = null:1730+ неіснуючийR3SkirtingGeometry:1844, невикористаний імпортProductElement3DNode:34.engines/packing.ts:groupedParts:543,nearbyElementReliefPlacements:1130,rotatePoint:106— не викликаються.engines/geometry.ts:1659jointNotices— лише пишеться;:1469«ОТВІР ПІД ВСТАВКУ ЗЛИВУ — ТИМЧАСОВО ВИМКНЕНИЙ (28.08)».store/useSettingsStore.ts:44, :70, :142, :279, :361—DEFAULT_ADMIN_PIN/adminPin/setAdminPin: після №263 вхід адміна — логін+пароль (shell/adminLogin.ts,AdminPinButton.tsx:5, :57), старий PIN читає лише тест.HeaderToolbar.tsx:1, :9–10;RectangleDesigner.tsx:14(console.logрівня модуля);utils/edgeProfiles.ts:62–65.- knip: 311 невикористаних експортів у 144 файлах + 115 типів у 55 (02.09: 141 у 54 + 58 у 26); tsc «оголошено, не читається» — 187 (193).
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]
- За кодами: TS6133 154 · TS2339 71 · TS18048 35 · TS2322 29 · TS6196 23 · TS7006 21 · TS2353 13 · TS2304 13 · TS2345 11 · TS6192 9 · TS2307 8 · TS2305 6 · TS2739 5 · TS1484 4 · решта по 1–2 (у т. ч. TS1117 — дубль ключа словника). «Оголошено, не читається» (6133/6196/6192/6199) — 187 (45 %).
- За папками:
components327 ·utils32 ·engines22 ·store14 ·App.tsx12 ·domain6 ·features2 ·lib2 ·i18nStatic1.constructor,kernel,stounik,workspaces,mes,shell,stand— 0. Тобто 416 із 418 — старий борг папок, що були ще 02.09 (передусім 2D/3D-редакторів), а не новий код. - За файлами:
SlabBoard.tsx70 ·Viewer3D.tsx43 ·Detail3DPreview.tsx41 ·ProductEditorWorkspace.tsx38 ·FormsPanel.tsx20 ·pdfPages.ts17 ·approvalImport.ts15 ·DxfOverview.tsx13 ·WorkspacePane.tsx13 ·App.tsx12 ·TextureLayoutPanel.tsx9 ·Detail2DBlueprint.tsx8 ·store/__tests__/textureGroups.test.ts7 — 71 файл усього. - Імена значень, яких нема (можуть впасти під час роботи):
components/ui/FormsPanel.tsx:1746—slab(виконається, якщо в проєкті нема першого сляба з матеріалом)[ФАКТ ◔];Viewer3D.tsx:731іDetail3DPreview.tsx:1844— у мертвому коді.
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 с]
- 217 файлів (216
src+ 1server), 1 877 тестів: 1 856 ✓, 2 ✗, 19 пропущено (02.09: 110 файлів, 1 203 ✓ / 1 ✗). - Червоні:
parsers/dxf/parser.test.ts:7— шляхC:/hhgh/…(той самий, що 02.09);__tests__/coreBoundary.test.ts— сторож «ядро (engines/domain/core) не імпортує UI»: порушникengines/shapeBuilder.ts:2→components/forms/utils/draftHelpers. Шапка тесту каже, що цей місток «прибрано» аудитом 03.09 — фікс втрачено (пам'ять Лео §3 називає це «відомим падінням»). Пропущені: два інтеграційні набори ядра (kernel/__tests__/profiledBase*.integration.test.ts, 19 тестів). - Сторож бачить не все: ядро OCCT теж тягне UI, але
kernel/у тест не входить — 18 імпортів зkernel/уcomponents/,constructor/,store/(12 — не лише типи):kernel/exactPartInput.ts:5(у воркер OCCT) іkernel/shopSheets.ts:39→components/*;kernel/shopSheets.ts:33–37→constructor/drawing/*;kernel/plywoodFromDraft.ts:28→constructor/store.ts;kernel/useExactOutlines.ts:17→store/useProjectStore.ts[ФАКТ ✔ — граф]. - 236 із 431 модулів без прямого тесту (02.09: 137 із 227 — частка 60 % → 55 %). Найважчі без тестів:
approvalImport.ts4 805,Detail3DPreview.tsx3 530,Viewer3D.tsx2 102,SlabBoard.tsx1 642,QuotePanel.tsx1 269,HelpDialog.tsx1 154,SlabCatalogModal.tsx1 123,ProductElement3DNode.tsx983,Detail2DBlueprint.tsx917,MeasureTab.tsx915,App.tsx875,PlywoodTab.tsx743,projectSlice.ts709. Тести з'явились уmiterAssembly.ts(02.09 — без). Покриття за папками:engines35 з 41 модулів мають прямий тест,domain43 з 48,kernel22 з 37,constructor21 з 57,components24 з 135.
8. Дві копії [ФАКТ процесу — з брифу; на диску не перевіряв]
- За брифом (звірка ведучого 12.10 вечір):
web-app/srcіvs-cad/srcмають ті самі 666 файлів тих самих розмірів, крімconstructor/docs/DocsTab.tsx. Тобто «дві копії» сьогодні — фактично одна, і Studio-збірка (web-app) містить увесь CAD, BUILDING, ядро OCCT і МЕС-папку — відрізняються лише змінні збірки (VITE_CAD,VITE_KERNEL,VITE_STUDIO_DEFAULT) і?mode=. - Розбіжність для L4: пам'ять Лео §2.8 (
01_МЕЙН/ПАМ'ЯТЬ_ЛЕО.md:42–46) каже, що «файли патчу» —src/kernel/**,src/stand/**,src/main.tsx,SlabBoard.tsx,Detail3DPreview.tsx,WorkspaceTabs.tsx,DxfExportDialog.tsx,PartShape.tsx— «різні в копіях, між копіями не копіювати». Якщо бриф правий, правило застаріло, і разом із ним — коментарstore/slices/packingSlice.ts:95«без провайдера (Studio)». - У пісочниці є й інші копії (
/tmp/final/web-app-merge— 585 файлівsrc,studio-merge— 635,vs-cad-warm— 666) — це робочі знімки попередніх сесій, не диск; їх не аудитував. - Git у знімку: тека
.gitє, але без жодного коміту (git log: «does not have any commits yet») — історії змін для порівняння немає.
Стан знахідок 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 (гіпотеза) |
не перевірено | — |
Ключові знахідки
[ФАКТ ✔]Код майже подвоївся за 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.[ФАКТ ✔]CAD і ядро OCCT частково вшиті в стартовий набір Студії. Вкладки CAD (42 файли, 10 910 р.) і план/розкладка BUILDING (950 р.) — ліниві. Але 14 файлівconstructor/(3 134 р., креслярка) і 32 файлиkernel/(6 001 р., зocctBuilder.ts1 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.[ФАКТ ◔]Ядро 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.[ФАКТ ✔]Стартовий набір — 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.[ФАКТ ✔]Тестові дані в бойовій збірці:main.tsx:14статично імпортуєengines/__tests__/mockData.ts, іexplodeDetails(mock…)(mockData.ts:103) рахується при кожному старті сторінки (знайдено вdist/assets/main-*.js).[ФАКТ ◔]Що працює без дотику: інтервал 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.[ФАКТ ✔]МЕС у застосунок не підключений: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.[ФАКТ ✔]Великі файли виросли:Detail3DPreview.tsx2 914 → 3 530 (Detail3DNode798 → 1 046 р.),ProductEditorWorkspace.tsx2 558 → 2 974 (компонент 1 990 → 2 298 р.),HelpDialog.tsx535 → 1 154,Detail2DBlueprint.tsx390 → 917,domain/joints.ts318 → 805,miterAssembly.ts242 → 672;approvalImport.ts4 805 — не змінювався. 7 функцій > 1 000 рядків, 16 > 500. §3.[ФАКТ ✔]Межа «ядро не знає 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-стор CADconstructor/store.ts. §7.[ФАКТ ✔]Мертве в живих файлах не прибрано:Viewer3D.tsx:664–1396(733 р.) з неіснуючимuseDetailShape:731;groups:1778і кнопка «Групувати деталі» без ефекту;Detail3DPreview.tsx:79, :3526, :1730/:1844;packing.ts:543, :1130, :106; мертвий стан PINuseSettingsStore.ts:44; 8 нерозв'язаних імпортів (TS2307); ті самі 6+3 зайві npm-пакети. §2.[ФАКТ ✔]Задвоєння росте разом із кодом: однойменних функцій 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.[ФАКТ ✔]Старий борг стоїть, новий код чистіший; хардкод розповзається: tsc 430 → 418, з них 416 — у папках, що були 02.09 (components327), нові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 уsrc0 → 13 (PLM/МЕС/радіо), префіксів ключів сховищ 4 → 9+, старий PIN у ключових словах довідкиstounik/topics.ts:464, прізвища клієнтів реальних кейсів уmes/data/orders.ts(5 замовлень). §4, §6.
Питання власнику
[ПИТАННЯ]Studio-збірка має працювати на ядрі OCCT (точні контури деталей із дугами на 2D-дошці, розкрій через воркер, 50 МБ при першому відкритті такого проєкту), чи це лише для VS CAD? Сьогодні один перемикач — змінна збіркиVITE_KERNEL(kernel/config.ts:15–21); за замовчуванням ядро ввімкнене всюди, а реєстрація вmain.tsx:46, :48не залежить від режиму.[ПИТАННЯ]CAD і BUILDING у бойовій Studio: вхід закритий (cadEnabled()), але код їде в збірку, а креслярка CAD і ядро — ще й у стартовий набір. Тримати так «до виокремлення CAD» (як кажеkernel/config.ts:58–69), чи виокремлювати зараз?[ПИТАННЯ]МЕС-вкладка (mes/, 3 090 рядків, не підключена; уmes/data/orders.ts— прізвища клієнтів і номери замовлень п'яти реальних кейсів) і задуманий поділ на робочі простори (shell/workspaces.ts,workspaces/*/index.tsx): підключати, переносити в окремий застосунок, чи прибирати?[ПИТАННЯ]Рішення 23.08 «мертве не чіпати, розібратись» досі чинне — дозволити видалення перевіреного мертвого (17 файлів, 1 822 р. + блоки в живих файлах ≈900 р. + 9 npm-пакетів)? Окремо — що зmockDataуmain.tsx:14(тестові дані в бою).[ПИТАННЯ]Що має бути в продакшн-Студії з «додатків»: сторінка стенду OCCT (stand.html— у бойовій збірці), шість сторонніх інтернет-радіо в Стоунику (StoneRadio.tsx:29–34), плашка ядра з інтервалом 700 мс, тексти довідки/Стоуника на старті кожної сторінки?[ПИТАННЯ]Дві межі NC300 тепер обидві в застосунку: 3000×1600 (materialRules.ts:52, підказки Стоуника) і 3100×1500 (manufacturability.ts:29, перевірки деталі). Яка правильна?
Пропозиції (не рішення)
[ПРОПОЗИЦІЯ]Розірвати п'ять містків 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).[ПРОПОЗИЦІЯ]utils/approvalImport.ts(зpdfjs-distіxlsx) іhtml2canvas— підвантажувати динамічно за дією (імпорт бланка, баг-репорт). Словникi18nStatic— не тягнути у воркери (воркеру розкрою підписи не потрібні;lib/project.ts:2→i18n.ts— єдиний місток).[ПРОПОЗИЦІЯ]ПрибратиmockDataзmain.tsx:14(або підвантажувати динамічно лише вimport.meta.env.DEV);KernelBadgeне монтувати в Studio-режимі або тікати лише покиstate === 'loading';GlProbe— патч ставити лише коли зонд увімкнений;LanguageDomTranslator— не спостерігати DOM для української.[ПРОПОЗИЦІЯ]Пакет видалень без впливу на збірку (кандидати, підтверджені 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.[ПРОПОЗИЦІЯ]Повернути фікс 03.09 дляcoreBoundary(типDetailDraft— уdomain/) і розширити сторож наkernel/(звідти 12 не-типових імпортів у UI-папки).[ПРОПОЗИЦІЯ]Сторожі від повторного наростання: knip (мертві файли/залежності) іchunks.cjs(розмір і склад стартового набору) — як тести або крок перевірки перед пушем; правило «нова геометрія — лише черезengines/geometryUtils.ts/utils/math.ts» для точки в полігоні, площі, bbox, округлень.[ПРОПОЗИЦІЯ]Великі компоненти (ProductEditorWorkspace2 298 р.,FormsPanel2 193,SlabBoard1 588,Detail3DNode1 046) — різати поступово, починаючи з умовних хуківProductEditorWorkspace.tsx:848–1098(eslintrules-of-hooks— реальний ризик зламати стан) і 70 tsc-помилокSlabBoard.[ПРОПОЗИЦІЯ]Оновити правило «файли патчу різні в копіях» у пам'яті Лео §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_ДОКИ_ПРОТИ_КОДУ.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. Стоуник, налаштування, стабільні ідентифікатори
[ФАКТ ✔]Теми Стоуника «66 + 21» (ПАМ'ЯТЬ_ЛЕО.md:101,СТОУНИК.md:12): у кодіBASE_TOPICS= 71 (stounik/topics.ts:72–593),LEO_TOPICS= 21 (stounik/leoTopics.ts:18), разом 92 (topics.ts:594). Третій прапорець видимостіcadOnly(№262,topics.ts:63, фільтрStounik.tsx:139) у СТОУНИК.md не описаний. Теми для вкладки «CombiCut» (№255) немає — є лишеdxf-export.[ФАКТ ✔]SETTINGS_VERSION 7 і ключslabcutplanner-settings-storage—store/useSettingsStore.ts:38,335✔; міграція v7 («лише злиття, прибирає старі загальні коди радіусних») — уmigrateтого ж файла ✔.[ФАКТ ✔]Стабільніdata-stounikзі спискуСТОУНИК.md:17— усі 25 на місці:tab:2d(components/WorkspaceTabs.tsx:131),tab:texture(:147),tab:quote(:225),btn:popup(:292),btn:add-slab(components/ui/FormsPanel.tsx:1554),btn:add-product(:1588),btn:add-sink(components/ui/ProductEditorWorkspace.tsx:2797),panel:<секція>(:160),btn:studio-home(App.tsx:343),btn:project-title(:366),btn:undo(:418),btn:new-project(:445),btn:save-menu(:456),btn:open-menu(:487),btn:export-menu(:549),btn:edge-catalog(:615),btn:language(:635),btn:login(:673, :688),btn:expert(components/ui/HeaderToolbar.tsx:31),btn:settings(:65),btn:help(:78),btn:service(:87),btn:bug(:102),btn:admin-pin(components/ui/AdminPinButton.tsx:79),kernel:badge(kernel/KernelBadge.tsx:24). Усі цілі підсвічування в темах (target:і третій аргументV(…)) існують. Недокументовані ідентифікатори:settings-sync:<ключ>(components/ui/SettingsSyncBar.tsx:43) і дев'ятьstounik:*(Stounik.tsx:154–230,StounikWelcome.tsx:86,118,StoneRadio.tsx:175).
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. Ключові знахідки
- [ФАКТ ✔] Студія з 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.8 «файли патчу різні в копіях, між копіями не копіювати» — неправда. Копії однакові, крім
constructor/docs/DocsTab.tsx, а саме його в переліку §2.8 немає (хоча журнал №261 називає його точкою підміни). §6 того ж файла каже «web-app = vs-cad». Агент, який іде за §2.8, може не перенести правку в другу копію або «полагодити» Studio, прибравши з неї ядро (ПАМ'ЯТЬ_ЛЕО.md:41–46,ЖУРНАЛ…:10394–10396). - [ФАКТ ✔] У живих доках 17 різних кількостей тестів, і жодна не збігається з фактом. Факт: 1856 ✓ / 2 відомі падіння / 19 пропущено (у
src— 1841 ✓); тестів ядра 194 у 30 файлах. Найсвіжіше число в ПАМ'ЯТЬ_ЛЕО — 1719, у Джованні — 1751 і 74. 19 тестів, що вмикаються лише змінноюCAD_PROFILED_BASE_NATIVE, не описані. tsc 418 збігається в ПАМ'ЯТЬ і в Джованні, а в MANIFEST, ПЛАН і стартері лишилися 430 / 424. - [ФАКТ ✔] Стоуник: у довіднику 71 тема, а не 66 (
stounik/topics.ts:72–593). ПрапорецьcadOnlyне описаний. Усі 25 стабільнихdata-stounikна місці. Тема «Кнопки й пуш» (stounik/leoTopics.ts:146) і ПАМ'ЯТЬ §3 досі вчать пушити скриптами 05.10, які №261 заборонив. Для вкладки CombiCut теми немає. - [ФАКТ ✔] Вхід адміна змінився (№263: логін і пароль), а доки все ще кажуть «PIN». Це ПАМ'ЯТЬ §4/§5, СПІЛЬНІ_НАЛАШТУВАННЯ, АРХІТЕКТУРА, РЕЄСТР SC-05, коментар
SettingsSyncBar.tsx:5–6. Константа PIN лишилась уstore/useSettingsStore.ts:44, але як замок нічим не використовується. Окремо: СПІЛЬНІ_НАЛАШТУВАННЯ пише «на сервер не їдуть гроші», аstore/settingsSync.ts:65відправляє весь прайс-бук разом із калібрувальними цінами. - [ФАКТ ✔] Слова «Потовщення/Підворот» досі переплутані, і з'явилось нове місце. Бланк погодження підписує
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 того ж файла. - [ФАКТ ✔] 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). - [ФАКТ ✔] Мертві скелети, які доки подають як робочі або «відкочені». Це
shell/workspaces.ts,shell/useCan.ts,workspaces/{vs3d,constructor,architecture}/index.tsx, вкладка МЕС (mes/MesTab.tsx,mes/render.ts),kernel/useKernelGeometry.ts. Імпортерів у них 0; knip лінзи L3 показує те саме. - [ФАКТ ✔] Персональні дані клієнтів у коді, який іде в репозиторій. У
mes/data/orders.ts5 полівcustomerз прізвищами поруч із номерами замовлень. Це суперечить правилу ПАМ'ЯТЬ §2.3 / Джованні №9. Значення не цитую. - [ФАКТ ✔] Вхідні точки документації розірвані. Стартер і карта Джованні ведуть у теку
16_ДЖОВАННІ\, а вона зветься16_ДЖОВАННІ_CAD. КАРТА_ПАПОК не знає09_АУДИТ_02-09,12_…,16_…. README не знає ПАМ'ЯТЬ_ЛЕО. ПАМ'ЯТЬ §9 відсилає «за правилами повністю» до СТАРТ §0.1 зі станом на 23.08–01.09. - [ФАКТ ✔] Більшість знахідок L4 від 02.09 досі відкриті. Це дзеркалення «три умови» проти двох (
packing.ts:466–471), дубльtextureGroupKey, тест-сторож боргу №2, три чужі описи в КАРТА, таблиця дублів MANIFEST §3, «11 правил» (насправді 14), «≈1670» (насправді 1823), факти проточок,translate. Закрито: пріоритет ціни, «Комерційна пропозиція», БІЗНЕС §2.2, тестиmiterAssembly, лупа,mirrorL. - [ФАКТ ✔] Карта «що на ядрі, що легасі» в ПАМ'ЯТЬ_ЛЕО §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. Питання власнику
- Яка копія
constructor/docs/DocsTab.tsxправильна, і чи живе ще поняття «патч»? Копіїweb-appіvs-cadсьогодні однакові, а кнопкиСТВОРИТИ_VS_CAD.batі текаvs-cad-patchописані як робочий механізм у ПАМ'ЯТЬ §2.8, ДЛЯ_ВАНІ і в доках Джованні. Не вирішую сам, бо це процес зведення (інв. 2.56). - Де надалі живе опис архітектури? Варіанти: оновити АРХІТЕКТУРА/MANIFEST/КАРТА під ядро OCCT, або позначити їх «знімок до 30.09» і лишити ПАМ'ЯТЬ_ЛЕО єдиним живим описом.
- Що робити з прізвищами клієнтів у
mes/data/orders.ts? Знеособити, чи не везти мертвий модуль МЕС у GitLab узагалі? - CombiCut: чи правильно, що сторони з легасі-галочкою
thickening(= Підворот) іде під 45°? Можливо, це навмисно, бо в старих проєктах ця галочка означала «потовщення», а можливо — помилка. - FG-12 «замки сторін», №23 «увігнутий кут», П-16 — чи прийняті кліком? Якщо так, їх можна закрити в РЕЄСТР/MANIFEST однією ревізією разом із рештою розділу 3.1.
- Числа гейтів і тем Стоуника — тримати в одному місці (ПАМ'ЯТЬ §3) і в інших доках лише посилатися? Сюди ж питання, чи оновлювати тему «Кнопки й пуш» у Стоунику з §6, а не з §3.
- Б-Д7: повернути
translate="no"вindex.html? Це один рядок, питання повторюється з 02.09. - Код Бруно з англійськими коментарями (
kernel/previewScheduler.ts,features/*) — допустимо, чи правило «українською» поширюється й на нього?
10. Пропозиції (не рішення)
[ПРОПОЗИЦІЯ]Банер на дев'яти застарілих доках (розділ 6): «знімок <дата>, до OCCT; актуальне — ПАМ'ЯТЬ_ЛЕО §4–7». Це дешевше за переписування і прибирає пастки для нового агента.[ПРОПОЗИЦІЯ]Генерований інвентар замість трьох ручних дерев (КАРТА_МОДУЛІВ, АРХІТЕКТУРА §2, карта Джованні §2): скрипт із шапок файлів плюс позначка «0 імпортерів» з knip. Скрипт порівняння з деревом 02.09 уже лежить у пісочниці лінзи (додаток).[ПРОПОЗИЦІЯ]Один рядок «гейт» з датою в ПАМ'ЯТЬ_ЛЕО §3, з окремим рядком про пропущені тести (19,CAD_PROFILED_BASE_NATIVE=1). Інші доки лише посилаються на нього.[ПРОПОЗИЦІЯ]Переписати §2.8: «копії однакові; різниця — заголовок, порт, назва пакета; перед і після зведення — побайтне порівнянняsrc/». У §2.5 замінити «№241» на «див. §6».[ПРОПОЗИЦІЯ]Словник термінів у MANIFEST §0: fold/thickening, документ цеху, назва продукту і режимів, «прод» (три розгортання), написання верстата. Плюс сторож-тест «уutils/exportіengines/combicutнема літералів Потовщення/Підворот».[ПРОПОЗИЦІЯ]Стоуник: сторож «кількість тем = число в СТОУНИК.md», тема про CombiCut, тема «Кнопки й пуш» — з ПАМ'ЯТЬ §6.[ПРОПОЗИЦІЯ]Одна ревізія реєстрів (РЕЄСТР_БАГІВ, BUGS_AND_TECH_DEBT, MANIFEST §4) за розділом 3: 17 позицій закрити або переформулювати, і переписатиfireplaceEndToEnd.test.ts:230на суми (як просить сам тест).[ПРОПОЗИЦІЯ]Мертві скелети (shell/workspaces,useCan,workspaces/*/index.tsx,mes/*,useKernelGeometry,SafeEnvironment): або шапка «не підключено станом на 12.10», або рішення про видалення через_ВИДАЛЕНЕ.
Додаток: що запускалось
- Читав повністю або розділами: бриф;
09_АУДИТ_02-09/L4…(§0–6) і00_ЗВІТ…(§1, §7, §11);01_МЕЙН/: ПАМ'ЯТЬ_ЛЕО, 00_СТАРТЕР_ДА_ВІНЧІ, СТОУНИК, СПІЛЬНІ_НАЛАШТУВАННЯ, НЕСТИНГ, ДЛЯ_ВАНІ, ORDER_REGISTRY_15-09, STUDIO_REGISTRY_IDENTITY_FIX; розділами — АРХІТЕКТУРА (§0–2.9), MANIFEST (§1–2.7, 2.49–§6), БІЗНЕС (§0–2.3, §9), ПЛАН_І_СТАН (стан 01.09/23.08), СТАРТ (§0–6, §9, §12), ДЛЯ_НАСТУПНОГО (А-0–А-3), КАРТА_МОДУЛІВ (шапка + grep), КАРТА_ПАПОК (структура), README (шапка), ОДНА_МАТЕМАТИКА (§1–2), ЩО_ВИНОСИМО, БОРГ_ДОВІДНИКИ (шапка);16_ДЖОВАННІ_CAD/(стартер, карта, правила цеху, grep решти);10_…/(ПЛАН_VS_CAD §1–3, СТАРТЕР_КОНСТРУКТОР);14_…/(ЗАДАЧІ, карта — grep);03_КРОМКИ/ЛОГІКА_ОБРОБОК§5;02_БАГИ_І_БОРГИ/(BUGS — Critical і Б-Д*, РЕЄСТР — таблиці статусів, ЗАМІРИ_12-10, журнал №261, №278 — grep);12_…/(grep шляхів). - Команди (лише читання, без замка — легкі):
find/wc -lпоsrc/(обсяги, розміри, теки);grep -rnпо коду для кожного рядка таблиць; підрахунок тем Стоуника (awkпоtopics.ts:72–593,leoTopics.ts);grep -o 'data-stounik="…"'; підсумок тестів за файлами зgates/vitest.txt; розкладgates/tsc.txtза кодами помилок; перевірка наявності шляхів, згаданих у 26 доках (циклgrep -oE '\….(ts|tsx|css|js)`'→find`); класифікація 208 нових модулів (живі доки / журнал / ніде). - Скрипти в пісочниці сесії (
/tmp/claude-0/…/scratchpad/):tree0209.mjs— список файлів із04_ДЕРЕВО_КОДУ_02-09.md→commз сьогоднішнімsrc/(+326 / −3);cls.txt,live_where.txt— де згадано кожен новий модуль. - Чужі виходи (лише читав):
gates/tsc.txt,gates/vitest.txt(ведучий);L3_knip_compact.out(лінза L3) — для підтвердження мертвих файлів. - Чого НЕ запускав: жодного vitest/tsc/build/dev-сервера (повні гейти — у ведучого); зондів у копії не робив (теки
probe-L4нема);.gitуvs-cad(порожній, без комітів) не чіпав. - Не перевірено: копію
web-app(у пісочниці її немає — розбіжністьDocsTab.tsxприйнята з брифу, вміст не бачив);vs-cad-patch,README_VS_CAD.md,Кнопки\*(поза знімком — назви кнопок «?»);public/help/*іapple-touch-icon.png(у знімку відсутні, код на них посилається — чи є на диску, невідомо);server/і все [сторона ІТ]; поведінку кліком (FG-12, SC-35, CombiCut на легасі-thickening—[ГІПОТЕЗА]);06_ОБУЧАЛОЧКА/ПРАВИЛА_*,04_ВІЗІЯ_*,ЖУРНАЛ_АГЕНТІВ; стан боргу №1 (приписування вирізів Г-сегменту) — територія L2.
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. Головне за дванадцять рядків
[ФАКТ ✔]За 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 рядки. Майже весь код — одна лінія (Мікеланджело → Да Вінчі → Лео); Бруно — пакетами через рев'ю; ІТ — через чотири зведення.[ФАКТ ✔]12 знахідок 02.09: закрито 4 (2, 3, 8 — кодом; 1 — рішенням власника), змінилось/частково 2 (5, 12), відкрито 6 (4, 6, 7, 9, 10, 11). 10 пропозицій: зроблено 1, майже 1, частково 4, не зроблено 4.[ФАКТ ✔]54 питання 02.09 (у файлі їх 54, у журналі №85 і HTML написано «46»): відповідь/зроблено — 13, частково — 8, без відповіді — 29, не перевірено — 4.[ФАКТ ✔]«Втрата 22–23.08» у коді не повторилась: робоча копія містить усе, що є в знімку MR !8 (0 файлів лише в знімку; 285 «зниклих» рядків — це рядки, переписані №270–№278; позаsrc/— лише 2 рядки коментаря вserver/src/settings.js). Але 44 файли (+4 358 / −285 рядків) — лише на диску і чекають наступного пушу.[ФАКТ ✔]Знімок «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 тижнів зафіксовано щонайменше 5 майже-втрат того самого класу, що 22–23.08 — усі спіймані звірками (№226, №233, №244, №261 двічі). Механізм ризику живий, запобіжник теж.[ФАКТ ✔]«Дві копії» на диску (web-app=vs-cad, крім назви/порту/1 файла) — тепер це одна програма у двох теках: кожна правка №260–№278 робилась «в обидві копії»; правило ПАМ'ЯТЬ §2.8 про «різні файли патчу» застаріло з №261.[ФАКТ ✔]Сторож межі ядраcoreBoundary.test.tsчервоний 5+ тижнів через один рядокengines/shapeBuilder.ts:2, який №96 прибрав, а відкат №96 повернув; записи журналу з 06.09 щоразу пишуть «+2 відомі старі».[ФАКТ ◔]Рішення власника з 02.09 (≈35) живуть у журналі й ПАМ'ЯТЬ_ЛЕО §5; MANIFEST заморожений на 2.60 (01.09), а 2.54 тепер суперечить коду; живі доки (README, ПЛАН_І_СТАН, СТАРТ_НАСТУПНОЇ_СЕСІЇ, ДЛЯ_НАСТУПНОГО_АГЕНТА, КАРТА_МОДУЛІВ) — без жодної дати після 01.09; реєстри боргів — 19.08/24.08; §11 аудиту — до 05.10.[ФАКТ ◔]Шість рішень переграні протягом тижнів (КП при різній товщині; PIN → логін; кромка на зайнятій стороні; VS CAD окремо → Studio на OCCT; «worker після презентації» → того ж дня; оболонка №96 → відкат → мовчки в коді).[ФАКТ ◔]Клієнтський бланк погодження досі підписує Підворот як «Потовщення» (utils/export/quotePdf.ts:477,:508) — питання З-1 від 02.09 без відповіді.[ФАКТ ✔]Лінії помічників майже не працювали: Ботічеллі — одна задача (Б-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: відповіді на аудит і «пасхалки» [ФАКТ ◔ журнал]
- Гроші (№86, 03.09): ручна ціна лише в режимі калібрування; «Комерційна пропозиція» (
engines/pricing.ts, діалог, слайс) видалена. Лупа видалена (№87). Кнопки-.batдля того, що агент не може (№88). - Геометрія: дзеркало Г наскрізь —
mirrorLдоїжджає в розкрій (№89); «один ніж» — стара математика стиків Г і П (≈270 рядків) видалена, кутовий стик став довільним (№90); довільний контур ріжеться стиками (№94); виріз на стику — виїмка на обох шматках (№95). - Оболонка дочок (
shell/*, карта прав,coreBoundary.test.ts) — №96, того ж вечора відкочена «без згоди власника» (№96-відкат). Сьогодніshell/*і тест у коді є, а запису про повторне застосування в журналі нема[ФАКТ ✔ ls + grep]. - Нове: «пасхалка» Viyar Stone Studio — стартова лінійки продуктів (№97–№98); замки на розмірах (№100–№101); Конструктор v1 (замір, метал, фанера, зведення, документи — №102), тех-карта (№103), машина креслень (№104); MES v0 як вкладка «Цех» → власник: «MES — окрема система» → відкат (№107–№108); Лабораторія як окремий застосунок з публічною збіркою
/lab/(№109–№114); Архітектор (BUILDING) v1 (№115, №117–№118); набір креслень цеху (№119–№120).
1.2. 07–13.09: редактор деталі, стики, МЕС-пакет [ФАКТ ◔ журнал]
- Ботічеллі Б-002 — ребра Г-зарізу стали сторонами; прийнято як №127. Заведено лінію Ботічеллі і «Да Вінчі» (07.09).
- Набір креслень і вибухові схеми (№121–№125); «Замір» під 3D-DXF (№126, №129–№130); перейменування лінійки: Studio / CAD / BUILDING (№132).
- Вікно деталі з п'ятьма секціями, стик з креслення, стик із парою сторін і полем (№134–№145; опис у §11 аудиту 08.09); тулбар 3D, WebGL Context Lost (№146–№149, Б-153).
- 08–09.09 (№150–№172, без дат у заголовках): меню сторін, вирізи повністю в панелі, поворот вирізів, Antolini, одне світло на програму (№166), пароль Studio прибраний — вхід подвійним кліком (№165), втоплені доповнення (Б-168…Б-170), «кромка диктує примикання» (№172).
- 10.09 — МЕС: «У чергу МЕС», «Зберегти для МЕС» (пакет
vs3d-pack-1), GLB з ID, пакет за ТЗ Бруно (№173–№179). 11.09 — бібліотека інструкцій (№181–№183), «Приміщення» під щиток (№184).
1.3. 14–27.09: тихі два тижні Studio
- №185 (16.09) — плитки «Виробництво (MES)» і «Лабораторія» прибрані «і з коду» (
components/studio/StudioHome.tsx:222–226— надгробок-коментар)[ФАКТ ◔]. - №186 (18.09) і №187 (23.09) — зведення з main ІТ (внутрішній рахунок; гроші в копійках, статус
INV_PENDING). - Бруно, 15.09 — реєстр замовлень на сервері Ocean (SQLite) і зв'язка Studio/BUILDING → PLM (
features/order-registry/*,features/server-project/*;ORDER_REGISTRY_15-09.md)[ФАКТ ◔]. - 24.09 — самоаудит Studio (
АУДИТ_СТУДІЇ_24-09.md), 25.09 — діагноз стиків/П/овалу; №188 — кабінет зберігає по-справжньому; №189 — «одна математика деталі», кроки 1–5 (овал під кран, різак 45° клином, фантомні смуги, П-стики, один контур Г/П).
1.4. 28.09–04.10: геометрія закрита, VS CAD на OCCT, верстати, конструктор
- 28.09 (№190–№196): «одна математика» — геометрія закрита (7 → 2 точки розходження): дефолти П одні (
domain/baseContour.ts:35), прямокутник через спільний будівник,buildComplexRectPoints(233 рядки) видалено; імпорт DXF і бланка — під щиток (components/ui/FormsPanel.tsx:1600–1607). - 29.09 (№197–№200): підворот — горизонтальна смуга під плитою; вус підворот↔потовщення без кромки; внутрішній ус на увігнутих кутах.
- 30.09 (№201–№209): рішення власника — VS CAD на ядрі OCCT окремою копією; сім'ї 1–4 (плита; доповнення і стики; торці й площина; гнуті смуги, мийка-складання, метал, камін, каркаси); 2D-розкрій точними дугами; «Експорт DXF» + знайдено подвійний припуск.
- 01–03.10 (№210–№225): синхронізація Studio з рушіями VS CAD; правки фокус-групи; П-2/П-4/П-7; DXF R12 за рецензією Бруно (Загальний / Combicut / NC300), супровідні PDF; коди 1С за матеріалом (+17 послуг); рулетки вирізу; вкладки «Метал», «Збірка 3D», стики металу, 3D-будівник «Фанера»/«Метал»; «Замір» покроково. GitLab-скрипти v2…v11 (01–03.10).
1.5. 05–11.10: Studio на ядрі, Стоуник, Підбір/нестинг/креслення з ядра, CombiCut
- 05.10: зведення з main ІТ 05.10 тристоронньо (№226); тестова Studio на OCCT
?mode=studio(№227); прод-збіркаvs-cad= Studio на OCCT (№228); скрипти 05.10 — так і не запушені. - 06.10: стики ріжуть плиту на частини в ядрі (№232); патч синхронізовано, заведено Джованні (№233). 07.10: коло й овал точною кривою (№234); Стоуник — помічник, 66 тем, знайомство, радіо (№235–№237, №240); бланк — обидві половинки стику (№238); мобільний прохід (№239).
- 08.10: спільні налаштування на сервері (№241); 3D Підбір на ядрі (№242); знання Лео в Стоунику (№243); адаптери Бруно для MES (№244). 09.10: Ocean LIVE (№245); нестинг на точних контурах (№246); старий припуск на дугах (№247); Стоуник «Запитати ШІ» (Gemini, функція Бруно, №248); креслення бланка й дошки з ядра (№249); метраж кромки — один закон (№250); бандажі в Підборі з ядра (№251); фанера шарами + інструменти (№252–№254).
- 10–11.10: CombiCut — окремий робочий стіл (№255), 3D-симуляція (№257); фанера й метал більше не на слябах (№256); тисячі пробілом (№258).
1.6. 12.10: MR !8 і швидкість
- №259 CombiCut (диск стоп на внутрішніх кутах, «Черговість»); №260 Підбір без синього.
- №261 — зведення з main ІТ 12.10, одразу Studio на OCCT, один скрипт → гілка
merge/zvedennia-12-10(MR !8);web-appна диску =vs-cad. №262 — прод GitLab лише Studio (kernel/config.ts:70cadEnabled(); сторожshell/__tests__/studioOnly.test.ts). №263 — вхід супер-адміна логіном і паролем (shell/adminLogin.ts, лише сіль і відбиток). №264 — налаштування послуг на сервері ІТ (3 серверні файли у вигрузці + інструкція ІТ). №265 PLM-меню; №266 кейс у JSON. - Після MR !8 (лише на диску): №267 КП при різній товщині — попередження; №268 текстури через проксі (CORS на проді); №269–№270 «Зведення»: панелі й редактор панелей; №271–№278 швидкість: перебудова ядра після паузи 300 мс, одна текстура, без течії геометрій, подвійне віднімання в OCCT, кромка на дузі обертанням (вимкнено → увімкнено з перевіркою), Стоуник-завантаження в Підборі, кеш складання, worker і кеш плити з кромками — код Бруно (№275, №277, №278). Заміри «до/після» (
ЗАМІРИ_12-10): редактор кухні 37,1 → 1,3 с, Підбір 28,2 → 4,2 с, зсув мийки 8,6 → 0,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 зняло разом із пакетом, але не окремим словом [ФАКТ ◔]:
- запас на гнуті при відкритті проєкту — 30 % замість 20 % для акрилу:
store/projectHelpers.ts:115викликаєexplodeDetailsбез матеріалу (порівняйstore/slices/packingSlice.ts:91);loadWithoutPackingживий (store/slices/projectSlice.ts:122, 565, 589); - PDF групує текстуру по-старому:
utils/export/pdfGeometry.ts:196, 222; console.logмодуля —components/forms/shapes/RectangleDesigner.tsx:14; 8 фантомних імпортів (TS2307:LDesigner,RectangleDesigner,CornerContextMenu,CornerProcessingModal,CutoutProcessingModal,JointContextMenu,LegModal,SkirtingModal);translate="no"уindex.html— нема (З-8); DXF-тест зC:/hhgh— червоний (ворота);- доки досі кажуть «
.vs3dробоче» (01_МЕЙН/ДЛЯ_НАСТУПНОГО_АГЕНТА.md:40), «лупа працює» (СТАРТ_НАСТУПНОЇ_СЕСІЇ.md:577); Стоуник радить «збережи файл проєкту (.vs3d)» (stounik/saveState.ts:29), а файл зберігається.json(App.tsx:165).
Блоки §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 [ФАКТ ◔ журнал + ФАКТ ✔ пісочниця]
- Диск:
web-app(Studio) іvs-cad— однаковий код, крім назви/порту/DocsTab.tsx(факт брифу); щеvs-cad-patch(останній синк — №233, 06.10). - GitLab:
mainІТ (наше — до №225, гілка 01–03.10) і MR !8merge/zvedennia-12-10(№226–№266, Studio на OCCT; заЗАМІРИ_12-10— «те, що зараз на проді»). - Vercel Бруно (
mes-1-seven, зVITE_CAD=1) — збирається з його знімків нашого диска плюс його власні зміни:CombiCutDelivery, CRM-кнопка,BASE_URLфото.CombiCutDeliveryу нашому коді — 0 збігів[ФАКТ ✔ grep]. Ocean — статична копія, стара. - Пісочниця:
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 |
- №267, №268, №269 у знімку вже є (див. §0 п.5):
QuotePanel.tsx:562;utils/siteSlabTexture.ts:45іcomponents/2d/board/useSiteSlabTextures.ts:22;constructor/geometry.ts:22,MergeTab.tsx:154, 182, 243. SHA цих файлів не збігаються з маніфестом 12.10 (QuotePanel,i18nStatic,stounik/topics)[ФАКТ ✔ sha_vs_manifest.py].[ГІПОТЕЗА]у пісочниціstudio-mergeвели як «копію web-app» до №269, а з №270 заморозили як «ДО» для замірів; тоді «ДО» вЗАМІРИ_12-10— не зовсім прод. - Усі 285 рядків «лише в MR !8» у змінених файлах — це рядки, переписані тими самими №270–№278 (переглянуто кожен блок: напр.
attachContextLossRecoveryуViewer3D.tsx:1963став викликом зі зворотними викликами №274;exactPartsпереїхав уexactPartsCore) — втрати функціоналу не бачу[ФАКТ ◔]. - 16 із 21 нового файлу з пакетів Бруно (№275, №277, №278) не мають у шапці ні номера, ні автора (у файлах Лео — «№27x»; у решті 5 — лише перенесений текст Лео або його правка)
[ФАКТ ✔ grep]: походження знає лише журнал.
6.4. Що є в MR !8 і нема в робочій копії
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].- Коментар у
server/src/settings.js(2 рядки) — є в web-app/MR, нема уvs-cad[ФАКТ ✔]. - Більше нічого в
src/[ФАКТ ✔].
6.5. Майже-втрати за 6 тижнів (усі спіймані) [ФАКТ ◔ журнал]
- №96-відкат (03.09): відкат 13 файлів до №95 повернув місток
shapeBuilder → draftHelpers, а оболонка з тестом потім повернулась без нього — сторожcoreBoundaryчервоний відтоді (engines/shapeBuilder.ts:2; ворота). Це єдина «маленька втрата», що дожила до сьогодні. - №226 (05.10): скрипт v11 від 01–03.10 «затер би» роботу ІТ після 23.09 у 10 файлах — спіймано тристороннім порівнянням.
- №233 (06.10): патч VS CAD відстав на №227–№232 — кнопка
СТВОРИТИ_VS_CAD.batвідкотила б ядро до 02.10. - №244 (08.10): адаптери Бруно жили лише на Vercel — «наступна збірка з оригіналу їх би загубила»; перенесено.
- №261 (12.10): вибір бази «за іменем папки» підсунув бекап після №235 і «з'їв» Стоуника — виправлено; там само знайдено, що скрипт Studio 05.10 після 10.10 не зібрався б (CombiCut імпортує ядро) — «не пушили, не помітили».
6.6. «Дві копії» web-app = vs-cad: що це означає для процесу
[ФАКТ ◔]З №261 обидві теки — одна програма (Studio на OCCT + CAD підVITE_CAD). Кожен запис №260–№278 закінчується «обидві копії» — кожна правка робиться двічі руками.[ФАКТ ✔]Дрейф уже є: на диску різнитьсяconstructor/docs/DocsTab.tsx(бриф), у пісочниці — коментарserver/src/settings.js; у журналі після №261 жодного запису проDocsTab— причина розбіжності не записана[ПИТАННЯ].[ФАКТ ◔]Правило ПАМ'ЯТЬ_ЛЕО §2.8 («файли патчуsrc/kernel/**,main.tsx,SlabBoard… різні в копіях — між копіями не копіювати») після №261 описує стан, якого нема; наступний агент за ним «не скопіює» ядро.[ГІПОТЕЗА]Наступне зведення з ІТ піде з однієї теки; друга стане ще одним кандидатом на «не ту базу» — рівно той клас, що 26.08 і 12.10 (№261).
7. Процесні спостереження (не пропозиції)
- Журнал — справжнє джерело правди. 196 записів за 40 днів, майже всі з «запит власника → корінь → зроблено → перевірка (tsc/vitest/build) → бекап → обидві копії». Пропуски нумерації: №159, №167–№170 (замість них «Б-159», «Б-168…170» — префікс «Б-» водночас означає записи Ботічеллі); №150–№172 — без дат у заголовках
[ФАКТ ✔]. - Відкрите більше не живе в реєстрах. Шапка журналу каже «BUGS_AND_TECH_DEBT → що болить ЗАРАЗ», але
BUGS_AND_TECH_DEBT.md— стан 19.08,РЕЄСТР_БАГІВ.md— «Оновлено 24.08»; відкрите тепер — у ПАМ'ЯТЬ_ЛЕО §7 і в рядках «Не зроблено / далі» записів[ФАКТ ✔]. - Рішення не стають інваріантами. MANIFEST: «Оновлено 01.09», останній інваріант 2.60; після 02.09 змінено лише 2.7 (29.09). 2.54 («підворот — вус на керамограніті», «увігнуті кути не чіпаються») суперечить
miterAssembly.ts:31–34і №199. Рішення власника тепер — у ПАМ'ЯТЬ_ЛЕО §5 (≈15 пунктів) і в тексті записів[ФАКТ ✔]. - Аудит 02.09 як живий документ працював до 05.10. Блоки §11 — 07.09…05.10; №227–№278 (Підбір/нестинг/креслення з ядра, CombiCut, налаштування на сервері, прод лише Studio, швидкість) не описані; блок під знахідкою 3 застарів того ж дня
[ФАКТ ✔]. - Бекапи — систематично:
_БЕКАПИ\<дата>_<назва>_до_правок\{web-app,vs-cad}перед кожною правкою (у пісочниціbk/— 9 тек для №270–№278); на пристрої нічого не видаляється — лише_ВИДАЛЕНЕ\<дата>[ФАКТ ◔]. - Пуш — кнопкою власника, і скрипт став розумнішим:
.bat(06–08.09) → консольні скрипти v2…v11 (01–03.10) → два скрипти 05.10 (не запушені, замінені) → один скрипт 12.10 зі звіркою хешівmain,SERVER_ALLOW, СТОП при дрейфі, маніфестом SHA. Тристороння звірка робиться при кожному описаному в журналі зведенні з ІТ (№186, №226, №228, №261), але після злиття «робоча тека = результат файл у файл» звіряє не скрипт, а людина (сьогодні — ведучий аудиту)[ФАКТ ◔]. - Червоне стало фоном. «+2 відомі старі» у кожному записі з 06.09; пропозицію 24.09 «один рядок — і
coreBoundaryпозеленіє» не виконано; будь-який третій червоний ховатиметься в «відомих»[ФАКТ ✔ ворота]. - Мертвий код і далі правлять:
TexturedPart(мертвий ланцюгViewer3D) — №260;shell/capabilities.ts(0 робочих імпортерів) — №262[ФАКТ ✔]. - Чужий код заходить через рев'ю за хешами (Б-002, пакети Бруно №244/№248/№275/№277/№278, зведення ІТ) — з упійманими конфліктами політик (
?arcsу worker Бруно, №277). Підпис у файлах — лише в коді Лео. - Агентська «майстерня» звелась до однієї лінії. Ботічеллі — 1 задача; у
ЗАДАЧІ_БОТІЧЕЛЛІБ-002 «здано (чекає кліку)», уЗАЙНЯТІ_ФАЙЛИ— «прийнято №127» (статуси розійшлись); Джованні — 0 сесій; ЖУРНАЛ_АГЕНТІВ — останній запис Лео 06.10, у Бруно розділу нема[ФАКТ ✔]. - Рішення переграються швидко і чесно записуються (§5: №15, №16, №21, №32), але в «правилах» (MANIFEST, БІЗНЕС_ЛОГІКА) лишається перша версія.
- Числа в самому аудиті 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) |
— |
Ключові знахідки
[ФАКТ ✔]44 файли (+4 358 / −285 рядків, №270–№278; плюс за доками №267–№269) — лише на диску, не в GitLab; серед них ядро у фоновому потоці і два кеші (код Бруно); 61 % нових рядків — тести. —probe-L5/tree_diff.sh, §6.2–6.3.[ФАКТ ✔]Знімок «MR !8» уже містить №267–№269 — розходиться з журналом/ПАМ'ЯТЬ («№267–№274 у MR !8 нема»). —components/ui/QuotePanel.tsx:562,utils/siteSlabTexture.ts:45,constructor/geometry.ts:22.[ФАКТ ✔]Втрати з MR !8 у робочій копії нема, крім 2 рядків коментаряserver/src/settings.js; сервернийindex.jsІТ з маршрутами налаштувань живе лише в скрипті/MR, а на диску лежить старий (554 рядки різниці). — §6.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 у тесті й доках.[ФАКТ ✔]29 із 54 питань 02.09 без відповіді, код по них такий, як був. — §4.[ФАКТ ◔]Бланк погодження підписує Підворот «Потовщенням» (клієнтський документ). —utils/export/quotePdf.ts:477, 508(порівняйdomain/ids.tsEDGE_KIND_LABEL).[ФАКТ ◔]Хвіст 23.08 у грошах/розкрої: після відкриття проєкту запас на гнутий акрил — 30 % замість 20 %. —store/projectHelpers.ts:115vsstore/slices/packingSlice.ts:91.[ФАКТ ✔]Сторож межі ядра червоний 5+ тижнів через рядок, який повернув відкат №96. —engines/shapeBuilder.ts:2;__tests__/coreBoundary.test.ts:69.[ФАКТ ✔]Карта прав не підключена, хоча її двічі правили (№96, №262):can()— 0 викликів,isAdminUnlockedчитають 13 екранних файлів (24.09 — 11). Старе поле PIN лишилось у сторі без читачів. —shell/capabilities.ts,store/useSettingsStore.ts:44.[ФАКТ ◔]«Дві копії» на диску — одна програма у двох теках; дрейф уже почався (DocsTab.tsx, коментарsettings.js); правило ПАМ'ЯТЬ §2.8 застаріло. — §6.6.[ФАКТ ✔]Рішення власника (≈35) не дійшли до MANIFEST (2.60 від 01.09; 2.54 суперечитьengines/miterAssembly.ts:31–34); живі доки без дат після 01.09; реєстри боргів — 19.08/24.08. — §7.[ФАКТ ✔]Майстерня — одна лінія: Ботічеллі 1 задача, Джованні 0 сесій, ЖУРНАЛ_АГЕНТІВ після 06.10 мовчить; код Бруно в файлах без підпису. — §1.7, §7.
Питання власнику
[ПИТАННЯ]Пакет №267–№278 (44+ файли, ядро у фоновому потоці, кеші Бруно) — коли і як іде в GitLab: окремою гілкою поверх MR !8 до того, як ІТ зіллють MR !8 і підуть далі? Від відповіді залежить, чи не повториться 22–23.08.[ПИТАННЯ]Друга текаweb-app— лишаємо дзеркалом (і подвоюємо кожну правку) чи працюємо в однійvs-cad(прод-Studio вже збирається з неї прапорцем)? І яка з двох версійDocsTab.tsxправильна?[ПИТАННЯ]Хвости 02.09, що бачить клієнт або цех: «Потовщення» замість «Підворот» у бланку; запас на гнутий акрил після відкриття; DXF-тест і сторож ядра, що червоні тижнями — правимо (кожне — кілька рядків) чи «так і задумано»?[ПИТАННЯ]29 питань 02.09 без відповіді (Б-3…Б-6, В-3/В-4/В-6/В-7, Г-1…Г-3, Д-1…Д-3/Д-6, Е-5…Е-7, Ж-1/Ж-3/Ж-4/Ж-7, З-1…З-4/З-6…З-8) — пройти пакетом чи закрити як «живемо так»?[ПИТАННЯ]Де живуть рішення: журнал + ПАМ'ЯТЬ_ЛЕО (як зараз) чи MANIFEST лишається «джерелом істини» і його треба дописати з 03.09 по 12.10?[ПИТАННЯ]Помічники: лінії Ботічеллі і Джованні — живі (тоді хто й коли дає задачі) чи згорнути, щоб доки не обіцяли того, чого нема?
Пропозиції (не рішення)
[ПРОПОЗИЦІЯ]Пакет №267–№278 — окремою гілкою поверх MR !8 тим самим скриптом із маніфестом SHA (як 12.10), до наступного зведення ІТ; у маніфест — і файли Бруно з позначкою «Бруно, №27x».[ПРОПОЗИЦІЯ]Одна робоча тека; поки їх дві — щоденна автоматична звірка SHA256 усіх файлівsrc/+server/міжweb-appіvs-cadз рядком у журналі «розбіжностей N».[ПРОПОЗИЦІЯ]Після кожного зведення — скрипт «база → наше → результат» і «робоча тека = результат файл у файл», а не лише звірка хешів main перед пушем (п.1 аудиту 02.09).[ПРОПОЗИЦІЯ]«Хвости 02.09 одним пакетом»:quotePdf.ts:477, 508→EDGE_KIND_LABEL.thickening;projectHelpers.ts:115→ з матеріалом;shapeBuilder.ts:2→ тип ізdomain/types; DXF-тест →it.skipз причиною або фікстура;RectangleDesigner.tsx:14; 8×TS2307;translate="no". Тоді «відомих червоних» — 0, і новий червоний видно одразу.[ПРОПОЗИЦІЯ]MANIFEST 2.61+: «стик лише довільний», «підворот — горизонтальна смуга», «кромка диктує примикання», «площа з припуском, кромка по номіналу», «фанера/метал не на слябах», «прод — лише Studio (VITE_CAD)», «вхід адміна — логін»; 2.54 позначити переграним; аудит 02.09 §11 — один блок-посилання на №227–№278.[ПРОПОЗИЦІЯ]Шапки у 16 файлах Бруно: «звідки (пакет), коли, №, хто рев'ю»; ПАМ'ЯТЬ §2.8 — переписати під «одна програма, дві теки».
Додаток: що запускалось
bash probe-L5/tree_diff.sh—diff -rqдвох дерев +diffпо кожному зміненому файлу: 31 / 0 / 13 файлів; +1 041 / −285 рядків;wc -lнових файлів — 3 317.diff -rq --exclude=node_modules --exclude=distпозаsrc/(+ окремоserver/,public/,tools/): різниці —index.html,package.json,vite.config.ts,server/src/settings.js.python3 -I probe-L5/sha_vs_manifest.py— SHA256 обох дерев протиzvirka_bruno.json: знімок = маніфест web-app у 84 з 87 файлів (3 — №267);vs-cad— 71/87 (решта — №270–№278, назва/порт;server/settings.js— стара версія).python3 -I probe-L5/journal_parse.py→journal_entries.tsv: 198 рядків від №84; підрахунок по ISO-тижнях.python3 -I probe-L5/edge_rules.py— 70 профілів, 32 варіанти правил, 39 без правила.- grep/читання з адресами — як у таблицях;
diffvs-cad↔vs-cad-warm(2 файли, проба прогріву) і ↔web-app-merge(main ІТ без ядра). - Ворота ведучого прочитано (
gates/tsc.txt— 418, розклад кодів;vitest.txt— 1856/2/19;eslint.json— 564/45). Власних прогонів vitest/tsc/build не робив (покрито воротами). Код у/tmp/final/vs-cadіstudio-mergeне змінювався; зонди — лише вprobe-L5/.
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. Інше нове
- Без слеба (
projectMaterialпорожній) кошторис губить матеріальні рядки й радіуси (зонд [8]: 8 рядків, ніMATERIAL_*, ніRADIUS_*), а прорахунок радіус бачить і питає код за матеріалом документа (за замовчуванням керамограніт)[ФАКТ ✔]. - Шлях відкриття файлу (
store/projectHelpers.ts:115) досі кличеexplodeDetailsбез матеріалу (втрата 22–23.08), але для виробів запас гнутого елемента вшито при збереженні виробу — зонд на акрилі: 283×60 в обох шляхах. Зачіпає лише легасі-деталі з галочками опусків[ФАКТ ✔]. - Площа парта — зовнішній контур без віднімання вирізів (
engines/geometry.ts:340, 353): мийка 500×400 входить у площу і кошторису, і прорахунку однаково[ФАКТ ◔].
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. Ключові знахідки
- [ФАКТ ✔ зонд] Метраж кромки (№250) завищується на 43–50 % на Г/П з радіусом чи фаскою кута.
engines/geometryUtils.ts:435-458: номінальний контур Г/П — без обробки кута, і пошук сторін по ньому дає чужі ділянки (Г 2400×1600 з R100: Σ кромки 11 357 мм при периметрі 7 957; сторона F 4000 замість 1600). З припуском 10 — входить припуск. Сторож перевіряє Г лише без кутів (edgeLengthNominal.test.ts:57). - [ФАКТ ✔ зонд] Скруглений прямокутний виріз рахується як круглий отвір — усі мийки (R10), варильні з
радіусом, вирізи з обробкою торців (R15+), розетки.
productionFacts.ts:171-184, 266-275: мийка →hole_large, розетка 80×80 →hole_small1 шт. За документами — регрес після №189 (25.09), коли розкрій отримав радіус кутів вирізу; тестів немає. - [ФАКТ ✔ зонд] Металокаркас потрапляє в гроші каменю.
productionFacts.ts:245-250відсіює лише фанеру; метал-парт (engines/geometry.ts:2225-2237,isMain) дає «різ пилою» по периметру труби (4,08 м на 2 м) і площу в «Матеріал», «Монтаж», «Пакування»; ці кількості їдуть і в замовлення ERP. Межу «камінь = не фанера й не метал» уже маєengines/nestingScope.ts:16, але факти її не кличуть. - [ФАКТ ✔ зонд] Спільні налаштування возять гроші, а документ каже, що ні.
store/settingsSync.ts:63-67шле весьquotePriceBookз калібрувальними цінами іserviceCatalogз цінами; прийняття з сервера їх не чистить (:70-86), на відміну від імпорту файлу (useSettingsStore.ts:321).01_МЕЙН/СПІЛЬНІ_НАЛАШТУВАННЯ.md:16-17— «не гроші». Новіша версія на сервері тихо затирає незбережені локальні правки (settingsSync.ts:105). - [ФАКТ ✔] Замовлення в ERP за ручними цінами досі не блокується (Е-5):
QuoteOrderCard.tsx:147-167не дивиться наsource; прапорець калібрування живе в браузері після виходу адміна (useSettingsStore.ts:134-370безpartialize), а ручні ціни тепер можуть прийти із сервера. - [ФАКТ ✔ зонд] 39 із 70 профілів кромок і всі фанерні факти у вбудованих правилах мовчки зникають.
Факт є, рядка немає, попередження немає (
serviceMapping.ts:313-349,estimate.ts:212-224ловить лише «послуги немає в каталозі»). Повна мапаEdgeProfileDef.operations(domain/defaults.ts:30-133) після видалення КП не читається ніким. Екран прив'язок не показує ні радіусних, ні фанерних фактів (ServiceMappingPanel.tsx:28-32). - [ФАКТ ✔ зонд] Подвійний рахунок у фактах лишається: обробка кута на доповненні — двічі
(
productionFacts.ts:419-448,isProductлише на головному елементі виробу); дуга з «Обробкою торців» — половинами в сторонах і ще раз повністю (:457-474). - [ФАКТ ✔ зонд] Три закони метражу кромки і три площі. Кошторис — номінал із дугами (крім п. 1); бланк
погодження в PDF — хорда сегмента на контурі з припуском, без дуг (
quotePdf.ts:1056-1063); прорахунок кромок не рахує. Площа: кошторис 8,871 м² (з чашею мийки й металом), прорахунок 8,044, «Загальна площа виробу» в бланку 8,871 (усі парти,quotePdf.ts:944, 952). - [ФАКТ ✔ зонд] Стики в прорахунку — за формою, не за швами (
quoteCalc.ts:528-534, тест закріплюєquoteCalc.test.ts:565): пряма стільниця зі стиком → 0 «Стикування в площині» (зонд P4); за кодом П з одним стиком дає 2, Г з двома — 1. У кошторисі пропил ×2 на кожне з'єднання, включно з підворотами (12 пропилів на 6 з'єднань, з них 4 підвороти); ребро стику (Z20/Z12) не мапиться (viyarMapping.ts:205-210). «Виконання підвороту» (нова послуга 02.10) — лише руками. - [ФАКТ ✔ зонд] Нові послуги прорахунку (№217) здебільшого без кодів 1С: з 40 — без коду 10
(кераміка), 12 (кварцит), 24 (натуральний камінь), 37 (акрил); серед них авто-послуга «Виріз під
мийку» і
surface_processing. Радіусні коди за матеріалом — закрито (обидва документи 298644). - [ФАКТ ✔ скрипт + зонд] Кошторис — джерело кількостей для ERP і МЕС, а набір кодів слабкий:
у вбудованих правилах код має лише радіус (1 з 10 рядків зонду) →
productionу замовленні майже порожній; набір ВіярПро для кварциту використовує 7 кодів, яких немає в «Актуальних послугах 2026 цех 202» (зокрема 219977 замість 195663 для прямого різу). - [ФАКТ ✔ grep + зонд] Паспорт деталі: «Додаткові послуги» нікуди не йдуть, а ціни не враховують
калібрування.
customServices(DetailPassportModal.tsx:45-124, 280-302) зберігаються у виробі, але жоден рушій грошей їх не читає; паспорт кличе кошторис безmanualPricing(:58-83). Паспорт відкритий менеджеру без входу.
7. Питання власнику
- Ціни в спільних налаштуваннях. Калібрувальні ціни прорахунку і ціни каталогу послуг мають їхати
на сервер «для всіх» (так у коді) чи ні (так у документі №241)? Якщо так — чи окремий замок для
production(технолог) іquote(продажі), як питав №241? - Замовлення в ERP у режимі калібрування (Е-5, досі відкрите): блокувати чи лише попереджати?
- Металокаркас і фанера в грошах. Метал зараз рахується як різ і площа каменю — прибрати з фактів до «правил металу» (№256)? Фанера: увімкнути її правила у вбудованому наборі чи лише через коди ВіярПро? Чи має фанера бути в прорахунку для клієнта (журнал №223 пише «м² у прорахунку»)?
- Виріз зі скругленими кутами (мийка, варильна, розетка) — у прайсі це «виріз» (195304/219981, м.п.), а не «отвір» (195311/219980; розетка — штуки)? Підтвердіть, щоб правка не змінила гроші без вашого слова.
- Метраж кромки для бланка погодження: як у кошторисі (готова деталь, з половинами дуг) чи як зараз у бланку (по сегменту, з припуском, без дуг)? І дуга з «Обробкою торців» між двома профільованими сторонами — одна операція чи дві?
- Стики в прорахунку: рахувати «Стикування в площині» за фактичними швами (пряма стільниця зі стиком теж) чи за формою, як зараз? Пропил ×2 — лише між деталями специфікації чи й на підворотах/потовщеннях?
- 39 профілів без правила (32 акрилові + 7 нових з каталогу 17.09.25): які послуги/коди? Для акрилу в файлах «Додаткові послуги» кодів немає взагалі (замір, монтаж теж).
- «Додаткові послуги» в паспорті деталі — мають іти в кошторис і замовлення чи це нотатка?
- Площа (Е-3, продовження): чаша мийки (окремі 14 деталей) і метал/фанера мають входити в «площу виробу» кошторису й бланка?
- Коди ВіярПро для кварциту: 219977/219979/219980/219981/219998 ще живі в 1С 2026 чи замінити на коди з «Актуальних послуг 2026» (195663, 195669, 195670 …)?
Пропозиції (не рішення)
- Сторожі перед правками: (а) Г і П з радіусом і фаскою кута — Σ кромки = периметр готової деталі, з
припуском 0 і 10; (б) скруглений прямокутний виріз →
cutout_perimeter; (в) метал/фанера не даютьsaw_cut/detail_area; (г)pickSharedDoc— що саме їде на сервер; (д) унікальність id ВіярПро; (е) кожен профіль довідника має правило або явний запис «без послуги». - Метраж №250: брати номінальні вершини з обробкою кута і для Г/П (як для прямокутника), або шукати сторони по контуру різу й міряти по номіналу за індексами; той самий закон — у бланк PDF.
- Класифікацію «отвір/виріз» брати з форми вирізу в деталі (
cutout.shape === 'circle'), а не з евристики полігона; евристику лишити для імпортованих контурів. - Факти: один фільтр
isStonePartзengines/nestingScope.tsдля різу, площі й кромок. - Спільні налаштування: або явно «ціни їдуть» (і тоді документ + попередження в панелі), або чистити ціни при записі/прийнятті так само, як при імпорті файлу; ознака «є незбережені правки» і запит перед тихою підміною.
QuoteOrderCard: попередження або блок приlines.some(l => l.source === 'manual'); прапорець калібрування — не персистити або скидати при виході адміна.- Кошторис: список «фактів без правила» в
EstimatePanelпоруч ізmissingServiceIds; додати радіусні й фанерні факти уFACT_KINDSекрана прив'язок;customServices— або в кошторис, або прибрати з паспорта; паспорт — передаватиmanualPricing. - Дедуплікація кутів (рахувати кут лише з елемента або лише з деталі) і дуги з галочкою.
- Прорахунок:
joint_flatз фактичних швів (part.jointSeams), «Виконання підвороту» — авто з довжини стиків підвороту, якjoint_leg; оновити застарілі коментаріquoteCalc.ts:50-55, 161-164і БІЗНЕС §4.2, §4.7, §6.5, §7, §8.3.
Додаток: що запускалось
| Що | Де | Результат |
|---|---|---|
| Читання коду і доків, 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_ШВИДКІСТЬ_СТАРТ_ПАМЯТЬ.mdНаскрізний аудит Viyar Stone Studio / VS CAD, 13.10.2026. Лінза L7. Код: /tmp/final/vs-cad (знімок диска 12.10, усі адреси —
відносно src/). Код не змінювався; усі зонди — у /tmp/final/audit1310/probe-L7 (копія за брифом).
Питання власника, дослівно: «може то все через те, що в нас у Студії захардкоджено CAD і білдінг і т.д., чи вони мертві, поки ми в них не зайшли? Може в нас файли з кодом великі».
Як міряв.
- Прод-збірка
npx vite build --sourcemapу своїй копії (під замком) → розміри кожного файла збірки (сирий / gzip-9 / brotli-11) і, через карти джерел, скільки байт кожного файла належить кожній папціsrc/і кожній бібліотеці. - Прод-збірку віддавав простим статичним сервером (порт 7302, як хостинг, без бекенда) і відкривав у Chromium
(Playwright, програмна відеокарта SwiftShader — та сама пісочниця, що 12.10): що вантажиться, що з цього виконалось
(V8 coverage + карти джерел), хто ставить таймери і потоки, що відбувається за 30 с простою (процесор кожного
процесу браузера, головний потік, мережа, кадри), пам'ять (купа JS, PSS процесів, розклад
smaps). - Dev-сервер: 7188 був мертвий (
curl→ 000), тож підняв свій на 7301 з копії probe-L7 (не зvs-cad, щоб не писати кеш Vite у знімок;src/у копії ідентичний —diff -rqпорожній). У dev кожен модуль — окремий запит, тож видно точний список модулів на кожному кроці: старт → кейс 81 → редактор → 3D Підбір → назад у 2D. - Секунди 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 |
- Примітка: збирач (rolldown у Vite 8) називає спільні шматки за першим-ліпшим модулем. «metalTemplates» на 1,1 МБ —
це не шаблони металу (їх там 12 КБ), а three.js + словник перекладу + React; «occt» — це react-dom.
Назви файлів у
dist/вводять в оману — дивитися треба склад (нижче). - Ліниві JS разом: 4 791 КБ сирого / 1 243 КБ gzip. Найбільші:
pdf.worker2 366 (pdf.js, лише імпорт бланка/плану),geometry.worker798 (потік ядра),packing.worker255 (потік розкрою),opencascade.full228 (обгортка ядра для стенду),srec179 іsrec-player128 (запис сесії для баг-репорту),index.es151 (canvg — SVG у jspdf),DocsTab94,arSceneRegistry63 (AR-експорт, тягнеться разом із 3D Підбором),MeasureTab57,CombiCutTab52,stand48,PlywoodTab40,AssemblyTab34,Viewer3D34 (3D Підбір),MetalTab26,PlanEditor26,MergeTab21,CombiCutSim20, tesseract 17. - Ядро:
opencascade.full-*.wasm50 305 КБ — ліниво, лише в потоці ядра (kernel/occt/loadOcct.ts:34-35). - Для порівняння (03.09,
01_МЕЙН/ЩО_ВИНОСИМО_З_VS3D.md:158): «головний чанк ≈ 5 МБ». Сьогодні він розбитий на 9 файлів, але вантажаться всі 9 одразу — 6,1 МБ.
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]:
- Запити: 9 JS + 1 CSS (див. 1.1),
favicon.svg,/api/auth/me(вхід, [сторона ІТ]),/api/stounik/ask(GET-зонд, чи є ШІ Стоуника —stounik/aiEndpoint.ts:21, один на сеанс). Шрифт Google — заблокований у пісочниці. - Перший малюнок 156–200 мс, перший змістовний малюнок 660–808 мс,
load506–655 мс (локальний сервер, без мережі). Головний потік: компіляція JS 113–126 мс + виконання модулів 217–256 мс; довгі задачі на старті 79 + 289 + 86 мс. - Потоків (Worker): 0. Полотен WebGL: 0. Купа JS сторінки: 11 МБ. DOM: 530 вузлів, 230 обробників.
- Пам'ять (сума PSS процесів Chromium): 389 МБ (браузер 85, GPU 109, сторінка 119, мережа 35, zygote 30, сховище 11); порожня сторінка до відкриття — 271 МБ, тобто Студія на старті ≈ +118 МБ.
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 | — |
- Мережеві запити за 30 с простою: 0 (прод і dev) [ФАКТ ✔]. Опитування сервера нема (крім 10-хв синхронізації з сесією).
- Потоки на старті: 0 [ФАКТ ✔]. Потік ядра
viyar-occtстворюється при першому запиті геометрії (kernel/occt/workerClient.ts:152); потік розкрою — при першому розкрої (store/slices/packingSlice.ts:19-21). - Головний потік у простої: профіль 30 с — 99,7 % простою (14 мс JS, 29 мс прибирання пам'яті) [ФАКТ ✔].
- Запущених CSS-анімацій на старті: 2 нескінченні —
stone-lookіstone-smileна очах і усмішці Стоуника в шапці (stounik/stounik.css:17-18, цикл 12 с).
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 с |
- Редактор деталі не довантажує нічого: увесь його код (і 3D-рушій) уже прийшов на старті — бо
App.tsx:38імпортуєProductEditorWorkspaceстатично. - 3D Підбір тягне з собою AR-експорт (USDZ/GLTF, 63 КБ у проді,
components/3d/Viewer3D.tsx:7-8) — навіть якщо AR ніхто не натискає. - Безперервні кадри в 3D [ФАКТ ✔]: у жодному
<Canvas>не заданоframeloop(components/3d/Viewer3D.tsx:1943,components/ui/Detail3DPreview.tsx:3343,components/room/RoomEditor.tsx:368) — R3F за замовчуванням малює кожен кадр (frameloop: "always"— виміряно в сцені). Поки 3D відкрите, браузер перемальовує незмінну сцену; вийшли з 3D — полотно знімається, і все стихає (S4). [ГІПОТЕЗА: на справжній відеокарті — 60 кадрів/с; за моїми числами JS на кадр 0,8–1,6 мс → 5–10 % головного потоку плюс робота відеокарти, постійно, поки відкрите 3D.] - Сцени маленькі: редактор — 9 геометрій, 7 текстур, 10 шейдерних програм, 1 500 трикутників, текстури ≈ 8 МБ (оцінка за розмірами зображень, переважно карта відблисків); Підбір — 14 геометрій, 5 текстур, 174 сітки, 5 156 вершин, ≈ 7 МБ текстур. Пам'ять 3D — у GPU-процесі: +95…+104 МБ, після виходу з 3D віддає ~80 МБ.
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 — не змінюється |
Що це означає простою мовою:
- Найбільший шматок — не сам файл 50 МБ, а купа JS потоку ядра (~150–190 МБ): при запуску OpenCascade.js створює JS-обгортки для 24 878 класів і функцій C++ (повна збірка «на все»), і вони живуть увесь сеанс.
- Пам'ять wasm резервується одразу 100 МБ, але реально зайнято 13–20 МБ у наших сценаріях.
- Ще ~110 МБ анонімної пам'яті — [ГІПОТЕЗА] байти самого модуля (48 МіБ), службові дані V8 на 208 тис. функцій, буфери завантаження.
- [ГІПОТЕЗА] Відразу після запуску в купі потоку лежить ще ~120 МБ сміття (проміжні об'єкти ініціалізації; це різниця анонімної пам'яті між прогоном без примусового прибирання і з ним) — браузер прибирає його згодом; тому числа «ціни ядра» плавають: 12.10 — ~500 МБ, мої три прогони — +440, +444 і +324 МБ (останній — після прибирання).
- Ядро не відпускає пам'ять до закриття вкладки: потік не зупиняється при простої [ФАКТ ◔
kernel/occt/workerClient.ts—terminate()лише при аварії/скиданні,:54]. - [ГІПОТЕЗА] Своя збірка OCCT під наші класи (
loadOcct.ts:5-6: «~7/2.4 МБ») зменшила б не лише файл, а й купу потоку — прив'язок стало б у десятки разів менше.
4.3 Хто ще тримає пам'ять
- Головна сторінка: купа JS 11 МБ (прод) / 56–68 МБ (dev); росте на 2–4 МБ за кожен крок (проєкт, редактор, 3D).
- 3D: GPU-процес 105–109 → 204–213 МБ з відкритим 3D; після виходу — 127–134 МБ. Сцени three.js самі по собі малі (4.2).
- Потоки:
packing.worker(255 КБ коду, з них 224 КБ — словник перекладу) створюється лише при розкрої.
5. Секунди 12.10 (зведено з ЗАМІРИ_12-10_ШВИДКІСТЬ_І_СТОУНИК.md, не переміряно)
До/після №271–№278 (прод MR !8 → сьогоднішній код; пісочниця, SwiftShader):
- кухня, 3D Підбір вперше (ядро тепле) 28,2 → 4,2 с; повторно 26,8 → 1,5 с; кухня, відкрити редактор 37,1 → 1,3 с;
- Г, зсув мийки 8,6 → 0,8 с (не висне); з редактора → 3D Підбір 27,9 → 1,7 с;
- Г з L20 + мийка, перше відкриття редактора (ядро холодне) 32,7 → 24,5 с; проста стільниця, перше відкриття 20,7 → 17,0 с;
- відкрили кейс → одразу 3D Підбір (ядро холодне) 29,2 → 11,6 с;
- гірше: «проста + кромка / + виріз» ~+0,4 с (пауза 300 мс №271 + дорога до потоку ядра), але без завмирання; перший розкрій чекає ядро 5,6 с (результат на ~1,4 с пізніше, зате сторінка жива).
Довгі місця зараз і куди Стоуника (з 12.10):
- Редактор, перша деталь при холодному ядрі — 17–24 с, у 3D порожня сітка → Стоуник-завіса в 3D редактора (як №274).
- Зміна кромки 2,4–5,9 с, сторінка жива, але стара картинка → малий Стоуник «перебудовую…» з порогом ~0,5 с.
- Перший розкрій після відкриття — кнопка чекає ядро ~5,6 с → Стоуник біля дошки.
- 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 до цієї картини:
- Ціна прогріву точніше: +324…+444 МБ (після/до прибирання пам'яті) і 9,6–13,9 МБ завантаження (якщо хостинг стискає wasm) або 50,3 МБ (якщо ні) — для кожного, хто відкрив Студію, навіть щоб лише подивитися.
- Ядро й так стартує саме, щойно відкрили проєкт з деталями (S1: потік створено одразу після імпорту кейсу), тож прогрів виграє лише «новий проєкт → редактор» і «відкрили сторінку → редактор».
- 3D після відкриття не стихає — малює кадри безперервно (розділ 3). Це не секунди очікування, а постійне навантаження, поки 3D на екрані.
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. Ключові знахідки
[ФАКТ ✔]Старт = 6,1 МБ JS (1,87 МБ gzip / 1,46 МБ brotli) + 187 КБ CSS, 9 файлів, усі одразу; 71 % цього коду на стартовому екрані не виконується жодного разу (4,33 МБ). —dist/index.html,covmap.mjs.[ФАКТ ✔]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у збірці відсутня.[ФАКТ ✔]Важке на старті — бібліотеки документів 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.[ФАКТ ✔]3D-рушій (1,21 МБ) і весь редактор деталі на старті, боApp.tsx:38імпортуєProductEditorWorkspaceстатично (+App.tsx:11Sidebar3D,components/WorkspacePane.tsx:11RoomEditor); відкриття редактора не довантажує жодного модуля. Лише для одного світла в 3D на старті 247 КБ таблиць (components/3d/SceneLighting.tsx:5).[ФАКТ ✔]Дані в коді ≈ 1,0 МБ на старті: креслення кромок 435 + 77, словник en/pl 224 (+17), довідка 97, теми Стоуника 121, каталог послуг 35. Словник ще й у кожному з двох потоків (lib/project.ts:2→i18n.ts:2).[ФАКТ ✔]Без дотику на стартовому екрані працює лише анімація очей Стоуника (stounik/stounik.css:17-18): GPU-процес 15,8 с CPU за 15 с, поки Стоуник «не спить» (45 с після кожного кліку,stounik/Stounik.tsx:37,71); заснув / анімації на паузі / порожня сторінка — 0,00–0,01 с. Головний потік не зачеплений.[ФАКТ ✔]3D у редакторі й Підборі малює кадри безперервно, поки відкрите (немаframeloop:components/3d/Viewer3D.tsx:1943,components/ui/Detail3DPreview.tsx:3343,components/room/RoomEditor.tsx:368): GPU 25–26 с CPU за 15 с простою в пісочниці; вийшли з 3D — тиша.[ФАКТ ✔]Плашка ядра схована, але її таймер 700 мс крутиться завжди (kernel/KernelBadge.tsx:12,main.tsx:65): 43 спрацювання за 30 с, ≤ 0,4 % головного потоку — «живе, але не гальмує». Мережевих опитувань за 30 с — 0, потоків на старті — 0.[ФАКТ ✔]Ядро OCCT спить до першої потреби (потік —kernel/occt/workerClient.ts:152), стартує саме при відкритті проєкту з деталями, далі тримає +324…+444 МБ до закриття вкладки (12.10: ~500). Найбільше — купа JS потоку 148/192 МБ: 24 878 прив'язок OCCT (повна збірка); wasm-пам'ять 100 МБ зарезервовано, 13–20 МБ зайнято; код JIT 8–14 МБ.[ФАКТ ✔]Файл ядра 50,3 МБ → 13,9 МБ gzip / 9,6 МБ brotli-11; 207 968 функцій, початкова пам'ять 100 МБ. Як його віддає прод-хостинг — невідомо [сторона ІТ].[ФАКТ ✔]Будівник ядра (29 КБ) їде в головний потік на старті, хоча працює лише в потоці:kernel/occt/outline2D.ts:18імпортуєocctBuilderстатично, аoutline2Dберуть зарадиexpandRingkernel/exportCutDxf.ts:52іkernel/shopSheets.ts:42. Також тестові дані в проді:main.tsx:14.[ФАКТ ✔]Сам старт швидкий: перший змістовний малюнок 0,66–0,81 с,load0,51–0,66 с, JS на головному потоці 0,33–0,38 с (пісочниця, локальний сервер). Довгі секунди — перше 3D (графіка, 12.10: ~9 с у пісочниці) і холодне ядро (запуск 4,5–5,6 с; з першою деталлю 5,8–7,4 с).
8. Питання власнику
[ПИТАННЯ]Очі Стоуника. Анімація змушує браузер малювати кадри 45 с після кожного кліку (виміряно; на справжньому ПК — дешевше, ніж у пісочниці, але постійно). Лишаємо як є, чи нехай рухаються лише при наведенні / коротким «моргом» раз на хвилину?[ПИТАННЯ]Імпорт бланка погодження (PDF/Excel) — 0,9 МБ на старті в кожного менеджера (те саме ПИТАННЯ 2 з 03.09). Він живий у роботі? Якщо рідкісний — вантажити по кнопці.[ПИТАННЯ]Прогрів ядра (№279). Ціна: +324…444 МБ пам'яті й 10–14 МБ завантаження (або 50 МБ, якщо хостинг не стискає) для кожного, хто відкрив Студію. Для всіх — чи лише на ПК і лише коли проєкт порожній (бо з деталями ядро й так стартує саме)?[ПИТАННЯ]3D, що малює безперервно. Чи є в редакторі/Підборі щось, що мусить рухатися саме по собі (плавна підсвітка, плавна камера)? Якщо ні — малювати лише при змінах.[ПИТАННЯ, сторона ІТ]Як прод віддає.wasmі JS: стиснення (gzip/brotli), довгий кеш для файлів з хешем?[ПИТАННЯ](відкрите з 12.10) Справжні секунди з ПК Богдана — ті самі сценарії в його Chrome; і чи є серед менеджерів ноутбуки/слабкі машини (для них анімації й безперервне 3D важать більше).
9. Пропозиції (не рішення)
[ПРОПОЗИЦІЯ] Усе нижче — варіанти; нічого не зроблено.
- Ліниві бібліотеки документів (крок А, ≈ −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. - Дані — по потребі (крок Б, ≈ −0,87 МБ). Креслення кромок — по першому показу каталогу/мініатюри; теми
Стоуника — при відкритті вікна; словник en/pl — при виборі мови (перевірити
LanguageDomTranslatorвuk). - 3D з редактором — лінивим (крок В, ≈ −1 МБ, робота більша).
React.lazyдляProductEditorWorkspace,Sidebar3D/DetailEditor3D,RoomEditor;threecore лишиться (рушії). Розумно робити разом із підключенням реєстру «дочок»shell/workspaces.ts(03.09). - Стоуник: менше кадрів. Рух очей — коротким імпульсом або лише при наведенні; або пауза анімації, коли вкладка
не в фокусі. Перевірка —
idle_ab.mjs(стан А має наблизитись до Б). - 3D «за потреби»:
frameloop="demand"+invalidate()при змінах (камера, підсвіткаBacklightRig, завантаження текстур). Ризик: місця зuseFrame, що чекають кадр (components/3d/Viewer3D.tsx:41,500,BacklightRig.tsx:204) — потребуютьinvalidate; перевірити очима. - Плашка ядра в Студії — не монтувати або не крутити таймер, коли
hidden(kernel/KernelBadge.tsx:12); дрібниця, але це 1,4 тіки/с назавжди. - Потоки й головний потік без зайвого:
statusLabelзlib/project.tsвинести, щоб словник не їхав у потоки (−224 КБ у кожному);expandRingвинести зoutline2D.ts, щоб будівник не їхав у головний потік; прибратиmockDataзmain.tsx:14у dev-гілку. - Ядро: (а) прогрів №279 — лише на ПК і лише без деталей у проєкті; (б) [ГІПОТЕЗА] зупиняти потік ядра після довгого простою (звільнить 324–444 МБ, ціна — 5,6 с при наступному запуску); (в) довго — своя збірка OCCT під наші класи (менше файл, менше прив'язок → менша купа потоку).
- Хостинг [сторона ІТ]: заздалегідь стиснений
.wasm.br(9,6 МБ замість 50,3) і довгий кеш для файлів із хешем. - Повторний замір після будь-якого з кроків — тими самими зондами з додатку (окремо прод і 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).
Не перевірено / межі:
- Справжні секунди й навантаження на справжній відеокарті (ПК Богдана) — лише пісочниця.
- Прод-стани з проєктом/редактором/3D (у прод-збірці нема
window.useProjectStore— стани S1–S4 лише в dev; ядро і 3D в обох збірках однакові, різниця dev/прод на старті — ~215 МБ). - Час компіляції/виконання по кожному файлу окремо (трасування дало лише суми).
- Робота з сесією Keycloak (10-хв синхронізація налаштувань) — лише з коду.
- Мобільний телефон — не міряв (12.10 пропонує прогрів не вмикати на телефоні).
- Мертвий код усередині лінивих файлів (Viewer3D) — лінза L3.