From bdc7e5ecc9e0345bcc5a4364802a00c7019d9263 Mon Sep 17 00:00:00 2001 From: "Claude (rpi)" Date: Tue, 13 Oct 2026 18:47:03 +0300 Subject: [PATCH] =?UTF-8?q?rpi:=20=D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=BD=D0=B5=20=D0=BF=D0=BE=20=D0=B2=D0=BE=D0=B7?= =?UTF-8?q?=D1=80=D0=B0=D1=81=D1=82=D1=83=20=E2=80=94=20=D1=81=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=BB=D0=B0=D0=B4=D0=B5=D0=BB=D1=8C=D1=86=D0=B0,=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=87=D0=B0=D1=82=D1=8C=20=D0=9F=D0=BE=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=8B=D1=87=D0=BD=D0=B0=D1=8F=20=E2=80=94=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=20(astra-bot=20d9?= =?UTF-8?q?16407),=20=D0=BD=D0=B5=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- servers/rpi.md | 5 ++++- stacks/rpi-print/README.md | 10 ++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/servers/rpi.md b/servers/rpi.md index 795a689..b2d6202 100644 --- a/servers/rpi.md +++ b/servers/rpi.md @@ -76,7 +76,8 @@ OneDrive на внешний HDD; с того же дня ещё и медиац - Код настройки и команда — `stacks/rpi-print/`; `home-print` установлен в `/usr/local/bin/` (root, 755). `home-print status` — состояние/очередь; `home-print [--duplex] ` — одна копия, A4 с подгонкой. Печать только по прямой просьбе пользователя; приём задания в очередь не означает, что бумага уже вышла. - **Навык `home-print` упрощён для ребёнка 2026-10-11**; источник — [astra-bot `11d0a85`](https://git.ruzzy.dev/ruzzy/astra-bot/commit/11d0a85), `codex/skills/home-print/`, установлен в `~astra/.codex/skills/home-print/`. Вместо PNG каждой страницы и повторного подтверждения отправляет **один PDF**, затем по прямой просьбе «распечатай» печатает одну копию A4 с одной стороны без дополнительных вопросов. Текст извлекается из скриншотов, картинки сохраняются в оттенках серого, все страницы проверяются локально. Если PDF не доставлен, печать не запускается; повторная отправка задания при ошибке не автоматическая. Для этого сценария установлены узкие постоянные разрешения `~astra/.codex/rules/home-print.rules` (источник `codex/rules/` в astra-bot): только `/usr/local/bin/home-print` и PDF-режим штатного отправщика. Общая политика подтверждений сохранена. Проверка: 31 тест, валидация скилла и правил; произвольный Python правилами не разрешается. Инструкции установлены в `~/.codex/AGENTS.md`; новые разговоры получают их автоматически. - **Кнопки и промежуточные ответы печати убраны в самом боте 2026-10-11**, [astra-bot `6b1317d`](https://git.ruzzy.dev/ruzzy/astra-bot/commit/6b1317d). Ранее постоянных правил скилла было недостаточно: запросы approval и все agentMessage уходили в Telegram. Бот теперь автоматически отвечает accept только на штатную PDF-отправку разрешённому чату и home-print для print.pdf в каталогах /tmp/astra-print-*; shell-операторы и произвольные команды исключены. В задачах печати сохраняет последний ответ и отправляет его после завершения, PDF доставляется отдельным вложением. Проверено 34 тестами, установлен bot.py; прежний код — /opt/astra-bot/bot.py.bak-20261011-child-print. Перезапуск через restart-check.py после завершения текущего ответа. -- **Печать для Поли — только после кнопки владельца (решение владельца 2026-10-13; код готов, ⚠️ ещё НЕ установлен)**, [astra-bot `83aed7a`](https://git.ruzzy.dev/ruzzy/astra-bot/commit/83aed7a). Причина: владелец хочет видеть и подтверждать всё, что печатает ребёнок; прежний сценарий «Поля пишет “Печатай”» отменяется. Поля просит распечатать → агент собирает PDF и сразу (без её «Печатай») вызывает `/usr/local/bin/home-print-request CHAT /tmp/astra-print-/…/print.pdf` → бот забирает копию в `~astra/.local/share/astra-bot/print-requests//` (каталог 700, PDF 600, sha256, число страниц) и шлёт владельцу (`607015`) этот PDF с кнопками «Подтвердить» / «Отменить» → после «Подтвердить» бот сам запускает `home-print` на сохранённой копии. Поле — только простые сообщения («отправила папе», «папа разрешил» / «пока не разрешил»). Почему одной правки бота было мало: `home-print` был разрешён правилом `allow` в `~astra/.codex/rules/home-print.rules` и выполнялся мимо бота для всех чатов; теперь правило `prompt` — прямая печать приходит боту, взрослым (владелец, Оля) он одобряет её сам без кнопки (взрослый сценарий PDF → «Печатай» сохранён), в детском чате отклоняет `home-print`/`lp`/`lpr`. В песочнице Codex CUPS недоступен (проверено `codex sandbox`: `lpstat` → scheduler is not running, `sudo` не работает), поэтому мимо бота печать не проходит. Защиты: кнопку принимает только владелец в своём личном чате и только от сообщения с этим PDF; заявка выходит из `pending` один раз, статус `printing` пишется на диск до запуска принтера — повторное нажатие, сбой `lp` и перезапуск бота второй копии не дают (после сбоя нужен новый запрос); изменённая копия PDF не печатается; путь только `/tmp/astra-print-*/…/print.pdf` без ссылок, ≤ 20 МБ, 1–50 стр.; не больше 5 ожидающих запросов, срок 24 ч, закрытые заявки хранятся 7 дней. Заодно: запросы подтверждения команд из чата Поли теперь уходят владельцу («👧 Запрос из чата Поли»), а не ей — раньше она могла нажать «Разрешить» под любой командой, включая `sudo`. Проверено 90 тестами (не-владелец, повтор, отмена, подмена PDF, сбой принтера, взрослый сценарий), правила — `codex execpolicy check`; реальной печати и сообщений в Telegram не было. Установка (делает Astra): `bot.py` и новый `print_requests.py` → `/opt/astra-bot/`, `home-print-request` → `/usr/local/bin/` (root, 755), `home-print.rules`, `skills/home-print/SKILL.md`, `AGENTS.md` → `~astra/.codex/`, перезапуск `astra-bot` (правила читаются при старте `codex app-server`). ⚠️ Ограничения: подтверждает только владелец (Оля — нет); «напечатано» = принято в очередь CUPS, бумагу бот не видит; пока владелец не ответил на системный запрос из чата Поли, её задача ждёт; защита рассчитана на послушного агента и просьбы ребёнка, а не на агента, намеренно ищущего выход из песочницы (у `astra` sudo NOPASSWD, `base.rules` выполняют `git` вне песочницы). +- **Печать для Поли — только после кнопки владельца (решение владельца 2026-10-13; установлено Astra 2026-10-13; ⚠️ ОТМЕНЕНО уточнением владельца в тот же день — см. следующий пункт; действует на хосте, пока не установлен astra-bot `d916407`)**, [astra-bot `83aed7a`](https://git.ruzzy.dev/ruzzy/astra-bot/commit/83aed7a). Причина: владелец хочет видеть и подтверждать всё, что печатает ребёнок; прежний сценарий «Поля пишет “Печатай”» отменяется. Поля просит распечатать → агент собирает PDF и сразу (без её «Печатай») вызывает `/usr/local/bin/home-print-request CHAT /tmp/astra-print-/…/print.pdf` → бот забирает копию в `~astra/.local/share/astra-bot/print-requests//` (каталог 700, PDF 600, sha256, число страниц) и шлёт владельцу (`607015`) этот PDF с кнопками «Подтвердить» / «Отменить» → после «Подтвердить» бот сам запускает `home-print` на сохранённой копии. Поле — только простые сообщения («отправила папе», «папа разрешил» / «пока не разрешил»). Почему одной правки бота было мало: `home-print` был разрешён правилом `allow` в `~astra/.codex/rules/home-print.rules` и выполнялся мимо бота для всех чатов; теперь правило `prompt` — прямая печать приходит боту, взрослым (владелец, Оля) он одобряет её сам без кнопки (взрослый сценарий PDF → «Печатай» сохранён), в детском чате отклоняет `home-print`/`lp`/`lpr`. В песочнице Codex CUPS недоступен (проверено `codex sandbox`: `lpstat` → scheduler is not running, `sudo` не работает), поэтому мимо бота печать не проходит. Защиты: кнопку принимает только владелец в своём личном чате и только от сообщения с этим PDF; заявка выходит из `pending` один раз, статус `printing` пишется на диск до запуска принтера — повторное нажатие, сбой `lp` и перезапуск бота второй копии не дают (после сбоя нужен новый запрос); изменённая копия PDF не печатается; путь только `/tmp/astra-print-*/…/print.pdf` без ссылок, ≤ 20 МБ, 1–50 стр.; не больше 5 ожидающих запросов, срок 24 ч, закрытые заявки хранятся 7 дней. Заодно: запросы подтверждения команд из чата Поли теперь уходят владельцу («👧 Запрос из чата Поли»), а не ей — раньше она могла нажать «Разрешить» под любой командой, включая `sudo`. Проверено 90 тестами (не-владелец, повтор, отмена, подмена PDF, сбой принтера, взрослый сценарий), правила — `codex execpolicy check`; реальной печати и сообщений в Telegram не было. Установка (делает Astra): `bot.py` и новый `print_requests.py` → `/opt/astra-bot/`, `home-print-request` → `/usr/local/bin/` (root, 755), `home-print.rules`, `skills/home-print/SKILL.md`, `AGENTS.md` → `~astra/.codex/`, перезапуск `astra-bot` (правила читаются при старте `codex app-server`). ⚠️ Ограничения: подтверждает только владелец (Оля — нет); «напечатано» = принято в очередь CUPS, бумагу бот не видит; пока владелец не ответил на системный запрос из чата Поли, её задача ждёт; защита рассчитана на послушного агента и просьбы ребёнка, а не на агента, намеренно ищущего выход из песочницы (у `astra` sudo NOPASSWD, `base.rules` выполняют `git` вне песочницы). +- **Материал не по возрасту — с разрешения владельца; печать Поли снова обычная (уточнение владельца 2026-10-13; код готов, ⚠️ ещё НЕ установлен)**, [astra-bot `d916407`](https://git.ruzzy.dev/ruzzy/astra-bot/commit/d916407). Заменяет предыдущий пункт: владелец хотел подтверждать не всю печать ребёнка, а работу с конкретным материалом, который агент счёл неподходящим по возрасту (пример: Поля просит полностью «Дары Терека», ей отвечали «распечатай у папы» — неверно). Сценарий: агент **до подготовки полного текста** вызывает `/usr/local/bin/material-approval-request --title … --reason … --request … CHAT` → бот (спул `~astra/.local/share/astra-bot/material-approvals/`, каталог 700, записи 600) шлёт владельцу (`607015`) название, причину, просьбу Поли и кнопки «Подтвердить» / «Отменить»; Поле агент говорит «Я спрошу папу». После «Подтвердить» бот сам начинает ход в постоянном разговоре Поли — доверенное сообщение `[astra-bot: решение владельца]` с названием и исходной просьбой — и задача продолжается как обычно: полный PDF Поле → «Печатай» / «Печатай на двух сторонах» → `home-print`, без владельца. После «Отменить» бот пишет Поле, что папа пока не разрешил. Обычная печать Поли идёт сразу обычным сценарием: правило `home-print.rules` осталось `prompt`, бот одобряет в её чате сам только `/usr/local/bin/home-print [--duplex] /tmp/astra-print-*/…/print.pdf` (взрослым — как раньше), прочие команды из её чата по-прежнему уходят кнопкой владельцу. Защиты: запрос только из детского чата; название 2–120, причина 5–300, просьба 3–600 символов без управляющих; кнопку принимает только владелец в своём личном чате от сообщения с этим запросом (одноразовый код); заявка выходит из `pending` один раз; кнопки «до конца разговора» нет — разрешение на один материал и одну просьбу, команд не одобряет; метку доверенного сообщения бот вырезает из сообщений Поли, агент сверяет разрешение командой `material-approval-request status ID`; тот же материал в ожидании повторно владельцу не уходит, после отказа — сутки отклоняется; не больше 5 в ожидании, срок ответа 24 ч; `approved` переживает перезапуск бота. Разрешение владельца не открывает запрещённое законом/правилами (прежде всего сексуальный контент с несовершеннолетними) и взрослые развлекательные материалы — это записано в AGENTS, скилле и тексте доверенного сообщения. `home-print-request` оставлен необязательным режимом «покажи владельцу PDF перед печатью». Проверено 125 тестами (не-владелец, повтор, отмена, подделка кнопки и метки, возобновление после «Подтвердить», в т.ч. после перезапуска и при идущей задаче, обычная детская печать без владельца), правила — `codex execpolicy check`; установки, перезапуска, печати и сообщений в Telegram не было. Установка (делает Astra): `bot.py`, `print_requests.py`, новый `material_approvals.py` → `/opt/astra-bot/` (root, 644); `codex/skills/home-print/scripts/material-approval-request` → `/usr/local/bin/` (root, 755); `home-print.rules`, `skills/home-print/SKILL.md`, `AGENTS.md` → `~astra/.codex/` (astra); перезапуск `astra-bot` (правила читаются при старте `codex app-server`); каталог `material-approvals/` бот создаёт сам. ⚠️ Ограничения: возрастная оценка — суждение агента, не фильтр (что-то пропустит, о чём-то спросит зря); подтверждает только владелец (Оля — нет); пока он не ответил, Поля ждёт, через сутки запрос устаревает без сообщения ей; «тот же материал» сравнивается по названию; при сбое точно между запуском хода и записью `resumed` разрешение может прийти агенту дважды (печать от этого не запускается); постоянный разговор Поли помнит прежнее правило — новые инструкции приходят с каждым её сообщением, но старая привычка может проявиться; защита рассчитана на послушного агента, а не на агента, ищущего выход из песочницы. - ⚠️ DOCX напрямую не печатается — сначала преобразовать в PDF. Hostname выбран вместо DHCP-IP, чтобы пережить смену адреса; требуется mDNS и включённый принтер. `printer-error-policy=abort-job` исключает неожиданную автоматическую печать старых заданий после ошибки; ошибочный прогон нужно отправить заново. - Проверено: запрос атрибутов IPP (`ipptool`) PASS, принтер idle/enabled, A4/Gray/duplex доступны. Портрет успешно преобразован фильтрами CUPS PNG → PDF → PWG Raster (A4, 300 dpi), без ошибок. Тестовая страница A4 отправлена 2026-10-11 в 15:20 MSK: `home-brother-1`, CUPS сообщил `job-completed-successfully`, принтер вернулся в idle, очередь пуста; качество на бумаге проверяет пользователь. @@ -278,3 +279,5 @@ Docker CE 29.9 + Compose v5.6 из репо download.docker.com (в Debian ст - 2026-10-13 в постоянный профиль Поли по просьбе владельца добавлена вторая песня для изучения, предыдущая сохранена. astra-bot `33fb800`, codex/AGENTS.md установлен в ~/.codex/AGENTS.md. Срок не задан; общие песни не включаются в ответы с домашкой ЭлЖура. Существующая сессия может не подхватить новые инструкции сразу. - 2026-10-13 Astra установила astra-bot `83aed7a`: bot.py и print_requests.py в /opt/astra-bot, home-print-request в /usr/local/bin, правило prompt, скилл и AGENTS в ~/.codex. 90 тестов повторно прошли; installed-файлы сверены cmp. Старый бот сохранён .bak-20261013-print-request. Перезапуск и проверка готовности отложены на 60 секунд через astra-print-restart-check (с адаптированным текстом уведомления); реальный сценарий детского запроса и кнопок пока не проверялся, печать не запускалась. + +- 2026-10-13 Claude (rpi) по уточнению владельца подготовил astra-bot `d916407` (⚠️ pending install, ставит Astra): вместо подтверждения всей детской печати — запрос владельцу на конкретный материал не по возрасту (`material-approval-request`, `material_approvals.py`), обычная печать Поли восстановлена. На хосте пока действует `83aed7a` (вся печать Поли через кнопку владельца). Подробности и план установки — «Домашняя печать». Ничего не устанавливалось и не перезапускалось. diff --git a/stacks/rpi-print/README.md b/stacks/rpi-print/README.md index 72bf527..bf7b4d6 100644 --- a/stacks/rpi-print/README.md +++ b/stacks/rpi-print/README.md @@ -22,7 +22,9 @@ Word DOCX перед печатью нужно преобразовать в PDF Отправлять на бумагу только по прямой просьбе пользователя. Сообщение о принятии задания означает приём в очередь; итог следует проверить через `lpstat`. -Печать по просьбе ребёнка (2026-10-13): только после кнопки владельца в Telegram — команда -`home-print-request` и логика заявок живут в `ruzzy/astra-bot` (`print_requests.py`, -`codex/skills/home-print/`), бот запускает этот же `home-print` на сохранённой копии PDF. -Подробности и ограничения — `servers/rpi.md`, «Домашняя печать». +Печать по просьбе ребёнка (уточнение владельца 2026-10-13): обычная — PDF в её чат, печать по её +«Печатай», этот же `home-print`. Владелец кнопкой в Telegram разрешает не печать, а работу с конкретным +материалом не по возрасту (`material-approval-request`, до подготовки текста). Код — `ruzzy/astra-bot` +(`material_approvals.py`, `codex/skills/home-print/`); `home-print-request` (PDF владельцу перед печатью, +`print_requests.py`) остался необязательным режимом. ⚠️ astra-bot `d916407` ещё не установлен: на хосте +действует прежнее «вся печать Поли — после кнопки владельца». Подробности — `servers/rpi.md`, «Домашняя печать».