Files
gplan-2/reports/工程改动报告-存量断言精简AB档-2026-10-28.md

11 KiB
Raw Permalink Blame History

工程改动报告——存量断言精简(A+B 档首批删并)

承接:待办清单 2026-10-28 条目「存量断言精简——验证内容不变下的断言收敛」执行形态的第一波(盘点先行→逐批裁决→分波执行→件核)。 车道:工程改动触及代码面(game/tests/*.gd)走 worktree 批——分支 assert-slim-20261028,区 ../g-plan2-assert-slim-20261028。 盘点方法:机器初筛(同文件标签近似 223 对、cond 全同 42 组 109 条、跨文件同标签、护栏类 41 条)+七路只读子代理逐域语义裁决(battle_settlement/core 三路/data_config+contracts/presentation/integration+system_test)+主会话逐条抽验复核。子代理报称候选约 150 点,掺有运行时展开数与「不同查询函数间的算术蕴含」,按本批判据线核减至 19 点。

一、本批判据线(删除属显式判据改判,先立判据)

只删满足 同一读数面 + 同一输入 + 谓词字面等价或字面上是承接者的真子集 的站点。两类不算冗余、本批不删:

  1. 不同查询函数之间的算术蕴含——删了就失去对被调函数实现本身的守卫(例:has_unrevealed() 与 revealed_cells().size()<safe_total、单表 validate() 直调与 load_tables 诊断计数)。
  2. 不同夹具实例的独立前置——各场景自守一次,删则场景不可达时判读退化(例:另一局的 abandon() 受理前置、每进程的表加载零 error 护栏)。

用户裁决记录(2026-10-28 会话):A+B 档 19 站点照删;另 4 处候选(cross_system_flow 127/128、theme_projection 312、theme_projection 503、board_gen_reward 181)全部保留——理由是它们的蕴含依赖夹具纪律或产品码未自证的不变量,不构成本批判据下的删除凭据。

二、删并申报表(逐条:旧清单序号→去向)

「旧 #」=删前 game/tests/验证集清单.md(冻结基点 89a36822)行序号;去向已逐条写入新清单「处置」列。

# 旧清单 删的位置(文件:行) 标签摘要 类别 承接者(保留条) 蕴含依据
1 #65 system_test.gd:176 V2d boot 无断点在档 ① #67 :181 V2-s2 boot 内存默认空态 not sm.has_breakpoint() 是 :181 三合取的字面成员;〔卡② mn8〕尾缀另在 :193 有落点
2 #1519 theme_projection:617 V2 红线维持 Button 零接触 ① #1478 :456 V1 红线 Button 零接触 两处 th 均 ThemeDB.get_project_theme(),同对象同谓词;源码注释自认「同判据复述」
3 #1520 theme_projection:624 V2 红线维持 focus 零定义 ① #1479 :464 V1 红线 focus 零定义 同 type list、同六词条表、同 focus_hits == ""
4 #649 config_db_cross_validator:70 池内悬空 skill_id 被报 ① #650 :71 悬空项 category 非空 同 errs,:71 = 本条 ∧ category 非空
5 #654 config_db_resolver:67 行集返回同带全部行(2 行) ① #655 :71 行集按表序返回 ids 由同一 rows 逐行 append,ids==[goblin,bugbear] ⟹ size 2
6 #1057 node_map_generator:313 pure_stream 不推全局计数器 ① #1059 :317 不推计数器且产图非空 svc.counter() == before 字面重复于 :317 首合取项,同对象同序
7 #201 round_flow_skill_pool:61 结算步骤流非空 ① #202 :75 步骤流含判定行 has_verdict 遍历同一 run1.stream,空流必红 :75
8 #614 board_gen_reward:175 降级/非法产物标记互斥 ① #612 :171 + #613 :173 两等式 两等式 + mode 单值 ⟹ 互斥;:175 红必伴 :171 或 :173 红
9 #1579 type_glow:71 格面微光 blast→群伤组 ① #1576 :61 九型封闭循环 TYPE_EXPECT["blast"] == GLOW_AOE(:27),同函数同入参同期望
10 #1585 type_glow:98 群伤组专项 H 零移动 ① #1584 :93 冻结色相保持 ΔH≤0.2° 循环阈严于本条(0.2° < 0.36°),本条恒弱
11 #1586 type_glow:100 群伤组专项 S ≤0.01 ① #1584 :93 冻结色相保持 ΔS≤0.01 同对象同阈值字面重复;:102 的 V=0.65 档另立,保留
12 #1393 player_copy_sweep:59 头部含「同库分流」 ① #1338 battle_narrator:96 渠道句长串 同一 node_curio_header() 纯函数,长串含短串
13 #1398 player_copy_sweep:75 图例封印行存在 ① #1399 :76 封印行含「标空」 空行 ⟹ seal_row[2] if size>2 else "" 取空串 ⟹ :76 必红
14 #168 roll_multiplier:131 nat20 种子可达 ① #169 :132 行留档 roll=20+crit crit_seed>0 与 crit_rows.roll==crit_roll 同一扫描同真同假
15 #324 seal_polarity:443 构造触达:标中标空入队 ① #323 :442 极性路由种子可达 _polarity_probe_accepts 合取项(:249-252),可达即三腿同真
16 #325 seal_polarity:444 构造触达:挖危险格 ≥1 ① 同上 同上(:253)
17 #326 seal_polarity:445 构造触达:挖安全格 ≥1 ① 同上 同上(:253)
18 —(口径外) smoke_boot.gd:69 run_scope 非空 ① :70 run_scope 在树 != null ⊂ != null ∧ is_inside_tree();GDScript and 短路,无空引用崩溃风险
19 —(口径外) smoke_boot.gd:72 _start_overlay 已装配 ① :73 启动态菜单可见 != null ⊂ != null ∧ visible

两条改判(标签变更,判据不变)

  • seal_polarity:442 标签追加「缺腿:%s」,把第 15/16/17 行的三腿诊断信息折进保留条;三腿取值仍读同一 probe,与原三条的语义强度逐字相同。
  • roll_multiplier:132 标签追加「种子可达 seed=%d」,把第 14 行的 seed 读数折进保留条。

随行清理:theme_projection:614-625 的 var th 与 focus 扫描循环随其承载的两条断言一并删除(该循环只为已删断言供数据);type_glow 的 aoe_f 局部量随 H/S 两条删除后无消费者,一并删;两处注释改写为指认真正承载该事实的保留条。

三、件核(验证项目覆盖不变)

核对项 结果
冻结清单条数 1604 → 1587(−17;smoke_boot 两站点本不在清单源列,条数不受其影响)
extract_checks.py --diff PASS——标签/cond/计数三对齐,零差异
被删 19 条标签全仓残留 grep(tests/+design/+reports/) 零悬挂引用(唯一命中的「run_scope 非空」是 system_test 自己的 V2e 在册条,非本批对象)
承接指认 15 条保留行的「处置」列逐条回填去向(旧序号+蕴含依据+批次名),新清单在册
判据等价复验 由代码域闸承担(见闸况)——本批不新增行为,删后被承接行为以保留断言复验
取证方式 未使用变异法与撤销类取证(2026-10-24/28 用户裁);删除凭据=上表逐条申报+承接者指认

四、闸况

全量域闸(域=full,dirty_game=false,all_green=true,总判定「闸况与基线一致,无新增红」)回执 commit 4fbacc43:01 系统测试、02 单元与集成测试、06/06b/07/08/08c/08d 文档域闸、10 熵增闸全绿;09 静态扫描退出码 1=存量红(game/presentation/views/level_map_screen.gd|quality/max-class-variables 22 对基线登记 21 的恶化留账,还债归迭代 41 在案;指纹 8467b4588a20 与入库基线一致,本批零新增);00 冒烟、03/04 探针、05 渲染闸、11 回放确定性由影响面选闸判 SKIP(本批 diff 全在 game/tests/ 测量面)。

本批复验缺口一条(合回后已补):第 18/19 两行改的是冒烟宿主自身 smoke_boot.gd,而 00 冒烟测试恰被影响面选闸跳过——该两站点在批末跑批中没有执行证据,只有静态蕴含论证(GDScript and 短路,保留条 != null and … 在空值上判 false 不崩)。合回 master 后按 §3.9 code 批两件秒级事跑 python tools/run_smoke.py=三闸全过、[smoke] 摘要:15 项检查,0 项失败(原 17 项检查删两条后为 15 项计数),缺口就此闭合。第 1–17 行所在套件的复验由 01/02 全绿承担。

跑批踩坑一条备案:闸日志首跑写在仓库根,触 10 熵增闸「根目录文件越界」判红——我的临时件写错位置,非批次改动引发;日志挪到仓库外重跑后 10 归绿,代码面零改动,回执按同一 commit 重生成。

五、移交与观察(后续批次账)

  1. 类别② 在本仓基本不成立:全仓钉内部路径/私有字段/中间态的断言约 52 条,被入口严格承载 0 条,约 51 条因覆盖入口打不到的边界/反例载荷必须保留(fx.dispatch 逐事件、pending_ap_delta 兑现时机、_intent_charge);且 §8.4 本身要求判据绑提交面。后续批次的可精简空间只在类别①。
  2. 前置护栏不可删:load_ok and diagnostics_count("error")==0 全域 8 处属每进程 fail-fast,删致 if load_ok: 静默跳过→假绿,属负收益。
  3. 静默通道在冻结口径之外:Kit.check_quiet 静态站点实测 407 个,提取器 CALL_RE = check\( 匹配不到该形态(test-conventions:38 已备案该工具局限)——清单条数与〔尾缀〕grep 均覆盖不到。因此「循环 quiet 与聚合条双钉」两处真冗余(node_map_growth 47/51 vs #1073/74、node_map_generator 163 vs #fv9 聚合条)删的是口径外站点,不减 1604 这个数,且聚合侧带〔fv8〕〔fv9〕验收尾缀,本批不动;若要收该账,先做提取器改版(工程批)。
  4. 恒真断言另立一账(属判据缺陷,非重复,本批未动):feat_vouchers:51 deck_refresh_before == 0 or true、treasure_effects:263 ... or true、level_shop_economy:593 与 :696 green_min_hp > 0(初值 99999、仅 hp>0 分支取 min,恒真);system_contracts:67 标签称「互异」而 cond 只查非空,属名实不符需改判据。建议按 §8.4 走「判据绑不上即停卡呈报」通道单独裁决。
  5. 未采的删并形态:C 档「手写族→表驱动循环合并」(level_gen_params 逐类负向 10→1、rng_stream_boot 8 向量→1、player_copy 禁词族、standee_fx 三入参、ui_font 字形集、forge_workbench 双行)静态可再省约 25~35 点,代价=失败定位改用违例明细串(仓内已有 forge_table_test:181-189、table_structure_guard:260/299 范式);D 档「是否同一验证项目」待owner 认账项(theme:215/217 vs type_glow:148/150、level_shop_economy 现行图跨表覆盖簇 vs 〔v11〕扩面段的尾缀义务)。
  6. example_test.gd 两条硬编码占位断言在盘且随清单在册(旧 #S167),不进生产 manifest(run_all.gd:79-80 明示)——整件退役与否属样板件裁决,不入本账。
  7. 本批不动 game/tests/README.md(断言双口径行仍成立)与任何 design/ 文件。