K1 内容可达性审计 · v1.0
审计日期:2026-07-14(Asia/Shanghai) 依据:当前源码注册链、运行时消费者与定向只读统计;不以旧计划中的历史数量代替 live truth。 目标:回答“哪些内容真的能被玩家消费”,再决定单域扩容;本审计不修改产品代码。
0. 结论
当前不应直接增加新 Buff、事件或成就。最高价值缺口是 已有内容未被真实消费或契约与文案不一致:
- Buff P0:16 个定义中 14 个标记为非预留,但
App.tsx固定summarizeBuffs([]),实际运行摘要始终为空;现有innStatusBuffBridge也没有进入 App 消费链。 - 成就 P1:4 个周目成就已进入 UI/结算桥,但解锁函数只比较
requiredRun;“7 天内无终局 / 解锁所有员工 / 声望 1000”没有对应条件判断。 - 事件 P1:13 张表、42 个事件已全部注册到选择器且 ID 无重复;当前主要风险不是数量,而是日窗/员工门失败时仍给
0.01权重,与代码中的“硬性短路”口径不一致,且没有选择器回归或重复度历史。 - 失败链:F1 v1.2 正在施工,审计冻结;不在活动文件上做扩容判断。
因此 K1-1 应改为 Buff 运行时消费闭环,不是 Buff 数量扩容。完成后再处理事件门与成就契约,最后才重新评估是否需要新增内容。
1. 审计方法
- 统计静态定义数、注册表数和重复 ID。
- 追踪定义进入 App/结算/UI 的 import 与调用链。
- 区分
defined / registered / runtime-consumed / player-visible。 - 不用
id:行数、文件数、preview 或旧计划目标值冒充内容规模。 - 失败链处于并行施工时只记录冻结,不读取中间 diff 作结论。
2. 事件域
2.1 实际规模
| 指标 | 结果 |
| :--- | ---: |
| GAME_EVENT_TABLES | 13 |
| BASE_GAME_EVENTS | 42 |
| GAME_EVENTS | 42 |
| storyline-* 表 | 2 |
| 重复 event ID | 0 |
各表事件数:
| 表 | 数量 | | :--- | ---: | | mainline-business | 5 | | mainline-tournament | 4 | | role-guo-lu | 1 | | role-bai-tong | 2 | | storyline-guo-lu-pilot | 1 | | storyline-old-ledger | 10 | | role-dazui | 2 | | role-mobei | 2 | | role-wushuang-qian | 4 | | side-official | 3 | | side-night-risk | 2 | | side-jianghu-atmosphere | 2 | | side-old-ledger | 4 |
2.2 消费链
src/data/eventTables/index.ts汇总 13 张表为GAME_EVENTS。src/data/eventTables/selection.ts的selectWeightedGameEvent()默认消费GAME_EVENTS。src/App.tsxtick 在满足 2% 触发条件时调用选择器,并把结果写入currentEvent。- 结论:42 个事件均在注册链中,不存在“文件已写但从未注册”的整表孤岛。
2.3 缺口
- 日窗失败、未招募员工等注释写的是“硬性短路”,实际权重为
0.01,不是不可选。 - 选择器直接使用
Math.random(),没有注入随机源,也没有回归测试。 - 没有事件触发历史或近 N 周期重复度指标,无法证明“扩容后重复感下降”。
src/data/eventTables/index.ts仍定义withOwnerScope()/defineTable()并转出查询函数,违反当前 AGENTS.md“数据层不放函数”硬边界;新增事件前必须先把构造/查询移到逻辑层,静态表与类型留在 data。
判定:暂不增加事件;先补硬门语义与确定性选择回归,再决定内容扩容。
3. Buff 域
3.1 实际规模
| 指标 | 结果 |
| :--- | ---: |
| BUFF_DEFINITIONS | 16 |
| 非预留定义 | 14 |
| reserved: true | 2 |
| inn target | 13 |
| staff target | 2 |
| meta target | 1 |
3.2 消费链
buffEngine.ts已有 normalize、冲突、时间窗、候选、应用与摘要能力。innStatusBuffBridge.ts已能从客栈状态生成 activate/deactivate 建议与 snapshot patch。- UI 已有 BuffPanel、SystemStatusPanel 和 SystemHubPanel 消费
buffSummary。 - 但
src/App.tsx当前固定使用summarizeBuffs([], gameTime),没有把 bridge 推荐或运行时 Buff 传入。
判定:定义、逻辑和 UI 都存在,唯一关键断点是 App 编排;玩家实际可见内容为 0。
3.3 K1-1 施工建议
lane:[长工]#K1-Buff运行时消费闭环@v1.0
文件边界:
src/App.tsx仅 Buff/inn-status 编排邻域。src/utils/innStatusBuffBridge.ts、src/utils/buffEngine.ts的直接缺口。- K1 定向回归;UI 原则上不改,除非现有组件无法渲染真实 summary。
验收:
- 客栈状态可确定性派生实际 active Buff;不再固定空数组。
- 正常、半营业、卫生风险、治安风险、夜间闭店、员工不稳至少各有边界回归。
- D1 的健康/心情风险只复用已存在的
staff_health_low / staff_mood_low,不新增数值。 - BuffPanel/SystemStatusPanel 显示真实 active/visible 条目,玩家文案无内部 ID。
- 刷新后可由当前状态重建,不依赖伪造的持久数组。
- lint、build、W29、Buff 回归与真实浏览器 smoke PASS。
非目标:
- 不新增第 17 个 Buff。
- 不改变现有 modifier 数值。
- 不同时修事件或成就。
4. 成就域
4.1 实际规模与消费
RUN_ACHIEVEMENTS共 4 个;AchievementsTab 可展示。playthroughRuntimeBridge在结算时调用buildRunCompletionRewardSummary(),可写 achievement IDs 和传承点。- 所以成就不是完全未接入。
4.2 契约漂移
| 成就 | 玩家文案条件 | 当前实际判断 |
| :--- | :--- | :--- |
| 初来乍道 | 完成第 1 周目 | playthroughNo >= 1 |
| 完美一周 | 7 天内无终局 | playthroughNo >= 2 |
| 全员到齐 | 解锁所有员工 | playthroughNo >= 3 |
| 客栈大师 | 声望达到 1000 | playthroughNo >= 4 |
除第一个外,后三个文案条件没有进入检测 context,存在“周目数到了就解锁”的语义错误。
判定:在 X1 结算稳定后开 K1-3 成就契约修复;先扩 context/条件回归,不先增加成就数量。
5. 排序与接力
| 顺位 | lane | 理由 | 进入条件 | | :---: | :--- | :--- | :--- | | 1 | K1-1 Buff 运行时消费闭环 | 14 个非预留定义对玩家实际为 0,价值断点最明确 | D1 回执 + 当前 X1/App 锁释放 | | 2 | K1-2 事件分层、选择硬门与重复度基线 | 42 个事件已够用,先恢复 data/utils 边界、保证不会越门并建立可测重复度 | K1-1 释放 App 锁 | | 3 | K1-3 成就契约修复 | 结算已接但 3 条条件与文案不符 | X1 回执稳定结算 context | | 4 | K1-4 单域内容扩容 | 只在消费链和测量基线成立后选择 | K1-1~3 实际证据 |
F1 失败域在正式回执到达后补审计附录;回执前不与活动代码比较数量。
6. 证据命令
node --import tsx --eval <event table registration/count audit>
node --import tsx --eval <buff definition/reserved/target audit>
node --import tsx --eval <run achievement/config audit>
rg -n "summarizeBuffs|GAME_EVENTS|RUN_ACHIEVEMENTS" src/**
审计结果只用于派工选择;执行 lane 仍需自己的定向测试、build、lint、浏览器证据和回退面。