N.E.K.O 小剧场设计决策记录
本文记录小剧场与剧本工坊的关键取舍:每条给出决策、简短理由和被否决的方案。当前实现合同只在小剧场架构维护;本文不复述实现细节,也不保存实验流水。
代码注释中引用的旧编号对应关系:“问题2.141 B1”见 D-17,“问题2.141 B3”见 D-16,“问题2.143”见 D-13。旧问题台账 7.122 之后的条目已按主题并入 D-35—D-48,代码中不引用这些编号。
产品与分层
D-01 只保留 Numeric v2 剧本模式,演绎迁入本体胶囊。 自由模式与剧本模式并存造成两套 Session、Prompt 与恢复链;在本体胶囊里演绎可复用真实输入框、历史区、Galgame 按钮和 TTS。
- 否决:把自由模式并入普通聊天——会把虚构演绎混进日常对话与记忆。
- 否决:保留独立演绎页——输入、草稿、音频与历史要在两处各维护一套。
- 否决:为旧页面保留重定向——无调用方,只增加维护面。
D-02 保持 Evaluator → Runtime → Actor → Guard → Store 分层,不重写框架。 各层分别承担概率语义判断、确定性结算、表现生成、复核和原子提交;两轮结构审查都没有找到可删除的层或死模块。
- 否决:删掉 Guard 让演绎“更自然”——Actor 首稿本身就会重复或替玩家行动。
- 否决:增加 Planner / Director / 动态剧情规划层——没有证据支持,且扩大模型权限。
- 否决:把各消费者的历史投影塞进通用上下文树——三者预算、作用域与输入形状不同。
D-03 推荐输入不是正式 Choice,与正文在同一次 Actor 调用中生成。 推荐只是可选的自然语言快捷输入,自由输入永远可用;同次生成避免推荐与正文事实分叉。
- 否决:独立推荐代理与隐藏
purpose / goal_id槽位——多一次调用且与正文脱节。 - 否决:开场/转场/安全过滤后强制刷新推荐——增加调用且不改善正确性。
- 否决:强制推荐或自由输入以“我”开头——玩家不该学习格式,主体由协议确定。
D-04 作者目标只是创作素材,不做逐项目标锁。 把作者素材变成逐项验收会反复追问、失证和卡幕;目标、道具和过渡描述允许被改写、合并或舍弃。
- 否决:
pending_goals、目标取证、完成锁存、DeliveryDirective——已退出推进链。 - 否决:
min_turns阻断换幕、多级 closing/awaiting 状态——拖长所有节点。 - 否决:用
scene_complete强制补出口——它是概率判断,实验中增加延迟且仍提交错误出口。
D-05 普通换幕只由“接受真实公开邀请”或“主动要求已公开去向”触发。 玩家行动权是产品底线;主动请求须引用当前场景已提交演出中公开该去向的原文,出处由代码逐字核对。
- 否决:“休息/睡觉/离开”等关键词路线条件——幕内准备与跨阶段结果必须分开。
- 否决:目标完成、推荐回合数或
scene_complete自动换幕——替玩家作决定。 - 否决:旧邀请可被任意含糊回复接受——隔轮回复需独有片段或最新按钮重述的确定性证据。
D-06 不兼容旧剧本包与旧 Session,要求工坊重新导出。 双语义并行会让运行时同时维护两套合同;旧数据不删除,但不再继续演绎。
- 否决:运行时隐式迁移或补字段——猜测迁移会产生不可复现的状态。
- 否决:新旧字段双写——长期维护成本高于一次性重导出。
事实、完成与出口
D-07 采用最小权威事实层:作者白名单 fact_contract + 单一写入口 + 可核验 completion_contract。 出口时机问题的根因是“结果是否已成立”只能从自然语言重推;把作者声明的少量事实做成白名单、由 Runtime 裁定写入,才能确定性地约束后续回合。
- 否决:让模型直接写事实——模型自报不是证据。
- 否决:通用实体/关系/过程图谱、世界书概率触发——属于跑团引擎需求,不是叙事剧场必需。
- 否决:每六回合总结替换原文、独立 open/resolved 事件库——会成为第二真值。
D-08 事实候选逐项校验、合格项集合原子提交。 整批拒绝会让一条坏引文拖掉同批合法事实;逐项隔离保持单项的白名单、类型、可见性、逐字证据、节点作用域与完成时态要求不变。
- 否决:整批全有或全无——实测丢失有效完成事实。
- 否决:放宽证据要求换取召回——会接纳“即将进入”一类过程态。
D-09 事实候选主要由已有普通复核顺带产生,Actor 候选只作补充。 Actor 同时承担写作与检测时遵循率不稳定;复核本来就读取最终正文,复用它不增加调用。
- 否决:只依赖 Actor 候选——正文写出结果时仍常省略候选。
- 否决:新增独立事实识别调用——增加延迟,且固定评测显示复用复核已足够精确。
D-10 完成后由作者写定出口兜底 fallback_offer 与接受输入 accept_input。 完成事实送达后 Actor 仍可能不公开出口;作者直接写定的一句邀请和一句接受输入可零调用补齐,且能表达多选邀请中的具体时点。
- 否决:再调用 Actor 改稿补出口——恢复已否决的概率修复与长尾。
- 否决:从作者
reason长文本启发式拼台词——语义不可控。 - 否决:通用“我接受这个安排”按钮或补推荐模型生成
accept_input——不能表达具体选择,后者还增加调用且语义仍会错。 - 否决:用中间事实打开出口——工坊用
trigger_fact_ids只把真正决定离幕的事实投影进完成合同。
复核链与延迟
D-11 可选模块开关化,默认只开 evaluator。 全开模式的复核与争议显著抬高 P50/P95;把每个模型步骤做成可关闭并写明代价,让用户在速度与保护之间选择。
- 否决:全部常开——延迟长尾不可接受。
- 否决:连
evaluator也默认关闭来追求约 2 秒——数值冻结、出口永不满足;2 秒只能靠合并判定与正文调用或更快端点。 - 否决:为提速放宽玩家授权、去向公开或原子提交——产品底线。
D-12 复核时间有界:快检 8 秒、争议单次上限 8 秒、整回合复核预算 20 秒。 长等待来自争议超时叠加改写,而不是单次快检;超时保留初判,因此时限只约束等待,不改变授权判定。
- 否决:30 秒争议时限——冻结反例显示边际收益小而长尾大。
- 否决:缩窄争议输入做“分级证据”——既有不变量要求争议与快检使用同一证据。
- 否决:接入更强模型与专用短思考参数——局部提速但仍漏演关键问话,已按用户决定回退,不按模型名猜参数。
- 否决:争议超时后仍追加 Actor 改写——正是 30 秒级长尾来源。
D-13 作者禁令窄判定 review_contract 只核显式违反。(原问题2.143) 提前到达一类越界需要当轮拦下;窄判定只看来源侧可见文本、只允许逐字复制禁令条目,并确定性过滤写作风格与玩家授权类禁令。
- 否决:把目标幕开场送去核对来源幕禁令——合法“到达”换场会被全部判为越界。
- 否决:只在 Prompt 中限定禁令范围——压测仍大量误报。
- 否决:把它当语义保证——隐含越界不会命中。
D-14 高置信违规不争议、邀请无效先改写、零调用归一明显自相矛盾的复核结论。 正文跳过争议只适用于程序核验的离场冲突或安全旁白裁剪;违规枚举与“替玩家”等理由措辞不能证明主体归属。对仅邀请无效的首稿,改写通常已能修好。
- 否决:所有违规一律争议——等待不改变最终修复。
- 否决:继续扩大跳过或归一条件——只在有结构化证据时收窄,不从失败理由关键词猜授权。
D-15 语义纠错耗尽后采用完整末稿(演绎连续性优先);技术失败仍回滚。 用户确认宁可提交格式完整、已记录兜底的末稿,也不中断演绎;兜底不计作复核通过。
- 否决:纠错耗尽后转场回滚——用户明确拒绝。
- 否决:按错误类型追加改稿次数——增加长尾且不保证修好。
- 例外:未授权主动转场或接受错误邀请由首轮独立闸门取消换幕并留幕,不依赖共享改稿计数。
- 状态一致性例外:普通末稿仍被判提前换幕时回滚;复核技术失败或预算不足以审查当前改稿时也回滚,不能用旧稿结论批准新稿。否则已交付地点和后台节点分离,后续修复会按旧幕把状态改退。
D-16 优先用确定性检查拦截可判定的结构错误。(原问题2.141 B3) 桥段吸收目标幕开场、普通回合提前写出目标幕独有事实、终局出现新问题、推荐断言未交付结果,都能逐字或按结构判定;Prompt 追加规则已被证明修不好。
- 否决:继续追加 Prompt 规则——判对但修不好。
- 否决:embedding/文本相似度阈值——不可解释且会误伤合理预告。
- 否决:向普通回合下发作者桥段原文作为“未来提示”——Actor 会据此写成现在时。
D-17 固定旁白由程序持有原文,条件触发要求可验证证据与交接方向。(原问题2.141 B1) 让 Actor 转述会被缩写或漏掉;条件触发曾被 Actor 本轮自己写的“已接过”自证。现要求接收语义有玩家递交表达或已提交历史证据,工坊另给“唯一证人是演员正文”的诊断。
- 否决:把日志/报告放进剧情方向让 Actor 输出——转述与遗漏。
- 否决:接受候选正文作为唯一证据——自证触发与主体错位。
- 未实施:固定文本“交付事务”(候选触发 → 复核 → 交付记录,Actor 预知本轮交付)。
D-18 普通快检不整段跳过。 历史样本中即使限定“无旁白、无待确认事实”,仍有约四成快检产生邀请、推荐或边界结论。
- 否决:按“无旁白/无事实/无转场标志”跳过——漏掉实质结论。
D-19 must_preserve 只要求不矛盾,只有 must_deliver 关键道具做缺失检查。 把保留项当逐字复述清单造成三次误报改写。
- 否决:逐字复述所有保留道具——自然改写即误报。
D-20 重复输出按来源标签限次重试,重复检测限定在同一场景访问内。 单一错误码无法区分同幕复读、转场来源复读和上一轮复读;无限重试放大等待。短对白(≤16 字符、无状态变化)不按重复拦截。
- 否决:全局文本相等去重——跨幕合法同文案被误杀。
- 否决:从“明天”等词推断自然日期——时间线只记录 Runtime 能证明的顺序。
- 否决:推测 Actor(并行预生成)——A/B 中 P95 变差、请求更多。
上下文与预算
D-21 固定一档输入预算,取消容量档位。 容量对照未证明普遍扩容收益;档位只增加测试与解释成本。旧档位名保留为同预算别名。
- 否决:三档不同容量——收益未证。
- 否决:收紧 Actor 输出上限以压长尾——出现超时与质量错误,已回退。
D-22 按需查找 Session 原文,只允许模型选择原文编号。 回忆旧事需要证据而不是摘要;代码核验并还原原话,结果只在本回合共享。
- 否决:模型改写的摘要事实库——第二真值。
- 否决:常驻全幕索引与完整历史重复注入——挤掉近期证据。
D-23 Prompt 去剧本化。 来自单个剧本的地点、设备、动作示例会诱导跨剧本事实污染;规则只表达通用权限、前因与归属,并有静态测试防止专名回流。
- 否决:为单剧本追加关键词规则——跨剧本污染。
前端、存储与记忆
D-24 本体持有开场请求,选剧页在可见接管后立即关闭。 点击到看见舞台的等待原本包含首次 Actor 生成;拆开后界面先接管,开场成功才提交快照与恢复指针。开场不再补推荐,单条合法推荐保留。
- 否决:选剧页等待开场响应再交接——点击后长时间无反馈。
- 否决:开场补推荐调用——串行拉长首句等待。
D-25 TTS 只朗读按坐标请求的已提交对白块。 逐块播放让视觉层知道每句何时结束;服务端从已提交历史解析,前端不提交文本;生命周期 revision 阻止退出后的迟到播放。
- 否决:整段对白拼接一次朗读——无法同步逐句显示。
- 否决:前端提交朗读文本——可被伪造、与历史不一致。
D-26 主动搭话抑制只存在于内存并随心跳传播;服务端另有带 TTL 的兜底。 服务端按角色记录最近一次剧场请求(120 s),拦截主动搭话与普通语音启动;信号 fail-open,宁可偶尔漏拦,也不能把普通语音永久锁住。
- 否决:临时改写持久化的
proactiveChatEnabled——剧场期间任一次保存会把用户设置永久写成关闭。 - 否决:服务端扫描 Session 文件判断剧场是否进行中——磁盘上的 active Session 不代表玩家此刻在演,会误锁语音。
- 否决:退出时清空全部角色的信号——会连带解除其他窗口正在演绎角色的兜底;释放只针对本窗口演绎的角色。
D-27 持久化键为 Story × 不可变 character_id,每组合一个恢复槽。 改名不丢进度,同名新角色不继承,切换猫娘互不影响;冷启动审计必须取得权威角色配置,否则中止而不是隔离。
- 否决:按猫娘名绑定——改名丢进度、同名继承。
- 否决:审计时使用默认人设回退——可能隔离全部合法存档。
- 否决:取消订阅在配置提交后清理剧场数据失败只记日志——完整演绎会永久遗留;改为提交前持久化清理意图,由冷启动维护按清单重试。
- 隔离区分层:Session、索引与公开冷档案隔离区都不自动裁剪,只随显式删除/遗忘在可回滚事务内清理。
- 否决:Session 隔离区按 mtime 保留最新 6 份——
os.replace保留原 mtime,同一轮审计会立刻删掉刚隔离的旧 Ledger(剧本包在事务外丢失时可一次删掉多份完整演绎);且隔离的 Session 都不是仍在的有效 Session 的可证明副本。
D-28 记忆只写一条确定性单集胶囊,完整公开演绎进冷档案。 让猫娘在日常对话中记得“一起演过”这件虚构的事,而不把 transcript 或隐藏状态混进现实记忆。
- 否决:transcript 进入 recent 或时间召回——污染日常 Prompt。
- 否决:前端拼接或直写记忆文件、在结束前台调用摘要模型——不可幂等、增加等待。
- 否决:删剧本时自动跨服务删除记忆——用户需显式“忘记该剧本”;保留“已删除 · 记忆管理”入口。
- 记忆浏览器把剧场胶囊显示为只读,服务端保存时原样合并回来。
- 否决:“暂不记录”只删除已存在的胶囊——超时后仍在处理的归档写入会在撤回之后落地,复活玩家拒绝的摘要;改为按请求 ID 与尝试编号持久留墓碑。
- 否决:旧回执仍有未撤回的记忆请求时让
/session/resume返回 409——续演入口会多出一个与本次选择无关的阻断,记忆服务离线时玩家无法续演;改为替换回执时把撤回义务转交给新回执(pending_retractions),先写新回执再删旧文件,崩溃后仍可收敛。
D-29 未实施的胶囊表现扩展。 迁移期提出的对白 performance_cue(情绪提示)、Live2D 整体 Shake/Bounce/Tilt/Approach、瞬时与有状态道具层,以及生成器 interaction_beats(G1)均未实施;重新立项需同步修改表现合同、编译器与工坊,不能只加 Prompt。
剧本工坊
D-30 工坊 SDK 迁入本体,无界面、由调用方选模型。 作者能力与插件 SDK、小游戏 SDK 平级;调用方持有界面与模型选择,生成成功不自动评分、修订或安装。
- 否决:放进
plugin/sdk/、services/theater/或插件总线——作者状态与运行 Session 会混在一起。 - 否决:默认工坊模型或新增模型设置页——用户要求调用方显式选择。
- 否决:迁入原独立工作台的网页、Flask 与跨仓 CLI 桥——SDK 不应依赖相邻仓库。
- 否决:“验收后冻结原独立工作台”——用户要求共享创作与评改规则继续两端同步。
D-31 工坊暂不进入桌面冻结构建。 SDK 目前没有界面或 HTTP 调用方;Nuitka 会跟随静态 import 打包,保留入口就等于打包。待有正式入口再恢复冻结包含与发行检查。
D-32 结构审查的已处理项。 运行端:删除无生产调用者的旧转场生成分支(持久化三段结构保留)、入幕固定旁白只由 Runtime 装配、Guard 证据表直接交接不再反解析 Prompt 字符串。工坊:Story Package 导入一次落盘、发布身份核对只做严格编译、JSON 修复不改写字符串原文、全局用量账本改为最近窗口、模型设置先落盘再切内存、发布拒绝空/过期回执、目标投影每仓只保留一份、作者目标元数据不再描述为运行时执行能力。后续全链清理:删除无生产调用的配置/对白辅助函数与未接入的事实包装方法(apply_fact_ops 与候选校验入口保留)、不可达的重复专用提示与无效参数、前端恒空或无读者的状态字段。仍有消费者的语义启发式(失败理由关键词、短词重合、固定窗口)不作为弃用代码删除,列为已知风险。
D-33 已评估但未实施的框架建议。
- 完整的回合事实/义务/交付态投影(事件主体、对象、结果与道具持有者):当前只落地证据投影、事实账本与玩家动作投影。
- Prompt 归属收敛到
config/prompts/、超大函数拆分、跨模块重复实现合并、numeric_v2_budget.py并入其他模块。 - 两端共享生成规则的自动同步校验(已发现过一处真实分叉)。
- 补推荐与正文快检并行(判定与正文合并为一次调用已实测否决,见 D-47)。
- 参考 DiceFrame 的更大方案:结构化提议通道、逐字段放行/夹取/丢弃、长调用返回后的 stale 丢弃与上下文历史梯。已采纳的只有 D-07—D-10 的最小事实层子集;参考实现为 AGPL-3.0,只借鉴机制、不复制代码。
D-34 其他未采用的实验。 短仲裁/短 Guard、原文引用式复核、结果优先生成、入口投影、“只生成当前回应、由程序关闭输入”、回合前状态参考及其共享、结局放行后追加复查、思考模式改稿、简化结局候选、同轮 scene_complete 强制出口:均未通过同版本正反例或带来额外错误与等待,不因存在实验代码而恢复。
复核定位、推荐与邀请(后续)
D-35 局部错误用结构化定位做局部删除,不再整段改稿。 安全对白常因一段越界旁白或末尾一句无效邀约被整段重写,多一次 Actor 与 Review;body_issues 要求原因码、字段、逐字引文并覆盖全部违规,定位不全就整组弃用,裁剪权限由解析器按本轮任务范围授予。
- 否决:从
failure_reason的字段名和动作词推断定位——措辞一变就失效,失败理由不承担权限。 - 否决:宽范围旁白裁剪(只看冲突位置)——困难集没有稳定改善,还漏掉对白中的同类违规。
- 否决:对白也有冲突、依赖事实/固定片段/邀请时仍裁剪——被删内容的衍生结果会继续提交。
D-36 推荐:单条合法即展示,复核删除后不补写,允许纯动作。 补推荐与复核后补写是串行等待来源,后者还会引入未经最后一次复核的新按钮;安静场景的纯动作选项被旧解析器整条删掉。没有可靠推荐时保留自由输入即可。
- 否决:凑满 2 条再补一次调用——多一次等待且不提升正确性。
- 否决:新邀请只剩一条时也不补——唯一按钮可能只是暂缓,不能充当接受入口。
- 否决:结构化动作/对白对象协议——补调用未减少,单条反而增多。
- 否决:展示后另发一次补推荐或窄推荐复核——仍误删合法询问、漏删过时选项,且多一个串行阶段。
D-37 展示依赖由程序结算,展示当轮清空预生成推荐。 推荐与正文同次生成,而条件固定原文在末次复核后才插入;模型把“等待显示”选项标成 after_display 的误判跨题材复现。展示依赖改为互斥 allow / reject / after_display 并按实际插入结算;实际插入 position=after 片段的当轮直接清空推荐,下一回合再生成。
- 否决:在旧违规数组外另加依赖数组——模型把同一项同时标成违规与依赖。
- 否决:靠“阅读”等关键词自动放行,或继续加长复核 Prompt 区分观点/代答与显示/内容——三种候选都没有稳定解决误删。
D-38 接受邀请与正文落点分开判定。 玩家原样点击刚展示的作者接受按钮、出口未变时由程序确认接受;落点是否符合实际出口由正式复核的 delivery_matches_route 单独判断,错误落点只改稿或回滚,不撤销已成立的接受。
- 否决:原文按钮匹配即视为全部授权——会豁免作者邀请本身与出口不符的情况。
- 否决:作者兜底邀请被复核判无效时仍清除
pending_invitation_invalid——作者写错邀请也必须取消。 - 否决:错误落点把被拒三段作为改稿底稿——会把旧场景原样带回。
D-39 漏判补查须引用本轮玩家请求原文(player_request_quote)。 历史去向真实并不证明玩家本轮要求前往;真实长轨迹中补查恢复屡被正式授权取消,多出 Actor 与 Review。缺证只清除补查信号,不丢弃同次复核的其他结论。
- 否决:只核对历史去向引文——无法阻止模型捏造“玩家要求去那里”。
- 否决:按剧本地点、人物关键词判定请求——跨剧本污染。
D-40 取消闲聊分类,统一走软节奏与邀请机制。interaction_intent 的纯闲聊合同无论逾期多久都禁止离幕提议,与“需要收束时自然推进”冲突。现在主观交流、动作与混合输入都先回应再复用同一收束机制;暂缓由本次访问的撤下邀请记录抑制重提,玩家明确改主意仍可接受。
- 否决:保留纯闲聊特判或隐藏下一幕方向——绕过自然与事实完成收束。
- 否决:冷却计时或到回合数强制换幕——替玩家作决定。
- 否决:暂缓后立即重新追加同一作者邀请——隔离验证中实际发生,打断玩家的选择。
事实与结构(后续)
D-41 复核开启时 Evaluator 事实先暂存,由同一次最终 Review 按编号批准。 事实曾在 Actor 生成前入账,让 Actor 把未确认结果当成已发生;正文完成事实只取最终 Review 的提议,不再与 Actor 候选取并集。Review 只能批准原操作,不能改值或借新正文补证。
- 否决:Evaluator 事实即时入账——提前落账后演出沿错误事实继续。
- 否决:四字段
key/value/source/quote简化协议——解析错误减少但语义核验更差。 - 否决:Review 开启时取消 Actor 事实提取——候选稿只写了开始或准备,复核仍放行。
- 否决:额外窄事实核对、开启思考或另设事实审计请求——仍漏判且出现超时,不值得多一次串行请求。
D-42 已满足的完成项给 Actor 引用原回合原文,而不是作者描述。 作者描述“玩家完成修复”与实际“角色修好”冲突时,Actor 同时收到两份矛盾输入;按事实写入 revision 引用该回合玩家输入与演出原文,超预算整条省略。它消除冲突输入,不修正旧存档里已经错误的布尔值。
- 否决:继续投影作者描述——与已提交历史互相矛盾。
D-43 “原文已展示”由提交记录判断(completion_contract.all 的 {fixed_narration_id})。 固定原文由程序插入,模型读到“已展示”却提议布尔事实,与实际交付脱节;改由 Runtime 从已提交展示记录计算,不增加状态或调用。工坊主线完成项可声明 fixed_narration_id 直接投影为展示条件;条件触发另可显式声明 player_handoff_required 区分触碰与递交。
- 否决:让模型提议“已展示”布尔事实——提议与实际插入可能相反。
- 否决:“事实触发旁白”扩展——事实描述的是展示结果,不能反过来作为展示前提。
- 否决:按中文关键词自动迁移旧包——旧包与存档不自动迁移,需调用方显式更新并重新编译。
D-44 Actor 与 Guard 接入接口级结构化输出,只作格式保障。 严格 Schema 在已核实的 DashScope Qwen3.8 Flash/Max 上消除 JSON 形状错误且不增加调用;语义质量另行优化,不把格式通过记作演绎验收。
- 否决:对所有供应商发送或失败后去掉 Schema 重试——兼容性未验证,重试会增加等待。
- 否决:同时改为逐轮历史重排——小样本只修好一个题材,另一题材仍倒退。
D-45 Evaluator 只容忍 fact_candidates 尾部因长度截断。 模型已给出完整核心判定(如 natural_ending_ready),却在事实尾部耗尽输出,整份丢弃会多走一回合。仅在 finish_reason=length、核心完整且截断发生在该数组内时保留核心、清空候选。
- 否决:修补或接纳残缺事实——没有可核验证据。
- 否决:放宽其他损坏形态——非 length 响应与其他位置损坏仍拒绝。
延迟与模型(后续)
D-46 不接入 Decision 模型与紧凑复核协议,仓库内实验链路已移除。 Decision 快约 1.75 秒,但漏检应拒绝正文并提议大量错误事实键,其中多数能通过 Runtime;紧凑 Flash 仅快约 0.3 秒、输入更多且有缺字段与漏检。按“没有明显正向收益就放弃接入”的要求结束该计划。
- 否决:以接口成功率和速度抵消剧情状态错误。
- 否决:保留专用评测入口与适配器——无正式调用方,只增加维护面。
D-47 等待优化只采纳确定性减负,以下方案未采用。 普通回合等待主要来自模型持续返回与串行修复;已采纳的是去重、局部删除、复用已审稿、按需裁剪输入和少补调用(D-35—D-39)。
- 否决:判定与普通草稿合并为一次请求——配对节省中位不足 1 秒,输入 Token 增加约 24%,重复拦截增多。
- 否决:切换流式请求——首内容多为 JSON 开头,完整耗时无改善;TTS 仍只播已提交对白。
- 否决:上下文重排、单回合连接复用——缓存状态不对等或只省约 0.1 秒握手。
- 否决:普通闲聊回合跳过复核——严格门槛下几乎无回合符合,放宽后会漏掉事实与边界检查(补充 D-18)。
- 否决:推荐预生成或投机并行——用户优先减少用量;未选分支必须隔离,文本就绪也不等于语音就绪。
- 否决:拆分正式转场为两次串行生成——输入近乎翻倍,桥段与目标段更易重复。
D-48 演绎质量只接纳有复现证据的局部修复,Prompt 与模型候选不按单例追加。 状态连续性、观点/代答、能力说明、开场重心等问题的多轮 Prompt 候选在冻结正反例上都没有稳定改善,Max 同输入对照也不稳定;继续为每种自然动作追加程序例外会累积误杀。
- 否决:加长复核条款或加入短对照例——误杀与漏检互换,或出现超时。
- 否决:按播放顺序声明输出、重命名作者状态、恢复模型状态摘要——仍有持物倒退。
- 否决:开场补入作者
narrative_focus、工坊自动补写能力合同、展示后防重复提醒——未通过准入或破坏合法重读。 - 否决:开启 Flash 思考——小预算仍错、大预算长尾显著。
- 否决:以 Max 单例成功作为切换正式模型或暂停框架治理的依据。
D-49 复核发现错误推荐时撤下当稿整组,保留已审正文。 逐项删除曾留下与被删按钮共享不存在邀约的其它按钮,点击后又把错误前提写进历史。用户接受少给推荐;撤下整组不推断按钮间的语义关系、不增加请求。没有错误的组仍可展示单条,经过程序核验的作者接受按钮沿用现有提供规则。
- 否决:新增依赖图或用关键词匹配关联按钮——增加状态或误杀面,尚无验证依据。
- 代价:同组的正确推荐也会暂时撤下,自由输入继续可用;整组均被复核漏过的问题仍可能交付。
- 局部删除独立错误旁白或末尾邀请不再要求剩余推荐非空;正文定位、引文、事实与展示依赖保护保持原合同,避免撤组反而触发整段重写。
- 新邀请插入作者接受按钮时同样核对本轮已消费输入,不把解析器刚删掉的重复动作重新加回;不改变 Runtime 的邀请生命周期。
D-50 作者公开文案与创作要求使用既有字段分开表达。 幕后承接说明写进结局开场后会被原样展示。工坊生成、完善、续写和获准的单节点修订共用公开文案合同;可变历史细节无法确定时省略,约束留在状态、禁令和转场保留项,不新增输出字段或模型阶段。
- 未采用:让综合文学评分额外承担可靠的调度说明识别——隔离候选出现协议失败,尚未验证为稳定保护。
- 剩余风险:写作合同不保证生成必然遵守,已安装坏稿仍需显式修订、编译与发布;既有固定原文不由运行时或自动修订擅自改写。
D-51 道具生命周期不自动成为跨幕永久状态。 工坊曾把道具规划里的初始位置、持有人与操作结果自动拼进出幕保留项;实际演出允许玩家改变这些状态,旧快照因此与历史同时约束 Actor。主线携带项和支线出口自动投影仅保留名称、用途,完整生命周期仍保存在作者稿;作者显式保留项继续导出。
- 否决:运行时按道具或地点关键词删除作者文字,或让模型再造一套状态存储。
- 剩余风险:作者显式保留项、开场和角色状态仍可能相互冲突;须修订对应稿件,编译器不判断所有自然语言矛盾,已安装包不自动迁移。
D-52 终局问号只触发按需语义核对,不直接证明有新问题。 普通招呼和修辞反问也会含问号。启用复核或作者边界核对时,复用已有窄判定,只查候选是否真的要求下一轮玩家回应;确定有新问题才改稿,完整 Guard 仍核对其它合同,技术失败原子回滚。
- 否决:在完整 Guard 继续追加终局解释并依赖其单个路线布尔值;冻结正反例没有通过,不采用。
- 代价:带问号的终局稿按需多一次小请求;改稿与后续新稿分别核对,不能用旧判定批准新文字。无问号、非终局不加调用;两项语义开关都关闭时仍采用原保守检查。
- 剩余风险:窄判定仍可能误判或超时;自然结局授权与其它正文的 Flash 复核误判独立保留,不因某次 Max 正确就切换正式模型。
D-53 关闭或故障降级的邀请授权采用保守合同 A。 Actor 的 transition_offered 标志、正文中的作者邀请原句,都不能独立证明邀请当前有效;后面的自然语言可能撤回前面的邀请。Review 关闭时,只在原有完成合同已满足、路线有效且作者发声合同允许的情况下,由程序在最终正文末尾追加作者 fallback_offer,展示对应 accept_input,并在同次 Ledger 提交中记录路线、原文和完整可见内容。
- 关闭 Review/Evaluator 或 Evaluator 故障时,确定性接受要求这份程序回执属于最新提交、原始邀请和当前路线一致、展示内容未变、玩家精确选择对应接受输入;Actor 自带的同名字段不被采信。旧 Session/Ledger 不删、不迁移,也不根据旧标志补造回执。
- Review 关闭、Evaluator 关闭/故障或语义复核降级时,后续自由对白使旧邀请失效,同时撤下相应推荐。无法判断“只是追问”还是“已撤回”时,选择不沿用授权;成功语义复核的正常路径仍保留跨回合追问后接受。
- 收益:拦住幽灵邀请、原句后撤回和过期按钮的确定性转场;不增加模型调用。不用撤回关键词,也不把整段正文末尾匹配当作任意 Actor 邀请的语义证明。
- 代价:未经复核的真实 Actor 邀请也不再自动授权;缺少完成合同或作者邀请/接受对、禁言或内容超限时,不生成程序兜底。自由追问之后不能继续点击旧邀请推进;这是有意收紧行为,不承诺读懂任意自然语言撤回。
- 默认 Review 关闭时,自由打字或语音中的同义接受也不授权;仅对应按钮可确定性接受。当前访问已签发过程序邀请后,过期或暂缓不自动反复重提。完成与路线等原有签发条件都满足时,只有整份实际可见内容块与作者邀请完全一致(含作者写定动作,没有任何额外前缀、后缀、动作或旁白),程序才可接管当前正文签发回执、不重复追加。末尾出现作者原句不能证明前面的对白没有否定它;其余作者原文只用于拒绝自动补签。该收紧会拒绝 Actor 增添微动作的作者引文稿,玩家可在完成合同、当前路线与作者发声条件仍满足且没有活跃邀请时,点击“重新邀请”:只提交新邀请与真实回执,不自动换幕、不调用模型、不改变数值或幕内回合计数;再点击新接受按钮才推进。旧按钮仍失效,不自动重发;恢复入口也覆盖带额外动作/旁白而没有签发的作者引文稿。缺合同、禁言或终局路线仍不显示此入口。需要自然语言邀请/追问/接受体验时启用成功语义复核。程序邀请只给出其签发的接受按钮,不保留看似等价的 Actor 接受推荐;接受原文已经作为本轮输入消费时不再追加邀请文字。
已知风险与未验证范围
- 冻结桌面构建:工坊不在 Nuitka 构建中;小剧场运行端(含选剧页、胶囊、TTS)没有在 Windows/Linux/macOS 冻结发行物上做过端到端验收。
- 真实设备 TTS:自动测试只覆盖桥接、坐标校验与降级语义,实际发声、逐句衔接与普通语音抢占需人工验收。
- 完整通关 QA:只有部分剧本和路线有到结局的后端轨迹;没有全剧本、全路线、真实桌面 HTTP 与三张不同角色卡盲测的验收。仍有剧本因 Actor 同幕复读(
earlier_session)连续回滚而停在邀请形成之前。 - 默认配置的保护面:默认只开
evaluator,玩家授权、去向公开、动作归属和作者边界没有模型复核,只剩 Evaluator 意图判断、引文出处校验和确定性检查;条件固定旁白在默认配置下不会触发。 - 模型行为开放问题:公开引文漏接、邀请/接受与玩家归属错误、最终问答遗漏、固定文本时序、留幕阶段偏离、道具持有者与位置倒退、替玩家下结论、推荐编造未建立的事实、跨回合同义重复与重复计分;复核误杀/漏放只在冻结集上量化过。最近两题材压测仍有已交付的状态倒退,且一部未到结局,未达 90% 目标;修复后的单项验证不能替代完整回合验收,助手审读也不等于用户人工验收。
- 已定位未修复:动作投影把括号分句中他人动作的“离开”误判为玩家离场(
_departure_is_explicit()),错误的离场约束会进入模型输入;修正候选尚未合入。复合完成事实只取本轮正文证据,跨回合分步完成的支线可能长期不满足完成合同。作者fallback_offer若含幕后调度说明会被逐字展示,需由作者内容修订。 - 工坊自动生成质量:结构检查能定位损坏的固定原文数组与引用,但自动生成稿仍有主体错位、预写玩家行为和作者约束遗漏;进入压测的包均经过人工校稿,不能视为自动生成通过验收。
- 延迟:保留
evaluator时每回合下限约 6 秒;全开模式普通回合 p50 约 10—11 秒,仍有 20—45 秒级长尾(主要来自 Actor 重试、改写与供应商单次慢响应或超时);争议复查在当前配置下多数超时,其价值未证实。首句等待仍取决于首次 Actor 推理。 - 容量与并发:活动周目的 Session/Ledger 不限回合数和文件体积;不支持多进程同时写同一剧场根的整体事务;工坊不支持多进程共写同一作者目录。
- 自定义端点:争议思考参数只在已登记模型上生效;接口级结构化输出只对已核实的 DashScope Qwen3.8 Flash/Max 发送,其他端点仍靠 Prompt 与解析器约束,兼容性未验证。
- HTTP 写入边界:
/api/theater-numeric的写入端点已走本地 mutation/CSRF 校验;读取端点不经该校验,只返回公开投影。
