diff --git a/docs/bot.md b/docs/bot.md index 2f0f719e..f0c86f4d 100644 --- a/docs/bot.md +++ b/docs/bot.md @@ -433,11 +433,12 @@ max sales bot mcp config # запись для Claude Desktop, Cursor (`max_bot_chats_moderate`). `max_bot_status` показывает, за какой профиль говорит сервер, откуда токен, чей это бот и какие пишущие инструменты включены. -- `permissions.bot: readonly` у профиля бота — агент только читает; -- `allow` — только названные действия: `"allow": ["send"]` даёт отправку и комментарии, но не правку - и не удаление; -- удаление сообщения или комментария агент сначала показывает вам формой; `--allow-dangerous` при - запуске сервера убирает эту форму; +- `permissions.bot: readonly` у профиля бота — агент только читает, если нет более точных разрешений; +- чтобы разрешить только отправку и комментарии, задайте `permissions.bot: readonly`, затем + `permissions.bot.messages.send: allow`; проверьте, нет ли других более точных разрешений; +- удаление сообщения или комментария по умолчанию имеет уровень `ask`: агент показывает вам форму; + явный `allow` для `permissions.bot.messages.delete` или `--allow-dangerous` при запуске сервера + убирает её, если не включён `--confirm-send`; - действия, которые правила чата велят подтверждать, агент показывает одной формой; - `--confirm-send` — каждую запись вы сначала видите в форме. diff --git a/docs/dev/BACKLOG.md b/docs/dev/BACKLOG.md index 7f2ae5d4..c175e951 100644 --- a/docs/dev/BACKLOG.md +++ b/docs/dev/BACKLOG.md @@ -186,6 +186,9 @@ which; the plan for it starts by saying so. ## Parity tooling follow-up +- Completed 2026-10-04: release documentation describes canonical P7 defaults, resource-specific + restrictions, explicit deletion confirmation and current permission recipes. Publication is separate. + - Completed 2026-10-03: repository parity-audit skill runs the shared detailed auditor (#365; shared #470–#474). No account access. - Completed 2026-10-03: shared sends-list factory honors configured limit and shared skill factory exposes named link-conversations instructions (#368). @@ -199,4 +202,3 @@ which; the plan for it starts by saying so. - Completed 2026-10-03: chats-show member counts explain possible self omission or partial lists without claiming incomplete loading (SDK0.137, CLI-62). Online and offline consumer regressions retain JSON counts and members. - Completed 2026-10-03: MAX poll.already.voted refusal explains explicit retract before a new vote when the poll permits changing votes (CLI-61). Provider error identity and one attempted write are preserved; wire refusal regressions cover other errors and an explicit retract refusal. - diff --git a/docs/dev/release-parity-readiness.md b/docs/dev/release-parity-readiness.md new file mode 100644 index 00000000..28418865 --- /dev/null +++ b/docs/dev/release-parity-readiness.md @@ -0,0 +1,12 @@ +# Release documentation readiness + +Claim: docs/release-parity-readiness, 2026-10-04. Release preparation requested by the owner; +another agent will publish MAX/TG. No version bump, live account operations or publication here. + +The P7 cutover is merged. Correct stale read-only defaults and legacy configuration recipes in +remote/MCP/security/bot/agent guidance against canonical permission keys. Restrict each resource +explicitly in the scheduled-agent recipe. Preserve current generated command documentation. + +Retain the fresh parity and release-check evidence privately. Draft the next changelog separately +for review, restoring the published version's historical section rather than adding new changes +to it. Check lint, types, tests, docs and parity before merging documentation corrections. diff --git a/docs/mcp.md b/docs/mcp.md index 78b845b1..cd8dc4a9 100644 --- a/docs/mcp.md +++ b/docs/mcp.md @@ -54,7 +54,7 @@ claude mcp add max-work -- max work mcp **Claude Desktop, Cursor и другие** — готовую запись для их файла настроек печатает сам `max`: ```sh -max mcp config # только чтение +max mcp config # права текущего профиля max work mcp config --confirm-send ``` @@ -158,9 +158,9 @@ claude mcp add max -- max mcp --confirm-send | `max_reactions_remove` | `max reactions remove` | снять свою реакцию, так же | | `max_polls_vote` | `max polls vote` | проголосовать или снять голос, по правам профиля | | `max_polls_create` | `max polls create` | создать опрос, по правам профиля | -| `max_chats_mark_read` | `max chats mark-read` | отметить чат прочитанным, только с `--allow-mark-read` | +| `max_chats_mark_read` | `max chats mark-read` | отметить чат прочитанным, по правам `chats.mark-read` | | `max_messages_delete` | `max messages delete` | удалить у владельца, по правам `messages.delete` | -| `max_chats_check` | `max chats moderate` | проверить группу по правилам и сделать, что они разрешают, только с `--allow-moderate` | +| `max_chats_check` | `max chats moderate` | проверить группу по правилам и сделать, что они разрешают, по правам `chats.moderate` и уровню каждого действия | | `max_contacts_*`, `max_polls_close`, `max_chats_join` и другие | `max contacts …`, `max polls close`, `max chats …`, `max account update` | по правам соответствующего ресурса | В `max_review` отбор вопросов учитывает сохранённые и новые расшифровки до фильтрации. diff --git a/docs/recipes.md b/docs/recipes.md index a88767a8..31a70ddb 100644 --- a/docs/recipes.md +++ b/docs/recipes.md @@ -40,13 +40,19 @@ claude -p "$(cat ~/max-recipes/morning.md)" --allowedTools "Bash(max inbox:*)" **Запрет на уровне `max`** действует на любого агента: ```sh -max config set readOnly true # профиль ничего не отправит +for resource in messages reactions polls topics chats contacts account bot conversations; do + max config set "permissions.$resource" readonly +done +max config show # проверить эффективные права max config set sendsPerHour 5 # или: не больше пяти сообщений в час max recipients add "Иван Петров" # и писать только в эти чаты ``` -`readOnly` запрещает отправку и вам тоже, пока вы его не выключите: `max config unset readOnly`. -Все попытки отправки, в том числе отклонённые, — `max sends list`. +`readonly` ограничивает каждый указанный ресурс и для вас, и для агента. Более точные ключи +вроде `permissions.messages.send: allow` имеют приоритет: удалите такие разрешения, если профиль +должен только читать. После миграции старый `readOnly` менять нельзя. Чтобы убрать своё ограничение, +используйте `max config unset permissions.<ресурс>`; тогда снова действуют унаследованные настройки +и defaults. Все попытки отправки, в том числе отклонённые, — `max sends list`. **Чтение не выдаёт вас.** Ни одна команда в рецептах ниже не ставит отметку «прочитано»: собеседник не видит, что агент открыл чат. diff --git a/docs/remote.md b/docs/remote.md index 15a006d4..c2b3c079 100644 --- a/docs/remote.md +++ b/docs/remote.md @@ -20,9 +20,11 @@ ChatGPT / Claude ──интернет──▶ Tailscale Funnel ──▶ mcp- - **Кто прошёл пароль, тот читает ваш MAX.** Возьмите длинный пароль, который нигде больше не используется. Не запускайте схему без пароля и никогда — через туннель без входа. -- **По умолчанию только чтение.** `max mcp` без `--allow-send` ничего не отправляет. Добавляйте - флаг, только когда приложение должно отправлять, и сначала прочитайте [mcp.md](mcp.md): - `--confirm-send` и список получателей действуют и здесь. +- **Большинство записей разрешено по умолчанию.** До подключения приложения задайте `permissions` + со значениями `readonly` или `deny` для ресурсов, которые оно не должно менять. Более точный ключ + может разрешить отдельное действие; проверьте эффективные права через `max config show`. + `--confirm-send` требует подтверждения каждой записи; список получателей действует и здесь. + Старый `--allow-send` не добавляет прав. См. [mcp.md](mcp.md) и [настройки](configuration.md). - **Компьютер с `max` должен быть включён.** Чтобы пользоваться с телефона или с ноутбука, на котором ничего не установлено, запустите всё это на небольшом сервере, который работает всегда, и войдите в `max` там (`max setup --agent none`). Тогда с вашей стороны нужен только браузер. @@ -59,7 +61,7 @@ read -rs PASSWORD && export PASSWORD --external-url https://<устройство>.<сеть>.ts.net \ --no-auto-tls \ --listen 127.0.0.1:8080 \ - -- max mcp + -- max mcp --confirm-send ``` `--no-auto-tls` — потому что сертификат уже даёт Tailscale; `--listen 127.0.0.1:8080` — чтобы до diff --git a/docs/security.md b/docs/security.md index dcaa958b..514177d5 100644 --- a/docs/security.md +++ b/docs/security.md @@ -129,8 +129,8 @@ Windows. На Windows режимы `0600` и `0700` не задают ACL: до | Что | Как включить | Отказ | |---|---|---| -| профиль только для чтения | `max agent config set permissions.messages readonly` | код `5`, соединения нет | -| только названные действия: `send`, `reaction`, `delete`… | `max agent config set permissions.messages.send allow` | код `5`, соединения нет | +| запрет записи в сообщения, кроме более точных разрешений | `max agent config set permissions.messages readonly`; другие ресурсы ограничиваются отдельно | код `5`, соединения нет | +| разрешить отправку на фоне запрета остальных записей в сообщения | сначала `max agent config set permissions.messages readonly`, затем `max agent config set permissions.messages.send allow`; другие ресурсы и более точные правила сохраняются | код `5` для запрещённых действий, соединения нет | | список разрешённых получателей | `max <профиль> recipients add <чат>`; выключить — `recipients clear` | код `7` | | не больше N в час: сообщения, пересылки, правки, закрепления с уведомлением, удалённые сообщения, добавленные в группы люди; реакции не считаются | `sendsPerHour`, по умолчанию `30` | код `8`, в ошибке — когда можно снова | | журнал каждой попытки, без текста | всегда; смотреть — `max sends list` | — | diff --git a/docs/usage.md b/docs/usage.md index 193dffd9..26debd5e 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -480,8 +480,10 @@ max messages delete 0 100000000000000001 100000000000000002 --allow-dangerous # max messages delete 0 100000000000000001 --for-everyone --allow-dangerous # у всех в чате ``` -Удаление нельзя отменить, поэтому без `--allow-dangerous` команда отказывает и ничего не -спрашивает. По умолчанию сообщение пропадает только у вас; у собеседника оно остаётся. С +Удаление нельзя отменить, поэтому `messages.delete` по умолчанию имеет уровень `ask`: в терминале +нужно подтвердить действие, а в JSON-режиме — передать `--allow-dangerous`. Явный `allow` для +`permissions.messages.delete` разрешает удаление без этого вопроса; `readonly` и `deny` запрещают +его независимо от флага. По умолчанию сообщение пропадает только у вас; у собеседника оно остаётся. С `--for-everyone` оно пропадает у всех — это собеседник уже не вернёт. Удаление проходит те же проверки, что отправка. **Каждое удалённое сообщение считается в diff --git a/skills/max-cli/SKILL.md b/skills/max-cli/SKILL.md index f829c3b7..f27d5807 100644 --- a/skills/max-cli/SKILL.md +++ b/skills/max-cli/SKILL.md @@ -228,7 +228,9 @@ max messages transcribe -1000 100000000000000001 --json # текст голо `--timeout` для дедлайна команды. `--store-token ` недоступен для текущих методов MAX: все они отклоняют его до выполнения операции. Отправляйте от имени бота только то, о чём просил владелец. Для агента есть -MCP-сервер бота: `max <имя> bot mcp`, по умолчанию только чтение. `--trace` и записи запусков +MCP-сервер бота: `max <имя> bot mcp`; права задаются через `permissions.bot.*`, большинство записей +разрешено по умолчанию. `permissions.bot: readonly` ограничивает запись, если нет более точных +разрешений; `--confirm-send` требует форму для каждой записи. `--trace` и записи запусков (`max runs list`) работают и для бота. Markdown `--md` обрабатывается форматтером MAX, не Telegram: `**жирный**`/`__жирный__`,