# Marketplace MCP static write-safety preflight · 0.1.1

**Локальный анализатор, не рекомендация подключать MCP.** Собственный CLI Редакции Кометы анализирует локальные supplied файлы. Он не выполняет чужой Python, не делает запросы API, не принимает токены и не устанавливает сервер. `supported-pass` означает только завершение ограниченных объявленных проверок, **не безопасность сервера**.

MIT распространяется только на наш код/документацию/учебные примеры. Чужие исходники в пакет не входят: пользователь передаёт их отдельно. Профиль — [ilyautov/marketplaces-mcp-ru](https://github.com/ilyautov/marketplaces-mcp-ru), commit `a633bb802008c9fa42cbdda19646102d766596c1`; дата проверки 12.10.2026. SHA семи файлов и AST-fingerprints зафиксированы в [profiles/pinned.json](profiles/pinned.json). Это hash byte identity, не доказательство Git-истории пользовательского файла.

## Запуск

Только standard library, установка не нужна. Проверенная среда: Python 3.14.4, macOS. AST-fingerprints закреплены за Python **3.14**: pinned-профиль на иной minor-версии возвращает `unsupported_python_version` до разбора policy. Учебный JSON-профиль также проверен на Python 3.9.6; другие среды не проверены. Нужны POSIX `dir_fd`, `O_NOFOLLOW`, `O_DIRECTORY`, `O_NONBLOCK`; без них — unsupported.

Из корня пакета:

```sh
python3 -B scripts/check.py examples/teaching-manifest.json
python3 -B tests/run.py
```

Учебный профиль содержит четыре **собственные синтетические** записи и явную таблицу policy. Это не копия текущего API. Его пути считаются относительно текущей рабочей папки, не папки manifest. Результат первой команды — supported-findings, exit 4 (ожидаемые raw-weaker различия/сигналы); JSON можно сохранить shell-перенаправлением в **новый** файл.

Для pinned источника скопируй `examples/pinned-manifest.template.json`, замени `local_path` на явные абсолютные пути к пяти каталогам и `core/safety.py`/`core/tools.py`. Не меняй expected SHA/commit. Не передавай файлы кабинета и не запускай upstream-модули. CLI не использует git/curl и не достраивает отсутствующие пути.

```sh
python3 -B scripts/check.py ./my-explicit-manifest.json > ./new-report.json
python3 -B tests/run.py --pinned-input ./my-explicit-manifest.json
```

Пути должны быть без symlink-компонентов: на macOS `/tmp` и `/var` — ссылки. Во входе передавай явно проверенный настоящий путь (realpath); CLI сам ссылки не разрешает.

Сам CLI только читает файлы и печатает stdout; shell-перенаправление выбирает пользователь. Не перенаправляй результат поверх источника.

## Контракт и область

Manifest — ровно `profile`, `commit`, `files`; каждый file — ровно `logical_path`, `local_path`, `sha256`. Профили:

- `marketplaces-mcp-ru-a633bb8`: семь файлов, exact pinned SHA, 1024 records. YAML поддерживается **только после byte-exact сверки** как ограниченная проекция scalar-полей и pinned многострочных summary. Это не универсальный YAML loader. Tag/alias/дубликат/новая форма отличаются SHA и отклоняются до разбора.
- `kometa-teaching-v1`: commit `synthetic-not-upstream`, ровно `endpoints.json` и `route-policy.json`. Endpoint: operation_id/method/path/host/safety/summary. Policy: verb_default/verb_floor/rank/confirmations, точная поддерживаемая таблица. Unknown keys/дубли/NaN/неизвестные методы — error/unsupported. Новые пути могут быть учебными, но semantics всегда НП.

Пути с `..`, symlink (включая родительскую папку), FIFO/устройства, файл больше 600000 bytes отклоняются. Только UTF-8. Пакет не сканирует соседние папки. Python разбирается через AST и `literal_eval` только литеральных констант, без `import`, `exec`, `eval`, выполнения тела, загрузки SDK. Изменённый commit/SHA/AST-policy — unsupported. Нормализация загрузчика `core/registry.py` вне объявленной проверки и указана в `not_checked`; анализируются supplied поля каталога. Область маршрутов: `_run_spec`, `_run_raw` и шесть generic wrappers; остальные convenience-tools НП.

## Как читать результат

| Поле/код | Значение |
|---|---|
| `support_status=supported-pass`, exit 0 | Объявленные bounded проверки завершены, находок нет; semantics/runtime НП |
| `supported-findings`, exit 4 | Есть raw-weaker различия, verb-floor overrides или ручные сигналы; это не live-мутация. Код 1 никогда не значит findings |
| `error`, exit 2 | Некорректный/неполный вход; inventory unknown |
| `unsupported`, exit 3 | Профиль/commit/SHA/policy не поддержан; inventory unknown |
| `records` | Полный объявленный инвентарь, declared/catalog/raw classes, два списка подтверждений |
| `class_mismatches` | Все различия catalog/raw; `raw_stricter` — справочные и не делают findings. POST-read vs raw-write не semantic bug |
| `verb_floor_overrides` | Например DELETE declared read становится catalog write по pinned floor, raw destructive |
| `internal_semantic_flags` | Восемь заранее вручную установленных сигналов pinned источника, не автоматический полный аудит |
| `class_mismatch_summary` | Отдельные числа `raw_weaker` и `raw_stricter`; сильнее raw не значит ошибка чтения |
| `reproducibility` | Python, minor AST-профиля, SHA профиля и самого анализатора |
| `policy_evidence`, `sources` | File/line, SHA, bytes; JSON-учебный вход использует JSON pointer, не line |

Первый `confirm_write` в raw-write сохраняется. Параметры модели не доказывают независимое подтверждение человеком. Нельзя делать выводы о реальном списании/удалении/эксплойте, текущем API, CI, безопасности credentials или полноте семантического аудита.

## Проверка без сети

На macOS:

```sh
sandbox-exec -p '(version 1)(allow default)(deny network*)' python3 -B tests/run.py --network-denied --pinned-input ./my-explicit-manifest.json
```

Контроль проверяет отказ `connect` с EPERM/EACCES (создание socket само по себе может быть разрешено). После контроля audit-hook запрещает socket/subprocess/os.system и import/exec из директорий переданных исходников и их общего корня (кроме корня файловой системы); отдельный meta_path guard блокирует upstream packages. Положительные sentinel-контроли используют audit-события без выполнения чужого кода. Tests используют temp-синтетические файлы, не кабинет; входы полностью воспроизводятся тестовым кодом. Переданный pinned код читается, но не импортируется. [Сохранённый прогон](validation/tests.json): 51/51, включает full inventory и bad YAML/dynamic policy/sentinel; это тест **нашего анализатора**, не Seller API.

Версия собственного пакета — 0.1.1. Сохранённые результаты описывают анализатор, не подключение MCP и не работу Seller API.
