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 и достижимость;
- запрещённые поверхности импровизации.
Метод#
- До implementation зафиксировать AC-01–AC-08 в
README.md. - Описать genre-neutral types:
HostPreferencesнесёт только host intent, а planner-authored story graph остаётся неавторитетнымAdventureDraft. - Создать один явно non-canonical original sci-fi comedy fixture. Это контролируемый non-fantasy input, а не предложение нового product canon.
- Сначала запустить tests при отсутствующем
adventure.tsи сохранить ожидаемыйERR_MODULE_NOT_FOUND. - Реализовать два input validator-а и минимальный deterministic compiler без зависимостей или LLM.
- Mutation tests должны повредить ссылки, fail-forward и input envelope и получить точные issue codes.
- Дважды скомпилировать одинаковую пару preferences + draft, сравнить contracts и SHA-256.
- Запустить 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.