# Обсуждения и фоновый Codex [Руководство](https://dbmap.anticheckers.com/docs/) · [Интеграции и проверенная совместимость](https://dbmap.anticheckers.com/integrations/) · [Данные и доступ](https://dbmap.anticheckers.com/docs/data-and-access/). SchemaMap 0.7 поддерживает исследовательский диалог поверх существующего API/OAuth. Обсуждения хранятся отдельно от schema/view JSON и не меняют revision карты. В интерфейсе кнопка **«Обсуждения»** открывает участников, цепочки, источники, состояния и остановку/повтор задач. Вид можно использовать как контекст; доступны только цепочки текущего канала и отдельный архив владельца. Текст отображается без исполнения HTML. Источники ссылаются на файлы/строки; присланный snippet показывается как текст. Подключение не является моделью и само не исследует репозиторий. Для этого рядом с исходниками работает обычный Linux процесс, опрашивающий API каждые **5 секунд**. Модель запускается только после получения задачи. Пять секунд — интервал обнаружения, без обещания времени готовности ответа. ## Подключения и права API и MCP используют текущие аккаунты, области и scopes. В версии 0.7 отдельный канал обязателен для каждого чата или экземпляра worker, даже при общем API-ключе/OAuth. `channel_open(areaId,name,role,repo?,published?,ttlSeconds?)` возвращает channelId и приватный channelToken. С версии 0.13.0 каналы и proof бессрочны: expiresAt:null; возраст, простой и offline не требуют продления. Устаревший ttlSeconds принимается как integer и игнорируется. В каждом messaging MCP вызове передавайте channelToken; REST использует `X-SchemaMap-Channel`. UUID, имя и client conversationId не доказывают владение. Нет автоматического выбора последнего канала. Структурные API и view_render продолжают работать с прежним Bearer без канала. Цепочки принадлежат пользователю и явно указанным каналам. Даже редактор общей карты не читает переписку другого владельца. Новый чат того же владельца не наследует старую цепочку. Роли expert/project_manager/developer — метаданные, не права исполнения. Developer требует message-write/task-claim и привязан к repo. Секрет нельзя записывать в сообщения, описания, Space, общие файлы или журналы. `channel_manage(status|rotate|revoke)` требует собственное доказательство; rotate инвалидирует старый секрет и аренды. Смена repo требует нового канала. В UI «Мои каналы и экземпляры» позволяет человеку увидеть и отозвать свои каналы. Новый browser document получает отдельный канал в памяти. После reload доступ к известной собственной цепочке восстанавливается явной кнопкой, через browser+CSRF; агент не может пригласить себя. Старые цепочки до 0.7 сохранены в read-only архиве владельца (`archive=1` в ссылке), без выдуманного origin. [Публичное руководство по данным и доступу](https://dbmap.anticheckers.com/docs/data-and-access/). Для worker создайте в меню **API и MCP** отдельный ключ для выбранной области: выключите изменение схемы, включите чтение обсуждений, отправку ответов и обработку задач. Для ChatGPT достаточно OAuth чтения/записи обсуждений. Старое согласие OAuth не получает новые разрешения автоматически: переподключите клиент. Scope `schemamap:tasks:claim` нужен исполнителю. Все изменения обсуждений требуют текущей роли editor/owner; viewer читает. Отзыв ключа, OAuth или участия закрывает последующие запросы, в том числе heartbeat/complete. Миграция сохраняет поведение старых ключей F, добавляя им операции исследовательских метаданных; старые R получают только чтение обсуждений. Новые ключи позволяют независимо ограничить `canWrite`, `messagesRead`, `messagesWrite`, `tasksClaim`. Разрешения исследований не дают прав менять код или исходную БД. ## Linux worker Требуются Node.js 22+, Linux `/proc`, установленный и авторизованный Codex CLI. Проверено с **codex-cli 0.164.0**. Worker использует permission profiles с ограничением чтения, отключённой сетью команд, apps/plugins/hooks/MCP/multi-agent и утверждением `never`. Сам Codex связывается с моделью через свою существующую авторизацию; ключ SchemaMap в окружение дочернего процесса не передаётся. Не задавайте другой HOME/CODEX_HOME. Скачать [worker 0.13.0](https://dbmap.anticheckers.com/downloads/schemamap-agent-worker-0.13.0.mjs) и [SHA-256](https://dbmap.anticheckers.com/downloads/schemamap-agent-worker-0.13.0.mjs.sha256), либо использовать `scripts/agent-worker.mjs` из этого репозитория. Это самостоятельный файл, отдельный от удалённого пакета плагина. Пример приватного `config.json` (права 0600, каталог 0700; не коммитить): ```json { "server": "https://dbmap.anticheckers.com", "areaId": "точный UUID области", "repo": "/путь/к/исходникам", "token": "отдельный ключ sm_…", "name": "Codex проекта", "pollIntervalSeconds": 5, "timeoutSeconds": 300 } ``` Команды из корня SchemaMap; для скачанного файла замените путь скрипта: ```bash node scripts/agent-worker.mjs start --config /private/worker/config.json node scripts/agent-worker.mjs status --config /private/worker/config.json node scripts/agent-worker.mjs stop --config /private/worker/config.json ``` При первом запуске worker создаёт собственный developer-канал, сохраняет channelId/channelToken в приватном config 0600. При рестарте вращает бессрочный секрет для отсечения прежнего процесса и сбрасывает старые аренды. Для второго независимого экземпляра используйте конфиг без channelId/channelToken; копирование полного конфига означает тот же экземпляр. Секрет не передаётся дочерней модели. Старый worker до 0.7 без канала получает отказ и должен быть обновлён. Остановленные worker не запускаются обновлением сервера. `init --config /private/worker/config.json` также принимает конфигурационный JSON через stdin и создаёт файл 0600. Токены не передавайте аргументом командной строки. `start` запускает отсоединённый процесс и проверяет первый успешный опрос. `status` показывает проверенный PID, active, lastSuccessfulPoll, currentTaskId, modelRuns, область/ветку/коммит и dirty. `stop` проверяет `/proc/PID/cmdline`, останавливает worker и текущий дочерний процесс; незавершённая аренда затем истекает. Процесс независим от текущего turn, но после перезагрузки машины нужен новый start либо собственный systemd supervisor. Остановленная среда не считается доступным worker. Непрерывный polling выполняет этот тихий процесс через REST API, а не модель повторными MCP-вызовами в чате. Пустой опрос не печатается в консоль и не запускает Codex. `agent_register(active=true)` только сообщает настройку: зелёный online требует успешного task_claim/heartbeat не старше `max(30 секунд, 3 × pollIntervalSeconds)`. Пустой `task:null` тоже обновляет lastPollAt. Время фиксируется часами PostgreSQL в момент операции, не в начале транзакции. Чтение agents_list обновляет lastSeenAt, но не lastPollAt и не делает отсутствующий worker доступным. Частичная регистрация, включая `active:false`, сохраняет непереданные имя, kind и контекст. Успешный ответ на адресный вопрос — отдельная проверка работоспособности, которую один индикатор не заменяет. Фраза **«Будь готов отвечать по этому проекту»** в локальном Codex означает выбрать реальную область/репозиторий, создать приватную конфигурацию, выполнить start и проверить status. `agent_register` и текст MCP лишь описывают участника — они не запускают процесс. Вебклиент без возможности выполнить локальную команду сообщает об этой границе. Используйте отдельный исследовательский checkout без `.codex/config.toml`, включая родительские каталоги: worker отказывается загружать потенциально меняющую песочницу конфигурацию проекта. Он не загружает AGENTS/execpolicy как инструкции модели; исследовательская политика передаётся отдельно. Исходники — недоверенные данные. Доступ команд ограничен репозиторием и системным минимумом; `.env*`, локальные секреты/ключи и `local/` закрыты. Для незнакомого проекта подготовьте чистую копию без чувствительных файлов. Ссылки проверяются на относительный путь, отсутствие выхода через symlink и реальные номера строк. Наличие ссылки подтверждает существование диапазона, а не истинность вывода модели: смысл доказательства проверяет читатель. ## Очередь и сообщения 1. Клиент открывает отдельный канал через `channel_open`, регистрирует его и передаёт доказательство во всех обсуждениях. Затем вызывает `agents_list`, выбирает проверенный UUID исполнителя с нужным repo. `message_post(type=question, recipientIds=[id])` создаёт цепочку с контекстом области/вида/таблиц/задачи. 2. Worker атомарно делает `task_claim`: `FOR UPDATE SKIP LOCKED`, одна задача одному получателю, lease по умолчанию 120 секунд, heartbeat каждые 10 секунд. Пустой ответ `task:null` не запускает модель. 3. Исследование читает код, не запускает тесты, миграции, приложения, SQL и правки. При действующей аренде `task_complete` одной транзакцией сохраняет ответ от identity исполнителя, ссылку на вопрос и статус. Просроченный/отменённый токен не принимается. Обычный `message_reply` не обходит lease. 4. Вебклиент читает `messages_inbox`/`thread_get`, отмечает собственное прочтение через `message_ack`. GET не означает readAt. Статус answered подтверждается реальным ответом; реакция working не является захватом задачи. 5. Уточнение `message_reply(type=clarification)` на ответ создаёт новое исследование **в той же цепочке**. В пределах исходного вопроса клиент может уточнять/оспаривать вывод без отдельного поручения на каждую реплику. Изменения кода/схемы требуют соответствующего поручения пользователя. При сбое процесса lease возвращает задачу в очередь; не более трёх захватов без ручного retry. Ошибка модели/таймаут создаёт failed, без автоматического бесконечного повторения. Остановка/повтор доступны автору вопроса и ответственному человеку в браузере; человек-владелец приватной цепочки может контролировать её задачи после явного восстановления доступа. Retry только failed/cancelled, отмена инвалидирует прежнюю аренду. Повторы запросов используют тот же `clientMutationId` и неизменное тело; другой запрос с тем же ID конфликтует. Пагинация `cursor/limit` сохраняет канал/владельца/область/фильтры/режим архива. Чужой курсор недействителен. Не переносите курсоры между подключениями. Thread/message UUID связывают историю без перезаписи общей карты. ## Данные и удаление Хранятся сообщения Markdown до 65535 UTF-16 единиц, до 100 ссылок и до 10 адресатов. HTTPS обязателен вне literal loopback теста. Не отправляйте пароли, токены, реальные значения SQL и абсолютные пути. Сервер маскирует очевидные ключи `sm_`, Bearer, private-key блоки и некоторые присваивания секретов; это ограниченная защита, не универсальная очистка данных. Кодовые фрагменты доступны явно включённым каналам того же владельца; доступ к общей карте не открывает переписку. `message_redact(confirm=true)` убирает собственный текст/источники, оставляя авторство и reply-связь, отменяет работу над удалённым вопросом. Ответственный браузерный пользователь может удалить текст своего подключения. Исходный канал или доверенный человек-владелец может удалить целую цепочку через `thread_delete(confirm=true)`: каскад убирает сообщения, доставки и задачи, сохраняя схему/виды/другие обсуждения. Это действия по явному поручению удаления, не часть обычного исследования. Аудит `message_event` хранит автора, действие, объект и время, без текста и токенов. `php yii maintenance/purge` удаляет только события аудита старше **90 дней**. Каналы, цепочки, сообщения, membership, доставки, ACK, задачи и discussion-кэши идемпотентности не удаляются из-за возраста. Явное удаление владельцем сохраняется. `DISCUSSION_RETENTION_DAYS=1..3650` задаёт срок аудита. Это срок хранения рабочей БД; резервные копии очищаются по собственной серверной политике. Запускайте существующую команду maintenance по расписанию администратора; само наличие настройки не создаёт планировщик. Новые таблицы: agent_identity, agent_presence, discussion_thread, discussion_message, message_delivery, message_reaction, research_task, message_event. В api_key добавлены can_read_messages, can_write_messages, can_claim_tasks. Исходные базы не изменяются. Исправление присутствия от 28 октября 2026 года добавляет `agent_presence.label varchar(200)`: имена участников изолированы по области. Для прежних общих Codex-регистраций миграция восстанавливает подписи по именам областей; ID, ключи, сообщения, адресаты и задания сохраняются. Проверены 56 серверных утверждений, включая две области с одним ключом, имена автора/адресата/реакции, частичную регистрацию, пустые опросы, неподвижный lastPollAt при чтении списка и более длинный настроенный интервал. ## Проверенный сценарий и границы клиентов На локальном HTTP/MCP проверены разные identity одного пользователя, отдельные scopes, идемпотентность, индивидуальное прочтение, курсоры, два одновременных claim, отмена и отзыв ключа. Серверные проверки включают реальное истечение lease и восстановление с новым токеном. Реальный установленный Codex CLI получил вопрос по DiscussionService, вернул ответ с существующими строками, затем ответил на уточнение cancel/retry в той же цепочке. Пустые опросы не запускали модель; start/status/stop проверены. Проблема вложенного запрета пути песочницы выявлена и исправлена в этом прогоне. Сторона вебчата в доступной среде проверяется HTTP/MCP SDK и браузером SchemaMap. Это **не** проверка личного текстового ChatGPT или голосового режима. Их OAuth/установку и вызовы в конкретном аккаунте нужно пройти в этом клиенте; API не может заставить ChatGPT вызывать tools на каждом сообщении и не пробуждает завершённый turn. Доступный ответ используется сейчас; отложенный проверяется при следующем обращении. Отдельно реальный Codex проверен на изолированной локальной копии выбранных файлов коммита TimeBook: вопрос о offences_unread дал ответ со ссылками на существующие модель, чтение и изменение отметок. Оригинальный репозиторий и БД не менялись; копия и ответ остаются локальными, исходники клиента не входят в Git SchemaMap. Это проверка чтения доступного фрагмента кода, не запуска приложения и не личного ChatGPT. Демонстрационный вопрос для подключённого проекта: «Зачем нужна offences_unread в виде PLTAPI-2065-actionRestGet? Покажи запись/чтение и связи с текущим пользователем, приложи файлы/строки и отличай статический разбор от исполнения». Не предполагайте назначение по имени таблицы; выбирайте настоящий viewId/tableId из MCP и проверяйте ответ по коду. Проверки выпуска: 179 unit-тестов, 90 основных браузерных сценариев, новый серверный браузерный сценарий обсуждений, 43 серверные проверки обсуждений, 45 OAuth, REST/MCP SDK и реальные запуски Codex. Расширенный набор tests/workspace дал 6 успешных и 5 сбоев старых сценариев undo/раскладок/конфликта; все те же пять воспроизведены на фронтенде предыдущего e1d8d65, с тем же структурным API. Они не исправлялись в выпуске обсуждений и не считаются пройденными. Проверки изоляции 0.7 описаны отдельно в отчёте аудита. Прежние результаты выше относятся к выпускам 0.5/0.6 и не заменяют новые проверки независимых каналов. Миграция 0.7 добавляет agent_channel, discussion_thread_member и owner_user_id/origin_channel_id/archived_at в discussion_thread. ## Текстовый результат канала 0.9.2 MCP возвращает JSON результата channel_open/channel_manage и в TextContent, и в structuredContent. Open/rotate содержат приватный proof в авторизованном tool result; ассистент не переносит его в обычный ответ. Проверки владельца, parent, области и membership сохранены. Клиент может показывать/хранить tool result, поэтому приватность интерфейса и сохранение proof после законченного хода требуют реальной проверки. Потеря runtime не даёт права восстанавливать чужую identity по ID или общему OAuth; явное browser+CSRF приглашение владельца восстанавливает доступ к выбранной цепочке новому каналу. Автоматическое восстановление текстового чата и доверенный посредник пока не реализованы. Подробности и границы проверки — docs/API_MCP.md, раздел «Текстовые MCP-клиенты и приватное состояние». ## Обнаружение и сетевой исход (0.9.3) Для явно порученного владельцем участия нового чата откройте expert/project_manager с published:true, затем зарегистрируйте kind:client, active:true. UUID канала является author/recipient identity; общий OAuth задаёт человека и родителя, не сливает чаты. active не включает published и online. Online требует настоящего свежего task_claim/heartbeat; web-клиент может быть адресуемым и читать inbox на очередном ходе без online. Неопубликованность — штатная приватность; metadata доступна себе и общим участникам цепочки. Изменение published существующего канала через register не поддерживается. Open/rotate не имеют идемпотентного повтора: после timeout/потери ответа не повторяйте их автоматически. Потерянный open проверяет/отзывает доверенный browser-владелец перед явной заменой. Потерянный rotate: старый proof допускается только для status; channel_required означает остановку и явное восстановление членства новым каналом через владельца. Даже успешный status не исключает ещё исполняющийся rotate. Секрет не восстанавливается по channelId/OAuth. Подробная политика и сетевой тест — docs/API_MCP.md. Автоматического replay/recovery пока нет.