Files
gplan-2/production/qa/acceptance-rerun-20260919.md
T
DKChan 8178394489 feat(acceptance): 验收读数重测批·初稿——模拟批1200局+日志批+掷点流种子偏置核心发现(2026-09-19,独立 worktree 分支;真人位留空)——①执行面:worktree 检出 d236d9f 冒烟 317 项 0 失败,MC 两关×N=30×种子4200+30×both 共 1200 局,log_analysis.py+专项脚本判读;②核心发现=掷点流结构性种子偏置:日志掷点与 armor_roll 流逐 scope 首输出逐位一致,派生种子头部面值聚类(4227 头部 30 scope 4 个 18 点 vs 4211 零个),短局×种子复用放大 40 倍,真实消费模式复现 18 点 +57%≈20σ,纯随机种子对照均匀排除引擎本体——单局 d20 体验随种子漂移(0%→20% 18点率),AC 档位设计地基受损;预热无效/splitmix 未达标,建议立项掷点修复批(黄金向量重登记+阶段一重跑义务,五流连带核查);③阶段一=零承伤轮 PASS/nat20 PASS(污染注记)/档位分布与 EV FAIL(归因 RNG)/Boss 血量锚过期(58 现值)/快照 buffs 非空盲区口径已破/battle_end 行序伪影 1 局一条;④阶段二初稿=L1 完美档 87% 越 gate 上界+承伤 p10=13/p90=25 远低于带(压力不足),F4 两关全 PASS,台阶倒挂消失,判定顺延掷点修复后(§4e 边界1 先查实现缺陷);⑤07⑦ 刷新经济基线已采(弃图率完美档 ~0.1 次/局、normal 0、每轮刷新率 ≤0.6%)——log_analysis.py 新增弃图率/每轮刷新率两读数列,阈值仍归调参批;07⑥ 速杀占比不可推导注记后延;⑥判读报告 production/qa/acceptance-rerun-20260919.md(真人 3–5 局缺位,k 系数待补后终稿);active.md 快照节+台账 84(分支内,主工作区合并时人工对账)
2026-09-19 22:50:28 +08:00

125 lines
11 KiB
Markdown
Raw 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.
# 验收读数重测批——判读报告(初稿,真人位留空)
- **日期**:2026-09-19
- **口径依据**:`docs/acceptance-ap6-ac.md` v1.0(定稿判读规则全文照搬执行)
- **被测构建**:master @ d236d9f(技能池新效应词汇批后;乘区接线+削弱续时+甲效换装+充能退役+rider 五次数值行为变更叠加后的首次全量重测)
- **执行环境**:独立 worktree `D:\code\g-plan2-acceptance-rerun`(分支 `acceptance-rerun-20260919`)——绕开主工作区并行会话未提交改动
- **数据源状态**:① 模拟批 ✅ 完成(两关 × N=30 × 种子 4200+30 × 策略 both,共 1200 局)② 日志批 ✅ 完成 ③ **真人批 ⬜ 缺位**(3–5 局基线档待用户补跑,k 系数待并入)——按口径「三数据源全部跑完再判读」,本报告全部结论为**初稿**,终稿待真人批合入
- **前置验证**:worktree 冒烟 317 项 0 失败(run_smoke 三闸全过)✅
---
## ⚠️ 核心发现:掷点流存在结构性面值偏置(本批最重要产出)
**一句话**:d20 掷点在单局内不是均匀分布——每个种子的冒险只消费掷点流头部约 17~40 个 scope,而「派生种子 → PCG 首输出」在头部 scope 区间有系统性面值聚类,玩家的实际掷点体验随种子漂移(有的种子 18 点频发、有的种子整局零 18 点)。阶段一多数 gate 失败归因于此,按口径 §4e 边界 1「先查实现缺陷再谈调参」,**压力验收判定顺延至掷点修复批之后**。
### 证据链(可复现,探针脚本形态见附录)
1. **逐位比对**:种子 4227 首局前 23 个日志掷点与 `rng.open_stream("armor_roll")` 逐 scope 首输出序列**完全一致**——日志掷点 = 派生种子首输出,无其他变换。
2. **种子级头部偏置**:种子 4227 头部 30 scope 含 4 个 18 点(13%);种子 4211 头部 30 scope **零 18 点**。真实日志按种子聚合:4227 → 120 个 18 点(4.1× 期望)、4211 → 0 个。MC 每局平均仅 ~17 次掷点、每种子被 20 个配置格复用 → 头部偏置被放大 40 倍,与日志完全定量吻合(120 ≈ 40 局 × 头部 3 个 18 点)。
3. **真实消费模式复现**:按「30 种子 × 40 局 × 每局 8~31 掷」模拟聚合,复现日志失真签名:18 点 1876/23822(期望 1191,**+57%**,≈20σ)、16 点 +26%、4 点 +23%、1/2/3 点 −25% 量级缺口。
4. **排除项**:纯随机种子首输出均匀(4 万次最大偏差 2.7σ,正常);同流长短序列聚合均匀(2 万 scope)——缺陷特定于「派生种子族 + 头部窗口」的组合。
### 影响面评估
- **玩家体验(真实影响,非测量伪影)**:一局冒险 = 一个种子 = 只吃该种子头部窗口。d20 均匀假设是 AC 档位设计(全额 55%/×0.75 15%/×0.5 20%/×0.25 10%、EV 减免 21.25%)的地基;现状下不同局的实际掷点分布随种子系统性漂移,暴击率与档位体验逐局不可比。这属于**引擎级机制缺陷**,不是调参问题。
- **测量有效性**:本批全部掷点面 gate(档位分布/EV 减免/nat20)读数被污染,判为失败不能归因到机制实现或数值配置。
- **连带怀疑面**:同一派生公式服务全部五条流(board_gen/reward_roll/encounter/armor_roll/behavior_roll),其他流的消费窗口同样偏头部——棋盘布局、奖励摇号、遭遇骰的逐种子行为同理存疑,修复批应一并核查。
### 修复方向试探(均在探针级验证,未动游戏代码)
- 单次预热(丢弃首输出取第二输出):**无效**(相关性在种子空间不在生成器内部)。
- 派生种子过 splitmix64 非线性混淆后再喂 PCG:**部分改善未达标**(最大面偏差 685→369,仍 ≈11σ),需专门验证批找正确混入方式。
- 结构性候选:armor_roll 改「每冒险一条持久生成器顺序取号」(标准做法,代价 = 牺牲注册表登记的逐 scope 独立复放语义);或重设计派生公式并配黄金向量回归。
- **处置建议**:登记 06 待办立项「掷点流种子偏置修复批」(改 `rng_service.gd` 属架构面,须用户拍板修复方案);修复批自带义务=黄金向量重登记 + 冒烟断言 + 修复后重跑本验收阶段一。
---
## 阶段一:机制验收(日志批,gate 判读——全部受发现①污染,仅记录现状)
数据:两份 MC 日志共 318,626 行、1200 局、20,945 次掷点。
| 指标 | 读数 | 期望带 | 判读 | 注记 |
|---|---|---|---|---|
| 零承伤轮(窄口径) | 0 / 8076 攻击落地轮 | 0 | ✅ PASS | 伤害下限 1 生效 |
| 零掉血轮(宽口径) | 6706 / 13364 敌战轮(50.2%) | observe | 记录 | 与真人旧读数对照待真人批 |
| nat20 暴击率 | 4.53% | 5%±2pp | ✅ PASS(带污染注记) | 种子头部偏置使逐种子暴击率漂移大 |
| 档位分布(敌→主角) | 全额 50.8%/×0.75 15.0%/×0.5 21.6%/×0.25 12.6% | 55/15/20/10 各±2σ | ❌ FAIL | 归因=RNG 偏置为主 + 护甲强化增益抬 AC 混入(全额缺口方向与增益一致,但幅度超增益可解释范围) |
| 玩家侧全额率 | 主角→敌 EV 减免 0.00% | 100% 全额 | ✅ PASS | 敌 AC 关内 0 生效 |
| EV 减免(敌→主角) | 23.98% | 21.25%±2pp | ❌ FAIL | 同上归因 |
| Boss 血量锚 | 表值 hp=58(蛛化卓尔精灵) | r_boss=150÷153.5≈0.98 | ⚠️ 锚过期 | 口径写于压缩批与卓尔加血前(150→÷3→58);锚值重校准归调参批,本批记录现状 |
| 增益战斗期复原 | 三类可复原(attack_up/weaken/减伤族) | observe | ✅ 记录 | 复原面工作正常 |
| 快照 buffs 非空 | **8790/14402** | 恒空(盲区口径=0) | ⚠️ 盲区口径已破 | rider/状态批后快照开始携带 buffs(疑 duration-2 状态使衰减段后仍有存留)——**好消息**(盲区闭合),口径文档需改写该节 |
| 数据质量·解析失败 | 0 | 0 | ✅ PASS | |
| 数据质量·未配对 battle_end | **1200(系统性 1/局)** | 0 | ⚠️ 行序伪影 | 每局恰 1 条 battle_end 落到 run 行切分点之后(level_end 先于 battle_end 落盘);不影响核心统计(分析器不依赖 battle_end),行序归因待核 |
## 阶段二:压力验收(模拟批基线格,初稿判读——顺延至掷点修复后终判)
### 第一关(生死带主判据格:MC perfect 基线格 atk+0%/hp+0%,n=30)
| 指标 | 读数 | gate | 判读 |
|---|---|---|---|
| 整关承伤分布 | p10=13.0 / p50=18 / p90=25.0 / max=28 | p10∈[35,45] 且 p90∈[55,65] | ❌ FAIL(远低于带下沿——压力不足方向) |
| 通关率 | 87% | [35%, 65%] | ❌ FAIL(越上界) |
| 通关余量 | 胜局剩余 HP 均 7.4 | p90≤13 且 p10≥3(收敛后 gate) | observe(未收敛) |
| 平均轮数 | 16.4 | observe | 记录 |
| 盲挖档(normal 基线格)通关率 | 73% | observe(生死带下 0% 为预期态) | 记录——73% 与生死带预期相悖,同证压力不足 |
### 第二关(对照面,无独立 gate)
| 指标 | 读数 |
|---|---|
| 完美档基线格通关率 / 承伤 p50/p90 | 87% / 15.5 / 21.2 |
| 盲挖档基线格通关率 | 83% |
| 台阶倒挂 | L1 87% vs L2 87%——倒挂消失(旧读数 65vs90→65vs80→本批持平),方向性好转 |
### F4 满配格(gate:普通场 ≤20% / Boss 场 ≤50% 生效 max_hp)
| 关卡 | 普通场 | Boss 场 | 判读 |
|---|---|---|---|
| L1 | 6.5% | 15.7% | ✅ PASS |
| L2 | 5.9% | 22.8% | ✅ PASS |
### 战斗级承伤带(普通 ≤20% / Boss ≤50%,全网格聚合)
全部 9 个(关×类型×深度)分组 ✓ PASS;Boss 战单独出列读数:L1 Boss 场均承伤 26.7% max_hp / 5.9 轮,L2 Boss 35.7% / 5.0 轮——Boss 承伤占比显著高于普通场(设计方向:Boss 是主要伤害来源),无不可控死法迹象(败北节点全部集中于 Boss 位,普通位败北为 0)。
### 阶段二初稿结论
双 gate(承伤带 + 通关率)双败,方向一致=**压力不足**(完美档太容易通关、承伤远低于生死带)。按归因规则本应走 §4e 阶梯(敌方输出侧),但发现①属实现缺陷且优先级在前(§4e 边界 1)——**建议顺序:掷点修复批 → 阶段一重跑 → 阶段二调参批**。附带提醒:修复掷点会轻微改变承伤/通关读数(掷点分布变了),调参批应在修复后的重测读数上工作。
---
## 07⑦ 刷新经济监控——基线读数(本批搭车项,2026-09-19 首批基线)
分析器已新增两读数(`log_analysis.py` 关卡级统计:弃图率=每局受理刷新次数,与 MC 刷新/局同口径;每轮刷新率=刷新次数÷结算轮数)。**首批基线**:
| 数据面 | 弃图率(次/局) | 每轮刷新率 | 样本 |
|---|---|---|---|
| MC L1 完美档基线格 | 0.23 | — | 30 局 |
| MC L2 完美档基线格 | 0.03 | — | 30 局 |
| MC 全网格 L1 完美档 | 0.08 | 0.006 | 300 局 |
| MC 全网格 L2 完美档 | 0.01 | 0.001 | 300 局 |
| MC 全网格 normal 档(两关) | 0.00 | 0.000 | 600 局 |
| 真人日志参照(并行会话今日 600 局模拟,非本批数据) | 完美档 0.12 | 0.008 | 供交叉参照 |
解读起点(供调参批参考,非结论):完美档低频弃图(~0.1 次/局量级)、normal 档零弃图——与「完美档卡死才刷新」的口径一致(auto_player 刷新=卡死解除手段);normal 档零使用提示 1 RAP 定价对普通玩家可能偏贵或无感知,真人批数据将回答。**阈值数字仍归调参批**(口径不变:现在定是拍脑袋)。
**顺带核查项**:07⑥ 速杀退化预警的读数(战斗结束未开资格格占比)经核对**现役日志不可推导**——battle_end 行仅含 result+hero_hp,无格面开格状态面。采集义务需等埋点(board 状态入结算快照或独立行),本批不硬做,注记后延。
---
## 待办与回流
1. **真人批**(用户):基线档 3–5 局 → k 系数 + 零掉血轮宽口径真人对照 → 本报告终稿。
2. **掷点流种子偏置修复批**(新立项,须拍板):登记 06 待办;修复方案选择 + 黄金向量重登记 + 重跑阶段一。
3. **口径文档连带修订**(归合并批):`docs/acceptance-ap6-ac.md` 快照 buffs 盲区节改写、Boss 血量锚参照值重校准(58 现值)、§2 消费读数行补刷新两读数;`06-待办清单`「刷新经济性监控」条目保留至调参批定阈值。
4. **曲线调参批门**:确认改为「掷点修复批后」起跑(原门=验收读数)。
## 附录:探针脚本(复现用)
本批全部 RNG 探针为一次性 `/tmp` 脚本(rng_probe*.gd),核心复现路径:
① 从日志抽种子 4227 首局前 23 掷与 `open_stream("armor_roll")` 逐 scope 首输出逐位比对;
② `SALT_ARMOR_ROLL ^ (seed + scope×GOLDEN) & 0x7FFF…` 直喂 `RandomNumberGenerator.randi_range(1,20)` 画头部直方图;
③ 按 30 种子×40 局×8~31 掷聚合复现失真签名。诊断用工程内探针 `smoke/rng_face_probe.gd` 已随批删除,不留残留。