# Дополнительный локальный workflow Основной маршрут: сначала выполните задачу в своём ИИ, сохраните четыре файла в `student/output/first/`, затем проверьте их. Этот workflow необязателен. Его скрипты работают с локальной учебной карточкой, не с LMS, рекламным кабинетом, CRM или рабочим таскменеджером. Архив workflow содержит **только** эту публичную инструкцию, неизменные `task_manager.py` и `model_worker.py`. Здесь нет тестов, готовых ответов, журнала преподавателя или заранее принятого результата. ## Расположение и требования Распакуйте архив студента и архив workflow **в одну выбранную пустую папку**. Worker зависит от соседнего `student/OUTPUT-CONTRACT.md`, поэтому одного workflow-архива для автоматического маршрута недостаточно. ```text ваша-папка/ student/ input/ # пять исходников prompts/ OUTPUT-CONTRACT.md README.md SELF-CHECK.md output/first/ # свои четыре результата, создайте сами workflow/ README.md task_manager.py model_worker.py ``` Все команды ниже выполняйте из `ваша-папка/`. Скрипты используют стандартную библиотеку Python 3; имя `python3` замените именем своего установленного Python 3, если оно другое. Историческая проверка была на macOS / Python 3.13. Работа на других ОС отдельно не подтверждена. В ИИ открывайте только `student/`, чтобы не смешивать исходники с локальными журналами и собственной сверкой. ## Маршрут A: прикрепить свои файлы без автоматического вызова модели Создайте новую локальную карточку и переведите её в стадию работы: ```sh python3 workflow/task_manager.py init --state-dir attachment-state --inputs student/input python3 workflow/task_manager.py start --state-dir attachment-state --inputs student/input ``` `init` требует новую папку состояния и фиксирует исходные байты. `start` **только меняет стадию**: он не выполняет маркетинговую задачу и не вызывает модель. Ваши файлы должны уже быть сохранены по основному маршруту: ```text student/output/first/ad-pack.json student/output/first/handoff.md student/output/first/landing-facts.md student/output/first/open-questions.md ``` После сохранения перечитайте все четыре файла и `student/SELF-CHECK.md`. Скопируйте шаблон сверки из `student/OUTPUT-CONTRACT.md` в **собственный** `actual-review.json` в общей папке. Заполните: - `task_id` из реально прочитанного `student/input/task.json`; - `reviewer` — кто фактически проверял; `reviewer_kind:"human_self_review"` для собственной ручной сверки; - `input_sha256` — пять реальных SHA256 входов, ключи `brief.md`, `company.json`, `package-brief.json`, `query-intents.csv`, `task.json`; - `output_sha256` — четыре реальных SHA256 результатов, ключи ровно имена четырёх файлов; - шесть критериев — `true` только после реальной проверки каждого пункта; - `decision:"accepted_for_local_demo"` — только если все пункты действительно выполнены. До проверки оставьте `PENDING`; если обнаружили ошибку, исправьте отдельную копию, а не заполняйте принятую сверку заранее. Для реальных хешей сохраните этот код как `file-hashes.py` в общей папке и выполните `python3 file-hashes.py`. Он читает реальные байты пяти входов и четырёх уже сохранённых результатов, ничего не изменяет и не вызывает модель: ```python from pathlib import Path import hashlib, json names = { "input_sha256": ("student/input", ["brief.md", "company.json", "package-brief.json", "query-intents.csv", "task.json"]), "output_sha256": ("student/output/first", ["ad-pack.json", "handoff.md", "landing-facts.md", "open-questions.md"]), } print(json.dumps({key: {name: hashlib.sha256((Path(folder) / name).read_bytes()).hexdigest() for name in files} for key, (folder, files) in names.items()}, ensure_ascii=False, indent=2)) ``` Когда собственная сверка действительно завершена: ```sh python3 workflow/task_manager.py submit --state-dir attachment-state --inputs student/input --results student/output/first --review actual-review.json python3 workflow/task_manager.py read --state-dir attachment-state ``` Менеджер проверяет структуру, расчёт, набор файлов, контрольные суммы и поля сверки. Он не устанавливает личность проверяющего и не доказывает честность смысловой сверки. `completed_local_preparation` / `done` означает только приёмку локальных учебных документов; запуск рекламы всё ещё удерживается неизвестными параметрами. Для проверки повтора выполните **тот же `submit` ещё раз**, не новую генерацию. Если входы, результаты и сверка неизменны, будет `repeat_noop`, одна карточка и прежние четыре артефакта. При изменении входов старый принятый результат сохраняется, а запрос даёт hold; новую версию выполняйте в новой папке задачи с новой попыткой и её сверкой. Не пытайтесь проставить старое done для новых исходников. ## Маршрут B: необязательный пример с настоящим Codex CLI Это отдельный технический маршрут. Он **реально вызывает** модель через ваш авторизованный аккаунт и может расходовать лимиты или деньги. Исторически пример проверялся с **Codex CLI `0.162.0-alpha.17.2` и Python 3.13**. Совместимость с произвольной установленной или стабильной версией не обещается. Нужна собственная корректная авторизация; токены и пароли не вставляйте в инструкцию или школьный чат. До первого `run` проверьте свою установку без вызова модели: ```sh codex --version codex --help codex exec --help ``` Worker по умолчанию ищет `codex` в PATH. При другом имени/пути передайте его через `--codex`: например `--codex /your/compatible/codex` **с заменой на свой реальный путь**. Для такого пути проверки `--version`, `--help` и `exec --help` выполняйте тем же выбранным бинарным файлом. В текущем неизменном worker вызов содержит: ```text -a never --no-daemon exec --ignore-user-config --ephemeral --skip-git-repo-check --sandbox read-only --color never --json --output-schema FILE --output-last-message FILE --cd FOLDER - ``` Если CLI не поддерживает эти флаги или нет нужной авторизации, оставайтесь на маршруте A. Не убирайте `--no-daemon`, `--ignore-user-config`, `--ephemeral` или sandbox ради запуска; это изменит условия примера. Проверка версии и help не является доказательством успешного выполнения модели. Только при совместимой установке и своём решении использовать модель выполните один раз, с новой папкой состояния: ```sh python3 workflow/model_worker.py run --state-dir cli-state --inputs student/input ``` Worker создаёт входную папку из пяти файлов, читает соседний контракт и вызывает CLI. Модель получает ограничения на использование бизнес-сервисов; сам вызов провайдера использует ваш доступ и не является полностью офлайн. Это **не нативное выполнение в Antigravity** и не подключение реального API задач. Четыре строки ответа сохраняются как четыре UTF-8 файла без редактирования в `cli-state/model-run/first/`. Успешный первый вызов заканчивается `model_result_frozen_review_pending` / `first_frozen_awaiting_independent_review`, **ещё не done**. Журналы/первый ответ остаются локально у вас. Автоматическая приёмка требует отдельную **реальную независимую агентную сверку** этих файлов с входами и контрактом. Для хешей автоматического результата используйте код из маршрута A, заменив **только папку `output_sha256`** с `student/output/first` на `cli-state/model-run/first`. Папка `input_sha256` остаётся `student/input`; ключи четырёх файлов остаются прежними. Не считайте хеши отсутствующих или иных ручных результатов вместо реально сохранённого ответа worker. Подготовьте `actual-independent-review.json` с той же структурой, этими точными SHA и правдивыми критериями, но `reviewer_kind:"independent_agent_review"`. Не выдавайте собственный human_self_review за независимую проверку и не поручайте первому генератору заполнить её вместо проверяющего. Если отдельной проверки нет, оставьте автоматический результат pending. Можно отдельно прикрепить эти же файлы к ручной карточке по инструкции ниже; запись worker при этом не меняется и не становится принятой. После выполненной независимой сверки: ```sh python3 workflow/model_worker.py accept --state-dir cli-state --inputs student/input --review actual-independent-review.json ``` При принятом неизменном результате повтор прежнего `run` даёт `repeat_noop` и `new_model_invocations:0`; это проверка повторного использования, не просьба ещё раз выполнить работу. Ошибка, timeout или прерывание сохраняются. Не перезапускайте вслепую: сначала изучите сохранённый исход и фактический процесс. Скрипт не начинает второй вызов из прежней папки по одному файловому маркеру. ### Отдельная ручная сверка уже сохранённого ответа worker Если хотите проверить автоматические файлы сами, сохраните их исходную копию в `cli-state/model-run/first/` и перечитайте все четыре по `student/SELF-CHECK.md`. Для отдельного `actual-human-review-from-cli.json` возьмите шаблон из контракта, заполните `reviewer_kind:"human_self_review"` и реальные критерии. Хеши считайте с `input_sha256` из `student/input`, а `output_sha256` из **`cli-state/model-run/first`**, как описано выше. Это собственная ручная сверка, не независимая автоматическая приёмка. Для принятых после реальной сверки файлов создайте новую ручную карточку и явно укажите их настоящее расположение: ```sh python3 workflow/task_manager.py init --state-dir attachment-from-cli-state --inputs student/input python3 workflow/task_manager.py start --state-dir attachment-from-cli-state --inputs student/input python3 workflow/task_manager.py submit --state-dir attachment-from-cli-state --inputs student/input --results cli-state/model-run/first --review actual-human-review-from-cli.json python3 workflow/task_manager.py read --state-dir attachment-from-cli-state ``` Новый вызов модели здесь не выполняется. Прежний worker и его pending-запись остаются сохранены отдельно. Если нужны исправления, сначала скопируйте четыре файла в новую папку результата, отредактируйте копию и используйте **её** путь и хеши для ручного `--results`/сверки; не меняйте первую попытку worker. ## Границы Оба маршрута — добровольная техническая практика. Собственная или независимая локальная сверка не является школьной оценкой, разрешением бюджета, модерацией площадки или подтверждением публикации. При неизвестной обязательной цене — hold, не выдуманный результат. При изменённых источниках — новая попытка и проверка. Никакого автоматического импорта, сообщения клиенту, расхода рекламного бюджета или публикации эти примеры не выполняют.