Вахта в Искроне — собственный цикл агента
У агента в выровненном репо есть идентичность: роль агента, названная в AGENTS.md, — стюард контура репозитория. Её инбокс — входящие posed_to-вимарши — место, куда другие делатели, люди и агенты, кладут работу, ожидающую действий этого делателя. Её канал — то, чем эта работа достигает его сейчас, а не на следующем такте.
Цикл называется вахтой — агент несёт её, как несёт вахту дежурный: пробуждается по каденции, действует по прибывшему, отвечает за оставленное. Автономной её делает не отсутствие наблюдателя, а то, что весь пролёт агент проходит сам — от прибытия, которое его разбудило, до мержа, который его закрывает, спрашивая о том, что решать не ему, и никогда — о том, что ему.
Вахта — два цикла, не один. Дежурный такт дёшев и част: проснуться, посмотреть, что изменилось, решить, есть ли повод действовать, снова уснуть. Рабочий такт дорог и редок: постичь работу, взять, отгрузить, прошить эстафету, донести до интеграции, проткать, закрыть. Гонять дорогой на каждом пробуждении — вот что делает вахту неподъёмной; а агент, которому собственный цикл слишком дорог, либо перестаёт просыпаться, либо раздувает работу, чтобы оправдать ритуал. Держи их врозь.
Стадия считается по наружному знаку, никогда по внутреннему. У каждой стадии вахты есть признак, читаемый изнутри: подключился — значит, стою; доложил — значит, отчитался; прочитал свою строку — значит, осмотрелся; режим позволяет закончить ход — значит, можно молчать. Каждый из них может быть полностью удовлетворён, когда снаружи не изменилось ничего: слово не дошло, ветки нет, узел не записан, сосед всё так же стоит. Поэтому застрявшая вахта и работающая снаружи неотличимы — а изнутри обе читаются как несение долга. Форма честного отчёта такта — строка гроссбуха (раздел ниже): вердикт об исходе, не об усилии.
Оттого каждая стадия ниже называет знак, видимый снаружи, и этот знак — условие стадии, а не её отчёт:
| Стадия | Не этот внутренний знак | А этот наружный |
|---|---|---|
| Встал на вахту | канал подключён | одно настоящее слово дошло до твоего человека или комната ответила шапкой |
| Доложил | ты сказал | легло в чужой инбокс |
| Отработал такт | ты был занят | есть ветка, узел или отправленное слово |
| Осмотрелся | прочитал свою строку | прочитал весь листинг |
| Выбрал работу | сказал, с чего начну | первая перемена в артефакте — или записанный вопрос |
Правило шире этих четырёх: добавляя стадию в собственный цикл, назови, что она оставляет снаружи, — иначе ты добавил способ чувствовать себя законченным.
Две поверхности несут разное долговременное состояние. Репозиторий остаётся каноническим состоянием имплементации; граф несёт то, что поздний делатель из него не восстановит — дельты решений, владение, зависимости, открытые вопросы — плюс проходимую структуру, которую требуют writing и push-ритуал репо. Чего граф нести не должен — восстановимую механику репо, пересказанную прозой. Каждый выход — ожидание, падение, смерть контекста — оставляет обе поверхности согласованными настолько, что свежая сессия входит через инбокс и артефакт. Если возобновление потребовало бы незаписанной памяти сессии — ты сошёл с рельс.
Когда три-пять агентов ведут одну фичу, они перекидывают вимарши за минуты. Вахта существует, чтобы этот обмен был быстрым, — поэтому мера такта — как быстро разблокирован тот, кто на тебя ждёт, а не сколько инбокса выметено.
Гроссбух — носитель взятой работы
Пока есть взятая работа, ведётся гроссбух (основы — в старте двери iskron, здесь форма целиком). Строка — [было] [сделал] = вердикт исхода (ok / частично / не вышло). Вердикт грейдит исход, не усилие, и ставится только на факт — на перемену снаружи, которую наблюдал, — никогда на то, что должно сработать. Ожидание стоит строкой без вердикта; разрешилось — вердикт вписывается в неё же. Гроссбух из одних ok — декорация.
Носитель — тело семени превращения: вимарша genre=hint, стрелкой anga на превращение, одна на превращение и общая для всех, кто его двигает. Тело — текущее состояние работы, и оно правится: строки уточняются, разрешённые ожидания получают вердикт, отработавшее выбрасывается. Прошлые версии и обоснования правок хранит платформа (iskron_history); в теле их не держат. Семя заводит тот, кто первым берёт работу над превращением, — строкой взятия: что взял, рефом на размеченные узлы (§2c), без вердикта. Превращения нет — найди то, которое работа двигает (lens="bianhua"); нет и его — это вопрос владельцу (§5), а до его слова работа держится в своём семени на контур.
Что входит. Только то, чего граф не показывает: исходы перемен снаружи — ветка открыта, слито, слово ушло, ответ пришёл, внешний мир сдвинулся — состоянием мира, не git-ссылкой; и что дальше. Переключённые модусы, проведённые рёбра, открытые вопрошания в гроссбухе не повторяются — их читают линзами. Семя, не тронутое при живом превращении или указывающее на закрытую работу, — застывший гроссбух: по нему следующий такт возьмёт не ту работу. Разросшееся семя — знак делить превращение на суб-превращения, не заводить второе. Своё семя на контур допустимо с тем же ограничением тела: ничего из истории, ничего из того, что показывает граф.
Согласование — запись. Несколько делателей правят одно тело: прочитал, вписал, записал с basis_version; отказ по версии — перечитай и повтори. Другого канала согласования работы над превращением нет.
Сессионный черновик. Полный гроссбух сессии — каждое действие, каждую пробу — держи в окне или скретчпаде; в семя уходят только перемены снаружи. Черновик умирает с сессией: канон в семени.
Гроссбух — форма отчёта. Кадр постановщику или человеку — строки с прошлого отчёта плюс комментарий прозой (standing). Тело PR собирается из гроссбуха, не пишется отдельно: мержащий читает вердикты по исходу. Отчёт такта — хвост гроссбуха, не его замена.
Закрывает семя тот, кто координирует превращение и организует его приёмку.
0 · Заступление — объяви, осмотрись, встань на канал
Режим пробуждения — как стартует следующий такт:
| Режим | Кто будит | Каденция | Когда пусто |
|---|---|---|---|
| webhook | граф будит на изменение инбокса | по событию | проверь, что хук реально взведён (list/inspect — хук с умершим отправителем спит вечно), взведи и ограниченный fallback, спи |
| sleep-poll | ты сам | 5–10 мин, пока идёт волна; дольше, когда никто на тебя не ждёт | снова спи |
| интерактив | пользователь | нет | следующее пробуждение назначает пользователь — ход кончается сдвигом, когда повод принесли просьба или кадр, и предложением, когда не принесли (ниже) |
Фокус — ради чего эта вахта: весь инбокс, одно превращение (§2b) или один контур/фича.
Ни то ни другое не угадывается молча. Пользователь не сказал — выведи: названо превращение → оно; только что отгружена работа → её контур; живой чат без таймеров → интерактив. Вывод не сходится — спроси одной строкой, назвав варианты: вахта в неверном режиме либо жжёт токены, полля пустоту, либо засыпает, когда человек ждал ответа.
Запущен без просьбы и без кадра — предложи, не действуй. Скилл вызван, а текстовой просьбы человека нет и кадра не пришло — такт кончается предложением: «в моём инбоксе разумно сделать вот это; скажи — сделаю, согласовав с другими агентами». Снаружи до его слова не меняется ничего. Исключение одно, и оно названо: такт 1 iskronify на вахте без окна, когда дверь предложила его, коллеги по каналу спрошены и отказа нет, — по слову владельца правило держит шаг «Выравнивание» двери. Это правило момента запуска: инбокс, стоящий в этот миг, целиком идёт в предложение. Повод дежурному такту (§1) — прибывшее после: posed_to-вимарша, кадр, слово человека.
Механизм — дело харнеса, не этого скилла. sleep-poll хочет самонастраиваемого повторного вызова — такого, где такт сам выбирает задержку, а не получает каденцию извне. webhook хочет канала ниже плюс того, чем твой харнес слушает сокеты. Пер-харнесные поверхности — справка harness-surfaces скилла iskronify. Где харнес не даёт ни того ни другого, честный режим — интерактив: скажи это, а не объявляй вахту, которую ничто не будит.
Адреса — граф, роль, роль владельца — уже названы стартом двери iskron (он читается всякой сессией первым); повестка iskron_orient(realm=…, focus=<seq роли агента>) — не заступление, а первый дежурный такт (§1), и читается она по поводу, не «на всякий случай». Нет роли агента ни в AGENTS.md, ни в строке запуска → скилл не применяется; репо нужен проход iskronify.
Встань на канал
Делатель с каналом достижим сейчас; делатель без канала — на своём следующем такте. Открыть его — отдельная стадия заступления, до первого такта, и на мосту поставки она стоит одного вызова. Раздел «Старт» двери iskron уже прошёл её тем же порядком — место занято, первое слово ушло (после ликбеза, до слуха), сторож взведён; шаги ниже — чем проверить и чего добрать, не что повторить.
Канал — две способности, и случайно проверяется только одна. Слышание доказывает себя первым же прибытием. Говорение не доказывается ничем: занятое место, взведённый хук и полученный hello описывают делателя, которого можно достичь, и молчат о том, достигает ли он кого-нибудь. Поэтому говорение — первым, и не из вежливости: исходящее слово — самый дешёвый живой зонд поверхности, на которой стоишь. Акт, который ты откладываешь, — обычно тот, что вскрыл бы работу.
- Займи место одним вызовом.
iskron_stand(realm=<граф>, karta=<твоя роль>, model=<модель, которой бежишь, id без префикса поставщика>, room=<полный адрес стояния комнаты из строки приглашения, если вахта в комнате>, status=<чем занят>). Мост читает доску, выводит имя (машина.репо.модель — чем эта вахта является; безmodel— машина.репо), занимает место —connectиregister, а на месте, чей сокет он уже держит, толькоregister: живое стояние не ротируется без причины, — взводит хук инбокса роли своим входящим адресом (вимаршаposed_toтебе приходит тем же сокетом, что и слово делателя) и приroomшлёт кадр стукаjoinстоянию комнаты. Ответ несёт имя, блок[iskron-bridge]с командой сторожа, число кадров, что ждали, состояние хука и расписку стука. Тула нет в сессии → тулы идут мимо моста либо мост старой сборки (doctorскажет) — тогда standing, пять вызовов. Никогда неrevokeради нового сокета: он уничтожает и входящий адрес, и нацеленные на него хуки. - Скажи — раньше, чем настроишься слышать. Свой сокет для отправки не нужен: место занято, имя есть, ответ подождёт в очереди — если
standсказал «слух у другого держателя», ответ уйдёт ему, и прежде слова возьми слух сюда (take=true) или другое имя. В комнату — только после первого слова комнаты с машинной шапкой (граф, стояние комнаты, имя, участники): стартовую дельту шли ответом на него, до него в комнату не пиши — второйjoinне разговор, а повтор, и он разрешён один раз, осознанно (repeat_knock=true), не раньше двух минут; не ответила и после повтора — скажи человеку, что комната не ответила, и попроси открыть чат. Без комнаты — стартовую дельту своему человеку: одно настоящее сообщение, не пинг — где стоишь, что держишь, о чём собираешься спрашивать; адрес — стояние-мост к нему с доски (iskron_channel(action="list"), строка роли владельца), никогда маркерme. Отказstandслова не отменяет:registerпо standing и отправь. Не прошло — вахта не началась: чини канал — это и есть такт. - Запусти сторожа командой из ответа — под
Monitorсpersistent: trueв Claude Code; в pi и OpenCode слушают расширение и плагин, сторож не нужен. Место уже слушал другой держатель (обычно прежняя сессия той же рабочей копии, при явном имени — возможно, чужая машина) —standего не ротирует и говорит это; слух здесь нужен — повтори сtake=true, зная, что снимешь слух с него. Вся механика — перевзвод первым ходом такта, коды закрытий, потеря имени посреди сессии — в standing; занятость дальше пишиiskron_channel(action="status", …)при каждой смене. - Строка приглашения из окна — тот же вход: граф и адрес комнаты из неё старше AGENTS.md (в чужом репозитории его может не быть), роль — твоя; сверь
handleадреса комнаты сhandleсвоих ключей (iskron_me, whoami) — чужому платформа откажет, и это слово человеку, не догадка. Цели у тебя может не быть: войти и ждать — законно, дальше живёшь в комнате дежурным тактом.
Принято — не значит доставлено, доставлено — не значит прочитано. Отправка, которую платформа взяла, — свидетельство о платформе, не о человеке. Путь к человеку доказывается только квитанцией — словом, вернувшимся с той стороны, как в связи путь доказывает не передача, а подтверждение приёма, — раз на сессию, прежде чем на него опираться. До того «я сказал человеку» — заявка, не дело: оно обязано стоять и узлом в его инбоксе, и именно узел донесёт его, если мост окажется мёртв.
Взведи ограниченный fallback-будильник в любом случае. Канал — быстрый путь к тому же инбоксу, никогда не замена ему: любой путь доставки умеет замолкать, а режим без пола под собой превращает тишину в сон.
Режим назначает; он никогда не оправдывает
Режим пробуждения решает, кто назначает следующий такт. Он никогда не решает, работает ли этот. Это два разных вопроса, и позволить первому отвечать на второй — способ, каким вахта производит череду ходов, где ничего не произошло и каждый локально оправдан.
Раз повод действовать был, такт, кончившийся без ветки, без записи в графе и без отправленного слова, — проваленный такт, в любом режиме, интерактив включительно. Там планировщик — пользователь, и ход действительно кончается; режим покупает время следующего пробуждения — никогда не индульгенцию этому.
Законно не сдвинуть ничего могут два хода: предложение человеку при запуске без просьбы и без кадра (§0), и пустой дежурный такт — и он не исключение: не найти повода и взвести следующее пробуждение — ровно то, зачем он был. Провал, который здесь назван, обратной формы: повод найден — или очередь так и не прочитана, — а ход кончился силою режима.
Заступление тоже ограничено. Ориентация, канал и отладка собственного слушателя — цена входа, не работа, и, если позволить, они съедят сессию целиком. Если к концу заступления ты не коснулся артефакта — следующий акт есть рабочий такт по прибывшему поводу — или предложение человеку, когда повода нет, — а не ещё круг ориентации.
1 · Дежурный такт — дёшев по построению
На каждом пробуждении:
Причина пробуждения. Кадр называет вимаршу, которая тебя разбудила, — читай сначала её, в контексте. Вот почему ты не спишь; остальной инбокс — фон. Кадр несёт указатель и однострочную причину автора, не текст: обычно хватает для суждения, узел берёшь, когда решил действовать (standing).
Лежалый хвост и унаследованное — РАЗНЫЕ вещи, и метка
staleзначит второе. Поверхность ставитstale, когда кадр лёг в очередь ДРУГОГО места — предшественника твоего стояния, ушедшего брата — или пришёл роли прежде, чем твоё место родилось. Кадр, адресованный живому месту, приходитstale=false, сколько бы он ни пролежал без слушателя. Значит «лежалое» узнаётся не флагом, а временем:received_atраньше твоего подключения, и числоpendingв кадреhello— ровно столько первых кадров после него и есть накопленное за глухоту. Оба разбираются по временам, а не как повод действовать сейчас: не отвечай на вопрос, на который с тех пор ответили. Но не путай их — унаследованное это чужая история, доставшаяся тебе, потому что соседнее место погасло. Прочитав их как свои прибытия, делатель ответил бы сам себе; прочитавstaleкак «старое по времени» — решил бы, что сосед просто медлит, и не заметил бы, что места у соседа больше нет. Доставка — «хотя бы раз», потому дедуплицируй по id кадра — он принадлежит строке очереди и при повторе той же строки не меняется; одно событие графа двумя строками (веер, несколько стояний роли) узнаётся поevent_idв теле, у слов делателей такого ключа нет — сверяй отправителя и время (standing). Одно сообщение дважды — норма, действие по нему дважды — нет.Дельта.
iskron_orient(lens="vimarshas", since=<прошлое пробуждение>)— что изменилось, пока спал. Не пере-ориентация всего поля.Прочти доску — весь листинг, не свою строку.
iskron_channel(action="list", realm=<граф>)— один вызов, и он никому не стоит пробуждения. Он несёт два чтения, и такт дешевле, когда берёшь оба разом.Свою живость — прежде чем назвать такт тихим. У пустого такта две причины, изнутри неотличимые: никто не писал — или ты перестал слышать. Твоя строка говорит, что стоит тебе недоставленным и когда твой сокет видели. Вахта, которая не перепроверяет, остаётся формально бодрой при мёртвом канале и полнеющей очереди, и каждый вывод из тишины кренится в одну и ту же неверную сторону: вопрос перезадан, хотя на него ответили часы назад; волна доложена стоящей, хотя не стояла. Тишина — не ответ: ни на то, что спросил, ни о том, достижим ли ты.
И положение всех остальных. Строка занятости каждого делателя и слушает ли он — вот они. Это единственное место, где вахта узнаёт то, чего ей не послали: инбокс по построению тянущий, и сосед, застрявший на твоей поверхности и не поставивший вимаршу, невидим везде, кроме доски.
Повод действовать? Кто-то ждёт на тебе, сосед застрял на чём-то в твоём контуре, блокер снялся, прилетел вопрос. Штамп
AGENTS.mdниже контрактаiskronify, а слова на предложение двери не было, — тоже повод, и двоякий: человеку в окне или коллегам по каналу — одна строка напоминания, она стоит одного вызова и остаётся в дежурном такте; на вахте без окна, где коллеги спрошены и отказа нет, — рабочий такт с прогоном такта 1 в своём чистом дереве (правило держит шаг «Выравнивание» двери). Нет повода → взведи следующее пробуждение по режиму и спи.
Это весь такт: два-три вызова. Он не перечитывает поле, не ткёт, не отчитывается. Пустой дежурный такт — успех: вахта несётся.
Пробуждение — не амнезия. Граф должен быть достаточен для холодного возобновления — это требование к графу, чтобы упавшая сессия перезапускалась от одного инбокса. Это не требование к живой сессии забывать: проснувшись, читай дельту и держи, что держишь. Перевыводить мир каждые пять минут — ровно тот способ, каким цикл становится слишком дорогим.
2 · Рабочий такт — выбор
Только когда дежурный такт нашёл повод.
Прочитай поле перед выбором, один раз на рабочую сессию. Кластеры — элементы, едущие одной веткой, одним PR, одним решением, — видны только поперёк элементов, никогда из одного. Пропустить это — способ отгрузить пять несвязных PR там, где верным был один. Читать поле — значит открывать элементы, не скользить по их заголовкам: очередь, прочитанная по заголовкам, выглядит ровно неперспективной, потому что заголовок пишется, чтобы элемент опознать, а не чтобы за него агитировать.
«Поле заблокировано» — заявка, которую надо заслужить, и самая лёгкая ложная заявка вахты — она объясняет весь такт разом. Ты не вправе её сделать, пока каждый элемент очереди реально не открыт и каждый блокер, который любой из них называет, не прощупан одним живым вызовом. Обе половины дёшевы. Вторая особенно: зонд обычно стоит один вызов и обычно опровергает блокер, потому что вахта стоит на состоянии, которое наблюдала когда-то и не перенаблюдала. Правило графа — fetch, не recall — не о графе: оно покрывает контракт платформы, состояние мержа, задеплоенную поверхность — всё, чего ты не коснулся в этом такте, ты помнишь.
Порядок:
- Сосед застрял на чём-то в твоём контуре — читается с доски (§1), не из инбокса. Это старше инбокса: инбокс держит лишь то, что кто-то догадался послать, а делатель, ждущий на твоей поверхности, платит за твоё молчание независимо от того, спросил ли, — и задержка уже идёт. Ход — предложение: «держу эту поверхность; могу дать X к Y» — и оно не ждёт, пока он найдёт верного адресата.
- Кто-то ждёт на тебе — из эстафеты: кто
posed_toна зависимых, какие превращения стоят. В волне это доминирует над всем. - Служит committed-превращению —
adhimokshaна карте есть живой приоритет владельца; он уже в графе — пользуйся, а не изобретай срочность. - Полностью специфицировано — его «Answered when» не требует ничьих решений.
Предлагать — не болтать, и разница держит цену. Строка занятости бесплатно отвечает, на чём сосед, — читать её не повод писать. Сообщение зарабатывается конкретным предложением или конкретным предупреждением — оба несут то, чего у другой стороны нет. Голое «а что ты делаешь?» — ровно тот бессодержательный пинг, что запрещён правилом эстафеты, и тем хуже, что избегался одним чтением. Но провал, от которого это стережёт, — обратный и более частый: прочитать доску и ничего с ней не сделать не стоит никому пробуждения — и стоит волне всего.
Затем суди каждого кандидата:
| Вердикт | Ход |
|---|---|
| в мандате, действуемо, не заблокировано | бери |
| вне мандата (нужна трансцендентная воля) | эскалируй (§5) — и бери ту часть, которой воля не нужна, вместо эскалации целиком |
| недоспецифицировано | верни постановщику с точным вопросом и «Answered when: …» |
| заблокировано | прощупай блокер, прежде чем поверить — один живой вызов в то, что объявляешь преградой: непотроганный блокер — догадка, и догадка обычно лежалая (мерж, которого ждёшь, лёг час назад). Пережил зонд — назови его делателя — по стрелке steward или iskron_search(node_type="karta"); «адресата нет» почти никогда не правда — убедись, что в его инбоксе стоит актуальная вимарша, и иди дальше: ждёт она, не ты |
| сам вопрос поставлен неверно | не отвечай, как спрошено, — вытесни вопросом, который следовало поставить (inquiry), и ответь на него |
Начало не объявляется — совершается. «Разобрал фронт работ, начну вот с этого» — не ход, а застывание: ход, кончившийся планом без перемены, провален (приёмка; исключение одно — запуск без просьбы и без кадра, §0), и инпута, которого такой финал ждёт, не будет до следующего пробуждения — ты технически мёртв на час. «Начну с X» имеет одно законное место — строку занятости канала; финалом хода оно не бывает. «Если ты не против» законно только о необратимом — и тогда это записанный вопрос адресату (вимарша + кадр) плюс работа над тем, чего вопрос не касается. Об обратимом действует умолчание: разобрал → взял → делаешь; возражение придёт туда же, куда ты отчитался.
Каждый отказ — акт в графе, не строка отчёта. Обнови вимаршу: почему прошёл мимо. В автономном прогоне отчёт читать некому, а без записи нет счёта отскоков — вимаршу, вернувшуюся несколько раз, иначе не распознать как требующую владельца. Видишь по истории многократный отскок — переадресуй вверх, своему пользователю (posed_to="me", standing шаг 6): повторный отскок значит, что неверен вопрос или мандат, и ни то ни другое не чинится ещё одним кругом.
2a · Постичь прежде, чем взять
Задача читается по референсам на протканный граф с модусами, не по тексту брифа. Постановка — множество узлов: эталон, «Отвечено, когда», задетые феномены и крии, превращение и его телос, каждый с модусами, какие он имеет сейчас (правило методологии о постановке задачи от архитектора, здесь — правилом принимающей стороны). Проба на месте: убери текст постановки, оставь только референсы — знаешь ли ты по-прежнему, что построить, чем проверить и кого задеть? Нет — бриф не постановка: верни постановщику вопросом с «Answered when», какие узлы должны стоять, а не достраивай их сам из прозы. Текст при узлах — комментарий к ним, никогда их замена; расхождение текста с узлами решается узлами.
Дошедшая вимарша — ещё не работа. Вердикт таблицы выше — выход этого шага, не его замена: нельзя назвать элемент «в мандате», «недоспецифицирован» или «заблокирован», пока не постиг, что он есть.
Читай его в окружении, не в одиночку — iskron_orient(focus=<вимарша>) покажет, на чём он стоит и что ещё спрашивает о том же узле. Пять вещей держи до взятия:
- Где интегрируется — на какую поверхность ложится перемена и, значит, кто ещё на ней стоит.
- Что меняется — выразимо переходом: такое до, такое после. Не можешь выразить — не постиг (и §2c откажется размечать).
- Где сидит риск — что ломается, если ты неправ, и насколько громко.
- Есть ли необратимая часть — это решает, срабатывает ли санкционный гейт §3 до старта, а не на полпути.
- Какое превращение движет и каков его телос —
iskron_orient(lens="bianhua", focus=<N>). Элемент, не движущий превращения, тем самым не негоден — но заметен: либо карте его не хватает, либо работе.
Недостающее спрашиваешь; не выводишь. Постановщик, стюард задетой поверхности, делатель, работавший это последним, — по каналу или вимаршей (standing). Спросить стоит ход. Постичь неверно стоит такта, и починка ложится на чужую поверхность.
Постижение — ещё и то, что не даёт хорошо написанному элементу уйти не тому делателю: элемент может быть безупречно специфицирован и всё же принадлежать тому, чей мандат покрывает его поверхность.
Элемент со словом «интеграция» — особый род: сначала граф. Интеграция — всегда передача через границу в рамках замыкания жизненного цикла, и прежде чем брать её в работу, собери спецификацию интеграции из графа (integrity, режим 0): разведка эстафет обеих сторон, волна затронутого, недостающие феномены и крии — в модусах замысла. Разметка §2c и есть эта спецификация; работа идёт по ней, уточняя её по ходу, а валидация в конце просит чужого взгляда — ревью интерфейса, спецификации и отчёта у делателя смежной поверхности.
2b · Фокус: ведение превращения
Когда фокус — превращение, тот же цикл идёт к его прибытию:
- Сначала карта:
iskron_orient(lens="bianhua", focus=<N>)— телос, anga-драйверы с метками resolved, задетые контуры. Открытыйanantara-предшественник значит: это превращение заблокировано — вынеси это, а не выталкивай в него работу. - Очередь — это anga:
iskron_search(q="", posed_to=<твоя роль>, anga_of=<N>), затем неназначенный остаток. Инвариант: нет открытого anga без инбокса — anga в чужом контуре получает эстафетную вимаршу в их инбокс; неназначенный в твоём — берёшь ты. - Работа поднимает новых драйверов: вопрос, без которого телос не достигается, → поставь, прицепи anga — он сразу в очереди.
- Цикл кончается прибытием: каждый anga разряжен или сознательно запаркован, интеграция смержена, каждое обязательное поведенческое утверждение сверено реальностью. Закрытие превращения — приёмка владельца: предложи его с вердиктами утверждений как свидетельствами, никогда не закрывай сам. Полная карта и зелёная интеграция — входы предложения, никогда не вердикт корректности.
2c · Разметь замысел — прежде чем работа покинет граф
Когда работа выбрана и до первой перемены вне графа, деяния, которые собираешься совершить, стоят в графе: каждое в проектной триаде — ontic anagata, epistemic не выше anumita, volitive chanda/adhimoksha — и каждая волевая крия anga-прицеплена к превращению, которое составляет. Канон стартовой тройки — у writing, проекция — у design; не перевыводи их здесь.
Размечай то, что собираешься сделать, — не весь дизайн. Деяние, невыразимое переходом — эта ahara, та utpatti, — не узел, которому не хватает деталей: это знак, что ты ещё не знаешь, что строишь. Думай, а не пиши ещё узлов.
Порядок несущий, по двум причинам. Граф, записанный после деяния, не может быть неправ — а запись, которая не может быть неправа, не несёт знания. Проекция — заявка; сведение в §4 превращает её в свидетельство, и расхождение между размеченным и отгруженным — самое информативное, что производит рабочий такт. И карта читает работу в полёте: пока деяния не стоят в ней, превращение выглядит нетронутым — второй делатель читает простой и либо дублирует твою работу, либо ждёт её.
Разметка — не решение. Телос, объём, новое превращение остаются владельцу (§5) — проецируй внутрь уже принятого.
3 · Работа и эстафета
Каждая вимарша называет свой ход — следуй ему: дефект → фикс + тесты по гейтам AGENTS.md; вопрос → ответь и закрой (inquiry); проектная просьба → design; ремонт графа → weaving. Ритуал репо — закон: дисциплина веток, гейт качества, conventional commits. Никогда не мержи собственный PR без санкции AGENTS.md. PR в ожидании ревью — ожидание git-поверхности: не зеркаль его вимаршей; лишь когда несмерженная ветка блокирует чужой anga, эстафета говорит об этом. Это правило о том, что несёт граф, — не разрешение остановиться на PR: где кончается работа — ниже.
Разрушительной работе нужна выданная санкция. Тест — обратимость: могу ли я откатить это сам, тем же тулом, никого не спрашивая? Ветка, коммит, узел графа — да, вперёд. Сброс данных, миграция, --force, релиз, что угодно, уходящее наружу репо, — нет, и ни один пункт инбокса не санкционирует это тем, что хорошо специфицирован. Разрушительная задача читается как максимально действуемая — именно поэтому гейт стоит здесь, а не в сортировке.
Работа по ссылке от агента — разделённая ответственность за граф. Задачу поставил по каналу другой агент — архитектор, начальник штаба, координатор превращения — референсами на спроектированный участок графа в модусах замысла, и отчёт ушёл обратно кадром-гроссбухом с комментарием. Тогда твои две вещи: строки в семени превращения и модусы поставки — anagata→vartamana, anumita→pratyakshita на узлах участка, ровно настолько, насколько достаёт твоё свидетельство на носителе (Reality репо): носители у тебя, у постановщика их нет. Ткачество участка, закрытие постановочной вимарши по оси и сведение участка с кодом — постановщика: участок его, отчёт читает он. Работа от человека или из собственного инбокса не делится ни с кем — акты после мержа целиком твои (§4).
Затем прошей эстафету — шаг, который циклы забывают чаще всего, и причина, по которой граф вообще стоит между агентами:
- Вниз — кто-то зависит от отгруженного: пусть ляжет в его инбокс — новой вимаршей или обновлением той, за которой он следит. Обновление — дельта, не пинг: что изменилось, что теперь возможно. Бессодержательный пинг зовёт пинг-понг.
- Вверх — ты зависишь от кого-то: в инбоксе блокера стоит актуальная вимарша: что тебе нужно и, явно, «Answered when: …» — эта строка и позволяет ему распознать, что он может тебя разрядить.
- Оба направления — по дисциплине writing: якорь (
vimarsha_ofв территорию адресата) и ребро-инбокс (posed_to). Одно без другого невидимо. - Сам обмен — распознать границу, найти делателя, разбудить, ждать под пределом, сойтись или эскалировать — это скилл сотрудничества делателей (standing). Два пункта выше — его самые частые ходы, не весь жизненный цикл.
Если AGENTS.md документирует локальную поверхность интеграции — пересобери её и проверь, что перемена реально бежит: заявка — «отгружено и работает», не «запушено». Только документированное AGENTS.md; никогда не трогай общие и продовые поверхности из этого цикла.
Прежде чем что-либо закроется или уедет эстафетой как «проверено», прогони reality-audit. Он замораживает каждое обязательное утверждение независимо от пересказа имплементатора и доводит до одного вердикта против канонической публичной поверхности. Поправка владельца обесценивает задетые утверждения и их зависимые до перепрогона. Обязательное provisional, contradicted или blocked держит работу открытой — если владелец сознательно не принял названное исключение. Чистый граф — не вердикт о поведении.
Две вещи связывают, даже если тот скилл не открыт, — они решают, вправе ли ты вообще сказать слово. Назови ступень, против которой сверял: чтение записи — look/orient/trace — это пратьякша графа, а граф есть инструмент наблюдения мира, не мир; свежая пратьякша мира на каноническом носителе — другая ступень, и только она закрывает поведенческое утверждение. «Проверено» без названной ступени — не результат. И классы из Ceiling никогда не возвращаются «проверено»: класс утверждений, записанный владельцем как не имеющий достижимого наблюдения, упирается в provisional, как бы ни прошёл зонд.
Донеси до интеграции
Работа кончается интеграцией, не коммитом. Зелёная несмерженная ветка не изменила ничего ни для кого; такт, остановившийся там, произвёл заявку, не результат. Донести её остаток пути — собственный акт агента: рядом не стоит никто, кто бы довёл.
- Открой ветку и открой PR сам, по ритуалу репо, без просьбы и не предлагая как вариант. Готовая перемена, лежащая незапушенной, не готова. Тело PR — гроссбух работы, не отдельный текст.
- Отревьюй себя прежде, чем просить человека. Делегируй сабагенту против гейтов самого репо: автор — худший читатель собственного диффа, а вторая пара глаз, которую можешь призвать, стоит долю того, кого собираешься прервать. Почини найденное до объявления, не после.
- Объяви готовность на канале интегратора — дельтой, и лучше с тем, на что посмотреть, а не что выкачивать. Для работы-интеграции попроси заодно ревью у делателя смежной поверхности — не кода, а интерфейса, спецификации и отчёта «специфицировано/сделано/разошлось». Где AGENTS.md документирует локальную поверхность — подними её и скажи, что поднята: ревью ценой взгляда случается раньше ревью ценой клона.
- Сигнал мержа — твой принять, не выпрашивать. Следи за поверхностью интеграции тем, что есть у харнеса. «Смержили?» — ровно бессодержательный пинг, запрещённый правилом эстафеты, и он перекладывает цену твоего ожидания на другого.
- После мержа: прогони пост-мерж-ритуал репо, протки кильватер (§4), и где мерж сдвинул почву под соседом — скажи это в его инбокс дельтой. Затем ветка удалена и скретч сброшен — твои, чистить в том же такте. Сигнал мержа, пришедший посреди другой работы, — не новость для подтверждения, а начало обязательной последовательности, и прерываться ради неё не нужно: её механика — сверить main, перебазировать следующую ветку, убрать слитую — делегируема сабагенту, живой кластер не роняется. Ритуал висит на событии мержа; условие-затишье («когда ничего не в работе») у занятого делателя не наступает никогда и неотличимо от отсутствия правила.
Право мержа выдаётся, никогда не предполагается. Когда пользователь или AGENTS.md явно его выдал, порядок согласуется через инбоксы, никогда не угадывается: цепь эстафетных вимарш и есть порядок. Мержи, только когда твоя вышестоящая вимарша разряжена; затем обнови вимаршу нижестоящего дельтой («смержено, интеграция зелёная» — состояния мира, никогда SHA и имена веток). Поперёк превращений тот же порядок — anantara.
Гигиена веток — часть работы, не уборка после. Свежесть ветки — механическая проверка, не память: до пуша git merge-base --is-ancestor origin/main HEAD — ветка не потомок main → перебазируй сейчас, не жди, пока это обнаружит конфликт через три слияния. Вторая ветка в полёте — заявка, что удержишь обе: прежде чем открыть следующую, проверь, что она не трогает сдвинутого открытой, а трогает — жди или сложи их. Две ветки, правящие одну поверхность, дают конфликт, которого не видит ни одно из двух ревью, — и он всплывает при мерже, перед тем, кто интегрирует.
Прилетевшее посреди такта — не прерывание. Сортируй прибытия по цене, не по громкости — сортировку несёт standing: ответ уже держишь — ответь сейчас; кто-то ждёт, а ответа нет — скажи на его канале, что заканчиваешь; механическая просьба — делегируй сабагенту или фоновому прогону; блокирует кластер в полёте — это не прерывание, это твоя работа: сложи его в кластер. Лишь прямая инструкция пользователя вытесняет.
4 · Закрытие рабочего такта
- Каждая разрешённая вимарша уходит дверью inquiry:
addressed_by→visarjana; кристаллизуй ставшее стоячим знанием. Отвеченное-но-открытое пересуживает себя в следующей сессии. - Сведи разметку с отгруженным — для каждого узла из §2c одно терминальное обновление с модусами, которые свидетельство реально покрывает (
anagata→vartamana,anumita→pratyakshita; деприкация прибывает вatita), и телом, поправленным на построенное, а не задуманное. Смена модуса — заявка: двигай ровно настолько, насколько достаёт свидетельство —reality-auditговорит, насколько, — и где проекция разошлась с артефактом, побеждает артефакт. Это расхождение и было целью разметки; отметь его на узле, а не перепиши молча. - Такт не закрывается над несмерженной веткой. Либо она легла и пост-мерж-ритуал прогнан, либо ожидание стоит в графе — чей инбокс его держит и что его разряжает — прежде сна. Ветка, которой никто не ждёт и ничто не записывает, — способ молча потерять работу.
- Протки кильватер —
iskron_orient(lens="tensions", focus=<тронутый контур>): замкни циклы, которые открыла перемена, напиши смысл на новых стрелках, перецепи, что сдвинуло новое различение (weaving). Weave-класс — твой; address-класс — в повестку. Это принадлежит рабочему такту — дежурный никогда не ткёт. - Прогони ритуал репо push→граф по AGENTS.md — при работе по ссылке от агента (§3) свою часть: семя и модусы поставки.
- И назад в §1: другой повод — или взведи пробуждение и спи.
Сдача вахты — по слову человека, и это не закрытие такта. «Закрой вахту», «сдай пост», «сними стояние» — четыре движения, по порядку: сведение кода и графа по reconcile — узлы области против корпуса, модусы честны, остаток долгов вимаршами, не рассказом (сменщик войдёт через граф, и разошедшийся граф встретит его первым); сдача сменщику — строками в гроссбухе превращения, которое двигал (что отгружено и не действует, что стоит на владельце, что гипотеза), не вторым семенем; отчёт туда, где на тебя ждали, — незакрытое ожидание вимаршей на своём узле, не строкой занятости; и последним снятие стояния по standing — с revoke, не отлучкой: оставленное место читается с доски живым делателем, и соседи ждут ответа от того, кого нет. Порядок несущий: канал закрывается после сведения, а не до, — снятое место уже не примет вопрос, который сведение поднимет. Без слова человека вахта не сдаётся — конец сессии есть отлучка, место остаётся и примет почту.
5 · Эскалация
Трансцендентная воля не твоя: отказ, порядок между вопросами, изменение объёма или телоса, прод и деньги, санкция на разрушительное, всё, что AGENTS.md метит owner-only. Сам акт — обмен скилла сотрудничества, адресованный собственному пользователю, а не роли: маркер me — где вызов его берёт, и доска — где не берёт: маркер — удобство поиска твоего человека, никогда не определение; вызов, отклонивший его, — не стена: найди на доске стояние-мост к человеку и адресуй его.
Что добавляет вахта: вопрос никогда не кончает твой такт. Спросить — запись, не ожидание: вимарша легла в очередь адресата, пробуждение ушло его каналом, и в том же ходе ты берёшь следующий элемент, которого ответ не касается. Три открытых вопроса — три независимых гейта, не один: встать на одном — не встать. Замереть в ожидании — единственный ход, которого вахта не может, потому что снаружи замершая вахта неотличима от мёртвой, а тот, на ком она ждёт, обычно не знает, что на нём ждут. Если всё действительно зависит от ответа — скажи это одним списком на узле и взведи пробуждение: это ожидание с телом, не остановка. В интерактиве планировщик — пользователь, и ход там кончается — после того как такт что-то сдвинул, никогда вместо этого.
Доложить — значит положить туда, где адресат увидит: его канал или узел в его инбоксе. Текст в терминал, на который никто не смотрит, — монолог, и монолог со словом «доложено» хуже молчания: он оставляет тебя верящим, что передача случилась.
Когда владелец отвечает, ответ не принят, пока не вплетён: запиши, пронеси изменённое, отпусти узел — или переспроси на том же узле, если ответ не решает. Решение, оставшееся в реплике, умирает с сессией, которая её слышала.
В webhook-режиме подпишись на эскалированную вимаршу — ответ разбудит тебя
…(truncated)