| |
| sharixopen:knowledge:scenarios:repository_update_watch [2026/10/28 22:00] – [sharixknowledge] approved package sx_knowledge_api_open | sharixopen:knowledge:scenarios:repository_update_watch [2026/10/31 12:14] (текущий) – [sharixknowledge] approved package sx_knowledge_api_open |
|---|
| "ShariXKnowledgeOpenKnowledgeModulesHandlers", | "ShariXKnowledgeOpenKnowledgeModulesHandlers", |
| "ShariXKnowledgeScenarios" | "ShariXKnowledgeScenarios" |
| | ], |
| | "depends_on": [ |
| | "ShariXKnowledgeOpenKnowledgeModulesHandlers", |
| | "ShariXKnowledgeOpenKnowledgeModulesSysadmin" |
| | ], |
| | "verified_by": [ |
| | "ShariXKnowledgeVerification" |
| ] | ] |
| }, | }, |
| "extensions": { | "extensions": { |
| "taxonomy": { | "taxonomy": { |
| "domain": "business_processes", | "domain": "operations", |
| "lifecycle": "implemented", | "lifecycle": "implemented", |
| "component": "handlers", | "component": "sharix_sysadmin, handlers_backend, dbsynce", |
| "parents": [ | "parents": [ |
| "ShariXKnowledgeScenarios" | "ShariXKnowledgeScenarios" |
| ], | ], |
| "terms": [ | "terms": [ |
| "Sysadmin", | "audience_operator", |
| "repository updates", | "audience_administrator", |
| "optional handler", | "audience_developer", |
| "BPMN" | "audience_reviewer", |
| | "audience_ai", |
| | "product_sharix_open", |
| | "product_shared", |
| | "material_scenario", |
| | "topic_development_git", |
| | "topic_operations_diagnostics", |
| | "topic_handlers_blockly", |
| | "sysadmin", |
| | "repository_updates", |
| | "optional_handler", |
| | "source_snapshot", |
| | "source_evidence", |
| | "bpmn", |
| | "blockly", |
| | "generated_python" |
| ] | ] |
| }, | }, |
| { | { |
| "repository": "sharix-open-sysadmin", | "repository": "sharix-open-sysadmin", |
| "commit": "60e386e892793ffe37b8f0d842330c6e5635068e", | "commit": "a7e8b841f9a5a790df5d3adfcb265a7011bbabcb", |
| "path": "handler_contributions.py", | "path": "handler_contributions.py", |
| "sha256": "96182d34efae36a2abf6b0ea81f61690f4d16d422a8e387a28ebf221eb520d82" | "sha256": "96182d34efae36a2abf6b0ea81f61690f4d16d422a8e387a28ebf221eb520d82" |
| { | { |
| "repository": "sharix-open-sysadmin", | "repository": "sharix-open-sysadmin", |
| "commit": "60e386e892793ffe37b8f0d842330c6e5635068e", | "commit": "a7e8b841f9a5a790df5d3adfcb265a7011bbabcb", |
| "path": "handlers/repository_update_watch.py", | "path": "handlers/repository_update_watch.py", |
| "sha256": "4dae269db5f8a96b1d74aece1faae3a68a0378569c48a47535c012a4bf4de6d3" | "sha256": "4dae269db5f8a96b1d74aece1faae3a68a0378569c48a47535c012a4bf4de6d3" |
| { | { |
| "repository": "sharix-open-sysadmin", | "repository": "sharix-open-sysadmin", |
| "commit": "60e386e892793ffe37b8f0d842330c6e5635068e", | "commit": "a7e8b841f9a5a790df5d3adfcb265a7011bbabcb", |
| "path": "handlers/blockly/repository_update_watch.json", | "path": "handlers/blockly/repository_update_watch.json", |
| "sha256": "adaf5e5633e81617b525906621c226680744698187a3c4e31cae56f4fe5b71db" | "sha256": "adaf5e5633e81617b525906621c226680744698187a3c4e31cae56f4fe5b71db" |
| { | { |
| "repository": "sharix-open-sysadmin", | "repository": "sharix-open-sysadmin", |
| "commit": "60e386e892793ffe37b8f0d842330c6e5635068e", | "commit": "a7e8b841f9a5a790df5d3adfcb265a7011bbabcb", |
| "path": "services/repository_update_handler.py", | "path": "services/repository_update_handler.py", |
| "sha256": "2e9ba086f017a1f4ba3c11b59ef0362d3a2039fb177cd54767f4b506eb2ae6b2" | "sha256": "2e9ba086f017a1f4ba3c11b59ef0362d3a2039fb177cd54767f4b506eb2ae6b2" |
| { | { |
| "repository": "sharix-open-sysadmin", | "repository": "sharix-open-sysadmin", |
| "commit": "60e386e892793ffe37b8f0d842330c6e5635068e", | "commit": "a7e8b841f9a5a790df5d3adfcb265a7011bbabcb", |
| "path": "services/repository_updates.py", | "path": "services/repository_updates.py", |
| "sha256": "3f36c0ec4efdb07377be0e9b0c04d7557982f6c8ea6c7c98b1500053bc8e0689" | "sha256": "3f36c0ec4efdb07377be0e9b0c04d7557982f6c8ea6c7c98b1500053bc8e0689" |
| { | { |
| "repository": "sharix-open-sysadmin", | "repository": "sharix-open-sysadmin", |
| "commit": "60e386e892793ffe37b8f0d842330c6e5635068e", | "commit": "a7e8b841f9a5a790df5d3adfcb265a7011bbabcb", |
| "path": "services/source_provenance.py", | "path": "services/source_provenance.py", |
| "sha256": "b89683e9a17d5d0202290f40cfa78d57aa6751691fb2a6ed0af06e2da75e477f" | "sha256": "b89683e9a17d5d0202290f40cfa78d57aa6751691fb2a6ed0af06e2da75e477f" |
| "repository_updates.refresh_public" | "repository_updates.refresh_public" |
| ] | ] |
| | }, |
| | "classification": { |
| | "schema": "sharix.knowledge.classification.v1", |
| | "products": [ |
| | "sharix_open", |
| | "shared" |
| | ], |
| | "audiences": [ |
| | "operator", |
| | "administrator", |
| | "developer", |
| | "reviewer", |
| | "ai" |
| | ], |
| | "material": "scenario", |
| | "topics": [ |
| | "development/git", |
| | "operations/diagnostics", |
| | "handlers/blockly" |
| | ], |
| | "tag_terms": [ |
| | "audience_operator", |
| | "audience_administrator", |
| | "audience_developer", |
| | "audience_reviewer", |
| | "audience_ai", |
| | "product_sharix_open", |
| | "product_shared", |
| | "material_scenario", |
| | "topic_development_git", |
| | "topic_operations_diagnostics", |
| | "topic_handlers_blockly", |
| | "sysadmin", |
| | "repository_updates", |
| | "optional_handler", |
| | "source_snapshot", |
| | "source_evidence", |
| | "bpmn", |
| | "blockly", |
| | "generated_python" |
| | ], |
| | "registry_document": "ShariXKnowledgeClassification", |
| | "state_meaning": "implemented — описана проверенная реализация исходников; серверный runtime отдельно; review — состояние текста" |
| | }, |
| | "editorial_review": { |
| | "date": "2026-10-31", |
| | "scope": "Конкретизация действий, условий, результатов и диагностики; перечисления; исходные BPMN сохранены", |
| | "current_source_records_verified": 15, |
| | "original_source_evidence_recheck": "После git fetch все исходные SHA-256 совпали; source_evidence содержит текущие проверенные commits", |
| | "canonical_regeneration": { |
| | "kind": "optional", |
| | "compared_python_paths": [ |
| | "handlers/repository_update_watch.py" |
| | ], |
| | "generator_sources_verified": 11, |
| | "handler_executed": false, |
| | "paths_from_contribution": true |
| | }, |
| | "runtime_checked": false, |
| | "source_commit_update": { |
| | "repository": "sharix-open-sysadmin", |
| | "old_commit": "60e386e892793ffe37b8f0d842330c6e5635068e", |
| | "new_commit": "a7e8b841f9a5a790df5d3adfcb265a7011bbabcb", |
| | "rechecked_source_files": 6, |
| | "all_bytes_equal": true, |
| | "diagram_documentation": "Сохранена исходная редакция BPMN, хеши кода совпадают" |
| | } |
| } | } |
| }, | }, |
| "content_sha256": "635cc643e24864ad320d8f0c81642b5bc262370c6519b199f6d9dc39fba584a2", | "content_sha256": "e4b4dfa50e1d5923d81b766d617b607794c8c48e6f6c3774a5bdd8389664015c", |
| "schema": 1 | "schema": 1 |
| } | } |
| ~~NOCACHE~~ | ~~NOCACHE~~ |
| |
| **Область:** публичный контракт ShariX Open/shared Sysadmin. **Обработчик:** ''repository_update_watch'', module contribution ''sharix_sysadmin'', без типа/статуса Ticket. Проверено 29.10.2026 по свежему Sysadmin Git и закреплённым shared contracts. Python побайтово совпадает с каноническим optional Blockly renderer. Включённость и выбранная версия установки проверяются отдельно. | **Назначение:** [[sharixopen:knowledge:classification:materials#scenarij_processa|Сценарий процесса]]. **Продукт:** [[sharixopen:knowledge:classification:products#sharix_open|ShariX Open]] · [[sharixopen:knowledge:classification:products#obschij_komponent|Общий компонент]]. |
| | |
| | **Для кого:** [[sharixopen:knowledge:classification:audiences#operator_razvjortyvanija|Оператор развёртывания]] · [[sharixopen:knowledge:classification:audiences#administrator|Администратор]] · [[sharixopen:knowledge:classification:audiences#razrabotchik|Разработчик]] · [[sharixopen:knowledge:classification:audiences#recenzent_i_prijomschik|Рецензент и приёмщик]] · [[sharixopen:knowledge:classification:audiences#nejroset|Нейросеть]]. |
| | |
| | **Темы:** [[sharixopen:knowledge:classification:topics#git|Разработка → Git]] · [[sharixopen:knowledge:classification:topics#diagnostika|Эксплуатация → Диагностика]] · [[sharixopen:knowledge:classification:topics#blockly|Обработчики → Blockly]]. |
| | |
| | |
| | |
| | **Область:** публичный контракт ShariX Open/shared Sysadmin. **Обработчик:** ''repository_update_watch'', module contribution ''sharix_sysadmin'', без типа/статуса Ticket. 31.10.2026 исходники повторно получены из Git. Module-owned Python совпал с optional renderer; пути взяты из contribution, отдельно проверены callback и общий launcher. Сам обработчик и его внешние действия при анализе не запускались. Выбранная версия, настройки и работоспособность конкретной установки проверяются отдельно. |
| |
| ===== Назначение и границы ===== | ===== Назначение и границы ===== |
| Обработчик обновляет сведения о deployment/upstream Git-состоянии управляемых **установленных** repositories. Он не выполняет установку новой версии, git pull/merge, переключение рабочих веток, migrations или restart сервиса. Найденное обновление — evidence для решения оператора, не само применение обновления. | Монитор обновляет сведения об установленных управляемых repositories: |
| | |
| | * configured deployment target — источник, настроенный для развёртывания; |
| | * canonical upstream target — исходный upstream. |
| | |
| | Он не выполняет git pull/merge, переключение рабочих веток, миграции, установку версии или restart. Найденное обновление — основание для решения оператора. |
| |
| Contribution по умолчанию disabled, version builtin; это optional-возможность, не обязательная зависимость обычной установки. В текущем опубликованном модуле blockly_editable=true и есть module-owned workspace/generated Python. Blockly содержит typed operation repository_updates.refresh_public с интервалом 21600 секунд. Исполняется сгенерированный Python, а не Blockly JSON; BPMN isExecutable=false. | Contribution по умолчанию disabled, version builtin; это optional-возможность, не обязательная зависимость обычной установки. В текущем опубликованном модуле blockly_editable=true и есть module-owned workspace/generated Python. Blockly содержит typed operation repository_updates.refresh_public с интервалом 21600 секунд. Исполняется сгенерированный Python, а не Blockly JSON; BPMN isExecutable=false. |
| OptionalHandlerContext не требует XMPP и выполняет общий identity preflight. Далее generated process_cycle вызывает run_operation_every с явным интервалом **21600 секунд (6 часов)**. | OptionalHandlerContext не требует XMPP и выполняет общий identity preflight. Далее generated process_cycle вызывает run_operation_every с явным интервалом **21600 секунд (6 часов)**. |
| |
| Первый проход выполняет operation сразу. После успешного HTTP/JSON status=ok запоминается monotonic-время завершения. До истечения интервала запрос пропускается. Таймер хранится в памяти: рестарт запускает первую проверку заново; это не постоянный календарный cron с фиксированным временем суток. | Поведение шестичасового интервала: |
| | |
| | - Первый проход вызывает operation сразу. |
| | - После успешного HTTP/JSON status=ok сохраняется monotonic-время завершения. |
| | - До истечения 21600 секунд запрос пропускается. |
| | - После рестарта первая проверка выполняется заново. |
| | |
| | Таймер хранится в памяти; это не календарный cron с фиксированным временем суток. |
| |
| Внешний процессный цикл ждёт INTERVAL_TIME через exit_event.wait, то есть остановка прерывает ожидание. При исключении operation last_run не обновляется; ошибка логируется, следующий базовый цикл может повторить запрос. Но SOURCE_UNAVAILABLE или PRIVATE_AUTH_REQUIRED в успешно возвращённом evidence не являются исключением API: такой status=ok начинает обычный шестичасовой интервал. | Внешний процессный цикл ждёт INTERVAL_TIME через exit_event.wait, то есть остановка прерывает ожидание. При исключении operation last_run не обновляется; ошибка логируется, следующий базовый цикл может повторить запрос. Но SOURCE_UNAVAILABLE или PRIVATE_AUTH_REQUIRED в успешно возвращённом evidence не являются исключением API: такой status=ok начинает обычный шестичасовой интервал. |
| |
| Узкий backend endpoint проверяет HasHandlerAPIKey, identity, materialized contribution и наличие operation у этого handler, затем требует capability **repository.update.watch**. Callback берётся только из зарегистрированного contribution и исполняет только объявленный operation code. Бот не получает универсальный API выполнения команд из текста/payload. | Узкий backend endpoint: |
| | |
| | - Проверяет HasHandlerAPIKey и identity. |
| | - Находит materialized contribution и объявленную operation этого handler. |
| | - Требует capability repository.update.watch. |
| | - Вызывает только зарегистрированный callback для объявленного operation code. |
| | |
| | Текст и payload не становятся произвольными командами ОС. |
| |
| ===== Внешний Git и snapshot (BPMN) ===== | ===== Внешний Git и snapshot (BPMN) ===== |
| Sysadmin собирает локальные source facts, отдельно определяет configured deployment target и canonical upstream target. Для public-целей выполняет anonymous ls-remote и при необходимости сравнение истории во временном repository. В рабочем checkout проверка не делает merge/reset/pull. Независимые repositories обрабатываются небольшим bounded worker pool, до четырёх workers, а не одной последовательной цепочкой всех сетевых тайм-аутов. | Sysadmin собирает локальные source facts, отдельно определяет configured deployment target и canonical upstream target. Для public-целей выполняет anonymous ls-remote и при необходимости сравнение истории во временном repository. В рабочем checkout проверка не делает merge/reset/pull. Независимые repositories обрабатываются небольшим bounded worker pool, до четырёх workers, а не одной последовательной цепочкой всех сетевых тайм-аутов. |
| |
| Состояния различают CURRENT, UPDATE_AVAILABLE, LOCAL_AHEAD, DIVERGED, SOURCE_UNAVAILABLE, PRIVATE_AUTH_REQUIRED и UNKNOWN. Dirty worktree не должен выдавать ложный CURRENT. Совпадение deployment и upstream цели позволяет переиспользовать одно evidence; иначе цели проверяются независимо. Дополнительно хранится предусмотренная публикационная проекция source evidence, не криптографическое подтверждение всей удалённой установки. | Состояние каждой цели имеет отдельный смысл: |
| | |
| | * **CURRENT:** установленный commit совпадает с удалённой ref при согласованном чистом состоянии. |
| | * **UPDATE_AVAILABLE:** удалённая ref содержит более новые commits. |
| | * **LOCAL_AHEAD:** локальный commit опережает удалённую цель. |
| | * **DIVERGED:** история разошлась либо в рабочем дереве есть локальные изменения. |
| | * **SOURCE_UNAVAILABLE:** цель/ref временно недоступна. |
| | * **PRIVATE_AUTH_REQUIRED:** нужна явная разовая проверка с авторизацией. |
| | * **UNKNOWN:** отношение локального и удалённого состояния не доказано. |
| | |
| | Совпадающие deployment/upstream-цели могут переиспользовать evidence; разные проверяются независимо. Публикационная проекция evidence не является криптографическим подтверждением всей установки. |
| |
| Private-цель без разовых credentials возвращает PRIVATE_AUTH_REQUIRED. Фоновая operation не читает private credentials и не пытается автоматически использовать пользовательское хранилище. Public Git-вызовы отключают интерактивный prompt/askpass и credential helper. Отдельная ручная private-refresh операция существует в Sysadmin, но **не вызывается этим handler**, её credentials не сохраняются в snapshot. Копировать секрет в Blockly/Wiki/описание operation не требуется. | Private-цель без разовых credentials возвращает PRIVATE_AUTH_REQUIRED. Фоновая operation не читает private credentials и не пытается автоматически использовать пользовательское хранилище. Public Git-вызовы отключают интерактивный prompt/askpass и credential helper. Отдельная ручная private-refresh операция существует в Sysadmin, но **не вызывается этим handler**, её credentials не сохраняются в snapshot. Копировать секрет в Blockly/Wiki/описание operation не требуется. |
| |
| Результаты сохраняются как нечувствительное invalidatable evidence в managed ''conf-real/repository-update-status.json'' и возвращается summary. Ошибка/недоступность конкретной цели может быть штатным результатом evidence, а не доказательством поломки всего handler. | Результат проверки: |
| |
| Обычный read path страницы статусов не делает Git network I/O. Он сопоставляет сохранённую identity snapshot с текущими source/branch/commit/worktree facts; несоответствующее evidence не должно выдавать прежний CURRENT как актуальную проверку. Открытие страницы и запуск refresh — разные операции. | * нечувствительное evidence в managed conf-real/repository-update-status.json; |
| | * summary по обработанным repositories; |
| | * отдельный статус каждой deployment/upstream-цели. |
| | |
| | Недоступность одной цели может быть штатным содержимым успешного ответа operation. Status=ok не означает CURRENT у всех repositories. |
| | |
| | Обычное открытие страницы статусов: |
| | |
| | - Читает сохранённый snapshot. |
| | - Сопоставляет его identity с текущими source, branch, commit и worktree facts. |
| | - Не выдаёт устаревшее CURRENT при несовпадении фактов. |
| | |
| | Git network I/O выполняет refresh, а не этот read path. |
| |
| ===== Диагностика и эксплуатационный смысл ===== | ===== Диагностика и эксплуатационный смысл ===== |
| Проверяйте отдельно enabled/runtime version, identity/capability, момент последней успешной operation и состояние каждой deployment/upstream цели. Не считайте status=ok доказательством, что все repositories доступны или не имеют обновлений. Не считайте PRIVATE_AUTH_REQUIRED общей сетевой недоступностью сервера. | Порядок диагностики: |
| | |
| | - Проверить enabled и выбранную runtime version. |
| | - Сверить identity и capability. |
| | - Найти момент последнего успешного operation. |
| | - Разобрать состояние каждой deployment/upstream-цели. |
| | - Проверить, соответствует ли snapshot текущей ветке, source URL, commit и рабочему дереву. |
| | |
| | PRIVATE_AUTH_REQUIRED не означает общей сетевой недоступности сервера. |
| |
| После изменения ветки, source URL, commit или рабочего дерева старый snapshot может стать неактуальным — это ожидаемая защита от ложного CURRENT. Решение применить обновление принимает оператор через штатный repository/deployment workflow; этот монитор не является его заменой. | После изменения ветки, source URL, commit или рабочего дерева старый snapshot может стать неактуальным — это ожидаемая защита от ложного CURRENT. Решение применить обновление принимает оператор через штатный repository/deployment workflow; этот монитор не является его заменой. |
| |
| ===== Проверенные источники ===== | ===== Проверенные источники ===== |
| | |
| | 31.10.2026 проверен новый Sysadmin commit a7e8b841f9a5a790df5d3adfcb265a7011bbabcb. Шесть ранее закреплённых файлов совпали по SHA-256. В documentation исходных BPMN сохранён прежний commit 60e386e892793ffe37b8f0d842330c6e5635068e; он описывает те же побайтовые исходники. Ссылки ниже и metadata указывают актуальный проверенный commit. |
| | |
| Git SHA/SHA-256 и модели закреплены в metadata/BPMN; перед упаковкой они повторно сверены. Сама operation, локальные installation facts и её сетевые Git-проверки при анализе не запускались. Для анализа прочитан только опубликованный source Git. Общий автоматический hook обновлений Wiki пока не завершён. | Git SHA/SHA-256 и модели закреплены в metadata/BPMN; перед упаковкой они повторно сверены. Сама operation, локальные installation facts и её сетевые Git-проверки при анализе не запускались. Для анализа прочитан только опубликованный source Git. Общий автоматический hook обновлений Wiki пока не завершён. |
| |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-sysadmin/src/commit/60e386e892793ffe37b8f0d842330c6e5635068e/handler_contributions.py|sharix-open-sysadmin / handler_contributions.py]] — Git 60e386e892793ffe37b8f0d842330c6e5635068e. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-sysadmin/src/commit/a7e8b841f9a5a790df5d3adfcb265a7011bbabcb/handler_contributions.py|sharix-open-sysadmin / handler_contributions.py]] — Git a7e8b841f9a5a790df5d3adfcb265a7011bbabcb. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-sysadmin/src/commit/60e386e892793ffe37b8f0d842330c6e5635068e/handlers/repository_update_watch.py|sharix-open-sysadmin / handlers/repository_update_watch.py]] — Git 60e386e892793ffe37b8f0d842330c6e5635068e. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-sysadmin/src/commit/a7e8b841f9a5a790df5d3adfcb265a7011bbabcb/handlers/repository_update_watch.py|sharix-open-sysadmin / handlers/repository_update_watch.py]] — Git a7e8b841f9a5a790df5d3adfcb265a7011bbabcb. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-sysadmin/src/commit/60e386e892793ffe37b8f0d842330c6e5635068e/handlers/blockly/repository_update_watch.json|sharix-open-sysadmin / handlers/blockly/repository_update_watch.json]] — Git 60e386e892793ffe37b8f0d842330c6e5635068e. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-sysadmin/src/commit/a7e8b841f9a5a790df5d3adfcb265a7011bbabcb/handlers/blockly/repository_update_watch.json|sharix-open-sysadmin / handlers/blockly/repository_update_watch.json]] — Git a7e8b841f9a5a790df5d3adfcb265a7011bbabcb. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-sysadmin/src/commit/60e386e892793ffe37b8f0d842330c6e5635068e/services/repository_update_handler.py|sharix-open-sysadmin / services/repository_update_handler.py]] — Git 60e386e892793ffe37b8f0d842330c6e5635068e. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-sysadmin/src/commit/a7e8b841f9a5a790df5d3adfcb265a7011bbabcb/services/repository_update_handler.py|sharix-open-sysadmin / services/repository_update_handler.py]] — Git a7e8b841f9a5a790df5d3adfcb265a7011bbabcb. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-sysadmin/src/commit/60e386e892793ffe37b8f0d842330c6e5635068e/services/repository_updates.py|sharix-open-sysadmin / services/repository_updates.py]] — Git 60e386e892793ffe37b8f0d842330c6e5635068e. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-sysadmin/src/commit/a7e8b841f9a5a790df5d3adfcb265a7011bbabcb/services/repository_updates.py|sharix-open-sysadmin / services/repository_updates.py]] — Git a7e8b841f9a5a790df5d3adfcb265a7011bbabcb. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-sysadmin/src/commit/60e386e892793ffe37b8f0d842330c6e5635068e/services/source_provenance.py|sharix-open-sysadmin / services/source_provenance.py]] — Git 60e386e892793ffe37b8f0d842330c6e5635068e. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-sysadmin/src/commit/a7e8b841f9a5a790df5d3adfcb265a7011bbabcb/services/source_provenance.py|sharix-open-sysadmin / services/source_provenance.py]] — Git a7e8b841f9a5a790df5d3adfcb265a7011bbabcb. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/optional_blockly_codegen.py|sharix-open-handlers-backend / optional_blockly_codegen.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/optional_blockly_codegen.py|sharix-open-handlers-backend / optional_blockly_codegen.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. |
| * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/optional_handler_runtime.py|sharix-open-handlers-backend / core/optional_handler_runtime.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. | * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/optional_handler_runtime.py|sharix-open-handlers-backend / core/optional_handler_runtime.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. |