# Генерация Adventure Contract из HostPreferences и AdventureDraft - **Status:** `complete` - **Outcome:** `pass` - **Started:** 2026-07-25 - **Updated:** 2026-07-25 - **Research ID:** `2026-07-25-adventure-contract-generation` ## Проверяемый вопрос Можно ли детерминированно объединить недоверенный, жанрово-нейтральный `HostPreferences` и предложенный planner-ом `AdventureDraft` в исполнимый `AdventureContract`, который: - отделяет пожелания хоста от канонических story facts; - задаёт сцены, ветвления, triggers, clocks, endings и fail-forward; - ограничивает импровизацию модели; - отклоняет битые ссылки и тупиковые failure-переходы; - не предполагает fantasy, D&D, Knave или чужой IP? ## Почему решение нужно сейчас AI GameMaster не может сочинять канон во время применения хода. До интеграции rules/state ядра нужен формат, который превращает творческий ввод хоста в версионированный и проверяемый сценарный граф. Без этой границы невозможно доказать, что narration не меняет факты, условия финала или доступ к секретам. ## Scope - Контракты `HostPreferences`, `AdventureDraft` и `AdventureContract`. - `HostPreferences` содержит только творческий brief, session envelope и content boundaries; сцены и факты остаются в неавторитетном draft. - Детерминированный compile boundary без LLM и внешних сервисов. - Story facts с visibility и запретом прямой мутации. - Characters, scenes, typed exits, triggers, clocks и ending states. - Fail-forward для каждого failure exit. - Improvisation envelope, защищающий canonical surfaces. - Проверка ссылочной целостности и достижимости сцен/финалов. - Оригинальный sci-fi comedy fixture как доказательство non-fantasy support. ## Non-goals - Генерация художественно качественного сценария моделью. - Выбор production ruleset, balance, combat math или dice probabilities. - Product canon: fixture не является канонической игрой или приключением. - Проверка map topology; она вынесена в соседнее исследование. - Заимствование сеттингов, персонажей, терминов или модулей третьих лиц. ## Критерии успеха Критерии зафиксированы до реализации prototype. | ID | Обязательный критерий | Порог или ожидаемое поведение | Способ проверки | |---|---|---|---| | AC-01 | Валидный genre-neutral compile | Original sci-fi comedy preferences + draft компилируются с `0` validation issues | `node --test prototype/adventure.test.ts` | | AC-02 | Determinism | Одинаковый input даёт глубокое равенство contract и одинаковый SHA-256 | Автотест с двумя независимыми compile | | AC-03 | Referential integrity | Неизвестные fact, scene, clock, character и ending IDs в draft/contract отклоняются структурированными кодами | Негативные автотесты | | AC-04 | Fail-forward | Каждый failure exit имеет consequence и ведёт в следующую сцену либо ending | Graph validation + автотест | | AC-05 | Reachability | Все сцены и endings достижимы из единственной opening scene | Graph validation + автотест | | AC-06 | Bounded improvisation | Contract запрещает narration менять story facts, rules, map topology, visibility и ending conditions | Автотест protected surfaces | | AC-07 | Non-canonical provenance | Fixture маркирован как original test fixture и `isCanonical: false` | Автотест provenance | | AC-08 | Boundary rejection | Пустые обязательные host fields, невалидный session envelope и битый planner draft не компилируются | Негативные автотесты обеих input boundaries | ## Рабочие гипотезы - **Hypothesis H-01:** typed graph и runtime validator делают битые ссылки и dead-end failures наблюдаемыми до запуска сессии. Подтверждение: AC-03–AC-05. - **Hypothesis H-02:** genre-specific content можно полностью оставить в данных, а compiler сохранить genre-neutral. Подтверждение: AC-01 и отсутствие fantasy/ruleset констант в compiler. - **Hypothesis H-03:** явный improvisation envelope позволяет LLM описывать подтверждённые события, не расширяя канон. Prototype проверяет структуру envelope, но не качество реальной модели. ## Материалы - [Исследование и evidence log](RESEARCH.md) - [Техническое решение и запуск](SOLUTION.md) - [Проверка и итог](VALIDATION.md) - [`prototype/`](prototype/) — исполнимый артефакт ## Итог `pass`: genre-neutral boundary детерминированно компилирует high-level host brief и original sci-fi comedy planner draft, отклоняет исследованные broken refs/dead-end failures и защищает canonical surfaces от narration. Suite: 7/7; demo: 0 issues; SHA-256 `3b9c78e89119c4681f4e7570131f0f5d0b993b4e1d612c822bf473b577d2c21a`. Основание: E-003–E-008. ## Ограничения - Валидный граф не доказывает, что история интересна или помещается в timebox. - Свободные строки не проходят semantic moderation или fact checking. - SHA-256 подтверждает одинаковую сериализацию, но не юридические права. - Runtime prototype проверен на Node.js 22.14 type stripping и не является production package. ## Следующее решение Принять boundary как candidate input для content/map validator и rules-state vertical slice; перенос выполнить отдельной production-задачей, а fixture оставить только тестовым.