← Артыкулы Harupa
2026-08-02RU EN UA BY PL

My Architect, частка 11: восемсот камітаў, якія пісаў не я

Другога жніўня раніцай я палічыў каміты ў сваім відэагенератары. Выйшла 795. Пакуль я пісаў гэты артыкул, лічыльнік дайшоў да 802. Кода за гэты час я не напісаў ні радка — адказваў на пытанні і глядзеў, што атрымліваецца.

Дзесяць частак гэтай серыі я расказваў, як уладкаваны my_architect: памяць, сховішча, мадэль планавання, рабочы цыкл, Event Storming, код-граф. Увесь гэты час справядлівы быў папрок: прыгожа, але пакажы на сапраўдным праекце. Паказваю.

Усе лічбы ніжэй знятыя з жывога праекта 2 жніўня 2026 года. Дзе лічба мерае не тое, што здаецца на першы погляд, — я так і пішу.

Праект, які не змяшчаецца ў галаве

Відэагенератар — ён жа Vini Studio — пачаўся 16 мая 2026 года камітам з паведамленнем init. На другое жніўня гэта 802 каміты за 78 сутак, 920 файлаў пад гітам, 85 тысяч радкоў кода і яшчэ 70 тысяч радкоў дакументацыі і канфігаў.

Разнароднасць там непрыстойная для аднаго чалавека. Фронт: React 18 паверх litegraph, нодавае палатно на 25 тыпаў нод. Бэк: Node без фрэймворка, 2771 радок у адным роўтары, SQLite на 16 табліц. Рэндар ідзе праз Remotion, а той падымае Chrome Headless Shell. Побач жывуць два пітонаўскія сайдкары на Flask: першы абгорнуты вакол ffmpeg і трымае 17 эндпоінтаў, другі раздзяляе дарожкі праз Demucs на торчы. Мадэляў пяць вендараў — fal.ai, Anthropic, OpenAI, Groq, ElevenLabs, і два рэестры па шэсць мадэляў у кожным, для відэа і для карцінак. Ёсць яшчэ даследчы слой: дзевятнаццаць research-дакументаў, трохслаёвыя эвалы паводзін, сляпая крос-вендарная ацэнка сцэнарыстаў і пяць A/B-замераў, дзе рашэнне прымалася па лічбах.

А 24 ліпеня праект наогул змяніў архітэктуру цалкам. Першы шлях зборкі, тэлеграм-бот на n8n, пайшоў у архіў рашэннем RFC-055, кананічным стала нодавае палатно. Дзевятнаццаць n8n-воркфлоў засталіся ў гіце толькі як гісторыя.

Пра загаловак адразу, каб не было спекуляцый. Аўтарам усіх 802 камітаў гіт лічыць мяне, і націскаю каміт таксама я. Фармальны след агенцкага сааўтарства — трэйлер Co-Authored-By, ён стаіць у 256 камітах, гэта 31,9%, і там пяць розных версій мадэляў. Гэта ніжняя мяжа, бо трэйлер ставіцца не заўсёды.

Затое рэжым працы па рэпазіторыі відаць добра. Сем рабочых дрэў, тры з іх агенцкія і створаныя 19 ліпеня з розніцай у сем хвілін. А чацвёртага ліпеня ёсць серыя з 43 камітаў за 33 хвіліны: механічная міграцыя тэстаў на агульны стэнд, па каміце на файл. Рукамі я так не ўмею.

Я не памятаю гэты праект. Я памятаю кірунак. Усё астатняе ляжыць у архітэктары.

Што там на самай справе ляжыць

Дамп праекта з my_architect на другое жніўня — 650 вузлоў. Трыццаць адзін эпік верхняга ўзроўню, 237 фіч, 33 гісторыі, 324 задачы і 25 багаў заведзеныя асобным тыпам. З іх 527 закрытыя — гэта 81%. Чатыры ўзроўні іерархіі, шэсць рэлізных кошыкаў, самы стары — MVP, закрыты цалкам, 38 з 38.

Патрабаванняў — 296. Не толькі функцыянальных: 241 FR, 26 NFR, 20 абмежаванняў, пяць архітэктурна значных, тры сістэмныя і адно адкрытае пытанне — тое самае, якое я падкінуў у абмеркаванні і якое заведзена якраз дзеля таго, каб не згубіцца. Дакументаў на вузлах — 29, дыяграм — чатыры, разам з дошкай Event Storming.

Маштаб прасцей за ўсё адчуць так. Калі я папрасіў выгрузіць кантэкст праекта адным выклікам, адказ заняў 258 тысяч сімвалаў — і гэта яшчэ ўрэзаны выгляд, без апісанняў вузлоў. А спіс патрабаванняў цалкам не ўлез наогул: інструмент вярнуў памылку «385 тысяч сімвалаў, перавышаны ліміт» і паклаў адказ на дыск.

Гэта і ёсць адказ на пытанне, навошта знешняя памяць. Не таму што агент дурны. Таму што праект фізічна большы за любое кантэкстнае акно — і маё ў тым ліку.

Патрабаванне, каміт і тэст трымаюцца за рукі

У корані праекта ляжыць CLAUDE.md на 488 радкоў з адзінаццаццю жорсткімі правіламі. Адно з іх уладкавана так:

Любое архітэктурнае рашэнне, decision, status-change ці scope-shift АБАВЯЗКОВА адлюстроўваецца ў ДВУХ месцах: RFC у docs/rfc/RFC-NNN-*.md і my_architect MCP. Калі змена не адлюстравана ў абодвух — яна згубіцца пры /compact ці новай сесіі. Не рабі працу не запісаўшы. Не запісвай працу не зрабіўшы.

Апошняя фраза не мой пераказ, а даслоўны радок з рэпазіторыя. І яна працуе: 456 камітаў з 802, гэта значыць 56,9%, нясуць у тэме ці целе спасылку на канкрэтны FR ці RFC. RFC-файлаў у праекце 63, ад першага да шэсцьдзясят чацвёртага, з адной дзіркай на сорак шостым.

Але адна дысцыпліна спасылак нічога не вартая без другога канца. Другі канец — тэсты. Правіла гучыць так: кожная папраўка рэгрэсіі прыязджае з пастаянным тэстам, пазначаным // covers: FR-NNN супраць патрабавання ў архітэктары, а калі патрабавання яшчэ няма, яго спярша заводзяць.

Далей пачынаецца механіка. Скрыпт выцягвае патрабаванні з архітэктара і зверае іх з тэгамі ў тэстах. Другі скрыпт роніць зборку, калі ў нейкага патрабавання знайшлося нуль пакрывальных тэстаў. Я запусціў яго проста зараз: ALL 203 requirements covered. Тэгаў // covers: у тэставай папцы — 290 штук на 221 унікальны ідэнтыфікатар. Ідэнтыфікатары патрабаванняў жывуць і ў прадуктовым кодзе таксама: 145 розных FR сустракаюцца ў зыходніках палатна.

Як гэта выглядае ў канкрэтным ланцужку. Ёсць RFC-052 пра выдаленне праекта. У яго шапцы — вузел feature-211-adwcry у архітэктары. У вузла пяць патрабаванняў. Па іх два каміты ад 23 ліпеня, па камітах — функцыі deleteProject і renameProject у сторы, а па функцыях — тры тэсты з тэгамі. І цела першага каміта заканчваецца радком Architect: feature-211-adwcry → done; NFR-122/FR-143/FR-144/FR-145 → approved. Ланцужок замкнёны ў абодва бакі, і прайсці яго можна з любога канца.

Да кода — карцінка, а не тэкст

Ёсць тэхніка, якую я недаацэньваў, пакуль не пачаў ёй карыстацца пастаянна: перш чым нешта будаваць, намаляваць гэта і даць сабе выбраць.

З 28 чэрвеня па 3 ліпеня агент намаляваў мне чатырнаццаць інтэрактыўных HTML-вайрфрэймаў у шасці брэйнштормавых сесіях — прыкладна 94 кілабайты рукапіснай вёрсткі. Не карцінкі: лакальны сервер падымаў іх у браўзеры па адным, а я клікаў варыянт. Раскладка абалонкі — рэйка з докам супраць усяго ў верхняй панэлі. Тры варыянты статус-бара. Куды вешаць іконкі над нодай і колькі іх. Як выглядаюць станы індыкатара захавання. Панэль гісторыі.

Праверыць парадак «спярша карцінка, потым код» проста. Вайрфрэйм канцэпту палатна датаваны 28 чэрвеня, першы каміт самога палатна — 29-м. Спека ад 1 ліпеня кажа даслоўна: «варыянты ніжэй адлюстроўваюць рэальны выбар карыстальніка ў браўзеры, а не здагадкі». Спека ад 3 ліпеня паказвае, што ўзяты макет C, а макет B адхілены.

Самы каштоўны выпадак — калі макап прывёў да рашэння нічога не будаваць: параўналі варыянты і ўбачылі, што провад і так чытаецца, прамежкавая нода не патрэбна.

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

Вайрфрэймы, дарэчы, ляжаць у gitignore. Па адным толькі гіце гэтую практыку не ўбачыць — што само па сабе някепская ілюстрацыя, чаму працу трэба запісваць не толькі камітамі.

Пра ноч

Я аддаю задачу а дзясятай вечара, а раніцай прыходжу да гатовага выніку. У апошнія месяцы — да буйнога: не «папраў водступ», а сабраны кавалак сістэмы.

Спярша я вырашыў праверыць гэта па камітах і ледзь не зрабіў няправільную выснову. У акно з дзесяці вечара да васьмі раніцы трапляюць 75 камітаў з 802, а з гадзіны ночы да шасці раніцы — роўна нуль. Выглядае як абвяржэнне.

Толькі каміт фіксуе не момант, калі праца ішла, а момант, калі яе прынялі. А трэцяй гадзіне ночы яе ніхто не прымае. Па таймстэмпах працягласць аўтаномнага прагону не мераецца ў прынцыпе — ні даказаць, ні абвергнуць.

Затое форма сутак мераецца, і яна кажа роўна тое, што я і апісваю. У дня два гарбы, і ноч ляжыць паміж імі. Дзевяць вечара — другая па загрузцы гадзіна за ўвесь час праекта, 75 камітаў. Дзевяць раніцы — трэцяя, 70. На вячэрнюю здачу з дзевяці да поўначы прыпадае 122 каміты, на ранішні разбор з сямі да дзесяці — 115.

І ранішнія каміты самыя буйныя за суткі: у сярэднім 361 устаўлены радок супраць 179 удзень, удвая. Удзень ідзе дробная ітэрацыя. Раніцай у рэпазіторый прыязджае вялікі кавалак, зроблены цалкам.

Так што фраза не пра гадзіны. Яна пра тое, адкуль бярэцца ўпэўненасць аддаць вялікі кавалак і не сядзець над ім, — і вось гэта мераецца напрамую.

Упэўненасць дае не мадэль. Яе дае тое, што агенту няма куды схлусіць: у патрабавання ёсць нумар, у нумара ёсць тэст, у тэста ёсць гейт, які роніць зборку.

Як выглядае праверка на трываласць гэтага механізму, відаць па гісторыі першага жніўня. У палатне было 63 зялёныя браўзерныя тэсты, якія стваралі сувязі паміж нодамі выклікам унутранага API. Адначасова з гэтым жылі два багі, што ўзнаўляліся рукамі на ўсе сто. Адзін тэст наогул падрабляў падзею, якой у прадзе не бывае, і быў зялёным менавіта таму, што чыніў сабой роўна тую ўмову, якая зламаная.

Вывад з гэтага стаў яшчэ адным жорсткім правілам: багі ўводу правяраюцца сапраўдным уводам браўзера — праз рэальныя падзеі мышы, са сапраўдным захопам указальніка. Тэг // covers: на патрабаванні пра ўзаемадзеянне без сапраўднага ўводу — гэта фальшывая ўпэўненасць, бо гейт зверае радок у каментары, а не слой, які тэст на самай справе кранае.

І раз ужо я абяцаў шчырасць, вось другая палова карціны. Машыннага прымусу да сінхранізацыі ў мяне няма: хукаў няма, CI праганяе толькі дэплой, тэсты і гейт пакрыцця я ганяю рукамі. Дысцыпліна трымаецца тэкстам правіл і тым, што агент іх чытае кожную сесію. Працуе — але гэта не тое самае, што «немагчыма парушыць».

Што я на гэтым выйграю

Роля ў мяне праз гэта іншая. Я не пераказваю агенту кантэкст і не памятаю, у якім стане дваццаць восьмы эпік. Я займаюся прадуктам: гляджу ролікі, лаўлю, што раздражняе, вырашаю, якую мадэль выкідаем з рэестра, і колькі гэта каштуе ў секундах відэа.

За апошні тыдзень ліпеня і першыя дні жніўня ў студыі з'явіўся рэдактар афармлення, дзе прэв'ю фізічна не можа разысціся з рэндарам, бо гэта літаральна адна і тая ж кампазіцыя. З'явілася студыя мантажу: з рэвізіі ад 2 жніўня яна збірае ролік проста ва ўкладцы браўзера. І за два дні прыехаў увесь галасавы контур: клон голасу, агучка, ізаляцыя, дубляж, ліпсінк. Тры RFC запар закрытыя за трое сутак.

Заадно там здарыўся інцыдэнт, які ў справаздачу пра перамогі звычайна не трапляе: 20 ліпеня неабмежаваны рэндар зваліў па памяці ўвесь агульны сервер, load дайшоў да адзінаццаці на чатырох ядрах. Лечыцца гэта нудна — столлю памяці і працэсараў у кантэйнера, каб падаў толькі свой рэндар, а не хост. Каментар з апісаннем інцыдэнту я пакінуў проста ў канфігу, каб ніхто потым не зняў ліміты «за непатрэбнасцю».

Далей — каманда

Скажу напрамую, каб мяне не зразумелі наадварот. Гэта не гісторыя пра тое, што адзін чалавек замяняе каманду. Пасадзіць аднаго на вялікі камандны праект і спадзявацца, што ўзляціць, сёння нельга, і я такога не прапаную.

Гісторыя пра тое, куды пераехала вузкае месца. Раней маім абмежаваннем былі рукі. Цяпер абмежаванне — наколькі выразна сфармулявана, што павінна атрымацца, і наколькі машына можа праверыць, што атрымалася менавіта яно.

І вось тут для каманды самае цікавае. Уся дысцыпліна, з-за якой агенту можна аддаць вялікі кавалак, — гэта роўна тыя артэфакты, якія камандзе патрэбныя і без ніякіх агентаў. Адна крыніца праўды пра стан працы замест трэда ў месэнджары. Патрабаванне з нумарам, да якога дацягваешся з кода, і гейт, які роніць зборку, калі гэтае патрабаванне засталося без тэста. У адзіночку без такога яшчэ можна жыць, у камандзе — не.

Раней такія артэфакты даводзілася прадаваць камандзе як накладныя выдаткі: пішам патрабаванні, бо так правільна. Цяпер у іх з'явіўся другі спажывец, які чытае іх кожную сесію і працуе па іх літаральна. Адзін і той жа дакумент абслугоўвае і чалавека, і агента. Я такога раней не бачыў, і множнік менавіта ў гэтым.

Што я на камандзе яшчэ не мераў і шчыра называю адкрытым: як разыходзіцца трэкер, калі ў яго пішуць пяць чалавек і дзесяць агентаў; хто зацвярджае патрабаванне, калі яго аўтар — агент; колькі трэба рэўю, калі аб'ём кода за тыдзень вырастае кратна. Гэта наступная задача, а не вырашаная.

Дзверы я адчыняю, а не зачыняю.

Факты і спасылкі

Замер зроблены 2 жніўня 2026 года. Рэпазіторый відэагенератара: 802 каміты, першы 16 мая 2026, апошні на момант замеру — a2cc612 у 12:50. Даныя архітэктара — жывы праект ai-video-generator на my-architect.app: 650 вузлоў, 296 патрабаванняў, 29 дакументаў, 4 дыяграмы. Гейт пакрыцця — node test/check-coverage.mjs, вывад «ALL 203 requirements covered». Размеркаванне камітаў па гадзінах — git log --format='%ad' --date=format:'%H'; сярэдні памер каміта па вокнах сутак — па git log --shortstat. Вайрфрэймы ляжаць у .superpowers/ і ў гіт не трапляюць, даты ўзятыя па файлавай сістэме і звераныя з датамі спек.

Сам інструмент — my-architect.app, ставіцца ў Claude Code дзвюма камандамі. Як уладкавана студыя, пра якую тут гаворка, я разбіраў у артыкуле «Ад палатна да студыі».

Калі вы вядзеце падобны праект з агентамі і ў вас атрымалася інакш — напішыце мне. Асабліва цікавыя выпадкі, калі такая дысцыпліна не ўзляцела: яны карысней за гісторыі поспеху.