docs(registry): document Russian Gitea contour and backup evidence

This commit is contained in:
igor04091968
2026-06-21 05:11:42 +03:00
parent 8b25ec345e
commit 4ba055fcdf
12 changed files with 646 additions and 2 deletions
+6 -1
View File
@@ -218,6 +218,12 @@ collectors.
[commercial positioning](docs/REGISTRY_COMMERCIAL_POSITIONING_RU.md),
[readiness checklist](docs/REGISTRY_READINESS_CHECKLIST_RU.md).
- Registry-readiness infrastructure:
Russian Git contour:
`https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus`;
GitHub role: public mirror;
detailed docs: [docs/registry/](docs/registry/REGISTER_RU_SOFTWARE_READINESS_RU.md).
- [Позиционирование для реестра российского ПО](docs/RUSSIAN_SOFTWARE_REGISTRY_POSITIONING_RU.md)
- [Сведения для подачи в реестр](REGISTER_RU_SOFTWARE.md)
- [Registry product passport](docs/REGISTRY_PRODUCT_PASSPORT_RU.md)
@@ -688,4 +694,3 @@ PILOT V1 SCOPE (ГОТОВО):
✅ ТРЕБОВАТЬ: Support contract перед production
✅ ПЛАНИРОВАТЬ: Intern training на Rust maintenance
```
@@ -0,0 +1,81 @@
# Runbook: backup и restore Gitea
Статус: registry-readiness runbook. Документ фиксирует целевую схему backup
для self-hosted Gitea AWatch-rus. Backup нельзя считать production-ready до
успешного тестового восстановления на отдельном сервере.
## Параметры backup-контура
| Параметр | Значение |
| --- | --- |
| Backup path | `/var/backups/gitea` |
| Backup script | `/usr/local/sbin/awatch-gitea-backup.sh` |
| systemd service | `awatch-gitea-backup.service` |
| systemd timer | `awatch-gitea-backup.timer` |
| Schedule target | daily `03:20` with `RandomizedDelaySec=10m` |
| Backup format | Gitea dump ZIP |
| Checksum | SHA256 |
| Retention | 14 days |
Целевой backup script использует `gitea dump`, создает ZIP backup и отдельный
SHA256 checksum. Каталог `/var/backups/gitea` должен быть доступен только
административным пользователям, обслуживающим Gitea backup.
## Проверка timer
```bash
systemctl status awatch-gitea-backup.timer --no-pager
systemctl list-timers awatch-gitea-backup.timer --no-pager
```
## Проверка результата backup
```bash
ls -lh /var/backups/gitea
sha256sum -c /var/backups/gitea/<backup>.zip.sha256
```
Имя backup-файла должно включать timestamp или иной однозначный идентификатор
запуска. Retention target - 14 days.
## Restore outline
Restore является ручной процедурой и требует тестового восстановления на
отдельном сервере перед признанием backup production-ready.
Общий порядок:
1. Подготовить отдельный сервер или isolated test instance.
2. Установить совместимую версию Gitea.
3. Остановить Gitea на целевом тестовом сервере.
4. Проверить SHA256 checksum выбранного ZIP backup.
5. Выполнить восстановление из `gitea dump` согласно официальной процедуре
Gitea для используемой версии.
6. Проверить права на каталоги, repository storage, database, custom config и
attachments.
7. Запустить Gitea.
8. Выполнить post-restore checks.
9. Зафиксировать timestamp, backup filename, checksum, Gitea version,
restore duration и результат проверки.
## Post-restore checks
```bash
systemctl status gitea --no-pager
curl -L https://git.iri1968.dpdns.org | head
gitea doctor check
```
Если менялся путь установки или сервер переносился, выполнить:
```bash
gitea admin regenerate hooks
```
## Ограничения
- Restore-runbook не заменяет фактический restore test.
- Backup не должен считаться production-ready, пока restore не проверен на
отдельном сервере.
- Offsite copy должна быть описана отдельно до финальной подачи в реестр.
- Секреты, токены и приватные ключи не включаются в backup evidence manifest.
@@ -0,0 +1,83 @@
# Runbook: российский Git-контур и зеркалирование
Статус: operational registry-readiness runbook. Команды ниже описывают
целевую схему remotes для работы с российским self-hosted Gitea и публичным
GitHub mirror.
## Целевая схема remotes
Primary Russian Git contour:
```text
ru-origin:
https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus.git
```
Public mirror / external public repository:
```text
github:
git@github.com:igor04091968/AWatch-rus.git
```
или:
```text
github:
https://github.com/igor04091968/AWatch-rus.git
```
GitHub = public mirror only. GitHub не должен описываться как primary
registry source/build system или как целевой source/build/release contour
для registry-readiness.
## Базовые команды
Проверить текущие remotes:
```bash
git remote -v
```
Добавить российский remote:
```bash
git remote add ru-origin https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus.git
```
Запушить основную ветку:
```bash
git push ru-origin main
```
Запушить теги:
```bash
git push ru-origin --tags
```
## Операционные предупреждения
- При работе через HTTPS использовать Gitea token/password согласно настройкам
Gitea.
- SSH-ключи для Gitea настраиваются отдельно и не должны храниться в
репозитории.
- GitHub остается публичным зеркалом и внешней площадкой; он не является
primary registry source/build system в registry-readiness документации.
- Перед release evidence фиксировать `git remote -v`, commit hash, tag,
timestamp и источник сборки.
- Любые секреты, токены, приватные ключи и персональные данные не включать в
repository evidence.
## Проверка HTTPS-контра
Ожидаемый публичный URL:
```text
https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus
```
Gitea должна обслуживаться через Nginx reverse proxy с HTTPS. После проверки
HTTPS внешний `3000/tcp` не должен быть доступен извне; локальный endpoint
Gitea фиксируется как `127.0.0.1:3000`.
@@ -0,0 +1,41 @@
# Installation and test instance
Статус: registry-readiness document. Документ фиксирует минимальные требования
к тестовому стенду для экспертной проверки. Он не меняет runtime, API, UI или
deployment behavior продукта.
## Назначение тестового стенда
Тестовый стенд должен позволить проверить:
- получение исходного кода из российского Git-контура;
- воспроизводимость сборки по документированной процедуре;
- базовую установку AWatch-rus;
- отсутствие необходимости в cloud dependency для работы продукта;
- сбор release evidence и infrastructure evidence.
## Git source
Целевой источник для registry-readiness:
```text
https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus
```
GitHub допускается как public mirror only и не должен описываться как primary
registry source/build/release contour.
## Проверки до признания стенда готовым
- Подтвержден доступ к self-hosted Gitea по HTTPS.
- Подтвержден commit hash и tag, если используется tagged release.
- Подтверждена процедура сборки из исходного кода.
- Подтверждено, что секреты и персональные данные не входят в test package.
- Подтверждено, что backup/restore runbook для Gitea доступен в
`docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md`.
## Оставшиеся пробелы
Перед финальной подачей требуется отдельно зафиксировать российский
build-runner, storage release artifacts в РФ, access control policy и
результат тестового восстановления Gitea backup на отдельном сервере.
+64
View File
@@ -0,0 +1,64 @@
# Lifecycle and support
Статус: registry-readiness document. Документ описывает целевой жизненный цикл
исходного кода, backup и evidence collection для AWatch-rus.
## Source code lifecycle
Целевой lifecycle исходного кода для registry-readiness проходит через
self-hosted Gitea:
```text
https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus
```
Роль Gitea: target primary Russian Git contour for registry-readiness.
Роль GitHub: public mirror only / external public repository.
Перед release или registry evidence package фиксируются:
- commit hash;
- tag, если применимо;
- список remotes;
- источник сборки;
- ответственный за выпуск;
- timestamp evidence.
## Backup lifecycle
Backup lifecycle для Gitea:
- tool: `gitea dump`;
- path: `/var/backups/gitea`;
- format: ZIP;
- checksum: SHA256;
- retention target: 14 days;
- timer: `awatch-gitea-backup.timer`;
- schedule target: daily `03:20` with `RandomizedDelaySec=10m`.
Backup нельзя считать production-ready без тестового восстановления на
отдельном сервере. Offsite copy должна быть описана отдельно.
## Restore responsibility
Restore Gitea является ручной административной процедурой. Ответственный за
restore должен:
- выбрать backup ZIP;
- проверить SHA256 checksum;
- выполнить restore на отдельном test server до использования процедуры в
production;
- выполнить post-restore checks;
- зафиксировать результат и timestamp.
## Evidence collection before releases
Перед выпуском или передачей registry-readiness пакета собрать:
- Gitea HTTPS evidence;
- service status evidence;
- firewall evidence по внешнему `3000/tcp`;
- backup ZIP + SHA256 evidence;
- состояние `awatch-gitea-backup.timer`;
- сведения о правах доступа;
- ссылку на restore-runbook и результат restore test, если он уже выполнен.
@@ -0,0 +1,49 @@
# AWatch-rus: readiness для реестра российского ПО
Статус: подготовительный документ. Документ фиксирует текущее состояние
registry-readiness пакета и не является юридическим заключением о готовности
подачи или принятия AWatch-rus в реестр российского ПО.
## Назначение
Документ нужен для внутренней подготовки пакета сведений о продукте,
исходном коде, инфраструктуре хранения, выпуске, резервном копировании и
оставшихся пробелах перед финальной юридической проверкой.
Новые сведения по российскому Git-контуру требуют финального подтверждения
правообладателем и внесения в официальный пакет документов перед подачей.
## Текущее состояние
Done / partially done:
- Развернут целевой российский Git-контур для registry-readiness.
- Развернута self-hosted Gitea на REG.RU VPS / cloud server.
- Репозиторий AWatch-rus мигрирован в Gitea:
`https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus`.
- HTTPS для Gitea включен через Nginx reverse proxy.
- Начат backup-контур Gitea на базе `gitea dump`, ZIP-архивов,
SHA256 checksum и целевого systemd timer.
- GitHub описывается как public mirror only, не как target primary
source/build/release contour для registry-readiness.
## Что еще требуется
- Финальное подтверждение правообладателя.
- Российский build-runner или документированная российская сборочная среда.
- Хранение release artifacts на территории РФ или отдельное подтверждение
выбранной схемы хранения.
- Протестированная restore-процедура Gitea на отдельном сервере.
- Документированная access control policy для Gitea.
- Документированная offsite copy для backup-архивов.
- Финальная юридическая проверка registry package.
## Ограничения формулировок
AWatch-rus не заявляется как сертифицированное средство защиты информации,
сертифицированная DLP, SIEM или замена штатным средствам ИБ. В текущем пакете
не фиксируется наличие сертификации ФСТЭК или ФСБ.
REG.RU/Gitea контур сам по себе не является юридически достаточным
доказательством для реестра. Он рассматривается как инфраструктурная часть
registry-readiness и должен быть подтвержден в официальном пакете документов.
@@ -0,0 +1,35 @@
# Registry readiness changelog
## 2026-06-20 / 2026-06-21
Added:
- REG.RU/Gitea Russian Git contour documentation.
- Self-hosted Gitea repository reference:
`https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus`.
- GitHub role as public mirror only.
- Gitea backup/restore runbook.
- Registry evidence manifest updates for Gitea, backup ZIP, SHA256 checksum,
systemd timer and restore status.
- Registry readiness check script for the new `docs/registry/` package.
Changed:
- README now contains a short Registry-readiness infrastructure block.
Runtime impact:
- No runtime/product code changes.
- No API changes.
- No UI changes.
- Rust/runtime checks not required: documentation-only change.
Remaining gaps:
- Legal rightsholder confirmation.
- Russian build-runner.
- Release artifacts storage in RF.
- Tested restore procedure.
- Documented access control policy.
- Documented backup offsite copy.
- Final registry legal review.
@@ -0,0 +1,44 @@
# Release evidence manifest
Статус: registry-readiness document. Документ описывает состав evidence,
который должен прикладываться к релизу или экспертному пакету. Он не
подтверждает юридическую достаточность evidence для реестра российского ПО.
## Infrastructure evidence
Для российского Git-контура и backup-контура фиксировать:
- Gitea URL: `https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus`.
- Provider: REG.RU VPS / cloud server.
- Platform: self-hosted Gitea.
- HTTPS evidence для `https://git.iri1968.dpdns.org`.
- Nginx reverse proxy evidence.
- Firewall evidence: внешний `3000/tcp` не должен быть открыт после HTTPS
validation.
- Service status evidence: `gitea`, `nginx`, `awatch-gitea-backup.timer`.
- Backup ZIP evidence из `/var/backups/gitea`.
- SHA256 checksum evidence для backup ZIP.
- Restore-runbook reference:
`docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md`.
- Timestamped evidence file, если он будет предоставлен владельцем.
## Source evidence
Фиксировать:
- primary source repository:
`https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus`;
- GitHub role: public mirror only;
- commit hash;
- tag, если релиз выпускается по tag;
- `git remote -v`;
- список измененных файлов для релиза;
- manifest JSON:
`docs/registry/registry-evidence-manifest.json`.
## Build/release evidence
Для финального registry package дополнительно требуется подтвердить российский
build-runner и storage release artifacts в РФ или документировать принятую
владельцем схему. До этого нельзя утверждать, что source/build/release contour
полностью закрыт для подачи.
@@ -0,0 +1,47 @@
# Исходный код и инфраструктура сборки AWatch-rus
Статус: registry-readiness document. Документ описывает текущую целевую
инфраструктуру хранения исходного кода и связанные ограничения. Он не
фиксирует юридическую завершенность подачи в реестр российского ПО.
## Текущий российский Git-контур
| Параметр | Значение |
| --- | --- |
| Provider | REG.RU VPS / cloud server |
| Platform | self-hosted Gitea |
| URL | `https://git.iri1968.dpdns.org` |
| Organization | `awatch-rus` |
| Repository | `https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus` |
| Role | target primary Russian Git contour for registry-readiness |
| GitHub role | public mirror only / external public repository |
| HTTPS | enabled |
| Reverse proxy | Nginx reverse proxy |
| Gitea local HTTP endpoint | `127.0.0.1:3000` |
| External port policy | external `3000/tcp` should not be exposed after HTTPS validation |
GitHub = public mirror only. GitHub не должен описываться как primary
registry source/build/release contour для registry-readiness. Он может
использоваться как публичное зеркало и внешняя площадка, но целевой российский
контур хранения исходного кода для подготовки к реестру зафиксирован в Gitea.
## Сборочный контур
Текущий документ фиксирует Git-контур хранения исходного кода. Российский
build-runner, release artifact storage в РФ и выпускные процедуры должны быть
описаны отдельно до финальной подачи.
До завершения этой части нельзя утверждать, что российский source/build/release
contour полностью закрыт. Допустимая формулировка: "развернут целевой
российский Git-контур для registry-readiness".
## Требования к подтверждению
Перед включением сведений в официальный пакет документов необходимо собрать:
- подтверждение владельца инфраструктуры и правообладателя;
- состояние Gitea service и Nginx;
- подтверждение HTTPS endpoint;
- подтверждение, что внешний `3000/tcp` не экспонируется после проверки HTTPS;
- список remotes рабочей копии;
- evidence по backup ZIP, SHA256 checksum и systemd timer.
@@ -0,0 +1,53 @@
{
"schema_version": 1,
"product": "AWatch-rus",
"status": "registry-readiness infrastructure evidence manifest",
"updated_at": "2026-06-21",
"primary_source_repository": "https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus",
"primary_git_platform": "self-hosted Gitea",
"primary_git_provider": "REG.RU VPS / cloud server",
"github_role": "public_mirror_only",
"infrastructure": {
"git_url": "https://git.iri1968.dpdns.org",
"organization": "awatch-rus",
"repository": "https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus",
"https_enabled": true,
"reverse_proxy": "Nginx",
"gitea_local_http_endpoint": "127.0.0.1:3000",
"external_3000_tcp_expected_exposed": false,
"legal_sufficiency_confirmed": false
},
"backup": {
"enabled": true,
"tool": "gitea dump",
"path": "/var/backups/gitea",
"script": "/usr/local/sbin/awatch-gitea-backup.sh",
"format": "zip",
"checksum": "sha256",
"retention_days": 14,
"systemd_service": "awatch-gitea-backup.service",
"systemd_timer": "awatch-gitea-backup.timer",
"schedule_target": "daily 03:20 with RandomizedDelaySec=10m",
"restore_runbook": "docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md",
"restore_tested": false,
"production_ready": false
},
"github_role_note": "GitHub is a public mirror only, not the target primary source/build/release contour for registry-readiness.",
"remaining_gaps": [
"legal rightsholder confirmation",
"Russian build-runner",
"release artifacts storage in RF",
"tested restore procedure",
"documented access control policy",
"documented backup offsite copy",
"final registry legal review"
],
"forbidden_claims_not_made": [
"FSTEC/FSB certification",
"SIEM replacement",
"DLP replacement",
"ML/LLM-based detection",
"cloud dependency",
"automatic remediation"
]
}
+10 -1
View File
@@ -139,6 +139,13 @@ def add_finding(findings: list[dict], path: Path, line_no: int, rule: str, value
)
def is_allowed_registry_infrastructure_reference(path: Path, line: str, value: str) -> bool:
rel = path.relative_to(ROOT).as_posix()
if rel != "README.md":
return False
return value.lower() == "iri1968" and "https://git.iri1968.dpdns.org" in line
def scan_line(findings: list[dict], path: Path, line_no: int, line: str) -> None:
stripped = line.strip()
if stripped.startswith("#") and "grep -n" in stripped:
@@ -156,7 +163,9 @@ def scan_line(findings: list[dict], path: Path, line_no: int, line: str) -> None
add_finding(findings, path, line_no, "non_demo_email", email)
for match in FORBIDDEN_DOMAIN_RE.finditer(line):
add_finding(findings, path, line_no, "known_live_domain_or_codename", match.group(0))
value = match.group(0)
if not is_allowed_registry_infrastructure_reference(path, line, value):
add_finding(findings, path, line_no, "known_live_domain_or_codename", value)
for match in SECRET_ASSIGN_RE.finditer(line):
value = match.group(2)
+133
View File
@@ -0,0 +1,133 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
REGISTRY_DIR="$ROOT/docs/registry"
MANIFEST="$REGISTRY_DIR/registry-evidence-manifest.json"
failures=()
fail() {
failures+=("$1")
}
require_file() {
local file="$1"
if [[ ! -s "$ROOT/$file" ]]; then
fail "missing_or_empty:$file"
fi
}
require_grep() {
local pattern="$1"
local file="$2"
local name="$3"
if ! grep -Eiq "$pattern" "$ROOT/$file"; then
fail "missing_marker:$name:$file"
fi
}
required_files=(
"docs/registry/REGISTER_RU_SOFTWARE_READINESS_RU.md"
"docs/registry/SOURCE_CODE_AND_BUILD_INFRASTRUCTURE_RU.md"
"docs/registry/GIT_RU_MIRRORING_RUNBOOK_RU.md"
"docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md"
"docs/registry/RELEASE_EVIDENCE_MANIFEST_RU.md"
"docs/registry/INSTALLATION_AND_TEST_INSTANCE_RU.md"
"docs/registry/LIFECYCLE_AND_SUPPORT_RU.md"
"docs/registry/REGISTRY_READINESS_CHANGELOG_RU.md"
"docs/registry/registry-evidence-manifest.json"
"README.md"
)
for file in "${required_files[@]}"; do
require_file "$file"
done
if [[ -s "$MANIFEST" ]]; then
if command -v python3 >/dev/null 2>&1; then
python3 -m json.tool "$MANIFEST" >/dev/null || fail "invalid_json:docs/registry/registry-evidence-manifest.json"
python3 - "$MANIFEST" <<'PY' || fail "manifest_required_fields"
import json
import sys
path = sys.argv[1]
with open(path, "r", encoding="utf-8") as fh:
data = json.load(fh)
expected = {
"primary_source_repository": "https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus",
"primary_git_platform": "self-hosted Gitea",
"primary_git_provider": "REG.RU VPS / cloud server",
"github_role": "public_mirror_only",
}
for key, value in expected.items():
if data.get(key) != value:
raise SystemExit(f"{key} mismatch")
backup = data.get("backup") or {}
backup_expected = {
"enabled": True,
"tool": "gitea dump",
"path": "/var/backups/gitea",
"checksum": "sha256",
"retention_days": 14,
"systemd_timer": "awatch-gitea-backup.timer",
"restore_tested": False,
}
for key, value in backup_expected.items():
if backup.get(key) != value:
raise SystemExit(f"backup.{key} mismatch")
PY
elif command -v node >/dev/null 2>&1; then
node -e 'JSON.parse(require("fs").readFileSync(process.argv[1], "utf8"))' "$MANIFEST" \
|| fail "invalid_json:docs/registry/registry-evidence-manifest.json"
else
fail "json_validator_missing:python3_or_node_required"
fi
fi
require_grep "git\\.iri1968\\.dpdns\\.org" "docs/registry/SOURCE_CODE_AND_BUILD_INFRASTRUCTURE_RU.md" "gitea_domain_source_infra"
require_grep "git\\.iri1968\\.dpdns\\.org" "docs/registry/GIT_RU_MIRRORING_RUNBOOK_RU.md" "gitea_domain_git_runbook"
require_grep "git\\.iri1968\\.dpdns\\.org" "README.md" "gitea_domain_readme"
require_grep "GitHub[[:space:]]*=[[:space:]]*public mirror only|public mirror only" "docs/registry/SOURCE_CODE_AND_BUILD_INFRASTRUCTURE_RU.md" "github_public_mirror_source_infra"
require_grep "GitHub[[:space:]]*=[[:space:]]*public mirror only|public mirror only" "docs/registry/GIT_RU_MIRRORING_RUNBOOK_RU.md" "github_public_mirror_git_runbook"
require_grep "public mirror" "README.md" "github_public_mirror_readme"
require_grep "GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU\\.md|Restore outline|Post-restore checks" "docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md" "backup_restore_runbook"
require_grep "awatch-gitea-backup\\.timer" "docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md" "backup_timer"
require_grep "sha256|SHA256" "docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md" "backup_sha256"
scan_files=(
"$ROOT/README.md"
"$REGISTRY_DIR"/*.md
)
if grep -RInEi "(ФСТЭК|ФСБ).{0,80}(сертифицирован|сертификация|сертификат).{0,80}(есть|получен|имеется|подтвержден)" "${scan_files[@]}" >/tmp/registry_forbidden_fstec_fsb.$$ 2>/dev/null; then
fail "forbidden_claim_fstec_fsb_certification:$(cat /tmp/registry_forbidden_fstec_fsb.$$)"
fi
rm -f /tmp/registry_forbidden_fstec_fsb.$$
if grep -RInEi "(заменяет|replacement for|replaces).{0,80}(SIEM|DLP)|((SIEM|DLP).{0,80}(replacement|заменяет))" "${scan_files[@]}" \
| grep -Eiv "(не |not |does not|не является|не подменяет|не заявляет|forbidden|not_made)" \
>/tmp/registry_forbidden_replacement.$$ 2>/dev/null; then
fail "forbidden_claim_siem_dlp_replacement:$(cat /tmp/registry_forbidden_replacement.$$)"
fi
rm -f /tmp/registry_forbidden_replacement.$$
if grep -RInEi "(ML/LLM-based detection|LLM-based detection|ML-based detection|automatic remediation)" "${scan_files[@]}" \
| grep -Eiv "(forbidden|not_made|не заявляет|не фиксируется|не используется)" \
>/tmp/registry_forbidden_ai_auto.$$ 2>/dev/null; then
fail "forbidden_claim_ai_or_automatic_remediation:$(cat /tmp/registry_forbidden_ai_auto.$$)"
fi
rm -f /tmp/registry_forbidden_ai_auto.$$
if ((${#failures[@]} > 0)); then
printf 'registry_readiness_check=fail\n'
for failure in "${failures[@]}"; do
printf '%s\n' "$failure"
done
exit 2
fi
printf 'registry_readiness_check=ok\n'
printf 'checked_files=%d\n' "${#required_files[@]}"