Files
xsl 0652c2f0e6 research(hunt-sim): 10 人并发在线模拟×多 agent 设计迭代——研究设施与全套档案
研究命题(00-plan):验证并打磨《围猎》联机纯音频体验——不是逻辑能跑通,
而是真人玩起来是什么体验、愿不愿意再来一局。

设施 web/harness/hunt-sim/(可复用,零依赖):
- arena.mjs 编排器:起真实服务器(随机端口+临时数据目录隔离),10 个拟人客户端
  经真实 WS 同时在线,错峰组队、真实时长对局、局间状态跨轮维护
- sim-client.mjs:game.js 行为移植(协议+手势路由+R1-R8 音频调度逐字节对齐),
  产出「玩家耳朵听到什么」的感知时间线(语音全文/loop 方位音量档/喊话/震动)
- brain.mjs:人设大脑——察觉延迟/前后判读(以真值为条件的正确率模型)/掩蔽放大/
  冷却乱滑/技能囤积/呼喊倾向/分心断网,全部随机判定用按实体 id 哈希的独立抽签
  (mulberry32 流会被刷怪座位轮转结构带偏,实测造成系统性镜像反转,已证伪)
- recorder.mjs:每人每局 events.jsonl 全量 + percept.md 感知转写 + 对局速览

研究档案 research/hunt-sim/:
- players/:10 人配置(LLM 亲笔)+策略自述+逐局去留决策+人设终评+退游者重访
- rounds/:v1 三轮(R0 教学+R1/R2 真人快速)+ v2 复测两轮,共 48 局全记录
- analysis/01-04:数值曲线/音频信息设计/协作社交/上手留存四视角报告
- synthesis.md(S1-S9 裁定)、metrics.md/metrics-v2.md(两版对比总账)、report.md(总报告)

v1 核心发现:10 人 3 轮 28 局 100% 胜率 26S/营地零损耗;击杀垄断(专家单人 30/39);
呼喊 3 次/28 局应答 0;N/S 前后判读仅 63/69% 可命中;四种退游死因
(失衡/社交真空/交互摩擦/观光无聊)→ 详见 report.md
2026-09-19 11:06:07 +08:00

341 lines
22 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 01 · 数值与公平性分析(Q1 难度曲线 / Q7 天花板)
> 分析视角:数值曲线 + 击杀经济 + 评级 + 匹配公平。数据源:28 局对局档案
> (`rounds/*/matches/room-*.match.json`)、`metrics.md`、`players/P01|P05|P07.review.md`、
> 对照基准 `web/server/test/hunt-balance-scan.mjs`(本次实跑 24 seeds,输出见 §0)。
> 代码口径:`web/server/hunt-room.js`(WAVE_TABLE / BOT_TUNING_DEFAULT / gradeFor /
> ATTACK_CD_MS / MELEE_ETA / LAYOUTS)、`web/hunt/game.js`(killBandId / 进度 best)。
## 0. 对照基准实跑(2026-09-18,默认参数)
```
[idle 真人挂机,2 bot 独守] 胜 18/24,mean dur 3.3(负/≤3 命中 17/24;A1 B6 C11)
[bot 3 bot 水准局] 胜 24/24,mean dur 7.5(6-9 命中 17/24;S8 A10 B5 C1)
[optimal 人类上限参考] 胜 24/24,dur=10 ×23 / 9 ×1 → S×24
```
**关键读数**:扫描的三档全部是 **1 真人 + 2 bot(3 座单人房)**;不存在 4 人档、
不存在混合水平档。而实测翻车的恰是 3-4 真人房。**扫描口径本身是本次失衡的盲区**
(详见发现 1.4)。
另一处账目勘误:`metrics.md` 称"6 局真人快速局",房间档案实为 **5 房 / 18 人次**
(R1: JBP5/NTGV/P5CA = 4+4+2 人;R2: 3TJY/94FQ = 4+4 人)。「快速局零损耗」结论本身成立。
---
## 1. 发现一:难度曲线失效——根因是「波次输出被团队吞吐淹没」,不是 bot 强度
### 1.1 现象(数据)
- 28 局 28 胜(胜率 100%),评级 **S×26 / A×1 / B×1 / C×0**(`metrics.md` 总账)。
- **5 个快速房 breaches 全部为空数组**,营地耐久终值恒 10(room-JBP5/NTGV/P5CA/3TJY/94FQ)。
- 逐波 breach 只存在于教学局(单人+2bot),真实波次合计仅 9 点伤害,散布在 w2:2 / w3:1 / w4:2 / w5:4——**没有任何一波形成压力墙**,曲线是平的。
- 波次出清速度≈刷怪速度本身:快速局各波时长 18.6-27.2s(events.jsonl 对账),
接近 WAVE_TABLE 的刷怪跨度(如 wave4:9 只 ×1.8s=16.2s 跨度 → 21-24s 出清)。
怪**进入内圈后中位 0.8-1.8s 即死**(死亡 eta 中位数 2.2-3.2s,内圈窗口起点 4.0s,
5 房明细:NTGV med 3.20 / P5CA 3.20 / JBP5 2.20 / 3TJY 2.90 / 94FQ 3.10)。
### 1.2 吞吐算账(根因链第一环:波次表输出 < 团队击杀容量)
以最难的第 5 波计:
| 量 | 值 | 来源 |
|---|---|---|
| 峰值到达率 | 12 只 / 1.5s gap ≈ **0.67 只/s** | WAVE_TABLE[5] |
| 3 座攻击吞吐 | 3 × 1/2.5s = **1.2 杀/s**(1.8 倍冗余) | ATTACK_CD_MS=2500 |
| 4 座攻击吞吐 | 4 × 1/2.5s = **1.6 杀/s**(2.4 倍冗余) | 同上 |
| 旋风斩追加 | 每座每 8s 清空内圈全部(快速局实测 108 次、清走 63/195=32% 击杀) | SKILL_CD_MS=8000 |
且 `buildWaveScript` 按 `seat = i % seatCount` 把怪**轮转发牌到各防区**:4 座房每席
第 5 波只分到 3 只(≈10s/只),而单席击杀容量 0.4 只/s + 旋风斩。**WAVE_TABLE 不随
seatCount 缩放**(LAYOUTS 分 3/4 座两套,波次表只有一套)——4 人房等于把 3 人份的
压力摊给 4 个人分担。
### 1.3 根因链(按因果顺序)
1. **波次表按「3 个 bot 水准」标定,而非按真人**:§3.4 平衡目标"solo 余 6-9(A/B)"
的参照点是 `botDecide` 循环(hesitateP 0.8、reactBase 2.0 —— §15 裁决 10 故意调钝)。
实测教学房(1 真人 + 2 bot)mean dur ≈ 9.1(6×10、3×9、1×8、1×6),显著高于
扫描 bot 档的 7.5:**哪怕最弱的真人(P03,个人仅 10 杀)也净贡献 +4~6 点耐久**,
因为真人出手 eta(3-4s)天然早于 bot 反应带(≤2-3s)。真人 ≥ bot 是设计意图
(§7.2"给真人留出比 bot 强的空间"),但波次表没有为"真人水准"重新加压。
2. **难度不随座位数/水平缩放**:4 座房沿用同一 39 只总盘 → 团队吞吐冗余从 1.8× 升到 2.4×。
3. **真人房≥1 个高手即封顶**:optimal 档 23/24 = dur 10——单个最优玩家就能把耐久打满,
房间结果 = f(最强玩家),与队伍其余人几乎无关。5 个快速房每房至少 1 个
(P01/P05/P07/P02/P10),于是 5/5 零损耗。
4. **评级阈值落在饱和区**:`gradeFor` 的 S 门槛 dur≥9(≤1 点损耗),在吞吐 2 倍冗余下
恒可达 → S 是众数(26/28)。
5. **扫描工具无法发现上述一切**:`hunt-balance-scan.mjs` 三档全是单人房,无 4 座档、
无混合水平档——失衡的构型(3-4 真人)从未被标定过。
(bot 强度本身**不是**根因:idle 档 2 bot 独守尚有 6/24 失守、mean 3.3,bot 下限合格;
问题是波次输出对"真人+多人"这一档没有任何加压机制。)
### 1.4 修复提案
**F1(P0)波次输出按座位数缩放** — `hunt-room.js`:
- `buildWaveScript(seed, wave, seatCount)` 内对 `WAVE_TABLE[wave]` 做有效规格换算:
`wolf' = round(wolf × seatCount / 3)`(4 座 wave5:10→13 狼),`gap' = gap × 3 / seatCount`
(1.5s→1.125s),熊维持绝对数(重威胁稀缺性保留)。WAVE_TABLE 常量不动,新增
`scaleSpecForSeats(spec, seatCount)` 纯函数(可单测)。
- 改动面:hunt-room.js(+设计文档 §3.4 加"4 座换算行")。
**F2(P0)房间热度导演(水平自适应加压)** — `hunt-room.js`:
- Room 增加 `heat`(初始 0)。每次 `waveclear`:本波零 breach 且 `dur === DUR_MAX` 且
`wave >= 2` → `heat += 1`(上限 3);本波有 breach → `heat = max(0, heat - 1)`。
`startWave` 应用:额外狼 `+heat` 只、`wolfEta - 0.3 × heat`、`gap × (1 - 0.08 × heat)`
(常量建议 `HEAT_MAX=3 / HEAT_ETA_STEP=0.3 / HEAT_GAP_FACTOR=0.08`)。
- heat 由确定性事件(breach 有无)导出,**不消耗 rng**,seed 复现性不破坏(§3.5 纪律)。
- 作用:高手房自动爬压(P05"P5CA 式碾压"不再恒 10),弱手房天然漏怪 → heat 归零不受罚。
- 改动面:hunt-room.js + 设计文档 §3.4/§7 新小节。
**F3(P0,验收工具)扫描扩档** — `hunt-balance-scan.mjs`:
- 新增模式 `bot4`(4 座全 bot 水准)、`opt4`(4 座 optimal)、`mix`(1 optimal + 3 挂机),
验收口径:F1/F2 落地后 `bot4` mean 落 6-9、`opt4` mean 8-10(S 可达不恒得)、
`mix` 落 5-8。**F1/F2 合入前不得视为完成**。
- 改动面:test/hunt-balance-scan.mjs。
### 1.5 预期指标变化
| 指标 | 现值 | 目标 |
|---|---|---|
| 胜率 | 100%(28/28) | 85-95%(弱手房可输、高手房赢得有伤) |
| 快速局零损耗房 | 5/5 | ≤1/5,房均损耗中位 0 → 2-3 |
| 评级分布 | S 93% | S ≤30% / A≈40% / B≈25% / C+失守 5-10% |
| 第 5 波死亡 eta 中位 | 2.2-3.2s | 保持 2-3s(高压来自数量而非读不到) |
---
## 2. 发现二:击杀垄断——「先到先得 + 出手权无协调」的结构性结果
### 2.1 现象(数据)
快速房击杀分配(killsBySlot,含旋风斩清怪归属):
| 房 | 分配 | 最高份额 | 0-1 杀者 |
|---|---|---|---|
| R1-P5CA | **30**/1/4/4(P01) | 77% | P03=1 |
| R2-3TJY | **27**/1/4/7(P07) | 69% | P08=1 |
| R1-NTGV | **19**/5/15/0(P05,P07) | 49% | **P08=0** |
| R2-94FQ | 18/0/1/**20**(P05,P02) | 51% | **P03=0** |
| R1-JBP5 | 19/15/5(P10,P09,bot) | 49% | — |
教学房同理:P01 房 36/4/0(92%)。全场个人击杀 0~36 共存。
主观侧直接踩线:P03 三局 1/0/0 杀后退出;P07 复盘"被独狼压制"、两遍
`kill_band0`「你还没开张」;P01"我只好一人收 39 只里的 30 只"。
### 2.2 机制根源(四个机制叠加)
1. **击杀即死 + 无目标归属**:mob 无 HP(`{id, mkind, dir, eta}`),`adjudicateAttack`
弧内取 eta 最小者即刻删除——先出手者独得,没有助攻账。
2. **冷却在座不在目标**:`ATTACK_CD_MS` 约束的是单人频率(2.5s/杀),谁先出 cooldown
谁先抢下一只;快速手 = 结构性垄断者。P05:"出手权不在最快的手上,在系统的时钟上"
——对他这是上限锁,对弱者是抢夺机。
3. **感知速度差即击杀权差**:怪进内圈(eta≤4.0,MELEE_ETA)后中位 0.8-1.8s 内被杀;
高手 loop 注册率 39/39、clean notice 中位 663-761ms(P05/P01),弱手注册率 12/36、
notice 1368-1674ms(P03/P08/P10,brainStats)——**弱手在数学上不可能先到**,
他听清时怪已死,声场永远是空的。
4. **旋风斩全内圈收割 + 归属出手者**:`adjudicateSkill` 清 eta≤4 全部怪并全部
`creditKill(slot)`。P07 三局 37 次旋风斩,3TJY 一局清走 17/39(44%)——
高频双击者成为吸尘器,且吃掉的正是别人防区里"即将到手的怪"(P05:"01:14.2 左后狼
在我眼前被旋风斩收走")。
5. (放大器)**无出手权协调信道**:callout 语义是"求援"不是"这归我",3 局 18 人次
仅 3 次呼喊;击杀归属无播报(P01 的"熊债":打残的熊被 bot 补刀无声无息)。
### 2.3 修复提案
**F4(P0)防区优先窗(sector yield)** — `hunt-room.js`:
- 新常量 `SECTOR_YIELD_ETA = 2.0`。`adjudicateAttack` 选目标时:若 mob.dir 属于**另一在
席座位的防区**(LAYOUTS 是全集划分,可 `dirOwner(dir)` 查表)且 `mob.eta >
SECTOR_YIELD_ETA` → 跳过该 mob(弧内试下一只;全跳过走既有 miss 路径)。
- 语义:防区主人对自家怪有 2s 优先窗(eta 4.0→2.0),过了窗任何人可补——
「软防区」从"bot 偏置"升级为"轻出手权",补位语义保留(主人掉线/发呆 2s 后怪仍可救)。
- bot 侧自动受限(bot 反应带 ≤2.0-3.0,影响可忽略);教学波怪在玩家防区(N 席 0),
教学 bot 不再偷教学狼。
- 改动面:hunt-room.js + 设计文档 §3.3(防区三用途 → 四用途)+ §13 断言
("主人存活且 eta>2.0 时跨区击杀被跳过")。
**F5(P1)击杀账改「击杀+协助」双账** — `hunt-room.js` + `game.js` + §6.3/§12:
- mob 增加 `hitBy`/`claimedBy` 追踪(首个对其出手者=协助者);`ev end` 的 kills 之外加
`assists`(按 slot)。旋风斩清走的怪:击杀记施放者、协助记防区主人。
- 客户端 `killBandId`(game.js:94)改按 kills+assists 取档;进度 best 与 summary
(§12 生成规则)加入协助数。`kill_band0` 文案改为中性("这一夜你守多攻少"类,
台词表 23-hunt-voice-ids.md L 组 + TTS 重生成——归音频域,列依赖)。
- 改动面:hunt-room.js / game.js / 设计文档 §6.3(end 字段)/ §12。
**F6(P2)击杀归属可听化**:「怪被队友收走」短音(<1s,R5 合规)——归音频域,
此处只登记需求:P01 熊债、P05 旋风抢怪的直接止痛点。
### 2.4 预期指标变化
| 指标 | 现值 | 目标 |
|---|---|---|
| 房内最高击杀份额(快速局均值) | 59%(77% 峰值) | ≤45%(≤20/39) |
| 0 杀快速局人次 | 2/18 | 0 |
| 弱手个人击杀(P03/P08 型) | 0-1 | 6-10(自家防区每局 ~10 只轮到名下) |
| kill_band0 触发 | 有(且辱骂感) | 基本消失 |
---
## 3. 发现三:bot 与真人的强度关系——「带飞」是吞吐结构,不是谁强谁弱
### 3.1 现象与对照
| 构型 | 数据 | 结论 |
|---|---|---|
| 教学房(1 真人+2 bot),弱手 | P03 房 bot 29/39=**74%** 杀、玩家仍 S 余9;P06 房 bot 33% | **bot 带飞**:S 白送,学习不被检验 |
| 教学房,高手 | P01 房 bot 4/39=10%、P07 房 6/39 | 玩家吸干 bot:bot 只剩清扫 |
| 快速房(3-4 真人,0 bot) | P5CA P01 独得 30/39;3TJY P07 独得 27/39 | **高手带飞**:同一结构换了主体 |
| 快速房 2 真人+1 bot | JBP5 bot 仅 5/39 | bot 在混合房自动边缘化 |
| 挂机底座 | idle 档:2 bot 独守胜 18/24、mean 3.3 | 纯 bot 下限合格(有输的可能) |
### 3.2 根因
- bot 的调参目标(§3.4"solo 余 6-9")是**房间结果**目标,从不约束**击杀经济**。
bot 被 `hesitateP=0.8 / reactBase=2.0` 钝化后,在击杀市场里永远是"慢清道夫":
房间里有任何比它快的人(= 任何真人),bot 份额就被压到边角。
- 因此"教学局 bot 带飞"与"真人局专家带飞"是**同一个吞吐过剩问题的两张脸**:
座位数 × 0.4 杀/s 的容量 vs 0.67 只/s 的峰值供给,剩下的人都在分剩余。
- 副作用 1(教学):弱手被 bot 抬到 S → 教学局 9/10 是 S,"学会与否"不可见(Q5 域,
数值侧证据:教学房 dur mean 9.1 vs idle 档 3.3——玩家贡献被 bot 底座掩盖)。
- 副作用 2(P05 的天花板抱怨):bot 钝化把"比 bot 强"的达标线设得过低——
optimal 玩家单人即 dur 10,团队协作没有数值上的必要(§1.6 风险③在多人档落空)。
### 3.3 修复提案
**F7(P1)教学房 bot 防区锁死** — `hunt-room.js`:教学段(phase=teach + 教学后前 2 波)
bot 的 `botPickDir` 只在**自家防区**内选目标(偏置 ×∞ 或硬过滤)。玩家的 1/3 声场真正
归玩家,教学结果反映玩家水平(P04 型 = B 而非全班 S)。改动面:hunt-room.js(约 5 行)
+ §5 教学房规则补一句。
**F8(P2,观察项)bot 强度不动**:F1/F2/F4 落地后重跑扩档扫描,若 4 座 bot4 档
mean 仍 >9,再考虑 `BOT_TUNING_DEFAULT.hesitateP 0.8→0.7`。当前无证据要求动 bot——
先修供给(波次)与分配(出手权),再谈 bot。
### 3.4 预期指标变化
- 教学房玩家击杀份额:26-59%(弱手)→ ≥70%;教学房评级分布从 9S/1A/… → 反映真实
水平(预期 S≤4/10)。bot 份额与玩家水平的相关斜率变平(不再"越弱越被抬")。
---
## 4. 发现四:评级失去分辨力——单一输入(耐久)落在饱和区,且与个人表现完全解耦
### 4.1 现象(数据)
- `gradeFor(dur)`:S≥9 / A 7-8 / B 4-6 / C 1-3。实测 26S/1A/1B:**S 是 93% 的缺省值**。
- 三局满 S 的 P05 原话:"一个不稀缺的 S 等于没有评级""结算屏给我同一个 S"→ 退出;
P01:"两局都 S·营地余 10 之后,我也不知道下一局还能图什么"→ 退出。
- **房内所有人同评级**:NTGV 房 P08(0 杀、1 次错弧出手)与 P05(19 杀、26/27 弧对)
同为 S。评级对个人零信息。
- 即使按扫描 bot 档(3 bot 水准),S 也占 8/24——S 门槛(≤1 点损耗)在原难度下就偏松;
难度饱和(发现一)把它彻底推成众数。
- 进度 best 排序键(§12:评级 > 营厂余耐久 > 击杀)里第三键从未被用到(dur 恒 10);
`end_rank`"猎手榜"只是一句台词(P05/P07 都点名:无名次、无分段、无历史最高)。
### 4.2 根因
1. 评级输入只有 dur 一个维度,而 dur 被吞吐冗余饱和(发现一)。
2. 评级是房间级共享,个人击杀档(killBandId)只进播报不进评级/best——
"30 杀带飞"与"0 杀躺赢"在存档里等价。
3. 个人可精进轴(弧错率 22%、notice 时延、旋风时机)没有任何一个进入结算。
### 4.3 修复提案
**F9(P0,与 F1/F2 绑定验收)评级分两轴** — `hunt-room.js`(服务端权威,§3.6):
- **团队轴**:`gradeFor` 门槛在 F1/F2/F3 扩档扫描上重标定。建议收紧为
`S: dur≥10(零损耗)/ A: 8-9 / B: 5-7 / C: 1-4`,验收线:bot4 档 P(S)≤15%、
opt4 档 P(S)≥80%(S = 高手护住满血,而非缺省)。
- **个人轴**:`ev end` 增 per-slot `contrib`(kills + 0.5×assists,F5 的账)与
`quota = 总怪数/席位数`;个人档 `contrib/quota ≥1.2 → 主猎手 / ≥0.6 → 主力 /
其余 → 协防`。voice 新增 3 句(23-hunt-voice-ids.md 结算链:grade_* →
个人档 → kill_band_* → end_rank),预算 60→63 句(§10.3 核算仍有余量)。
- 进度 best(§12)写入个人档与 contrib,summary 加个人档字段(game.js
`_saveProgress/_betterThan` + §12 生成规则)。
- 改动面:hunt-room.js / game.js / 设计文档 §3.6 / §12 / 台词表。
**F10(P1)把"榜"做成真榜**:`end_rank` 台词之后上滑可听"本房击杀对比"
(复用 kill_band 分档 + 座次 2-3 句资产),进度 API best 已有 kills——
跨玩家榜仍是 roadmap,但**房内对比**是 P05/P07 明确要的钩子且零协议改动。
改动面:game.js + 台词表。
### 4.4 预期指标变化
- 评级分布见发现一目标列;S 成为"零损耗+个人主猎手"的复合稀缺品。
- 复测口径:P05 型玩家三局结算不再全同(个人 contrib 有区分度);
best 更新触发率(现恒 S+10,二局后不再更新)→ 每局有可刷新字段。
---
## 5. 发现五:匹配无水平信号——悬殊同房对弱者是「无声的羞辱局」,对高手是苦役
### 5.1 现象(数据)
- `handleJoin` 快速匹配 = 找第一个有空位的 lobby(`r.phase==='lobby' && slots<4`),
**无任何水平输入**(协议 join 也不携带,§6.2)。
- R1-P5CA 把 P01(15 年读屏、notice 761ms、弧对 59%)与 P03/P02/P04
(notice 1368-1575ms、注册率 12-14/36)同房:P01 30 杀,P03 1 杀,P04 4 杀 0 弧对命中杀。
- **弱者代价**(P03 三局 1/0/0 → 退出;P08 0/1 杀):
- 声场被抽空:高手把怪在 eta 3.2 清掉,弱手 loop 注册率仅 1/3——游戏对他是
"5 分钟静坐 + S 屏";
- 看门狗误伤:闲置提醒 4-7 次/局(P03/P04/P10,全场 93 次)——不是挂机,是**无怪可打**,
`gd_idle` 只看自家手势 10s 窗(game.js 向导层);
- 结算羞辱:`kill_band0`"你还没开张"对着 0 杀弱手播(P07 转述两遍);
- 贡献不可见:胜利与个人 0 贡献同屏,S 变成嘲讽。
- **高手代价**:P01"最后干脆自己全收";P07 R1 被独狼压制后反而上头(要对手),
但零心跳局"无聊删得比连输还快"。
### 5.2 根因
1. 快速匹配是纯填坑算法,服务端对玩家水平零知识(进度 best 只在客户端)。
2. 悬殊房放大发现一/二:高手吞吐过剩 → 弱手零供给;数值上"团队赢"掩盖"个人零参与"。
3. 反馈系统(看门狗、kill_band0)假设"没动作=没在玩、0 杀=没出力",在垄断经济下
两个假设都反向成立。
### 5.3 修复提案
**F11(P1)join 携带水平提示 + 分层匹配** — `hunt-room.js` + `game.js` + §6.2:
- join 增可选字段 `skill: 0-3`(客户端由进度算:无 best=0,B/C=1,A=2,S 且 kills≥15=3;
老客户端缺省 null,向后兼容 ver 不动)。
- 快速匹配从 first-fit 改为最小极差:优先进 `max(skill)-min(skill) ≤ 1` 的 lobby;
找不到则等待,`LOBBY_MS` 12s 到点仍回落任意房(小池子兜底,不增等待上限)。
- 改动面:hunt-room.js `handleJoin`(约 30 行)/ game.js(算 skill 并携带)/ §6.2 字段表。
**F12(P2)反饥饿看门狗**(跨域登记,数值侧给判据):`gd_idle` 触发前提改为
"近 10s 内**自家防区**出现过内圈怪或 breach"(game.js 有本地怪表可判);
starving 弱手的闲置提醒 4-7 次/局 → ≤1 次。
**F13(P2)kill_band0 文案中性化**(并入 F5 的台词改动)。
### 5.4 预期指标变化
- 悬殊房(极差 ≥2 水平档同房)占比 → 目标 <20%(10 人池的现实约束下);
- 弱手侧:0-1 杀人次 2/18 → 0(叠加 F4),闲置提醒中位 5 次/局 → ≤1;
- 高手侧:房内最高击杀份额下降后,"碾压无聊"局(零 breach 且 top-share>60%)→ 复测追踪。
---
## 6. 修复优先级表(按「玩家愿意玩下去」的影响排序)
| # | 修复 | 定级 | 改动面 | 直接对标的退出原因 | 预期核心指标 |
|---|---|---|---|---|---|
| 1 | **F1+F2 波次按座位缩放 + heat 导演**(WAVE_TABLE 换算 / HEAT_* 常量) | **P0** | hunt-room.js + 设计文档 §3.4 | P05"白给 S 就删"、P07"零心跳无聊删"、P01"没有下一局" | 胜率 100%→85-95%;快速零损耗 5/5→≤1/5;S 占比 93%→≤30% |
| 2 | **F3 扫描扩档**(bot4/opt4/mix) | **P0**(#1 的验收门槛) | hunt-balance-scan.mjs | —(流程性:防回归) | bot4 落 6-9 带、opt4 不恒 S |
| 3 | **F4 防区优先窗**(SECTOR_YIELD_ETA=2.0) | **P0** | hunt-room.js + §3.3/§13 | P03 零参与退出、P07 被压制+受辱、P05 被抢怪 | 0 杀局 2/18→0;top-share 59%→≤45% |
| 4 | **F9 评级双轴**(gradeFor 重标定 + contrib 个人档) | **P0** | hunt-room.js / game.js / §3.6/§12/台词表 | P05"不稀缺的 S"、P01"S 后无可图" | S=零损耗+主猎手复合条件;best 可持续刷新 |
| 5 | **F5 击杀+协助双账**(ev end.assists / killBandId 口径 / best+summary) | P1 | hunt-room.js / game.js / §6.3/§12 | P01"熊债"、P08 型无感参与 | 协助进结算链;0 贡献玩家归零 |
| 6 | **F11 分层匹配**(join.skill + 最小极差选房) | P1 | hunt-room.js / game.js / §6.2 | P03 式悬殊局体验 | 悬殊房 <20%;弱手闲置提醒 ≤1/局(配 F12) |
| 7 | **F7 教学房 bot 防区锁死** | P1 | hunt-room.js + §5 | 教学不检验学习(Q5 联动) | 教学房 S 9/10→≤4/10 |
| 8 | **F10 房内击杀对比榜**(end_rank 后可听) | P1 | game.js + 台词表 | P07"要可听的排名" | 好胜型留存钩子(复测去留对照) |
| 9 | **F12 反饥饿看门狗 + F13 kill_band0 中性化** | P2 | game.js / 台词表 | 弱手被骂式关心 | 闲置提醒全场 93 次→<30 |
| 10 | **F6 击杀归属可听化**("被收走"短音) | P2 | 台词/sfx 资产(音频域) | 熊债止痛 | 归音频域实施 |
**跨域依赖提示**(非本视角所有权,但数值上相关):P01/P05/P07 三人共报的
"冷却乱滑 666 次纯 error 震、无剩余时间反馈"(ATTACK_CD_MS 黑箱)与
"战斗态下滑双语义误开菜单"属交互域 P0——它们与 #3 同为垄断痛感的放大器,
复测前应与数值修复同批落地,否则弱手的"抢不到"会被 UI 挫败混因。
**复测纪律**(沿用 00-plan §6):同 10 人配置不改;上述改动合入后先跑扩档扫描(F3)
再开同阵容复测,对比指标:胜率/评级分布、房均 breach、top-kill-share、0 杀人次、
闲置提醒次数、去留决策(重点盯 P01/P05/P07 的"白给 S/无聊"决策点是否消失)。