# Как подключить Codex или Claude Code к AlgoBoard

Локальный Codex, ChatGPT desktop, IDE extension и Claude Code могут подключить AlgoBoard как stdio MCP-сервер. Агент получает отдельные tools для задач, Wiki, отчётов, чатов и связи `сообщение → каноническая карточка`. Если клиент умеет вызывать HTTP API напрямую, те же операции доступны через ConnectRPC JSON.

В AlgoBoard агент — отдельный security principal. При создании он получает собственную служебную запись участника с `principalType=agent`, проектные роли, capability policy и один или несколько отзываемых токенов. Сообщения, комментарии, созданные карточки и activity подписываются именем агента, а не владельца, который его настроил.

Для самостоятельного MCP-сеанса фактический доступ — пересечение трёх ограничений: scope конкретного токена, capability policy агента (`allow`, `ask`, `deny`) и его проектные роли. Например, `write` не позволит переместить карточку без `issue.move`; policy `write=ask` создаст запрос на одноразовое человеческое подтверждение, а `admin=deny` запретит административный вызов даже при admin-token. Итоговые права проекта возвращаются в `projectState.currentPermissions`.

У управляемого запуска из личного сообщения или slash-skill другая граница: runner получает отдельный короткоживущий delegation token, и каждый board-вызов проверяется с **текущими правами человека, который создал invocation**. Наследуются его проектные роли, права полей, ACL представлений и workspace-роль — без объединения с правами Agent. Изменение или отзыв прав начинает действовать на следующем вызове. В журнале действие по-прежнему подписано Agent и дополнительно связано с человеком и invocation. Delegation token привязан к конкретным `invocationId`, `runnerId` и попытке; finish, потеря lease или истечение постоянного connector token немедленно делают его недействительным.

## 1. Подготовка

Требуются запущенный AlgoBoard, Node.js и agent principal из **Настройки → API и агенты**. Укажите его роли в текущем проекте и политику capabilities. Для работы с задачами обычно достаточно `read=allow`, `write=allow`, `admin=deny`; используйте `ask` для операций, которые должен подтвердить человек. Секрет первого токена показывается только один раз.

```bash
cd /Users/georgy/Projects/algo/algoboard
export ALGOBOARD_API_URL=http://localhost:8080
export ALGOBOARD_TOKEN=ab_agent_...
npm run agent:mcp
```

Процесс пишет MCP-протокол только в stdout, а диагностику — в stderr. `ALGOBOARD_API_URL` может указывать и на удалённый AlgoBoard, доступный с этой машины.

## 2. Быстрое pairing-подключение

Предпочтительный путь не требует вручную копировать постоянный Agent token или редактировать MCP-конфигурацию:

1. Откройте **Настройки → API и агенты**, выберите активного Agent и нажмите **Подключить локально**.
2. В течение 10 минут выполните показанную команду в каталоге проекта:

```bash
npx --yes @algoboard/agent connect \
  --url https://api.algoboard.example \
  --code ab_pair_... \
  --project-dir /absolute/path/to/project
```

Pairing code одноразовый и высокоэнтропийный; сервер хранит только его SHA-256 hash. После обмена CLI получает отдельный отзываемый token этого connector, сохраняет его в macOS Keychain или Linux Secret Service и никогда не пишет token в конфигурацию Codex/Claude. Если системное хранилище недоступно, используется отдельный файл `0600` с явным предупреждением.

CLI автоматически находит установленные Codex и Claude Code, добавляет token-free stdio MCP entry и устанавливает skill runner как пользовательский сервис: `launchd` на macOS или `systemd --user` на Linux. Сервис стартует после входа пользователя и автоматически перезапускается после ошибки. `--no-start` сохраняет connector, но не устанавливает сервис.

Управление после подключения:

```bash
npx --yes @algoboard/agent status
npx --yes @algoboard/agent doctor --connector CONNECTOR_UUID
npx --yes @algoboard/agent install-service --connector CONNECTOR_UUID
npx --yes @algoboard/agent uninstall-service --connector CONNECTOR_UUID
npx --yes @algoboard/agent stop --connector CONNECTOR_UUID
npx --yes @algoboard/agent start --connector CONNECTOR_UUID
npx --yes @algoboard/agent restart --connector CONNECTOR_UUID
npx --yes @algoboard/agent@latest upgrade --connector CONNECTOR_UUID
npx --yes @algoboard/agent logs --connector CONNECTOR_UUID --lines 200
npx --yes @algoboard/agent logs --connector CONNECTOR_UUID --follow
npx --yes @algoboard/agent disconnect --connector CONNECTOR_UUID
```

Сервисный файл не содержит token. CLI кладёт стабильную приватную копию runtime в `~/.algoboard/connectors/runtime/<connector-id>/`, а процесс при запуске сам читает секрет из Keychain, Secret Service или fallback-файла `0600`. Поэтому очистка npm cache не ломает установленный runner. На macOS unit находится в `~/Library/LaunchAgents/com.algoboard.agent.<connector-id>.plist`, на Linux — в `~/.config/systemd/user/algoboard-agent-<connector-id>.service`.

`upgrade` обновляет connector до версии запущенного CLI, поэтому для обновления используется явный `@latest`. Перед заменой CLI сохраняет предыдущие config и runtime, затем обновляет MCP entries, переустанавливает сервис и дважды проверяет его активность. Ошибка на любом этапе возвращает старую версию, runtime, MCP-конфигурацию и прежнее состояние runner. Переход на более старую версию блокируется; `--force` предназначен только для осознанного rollback.

`disconnect` сначала выгружает и удаляет системный сервис, затем отзывает серверный token, удаляет MCP entries, runtime и локальный секрет. Диагностика runner сохраняется в `~/.algoboard/connectors/<connector-id>.log`. В интерфейсе отдельно отображаются MCP presence и runner presence; сигнал обновляется каждые 30 секунд и считается offline через 90 секунд.

`doctor` — рекомендуемая первая команда после pairing и при любой ошибке `/setup`. Она проверяет права приватных файлов, доступность секрета без его вывода, каталог проекта, установленный runtime, состояние launchd/systemd, API и remote presence, MCP-регистрацию Codex/Claude, незавершённый upgrade lock и последние ошибки runner. Результат возвращается как JSON: `pass` означает готовность, `warn` — ограничение с подсказкой, `fail` — блокирующую проблему и команду исправления. Exit code ненулевой только при `fail`, поэтому команду можно использовать в локальном health-check.

Для разработки без опубликованного npm-пакета та же команда доступна из checkout:

```bash
npm run agent:connect -- connect \
  --url http://localhost:8080 \
  --code ab_pair_... \
  --project-dir /absolute/path/to/project
```

## 3. Codex desktop, CLI или IDE

Быстрое подключение через CLI:

```bash
codex mcp add algoboard \
  --env ALGOBOARD_API_URL=http://localhost:8080 \
  --env ALGOBOARD_TOKEN=ab_agent_... \
  -- npm --prefix /Users/georgy/Projects/algo/algoboard run agent:mcp

codex mcp list
```

Команда сохраняет переданные значения в конфигурации Codex. Чтобы не сохранять секрет, экспортируйте переменные перед запуском Codex и добавьте проектный `.codex/config.toml`:

```toml
[mcp_servers.algoboard]
command = "npm"
args = ["run", "agent:mcp"]
cwd = "/Users/georgy/Projects/algo/algoboard"
env_vars = ["ALGOBOARD_API_URL", "ALGOBOARD_TOKEN"]
default_tools_approval_mode = "writes"
```

Codex desktop, CLI и IDE extension используют общий `config.toml` на одном Codex host. После изменения конфигурации перезапустите desktop/extension или откройте `/mcp` в CLI.

## 4. Claude Code

Для одного пользователя:

```bash
claude mcp add \
  --transport stdio \
  --scope user \
  --env ALGOBOARD_API_URL=http://localhost:8080 \
  --env ALGOBOARD_TOKEN=ab_agent_... \
  algoboard -- npm --prefix /Users/georgy/Projects/algo/algoboard run agent:mcp

claude mcp list
```

Для проекта можно положить `.mcp.json` в его корень. Секрет остаётся во внешней переменной среды:

```json
{
  "mcpServers": {
    "algoboard": {
      "type": "stdio",
      "command": "npm",
      "args": ["--prefix", "/Users/georgy/Projects/algo/algoboard", "run", "agent:mcp"],
      "env": {
        "ALGOBOARD_API_URL": "${ALGOBOARD_API_URL:-http://localhost:8080}",
        "ALGOBOARD_TOKEN": "${ALGOBOARD_TOKEN}"
      }
    }
  }
}
```

Claude Code запросит доверие к проектному MCP-серверу. Состояние соединения видно через `/mcp`. Не добавляйте реальный токен в репозиторий, prompt или общий `.mcp.json`.

## 5. Управляемые skills и локальный runner

AlgoBoard хранит skill как версионированный ZIP-архив в формате Codex. В корне архива должен быть `SKILL.md` или единственная папка с именем skill и файлом `SKILL.md` внутри. Frontmatter использует обязательные `name` и `description`; сервер отклоняет небезопасные пути, ссылки, слишком большие архивы и некорректный `agents/openai.yaml`. Один закреплённый архив умеют выполнять оба runtime: Codex и Claude Code.

Рабочий цикл:

1. Откройте **Настройки → API и агенты → Skills** и создайте skill из готового шаблона `SKILL.md` либо загрузите ZIP. Сервер проверит frontmatter, структуру архива, размеры и app-only metadata; каждая следующая загрузка становится неизменяемой версией.
2. Откройте историю версий, скачайте или сравните нужные версии и выберите точную версию для назначения. Назначение закрепляет версию за конкретным Agent, проектом и slash-командой; публикация новой версии не переключает работающий `/setup` автоматически.
3. До сохранения проверьте permissions preview: policy `allow`, `ask` или `deny`, источник выбора runtime, файловый sandbox, сеть и дополнительные домены из `configJson`. При `--runtime=auto` выбор следует `Agent.runtime`; явный `--runtime=codex|claude_code` в connector переопределяет его. Если UI не видит конфигурацию конкретного connector, он помечает runtime как предполагаемый, а фактическое значение подтверждает `doctor`. Codex выполняется в `workspace-write` с сетью, а Claude Code — с OS sandbox и строгим allowlist доменов; это разные гарантии.
4. Запустите локальный runner от токена этого Agent:

```bash
cd /Users/georgy/Projects/algo/algoboard
export ALGOBOARD_API_URL=http://localhost:8080
export ALGOBOARD_TOKEN=ab_agent_...
export ALGOBOARD_PROJECT_ID=project-uuid
export ALGOBOARD_PROJECT_DIR=/absolute/path/to/project
npm run agent:runner
```

5. В личном DM «человек ↔ один Agent» обычное текстовое сообщение автоматически ставит встроенный direct-chat invocation в очередь; runner выполняет запрос в подключённом проекте, а итог публикуется обратно в разговор от имени Agent. Для явно назначенного skill отправьте отдельным сообщением `/setup` или, например, `/setup --fresh`: при policy `ask` владелец сначала подтверждает invocation в разделе Skills, `allow` сразу ставит его в очередь, а `deny` запрещает запуск. `//setup` не считается slash-командой и обрабатывается как обычное сообщение Agent.
6. Runner атомарно забирает очередь только своего Agent, получает ограниченный текущей попыткой delegation token, исполняет immutable snapshot версии из самого invocation, проверяет SHA-256 и запускает выбранный runtime в `ALGOBOARD_PROJECT_DIR`. В Codex или Claude Code он временно подключает встроенный AlgoBoard MCP: `search_board_api` находит точный protobuf-контракт, а `call_board_api` позволяет создавать и изменять любые доступные пользователю объекты доски. При `ALGOBOARD_RUNNER_RUNTIME=auto` значение `Agent.runtime=claude_code` выбирает Claude Code, остальные значения — Codex; явный runtime connector имеет приоритет. Последующий rollback назначения не меняет уже поставленный запуск и его историю. Результат и ошибка возвращаются в журнал invocation.
7. Если новая версия ведёт себя неправильно, выберите прежнюю версию в истории и перепривяжите существующее назначение. Такой rollback меняет только pinned version назначения; опубликованные версии и `latest` остаются неизменными и доступными для аудита.

Архив кэшируется с приватными правами в `~/.algoboard/skills`, но не устанавливается в глобальные каталоги Codex или Claude Code и не участвует в обычном implicit discovery. На каждый invocation runner делает временную копию. Постоянный connector token удаляется из окружения дочернего процесса и не попадает в prompt или аргументы запуска; дочерний runtime видит только delegation token, который встроенный MCP передаёт серверу. Таким образом, управляемый вызов существует только в контексте AlgoBoard, хотя скачанный владельцем ZIP остаётся обычным переносимым skill.

Codex запускается с `--ephemeral --ignore-user-config`, sandbox `workspace-write`, сетью для установки зависимостей и `approval_policy=never`: человеческим шлюзом служит policy назначения в AlgoBoard, а локальный процесс не зависает на интерактивном prompt.

Claude Code запускается в официальном scripted-режиме `--bare -p --no-session-persistence` с `dontAsk`, явным списком `Bash,Read,Edit`, обязательным OS sandbox и `allowUnsandboxedCommands=false`. Read/Edit разрешены только проекту и временной копии skill; Bash получает строгий allowlist доменов и не видит AlgoBoard/API tokens. `bypassPermissions` runner не использует. Нужен Claude Code 2.1.219+ и `ANTHROPIC_API_KEY`: bare mode не читает OAuth/keychain. Дополнительные registry или внутренние домены задаются в `configJson` назначения, например `{"networkAllowedDomains":["packages.example.com"]}`.

Claim создаёт двухминутный lease. Runner отправляет heartbeat каждые 20 секунд и прекращает дочерний процесс после трёх последовательных ошибок heartbeat. При следующем polling просроченный запуск активного назначения возвращается в очередь; новый runner получает следующую попытку. После трёх потерянных попыток invocation завершается ошибкой. Поэтому несколько runner могут безопасно обслуживать одну пару Agent + project, хотя одна попытка всегда принадлежит только одному `runnerId`.

Recovery даёт at-least-once delivery: если локальная команда успела изменить проект, но runner потерял связь до `Finish`, следующая попытка может увидеть уже применённые изменения. Пишите setup/deploy skills повторяемыми и сначала проверяйте текущее состояние.

Для диагностики одного цикла используйте `ALGOBOARD_RUNNER_ONCE=1`. Интервал опроса регулирует `ALGOBOARD_POLL_INTERVAL_MS`, heartbeat — `ALGOBOARD_HEARTBEAT_INTERVAL_MS`, runtime override — `ALGOBOARD_RUNNER_RUNTIME=auto|codex|claude_code`, пути к бинарникам — `ALGOBOARD_CODEX_BIN` и `ALGOBOARD_CLAUDE_BIN`, идентификатор процесса — `ALGOBOARD_RUNNER_ID`, а отдельный каталог кэша — `ALGOBOARD_SKILL_CACHE_DIR`.

Runner отвечает за локальное выполнение Codex skills и временно добавляет managed MCP с унаследованными правами отправителя. Постоянные MCP-подключения из разделов выше независимо дают Codex и Claude Code доступ к задачам и чатам от собственного Agent principal и не наследуют права случайного собеседника.

При pairing-подключении `ALGOBOARD_CONNECTOR_ID` добавляется автоматически. MCP и runner отправляют независимые presence heartbeat; содержательные tool-вызовы по-прежнему проходят обычные scopes, policy и project RBAC. Если пользователь вызывает `/setup`, пока runner offline, invocation сохраняется в очереди, а чат сразу показывает предупреждение.

## MCP tools

Все результаты возвращаются одновременно как JSON-текст для старых клиентов и как MCP `structuredContent` для клиентов, которые умеют его использовать.

| Tool | Scope | Назначение |
| --- | --- | --- |
| `get_app_state` | `read` | Получить ID и полное состояние проекта |
| `search_board_api` | `read` | Найти актуальный метод BoardService, поля protobuf JSON и enum перед generic-вызовом |
| `call_board_api` | зависит от RPC | Вызвать любой не-account метод BoardService; в managed invocation применяются текущие права отправителя |
| `get_reports` | `read` | Получить встроенные и пользовательские DSL-отчёты |
| `preview_report` | `read` | Рассчитать выбранный сохранённый отчёт |
| `list_issues` | `read` | Найти карточки по тексту, колонке и исполнителю |
| `get_issue` | `read` | Получить свежий snapshot одной карточки |
| `create_issue` | `write` | Создать карточку |
| `update_issue` | `write` | Изменить основные поля |
| `move_issue` | `write` | Выполнить workflow-переход и автоматизации |
| `add_comment` | `write` | Добавить комментарий |
| `archive_issue` | `write` | Архивировать или восстановить карточку |
| `promote_message_to_issue` | `write` | Создать одну каноническую карточку из сообщения с обратной ссылкой |
| `get_chat_bootstrap` | `read` | Получить capability, права, unread summary и первую страницу разговоров |
| `list_conversations` | `read` | Читать каналы и DM по непрозрачному cursor |
| `create_channel` | `write` | Создать открытый или приватный канал |
| `update_channel` | `write` | Изменить канал |
| `archive_channel` | `write` | Архивировать и заморозить канал |
| `open_direct_conversation` | `write` | Открыть или переиспользовать DM |
| `list_messages` | `read` | Читать страницу сообщений без изменения human unread cursor |
| `get_message` | `read` | Получить свежий snapshot сообщения и разрешённые actions |
| `list_thread_replies` | `read` | Читать корень и ответы треда |
| `search_chat_members` | `read` | Найти участника DM или доступного для упоминания участника |
| `search_chat_issues` | `read` | Найти карточку для структурированной ссылки в сообщении |
| `send_message` | `write` | Идемпотентно отправить сообщение или reply |
| `edit_message` | `write` | Изменить своё доступное сообщение |
| `delete_message` | `write` | Soft-delete своего сообщения или модерация с причиной |
| `list_conversation_events` | `read` | Получить durable-события после event sequence |
| `list_agent_skills` | `read` | Получить назначенные текущему Agent app-scoped skills, версии и slash-команды |
| `create_subboard` | `write` | Создать фильтрованную под-доску |
| `create_wiki_article` | `write` | Создать корневую статью или подраздел Wiki |
| `update_wiki_article` | `write` | Изменить текст, название, раздел или позицию статьи |
| `delete_wiki_article` | `write` | Удалить статью с подразделами и очистить ссылки в карточках |
| `delete_column` | `admin` | Перенести карточки и удалить колонку |
| `delete_label` | `admin` | Снять метку с карточек и удалить её |
| `run_import` | `admin` | Запустить Jira/YouGile import |
| `sync_integration` | `admin` | Синхронизировать GitLab merge requests |
| `create_issue_template` | `admin` | Создать форму карточки и share URL |
| `update_issue_template` | `admin` | Изменить форму карточки |
| `rotate_issue_template_link` | `admin` | Отозвать и заменить share URL формы |
| `create_automation_rule` | `admin` | Создать automation rule |
| `retry_gitlab_outbox_action` | `admin` | Повторить упавшее GitLab-действие |

## Подтверждение policy `ask`

`ask` не сохраняет команду для фонового исполнения и не превращает approve в удалённый запуск. Первый вызов проходит обычные проверки токена, роли и разрешений проекта, затем AlgoBoard создаёт pending receipt на 15 минут и возвращает `failed_precondition`, `approval_id` в сообщении и заголовок `X-Algoboard-Approval-Id`.

1. Человек открывает **Настройки → API и агенты**, проверяет Agent, risk, безопасный request preview и diff.
2. Человек подтверждает или отклоняет запрос. Само подтверждение ничего не изменяет.
3. Агент повторяет тот же tool с теми же аргументами. MCP-процесс помнит ID и автоматически добавляет `X-Algoboard-Approval`.
4. Сервер атомарно забирает receipt, снова проверяет точный request hash, token, `configVersion`, текущее состояние объекта, RBAC и workflow, выполняет handler и записывает `executed` или `failed`.

Receipt одноразовый. Изменённый request, другой Agent или token, повторное исполнение, истёкший срок и изменение карточки после запроса не проходят проверку. В сохранённом preview секретные поля маскируются, но hash всё равно привязан к полному protobuf-запросу. Если MCP-процесс был перезапущен, повторите tool: первый повтор заново получит тот же активный `approval_id`, следующий подтверждённый повтор выполнит действие.

## Журнал запусков

Каждый аутентифицированный Agent-вызов BoardService или ChatService создаёт отдельную запись Agent Run. Журнал фиксирует Agent и token, `configVersion`, runtime/model, procedure, capability и решение policy, безопасный request preview, target entity, approval receipt, Connect-код, latency и размер protobuf-ответа. Успешный ответ MCP содержит `_algoboardRunId`; при ошибке тот же ID добавляется как `run_id` и возвращается в заголовке `X-Algoboard-Agent-Run-Id`.

Статусы: `running`, `succeeded`, `failed`, `denied`, `approval_required`. После terminal status запись не редактируется. Незавершённый из-за остановки процесса run помечается `failed` при следующем чтении ledger. Просмотр доступен только человеку с `api.manage` в **Настройки → API и агенты**; Agent token не может читать ни approvals, ни собственный control-plane ledger.

Ledger отражает реальные AlgoBoard tool/API actions. Он намеренно не выдумывает token/cost модели: локальный Codex или Claude Code не передаёт эту telemetry MCP-серверу. Usage/cost появится отдельным подписанным report protocol, чтобы цифры имели понятное происхождение.

## 5. ConnectRPC JSON

Если агент умеет вызывать HTTP API, MCP не нужен. Используйте Bearer-токен и методы из [`api.md`](api.md).

```bash
curl --fail-with-body \
  -X POST http://localhost:8080/algoboard.v1.BoardService/GetAppState \
  -H "Authorization: Bearer ${ALGOBOARD_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{}'
```

## Надёжный цикл агента

1. Вызвать `get_app_state`, выбрать проект по `id` или `key` и проверить `projectState.currentPermissions`.
2. Использовать только ID из свежего ответа. Не угадывать UUID и номера enum.
3. Перед изменением вызвать `get_issue`; перед изменением сообщения — `get_message` и проверить `actions`.
4. Выполнить одну логическую команду. Для полной замены зависимостей передать `dependencyIds` вместе с `replaceDependencies: true`; карточка ждёт перечисленные ID, а не наоборот.
5. Снова прочитать карточку: automation rule могла изменить колонку, исполнителя или поля.
6. При `failed_precondition` отличить `approval_id` от ошибки workflow. Для approval дождаться решения и повторить только точный вызов; workflow не обходить последовательностью случайных изменений.
7. Перед импортом сначала вызвать `run_import` с `dry_run: true`.
8. Перед destructive tools показать человеку свежий выбранный объект и точное последствие.

Для чатов сначала вызовите `get_chat_bootstrap`, затем используйте `conversation.id`. `list_messages` и `list_thread_replies` специально не меняют unread-состояние участника. Для инкрементального чтения храните снаружи последний `eventSequence` и передавайте его в `list_conversation_events`; MCP не помечает человеческий разговор прочитанным.

`send_message` требует caller-generated `client_request_id`. При разрыве соединения повторите запрос с тем же значением: сервер вернёт исходное сообщение с `duplicate: true`. Для обычного текста достаточно `text`; упоминания и ссылки на карточки передаются через упорядоченные `parts` с типом `member_mention` или `issue_reference`. Сначала получите их ID через search tools.

Когда обсуждение стало обязательством, используйте `promote_message_to_issue`, а не несвязанную `create_issue`: сервер атомарно сохранит snapshot источника, покажет backlink в чате и не создаст вторую карточку при повторе того же `message_id`.

Обычные Create-команды пока не идемпотентны. Если соединение оборвалось после отправки запроса, сначала найдите карточку или доску в свежем состоянии. Повторный Create без проверки может создать дубль. Исключения: `send_message`, `open_direct_conversation` с устойчивым `client_request_id`, `promote_message_to_issue` с уникальной связью источника и `SubmitIssueTemplate` с обязательным `idempotencyKey`.

Значение custom field типа `MEMBER` — ID из `GetAppState.members` того же workspace. Перед записью проверьте `active`; сервер дополнительно проверяет принадлежность участника рабочему пространству.

Значение поля `WIKI_ARTICLE` — ID из `GetAppState.projectState.wikiArticles` того же проекта. Значение `HOURS` — неотрицательное число до 100000 в строковом виде, например `"2.5"`. При удалении статьи сервер очищает все ссылки на неё и её подразделы в карточках.

Для отчёта сначала вызовите `get_reports` с `project_id`: ответ вернёт встроенные и пользовательские DSL-определения. Затем передайте выбранный `report_id` в `preview_report`, чтобы получить рассчитанные столбцы и строки. Разрезы, агрегаты и фильтры задаются только в `queryDsl`; отдельного режима для часовых метрик нет.

## Рекомендуемые профили доступа

| Агент | Capability policy | Token scopes | Срок |
| --- | --- | --- | --- |
| Аналитик, отчёты, поиск | `read=allow`, остальное `deny` | `read` | 30–90 дней |
| Помощник команды | `read=allow`, `write=allow`, `admin=deny` | `read`, `write` | 7–30 дней |
| Осторожный исполнитель | `read=allow`, `write=ask`, `admin=deny` | `read`, `write` | 7–30 дней |
| Import/integration operator | `read=allow`, `write=ask`, `admin=ask` | `admin` | 1–7 дней |

Не выдавайте `admin` агенту, который только создаёт и двигает карточки.

## Примеры задач для агента

Безопасный read-only запрос:

> Открой AlgoBoard, найди критичные карточки без исполнителя в проекте TEAM и верни ключ, колонку, срок и блокирующие зависимости. Ничего не меняй.

Создание после проверки:

> Прочитай проект TEAM. Если открытой карточки с заголовком «Проверить release webhook» нет, создай task с высоким приоритетом в backlog и верни её ключ. Если карточка уже есть, не создавай дубль.

Переход с контролем результата:

> Перемести TEAM-42 в колонку Review. Если workflow не разрешает переход, не меняй другие поля автоматически: верни точную причину. После успешного перехода перечитай карточку и сообщи итоговую колонку и исполнителя.

Ответ в чате:

> Найди канал релиза, прочитай новые сообщения после event sequence 128. Ответь только если есть вопрос ко мне; используй client request ID `release-watch-2026-08-01-129`. Не меняй unread-состояние.

Создание карточки из обсуждения:

> Прочитай сообщение с указанным ID. Если `canPromoteToIssue=true`, создай из него bug в Backlog через `promote_message_to_issue`, сохрани исходный текст в описании и верни ключ. Если карточка уже связана, верни существующую.

Импорт:

> Сделай dry-run Jira integration на 100 задач. Покажи scanned/created/updated/skipped и первые ошибки. Реальный импорт не запускай без моего подтверждения.

## Аудит и отзыв

Комментарии, сообщения, reporter карточки и activity events используют отдельного участника агента. В настройках видны его владелец, статус, роли проекта, capability policy, версия конфигурации, токены и последняя активность.

Пауза агента немедленно блокирует все его токены. Отзыв одного токена оставляет остальные активными; это удобно для ротации секрета без смены agent identity.

Отзовите токен, если:

- агент больше не используется;
- секрет попал в лог или сообщение;
- изменился владелец автоматизации;
- агент выполняет команды вне согласованного сценария.

Отзыв начинает действовать для следующего API-вызова. Активная браузерная сессия пользователя от этого не завершается.
