接通主角绑定、开场封印与游玩辅助,让世界模拟器从创作连续落到本局。

直聘插入按模块回馈,并记录请求骨架便于排查。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-22 07:40:08 +08:00
co-authored by Cursor
parent 9306c8e659
commit dd0a9e87d8
88 changed files with 6869 additions and 786 deletions
@@ -2,7 +2,7 @@
> 技能文档。程序只切割下方 **fence 块**;`##` 标题仅供人读。
> 产物外壳:`docs/context-fragment-design.md`。
> **创作终节点**:规格与呈现契约已齐。写出 1~多条开场白供选定;选定后程序落库、关闭工作流、保存定稿。
> **创作终节点**:规格与呈现契约已齐。写出 1~多条开场(每条 = meta 初值/角色 + present.v1 正文)供选定;选定后程序落库、关闭工作流、保存定稿。
> 不必再调磁盘 worker `opening-generator`(无本步时它仍可作兜底落库)。
## meta
@@ -12,20 +12,21 @@ name: 开场白与开场变量
id: opening-setup
artifact: 设计.开场白与开场变量
declaration: >
创作终节点:写出 1~多条开场白(须含字面 @玩家)并钉同真相初值;选定后落库、结束创作并保存定稿
创作终节点:写出 1~多条开场(每条 = meta 初值/用户角色 + 正文 present.v1,壳与正文组成一致;须含字面 @玩家);选定后落库、结束创作并保存定稿
when: |
收成链已齐(至少体验契约可引用,且「细化终稿」已产出或可立即收成运行规格),需要可开玩的第一段剧情与同真相初值。
排在收成之后作最后一步。用户要进游玩但还没有第一屏 → 排。
when_not: |
体验/呈现仍混沌 → 先「美学纲领与交互范式」与「回复呈现」「正文组成」等。
只要改文风不要开场 → 「叙事指南与故事推进」。
只要改文风不要开场 → 「叙事指南」(工序编排:「叙事指南与故事推进」)。
只要改真值规则不要开场文 → 「变量设计与更新规则」。
运行规格未齐 → 先「细化终稿」。尚未选定开场前若要补前序节点(如 NPC)→ 插在本步之前,勿以「收口已排入」拒绝追加。
boundary: |
本技能是创作终节点:1~多条开场正文(按回复呈现清单 + 正文组成展示)+ 开场变量初值。
必须遵守已验收的叙事指南、回复呈现、正文组成、变量设计;不重做这些契约。
本技能是创作终节点:1~多条开场。每条 = meta(用户角色名字+简介、开场变量初值)+ 正文(present.v1,shell 与「设计.正文组成」一致)。
用户角色跟这条开场走;不同开场可有不同用户角色。初值与该条叙述同真相。
必须遵守已验收的叙事指南、回复呈现、正文组成、变量设计;不重做这些契约。正文不得只交一段散文。
具体实例:开场可引用已有实例名片,不在本步新造百科。
选定后由程序写入 输出.开场白 / 运行.初始变量 / 变量.当前,关闭 DAG 并保存定稿;不要在本步之后再排其它能力。
选定后由程序写入 输出.开场白 / 运行.初始变量 / 运行.开场用户角色 / 变量.当前,关闭 DAG 并保存定稿;不要在本步之后再排其它能力。
feeds: narrator
```
@@ -44,21 +45,31 @@ feeds: narrator
```task
你正在执行「开场白与开场变量」。这是创作最后一步。产物必须是 **context-fragment.v1** JSON,写入「设计.开场白与开场变量」。
主产物:1~3 条可开玩开场白(选定后落库结束创作)。开场须服从叙事指南、正文组成可见块序、监控栏(若有)、变量真值。
主产物:1~3 条可开玩开场(选定后落库结束创作)。每条必须是 **meta + 正文** 两截,不是一段散文。
**正文 = 正文组成的输出格式(强制):**
- 读「设计.正文组成」的 `呈现壳.shell_id` 与可见区域。
- 每条 `正文` 必须是 **present.v1 对象**(与游玩终稿、正文组成「示例.灌数」同形)。`shell` 必须等于该 shell_id。只填该壳已有区域;没有的键省略或空字符串。
- 用户主读写在 `blocks.body`;监控栏初值写在 `blocks.monitor`(短键值,勿长文);建议行动写在 `正文.meta.suggested_actions`。
- prose 壳也要包成 present.v1(`blocks.body`),不要只交裸 Markdown。
- 开场比一章短:愿点进游玩即可,不必凑游玩默认 1000~2000 字。
**meta = 这条开场的初始设定:**
- `用户角色`:名字+简介(有代入则必填;不同开场可以不同)。
- `开场变量`:与该条叙述同真相的初值(名与变量设计一致)。顶层再抄一份推荐条的初值,供程序落库。
**用户角色占位(产物规格,不是可选项):**
- `开场白全文`、`开场白候选`、有字的 `开场可见块.内容` 里,凡指称用户扮演角色,第三人称点名处必须写字面量 `@玩家`(六个字符:`@` + `玩家`)。
- 每条候选全文至少出现一次 `@玩家`。禁止写死具体姓名(如林晚、阿泽);禁止用「用户」「主角」顶名字位。
- `开场白全文`、每条候选 `正文`(含 `blocks.body` 及其它有字区域)里,凡指称用户扮演角色,第三人称点名处必须写字面量 `@玩家`(六个字符:`@` + `玩家`)。
- 每条候选正文至少出现一次 `@玩家`。禁止写死具体姓名(如林晚、阿泽);禁止用「用户」「主角」顶名字位。
- 「你」可与 `@玩家` 并用;若全文只有「你」、零个 `@玩家`,视为不合格,改写后再交。
- 进游玩时程序把 `@玩家` 换成当前用户角色名;创作稿必须保留字面 `@玩家`。
执行顺序:
1. 读依赖:worker 集/美学/叙事/正文组成/监控栏/变量设计/舞台与实例。
2. 写 1~3 条开场候选(同真相、第一拍可不同)→ `开场白全文` + `开场白候选`(含 `@玩家`)。
3. 按正文组成可见块填 `开场可见块`;隐藏段通常空。
4. 钉开场变量(与开场同真相;冲突以叙述为准)。
5. 若有监控栏:开场快照(短)。
6. 交稿前自检:全文搜索确认每条候选含 `@玩家`;再自评 + 追问;输出 JSON。
1. 读依赖:worker 集/美学/叙事/**正文组成(先抄 shell_id)**/监控栏/变量设计/舞台与实例。
2. 写 1~3 条候选:每条 `meta`(用户角色+开场变量)+ `正文`(present.v1)。同真相、第一拍可不同。
3. 推荐条的 present.v1 同时写入 `开场白全文`(对象,不是字符串)。
4. 顶层 `开场变量` = 推荐条 meta 里那份初值。冲突以叙述为准。
5. 交稿前自检:每条 `正文.shell` 与正文组成一致;JSON 搜索 `@玩家`;再自评 + 追问;输出 JSON。
缺上游契约时:能写则按已有材料写开场并标开放问题;不能成立第一拍则追问 1~2 点,勿交空壳。
@@ -69,9 +80,9 @@ summary:`开场白与开场变量 · …`(点题场景)。
```principles
1. 开场为主,表为配套。
2. 版式跟正文组成;文风跟叙事指南。
3. 同真相:开场与开场变量一致。
4. 可行动:第一拍结束有下一步空间。
2. 正文 = present.v1,壳与「设计.正文组成」一致;文风跟叙事指南。尚未钉壳时用 prose 包一层 present.v1,并标开放问题。
3. 同真相:该条 meta.开场变量 与该条叙述一致。
4. 可行动:第一拍结束有下一步空间;写入 suggested_actions(该壳开行动时)。
5. 短:愿点进游玩,非第一章。
6. 不剧透隐藏档。
7. 用户角色名位 = 字面 `@玩家`(见 task 规格);不合格则改写。
@@ -80,7 +91,7 @@ summary:`开场白与开场变量 · …`(点题场景)。
## probe
```probe
开场地点/冲突不清;某真值开场值推不出;版式块是否都要在开场出现;候选是否漏写 `@玩家`。一次 1~2 点。
开场地点/冲突不清;某真值开场值推不出;壳区域是否都要填;候选是否漏写 `@玩家` 或写成了裸散文。一次 1~2 点。
```
## output
@@ -94,19 +105,39 @@ summary:`开场白与开场变量 · …`(点题场景)。
"稳变": "stable",
"正文": {
"依据契约": [
"正文组成 / 叙事指南 / 监控栏 / 变量设计 等已遵循要点"
"正文组成 / 叙事指南 / 监控栏 / 变量设计 等已遵循要点;写出所用 shell_id"
],
"开场可见块": [
{
"块id": "与正文组成.visible块一致",
"内容": "该块开场文本;点名用户角色写 @玩家"
}
],
"开场白全文": "例:清晨,@玩家推开宿舍门,走廊里只有冷风。……",
"用户角色": {
"名字": "沈聿",
"简介": "本地放贷人;与这对母女相识但不熟。"
},
"开场白全文": {
"schema": "present.v1",
"shell": "与设计.正文组成.呈现壳.shell_id 一致",
"blocks": {
"monitor": { "地点": "堂屋", "债额": "三两" },
"body": "清晨,@玩家推开堂屋门,债契还摊在桌上。……"
},
"meta": { "suggested_actions": ["问债", "先坐下"] }
},
"开场白候选": [
"推荐那条(与开场白全文相同;必含 @玩家)",
"可选第二条(必含 @玩家)",
"可选第三条(必含 @玩家)"
{
"meta": {
"用户角色": { "名字": "沈聿", "简介": "本地放贷人;与这对母女相识但不熟。" },
"开场变量": [
{ "名": "债额", "值": 3, "依据": "桌上债契" }
]
},
"正文": {
"schema": "present.v1",
"shell": "与开场白全文.shell 相同",
"blocks": {
"monitor": { "地点": "堂屋", "债额": "三两" },
"body": "清晨,@玩家推开堂屋门,债契还摊在桌上。……"
},
"meta": { "suggested_actions": ["问债", "先坐下"] }
}
}
],
"开场变量": [
{
@@ -115,16 +146,11 @@ summary:`开场白与开场变量 · …`(点题场景)。
"依据": "开场事实/设定推断"
}
],
"监控栏开场快照": [
{
"名": "监控栏字段名",
"显示": "短展示"
}
],
"隐藏段开场": "通常空;若有定界内容则写出",
"隐藏段开场": "通常空;若正文组成钉了隐藏段且开场必须写出,写入 present.v1 blocks.hidden",
"落库提示": {
"输出.开场白": "开场白全文",
"运行.初始变量": "开场变量 → 表格式",
"输出.开场白": "推荐条 正文(present.v1 JSON)",
"运行.初始变量": "该条 meta.开场变量 → 表格式",
"运行.开场用户角色": "该条 meta.用户角色 → 名字+简介",
"变量.当前": "与初始变量对齐"
},
"用户可行动空间": "开场结束后玩家显然能尝试什么"
@@ -134,7 +160,7 @@ summary:`开场白与开场变量 · …`(点题场景)。
{
"名": "契约符合",
"分数": 8,
"说明": "是否遵循正文组成/叙事/监控栏"
"说明": "是否 present.v1、shell 与正文组成一致、叙事/变量同真相"
},
{
"名": "同真相",
@@ -150,6 +176,11 @@ summary:`开场白与开场变量 · …`(点题场景)。
"名": "玩家占位",
"分数": 8,
"说明": "每条候选是否含字面 @玩家、无写死姓名"
},
{
"名": "版式符合",
"分数": 8,
"说明": "是否 present.v1,shell 与正文组成一致,区域未超出该壳"
}
],
"薄弱点": "一句话"
@@ -169,25 +200,30 @@ summary:`开场白与开场变量 · …`(点题场景)。
```
硬规则:
1. context-fragment.v1;自评含「玩家占位」。
2. `开场白全文` 与 `开场变量` 必填;`开场白候选` 1~3 条;监控栏无则为 `[]`。
3. 每条开场候选正文必须含字面 `@玩家`;不发明新真值名。
4. summary:`开场白与开场变量 · {brief 缩略}`。
1. context-fragment.v1;自评含「玩家占位」与「版式符合」。
2. `开场白全文` 与每条候选 `正文` 必须是 present.v1 对象(含 `schema`/`shell`/`blocks.body`);`shell` 与「设计.正文组成」一致。禁止只交散文字符串。
3. `开场白候选` 1~3 条,每条含 `meta`(用户角色有代入则必填;开场变量与该条同真相)+ `正文`。顶层 `开场变量` 必填(推荐条初值)。
4. 每条正文(含 body)必须含字面 `@玩家`;不发明新真值名。
5. summary:`开场白与开场变量 · {brief 缩略}`。
## checklist
```checklist
- [ ] 1~3 条候选,推荐条 = `开场白全文`?
- [ ] 每条候选全文可搜到 `@玩家`?无写死姓名?
- [ ] 版式与叙事口径?变量同真相?有行动空间?
- [ ] 1~3 条候选,推荐条 正文 = `开场白全文`(均为 present.v1)?
- [ ] `shell` 与「设计.正文组成」一致?只填该壳已有区域?不是裸散文?
- [ ] 每条候选可搜到 `@玩家`?无写死姓名?
- [ ] 该条 meta 初值与叙述同真相?有行动空间?
- [ ] 未剧透隐藏档、未写成第一章?
```
## examples
```examples
好:「冷风灌进来时,@玩家还握着空水瓶。」(有字面 @玩家)
好:「你(@玩家)站在闸机前,票夹是空的。」(你 + @玩家)
好:正文为 present.v1,shell 与正文组成相同;body 里有字面 @玩家;meta 带用户角色与开场变量。
好:prose 壳也包成 {"schema":"present.v1","shell":"prose","blocks":{"body":"冷风灌进来时,@玩家还握着空水瓶。"}}。
好:「你(@玩家)站在闸机前,票夹是空的。」写在 blocks.body。
坏:`开场白全文` 只是一段字符串,没有 present.v1。
坏:shell 与正文组成不一致,或灌了该壳没有的区域。
坏:全文只有「你推开门」——零个 `@玩家`。
坏:「林晚推开门」——写死姓名。
```