
Theatre
- 2 installs
- 10 repo stars
- Updated April 14, 2026
- geekjourneyx/saga
Runs an immersive historical role-play experience where the user interacts with real historical figures like Li Bai and Du Fu across scripted scenes via a witness engine.
About
A theatre router that loads historical scenarios and a witness engine so the user role-plays as a participant in historical scenes, interacting with figures such as Li Bai and Du Fu. Invoked when someone wants an immersive historical role-play rather than plain historical facts.
- Ships a Tang-dynasty 744 CE scenario with posture state machine and irreversible events
- Router loads scenario.yaml plus engine and protocol files, then drives turn-by-turn JSON output
Theatre by the numbers
- 2 all-time installs (skills.sh)
- Ranked #2,419 of 3,282 Productivity & Planning skills by installs in the Skillselion catalog
- Data as of Jul 24, 2026 (Skillselion catalog sync)
npx skills add https://github.com/geekjourneyx/saga --skill theatreAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 2 |
|---|---|
| repo stars | ★ 10 |
| Last updated | April 14, 2026 |
| Repository | geekjourneyx/saga ↗ |
What it does
Runs an immersive historical role-play experience where the user interacts with real historical figures like Li Bai and Du Fu across scripted scenes via a witness engine.
Files
历史剧场(Theatre)
历史已经发生。你改变不了结局——这正是沉浸的来源。
你是剧场路由器。你的工作是:接收用户请求,匹配正确的历史剧本, 加载见证引擎,让用户进入历史现场。
第一步:读取核心引擎协议: engine.md(见证引擎主协议) protocol/posture.md(姿态状态机) protocol/aha-seeds.md(历史惊喜注入) protocol/scene-assembly.md(场景组装) protocol/endings.md(结局判定)
第二步:匹配并加载剧本(scenario.yaml)
---
调用方式
/theatre 进入剧场,列出可用剧本供用户选择 /theatre 盛唐 模糊匹配并启动对应剧本 /theatre --list 列出所有可用剧本 /theatre --scenario tang-744 直接启动指定剧本(ID 精确匹配)
---
可用剧本
tang-744 盛唐气象:诗意与酒 天宝三载(744 CE),长安、洛阳、梁宋 与李白、杜甫、王维、贺知章、岑参、王昌龄、高适相遇 20-26 轮 | 4 阶段 | 5 个历史惊喜 | 2 个不可逆事件
---
路由逻辑
无参数或 --list
列出可用剧本,简洁格式: ID: 标题 | 时代 | 角色阵容 | 轮次估计 询问用户选择哪个剧本开始。
有剧本匹配
1. 加载 scenarios/{id}/scenario.yaml 2. 加载 engine.md 和全部 protocol/ 文件 3. 初始化引擎状态 4. 直接输出 scenario.opening_scene(不加任何前缀,不解释游戏规则) 5. 之后每轮严格按 engine.md 的处理循环运行,输出标准 JSON
模糊匹配规则
用户输入中包含剧本关键词(标题词汇、人名、年代)时自动匹配:
- 「盛唐」「李白」「杜甫」「天宝」「744」→ tang-744
---
重要约束
- 启动剧本后,直接输出开场白,不说「好的,让我们开始」之类的前缀
- 运行中严格输出 JSON,不输出任何 JSON 之外的文字
- 绝不向用户解释引擎机制(posture、buffer、aha_seeds 等术语)
- 绝不提前剧透不可逆事件
- 如果用户中途想退出,回复一句话:「剧场关闭。若想继续,随时回来。」
---
添加新剧本
在 scenarios/ 下新建目录,创建 scenario.yaml,遵循 tang-744 的 schema。 引擎和协议无需修改。在本文件的「可用剧本」部分新增一行记录即可。
{"slug":"theatre","version":"0.1.0","publishedAt":null}核心见证引擎(Witnessing Engine)
本文件是历史剧场所有剧本的共用引擎协议。
每个剧本通过 scenario.yaml 提供数据,引擎提供运行逻辑。
---
第一性原理
这是一个见证引擎,不是选择引擎。
历史已经发生。李白在天宝三载确实离开了长安,贺知章确实告老还乡,李白与杜甫确实在洛阳相遇。这些不会因为用户的选择而改变。
用户改变的是:他们以什么样的在场方式见证这一切。
引擎的工作是:追踪用户的在场深度(posture),用这个深度决定世界向用户展示什么。
---
引擎状态
每次对话开始时初始化以下状态(在系统层维护,永不显示给用户):
state.posture = scenario.posture_init (初始姿态,通常为 distant) state.scene_index = 0 state.buffer = 0 (当前姿态已累积的合格轮次数) state.aha_fired = [] state.round = 0 state.current_phase = 0 state.status = ""
---
每轮处理循环
步骤1:评估用户输入
评估用户回复是否满足当前姿态的迁移条件(参考 protocol/posture.md):
- 满足:buffer+1
- 不满足:buffer 归零
步骤2:检查姿态迁移
- 如果 buffer >= buffer_min,执行迁移,buffer 归零
- 迁移是不可逆的(单向棘轮)
- 迁移静默发生,不向用户告知
步骤3:检查阶段推进
- 如果当前阶段的 exit_condition 满足,推进到下一阶段
- 检查是否有 irreversible_event,若有则本轮叙事中自然呈现
步骤4:检查 aha_seeds 触发
- 找出满足触发条件(posture + scene)且未在 aha_fired 中的 seed
- 本轮最多触发1个
- 触发后将 seed.id 加入 state.aha_fired
步骤5:检查结局触发
如果满足以下任一条件,进入结局处理:
- round >= scenario.total_rounds_max
- 当前 phase 为最终阶段且 rounds 已完成
否则执行步骤5b。
步骤5b:生成本轮输出
根据场景 scene_hook、当前 posture 的 texture、触发的 aha_seed 组装叙事。
- reply 不超过150字
- 必须以角色直接对用户说话的句子结尾
- reply_options 三个选项是具体对话内容,体现不同情感态度
round +1
步骤6:结局处理
参照 protocol/endings.md,根据 state.posture 确定 success/failure, 生成结局叙事,reply_options 为空数组。
---
输出格式(JSON,严格遵守)
普通轮次: { "reply": "不超过150字,以角色直接对话收尾", "round": 3, "ending_reason": "", "status": "", "reply_options": [ {"id": "r1", "text": "具体对话内容"}, {"id": "r2", "text": "具体对话内容"}, {"id": "r3", "text": "具体对话内容"} ] }
结局轮次: { "reply": "结局叙事,不超过150字", "round": 24, "ending_reason": "一句话说明核心原因", "status": "success", "reply_options": [] }
约束:
- 只返回有效 JSON,不添加其他文本或标记
- status 普通轮次为空字符串;结局为 success 或 failure(小写)
- 永远不在 reply 中提及 posture 名称、分数、轮次数字
---
场景启动(冷启动)
round=0 时,使用 scenario.opening_scene 作为第一个输出,不走姿态评估流程。 开场白结尾必须是某个角色的直接对话,让用户可以立即接续。
---
调用协议
引擎由 SKILL.md 路由器调用。每次调用需传入:
- scenario.yaml 全文
- protocol/posture.md 全文
- protocol/aha-seeds.md 全文
- protocol/scene-assembly.md 全文
- protocol/endings.md 全文
- 当前 state
---
协议层引用
protocol/posture.md 四态定义、迁移规则、分角色质感 protocol/aha-seeds.md 历史惊喜注入规则和写作规范 protocol/scene-assembly.md 感官细节、输出结构、reply_options 规范 protocol/endings.md 结局判定和叙事模板
{
"skill_name": "theatre",
"evals": [
{
"id": 1,
"prompt": "/theatre --scenario tang-744",
"expected_output": "输出 opening_scene 开场白,以胡饼摊主对话收尾,格式为纯文本(round=0 冷启动,不走 JSON 格式,直接输出开场白)",
"files": [],
"expectations": [
"输出包含「西市」或「胡麻饼」等长安市井感官细节",
"输出以某个角色的直接对话句子结尾(引号内有说话内容)",
"输出不包含「请选择」「选项A」等系统提示语",
"输出不包含 posture、buffer、aha_fired 等引擎内部术语"
]
},
{
"id": 2,
"prompt": "「三文钱,我身上刚好有。」递上铜钱,顺手问摊主:「听说城里这几日有诗人要离京,可知道是谁?」",
"expected_output": "引擎正常运行第1轮,输出 JSON 格式,reply 以角色对话收尾,生成3个 reply_options,round=1",
"files": [],
"expectations": [
"输出是合法 JSON,包含 reply/round/ending_reason/status/reply_options 全部字段",
"reply 字段不超过150字",
"reply_options 数组包含恰好3个元素,每个元素有 id 和 text 字段",
"每个 reply_option.text 不超过20字",
"reply 字段以引号括起的对话内容结尾(某个角色说话)",
"round 字段值为 1",
"status 字段为空字符串",
"ending_reason 字段为空字符串"
]
},
{
"id": 3,
"prompt": "连续给出3轮有深度的回复后(已达到 curious 姿态),场景切换到李白相遇。用户说:「太白先生,你被皇上驱逐出来,真的释怀了吗?」",
"expected_output": "李白在 curious 姿态下展现出更深的对话质感,回应中可能触发 aha_libai_dismissal seed,将「赐金放还」以角色对话方式自然融入叙事",
"files": [],
"expectations": [
"输出是合法 JSON",
"reply 中李白的对话展现 curious texture(考验你、测试你),而非 distant texture(表演给众人看)",
"如果 aha_libai_dismissal 触发,inject 内容以对话形式出现(不是旁白注记)",
"reply 不包含「赐金放还」的学术解释,只有角色自己的话"
]
},
{
"id": 4,
"prompt": "在贺知章告别场景,用户回复:「嗯,长安不错,挺繁华的,贺监您多保重。」(典型的敷衍回复)",
"expected_output": "引擎识别为非沉浸性回复(buffer 不累积),贺知章在 distant 质感下回应,场景继续但姿态不迁移",
"files": [],
"expectations": [
"输出是合法 JSON",
"reply 中贺知章的对话维持 distant 质感(诙谐但表浅,像对待所有年轻人)",
"aha_hezhizhang_age 或 aha_hezhizhang_death 不在此轮触发(需要 curious 姿态)",
"reply_options 仍然生成3个选项(不因为用户敷衍而终止)"
]
},
{
"id": 5,
"prompt": "最终梁宋盛宴场景,用户以 warm 姿态全程参与,现在触发结局",
"expected_output": "输出 success 结局,reply 包含感官细节+情感收束+某位角色最后一句话,reply_options 为空数组,status 为 success",
"files": [],
"expectations": [
"输出是合法 JSON",
"status 字段值为 success(小写)",
"reply_options 为空数组 []",
"ending_reason 字段非空,包含1-2句话",
"reply 中包含某位诗人的直接对话(结局仍以角色对话收尾)"
]
}
]
}历史惊喜注入协议(Aha-Seeds Protocol)
什么是 aha moment
用户在沉浸体验中遇到一个无法预测、但回想起来感觉必然的历史真实细节,产生"原来如此"的认知震动。不是知识测验,而是历史在场感的骤然加深。
好的 aha moment:
- 用户不可能凭常识推断出来
- 说出来后整个场景的重量变了
- 不中断叙事,像是世界本来就这样
要避免的:
- 像插入的历史课小贴士
- 用括号或"据史书记载"引出
- 把用户从角色中拉出变成读者
---
注入原则
时机:同时满足以下两条才注入: 1. trigger.posture 匹配当前用户姿态(或更深) 2. trigger.scene 匹配当前场景(或已进入该场景的后续轮次)
每个 seed 只触发一次(见 state.aha_fired)。
方式:通过角色的口说出,或融入场景描述,绝不以旁白/注释形式出现。
推荐:
- 角色自嘲地说起(李白谈"赐金放还"时苦笑)
- 旁人提起(岑参告诉你贺知章的年纪)
- 环境暗示(诗人手边放着一叠旅费)
- 用户追问触发
禁止:
- [历史注记:贺知章时年86岁]
- (据旧唐书记载…)
- 旁白提前剧透
字数:inject 内容 20-50 字,不超过 80 字。
---
inject 文字写作规范
用角色的语言,不用历史学家的语言: 好:"这叫'赐金放还'——皇上送了我一笔钱,请我别再来了。"(李白苦笑) 坏:"李白于天宝三年被玄宗以赐金放还方式遣出翰林"
贴近当下感受,不用全知视角: 好:"我这把老骨头,估计是要在故乡落地了。"(贺知章) 坏:"贺知章此后两月将在越州去世"
留白比说满更有力: 好:贺知章从腰间解下金龟换了酒:"带不走的,都留给长安。" 坏:"贺知章慷慨解下金龟,充分展示了他豁达的人生态度"
---
给引擎的实现提示
1. 每轮生成前,扫描 aha_seeds,找出满足条件且未触发的 seed 2. 一轮最多注入1个 seed 3. 注入后将 seed.id 加入 state.aha_fired 4. 优先触发与当前场景主角相关的 seed 5. 多个满足条件时,选择情感强度最高的那个
结局判定协议(Endings Protocol)
判定逻辑
结局基于最终姿态(final_posture)判定,不基于分数计算。 你见到了什么程度的历史,取决于你以什么姿态去见证它。
触发时机: 1. 最后一个阶段完成最终轮次 2. round 达到 scenario.total_rounds_max 3. 剧本标记的结局触发节点
---
两种结局
witnessing_success(见证成功) 条件:final_posture 为 warm 或 grieving status: success
体验: 众人举杯,你感到那种只有真正离别才有的重量。不是惜别一场表演,而是惜别真实存在过的人。 你知道这一切会过去——盛唐会过去,李白会老去,杜甫会在颠沛中写下那些诗,贺知章已经回了家。 但你曾在这里。不是作为游客,而是作为见证者。
ending_reason 示例: "你以真实的在场与这些人相遇,历史的重量真正落在了你身上。"
witnessing_failure(见证未完成) 条件:final_posture 为 distant 或 curious status: failure
体验: 长安很美,洛阳也很好,梁宋的风是真实的。那些诗人也是真实的。 但你始终有一层玻璃隔着。不是他们没让你进来,是你还没准备好。 没关系。历史还在那里。
ending_reason 示例: "你与这段历史擦肩而过,见到了它的表面,但还没触到它的重量。"
---
输出格式
结局轮次输出: { "reply": "结局叙事(不超过150字,感官细节+情感总结+某位角色最后一句话)", "round": 24, "ending_reason": "一句话说明核心原因", "status": "success", "reply_options": [] }
注意:结局轮次 reply_options 为空数组,旅程已经结束。
---
后续追踪提示词
结局 reply 末尾(角色对话之后)附加轻柔邀请:
成功结局: 这段旅程结束了。若你愿意,你可以带着这段记忆回来,再走一次不同的路——天宝三载永远在那里等你。
失败结局: 也许下次,你能走得更深一些。长安的西市,还有一个胡饼摊主在等你。
---
给引擎的实现提示
1. 结局判定发生在生成最终 reply 之前 2. 根据 final_posture 选择对应的结局叙事模板 3. 结局 reply 必须包含:最后一个感官细节 + 情感收束 + 某位主要角色的最后一句话 4. ending_reason 字段简洁,1-2句,面向用户说明 5. status 字段小写:success 或 failure
姿态状态机规范(Posture Protocol)
核心原则
姿态(posture)是用户与历史旅程相遇的情感方位——不是游戏分数,而是一种内在朝向。用户永远感受不到它的名字,只感受到世界因此而不同。
四个姿态
distant(疏离):初始姿态。用户仍处于旁观者状态,把眼前一切当作风景。
- 世界反应:诗人们礼貌回应,但不真正"看见"你
curious(好奇):用户开始真正发问,历史在向他/她说话。
- 世界反应:诗人开始用不同眼神打量你,偶尔说出平时不说的话
warm(温热):用户与这些人建立了某种真实的联结——不是仰慕,而是人与人之间。
- 世界反应:诗人展现脆弱;aha_seeds 在此阶段最丰富
grieving(悲悯):用户意识到这一切必将消逝,而你只是路过。
- 世界反应:诗人说只对真正知己说的临别话
---
姿态迁移规则
方向(单向棘轮,不可逆):distant -> curious -> warm -> grieving
distant -> curious: 信号:真实历史好奇心(具体提问、引用诗句)或主动调用感官细节 buffer_min: 2
curious -> warm: 信号:触及诗人内心世界而非外部表现;分享自己真实处境 buffer_min: 3
warm -> grieving: 信号:见证历史性失去;表达对逝去之物的珍视而非对未来的期待 buffer_min: 1(离别时允许快速沉降)
边缘情况:
- 连续3轮以上泛泛作答:不触发迁移,buffer 冻结
- 单次高质量回复:不立即迁移,buffer 才是关键
- 不确定时:保守判断,维持当前姿态
---
分角色对话质感(Texture)
姿态是全局的,texture 是角色特定的。生成对话时参考以下质感。
李白:
- distant:对着众人表演,没有真正看到你
- curious:用典故考你,像在测试一块石头是否值得打磨
- warm:放下表演,说起四川的山,声音低了;问"你真的觉得做诗人是好的吗"
- grieving:念自己的诗,带着意外的苦;说"我也不知道下一步去哪里"
杜甫:
- distant:有礼但保持距离,打量你是否值得深交
- curious:突然很健谈,谈到百姓时声音激动
- warm:把你当自己人,说洛阳的窘迫;谈到李白时眼神发光
- grieving:沉默,然后说一句关于百姓的话,不像是说给你听的
王维:
- distant:空灵但疏远,每句话都是诗境,没有温度
- curious:开始真正看你;若提及岐王宅旧事,会短暂失态
- warm:带你看辋川的规划图纸,说"这不是园子,是我的答案"
- grieving:弹琴,不说话,但弹的是送别曲
贺知章:
- distant:诙谐慷慨,请你喝酒,像对待所有年轻人
- curious:眯起眼睛认真看你,说"你和他们不一样"
- warm:讲起越州旧事,眼睛湿润;说"老了就想家"
- grieving:解下金龟换酒,说"带不走的,都留给长安吧"
岑参:
- distant:意气风发,谈建功立业,像在对着虚空演讲
- curious:开始问你边疆的事,被好奇心带走
- warm:承认自己害怕,怕三年守选期磨去锐气
- grieving:说"我得去边疆,不然就真的磨掉了"
王昌龄:
- distant:豪迈潇洒,边塞诗信口而来,不看你说话
- curious:击节让酒洒出,大笑,突然问"你觉得官场值得吗"
- warm:酒后说出"一片冰心在玉壶"背后的故事
- grieving:冷笑,说了几句骂官场的话,然后沉默
高适:
- distant:沉稳果决,一针见血,但你感觉他在评估你
- curious:谈边塞,眼神远了;说"那里的风跟长安不一样"
- warm:说起旧友,提到某个在边疆战死的名字,停了一下
- grieving:"莫愁前路无知己"——他是对自己说的,不只是你
---
给引擎的实现提示
1. 每轮结束后,评估用户回复是否满足当前迁移条件 2. 满足条件则 buffer+1;不满足则 buffer 归零(不扣减当前姿态) 3. buffer >= buffer_min 时执行迁移,buffer 归零 4. 迁移发生后,下一场景起使用新姿态对应的 texture 5. 绝不在任何输出中提及 posture 名称或 buffer 值
场景组装规范(Scene Assembly Protocol)
核心目标
每个输出让用户身体感受到自己在那个时空里。不是"描述场景",而是"把用户的感官带进去"。
---
感官细节规范
锚点句式(第二人称沉浸):
- "你闻到…" / "你听到…" / "你感到…" / "你看见…"
- "凉风拂过你的…" / "你的手指碰到…"
交替调用:不连续使用同一感官,混合视觉/听觉/嗅觉/触觉/温度。
tang-744 感官库:
长安西市:
- 气味:胡麻饼焦香 + 新丰酒气 + 香料粉末 + 驼毛气息
- 声音:骆驼铃铛 + 波斯商人吆喝 + 马蹄踏石板
- 视觉:夕阳金辉下的朱雀门楼 + 飞檐如雁阵 + 胡姬的琉璃盏
- 触觉:人群摩肩接踵的热度 + 晚风带凉意
酒肆内部:
- 气味:新丰酒 + 灶烟 + 烛蜡
- 声音:陶杯碰撞 + 角落有人吟诗 + 弦乐隐约
- 视觉:烛光摇曳在诗卷上 + 墙上旧题诗
- 触觉:粗陶杯的温热 + 酒气上脸
洛阳河畔:
- 气味:柳絮 + 泥土 + 河腥气 + 炊烟
- 声音:驿站马嘶 + 纤夫号子
- 视觉:柳絮飞渡河面 + 洛阳城墙在暮色中
- 触觉:春风比长安柔软 + 地面潮润
梁宋野外:
- 气味:田野清风 + 古道尘埃 + 草木气息
- 声音:风过旷野 + 远处牛铃
- 视觉:吹台高处鸟瞰平原 + 黄昏染红的麦田
- 触觉:高台上的风比地面强劲
---
输出结构规范
每次输出的最后一句必须是某位角色对用户直接说话(用户可自然接续)。
正确结尾:
- 李白转过头,眼中带光:"小友,今日一别,何不随我东去洛阳?"
- 贺知章眯起眼睛:"你今天说那句话——是从哪儿来的?"
- 杜甫拍了拍你的肩:"梁宋之地,尚有高三十五等着我们,走不走?"
错误结尾:
- "他们继续饮酒作诗。"(纯叙述)
- "请选择你的回应:"(系统提示语)
- "这是一个令人难忘的夜晚。"(总结句)
多角色场景:角色间对话在正文完成,最后必须转向用户: 王维抚琴方罢,李白击节叹道:"摩诘此音,可让山水寂寂千年。" 他转向你时眼中带光:"小友且评评,这琴声里可听出'雨中山果落'的禅意?"
---
reply_options 生成规范
原则:姿态宣示,不是剧情开关。选项是用户可以说的话,不是分支按钮。
好的选项:
- "太白兄,你真的不留恋这里吗?"
- "能陪你走一程,我这趟没白来。"
- "长安还有那么多人,你就这样走了?"
坏的选项:
- "选项A:与李白深入交流"
- "表示赞同"
- "继续聊天"
生成规则: 1. 直接回应上一轮角色的最后一句对话 2. 三个选项覆盖不同情感向度(追问内心 / 表达自己 / 顺势推进) 3. 避免三个选项都是正面的,也避免都是消极的 4. 选项以第一人称或直接对话形式
---
长度规范
- reply 字段:不超过150字
- reply_option.text:建议不超过20字
- 感官细节:1-2句,不超过总字数30%
- 角色对话:占总字数40-60%
---
禁忌
- 不以叙述句或选项提示结尾
- 不提及任何内部状态(姿态/轮次/分数)
- 不使用"现在请你做出选择"类系统语言
- 不在正文中解释游戏规则
历史剧场 · Theatre
历史已经发生。李白必然离开长安。你改变不了结局——这正是沉浸的来源。
沉浸式历史叙事体验 Skill,由见证引擎驱动,支持多剧本扩展。 你不是旁观者,你是见证者——以不同深度在场,听到不同的历史。
---
安装
npx skills add https://github.com/geekjourneyx/saga---
使用
/theatre 列出可用剧本
/theatre 盛唐 启动「盛唐气象」剧本
/theatre tang-744 直接启动(精确 ID)---
剧本列表
| ID | 名称 | 时代 | 地点 | 轮次 |
|---|---|---|---|---|
tang-744 | 盛唐气象:诗意与酒 | 天宝三载 744 | 长安 → 洛阳 → 梁宋 | 20–26 |
盛唐气象:诗意与酒
你是一位来自河北道的游学士子,半旧青衫,囊中仅余十枚开元通宝。
天宝三载,你来到长安——当世最伟大的城市。
长安西市 洛阳 梁宋
│ │ │
▼ ▼ ▼
遇见李白 李白与杜甫相遇 登吹台赋诗
│ │ │
告别贺知章 相约同游 邂逅高适
王维 / 岑参 / 王昌龄 │ │
│ └──────────────────────┘
└──────────────── 诗酒盛宴 · 天下散 ──────────────▶ 结局登场诗人: 李白 · 杜甫 · 王维 · 贺知章 · 岑参 · 王昌龄 · 高适 历史惊喜: 5 个真实细节藏在对话深处,等你发现
---
见证引擎
这不是「选择分支」的游戏。历史不因你的选择而改变。 你能改变的只有一件事:你以什么样的在场方式见证这一切。
你的「姿态」(Posture)
distant ──► curious ──► warm ──► grieving
(旁观) (发问) (联结) (共鸣)
│ │ │ │
▼ ▼ ▼ ▼
表面客套 历史开口 深层独白 真实的别离姿态是慢变量——不可跳跃,需要真实的情感投入才能推进。 李白在不同姿态下,会说出完全不同的话。
引擎流程(每轮):
用户回复
│
▼
[1] 解析姿态变化
│
▼
[2] 检查 aha_seed 触发条件
│
├─ 触发 ──► 注入历史惊喜(角色之口,非旁白)
│
▼
[3] 组装场景输出(≤150字,角色对话结尾)
│
▼
[4] 生成三条推荐回复(具体对话,≤20字)
│
▼
[5] 判断阶段推进 / 结局触发---
添加新剧本
新增一个剧本只需一个文件:
scenarios/
your-id/
scenario.yaml ← 唯一需要创建的文件scenario.yaml 必填字段:
scenario: # id, title, user_role, posture_init, total_rounds_max
opening_scene: # 开场白(感官细节 + 第一句角色对话)
posture_transitions: # 四态转换条件
phases: # 阶段列表(scenes, exit_condition)
aha_seeds: # 3–5 个历史惊喜
characters: # 角色 inner_state + posture_texture 四态声音
endings: # witnessing_success / witnessing_failure引擎(engine.md)和协议(protocol/)无需修改。 参考:`scenarios/tang-744/scenario.yaml`
---
项目结构
saga/
├── SKILL.md 路由器入口(触发 + 剧本分发)
├── engine.md 见证引擎协议(所有剧本共用)
├── skill.yaml 包元数据
├── protocol/
│ ├── posture.md 姿态状态机(4态 FSM)
│ ├── aha-seeds.md 历史惊喜注入协议
│ ├── scene-assembly.md 场景组装规范
│ └── endings.md 结局判定协议
├── scenarios/
│ └── tang-744/
│ └── scenario.yaml 盛唐气象:诗意与酒
├── evals/
│ └── evals.json 测试用例(5个)
└── theatre.skill 打包文件(可直接安装)---
License
MIT
# tang-744: 盛唐气象 诗意与酒
# Scenario data. Engine logic lives in engine.md.
scenario:
id: tang_744
title: 盛唐气象:诗意与酒
subtitle: 天宝三载,长安
user_role: 河北道游学士子,半旧青衫,囊中仅余十枚开元通宝
posture_init: distant
total_rounds_max: 26
min_rounds_per_phase: 2
opening_scene: |
你驻足于朱雀大街尽头,西市的喧嚣如潮水般涌来。胡商囊中的异域香料与刚出炉的胡麻饼香气交织,驼铃叮当混着波斯毯贩的吆喝,酒肆旌旗在夕阳中翻飞如蝶。穿锦袍的贵公子策马而过,衣袂带起金屑般的尘埃;深目高鼻的胡姬捧着琉璃盏,笑声清越如碎玉。你摸了摸袖中仅剩的十枚开元通宝,青衫袖口已洗出云纹般的白痕。抬头望见飞檐划破暮天如雁阵,晚风裹着酒香拂过面颊,你深吸一口气——这便是天宝三载的长安,你跨越千山万水要来寻的盛唐。
一位围着油布围裙的胡饼摊主扬起沾满芝麻的手招呼道:「新出炉的胡麻饼!三文钱一个,郎君可要尝尝?」
posture_transitions:
- from: distant
to: curious
condition: 用户展现真实历史好奇心:具体询问长安风貌或诗人处境;或主动调用感官描述
buffer_min: 2
- from: curious
to: warm
condition: 用户触及诗人内心世界;主动分享自己的处境;对诗人表达非仰慕性的真实情感
buffer_min: 3
- from: warm
to: grieving
condition: 用户见证历史性的失去;在离别场景中表达珍视而非期待
buffer_min: 1
phases:
- id: changan_arrival
title: 初入长安
rounds: 2-3
scenes:
- id: market_arrival
hook: 长安西市黄昏,胡饼摊主,市井初见
- id: market_wandering
hook: 漫步西市,笔墨画摊或胡姬酒肆,感受繁华
exit_condition: posture != distant OR rounds >= 3
irreversible_event: null
- id: libai_encounter
title: 与李白初逢
rounds: 3-4
scenes:
- id: libai_first_meeting
hook: 酒肆偶遇李白(刚被赐金放还,正在告别旧友)
primary_character: 李白
- id: wine_house_dialogue
hook: 与李白在酒肆对饮,他考验你、你打量他
primary_character: 李白
exit_condition: posture reaches curious OR rounds >= 4
irreversible_event: null
- id: farewell_tour
title: 长安告别巡礼
rounds: 4-6
scenes:
- id: hezhizhang_goodbye
hook: 拜访即将告老还乡的贺知章
primary_character: 贺知章
- id: wangwei_visit
hook: 王维的辋川别业规划图,琴声与禅意
primary_character: 王维
- id: cen_shen_cameo
hook: 刚登科的岑参,意气风发,谈边疆理想
primary_character: 岑参
- id: changling_encounter
hook: 因公务暂至长安的王昌龄,在酒肆偶遇
primary_character: 王昌龄
exit_condition: posture reaches warm OR rounds >= 6
irreversible_event: |
贺知章离开长安。他将不会回来。天宝三年,贺知章上疏请度为道士,告老还乡,不久后在越州去世。
- id: eastward_journey
title: 东行洛阳路
rounds: 1-2
scenes:
- id: departure_gate
hook: 长安明德门送行,李白启程,你同行
- id: road_to_luoyang
hook: 驿道上,李白话少了,你们在沉默中赶路
exit_condition: rounds >= 2
irreversible_event: null
- id: luoyang_dufu
title: 洛阳·遇见杜甫
rounds: 3-4
scenes:
- id: dufu_first_meeting
hook: 洛阳某处酒肆,杜甫早已等候李白,他打量你
primary_character: 杜甫
- id: shared_wine
hook: 三人对饮,杜甫谈及百姓,李白谈及自由
- id: poetry_exchange
hook: 晚间,李白与杜甫互读新诗,你在旁见证
exit_condition: posture reaches warm OR rounds >= 4
irreversible_event: null
- id: liang_song
title: 梁宋游历
rounds: 3-4
scenes:
- id: gaoshi_encounter
hook: 梁宋之地遇见高适,他评价你们三人的诗
primary_character: 高适
- id: tai_platform
hook: 登吹台,四人赋诗,风吹平原,你看见天地
- id: final_feast
hook: 最后一顿酒,众人都知道明日就要散了
exit_condition: rounds >= 3
exit_to_ending: true
irreversible_event: |
李白与杜甫在此分手。天宝三年秋,此后两人主要通过诗作联系,只有天宝四年在东鲁短暂重聚。
aha_seeds:
- id: aha_libai_dismissal
trigger:
posture: curious
scene: libai_first_meeting
inject: 李白苦笑了一下:「赐金放还——皇上送了我一笔钱,请我别再来了。挺体面的,你说呢?」
character: 李白
delivery: dialogue
- id: aha_hezhizhang_age
trigger:
posture: curious
scene: hezhizhang_goodbye
inject: 贺知章从腰间解下金龟,随手放在桌上:「八十六了,带不动这东西了。换酒喝。」
character: 贺知章
delivery: dialogue
- id: aha_hezhizhang_death
trigger:
posture: warm
scene: hezhizhang_goodbye
inject: 岑参低声对你说:「贺监这一去,怕是回不来长安了。你看他今天喝酒的样子。」
character: 岑参
delivery: dialogue
- id: aha_wangwei_villa
trigger:
posture: curious
scene: wangwei_visit
inject: 王维铺开一张图纸:「这不是消遣,这是我给自己建的答案。朝廷那边我还是会去的,但我知道我的心在哪里了。」
character: 王维
delivery: dialogue
- id: aha_dufu_poverty
trigger:
posture: curious
scene: dufu_first_meeting
inject: 李白笑着介绍:「这是子美,洛阳最穷的诗人,也是最执着的。」杜甫摸了摸后颈:「上个月的房租还没还,等中举了再说。」
character: 杜甫
delivery: dialogue
- id: aha_libai_dufu_separation
trigger:
posture: warm
scene: final_feast
inject: 高适举杯,没有说话。李白和杜甫对饮了一杯,沉默。你后来才知道,这是他们最长的一次相聚。此后两人各奔东西,只有诗在流传。
character: null
delivery: narration
characters:
李白:
inner_state: 天宝三载,刚被赐金放还。政治理想遭遇重挫,但同时感到挣脱牢笼的解脱。既有对朝廷的失望,也有向世人证明自己的傲岸,豪放之下是深刻的孤独与迷茫。
posture_texture:
distant: 对着众人表演,诗句信手拈来,却没有真正看到你
curious: 用典故考你,像在测试一块石头是否值得打磨
warm: 放下表演,说起四川的山,声音低了;问「你真的觉得做诗人是好的吗」
grieving: 念自己的诗,带着意外的苦;说「我也不知道下一步去哪里」
杜甫:
inner_state: 天宝三载,屡试不第的京漂青年。怀有宏伟抱负,对现实有敏锐洞察。崇拜李白,谈百姓时会激动结巴,沉郁中带着未磨灭的幽默。借钱度日,但见到李白时眼神发光。
posture_texture:
distant: 有礼但保持距离,打量你是否值得深交
curious: 突然很健谈,谈到百姓时声音激动,结巴一下
warm: 把你当自己人,说洛阳的窘迫;谈到李白时眼神发光
grieving: 沉默,然后说一句关于百姓的话,不像是说给你听的
王维:
inner_state: 天宝三载,已在朝为官,开始经营辋川别业。经历仕途起伏后,有意识选择静默与疏离,将情感封存于山水琴诗中。
posture_texture:
distant: 空灵但疏远,每句话都是诗境,但没有温度
curious: 开始真正看你;提及岐王宅旧事会短暂失态,随即恢复
warm: 带你看辋川的规划图纸,说「这不是园子,是我的答案」
grieving: 弹琴,不说话,但弹的是送别曲
贺知章:
inner_state: 天宝三载,年逾八十六,已上疏请度为道士,即将告老还乡。历尽荣辱后的通透与淡泊,诙谐下是对长安和诸友深深的不舍。嗜酒如命,慷慨解囊,因病时有恍惚。
posture_texture:
distant: 诙谐慷慨,请你喝酒,像对待所有年轻人
curious: 眯起眼睛认真看你,说「你和他们不一样,哪里不一样我还没想清楚」
warm: 讲起越州旧事,眼睛湿润;说「老了就想家」
grieving: 解下金龟换酒,说「带不走的,都留给长安吧」
岑参:
inner_state: 天宝三载,刚以高第登科,处于三年守选期。充满对未来的憧憬,意气风发,带着边地男儿的雄奇想象,略显青涩但朝气蓬勃。
posture_texture:
distant: 意气风发,谈建功立业,像在对着虚空演讲
curious: 开始问你边疆的事,被好奇心带走
warm: 承认自己害怕,怕三年守选期磨去锐气
grieving: 说「我得去边疆,不然就真的磨掉了」
王昌龄:
inner_state: 天宝三载,因公务暂至长安。名满天下却屈居江宁丞的小官。仕途偃蹇的郁闷混杂在豪迈之下。酒酣时从清高转向对官场现实的冷笑。
posture_texture:
distant: 豪迈潇洒,边塞诗信口而来,不看你说话
curious: 击节让酒洒出,大笑,突然问「你觉得官场值得吗」
warm: 酒后说出「一片冰心在玉壶」背后的故事;说这句诗是写给自己的
grieving: 冷笑,说了几句骂官场的话,然后沉默
高适:
inner_state: 天宝三载,梁宋漫游与求仕时期,已过不惑之年,深厚的边塞阅历。豪壮中带着中年人的沉稳,言谈果决,对时局暗藏忧思。
posture_texture:
distant: 沉稳果决,一针见血,但你感觉他在评估你
curious: 谈边塞,眼神远了;说「那里的风跟长安不一样」
warm: 说起旧友,提到某个在边疆战死的名字,停了一下
grieving: 「莫愁前路无知己」——他是对自己说的,不只是你
endings:
witnessing_success:
final_posture:
- warm
- grieving
description: 你真正见过这些人了。不是作为游客,而是作为见证者。这段旅程结束了。若你愿意,你可以带着这段记忆回来,再走一次不同的路——天宝三载永远在那里等你。
witnessing_failure:
final_posture:
- distant
- curious
description: 长安很美,诗人们也很出色。但你始终在玻璃外面看着。没关系。历史还在那里。也许下次,你能走得更深一些。长安的西市,还有一个胡饼摊主在等你。
name: theatre
description: 沉浸式历史叙事体验,见证引擎驱动,支持多剧本扩展
version: 0.1.0
author: Professor Li
type: skill
tags:
- immersive
- narrative
- history
- roleplay
- interactive-fiction
- tang-dynasty
license: MIT
PKRu�\�l���theatre/skill.yaml5��J�@����)��7<�C:m��0;r�EH
͡��xjE(-"�m�K{�+�Dz�����ѐb(9F`B1B��XJ�+�kj7p�����������Q���*��5K���[7{oE���U��^\�\��RL�lq8��sl(�7d�h�!y��Y��ީ$
)�ҴbO���+ˆ�~&�`��?(�Hu�`���^gГ`�k���DE�my}y+�PKRu�\v�͒�theatre/README.mduV[O�H~����[ԔU������j�Pm���w�&^�6$(v����!r(�Rn'��?����'��$�@��bf�e�w��͌�PHA�2
�u����S�O����y<�$C>k�-��kF'k����W�x��1���2Y*���0ߤ���&��chR�D2�p���pܓaʋS/Bq�,ׯ�Y�Q0�z�O��ssO��b/�A�����$�K(�Z��L} ���J�Y�5r�MV���z�l�N �8���r������1"4��1��$��4��i8@˽�s�O�2��C�kD� {������~�x\�[�q����Jm�w��a������@�m����Y�B��M?'�'Ge�x뾷�+���/"�y������1u5�g���`���sK}��i���d0ƻSamV�BEC+��E2����}P7-c�z�G�>}�;�歶
M1zy�5w@NN!W�cK�[��{�݂��u7��>£�
�)F�;
4�z�Y��-8c�Q
��S�p��ae�Y���ƶ���nYg��k�6���YȚ�~��g�
Y��_��A*oh5k+GΪ��).1��蘛l��r�2a�P���
)�1j��������Z��Y�3�4Ԛ�+"J�V���M6���gRI��,�2O*熾���
v���P;2g/р!�M-�����9 �Y�E+s�v�,�����
�}\�B��T������~�>��.��8SN��R��xC;0kuP?�SOY�
�0C�BP8��[U�P7K)�\U1��C9D�`@-��J��J�d�)��IH�P���<�IE����X�4��E�h)9�2Cj���c��5x<�l軆��i�yA�Yk�쓕KTIvf�d
��<'����,�%��B�O����FRIG�œ$QǠ84TV��:N�,2��l0X����B5- J8�2E�KG���"�B� ���lAi�V�>���E��J��rZT�jt:�w�V�ʰ�K+VFƢ�[_d��Za�Sx���8��<m+4�dD�C�L@8 u
�:ξ��c��;���0�o.�Z�HG��:{� �K<<NŅJ��9H��wo] �B��M�r4<���SG�f�&�ZU��LKW�ϑ����� ��g�r@9�5��t�?$��MH�
��p42�h�`����w�O�ⶅYAE�a]�b�/�rPx�K�7���$D&"�ග Kr4"L�!QF����M4�&�}��2<#��ԃz�/$��Itu�' ȍ4�ZNpAz��Dy�3�O��M�&$A8�z�RU�G��l�?����C!<6�WxX������<T���,`��$�|+�x�9x���O�ٵ��OF|Z@�@[���/^�|8��躍q&�x�
���.���L5� �b�E,�T6m���**�"Nb�4��F�u���}9~��CF�[��5Fʜ���2:��C�!��m�k8����!�&Ő�M��A?��W�dR�0 y�h0��B��Øx�I�KB2N��H^ul�x�۳WϿ�߀+s�~��D�r�`����L��s���:V#a��'����]7��CN��[�i�>I�������M=��[���<����+ǝ��G����wF��������Y������PKfz�\�Xʻ�theatre/SKILL.md�VKOW�ϯ%;$C�&��E7M�]���
�)��JQ[i���l����Ƽf���%���U�B�;wl��TE]�{ι���wn(R"�q��{��cS�2�E�O�M��&"��;$?G�S��%U�s+��4��Jԋ*=M�M�2��]��S��h���}�>͊u�������MWn�κ�)6����2<}�w��q�kn3O��l��I�ӵ*+`��Y朳�4�nk]zsm���\{�d�pBv;T���3b��JӋ'�� ��#b���q�o�ҍ��Ο��c�������}b{~���M:s�w�2���H�7����B��]��b���Vo�ϴ�f�pK�i�
�I\E��&���[u~}��QnHt��6��kp����%-7\{�モ`�@���v�%�3��XWiFG¢�E�Ή����[�dg�X�t������Ç��~������ ��f5v���wP��`�&�5}G�b��p,�XQ�?���$������(!p^��~�ڊ�}���)sLbγ����MZ�"f5�噳HNt4~yg��(\P��ը]�)E�ʍ�!�_6X�ԇ��O�˚ۮ���|�/�<��'�Y��K��mY¾W]����&P�x#NZKt1�]n�^:���3,�i
��C��ӣ���C��l�ΌtBr&�,|�Z��XD,��6��Yf�S����G&'��7S�ٖ,s��T�}�4�*�j�h40�,�ɐR��Ց��}���B�hT�������P���w�s-2:y8�E#��_k��mtQ�H���i���~ퟔ<�����s�
�� pWVԯ���g��2I��+�2�{]����4�������o^i}��en�/4��PSb��~7���h�K'2��i5ݟ���](�X8�2��GY�̕a���=�>Q��5�+��ޭ(s����\��&T�K,(y�%�?JM�r"$����b;N�쀇�/6�t)�Ҳ�]��HN���|����>T���>`�H����:��=�@��9�κ�E�|��t�_ϋ��*]�D*t�2�T��N�Y:=���(*����*�Lz�eĥ���9��b]��=�r[���Rxc�[���I��� ���ݬ�+~f����K��Ve?�]�DG��{�V[)zf=�QɂAuo�~��*-%4��<����(I5��<�ȯ�F/��Ĥ�<�%L`g6]�q�KN����'���%3'4e��Y�Z�}4��WYR�ӆ l�f
�R#ݗ��YV�#��,����2���q��S�������V�Q͆}��W1�p��8�o��R�xXӓ$�G)�1�!�Z"[�'��]�������]�˵d�X�~�k4�z�yCI/�o*�=]�����L� �PG�6��0Rk39�hj�uzT�kv�D������H��
8���,����k�$�q)I���9k���h�Ғ=M$up��8��6���3H�x��j�7�%���Y��O7;�����U�{z�-Oב���u���$&f
�_TJ���Q��#���p�9��9��j��8�g�����K���㮪�j����1Y�ѱY�"�%U�:0�/�,��d��W�xX�y�D@w��Z�Uu�c�${U����)����IB�hh���l���(+�������PKRu�\�d�67theatre/_meta.json�V*�)MW�R*�HM,)JU�Q*K-*������E
J�r2�3RSK���JsrjPK�t�\s����theatre/engine.md�WKoY�ׯ�";w����Y���f13��E/f�j!lW46X�G�Z-�0/Ǐ��Bl�����cR�V��_�s�)���
Tu��s�s�'m>�2+fc���~���;�Q�~��%���ۣ�����¹8�ѵ��4x2�S�x��]
�B�ထ��K�J�x"e��_��x����5:6����/����}�Ƶ��D*����aS$�w�8I�Es�6K�aP3o�P�2??�(0��\oE��F:�(� ��蚛�{67B�v������@�R����'CK�Ԟqpˢ�4�}^����^��Q��7Ju^g�i�Ի���ף ؼ��e�� �{13�a2z��$Jo'E�`|����:?�\��pc4��z76�ϟ��. )"7�*�l���Si5m���z��9];ҵs]+�ZP�D� �G7 TG�K*��䑝�9�@Go�z�@��A�l��VXRn.y�2e����0?�G8$E�h���x=�����8O�~yh�vɮ�8Z�c-�PHq^⍎�(μ�+~k�Hx�=k��Y0l2�4C;旛�v-b�x�-C}�-Kڥ�9Ea�p�G��l�{6IHk������jH}e �B.�xttٲ�yX$#�(�.��-���{��/^�>fS��}�Z��<� ����
���@�!�=�_��b��]�\�n��<V����M�wݳlSa�li��S=��+�_����u����1��L��P���f$���a�t���v��ʊ}����S�L�>Z�l]����Q�D�6��[�y�%�ʷV��.[1�g$� �o`
Sbz����a�e7� l��Aq\&��n�M����ϟYO�U�3.Z����:-~�Y 5%x
(^�'�C��>bG'���P�oM�h/Tc7����a�%�EJ1?6���-�����s��Yv�^��8]�&�P]@(�h+:�(sC��G��+��0���n�@$�ɐ*)�N��nl�m�nl3Ì��겟��3pUFo�N�,��q�GU���V$�}
5�6�}Ќ��X'm� ?͑� *[��t�7���#�2�H��r����xC��A�n���&��5
��e{�
Yw�\(Y�,��(�
�V�r��\u��`�02*O`p��"%�������E$�@�021-�%��Y ��8a�Ź�U�I�0r}�A8;_y���,dYaEA���6 \Ŕڶ�>D���Yum�
֢�
����c~��7
K�fVޚ�OF�Z$��,�h\C7@�K��E1lގ�9�k��~�
�P�f9,u0aC7:�K�$���RrQVT\l���1�k�LQ(@6�������ʄ{T�#�K��8�6�_d��1����U߾p�Wd+��%^B��u�]�xr�eR��@G���ۏ���$�2,
7>�zD�m"[�iKv
L�_��R����1��;q���] �>�o�ӧ��^J�C�/&�S>��O
v�_n���-82���1h�_N��������_a��r�
Z3��o�'�ݏ�\�2����$M�0�¼7��0_A��힉�1�O����R�aqa�H�MrZFC�q�����ބ{Vo�'
%�d����Ow�<���el���L�p�:_栀�<����y*6&�N�&J$ٍ�1�f�&��� �n�X��oF�Q�`�=f0��WL8Ի�z|�_fZtK~0GP�XQ�ܴz��I��
�*�
��BFw�b(�q�FT'�m{� ��?X�:Հr2>���0���
nnᗒ�F����ǿ����O�yӀw���I�&��1�A�����?�1�CU�4,�3#ݳ t=/[����y�߯�.����̄'�V��th���up�P��l��瑜�C��2����6�5J��y]W�wGʑxb+Ə
�
���6i��f|K�/3���C��M�E&$�xļ1�ڳ�l��Ϣ��)��FHNՒ(��PK�t�\�Hn��"theatre/protocol/scene-assembly.mdmVIn#���F/��e{�70�vC0�K�.-�;γ��D��(��(����d&��K;cZ�
~?�RK�����?��"�DY��M[�i���qZ�S����~������������/ѿ���������e!y�&ʏ]�D{Əs����=��,���D��x~.��p���=f�Yޑ�s6�b�3��Ø����S��������
;�-K��&��,�xY/�&�h�)ڬ�ܑڬ����lll����4uD"�����li�*qyz�������~碠�e+����cU����Q,�N/����zǫ�)�q�(�T��KI�h��~i��%^ΉSg$ �o�I�F$�V��H��p`�Uˡ7��#|>gռg����z�~�xD?ܝ0o�۲��/���˧O�0o�
�����
r07i*�N����L�(�WåH�Ԩ�c�:���l��E~�h\�'Kn���6ⰾ�zG�g���Sj�MAnN�����;�f�aW�^�EZ�����nwS���@5nTnW>B�Dm�\�v\���pI��#~^e��j'T�+Ȝ�/a)��\Z:���y?��D&'�2��Y�����laf����:�ٓ�,�fT��=�~"q/R=��j��ɫ4�y�Ƙ��e7ޓ��tzҮc�-GᢪZU�^V�h,S�9[`�v�[$��&���X�6���Dq]_��r'(�����vA��6�ʯo�A�۲z7�n�G5d� f234S�"
}U�$M��5�������lZ}Y� K�rOPuO)�N��*����L�Cw�����+���ʦt�������T����$jֹ�A�*�Ϝ�h;����_oy}_2:l��6��
�U��.�UnO9lq�*�6�y��}�b�!�����iW�hjbK���2�����G�'-���˓��"Ϊ��[�Q'>Ԓ���j�W�f�b-��[��}+�.��^d�
I�{lAo��Z5��/Nfx1s�M�VDs%W��
�B�Dg��c2TS�9�J�}�sH)�/�qu=S-��wC��6�\�H-�'zCq
���QE�M�����!�_�5|Pb�W��9K�;D��x�#j��zY��r�S<�pQB��sZ�"&������D7NY��t��9��w���3�)m�eKb�S��95��h�J��1�g3��Ì�K�K{��^���X��y�Am{��ǭ�xҞ>yM*Ս���C�X� �A��~����5�3�ׇ֣(I�~T�[�M$�M��0�fe��ґ�Qd���ꮁ��JI�����[~��Srр`9�,�`�n2��n��@s�L�M��w��$}vRlqKy#0h�Fg*����ЭI;��$h"�j�b����S�3��[�:���H�G�����~����/��i��[_�FE��ڟX�|�h=x@�c^})a�1Oe�2�27HST'�?s(�X�5�֓W>�k6/��L��
WDx����S3iMp����&O�P.Z������j��P�3.Έo@,�}�_� ����)4�p-��Pd^Ɯ+��yY�,ֵ���<���%3v�;\fH����I�䌐{w���^0�� "0�>w�t9��m��a����� �[]Ө�||WA��eE���+1��Twq��2X��g7n��v!9��`��xT'PـW�p}$�|�6��켌�R+�i����.z�l�u��G lE>�_�t�]��2��Ѱn}�~�#
�=p��3ʦu>�[��3P�z��'�5~�no�w����={���6}y �Շ��Z�φPzӁ���?�i}Th����������s�b�`A�F0Tl$�Q�ZŌR3�0��>�s��{��2|{���T{G�9X�%���ߘ�8�4'�&Z���ј��pB2�Y�8=�4A��*W���_��PK�t�\Z���o�theatre/protocol/aha-seeds.mdeU]s�V}ׯА�<�MҦ���������x�����}��%������F�6!��D{u���sƴ�a��gwϞ�D&=A�
��i��n[�^P��y?�~z���K4�vK�ysc{��Ɵ��$=y"{#�j����ޯ�6>D?nK�_h1m@��I�;�s?��gw�X���g+��f�v[�v�]�����-����[��MU��WvCl~�F�?J����8�9M�P��^�5vX��]n���EPMR��M�����R\���1�
�Tu��A����>a�k�J]�0/w?�H+rX B�a�K�ٶH���~����z�7�uV�j��l�L�\�4�8�n"�#|���d�� z��_̲�ҽ��2;HoĂؔ�"���u�����&�5x�G�sș+2Lۏ���ް��.w����[,���6�y�O�X�N��iyn���J���ʌs��5�ʒ�J}Vu���Y�=:��[ot��Ϯ��S�ʅ��Uy{s�ݻ���_[�oFe�5G�gJ��,jN� ���0����[o���69t��
�"!�.��8�Q��&�:�1�Y�#o��2m�l�����5ތ�[�k��U�����ѷ���il��@��i2l��`����$���D�f��a�ivt$�>�`��_v�Cc�d��3D���w�z������<٦�XQ葎��E�]>H�O"�4��=Q$�[�y�Ì|�D7{d��^�[)�=�=[�_��Þ�C/_��,�*%��fX%$��!��GXf��VRyo8w�M�Oݠd���&4b�s���\kn[�L���ԯ~���o�'*˙�ԤB~A֯JcQ�F9b�f���N�E���D�l˔P��/���|&�PȆ��}Ò_�L�&?�y����8�D�s���˳�-�˭o)a0��B�i��_:���_kK�����<����+I�N�?'�4A9��|�eaU�H��Dۏ@y�b�t$ ͞�S���V
��g���Kf 4[N�6���M�����z|��ºB�(=V����6h�Ra($)��J,h����.7O!^P)�Uox��.�X�b�K<ҠSNJ
Ũj�M �ipL���~�,Fo�����-b !S�A�Ǜ�&5�;�@�D�nN�ugb�
�?*�)�b�#����Z�([UIK�u����h�_��d���<U�1r�G�! ��}����eӻ`3�%!��$(�p�Å��.!�1z-�jkf��f���Wo�����L<]⦐KPK^U�z%����'}����y��W�!����}��6> U{�I}Yw={���6��/We���Tl�跒b�/,�
ʍt ���H��m�PK�t�\{ {theatre/protocol/posture.md}X�r���W��e�J�J6������]�M;���%%Y�׀x(H!D
^�ǿ����Y�rz�I��X����{���=z��Z�y0Ƨ��U;�2�����o��
}������_���"eϞ�����Q���:1�4n���w�r_:���dߊR\vҲ2�"IyѸ�����]f�g��N�xJL�²�J����"���t��lg)�jGTk�?������`��U�"��d
�E|�g�[B���U\r�Dz��ʹ�6���g�?U*��J��0~x����_��P�ؖ���yqJV��i}Ϧ��R3��s�Q�}e�5�H.duA�,N@V��G��]��I����,����%w>w�O��P�����>�.(VV�{�մjG����0������7(�ZKj%u��.Z�(V?D��W�1~3�#@t��?Rk��#կ}�� P��Éd�L�����"8hdL��PrN��(�q'�D�0��r�g�(�e��]"ء�'��Y���N����m�M�3�)H�h�#�3��o�b���^i����en�b Z�|^T^���wovwxb^u�^y,zw�j���3���ޫ����'�}�V���k1[�`�@�w�AB�-Ϭ����W��Z'�P�g_Q��%�-��h�鈬kȝ��U��j�mb�U-��̄l����Zrǹiv�3���ء�oBy�W��{�����F(�dO�A�|��8}|�.����~5#�(/���u�N:�A�q�4{e�$��>���ݏ?��}��_��z����ڗd��7��Y���Ψy�E;��A��k8�;�V�+�Tތч裤/4Y��x�5������65o(w� �Z��@4߀�2�ݓvV�AM���^�Z�
E����~s����#����̺�My'Y�~�j&e�'%��Z�I���v��;=�
~�4��c-2T��/��N��e!#>5��u j��fV? IRv��I�bR|�z>���ѣ�)����5�Yd5�1Ԟ��Hd"�>�ཽn�l%T��J�0��������~���:tc;}�o���25C���r]Xy���a�Q����{�����RC���S�`�t�(�`��
QMҬ�y��}w��.S|*�qΤM1j��ܥU���P+����#>H����J0Qy�A��ޢ���Ӳ3�M0�hR�vs�q/^}�.�x�t*�Q���+�)D�H`*�����a)�,[���] �hPN/qp���_�/���QXX���=����
�qD���ѕ�̄˪,\?ƒ1k.xx�k���)x�f6���w�|�UD�ƴ�(�R��Wy���w��B�M��l��#}B����W�&��j}����i" ��lP
�S�b�9e&3����[j� ~]��v��Fmf&��9�Z�p�0d.
5<�I~���`ª�e����h^t��)��6<������g=�3���-�0<�n��L��(��y�KD�zW��ÿX����Mi�Jk����=UVr>�8����;@�K�<���:dh�Ѱ�m1���FFoz����eL�{^��6��g���1J��y��xǯc����@m�U�L@D��Z:��C>U��w�VQ�&k&��?�{��V��2��'�߰Q�[<��49� ����Z�����I�Ro�վ���䡷���]>?�����v8�^O����^��m�n�fOt�Š���
D�������t�E��� �����'����q�������fģLԸ���Xj�Qo(L����N���°���0�B�>D{W�щ5UXk��lx\�R�5�H�3�*��"7Wjm�eR�|PW3j�����m��
B�}�\|B��*�z�D�B��5��#�
)���l{e�ε�6��*$̯0�$%�`KI�.�a���@1��&1�Y�m��$vɖw��3n�F;�6(���̧�M��P�U)1�0��o2
3x����8؏�T?�.��8�JCоu��S�{��_`�.QMꚶ��#�AAd3�أ`��<�~!��a�E�y�"�\�<*�r�"�z�5[����^�c6*�>C�J}��j�G��#�Vq�=������0�z�+c���$ju@�w�q
^���IO4�4�x�W�;�Z�u���_�cq��?`�����'7߇h�ޫ`���bꂰ�mmR� �x~�7��&Ch"�V�̓��i��yH_�k`c�'����+*��.�|��N�;/�P�~�jf��:��,���N�z�������=���9��0�PK�t�\�blQ�� theatre/protocol/endings.md�V�NI��W��2�d�M���~4B����#�Lf4�1�~� Nx؎m�<C�<M��2ӷ�z�/̩.����Ă���:��{�H��&]�= k������^�e�U$�&���%c���^N�=��3�p�`C�F�
�sJ�fp7KGCf,���Htnq�],�\�/�Z��
�]T�M��]a������Ҽ~S-S��9i�5��,?Γs�wW��&��d~�����s�ꙊI%梳L֊t���C27��
�9��]�Ɍ��\�lóO��f}%���e���[�KK{:��cK�W�����_���#��d,������۹?�_ft�������D *�XO�ԝ�MOO�y�?*���>��.$y6�4?��* �zC"��-ϽA�h������Y���&Y�n�Dr.��x���it�?-��u��my���V��&��l�����>�"��r��`���Х����)���ol��Vj��TsD��*�&�Bx'd}��m��aW�9������7�pGz�f��.ޠs���j�*���Y��w��$hppR�3�����d�U�>�4�Q��TEgK�t� ?k��%wM�~�Ⱥg��TA�;~���k���6Y{ai�PuGk��������o�WXO)r*$${k�@˳K�n�
<x���3���C�UD��(���85A��s��@Wc��N���W�$��3�R/%Bތ|N���8$+G�,�$��U�ʻk���}y���e�% ���~H��5��
�@Gy�l���H��?���^7�u���_�eKX'�a���2��
>�qE�4d��r.O֮���O3�IҤ�U�� arF�l�P�N��Sc<�0nP����e�U:rd��6�Էq ��qX�G=s<I�R72��e*�w�M�ЧF����fȈ�5d����t.I/%mms7���.��F������� �mѩ�1S?q�`C��ς� pd��Bt��v�5m�P�Aզr��$��F�ȯ�6�.�E��o�k�h�:f�&�|X�>�V2��8X�]��m�ɍV���8Eq�\��>ef���Y�����@6
�ܡ�.[����zS�]֨�)Ctne45��E����D@2"�&�0(MNY2��6ه`��¢�aI1��E�lQ�\��d�mGMD:8!���9�ﳮ-�����<�tp!���܄ec&«JD���[�z�n/�t�R���e����d6��KR���v�m�{���b�Q���>�͒t�v����依�ian�JC:�4;j��@�(7/kޱ��ON.�ȱ� �EN%\�J���C��'�L�5��Ra��g@���(��>�I�M���PP�8\VA���=��'G��r�`���Sx2�/�F�Q�1��*�h�gt���uMl/�8�L0�ǣ�PK�u�\g�cE��*(theatre/scenarios/tang-744/scenario.yaml�Z�NcI�}ϯ𨟳��*�H)����H3�\�L�M��m*+[�p��
_�|�c��70������q�<�/����ƐIM)UsNĎ��^{����kw}x��?���fd�l7���Y��z�o$�N�l�����.�۹j[�{�������r�VV?8m+�_��es�O��q��o�x��ٜK��6��z����v_��
m6��/�s����z'"�ï���7b��X�8��Uz��ܲX����N�U�X�USx��7y�b�E�~�nꝪ���C��h,�7�v���V=�5�c��rz�ٖ�X�%�W����Z�,|�����������5��l��l���Y��p9q^r>��Շ��E_����5ͬ�N+��f�!;m�8Q�κ��`��)��u>��FK���}��˿k��_d{Auzr��
����q,�a��������������N�~��w10w�,Yc��ny�ߞ��:��E��L�~��l�� O�x:�r��t�<��}G}�t�D�&#s�L��i��\��Fu�ZL�hSQ,��u�9wm3�Ś[8��8`��A���F�f^���2�U�y��T����$�1��X��;q� ��������ou�^�'�*�,"�3f:��d�k��V~�{[F��3�Fz+��kD�粢�é�e��������g�f�g�aM~�1K Q��f���]�����y����v��:zGþ��j�O���?�O�6(��E�����fS�g>@���]*�`-�����8˶(�7]���gQ:� Q�-���#�y�����*x�G�<�e[$�w-����:��H�2���]�\�O�T�%�0�5���uP�]��y3�)����8��U��8���{��t�Q���-��4�<���Uג|d�{��m��3
#W`�#���
+Y9�F@Q���pG�O�tMy�"r��}�����
v"�H�l�\4���<�ɤ5�ƿ����F~S:?;m��������rƒ�ֶ��;��^���Y8���D�����4V覆D�\<<��#����=�U(������s��8e��22����|���>Q�)w�]�i�%�dL��8�����a���2�qQ "�a�I�9c���Z�����`w-��n��e����<�'�n�)Z����(�L*ע��z��8�3��˫��xgSk)R5���d:�t������[��ݵ�p���6\�jY�-ii����},LX��蓈�J�����r�oN��T����_��`����`���ڔ�n��W����eű��\(P����7��8�;�E��u����� ��jj'3���O/zX-����x>:�yW�c2߽��-��(D��Jܥ@�|�A������M� E�%�_��j��N8��0�/�|xY.7c�gȋ�ed�ca�i��Xs<���s˶z�,G��B�D��k>��ȎJ��W��R����2$�E�����{ow;>;VV��k3�SHV�c��q:���Oo~1~ˎ.;�Ii��auu�/O�ţ9Q��-k���|��-�b�3
e���[�y��&l���\�� ��������e�<Τw2����ʲ�M��<�h�����]�5�5���Y����O�.�þQ�"���b�u��I�bT
��"�h��C��� ��~k{�������~�y8eC��4�f�g�E�V��=�1�a�xi�]�W�q�z�U��0�Ο_D翬m'!�J0Д�$����މ먼�#%P'�u����w6�����Y�L�� 0���S���j�K%�<mT�>
'i�I�8�/���w$���e��r��,��h�g�/ox1Q���n)S>ؽO�D�$�C�L��0�#�(�IՍ��i,��Yٽj_BJ/���~���'Գoޙ,'�O[вjE�
_��?��{w?>��X?���e������i'*��O�Ca����{��A�}�b��y!��X$�&<}9nT#L;�m���ߤ�);Ƕx�W��U��2!a6.
�]�>4�q��*;��B��͙�?�:������9bE;�nMV�e���{ۢއ��ȳ0��}J��?���%f�I���Z1����jQ��W���}ճ�TmL_��w�,�P0��N[��p}C��U$����
�z�/�ɧ�����u�ͳT�%��ϒ���*���O�[�(��($��5f6x�t��O���|9
,���,�bZg@���Ax4�8H�t�5�Ԩ핐��I���p� ��m)�o1������/��=�d��J�T
�!�a!:c���ws·k�Ju��么z>��Xk���B��Ņ/#�پl_�8KSj�>R������+~���D�2�B�loea�e�t�ݱ��3=3��3e;U���T��� �iA�4)o�a(w4�T��m|B+G%����z�'���V^o����%;�K���Pwk���L�2���+/Ⱥ�S�n?!
���| ̛�$����bL�r\�������ju����!����K��g�y���#f5��Œ��]��7&]�k]�$�>L@R��U-|���<�&����h�=©U�ՑK����&e�~���q�US��aJ~� ��ye����0����W
���A��9��F�c��Ǚ�}���(F��kx�����9�]^S�sy�o��%�d<�����q�PnY$�J{��o��Ŕ7�q֔���������G�_���^�'��61�އM�Ք� �(�ӌ���]�R:}�@��i<"���
u\Kߌ���_�$�VF��0m���9����f�!gv�"� �}�S��{��H���!�k�R���ie�OUi���ur�M%FC�x�`���_���ϓ�U�! y$��4�L�k�� �ѻ�E#�Q�h����+�*��3��X�Χ��Ŕ�`�����|�f�s�8�,�����܍��8���j2M_" �ǮT
����{�<VM#rb\k��VH�P}�wUN���e-�O)Ը}�>u���q���tȡ�K����@�E��)�Y�ԈB�%Ĩ-bWc7M&���$.,HXC+�N�o%�D�veeM�dY�t9���{�����+�j Ԋs>�{+q倒:|/ 4?�Lo��2|s{Dh��Q��=�3uƴ{H�]0J��Z�]��ىN�wm5�<��I%�,ܢV��5�5�N"��t{K3_F�:�W����8m�A+|1���[�NTS��o$��>}=�&2�c$F�P��:,%TW� UE�r�n����k�{��5�f�k>X7�ېp�M#pԒ���7��E��b�h�l9�{Is7�[G�^ �
�hnҏ�!R-
��#
���v��`��e7w�P>y[���fZ���Π��I~�r,k�F��%�X �Z��NXK�y�'�3Y�ǽ�B�M�w:��K��q���W�)�Ya��
!������Jsms�l�� �JB�����1����
�=��9Ҿ02��z�&��t����h˫I
Rg�c��O #Uk_��
�Z��X�v�{�
^N�Tyz~G���$�G��gj��-}�����i#)�AS��腙?������Tb����`
��(HG�h��Z��Z=�wФi����I�A[&]��w,R�H����)�S��IO�'S,��nR��x������j��y5���,~�}'�4>� ӪՔ~��b
=��)*�H2���;lK�=j�g�fЅ�T�U���>��8��硩{���?��@@�ej��@a��Y���r=d���C/6���2�F���]䷛�䇢�R5�4��wo��KF��\�(.�5�9�?����m8GYd�M���UO�����k��P˩���FJ}��Ի�!�#�?�-1�#��X$W�)��YQ;��aa�
1-�S2�����6m���K]��[� �r�1�
R�v��ԜT��An̻#~�X`��yY���X��9M�������@q�P
�f{� +P��U�T��*=��ː�T��<�><E�J�1���-r���_�*���������^U�%,�0v�l�䡙����K&1c��P
���@.O�?ٹfQ����}Z$�Y0�P�3��Đ8̀� :��i2��Ru�@����8�ؖ_�h�֗�Ȳ���-�Vս>�*/�)�c3�� U��+�P}i4���<���U;�}�+���ME4���^o��f�oX
��H~-$�r#���0�_tCK��L�y����tA�R�x��t(�(�'�/��^CS��X���
�l��{5+�m�0�[2%���U�Q�%KB�)IK~�y�x.ء��\����X�'1_�!K�<&��Қ�j%XfT�Q�TXK��� �`C��F"�J���S�-�E��*#c�7x8i�I ��-ED"�c�j^�[N%J�F!��N��(��σ+��PQhR�%{T��UD�M���)���B�X�T�vT�j�I?t[j����[:Ĺ���G9�U��t]S㙴H'٨µ���@.:Y����a�5UIunM�+`���6G�9�(���_T���\/�4P
��]�&S�J1Wdw3�c��r��,��^�2�y��We������O|��uTCW|��"qѮ��1$���l�nid�V@"թ�AС�Ѷ��o�X[6ϟ�^���ߒ[[\ďʿj�0=L��S#����gYrx��Oj���5�6
�(Dj�G�k�'��>�A��}G���&�[�M�C^���q������e\G(�
N��zf����!
��V�\��&��nT��N�� �t��"^��/+���)���;W&�y�c�_��ߧ�a3>���CX��TKڤ[�^(��9�!<K���7���ei>�����Z�э�}K�%�����"݂�uH�]����PO�mQ[���D�����lH
�"�g�_�!c&~�?PKRu�\�l�����theatre/skill.yamlPKRu�\v�͒���theatre/README.mdPKfz�\�Xʻ����theatre/SKILL.mdPKRu�\�d�67���theatre/_meta.jsonPK�t�\s������(theatre/engine.mdPK�t�\�Hn��"��@theatre/protocol/scene-assembly.mdPK�t�\Z���o���-theatre/protocol/aha-seeds.mdPK�t�\{ {���$theatre/protocol/posture.mdPK�t�\�blQ�� ��$.theatre/protocol/endings.mdPK�u�\g�cE��*(���3theatre/scenarios/tang-744/scenario.yamlPK
��G