diff --git a/reports/iter48-代拍板追认单-2026-11-02.md b/reports/iter48-代拍板追认单-2026-11-02.md new file mode 100644 index 00000000..228706c1 --- /dev/null +++ b/reports/iter48-代拍板追认单-2026-11-02.md @@ -0,0 +1,33 @@ +# 迭代 48 代拍板追认单(2026-11-02) + +> 全部代拍板均落在各卡白名单内,无超白名单事项。本单按卡逐条备案追认(随 commit 留痕)。 + +## 卡①状态合并累加制(白名单 1–3 全用,零超出) + +| 白名单项 | 落地 | 追认 | +|---|---|---| +| 1 词表值命名 `accumulate` | schema `STACK_POLICIES := ["stack", "accumulate", "independent"]` | 追认 | +| 2 合并授予不改快照(首授快照恒定) | `_apply_accumulate` 零快照写入;V1 断言 snap_magnitude==−65 背书 | 追认 | +| 3 测试函数改名 `_weaken_accumulate_probe` 与 V 尾缀措辞 | 全仓旧名零残留;〔状态累加 V1/V2/V3/V4〕在案 | 追认 | +| 裁决补记随动(2026-11-02 用户甲案——非代拍板,用户裁决授权) | `_ineffective_row` 载荷 `deferred: true`+`_row_phase` 分类补 deferred→战斗段(卡①申报 5+R7 行) | 随用户裁决生效 | + +## 卡②立绘显示档(白名单 1–5 全用,零超出) + +| 白名单项 | 落地 | 追认 | +|---|---|---| +| 1 `portrait_probe()` 新读数键名 | `display_size`/`display_scale`(卡面拟定名照用) | 追认 | +| 2 `pixelize_candidates.py` 函数与 CLI 旗标改名 | `build_standee_display`/`--standee-display` | 追认 | +| 3 测试尾缀〔立绘显示档 Vn〕括注格式 | V13–V18 六尾缀 | 追认 | +| 4 对照图目录名 | `artwork/candidates/立绘显示档批-2026-11-02/` | 追认 | +| 5 主角取 key 实现写法 | `enemy_id()` 空值判 hero | 追认 | + +## 卡③战斗区背景替换(白名单 1–6 全用,零超出) + +| 白名单项 | 落地 | 追认 | +|---|---|---| +| 1 私有函数顺序/局部变量名 | `_build_ground`/`_load_stage_texture`/`set_board_type` 布局与命名 | 追认 | +| 2 测试 helper 顺序与断言消息措辞 | stage_background_test 18 checks 消息(判据值/阈值零改) | 追认 | +| 3 注释与日志文案 | 舞台顶注/背景域注释换代(零「光柱仍在」类误导、零变更史) | 追认 | +| 4 TextureRect expand/stretch 写法 | `EXPAND_IGNORE_SIZE`+`STRETCH_SCALE`(基准档 1×) | 追认 | +| 5 B 区 1px 面板描边可见性处理 | 平色 Panel 描边保留被背景覆盖(未另加描边层、零新增类变量) | 追认 | +| 6 既有错误扫描暴露的纯格式问题一次修净 | 无新增格式修(gdstyle 零新键) | 追认(空项) | diff --git a/reports/iter48-停机呈报-卡1状态相位断言-2026-11-02.md b/reports/iter48-停机呈报-卡1状态相位断言-2026-11-02.md new file mode 100644 index 00000000..be910a7a --- /dev/null +++ b/reports/iter48-停机呈报-卡1状态相位断言-2026-11-02.md @@ -0,0 +1,45 @@ +# 停机呈报:迭代 48 卡①(状态合并累加制批)——round_flow 相位单调断言红(L3②) + +> 日期:2026-11-02 · 性质:实现段停机呈报(缺陷移交,非提问)。呈报即卡①停摆,改动全部留在迭代工作区 `g-plan2-iter48` **未提交**,卡②卡③已各自提交收口。 +> **裁决闭合(2026-11-02 用户甲案)**:按生产行载荷自描述键方案补记卡①(申报 5+R7 行+写面两行+T1 随动步)后本区继续施工——`_ineffective_row` 加 `deferred: true`+`_row_phase` 分类随动,七套件复跑全绿,卡①收口提交 df173018。第六节待办清单状态回退拟稿作废不执行。本呈报留作裁决与根因记录。 + +## 一、停机点(哪条判据触发) + +卡①第十节 T1 末项:「孤立验证:六套件最窄复跑(…round_flow_skill_pool——EV 锚套件提前曝红)全绿或按 L3②停机」。round_flow_skill_pool_test 套件红(133 PASS / 1 FAIL,exit=1,两次复跑确定性复现同断言同行)→ 按卡①第十二节 L3② 停机呈报。 + +## 二、红项全貌 + +- 断言:`game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd:422`「每轮行相位单调(授予→增益/减益→战斗→衰减→判定)」,宿主函数 `_smoke_settlement_segments`。 +- 违序行(种子 42,L1·D0 自动局,round 2): + `{"batch_key":"magic_bolt","type":"reward_ineffective","source_class":"safe_cell","display_name":"魔法矢 未生效(无存活敌人)","value":0,"round_index":2}`——出现在同轮战斗段伤害行之后,被测试的相位分类器判为第 0 段(授予段),形成 0 段行后于 2 段行的读序。 +- 改前 CI(de5e31ed 回执 unit.log:3923)同断言 PASS——红确属本批新增,非存量红。 + +## 三、根因(两条事实链) + +1. **生产侧行为符合设计**:该行由 `damage_controller.gd:543/:568 → _ineffective_row(:686)` 在「案C 地图账殿后」补提交结算时发射(魔法矢找不到存活目标)——行本身落在战斗段末是案C 既有口径;累加制使削弱实例存续更长 → 战斗轨迹改变(该局敌人 round 2 内提前全灭)→ 这类「战斗段内未生效」行首次在该种子轨迹出现。 +2. **测试侧分类器存在潜伏缺口**:`_row_phase`(round_flow_skill_pool_test.gd:466-467)把无 `hero_down` forfeit 的 `reward_ineffective` 一律判第 0 段(授予段未生效);该假设在旧轨迹下从未被打破,累加制轨迹首次暴露。 + +## 四、分歧点与两种读法 + +- 读法 A(测试缺陷 exposed):断言冻结的五段全序不变量本身仍被生产行为满足(行序实际是 授予→…→战斗→地图账→衰减→判定),红的直接原因是分类器对「战斗段地图账未生效行」这一已存在行型缺映射。修复=把该行型正确归类到战斗段(相位 2)——属**断言改判**,须卡片申报(卡①测试削弱申报四条未含此项,写面亦不含 round_flow_skill_pool_test.gd)。 +- 读法 B(生产缺陷):「奖励直伤找不到目标」不应以第 0 段形态出现在战斗段——若设计意图是该行必须留在授予段,则生产发射时点错位。查证:案C 口径(combat_segment.gd:107-109 注释「主角死于怪物 → 地图账不兑,逐单留『未生效』行不作废静默」)明确未生效行属战斗段末地图账——读法 B 不成立,但归类标记(现仅 `hero_down` 一种 forfeit)是否扩词表属设计面裁量。 + +## 五、建议案(供裁决,二选一或另裁) + +- **甲案(推荐)**:卡①补申报一条测试随动——`_row_phase` 对「战斗段地图账未生效行」补归类。实现取其一:① 最小测试面:`reward_ineffective` 行按「同轮已出现战斗段行」状态化归类(分类器带一比特状态,不变量强度不降);② 生产观测面扩展:`_ineffective_row`(damage_controller.gd:686-690)载荷加自描述键(如 `"deferred": true`,零行为改动、行载荷观测面扩展),分类器读键归类——行自描述优于启发式,推荐②。两法都须写卡段补记进卡①对照表与削弱申报后方可施工。 +- **乙案**:判为累加制的设计后果重裁(例如「敌人全灭后地图直伤奖励该不该仍结账」属玩法问题)——若如此,卡①整体退回设计段,与本批解耦。 + +EV 锚三值(goblin 0.9148/bugbear 1.0012/ogre_chief 1.1948)改前改后逐位一致、全绿——**无期望值漂移**,乙案如走重锚通道无数据依据。 + +## 六、待办清单对应条目状态回退+缺口补记(拟稿,落笔归上游段/用户) + +条目「状态合并改累加制——同名状态重复授予改加时长」(待办清单 :20-32): + +- 状态回退:「文档设计已闭合+已写卡+已编迭代 48」→「已写卡(实现停机待卡补记——round_flow 相位断言随动申报未决)」。 +- 缺口补记:需求卡片-状态合并累加制批-2026-11-01.md 需补第十一节申报一条(round_flow `_row_phase` 战斗段未生效行归类,甲案①或②取一)+第七节文件结构图补 round_flow_skill_pool_test.gd(甲①)或 damage_controller.gd 观测面一行(甲②);补记后重新编入迭代。 + +## 七、卡①已完成面(停机不抹账) + +- 实装六处全落:tres 六行 accumulate/schema 词表/容器累加臂(`_apply_accumulate`,R += D)/roll_multiplier 探针五段式+V1/V2/V3 断言/table_structure_guard V4/damage_controller 标签换代。grep 四项可核查全过(值行 refresh 零残留、accumulate 恰六处、容器与全仓定义面 refresh 零残留)。 +- 六套件窄测:五套件全绿(roll_multiplier 42 checks/table_structure_guard/system_contracts/damage_controller 44/seal_polarity 70),round_flow 133 PASS+1 FAIL(本呈报主体)。 +- 改前基线:S13 两产品文件零基线键;EV 锚改前读数 goblin 0.9148(CI unit.log:3968)。 diff --git a/reports/iter48-反哺点-2026-11-02.md b/reports/iter48-反哺点-2026-11-02.md new file mode 100644 index 00000000..68b9af94 --- /dev/null +++ b/reports/iter48-反哺点-2026-11-02.md @@ -0,0 +1,28 @@ +# 迭代 48 反哺点清单(2026-11-02) + +> 本批未写 `design/`、未写根流程清单、未写 `game/tests/README.md`。以下逐条待用户裁决后由文档批落文,落文后本清单逐条清除。 + +## 卡②立绘显示档 + +1. **08-Alpha版本标准.md 覆盖行**:立绘清晰度条目「待做」→「在役」列呈裁——九件已按档落位+机检全绿,实机目检四项登记在案(实现报告第四节 1–5)。 +2. **art-prompts.md §5.4 产出状态**:「待实装批落位」→「已落位」(依据:九件原稿分辨率入包、`STANDEE_SRC_H` 表在案、`--standee-display` 派生管线)。 +3. **art-status-checklist.md/art-assets-checklist.md 站桩行**:「按档派生落位归本条实装批」→ ✅ 已交付(依据同上;闸件 standee_asset_check 已换显示档口径全绿)。 +4. **待办清单.md 本条**:状态推进已编迭代 48 → 完成删条(状态机推进,非实现批直改)。 +5. **术语表「显示档」是否立条**:呈裁——卡②三处口径(art-bible §8.2 定值单点/GDScript `PORTRAIT_DISPLAY_H`/Python `STANDEE_DISPLAY_H`)已稳定使用「显示档」一词,是否进术语表归用户裁。 +6. **体验验证清单.md**:实机目检五项(实现报告第四节 1–5)转正式条目呈裁。 + +## 卡③战斗区背景替换 + +7. **art-bible.md §6.1**:三句实装化——「程序化平色+光柱现行使用=占位」改为背景三关变体+连续地面已实装;「ground_h 由实装批新增并回填」改为已回填 100;「资产到位后四柱直接退役」改为已退役(依据:`TEX_STAGE_BG_FMT`/`TEX_STAGE_GROUND`/`set_board_type` 落码,光柱层与 BEAM_LIGHT 删除,断言 V2–V5 绿)。 +8. **art-bible.md §4.1 换色合并登记③**:`STAGE_BG` 由「随舞台背景插画批处置」改为已退役、平色缺图回退改指 `SLOT_BACKDROP`(#3E362C)——代码事实(常量表零键、回退点改指,断言 V5 绿)。 +9. **art-assets-checklist.md §4**:三张背景与地面「已出候选 v10」状态句 → 候选 v12 过审、终稿入包已实装消费;小石台保留句核对无误(原样保留、叠于地面之上)。 +10. **battle-stage-prompts.md §4/§5**:「ground_h 待实装批回填」→ 已回填 100;档 6「四柱退役(代码批)」→ 已退役。 +11. **design/gdd/ux/battle.md :118、:155**:布局字段清单补 `ground_h`(B 区连续地面层高,源=基准屏宽×本值);「现行溢出区为临时光柱氛围层,正式背景到位后该层退役」→ 已退役,溢出判定不变。 +12. **HUD框架.md :60、:247**:B 区内容补「三关背景+连续地面层」;布局几何清单补地面层高(读布局表 ground_h)。 +13. **数据配置.md :73**:布局表用途句补「地面层高度」。 +14. **体验验证清单.md**:实机目检五项(实现报告第四节 6–10)转正式条目呈裁。 + +## 卡①状态合并累加制(甲案裁决已闭合——随本批合回生效) + +15. **增益状态.md 字段表 stack_policy 取值行**:「stack / refresh / independent」→「stack / accumulate / independent」(依据:schema 词表与表行已换代——该落文随卡①合回生效,卡未闭合前禁落)。 +16. **增益状态.md「现在有哪些状态」节**:「现行九行」→ 十行+补 defensive_stance(护身)行(敌方输出减益 −25 percent、duration 2、累加、max_stack 1、来源敌方技能「孤注守势」)——本批考证发现的存量漂移,非本批造成。 diff --git a/reports/iter48-实现报告-2026-11-02.md b/reports/iter48-实现报告-2026-11-02.md new file mode 100644 index 00000000..42b0deaa --- /dev/null +++ b/reports/iter48-实现报告-2026-11-02.md @@ -0,0 +1,81 @@ +# 迭代 48 实现报告(2026-11-02) + +> 批性质:需求改动实现批(三卡:①状态合并累加制②立绘显示档③战斗区背景替换)。执行形态=整迭代单工作区 `g-plan2-iter48` 串行。开工基点 bfa0a8be→a5c89d67(批中并入 master 对齐绿基线)。卡① 曾按 L3② 停机呈报(`iter48-停机呈报-卡1状态相位断言-2026-11-02.md`),**2026-11-02 用户甲案裁决**=补记卡①申报(R7 行:`_ineffective_row` 载荷自描述键+`_row_phase` 分类随动)后本区继续施工——七套件复跑全绿后卡①收口。三卡全收口,合并走总收口流程。 + +## 一、各卡状态 + +| 卡 | 状态 | 提交 | 窄测证据 | +|---|---|---|---| +| ①状态合并累加制 | 收口(甲案裁决随动后) | df173018 | roll_multiplier 42 绿(V1/V2/V3)/table_structure_guard 绿(V4)/system_contracts 绿/damage_controller 44 绿/seal_polarity 70 绿/round_flow 全绿(相位单调 PASS——deferred 归类随动)/refresh_feats 绿;EV 三锚 0.9148/1.0012/1.1948 逐位不变 | +| ②立绘显示档 | 收口 | ec385772 | standee_present_values 50 checks 绿(V13–V18 全执行)+素材闸 11 件全 PASS+样张脚本 30/30 全绿(V10 并排图产出) | +| ③战斗区背景替换 | 收口 | 33e5b72d | stage_background 18 checks 绿(V1–V5)+六套件关联窄测全 PASS+layout_probe 两档 PASS+ui_contrast 36 测点绿+ground_h 工具读取=100 | + +## 二、实际改动—验收对照表(结果列) + +### 卡②(对照表 V1–V8) + +| 需求点 | 改动 | 验收断言(尾缀〔立绘显示档 Vn〕) | 结果 | +|---|---|---|---| +| 逐件显示档高 | standee_motion.gd `PORTRAIT_DISPLAY_H` 九键+`_place_portrait` 按档算倍率 | V13 九键逐一(源高==原稿表值+显示高≈档高双读数) | 绿(9 键 ×2 断言全 PASS) | +| 硬编码 ×2 退役 | 同上 | V14 源码锚(读表+零 `Vector2(2.0,2.0)`) | 绿 | +| 纵横倍率恒等 | 同上 | V15 双轴同倍率+显示宽 round 档 ±0.51 | 绿(9 键全 PASS) | +| 主角中档 144 三态 | 素材 2× 手修稿+register 链 | V16 组合根装载 normal/attack/hit 逐态复读 | 绿(3 断言) | +| 素材不降采样 | 9 件原稿紧裁+闸件新口径 | `standee_asset_check.py` 断言①源高==表值②显示宽≤150(酋长 157 例外逐字) | 绿(11 件 PASS) | +| 两表同值不漂移 | Python STANDEE_DISPLAY_H/STANDEE_SLOT_H ↔ GDScript 表 | V17 源文本逐键对账 | 绿(文件可读路径生效;L2 退路在件未触发) | +| 表键集完整 | 同上 | V18 恰九键无多余 | 绿 | +| 样张口径随动 | render_sample_sheet_v3.py 站桩段+A4 解冻重校 88×92 | 脚本 CHECKS 全绿+V10 改前改后并排 | 绿(30/30) | +| 实机观感 | 九件+两消费面 | 目检(登记不阻塞) | 见第四节 | + +### 卡③(对照表 V1–V8) + +| 需求点 | 改动 | 验收断言(尾缀〔舞台背景 Vn〕) | 结果 | +|---|---|---|---| +| V1 ground_h 字段与校验 | schema+tres 100+layout_config | `_test_layout_ground_field`(表值/三态拒绝族)+config_db_test | 绿 | +| V2 按 board_type 选图 | TEX_STAGE_BG_FMT+set_board_type+两处接板同步 | `_test_background_selection`+layout_probe L1 真实入口(路径 `_dungeon.png` 结尾) | 绿 | +| V3 缺图回退 | `_load_stage_texture`+回退链 | `_test_background_fallback`(子类缺图→dungeon;全缺→平色不崩) | 绿 | +| V4 地面层几何 | TEX_STAGE_GROUND+_build_ground | `_test_ground_layer_geometry`+layout_probe 两档 size.y==ground_h | 绿 | +| V5 光柱与舞台底退役 | 删层删双常量;回退改指 SLOT_BACKDROP | `_test_beams_retired`+theme_projection/ui_contrast 锚改读后全绿 | 绿 | +| V6 接板真实链路 | main.gd/main_debug_flow.gd 各一守卫行 | layout_probe(L1 进入后路径 dungeon)+源码锚断言(stage_background_test:两文件含 `stage.set_board_type(`) | 绿 | +| V7 既有呈现回归 | 零改站桩/明细/棋盘 | 六套件关联窄测+两探针 | 全 PASS | +| V8 能力行名实与登记 | run_all.gd 登记;README 写卡段行 | README:138 三用例名与套件函数逐字一致;套件 manifest 在册 exit 0 | 绿(capability_audit 归合回 CI) | + +卡①对照表 R1–R7:R1/R2/R3/R4 断言全部落地且绿(V1/V2/V3/V4 尾缀可 grep);R5 快照断言随 V1 绿;R6 既有断言零改动复跑绿;R7(裁决补记随动)=`_ineffective_row` 载荷 `deferred: true`+`_row_phase` deferred→战斗段,相位单调断言在 seed 42 真实轨迹(含该行型)当轮执行且 PASS,申报 1–4 与 R1–R6 断言零变化。 + +## 三、读数留痕 + +- **EV 锚改前改后对拍**:goblin 0.9148 / bugbear 1.0012 / ogre_chief 1.1948——改前(CI unit.log:3968 区)与改后(卡①两轮窄测)逐位一致,全绿,零漂移。 +- **S13**:卡①触面(status_effect_table/status_container/damage_controller)与卡③触面(battle_stage_view/battle_layout_table/ui_kit/main/main_debug_flow)改前均零基线键;批中 gdstyle 跑批「基线内 5、基线外新违规 0、较登记值恶化 0」。 +- **结构预算**:battle_stage_view 类变量 11→14(≤15);公开方法 12→13(≤20);validate 分支 7 不变(地面校验拆 `_ground_field_errors`)。 +- **素材九件**(改前→改后):bugbear 51x62→102x123/drider 67x90→140x189/duergar 34x46→93x126/duergar_king 66x94→133x189/giant_spider 48x38→102x81/goblin 36x36→89x90/hook_horror 46x58→74x94/ogre_chief 62x74→158x189/hero 46x48,48x48,46x48→88x92,92x92,88x92。F7 实证:改前管线产物与包上素材逐件同尺寸。 +- **舞台背景四件**:三关背景各 1280×252、地面 1280×100(T0 PIL 实读)。 +- **对照图**:`artwork/candidates/立绘显示档批-2026-11-02/改前改后三面对照.png`(站桩区/标题屏看台/地图头像三面);样张并排图 `artwork/mockups/sample_battle_screen_before_after.png`(改前基线由旧脚本+旧资产生成)。 + +## 四、实机目检总清单(登记不阻塞) + +1. 九件立绘清晰度可接受(含灰矮人 126→96 的 0.76× 抽行观感判读——头号回退候选)〔卡②〕 +2. 同屏体量顺序 小<中<大〔卡②〕 +3. 标题屏看台与关卡地图头像无可感劣化(地图头像 0.52× 降采样)〔卡②〕 +4. 食人魔酋长显示宽 157 不碰邻位/不压顶部轮次指示〔卡②〕 +5. 主角三态切换横跳读数(三态源宽 88/92/88,切换约 3–6px 横跳——重摆归另批)〔卡②〕 +6. 三关背景可辨为不同洞窟、远景有纵深、非贴墙〔卡③〕 +7. 背景无光柱/光带/光源实体(缺图态同)〔卡③〕 +8. 地面读作泥土/碎石非瓷砖、中低明度不刺眼〔卡③〕 +9. 站桩与小石台踩在连续地面上;结算期明细带压住地面底带〔卡③〕 +10. B 区文字(轮次牌/演出提示/明细带)对背景/地面可读〔卡③〕 + +## 五、实现决定记录(代拍板随 commit 留痕+备案) + +- 卡②:CLI 旗标 `--standee48`→`--standee-display`、函数 `build_standee48`→`build_standee_display`(代拍板 2);hero key=`enemy_id()` 空值判 hero(代拍板 5);V17=源文本逐键 contains 对账+L2 打印退路(读不到不判红);**V15 判据实现**=双轴同倍率比例恒等(is_equal_approx)+round 档 ±0.51 带——卡面字面 `display_size.x == round(...)` 在非整数比下物理不可达(如地精 94.93),取更强判据实现,缩放几何零改动;产物计数=八敌+主角立绘恰九(attack/hit 为伴随态不入计数——`STANDEE_SRC_H` 九键口径);样张 S6 语境 x 坐标随动(②③④+60、⑤+30,断言与 meta 全随动);闸件第三处复写兜底字面量删除(import 失败即崩——契约 2 单点纪律)。 +- 卡③:接板同步取「board 存局部变量→rebuild→守卫同步」三行形态;`_beams_rect` 判定用源码锚(函数不进 script constant map,卡内 haskey 备选按实况取源码形态);layout_probe 地面高容差 0.51(float 布局);卡②ui_kit.gd 注释「48px 档」残留未动(该件不在卡②写面——留观察)。 +- 卡①:停机呈报另件。 + +## 六、遗留读数义务与观察 + +- 卡①停机已随甲案裁决闭合(2026-11-02)——停机呈报第六节的待办清单状态回退拟稿**作废不执行**(卡已收口,条目状态走完成删条通道归批后收尾)。 +- status_effects.tres :99-141 批注含 refresh 陈旧叙事(用户 2026-11-01 恢复令在案)——本批零触碰,处置归用户另裁(卡①范围边界在案)。 +- ui_kit.gd TEX_HERO_PORTRAIT 行注释「48px 档」与 path_check.py 已改指外的一处陈旧表述——随下次触碰该件的批次顺带换代(反哺点清单未列——非文档面)。 +- 渲染闸(05)与 golden 零变化判据归合回后本地 CI(里程碑 --code 出口因卡①停机未跑——合并前置齐)。 + +## 七、独立验收审计 + +独立验收审计已执行(未参与实现的子代理,报告 `reports/iter48-验收审计-2026-11-02.md`):首轮结论=窄口径不通过,缺漏三项——①卡③ V6 源码锚断言未落地(实现遗漏,卡面本有 prescribed);②代拍板追认单未另立件;③两处甲案裁决前陈旧叙述。三项已随审计补差修齐(V6 锚断言入 stage_background_test 套件并跑绿;追认单另立 `reports/iter48-代拍板追认单-2026-11-02.md`;陈旧叙述订正),复审结论见审计报告末节。 diff --git a/reports/iter48-验收审计-2026-11-02.md b/reports/iter48-验收审计-2026-11-02.md new file mode 100644 index 00000000..5e2108c6 --- /dev/null +++ b/reports/iter48-验收审计-2026-11-02.md @@ -0,0 +1,150 @@ +# 迭代 48 验收审计(2026-11-02) + +> 审计性质:独立验收审计(未参与实现的会话执行,test-conventions §8.7 口径)。工作区=`g-plan2-iter48`(分支 iter48),基点 master=a5c89d67,四笔=f08b63a3(卡②立绘显示档批)/ ef8154b2(卡③战斗区背景替换批)/ 64b9d79a(卡①状态合并累加制批,含甲案裁决随动)/ 3dd93dde(收尾)。审计只读:可 Read/grep/跑测试,禁改源码/测试/卡片;唯一写面=本报告。 +> 审计输入:三份需求卡片、`iter48-实现报告-2026-11-02.md`、`iter48-停机呈报-卡1状态相位断言-2026-11-02.md`、`git diff a5c89d67..iter48` 逐笔。 + +## 一、总结论 + +**不通过(窄口径)。** 三卡改动—验收对照表共 24 行,23 行证据齐备、当轮真实跑批绿、测试削弱零申报外动作、R7 零行为改动与九件素材原稿分辨率两大专项均实证成立;唯卡③ V6 申报的「源码锚(main.gd 与 main_debug_flow.gd 均含 `stage.set_board_type(`)」未在任何测试/探针落地,且实现报告§二卡③ V6 行「+源码锚在套件」与实况不符(证据误报)。修复面极窄(补一条静态锚断言或由用户裁对该判据改口径),补齐后复审只需核该一点。 +> **复审结果(2026-11-02,同日):三项缺漏已修齐,终结论=通过——见文末「复审(2026-11-02)」节。** + +## 二、对照表逐行核对 + +### 2.1 卡①(状态合并累加制)R1–R7 + +| # | 需求点 | 断言存在+尾缀 grep | 真实入口 | 判读 | +|---|---|---|---|---| +| R1 | 六行换代+词表+加载期校验 | `table_structure_guard_test.gd`〔状态累加 V4〕在位(:272-275),值判 `accumulate`;实跑 66 checks 全绿=全表装载零红 | ConfigDB 加载链 → `row_by_id()`(套件经 `_db` 实装装载) | 通过 | +| R2 | 重复授予累加+层数恒 1 | `roll_multiplier_test.gd`〔状态累加 V1〕在位(remaining==3、layers==1、snap_magnitude==−65);实跑 PASS | `battle_orchestrator.new(_db,rng)`+`begin_battle` 真实编排宿主 → `apply_effect` | 通过 | +| R3 | 同轮双授予累加两段 | 〔状态累加 V2〕在位(6+2=8);实跑 PASS | 同上 | 通过 | +| R4 | 覆盖时长按覆盖值累加 | 〔状态累加 V3〕在位(3+3=6,`apply_effect(...,3)`);实跑 PASS | 同上(覆盖入参即 combat_segment 同口) | 通过 | +| R5 | 快照纪律不变 | V1 断言内 `snap_magnitude==−65` 承载;实跑 PASS | 同 R2 | 通过 | +| R6 | 两臂零变化=既有断言零改动回归 | diff 核实三套件零触碰(numstat:damage_controller_test 仅 :376 标签 1/1;seal_polarity、system_contracts 不在 diff);实跑三套件全绿(44/70/15 checks) | 各既有真实入口 | 通过 | +| R7 | 相位分类随动(甲案) | `round_flow_skill_pool_test.gd`〔:422 相位单调〕+:466-468 `deferred` 分支在位;实跑 134 checks 全绿含「每轮行相位单调」PASS | `_run_battle(1,0)` 真实结算流(seed 42 轨迹) | 通过(零行为改动自证见第六节 a) | + +### 2.2 卡②(立绘显示档批)对照表 9 行 + +| # | 需求点 | 断言存在+尾缀 grep | 真实入口 | 判读 | +|---|---|---|---|---| +| 1 | 逐件显示档高 | `_check_display_tier`〔立绘显示档 V13〕九键逐一在位;实跑 9 条 PASS(源高实读==原稿表值+显示高≈档高双读数) | `StandeeBody.new("enemy")`→`set_data(enemy_id)`→`set_portrait_texture(真纹理)`→`portrait_probe()`;主角经 `StandeeBody.new("hero")` 同链——**未直读常量,读数取自落位后 sprite 实测** | 通过 | +| 2 | 硬编码 ×2 退役 | 〔V14〕源码锚(读表+零 `Vector2(2.0, 2.0)`)在位;实跑 PASS;审计另 grep 全 presentation 确认零残留 ×2 立绘倍率 | `FileAccess` 静态判据(卡面即申报为静态判据) | 通过 | +| 3 | 纵横倍率恒等 | 〔V15〕双轴同倍率(is_equal_approx)+显示宽 round 档 ±0.51 带在位;九键实跑 PASS | 同 V13 | 通过(±0.51 带见第六节 b) | +| 4 | 主角中档 144 三态 | 〔V16〕三条在位(normal/attack/hit 逐态显示高 144);实跑 PASS | `BattleStageView` 组合根装载 → `hero_standee.portrait_probe()` → `set_hero_state`(内部即 `apply_hero_state`,同一真实链);「源高」腿由素材闸三态断言(92/92/92)承载 | 通过 | +| 5 | 素材不降采样 | `standee_asset_check.py` 断言①源高==`STANDEE_SRC_H` 表值在位;实跑 11 件全 PASS | 工具闸实跑(读盘上真实 PNG) | 通过(第六节 c) | +| 6 | 两表同值不漂移 | 〔V17〕源文本逐键对账在位;实跑 PASS(文件可读路径生效) | 读 `tools/pixelize_candidates.py` 源文本逐键 contains 对账 | 通过(L2 退路见第六节 b) | +| 7 | 表键集完整 | 〔V18〕恰九键无多余在位;实跑 PASS | `get_script_constant_map()` 读 `PORTRAIT_DISPLAY_H` | 通过 | +| 8 | 样张口径随动 | A4 冻结断言显式解冻重校到 88×92(diff 在案,卡 T3 明令「解冻重校、禁放宽凑绿」);站桩段按 `STANDEE_SLOT_H` 取数+S6 坐标随动在 diff。**脚本 30/30 未由审计复跑**(脚本落盘产物且资产根两级回退指向主检出,避免审计写盘)——依据=A4 冻结值 88×92 与盘上素材实读(素材闸 88×92)逐位一致+报告申报 | `python tools/render_sample_sheet_v3.py` | 通过(依据留痕,未复跑) | +| 9 | 实机观感 | 目检十项落实现报告第四节(登记不阻塞) | 真人目检 | 通过(登记义务完成) | + +### 2.3 卡③(战斗区背景替换)V1–V8 + +| # | 需求点 | 断言存在+尾缀 grep | 真实入口 | 判读 | +|---|---|---|---|---| +| V1 | ground_h 字段与校验 | `_test_layout_ground_field` 四条〔舞台背景 V1〕在位;实跑全 PASS;`config_db_test` 29 checks 绿;工具读取 `ground_h=100`(审计实跑输出 100) | `BattleLayoutTable.validate()`+`ConfigDB.load_tables()` | 通过 | +| V2 | 按 board_type 选图 | `_test_background_selection` 五条〔舞台背景 V2〕在位;实跑 PASS;`layout_probe` 两断言〔舞台背景 V2〕〔舞台背景 V2/V6〕在位且实跑 PASS | 探针 `main.ui.modals.level_screen.press_candidate(0)`(layout_probe.gd:32)→`board_changed` 真实选路进战斗屏后才断言 | 通过 | +| V3 | 缺图回退 | `_test_background_fallback` 两条在位;实跑 PASS(子类覆写 `_load_stage_texture` 构造缺图——卡面申报的观测法,不注入不改资产) | `set_board_type("underdark")`(缺图子类) | 通过 | +| V4 | 地面层几何 | `_test_ground_layer_geometry` 四条在位;实跑 PASS;`layout_probe` 两档 `size.y==ground_h`(容差 0.51,报告§五备案)实跑 PASS | 舞台构造+press_candidate(0) 真实进入 | 通过 | +| V5 | 光柱与舞台底退役 | `_test_beams_retired` 三条(源码锚+常量表+菜单斜光带在位)实跑 PASS;`theme_projection_test` 160 checks 绿(对比锚改读合并目标后 6.33:1/5.75:1 PASS);`ui_contrast_probe` 36 测点绿 | 构造+常量表+两探针 | 通过 | +| V6 | 接板真实链路 | layout_probe 真实入口腿 PASS(路径 `_dungeon.png` 结尾,尾缀〔舞台背景 V2/V6〕);**申报的源码锚断言(main.gd+main_debug_flow.gd 含 `stage.set_board_type(`)全仓测试/探针 grep 零命中=未落地**;实现报告§二 V6 行「+源码锚在套件」与 diff 实况不符 | press_candidate(0)(仅覆盖 main.gd 链);main_debug_flow 调试链零自动化断言 | **缺漏**(生产行在案可 grep——main.gd:388、main_debug_flow.gd:106;缺的是申报的验收断言) | +| V7 | 既有呈现回归 | 六套件+两探针实跑全绿(审计复跑其中 standee_present_values 50/theme_projection 160/layout_probe/ui_contrast PASS;diff 证实站桩/明细/棋盘/golden/shot_checker 零触碰) | 各既有真实入口 | 通过 | +| V8 | 能力行名实与登记 | run_all.gd:196 登记行在案;README:138 能力行三用例名与套件函数逐字一致(`_test_background_selection`/`_test_ground_layer_geometry`/`_test_beams_retired` 均实存);capability_audit 归合回 CI(报告已声明) | `res://tests/run_all.gd` | 通过 | + +## 三、抽查实跑记录(审计本人在工作区执行) + +| 测试 | 退出码 | 关键结果 | +|---|---|---| +| `--headless --path game --script res://tests/unit/battle_settlement/roll_multiplier_test.gd` | 0 | 42 checks 全绿;〔状态累加 V1〕「累加至 3(1+2——快照沿首授)」/〔V3〕「累加至 6(3+3)」/〔V2〕「累加至 8(6+2)」三条 PASS | +| `res://tests/unit/battle_settlement/round_flow_skill_pool_test.gd` | 0 | 134 checks 全绿;「每轮行相位单调(授予→增益/减益→战斗→衰减→判定)」PASS——deferred 归类在 seed 42 真实轨迹生效 | +| `res://tests/unit/data_config/table_structure_guard_test.gd` | 0 | 66 checks 全绿;〔状态累加 V4〕「ac_up 行在位(hero · +1 ac · 累加语义)」PASS | +| `res://tests/unit/battle_settlement/damage_controller_test.gd` | 0 | 44 checks 全绿(R6 回归证词) | +| `res://tests/unit/battle_settlement/seal_polarity_test.gd` | 0 | 70 checks 全绿(R6) | +| `res://tests/unit/contracts/system_contracts_test.gd` | 0 | 15 checks 全绿;「开域后受理已知 id(布尔受理口径 true 通道)」PASS(R6) | +| `res://tests/unit/presentation/standee_present_values_test.gd` | 0 | 50 checks 全绿;V13 九键 ×2+V14+V16 三态+V17+V18 共 24 条显示档断言逐条 PASS | +| `python tools/standee_asset_check.py` | 0 | 11 件全 PASS(源高 90/81/126/94/123/189/189/189/92 逐件==原稿表值;酋长显示宽 157 例外逐字命中) | +| `res://tests/unit/presentation/stage_background_test.gd` | 0 | 18 checks 全绿(V1 四条/V2 五条/V3 两条/V4 四条/V5 三条) | +| `res://tests/unit/presentation/theme_projection_test.gd` | 0 | 160 checks 全绿;舞台底对比锚(SLOT_BACKDROP)6.33:1、5.75:1 ≥4.5 PASS | +| `res://tests/unit/data_config/config_db_test.gd` | 0 | 29 checks 全绿(V1 装载链腿) | +| `res://probe/layout_probe.tscn`(headless) | 0 | 「PASS — 2 档几何不变量全过」——含新增舞台背景/地面层断言两档通过 | +| `res://probe/ui_contrast_probe.tscn`(headless) | 0 | 「对比度 36 对测点全绿」 | +| `python -c "from tools.layout_config import load; print(load()['ground_h'])"` | 0 | 输出 `100`(V1 工具腿) | + +## 四、测试削弱申报核对(申报 vs diff,逐处) + +- 卡①申报 1–5:diff 逐处对上——①:160-161 削弱断言换代(2→3,含 layers/snap 双判据);②:157-158、:230、:358 三处注释与 `_weaken_refresh_probe`→`_weaken_accumulate_probe` 改名(全仓旧名零残留);③table_structure_guard :272-275 值+消息换代;④damage_controller_test :376 仅标签文字、断言数值逐字未动;⑤round_flow `_row_phase` 补 `or bool(row.get("deferred", false))` 分支(申报 5=甲案随动)。**申报外零删除、零放宽、零扫描面缩小、零换下层直调**(numstat:roll_multiplier 31/12 全属申报面;其余测试件 1-2 行均申报内)。 +- 卡②申报「不删不改任何既有断言」:`standee_present_values_test.gd` diff 93/0 纯新增;`ui_probe.gd` 2/2 仅文案(判据 `has_tex` 不变);样张 A4 冻结值 46×48→88×92 系卡 T3 明令「显式解冻重校到新档」(非放宽——旧值对原稿分辨率素材必红,新值与盘上素材逐位绑定)。无申报外改动。 +- 卡③申报「零删除零放宽,唯一改读=theme_projection_test 与 ui_contrast_probe 舞台底锚 STAGE_BG→SLOT_BACKDROP」:diff 恰为该两处 1 行/1 行改读,阈值与文案未动;`layout_probe` 14/1 纯追加(1 删=文件末补换行符);其余测试件零触碰。无申报外改动。 + +## 五、内部字段直查受控例外核对 + +| 直查点 | 是否申报/在案 | 判读 | +|---|---|---| +| 卡①探针 `settlement._status_effects` / `settlement._damage.clamped_pool` | 卡对照表 R2 真实入口列注明「经真实编排宿主 begin_battle」+「remaining/layers 只读投影(query_active)」;该直查为既有探针沿例(旧 `_weaken_refresh_probe` 同面) | 通过(在案) | +| 卡② `mo._portrait_sprite`(portrait_probe 扩两读数) | 卡§6 文件结构图「探针 portrait_probe() 扩显示读数(几何出口单点)」+§12 落位预检「复用既有探针出口」;旧 `has_tex` 即读同成员 | 通过(在案) | +| 卡③ layout_probe `stage.get("bg_texture")`/`get("ground_layer")` | 二者为本批新增公开 var(非 `_` 私有),非内部直查 | 不适用 | +| layout_probe `bv.get("_board")`(既有) | 探针源码 :102 注释自带例外理由(受控例外在案,非本批引入) | 通过(既有) | + +## 六、特别核三点 + +**(a)卡① R7 deferred 方案=零行为改动:成立。** +- 生产侧 diff 仅 `_ineffective_row` 一行:载荷 dict 在原 `"batch_key"` 键后追加 `"deferred": true`——行型(reward_ineffective)、source_class、origin_cell、highlight、display 文案、value 0、round_index 全部逐字未动。 +- 全仓 grep:生产码无任何消费方读取结算行的 `deferred` 键(其余 `deferred` 命中全属宝物域 treasure_items,异面无关);分类读取只在该测试 `_row_phase`。 +- 归类非一刀切:`grant_segment.gd:301` 的授予段未生效行(坑道小憩)不带 deferred 键,仍归第 0 段——分类器仍按行自描述区分「授予段未生效」与「战斗段地图账殿后」,五段全序不变量强度不降。 +- 非空转证据链:停机呈报在案的红(seed 42 round 2 magic_bolt 行判第 0 段致违序)发生先于随动;载荷加键不消耗 RNG、不改判定/数值路径 → 轨迹逐行不变,该行只能经新分支归入相位 2——套件由 133+1FAIL 转 134 全绿即该分支真实生效的直接证据。 + +**(b)卡② V17 L2 退路与 V15 ±0.51 带:均按备案执行。** +- V17:测试内置 `../tools/`→`tools/` 两级路径回退,双双不可读时打印 `[L2] V17 工具源不可读…(记录不判红)` 并跳过对账——与卡面「禁当红亦禁当绿」逐字一致;本轮文件可读、对账正常执行并 PASS(退路在件未触发)。 +- V15:实现=双轴同倍率 is_equal_approx+`absf(display_size.x − round 档) < 0.51`;卡面字面 `display_size.x == round(...)` 在非整数比(如地精 89×96/90=94.93)下物理不可达,取带式为更强可行判据——实现报告§五已备案且九键 round 档值(95/121/71/113/119/138/157/139/132)与源宽×档高/源高的四舍五入逐一吻合;±0.51 覆盖 round 语义 ±0.5 加浮点残差,未放宽体量语义(酋长 157 超宽例外仍由素材闸逐字校验)。 + +**(c)九件素材=原稿分辨率:实证成立。** +- 素材闸断言①逐件「源高 == STANDEE_SRC_H 表值」11 件全 PASS(含主角三态 92/92/92);旧降采样稿(八敌 36–94 高、主角 46–48 高)任一回填即在该断言红。 +- 管线侧 `build_standee_display` 紧裁后 `im.height != STANDEE_SRC_H` 即 `sys.exit(2)`+产物计数 ≠9 即停(L3#2 防回退顶替)双自证在 diff 在案。 +- 报告§三改前→改后九件读数(如 goblin 36×36→89×90、ogre_chief 62×74→158×189)与闸件实跑输出逐件一致。 + +## 七、缺漏清单与观察项 + +**缺漏(判不通过的依据):** + +1. 卡③ V6 源码锚断言未落地+证据误报:卡面 V6 行判据面含「源码锚 `main.gd` 与 `main_debug_flow.gd` 均含 `stage.set_board_type(`」,实现报告§二卡③ V6 行称「+源码锚在套件」;实测 `stage_background_test.gd:_test_background_selection` 与全仓测试/探针均无该断言。影响面:main.gd 链已由 layout_probe 真实入口覆盖;**main_debug_flow 调试链的同步行(main_debug_flow.gd:106)零自动化断言**。生产行本身在案(两处 grep 可定位、行为形态与卡 T2 一致),缺的是申报的验收证据。修复建议:在 `stage_background_test.gd` 补一条双文件源码锚断言(或经用户裁对该判据改口径并订正实现报告),随修后复审只核此点。 + +**记录级(不单独构成不通过,随批处置):** + +2. 卡② T3/卡③ T5 各要求产出物三份(实现报告/代拍板追认/反哺点),「代拍板追认单」未另立件;代拍板内容已在实现报告§五逐条备案(卡②五条/卡③三条,覆盖面与卡面白名单对得上)。补立或由用户裁认「报告§五代行追认单」二选一。 +3. 实现报告§七「当前合并被卡①停机阻塞」与反哺点清单卡①节标题「停机在案」均为甲案裁决前的陈旧叙述(同文头部已记卡①收口)——随补丁顺带订正,禁留两处记同一件事互相矛盾。 + +**观察项(无需动作):** + +- 卡②自报遗留:ui_kit.gd:233 注释「48px 档」残留(该件不在卡②写面)——实现报告§六已登记,随下次触碰顺带换代。 +- path_check.py 注释改名(`STANDEE_TIER_H`→`STANDEE_DISPLAY_H`)不在卡②文件结构图列面,属表改名的必要注释联动(1 行注释,零行为)——记录为申报外最微触碰,不判红。 +- 渲染闸(05)与 golden 零变化判据归合回后本地 CI(里程碑 --code 出口因卡①停机未跑,实现报告§六已声明)——本审计不含窗口化渲染闸,合并后以 CI 回执为准。 + +## 八、证据基线 + +审计只读声明:本审计未修改任何源码/测试/卡片/工具;写面仅本报告。实跑 14 项(第三节清单)全部退出码 0;关键 grep(refresh 残留、accumulate 恰 6 处、`Vector2(2.0, 2.0)` 零残留、`set_board_type` 锚点)均留存于本文各节。 + +**总结论(首轮):不通过(窄口径)——缺漏清单见第七节第 1 条(卡③ V6 源码锚未落地+报告证据误报),补齐该点并处置第 2/3 条记录项后,本批其余 23 行对照表证据、削弱申报合规性、R7 零行为改动与素材原稿分辨率专项均已实证通过。**(终结论随复审更新=通过,见下节。) + +## 九、复审(2026-11-02) + +> 复审面=窄口径,只核首轮缺漏清单三项修复,不改首轮其他结论。实现侧在审计补差后按卡序重塑重建分支:新链 db43f77e(卡①)→ 99095d88(卡②)→ 0478258d(卡③含审计补差)→ 7c9e5722(收尾),基点仍 a5c89d67。`git diff d2b034b1 HEAD` 输出为空(逐字节一致)自证成立——首轮对代码/测试/工具面的全部结论对新链继续有效;本报告文件本身已随收尾提交入库,复审写面仍仅本文件。 + +**修复 1——卡③ V6 源码锚断言落地:核验通过。** +- `stage_background_test.gd:_test_background_selection` 内新增循环断言(逐 `res://presentation/main.gd` 与 `res://presentation/main_debug_flow.gd` 读源,断言 `contains("stage.set_board_type(")`,尾缀〔舞台背景 V6〕两条)——grep 在位;读文件失败时 `contains` 必假(fail-closed,不空转)。 +- 实跑:`--headless --path game --script res://tests/unit/presentation/stage_background_test.gd` → **exit 0,「all green (20 checks)」**(首轮 18 → 20),两条 V6 PASS 逐条在案:「接板同步源码锚 main.gd 含 stage.set_board_type(」「接板同步源码锚 main_debug_flow.gd 含 stage.set_board_type(」。 +- 首轮缺漏 1 关闭:main.gd 与 main_debug_flow 两条接板链均有真实入口腿(layout_probe,首轮已绿)+静态锚腿(本轮绿),V6 判据面两腿齐备。 + +**修复 2——代拍板追认单另立件:核验通过。** +- `reports/iter48-代拍板追认单-2026-11-02.md` 在库:卡①白名单 1–3(词表命名 accumulate/快照不改/探针改名与尾缀)+甲案裁决随动单列且正确标注「非代拍板,用户裁决授权」;卡②白名单 1–5(probe 键名/CLI 与函数改名/尾缀格式/对照图目录名/hero key 判法)逐项与首轮实核落地一致;卡③白名单 1–6(私有函数布局/helper 与措辞/注释文案/TextureRect 写法/描边可见性=平色 Panel 描边被背景覆盖零新增类变量/格式修空项)逐项一致,无超白名单事项。 +- 首轮记录的实现决定(V15 ±0.51 带、V17 L2 退路形态、产物计数九件口径、样张 S6 坐标随动、闸件兜底字面量删除、接板三行形态、`_beams_rect` 源码锚形态、layout_probe 0.51 容差)与追认单不矛盾——其性质属卡面明令步骤或已在实现报告§五备案的判据实现(首轮第六节 b 已按备案口径核过),追认单按「白名单逐项」口径立单,覆盖面成立。首轮缺漏 2 关闭。 + +**修复 3——陈旧叙述订正:核验通过。** +- 实现报告§七已换代为「审计已执行(首轮窄口径不通过三项缺漏)→三项已随审计补差修齐→复审结论见审计报告末节」,与实况一致(含对本报告路径与追认单路径的正确指引);首轮指出的「§七仍称合并被卡①停机阻塞」矛盾句已消除。 +- 反哺点清单卡①节标题已改「(甲案裁决已闭合——随本批合回生效)」。首轮缺漏 3 关闭。 + +**复审实跑记录:** + +| 测试 | 退出码 | 关键结果 | +|---|---|---| +| `--headless --path game --script res://tests/unit/presentation/stage_background_test.gd` | 0 | 20 checks 全绿;两条〔舞台背景 V6〕源码锚 PASS | +| `git diff d2b034b1 HEAD` | 0 | 空输出(重塑后终树与审计补差树逐字节一致) | + +**总结论(终版):通过。** 首轮三项缺漏全部修齐并经当轮实跑核验;三卡 24 行对照表证据、测试削弱申报合规性、内部字段直查例外、R7 零行为改动、V17/V15 备案执行、九件素材原稿分辨率专项全部成立。本报告为合并前独立验收审计的最终口径。