# Scripts ## `staging-smoke.sh` Post-deploy smoke helper для staging/production-like окружений. ```bash ./scripts/staging-smoke.sh https://crank.example.com ``` ## `authenticated-staging-smoke.sh` Browser-authenticated smoke helper. Обязательные переменные: - `CRANK_STAGING_ADMIN_EMAIL` - `CRANK_STAGING_ADMIN_PASSWORD` ```bash CRANK_STAGING_ADMIN_EMAIL=owner@example.com \ CRANK_STAGING_ADMIN_PASSWORD=secret \ ./scripts/authenticated-staging-smoke.sh https://crank.example.com ``` ## `authenticated-product-smoke.sh` Authenticated product smoke helper. Создает временную REST operation на внутренний `admin-api` health endpoint, публикует агента, выпускает API-ключ и проверяет MCP `tools/list` / `tools/call`. Внешние публичные API не используются. Обязательные переменные: - `CRANK_STAGING_ADMIN_EMAIL` - `CRANK_STAGING_ADMIN_PASSWORD` ```bash CRANK_STAGING_ADMIN_EMAIL=owner@example.com \ CRANK_STAGING_ADMIN_PASSWORD=secret \ ./scripts/authenticated-product-smoke.sh https://crank.example.com ``` По умолчанию временные сущности удаляются после успешной проверки. Для отладки можно оставить их в workspace: ```bash CRANK_PRODUCT_SMOKE_KEEP_ASSETS=1 ./scripts/authenticated-product-smoke.sh https://crank.example.com ``` Smoke выполняет Admin test-run до publish и фиксирует точные Operation version и Agent revision. Для split-port local stack можно передать `--mcp-base-url` и пустой `--mcp-path-prefix`; `--summary-output` пишет bounded safe summary без ключей, cookies и payloads. ## `check-rust-code-health.sh` Проверяет базовые правила сопровождаемости Rust-кода: - новые `.rs` файлы не больше 1000 строк; - существующие крупные файлы не должны расти сверх текущего baseline; - крупные inline test modules запрещены вне legacy allowlist. ```bash ./scripts/check-rust-code-health.sh ``` ## `check-rust-boundaries.sh` Проверяет направление зависимостей между Rust workspace crates: - приложения из `apps/*` могут зависеть от crates, но не от других приложений; - crates не должны зависеть от приложений; - `crank-core` не зависит от runtime, registry и adapters; - `crank-registry` не зависит от runtime и adapters; - `crank-runtime` не зависит от registry. ```bash ./scripts/check-rust-boundaries.sh ``` ## Typed runtime configuration contract Единый Rust registry генерирует machine contract, sections `.env.example` и таблицу параметров. Проверка drift не изменяет файлы: ```bash cargo run -p crank-config --bin crank-config-contract -- --check python3 scripts/check-runtime-config.py --root . python3 scripts/check-config-boundaries.py --root . ``` После намеренного изменения registry artifacts обновляются через `crank-config-contract --write`, просматриваются в diff и проверяются командой `just config-contract-check`. Explicit `--files` у boundary checker-а позволяет проверять новые/untracked Rust-файлы. ## Versioned migration contract `just migration-contract-check` сравнивает canonical Rust migration sequence с committed machine contract. PostgreSQL DDL вне `crank-registry::migrations` блокируется Rust module boundary check. Операторские auth-команды живут в том же `crank-migrate` binary и используют database-only config projection: ```bash crank-migrate admin-auth bootstrap-create --email owner@example.local crank-migrate admin-auth recover \ --email owner@example.local \ --password-file /secure/new-admin-password.txt \ --password-pepper-file /secure/password-pepper.txt \ --master-key-file /secure/current-master.key ``` Команда создаёт одноразовый local bootstrap contract и выводит token для UI `/login`; static startup password не является production bootstrap authority. Recovery проверяет active master-key identity, заменяет verifier существующего Admin account, отзывает browser sessions и не выводит password, pepper, master key или Secret material. ## Typed metrics contract `just metrics-contract-check` сверяет Rust registry с versioned JSON snapshot и проверяет, что production-код объявляет метрики только через `crank-metrics`. Checker распознаёт прямые macro calls, imports, aliases и re-exports; новые Rust-файлы можно передать явно через `--files`. ## Unified execution boundary `check-execution-boundaries.py` запрещает Admin/MCP route и service слоям обходить typed `RuntimeExecutionRequest`: напрямую импортировать REST adapter, Reqwest, legacy `execute_with_*` helpers или запускать execution через persistence. Проверка видит tracked и untracked файлы, а explicit mode fail-closed отклоняет missing, symlink и path escape: ```bash python3 scripts/check-execution-boundaries.py --root . python3 scripts/check-execution-boundaries.py --root . --files ``` Canonical composition roots создают adapters, но продуктовые Admin Draft Test и MCP snapshot calls проходят только через единый runtime outcome contract. ## `check-community-scope.sh` Проверяет, что в community-репозиторий не попали функции и тексты за пределами REST -> MCP сценария. ```bash ./scripts/check-community-scope.sh ``` Unit-тесты checker-а лежат в `tests/unit`: ```bash python3 -m unittest discover -s tests/unit ``` Новые или ещё не tracked файлы по умолчанию не видны wrapper-у. Перед handoff передайте только файлы текущего изменения явно: ```bash python3 scripts/check-community-scope.py --root . --files ``` ## `validate-capability-inventory.py` Проверяет canonical `docs/capability-inventory.json` по versioned schema, обязательным FR, Community boundary и существующим evidence-ссылкам: ```bash python3 scripts/validate-capability-inventory.py \ --root . \ --inventory docs/capability-inventory.json \ --schema docs/schemas/capability-inventory.schema.json \ $(for n in $(seq 1 54); do printf -- '--required-fr FR-%s ' "$n"; done) ``` Статусы `planned`, `gap` и `blocked` валидны, но не считаются pass. ## Capability baseline tools `collect-capability-baseline.py` принимает только allowlisted command reports или bounded Playwright JSON, вычисляет verdict и удаляет raw output, paths и attachments. Retry-pass становится `flaky`, а skipped/missing/non-zero result не становится pass. ```bash python3 scripts/collect-capability-baseline.py playwright \ --report \ --output \ --source-revision \ --environment-class community-test \ --flow-id ui-operation-lifecycle ``` После review candidate и обновления canonical artifacts пересчитайте exact-byte SHA-256 в manifest и запустите: ```bash python3 scripts/validate-capability-baseline.py \ --root . \ --manifest docs/capability-baseline/manifest.json \ --schema docs/schemas/capability-baseline.schema.json ```