Звіт · SaaS ERP для швейних виробництв

SaaS ERP

Аудит інженерної стратегії SaaS ERP для швейних виробництв; назву продукту й учасників змінено. Головний вектор — запуск у реальну експлуатацію. Аудит наявної системи на доказах із репозиторію, git-історії, робочого чату і зовнішніх джерел, із запропонованим реєстром політик.

Немає часу читати? Ось презентація! (слайдів: 21, хвилин: 4)


Доказова база

знайдено44%50
веб20%22
стейкхолдер29%32
виведено3%3
припущено4%5

Порахована з тверджень у тексті нижче, а не написана вручну — вона не може розійтися з тим, що каже документ.

Два роки розробки, дві пари рук, 95,71% покриття тестами, і жодного дня реальної роботи на жодній із двох фабрик, які власник має напоготові.

Справа не в якості інженерії. Якість тут висока, і аудит її виміряв. Справа в тому, що вхід у систему коштує дорожче, ніж власник готовий заплатити, вихід із неї жодного разу не спрацював на живих людях, а про збій команда дізнається тільки тоді, коли хтось напише в Telegram.

Мета ширша за запуск: обидві фабрики власника, продуктизація і продаж системи як SaaS зовнішнім клієнтам стейкхолдер. У цій рамці вартість наповнення даними перестає бути разовою перешкодою і стає юніт-економікою кожного наступного клієнта.

Що і за який період дивились: репозиторій main станом на 2026-08-12, експорт Telegram за 2024-05-13 → 2026-08-10 (5 735 повідомлень), веб-огляд 2026-08-13. Тести прогнали і покриття виміряли 2026-08-13 на окремій базі. Доступу до GitHub Actions і до репозиторію мобільного застосунку не було; там, де це змінює висновок, сказано прямо. Пізніше додалось одне свідчення зсередини команди. 2026-08-19 автор представив звіт BE-розробникові, а 2026-09-08 попросив у нього відгук стейкхолдер. Що саме ця розмова зрушила, записано в журналі рішень, у K14що змінила розмова з BE-розробником.

Кожне твердження в звіті несе позначку походження. Це не дає впевнено сформульованому припущенню видати себе за знахідку, і лічильник вище рахує саме ці позначки, а не оцінює їх на око. За ним стоїть робочий граф, який вівся з першої години аудиту: 71 вузол-твердження з посиланням на джерело, і за кожним вузлом лежить файл зі свідченням, яке його тримає.

Майже половина тверджень стоїть на прочитаному в коді, git-історії та експорті чату, ще п'ята частина — на веб-джерелах. Для питань факту це міцна основа. Слабке місце в іншому: власника фабрик, головну дійову особу цієї історії, аудит не опитував. Слова стейкхолдера тут мають два джерела. Більшість сказав автор аудиту — людина поруч із проєктом, а не учасник команди. Решту, датовану 2026-09-08, — BE-розробник, якому звіт представили 2026-08-19.

Чого цей звіт не бачив

Мобільний застосунок лежить в окремому репозиторії Mobile/, якого немає на машині аудиту. Це третій клієнт системи і носій головної продуктової обіцянки. Жодне твердження про його код тут не зроблено; там, де його стан важить, стоїть відкрите питання Q8чи полагоджено петлю скану після серпня 2025. Так само не прочитано історію запусків GitHub Actions. Прочитані лише самі воркфлоу; про те, як вони завершувалися, цей звіт не свідчить.

Початок тут

Цей розділ існує, щоб решту звіту можна було читати без попереднього знання проєкту. Якщо ви в матеріалі — переходьте одразу до Політик і операцій.

Що таке SaaS ERP

Це ERP для швейного виробництва: система, яка веде виріб від замовлення до відвантаження і рахує відрядну зарплату швачкам. Не крамниця, не облік — саме керування цехом.

Технічно це монорепозиторій із чотирьох частин знайдено:

  • Rails 8.1 API — 138 моделей, 86 контролерів, 442 міграції. Уся доменна логіка.
  • frontend/ — перший веб-інтерфейс на antd. Виведений з експлуатації в липні 2026, лишається в git як довідковий матеріал.
  • frontend_v2/ — другий веб-інтерфейс, React 19 + власна дизайн-система. Основна лінія роботи з лютого 2026. знайдено
  • docs/ — сайт документації на Next.js із PRD, user stories і ADR. знайдено

Плюс мобільний застосунок на React Native в окремому репозиторії — саме він несе обіцянку продукту.

Обіцянка продукту

Її сформулював автор аудиту стейкхолдер так: робітниця в цеху має мобільний застосунок, підходить до надрукованого документа з QR-кодом, сканує його, і отримує саме той перелік операцій, який має робити сьогодні.

Це не декоративна деталь. Це і є те, за що фабрика платить: керування в реальному часі замість обліку постфактум.

Дійові особи

  • Власник — не з IT. Носій предметної експертизи рівня технолога: диктує модель даних, оперує поняттями 1С, перелічує канонічні документи швейного виробництва напам'ять знайдено. Має дві діючі швейні фабрики, з яких можна стартувати стейкхолдер.
  • FE-розробник — фронтенд. 2 553 коміти (79% усіх). знайдено Побудував обидва веб-інтерфейси, мобільний застосунок, CI, документацію, ADR, e2e-набір і agent harness. Фактично комітить у backend більше, ніж backend-розробник.
  • BE-розробник — backend на Ruby. 692 коміти знайдено. Володіє інфраструктурою Heroku стейкхолдер.
  • Автор аудиту — у проєкті не працює: комітів не має, у робочому каналі не пише знайдено. Він задав вектор дослідження, висував гіпотези і виправляв висновки по ходу роботи.

Це розрізнення важливе для читання. Усе, що позначено як слова стейкхолдера, сказав автор аудиту — людина поруч із проєктом, а не всередині нього. Теза про тертя онбордингу, рамка «це фабрика, отже годинникова надійність» і формулювання «немає дорослого» належать саме йому: це погляд ззовні, а не задокументована в проєкті позиція і не самооцінка когось із команди.

Як читати позначки

знайденоПобачено безпосередньо в системі — код, виконана команда, git-історія, прогін тестів.
вебПеревірено в зовнішньому джерелі — сайт конкурента, галузева література.
стейкхолдерЗаявлено стейкхолдером. Авторитетно для бізнес-фактів, але переглядається.
виведеноВиведено з доказів міркуванням. Не факт.
припущеноАні перевірено, ані підтверджено. Усе таке — в розділі невідомого.

Коди реєстрів

PL політики · S стратегії в силі · RC першопричини · R ризики · D борги · C активи · E швидкі перемоги · B ставки · K рішення · P пре-мортем · Q відкриті питання. Кожна згадка коду несе однорядкову пам'ятку, щоб не доводилось шукати, що це було.

Хронологія

2024-05-22Перший коміт.
2024-11-06Власник просить визначити терміни запуску. Відповіді немає, і не буде жодного разу за 27 місяців.
2024-12-17Власник сам вимірює вартість входу: «для заповнення 1 специфікації з 18 позицій зайняло близько 30 хвилин це дуже довго». Просить авто-пошук при заповненні.
2025-01-22Власник заповнює обладнання цеху на одній із фабрик — реальна спроба наповнення.
2025-07-15Тестування на фабриці: сценарій на п'ять пачок не дає закрити виконану роботу.
2025-08Єдиний пілот на живих робітницях. Петля «друк → скан → робота» розсипається у п'яти місцях.
2025-12-29FE-розробник знаходить стартап-грант до 100 тис. USD. Умова — запущена версія продукту, бажано з доходом.
2026-01-06Зустріч по гранту перенесено.
2026-01 → 2026-08Слово «грант» не зʼявляється в чаті жодного разу за наступні сім місяців.
2026-01-25«Обнулив продакшн».
2026-02-05Перший коміт frontend_v2. Починається переписування фронтенду.
2026-03Хвиля рефакторингу: 70 комітів за місяць проти 1–9 раніше. Триматиметься п'ять місяців.
2026-06-24Резервний шлях — повний CRUD процесів зміни у вебі — отримує повноцінну розробку.
2026-07-30FE-розробник: «В мене поки немає завданнь… я можу займатись пошуком роботи?»
2026-08-10Останній день експорту. Обговорення підпису поля в довіднику матеріалів.
2026-08-19Автор аудиту представляє звіт BE-розробникові.
2026-09-08Автор просить у BE-розробника відгук на звіт. Запуску на фабриці досі немає: власник зупинився на тому, як згрупувати обладнання, а в моделі обслуговування обладнання прив'язане до його підгрупи. FE-розробник тим часом переписує мобільний застосунок, BE-розробник робить ролі.

Політики та операції

Це вирішений шар: правила, які мають діяти в кожному наступному рішенні свого класу, коли стратега немає в кімнаті. Усі рядки нижче мають стан «запропоновано» — політику ухвалює людина, що веде проєкт, а не аудит.

Одна умова визначає форму всіх шести. Мандату в проєкті немає: власник не має технічної експертизи, BE-розробник за власним визнанням не бере на себе покращення машини й інженерне лідерство, FE-розробник — найкращий кандидат у лідери, але без глибокої BE-експертизи, і саме він щойно питав про пошук роботи RC2вакуум технічного лідерства. Тому жодна політика тут не розраховує на те, що хтось наполягатиме. Ті, що мусять спрацювати напевно, зроблені рамками CI: вони не питають дозволу. Ті, що рамками стати не можуть, свідомо ослаблені до рекомендації. Приписова політика, яку нікому виконувати, це театр згоди, а не стратегія.

PL1 — Історія Telegram-чату із замовником конвертується в Issue Tracker на GitHub Projectsприпис · запропоновано

Найдешевша політика в наборі, і водночас та, що б'є в найдорожчий дефект. Ламається все в одному місці: канал, який працює за дошку задач, не має стану. Сказане в ньому не має ні відповідального, ні дати, ні способу перевірити, чи воно зроблене.

Три найдорожчі втрати саме такі. 17 грудня 2024 власник сам виміряв вартість входу і попросив конкретне виправлення — перший коміт того класу датований 3 червня 2026, через вісімнадцять місяців, і це не те, про що він просив. Так само розчинилися дата запуску (листопад 2024) і трек гранту на 100 тис. USD (січень 2026).

Тому політика починається не з нового правила, а з конвертації того, що вже сказано. У чаті лежать 5 735 повідомлень за 27 місяців, і в них — уся незакрита робота проєкту: вимоги власника з номерами й прикладами, скарги на дефекти, обіцянки «зробимо в наступній версії». Це велика, але механічна робота з розбору тексту, тобто рівно те, що агент робить за один прохід. Після конвертації правило тримається саме собою: якщо задача не в трекері, її немає.

Другий канал у той самий трекер — Sentry, що заводить issue сам E4підключити Sentry у backend і фронтенди. Це не додаткова зручність, а друга половина того самого механізму. Чат ловить те, що власник помітив і не полінувався написати; Sentry ловить те, чого не помітив ніхто, а на фабриці це і є найдорожчий клас R1конвеєр стає і ніхто не дізнається: збій, після якого робітниця просто йде до майстра, а не пише в Telegram. Разом вони закривають обидва боки: людський сигнал перестає розчинятися, машинний уперше зʼявляється.

Що закриває: RC1скарзі власника нема куди потрапити · D6Telegram як дошка задач · R5власник знову зупиниться на введенні даних · R1конвеєр стає і ніхто не дізнається · D3нуль спостережуваності

Щодо чинних стратегій: уточнює S3дошка задач — це Telegram

Механізми: Три дії, жодних зборів. Разова: агент проходить експорт чату і заводить у GitHub Projects кожну незакриту вимогу, скаргу і обіцянку, з датою та автором з оригіналу. Стала: раз на тиждень той самий прохід по новому, з тихим виходом, коли заводити нічого. Автоматична: інтеграція Sentry заводить issue на кожну нову помилку в проді сама, без людини в ланцюгу.

Виконується: GitHub Projects на репозиторії бекенду: разова конвертація історії, щотижневий прохід агентом по чату, інтеграція Sentry → GitHub Issues

Перегляд: 2026-11-13

PL2 — Гілка main захищена зеленим rspec, і кожен прогін публікує метрику покриттяприпис · запропоновано

У проєкті є 6 114 прикладів rspec і 95,71% покриття рядків. BE-розробник запускає їх регулярно стейкхолдер, тож набір не лежить мертвим — він прикриває ті зміни, які проходять через його руки.

Проблема в тому, що через його руки проходить менша частина backend-у. FE-розробник зробив у backend 1 089 комітів проти 588 знайдено, і робить це власним агентом, який правил BE-розробника не бачить стейкхолдер. Локальна звичка однієї людини не може прикрити чужі коміти за визначенням: між ними немає спільної точки, крім main.

Сім падінь rspec при цьому відомі розробникам, задокументовані і не полагоджені — їх навіть не позначили як skip, вони просто падають стейкхолдер.

Цінність цієї політики не в тому, що вона щось покаже. Показувати нема чого: команда й так знає. Цінність потрійна. По-перше, вона поширює наявну звичку на обидві пари рук замість однієї. По-друге, робить ігнорування дорогим: червоний білд, який нічого не блокує, можна перетерпіти, а рамки, які не пропускають злиття, перетерпіти не можна — їх або лагодять, або свідомо знімають, і обидва варіанти краще за мовчазне терпіння.

По-третє — і про це рідко говорять уголос — це частина harness engineering, тобто дисципліни для агентів. Коли агент бачить червоний білд, він його спробує виправити: сигнал у CI для агента є не звітом, який можна відкласти, а задачею, яку видно в момент роботи. У проєкті, де FE-розробник пише бекенд-код своїм агентом стейкхолдер, це перестає бути абстракцією: зелений білд і є тим механізмом, який тримає чужу за фахом роботу в межах. Без нього агент не має зворотного звʼязку взагалі, і єдиною перевіркою лишається рецензент, який у цій ділянці не має експертизи.

Варто наголосити на ціні. Це не побудова процесу з нуля: CI вже стоїть і працює — три джоби в test.yml (Unit Tests, Lint, E2E Tests) плюс окремий воркфлоу для міграцій знайдено. Третя з них уже вміє найскладніше: піднімає бекенд у docker, чекає готовності API і розгортає базу. Набір тестів написаний і зелений на 6 114 прикладах. Бракує однієї джоби, яка запускає наявне на кожен PR. З усього, що пропонує цей звіт, це найдешевша дія з найбільшим охопленням.

Що закриває: RC3сигнал є, але він нічого не коштує · D1rspec поза CI

Щодо чинних стратегій: замінює S2відомий провал тесту — нормальний стан; ратифікує S1якість забезпечується локально й добровільно

Механізми: Автоматизація: джоба в наявному воркфлоу. SimpleCov у групі :test, артефакт покриття як вихід джоби і поріг, нижче якого злиття не проходить: сьогодні цифри не бачив ніхто, тож перший крок це зробити їх видимими, а не одразу карантинними. Сім відомих падінь розділяються, а не карантинуються гуртом знайдено: шість у відеопідсистемі (videos_spec, aws_events_controller_spec) ідуть у карантин з issue і датою, а сьоме — users_controller_spec — карантину не підлягає, бо це живий дефект, і його лагодять.

Виконується: Обов'язкова перевірка GitHub Actions на main і staging (детерміністична сходинка)

Перегляд: 2026-09-13

PL3 — Пілот на фабриці стартує лише паралельно з чинним обліком, і чинний облік не вимикають, доки тижнева розбіжність не впаде до нуляприпис · запропоновано

Це та політика, що робить запуск можливим, і вона не про софт. У фабрики немає права на простій: якщо система відмовляє, лінія стоїть, а швачка на відрядній оплаті не отримує грошей. Доки збій зупиняє виробництво, раціональна поведінка власника, це не запускати. Саме це ми й бачимо два роки поспіль. Паралельний прогін розриває цей зв'язок: чинний облік продовжує рахувати, система рахує поруч, і дефект стає розбіжністю в таблиці, а не зупинкою цеху.

«Чинний облік» тут означає те, чим фабрика рахує сьогодні, хай яким воно буде. Це не обовʼязково папір: може бути Excel, 1С, зошит майстра, чат у телефоні або комбінація всього переліченого. Формат не має значення для політики — має значення лише те, що він не вимикається на час пілоту і що його числа щодня є з чим порівняти. Галузева література описує це як паралельний прогін із папером, бо так історично склалося веб, але суть не в носії, а в наявності другого, незалежного лічильника. У конкурента Scan ERP це тиждень 2 із чотирьох веб.

Побічно це знімає ще один ризик, про який легко забути: якщо фабрика вимикає старий облік і система дає збій, відновити дані нема звідки. Другий лічильник є ще й резервною копією.

Що закриває: RC6збій тихий і небезпечний · R1конвеєр стає і ніхто не дізнається · RC4обіцянка не перевіряється і не знімається

Щодо чинних стратегій: заповнює порожнечу: жодна стратегія в силі цього не покриває

Механізми: Інспекція: щоденне звіряння двох чисел, скільки одиниць порахував чинний облік і скільки система. Розбіжність за день є єдиною метрикою пілоту.

Ухвалює: власник (рішення його — це його виробництво)

Виконується: Умова старту пілоту, зафіксована письмово перед першим днем

Перегляд: 2026-10-13

PL4 — Поки на реальній фабриці не закрито жодної зміни, щонайменше 70% часу розробки йде на роботу, що веде до запускурозподіл · запропоновано

Розподіл ресурсу тут не бюрократія. Це єдиний спосіб зробити незапуск дорожчим за переписування. З березня 2026 темп рефакторингових комітів зріс із 1–9 до 70 на місяць і тримається п'ять місяців. Це чудова робота: межі FSD-модулів як помилки CI, ADR-и, зелений білд на кожній фазі міграції. І вона почалась через тиждень після того, як продакшн обнулили, і через два місяці після того, як згас грант, умовою якого був запуск. Поки жодна цифра не розділяє «робота на запуск» і «робота на код», ця заміна відбуватиметься сама собою і виглядатиме бездоганно обґрунтованою щоразу.

Що закриває: RC2вакуум технічного лідерства · RC5вхід дорожчий за вихід · R4гроші закінчаться раніше за запуск

Щодо чинних стратегій: замінює S6коли впровадження буксує — переписуємо

Механізми: Розподіл це найконкретніша форма пріоритету. Механізм: одна таблиця на тиждень, без зборів.

Ухвалює: власник як платник

Виконується: Тижневий огляд: у якій колонці стояла робота кожного розробника

Перегляд: 2026-10-13

PL5 — Продуктова обіцянка має названого відповідального і дату перевірки; якщо перевірка не відбулась у строк, обіцянку офіційно знімаютьзатвердження · запропоновано

Обіцянку (робітниця сканує і отримує роботу) перевіряли один раз, у серпні 2025. Вона не спрацювала. Її не полагодили публічно і не зняли: натомість поруч виріс резервний шлях, у якому дані про виконану роботу вводить адміністратор у вебі, і саме він отримав повноцінну розробку в червні 2026 і сім e2e-специфікацій. знайдено Так продукт тихо змінив природу — з керування в реальному часі на облік постфактум, і жодного рішення про це не існує. Ця політика не вимагає полагодити петлю. Вона вимагає, щоб хтось був за неї відповідальний і щоб мовчазне відмирання стало неможливим.

Що закриває: RC4обіцянка не перевіряється і не знімається · R3петля скану досі не працює · R6мобільний застосунок неаудитований

Щодо чинних стратегій: заповнює порожнечу, названу S7обіцянку продукту ніхто не тримає

Механізми: Затвердження з адресою: одне рішення, записане в лог, із датою. Не зустріч, а рядок.

Виконується: Запис у Decision Log репозиторію; ухвалює власник разом із розробниками

Перегляд: 2026-10-13

PL6 — Нове переписування не починається, доки не записані його причина, критерій завершення і датанастанова · запропоновано

Це єдиний рядок у наборі, свідомо ослаблений до рекомендації, і причина називається прямо: приписати його нікому. Мігація v1→v2 має названу причину (циклічні залежності в v1: 60 доменів, 223 ребра) знайдено і рамки якості на кожній фазі — це зразкове переписування. Чого воно не має — критерію виходу і дати, після якої frontend/ перестає отримувати фічі. Тому два веб-клієнти живуть паралельно вже пів року, а разом із мобільним це три клієнти на дві пари рук.

Що закриває: RC2вакуум технічного лідерства · D4три клієнти на дві пари рук

Щодо чинних стратегій: уточнює S6коли впровадження буксує — переписуємо

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

Виконується: Норма в кореневому AGENTS.md; запис у Decision Log

Перегляд: 2027-02-13

Бізнес-контекст: гроші, яких менше, ніж здається

Припущення про безлімітний бюджет власника доказами не підтверджується. Прямої відповіді немає — це відкрите питання Q4скільки місяців ще можна фінансувати, але слідів достатньо.

Оплата планується наперед («Планую до 05.03 зробити оплату 1750 у.о.»), існує величина «зароблено, але не виплачено» (BE-розробник випадково затер формулу, яка її рахує, у спільній Google-таблиці), а поняття заборгованості достатньо живе, щоб її закриття оголошували окремо: «Заборгованість відсутня» знайдено. Суми коливаються: 85 386 грн за місяць одному розробнику в серпні 2025 (≈2 000 USD), 1 750 у.о. у лютому 2025, 500 у.о. у червні 2026. Квитанції надходять парами приблизно щомісяця, з розривом майже на п'ять місяців між квітнем і вереснем 2025.

Обмеження цього читання назване прямо: квитанції в чаті — неповний облік, платежі могли йти повз канал, а таблиця з реальним рахунком аудиту недоступна. Тому висновок — виведено, а не факт.

Але груба арифметика варта уваги: ≈2 000 USD × 2 розробники × 27 місяців дає близько 100 тис. USD уже витрачених. Це приблизно дорівнює гранту, який FE-розробник знайшов у грудні 2025 — з умовою «мати вже хоч якусь запущену базову версію продукту (в ідеалі з доходом)». Тобто зовнішні гроші, які могли б подвоїти ресурс проєкту, лежать за тими самими дверима, що й запуск.

Попереду стаття, якої немає в жодній таблиці: вихід на зовнішніх клієнтів потребуватиме маркетингу. Автор аудиту оцінює його щонайменше в 50 тис. USD припущено. Це оцінка порядку, а не розрахунок, але вона показує масштаб: до продукту на ринку треба вкласти ще щонайменше половину вже вкладеного.

Стартап-грант до 100 тис. USD вимагає запущеної версії продукту, бажано з доходом. Тред прожив тиждень у грудні 2025 і згас після перенесеної зустрічі. За наступні сім місяців слово «грант» в експорті не зустрічається жодного разу.

Продукт: обіцянка, яку перевіряли один раз

Обіцянка звучить так: робітниця підходить до надрукованого маршрутного листа, сканує QR і отримує свій перелік операцій на день стейкхолдер.

Реалізація цьому відповідає. QR несуть саме ті два документи, що є документами партії: маршрутний лист і карта крою, кожен із payload { id, type } на етикетці 100 × 50 мм разом із кодом, виробом, кольором, розміром і плановою кількістю знайдено. Специфікація QR не має і не повинна: вона є шаблоном виробу, а не завданням на конкретну партію.

Тобто задум і код тут збігаються. Розходиться інше — те, що відбувається після сканування.

Перевірка відбулась у серпні 2025, на живих робітницях, один раз. Петля розсипалась у п'яти незалежних місцях.

Власник · 2025-08-19

Чомусь трішки погано сканується

Власник · 2025-08-19

Хоча роздрукована на принтері з 600 dpi

FE-розробник · 2025-08-20

до речі, код може погано скануватись через те, що зверху немає відступа в етикетці

FE-розробник · 2025-08-20

те що вони натиснули «розпочати, сканувати» не створило їм процес в їх зміні, тобто немає до чого долучатись

Останній рядок і є обіцянка, що не виконалась, у момент її єдиної перевірки: людина відсканувала і не отримала роботи.

Решта три: після генерації етикетки збивається послідовність друку; під час сканування на екрані лишається частина попереднього меню; QR несе прив'язку до місця розташування, через що маршрутний лист, створений в одному підрозділі, не відкривався у зміні того ж підрозділу. Серверна валідація прив'язки обладнання до підрозділу з'явилась 2026-07-23 — через одинадцять місяців після того, як власник про це написав.

І ще одна умова, яку власник назвав ще у березні 2025: петля вимагає двох сканувань — обладнання і документа — плюс відкритої зміни в правильному підрозділі. «Кожного разу сканувати одну і ту саму річ не актуально».

У травні 2025 розробник спроєктував «резервну функцію, щоб адмін міг вручну внести дані про виконанні процеси». У червні 2026 вона отримала повний CRUD процесів зміни у вебі й сім e2e-специфікацій. Мобільна половина петлі — та, що несе обіцянку — з серпня 2025 на людях не перевірялась.

Організація: у кімнаті немає дорослого

Формулювання належить авторові аудиту стейкхолдер, не власникові фабрик і не комусь із команди. Це оцінка ззовні: людина, яка дивиться на проєкт збоку, не бачить у ньому нікого, хто тримав би інженерний напрям. У таблиці нижче її немає — там лише ті троє, між якими розподілені ролі.

Розкладка ролей проти потреби:

рольщо можечого не може
Власникпредметна істина, пріоритети, гроші, доступ до двох фабриктехнічна стратегія — немає експертизи
BE-розробникдомен backend, інфраструктура Herokuне бере на себе покращення машини та інженерне лідерство
FE-розробникCI, ADR, PRD, harness, e2e, фактично і backend тежнемає глибокої BE-експертизи; 2026-07-30 питає, чи шукати роботу

Із цього випливають три речі, і всі три структурні, а не персональні.

Стеля припису низька. Немає людини, яка одночасно має мандат і готова застосовувати наслідки. Тому приписова політика, що спирається на людську наполегливість, провалює критерій виконуваності за визначенням — звідси форма PL2main захищений зеленим rspec: рамки, які не питають дозволу.

Інфраструктура і воля до її покращення лежать у різних руках. Heroku належить BE-розробнику; безперервне покращення машини — не його зона за власним визнанням. Будь-яка політика, що вимагає змін у деплої чи CI, має або переїхати до FE-розробника разом із доступом, або лишитись невиконаною.

Знаннєвий розрив односторонній і повний. Поза полем зору BE-розробника перебуває вся інженерна надбудова: устрій CI, ADR-и, PRD, набір із 303 e2e-тестів, harness на 426 рядків стейкхолдер. У зворотний бік асиметрії немає: FE-розробник комітить у backend 1 089 разів і робить це власним агентом. Тобто майже всі інженерні активи проєкту створені однією людиною і відомі лише їй, і це та сама людина, яка щойно запитала про пошук роботи.

Інженерія: висока якість без жодних рамок

Найважливіше, що варто сказати про цей код: він хороший. Це не проєкт із низькою культурою, який треба рятувати. Це проєкт із високою культурою, чиї результати нікуди не підключені.

  • 95,71%покриття backend від rspec, 6 114 прикладів
  • 79,05%покриття backend від e2e, 303 тести
  • 80,72%покриття frontend від e2e
  • 0з цього було коли-небудь виміряно до цього аудиту

Покриття виміряно інструментуванням, якого в проєкті ніколи не було: simplecov немає в Gemfile, артефакт покриття не генерується, Codecov не підключений. Тобто жодної з цих цифр не бачив жоден учасник команди — вони всі виміряні вперше тут. Вихідна теза автора аудиту була саме про це: покриття не записується, і вона вірна.

Два набори міряні окремо. Rspec: 6 114 прикладів, 95,71% рядків і 82,12% гілок. E2e, знято одним прогоном 2026-08-14 (303 passed): backend 79,05% рядків (7 193 / 9 099) і 45,56% гілок, frontend 80,72% рядків (21 634 / 26 800) знайдено.

Читати їх треба разом. 79% рядків backend від браузерних тестів — це багато: 303 тести ганяють реальні доменні сценарії, а не димові перевірки. Розрив по гілках (45,56% проти 82,12%) показує здоровий поділ праці: e2e йде щасливими шляхами, юніт-специфікації беруть гілки помилок. Тобто backend прикритий із двох незалежних боків.

І тут потрібне уточнення, бо воно змінює адресу проблеми. E2e в CI виконується: у test.yml є джоба E2E Tests, яка піднімає бекенд через docker compose, чекає готовності API, розгортає базу і запускає Playwright знайдено. Отже бекенд у CI перевіряється — але з браузера, по щасливих шляхах, із покриттям гілок 45,56%.

Не виконується в CI саме rspec: набір із 6 114 прикладів, який тримає 82,12% гілок, не запускається жодного разу. Це не «тести не підключені» — це «підключений той із двох наборів, який найгірше ловить помилкові гілки, а той, що ловить їх найкраще, мовчить».

Шлях до цієї цифри сам є знахідкою. Дві спроби провалились, і кожна показала окремий дефект:

  1. Bootsnap несумісний з інструментуванням покриття — усі 308 файлів падають на завантаженні.
  2. rspec не стартує у власному тестовому стеку проєкту: сервіс api тримає ту саму базу, яку DatabaseCleaner очищає в before(:suite), і вони взаємно блокуються.

Перший вимір після обходу дав 47,94%, і був хибним: жоден приклад не виконався, число відображало виконання коду під час завантаження Rails. Викрила це метрика гілок: 0,36%.

Спостережуваність

Її немає. Перевірено Gemfile, package.json, frontend_v2/package.json: жодного Sentry, Bugsnag, Rollbar, Honeybadger, AppSignal, Datadog, New Relic знайдено, підтверджено замовником стейкхолдер.

Є /up (застосунок піднявся), логи у stdout із тегом request_id без агрегації — Logplex тримає буфер на ~1 500 рядків і до тижня, тож без drain вони зникають веб; і скрипт, що вивантажує сорсмапи в S3 без приймача помилок: заготовка під розшифровку стектрейсів, які нікуди не надсилаються.

Механізм, що зупиняє цех

Це найважливіша знахідка інженерного розділу, і вона стає видимою лише в рамці «це фабрика». ProcessItem валідує на створенні:

app/models/process_item.rb

def reserved_quantity
operation.process_items.where(sheetable_id:).where.not(id:).sum do |p_i|
  p_i.finished? ? p_i.actual_quantity || 0 : p_i.planned_quantity || 0
end
end

def allowed_quantity
@allowed_quantity ||= (sheetable.planned_quantity || 0) - (sheetable.defected_quantity || 0) - reserved_quantity
end

Читається так: незавершений процес тримає резерв на всю свою планову кількість. Звільнити його можна двома способами — завершити процес або видалити його, а видалення закрите правом processes:delete, тобто доступне адміністратору, не швачці. Ні таймауту, ні автоматичного звільнення немає.

Ідемпотентності на створення теж немає. Подвійне сканування — рівно те, що робить людина, коли перший скан не дав видимої реакції, тобто рівно те, що сталося в серпні 2025 — створює другий процес і з'їдає резерв удруге.

Обидва сценарії вже трапились: «Працівник одночасно запустив 2 процеса на виконання» (2025-05-23) і, у липні 2025, робота, яку зробили і не дали закрити: «показало всі п'ять пачок по 50 та не дало нам закрити роботу».

Резерв кількості без строку давності зупиняє наступну людину на операції. Спостережуваності нуль. Для фабрики час до виявлення дорівнює часу простою, а механізм виявлення сьогодні — це власник, який пише в Telegram.

Стратегія, яка вже діє

Перед тим як пропонувати стратегію, звіт документує ту, що вже керує рішеннями, записана вона чи ні. Тут вона є, і вона послідовна.

#Правило, якби його записалиЗаписано?Працює?
S1

Якість забезпечується локально й добровільно, а не рамками. Доказ знайдено: 6 114 прикладів, 95,71% покриття, і жодної джоби, що їх запускає.

ніде не записананабір чудовий, не захищає нікого
S2

Відомий провал тесту є нормальним станом. Доказ знайдено: сім падінь rspec відомі розробникам, задокументовані і терпимі досі.

тіньова — тримається машиною, не документомпрацює як норма і руйнує сигнал
S3

Дошка задач — це Telegram. Доказ знайдено: 5 735 повідомлень, жодного трекера; дата запуску, грант і виміряна скарга розчинились однаково.

ніде не записанані — у каналу немає стану
S4

Архітектурну дисципліну задає фронтенд. Доказ знайдено: межі FSD як помилки CI, два ADR, harness на 426 рядків, запінені скіли.

ратифікована у frontend_v2/CLAUDE.md і рамках CIтак — найкраще працююча стратегія проєкту
S5

Backend-контекст живе в приватній пам'яті агента розробника. Доказ стейкхолдер: кореневого CLAUDE.md чи AGENTS.md немає; на весь репозиторій два harness-артефакти, обидва фронтендові.

ніде не записанані — знання не кумулятивне
S6

Коли впровадження буксує — переписуємо. Доказ знайдено: v1→v2 з лютого 2026, хвиля 70/44/35 комітів на місяць, переробка моделі матеріалів у липні 2026. З вересня 2026 — переписування мобільного застосунку, тоді як запуску на фабриці так і не було стейкхолдер.

ніде не записана, але приписова на практиціпродукує якість, не продукує запуск
S7

Продуктову обіцянку ніхто не тримає. Доказ знайдено: петля провалилась у серпні 2025, не перевірялась відтоді, резервний шлях виріс поруч, а письмового сліду рішення про це немає припущено.

за умовчанням — через відсутність рішенняні

Рядки оцінюють одне одного. S4дисципліну задає фронтенд — найздоровіша стратегія проєкту — існує тому, що одна людина взяла її на себе; S5backend-контекст у приватній пам'яті є її дзеркальною відсутністю на іншому боці тієї ж кодової бази. А S2відомий провал тесту — норма є тим, що робить S1якість добровільна марною: чудовий набір тестів, який ніщо не запускає, захищає рівно нікого.

Першопричини

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

RC1 — Скарзі власника нема куди потрапити

Роль дошки задач виконує Telegram-канал, у якого немає стану знайдено: сказане в ньому не має власника, дати й способу перевірити виконання. Три однакові випадки: дата запуску (листопад 2024) — відповіді не було жодного разу; виміряна вартість входу (грудень 2024) — реакція через вісімнадцять місяців і не та, що просили; грант на 100 тис. USD (грудень 2025) — тред прожив тиждень.

Що це гарантує: кожен сигнал про вартість чи збій розчиняється в чаті і повертається хіба що повторною скаргою

RC2 — Немає відповідального за інженерну машину і за послідовність робіт

Власник не має технічної експертизи, BE-розробник за власним визнанням не бере на себе лідерство і покращення машини, FE-розробник здатність має, мандату не має, а глибокої BE-експертизи не має теж. Коли ззовні ніхто не задає порядок денний, кожен інженер робить те, що вміє добре. Обидва вміють добре інженерію. Тому проєкт виробляє інженерію.

Що це гарантує: пріоритет задає смак виконавця, а рішення про запуск не ухвалює ніхто

RC3 — Сигнал є, але він нічого не коштує

rspec не запускається в CI взагалі; сім падінь rspec відомі, задокументовані і не позначені навіть як skip; покриття не записується. Рамки безпеки і гігієни залежностей відсутні повністю: ні brakeman, ні bundler-audit, ні Dependabot знайдено.

Справа не в тому, що поломку не видно. Її бачать: розробники знали про падіння, назвали їх і залишили стейкхолдер. Справа в тому, що ігнорування нічого не коштує. Червоний білд, який нічого не блокує, є повідомленням, а не обмеженням, а повідомлення можна перетерпіти.

Що це гарантує: відомий дефект може жити місяцями як прийнятний стан, бо ігнорувати його безплатно

RC4 — Обіцянку не перевіряють і не знімають

Петлю «друк → скан → робота» перевіряли один раз, у серпні 2025, і вона провалилась. Її не полагодили публічно і не зняли. Натомість резервний шлях, де адміністратор вводить дані у вебі, отримав повноцінну розробку і сім e2e-специфікацій. Продукт перейшов від керування в реальному часі до обліку постфактум, і в доступних матеріалах немає сліду рішення про це припущено. Аудит бачив лише чат і репозиторій; команда зустрічається в офісі, тож рішення могло бути ухвалене усно і просто ніде не записане. Твердим є тільки те, що письмового сліду немає.

Що це гарантує: ключове ціннісне твердження продукту лишається неперевіреним нескінченно, а продукт тихо змінює природу

RC5 — Вхід у систему коштує дорожче, ніж вихід із неї

Щоб дійти до першого крою, треба створити чотирнадцять сутностей поспіль. Цей ланцюг записаний власним кодом проєкту, у cutPrereqs.ts. знайдено Заповнення однієї специфікації з 18 позицій власник виміряв у 30 хвилин. Жодного механізму масового завантаження немає: ні гема для CSV чи XLSX, ні маршруту імпорту, ні seed-даних, крім трьох логінів розробників. знайдено

У вересні 2026 бар'єр проявився в другій, тоншій формі. Запуск зупинився не на тому, скільки хвилин забирає специфікація, а на рішенні, як згрупувати обладнання стейкхолдер. BE-розробник радить власникові не перейматись, бо групування завжди можна поміняти. Але в моделі обслуговування обладнання прив'язане до його підгрупи стейкхолдер, тож перегрупування зачіпає і обслуговування. Власник, який зупиняється на цьому рішенні, поводиться не примхливо, а точно: система робить групування дорогим для зміни виведено. Звідси вимога до онбордингу, якої бракувало: перше завантаження має допускати чернеткову структуру, яку можна переробити без наслідків.

Що це гарантує: кожна спроба впровадження вмирає до того, як принесе вигоду

RC6 — Збій тихий і небезпечний одночасно

Незавершений процес тримає резерв кількості без строку давності й блокує наступну людину на операції; ідемпотентності на створення немає. Трекінгу помилок немає ніде. На фабриці час до виявлення дорівнює часу простою.

Що це гарантує: фабрика може стати без жодного сигналу, тому відмова від запуску є раціональною поведінкою власника

Реєстр ризиків

Ранжовано за шкодою × ймовірністю × помітністю × вартістю відновлення. Низька помітність піднімає пріоритет: тихий збій небезпечніший за гучний тієї ж сили.

Ця пара координат варта окремої картинки, бо саме вона пояснює порядок нижче. По горизонталі — наскільки ризик імовірний, по вертикалі — чи помітите ви його без того, щоб хтось прийшов і сказав. Небезпечна чверть не верхня, а нижня права: те, що станеться і промовчить.

помітність →
гучні, але малоймовірнігучні й імовірнітихі й малоймовірнітихі й імовірні — найдорожчіR1Конвеєр стає: трекінгу помилок немає, сигнал приходить від людиниR3Петля скану: помітність нульова до першого дня в цехуR6Мобільний застосунок: аудит його не бачив, імовірність невідомаR4Гроші: квитанції видно, справжній рахунок — у таблиці власникаR5Власник зупинився на введенні даних: справдилось у вересні 2026R2Відхід розробника: знижено переписуванням мобільного, а не домовленістю
ймовірність →
  1. R1Конвеєр стає: трекінгу помилок немає, сигнал приходить від людини
  2. R3Петля скану: помітність нульова до першого дня в цеху
  3. R6Мобільний застосунок: аудит його не бачив, імовірність невідома
  4. R4Гроші: квитанції видно, справжній рахунок — у таблиці власника
  5. R5Власник зупинився на введенні даних: справдилось у вересні 2026
  6. R2Відхід розробника: знижено переписуванням мобільного, а не домовленістю
Шість ризиків: імовірність проти помітності. Позиції оцінені з опису кожного ризику в реєстрі нижче, не виміряні.

R1 — Конвеєр стає, і ніхто не дізнається

Якщо станеться: Незавершений процес блокує операцію для наступної робітниці; або подвійний скан з'їдає резерв. Лінія стоїть.

Імовірність: висока в перший же тиждень реальної роботи — обидва сценарії вже траплялись у 2025

Чи помітимо? практично нульова: трекінгу помилок немає, логи Heroku живуть буфером на ~1 500 рядків без пошуку, єдиний надійний канал сигналу — власник пише в Telegram

Вартість відновлення: висока: простій цеху і невиплачена відрядна робота; довіру після цього повертати дорожче, ніж вибудовувати

Що змінило б мою думку: алерт спрацював на штучно заблокованому процесі й був помічений раніше, ніж про це повідомила людина

R2 — Єдиний носій знань і єдиний кандидат у лідери йде

Якщо станеться: FE-розробник, який побудував CI, ADR, PRD, e2e, harness, обидва фронтенди і мобільний застосунок, залишає проєкт.

Імовірність: знижена, але не знята: для FE-розробника проєкт — повна зайнятість, і питання 2026-07-30 про пошук роботи виникло саме через брак задач; з вересня 2026 він переписує мобільний застосунок. Завантаження дала нова переробка, а не домовленість, тож ризик повернеться разом із її завершенням

Чи помітимо? висока — про це вже сказано вголос; це рідкісний випадок гучного ризику

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

Що змінило б мою думку: письмова домовленість про завантаження і термін, або передані у репозиторій контекст і доступи

R3 — Петля скану досі не працює, і це з'ясується вже після онбордингу

Якщо станеться: Дані завантажили, фабрику підняли, і виявляється, що п'ять серпневих збоїв або частина з них живі.

Імовірність: невідома і саме тому небезпечна: репозиторій мобільного застосунку аудиту недоступний

Чи помітимо? нульова до першого дня в цеху

Вартість відновлення: висока: витрачений онбординг і другий провал довіри власника після дворічної паузи

Що змінило б мою думку: прогін петлі на двох робітницях у реальну зміну з нульовою кількістю збоїв

R4 — Гроші закінчаться раніше за запуск

Якщо станеться: Власник припиняє фінансування або воно падає нижче порога, за якого двоє розробників лишаються в проєкті.

Імовірність: середня: суми коливаються, є розрив у виплатах на п'ять місяців, є величина невиплаченого

Чи помітимо? середня — квитанції видно, але справжній рахунок ведеться в таблиці, недоступній аудиту

Вартість відновлення: висока: без FE-розробника проєкт втрачає і машину, і мобільний застосунок

Що змінило б мою думку: пряма відповідь власника на питання, скільки місяців він готовий фінансувати і що станеться далі

R5 — Власник знову зупиняється на введенні даних

Якщо станеться: Пілот призначено, але наповнення довідників знову впирається у 30 хвилин на специфікацію, і спроба згасає, як у 2024 і 2026.

Імовірність: справдився: 2026-09-08 запуску на фабриці досі немає, власник зупинився на тому, як згрупувати обладнання; механізму завантаження так само немає

Чи помітимо? висока — це видно за днями мовчання в каналі

Вартість відновлення: середня: втрачений цикл, але дані частково лишаються

Що змінило б мою думку: один виріб повністю завантажено за час, менший за годину сумарної участі власника

R6 — Мобільний застосунок містить невідомі аудиту дефекти

Якщо станеться: Третій клієнт системи, носій обіцянки, не прочитаний жодним рядком.

Імовірність: невідома

Чи помітимо? низька

Вартість відновлення: невідома, і сама невідомість є вартістю

Що змінило б мою думку: аудит репозиторію Mobile тією ж дисципліною, що застосована тут

Реєстр боргів

Ризик може статися; борг оплачується вже зараз, у кожному циклі.

D1 — rspec поза CIорганізаційний і технічний

6 114 прикладів і 95,71% покриття не захищають жодного злиття. знайдено Ціна за цикл: кожна зміна backend іде в main без перевірки, а FE-розробник, який комітить у backend найбільше, робить це власним агентом і без цих рамок.

D3 — Нуль спостережуваностітехнічний

Трекінгу помилок немає взагалі. Логи Heroku дає, але як буфер: Logplex тримає близько 1 500 рядків і не більше тижня, без пошуку й без збереження, доки не підключено drain або аддон веб. Чи підключений він у цьому проєкті, аудит перевірити не міг: доступу до Heroku не було припущено. Алертів немає. Ціна за цикл: кожен дефект коштує стільки, скільки часу мине до скарги людини, а після запуску це буде час простою.

D4 — Дві клієнтські поверхні на дві пари рукстратегічний

Веб v2 і мобільний застосунок. frontend/ сюди більше не рахується: його вивели з експлуатації в липні 2026 знайдено. Ціна за цикл: кожна доменна зміна множиться на дві поверхні, і мобільна з них не має ані рамок CI, ані аудиту.

D8 — Нуль рамок безпеки і гігієни залежностейтехнічний

Ні brakeman, ні bundler-audit, ні Dependabot чи Renovate знайдено.

Що бекенд у CI має: джобу E2E Tests, яка піднімає його в docker і проганяє 303 браузерні сценарії, та окремий воркфлоу, що стежить за номерами міграцій знайдено. Тобто це не порожнеча.

Але склад цієї перевірки однобокий, і варто вимовити вголос, чого саме бракує. Всі 9 099 рядків Ruby, де живе доменна логіка, зарплата і мультитенантність, дивляться в CI очима браузера: 45,56% гілок, щасливі шляхи, жодного статичного аналізу. Набір, який тримає 82,12% гілок, у CI не запускається; на відомі вразливості гемів не дивиться ніхто; про застарілі залежності не повідомляє ніщо. Ціна за цикл: кожне оновлення гема і кожна зміна помилкової гілки йдуть без перевірки.

D5 — Backend-контекст існує лише в приватній пам'яті агентазнаннєвий

Кореневого AGENTS.md чи CLAUDE.md немає. знайдено Наслідок уже спостережуваний: FE-розробник пише backend власним агентом, який не має правил BE-розробника, а BE-розробник не знає про існування e2e-набору, ADR і PRD. Ціна за цикл: кожне рішення, ухвалене одним, невидиме другому.

D6 — Telegram виконує роль дошки задачорганізаційний

5 735 повідомлень без стану, відповідальних і дат знайдено. Ціна за цикл: кожен сигнал від власника фабрик має шанс зникнути, і три найдорожчі вже зникли.

D7 — Резерв кількості без строку давностітехнічний

Незавершений процес блокує операцію, розблокувати може лише адміністратор. знайдено Ціна за цикл нульова, поки нема реальних користувачів, і стрибкоподібно зростає в день запуску — тому цей борг варто закрити до нього, а не після.

Реєстр активів

Активи, які платитимуть у кожному наступному циклі. Актив вважається підтвердженим лише тоді, коли ним справді скористалися повторно, тому проєктні записи позначені окремо.

C1 — Набір backend-тестів: 6 114 прикладів, 95,71% рядків, 82,12% гілокпрацює, але прикриває лише половину змін

Це не сплячий актив: BE-розробник запускає набір регулярно стейкхолдер. Тобто зміни, які пише він, справді перевіряються, і 95,71% покриття роблять свою роботу щодня.

Дірка не в наборі, а в його охопленні. Backend змінює не одна людина, а дві, і більше комітів у нього робить FE-розробник — 1 089 проти 588 знайдено, причому власним агентом, у якого правил BE-розробника немає стейкхолдер. Половина змін у домені йде повз звичку, яка захищає другу половину.

Ця дірка закривається дешевше за будь-яку іншу в звіті, бо закривати майже нічого не треба: CI вже стоїть і працює, у ньому три джоби плюс окремий воркфлоу для міграцій, і одна з тих джоб уже піднімає бекенд у docker заради e2e знайдено. Бракує одної джоби, яка запускає те, що вже написано, на кожен PR PL2main захищений зеленим rspec. Не інструменту, не набору, не культури — джоби.

C2 — 303 e2e-тести у 110 файлах, з інфраструктурою фікстурпідтверджений — набір проходить повністю

Набір живий і підтримується, останній коміт 2026-08-09 знайдено. Прогнаний повністю, він проходить цілком: 303 passed, 0 failed за 10 хвилин знайдено. Він же дає 79,05% покриття backend і 80,72% frontend C8покриття від e2e.

Одна умова лишається невиконаною, і вона не технічна: правка воркфлоу лежить у робочому дереві, не в комітах. Доки її не заллють, у CI набір і далі не доходить до кінця.

C3 — Фікстури e2e як еталонний набір для агентного онбордингупідтверджений — найцінніший актив під B3

6 474 рядки фікстур створюють увесь домен через публічний API, а cutPrereqs.ts записує ланцюг із чотирнадцяти сутностей до першого крою знайдено.

Їхня цінність не в тому, що їх можна запустити на реальних даних — не можна K1фікстури це worker-фікстури Playwright, а не автономний механізм. Вона в тому, що це еталонний набір: відомо-правильний, виконуваний і підтримуваний приклад того, як саме треба створювати кожну сутність, у якому порядку і з якими полями.

Для агента це найдорожчий вид входу. Він дає три речі одразу: зразок для наслідування замість здогадів по 138 моделях; оракул, проти якого можна звіряти власний результат; і захист від протухання, бо фікстури ламаються разом з API і чинять опір мовчазному розходженню.

Саме тому B3агентний онбординг є задачею на тижні, а не на місяці: дослідницьку частину вже виконано і записано кодом.

C4 — Система вже видає повну технологічну карту виробупідтверджений — це вихід системи, а не вхід

PDF-техкарта, яку власник надіслав у чат як «приклад специфікації», — це експорт із самої системи, а не документ фабрики стейкхолдер. Він доводить, що вихідна сторона працює: система видає технологічну карту одного виробу на 21 операцію з окладами, часом, нормами і вартістю, згруповану по цехах знайдено. І принаймні один виріб на момент експорту був заведений у неї повністю виведено.

Чого він не доводить — готовності даних власника. Назви цехів збігаються з довідником дослівно тому, що це той самий довідник. Як виглядають вихідні дані фабрики, аудит не бачив жодного разу: це відкрите питання Q6у якому вигляді й обсязі власник тримає дані.

C8 — e2e дає 79% покриття backend і 81% frontendпідтверджений

Виміряно 2026-08-14 одним прогоном: backend 79,05% рядків (7 193 / 9 099) і 45,56% гілок, frontend 80,72% рядків (21 634 / 26 800) знайдено. Для e2e це високо: 303 браузерні тести ганяють реальні доменні сценарії, а не димові перевірки. Розрив по гілках проти rspec (45,56% проти 82,12%) показує здоровий поділ: e2e йде щасливими шляхами, юніт-специфікації беруть гілки помилок.

C5 — Документація: PRD, user stories, моделі даних, два ADRпідтверджений

Сайт на Next.js, підтримується (оновлення 2026-07-25). знайдено Це знайдено про намір і дизайн, не доказ поведінки, але як носій знання працює.

C6 — Agent harness фронтендупідтверджений

426 рядків CLAUDE.md з правилами, поясненими причинами, запіненими скілами і межами FSD як помилками CI. Найкраще працююча інженерна конструкція проєкту і готовий зразок для кореневого AGENTS.md E8кореневий AGENTS.md для backend.

C7 — Власник як предметний оракулпідтверджений

Диктує модель на рівні специфікації, оперує поняттями 1С, реагує на конкретику охоче й точно. Це рідкісний актив: більшість ERP-проєктів гинуть саме через відсутність такої людини.

Швидкі перемоги

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

#ВиграшЖивить машинуАгент-деньСтатус
E2

Джоба rspec у наявному воркфлоу + карантин семи відомих падінь із issue. Виконує PL2main захищений зеленим rspec.

verification: тести в конвеєрі0.5
E3

Записувати покриття обома наборами, а не лише rspec: SimpleCov у групі :test дає 95,71% від юніт-тестів і 79,05% від e2e (той самий SimpleCov у процесі Puma), vite-plugin-istanbul плюс nyc дають 80,72% фронтенду. Артефакт у CI і Codecov роблять C1набір тестів на 95,71% і C8покриття від e2e видимими команді вперше: сьогодні жодної з цих цифр не бачив ніхто.

verification: планка покриття0.5
E4

Sentry у backend і в обох фронтендах; сорсмапи вже вивантажуються, приймача бракує. Одразу з інтеграцією Sentry → GitHub Issues, бо саме вона робить PL1історія чату конвертується в Issue Tracker повним: машинний сигнал потрапляє в той самий трекер, що й людський. Закриває половину D3нуль спостережуваності.

observability: трекінг помилок0.5
E5

Підключити log drain на Heroku. Зараз логи живуть у Logplex: буфер на ~1 500 рядків і щонайбільше тиждень, без пошуку веб. Drain пересилає кожен рядок у зовнішній сервіс, де він зберігається і шукається, тож розбір збою в цеху перестає означати «відтворіть його ще раз».

observability: структуровані логи0.2
E6

Окрема база для rspec у тестовому стеку — прибирає deadlock, через який набір не стартує штатно.

verification: швидкий зворотний зв'язок0.2
E7

Верхнє поле на етикетці QR — названа розробником причина поганого сканування в серпні 2025.

release safety: якість друку0.1
E8

Кореневий AGENTS.md для backend за зразком frontend_v2/CLAUDE.md: правила, команди, пастки, карта доменів. Закриває D5контекст лише в приватній пам'яті агента.

agent harness: маршрутизація контексту1.0
E10

brakeman і bundler-audit як геми плюс дві джоби в наявному воркфлоу. Закриває половину D8нуль рамок безпеки.

static gates: сканери безпеки0.3
E11

.github/dependabot.yml на два екосистеми (bundler і npm). Друга половина D8нуль рамок безпеки.

dependency hygiene: автоматичні оновлення0.2
E9

Скрипт дампу і відновлення продакшн-бази з перевіркою — передумова будь-якого пілоту на реальних даних.

release safety: перевірені бекапи0.5

Десять записів, сумарно ≈4 агенто-дні. Кожен закриває названий у звіті борг, і жоден не потребує рішення власника. Номер E1 лишається порожнім: та перемога знята, а номери не перевикористовуються, щоб давніші посилання не зʼїхали.

Стратегічні ставки

Ставки оцінено проти прийнятої відповіді на відкрите питання Q4скільки місяців можна фінансувати: припускаємо, що запас часу обмежений і невеликий. Це положення випливає з наявних слідів, а не з заяви; якщо власник відповість інакше, порядок треба перерахувати.

#СтавкаВердиктЩо закриваєЦіна
B1

Зробити збій помітним і безпечним: трекінг помилок, таймаут на резерв незавершеного процесу, ідемпотентність створення процесу, алерт на заблоковану операцію.

РобитиR1конвеєр стає і ніхто не дізнається · RC6збій тихий і небезпечний · D3нуль спостережуваності · D7резерв без строку давності≈1 тиждень
B2

Один виріб, один цех, паралельно з чинним обліком: завантажити виріб із того джерела, яке власник має насправді (Q6формат даних власника), руками або агентом. Критерій готовності вже існує: система має видати техкарту, що збігається з паперовою C4система вже видає техкарту. Далі пройти повний цикл до закритої зміни й нарахованої зарплати, звіряючи з чинним обліком щодня.

РобитиRC4обіцянку не перевіряють і не знімають · RC5вхід дорожчий за вихід · R3петля скану може досі не працювати · R5власник знову зупиниться на введенні≈6 тижнів, з них 2 у цеху
B4

Призначити відповідального за інженерну машину: одна людина відповідає за CI, деплой, спостережуваність і послідовність робіт — із доступами, які це дозволяють. Кандидат один.

РобитиRC2немає відповідального за інженерну машину · R2єдиний носій знань іде · D5контекст у приватній пам'ятіодна розмова + доступи
B3

Агентний онбординг як повторюваний механізм: скіл, що читає вихідні дані власника — у тому форматі, який з'ясує Q6, — і наповнює фабрику через API, ідемпотентно і з сухим прогоном. Навчається на фікстурах e2e як на еталонному наборі C3фікстури як еталонний набір і звіряється проти них.

Чекати на B2RC5вхід дорожчий за вихід · C3фікстури як еталонний набір≈2 тижні після
B5

Мобільний застосунок: або провести аудит тією ж дисципліною, або офіційно визнати веб-режим основним і зняти обіцянку.

ВирішитиR6мобільний застосунок неаудитований · RC4обіцянку не знімають≈3 дні на аудит
B7

Разова консультація QA по наявному набору e2e: чи правильна методологія, яких критичних шляхів бракує. Не наймання — саме зовнішній погляд на те, що вже написано.

Купити разовоC2303 e2e-тести, набір проходить повністю · R3петля скану може досі не працювати · RC4обіцянку не перевіряють і не знімаютькілька годин консультації
B6

Міграція v1→v2 доведена до кінця без цього звіту: збірку v1 прибрали з ланцюга 2026-07-10, сам каталог внесли до .slugignore 2026-07-22.

ЗробленоD4дві клієнтські поверхні

Відбір: три ставки на квартал

Робимо B1зробити збій помітним і безпечним, B2один виріб, паралельний прогін і B4призначити відповідального за інженерну машину.

Чому чекають решта:

B3агентний онбординг як механізм чекає, і це головна зміна порядку відносно вихідної гіпотези. Вектор, заданий автором аудиту, був саме онбординг, і докази його підтверджують сильніше, ніж очікувалось: власник сам виміряв 30 хвилин на специфікацію і сам попросив виправлення. Але дешевий вхід у систему, яка вміє тихо заблокувати роботу і не вміє про це повідомити, лише швидше приводить до незахищеної точки відмови. Спершу безпека, потім вартість входу. При цьому мінімальний онбординг не чекає: він входить усередину B2один виріб, паралельний прогін як завантаження одного виробу. Механізмом він стає після того, як петля довела свою роботу. Тоді його масштабують на асортимент, а не будують наосліп.

B7разова консультація QA по набору e2e — і варто пояснити, чому саме разова, а не наймання. Тестувальника в проєкті немає: власник ним не є, розробники тим більше стейкхолдер. За інших умов рекомендація була б очевидною — узяти QA бодай на кілька годин на тиждень. Тут від цього поки варто утриматися, і не через самі лише гроші:

  • бюджет обмежений і без того R4гроші закінчаться раніше за запуск;
  • покриття автоматичними тестами високе з обох боків (C195,71% від rspec, C879% backend і 81% frontend від e2e), тож найдешевший клас дефектів уже ловить машина;
  • і головне — немає інфраструктури, у якій QA працює. Без issue tracker йому нема куди класти знайдене і нема де бачити стан фічі чи бага D6Telegram як дошка задач. Найняти тестувальника в проєкт без трекера означає завести четвертий потік повідомлень у той самий чат.

Тому корисна саме разова консультація: досвідчений QA дивиться на наявні 303 тести і каже дві речі, яких зсередини не видно — чи правильна методологія і яких критичних шляхів бракує. Набори e2e, написані розробниками, регулярно містять фундаментальні прогалини, очевидні будь-якому тестувальнику й невидимі авторам. Це вписується в бюджет, не потребує трекера і дає найбільше на вкладену годину. Після PL1історія чату конвертується в Issue Tracker питання про постійного QA слід відкрити знову: тоді інфраструктура вже буде.

B5мобільний застосунок: аудит або зняття обіцянки чекає на результат B2паралельний прогін: пілот сам покаже, чи петля жива, і дешевше дізнатися це з цеху, ніж із читання коду.

B6міграція v1→v2 завершена зі списку знято: команда зробила це сама і зробила правильно. Міграція мала названу причину, рамки якості на кожній фазі та явне перемикання продакшну.

Швидкі перемоги в цьому відборі не беруть участі, вони йдуть паралельно пакетом.

Найширше заперечення проти головної ставки

Проти B1зробити збій помітним і безпечним є сильний контраргумент, і його варто назвати: це знову інженерна робота, а проєкт хворий саме на те, що підміняє запуск інженерією. Тиждень на спостережуваність і таймаути виглядає точно так само, як ті вісімнадцять місяців, коли замість авто-пошуку з'явився рефакторинг. Ризик, що B1зробити збій помітним і безпечним розростеться і поглине квартал, реальний.

Чому ставка все одно лишається першою: її обмежує не обсяг, а дата. Вона існує тільки як передумова B2паралельний прогін, і пілот призначається одночасно з її початком, а не після її завершення. Якщо через тиждень пілот не стартував, ставка провалилась незалежно від того, скільки коду написано. Це і є її фальсифікатор.

Друге заперечення сильніше. Можливо, паралельний облік сам знімає ризик R1конвеєр стає і ніхто не дізнається, і тоді B1зробити збій помітним і безпечним до пілоту не потрібна. Почасти це правда: він справді робить збій нефатальним. Але він не робить його видимим. Без трекінгу помилок команда дізнається про дефект від власника наступного дня, і на двотижневому пілоті цикл виправлення зʼїсть половину вікна.

Пріоритети інвестицій

Зараз (тижні)
Наступний квартал
Горизонт 2
Безпека і машинапередумова всього іншого
Швидкі перемоги E2‑E11 (≈4 дні)
B1 — збій помітний і безпечний
B4 — відповідальний за машину
Запускєдине, що змінює становище
Дата пілоту
B2 — пілот на одному виробі (6 тижнів)
Друга фабрика
Перший зовнішній клієнт
Вартість входу
B3 — агентний онбординг
Онбординг як частина продукту
Клієнти
B5 — рішення щодо мобільного
Гроші
Самореєстрація і білінг
Трек гранту

Послідовність тут важливіша за склад: зробити збій безпечним → довести петлю на людях → здешевити вхід → масштабувати. Кожен крок робить наступний можливим, і жоден не має сенсу поперед свого попередника.

Стратегія еволюції

Дві здатності, на які спирається стратегія, варто розмістити на осі дозрівання, бо від їхнього дрейфу залежить вибір «будувати чи чекати».

Вилучення даних із документів — з custom у product і далі до commodity, швидко веб. Ринок уже пропонує готові рішення (OneSchema, Unstract, Spreadsheet Agent від LlamaIndex). Висновок для B3агентний онбординг: не будувати парсер. Кастомною лишається лише частина «відобразити на модель SaaS ERP», і вона кастомною й залишиться, бо схема тут власна.

Спостережуваність — давно commodity. Будувати щось своє тут було б класичною помилкою «Build на комодиті», тому E4Sentry у backend і фронтенди є покупкою, а не розробкою.

Нормативи часу на швейні операції (GSD і подібні) — product, ліцензійний веб. Але для цього проєкту вони не потрібні: нормативи вже є в голові власника, а для одного виробу вже заведені в систему. Це рідкісний випадок, коли внутрішній актив дорожчий за ринковий.

Ринок: ніша зайнята, і зайнята міцніше, ніж здавалося

Оскільки метою є продаж зовнішнім клієнтам, варто сказати, у що цей продукт виходить. Нижче — веб-огляд від 2026-08-14 веб. Це не замовлене дослідження ринку: цифри взяті з публічних джерел і сайтів самих вендорів, тобто частина з них є маркетингом, а не виміряним результатом.

Світові гравці, побудовані під ту саму задачу

Найближчий конкурент робить рівно те, що обіцяє SaaS ERP. Scan ERP позиціонується на малі й середні CMT-фабрики (20–500 операторів) і будується навколо партій, операцій, відрядної оплати та QR-сканування. Ціна публічна і низька: $5 за машину на місяць або $0,001 за відстежену одиницю, що дешевше, без плати за користувачів і з необмеженою кількістю операторів; впровадження — два тижні веб. Для фабрики на 50 машин це близько $250 на місяць.

Поруч ширший ряд: WFX Cloud ERP (середній сегмент, ціна лише за запитом), Kladana (від $5 на місяць, є безкоштовний план), Datatex, MRPeasy, відкритий ERPNext, а зверху Infor CloudSuite Fashion і NetSuite у складанні під cut-make-trim. Для порівняння, впровадження SAP S/4HANA чи Oracle у цій галузі коштує від $50 тис. і триває 6–12 місяців веб.

Сам ринок росте: ПЗ для дизайну і виробництва одягу оцінюють у $2,95 млрд у 2026 році з CAGR близько 11%, а сегмент apparel management — у $2,25 млрд у 2025 з прогнозом $4,36 млрд до 2034 веб.

Український контекст: хто вже стоїть у цій ніші

Локальне галузеве рішення існує, воно зріле і воно не порожнє. «Швейка 8» веде повний цикл від техкарти до продажу, має робоче місце технолога, три режими розцінки операцій, завдання на розкрій, передачу в цех і розподіл між швачками — тобто буквально предметне ядро SaaS ERP. Постачальник заявляє понад 550 українських підприємств серед користувачів веб.

Два уточнення, які варто було зробити раніше, бо вони прибирають дві уявні переваги SaaS ERP.

Перше: цехове сканування там уже є. Сторінка продукту описує це прямо — «штрихкодування техоперацій є у готовому рішенні і найчастіше використовується на виробництвах, де фіксація виконання операції проходить у момент виконання операції» веб. Це та сама петля, яку SaaS ERP обіцяє мобільним застосунком: працівник фіксує операцію в момент її виконання. Отже мобільна петля R3петля скану може досі не працювати не є відмінністю — це очікуваний елемент, який у конкурента відвантажений, а в SaaS ERP непідтверджений.

Друге: онбординг там продуктизований і платний. Він називається «Примірка» і виглядає так: 2 місяці, 10 годин навчання за 6–7 віддалених записаних сесій, 11 000 грн — з порожньою базою на сервері клієнта, побудовою схеми обліку разом із ним і наскрізним прикладом на його власних даних. Оплата зараховується в рахунок покупки: повністю від 10 робочих місць, наполовину від 3 до 9 веб.

Ціна самого продукту: «Швейка 8» коштує 13 500 грн, але купується тільки спільно з «BAS Малий бізнес» за 15 600 грн, разом 29 100 грн за одне робоче місце веб.

Що таке BAS і чому заборона діє слабше, ніж хотілося б

BAS — це набір конфігурацій на платформі BAF (Business Automation Framework) польської компанії NetHelp, що зʼявилася 2018 року і яку описують як «наближення до платформи 1С для українського ринку». Системи, що стояли на 1С:Підприємство, після 2021 масово перейшли на BAF і взяли назву BAS веб. Тобто BAS створювався саме як зʼїзд із 1С — і саме тому переїзд туди дешевий: та сама парадигма, ті самі інтегратори, та сама звичка бухгалтера, готові інструменти перенесення довідників і залишків.

Далі цей зʼїзд сам потрапив під заборону. Хронологія: санкції РНБО проти продуктів BAS ще у 2020; квітень 2023 — санкції проти 1С на десять років, до 2033; 18 липня 2025 — законопроєкт №13505 про заборону ворожих програмних продуктів зі штрафами до 2% річного обороту; 9 січня 2026 Держспецзвʼязку опублікувала перелік забороненого ПЗ, і до кінця місяця в ньому було близько 27 продуктів на BAF, включно з BAS ERP і BAS Бухгалтерія КОРП. Підстава — «технологічна спорідненість» із 1С веб.

І тут межу треба тримати чітко, бо від неї залежить, чи є взагалі вікно. Заборона стосується держсектора і критичної інфраструктури, а не будь-якого приватного підприємства. Приватна швейна фабрика під неї не підпадає. Законопроєкт №13505, який поширив би штрафи ширше, зареєстровано, але не ухвалено веб. Тобто юридичного примусу, який виштовхнув би фабрику зі «Швейки 8», сьогодні немає — є репутаційний і регуляторний фон.

Є ще один поворот, який працює проти нас. Перенесення з 1С проходить гладко на типових конфігураціях, а ламається на доопрацьованих і галузевих веб. «Швейка 8» — рівно такий випадок. Це означає, що фабрика на ній прикута до неї не тільки звичкою, а й вартістю виходу — і цей замок тримає її від переходу куди завгодно, включно з SaaS ERP. Липкість працює на того, хто вже всередині.

Стан самої галузі

Вона стискається, але переорієнтовується. Зайнятість у легкій промисловості впала зі 133 тисяч у 2019 до 91 тисячі у 2025; від 2022 року 128 підприємств релокувалися до Закарпаття; виробники скаржаться на зростання цін на електроенергію, паливо і сировину. Водночас галузева асоціація описує стратегію як «стати ательє Європи», тобто рух у контрактне виробництво на європейські бренди веб.

«Швейка 8» заявляє понад 550 українських підприємств, має штрихкодування техоперацій у готовому рішенні і продуктизований платний онбординг «Примірка» (2 місяці, 11 000 грн, зараховується в покупку). Мобільна петля в цеху — не відмінність SaaS ERP, а очікуваний елемент, який у конкурента відвантажений, а тут непідтверджений.

Перелік забороненого ПЗ від 9 січня 2026 стосується держсектора і критичної інфраструктури; законопроєкт №13505 зі штрафами не ухвалено. Водночас BAF проєктувався як наближення до 1С, тож переїзд 1С → BAS дешевший за переїзд 1С → SaaS ERP, і хвиля міграції тече переважно туди.

Що з цього випливає для стратегії

Ніша зайнята не платформою, а впровадженнями. Конкурента тримають у ній 550 підприємств, дилерська мережа і відвантажена функціональність, а не технологія, на якій він побудований. Тому зміна статусу цієї технології сама собою нічого не звільняє: заборона не поширюється на приватну фабрику, а навіть якби поширювалася, найдешевшим виходом для неї лишався б інший продукт на BAF, а не SaaS ERP.

Ціна задана ринком, і вона низька. $5 за машину на місяць у Scan ERP і 29 100 грн разово за робоче місце у «Швейки 8» означають, що юніт-економіка SaaS ERP мусить зійтися при кількох сотнях доларів на фабрику на місяць.

А ось тут — несподіване і найкорисніше з усього розділу. Конкурент, що працює в цій ніші роками, витрачає на онбординг два місяці й бере за це гроші. Ринок, отже, не вважає довгий онбординг вадою: він вважає його послугою. Це прямо коригує RC5вхід дорожчий за вихід. Проблема SaaS ERP не в тому, що онбординг довгий — за галузевою міркою він нормальний. Проблема в тому, що він не має ані визначеного кінця, ані ціни, ані перевірки придатності: у «Примірці» є порожня база, шість сесій, наскрізний приклад на даних клієнта і дата, коли все закінчується. У SaaS ERP немає жодного з цих чотирьох елементів.

Це змінює зміст B3агентний онбординг як повторюваний механізм. Ставка лишається, але її мета інша: не «звести онбординг до нуля», а зробити його обмеженим, вимірюваним і продаваним. Агент тут скорочує частину роботи, а не скасовує процес — і навіть скорочений процес потребує наскрізного прикладу на даних клієнта, бо саме він є перевіркою придатності й джерелом зворотного звʼязку.

Чим тоді відрізнятися. Чесно: перевіреної відмінності немає жодної. Кандидати, які лишилися після цього розділу, — вебдоставка й відсутність серверної інсталяції проти настільного клієнта на чужій платформі, і відсутність плати за робоче місце. Обидва є гіпотезами про цінність для покупця, якого ніхто не питав.

Куди має цілитися агентний онбординг

Дотепер B3агентний онбординг як повторюваний механізм описувався як розбір того, що фабрика тримає в себе: Excel, зошити, PDF-техкарти. Цей розділ дає підстави замінити цільове джерело, і заміна міняє характер ставки.

Реалістичний зовнішній клієнт SaaS ERP — це не фабрика, яка нічого не автоматизувала. Це фабрика, яка вже сидить на «Швейці 8»: у ніші 550 таких, у них уже є структуровані дані, і в них уже є привід озирнутися. Тому агентний онбординг варто проєктувати з дугою «міграція зі „Швейки 8“», а не «розбір паперу».

Різниця не косметична — вона в тому, чи є ця робота одноразовою, чи повторюваною:

дуга джерело скільки разів працює одна робота
розбір паперу Excel, зошити, PDF — у кожної фабрики свої щоразу заново: форма інша
міграція зі «Швейки 8» одна схема, однакова на всіх інсталяціях один раз відображення, далі повторно

Саме тут агент дає непропорційну користь. Структури даних платформи 1С/BAF відомі своєю непрозорістю: фізичні таблиці мають технічні імена на кшталт SC327 і SP330, службові поля перемішані з бізнесовими, документ складається із шапки й кількох табличних частин веб. Людині писати такий імпортер довго й нудно; агентові — це рівно та задача, яку він робить добре: дослідити схему, побудувати відображення, показати результат на наскрізному прикладі. І, на відміну від розбору PDF, це відображення пишеться один раз на всю нішу.

Побічний ефект, який варто назвати окремо: така дуга дає SaaS ERP перевірку придатності, якої йому бракує. Мігрована база — це чужі дані, чужі назви операцій, чужі розцінки. Вона одразу показує, де модель SaaS ERP не сходиться з тим, як галузь насправді веде облік.

Що потрібно, щоб цю дугу взагалі почати

Один зразок бази «Швейки 8» — демо, копія від знайомої фабрики або власна інсталяція. Без нього дуга лишається планом на папері, бо схему не можна досліджувати за описом із сайту. Це найдешевша дія з усіх, які цей розділ пропонує, і водночас та, без якої решта не рушить.

Чого цей огляд не встановив

Чи є у «Швейки 8» справжній мобільний застосунок, чи штрихкодування працює через настільне робоче місце й сканер; наскільки болісною фабрики вважають привʼязку до BAS; чи присутні Scan ERP, Kladana чи WFX в Україні; скільки з двох фабрик власника вже щось використовують; і головне — чи готовий хтось платити. Усе це вимагає розмов із ринком, а не пошуку. Перед рішенням про позиціонування ці питання дорожчі за будь-яку технічну ставку в цьому звіті.

Куди це веде: дві фабрики, продуктизація, зовнішні клієнти

Кінцева мета власника ширша за запуск: вийти на обидві свої фабрики, продуктизувати систему і продавати її як SaaS реальним клієнтам стейкхолдер. Це змінює вагу однієї зі ставок, тому варто сказати прямо.

Що для цього вже є. Мультитенантність не декларативна, а робоча: 45 із 114 моделей несуть multi_tenant, тенант ставиться з current_user.company на кожен запит у base_controller, а створення компанії тягне за собою after_create, які засівають типові права, одиниці виміру й системний тип матеріалу «Тканини» знайдено. Тобто ізоляція даних і базовий провіженинг нового клієнта вже написані — це рідкість для проєкту, який ще не запустився.

Чого немає. Самореєстрації: створення компанії закрите перевіркою superuser_check знайдено. Білінгу, тарифів і всього, що робить SaaS бізнесом, у коді немає взагалі.

Головний наслідок, і він міняє пріоритет. У моделі «одна власна фабрика» вартість наповнення даними є разовою перешкодою на шляху до запуску. У моделі SaaS вона стає юніт-економікою кожного клієнта: 30 хвилин на специфікацію множаться на асортимент кожної нової фабрики, і платить за це або клієнт своїм часом, або власник своїм. Те, що зараз виглядає як внутрішній інструмент B3агентний онбординг, у цій рамці є частиною продукту, і саме тією, від якої залежить, скільки коштує підключити наступного клієнта.

Тому послідовність із розділу пріоритетів не змінюється, а подовжується: безпечний збій → доведена петля на одному виробі → дешевий вхід → друга фабрика як перша перевірка на повторюваність → зовнішній клієнт. Друга фабрика тут цінна не обсягом, а тим, що вона перший випадок, коли онбординг доводиться робити вдруге — і саме там стане видно, чи він механізм, чи ручна робота, яку одного разу зробили ентузіазмом.

Лог рішень

K1 · rev. 1 · замінено

Фікстури e2e є готовим рушієм онбордингу, що здешевлює головну ставку на порядок

Заперечення автора аудиту перевірене й підтверджене: 22 з 26 файлів фікстур імпортують @playwright/test, створення тенанта йде через ендпоінт, закритий if Rails.env.test?, Date.now() вжито 60+ разів для унікалізації, шару відображення з документа немає. Це worker-фікстури Playwright, а не автономний механізм.

Але звуження оцінки в першій редакції теж було хибним, у протилежний бік. «Не рушій» не означає «мало користі». Фікстури є еталонним набором: відомо правильним, виконуваним і підтримуваним прикладом створення кожної сутності в потрібному порядку. Для агента це найдорожчий вид входу — зразок, оракул для самоперевірки і захист від протухання в одному C3фікстури як еталонний набір.

Тобто правильне формулювання не «зроблено третину», а: непридатне як механізм, найцінніше як еталон. Саме тому B3агентний онбординг лишається задачею на тижні.

K2 · rev. 1 · замінено

Покриття тестами відсутнє, як зазначено у вихідних передумовах

Уточнення автора аудиту: передумова була про запис покриття, не про його наявність. Вона вірна — simplecov немає в Gemfile, артефакт не генерується, Codecov не підключений. Вимір 95,71% отримано інструментуванням, якого в проєкті ніколи не існувало, тож команда цієї цифри не бачила. Твердження переформульоване: актив високої якості, невидимий і не підключений до рамок.

K3 · rev. 1 · чинне

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

K4 · rev. 1 · чинне

Вихідний вектор цього аудиту — «тертя онбордингу і є причиною незапуску» — задав його автор. Це його теза, а не позиція, задокументована десь у проєкті, і не висновок, до якого аудит дійшов сам.

Я спробував її спростувати: якщо тертя справді головне, чому ніхто не пробував бодай ручний пілот на один виріб? Спроба провалилась, і провал зафіксовано тут. 2024-12-17 власник фабрик сам виміряв 30 хвилин на специфікацію з 18 позицій і попросив конкретне виправлення знайдено. Тобто теза мала під собою вимір, зроблений двадцять місяців тому людиною, яка мала ним користуватися.

Різниця, яку варто тримати: вектор задав автор аудиту, а підтвердив його власник фабрик, і це два незалежні джерела. Якби було лише перше, теза лишилась би гіпотезою людини поруч із проєктом.

K5 · rev. 1 · чинне

Ризик R1конвеєр стає і ніхто не дізнається поставлено вище за тертя онбордингу після того, як замовник назвав фабричну рамку: збій тут коштує простою лінії, а не незручності. Це також переоцінює дворічну відмову власника від запуску як раціональну поведінку за відсутності запобіжника, а не як інерцію.

K6 · rev. 2 · замінено

Два живі фронтенди, і старший досі отримує фічі; ставка B6 — призначити дату, після якої frontend v1 не отримує фіч

Живий фронтенд один. .slugignore називає frontend/ виведеним з експлуатації і пояснює чому: збірку v1 прибрали з ланцюга 2026-07-10, сам каталог внесли до .slugignore 2026-07-22, а в public/ немає index.html, тож location / не має що віддавати. Помилка була в тому, що я взяв дату останнього коміту (2026-06-17, справжня фіча) за ознаку живого фронтенду, не перевіривши, чи він розгортається. Наслідки: D4дві клієнтські поверхні звужено з трьох поверхонь до двох, ставку B6міграція v1→v2 завершена знято як виконану до початку аудиту.

Це також пом'якшує читання «теплої ванни»: команда не лише почала міграцію, а й довела її до перемикання продакшну. Варто зафіксувати напрямок помилок цього аудиту: покриття тестами, наявність CI і тепер завершена міграція — усі три рази помилка була на користь суворішої оцінки, ніж заслуговує проєкт.

K7 · rev. 3 · замінено

Сім падінь rspec — усі в одному кластері, впираються в AWS-креденшели; це середовищні падіння, а не регресії домену

Відтворено в ізоляції: падіння реальні, і лише одне справді середовищне (Aws::CloudFront::CookieSigner без ключа). Решта шість — розбіжність специфікацій із кодом (специфікація мокає Video#purge, якого модель не має; чекає поля title і status, яких блупринт не віддає) і одна жива регресія: створення користувача не видає токен скидання, бо after_create із запрошенням закоментовано з 2026-04-01.

Тут я помилився в бік поблажливості, а не суворості — на відміну від трьох попередніх випадків. Це варто зафіксувати саме тому: напрямок помилок не є законом, і кожну оцінку треба перевіряти окремо.

K8 · rev. 3 · замінено

Набір тестів повідомляв про регресію чотири місяці, і ніхто не почув, бо rspec не запускається в CI

Сигнал чули. Розробники знали про падіння, задокументували їх і не полагодили; специфікації навіть не позначені як skip стейкхолдер. Механізм не в детектуванні, а в ціні: ігнорування нічого не коштує. Це переносить вагу з RC3сигнал є, але він нічого не коштує на RC1скарга не має адреси і змінює аргумент за PL2main захищений зеленим rspec: рамки потрібні як форсинг-функція, а не як детектор. Сама політика від цього не слабшає.

K9 · rev. 3 · відкликано

QR не друкується на специфікації; найімовірніше це коректна еволюція задуму, але розбіжність ніде не зафіксована

Розбіжності немає. Обіцянка від початку стосувалася маршрутного листа стейкхолдер, і саме він QR несе. Я прочитав англійське слово specification у першому формулюванні буквально і побудував на цьому знахідку там, де задум і код збігаються.

Специфікація QR не має і не потребує: вона шаблон виробу, а не завдання на партію. Решта вузла RC4обіцянку не перевіряють і не знімають не зачеплена — пʼять збоїв петлі в серпні 2025 спостережені прямо в експорті.

K10 · rev. 3 · чинне

Аудит змінив систему, яку описує. 2026-08-14 при першому прогоні e2e проти стека compose падали 28 специфікацій із 303 — усі в модулях cut, floor, production і equipments. Причина: Sidekiq у контейнері api стукав у localhost:6379, де ніхто не слухає, бо Redis є окремим сервісом compose. Після виправлення: 86 passed на тих самих модулях і 303 passed, 0 failed на повному наборі знайдено.

Одну річ це залишає нез'ясованою, і чесніше назвати її, ніж домалювати пояснення. .env.test, який CI генерує сам, теж не містить REDIS_URL знайдено, тобто конфігурація там була та сама. Проте джоба e2e ніколи не була червоною стейкхолдер. Чому однакова конфігурація дала різний результат, аудит сказати не може: історія запусків GitHub Actions йому недоступна.

Виправлення стоїть у compose/compose-test.yml, поруч із сервісом redis, а не в .env.test. Це навмисно: .env.test не відстежується git-ом і в кожного розробника свій, а в CI його щоразу генерує воркфлоу, тож змінна, яка мусить бути завжди, там завжди й відсутня. У compose вона задається один раз і діє для всіх споживачів цього файлу.

Найгостріше те, що сам compose-test.yml цю поломку передбачає в коментарі («Without it the request 500s with Redis::CannotConnectError during e2e runs»). Сервіс додали, змінну не пробросили.

Правка лежить у робочому дереві, не в комітах.

K11 · rev. 3 · відкликано

У Gemfile дублікат aws-sdk-cloudfront із 2026-05-12; через нього не збирається образ, і саме тому джоба e2e червона три місяці

Дефекту не існує. Це артефакт цього аудиту. Гіпотезу висунув автор аудиту, і перевірка її підтвердила.

Дублікат є рівно на одному ref — локальному main. На origin/main, origin/staging, локальному staging і heroku/main рядок один знайдено. Народився він у мерджі 6ab9f44b9 від 2026-08-12, яким BE-розробник підтягував гілку перед передачею репозиторію. Diff мерджу показує механізм дослівно: кожна сторона мала по одному оголошенню, але на різних рядках — локальна gem "aws-sdk-cloudfront", "~> 1.126", віддалена gem 'aws-sdk-cloudfront', '~> 1'. Git злив обидва без конфлікту, бо текстово вони не перетинались.

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

  • Твердження «збірка образу зламана три місяці» знято повністю. Догори за течією вона збирається.
  • Моє «відтворив падіння CI локально» відтворювало локальний артефакт, а не стан CI. Формально команда була та сама, ref — інший, і саме ref був вирішальним.
  • Локальний прогін e2e падав з іншої причини — відсутній REDIS_URL K1028 із 303 специфікацій падали без REDIS_URL.
  • Правку Gemfile відкочено; у робочому дереві лишається тільки зміна воркфлоу.

Урок методологічний і вартий того, щоб бути записаним: я тричі перевірив вміст файлу і жодного разу — гілку, на якій дивлюся. Репозиторій, переданий для аудиту, не є тим самим, що репозиторій команди, і різницю треба перевіряти першою дією, а не останньою.

K12 · rev. 3 · замінено

Замовник аудиту є BE-розробником проєкту; формулювання «немає дорослого» точне зокрема тому, що автор застосовує його й до себе

Це різні люди. Автор аудиту не є backend-розробником і в проєкті не працює: комітів не має, у робочому каналі не пише знайдено.

Три наслідки, і другий важливіший за саме виправлення:

  1. «Немає дорослого» є оцінкою ззовні, а не самовикриттям. Я двічі писав, що автор застосовує формулювання й до себе, бо він один із трьох у таблиці. Його там немає.
  2. Провенанс user слабший, ніж я його подавав, там, де йдеться про внутрішню кухню. Твердження про звички BE-розробника, про його необізнаність із CI, ADR і PRD — це свідчення спостерігача про іншу людину, а не учасника про себе. Для бізнес-фактів і рамок цього досить; для тверджень про чужі знання і практики це другий рівень, і підтвердити їх може лише сам розробник.
  3. Теза про онбординг має два незалежні джерела: вектор ззовні від автора аудиту і вимір власника фабрик у грудні 2024 RC5вхід дорожчий за вихід. Одного першого було б замало.

K13 · rev. 3 · замінено

Платформа локальних конкурентів заборонена з січня 2026, отже для SaaS ERP відкрилося вікно; міграція з 1С/BAS є продуктовим клином

Огляд ринку спершу прочитано надто оптимістично, і перевірка знесла це прочитання по трьох лініях веб.

Заборона не примушує. Перелік Держспецзвʼязку від 9 січня 2026 стосується держсектора і критичної інфраструктури, а не приватного підприємства. Законопроєкт №13505 зі штрафами зареєстровано, але не ухвалено. Приватна швейна фабрика не зобовʼязана нікуди йти.

Міграція тече не до нас. BAF будувався як наближення до платформи 1С, тож переїзд 1С → BAS дешевший за переїзд куди завгодно ще: та сама парадигма, ті самі інтегратори, готові інструменти перенесення. Ба більше, галузеві конфігурації переносяться найгірше — а отже фабрика на «Швейці 8» прикута вартістю виходу, і цей замок тримає її від переходу в SaaS ERP так само, як від переходу деінде.

Ніша зайнята впровадженнями, а не платформою. У конкурента заявлені 550+ підприємств, дилерська мережа, штрихкодування техоперацій у готовому рішенні і платний продуктизований онбординг. Дві переваги, які звіт приписував SaaS ERP — мобільна петля в цеху й локальність, — виявилися стандартом ніші.

Що з цього вціліло і в якому вигляді: сама дуга міграції лишається, але як напрям для агентного онбордингу, а не як ринковий примус. «Швейка 8» є найкращою мішенню саме тому, що її схема одна на всі інсталяції, тобто робота з відображення пишеться раз на нішу — а не тому, що когось звідти виганяють B3агентний онбординг як повторюваний механізм.

K14 · rev. 4 · чинне

2026-08-19 автор представив звіт BE-розробникові, а 2026-09-08 попросив у нього відгук стейкхолдер. Це перше свідчення зсередини команди, і воно зрушило три записи.

Один факт уточнює термін, а не висновок. Продакшн-середовище існує з самого початку; його базу переписували кілька разів, стейджинг відкрили, вважаючи дані в продакшні вже чистими, а після того їх переписували ще двічі стейкхолдер. Тому «вийти в продакшн» тут не означає запуску. У цьому звіті запуск — це робота фабрики в системі паралельно з чинним обліком, і її досі не було.

Чого розмова не змінила: власника аудит і далі не опитував. У переданій частині розмови BE-розробник заперечує формулювання, а не факти.

Попутно у вступі виправлено дві цифри, що застаріли ще до цієї редакції. Частка «знайдено» була записана як «сім десятих» до того, як розділ про ринок додав 22 веб-твердження; тепер це близько половини. Граф мав «45 вузлів» — число з перших днів аудиту; тепер їх 71. Речення «кожна позначка звірена з вузлами» замінено перевірюваним: позначок 108, а вузлів 71, тож відповідність між ними не взаємно однозначна, і стверджувати її не варто.

Ще дві поправки знайшлися під час перекладу англійською. Рядок колоди для інвентаря стратегій казав «дві стратегії, жодна не записана», тоді як їх сім і одна, S4, ратифікована в CLAUDE.md і рамках CI; рядок я вписав, розставляючи позначки для колоди, і не звірив із самим блоком. І виноска «Чесність цього звіту» досі казала, що всі слова стейкхолдера походять від автора аудиту, — після розмови 2026-09-08 це вже не так.

K15 · rev. 4 · замінено

Техкарта власника (PDF) — готовий табличний вхід для онбордингу: джерело даних існує і вже в руках команди

PDF-техкарта — експорт із самої системи, а не документ фабрики. Виправлення надійшло від автора аудиту 2026-09-19 стейкхолдер.

Механізм помилки варто записати, бо він повторюваний. Назви цехів у файлі дослівно збігалися з довідником системи, і я прочитав цей збіг як ознаку, що модель підходить фабриці. Насправді збіг був наслідком: документ згенерувала та сама система, з того самого довідника. Ідеальна відповідність між «вхідним» документом і власною лексикою системи мала бути червоним прапорцем кругового доказу, а не підтвердженням.

Наслідки:

  1. C4система вже видає техкарту перевернувся з вхідного активу на вихідний. Він доводить, що система вміє видати повну техкарту, і тепер слугує критерієм готовності для B2один виріб, один цех.
  2. У B2один виріб, один цех більше немає готового входу. Виріб доведеться завантажувати з того, що власник має насправді.
  3. Q6у якому вигляді й обсязі власник тримає дані загострилось: зразка вихідних даних власника аудит не бачив жодного разу. Оцінка B3агентний онбординг у два тижні тепер спирається на формат, якого ніхто не знає.
  4. Сама ідея, що справжні специфікації фабрики — це водночас корм для онбордингу і дешева перевірка придатності моделі, лишається правильною. Хибним був лише приклад, на якому вона стояла.

Пре-мортем

Рік потому план не спрацював. Ось як — від найімовірнішого.

P1 — Пілот призначили, і власник знову не почав

Ранній сигнал: Два тижні тиші в каналі після дати старту; питання власника зміщуються на нові фічі

Що робити: Дата пілоту призначається одночасно з початком B1, а не після її завершення; перший день пілоту не потребує від власника нічого, крім присутності — завантаження одного виробу робить розробник або агент

P2 — FE-розробник пішов посеред пілотуНайдорожчий сценарій: із ним іде CI, harness, обидва фронтенди і мобільний застосунок

Ранній сигнал: Повторне питання про завантаження або про пошук роботи; падіння темпу комітів нижче звичного тижневого рівня

Що робити: B4 (відповідальний за інженерну машину) робиться першою, з доступами; E8 (кореневий AGENTS.md) виносить контекст із приватної пам'яті в репозиторій; письмова домовленість про завантаження на строк пілоту

P3 — Онбординг зробили першим, петля не запрацювала

Ранній сигнал: Розмови про парсер техкарт починаються раніше, ніж призначено дату пілоту

Що робити: Порядок зафіксований у K3 і в PL4 (розподіл 70/30): робота на онбординг як механізм не починається, доки не закрито зміну на реальній фабриці

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

Ранній сигнал: Через місяць після ухвалення жодна політика не була жодного разу застосована

Що робити: Дві політики з шести підняті на детерміністичну сходинку і не потребують волі; решта мають названу дату перегляду, і незастосована політика на перегляді визнається дорогим експериментом, а не продовжується

P5 — Гроші закінчились посеред пілоту

Ранній сигнал: Пропущена квитанція; зростання величини невиплаченого в таблиці

Що робити: Питання Q4 (скільки місяців власник готовий фінансувати) задається власнику до старту, а не після; обсяг пілоту (один виріб, один цех, шість тижнів) обраний так, щоб уміститися в найкоротший правдоподібний запас

Список спостереження

датащо перевіритихто
2026-09-13PL2main захищений зеленим rspec: чи рамки увімкнені й чи хоч раз зупинили злиттятехнічний відповідальний (B4призначити відповідального за інженерну машину)
2026-09-13Швидкі перемоги E2джоба rspec у CIE11dependabot на обидві екосистеми: що відвантажено, що перевищило свій день і що саме чинило опіртехнічний відповідальний
2026-10-13PL3пілот лише паралельно з чинним обліком і PL5обіцянка має власника і дату: чи стартував пілот, чи зведено щоденну розбіжністьвласник бізнесу
2026-10-13PL470% потужності на запуск: у якій колонці фактично була роботавласник бізнесу
2026-11-13PL1історія чату конвертується в Issue Tracker: скільки скарг стало issue і скільки з них закритотехнічний відповідальний
2026-11-13C1набір тестів на 95,71% і C2303 e2e-тести: чи перейшли з проєктних у підтвердженітехнічний відповідальний
2027-02-13PL6переписування з датою виходу: переписування мобільного застосунку почалося у вересні 2026 — чи записані його причина, критерій виходу і дататехнічний відповідальний

Чого ми не знаємо

Впорядковано за впливом на рішення: перше питання рухає найбільше.

Q6у якому вигляді й обсязі власник тримає дані — у якому вигляді й у якому обсязі власник тримає свої дані. Це визначає, чи B3агентний онбординг є двома тижнями роботи чи продуктовим модулем. Потрібні числа: скільки виробів в активному асортименті на кожній фабриці, скільки операцій на виріб, скільки працівників і машин. І формат: техкарти — це Excel, 1С, PDF чи папір? Єдиний зразок, який мав аудит, виявився експортом із самої системи стейкхолдер, тож зразка вихідних даних власника в аудиту немає зовсім. За 27 місяців у чат не надіслали жодного файлу Excel, тож припущення про «книги в Excel» досі неперевірене припущено, і найдорожче з усього неперевіреного.

Q8чи полагоджено петлю скану і чи перевіряли на людях — чи полагоджено петлю скану і чи проганяли її на людях після серпня 2025. Рухає R3петля може досі не працювати з невідомої в низьку або високу. Аудит відповісти не може: репозиторію мобільного застосунку на машині немає. Це названа межа цього звіту, а не пропуск. З вересня 2026 мобільний застосунок переписують стейкхолдер, тож відповідь стосуватиметься вже нового застосунку — і петлю варто прогнати на людях до того, як переписування оголосять завершеним.

Q4скільки місяців власник готовий фінансувати — скільки місяців власник готовий фінансувати і що станеться далі. Одна ця відповідь визначає, чи рекомендація читається як «послідовно за два квартали», чи як «один цех, один виріб, шість тижнів, і не більше».

Q7чи живий трек стартап-гранту — чи живий трек стартап-гранту. Якщо живий, у запуску з'являються дата й сума ззовні, а зовнішній фальсифікатор із чужим календарем надійніший за внутрішню дисципліну, якої в проєкті бракує.

Де питати. Q6, Q4 і Q7 — безпосередньо у власника, у тій самій Telegram-групі, яка лишається єдиним живим каналом проєкту. Q8 — у FE-розробника, разом із доступом до репозиторію Mobile/.

Чесність цього звіту

Твердження зі слів стейкхолдера стейкхолдер у цьому звіті мають двох авторів. Більшість сказав автор аудиту, який у проєкті не працює; решту, датовану 2026-09-08, — BE-розробник, якому звіт представили 2026-08-19. Власника фабрик, головну дійову особу, аудит не опитував. Це зміщує звіт передбачувано: сильніше видно те, що видно з боку backend, і слабше — комерційний контекст, реальний обсяг даних і те, як власник сам пояснює дві свої зупинки. Одна розмова з ним, найімовірніше, змінила б R4гроші закінчаться раніше за запуск і Q6обсяг і формат даних, і могла б перевернути висновок про порядок ставок, якби виявилось, що петля скану вже полагоджена й перевірена.

ТАКОЖ ЯК — презентація · markdown · json-ld