Files
Genarrative/docs/audits/CUSTOM_WORLD_PROFILE_MAPPING_AUDIT_2026-04-18.md
kdletters cbc27bad4a
Some checks failed
CI / verify (push) Has been cancelled
init with react+axum+spacetimedb
2026-04-26 18:06:23 +08:00

19 KiB
Raw Permalink Blame History

世界 Profile 到预设内容与实时生成规则映射审计

更新时间:2026-04-18

0. 审计目标

本次审计只回答一个问题:

当前仓库里的世界 profile 设定,是否已经完整、合理地映射到游戏的预设内容与实时生成内容规则中。

这里的“世界 profile”包含两层

  1. CustomWorldProfile 顶层世界数据
  2. ownedSettingLayers 派生设定层

这里的“预设内容”包含:

  1. 角色运行时预设
  2. 场景预设
  3. 默认视觉与怪物匹配
  4. 初始装备 / 初始背包 / 经济与术语表现

这里的“实时生成规则”包含:

  1. 主剧情 prompt
  2. NPC 对话 / 招募 / 私聊 prompt
  3. 任务生成
  4. 运行时物品生成
  5. 故事线程、可见性、叙事 QA 与推进规则

1. 结论先行

结论不是“完全映射”,而是:

已完成基础映射,但没有达到“完全且合理”的程度。

当前状态更准确地说是:

  1. 世界基础骨架 -> 角色 / 场景 / 属性 / prompt 这条主链已经打通。
  2. 叙事层 -> 主剧情/NPC 可见性规则 已经有比较扎实的接入。
  3. 规则层 -> UI术语 / 经济 / 属性 已经接入。
  4. 模板兼容层 仍然过强,跨题材世界会被粗暴压回 WUXIA/XIANXIA
  5. 后端运行时任务/物品模块 只拿到了瘦身版 profile没有真正吃到完整世界叙事层。
  6. 世界级 items / faction / conflict 仍然更多是文本种子,而不是可操作的游戏内容对象。

如果按结果判断:

  1. 预设内容映射:部分完整,约 70%。
  2. 实时生成规则映射:前端剧情主链较完整,后端运行时子链不完整,整体约 60%。
  3. 跨题材合理性:明显不足。

2. 本次审计覆盖的核心文件

类型与编译链:

  • src/types/customWorld.ts
  • src/services/customWorld.ts
  • src/services/customWorldBuilder.ts
  • src/services/customWorldOwnedSettingLayers.ts
  • src/services/customWorldTheme.ts

预设内容落地:

  • src/data/characterPresets.ts
  • src/data/scenePresets.ts
  • src/data/customWorldCharacterLoadout.ts
  • src/data/customWorldRuntime.ts
  • src/data/customWorldVisuals.ts
  • src/data/customWorldNpcMonsters.ts
  • src/data/worldAttributeSchemas.ts
  • src/data/economy.ts
  • src/services/customWorldPresentation.ts

实时生成规则:

  • src/hooks/story/storyContextBuilder.ts
  • src/services/prompt.ts
  • src/services/characterChatPrompt.ts
  • src/services/questPrompt.ts
  • src/services/questDirector.ts
  • src/services/runtimeItemAiPrompt.ts
  • src/data/runtimeItemNarrative.ts
  • src/services/storyEngine/themePack.ts
  • src/services/storyEngine/worldStoryGraph.ts
  • src/services/storyEngine/actorNarrativeProfile.ts
  • src/services/storyEngine/knowledgeGraph.ts
  • src/services/storyEngine/threadContract.ts
  • src/services/storyEngine/visibilityEngine.ts
  • src/services/storyEngine/authorialConstraintPack.ts
  • src/hooks/story/progressionActions.ts

后端运行时链:

  • server-node/src/modules/ai/customWorldOrchestrator.ts
  • server-node/src/modules/runtime-item/runtimeItemModule.ts
  • server-node/src/modules/quest/runtimeQuestModule.ts
  • server-node/src/modules/runtime/runtimeSnapshotHydration.ts

3. 映射总表

设定层/字段 映射到预设内容 映射到实时生成规则 判断
name/subtitle/summary/tone/playerGoal 已映射到角色 opening、场景提示、视觉匹配、程序化物品关键词 已映射到主剧情 prompt、任务 prompt、物品 prompt、ThemePack/StoryGraph 派生 基本成立
templateWorldType/compatibilityTemplateWorldType 强影响角色模板、场景图参考池、怪物池、兼容 schema 影响 ThemePack fallback 与部分运行时回退 已接入,但合理性不足
majorFactions/coreConflicts 主要进入 ThemePack / StoryGraph / tension state未落成具体 faction 实体 影响 authorial constraints、线程图谱、任务与剧情语义 有映射,但偏文本种子
camp 已映射为开局 camp scene、camp 图、camp 连接 通过世界参考文本和开局内容进入 prompt 成立
attributeSchema 已映射到角色/NPC 属性、战斗面板、属性展示 已映射到 prompt 属性描述与运行时计算 成立
ownedSettingLayers.ruleProfile.resourceLabels 已映射到 UI 血量/法力/货币等术语 主要通过 UI/经济层体现prompt 侧间接使用 成立
ownedSettingLayers.ruleProfile.economyProfile.initialCurrency 已映射到初始货币与快照恢复 对运行时奖励规则影响弱,更多是初始化 成立但范围有限
playableNpcs 已映射到可玩角色预设、技能变体、初始物品、home scene 已映射到剧情 prompt、私聊 prompt、叙事档案 成立
storyNpcs 已映射到场景 NPC、怪物判定、角色运行时预设 已映射到遭遇 prompt、任务发布者、叙事可见性 成立
landmarks 已映射到 scene presets、连接网络、场景视觉、treasure hints 已映射到世界参考文本、scene residues、故事线程关联 成立
items 生成主链默认清空,世界级 item 几乎未形成正式内容层 knowledgeFacts 可支持 item但主链无内容可用 映射明显不足
themePack/expressionProfile 已映射到视觉/命名/技能名/场景语义 已映射到 prompt 基调、reveal 风格、故事图谱 成立
referenceProfile.roleArchetypes 已映射到角色模板骨架选择 运行时规则直接消费较少 部分成立
referenceProfile.sceneBuckets 已映射到场景默认图匹配 运行时 prompt 直接消费较少 部分成立
referenceProfile.creatureArchetypes 已映射到怪物 preset 池筛选 运行时规则间接消费 部分成立
storyGraph 预设层主要影响 narrative residues 与 faction tension 已映射到 active threads、constraints、visibility、chapter/campaign 成立
narrativeProfile 已映射到 scene NPC 简介和遭遇资料 已映射到 prompt 可见性、任务/物品关系生成 成立
knowledgeFacts 不直接生成预设内容 已映射到 visibility slice 与 prompt 裁剪 成立
threadContracts 不直接生成预设内容 已映射到 story signal / thread update / QA 成立
creatorIntent/anchorPack/lockState/anchorContent 主要留在创作工作区与结果页整理 几乎不直接进入正式游戏运行时 创作层有用,运行时映射弱

4. 已经成立的映射链

4.1 世界基础骨架已经能稳定进入角色、场景与剧情主链

CustomWorldProfile 的基础字段已经不是“只存档不消费”的状态。

它们已经实际进入:

  1. 角色开局文案与 opening 动机
  2. 角色技能变体
  3. 场景预设名称、描述、连接、treasure hints
  4. 主剧情 prompt 中的世界补充档案
  5. 私聊 / 任务 / 运行时物品 prompt 的世界摘要

这说明:

世界 profile 的基础文本层已经真正进入游戏主链。


4.2 规则层已经落到真实游戏表现

ownedSettingLayers.ruleProfile 目前已真实影响:

  1. attributeSchema
    • 角色/NPC 属性计算
    • prompt 中的属性描述
    • 面板展示
  2. resourceLabels
    • HP/MP/伤害/冷却/货币等 UI 术语
  3. economyProfile.initialCurrency
    • 自定义世界初始货币
    • 快照恢复时的默认初始化

这部分不是空壳。

规则层已经从 profile 进入真实结算和 UI。


4.3 叙事层已经进入 prompt 可见性与推进规则

themePack -> storyGraph -> narrativeProfile -> knowledgeFacts -> visibilitySlice 这条链已经是当前自定义世界最完整的一条映射链。

它已经支撑:

  1. NPC 首遇/低披露 prompt 裁剪
  2. 当前线程可见性控制
  3. 当前压力、错位、禁区、已解锁章节等信息分层
  4. 章节/战役/约束/QA 的继续推进

这说明:

世界 profile 里的叙事层不只是展示文本,而是真的在控制“模型这轮能知道什么、不能知道什么”。


5. 关键问题

5.1 高优先级问题:模板兼容层仍然是二元锚点,跨题材世界会被错误压缩

当前主生成链仍要求模型输出:

  • templateWorldType: WUXIA | XIANXIA

而兼容解析也会把世界最终压回:

  1. arcane -> XIANXIA
  2. 其它几乎全部回到 WUXIA

这会直接影响:

  1. 角色模板骨架选择
  2. 场景默认图参考池
  3. 怪物 preset 池
  4. 兼容性 fallback

问题不在“有兼容字段”,而在于:

当前兼容字段仍然过度参与真实内容映射。

对现代金融、科幻 AI 战争、校园、都市、调查等题材来说,这种二元压缩并不合理。

仓库日志里已经出现了典型样本:

  1. 股市世界被要求产出 XIANXIA
  2. AI 战争世界也被要求产出 XIANXIA
  3. 魔法科技融合世界被要求产出 WUXIA

这意味着:

世界 profile 虽然支持跨题材文本输入,但底层预设内容映射仍带着明显的“武侠/仙侠残余偏置”。

相关文件:

  • server-node/src/modules/ai/customWorldOrchestrator.ts
  • src/services/customWorldTheme.ts
  • src/data/customWorldVisuals.ts
  • src/data/customWorldNpcMonsters.ts
  • src/data/characterPresets.ts

判断:

这是当前“合理映射”最大缺口。


5.2 高优先级问题:后端运行时任务/物品模块只消费了瘦身版 world profile

前端剧情主链里,customWorldProfile 会带着:

  1. themePack
  2. storyGraph
  3. knowledgeFacts
  4. threadContracts
  5. ownedSettingLayers

但后端运行时模块里:

  1. runtimeItemModulecustomWorldProfile 只有 { name, summary }
  2. runtimeQuestModulecustomWorldProfile 也只有 { name, summary }

这直接导致后端运行时生成无法真正读取:

  1. 世界线程图谱
  2. 世界可见性事实
  3. 参考原型层
  4. 规则层
  5. 表达层

结果是:

  1. 主剧情/NPC prompt 已经较强依赖世界叙事层
  2. 但后端任务/物品生成还只是吃世界摘要

这会把系统拆成两种强度不同的世界消费链:

  1. 前端剧情链较“懂世界”
  2. 后端运行时奖励链较“不懂世界”

相关文件:

  • src/hooks/story/storyContextBuilder.ts
  • src/services/runtimeItemAiPrompt.ts
  • src/services/questPrompt.ts
  • server-node/src/modules/runtime-item/runtimeItemModule.ts
  • server-node/src/modules/quest/runtimeQuestModule.ts

判断:

世界 profile 到实时生成规则的映射,在后端链路上是不完整的。


5.3 高优先级问题:世界级 items 没有真正接进主生成链

类型里存在:

  • CustomWorldProfile.items

构建器也支持:

  1. item 归一化
  2. attributeResonance
  3. item knowledge facts

但真正的世界生成主链里:

  1. orchestrator prompt 明确要求不要预生成物品档案
  2. attachRuntimeGenerationMetadata(...) 会把 items 直接压成空数组

这会带来两个结果:

  1. 世界 profile 的“世界级物品层”几乎为空
  2. 运行时背包、掉落、交易更多依赖程序化生成和角色初始物品

于是目前的物品系统更像:

  1. 有角色初始物品
  2. 有运行时程序化物品
  3. 但没有稳定的“世界物品图谱”

这意味着:

世界 profile 在物品层没有形成完整映射。

相关文件:

  • server-node/src/modules/ai/customWorldOrchestrator.ts
  • src/services/customWorldBuilder.ts
  • src/data/customWorldRuntime.ts
  • src/data/customWorldCharacterLoadout.ts
  • src/services/storyEngine/knowledgeGraph.ts

判断:

这是“预设内容”和“实时生成规则”共同缺失的一块。


5.4 中优先级问题:majorFactions/coreConflicts 仍然是文本种子,不是可操作游戏对象

当前 majorFactionscoreConflicts 已经被大量消费,但主要消费方式是:

  1. 拼进 ThemePack
  2. 派生 WorldStoryGraph
  3. 派生 AuthorialConstraintPack
  4. 派生 FactionTensionState

问题在于它们还没有形成:

  1. 可索引 faction 实体
  2. faction 与 NPC 的显式归属关系
  3. faction 与场景/商店/敌对阵营的显式绑定
  4. 冲突与任务/势力状态的强约束关系

当前更多是:

“文本里提到过 -> 图谱做字符串匹配 -> 运行时拿去写 prompt”

而不是:

“世界里真的存在这些派系与冲突对象,并驱动交互规则”

相关文件:

  • src/services/storyEngine/themePack.ts
  • src/services/storyEngine/worldStoryGraph.ts
  • src/services/storyEngine/factionTensionState.ts

判断:

已有映射,但离“完全落地”为具体游戏内容对象还有明显距离。


5.5 中优先级问题:场景预设会额外注入模板怪物,弱化 landmark 的原始设定控制力

buildCustomScenePresets(profile) 在每个 landmark scene 中,除了把 landmark.sceneNpcIds 指向的角色放进去,还会:

  1. 从怪物 preset 池按 scene index 截两只怪
  2. 直接拼进 combinedNpcs

这意味着即使 profile 本身没有明确要求某个 landmark 出现这些敌对实体,运行时场景仍会被额外补入模板怪物。

这会导致:

  1. 场景内容不完全由 landmark + storyNpcs 决定
  2. 地标设定与实际可战斗内容之间存在偏移
  3. 跨题材世界会更容易被模板怪物池拖偏

相关文件:

  • src/data/scenePresets.ts
  • src/data/customWorldNpcMonsters.ts

判断:

landmark 到实际场景实体池的映射,不是完全忠实映射,而是“设定 + 模板补丁”。


5.6 中优先级问题:后端运行时物品线程并不是真正世界线程

前端剧情链里的 activeThreadIds 来自:

  1. storyEngineMemory
  2. storyGraph
  3. knowledgeFacts
  4. visibilitySlice

但后端 runtimeItemModule 的 loose context 里,activeThreadIds 只是:

  1. thread:${encounter.id}
  2. thread:${scene.id}

这不是世界线程图谱,而是临时合成 id。

结果是:

  1. 名义上后端物品模块也有“active threads”
  2. 实际上它拿到的并不是 WorldStoryGraph 中的真实线程

这会让运行时物品的“为什么现在出现”更像局部上下文推断,而不是来自世界故事结构。

相关文件:

  • server-node/src/modules/runtime-item/runtimeItemModule.ts

判断:

这是实时生成规则层的结构性弱映射。


5.7 中优先级问题:referenceProfile.roleArchetypes 只从 playableNpcs 派生storyNpcs 覆盖不够

当前 roleArchetypes 的编译来源是:

  1. profile.playableNpcs.slice(0, 6)

而不是:

  1. playableNpcs + storyNpcs 的综合原型池

这导致两个问题:

  1. 世界里的长尾 story NPC 原型没有进入 reference archetype 编译
  2. 某些场景角色/怪物/平民的模板骨架选择更多依赖启发式 fallback

这会让:

  1. 可玩角色映射较稳定
  2. 长尾场景角色映射不够稳定

相关文件:

  • src/services/customWorldOwnedSettingLayers.ts
  • src/services/customWorldReferenceSignals.ts
  • src/data/characterPresets.ts

判断:

参考层映射存在明显“主角优先、长尾不足”的偏差。


5.8 低优先级问题:创作元数据并未进入正式游戏运行时

creatorIntent / anchorPack / lockState / anchorContent 当前主要服务于:

  1. 创作工作区
  2. Agent session
  3. 结果页和编辑器

它们对正式运行时的直接作用主要是:

  1. 参与 ownedSettingLayers 的编译

但不会直接变成:

  1. 正式战斗规则
  2. 场景交互规则
  3. faction 状态
  4. 任务目标约束

这不一定是 bug但如果把“世界 profile 设定”理解为所有 profile 元数据,那么:

创作层数据目前并没有完整进入游戏运行时。


6. 分层判断

6.1 预设内容映射判断

已经合理接入的部分

  1. 可玩角色
  2. 场景角色
  3. 地标场景
  4. 属性 schema
  5. 资源术语
  6. 初始货币
  7. camp 开局归处
  8. 默认场景图匹配

仍然不足的部分

  1. 世界级 items
  2. faction 实体化
  3. 冲突到任务/场景状态的强绑定
  4. 跨题材世界的模板偏置问题
  5. 地标与怪物注入之间的忠实性

结论:

预设内容层是“能跑且已有骨架”,但还不是“设定完全落地”。


6.2 实时生成规则映射判断

已经合理接入的部分

  1. 主剧情 prompt
  2. NPC 可见性控制
  3. 私聊与对话 prompt
  4. 叙事线程图谱
  5. 事实图谱
  6. 作者性约束与 QA

仍然不足的部分

  1. 后端任务模块 world profile 过瘦
  2. 后端物品模块 world profile 过瘦
  3. 后端物品线程是伪线程
  4. 世界级 item 图谱为空
  5. faction/conflict 仍偏语义层,不够规则化

结论:

实时生成规则层呈现出“前端剧情链强、后端奖励链弱”的不均衡状态。


7. 最终判定

如果问题是:

“世界 profile 设定是否已经完全地、合理地映射到游戏的预设内容、实时生成内容规则中?”

我的结论是:

没有。

更准确地说:

  1. 已经完成了主干映射。
  2. 但还没有完成全量映射。
  3. 也还没有完成跨题材下的合理映射。

当前系统最准确的状态是:

世界 profile 已经成为真实驱动源之一,但还没有成为所有预设内容与实时规则的一致单一真相源。


8. 建议的修复优先级

P1先补“真实消费不完整”的链路

  1. 让后端 runtimeItemModule / runtimeQuestModule 接收完整 customWorldProfile 子集
  2. 至少补进:
    • ownedSettingLayers
    • storyGraph
    • knowledgeFacts
    • themePack
    • majorFactions/coreConflicts

P1templateWorldType 退回兼容字段,而不是主导字段

  1. 生成期保留兼容输出
  2. 运行时优先读取:
    • ownedSettingLayers
    • themeMode
    • referenceProfile
  3. 不再让 WUXIA/XIANXIA 主导现代/科幻/海洋/裂界世界的视觉与怪物选择

P1补世界级 item 层

  1. 允许世界生成阶段产出一批世界级 items seed
  2. knowledgeFacts / runtime item / quest reward / treasure hint 能挂到这些 seed 上
  3. 形成“世界物件图谱”,而不是只有角色初始物品和程序化临时物品

P2把 faction/conflict 从文本种子升级成结构对象

  1. faction 实体
  2. faction -> NPC 归属
  3. faction -> 场景控制
  4. conflict -> 任务/线程/场景压力绑定

P2去掉地标场景里的固定模板怪物补丁式注入

  1. 优先使用 landmark 自己的敌对角色设计
  2. 模板怪物只作为缺口补位
  3. 补位也要受 landmark/theme/thread 约束

P3扩充 reference archetype 的来源

  1. role archetypes 不只从 playableNpcs 编
  2. storyNpcs 也应参与 archetype 归纳
  3. 为平民、敌对、怪物、势力成员建立更细 archetype

9. 一句话总评

当前世界 profile 已经能驱动游戏,但还没有彻底收束成“所有预设内容与实时生成规则都优先读取它”的单一真相源。主链可用,边链仍散,跨题材合理性仍偏弱。