引入上下文片段、固定槽与投影排序,并完善机遇裁定与游玩期 UI。

把创作产物收敛为可挂载片段与 play_slots/context_order,同步修订世界模拟器模块与运行时拼装。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-03 01:36:32 +08:00
parent 00dfcb6615
commit 94f67fa744
69 changed files with 7786 additions and 1283 deletions

View File

@@ -3,30 +3,46 @@
## 定位
**不是** play 时加载的 `workers/*/SKILL.md`
**是** 谈【剧本】、`设计.worker集` 时合并的 **默认建议**context、outputs、职责摘要。
**是**`设计.worker集` 时合并的 **默认建议**context、outputs、职责摘要。
| 层 | 权威来源 |
|----|----------|
| 本局 play 怎么跑 | 用户 accept 的 **`设计.worker集`** |
| 本局 play 怎么跑 | 用户 accept 的 **`设计.worker集`**(优先 `play_slots` + workers |
| 可选模板 | 本目录 `{ref}.yaml` — 未写全 `context`/`outputs` 时合并 |
Runtime 执行时读 Worker 集条目,不直接读本目录。
## 文件
## 世界模拟固定槽(推荐)
规格里写 `play_slots`,由程序展开为 workers
```json
{
"play_slots": { "gm": true, "narrator": true, "perspective": false, "chance": false },
"workers": []
}
```
| 槽 | 默认 ref | 模板 |
|----|----------|------|
| gm | `world-simulator` | `world-simulator.yaml` — 裁决包 settlement.v1 |
| narrator | `narrator` | `narrator.yaml` — 只读裁决包写正文 |
| perspective | `role-decide` | `role-decide.yaml` — 可选知密视角 |
| chance按需 | `chance` | `chance.yaml` — 程序骰子/抽签/比点;不进每轮管线 |
变量 / Progressive**不是**独立 LLM 模板;见 `docs/progressive-data-design.md`(真值 + side_effects
## 其它文件
| 文件 | 说明 |
|------|------|
| `world-simulator.yaml` | 世界推进 / 裁决 |
| `narrator.yaml` | 转述 / 展示 |
| `role-decide.yaml` | 单角色决策 |
| `round-present.yaml` | 结构化回合陈述 |
| `chance.yaml` | 机遇裁定(按需程序工具) |
| `round-present.yaml` | 结构化回合陈述(可选) |
| `opening-generator.yaml` | 开局生成器(创作末尾) |
| `outline.yaml` | 大纲 / 细纲 |
| `chapter-writer.yaml` | 章节正文 |
| `outline.yaml` / `chapter-writer.yaml` | 扩写路径固定槽 |
## 用法
1. 按用户意图选 `ref`
2. `{ref}.yaml` 填默认字段
3. 用户特殊需求覆盖后写入 Worker 集
4. accept 后声明即实例规格
1. 世界模拟:勾选 `play_slots`,按需覆盖某 ref 的 context/outputs
2. 扩写等:仍可用自由 `workers[]` 或另一套槽约定
3. accept 后声明即实例规格

View File

@@ -0,0 +1,22 @@
id: chance
label: 机遇裁定
role: chance
duty: >
按需程序工具:掷骰、点数比拼、抽签/加权抽取。不进每轮管线;由编排器
run_workerworkerContext.chance 或黑板 运行.机会请求)调用。禁止模型编造随机。
when: 需要真随机或可复核比点时
suggested_context:
static:
- 设计.worker集
dynamic:
- 运行.机会请求
suggested_outputs:
- 运行.本轮.机遇
prompt_excerpt: |
本执行单元由程序实现,不走 LLM。
请求形状chance.v1 入参):
- roll: { "op":"roll", "expression":"2d6+1", "reason":"可选" }
- compare: { "op":"compare", "left":14, "right":12, "mode":"gte" }
- draw: { "op":"draw", "pool":["甲","乙"], "count":1, "unique":true }
- pick: { "op":"pick", "items":[{"id":"a","weight":2},{"id":"b"}], "count":1 }
结果写入「运行.本轮.机遇」schema: chance.v1

View File

@@ -1,23 +1,24 @@
id: narrator
label: 转述 / 展示
label: 叙事转述
role: transcription
duty: >
读世界层 / 中间 tag按 Worker 集 presentation 组装 输出.用户展示
只改表达,不改事实(除非用户要求摘要压缩)。
when: 核心层产出齐、尚无本轮 输出.用户展示
只读「运行.本轮.裁决」结构化包 + 文风/叙事常驻,组装输出.用户展示」。
只改表达,不改事实、不补裁决、不读完整真值表(除非包内已写明可见后果)。
when: 主世界层裁决包已写入
suggested_context:
static:
- 设计.worker集
- 设计.叙事指南与故事推进
- 设计.叙事指南
dynamic:
- 运行.事件流
- 运行.本轮.裁决
- 变量.当前
- 用户.最新输入
suggested_outputs:
- 输出.用户展示
presentation_hints:
mode: prose | markdown | mixed
tone: 依 Worker 集 presentation
tone: 依 Worker 集 presentation / 叙事指南
prompt_excerpt: |
你是面向用户的展示编排者。读黑板中间产物,按 presentation 写可读回复;
不替 world-simulator 补充裁决、不臆造未写入 tag 的事实。
你是面向用户的叙事转述。输入是结构化裁决包settlement.v1不是自由发挥的世界真相。
按文风写可读正文;禁止写出 do_not_say禁止编造包中没有的事实或变量。
若裁决包含 tone_hint / npc_moves须体现在叙述中。

View File

@@ -2,12 +2,13 @@ id: opening-generator
label: 开局 · 开场白
stage: design-end
duty: >
创作末尾:结合已定世界/故事设定与表结构,写出开场白(主产物)
初值与开场同真相,能推断则推断。不是填表工具。
创作末尾:优先落库设计.开场白与开场变量;否则现写开场白
初值与开场同真相。不是填表工具。
when: Worker 集 accept 后、进 play 前design_end 或 workers 声明启用时
suggested_context:
static:
- 设计.worker集
- 设计.开场白与开场变量
- 用户.需求
- 上下文.定稿摘要
dynamic:
@@ -20,6 +21,5 @@ suggested_outputs:
- 运行.初始变量
- 变量.当前
prompt_excerpt: |
主产物是开场白:扎根已有世界与故事,把玩家放进可行动的第一拍
表是配套:与开场事实一致;普通大学生等可推出的别问。
禁止先问卷填表再糊开场;禁止开场与表打架。
若有设计.开场白与开场变量:落库开场白全文与开场变量,遵守正文组成版式
若无:现写开场,表与开场同真相。禁止先填表再糊开场。

View File

@@ -1,23 +1,30 @@
id: world-simulator
label: 世界模拟
label: 世界
role: core
duty: >
中立世界层:读用户输入与当前状态,按 Worker 集 / notes 中的规则推进事件、
裁决组合结果;输出客观、干巴,默认叙事质量低(常需 narrator 转述)
when: 每轮用户输入后,或 tag_flow 要求产出本轮实质内容时
中立世界层:读用户输入、真值与 Progressive 投影,按规则推进并产出结构化裁决包
settlement.v1 → 运行.本轮.裁决);可提议变量变更;默认不写文学正文
when: 每轮用户输入后
suggested_context:
static:
- 设计.worker集
- 用户.需求
- 设计.变量设计与更新规则
dynamic:
- 用户.最新输入
- 运行.事件流
- 变量.当前
- 运行.初始变量
- 上下文.角色态度
- 大纲.当前章
suggested_outputs:
- 运行.本轮.裁决
- 运行.事件流
- 运行.本轮.变量变更
prompt_excerpt: |
你是中立世界层,不是文学作者。只对规则与已提交输入作机械反应;
不写角色内心、不做剧情化推演。输出可复核的客观事实与状态变化。
叙事质量 intentionally 低——转述交给 narrator若 Worker 集启用)。
你是中立世界层GM,不是文学作者。读真值与已投影上下文,对用户行动作可复核裁决。
「运行.本轮.裁决」必须是 JSONschema 为 settlement.v1至少尽量包含
player_action、resolved[]、visible_now、npc_moves[]、variable_changes[]、do_not_say[]、tone_hint。
叙事质量 intentionally 低——用户正文交给 narrator。
需要真随机(骰子/抽签/比点不要自己编结果依赖已启用的机遇裁定chance
写出的「运行.本轮.机遇」,或由编排器先 run_worker chance。
不要把未投影的分档长文整表塞进输出;只写本轮可见后果。