fix(核代码补审): A-1 _face_liveness 补 alive-null 臂(激活 13 条对象缺位拦截,both 合法 null 不受影响);A-2 V2-s4 补结构例外注;B×3 标签收口(V2d 删按钮承接叙事/V3h 删不复用冗余/V3 删续玩联动残留);C-1 重复注释删除——代码域闸 --code 全绿验证通过(激活臂零误红)

This commit is contained in:
DKChan committed 2026-10-24 01:25:58 +08:00
1 parent 9f8beb3507
commit 5644d30c6b
17 files changed
+34 -12

No files matched your search

@@ -0,0 +1 @@
uid://d0j4m26d1d5yo
@@ -0,0 +1 @@
uid://dhhxar186w1sq
+7 -12
View File
@@ -173,7 +173,7 @@ func _smoke_boot_chain() -> void:
# ④-1 boot 路径:启动态钉死(卡① sv2)——boot 无激活态、断点在档恒否,续玩钮恒隐
#(原「按钮态==真实档断点态」关系判据随启动态换代改写:test-conventions §9.5 申报在案,卡② mn8 再承接)
check(not sm.has_breakpoint(),
"V2d 续玩钮族退役·boot 无断点在档(启动态不隐式激活——卡① sv2 钉死;恒隐判据随钮退役由本断言+V2d 三钮在位承接)〔装配生命批 V2·卡② mn8 改写〕")
"V2d boot 无断点在档(启动态不隐式激活——卡① sv2 钉死)〔装配生命批 V2·卡② mn8 改写〕")
# ④-1b 启动态三断言+旧单档迁移不变式(卡① sv2/sv12——真实 autoload boot 链)
check(sm.active_slot() == 0 and not sm.has_write_target(),
"V2-s1 boot 后无激活态(active_slot=0、写盘目标空)〔卡① sv2〕")
@@ -182,7 +182,7 @@ func _smoke_boot_chain() -> void:
check(not sm.write_to_disk(),
"V2-s3 boot 无激活写盘拒绝(write_to_disk=false 生产入口)〔卡① sv3〕")
check(not (FileAccess.file_exists("user://save.json") and not FileAccess.file_exists(sm.slot_path(1))),
"V2-s4 旧单档迁移不变式(旧档在则槽 1 必在——Q1 甲一次性迁移已发生)〔卡① sv12〕")
"V2-s4 旧单档迁移不变式(旧档在则槽 1 必在——Q1 甲一次性迁移已发生;旧档在盘面罕见,迁移逻辑本体由 save_manager_domain v0 迁移链断言覆盖)〔卡① sv12·核代码增补注〕")
# ④-2 三钮承接(卡② mn8——V2d 续玩钮族随钮退役废止:钮可见性联动面由卡① V2-s 启动态断言与
# sv11 attach 语义段承接;attach 原地重置语义保持——绝不碰真实档 user://save.json)
for p in ["user://smoke_boot_chain.json", "user://smoke_boot_chain.json.tmp"]:
@@ -213,10 +213,6 @@ func _smoke_boot_chain() -> void:
DirAccess.remove_absolute(p)
# ---- 生命周期存活性矩阵(九阶段×五引用面;驱动复用 V3 debug seed 开局路径+
# _auto_play_round 活战斗模式+ui_struct resume 夹具模式,不另起点击链)----
# 阶段映射说明:计划书十阶段中「开局停点」与「地图选路」在本现行流程同为关卡画面停点态
#(level_started→choices_presented 同步到达,无可观测中间态)——合并为 V3b 一处断言。
func _smoke_run_lifecycle() -> void:
print("--- 迭代27 T1 会话物化(V3:两连局复位+脏状态不残留)---")
var main: Node = load("res://presentation/main.tscn").instantiate()
@@ -259,7 +255,7 @@ func _smoke_run_lifecycle() -> void:
"V3 局态封印/账本全复位(queue_free 物化——注入脏状态零残留)")
check(main._start_overlay.visible, "V3 回开始菜单(终局出口路径)")
# ---- 第二局:放弃终局无断点残留→直进开局→全新会话 ----
check(not sm.has_breakpoint(), "V3 放弃终局清断点(无残留断点——续玩按钮态联动)")
check(not sm.has_breakpoint(), "V3 放弃终局清断点(无残留断点)")
main.debug_overlay.seed_edit.text = "43"
main._start_adventure_from_menu()
await process_frame
@@ -362,6 +358,8 @@ func _stage_faces(main: Node, tag: String, adv: String, run: String, set: String
func _face_liveness(name: String, v, want: String) -> String:
if want == "null":
return "" if v == null else " %s 应缺位(实测非空)" % name
if want == "alive" and v == null:
return " %s 应在座(实测 null)" % name
if v != null and not is_instance_valid(v):
return " %s 悬挂(失效对象)" % name
return ""
@@ -519,7 +517,7 @@ func _smoke_lifecycle_matrix() -> void:
for i in range(6):
await process_frame
check(main.run_scope.adventure != null and main.run_scope.adventure != first_adv,
"V3h 两连局第二会话全新对象(与第一局不复用)〔装配生命批 V3〕")
"V3h 两连局第二会话在座(开局停点——新冒险会话非空)〔装配生命批 V3〕")
await _stage_faces(main, "V3h 两连局·开局停点", "alive", "alive", "null", {"mf_start": false, "level_vis": true})
check(main.run_scope.adventure.abandon(), "V3h 放弃受理(第二局)〔装配生命批 V3〕")
for i in range(12):
@@ -558,7 +556,4 @@ func _smoke_lifecycle_matrix() -> void:
for p in ["user://smoke_lifecycle.json", "user://smoke_lifecycle.json.tmp",
"user://smoke_lifecycle_resume.json", "user://smoke_lifecycle_resume.json.tmp"]:
if FileAccess.file_exists(p):
DirAccess.remove_absolute(p)
# 引用面快照(五承载物的会话相关面+恒活面——逐个调用现值回调,与 run_scope 成员并采)
DirAccess.remove_absolute(p)
@@ -0,0 +1 @@
uid://bol5e0tx2p8ie
@@ -0,0 +1 @@
uid://dc8bwwuqtm7mh
@@ -0,0 +1 @@
uid://vvodbyea6fkv
@@ -0,0 +1 @@
uid://b0qpkkpeqbt0l
@@ -0,0 +1 @@
uid://0h8pw8le1vok
@@ -0,0 +1 @@
uid://dmwjb53bvebbh
@@ -0,0 +1 @@
uid://6ctee5n6qyvm
@@ -0,0 +1 @@
uid://bl8x36rkw3joa
@@ -0,0 +1 @@
uid://x67hg5qwuf6t
@@ -0,0 +1 @@
uid://b3ccx0sbe1f42
@@ -0,0 +1 @@
uid://brkl7td1ruuf7
@@ -0,0 +1 @@
uid://clk6d0agf3dbx