Прадакшн-абвязка для Claude Code: шэсць узроўняў ад Slack да зліцця MR
Як шасціўзроўневая абвязка ператварае заяўкі са Slack у зліты код: прыём падзей, цыклы агента з кантрольнымі кропкамі, устойлівы стан, самааднаўленне, назіральнасць і кіраванне аператарам.
Крыніцы: Building a Production Agent Harness: Turning Claude Code Into a Multi-Agent Engineering Pipeline
Калі размістыць мадэль кодавання сама по сабе, то гэта будзе проста „галава ў банку“ — яна чыста пісае код і вызывае функцыі, але не зможа прачытаць вашы прыватны паведамленні ў Slack у 3 гадзіны ночы, прабавіць знову запустыць заданні CI, якое паказала парадкі, рашыць праблему з конфліктом падчынення, якая ўжо з’явілася ў адкрытым заявленні пра падчынення, чыста і не запам’ятаць, што аднадзень спытваў калякія адзін з пераглядачаў, а ніхто не адпаведзеў.
Тое, што ператварае мадэль у корыстны інструмент, — цэха: рабочая супорка, якая забезпечвае „чувства“, „рукі“ і памяць. Яе складовыя — прыйом падзеяў, оркестрацыя агентаў, стойкі стан, ціклы, якія самі сабе відновляюць, можлівасць назірання і спосаб для людзкага аператара кераваць. Сістэма, якая опісана ніжэй, — гэта продакшн-сістэма, а не дэманстрацыя для даследжэнняў. Яна сочыць за каналам Slack, стварае заявленні пра падчынення ў пяць внутрашніх рэпазітарыяў, адпаведзае на коментары пераглядачаў працоўна ноччу і сама лагодзіць заданні CI, якія паказалі парадкі, без якіх-лібо запыткаў.
Гэта внутрэній, багата-агентны пайплайн, створаны на базе Claude Code. Ён працуе без перапынкі вялікі час, прыймаючы задачы з Slack і распараджаючы рэальную інжынерную работу. Чым будзе працаваць наступны абзац: што ён робіць, як з’яўляюцца звязкі межу элементамі, а таксама факторы, якія паўтарыліся ў процэсе створэння і якія паўтарыліся ў дызайне.
Раздэлы працуюць у такой парады: чаму важка ўсё-такі выкорыстоўваць спецыяльны інструмент, што робіць гэты інструмент, тры прычыны, якія ён усуне, шасць слоёў (прыйманне запускаючых сыгналаў, оркестрацыя агентаў з дэтальным розглядам автонамнага цыклу і слоя самапраграсы, стойкі стан, самовялечэнне, можлівасць адзірвання і кераванне з боку чалавека), калькі дадатковых элементаў паza слоямі, паследовы аналіз усьго процэсу і паўпораненне з іншымі подабнымі інструментамі.
Чаму чат-вікна і дзеякія інструменты недастатковы
Калі ў 2023 годзе з’явіліся плагіны для чат-асістэнтав, багато команд прабавалі просты спосаб: размясціць інтэрфейс чата перад LLM, дасты ёму калькі інструментаў для выканання функцый і назваць рэзультат «інжынерным агентам». Такая наладка практычна працуе толькі у дэмаверсіі і ніколі не вытрымаеся ў рэальных умовах. Усьмоўкі пасля гэтага з’являюцца вядома за тыдзень.
- Кантэкст знікае, калі аператар закрывае вікно. Памяць должна прытрымацца дольш чым адна сесія чата. Рэальная інжынерная задача трывае колькі дзён: адкрыць заявку, створыць гілку, напісаць праект, прабачыць на рэвізію, адпаведаць на каментары, чакаць пазітывны рэзультат тэставання, з’едыніць код. Жадны адзін вызов модэлю не можа запам’ятаць усё гэта.
- Нічога не рэагуе на змяны зза меж чата. Рэвізор пісае каментары о 16:00. Тэставання зламваецца пасля трэцьяго коміту. Колега адпаведзае ў той ж самы чат. Агент павінен рэагаваць на гэтыя змяны, а не стаячы у вечным ожыванні чы то чакаючы, калі хтось знову даў ему заданне.
Усуненне гэтых проблем — галоўная задача кейсінгу. Самэ гэта і вядомае розныя чат-вікна ад самага Claude Code, ад фонавых агентоў Cursor, ад Devin чы ўсіх іншых опісаных тут сістэм. Мадэль, якая стоіць за ўсімі імі, практычна можа быць заменена межы ўсімаямі. Разлік стоўіць у кейсінгу, які ёе абгортае.
Мадэль прабывае у свеце толькі праз кейсінг, і самэ кейсінг выкананае майжэ весь той інжынерны работ, які робіць LLM схожым на сістэму.
Задача, для якой была створэна гэтая сістэма
Пачатковая проблема была конкрэтная. Канал у Slack пад назвай #support збірае апоўно 30 запітаў на тыдзень. Кожны з іх трэба расследаваць, а пасля часта выконваць зміны ў кодзе ў аднам з пяці рэпозытарыёў. Расследаванне аднаго запіта можа трываць калькі дзён. Рэвізоры пішучы свае коментары, а дэякія расследавання віявляюцца такімі ж, як і месяцем раней. Команда, якая займаецца гэтымі запітамі, постаўлялася ў вечары і на выходныя, і нічога не павяршалася, таму што ў кожны цыкл з’являліся тыя ж фарматы запітаў.
Цяя сістэма мае тры завадзі, распакаваныя па ступеню ўтручання:
- Расследаванне. Калі ў
#supportз’являецца новы запіт, трэба сочыць за ходам дыялогу, збіраць інформацыю з розных рэпозытарыёў і публікаваць структураваны аналіз у там самым дыялозе.
Гэты трэці аспект і ўражае разліку з простымі ботамі для обработкі заявак. Асновным матэрыялам для сістэмы ёсць яе сэрвісны код, і большая мова ляжаў можа ўтрымліваць змяны праз запіты на з’еднанне, якія праходзяць перагляд чалавека.
Сістэма складаецца з шасці логічных слоёў, і кожны з іх прадстаўлены ў адным з ніжэйшых раздэлаў.
Тры недастаткі, якія простая мадэль не можа усунуць
Усю структуру сістэмы падтрымлівае адна ідэя: безстановая, чыста рэакtyўная большая мова ляжаў не ёсць сістэмай для прыменення ў практыцы. Шасць слоёў існуюць для усунення трох недастаткаў, якія мадэль не можа усунуць сама.
Першая прыжака — гэта рэактыўнасць. Мадэль не можа сама себе даць сігнал да працы. Шар 1 (прыем звестак) адмаўляецца гэтай задачы, адколькі, як згадвае Slack, рэзультаты GitLab CI і сторанкі PagerDuty праходзяць у адну кола распадзелу. LLM ніколі не абшукае інфармацыю — яго проста вызываюць.
Другая прыжака — гэта стойкасць. Мадэлі забываюць усё межы сесіямі і трапляецца, што яны втрачаюць кантэкст, калі работа пераводзіцца межы апаратамі; кроме таго, яны не можу разлічыць, чы рэшэння якога-то пытання ўжо вырашана, чы проста здабытыя змяны фактычна даслаўцены ў базу. Шар 3 (стойкі стан) рашае гэтыя проблемы: структуры ў памяці усуваюць дублікаты ў межах аднаго процэсу, локальныя файлы JSON зберагаюць інфармацыю пра працу, а рабочыя прасторы, сінхронізаваныя з git, зберагаюць стойкі стан задач. Прычыннасць сесій межы апаратамі, пра якую будзе сказана пазней, таксама вырашваецца на адной ідэі — стан павінен знаходзіцца ў git, а не ў працюючым процэсе.
Трэція прасоўка — гэта якосьць. Калі няма структуры, цыкл разумовых выконанняў LLM вырабляе впэўненыя заключэння на адной лёгкай падставе, прызначае расследаванні за завершаныя раней, чым пераканаецца ў всіх доступных джэрэлах, і стварае опісы MR, якія з першага рэчэння выглядаюць так, нібы ўзначаныя машынай. Слой 2 (оркестрацыя агентаў) і цыкл расследаванняў справляюцца з гэтым за дапамогою структураваных контрактов выходных дадзенняў, перакрыцча якосці пасля кожнай ітэрацыі, адварсарскага адзору пасля завершэння цыклу, а таксама самовыздоравляючых цыклаў у рамках зовнішняга цыклу змян коду, CI і з’еднання.
Складаванне — гэта тое, што з’еднае слоі, калі кожны закрыты случай прышвартавае наступны. Апраўнаныя расследаванні стаюць элементамі базы знаёмых. Апраўнаныя MR ператвараюцца на шаблоны, да якіх можа апісваць аналізатор прасоўкаў. Заканчаны случай адкрывае MR з метой паспрабоўкі падборкі самай. З кожным цыклам меншае колькасць тыпоў заявок атрымваюць некорэктную обработку.
Слой 1: як запускаюцься сістэма праз адбыванні падзеяў
Тры зовнішнія джэрэлы сігнала можу запусціць гарматуру:
- Пашткі ў Slack, тыя самыя, што ўключаюць прамяну ў канал, адпаведзі ў дыялогу і команды ад адміністратара, апрацоўваныя як прыватныя пашткі для самога себе.
- Актывацыя ў GitLab, тыя самыя, што ўключаюць каментары да праектаў, рэзультаты пайплайнаў і ўзбіянні пайплайнаў.
- Апавешчэнні з PagerDuty, якія выкарыстоўваюцца, калі адпаведны аддзел памінюе тыкет, які гарматура вялікі час яўляе, ў мэты выявлення пакананых кантэкстаў.
Гэтыя тры джэрэлы разлічаюцца па часе адпаведзі і надзеямоўнасці, таму кожна з іх мае свой сабстычны шлях.
Два практычныя дэталі ніколі не праказуюцца ў стандартныя версіі гэтага дыяграмы.
Вяласць адпаведнасці. Канцэнтры Slack conversations.history можа запаздваць на 1–30 секундаў. Прамошчык, які бачыць порожнія рэзультаты і наўманна пераводзіць свой курсор да ўпераду, праігноравае всія паведамленні, чыё ts падпадае ў гэты перыяд. Такім чынам курсор застаецца на месцы праз порожнія прамошчання, а наступная спроба запускаецца з таго ж старэйшага часовага пазначэння, і гэта продзеяваецца, пакуль не будзе атрымана хоць адна паведамленне. Набор для фільтрацыі дуплікатаў, ствараны на адной паведамленні за часовым пазначэнням, адсеявае дуплікаты, якія ствараюцца пад час такіх перапрыбуткаў.
Рэжым Socket плюс прыемнік дадзеных, гэта як ручка і пасоў. Рэжым Socket дастае адпаведзі з задзейнам часам меншым за секунду, але з’ўязкі WebSocket занікаюць. Прыемнік дадзеных выступае як запасная сетка, якая ловіць усё тое, што працяванне рэжыма Socket працягнула, і абе методы выкарыстоўваюць файл socket-dedup, ўбеджаючыся, што жадна паведамленне не будзе адправлена два разы. Без гэтага ўсё, што прыходзіць пад час перэрванага з’ўязку, знікае безследна, і аператар не фіксуе, што гэта было працягнута.
Цыкл MR-monitor cron працюе інакш. GitLab не дадзеў каментары да адзначэнняў у пайплайн, таму ёдыным варою ёсць польсінг, а масштабаванне самога польсінгу выявілася складным задачэм. Кожны дадатковы дзейнасты MR, які прыемлівае сістэма, падвайшвае 10-мінутны цыкл, які накаплюе курсары для «мертвых» заданняў, і кожны з іх коштае адзін вызов API Slack за цыкл. Калі іх не караць, яны спрычыняюць сталыя проблемы з обмежэнням частоты 429, якія заважаюць польсінгу, які ёсць важлівым. Рашэнняя — аўтаматычна адключаць курсар, калі API вышэйшага роўня адпавядае thread_not_found, тады ён не будзе включаны ў наступны цыкл. Да рашэнняя аднацца цыклы здзейснівалі 12 перапрыбуткаў працоўнае гадзіны за раз. Пасля рашэнняя — жодных.
Слой 2: як організуецца работа агентаў
LLM на самай працюе тут. Сістэма запускае працоўнікія як тымчасовыя елементы systemd, і кожнам з іх даецца JSON-даныя з назвай працавальнага працэсу, катэгорыі, якая будзе выкарыстоўвана, і ніткі, да якой ён належыць.
Кожны пайплайн адпавядае аднаму дзейсненню Claude Code («галавным мозгам»), які отрымае падготавлены запіт і папку case_dir, якая можа быць зменена. Гэтая папка служыць мясцам для працы агента, у яй знаходзяцца файл TASK.md кожнага кейсу, спіс файлаў followup_transcript_*.md з рэзультатамі працы, будзь-якія справаздачы gap_report*.md, якія стварае агент, а таксама проміжныя JSON-файлы.
Працэс абароткі агентаў ўскладненыя часткая дызайну. Уместа таго, каб аднаму агенту выканаць усё, адна за адной працуюць кілька спецыялізаваных агентаў, і кожны з іх перадае задачу ў паказаны момант:
oncall_runадмініструе першыя дзеяння з аналізу: да 20 ітэрацыйяў выважэння з пераканальнай перапалою, якія завершаюцца чытальной самакрытыкай. Яго выхадам являецца файлANALYSIS.md, у яком опісваецца, што не так, і файлTASK.md, у яком — што трэба зрабіць.case_followup— гэта агент для дзейнаў у чаце працавае ў длігі трымканні. Аператар можа адпавядаць у прыватным пісьме на тэйп разгавору працы працовіка пра дні, і кожна адпаведзь знову запускаеcase_followupз усім ранейшым разгаворам. Кроме таго, ён кожныя N адпаведзей вызываеgap_analyzerяк падагента, і гэты цыкл стварае файлыgap_report*.md, якія вказуюць на сэрвісны код самага прыладу (цыкл самапрадактыка паводзіцца далей).
finalize_case являецца агентам для аб’еднання дадзейнаў. Калі які-небудзь задачы застаюцца без дзеяння чатыры гадзіны, або аператар выканае команду admin: finalize <case>, ён збірае всі адчытныя справаздачы, выкарыстоўваючы ўсе паспраўныя рашэнні, і стварае аднойчы MR з усімі застосаванымі паспраўнымі змянамі. Шырокі мета такога MR — кодбаза harness, а не первачны рэпазітарый задачы; гэта і ёсць конкрэтны прыклад ціклу самапрагнення.dev-agent — гэта агент, які выпрацоўвае практычныя змены. У сваёй сабскладнайеце для кожной задачы ён рэдагуе код, выканае push, стэжы за CI, лагачы проблемы ў CI, калі яны выйшлі, і адпавядае на запыткі рэвізораў. Ён працуе у трох рэжымах: address_review, fix_ci і task (первачная рэалізацыя).У гэтым дыяграме ёсць пара дзейнаў, якія лёгка працягнуць.
Паўначальна частка сістэмы для адправкі замовлення не падвергаецца жадным змянам, таму што весь працэс выканання задач відбываецца ў робочых дрэвах. Чырвоныя гэта дозволяе кількам задачам працаваць паралельна без суперскуплення. Механізмы паллеру і дыстраб’ютора агента включаюць шлях да робочага дрэва ў пакет дадзеных, таму LLM ніколі не можа бачыць паўначальную частку сістэмы для адправкі замовлення.
Друга важлівая частка — гэта case_dir, які служыць опорай для всіх элементаў сістэмы. Файлы стану, якія знаходзяцца ў каталозе ~/.harness/ (дывісь раздзіл пра збераганне дадзеных), прыяўляюць кожную тэму у Slack да конкрэтнага case_dir, а агент аналізуе всі шляхі стосова да яго. У рэзультаце ўсе іншае стае простым: дасылаецца каталог, апошнія змяні вносяцца ў карточку, і кожны працэс працы продовжаецца за новымі правіламі.
Граф паказвае, што саме выканана. Наступны раздзіл пояснюе, як гэта відбываецца, тыя самыя механізмы, якія перадаюць команду з Slack да завершання розследавання.
Автонамны цыкл, па кроках
Калі хтось запытаецца, чаму насправды выконвае гэты сістэма, найкорачэйшая і чыстасцю адказ: аператар вводзіць адну команду Slack, і пасля чаго запускаецца замкнуты цыкл паўтаральных размышленняў, самакрытыкі і вжывання інструментаў без прыгляду, пакуль работа не будзе завершаная або сістэма не з’явіць, што не можа продаваць. Практычна кожная цікавая дыяктара дызайну ховаецца ў гэтым адказе, а рэшта часткі гэтага раздэлу яго раскрывае.
Унутры каркаса знаходзяцца чатыры разныя лупы агентаў, і кожная з іх прызначана для рашэння свага тыпу задач:
У той картынцы паказаны ўзоры. Далей йдзе сутнасць, калі кожны механізм паказаны ў тым парадку, у яком ён працуе. Дыяграма павязана з усімі імі, а яе вузлы станавяцца зрозумелымі пасля прачытання ніжэйшых частак. Коды вората, якія ён вжывае, — G1 да G4, N1 да N3, N5, A1 да A3 і D1 да D15.
Да цыклу: блокіраванне праз прадзеянне
Два захоўнія меры дзейнаюць яшчэ до першага вызову Claude, пры чым першая з іх ёсць структурнай. Перш чым працюе які-лебе цыкл расследавання, сістэма вызова заставляе Claude затвердзіць hypothesis_slate. У гэтым докуменце пераказаны прынеймна шасць можлівых пояснэнняў плюс чатыры-пяць крэтарыў для ўзнікнення выбору сярод іх, і ён зберагаецца у kickoff_precommitment.json, дзе пасля гэтага нічога не можа быць зменена.
Сярод усіх элементаў сістэмы гэты замак являецца заходам, які мае найбольшую методолагічную значымасць, але ў той жа час застаёцца майжэ непазірным. Неконтрольваны цыкл разумовых выкладэнняў LLM часта выбірае ту версію, якую падтрымваюць першыя даны, а ўсе наступныя даны спрыймае як падтверджэння. Замак не можа зупініць гэты працэс. Аднак ён змушвае кожнае даследаванне пачынаты з усіх можлівых гіпотэз і фіксаваць, як саме было доўгачэй даўанаць да выніку. Пасля чаго адпаведальны рэвізор (фаза B) ставіць болей складныя запытанні, чым толькі пытання пра внутршую супараднасць: чы ўсё-такі гэты вынік быў бы працягнуты первісным алгорытам, вазьмаючы пад увагу наяўныя даны?
Другій меры захопчэння ёсць эмпірычны анкер (фаза C). Толькі пад першай ітэрацыі выкананы калькі команд на рэвэрсе апаратнай сяродовыце без участку LLM: выведанне пасляў з journalctl, кадры дыска і памяці, а таксама пошук файлаў логаў. Рэзультаты стаюць часткай пачатковага запіту для расследавання як неапранутыя доказы, даўаючы Claude фактычныя даныя пра апаратнасць яшчэ до таго, калі будзе сформульавана якая-небудзь гіпатэза. Шаг гэты ніколі не блакуе, тыха працягвае працу нават у разе аптак, і ўжо за менш чым секунду завершаецца. Ён заслуговывае на свое месца, таму што наступны крок аналізу пачынаецца з правдавых дадзенняў, а не толькі з опісу проблемы.
Структураваны выхід: атлас завершэння
Кожная ітэрацыя завершаецца парсуемым JSON-дакументам completion_report, і прылад чытае яго, каб адначасова вярнуцца, што будзе далей. Яго структура ёсць фіксаванаяй:
{
"status": "IN_PROGRESS" | "BLOCKED" | "COMPLETE",
"confidence": 78,
"open_questions": ["..."],
"unchecked_sources": [{"name": "...", "access_status": "..."}],
"contradiction_register": ["..."],
"assumption_register": ["..."],
"adjacent_problems": [{"summary": "...", "status": "...", "blocker": "..."}],
"draft_response": "the user-facing Slack message"
}
Можна абсалютна свабода пісаць наваколе блока, але контрольныя прыемнікі ацэнююць спрацаванае звястка і файлы стану яго зафіксаваюць. Замена часткі свабоды пісаць на контракт, які можна спрацавіць, стала найэфектывнейшым спосабам заставіць выходны рэзультат LLM быць прыдатным у рамках практычнага працэсу. Калі прыбыць без схемы, кожны наступны крок будзе вынужаны шукаць факты працоўна ў тэксце. Калі ж схему застаць, контрольныя прыемнікі стануць звычным дэтэрміністычным Python.
Контрольныя прыемнікі якасці, якія надаюць значэння паказчыку доверлівасці
Паказчык доверлівасці быў бы проста маркетынгавым шумам, якбы Claude мог проста напісаць confidence: 95 і працаваць далей. Таму выходны рэзультат кожнай ітэрацыі праходзіць праз контрольныя прыемнікі якасці, якія не дазволяюць працэ прайсці даўжэй, калі доказы і заявленае доверлівасць не супакоюцца.
Пасля кожнага крока Claude працюе тры групы контрольных прыемнікаў:
- G-gates перакантруюць логічную адпаведнасць, каб разумовыя выводы не суперасліся между раундамі. Найболей ясным прыкладам ёст G1, які актываціюецца, калі
open_questionsзрасла пад час раунда, аconfidenceзросла, таму што зростаючы знаменатэль скасоўвае будзь-які адны ўгору. Гэтая група таксама перакантруець, чы рэчы, выражаныя ў напісе з атмасферай напэўнення, розглядаюцца як суперасліні, і чы суседзяючы проблемы фіксуюцца як правільныя об’екты статусу, а не як тэнплейты. Іх чатыры. - N-gates перакантруюць структурную цэліснасць, пераканаючыся, што артыфакты ўжо цэлком сформаваны і не являюцца непূরнамі. N1 выкалікае, каб кожная выпанаючаяся дзеянне па выправленню была супакоўвана з
verify_action, якая дае апісанне, прыемлівы рэзультат і час выпанення. Выправленне, запропанаванае без можлівасці яго перакантруэння, лячыцца незавершанай работай. Іх тры.
COMPLETE, калі суседнія задачы застаюцца нерашанымі, выкалеквуюць непусты рэўістар падазроў і настаюць на тым, каб прынеймна адна з запрошаных дзеянняў была напрамую спрыяючая асновной прычыне. Іх семь.На верху знаходзяцца два падтверджэння. EQ1 вымагае, каб вузлы асновных прычын наводзілі жорсткія доказы (што-небудзь кроме INFERRED) або прыймалі ліміт у 60%, а P7 зніжвае гэты ліміт на 7% за кожную адварсарскую вектору, пазначаную як FAIL, да мінімума 40%.
Уся структура складаецца з 19 функцыяў. Практычны спосаб іх запам’ятаваць: G-вораты рэагуюць на тое, што пішае Claude, N-вораты — на тое, што ён працінае, а A-вораты — на тое, што ён стверджуе.
Адміністрацыя наражэння стае елементам pending_guard_notes, які размешчаецца на пачатку запіту наступнай ітэрацыі пад загалом ## SYSTEM QUALITY GUARD NOTES (з паканяй ітерацыі), з чысткай інструкцыяй адразу распрацаваць кожную з прымечанняў. Гэта і ёсць механізм прымусу. «Вораты» не блакуюць модэлю; замест таго яны прыводзяць яго паканяе наражэння ў першыя пункты, якія ён чытае наступны раз. Вважлівасць з боку модэлю не мае значэння, і саме структурны прымус спрыяе працэўнай расследаванню.
Крок фіксацыі кантэксту (A7) таксама выконваецца напрыжынку кожнага будоўніка запітоў, незалежна ад таго, чыя-небудзь правілы былі наражаны. Ён зноў прыяўляе нераспрацаваныя суперсэкты і непарабяжаныя прыпускі з тэкушчага атласу, слова за словам, да канца наступнага запіту. Гэта прыменшвае эфект занікнення увагі, калі мадэль зафіксавае складнасць у трэцім раундзе, але проста ігноруе яе да сьпявога раунда.
Доверыя як конкрэтная цыфра
Найважлівейшы выбор у дызайне — гэта тое, што агент прызначае сабе confidence: <int> на шкале з 0 да 100 у структураваным выходзе кожнай ітэрацыі. Гэта чысло не ўсьмішка, адтолькі яно кантролюе рэальную працэздатнась:
- Калі цыфра ніжэй 70, цыкл не можа быць завершаны. Сістэма прымусова адбывае ўсьмо тры дадатковыя раунды і дагружае прыметку, у якой пазначаецца, што агент заявіў пра завершэння работ, хоця ў рэальнасі гэтага не зрабіў.
status: COMPLETE і няма open_questions, пачынаецца фаза адварсарскага аналізу (команда «чырвоныя» проты команды «сінія»).degrading. Агент адступае назад, таму ён зупіняецца і паведамляе аператара.Полная траекторыя доверлівасці кожнага кэсу запісваецца ў ANALYSIS.md у вачынку спарклайна, напрыклад 45% → 62% → 78% → 80%. Аператары кідаюць на ёе погляд, каб вярнуцца, чы рэзультат заслуговае на доверлівасць, а сам цыкл самапрадактычнага удосконалення сістэмы чытае яго, калі выбірае, якія пакульнія кэсы перадзваначыць з іншым запітам.
Тры ўзгледы, калі цыкл не хоча зупніцца раней
У дыяграме тры галузі доходзяць да ready_for_adversarial або blocked, не завершаючы цыкл. Кожная з іх ўособляе правіло працы цыклу далей: сістэма ігнаруе сігнал прыпынення і заменяе яго спецыяльным запазджальным сігналам.
- Правіло CONFIDENCE_FORCE прымае дзейнасць, калі
status=COMPLETEіopen_questions=[], але значэннеconfidenceніжэй 70. Мадэль адзначае перамогу, але за дапамою цігла выказвае сумневы. Змушаныя ўтворэння цыклу адбываюцца ў колькасці до 3 і зарахоўваюцца ў межы 20 ітэрацый, а не дадаюцца да ўжо наяўнай колькасці.
status=COMPLETE і значэнне confidence становіць прынямна 70, але causal_chain_complete не ў значэнні true. эта сітуацыя апісвае наявнасць сімптамаў без выявлення асалоднай прычыны. Яна дазволяе ўжо 3 ітэраціі, якія таксаваны ў межах 20-ітарацыйнага ліміту.status=BLOCKED, а доступныя тэхнічныя крыніцы былі прыгнораваны або адзначаны як недоступныя на падставе выводам, а не праз рэальную памылку. Раследаванне не можа завершыцца як заблокаванае, пакуль не будзе выкарана ўсё, што можна было выявіць. Яна дазволяе ўжо 3 продовжэння, якія таксаваны ў тых сабе межах.Заўсёды разам гэтыя механізмы запобегаюць тром самым частым пранаручным завершэнням: неяснасці, якая выглядае як впэўненасць, завершэнне на рывку на адзінаку сімптамаў і уявная недоступнасць.
Адварсары-рэвізоры
Калі прыемнік задання адзначае, што ўжо завершыў працу з рэверансам 70 або вышэй, кантроль пераходзіць да аддзельнага запуску Claude, які выпалюе ролю адварсарскага рэвізора. Шырокі рэвізор не бачыць запіту даследніка. Ён отрымае тэкст аналізу і спіс з 15 параметраў ацэнкі, D1 да D15, якія абходзяць праблемы правамернасці прыямоў, ланцуга доказаў, каузальнага разумавання, альтэрнатыўных гіпотэз і іншае. Ён вяртае структураванае рашэнне:
Існуе тры спосабы завершыць рэвізію:
- Крытычныя проблемы вяртаюцца да даследніка. Яго нотаткі дадаюцца ў наступную ітэрацыю як
pending_guard_notes, і цыкл пачынаецца занова, пры чым даследнік цяпер мае чыстае падтверджэнне, што рэвізор сачуў якісь момент. - Калі пасля першага праходу ёсць толькі незначныя проблемы, цыкл запускаецца ўтроце з даданымі незначнымі зауважэннямі.
complete, пасля чого рэзультаты досліджэння публікуюцца.Падзелу кроку атакі на окрэмій запіт із іншым посіланням зроблено навмісно. Той самій мадэль у рызному рэжымі фіксуе значну частыну самопохвалі, якая проходыць під час одноразового запіту. У одному віпадку рывень впевненосты знізівся з 90 до 65 між початком досліджэння і яго перэвіркою, прычому перэвіраючый вказав саме на ту прыпушчэння, яку іншувач проігнорував.
Ўсіе ўзмацаванні праходзяць таксама, але іншым спосабом: гэта ўзмацаванне ад зелёнай каманды (G5). Адварсары чытае цэлую нарадачку расследавання, тады калі як узмацавальнік ад зелёнай каманды паказваецца толькі первачны опіс проблемы і заканчэчная выніка. Ён не атрымлеў ні промежуточных вывадоў, ні следа доказаў, ні паказання пярэдніх раундаў. На аднойчыне з гэтымі двума элементамі ён стварае незалежную гіпотэзу і пазначае тыя моменты, дзе нарадачкі расследавання не паспяваюць з тым, што мог бы запэўніцца сторонній спостэрагач.
Мэтаем яўляецца канцэптуальная ізоляцыя, а не дадатковая паверкі. У працэсе адварсарскага аналізу пераканальваюцца, чы розследаванне структурна завершана (D1 да D15). Команда «чырвоныя» пераканальваецца, чы можна было бы дасягнуць вынікі без певнага падходу да розследавання: чы логіка даслівна базуецца на проблеме, чы розследаванне спрыяла раннейа нарадка і вынікі былі выведзены на адной з яе падстав, а не на доказах? Оба працэсы выканальваюцца як адзінаковыя запыткі к Claude, і оба павінны быць завершаны, прычаму справа можа быць пазначаная як COMPLETE.
Пяць чыстасцовых спосабоў завершэння
Цыкл розследавання можа завершыцца з пяці прычын. Кожная з іх фіксуецца і паказваецца аператару, як у такіх рэчах:
exit=complete confidence=89% iterations=12 elapsed=13min
exit=blocked confidence=62% iterations=4 elapsed=4min (cannot proceed without info)
exit=stalled confidence=58% iterations=7 elapsed=22min (two rounds, zero new facts)
exit=degrading confidence=42% iterations=5 elapsed=8min (dropped >15% twice)
exit=timeout confidence=73% iterations=18 elapsed=50min
З п’яты варыантыв blocked – гэта той, на які оператор можа вплінуты найбільш непасрэдна. Агент запісав явні перэшкоды в unchecked_sources або adjacent_problems, і людына повінна віконаты дзвінок, шчоб іх усунуты. Іншы чотыры – гэта тэхнічні способі збою, які сістэма віявляе і не намагаецца автоматычно іх усунуты.
Што можа зробіты Claude зсерэдыні
Тут маюць значэння межы інструментаў, оскількі рывень довіры частково залежыць ад того, які інструменты насамрэч доступні для вікорыстання. Умова, якая змушуе агента перэвіраты неперэвірэні крыніцы, не мае сенсу, калі інструменты для іх перэвіркі відсутні. Кожэн працэс запускае підпроцес Claude Code з параметром --permission-mode bypassPermissions. У запіты не вказуецца спіс дозволеніх інструментаў. Межэю ёсць все, што включэно до каталогу Model Context Protocol (MCP), які охоплюе пяць зовнішніх сістэм:
Ёсць калькі лімітацыяў, якія заслуговаюць на адзначэнне, таму што яны вплываюць на працэўнасць больш, чым што-небудзь іншае на карце модэлю:
- Інструментарый для расследавання працоўнасці явна забараняе
Bash(--disallowedTools Bash), што запобегае сітуацыям гонкі ў git, таму што два працэсы Claude, якія адразу рэдагуюць адну дрэва працы, моглі б зіпсаваць стан. Інструментарый dev-agent дазволяе вікорыстання Bash, але ён працуе ў ізольаваным дрэве працы. - Інструменты для запісу ў Slack заблокаваны пад час кожнага запуску інструментарыя.
send_message_to_selfіedit_message_to_selfне дазволены, таму Claude не можа сам пасылаць поведамленні ў Slack. Усе выходныя кантакты праходзяць праз полеdraft_responseу структураваным атласе дапамогі, які сістэма пасылае толькі пасля пераканалення умоў завершэння.
bypassPermissions на практыцы не означае безлімітныя правы. У кожнай паўтарцы працэсу ёсць жорсткія правіла, захаваныя ў інструкцыйных запітах. Файл ANALYSIS.md можна рэдагаваць, але message.json — ні. Змены, здабытыя за межамі case_dir, пасля завершэння працы автаматычна вяртаюцца за дапамою git diff. Запісы ў прыёмніку для продакшна адбываюцца толькі пасля явнай падтверджэння аператара, згідна з командай. Безпека гарантуецца за рахунак шару інструкцыйных запітоў і перагляду меж пасля завершэння працы, а не на шары вызову інструментаў.search_datadog_services вяртае адказ пра недастатак прав, запіт паводзіць агента да пераходу на mcp__glean_default__search, дзе як заменнік вікорыстоўваюцца ключавыя словы з Jira. Ланцуг альтэрнатыў ёсць часткай спосабу выкарыстоўвання стандартных процедур і не мае месца пад час рэальнай експлуатацыі.tool_use і адправляе да 10 адночасных операцый чытання (запыты Datadog, пошук у Glean, чытанне файлаў). Усе, што запішваецца — будзь то Bash з парадуктамі, праверкі, каментары MR чыя-небудзь запісы ў базе дадзенаў — адбываецца по аднаму. Такім чынам, адна ітэрацыя расследавання можа запусціць шасць паралельных запытоў да логаў і ўсё раве парадкуваць операцыі запісу.Адна структура, чатыры размеры
Кожны пайплайн у гаманцы працоўвае якую-небудзь версію той самой структуры:
Працэс розслідування у рэжымі он-кол віконуецца до 20 ітэрацій. Фаза аналізу задачы трывае до 8 ітэрацій. Фаза рэалізаціі віконуе каркас одын раз, але цыклізуе крок будові трычы. Dev-agent не мае унутранага цыклу і працюе одын раз на кожне запускання, проце mr-monitor фактычно перэмішчуе ітэрацію назовні: ён створуе новій dev-agent шчоразу, колі CI зазнае невдачы, до трох послідовніх разів, перш ніж перэдаты справу людыні.
Гэтая однорыднісць ёсць навмісною. Чотыры цыклі існуюць тому, што проблемі рызні, проце яны спілкуюцца одніею мовою: рывень впевненосты — гэта чысло, рэзультат мае назву, самокрытыка — гэта окрэмій віклік Claude, а ескалація означае повідомлення у Slack у тэмі, якая розпочала справу. Оператор вівчае цю структуру одын раз і потым розпізнае іі скрызь.
Шар самовдосконалення
Эта частка замыкае ранейшае опісанае цыкл, у якому прыстрой модыфікуе свой сабстрактны кантэкст пад наглядам чалавека. Два цыклы выканаюць задачу, але на разных часовых масштабах.
Цыкл 1 рэмонтуе структуру па кожнам случаю, ад прасоў да PR. Пасля таго, як расследаванне завершыцца, gap_analyzer шукае месцы, дзе прыстрой парадкаваў: працягнутыя ігнораванні джэрэл дадзеных, некарэктны выбар засобаў, багі ў прагоне, відсутныя тэсты і паслаба апісаныя опісы MR. Фільтры па катэгорыях і ступеню паверыць скорачаюцы прасы, прычым finalize_case яны атрымлівае. Калі каса застаецца нерухомай чатыры гадзіны, finalize_case запускае patch_suggester у спецыяльным рабочым дрэве і стварае адзін PR проты сэрцаўскага кодбэсу прыстроя, паўтараючы файлы коду, шаблоны запытанняў або раздэлы SOP. Як толькі яго можна з’едыніць, для гэтага патрэбны чалавек. Для яго стварэння — ні.
Цікл 2 спрыяе закрэпленню паведамленняў у разных сценарыях, ад спосабаў выключэння да працэў па стандартным процедурам. У канцы кожнага сценарыя крок auto_retrospective фіксуе, якія спосабы выключэння адбыліся, іх сортуюць на тры тыпы: выключэння пад час збору даных (чы не былі праўдзебныя крыніцы працэсаваны?), нарушэння стандартоў якосці (чы тверджэння пра надзею супераслігалася з доказамі?) і выключэння пад час завершання аналізу (чы трасаванне корэнных прычын не было даканальна?). Запісы накапліваюцца па праектам у рэўістары сценарыяў. Кожны тыдзень задача cron пад назвай knowledge-updater підрахоўвае апошнія дзесяць сценарыяў, і калі які-небудзь спосаб выключэння перасягае заданы ліміт, ствараецца працэ па стандартным процедурам: 3 з 10 сценарыяў выклікаюць працэ, а 6 з 10 — апавешчэнне. Працэ ўзяткі конкрэтныя. Напрыклад, «працэсаванне без прымітнага запіту да БД» адбылася 3 разы гэтага месца, таму цяпер стандартныя процедуры выкалікаюць неабходнасць прымітнага запіту да табелі перад будзь-якім выводам пра структуру. Людзі пераглядаюць і прыменяюць іх.
Эм, і нічога тут не прымаецца аўтаматычна за праектам, таму што аўтаматызаваныя рашэнні, якія паўтараюць своія самыя галючкі, ўважаюцца вядомай апасоўнасцю ў самамодзейных сістэмах.
З гэтага вынікае персоналізацыя. SOP закодаванае як адпраўнік спосабу, якім каманда вырабляе расследавання, і спачатку ёна ёсць універсальная. З часам kb-updater стварае прафіль шаблонаў абыякавасці аднаго праекту на адной з прыгод і паўтарэннях. Пасля 20-30 прыгод SOP гэтага праекту больш не падобаецца універсальнаму шаблону: ёна фіксуе, якія істочнікі дадзеных продовжваюць прахідзіць без увагі, якія інструменты выкарыстоўваюцца неправільна і якія падходы да расследавання рэгулярна не беруць у ўвагу конкрэтную базу кода. Праекты зберагаюць окалічныя SOP, таму памылкі Команды А вплываюць толькі на правіла Команды А і ніколі не заражаюць Команду Б.
Іншым прыямлівам ёсць дзейнасць. Вікна кантэксту існуе толькі пры адзіной сесіі, тады калі жа злучаныя змены коду фіксуюцца у версіях, пераглядаюцца, тэстуюцца і стаюць постояннымі. Апдэйт СПА, як толькі яго затвердзіў аператар, праказваецца ў кожным наступным расследаванні. Субстрат продовжае прабываць у стані паліпшэння, таму кожны новы кейс працюе на лепшай сістэме, чым яго попераднік.
Слой 3: стан, які застаецца пасля перзапуску
Оркестрацыя — гэта тое, што працуе па кожнай падзее. Персістэнтны стан — гэта тое, што застаецца, калі працэс перзапускаецца, апарат перэзагружаецца або аператар перайходзіць з ноутбука на хмярную ВМ. Сістэма сохраняе свой стан у трох слоях з абсолютна разнымі характэрыстыкамі:
Кеш-буферы ў памяці ёсць маленькімі і можна ўтварыць яны занова. Яны знаходзяцца ў працэсах паллеру і keepalive, і пасля перзапуску ўтвараюцца знову на адной месцовай базе дадзеных.
Локальныя настройкі у ~/.harness/*.json являюцца картою працы. Ключовыя файлы:
task-thread-map.jsonсупарабелюе значэнне thread_ts з Slackа з ідэнтыфікатаром JIRA і абсалютным шляхамtask_dir.oncall_thread_map.jsonмае той жа структуру для случаў расследавання пад час нарады.monitored-mrs.jsonпераказвае MR-ы, якія былі ачыненыя пры помочы harness, а таксама ўсталяванне CI для іх.patch-pr-state.jsonфіксуе статус завершэння кожнага случая (merged,no_gaps,failedі т. д.).oncall-state.jsonхраніць флаг абыякава, які рассматрываецца пад слоем 6.socket-dedupхраніце часовыя меткі нештаўных паведамленняў, якія ужо былі апрацаваныя у рэжыме Socket.
Эты слой належыць адной машыне і не ўзаецца. Ён застаёцца пасля перазпускання, але калі машына знікне, ён таксама знікне.
Стан, сінхронізаваны з Git — гэта стойкі слой. Рабочыя прасторы для кейсаў пад case-workspaces// фіксуюцца і выкладаюцца у прыватны рэпазітарый Git пасля кожных значамых змян стану. Другая машына, якая клонуе гэты рэпазітарый, можа перадзець той самы кантэкст размовы, што і забезпечвае працяванне сесіі між разнымі машынамі. Аператар можа спілкувацца з сістэмай з ноутбука або даўневага віртуальнага машыны-дэвелопера і нічога не пазбавіцца.
Кансалідацыя памяці пазней стала трэцьім завадзем для стану, сінхронізаванага праз git. Длігія беседа стварае дзесяткі файлаў followup_transcript_*.md. Калі накопічыцца достатнькі запісы, пад-агент чытае ўсе іх, перапішае TASK.md, ў яком утрымваецца скондэнсаваны стан, і рабочы працэс перастае падставляць неапранутыя транскрыпты ў наступныя етапы. Адмова ад кансалідацыі дазволяе запітам перасягнуць межы кантэкстовага вікна мадэлі. Яе выкарыстанне несе рызык занадто сільнага сціскання і втраты інфармацыі, і гэта справды адбылася: дакумент размахам 14 KB скараціўся да 587 байт. З гэтага інцыдэнту з’явіліся тры захоплення: шаблон запіта, у яком прыводзіцца "UPDATE, а не REWRITE", захопленне па розмеру выходу, якое не дазволяе перапісваць файлы, розмер якіх менейшы за 50% розмера вхідных дадзеных, і файл-блокіраннік для кожнага конкрэтнага случая, які не дазволяе двум працэсам кансалідацыі працаваць адночасна.
Шлях абшукання ад адной тэйпы Slack да файла TASK.md для данага случая ёсць недзіўным, але варта яго паказаць:
У обох джэраў стану зберагаецца аднаковы тып значэння — абсалютны шлях да рабочай прасторы кейса. Будзь-які працэс раней чым пазней вырашваеся ў case_dir, а пасля працюе абсалютна ўжо стосова да яго. Калі корэнь рабочай прасторы быў пераяменаваны ў мяжах праекту, адны з скрыптав перайменоўкі справіўся з гэтым, перапісавшы абсалютныя шляхі ў обох картах падчас перыяменавання дырэктарыі.
Стойкі стан ёсць фундамент. Наступны вопыт — што адбываецца, калі операцыі, пабудаваныя на ям, збываюцца, і адпаведны адказ — што сістэма восстанавляецца пасля іх і не перадае іх аператару.
Слой 4: ціклы, якія самі сабе рэмантуюць
Этам слою сістэма перастае быць тым, што прыносіць спавешчэнняя, і стае автонамной. У яй ёсць тры ціклы, кожны з яых завершаецца без удзеле аператара.
Першыя два ўстройства ўсё аб’ектна автонамныя. Трэціе ж навмысна не ўтворана як такое. Для аднавлення сесіі прадаўцы ідэнтыфікацыі трэба папярскі запіт на MFA, які залежыць ад апаратуры, таму працоўны агент зупіняецца і запрашае людзкую дзейнасць, практыкуючы 30-секундны працэс у прыватных поведамленнях. Гэта ўмышліва наявнасць людзі ў працэсе, і немая жадных прычын для недастатку можлівасцей.
Эты цыклы маюць адну тонкую спяўзаемасць: кожны з іх мае ліміт пракатоў і можа разбіраць, што ён вялікі час ужэ зрабіў. Автаматычна пацелаванне у CI мае ліміт на кожны MR, таму тры спадчыя невыконанні прыводзяць да інтэрвенціі аператара. Автаматычныя адказы рэвізора унікалізуюцься па автары, тое значыць, калі апошнія пазначка бота ў дыскусіі ёсць новейшая за пазначку рэвізора, цыкл застаецца мовчазным, таму што адказ вялікі час вучыцца. Дапаможнік для прадаўцоў ідэнтычнасці дазволяе 15-хвілінны тэрмін затверджэння. Калі адмахнуцца ад гэтых лімітаванняў, цыклы інодзе выходзяць за межы. На пачатку аднаму MR з нестабільным тэстам інтэграцыі за адзін вечар было зроблена 80 комітаванняў тыпу „пацелаваць CI“, якія нічога не зменялі, прычаму ніхто гэтага не зазначыў.
Вяснаванне пасля адзіных операцый
Вышэўказаныя ціклы аўтаматычнага выкарыстоўвання CI і адпаведзення адгукнікаў вярна вяртаюць усе працэсы з самага пачатку да канца. Пад імі кожная прымітывная операцыя, якая можа збыцца (push, rebase, каментар у MR, скасаванне галузі), практыкуецца на адной засебнай, меньшай трывясловай структуры для самавярнення пасля кожной операцыі. Яна разлічаецца ад трывясловага модэлю безпекі з 6-ю слайам, які стосуецца обмежэнняў, тыябо таго, што агент можа рабіць. Штосьце такое стосуецца вярнення да нормальнага стану, тыябо таго, што адбываецца, калі дазволеная операцыя збыцца. Іх лёгка памешчаць, таму трэба яшчо больш адзеліваць.
L1 — гэта дэтэрміністычны захоўнік. Ён працуе на адной засадзе правілаў і завжды увёрнуты, а яго рэакцыя трывае менш чым секунду. Для аплікацыі змян выкорыстоўваецца _pre_push_rebase(repo_path, branch): адразу перад аплікацыяй змян harness выкананае git fetch origin і git rebase origin<branch>. Успешны рэбейс дазволяе аплікаваць змяны. У разе канфлікту або невыпадковай аплікацыі даных L1 безбедна завершае свою працу, паказвае файлы, якія ўтварылі канфлікт, і перадае справу L2. L1 не можа свэйбамо дзейсніць якія-небудзь дадатковыя дзеянні. Правіла, якія ён выкарыстоўвае, застаюцца дастаткова простымі для розумення, а таксама дастаткова дэшавымі, без вітрачання токенав, ўсёлякія оперэйцыі можа аплікаваць.
L2 — гэта цыкл самастабілізаціі з агентам. Калі L1 не можа выправіць сітуацыю, прыстрой запускае обмежаную сесію Claude (_self_heal_push_loop) і дае ёй всю інфармацыю пра абярон: стан git, файлы, якія створылі канфлікт, задачу, якая спрыяла падачы дадзеных, а таксама калькольныя межы. Ніколі не выконвуйце force-push на захішчанай гілцы, ніколі не адхроніруйце непаданых комітов і ніколі не выбірайце сторону канфлікту слепа. Тры обмежэнні забезпечваюць безпеку:
- Абсалютна колька спроб. Кожны інцыдэнт мае не больш чым 3 спробы, а кожны тыраж Воблака мае таймаут у 4 хвіліны. Пасля кожнай дзеянні Воблака прылада знову выконвае рэальны
git push. Мненне Воблака пра тое, чы розбіжнасці зніклі, не мае значэння, і ўнікальным крытэрыям ёсць код выхідны зgit pushравны 0. Калі наступныgit pushвяртае ненулявы код, цыкл фіксуе невыполненую спробу, незалежна ад таго, насколькі абяцерна Воблака стверджваў пра успех. - Праблема доверыя на рэвэле 70 або вышэй. Гэта правіло заўсёды бераецца без змян з налашоўкаў
oncall_runу пайплайне расследавання інцыдэнтав. Воблака кожны раз оцінюе сябе з 0 да 100, і калі рэвэл ніжый за 70, ён павінен завершыць работу, а не дзеяць. Ацэнка ніжэй за ніжнія межы не дазволяе яму змініць рабочы дрэво.
git push з кодам 0 і ніколі не на ўсё, што Claude кажа пра сябе. L2 не можа абійсці гэтую сістэму; ён можа толькі надаць яе рэальны запуск.L3 — гэта эскалія да аператара. Калі L2 не змог працаваць праз недастатак доверы чы скасаваў свае спробы, сістэма надае аператару прыватную паведамленне з усімі дакументамі L2, тыя включаюць кожную спробу, кожны захад, які выканаў Claude, кожную оцэнку доверы і фінальны статус git status. Аператар прыступае да працы з усімі неабходнымі дадзеннямі, а не з інформацыяй пра тое, што "чыгнула проблема". Часовы масштаб — гадзіны, а не секунды.
Выдэляюцца два прынцыпы:
- L2 працюе толькі пад час адзінаго інцыдэнта і не ўвесь час увімкнуты. L1 працюе пад кожны запуск, таму што ён дышэўскі, тады як L2 спалюе токены і запускаецца толькі пасля таго, як L1 зазнае нядачы; такім чынам выкліканыя затраты залежаць ад рэдкіх случаяў, а не ад стандартных.
- Абсолютная правда выходзіць з самай сістэмы. Незалежна ад таго, калякія мнення мае Claude пра свою працу, працэс паверкі перадае рэальную операцыю: код выхідныя даных
git pushпад час запускаў, рэальны тэст пад час выправлення бягаў і пераканальванне сервера адпаведзення на запуск пад час адпаведзенняў на прынтакі. Сама адпаведзенне агента ніколі не спрыявае як абсолютная правда, таму што сістэма зноў пераканальвае яго за дапамою рэальнай сістэмы.
Той жа самы рэшэйк падходзіць для даўно большых колькасцей операцый, чым толькі для push-апошнікаў. Аперацыя падходзіць для выканання, калі існуе тры элементы: простая парадкавая метода адлагоджэння (L1), строго обмежаная спроба павторнага выканання агентам (L2) і чысты спосаб прыявлення задачы чалавеку (L3). Гэта трывярная структура разлічва автонамны цыкл, які можа восстанавіцца пасля неудач, якія ён ведае, ад таго, якому патрэбны людзі ў момент, калі сітуацыя растлумачваецца інача.
Слоўна 5: чатыры месцы, дзе можна пазнакоміцца з тым, што адбылася
Інструмент запісвае даныя на чатыро рэквізіты стану сістэмы, і кожны з яных налаштаваны для разных корыстнікаў:
- Рэальні оновлення у Slack. Покі агент працюе, повідомлення-заміннік у потоці справ проходыць праз рызні статусі (
Reading TASK.md, потымSearching codebase, нарэштыDrafting patch) і в кінцевому підсумку стаеDoneабоFailed: <reason>. Гэты потоковій звітнік рэдагуе одне повідомлення на місці, шчоб потокі не заповнюваліся зайвою інформацыяй. - Структуровані журналі знаходзяцца у
~/.harness/logs/agent.logі~/.harness/logs/error.log. Кожна спроба запуску, апрацоўкі ланцюга і повторноі спробі стае структурованою подыею, і саме ці файлі вікорыстовуюцца для дыягнастыкі у разі проблем.
~/.harness/logs/system.log для разных запускаемых задач, такіх як завершэнне развяртання, дзеянні старожыла чы статус сінхронізацыі.Панель керування была навмысна не дадзена. Скайп і grep служаюць як консалі. Панель керування стае трэцяй плошчынай для отрымання актуальной інфармаціі, і гэта перша раштучка, якую інжынеры перастаюць чытаць, калі ёй становіцца застарэлай. Фармат стрымування паведамленняў дае достатню колькасць оператыўных сігналоў, таму ніхто не хацеў дадаць да яго UI.
Следзіце за з’язкамі MCP
Пяць зовнішнях сервераў MCP (Slack, Datadog, Jira і Confluence, Glean, GitLab) служаюць адпаратам для ўтрымання працы сістэмы. Кожны з іх мае свой сопрацоўнічы токен OAuth, часавы інтэрвал апдэта і способы выклікання проблем. Калі токен заканчываецца без адзначэння, сесія Claude пачынае адпавядаць: «У мяне немае доступу да гэтага інструмента», а аператар узагалі не бачыць жадных памылак.
Маленькі сервіс пад назвай mcp-watchdog закрывае гэтыя праслейкі. Кожныя 10 хвілін ён пераглядае точку доступу до стану кожнага сервера MCP і прыменяе вызов інструмента, які не выкалічвае жадных дзейснасцей. Калі гэта не выходзіць, ён выконвае наступнае:
- Ён прабуе тыха апдэт токена.
- Калі апдэт не выходзіць, ён падае прыватны запуск у Slack для аператара з паведамленнем на кшталт «MCP ад Atlassian трэба перэпрацавіць, натысніце тут».
- Пасля двух паўзлів у з’яўленні звязку (па параметру
DISCONNECT_CONFIRM_THRESHOLD) ён паднімае прыголасканне:warning:на найсвежэйшым заявкі.
Без гэтага ціклу прыпынены токен можа быць спылучаны з сітуацыёй „агент сегодня некомпетэнтны“, што ўскладнюе дыягностыку, адколі faillog ніколі не паведамляе пра тое, што „токен прыпыніў свою дзейнасць“. У яго паведамленнях напісана толькі, што „інструмент вернуў порожнія рэзультаты“. Расследаванне стану аўтэнтыфікацыі як важлівага параметра стану сістэмы — гэта тое, што трэба было зробіць раней.
Слой 6: панэль керування аператара
Этае найбольш вжываная панэль керування, якая спачатку была недастаткова розбудованая. Кожная взаімадзеянне аператара праходзіць праз адны канал — сам-DM, а команды дзеляцца на шасць груп:
- Задача:
admin: task <jira>запускае весь працэс аналізу, рэалізацыі і MR, а дадзенне параметра--autoробіць яго автономным.
admin: oncall-run <url> пачынае расследаванне з паўтарэння спытку ў трэдзе Slack, а oncall-toggle увыключае або увялічвае автаматычны манітарынг.admin: mr rescan зноў пераглядае адпаведны MR, а mr pause/resume увыключае або увялічвае цыкл автаматычных адпаведзей для таго MR.admin: oncall pause [duration] на час выключае автаматычную даставу спытакоў, а oncall resume/status завершае паўзу або дапамагае з’ясавіць тэкушчую сітуацыю.admin: finalize <case> агрупавае усія звыткі пра недастаткі і стварае прапанову па ўдосконаленні самага інструментарыя.admin: register-thread ручнае прыяўленне паведамленняў у Slack да конкрэтнага кейсу, тады як close-case пазначае кейс як завершаны.Спуск функцыі паўзы прыйшлося нарабатваць дольшэй за ўсе іншыя. У першай версіі паўзавалася ўсё, укладаючы і команды ад адпаведальнага адука, што не дазволяла аператару, які паўзіў сістэму, яе знову запусціць. У другой версіі паўза была занадта вузкая, таму просьба «зупініць шум» не выконвалася. Чырвоны дызайн базуецца на адной точнай размежованасці: паўза замовляе тышу ў аблікованні автаматычных дзеянняў, якія запускаюцца пад час актывасці іншых людзей, але ніколі не зачыняе сабеўных команд адпаведальнага адука чы ўсіх дзеянняў у паведамленнях. У механізме паллеры аблікованні дзеянняў дзеліцца на два групы. Адна група — гэта автаматычная актывасць, якая запускаецца пад час дзеянняў іншых, і яна замовляецца паўзай. Другая група — гэта сабеўныя намеры адпаведальнага адука, і яе дзеяння застаюцца актываўнымі.
Калібрацыя была адзначана сложнасцю. Чырвоны пасля таго, як была адправлена першая версія з паузай, автаматычны адказ на коментары рэвізора тыхо запрацаваў у іншым кейсе і засталіся непазначаныя, таму што пауза выглядала так, нібы ўжо дзейнічала. Чэрпашняя структура прымае паузу як намераваную тышу: глушыць сістэму, адначасова захоўваючы можлівасці аператара.
На картынцы паказана раздзеленне:
Правілам ёсць тое, што сабеступкі аператара ніколі не глушыцца, а дзеянні іншых людзей блокуюцца пад час паузы. Гэта ўсё, што керуе параметрам admin: oncall pause.
Ішчыны два слоі безпекі
Ключ выключэння паузы ёсць найболей відчутным элементам безпекі, хоць і не ўсім. Ішчыны два працуюць без якой-лібо настаўкі пад час працы: адны — у кодзе, іншыя — праз стандарты развёртвання:
Спісак дазволеных каналаў у Slack заслуговае на большую увагу, ніж можа здавацца. На раннім этапе праекту быў майжэ інцыдэнт, калі токен Slack з неправільная настройкай могаў пісаць у внутрашнія каналы команды. Агент мог бы пасылаць поведамленні безпосерэдна членам команды, прахіднічы аператара, і ніхто не мог бы адзначыць разлік межаў між такімі поведамленнямі і тымі, якія падаюць ад люсты. Ёнтэлькі кожна выходная запускаемая задача chat.postMessage перакантролюе свою пункт прызначэння за дапамогою спіску дазволеных каналаў пры ўсылці. Ядзін дазволены пункт прызначэння — гэта персональны DM аператара, а таксама адзін жорстка-закодаваны ID канала для перасоўніцтва аператара з ботам. Якшо агент хоча падысці да члена команды, ён перадае контэнт аператару, які рашыць, чы хацець яго перасłaць. Гэтая архітэктурная правіла продовжае падтверджваць ся: агент можа выходзіць на звязак толькі праз поштовы яшчык аператара.
За межамі шасцях слоёў: што робіць гэта раштункам
Шэсць слоёў являюцца несучай структурой. Існуе ўзельцы, якія не паўтараюцца ў гэй таксанаміі, але маюць такое ж значэнне. Яны разлічваюць прыстрой, які эфектыўна дэманструець свае можлівасці, ад таго, які працуе без перашкод.
Распрацоўка калькі праектаў з адного файла YAML
Сёньня на гэтым прыстрое працуюць два праекты, кожны з своімі правіламі працы, і для дадаўшчага трэцьяго праекта не патрэбны жадныя змены ў кодзе — достатнь толькі новая ентрыя ў agent-config/projects.yaml:
projects:
team-a:
sop: "team-a/SOP.md"
kb: "team-a/KNOWLEDGE-BASE.md"
dfr_threads_dir: "team-a/threads"
task_dir: "task-workspaces"
slack_channels: ["support-channel-a", "support-channel-b"]
jira_prefixes: ["AAA", "BBB", "CCC"]
team-b:
sop: "team-b/SOP.md"
kb: "team-b/knowledge-base/kb.md"
dfr_threads_dir: "team-b/threads"
task_dir: "task-workspaces"
slack_channels: []
jira_prefixes: ["XX", "YY"]
Функцыя resolve_project() направляе кожны прыходзячы сігнал за прыорытэтам: спачатку прыдзе прадфікс Jira, потым канал Slack, а пасля — стандартны варыянт. Кожны праект мае свой файл SOP, файл KB і дрэво каталогаў, а пры стварэнні запіту на расследаванне автаматычна выбіраеяць правільны файл SOP і KB ў залежнасці ад таго, да канкрэтнага праекта прыналежы сігнал. Гэта дазволяе екземпляру harness служыць двум командам з двума набрамі правіл.
Гэты патэрн ёсць узагальненым. Будзь-яя організацыя, якая мае калькі продуктовых каманд у ўсём harness, можа выкарыстоўваць той самы падход: дэкларатывная настройка без аддзельных галузей кода для кожнага праекта. Гэта таксама спрыяе адстаўнай дысцыпіне, адтолькі што все, што ўзначальнае канкрэтны праект, павінна знаходзіцца ў яго файле SOP, а не ў кодзе, таму што код ёсць спільным.
Аднова сесіі на будзь-ям з апаратаў
Апаратчык работае з двумя прыстроямі: ноутбукам і віртуальным апаратам у воблаку, які працуюць даволі дазго ў цэнтры размяшчэння дадзеных, і адна сесія Claude павінна магчымаць продаж чынення на обох. Гэта складна, таму што Claude Code за значчынай настройкай зберагае стан сесіі на локальным дыску, тады пасля перзапуску на іншам прыстрое сесію нельга знайсці.
Рашэйдзер раўняе гэтыя проблемы за дапамогою хранення сесій на адной базе дадзеных, падтрымванай git:
Механізм складаецца з трох частак:
- Сесіі фіксуюцца ў git. Кожныя файлы сесіі
.jsonlі.metaзберагаюцца і выкладваюцца ў прыватны рэпазітарый пасля кожных значных змян стану, і гэты рэпазітарый являецца аднаковым джэрэлам правды. - У кожным прыстрое кожных 5 секунд запускаецца фонавы працэс для падтрымкі актуальнасці локальнай копіі. Ён загадзя завантажвае неабходны кантэкст, тады прадач чынення сесіі Claude не вімагае пераказвання дадзеных праз сетка пасля кожнага натыку на клавішу.
session-start.sh пераглядае локальныя файлы .meta на наявнасць запісі, прыязначанай да гэтай катэгорыяй рабочага каталога, і выбірае яе UUID. Такім чынам адны UUID супроводжвае аператара па разныя машыны.Хук сінхронізаціі, user-prompt-submit.sh, запускаецца пасля кожнага запіту Claude і выконвае тры операцыі ў строгай архітэктурэ, серыязаваныя за дапамогою flock:
- Зялезце і скасаваць. Выкананне команд
git fetch origin main && git reset --hardзаставляе локальны файлactive.jsonlзберагчы тэкст з іншай машыны. - Выкарыстоўваеце дэльту прытаму, перш чым змяніце даныя. Сістэма чытае «вадзермарк», тое ўскількі ліній ужо было дадзена з іншага апарата, выдэляе толькі новейшыя лініі і зберагае іх у тэмпарарны файл. Гэта павінна выконвацца раней, чым перайсці да крока 3. Ранейшы баг прыводзіў да таго, што гэтыя два крокі мяніліся месцамі, таму сістэма продовжвала чытаць сабе ж свой власны транскрыпт.
- Адправляйце свой сабэй транскрыпт. Сістэма копіюе локальны транскрыпт сесіі Claude у файл
active.jsonl, здзейснюе коміт і адправляе яго, пасля чыго ставіць «вадзермарк» на колькасць ліній у локальным файле.
Пасля таго, як сістэма завершыць працу, дэльта, зберагнутая на кроці 2, падае да Claude як сістэмныя паведамлення, у якіх указваецца, што іншы апарат дадаў N паведамленняя з моменту последней сінхронізацыі. Пасля чаго наступны запіт бачыць кантэкст абоўх апаратаў.
Сэрбны файл .linecount зберагае адказовы ўсходзічны лік строек, таму што wc -l дае некальканастае рэзультаты, калі транскрыпцыя была скорачана для адправкі. Ёй скарбяюць 1 000 строек перад адправкай, каб не перасягнуць ліміт git у 25 МБ. Без .linecount кожна скорачэнне перазначае водны знак, і пры новай адправцы зноў будуць перадаць тыя ж тысячы строек.
Операцыя git, серыяваная за дапамою flock, запобегае паказанню спражненага index.lock пад час адночасных адправак, што ўжо трапілася раз, калі затрыманы запуск сесіі перакрыўся з працай мета-працоўніка. Функцыя рэгулювання, якая за замовчэннем налаштавана на 30 секунд, пры швайных натысканнях клавіш пропускае цэлы сінхронізацыйны працэс, таму не выступае затрымка git па кожны сімвол.
Шырэйшая ідэя, яку варта пераняць, — гэта іспользованне Git як сховішча стану. Git тут выступае не проста як хранілніца коду. Ён функцыонуе як стойкая лог-файловая сістэма, сэроднючая CRDT, для зберагання стану агента, пры чым два камп’ютары аператара выступаюць як чытальнікі, якія зрэшты будуць у ўзгоднасці.
Кансалідацыя памяці тычыцца безпосерэдньа да працэйнасупрацоўкі межы разнымі апаратамі. Крок memory_consolidate, які перапісвае транскрыпты ў чыстыя файлы TASK.md і ANALYSIS.md, не запускаецца за таймерам. Адзінэчны сервіс consolidate_trigger пераглядае кожны этап дыялогу на наявнасць чатырох сігналав: SHA-код зберагання дадзеных або гласавы выраз прымэры рашэння ў транскрыпцыі, недавна закрытыя тэмы для адгукнення, працоўныя просторы з сумарным об’ёмам транскрыпцый больш 5 KB, або прынеймна гадзіна з моменту пярэдней кансалідацыі. Будзь-які з эўтасых сігналав запускае працэс. Прычына ў тым, што інфармацыя перастае накаплівацца пасля прымэры рашэння, а не пасля паведамленага часу; разам этыя чатыро сігналава дапамагаюць адначасова ацэніць, чы не настала паветраная пауза ў дыялогу, тады аператару не трэба яе прызначаць.
Worktrees — гэта не проста дэталі рэалізацыі
Раней гаворалі, што ўсё выконваецца ў worktrees. Гэта заслуговае на адзагляд, бо выбор, які стоіць за гэтым, мае рэальную значымасць.
У пачатковай версіі праекта агент мяў выдаваць разлікі, а засоб для обработкі — запускаваць git apply у галоўнай базе дадзеных. Гэта прыводзіла да двух спосабаў аббіяння, якія постаўляліся знова і знова:
- Нестабільныя заголовкі разлікі. Claude выдаваў разлікі, у якіх номеры ліній былі правымі ў момент стварэння, але некорэктнымі пасля таго, як прыбываў іншы коміт, і
git applyадхоўляў усю пачатковую змяну. - Застраглая галоўная структура. Калі
git apply --checkаббіяўся на паўпаце, галоўная база дадзеных заставалася часткова обработанай, і наступны працэс, які запускаўся на той жа базе, успадковваў нечыстую структуру.
worktree_manager — гэта рашынак. Перад кожным агентам, які должны зменіць код, ён стварае ізольаваную рабочую дрэва пад адрэсай ~/.worktrees/case-<case_id>-<stamp>/, якая бераецца з чыстай гілкі. Claude працуе там за дапомогою своіх власных інструментаў Edit і Write, што абырае неабходнасць вікорыстоўвання git apply і перадачы даных праз тэкст разніцы. Ён працуе як чалавечы інжынер: стварае новую гілку, берае з яе копію, пасля чаго рэдагуе, фіксуе і выкладае змяны.
Калі PR адзначаецца як злучаны чыстаю гілкай або закрываецца, рабочая дрэва удаляецца. Частковая нявыплата паўтараецца толькі для той рабочай дрэва, не паўтараючыся для галоўнай копіі і іншых паралельных заданняў.
Самэ гэта робіць паралельныя агенты безпечнымі на адной машыне. Без рабочых дрэваў па кожнам заданні два заданняя ў той самый рэпазітарыі маглі б конкуруваць за стан файловай сістэмы. З іх вікорыстоўваннем заданняя за сваёю структурой ізольаваныя.
Harness сам стварае рашынакі для своіх pull requests
Джэрэло гэтага харчування знаходыцца у прыватному рэпазіторыі на GitHub. Колі справаздача про проблему прызводыць до покрашчэння самого харчування, гэты справаздача проходыць праз власну сістэму CI, што включае pytest, інструменты для перэвіркі коду і перэвірку сінтаксісу Python. Окрэмій сервіс pr-ci-fixer апрацоўвае будзь-які помілкі такім самім чыном, як mr-monitor апрацоўвае помілкі у заявах про віправлення.
Рэзультатом ёсць самовідновлення коду, напісаного для заявок, і коду, пов’язаного з харчуванням. Калі справаздача про проблему додае новій бюджэт на спробі вірышэння і порушуе існуючый тэст, сістэма CI повідомляе про гэта. pr-ci-fixer віявляе проблему, запускае сеанс у Claude у робочому дэрэві, віправляе іі і знову надсілае справаздача, шчоб людына-рэцензент могла прыйняты яго для об’еднання. Такім чыном цыкл ужо неодноразово завершувався пасля змін у самому харчуванні.
Адаптавацыя ціклу да самага джэрэла харчавання — гэта найлепшы спосаб пераканацца, чыргуе ён тэперыць называцца часткай працэсу вырабоцтва. Агент, які можа прымусіць своія запіты на змены застацца у статусе «зеленага», верагатліва, падходзіць для керавання запітамі іншых людзей.
Пяць слоёў тэстаў для пяці класаў абыектаў, якія можу зламацца
У харчаванні ёсць 4,656 функцый тэстаў у 126 файлах. Гэтыя цыфры малая значэнне без канструкцыі, якая б паказвала, што самэў тэст выканае, адтымушчы, што тэсты не ёсць роўназначныя.
Канструкцыя ад L0 да L4 прызначае кожны тэст да аднаго з пяці слоёў на адной з асновах, якія ён ізолюе:
- L0, чыстая межа. Нічога не імітуецца, няма файловай сістэмы чы супрацоўкі з уводам/выводам. Ён пакрывае чыстую логіку, такую як функцыі кантролю, выкарыстоўванне JSON і арыфметыку, якая вядома як «стэпень довер'я», і все, што працуе на рэвэлі L0, будзе працаваць у любай асяроддзя развяртання.
Тэсты L4g вімагаюць найбільшэ зусіль для напісання, але іх зберыгання мае найвішчу ціннісць. Яны кодуюць інстытуційну памяць про способі вінікнення помілок, які залішаюцца непомітнімі до тых пір, покі не стануцца знову.
Керывніцтво з стылю, якое запобігае тому, шчоб рэзультат був схожый на машынній тэкст
Кожны рэпорт змян, які праходзіць праз сістэму фіксацыі змян, пераварачваецца праз ўсё больш адзін фільтр пры падачы, і ўсё гэта робіцца са адпаведнымі інструкцыямі, напісанымі спецыяльна каб выхідны тэкст не выглядаў як генераваны штучным інтэлектам. Правіла ўсё простыя:
- Ніякіх апазначэнняў штучным інтэлектам. Не дазволяецца іспользоваць
Co-Authored-By: Claude, фразы "Generated with Claude Code" або суфікс[bot]у паведамленнях пра змяны. Рэпорт належыць командзе, а не модэлю. - Няма заголовкаў у фармаце "Усё, што робіць гэты рэпорт / чаму ён нам патрэбен". Такія шаблоны забанены. Апісанне должна быць цэлым абзацам з конкрэтным спіском
Changes:, напісаным так, як гэта зробіў бы інжынер рукой. - Няма жыркага шрыфту ў тэксце. Не дазволяецца іспользоваць пазначэнняяў на кшталт
Root cause:з абзацам пад імі, таксама як іFix:іRisk:. Жыркі шрыфт у фармаце тагоў — гэта самы надзейны паказнік таго, што тэкст напісаны машынай.
pytest tests/test_foo.py::test_bar -v разам з рэальной командай і трымаі лініямі выходных даных такі прыклад ўтварае.Калі запрацоўваецца опіс патча, правіла SOP вводзяцца ў запрошэнне для стварэння патча. Яны знаходзяцца окрэмна ад шаблона запрошэння, таму ўпраўляльнікі можаць іх рэедытаваць калі толькі пажадаюць; такім чынам наступны патч будзе адпавядаць новым правілам без паўтарнага запуску дэмона чы змены коду. Нават цікл паўтарэння можа прызначаць змены правіла SOP, таму мета-правілы ўсёга, як агент пішаць патчы, таксама знаходзяцца ў фармаце патчаў і перадаюцца разам з файлам, які іх храніць.
Гэта мае большое значэнне, чым можа здавацца. Нічога не разрушае довер'е да автаматызаванага працэсу MR быстрэй, чым калека з'являецца, што кожны опісанні выглядае як тое, якое створыла машына. Калі такая думка утвердзіцца, рыгоркі падвышаюцца, справжнія сігналы агента захопляюцца, і аператары пачынаюць хацець перапісваць опісанні вручную, што супершчытна для меты. Стандартны процедура стылю дапамагае так, каб опісанні злучаліся з тымі, якія напісаны людзьмі, і гэта дапамагае працаваць цыклу.
Адна заявка, адна MR — ад пачатку да канца
Ось што выклікаецца, калі прыходзіць рэальная заявка. Часы ўсё ж такі апрыксіматывныя.
У цэлым, гэты цыкл зазвычай завершаецца за 30–90 хвілін стандартнага часу для маленькай або сяродней заявкі. Абсалютны час актыўнага участка аператара зазвычай станавіцца менш чым 5 хвілін: паўтарэнне аналізу, неабавязковая керовання неодназначнымі рашэннямі і неабавязковая клікацыя на «з'еднанне».
Адзін у адзін накапліваюцца рэшчыты расследаванняў. Пасля 30 кэсаў стварыліся 30 файлаў gap_report*.md, кожны з якіх фіксуе тое, што, на думку LLM, могла бы стаць лепшым. Кожныя две недзелі запускаецца команда admin: gap-patterns, якая групавае іх па перадвыклівых модусах абяцэння, а наступны етап фінальной перацэнкі ператварае большыя групы ў практычныя рэшчыты, спрамованыя на рэпазітарый harness, што значыць, што сам harness падвышае свою якасць. Гэта ўтверджаны цікл самападвышэння.
Як ён паўстанае ў порэвананні з іншымі harnessамі
Некалькі іншых сістэмаў маюць падобную структуру harness. У табелі паказана, дзе гэты harness ператыкаецца з імі, а дзе разлічаецца:
Дзе гэты harness заходзіць незвычайна глęбока:
- Заблокаванне гіпатэзы пры прадзеяве. Claude прымее на адпаведнасць як мінімум шасцям кандыдатскіх гіпатэзаў прычымоўна да запуску адной тэрапіі, што не дазволяе пазнейшай рацыоналізацыі. Ніякі з комерчыяных рашэнняў у парадку поручэння не мае адпаведнага рашэння.
- Фрамворк кантролі якосці з 19 функцыямі і механічнымі лімітамі доверы. Довера абмежваецца фіксаваным формулам, якая пачынаецца з 1,0 і зменшаецца на 0,08 за кожны нерашаны пытанне і на 0,05 за кожны непераканалёванный істочнік, таму гэта больш ніж проста самастатковая цыфра. Допамога адпаведных штрафаў па кожнай віцэбранзе дапамагае контролюваць логічную адпаведнасць, структурную цэліснасць і ліміты тверджэнняў. Ніякі з комерчыяных рашэнняў у парадку поручэння не мае такога рашэння.
oncall_run да case_followup, gap_analyzer, finalize_case і dev-agent. Кожны звязак мае вялічыну перадачы задач і адзінакавую структуру працы, таму задачы дзеляцца між агентамі, а не падкладаюцца на аднаго.Там, дзе ён навмысна просты:
- Няма формальнага інструмента для ацэнкі. LLM не ацэніваецца на апэкстасе, а ацэнкай служыць адзінавочная інфармацыя.
- Няма панелі керування, толькі Slack і логі.
- Няма метра віткоў. Іспользоўка токенаў фіксуецца нечыста і не паказваецца на панелі керування; віткі абмежваюцца шляхам парадактовай паўтарэнні крокаў адзінавочнай перапрацоўкі.
Што застаецца, і мета-цыкл
Інструмент продовжвае развівацца: застаюць нерашаныя пытанні, якія стосуюцца пакрыцча автонамным цыклам, метрабілінгу віткоў і формальнага інструмента для ацэнкі, прычаму ніякі з іх не ёсць пераканальнай прычыной. Ён вядома выконвае свою месца: ператварае сігналы з Slack у з’едынены код, адпавядае на адзінавочную інфармацыю пераглядача за ноч, самастойна відновляе працэсы CI і вносіць сваія паследнія прадукты назад у наступную версію.
Праўdziва нарада — гэта мета-цыкл. Кожны «шрам» у крэас-хантсе існуе там, таму што рэальны кейс надаў на яго напор. Стварэнне і эксплуатацыя — гэта адны і той самы цыкл, які працуе з двума разнымі швальнамі. Сігналы з працэй крануецца назад да самага крыніцы крэас-хантсы, агент практыкуе выправленне, чалавек яго пераглядае і з’еднае, і ўсё больш канкрэтных багоў стае бліжэй да усунення.
Сістэма ўсё ж не завершана. Крэас-хантса, якая думае, што ўжо завершана, перэстала накапліваць «шрамы», што ў іншых словах значыць, што яна больш не працуе пад рэальным навантажэнням.
Спачатку створыце цыкл, а толькі пасля — зробіце яго автонамным. Автонамная сістэма без шляху зворотнага зв’язку ў свой сабе-субстрат проста шыркае тыя ж аблыкі быстрэй і ў большай колькасці, таму так важна правільная парада дзеянняў.