# Research: генерация Adventure Contract ## Baseline Актуальный PRD фиксирует только формат: original-IP, rules-light, humorous one-shot, но не задаёт конкретный сюжет, мир или набор сцен. Для primary validation предусмотрены будущие `OS-A`/`OS-B`; их content briefs ещё не существуют. Архитектурные материалы уже требуют, чтобы LLM не был источником истины: scenario planner может предложить структуру, но не менять live state, а narrator не может самостоятельно менять канон. До prototype не существовало исполняемого формата, который проверял бы: - границу между high-level host input, planner proposal и canonical content; - ссылки facts → scenes → endings; - fail-forward и достижимость; - запрещённые поверхности импровизации. ## Метод 1. До implementation зафиксировать AC-01–AC-08 в `README.md`. 2. Описать genre-neutral types: `HostPreferences` несёт только host intent, а planner-authored story graph остаётся неавторитетным `AdventureDraft`. 3. Создать один явно non-canonical original sci-fi comedy fixture. Это контролируемый non-fantasy input, а не предложение нового product canon. 4. Сначала запустить tests при отсутствующем `adventure.ts` и сохранить ожидаемый `ERR_MODULE_NOT_FOUND`. 5. Реализовать два input validator-а и минимальный deterministic compiler без зависимостей или LLM. 6. Mutation tests должны повредить ссылки, fail-forward и input envelope и получить точные issue codes. 7. Дважды скомпилировать одинаковую пару preferences + draft, сравнить contracts и SHA-256. 8. Запустить demo и записать число scenes/endings/triggers, validation issues и hash. Контролируемые переменные: один fixture version, один runtime, отсутствие network/model calls. Проверяется структура, а не художественное качество. ## Реестр доказательств | ID | Тип | Описание | Источник, путь или команда | Дата или версия | |---|---|---|---|---| | E-001 | Fact | PRD требует original lightweight OSR и минимум два original-IP one-shots, но не фиксирует конкретное приключение | `../../docs/prd/2026-07-22-global-party-ai-rpg.md`, строки 149–152 и 331 | Updated 2026-07-24 | | E-002 | Fact | Primary protocol использует будущие placeholders `OS-A`/`OS-B` и запрещает чужие assets без прав | `../../research/global-validation/10-primary-research-protocol.md`, строка 188 | 2026-07-24 corpus | | E-003 | Measurement | RED завершился ожидаемым отсутствием implementation module | `node --experimental-strip-types --test prototype/adventure.test.ts` → `ERR_MODULE_NOT_FOUND: prototype/adventure.ts` | Node v22.14.0 | | E-004 | Measurement | Behavioral suite: 7 tests, 7 pass, 0 fail, включая rejection битого planner draft | `node --no-warnings --experimental-strip-types --test prototype/adventure.test.ts` | 2026-07-25 | | E-005 | Measurement | Demo: 4 scenes, 2 endings, 14 triggers, 0 issues; SHA-256 `3b9c78e89119c4681f4e7570131f0f5d0b993b4e1d612c822bf473b577d2c21a` | `node --no-warnings --experimental-strip-types prototype/demo.ts` | 2026-07-25 | | E-006 | Fact | Fixture preferences/draft: original, borrowed-IP-free, non-canonical; genre — science-fiction comedy | `prototype/fixtures/sci-fi-comedy.ts` | Fixture v1 | | E-007 | Fact | Compiler не вызывает LLM, сеть, RNG или filesystem; genre/premise остаются в HostPreferences, а story graph — в AdventureDraft | `prototype/adventure.ts`, `prototype/adventure-support.ts` | Prototype v1 | | E-008 | Inference | Typed graph обнаруживает исследованные broken refs и dead-end failures до session start | E-004, negative tests | 2026-07-25 | | E-009 | Measurement | Scoped strict TypeScript check завершился с exit 0 и без diagnostics | Root `node_modules/.bin/tsc --ignoreConfig ... prototype/*.ts prototype/fixtures/*.ts` | TypeScript 7.0.2, `@types/node` 24.13.3 | | E-010 | Measurement | RED для authority split упал на отсутствующем `sciFiComedyDraft` export; после реализации обеих boundaries suite стал 7/7 | Та же test command, сначала exit 1, затем exit 0 | Node v22.14.0 | ## Журнал экспериментов | Время | Изменение или попытка | Наблюдение | Artifact или evidence ID | Вывод | |---|---|---|---|---| | 2026-07-24T18:17:59Z | Первый запуск `.ts` test без strip flag | Runtime v22.14.0 вернул `ERR_UNKNOWN_FILE_EXTENSION` | Command log | Это ошибка команды, не RED поведения; нужен явный strip flag | | 2026-07-24T18:17:59Z | RED с `--experimental-strip-types` | Test runner дошёл до import и вернул `ERR_MODULE_NOT_FOUND` для `adventure.ts` | E-003 | RED подтверждён по нужной причине | | 2026-07-24T18:17:59Z | Добавлен compiler/validator | Первые 6 behavior tests прошли | E-004 | Структурная гипотеза подтверждена на fixture и mutations | | 2026-07-24T18:17:59Z | Source split после file-size signal | Runtime types и support вынесены; main implementation стал меньше 800 строк | `prototype/adventure-types.ts`, `prototype/adventure-support.ts` | Разделение не изменило behavior | | 2026-07-25 | Добавлен отдельный `AdventureDraft` boundary | RED: отсутствующий export; GREEN: 7/7 | E-010 | Host brief больше не содержит предложенный scene graph | | 2026-07-25 | Повторно выполнен demo | 0 issues; hash `3b9c78e89119c4681f4e7570131f0f5d0b993b4e1d612c822bf473b577d2c21a` | E-005 | Executable public path подтверждён после authority split | | 2026-07-24T18:17:59Z | Выполнен scoped strict typecheck | Exit 0, diagnostics отсутствуют | E-009 | Erasable TS и strict signatures подтверждены | ## Выводы - **Measurement:** AC-01–AC-08 проходят на executable fixture и mutation corpus; strict scoped typecheck чист. Основание: E-004, E-005, E-009. - **Inference:** жанр не должен быть enum или branch в compiler; он является host-authored data, а структура scenes/facts/triggers остаётся общей. Основание: E-006, E-007. - **Inference:** ни `HostPreferences`, ни `AdventureDraft` нельзя считать каноном напрямую. Только compiled contract после двух input validations получает authority markers. Основание: E-004, E-007, E-010. - **Inference:** свободная narration может быть безопасно ограничена только после projection; envelope сам по себе не заставляет LLM соблюдать правила. Основание: E-007, Unknown U-02. ## Рассмотренные альтернативы | Подход | Что проверили | Почему не выбран | Evidence | |---|---|---|---| | Free-form prompt как adventure | Сопоставление с authority requirement | Нельзя проверить refs, endings или скрытую мутацию facts | E-001, E-002 | | Fantasy-specific schema | Наличие genre-neutral fields и sci-fi fixture | Создаёт ghost constraint и не выполняет требование «любой жанр» | E-006, E-007 | | Adventure = HostPreferences | Trust-boundary analysis | Host input не должен сразу получать canonical authority | E-004, E-007 | | Новый schema/state-machine dependency | Проверена необходимая функциональность stdlib | Для graph/ref checks достаточно `Map`, `Set`, structured clone и `node:crypto`; dependency не уменьшает prototype risk | E-004, E-005 | | JSON Schema без behavioral graph validator | Сравнение structural и cross-reference needs | JSON Schema полезен для shape, но один не доказывает reachability/fail-forward | E-008 | ## Неизвестные - **Unknown U-01:** художественное качество, agency и completion реальной группы. Закрывается только content QA и пользовательскими сессиями. - **Unknown U-02:** соблюдение envelope конкретной LLM. Нужен отдельный model-eval/adversarial study. - **Unknown U-03:** semantic moderation свободных строк и доказательство прав для host-authored content. - **Unknown U-04:** миграция живого contract между schema versions. - **Unknown U-05:** соответствие scene graph фактическому 60/90-minute timebox; нужен dry-run и session telemetry.