# Запуск через Node.js с отдельным журналом

Этот модуль применим на любом этапе скриптового маршрута.
Node.js запускает существующий `scripts/fill_contract.py`. Python остаётся необходим.
Сначала выполни загрузку и подготовку `.venv` по `guide/01-download.md`.
Если Node.js недоступен, используй прямые команды Python из модулей этапов.

## Проверь инструменты

1. Проверь, что доступен запуск Node.js: `node --version`.
2. Прочитай `scripts/run.mjs` из проверенного комплекта.
3. Выбери абсолютный путь приватной папки журналов в согласованной рабочей папке пользователя.
4. Папка журналов должна находиться вне папки ресурсов и вне публикуемых файлов сайта.
5. Выполняй команды из папки проверенного комплекта.

После проверки пути запуск создаёт родительские папки журналов сам и новую папку `run-…`.
При отказе до создания папки прочитай JSON ошибки в stderr: `run_directory` будет `null`.
Не добавляй shell-команды для сохранения stdout, stderr или кода завершения.
Не используй переменную shell `status`: в zsh она read-only.
Не заменяй запуск произвольным кодом заполнения Word.

## Запусти команду этапа

В команде этапа замени только начало `.venv/bin/python -I scripts/fill_contract.py` на:

```text
node scripts/run.mjs --log-dir "<абсолютная приватная папка журналов>" --
```

Оставь аргументы заполнителя в том же порядке. Замени обозначения путей фактическими значениями.
Не выполняй текст в угловых скобках буквально.

Справка самого запуска:

```text
node scripts/run.mjs --help
```

Справка заполнителя с сохранением фактического результата:

```text
node scripts/run.mjs --log-dir "<абсолютная приватная папка журналов>" -- --help
```

Привязка источников:

```text
node scripts/run.mjs --log-dir "<абсолютная приватная папка журналов>" -- "<рабочие данные.json>" --bind-sources "<карта источников.json>" --bound-data "<папка пользователя>/Данные-v1.json"
```

Предварительная проверка после привязки:

```text
node scripts/run.mjs --log-dir "<абсолютная приватная папка журналов>" -- "<привязанные данные.json>" --check
```

Создание Word только после фактического полного подтверждения:

```text
node scripts/run.mjs --log-dir "<абсолютная приватная папка журналов>" -- "<привязанные и подтверждённые данные.json>" --out "<папка пользователя>/Договор-v1.docx" --approved-sha256 "<код из ответа пользователя>"
```

Отдельная проверка Word и сохранение снимка:

```text
node scripts/run.mjs --log-dir "<абсолютная приватная папка журналов>" -- "<привязанные и подтверждённые данные.json>" --verify "<папка пользователя>/Договор-v1.docx" --approved-sha256 "<тот же код из ответа>" --snapshot "<папка пользователя>/Снимок-v1.json"
```

## Прочитай результат

При ошибке подготовки запуск завершается кодом 3 и выводит `RUNNER_SETUP` в stderr.
Прочитай `run_directory` из этого JSON: если папка создана, отчёт находится в ней; строки `RUN_LOG` в этой ветке нет.
stdout Python выводится без изменений. Его копия сохранена в `stdout.txt`.
stderr Python сохранён отдельно в `stderr.txt`. Строка `RUN_LOG=…` сообщает фактическую папку журнала.
Прочитай `result.json` из этой папки: там команда, время, `python_started`, `exit_code`, `signal` и пути вывода.
При `python_started=false` или `exit_code=null` не придумывай код Python: он не наблюдался.
При ошибке exec причина записана в `launch_error`, а `exit_code` и `process_exit_code` равны `null`.
Успех требует `python_started=true`, `exit_code=0`, отсутствия сигнала и результата ожидаемой операции.
Код 0 справки не означает, что договор создан или проверен.

При ошибке сохрани этот журнал. Исправь только установленную причину и запусти новую команду.
Не перезаписывай журнал предыдущего вызова. Не утверждай, что предыдущий вызов не создал Word, без проверки его отчёта и фактических файлов.
После любой ошибки проверь пути `file`, `existing_document`, `saved_snapshot` в фактическом выводе, если они есть.
Успешная техническая операция сохраняет статус «черновик» до полной проверки по `guide/06-review.md`.
Журналы содержат приватные данные и подтверждения. Не публикуй их и не отправляй без команды пользователя.
