Files
crank/scripts
bsodfather d92f817e73
CI / Rust Checks (push) Successful in 12m30s
CI / UI Checks (push) Successful in 5s
CI / Frontend E2E (push) Failing after 9m30s
CI / Community Image Smoke (push) Successful in 11m18s
CI / Deploy (push) Has been skipped
fix(ci): harden community image smoke
2026-08-30 22:22:13 +03:00
..

Scripts

staging-smoke.sh

Post-deploy smoke helper для staging/production-like окружений.

./scripts/staging-smoke.sh https://crank.example.com

authenticated-staging-smoke.sh

Browser-authenticated smoke helper.

Обязательные переменные:

  • CRANK_STAGING_ADMIN_EMAIL
  • CRANK_STAGING_ADMIN_PASSWORD
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
CRANK_STAGING_ADMIN_EMAIL=owner@example.com \
CRANK_STAGING_ADMIN_PASSWORD=secret \
./scripts/authenticated-product-smoke.sh https://crank.example.com

По умолчанию временные сущности удаляются после успешной проверки. Для отладки можно оставить их в workspace:

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.
./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.
./scripts/check-rust-boundaries.sh

Typed runtime configuration contract

Единый Rust registry генерирует machine contract, sections .env.example и таблицу параметров. Проверка drift не изменяет файлы:

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:

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:

python3 scripts/check-execution-boundaries.py --root .
python3 scripts/check-execution-boundaries.py --root . --files <paths...>

Canonical composition roots создают adapters, но продуктовые Admin Draft Test и MCP snapshot calls проходят только через единый runtime outcome contract.

check-community-scope.sh

Проверяет, что в community-репозиторий не попали функции и тексты за пределами REST -> MCP сценария.

./scripts/check-community-scope.sh

Unit-тесты checker-а лежат в tests/unit:

python3 -m unittest discover -s tests/unit

Новые или ещё не tracked файлы по умолчанию не видны wrapper-у. Перед handoff передайте только файлы текущего изменения явно:

python3 scripts/check-community-scope.py --root . --files <paths...>

validate-capability-inventory.py

Проверяет canonical docs/capability-inventory.json по versioned schema, обязательным FR, Community boundary и существующим evidence-ссылкам:

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.

python3 scripts/collect-capability-baseline.py playwright \
  --report <temporary-report.json> \
  --output <candidate.json> \
  --source-revision <git-sha> \
  --environment-class community-test \
  --flow-id ui-operation-lifecycle

После review candidate и обновления canonical artifacts пересчитайте exact-byte SHA-256 в manifest и запустите:

python3 scripts/validate-capability-baseline.py \
  --root . \
  --manifest docs/capability-baseline/manifest.json \
  --schema docs/schemas/capability-baseline.schema.json