{ "id": "ShariXKnowledgeOpenDevelopmentHumanAIHandoff", "page": "sharixopen:knowledge:development:human_ai_handoff", "area": "open", "type": "policy", "title": "Как подготовить изменение и инструкцию для оператора", "status": "review", "schema_version": 1, "relations": { "related_to": [ "ShariXKnowledgeMethodsStart", "ShariXKnowledgeVerification", "ShariXKnowledgeOpenOperationsDeploy" ], "applies_to": [ "ShariXKnowledgeOpenKnowledgeDevelopmentPractice" ] }, "extensions": { "taxonomy": { "domain": "standards", "lifecycle": "not_applicable", "parents": [ "ShariXKnowledgeMethodsStart" ], "terms": [ "audience_developer", "audience_operator", "audience_reviewer", "audience_ai", "product_sharix_open", "product_shared", "material_policy", "topic_development_delivery", "topic_development_verification" ], "component": "ShariX Open" }, "source_evidence": [ { "repository": "sharix-open-webapp-base", "commit": "f65376cdb5a3ac68a55d04f4c19493137e5a290b", "path": "CODING_POLICY.md", "sha256": "65136bd597db88bfd4935d18d7eef7c733495169ece42f9de6a53c8008f56e3f" }, { "repository": "sharix-open-webapp-base", "commit": "f65376cdb5a3ac68a55d04f4c19493137e5a290b", "path": "bin/repositories.sh", "sha256": "b763fdd351c71c6c6518253fba871efc7beb6f929badc54d863132fe7acea86e" }, { "repository": "sharix-open-webapp-base", "commit": "f65376cdb5a3ac68a55d04f4c19493137e5a290b", "path": "bin/install.sh", "sha256": "8ac242e26175677742c5c4fdb01780ba8a313e619dd35ea7a03ffc775ffa3b7c" }, { "repository": "sharix-open-webapp-base", "commit": "f65376cdb5a3ac68a55d04f4c19493137e5a290b", "path": "bin/utils/install_modes.sh", "sha256": "e791aa06abfe8ed7ad9264bfeed713f232651bb5ab378d1645cd9db7090eb5a2" }, { "repository": "sharix-open-webapp-base", "commit": "f65376cdb5a3ac68a55d04f4c19493137e5a290b", "path": "bin/check_acceptance.sh", "sha256": "1ae9ac7dbdff2f45b6645ea34d081965d72f4968325c448121f514cf15359610" }, { "repository": "sharix-open-webapp-base", "commit": "f65376cdb5a3ac68a55d04f4c19493137e5a290b", "path": "sharix_admin/views/order.py", "sha256": "fbcea84695251502a6f44e92966d59840db1c43f50a15e33a5adecc5deb420df" }, { "repository": "sharix-open-webapp-base", "commit": "f65376cdb5a3ac68a55d04f4c19493137e5a290b", "path": "core/urls.py", "sha256": "5997b9600b4ef8be878201d83923edc961e881cac2c0245c7486f64d4e35e7e1" }, { "repository": "sharix-open-backend", "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "models/orders.py", "sha256": "4a5dbbec8a62ed3ca933ae5494032ba2a8a4369c7c1ece4011c98755df23faf2" }, { "repository": "sharix-open-backend", "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/open_order_api.py", "sha256": "8950a4169a352db3d250c9e08f6de7a4fa2a31985a247541411e20bd224ca2b6" }, { "repository": "sharix-open-backend", "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/ticket_gen.py", "sha256": "7bdf92007916aec7e968a45f142e5f98fffb5dfe9b61ee7fcae3c65c826dfbde" }, { "repository": "sharix-open-backend", "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_actions.py", "sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0" }, { "repository": "sharix-open-backend", "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_permissions.py", "sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d" }, { "repository": "sharix-open-backend", "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/mobile_order_events.py", "sha256": "818b21d471b629dcae3d96ee089e0f83406a41d03ad36a6c4ddabdf8857f2e68" }, { "repository": "sharix-open-backend", "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/integration_ports.py", "sha256": "d079ec56e6709b29d7755e47d2a88d423235fe8eb1bf7a92851ae25d74bf1066" }, { "repository": "sharix-open-backend", "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/open_api.py", "sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3" }, { "repository": "sharix-open-backend", "commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "urls.py", "sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158" }, { "repository": "sharix-open-webservice-running", "commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "models/__init__.py", "sha256": "32072140482e8edc880432e2537f22d9d00537e318f972b709f221250ef931cf" }, { "repository": "sharix-open-webservice-running", "commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "models/local_examples.py", "sha256": "07ac086d9eb18e0a1d473ed316184d1d924858c966d1722654638034a8bdb36c" }, { "repository": "sharix-open-webservice-running", "commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "models/webservice_running.py", "sha256": "799e5bfe8e0313b60ed5fd515fa7d8381ea12fe6e42ad403b7a5b33e315781c6" }, { "repository": "sharix-open-webservice-running", "commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "apiviews/orders_local.py", "sha256": "b27440115f894f66920abded9d2e5bfb94b630bed16a1c201e422cbc689ee54f" }, { "repository": "sharix-open-webservice-running", "commit": "d5b966a88b2dc782ec3ca7660be17feef5193019", "path": "serializer/orders_local.py", "sha256": "7eeac936a02718e0be57328c36991b132fab92511e8a5d140dd50ac8042f37df" }, { "repository": "sharix-open-webapp-design-template", "commit": "8f96190d24c9031125cea5042492be49c4d1bf3a", "path": "README.md", "sha256": "2e2f2dc29e03dc33074c9bf674b0ffcc8c2c236d4000dc61127a3dfa4859202b" }, { "repository": "sharix-open-webapp-design-template", "commit": "8f96190d24c9031125cea5042492be49c4d1bf3a", "path": "docs/component-library.md", "sha256": "e477c21db25163637cbdbfd09f600a93528bef04121f9fb2c68fc6eb84d5259f" }, { "repository": "sharix-open-webapp-design-template", "commit": "8f96190d24c9031125cea5042492be49c4d1bf3a", "path": "component_library/catalog.json", "sha256": "9e34b73b6eaec1f572939879c59b0f6bebe0c95ea2d568104287dffff34c36cf" }, { "repository": "sharix-open-webapp-design-template", "commit": "8f96190d24c9031125cea5042492be49c4d1bf3a", "path": "forms.py", "sha256": "ef4984f9f288b1ebaef4b8c9e825b5384ef4b2e6480b3d54ae6beaef0570be8e" }, { "repository": "sharix-open-webapp-design-template", "commit": "8f96190d24c9031125cea5042492be49c4d1bf3a", "path": "templates/design_template/components/form_field.html", "sha256": "521f0c9ebbb4f091f45c99b8e1d8ff9841df8cb20434088ae756703937251631" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "models/ticket.py", "sha256": "4768d9ef47b61bf3ae98bf2749ed142adc477978b44de29177363ba9664baa43" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_blockly_codegen.py", "sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "tools/check_canonical_ticket_codegen.py", "sha256": "6df939d8d1fa9c2a54a124773d652b46a0e8545159d19da66879a4194a616757" } ], "reviewed_on": "2026-10-29", "editorial_review": { "date": "2026-10-31", "scope": "boundary_correction", "public_boundary": "Публичная Wiki: ShariX Open и передача shared-изменения ответственному Platform. Внутренние действия Platform — intrawiki." }, "editorial_source_check": { "date": "2026-10-30", "repository": "sharix-open-webapp-base", "commit": "c19e6651449483d898f5ae33548f97c0ef7e1cd2", "path": "bin/repositories.sh", "sha256": "b763fdd351c71c6c6518253fba871efc7beb6f929badc54d863132fe7acea86e", "finding": "update-* допускаются только при ASSEMBLY_KIND=open" }, "license_boundary_review": { "date": "2026-10-31", "scope": "shared не является лицензией; публичная документация не раскрывает реализацию закрытых модулей", "closed_modules_license_code": "sharix-proprietary-v1" }, "list_format_review": { "date": "2026-10-31", "scope": "Перечисления полей, результатов и проверок оформлены списками; исходники, команды, таблицы, схемы и лицензионные границы сохранены." }, "classification": { "schema": "sharix.knowledge.classification.v1", "products": [ "sharix_open", "shared" ], "audiences": [ "developer", "operator", "reviewer", "ai" ], "material": "policy", "topics": [ "development/delivery", "development/verification" ], "tag_terms": [ "audience_developer", "audience_operator", "audience_reviewer", "audience_ai", "product_sharix_open", "product_shared", "material_policy", "topic_development_delivery", "topic_development_verification" ], "registry_document": "ShariXKnowledgeClassification", "state_meaning": "lifecycle относится к описываемому коду, а status к редакции документа; implemented не означает успешный runtime тест" }, "classification_review": { "date": "2026-10-31", "source": "Содержание текущей страницы и проверенный словарь классификации", "body_scope": "classification_and_navigation_only" }, "owner_clarification": { "date": "2026-11-01", "basis": "explicit owner instruction", "scope": "disabled optional modules and immediate subject-documentation updates", "runtime_claim": false } }, "content_sha256": "62ca90aaf5770d9b02fdf475582b0170744d91fda469864fee1996c74badabee", "schema": 1 } ====== Как подготовить изменение и инструкцию для оператора ====== ~~NOCACHE~~ **Назначение:** [[sharixopen:knowledge:classification:materials#politika_i_pravila|Политика и правила]]. **Продукт:** [[sharixopen:knowledge:classification:products#sharix_open|ShariX Open]] · [[sharixopen:knowledge:classification:products#obschij_komponent|Общий компонент]]. **Для кого:** [[sharixopen:knowledge:classification:audiences#razrabotchik|Разработчик]] · [[sharixopen:knowledge:classification:audiences#operator_razvjortyvanija|Оператор развёртывания]] · [[sharixopen:knowledge:classification:audiences#recenzent_i_prijomschik|Рецензент и приёмщик]] · [[sharixopen:knowledge:classification:audiences#nejroset|Нейросеть]]. **Темы:** [[sharixopen:knowledge:classification:topics#peredacha_izmenenij|Разработка → Передача изменений]] · [[sharixopen:knowledge:classification:topics#proverka|Разработка → Проверка]]. Человек, получающий исправление, должен понимать, какой файл взять, к какой версии он подходит, где выполнить команды и как определить результат. Подготовка патча заканчивается цельной поставкой: * сам патч; * полный сценарий применения; * сведения о выполненных проверках. Эта страница задаёт порядок передачи. Конкретная поставка должна содержать команды для своей базы и фактических каталогов. Установка приложения описана в [[sharixopen:knowledge:operations:deploy|отдельной процедуре]]. ===== Что выяснить перед подготовкой ===== * Какая часть ShariX Open меняется: корневое приложение, отдельный модуль или общий (shared) компонент. * Какие репозитории содержат изменение, их ветки и исходные commits. * Какие предыдущие патчи уже применены и опубликованы. Не готовить повторное применение того же изменения. * Какая установка будет обновляться, где она находится, какие данные и модули затрагиваются. * Какие права нужны человеку для применения и какие действия выполнит администратор. Старую карточку и расшифровку сверяют с текущим кодом. Если нужного checkout нет, проверка похожего продукта не заменяет его. Сначала читают актуальные README, CODING_POLICY, AGENTS и инструкции Wiki относящихся к работе репозиториев. ===== Что можно включать в публичную поставку ===== Проверить LICENSE каждого репозитория и отметить отдельно: * открыт ли код; * является ли модуль общим; * где он используется. Эти признаки не заменяют друг друга. Конструктор сервиса и другие отдельно лицензируемые закрытые компоненты не являются открытым ядром только потому, что установлены рядом с ним. В публичную Wiki, открытый патч, архив исходников, граф и иллюстрацию не включают закрытый код или непубличные детали. Внутренняя поставка закрытого компонента требует разрешённого доступа и выполняется по его собственным инструкциям в intrawiki. Публичный сценарий заканчивается обозначением границы и передачей вопроса ответственным Platform. Проверять нужно фактическое содержимое файлов, а не только названия и .gitignore. Ссылка на закрытый элемент в общем UI-каталоге также не делает его реализацию публичной. Перечень — [[sharixopen:knowledge:architecture:model_ownership|закрытые компоненты и их границы]]. ===== Какие файлы передать ===== Патч ShariX Open содержит пути относительно корня установки и перечисляет затронутые репозитории. В публичную поставку включается только разрешённый к открытому распространению общий код, который публикуется в своём репозитории. Для закрытого общего модуля действует отдельный внутренний порядок. После публикации shared-изменения нужно оповестить ответственного Platform для проверки, тестирования и принятия по intrawiki. Инструкция ShariX Open не включает команды, пути и собственные патчи другого продукта. Независимый компонент, например Moodle-плагин, получает отдельную поставку при соответствующем задании. В архив вместе с патчем включают полный сценарий применения. На сценарий дают отдельную ссылку. В нём должны быть следующие сведения: ^ Раздел сценария ^ Что указать ^ | База и состав | Исходные commits каждого репозитория, список файлов, зависимость от предыдущих этапов и совместимость с ними. | | Подготовка | Нужные доступы, резервные копии, состояние репозиториев и способ переноса файлов. | | Проверка до изменения | Точные каталоги и команды проверки применимости патча к этой базе, включая затронутые вложенные репозитории. | | Применение | Команды записи, необходимые миграции, переводы, статика и синхронизация конфигурации именно для этого изменения. | | Публикация и передача | Какие репозитории и commits публикуются; какие сведения после публикации передать ответственному Platform, если изменён shared-модуль. | | Запуск и приёмка | Кто выполняет действия, какая служба затрагивается, ожидаемый результат и способ его проверки. | | Остановка и восстановление | При каких ошибках прекратить выполнение, что сохранить и как вернуться к согласованному состоянию. | Распаковка исходников поверх работающего checkout и новый самодельный установщик не заменяют штатный порядок. Оператор переносит патчи в ''/tmp'', поэтому в его командах указывают ''/tmp/ИМЯ.patch''. Автор отдельно сообщает, что файлы подготовлены локально, а перенос на сервер выполняет оператор. Изображения после серверного обновления загружает агент через согласованный API; оператору не поручают установку иллюстраций или запуск клиентского CLI для неё. ===== Как сделать инструкцию связной ===== В начале назвать фактический каталог и пользователя. Для ShariX Open подтверждён ''/opt/sharix-open-webapp-base''; другой путь нужно выяснить у владельца этой установки. Имена SSH-хостов, служб, веток и БД берут из действующей конфигурации. Если значение неизвестно, указать, где его получить, а не придумывать пример как готовую команду. Каждый следующий шаг использует результат предыдущего. Если нужно ввести параметр, объяснить его назначение и последующее использование. Все упомянутые файлы должны входить в поставку или иметь точный способ получения. Рядом с действием указывается, под кем его выполнить: deploy и root выполняют разные части процедуры. В конце выделить три группы: * **Выполнено автором.** * **Выполняет оператор.** * **Не проверено.** Указать наблюдаемое изменение для пользователя и ожидаемые сообщения оператора. Наличие diff или успешного импорта Python не заменяет эти сведения. ===== Порядок применения подготовленного патча ===== - Сохранить необходимые резервные копии и согласовать окно работы, если меняются схема или данные. Проверить затронутые репозитории и отсутствие незавершённых Git-операций. - Оператор размещает файлы в ''/tmp'' и под назначенным deploy login переходит в фактический каталог установки. - Выполняет проверки применимости из сценария. Для патча нескольких репозиториев одной проверки корневого Git недостаточно. При несовпадении фрагмента или появлении ''.rej'' останавливается и передаёт состояние автору поставки. - Применяет изменение, проверяет результат и публикует согласованный набор репозиториев штатным ''repositories.sh''. Если в ShariX Open используются отдельные ветки развёртывания — следует порядку ''update-start → update-publish → update-finish''. Подробнее: [[sharixopen:knowledge:development:repository_flow|передача общего кода]]. - После публикации shared-изменения автор оповещает ответственного Platform и передаёт commits, результаты проверок и условия совместимости. Ответственный выполняет проверку, тестирование и принятие в общий код по intrawiki; эти действия не продолжают публичный сценарий ShariX Open. Для уже подготовленных исходников обычные фазы под deploy login выглядят так: ./bin/install.sh deploy --strict --use-current-checkouts --permissions=check --deps=auto --no-restart && ./bin/install.sh restart && ./venv/bin/python manage.py check && ./bin/check_acceptance.sh --with-runtime-audit Блок выполняется из фактического корня установки. Назначение команд и параметров: * ''deploy'' — готовит зависимости, конфигурацию, схему и данные согласно установщику. * ''--use-current-checkouts'' — Git не обновляется этим запуском. * ''--no-restart'' — перезапуск откладывается до следующей команды. * ''&&'' — последовательность прекращается при ошибке. Успех подготовки ещё не означает, что приложение запущено. Точный сценарий указывает нужные миграции, переводы и статику и учитывает, что уже делает deploy. Новые файлы миграций не генерируют автоматически на рабочем сервере вместо подготовленной разработки. ===== Если запуск или проверка не удались ===== При сообщениях ''Restart permissions are not installed'' или ''Runtime state needs its managed isolated directory'' сверяют текущую процедуру: нужный штатный root ''activate --strict --use-current-checkouts --permissions=check'' подготавливает каталоги и разрешения. Затем выполняется новый deploy login и повтор только restart. Полная установка, рекурсивное исправление прав, ручной chmod или создание симлинков не подставляются вместо выяснения этой причины. HTTP-диагностика после restart рекомендательная. Таймаут, сетевой отказ или HTTP-код сохраняются как WARNING и исследуются отдельно от результата перезапуска. Ошибки состояния службы, прав и проверки исходников блокируют продолжение. Имя systemd unit берут из конфигурации этой установки, а не из hostname. При ошибке патча, конфликте исходников или незавершённой миграции не переходят к следующей фазе. Сначала фиксируют выполненные шаги и состояние. Обратное применение патча проверяют заново; восстановление БД может потребовать резервной копии и отдельного плана. ''reset --hard'', удаление файлов и повтор записи с неизвестным результатом не являются универсальным восстановлением. ===== Для нейросети: что проверить в собственном результате ===== - Проследить изменение от маршрута и формы/API до функции, модели, событий и вызывающих модулей. Найти существующую реализацию и библиотечный UI-элемент перед созданием новых. - Сохранять ответственность за данные у их модуля. Для обработчиков изменять Blockly-модель, генерировать Python и проверять соответствие. В сценариях учитывать пользователя, API, таймеры и события; BPMN описывает их, а не исполняется просмотрщиком Wiki. - Прочитать свою инструкцию как получатель: все ли файлы доступны, связаны ли шаги, совпадают ли пути, названы ли пользователи и условия остановки. - Дать реальные ссылки на подготовленные файлы. Не заявлять серверную проверку по локальному результату или по другому продукту, не скрывать предупреждения и не включать дополнительные действия без поручения. ===== Как обновить документацию ===== Уточнить README нужного модуля, его описание в Wiki и контекстную справку изменённой страницы по роли пользователя. Учебные объяснения и примеры кода относятся к Moodle. Перед публикацией перечитать текущую страницу, сохранить правки других авторов, выполнить preview и сравнить сохранённый текст повторным чтением. Обновления Wiki обычно сопровождаются одним обзором этапа со ссылками. Если владелец просит выполнить редактуру без уведомлений, это указание применяется к этому проходу. Общие правила подтверждения результата — [[sharixopen:knowledge:development:verification|приёмка изменений]]. ===== Проверенная исходная база: 29.10.2026 ===== Проверены опубликованные исходники указанных ревизий. Это source-анализ; он не подтверждает применённую версию, конфигурацию или успешный сценарий конкретного сервера. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-webapp-base/src/commit/f65376cdb5a3ac68a55d04f4c19493137e5a290b/CODING_POLICY.md|sharix-open-webapp-base: CODING_POLICY.md]] — f65376cdb5a3. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-webapp-base/src/commit/f65376cdb5a3ac68a55d04f4c19493137e5a290b/bin/repositories.sh|sharix-open-webapp-base: bin/repositories.sh]] — f65376cdb5a3. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-webapp-base/src/commit/f65376cdb5a3ac68a55d04f4c19493137e5a290b/bin/install.sh|sharix-open-webapp-base: bin/install.sh]] — f65376cdb5a3. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-webapp-base/src/commit/f65376cdb5a3ac68a55d04f4c19493137e5a290b/bin/utils/install_modes.sh|sharix-open-webapp-base: bin/utils/install_modes.sh]] — f65376cdb5a3. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-webapp-base/src/commit/f65376cdb5a3ac68a55d04f4c19493137e5a290b/bin/check_acceptance.sh|sharix-open-webapp-base: bin/check_acceptance.sh]] — f65376cdb5a3. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/ticket_blockly_codegen.py|sharix-open-handlers-backend: ticket_blockly_codegen.py]] — 50baf376e224. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/tools/check_canonical_ticket_codegen.py|sharix-open-handlers-backend: tools/check_canonical_ticket_codegen.py]] — 50baf376e224. ===== Уточнение команд: 30.10.2026 ===== В [[https://git.sharix-app.org/ShariX_Open/sharix-open-webapp-base/src/commit/c19e6651449483d898f5ae33548f97c0ef7e1cd2/bin/repositories.sh|bin/repositories.sh]] функция require_open_update_mode разрешает update-* только ShariX Open. Эти команды относятся к процедуре ShariX Open. ===== Уточнения владельца сразу фиксируются в документации ===== По поручению владельца от 01.11.2026 новое согласованное требование, меняющее продуктовый контракт, права, границы модулей, workflow или применимость проверок, сразу заносится в соответствующую предметную Wiki в рамках того же задания. Правило не должно оставаться только в переписке до следующего прохода. В том же изменении устранить противоречия затронутых AGENTS.md, CODING_POLICY и README. Более позднее явное уточнение владельца имеет приоритет перед устаревшим локальным текстом. Учебные объяснения остаются в Moodle; предметные правила использования и разработки — в Wiki. Отдельно обозначать согласованный контракт, подготовленное изменение исходников и проверенный результат установки. Перед записью перечитать текущую страницу и сохранить чужие изменения; после preview/publish выполнить GET/hash-сверку и предусмотренное уведомление со списком страниц и ссылками. Запись правила в Wiki не является разрешением на deploy и не подтверждает серверную приёмку. ~~SHARIX_KNOWLEDGE_RELATED~~