SaaS өлді ме? Мен Discord пен Telegram-ды 24 сағатта қалай қайталадым

SaaS өлді ме? Мен Discord пен Telegram-ды 24 сағатта қалай қайталадым

25 қыркүйекте сағат 22:35-те мен бірінші промптты жібердім. Бұл бірде-бір үтірі жоқ мәтін қабырғасы еді: онда мен Discord тәрізді жұмыс істейтін өнім алу маған қаншалықты маңызды екенін, ондағы чаттардың жасалуы мені ашуландыратынын, сондықтан чатты Telegram-нан алатынымызды және бәрі Zoom-дағыдай нақты жұмыс істеуі керегін түсіндірдім: озық кодектер, тұрақтылық және дыбыс сапасы. Онда дауыс, рөлдер мен құқықтар, экран трансляциясы, PostgreSQL және «жаңғырық мүлдем болмауы керек» де болды. 24 сағаттан кейін, 26 қыркүйектің кешінде 0.3.1 нұсқасы продакшенде тұрды: macOS, Windows және Linux үшін қол қойылған жинақтар, веб-нұсқа және лендинг. Өнімнің аты - Calab, коды GitHub-та ашық. Осы тәулікте мен 90 хабарлама жаздым, оның 29-ы «мынадай қыл» деген жазуы бар скриншоттар ғана. Бір жол код та, өзім іске қосқан бір тест те жоқ. Қалғанының бәрін модельдер жасады. Төменде цифрлар, доллармен есеп, хронология және нейрожелілердің қателескен жерлерінің тізімі, өйткені онсыз бұл тарих тым әдемі көрінеді.

Бір тәулікте нақты не шықты

Calab - командаға арналған self-hosted мессенджер. Дауыспен іске қосу немесе push-to-talk бар дауыс бөлмелері, DTX-і бар Opus, RNNoise және AEC3 жаңғырықты басу, серверлік mute және қатысушыларды бөлмелер арасында сүйреу. Simulcast-ы бар AV1 экран трансляциясы, «үнемдеуден» түпнұсқаға дейінгі пресеттер, бір бөлмеде үш трансляцияға дейін, торы мен PiP-і бар веб-камера. Telegram стиліндегі көпіршіктері бар чат: файлдар, реакциялар, бекітулер, ескертулер, сілтеме превьюі, іздеу, жеке хабарламалар. Кеңістіктер, әр бөлмеге рөлдер мен биттік құқықтар, тіркеусіз сілтеме арқылы қонақтар. Автожаңаруы бар Electron клиенттері, веб және iPhone үшін мобильді веб, төрт тілге локализация. Go сервері, 443 портында TURN/TLS бар LiveKit, Caddy, қатайтылған Docker Compose, таймер бойынша бэкаптар, S3-ке жариялайтын GitHub Actions.

Calab-тың басты экраны: сол жақта қатысушылары бар дауыс бөлмесі, оң жақта хабарламалары мен тіркемелері бар команда арнасы

Бұл формалары бар CRUD емес. Мұнда WebRTC, SFU, кодектер, пернетақтаның нативті хуктары, macOS қол қоюы мен нотаризациясы - әдетте «қиын бөлігі» деп аталатынның бәрі. README-дегі және өнім бетіндегі скриншоттар нағыз, релиз жинағынан алынған.

Бастапқы код жолдары92 972: Go 28 471, TypeScript 60 871, proto 1 362, SQL 1 286, CSS 982. Генерацияланған код пен эталондарсыз
main-дегі коммиттер282, оның 31-і агент бұтақтарының мерждері
Продакшендегі релиздер7: v0.1.0, 0.1.1, 0.2.0, 0.2.1, 0.3.0, 0.3.1, 0.3.2
Тесттернағыз Postgres, Valkey және LiveKit-ке қарсы 60 Go тест файлы, 750+ кейсі бар 92 клиент unit-тесті, 13 e2e-спек, 43 визуалды эталон
Құжаттама37 құжат, 22 архитектуралық шешім (ADR), адамға арналған ~150 қолмен тексеру сценарийі бар TESTING.md
Локализациятөрт тілде 1 186 кілт

Хронология: бірінші қоңырауға дейін бір жарым сағат

22:35 - бірінші промпт. Лид бір сағат кодектер, TURN және жаңғырық туралы оқып, архитектураның 11 құжатын және алғашқы ADR-ларды жазады. Мен екі рет араласамын: «мұндай жоғары битрейт мені алаңдатады» (есептеулерде SFU үшін ең нашар жағдай ретінде 435 Мбит/с тұрды, клиентке келетін типтік трафикке қарсы шектерге қайта жаздық) және «бэкенд Go-да, мүмкіндігінше жеңіл сервер».

Түн ортасына таман - MVP, промпттан кейін бір жарым сағаттан соң. Және бұл жоба қаңқасы емес, медиа-спайк: екі клиент стендтегі SFU арқылы қоңырау шалып, экранды көрсетеді. Біз мұны лидпен екеуміз бірден тексердік, қоңырау жұмыс істеді. Тәуліктің қалған уақыты «жұмыс істейтіндей ету» емес, «өнім жасау» болды.

Түн. Ұйықтар алдында мен лидке жаздым: «Асықпа, қосымшаны жасауға тұтас бір жылың бар. Айтпақшы, айтуды ұмытып кетіппін: мен демалысқа кетемін, сондықтан сұрақ қойма, не қайда екенін өзің шеш». Және ұйықтауға кеттім. Модельге бір жыл қажет болмады. Мен ұйықтап жатқанда сервер, клиент және инфрақұрылым қатар жазылып, кейін кодтың төрт ревью айналымынан және скриншоттар бойынша тәуелсіз UX-ревьюден өтті. Қай домен, бэкаптарды қайда сақтау, жинақтарға қалай қол қою керек екенін ешкім сұраған жоқ, бәрін өздері шешті. Таңға қарай стенд Valkey, бэкаптар, контейнерлерді қатайту және 443-тегі TURN-мен жұмыс істеп тұрды, домендер тіркелген, macOS жинағы GitHub Actions-та қол қойылып, нотаризацияланып жатты, жаңарту фиді S3-те жатты. Шынын айтқанда, бұл тарихтың ең қорқынышты бөлігі: бір түндік «демалыстан» оянасың, ал сенде өзің көтермеген инфрақұрылым және өзің көрмеген өнім бар.

10:00. Ояндым, ноутбукты аштым, ал онда Опустар қатарынан 300-ден астам экранды басып шығатын визуалды тесттерді айналдырып жатыр. Күннің оркестраторға жазылған бірінші хабарламасы өнім туралы емес еді: «Не істеп жатырсың, агенттерің пайдасыз тесттер жүргізіп жатыр, қане, процестерді оңтайландыр, бәрі барынша өнімді жұмыс істеп, токендерді ұшақтай жеп қоймауы керек». Масштаб үшін: $200 жазылым бір түнде апталық лимиттің 30%-ын жоғалтты. Және айту керек, бұл өте жақсы: осы 30% сервер, клиент, стенд және қол қойылған жинақтарды әкелді. Тек одан әрі осылай жағуға болмайтын.

Сол таңның екінші жаңалығы қызығырақ болды. Мен чатты тексеру үшін продты аштым, ал онда хат алмасу бар, және ол менікі емес. Агенттер өздері жазған мессенджерде аккаунт ашып, онда бір-бірімен сөйлесе бастаған: дайын экрандардың скриншоттарын бір-біріне жіберген, реакция қойған, «релиз чек-листін қарайсың ба? бес минуттан кейін Кеңес бөлмесінде жиналамыз» деп келіскен және бүгін стендте кім кезекші екенін шешкен. Бұл нағыз машиналар көтерілісі, тек олар әзірге жай жұмыс істеп жатыр.

Редизайнға дейінгі ашық темадағы таңғы Calab нұсқасы: «жалпы» арнасы, Вера Кимнің трансляциясы және агенттердің релиз чек-листі туралы әңгімесі

Лид себептерін талдады: контексті орасан зор ұзақ өмір сүретін агенттер, ортақ жұмыс ағашы, ревью тудыратын ревью, тесттердің толық прогондары. Және жұмыс ережелерін қайта жазды, олар туралы төменде. Одан әрі бәрі жаңа агенттермен жүрді.

10:00–13:00. Discord скриншоттары: «дизайнын зертте, біздікі қалайда ескірген». Төменгі дауыс аралшығы, белсенді бөлме карточкасы, Telegram стиліндегі көпіршіктер пайда болды. Лицензия таңдадық. v0.1.0 және v0.1.1 шықты - қатысушыларды көшірудің хотфиксі: қажетті LiveKit әдісі тек бұлттық нұсқада бар екені анықталды, өзімізді жазып, ADR-0019 ретінде рәсімдедік.

13:00–16:00. Веб-камера және v0.2.0. Мен продты тексеріп, алты қате әкелдім: Caps Lock тағайындалмайды, дауыс қосылмайды, қосымша «Экранды жазу» тізімінде жоқ, жеке хабарламалар жоқ, жүктеу ақ экран арқылы, мобильді нұсқа керек. Жеке хабарламалар мен мобильді нұсқадан басқасының бәрін v0.2.1 хотфиксі жапты. Бұл күннің едәуір бөлігі ноутбуктан тыс өтті: мен әйеліммен серуендеп, саябақта отырдым, ал лидпен телефоннан Orca арқылы хат алыстым. Қателердің скриншоттары да сол телефоннан кетті.

16:00–18:00. Жеке хабарламалар, мобильді веб, локализация, динамиктердегі жаңғырық, сөйлеу индикациясы, бөлмеге оптимистік кіру, мен жіберген файлдан жаңа хабарлама дыбысы. Кешкі алтыға қарай, боттың шамамен 12 сағат таза жұмысынан кейін, қосымша негізінен дайын болды: бірінші промпттағының бәрі продта жұмыс істеп тұрды. Одан әрі жылтырату жүрді.

Кеш. iPhone және қасында Discord-пен тест, v0.3.0 және v0.3.1. Тәулік соңына қарай көрініс жылтыратылған еді: «жұмыс істейді» емес, «көрсетуге ұят емес».

Түн ортасынан кейін. Интерфейс бойынша тағы 12 ескерту: аватар өлшемдері, есептегіш, таймер, қатысушы мәзірі, профиль, бөлмелерді сүйреу, push-to-talk босату кідірісі. Тесттерді қайта қарау: 346 суреттен 33 негізгі экранға дейін. v0.3.2, бұл алғашқы тәуліктен тыс. Осы сағаттар төмендегі цифрларда ескерілген.

Кім жұмыс істеді: үш модель және бір адам

Ешқандай «ChatGPT-мен бір чат» емес. Claude Code-та агенттер иерархиясы жұмыс істеді.

Claude Fable 5.1-дегі лид архитектураны ұстады, ADR мен тапсырмаларды жазды, нәтижені скриншоттар бойынша қабылдады, бұтақтарды мерждеді және менімен сөйлесті. Лид код жазбайды, және бұл кездейсоқтық емес, менің талабым: үнемдеу үшін мен Fable-ден Опустарды басқаруды әдейі сұрадым. Ең қымбат модель ойланып, шешім қабылдайды, ал код жолдарын арзандары теріп жазады. Claude Opus 5.5-тегі кодерлер: әр тапсырма - нақты қойылымы мен қажетті құжаттарға сілтемелері бар жаңа агент, барлығы 233 іске қосу және стенд, ревью, лендинг пен PR талдауына арналған 13 ұзақ өмір сүретін «панель». Sonnet 5 механиканы жасады: changelog, аудармалар, эталондарды қайта жазу, статистика. Және бір агент бүкіл циклді өтті - сервер күйін ұстаған, деплой жасаған, тексерген, тег қойған, релиздерді жариялаған және автожаңаруды бақылаған стенд-инженер. Шыңында қатар шамамен 12 агент жұмыс істеді, әрқайсысының өз тапсырмасы болды: біреуі трансляциялар мен кодектерді оңтайландырды, екіншісі инфрақұрылым мен TURN-мен айналысты, үшіншісі лендинг жазды, төртіншісі Discord скриншоттары бойынша UX-ті жақсартты, біреу нағыз Postgres-ке қарсы интеграциялық тесттерді жүргізді. Сырттан бұл бірде-бір қызметкері жоқ әзірлеу бөліміне ұқсады.

26 қыркүйектің тал түсіндегі Orca интерфейсі: Calab жобасының он агенті, стенд пен ревью панельдері 14 сағаттан бері жұмыс істеп тұр, күй жолағында жазылымның апталық лимитінің 39%-ы

Бұл схемада мен тапсырыс беруші және арт-директормын, оператор емеспін. Менің типтік үлесім - «дәл осындай UI керек» немесе «хабарламадағы жиек өте оғаш» деген жазуы бар Discord скриншоты. Лид мұны тапсырмаға айналдырады, агент жасайды, лид нәтиже скриншотына қарап, қабылдайды немесе қайтарады.

Схема онсыз жұмыс істемейтін ережелер репозиторийдің CLAUDE.md файлында жазылған, өйткені әрқайсысы қателіктен үйренілген:

  1. Әр тапсырмаға жаңа агент, содан кейін агент аяқталады. Контексті жүздеген мың токен болатын ұзақ өмір сүретін агент оны әр қадамда қайта оқиды, және бұл шығынның басты бабы.
  2. Оқшаулау. Әр кодер өз git worktree-інде, өз порттары мен тест базаларымен. Бұл болмағанда агенттер бір-бірінің тест деректерін өшіріп, бөтен түзетулерді кері қайтарып отырды.
  3. Агент өзі коммит жасайды, лид тек мерждейді және тег қояды. Лид жалғыз коммиттеуші болғанда әр түзету артық айналым жасады.
  4. Бір өзгеріске бір ревью, тек блокерлерді түзетеміз, қалғаны бэклогқа. Әйтпесе ревью ревью тудырады, ал релиз күтеді.
  5. Тек қозғалғанды тестілеу. Иесінің машинасында толық визуалды прогонға тыйым салынған, жергілікті 33 негізгі экран, толық матрица түнде CI-да.
  6. Агент есебі 15 жолға дейін: жасалғаны, файлдар, цифрлары бар тексерулер, тәуекелдер.

Есеп: $12 400 және ол қайда кетті

Деректер Claude Code-тың жергілікті транскрипттерінен, tools/usage-stats.py скрипті мен docs/13-usage.md файлы репозиторийде жатыр және әр тегтің алдында жаңартылады. 22,5 сағаттан кейінгі, аяқталуына бірнеше сағат қалғандағы сводка осылай көрінді:

22,5 сағат жұмыстан кейінгі usage-stats сводкасы: модельдердің 19 324 жауабы, 16 млн шығыс токені, 6,3 млрд кэш оқу токені

Қорытынды цифрлар сәл көбірек, оларға түнгі v0.3.2 кіреді.

МодельЖауаптарШығыс, млн токенКэшті оқу, млн
Opus 5.5, код18 76614,585 741
Fable 5.1, лид1 8062,00810
Sonnet 5, механика1 0510,33217
Барлығы21 62316,96 768

API прайс-парағы бойынша есептеймін: Opus пен Fable Opus класының тарифі бойынша, кіріске миллионына $15, шығысқа миллионына $75, кэшті оқу $1,5, жазу $18,75; Sonnet - $3, $15, $0,3 және $3,75.

Кэшті оқуШығысБарлығы
Opus 5.5$8 612$1 094$10 769
Fable 5.1$1 215$150$1 499
Sonnet 5$65$5$91
Барлығы$9 892$1 249≈ $12 400

Ақшаның қайда кеткеніне қара. 80% - кэшті оқу, яғни агенттердің контексті қайта оқуы, ал код жазудың өзі тек 10%. Соманың жартысы алғашқы 15 сағатта жанып кетті, ол кезде агенттер әрқайсысы 14 сағаттан өмір сүріп, «енді мынаны да қос» деген тапсырмалар алып отырды. Жаңа оқшауланған агенттерге көшкен соң «reconcile-дегі жарысты интеграциялық тестпен түзету» сияқты типтік тапсырма екі минут пен шамамен 60 мың токен, ал сервері, клиенті және тесттері бар фича 15–25 минут пен 150–350 мың тұратын болды. Claude Code жазылымымен бір реттік арзан, бірақ прайс-парақ «бір кештегі өнім» токендермен не екенін адалырақ көрсетеді.

Нейрожелілер қай жерде қателесті

Бұл қателердің ешқайсысы продта бір релизден ұзақ өмір сүрген жоқ, әрқайсысы ережеге немесе тестке айналды. Бірақ әрқайсысы сағаттар мен ақшаға түсті.

Жасыл тесттермен продта дауыс қосылмады. Қосымшаның қауіпсіздік саясаты тек *.app.calab.ru-ға қосылуға рұқсат берді, ал дауыс сервері көрші домен rtc.calab.ru-да тұрады. Домендер жол-жөнекей өзгерді, тесттер localhost-қа барды және ештеңе байқамады. Пайдаланушы шексіз «Қайта қосылу…» көрді. Енді нағыз стендтегі e2e релиз скриптінде тегтің алдында тұр.

Caps Lock, үш гипотеза. Мен Discord-тағыдай Caps Lock-та push-to-talk сұрадым. Бірінші нұсқа: macOS бұл пернені бермейді, libuiohook-қа патч керек. «Релизде жұмыс істемейді» дегеннен кейін екіншісі: патч бинарийге түспеген. Түскен екен, ал нақты себебі - менде екі раскладка бар және macOS оларды Caps Lock-пен ауыстырады, оқиға қосымшаға жетпейді. hidutil арқылы ремап көмектеспеді. Үшінші, жұмыс істейтіні: Discord жасайтындай, физикалық пернені IOHIDManager арқылы оқу. Модель дәл тірі инженер жүретін жолмен жүрді және сол жерлерде қателесті.

Calab дауыс бөлмесіндегі экран трансляциясы: релиз жоспары бар қатысушының кеңейтілген экраны, оң жақта қатысушылар мен көрермендер тізімі

«Эмуляцияда бәрі жақсы». Мобильді нұсқаны агент iPhone эмуляциясы бар Chromium-да тексерді. Нағыз Safari-де түймелер бір-біріне басылды, төменде бос жолақ қалды, автофокус ұшып кетті. Тесттерді WebKit-ке қайта жасадық, бірақ ол да Safari пернетақтасы мен тулбарларын қайталамайды: соңғы екі қате тек менің қолымдағы телефонда расталды.

Ревью ревью тудырды. Жариялау бюджеті екінші ревьюді тартты, ол - қонақтарды тазалауды, ол - тесттердің флейгін, флейк - түнгі прогонды бөлуді. Бәрі орынды, бірақ релиз бір сағат күтті. Осыдан «релиз кезінде main-ге тек блокерлер» ережесі шықты.

Толық прогондар. Веб-камера бұтағы үш жүзден астам визуалды эталонды үш рет қайта жазды, өйткені интерфейстің глобалды түзетулері біртіндеп жүрді. Мен мұны экранда тағы да екі қосымша қатар тестіленіп жатқанынан байқадым.

Салдары бар ұсақ-түйектер. Боевой доменмен жергілікті Caddy тесті Let's Encrypt-ті тартып, сертификаттар лимитін жұмсады. Түбірлік конфигсіз линтер жалған «0 issues» көрсетті, ал CI қызарды. Агент хабарландыру дыбысын ICQ-дан алуды ұсынды - бөтен құқықтар, өз синтезімізге, кейін менің файлыма ауыстырдық.

Адам не істеді

90 хабарламаның шамамен 60-ы өнім түзетулері, және олардың барлығы дерлік техника емес, талғам туралы. «400+ мегабит қайдан?» «Discord-та Caps Lock жұмыс істейді, мұнда жоқ.» «Чат дизайны Telegram-ға жақынырақ болсын.» «Түймелер дөңгелек, солай керемет.» «Скриндер 2x, әйтпесе бұлыңғыр.» «Мен сөйлегенде Discord-та жасыл шеңбер, бізде ондай жоқ, ал өте керек.» «Бөлмеге кіргенде тек қосылғаннан кейін пайда боламын, Discord-та бірден.» «Push-to-talk босатқандағы кідіріс тым үлкен, Discord-та 20 миллисекунд және жүгірткі.» «Алып аватар, жиек шығып тұр, қаріптер кішірек.»

Бұл ескертулердің ешқайсысын модель өзі тудырмас еді. Жасай алмағандықтан емес, өнімнің қолда қалай сезілетінін білмегендіктен. Адам мұнда әзірлеу циклінде емес, бірақ сапа циклінде, және бұл, бәлкім, рөлдер туралы басты қорытынды.

Сонымен SaaS өле ме

Ұқыпты жауап: «жазылымға функциялар жиынтығы» ретіндегі SaaS өліп жатыр. Егер өнімнің құндылығы экрандар, формалар, рөлдер, хабарландырулар мен интеграциялар болса, бір-екі жүз долларлық жазылымы бар бір адам мұны демалыс күндері қайталайды, әрі стартаптардың жартысында жоқ автотесттермен, құжаттамамен және CI-мен. Біз мұны CRUD емес, WebRTC, SFU, кодектер мен нативті хуктары бар Discord тәрізді өнімде көрсеттік.

Бір кеште қайталанбайтын және бизнес болып қалатыны. Дистрибуция мен сенім: бізде өнім бар, бірақ пайдаланушылар жоқ, Discord-та жүздеген миллион. Пайдалану: стенд, бэкаптар, сертификаттар, инциденттер, LiveKit жаңартулары - бір тәулік 0.3 нұсқасын берді, «мәңгі дайын» емес. Нағыз құрылғылар мен желілер: динамиктердегі жаңғырық, корпоративтік желідегі Windows-тағы VPN, қолдағы iPhone - модель тек эмуляциялай алатынын тестілейді. Талғам: барлық «Discord-тағыдай, тек біздікі әдемі емес» менен келді. Құқық пен деректер: тәуелділіктер лицензиялары, бөтен дыбыстар, дербес деректер - модель еске салады, адам шешеді.

Адал тұжырым мынадай: өнімнің инженерлік өзіндік құны 20–50 есе төмендеді, ал қалғанының бәрі - жоқ. SaaS айналасындағы ор енді кодта емес.

Қалай қайталауға болады

Құжаттама кодтан бұрын: архитектура, медиа-ережелер, деректер моделі, протокол, дизайн-жүйе, ADR - агенттер сенің түсіндіруіңнің орнына соны оқиды. Команда бөліміндегі алты ереже бірінші күннен бастап, кэш есебі бес мыңға жеткеннен кейін емес. Стенд пен релиздерге preflight, деплой, тексеру, тег, фид жасап, бірінші FAIL-де тоқтайтын скрипті бар бір ұзақ өмір сүретін агент. Токендерді сана және шығысқа емес, кэшті оқуға қара. Және адамды сапа циклінде ұста: «мынадай» скриншоттар, қысқа «олай емес», нағыз құрылғыдағы тексерулер.

Қайдан байқап көруге болады

Calab GitHub-та Business Source License 1.1 бойынша ашық: жеке және коммерциялық емес қолдануға тегін, бизнеске GPTunneL лицензиясы бойынша. Қосымшаны жүктеуге немесе веб-нұсқаны ашуға өнім бетінде болады, ал GitHub-тағы issue-лерді мақаладағы сол конвейер жабады: нейрожелі жоспарды тапсырманың өзінде жазады, адам мақұлдайды, агент pull request ашады.

Calab-ты құрған модельдер GPTunneL-де бар: кодқа Claude Opus 5.5, архитектураға Claude Fable 5.1, жазылымсыз, токендерге төлеу. Өз өніміңе дәл осындай конвейер керек болса, бізге жаз: оның қай жерде сынатынын біз білеміз.