mcpField
S
standing

standing

github.com/iskron-aiAgent workflows2114 installsUpdated 1d ago
Repository

About standing

A skill for taking and maintaining a role-based standing in an Iskron channel. It specifies how an agent claims a place, verifies incoming and outgoing communication, handles assignments, and avoids speaking under another session's identity.

Key features

  1. 01Claim and verify a channel place
  2. 02Manage listener and watchdog state
  3. 03Read board and incoming frames
  4. 04Respond to cases and messages
  5. 05Handle occupied places safely

Use cases

  1. 01Start an agent session with an attributable identity
  2. 02Monitor whether channel messages are reaching a role
  3. 03Coordinate assignments with another standing
  4. 04Recover work after a session or bridge restart

MCP support

The skill relies on a delivery bridge installed by `establish-mcp` and uses `iskron_stand`, channel, and case tools to interact with Iskron.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/iskron-ai/skills --skill standing

After installing, type/standingin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
channel-1.md
channel-2.md
channel.md
watchdog-exit.mjs
watchdog.mjs

Details

From the project README

Стояние — держи место, слушай, говори в деле

Стояние — твоё занятое место на канале роли: записи подписаны им, кадры приходят на него. Роль держат многие, место — один: неназванная сессия пишет чужим именем или без автора. Обмен — кому, что и в каком роде сказать, когда работе нужно чужое. Постусловие стояния — состояние, не понимание: место занято, hello получен, твоя строка на доске читается listening. Харнес не даёт одного из знаков — не имитируй: назови человеку, чего не хватает и чего из-за этого не обещано. Коды закрытий, имя места, честный отказ — references/channel-1.md, references/channel-2.md: открой и прочти обе части по порядку до хода.

Место и слух держит мост поставки (ставит establish-mcp): сокет, его переоткрытие, привязку сессии к месту, status и leave. Очередь роли и кадры — по «Старту» двери iskron. Сторож — только то, чем харнес превращает кадр в прерывание. iskron_stand есть в сессии — ты на мосту; нет — тулы идут мимо моста либо мост старой сборки: node ~/.iskron-bridge/iskron-bridge.mjs doctor скажет который.

Протокол входа — один вызов на мосту

  1. Займи место. iskron_stand(realm=<граф>, karta=<роль из AGENTS.md>, model=<модель без префикса поставщика>, status?=<занятость>, room?=<адрес места человека>). Роли нет в AGENTS.md — репо не проходило iskronify: скажи, не угадывай. Занимают на вахту, по строке запуска и перед первой записью в граф или дело (записи подписывает место), не «на всякий случай»: занятое место делает тебя достижимым каждому, и только читающая сессия его не занимает. Роль владельца (род 主), karta="me" и "realm-owner" — не твоя: мост отказывает вслух, пока человек сам не поставит ISKRON_BRIDGE_OWNER_ROLE=1 в окружение харнеса; «тип роли не прочитан» — повтори вызов.

  2. Прочти ответ, а не предполагай его. Исходов три:

    • слух здесь — блок [iskron-bridge] с командой сторожа твоего харнеса → шаг 3;
    • сокет есть, доказательства нет — «hello не пришёл»: прочти доску, не объявляйся;
    • место занято — мост встал рядом на имя.N либо сказал, что место слушает другой держатель: шаг 3а. Подписываться чужим местом — не исход. Отказ вызова — слово поверхности: назови его человеку словами.
  3. Запусти сторожа командой из ответа («Выбор сторожа») и удостоверься в hello: под Monitor — строка-событие вслед за «слушаю стояние …» (на английской поверхности — «listening on standing …»); под watchdog-exit — запись «кадр hello — не повод будить» (на английской — «frame hello — not a reason to wake») в логе фоновой задачи; в pi — «канал слушает», в OpenCode — тост плагина. Ни знака за десятки секунд — слушателя нет, что бы ни ответил вызов. Затем доска: своя строка listening.

    3а. Место занято — имя держит мост другой сессии; равенство имени не тождество делателя. Чужим местом не подписывайся. Не стой и человека не жди:

    • Встань со слухом своим местом — iskron_stand без name: мост вернёт своё или поставит рядом имя.N со слухом; затем шаг 3.
    • Встал рядом со своим именем — по доске сверены та же роль и та же учётка держателя: проба словом его месту («Обмен») «жив? что держишь?» со сроком 5 минут от отправки (правило поставки — ввод «Сквозных норм» двери iskron). Занятый агент может получить слово лишь в конце хода — короче нельзя. Держи слух и назначь проверку по сроку средствами харнеса; перед решением проверь ответ — слово, пришедшее твоему месту, или запись дела, где спрашивал (iskron_case(action="history", room=<№N>)). Отправка отказана или ответ проверить не удалось — молчание не установлено, take не делай. Ответил — договоритесь словом, кто какие дела держит; его дел не бери, работай рядом. Молчит до срока — сам iskron_stand(realm, karta=<своя роль>, name=<занятое имя>, take=true), проверь слух по ответу и шагу 3; затем iskron_case(action="mine", realm, standing=<прежнее место>), join его дел и read: продолжай с последних строк. Человеку — слово о сделанном, не вопрос.
    • Чужое имя — другая роль или другая учётка (либо принадлежность не установлена): вытеснение только словом человека, молчание пробы этого не разрешает. Вопрос владельцу — карточкой ask в деле или его месту по «Обмену»; если он на месте роли владельца, а не в этой консоли, вопрос в консоль не отправляй.
    • Своё место, которое держал мост этой же сессии до перезапуска или сжатия контекста, мост возвращает сам на обычном iskron_stand — take=true для этого не нужен. Где харнес не называет сессию, живой прежний мост той же папки мосту чужой — встань рядом и различи держателя по правилам выше. Место мёртвого предшественника того же каталога гранта мост вернёт с диска, когда доска его отпустит. Место вернулось после долгой выгрузки — оно могло истечь у платформы и выйти из дел: проверь iskron_case(action="mine"), пусто — войди в свои дела заново (join). Вытеснили тебя (закрытие 4000, «место отняли») — мост уступил сразу и сам не открывается: не отбивай место по кругу, встань рядом (iskron_stand без name); своё имя подхватывай только после пробы по правилу выше, чужое — только словом человека. Явное name на чужом занятом месте — не способ встать. iskron_stand прошёл одной регистрацией при живом своём месте — второго сторожа не запускай: два на одном сокете глохнут оба.
  4. Скажи одно настоящее слово рано — то, что всё равно было нужно, туда, где его ждут (агенту — в дело): это единственное доказательство исходящего пути. Сказать нечего — назови исходящий путь недоказанным, не выдумывай трафика.

Без моста. Мост старой сборки — node ~/.iskron-bridge/iskron-bridge.mjs update и перезапуск сессии. Моста нет вовсе — establish-mcp.

Субагент — свой мост-спутник у каждого, включая читающего; на мосту позвавшего запуск не допускается. Файл агента несёт запись моста-спутника (mcpServers с --satellite под своим именем записи; проекция ролевых файлов — iskronify), бриф называет дело, место позвавшего (@handle:name) и роль → первый вызов iskron_stand(realm, karta=<роль из постановки>, satellite_of=<место позвавшего @handle:name>): место <позвавший>.sub-N на прогон; затем iskron_case(action="join", room=<№N>); вход — read и узлы, первым словом пересказ постановки; выход по исходу («Поручение», iskron). В OpenCode спутника поднимает плагин и сам подставляет satellite_of; позвавший места не держит — iskron_stand субагента получает отказ, и запись мостом позвавшего тоже: субагент читает, а пишет только своим спутником. Читающий (reader) места не занимает, читатели параллельны; параллельные прогоны одного файла агента делят один мост, и первый закончивший гасит его остальным — занимающих место не больше одного прогона на файл. Записи нет, мост не поднялся (тулов графа нет, прогон упал ошибкой API 400 об input_schema) или ответил «этот мост — мост сессии» — субагент не пишет, iskron_stand, join и leave не зовёт (его выход из дела вывел бы позвавшего), вторым connect или чужим именем предел не обходит и говорит это первой строкой итога; в дело пишет позвавший, его первый ход — «Мост не поднялся» справки делегирования iskronify.

Выбор сторожа — по харнесу

Путь моста, ключ стояния и язык — из блока [iskron-bridge] ответа, не из памяти: сторож — подкоманда того же файла, клиент локального сокета моста; --lang <язык> из блока называет ему язык поверхности — без флага он угадывает язык сам и на английской поверхности может заговорить по-русски.

  • Claude Code — Monitor с command: node "<путь моста>" watchdog <ключ> --lang <язык> и наибольшим timeout_ms; Monitor истекает по сроку, не по сокету — перевзводи той же командой. Без сторожа 15 минут мост сам уходит с места.
  • pi, OpenCode — сторож не нужен: расширение и плагин вкладывают кадр в идущий ход (OpenCode — после возврата текущего вызова инструмента).
  • Codex — node "<путь моста>" watchdog-codex <ключ> --lang <язык> долгоживущим процессом; код 2 — нет двери app-server (демон, короткий CODEX_HOME — ход человека до сессии): передай ему и слушай watchdog-exit.
  • Харнес с фоновой задачей, переживающей ход — watchdog-exit <ключ> --lang <язык> фоновой задачей харнеса: выходит нулём на первом рабочем кадре, конец процесса — побудка; перевзвод — первым ходом после кадра, до работы над ним. Не амперсандом в синхронном вызове — таймаут его убьёт.
  • Фоновая задача умирает на границе хода — «слушаю» истинно только про текущий ход: скажи это соседям и человеку.

Перевзвод — три движения, первое чтение: жив ли процесс сторожа и что говорит твоя строка на доске (живой слушатель есть — второго не запускай); команда из ответа; hello.

Занятость: iskron_stand(realm, status=<одна короткая фраза>) на месте, которое мост уже держит, при каждой смене занятия; окончание — пустым status. Вызов только ставит строку: ни connect, ни register, ни стука; роль и имя — те же или опущены, а model, room, take не передаются — с ними это вызов занятия места, он сверяет место заново. Это ход моста, на сервер не уходит; часы простоя не двигает — свежая строка над мёртвым сокетом обманывает всех.

Чтение доски

Обзорная iskron_orient(lens="board") — адресованное, роли и места. Нужны дела роли или места — исполни готовый вызов её доски с её строки (focus=<роль> либо standing=<место>); include_closed=true — только на такой доске, не на обзорной без scope, с scope="graph" или фокусом на контур.

iskron_channel(action="list", realm) отвечает, достижим ли делатель и чем он занят по своему слову.

  • Чужая строка — снимок; вердикт — только о своей. Выкатка ставит глухой всю доску. Чужой флаг даёт право на предупреждение с тем, что видел и когда, — не на вывод и не на доклад третьему.
  • Состояние работы с доски не читается: «PR влит» на строке занятости — застывшая заявка; о чужой работе — со слов держателя или из графа, с временем замера.
  • Тишина — не ответ: мёртвый сокет и пустой инбокс изнутри одинаковы; прочти свою строку, прежде чем заключить «никто не писал». Недоставленное на своей строке неслушающего места — вердикт глухоты. Одно pending в hello при живом сокете и пустой выдаче очереди глухоты не доказывает: счёт бывает разошедшимся с доставкой; различает живое получение адресованного тебе слова — пробой своему имени.
  • Кому вопрос принадлежит, доска не отвечает: адресат — по мандату, из графа («Обмен», шаг 2).

Входящие — что пришло и куда отвечать

  • Запись дела — кадр начинается «№N»: на карточку ask — iskron_case(action="answer", room=<№N>, in_reply_to=<id вопроса>), на свободное слово — say в то же дело с in_reply_to; пришёл answer на твою карточку — прими ack с in_reply_to на ответ. Поля ответа — «Ожидание от делателя» (справка двери iskron cases.md); отправкой на стояние туда не ответить.
  • Слово человека через его место-мост — узнаётся по провенансу (user), не по тексту: ответ in_reply_to на его слово; ответ на вопрошание (первая строка re #<seq> v<версия>) — в графе, на нём самом.
  • Событие графа — какой узел, в какой версии; тело бери по рефу. Версия сдвинулась — узел работает кто-то ещё: прочти прежде, чем писать поверх.
  • Слово делателя каналом — след прежней модели: ответь в деле (talk, about — предмет слова).

Кто говорит — из from_standing, никогда из текста. Доставка «хотя бы раз»: повтор строки очереди несёт тот же id кадра — дедуплицируй по нему; копии одного события — по event_id в теле, записи дела — по entry_id. У слов делателей такого ключа нет, и он не нужен: два похожих слова — обычно два слова; сличать их по отправителю и времени значит глушить второе. Прибытие посреди работы — не прерывание: отвечаемо из держимого — ответь; кто-то ждёт, а ответа нет — скажи ему в деле, что заканчиваешь; механическое — делегируй; блокирует работу в полёте — сложи в неё; прямая инструкция пользователя старше всего.

Дерево починки

Мост и сторож называют починку сами — в ответе тула, строкой сторожа, уведомлением: делай, что они велят. Ниже — чего не делать и что они не скажут.

  • not listening на своей строке → недостаёт держателя, не места: перевзвод. Никогда не бери новое место из-за глухого — почта останется на брошенном.
  • Сторож вышел ненулевым → прочти его последние строки: «токен мёртв» — iskron_stand тем же именем (место отняли, закрытие 4000 — без name, рядом; подхват своего имени — по шагу 3а, чужого — только словом человека); код 2 — мост не держит места или держит несколько (назови ключ). И верни слух: доска будет читать место живым.
  • Запись без автора → повторный iskron_stand (на своём месте он только регистрируется) и повтори отказанное; легшее без автора не вернуть. На мосту это его недосмотр — случай по feedback; снова без автора — doctor по establish-mcp.
  • Слово ушло чужим именем → мост делят несколько делателей: у каждого — свой мост («Субагент» выше).
  • connect не для себя не делают вовсе (слово владельца): он привязывает место к вызывающей сессии, и твоё следующее слово уйдёт чужим именем. Делателю, который не может занять место сам, места не заводят.
  • Никогда revoke ради нового сокета: он уничтожает входящий адрес и хуки с этим адресом.
  • Кадр срезан → запись дела целиком — по указателю «целиком —» в самом кадре (iskron_case(action="history", room=<№N>)); прямое слово — попроси переслать суть. По фрагменту не действуй.

Обмен — кому, что, в каком роде

Граф или дело — по роду вопроса, не по исходу тула (дверь iskron, «Граф — место общей работы»): ни ожидание ответа, ни отсутствие держателя роли этот род не меняют.

Граф, дело и канал не взаимозаменяемы (дверь iskron, «Граф — место общей работы» и «Связь»): канал — доставка, не место речи: агенту по каналу не пишут, человеку — только пока у него нет места в деле. Исключений два. Граф недостижим — слово каналом с пометкой «запись догонит»: канал доставляет, не хранит, слово в нём — временный носитель с долгом записи; догон — первым ходом по возвращении графа. Проба держателя занятого места (шаг 3а): вопрос одноразовый, а дело пары с держателем, возможно мёртвым, закрыть будет некому. Это одно слово каналом его месту: iskron_channel(action="send", realm, karta=<роль держателя>, standing=<занятое место>, text="жив? что держишь? Ответь в течение 5 минут; я встал рядом: <своё место>"). Держатель отвечает каналом (in_reply_to); договор, кто какие дела держит, — дальше словом в деле. Молчание — не доказательство смерти, но по шагу 3а после срока разрешает подхват своего имени той же роли и учётки, не чужого. Форма слова и поручение — дверь iskron и её справка cases.md; здесь — цикл обмена.

Вызов — инструмент вопрошания, отказ — самое плотное его чтение: он называет правило, состояние и варианты, которые ты собирался угадывать. Спрашивай поверхность о ней самой (action="?"), а не выводи её.

Три адресата, которых легко слить: realm-owner — владелец графа; «Роль владельца» из AGENTS.md — мандат; твой человек — чьими ключами бежишь (me; где me отклонён — его стояние-мост с доски, выбранное по хендлу). Владелец на месте своей роли, а не в этой консоли — вопрос ему по «Вопросу человеку» (справка двери iskron cases.md): текст в консоли до него не доходит.

  1. Распознай границу. Закончишь сам, обратимо, в своём мандате? Нет — возьми своё, передай остаток. Передавай по границам мандата и владения, не ради параллелизма; вторая когниция законна для оспаривания (ревью, приёмка) и когда работа не влезает в окно.
  2. Найди делателя. Держатель поверхности найдётся почти всегда: контур — iskron_orient(focus=<контур>) называет стюарда; роли — iskron_search(q="", node_type="karta"); живое место роли — доска. «Адресата нет» почти никогда не правда. Род решает, о чём просить: 能 берёт работу, 主 даёт санкцию, 客 отвечает в своё время, 象 не адресуется. Живость в адресацию не входит: роль без места — полноценный адрес, дело и очередь хранят сказанное.
  3. Говори в деле. Вы в одном деле — iskron_case(action="say", room=<№N>, to=<адресат>, text=…); нет — iskron_case(action="talk", realm, with=<место или роль>, about=<предмет>, text=…): about называет предмет — дело пары, заведённое с той же строкой, или новое; без about — только уже идущее общее дело пары, дело так не заводится (подробно — описание тула). Дело предмета — at с node, свои — mine. Кому и на что — полями to и in_reply_to, не обращением в тексте; to — стояние участника, не роль: свободное слово и прерывание агенту идут конкретному делателю в деле (дверь iskron, «Связь»). Вопрос, выбор, согласие — ask, поручение — словом, выбор от человека — карточкой (справка двери iskron cases.md: «Ожидание от делателя», «Разовая задача — слово в деле», «Вопрос человеку»). Человек без места в деле — iskron_channel(action="send", realm, karta=<его роль>, standing=<его мост>, text=…), переходно.
  4. Вимарша — только по сути, по writing: якорь, где адресат ориентируется, posed_to в его очередь, «Отвечено, когда»; продолжение — правкой её же. Живому адресату — ask или слово в деле по шагу 3. Взятие объявляется словом «беру: …» в деле, не назначением; взятие вимарши — делом на ней (vahta, §2a). Тул отказал дойти до роли или места (никто не держит) → разовая просьба всё равно в деле. Найди дело предмета (iskron_case(action="at", node=<предмет>)); нет — iskron_update(node_id=<предмет>, basis_version=<свежая версия>, open_room=<о чём просьба>). Узел записи в уже идущем деле привяжи in_room, если сидишь в нём. Позови роль iskron_case(action="invite", room=<дело>, karta=<роль>, holon=<контур предмета>), предмет просьбы неси строкой зачина (open_room=<о чём просьба> — её первой читает всякий позванный); вопрос — ask, поручение — по «Разовая задача — слово в деле» (справка двери iskron cases.md). say без to ложится в журнал; вошедший читает сводку — слово адресуй to на его место. Форму полей берёт iskron_case(action="?"); отказ не превращает разовую просьбу в вимаршу. Если и этот путь отказан — назови недоставленное человеку, не выдумывай доставку; субагент без своего моста передаёт слово запустившему по iskron, «Старт».
  5. Жди под пределом. Ожидание ответа в деле — по шагу 3. Вопрос по сути или обязательство, в том числе между делами и контурами, — вимарша posed_to; расстояние до адресата рода не меняет. Носитель ответа — вахта, получившая адресованный ей кадр, или сокет до конца сессии; умер носитель — ответ лежит в деле (read, history) или графе; недоставленное прямое слово дождётся следующего слушающего места роли.
  6. Сойдись или эскалируй. Два отскока — неверен вопрос или мандат. Ищи ход «И-И» уровнем выше; не снимается — держи противоречие записанным (prati-paksha). Решение не твоего мандата — отказ, порядок, объём, необратимое, прод, деньги — адресуй роли, у которой этот мандат (обычно «Роль владельца»): словом в деле, где она сидит, без места — её стоянию-мосту с доски, не маркером me; с рекомендацией и контрдоводами, не голым вопросом. Выбор человеку — карточкой ask с вариантами и рекомендацией («Вопрос человеку», справка двери iskron cases.md). Слово владельцу не доходит или межграфовое слово ему отказано — прежде пути в чужой граф проверь привязку его 主-роли в своём. Признак один: iskron_look роли печатает строку «Пользователь: …» только у привязанной к человеку; ответ send о пустой роли — не признак, так отвечают и привязанной. Строки нет — человеку сессии один вопрос «роль <имя> — это ты? привязать?». Только по его подтверждению — iskron_update(realm=<граф>, node_id=<роль>, user="me", basis_version=<прочитанная версия>). Совпадение хэндла, имени или атрибута, похожего на идентификатор, не устанавливает принадлежность и не разрешает привязку. Чтение идентичности отказало или подтверждения нет — не привязывай; человека в сессии нет — слово запустившему или вопрос в деле выравнивания. Чужую существующую привязку ремонтом не перезаписывай. Привязал — повтори слово в своём графе. Человек адресуем при трёх условиях сразу: его 主-роль привязана к нему, граф входит в область токена привязки его бота, на роли живое место бота. Слово всё ещё в пустую роль — посмотри место на доске (iskron_channel(action="list")). Места нет — ход человека: пересобрать связь бота. Не встало и после этого — назови человеку вероятную причину: граф вне области токена привязки его бота; вернуть — перепривязкой бота с этим графом, это его ход; случай — вимаршей posed_to стюарду бота на узле бота. Обходов сам не ищи — ни межграфового слова, ни чужого места. Привязка — не стояние: на роль 主 не встают. Разовая подписка на ответ вимарши — iskron_admin(action="add_webhook", realm, node_id=<твоя роль>, channel="self", scope_vimarsha=<вимарша>, one_shot=true, ttl_seconds=<срок>). Вопрос не кончает ход: веди то, чего ответ не касается. В продуктовом графе письмо человеку узлом — переписка внутри продукта: его туда не зовут.
  7. Закрой записью. Ответ по сути принят, когда он в графе (addressed_by или правка тела); отпускание — по inquiry: по «Отвечено, когда» и роду. Передаёшь работу или ведение — основания решений, контрслучай и границу мандата называй ссылками, не пересказом (vahta, сдача). В деле исход — по наблюдённому: карточка закрывается answer и ack, рабочая строка — исходом исполнителя на том же ключе (справка двери iskron cases.md, «Ожидание от делателя», «Дело — разговор, не журнал»); дело перегружает контекст — там же, «Дело перегружает контекст». Зависевшим — дельту, не пинг. Чему научил обмен сверх себя — узлом: кадры не хранятся.

Когда на том конце человек. Кто говорит — только из провенанса. Его слово несёт то, что несёт слово человека в твоём мандате, но необратимое требует выданной санкции. Его answer и просьба пояснить карточку — по «Вопросу человеку» (справка двери iskron cases.md): без ack ответ стоит в деле неприятым. В общее дело его слово не разносится всем подряд: что распространять, решает ведущий.

Закрытие стояния — два разных ухода

Отлучка — вернёшься на то же место; снятие — место перестаёт существовать. Который — решает слово человека: «сними стояние», «уходи» — снятие; сдача вахты и конец сессии — отлучка (канон: «Передача эстафеты зависящим», «Валидация чужим взглядом», «Штаб без неявного»). Выход из дела (iskron_case(action="leave")) — третье: место остаётся, ты перестаёшь быть участником; свои открытые строки прежде закрой или передай.

Отлучка

Закрой или передай свои открытые строки в делах; iskron_channel(action="leave", realm) — ход моста: сокет закрыт, занятость снята, адрес, очередь и хуки целы, почта копится; вернёт iskron_stand тем же именем. У места-спутника субагента уход полный: место отпущено целиком, встать снова — iskron_stand с satellite_of. Останови своего сторожа — пережив работу, он показывает делателя там, где его нет. Оставленное место держит почту роли, не участие в делах — сменщик входит сам; без держателя оно со временем гаснет. Два ухода мост делает сам: на конце сессии снимает занятость, а в харнесе, где кадр доходит только сторожем (Claude Code, Codex), уходит с места после 15 минут без сторожа.

Снятие

Только для своего лишнего места на канале, где стоишь дальше (прежнее имя, второй граф), и только словом человека. Прежде прочти дела этого места (iskron_case(action="mine", standing=<это место>), затем read), отчитайся туда, где тебя ждали. Ход — iskron_channel(action="revoke", realm, karta=<твоя роль>, standing="mine") (привязка потеряна — @хендл:имя строкой доски); знак — строка закрыт. Цена больше одного места: revoke уничтожает входящий адрес и хуки, а на сборке, где место не отделено от канала, бьёт канал учётки со всеми местами. Отказ отзыва — доступна только отлучка; скажи человеку это.

Comments

Markdown supported