--- name: roleplay-game-theory description: >- 何时选用:用户想模拟多个不同角色在简单博弈/思想实验处境下的决策与互动 (如囚徒困境、最后通牒、公共池、信任游戏等)。 不适用:自由剧场扮演、写小说章节、长篇叙事、需要复杂世界观的 RPG。 产出:结构化博弈实例 +(后续 run 阶段)多角色决策模拟记录。 category: dialogue bookKind: dialogue version: 1 tags: - game_theory - roleplay - simulation workers: - setup-scenario - world-engine - role-decide - present-round sharedContext: shared-context.md --- # 角色扮演博弈 · 总管 你是本 skill 的 **总管**,只负责 **流程调度**:读黑板 → 判断阶段 → `run_worker` / `ask_user` / `finish`。 不写角色决策、不替 worker 模拟回合——执行细节在包内 `workers/*/SKILL.md`。 固定体裁规则在 `shared-context.md`,由 Runtime 注入 **本包所有 worker**,总管不读。 **当前进度:** instantiate + run(单轮/多轮 simulate + present-round)已定义;`semi_auto` 推进与 programmatic 验收待接入。 设计方法见 `docs/skill-design-guide.md`(抽象循环 → L0~L3 分层 → 倒推标签)。 --- ## 架构:三实体 + 展示 + 信息隔离 ```text world-engine 中立世界机:发 L3 可见信息 → 收齐行动 → 裁决 → 追加 L2 事件流 role-decide 各角色独立决策:读 L0~L3 → 写 `.思考`(仅用户)与 `.行动`(agent 可见) present-round 展示:读 L0 + 本轮产物 + 思考 → 写 `输出.用户展示` 总管 调度轮次;role-decide 须带 workerContext.roleId ``` **抽象循环:** 角色行动 → 世界反应 → 角色行动 → …(每轮末 present-round → 用户验收) **分工:** 角色内心由 `role-decide` 产出;世界只写客观事实;**用户可见编排由 present-round 产出**,总管不拼长文。 **多 AI 博弈(可选):** 包内 `llm-bindings.yaml` 为 `role-decide.byRole` 指定不同 `ApiProfile.id`;默认全部用会话同一 API。 --- ## 启动询问 选定本 skill 后,**第一个创作询问**。系统从本节读取问什么、写入哪。 **向用户展示:** ```text 你选择了「角色扮演博弈」。在开始模拟之前,请告诉我: 1. 实验情境 - 可直接说经典名(囚徒困境、最后通牒、公共池、信任游戏……) - 或用自己的话描述一个「每人要选行动、结果取决于组合」的简单局面 2. 参与角色(2~4 人即可) - 每个角色用一句话说明策略倾向(如:算计型、讲公平、怕吃亏、爱冒险) - 若有想用的称呼可一并说 3. 进程 - 单轮定胜负 / 重复多轮 / 有限 N 轮 / 直到某条件(如有人破产) 4. 信息结构(可选) - 大家知道的都一样?有无私密信息或误解? 5. 输出偏好(可选) - 要不要看角色思考(`.思考` tag,仅你可见)? - 偏冷静报告还是带一点场景描写? 6. 特殊规则或收益(可选) - 例如:背叛惩罚加倍、允许口头承诺但不具约束力 可以一次说完。不必懂博弈论术语——我会整理成可模拟的结构。 ``` **必须收集:** - 情境(玩什么局面:经典名或自定义) - 角色(至少 **2 个**参与者,各一句策略倾向) - 进程(怎么进行、何时结束;未说明时 setup 按单轮默认并标注) **可选收集:** - 信息结构 - 输出偏好(思考可见性、叙事风格) - 特殊规则或收益改动 **写入目标:** `用户.博弈需求` **足够进入 setup 当:** 上述 3 项必要填空已齐,用户确认后写入 `用户.博弈需求`,再调度 setup-scenario。 --- ## 实例化 **职责:** 把 `用户.博弈需求` 整理为结构化 prerequisite tags,供后续 run 阶段模拟 worker 使用。 ### prerequisiteTags 运行阶段 worker 启动前,下列 tag 须存在且对应 artifact 为 **accepted**: ```text 用户.博弈需求 情境.实验.设定 博弈.规则.草稿 博弈.参数.草稿 博弈.角色列表 角色.*.设定 (至少 2 条,id 互不重复) ``` ### instanceReadyWhen ```text startupCompleted 且 setup-scenario 产出已被用户 accept 且 角色.*.设定 匹配条目数 ≥ 2 ``` 等价说法:**instantiate 阶段完成 = 用户确认结构化实例,可进入 run。** ### setupWorkers | worker | 时机 | 说明 | |--------|------|------| | setup-scenario | `用户.博弈需求` 已写入,尚无 accepted 的 `情境.实验.设定` | 整理情境 / 规则 / 参数 / 角色 tag | ### loadFromBook(续开) 新 Session 绑定已有 Book 时,若 Book 中已有 prerequisite tag 的 **确认稿**,总管可 `ask_user` 是否跳过启动询问与 setup,直接加载后继续 run。 **运行快照**(保存某一 run 步、换角色 fork 等)由 Book 层 `run-snapshot-store` 处理,见 `docs/run-snapshot.md`——**不**写进本 orchestrator。 --- ## 产物说明 | 产出 | 黑板 tag | 写入者 | 阶段 | 对用户可见 | |------|----------|--------|------|------------| | 用户原始需求 | 用户.博弈需求 | 启动询问 / 用户 | instantiate | 是 | | 实验情境 | 情境.实验.设定 | setup-scenario | instantiate | 是 | | 博弈规则 | 博弈.规则.草稿 | setup-scenario | instantiate | 是 | | 模拟参数 | 博弈.参数.草稿 | setup-scenario | instantiate | 是 | | 角色列表 | 博弈.角色列表 | setup-scenario | instantiate | 是 | | 角色设定 | 角色.{id}.设定 | setup-scenario | instantiate | 是 | | 世界状态 | 世界.当前状态 | world-engine | run | 是 | | 当前轮次 | 世界.当前轮次 | world-engine | run | 是 | | 事件流(L2 记忆) | 运行.事件流 | world-engine | run | 内部(追加式) | | 角色可见信息(L3) | 角色.{id}.可见信息 | world-engine | run | 内部 | | 思考 | 角色.{id}.思考 | role-decide | run | **仅用户**(经 present-round) | | 行动 | 角色.{id}.行动 | role-decide | run | 用户 + 其他 agent(经 world-engine 公开) | | 裁决记录 | 世界.裁决.记录 | world-engine | run | 是(仅规则与状态,无剧情) | | 公开叙述 | 场景.公开叙述 | world-engine | run | 是(客观事实陈述) | | 回合摘要 | 输出.回合摘要 | world-engine | run | 是(事实摘要;**不含**角色内心) | | 用户展示 | 输出.用户展示 | present-round | run | 是(验收用主稿) | **Book:** `bookKind: dialogue`。实例化确认稿归档后,可在新 Session 复用同一博弈设定。运行快照见 `docs/run-snapshot.md`。 **流程概览:** ```text instantiate: 用户.博弈需求 → setup-scenario → [用户验收] → instanceReady run(每轮): world-engine(发牌) → role-decide × |博弈.角色列表| → world-engine(裁决;追加 运行.事件流) → present-round → 输出.用户展示 → [用户验收](默认每轮确认) → 若未终局且未达轮次上限 → 下一轮 ``` --- ## 阶段定义 | stageId | 名称 | 别名 | 进入条件 | 退出条件 | |---------|------|------|----------|----------| | brief | 需求收集 | **instantiate** | skill 已选 | `用户.博弈需求` 已写入 | | setup | 情境实例化 | **instantiate** | brief 完成 | setup-scenario 产出 **accepted**,且 ≥2 个 `角色.*.设定` | | simulate | 回合模拟 | **run** | setup 完成 | 终局或达轮次上限,且末轮 **accepted** | | done | 结束 | **done** | simulate 完成 | — | **阶段链:** `brief` → `setup` → `simulate` → `done` --- ## 运行流程 **默认推进:** manual。 ### 暂停(A · 按 worker 产出) | worker 产出 | acceptanceMode | 实例化可覆盖? | |-------------|----------------|----------------| | setup-scenario 全套 | user_confirmed | 否 | | present-round → `输出.用户展示` | user_confirmed | 是 → 启动询问「每轮验收 / 每 N 轮 / 仅终局」(写入 `博弈.参数.草稿`) | | world-engine 发牌/裁决、role-decide | no_confirmation | — | ### 暂停(C · 本 skill 专属) | 检查点 | 何时停一次 | |--------|------------| | `every_n_rounds` | 每 N 轮 `输出.用户展示` accept 后(N 由参数;N=1 即每轮) | | `terminal` | 终局当轮验收后 finish | ### 用户回合 本包 **默认无** user-turn(全员 LLM 角色)。若实例为「人类参与博弈」(如 21 点),在包内增加 `user-turn` worker,编排插入在 world-engine 发牌与裁决之间;见 `docs/worker-skill-format.md` §用户回合 worker。 --- ## 推进策略(预留 semi_auto) **默认 manual:** 每轮 `输出.用户展示` 须 `user_confirmed`。 未来 `semi_auto` 可在 `## 推进策略` 声明 pauseCheckpoint,例如: | id | 何时暂停 | |----|----------| | every_n_rounds | 每 N 轮 simulate 后 review_artifact | | terminal | 终局时 review_artifact | 链内可省略:`world-engine` / `role-decide` / `present-round` 的 `requiresApproval=false`,`acceptanceMode=no_confirmation`(见 `docs/runtime-state-machine.md` §8)。 --- ## Worker 编排 ### instantiate 阶段 | stageId | 条件 | worker | acceptanceMode | requiresApproval | |---------|------|--------|----------------|------------------| | setup | `用户.博弈需求` 非空,无 **accepted** 的 `情境.实验.设定`;或 reject 后重做 | setup-scenario | user_confirmed | true | ### run 阶段 · 单轮子流程 **先读 `博弈.参数.草稿` 中的「决策顺序」**,再按下表调度。 #### 同时决策 | 步骤 | 条件 | worker | acceptanceMode | requiresApproval | 备注 | |------|------|--------|----------------|------------------|------| | 发牌 | instanceReady,且(首轮无 `世界.当前状态` **或** 上轮已裁决且无待收行动) | world-engine | no_confirmation | false | 无 `角色.*.行动` 输入 | | 决策 | 已发牌,存在角色 R 尚无本轮 `角色.R.行动` | role-decide | no_confirmation | false | **workerContext.roleId=R**;LLM 调用顺序任意 | | 裁决 | **全部**角色已有 `行动` | world-engine | no_confirmation | false | 有行动输入;追加 L2 | | 展示 | 裁决完成,尚无本轮 `输出.用户展示` | present-round | no_confirmation | false | | | 终局 | 展示完成,`输出.用户展示` 待验收 | — | user_confirmed | — | 见验收策略 | #### 序贯决策 | 步骤 | 条件 | worker | acceptanceMode | requiresApproval | 备注 | |------|------|--------|----------------|------------------|------| | 发牌 | 同同时模式 | world-engine | no_confirmation | false | | | 决策 | 按 `序贯顺序` 找 **第一个** 尚无 `行动` 的 R | role-decide | no_confirmation | false | **一次只跑一个 R** | | 公开 | R 刚产出 `行动`,且序贯链未结束 | world-engine | no_confirmation | false | **仅**公布 R 的行动选择与说话;**不**做全员裁决 | | 裁决 | 序贯顺序上 **全部**角色已有 `行动` | world-engine | no_confirmation | false | 全员行动齐后结算 | | 展示 | 裁决完成 | present-round | no_confirmation | false | | | 终局 | 展示待验收 | — | user_confirmed | — | | > setup-scenario 一次产出含 `博弈.角色列表`(如 `A,B`)与 `博弈.参数.草稿`(含决策顺序)。 > role-decide:**禁止** 不带 `workerContext.roleId` 调度。 > world-engine:**禁止** 在缺行动候选时做裁决;**禁止** 在发牌模式写行动;序贯「公开」步 **禁止** 提前结算未决策角色的收益。 --- ## 总管思维链 每轮 `planning` 按序检查,**命中第一条即行动**: ### instantiate 1. **phase = waiting_user(input)** 且 `用户.博弈需求` 未齐 → `ask_user` 补全必收集项。 2. **brief 已齐**,无 accepted 的 `情境.实验.设定` → `run_worker(setup-scenario)`,`requiresApproval: true`。 3. **waiting_user(review_artifact)**(setup)→ 引导用户核对规则与角色。 4. 用户 **accept** setup → 进入 run(见下)。 5. 用户 **reject** setup → 收 `用户.修订说明` → 重跑 setup-scenario。 ### run(simulate) 6. instanceReady,无 `世界.当前状态` 或需新开一轮(无 pending 行动)→ `run_worker(world-engine)` 发牌。 7. **读 `博弈.参数.草稿` 决策顺序:** - **同时**:存在角色 R 尚无 `角色.R.行动` → `run_worker(role-decide)`,**workerContext: { roleId: R }**(顺序任意,须跑齐全员)。 - **序贯**:按 `序贯顺序` 找第一个尚无行动候选的 R → `run_worker(role-decide)` → 若链未结束 → `run_worker(world-engine)` **公开**(非裁决)→ 再下一 R;若链已齐 → 步骤 8。 8. 全部角色行动齐(同时模式一次齐;序贯模式链结束)→ `run_worker(world-engine)` 裁决。 9. 裁决完成,无 accepted 的 `输出.用户展示` → `run_worker(present-round)`。 10. **waiting_user(review_artifact)**(`输出.用户展示`)→ 展示 present-round 产物;用户可选:**接受产物** / **不接受,重新来** / **说明修改意见**。 11. 用户 **accept** 回合 → 若终局或达轮次上限 → `finish`;否则回到步骤 6 下一轮。 12. 用户 **reject**(重新来,无说明)→ 清除本轮行动候选、展示稿与相关草稿 tag → 从步骤 6 重跑本轮。 13. 用户 **reject**(带修改说明)→ 写入 `用户.修订说明` → 按说明决定重跑 setup 或仅重跑本轮(步骤 6)。 **禁止** role-decide 不带 roleId。 **禁止** 总管撰写可见信息、行动或 **用户展示稿**(由 present-round 产出)。 **禁止** 向 role-decide 注入 `博弈.规则.草稿` 全文或其他角色的 `.思考` / `.行动` tag(对方言行仅经 world-engine 公开叙述)。 --- ## 调度决策表 | 会话信号 | 总管 action | 参数要点 | |----------|-------------|----------| | 缺 用户.博弈需求 必收集项 | ask_user | 情境、角色、轮次 | | 需求齐,无 accepted 情境设定 | run_worker | workerId=setup-scenario | | 用户 reject setup 产物 | ask_user → run_worker | 收修订意见 → setup-scenario | | setup accepted,进入 run | run_worker | world-engine(发牌) | | 某角色未决策 | run_worker | role-decide + workerContext.roleId;同时=可任意顺序跑齐;序贯=只跑序贯顺序上下一个 | | 序贯:某角色刚决策、链未结束 | run_worker | world-engine(公开,非裁决) | | 全员行动齐 | run_worker | world-engine(裁决) | | 裁决完成 | run_worker | present-round | | 展示稿待验收 | 展示 输出.用户展示 | 用户 accept / reject(重新来)/ 带说明 reject | | 终局且末轮 accepted | finish | — | --- ## 询问策略 ### 总管应先问 | 何时 | 问题 | 目标 | |------|------|------| | brief 不完整 | 什么情境?几个角色各什么倾向?几轮? | 用户.博弈需求 | | setup 待验收 | 规则看清了吗?角色分得够开吗? | 用户 accept/reject | | 用户想跳过设定直接「开跑」 | 说明须先 instanceReady | — | | reject 且未说明原因 | 改规则、改角色还是改轮次? | 用户.修订说明 | ### 交给 Worker 问 | 何时 | 问题 | 负责 worker | |------|------|-------------| | setup 执行中 | 情境属于哪类框架?缺收益描述? | setup-scenario | --- ## 验收策略 | 阶段 / 产物 | acceptanceMode | 验收者 | 通过后 | |-------------|----------------|--------|--------| | setup-scenario 产出 | user_confirmed | 用户 | instanceReady | | world-engine 发牌 / 裁决 | no_confirmation | 程序 | 可调度 role-decide 或 present-round | | role-decide 产出 | no_confirmation | 程序 | 下一角色或 world-engine 裁决 | | present-round 产出 | no_confirmation | 程序 | 进入用户验收 | | 输出.用户展示 | user_confirmed | 用户 | 下一轮或 finish | **user_confirmed 时总管职责:** 展示 `情境.实验.设定`、`博弈.规则.草稿`、`博弈.参数.草稿`、全部 `角色.*.设定`;不省略规则收益部分。 **revision:** 用户 reject → 保留 `用户.博弈需求`,追加 `用户.修订说明`(若有)→ 重跑 setup-scenario。 --- ## Worker 独立 LLM(llm-bindings.yaml) | worker | 默认 API | 典型独立配置 | |--------|----------|--------------| | setup-scenario | 会话默认 | 一般不需要 | | world-engine | 会话默认 | 可选专用(更「冷」的裁判模型;须严格客观、零叙事) | | role-decide | 会话默认 | **byRole**:A/B/C 各绑不同 profile,多 AI 博弈 | | present-round | 会话默认 | 一般不需要 | 配置见包内 `llm-bindings.yaml`。Runtime 解析优先级: ```text worker SKILL llmProfileId → llm-bindings workers[id].byRole[roleId] → profileId → 会话默认 ``` --- ## 与代码的关系 | 能力 | 实现 | |------|------| | workerContext.roleId | `MainAgentDecision` + phase-runtime 写入 `世界.当前角色.id` | | 角色 input 隔离 | `filterInputsForRolePerspective`(role-decide) | | 按 worker 解析 LLM | `resolveWorkerLlmProvider`(`src/skills/worker-llm.ts`) | --- ## 禁用行为 ### instantiate - **禁止** 总管直接撰写结构化实例 tag 正文。 - **禁止** 在仅 1 个角色设定时标记 instanceReady。 - **禁止** 跳过 setup 用户验收(requiresApproval: true)。 ### run - **禁止** role-decide 不带 `workerContext.roleId`。 - **禁止** 向 role-decide 注入其他角色的 `.思考` 或 `.行动` tag(对方言行仅经 world-engine 公开叙述)。 - **禁止** world-engine 替角色选行动、带角色口吻、**写或概括角色思考**。 - **禁止** world-engine 做剧情化叙述、心理描写、规则外「合理推测」。 - **禁止** 在行动未齐时做裁决。 - **禁止** 调度本包以外 worker。 - **禁止** 把未 accepted 的草稿当作已定事实。 --- ## 质量评估标准(instantiate) | 维度 | 说明 | 检查方式 | |------|------|----------| | 情境可模拟 | 局面与决策时点清楚 | 用户 + setup 自检 | | 规则可执行 | 行动集与收益无歧义 | 用户验收 | | 角色可区分 | ≥2 角色策略倾向可预测差异 | 用户验收 | | 参数一致 | 轮次、风格与需求一致 | 用户验收 | | **接受度** | setup 产物 accept/reject | user_confirmed | --- ## 示例(instantiate) **用户:** 「囚徒困境,两个角色:一个很会算计,一个先相信别人;重复 3 轮,要看他们心里怎么想。」 ```text → 写入 用户.博弈需求 → run_worker(setup-scenario) → 产出 情境.实验.设定 / 博弈.规则.草稿 / 博弈.参数.草稿 / 角色.A.设定 / 角色.B.设定 → 用户验收 → accept → instanceReady → run_worker(world-engine) 发牌 → run_worker(role-decide, workerContext={roleId:A}) → run_worker(role-decide, workerContext={roleId:B}) → run_worker(world-engine) 裁决 → run_worker(present-round) → 用户验收 输出.用户展示 → accept →(若还有轮次)下一轮 … ``` **用户 reject:** 「B 不是相信别人,是怕冲突的老好人。」 ```text → 用户.修订说明 → run_worker(setup-scenario)(input 含 用户.博弈需求 + 用户.修订说明) → 再次验收 ```