diff --git a/design/engineering/test-conventions.md b/design/engineering/test-conventions.md index e58baf52..b8830a8a 100644 --- a/design/engineering/test-conventions.md +++ b/design/engineering/test-conventions.md @@ -62,7 +62,7 @@ | 重放 | 同种子断点回放、改前改后配对 | | 状态/计数器断言 | 条件解锁、限次、充能——置数据→走路径→断计数值 | -4. **调试注入两层(能力测试与流程体验两分法的落码面)**:自动化测试=测试代码直调核心层写口构造状态(直改数据表行/计数器/存档域,不经 UI、不走正常资源积累流程——冒烟现役做法);人工体验=DebugOverlay/DS_DEBUG 调试面,服务用户目检(发布态该面恒隐、无 UI 开启口,开发期临时启用=本地改 `_debug_entry` 缺省、不提交;能力测试不经 UI,本条口径不受影响)。清单条目的「怎么测」必须写到数据面粒度:改哪张表哪行、置哪个计数、调哪个核心写口。 +4. **调试注入两层(能力测试与流程体验两分法的落码面)**:自动化测试=测试代码直调核心层写口构造状态(直改数据表行/计数器/存档域,不经 UI、不走正常资源积累流程——冒烟现役做法);人工体验=DebugOverlay 调试面,服务用户目检(2026-11-09 用户裁:调试入口常驻——「调试」角标恒亮、浮窗经角标真点开启;能力测试不经 UI,本条口径不受影响)。清单条目的「怎么测」必须写到数据面粒度:改哪张表哪行、置哪个计数、调哪个核心写口。 5. **换代批旧验证约束同生死**:删除旧数据行/旧实现代码的批次,必须同批摘除只验证旧实现的断言与护栏校验,由新断言替代——旧件断言残留=冒烟假绿来源;合并后冒烟全绿且全仓无旧件残留引用为证。 6. **违约通道类需求点必须落独立负面套件(2026-10-28 立)**:预期运行期违约/致命路径的需求点(handler 通道、fail-fast 分支)一律落独立负面套件并按 manifest 登记 `expect=1, negative=true`,禁落现役非负面套件——headless 下 assert 失败必产不可捕获的 SCRIPT ERROR,非负面套件的输出被错误扫描命中即假红(先例=reward_dangling_treasure/counter_prefix_fatal/extended_row_violation/run_time_fatal 四件)。 diff --git a/game/README.md b/game/README.md index 1bba0bf8..bf2069b5 100644 --- a/game/README.md +++ b/game/README.md @@ -12,7 +12,7 @@ 1. 用 Godot 4.7.2 打开本目录(含 `project.godot` 的文件夹) 2. 按 F5 运行(主场景 `presentation/main.tscn`) 3. **主入口:`▶ 开始冒险(三关连探:地精洞窟 → 幽暗地域 → 灰矮人矿城)`**——一条命走完三关(生命/GP/加算区跨关同账、非末关的关卡完成发大奖励〔上限提升+血回满+钥石〕、任意战斗倒下冒险终、结算屏出冒险摘要五件事;选路停点可「放弃冒险」(同失败结算));首关节点链:战→战→赏→战→战→疗→王。唯一试玩入口 = 完整冒险——单关测试直入口(L2/L3)已退役(2026-09-23 用户拍板) -4. 调试浮窗(功能面:攻击/生命百分比加成〔模拟天赋树解锁〕+ 批量模拟〔输出关卡完成率/承伤期望/败北节点分布〕+ 两层调试入口)——发布态入口恒隐(调试角标不显示、浮窗无 UI 开启口;开发期临时启用改 `_debug_entry` 缺省本地不提交),浮窗体系整体退役属发布工程批 +4. 调试浮窗(功能面:攻击/生命百分比加成〔模拟天赋树解锁〕+ 批量模拟〔输出关卡完成率/承伤期望/败北节点分布〕+ 两层调试入口)——调试入口常驻(右下角「调试」角标恒亮、真点开浮窗;2026-11-09 用户特批恢复批) headless 冒烟(断言计数随断言面增减浮动,以当次跑测打印为准,含关卡线性推进/满配冒险成功/裸装败北/回放确定性): diff --git a/game/presentation/main.gd b/game/presentation/main.gd index cf76ec99..6791e351 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -32,7 +32,7 @@ var meta: MetaProgressionCore: get: return get_node(AUTOLOAD_PATH_META) var logger = null # 试玩日志器(JSONL 持久化 + 卡死诊断转储——呈现层组件) -var _debug_entry := false # 调试会话门控(缺省 false=发布态:角标恒隐、浮窗无 UI 开启口;沿革查 git log) +var _debug_entry := false # 调试会话门控(写死=true——恒开:角标常驻点亮、浮窗入口常在;_ready 赋值;2026-11-09 用户特批恢复批——常驻调试入口,无发布前清理义务) var ui: UiRegistry # 界面注册面(ui_registry.gd——界面句柄/层序合同/模态编排句柄的单点宿主) var _confirm_consumer := "" # 确认弹窗消费方状态量(契约 3 编排——open 前设、分派后清) var _confirm_consumer_slot := 0 # 消费方附随槽号(delete_slot 消费方专用) @@ -135,7 +135,8 @@ func _ready() -> void: _build_ui() begin_session(false) # 闲时会话(gp_ledger 等探针注入面自 _ready 起恒在——ui_probe 合成段时序) ui.screens.start_overlay.visible = true - ui.screens.debug_badge.visible = _debug_entry # 浮层角标可见性须门控落定后赋值(构建/连接在 _build_ui);_debug_entry 缺省 false=发布态恒隐 + _debug_entry = true # 调试入口门控写死=true(2026-10-16 用户令常量门控、2026-11-09 用户特批恢复——常驻调试入口,无发布前清理义务) + ui.screens.debug_badge.visible = _debug_entry # 浮层角标可见性须门控落定后赋值(构建/连接在 _build_ui) # boot 菜单优先——启动不自动开浮窗(开始屏不得被调试面板盖住); # 调试入口=UI 最顶层全局浮层角标(LAYER_CONTRACT 末位 float 类,任何 UI 不遮挡) diff --git a/game/probe/ui_click_probe.gd b/game/probe/ui_click_probe.gd index 343baa33..264a2702 100644 --- a/game/probe/ui_click_probe.gd +++ b/game/probe/ui_click_probe.gd @@ -563,10 +563,11 @@ func _ready() -> void: _problems.append("音量滑杆未实时生效(master bus db %f ≠ %f)" % [AudioServer.get_bus_volume_db(master_idx), expect_db]) if absf(iso_s.volume_linear - 0.3) > 0.001: _problems.append("音量未入 store(%f ≠ 0.3)" % iso_s.volume_linear) - # 调试入口断言(卡⑦ c4 发布态换代——角标恒隐;原「最顶层浮层不被遮挡」 - # 回归语义随调试浮层发布态退役,申报见迭代 38 实现报告 §8.2) - if main.ui.screens.debug_badge == null or main.ui.screens.debug_badge.visible: - _problems.append("设置面开中调试角标可见(发布态恒隐失守)") + # 调试入口断言(全局浮层角标=UI 最顶层、任何 UI 不遮挡——本段设置面 + # 开中正是遮挡场景:浮层角标此时仍应可见;点击开浮窗路径归 tune_probe; + # 2026-11-09 特批恢复批——发布态恒隐语义退役) + if main.ui.screens.debug_badge == null or not main.ui.screens.debug_badge.visible: + _problems.append("设置面开中调试浮层角标不可见(最顶层浮层失守——被遮挡)") var settings_close: Button = ProbeUiUtil.find_button(main.ui.modals.menu.settings_overlay, "返回", "prefix") if settings_close == null: _problems.append("设置面返回按钮缺失") diff --git a/game/probe/ui_tune_probe.gd b/game/probe/ui_tune_probe.gd index 178da270..8a5a1120 100644 --- a/game/probe/ui_tune_probe.gd +++ b/game/probe/ui_tune_probe.gd @@ -43,8 +43,8 @@ func _ready() -> void: # ① 全局浮层角标开窗(调试入口=UI 最顶层浮层,任何 UI 不遮挡—— # main 直接子层、LAYER_CONTRACT 末位 float 类;boot 菜单优先不开浮窗,角标真实点击路径开窗; # 悬浮于菜单之上——开始层不隐藏;树序新基准=登记册末位(确认弹窗之后=绘制序最上)) - # 判据出处: design/engineering/test-conventions.md:49 调试面=DebugOverlay/DS_DEBUG——发布态恒隐无 UI 开启口、开发期临时启用(①开窗层级组) - main._show_debug_overlay() # 发布态角标恒隐(main.gd:138 _debug_entry 缺省 false)——角标信号路径已退役(:123 同款先例),开窗经组合根直调承载 + # 判据出处: design/engineering/test-conventions.md §5-4 调试面=DebugOverlay 常驻目检面(2026-11-09 特批恢复批,①开窗层级组) + main.ui.screens.debug_badge.pressed.emit() # 角标真实信号路径 → 组合根 _on_debug_badge_pressed → C6 单口(2026-11-09 恢复) await get_tree().process_frame if not main.ui.modals.menu.debug_overlay.visible: problems.append("调试浮层角标点击后浮窗未开(全局浮层入口失守)") @@ -157,10 +157,12 @@ func _ready() -> void: # 对局中批量模拟/两层调试两钮禁用;当局数据六项与只读访问器逐项一致;关闭钮真实路径收窗恢复 # 判据出处: design/engineering/test-conventions.md:49 调试面对局态:不锁棋盘输入/两钮禁用/当局数据只读一致(⑨组) var dbg_badge: Button = main.ui.screens.debug_badge - if dbg_badge == null or dbg_badge.visible: - problems.append("对局中调试浮层角标非恒隐(发布态语义失守——卡⑦ 删写死行批)") + if dbg_badge == null or not dbg_badge.visible: + problems.append("对局中调试浮层角标未点亮(全局浮层最顶层失守)") else: - main._show_debug_overlay() # 对局中开浮窗回归经直调承载(:61 既有直调先例——发布态角标恒隐,按钮信号路径退役) + if dbg_badge.disabled: + problems.append("战斗屏调试角标被置灰(T2 排除式判据失守)") + dbg_badge.pressed.emit() # 真实按钮信号路径 → 组合根 _on_debug_badge_pressed → C6 单口(2026-11-09 特批恢复批) if not main.ui.modals.menu.debug_overlay.visible: problems.append("对局中角标开浮窗失败(P2 甲对局中可达失守)") if main.ui.flow.locks_input(): diff --git a/game/tests/golden/README.md b/game/tests/golden/README.md index 64c50693..c38cd4bb 100644 --- a/game/tests/golden/README.md +++ b/game/tests/golden/README.md @@ -33,6 +33,7 @@ |---|---|---|---| | 2026-11-08 | 棋盘三图+menu_boot+lmap 两 Shot+单基线合并(6 张) | DKChan | 确认 | | 2026-11-08 | 屏态五锚+营地窗态五锚+浮层四锚(14 张补锚) | DKChan | 确认 | +| 2026-11-09 | menu_boot 换代(调试角标恢复批——右下角「调试」角标重现,预期面视觉变化显式重制) | DKChan | 确认 | ## 时效判定纪律 diff --git a/game/tests/golden/menu_boot.png b/game/tests/golden/menu_boot.png index 87cb4aad..6bd8d87c 100644 Binary files a/game/tests/golden/menu_boot.png and b/game/tests/golden/menu_boot.png differ diff --git a/game/tests/system_test.gd b/game/tests/system_test.gd index 2727ce49..f5f2c54a 100644 --- a/game/tests/system_test.gd +++ b/game/tests/system_test.gd @@ -206,8 +206,8 @@ func _smoke_boot_chain() -> void: # 入口=开始屏右下角「调试」角标+对局中两屏角标) check(not main.ui.modals.menu.debug_overlay.visible, "V2f 调试浮窗 boot 不自动开(菜单优先)〔2026-10-16 用户令〕") - check(main.ui.screens.debug_badge != null and not main.ui.screens.debug_badge.visible, - "V2f 调试浮层角标发布态恒隐(2026-10-25 删写死行批)") + check(main.ui.screens.debug_badge != null and main.ui.screens.debug_badge.visible, + "V2f 调试浮层角标 boot 可见(全局浮层入口在座——2026-11-09 特批恢复批)") main.queue_free() await process_frame for p in ["user://smoke_boot_chain.json", "user://smoke_boot_chain.json.tmp"]: diff --git a/待办清单.md b/待办清单.md index 6e13fdf2..1e9ce5d0 100644 --- a/待办清单.md +++ b/待办清单.md @@ -70,7 +70,7 @@ **实况**:缺陷证据——调试浮窗唯一界面开口=右下角「调试」角标,可见性由 `_debug_entry` 门控、缺省 false 且全库无置真点(game/presentation/main.gd:35/:138),画面恒隐、浮窗无开启口;现行条文同口径(design/engineering/test-conventions.md:65「发布态该面恒隐、无 UI 开启口」)。用户裁 2026-11-07:角标与浮窗保留,画面缺失属缺陷,需补回展示。 **改动面**:文档+游戏代码 -**状态**:待写卡 +**状态**:已改毕(2026-11-09 用户特批直改批——不走写卡通道;恢复写死 `_debug_entry = true` 常驻调试入口+三处断言翻回+README/条文/清单同步,改动与凭据见该批提交) #### 数值标定窗口总挂账——原九条数值类条目合并(2026-10-28 登记,来源=会话提及)