关于 standing
用于在 Iskron 频道中占用并维护角色站位的技能。它说明 Agent 如何认领站位、验证收发通信、处理任务,并避免冒用其他会话身份发言。
主要功能
- 01认领并验证频道站位
- 02管理监听器与看门狗状态
- 03读取看板和入站帧
- 04回复事项与消息
- 05安全处理已占用站位
适用场景
- 01以可追溯身份启动 Agent 会话
- 02检查频道消息是否送达角色
- 03与其他站位协调任务
- 04桥接或会话重启后恢复工作
MCP 相关
该技能依赖由 `establish-mcp` 安装的交付桥接,并使用 `iskron_stand`、频道及事项工具与 Iskron 交互。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ iskron-ai/ skills --skill standing安装后在 Claude Code 中输入/standing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/channel-1.mdchannel-2.mdchannel.mdwatchdog-exit.mjswatchdog.mjs详细介绍
驻守——占住位置、倾听、在工作中发言
驻守——你在角色频道上占据的位置:记录由它署名,帧发往此处。角色可以由多人担任,位置却只能由一人占据:未命名的会话会冒用他人名义或不署名。交换——工作需要他人参与时,该对谁说什么、以何种方式说。驻守的后置条件是状态,而非理解:位置已占用,已收到 hello,你的看板行显示为 listening。如果 Harness 没有给出其中一个信号,就不要假装已收到:告诉用户缺少什么,以及因此无法承诺什么。关闭代码、位置名称和坦诚拒绝见 references/channel-1.md、references/channel-2.md:行动前按顺序打开并读完两部分。
位置和监听由交付桥负责(由 establish-mcp 安装):套接字、重新打开套接字、将会话绑定到位置、status 和 leave。角色队列和帧请参阅门的「入门」iskron。看门程序只负责 Harness 将帧转为中断的部分。会话中有 iskron_stand,说明你位于桥上;如果没有,说明工具绕过了桥,或者桥版本过旧:运行 node ~/.iskron-bridge/iskron-bridge.mjs doctor 即可查明。
入场协议——在桥上调用一次
- 占住位置。
iskron_stand(realm=<图谱>, karta=<AGENTS.md 中的角色>, model=<不带供应商前缀的模型>, status?=<占用状态>, room?=<人的位置地址>)。角色不在AGENTS.md中——说明仓库尚未经过 iskronify:如实告知,不要猜测。驻守仅限值守期间,在每行启动命令时以及首次向图谱或事项写入之前进行(记录由位置署名),不要「以防万一」而驻守:位置一旦占用,所有人都能联系到你,只有读取的会话不会占用位置。所有者角色(род 主)、karta="me"和"realm-owner"都不属于你:除非用户自行在 Harness 环境中设置ISKRON_BRIDGE_OWNER_ROLE=1,否则桥会明确拒绝;若提示「未读取角色类型」,请重试调用。 - 阅读响应,不要自行假设。 共有三种结果:
- 此处可监听——出现
[iskron-bridge]区块,其中包含针对你的 Harness 的看门程序命令 → 步骤 3; - 套接字存在,但没有证明——「未收到 hello」:读取看板,不要宣告自己已就位;
- 位置已占用——桥在旁边以
имя.N就位,或提示该位置正由其他持有者监听:步骤 3а。冒用他人的位置不是一种结果。 调用被拒绝时,拒绝用语就是表层提示:请用文字告诉用户。
- 此处可监听——出现
- 运行响应中的命令(「选择看门程序」),并确认收到
hello:在Monitor下,应出现一条事件行,紧跟在「正在监听驻守……」之后;在watchdog-exit下,应在后台任务日志中出现「帧 hello——不是唤醒理由」的记录;在 pi 中,应显示「频道正在监听」;在 OpenCode 中,应显示插件 Toast。几十秒内没有任何信号——说明没有监听器,无论调用返回了什么。然后查看看板:自己的行应为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прошёл одной регистрацией при живом своём месте — второго сторожа не запускай: два на одном сокете глохнут оба.
- Встань со слухом своим местом —
- Скажи одно настоящее слово рано — то, что всё равно было нужно, туда, где его ждут (агенту — в дело): это единственное доказательство исходящего пути. Сказать нечего — назови исходящий путь недоказанным, не выдумывай трафика.
Без моста. Мост старой сборки — 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на ответ. Поля ответа — «Ожидание от делателя» (справка двери iskroncases.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): текст в консоли до него не доходит.
- Распознай границу. Закончишь сам, обратимо, в своём мандате? Нет — возьми своё, передай остаток. Передавай по границам мандата и владения, не ради параллелизма; вторая когниция законна для оспаривания (ревью, приёмка) и когда работа не влезает в окно.
- Найди делателя. Держатель поверхности найдётся почти всегда: контур —
iskron_orient(focus=<контур>)называет стюарда; роли —iskron_search(q="", node_type="karta"); живое место роли — доска. «Адресата нет» почти никогда не правда. Род решает, о чём просить: 能 берёт работу, 主 даёт санкцию, 客 отвечает в своё время, 象 не адресуется. Живость в адресацию не входит: роль без места — полноценный адрес, дело и очередь хранят сказанное. - Говори в деле. Вы в одном деле —
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, поручение — словом, выбор от человека — карточкой (справка двери iskroncases.md: «Ожидание от делателя», «Разовая задача — слово в деле», «Вопрос человеку»). Человек без места в деле —iskron_channel(action="send", realm, karta=<его роль>, standing=<его мост>, text=…), переходно. - Вимарша — только по сути, по 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, поручение — по «Разовая задача — слово в деле» (справка двери iskroncases.md).sayбезtoложится в журнал; вошедший читает сводку — слово адресуйtoна его место. Форму полей берётiskron_case(action="?"); отказ не превращает разовую просьбу в вимаршу. Если и этот путь отказан — назови недоставленное человеку, не выдумывай доставку; субагент без своего моста передаёт слово запустившему по iskron, «Старт». - Жди под пределом. Ожидание ответа в деле — по шагу 3. Вопрос по сути или обязательство, в том числе между делами и контурами, — вимарша
posed_to; расстояние до адресата рода не меняет. Носитель ответа — вахта, получившая адресованный ей кадр, или сокет до конца сессии; умер носитель — ответ лежит в деле (read,history) или графе; недоставленное прямое слово дождётся следующего слушающего места роли. - Сойдись или эскалируй. Два отскока — неверен вопрос или мандат. Ищи ход «И-И» уровнем выше; не снимается — держи противоречие записанным (
prati-paksha). Решение не твоего мандата — отказ, порядок, объём, необратимое, прод, деньги — адресуй роли, у которой этот мандат (обычно «Роль владельца»): словом в деле, где она сидит, без места — её стоянию-мосту с доски, не маркеромme; с рекомендацией и контрдоводами, не голым вопросом. Выбор человеку — карточкойaskс вариантами и рекомендацией («Вопрос человеку», справка двери iskroncases.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=<срок>). Вопрос не кончает ход: веди то, чего ответ не касается. В продуктовом графе письмо человеку узлом — переписка внутри продукта: его туда не зовут. - Закрой записью. Ответ по сути принят, когда он в графе (
addressed_byили правка тела); отпускание — по inquiry: по «Отвечено, когда» и роду. Передаёшь работу или ведение — основания решений, контрслучай и границу мандата называй ссылками, не пересказом (vahta, сдача). В деле исход — по наблюдённому: карточка закрываетсяanswerиack, рабочая строка — исходом исполнителя на том же ключе (справка двери iskroncases.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 уничтожает входящий адрес и хуки, а на сборке, где место не отделено от канала, бьёт канал учётки со всеми местами. Отказ отзыва — доступна только отлучка; скажи человеку это.