收尾(迭代42批后收尾): 反哺点两处分置闭合(反哺点1落文=architecture v1.26 ShopSession行对外暴露格按委托壳拆除后实测直连面重写——直连方法清单16+白盒2与set_shop_pool调用面改述;反哺点2豁免登记被零豁免裁决消解不落,v1.25豁免注销在先)——产出物退役:iter42实现报告/反哺点清单/验收审计与两卡需求卡片按吸收即死删除(卡片死期=实现批合回;报告遗留义务先迁:S13重锚6键离账折入零豁免条目收账句、PARITY对拍锚漂移查因与重锚新立条目、批末小件四条新立条目)——账面换代:待办清单尾波清偿批与商店委托层拆除两条目整条删除+roadmap迭代42行已完成/卡片报告列退役保留字+iter41注脚152死键refresh已执行订正(fafb4fee)+当前位换代(迭代位1–42全完成、迭代43已合回待收尾、下一步=iter43收尾与迭代44开工)

This commit is contained in:
DKChan committed 2026-10-30 02:54:15 +08:00
1 parent db5abb8527
commit 7ec2af581a
8 files changed
+31 -630

No files matched your search

@@ -2,8 +2,8 @@
## 文档状态
- 版本:1.25
- 最近更新:2026-10-29(零豁免五键清偿设计闭合落文——S13 三条豁免登记注销〔main 组合根/battle_orchestrator 类变量/tune_sim 测量面〕;五案设计闭合、实现批建件:ui_registry 界面注册面、RoundCycle+BattleFacts、CellUnit 两绘制域件、StandeeBody 两状态件、tune_sim 信号步进状态机;gdstyle inner-class 计数截断缺陷登记;沿革查 git)
- 版本:1.26
- 最近更新:2026-10-30(迭代 42 反哺点落文——ShopSession 行对外暴露格按委托壳拆除后实测直连面重写:完整直连方法清单+set_shop_pool 调用面改述;沿革查 git)
- 引擎:Godot 4.7.2-stable(GDScript 单语言;2026-09-07 锁定)
- 评审模式:solo(`review-mode.txt`,2026-09-12 用户拍板——TD/LP 门禁按 solo 跳过,用户授权架构产出自主推进、迭代期回调)
- 覆盖 GDD:现行全集(根索引=`design/gdd/02-系统清单.md`,文档树构成以根索引为准)
@@ -106,7 +106,7 @@
| **reward_economy**(B4) | 格面资源身份映射(install 期预分配、Ready 只读、换图映射消亡)、极性路由字典面((类型, 极性)→ 字典行查询;路由执行归 B1 授予段)、F6 当量供给投影 | 封闭 API:roll_board / query_identity / query_full_snapshot / grant / grant_clear / retire_mapping / polarity_row / phase / weighted_pick;另有 is_mapped 静默布尔投影(批量工具用) | ConfigDB(RewardTable);BattleFxHost 经注入 Callable `luck_bias_query` 取偏运合计(reward_roll 发射与 bias_rewards 求和移至效果层完成);reward_roll 流(scope = 每次 install 批) | 无 |
| **helper_items**(A5,切片已实装秘宝域) | HelperItemTable、探测显影语义 | (契约规范源:`../../gdd/systems/跨局循环/秘宝.md`——桥接位:A2 查询接口 + A4 counter_item_ids) | A2 / A4 / B4 | 无 |
| **CurioDeck**(`core/curio_deck.gd`,A5 秘宝域令牌池件,迭代 37 自 AdventureRunner 拆出) | 三选一/商店共享池的持久多重集、抽签(候选抽取)、cap 库存与专长凭证三计数与判定唯一所有者——件只管池与判定,停点编排与兑付推进留冒险编排器 | `draw_candidates(channel)` 抽签;`consume_deck_token` / `consume_pool_purchase` 池消耗;`cap_ok` 上限判定;`feat_ticket_consider` 凭证判定;`stock_snapshot` / `pool_stock` 只读投影;商店购买消费经注入 Callable 链至 CurioStop 兑付单点(迭代 39 起转纯池——bind_handlers 反向回调已退役) | ConfigDB(秘宝令牌行集);注入 RngServiceCore(reward_pick 封闭流,禁自建随机) | 无(RefCounted 纯逻辑) |
| **ShopSession**(`core/shop_session.gd`,商店会话件,迭代 37 自 LevelRunner 拆出) | 关卡商店双模式(legacy 固定三件加定价/pool 共享令牌池)的货架、定价、购买与刷新唯一宿主——账本/钱包/装配集归宿主 LevelRunner(共享引用经 `bind` 注入,出账直接落同一引用改写宿主账本);legacy 模式零 RNG 零池消费(off 对照承载) | 货架与定价只读面(`shop_products` / `shop_shelf` / `current_price` / `shop_refresh_cost`)+写入口(`buy_product` / `buy_pool_item` / `shop_refresh` / `player_request_refresh` / `open_pool`);外部调用面 2026-10-29 D3 裁改直连(LevelRunner 同签名委托壳删除——并排卡「level_runner 商店委托层拆除」迭代 42 承接,调用方改址) | ConfigDB(商店行集);注入 RngServiceCore;宿主钱包/账本引用;pool 模式令牌消耗与判定经注入 Callable 转 CurioDeck | 无 |
| **ShopSession**(`core/shop_session.gd`,商店会话件,迭代 37 自 LevelRunner 拆出) | 关卡商店双模式(legacy 固定三件加定价/pool 共享令牌池)的货架、定价、购买与刷新唯一宿主——账本/钱包/装配集归宿主 LevelRunner(共享引用经 `bind` 注入,出账直接落同一引用改写宿主账本);legacy 模式零 RNG 零池消费(off 对照承载) | 货架与定价只读面(`shop_products` / `shop_shelf` / `current_price` / `shop_refresh_cost`)+写入口(`buy_product` / `buy_pool_item` / `shop_refresh` / `player_request_refresh` / `open_pool`);外部调用面=调用方经宿主 LevelRunner 公开成员 `shop` 直连(调用直连不留委托壳,2026-10-26 Middle Man 裁定;迭代 42 拆除),直连消费的方法=`shop_products`/`current_price`/`purchased_tier`/`buy_product`/`player_request_refresh`/`set_shop_pool`/`pool_price`/`shop_shelf`/`shop_refresh_free_left`/`shop_refresh_cost`/`shop_refresh`/`spend_gp`/`buy_pool_item`/`is_shop_pool`/`shop_bp_shelf`/`shop_bp_visit_buys`(另白盒两入口仅测试侧:`_draw_shelf`/`_spend_discounted`);set_shop_pool 调用面=pool 注入经 LevelRunner 构造 ctx 供给(构造期内部直调,原委托块注释「AdventureRunner._start_current_level 唯一调用方」系陈旧表述、随壳删除作废),测试面直连 `shop.set_shop_pool` | ConfigDB(商店行集);注入 RngServiceCore;宿主钱包/账本引用;pool 模式令牌消耗与判定经注入 Callable 转 CurioDeck | 无 |
| **HeroLedger**(`core/hero_ledger.gd`,冒险域主角实体账,已实装(2026-10-27 迭代 39 拆件批)) | 冒险生命周期主角数值与获得记录唯一所有者:生命与 GP 钱包(gain/spend/clear 单写原语,钱包事件发射点归件)、锻造强化快照、调试百分比、攻击/甲类型轴快照、特性持有集(活引用注入——关内兑付当关生效)、本局钥石增量与逐杀明细、真视使用记录;获得记录三层结构=获得记录列表(三选一件/商店购买/战末奖励各一条)→属性增益明细(带来源指回)→四轴汇总(由明细推导);生效上限与回血封顶公式单点归件 | 构造注入;单写原语族+只读投影;断点自交片段(账本键+获得日记键) | ConfigDB(表值读取);由 AdventureRunner 冒险开始创建、注入 CurioStop/level_runner/ShopSession/战斗 encounter | 无(RefCounted 纯逻辑) |
| **AttuneLoadout**(`core/attune_loadout.gd`,同调配装件,已实装(2026-10-27 迭代 39 拆件批)) | 装备中的秘宝件对象集唯一所有者(每件内含充能单位与重置周期);同调充能的物化行为唯一事实源——种行/补行改写时同步(RunLedger 充能字典轨与差额对账函数退役);旧档 aux_items 同调行迁移归件 | 构造注入;充能查询/消耗/按周期重置原语;断点自交片段(attunement_charges 键,键名与策略不变) | ConfigDB(秘宝行集);TreasureItems(同调行投放面);注入战斗使用路径 | 无 |
| **CurioStop**(`core/curio_stop.gd`,三选一停点件,已实装(2026-10-27 迭代 39 拆件批)) | 三选一停点编排唯一所有者(架构原则 9 本域承载):停点三态(关卡完成三选一在途/已兑付待推进/奖励节点三选一在途)、刷新三源账(刷新件 X/营地池 Y/刷新券存量/付费刷新计数)、兑付方法族(pick/refresh/redeem/skip)、凭证出箱(RAP/时沙待注入);三选一信号面自带;零自动推进停点语义承载 | 对外=开停点/刷新/兑付/放行谓词/交断点片段五组入口+信号面(curio_choice_presented/curio_resolved);由 AdventureRunner 关卡完成受理时调用 | ConfigDB;注入 CurioDeck(抽签/摘牌)与 HeroLedger(落账);随机只经 CurioDeck 的 reward_pick 封闭流 | 无 |
-24
View File
@@ -1,24 +0,0 @@
# 迭代 42 反哺点清单(2026-10-29)
要写进 `design/` 的点逐条列全:哪个文件哪一节、改成什么、依据是什么。用户在会话中裁决后归文档批落文,落文后本条清掉(不登记待办清单)。
## 反哺点 1:architecture.md:109 ShopSession 行——委托承载句失效+公开面格重写(卡② §6)
- **位置**:`design/engineering/architecture/architecture.md` 功能层表 ShopSession 行(:109)「对外暴露」格。
- **失效陈述**:「外部调用面由 LevelRunner 同签名委托承载(外部零变化)」——委托壳已随迭代 42 卡② 全量拆除(19 委托+2 死壳归零)。
- **改写内容全文(建议落文)**:该格末句改为——「外部调用面=调用方经宿主 LevelRunner 公开成员 `shop` 直连(调用直连不留委托壳,2026-10-26 Middle Man 裁定;迭代 42 拆除);直连消费的方法=shop_products/current_price/purchased_tier/buy_product/player_request_refresh/set_shop_pool/pool_price/shop_shelf/shop_refresh_free_left/shop_refresh_cost/shop_refresh/spend_gp/buy_pool_item/is_shop_pool/shop_bp_shelf/shop_bp_visit_buys(+白盒两入口仅测试侧:_draw_shelf/_spend_discounted)」。
- **set_shop_pool 调用面改述**:pool 注入经 LevelRunner 构造 ctx 供给(level_runner.gd:101–102 内部直调 ShopSession.set_shop_pool);原委托块注释「AdventureRunner._start_current_level 唯一调用方」系陈旧表述(全仓 grep 证实产品码零其他调用方),随壳删除作废;测试面直连 `shop.set_shop_pool`。
- **依据**:迭代 42 卡② v1.1 §2–§6(拆除形态权威=architecture.md:154「调用直连:不留中间人委托壳」);实测残留扫描零真残留(实现报告 §7)。
## 反哺点 2:architecture.md「测试与质量域」S13 豁免登记段——本批 5 键+既有讨论 5 键按实测值落文(卡① D5/§14.5)
- **位置**:`design/engineering/architecture/architecture.md`「测试与质量域」S13 豁免登记段(先例=battle_orchestrator 第三条形态:键永久基线内、禁再恶化、豁免不等于了结)。
- **落文内容(批末实测值,2026-10-29 全量扫描)**:
- board_view.gd max-class-variables = 32(D2 裁悬停域不拆——类变量无拆分动作可归绿,残留面全为契约承载)
- board_view.gd max-public-methods = 27(同 D2——27 个逐类核对全为探针契约面与依赖单向纪律承载面)
- level_runner.gd max-public-methods = 33(D3/D6——委托壳拆除后终值,直连形态下无再降空间)
- level_runner.gd max-class-variables = 30(D3——`shop` 公开成员留宿主,非无效成员)
- adventure_runner.gd max-class-variables = 28(D4 裁断点域不拆——断点协议住冒险生命周期 owner 内本身内聚)
- 既有讨论 5 键同段合并落文:main.gd max-class-variables = 49/tune_sim_controller.gd await-in-loop/board_cell_unit.gd max-class-variables = 30/standee_body.gd max-class-variables = 19/battle_orchestrator.gd max-class-variables = 37(随装板域拆件 38→37 只降,替代原登记值 38)。
- **依据**:卡① §6 D5 裁决(2026-10-29 用户裁)+§14.5;实测值见实现报告 §3 键账对账表。
- **配套**:S13 基线重锚由用户发令 `python tools/gdstyle_gate.py --refresh --force`(16→10 键,降幅逾 10%)——重锚后归绿 6 键自然消失,豁免 10 键以新登记值留基线。
-94
View File
@@ -1,94 +0,0 @@
# 迭代 42 实现报告(2026-10-29)
批次=gdstyle 尾波清偿批(卡① v2.0)+ level_runner 商店委托层拆除(卡② v1.1)并排编队。执行形态=整迭代单工作区 `g-plan2-iter42`(两卡均未声明并行工作区,D6 裁「同迭代并排编队、先后皆可」=串行任一序),卡序 gdstyle 先(编排既定)、level_runner 后;卡① T6 批末对账与卡② T2 收口合并为迭代总收口一次执行。定义面(roadmap/待办清单/两卡)已随编排提交 14a10e5e 入库,本批无定义面搬运提交。§1 表内提交号为重塑前中间提交;分支史已按一卡一笔重塑(卡①=63e9fbf3/卡②=11cd46a5/收尾=b704f1dc 含并 master 四笔文档面),原史留 backup/iter42-20261029-080300。
## 1. 各卡状态
| 卡 | 任务 | 状态 | 分支提交 |
|---|---|---|---|
| 卡① gdstyle 尾波清偿 | T0 读数复核与对账 | 完成(16 键现值与基线登记值逐键全数对上,零漂移;行位订正 7 处就地落卡) | 509f41f5(随 T1 同笔) |
| 卡① | T1 board_view 拆分 | 完成(键 1–4 归绿) | 509f41f5 |
| 卡① | T2 _enter_node 载荷合并 | 完成(键 9 归绿) | c47a032d |
| 卡① | T3 装板域拆件 BoardInstaller | 完成(键 10 归绿,类变量 38→37) | adff0772 |
| 卡② level_runner 委托拆除 | T0 调用面直连(中间态) | 完成(改址六件产品码+sim+七件测试,壳在位全绿) | f7e898be |
| 卡② | T1 壳拆除与完整性证明 | 完成(键 7 实测 50→33,残留扫描零真残留) | ae3bd5fc |
| 两卡 | T6/T2 迭代总收口 | 本报告+反哺点清单+全量域闸+独立验收审计+合回呈报 | 见 git log |
## 2. 实际改动—验收对照表(承两卡 §13/§11 需求侧对照表;结果列为本批实测)
| 行 | 需求点 | 改动(文件:行) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 结果 |
|---|---|---|---|---|---|---|---|
| V1 | 键 1/2/3/4——_paint_cell 拆五段+rebuild 构建器 | board_view.gd `_paint_cell` 拆 `_paint_cell_ink/_paint_cell_base/_paint_cell_facade/_paint_cell_overlays/_paint_cell_fog` 五段+`_build_cell_unit` 出函 | 复用 type_glow_test(48 checks 绿)/theme_projection_test._smoke_type_glow(163 checks 绿)/player_copy_sweep_test(22 checks 绿);render_gate 棋盘 golden 三张 | 单元+探针+golden | BoardView.rebuild()→refresh()→type_glow_probe();board_shot_probe 真实场景帧 | 既有断言面+golden 逐像素 | 绿——三套件全绿(theme_projection 的 163 checks 全过;该套件 FAIL=存量红,见 §6-①,与本改动无涉);golden 有 diff 与 stash 对照逐位同值(L2/L3 0.00%、L1 2.74% 双侧同值——见 §6-③) |
| V3 | 键 9——_enter_node 载荷合并 | level_runner.gd shop 分支双 return 并单 return(payload 变量,两字典逐字保持) | 新增 level_shop_economy_test.gd:_test_shop_node_entered_payload〔尾波 V1〕四断言 | 单元 | LevelRunner.start_level(_external)→pick_next_node 进 shop 节点 | node_entered 信号载荷(pool 含 shelf:true 且 gp=进店钱包现值 27;legacy 无 shelf 键且 gp=现值 30) | 绿——套件 192 checks 全绿(exit 0) |
| V4 | 键 10——装板域拆件 | board_installer.gd 新建;battle_orchestrator 六函数迁出、复位块留薄壳 `_install_and_reset`、三调用点改址、`_board_generator` 成员退役 | 复用 variant_placement_test(49 checks)/round_flow_skill_pool_test(129 checks)/seal_polarity_test(70 checks)/run_time_fatal_test(负套件 exit=1,wr5 棋盘生成半边随拆件改指 BoardInstaller 新组装点——见 §5-7)+run_smoke(15 项) | 单元+集成 | BattleOrchestrator.begin_battle()/player_request_refresh() | 同种子变异布置逐位断言面+全战斗步骤流逐行回放断言(board_gen/variant_place 取号序零漂移由同种子断言钉住)+违约封印传导链(wr5 双半边) | 绿——三套件+负套件+冒烟全绿;键 10 归绿(文件长 916≤1000 键消失)、类变量实测 37 |
| R1 | 调用面直连改址(非行为改动) | 产品码 6 件+sim 1 件+测试 7 件全部调用点 `<表达式>.shop.<方法>` | 既有套件回归两轮全绿:T0 中间态轮(壳在位)+T1 壳删后轮(level_shop_economy 192/hero_ledger/adventure_feats/pool_case_d/treasure_effects/curio_refresh_paid/meta_progression_forge 全套+冒烟) | 单元+接口 | 各套件既有真实入口 | 既有断言逐位不变+壳删后编译通过 | 绿——两轮全绿(全量 65 套件两轮失败清单逐一同值=9 存量红,见 §6-②;七件相关套件两轮全绿) |
| R2 | 壳块拆除(非行为改动) | level_runner.gd :723–725 区块涉委托两句+:751–828 十九委托全量删除(含死壳 2 枚) | 残留扫描零命中(19 方法名全仓 grep,输出留 §7)+T1 套件绿 | 静态+单元 | grep 全仓+套件真实入口 | 扫描面>0(19 名单命中 34 行逐一判类归属)+壳删后零引用可编译 | 绿——34 行全数为他类定义与调用/字典键名/宿主内部 shop. 直连点,零真残留 |
| R3 | 宿主成员公开化(非行为改动) | level_runner.gd:44 `_shop`→`shop`+内部引用 28 处随更名 | 随 R1 两轮套件绿 | 单元 | 套件真实入口 | 内部使用点行为不变 | 绿——词级 `_shop` 全仓 .gd 零残留(件核) |
| R4 | 注释同步六处(非行为改动) | shop_session.gd:4/level_runner.gd 区块句/level_autoplay.gd:335/:356/shop_overlay_view.gd:88/152/tree_rules_v11_test.gd:6 | 随批代码域闸绿(静态扫描覆盖文件头纪律面) | 静态 | —(静态判据) | 静态扫描+评审注记(观测面局限申报:注释无运行时提交面) | 绿——六处已同步,闸 09 见全量域闸回执 |
反向核对:diff 中行为改动仅 V3 一处(载荷合并,行为保持——载荷字典逐字);其余均为非行为改动(结构整改,判据=零漂移证明如上)。孤儿断言:无(新增断言仅 V3 行四条〔尾波 V1〕,已挂行)。
## 3. 键账对账(S13——11 键终值对照卡① §7 预期)
| 键 | 预期(卡① §7) | 批末实测 | 判定 |
|---|---|---|---|
| 1 board_view _paint_cell 长度 | ≤50 归绿 | 键消失(函数已拆五段,新函数无超标键) | 归绿 ✓ |
| 2 board_view _paint_cell 分支 | ≤8 归绿 | 键消失 | 归绿 ✓ |
| 3 board_view _paint_cell 局部变量 | ≤10 归绿 | 键消失 | 归绿 ✓ |
| 4 board_view allocation-in-loop | 消除归绿 | 键消失(.new() 迁入 _build_cell_unit) | 归绿 ✓ |
| 5 board_view 类变量 | 32 维持豁免终局 | 32 持平 | 豁免终局 ✓ |
| 6 board_view 公开方法 | 27 维持豁免终局 | 27 持平 | 豁免终局 ✓ |
| 7 level_runner 公开方法 | 约 33 降值后豁免终局 | 33(50→33,并排卡兑现,与卡面预测精确一致) | 豁免终局 ✓ |
| 8 level_runner 类变量 | 30 维持豁免终局 | 30 持平 | 豁免终局 ✓ |
| 9 _enter_node 返回数 | 6 归绿 | 键消失 | 归绿 ✓ |
| 10 battle_orchestrator 文件长 | 约 910–920 归绿 | 键消失(实测 916 行) | 归绿 ✓ |
| 11 adventure_runner 类变量 | 28 维持豁免终局 | 28 持平(本批零触碰) | 豁免终局 ✓ |
豁免通道既有键随批只降核对:battle_orchestrator 类变量 38→37(D1 修正二兑现,登记值不抬)。**零新增键**(全扫描现值 10 键=基线 16−归绿 6,EXTRA 清单为空)。基线重锚=用户发令人工 `python tools/gdstyle_gate.py --refresh --force`(降幅 6/16≈37.5% 逾 10% 须 --force,卡① §14.4)。
## 4. 逐拆出单元职责语句(拆分边界纪律①,逐件一行)
- **BoardInstaller**(新件,board_installer.gd):棋盘安装与变异布置域唯一承载——生成受理→全局作用域变异决议→装板受理→资源摇号资格域组装(roll_board 恰一次)→region 变异决议与连通片布置;单一变化原因=棋盘设置顺序与变异布置算法。
- **_paint_cell_ink**(board_view 私有段):字形与色牌层——reveal 记录→字形/墨色判定+u.glyph/u.glyph_color 终写+双峰纹理板落牌。
- **_paint_cell_base**:基底瓦片层——瓦片查表/平色回退 sb+英雄蓝框载体与贴图缺位回退字形。
- **_paint_cell_facade**:立面投影层——未开墙格南缘立面/轮廓描边码;已开格北缘投影暗带/E 格高墙面。
- **_paint_cell_overlays**:秘宝/变异叠加层——真视红框/预读徽章/变异角标/奖励徽章/类型微光组号。
- **_paint_cell_fog**:迷雾层——灯光区外未开格全黑/已开格记忆态灰显。
- **_build_cell_unit**:逐格构建器——CellUnit 实例化与属性装配(allocation 出循环唯一出函面)。
- **_install_and_reset**(battle_orchestrator 宿主薄壳):装板受理承接+宿主态复位单点(五处计数清零+板序推进+board_changed 发射+秘宝叠加层退役)。
- **LevelRunner.shop**(公开成员,非新件):商店件取件唯一形态(委托壳拆除后的直连承载,零新增职责)。
## 5. 实现决定记录(代拍板白名单外事项备案)
1. **run_all.gd `--only` 逗号形态工具缺陷**(卡① T1/T3、卡② T0 验证命令形态适配):`game/tests/run_all.gd` 的 `--only` 解析自 6caf56b5 起把整串 `--only=a,b,c` 当单个词(不按逗号拆分),与文件头注「词[,词…]」文档形态及 `tools/run_all_gates.sh:331` 的逗号拼接传参形态均不符——本批改用逐词重复 `--only=` 形态(语义等价)。批末全量闸不受影响(本批触 battle_orchestrator=PARITY 触面表→横切→02 回落全部套件,不经选跑分支);**建议登记工程改动**:run_all.gd 补逗号拆分(或闸脚本改多旗标传参)。
2. **BoardInstaller 宿主持有形态**:薄壳 `_install_and_reset` 内逐调用构建 installer(非宿主成员)——T3 验收项「类变量实测 37」要求宿主不新增成员;BoardGenerator 唯一成员 fatal_handler、零跨 generate 调用状态,逐调用构建观察等价(装板取号序由同种子断言钉住,实测全绿)。
3. **ink→base 段间 bg 传值**:卡① §7 键 1 限「段间只经 u.st/glyph/digit_col 传值」;bg(基底色)无单元场域可承载、其唯一消费方在 base 段回退分支——经 ink 段返回值交 base 段(唯一例外,函数体逐字搬运不受影响)。
4. **两卡里程碑全量闸并入迭代总收口**:卡① T6 与卡② T1 的「里程碑出口 run_all_gates --code」按 iter 技能闸序列「全量域闸每迭代一次」铁律合并为收口单次跑闸(重塑后)——卡面两处闸义务由同一次跑闸兑付。
5. **worktree 冷检出 `--editor --quit` 首跑 `--path` 误指仓库根**(未建 .godot 类缓存致首跑解析红)——改指 game 切片目录重刷后正常(106 类)。坑速查条目候选,登记建议随工程批。
6. **信号契约注释陈旧发现**(不属本批改动面):level_runner.gd:14 node_entered 信号注释 `shop={gp}` 与 pool 态实际载荷 `{gp, shelf:true}` 不符——改动前即如此(本批未触载荷),随本报告呈报,归文档批/后续批处置。
7. **run_time_fatal_test wr5 改指新组装点(L1 就地修复)**:T3 删宿主 `_board_generator` 成员后,该负面套件 :71 的白盒取数 `oc._board_generator._fatal(...)` 断链(脚本错误中断断言函数→零断言退出 2)=**本批新增红**。卡面 §3 现状考证只查了 battle_orchestrator.gd 全文件(四处使用属实)漏查跨文件测试取数点;§16 L1「探针断言调用面改址漏改——就地修复重跑最窄确认」通道处置:wr5 棋盘生成半边改经新组装点(BoardInstaller 引用束 fatal_cb 接线)构建后触发,断言目标(违约→封印传导)不变、断言零增删(§17 四不违);卡 §9 文件结构图就地补行;复跑 exit=1(负套件期望码)绿。**勘误**:本报告先前稿曾将该套件误列存量红——彼次 stash 对照时工作树处于卡①完成态(HEAD 已含 T3)而非 master 原态,对照被污染;更正后 02 存量红=9 套件与基线登记清单逐项一致。
8. **PARITY 实跑口径(用户裁决①「批准实跑」的执行记录)**:实跑已执行(终闸 PARITY_APPROVED=1 一轮+归因实验一轮,见 §6-5);终闸回执按既有基线口径出 11=NEED-APPROVAL(未实跑态)——不把本轮对拍红指纹(red-nokeys)记入基线:该指纹形态下任何未来对拍失败(无论差异内容)同指纹不可区分,记入即全量放行后续漂移,属超出本轮授权的新裁决事项;对拍漂移的查因/重锚随 §6-5 归测试债条目。
## 6. 存量红清单(master 原状同值复现,非本批新增——stash 对照法逐组取证)
1. **theme_projection_test**:`_recent_list` 断链(test:805 访问 `camp._recent_list`——成员已随迭代 41 卡② 拆入内嵌类 `_SideState`;iter41 特许移交合回未跑遗留)。该套件 163 checks 本体全绿,FAIL=脚本错误扫描命中。
2. **全量轮 9 套件红**(T0/T1 两轮与 master 原状逐一同值,与基线登记清单及待办清单「迭代 41 测试债修复」条目逐项一致):config_db_test(cattr 解析)/config_db_fatal_oob_test(退出码 2≠1)/table_structure_guard_test(meta_state)/treasure_items_test(crossrun)/standee_fx_sweep_test(set_trans)/forge_workbench_test(120s 挂死)/tree_requires_level_test(row_by_id Nil)/save_manager_domain_test(_migrate_legacy_save)/theme_projection_test(同①)——形态与迭代 41 卡①(核心数据面结构收敛)卡②(呈现层结构收敛)改动特征吻合;已随基线 80b49c0f 记账(用户 2026-10-29 裁带红合并承接)。初稿曾多列 run_time_fatal_test 一项,经 §5-7 勘误更正为本批新增红(已修)。
3. **probe_gate --click 三红**:ui_input_probe 超时挂死(exit 124)/ui_struct_probe resume 断言/ui_click_probe 16 行 set_trans 空值(battle_end_overlay 等未触文件)——master 原状同值复现(连错误行数都一致)。
4. **render_gate golden L1_dungeon 2.74% 超容差**:master 原状同值(L2/L3 双侧 0.00%)——golden 锚落后于 master 现状,重锚须用户批准(本批禁自行换锚)。
5. **gate 11 PARITY 实跑发现(用户批准①后执行)**:回放确定性对拍锚(2026-10-26 冻结)与现行全冒险重放在三变体(base/attune/shop)全部逐位漂移(RUNSUM 40 行全异+JSONL 行数级差异,如 base/normal 锚 9216 行 vs 今 9221 行)——**master 原状(ee4efad5)单独对拍 base 变体同值复现(今值指纹 8a81884efe51/afc8c07c1bf3 与本批分支逐字相同)=漂移系迭代 40/41 特许合回的存量(两批合并时全量闸停跑、对拍从未执行),本批在其上零新增漂移**。取证件:`game/tests/.gates/parity.log`(终闸实跑)+归因实验记录(master 态 checkout 后 base 变体重跑)。归「迭代 41 测试债修复」条目扩展,重锚/查因裁决归该条目承接(锚重制须用户批准——本批禁自行换锚)。
## 7. 残留扫描输出留痕(卡② T1/R2 判据)
19 方法名全仓 grep(game/ 下 .gd)命中 34 行,逐行判接收方类归属**零真残留**:字典键名(adventure_runner:505/546/591/600、breakpoint_resume_test:196、level_shop_economy_test:1378/1383、sim 两文件共 4 行);他类定义与调用(battle_orchestrator.player_request_refresh 定义 :709+settlement 侧 8 处调用、CurioDeck.pool_stock 经 deck() 9 处、GpWallet.spend_gp 定义 :15);宿主内部直连使用点(level_runner.gd:102/305/306/704 shop. 形态)。产品码与测试面零旧委托调用。
## 8. 实机目检总清单
本批零玩家可观测改动(结构整改+调用面直连)——**无新增目检项**。既有在册提醒(不阻塞):迭代 41 移交的四项实机目检在体验验证清单㊵。
## 9. 遗留读数义务与登记建议
1. S13 基线重锚:用户发令 `python tools/gdstyle_gate.py --refresh --force`(§3)。
2. MC 对拍:不补跑(零数值零数据表零 RNG 流词表改动,卡① §15)。
3. PARITY gate 11(回放确定性对拍):本批触 PARITY_TOUCH_FACES(battle_orchestrator.gd)——闸记 NEED-APPROVAL,实跑或跳过由用户裁决(卡① §15,卡内不定案);批准实跑=`PARITY_APPROVED=1` 重跑闸。
4. 工程改动登记建议:§5-1(--only 逗号拆分)+§5-5(坑速查补条)。
5. 独立验收审计:报告落 `reports/iter42-验收审计-2026-10-29.md`(未参与实现的子代理执行,test-conventions §8.7 四事),结论见该件。
-72
View File
@@ -1,72 +0,0 @@
# 迭代 42 独立验收审计报告
- 审计人:独立子代理(未参与本批实现,test-conventions §8.7)
- 审计日期:2026-10-29
- 审计范围:`git diff ee4efad5..b704f1dc`(master→分支尖,3 提交:63e9fbf3 卡①/11cd46a5 卡②/b704f1dc 收尾)
- 审计输入:卡① 对照表 §13 与 §17 零申报、卡② 对照表 §11 与 §4.7 零申报、实现报告 §2/§5/§6/§7、回执 `game/tests/.gates/receipt.json`(commit b704f1dc,domain=code,scope=full)与 `.gates/` 各闸日志、`%TEMP%\iter42_final_gate.log`
- 方法:只读取证+最窄抽查;不采信实现报告「已全绿」自述,判据全部独立复核(grep/逐 hunk diff/新旧件逐行比对/日志实读)
- 义务边界:未改 `game/` 下任何文件;本报告外未写任何文件
## 一、两卡对照表逐行核对(V1/V3/V4/R1/R2/R3/R4)
| 行 | 核对结果 | 依据(独立复核) |
|---|---|---|
| V1 | **通过** | 三套件在册且函数落点属实:theme_projection_test.gd:183 `_smoke_type_glow`、type_glow_test.gd、player_copy_sweep_test.gd:106 `_sweep_board_glyph`;三文件在本 diff 范围**零改动**(diff 仅含 9 个申报测试文件)。拆分实落:board_view.gd `_paint_cell` 五段(ink/base/facade/overlays/fog)+`_build_cell_unit`(rebuild 循环 `.new()` 出函)。实跑:run_all_62 type_glow all green(48 checks)/run_all_63 theme_projection all green(163 checks,run_all 判 FAIL=脚本错误扫描命中 `_recent_list` 存量红,见第五节)/player_copy all green(22 checks)。golden:render.log L2/L3 双 0.00% OK、L1 2.74% FAIL——与报告 §6-④ 同值。 |
| V3 | **通过** | `_test_shop_node_entered_payload`(level_shop_economy_test.gd:1397)在位;〔尾波 V1〕尾缀断言恰 4 条。真实入口未绕过 `_enter_node`:pool 态经 AdventureRunner.start_adventure+`_adv_drive_to_shop`(autoplay 驱动);legacy 态经 `lr.start_level(2, s)`+awaiting_choice/pick_next_node 循环;run_all_54.log 报错回溯栈实证调用链 `_test_shop_node_entered_payload→pick_next_node(level_runner.gd:653)→_enter_node(:493)`,载荷经 node_entered 信号闭包取样,无直接 emit、无 shop 直调。断言守恒:旧 186 处 Kit.check→新 192 处=+6(新函数恰 6 条:2 可达性+4 尾缀);9 处被改写断言行一一有新对应行,零删除。实跑 run_all_54.log「all green (192 checks)」+4 条尾缀 PASS(gp 读数 27/30 与报告 §2 一致)。 |
| V4 | **通过** | variant_placement_test/round_flow_skill_pool_test/seal_polarity_test 三套件**零 diff**(函数落点 :54/:147、:47 全套、seal 20 函数);实跑 49/129/70 checks 全绿(run_all_30/29/28)。wr5 见第三节。零漂移证明链见第四节。 |
| R1 | **通过** | 产品码 6 件+sim 1 件 diff 逐 hunk 核对:全部为 `<recv>.shop.<方法>` 取件路径文本变化,方法名与实参逐字(camp_shop_presenter 14 处/main_adventure_flow 6/main_overlay_flow 2/main.gd 1/curio_interact_controller 1/level_autoplay 6+注释 2)。测试 7 件改址见第三节。七件相关套件 02 当轮全绿:level_shop_economy 192/hero_ledger/adventure_feats/pool_case_d/treasure_effects/curio_refresh_paid/meta_progression_forge 全 PASS(exit=0)。 |
| R2 | **通过** | 19 委托壳在 level_runner.gd diff 中全量删除(逐名清点 19/19);`_shop_draw_shelf` 词级 grep 全仓零命中(壳与白盒转发均消失)。独立残留扫描(19 名单 `grep -w` 于 game/ 全部 .gd):命中全部落四类合法形态——shop_session/gp_wallet/curio_deck/battle_orchestrator 定义与内部调用、字典键名(adventure_runner/level_autoplay/sim/测试断言)、跨类同名(settlement.player_request_refresh、deck().pool_stock)、宿主内部 shop. 直连点(level_runner.gd:102/305/306/704)。产品码与测试面零旧委托调用——零真残留。报告 §7 的 34 行分类账可复算(字典键 11+orchestrator 面 10+CurioDeck 面 9+GpWallet 1+宿主直连 4,按其口径合计 34),与本审计独立扫描分类一致。 |
| R3 | **通过** | level_runner.gd:44 更名 `var shop: ShopSession` 公开成员;词级 `_shop` 于 level_runner.gd 与全仓 .gd 零残留(仅保留件 `_bind_shop`:65 注释/:104 调用/:728 定义——词级 grep 不命中,合规);内部引用点(_init 建件与 pool 注入、breakpoint_fragment、_enter_node、continue_after_node、_bind_shop)全部随更名。 |
| R4 | **通过** | 六处注释同步逐处核对属实:shop_session.gd:4(委托承载句→直连表述)、level_runner.gd 区块注释(涉委托与白盒两句删、直连句换入、件注入说明保留)、level_autoplay.gd:335/356、shop_overlay_view.gd:88/152、tree_rules_v11_test.gd:6(`_spend_discounted` 指址改 shop_session)。 |
反向核对:diff 全量 27 文件逐类过目——行为改动仅 V3 载荷合并一处(两 payload 字典 `{"gp": gp, "shelf": true}`/`{"gp": gp}` 逐字保持);board_view/battle_orchestrator/board_installer 均为结构搬运(第四节)。孤儿断言:无(新增断言仅 V3 六条,已挂行;两卡就地补行均为行号订正与卡① §9 增 run_time_fatal 一行,属 T0「漂移处就地改卡并记录」授权面,与实现报告 §1/§5-7 申报一致)。
## 二、判据绑定面抽查
- **V3**:02 闸 run_all_54.log 当轮实跑,〔尾波 V1〕四条 PASS 可 grep(:720/:721/:779/:780);回执 02 指纹 f9865f1a5a44 与 baseline.json 02 指纹**逐字一致**=除 9 个登记存量红外零漂移。
- **V4**:round_flow_skill_pool_test 129 checks 全绿(run_all_29,全战斗步骤流逐行回放);variant_placement_test 49 checks 全绿(run_all_30,同种子变异布置逐位)。
- **R1**:hero_ledger/treasure_effects/curio_refresh_paid/meta_progression_forge/pool_case_d/adventure_feats 六套件 02 日志 PASS(exit=0)逐一在案。
- 冒烟/系统:run_smoke 15 项 0 失败、system_test 69 项 0 失败(smoke_boot.log/system_test.log)。
## 三、测试削弱检查(对照两卡零申报)
**卡① §17 零申报 vs run_time_fatal_test.gd diff(7 行)**:preload 增 BoardInstallerScript 1 行+注释 3 行+wr5 棋盘生成半边 1 行改 3 行(组装点构建+`bi_bg.generator._fatal(...)`);wr5 封印断言(`battle_result != "fatal_error"`→push_error→return false)逐字未动;wr5 资源半边、wr6、wr7、`_default_form` 零触碰;断言数量零增删。
独立判定:**改址,非削弱**。依据三点:
1. 旧取数点 `oc._board_generator` 随宿主成员退役物理消失,无可保留形态——卡① §16 L1「调用面改址漏改就地修复」通道的适用情形。
2. 新构建束与生产薄壳 `_install_and_reset`(battle_orchestrator.gd:417-418)**逐字同束**(同 fatal_cb=oc_bg._fatal 接线),传导链 generator._fatal→fatal_handler→宿主 _fatal→封印与生产同路。
3. 束缺键有 assert fail-fast(board_installer.gd:21-22),薄壳漏传 fatal_cb=每次 begin_battle 断言崩、全量套件即红——无静默绿通道。
观察注记(不判缺):触发对象由「编排器自有生成器实例」变为「同形态组装点构建的实例」,wr5 不再直接钉宿主薄壳自身的束组装字面——该面由上条第 3 点的全量兜底覆盖,且同种子断言面(V4 三套件)钉住真实 begin_battle 装板路径。
**卡② §4.7 零申报 vs `game/tests/unit/` diff 逐 hunk**:8 个测试文件改动全部为调用地址文本变化(`<recv>.<方法>`→`<recv>.shop.<方法>`;白盒 `_shop_draw_shelf`→`shop._draw_shelf`)+tree_rules_v11 头注 1 行指址;抽全 9 处被改写断言行逐一比对,断言条件与期望值逐字零变化;level_shop_economy 断言总量守恒(186→192,+6 全为新函数)。**零未申报的断言删除/阈值放宽/扫描面缩小/换下层直调**。
**static_scan.sh**:S7_B1_SET 与 S8_FILES 各增 board_installer.gd 一行(扩面非缩面),与卡① §9 申报一致;缺位自检通过。
## 四、V4「非行为改动」判定依据核对
- **六函数迁件零漂移**:board_installer.gd 与 `git show ee4efad5:game/core/battle_orchestrator.gd` :414-549 逐段比对——抽查 `_resolve_global_variant` 与 `_place_variants_apply` 逐行同构(差异仅接收方更名 `_reward_economy`→`reward_economy` 与一处注释行合并,代拍板白名单覆盖面);`_place_variants`/`_variants_fringe`/`_adjacent_to_packs`/装板主序(生成→决议→装板→摇号→布置)同核无差。
- **RNG 零漂移**:board_gen 流开流时点=装板主序首行(旧 `_install_new_board` 首行=新 `install` 首行);variant_place 流开流时点=候选域构造后、vrow 摇号前(与旧同位);消费序逐字同码;board_installer/battle_orchestrator/level_runner/board_view grep `randomize`/自建 RandomNumberGenerator 零命中。
- **宿主薄壳时序逐字**:`_install_and_reset`(:416-431)=旧 `_install_new_board` 尾部复位块逐字搬运(_seal_consumed/_seal_miss_seen 清零→_perfect_hit_true/_perfect_hit_false/_perfect_forgiven 清零→_board_from_midround_refresh→_board_seq+=1→board_changed.emit→treasure_inventory.retire_overlays),且保持「装板成功后复位」的先后时序。
- **三调用点改址**:begin_battle :270/_exit_distribution :683/player_request_refresh :717——与旧 :271/:801/:835 同位同参(during_round 传参逐字);begin_battle 五段驱动序与 attune 族未动(新旧文件对照属实)。
- **`_board_generator` 成员退役**:新 battle_orchestrator 零 `_board_generator` 字样;类变量 38→37(static_scan.log S13「较登记值恶化 0 条」——只降不升兑现)。
- **实跑钉住**:variant_placement 同种子断言 02 当轮全绿(第二节);呈现面由 golden L2/L3 双 0.00% 钉住。
## 五、回执与呈报一致性
- 回执与终闸日志一致:commit b704f1dc/domain=code/scope=full;00 冒烟绿、01 系统测试绿、10 熵增闸绿、11 NEED-APPROVAL(PARITY 触面 battle_orchestrator——报告 §9.3 同述,待用户裁决)。
- **02**:exit=1、指纹 f9865f1a5a44 与 baseline.json 逐字一致。unit.log FAIL 恰 9 套件,错误形态与报告 §6-② 逐项注(cattr/退出码 2≠1/meta_state/crossrun/set_trans/120s 挂死/row_by_id Nil/_migrate_legacy_save/_recent_list)逐一吻合;56 PASS+9 FAIL=65 套件,与报告「全量 65 套件」计数一致。
- **03/04/05**:回执记「基线绿→现红」,终闸日志同列三行 ✗;报告解释为 master 原状同值复现(实现者 stash 对照法取证)。本审计按审计指示未复现 stash 实验,只核自洽性:报告口径(probe 三红=ui_input 超时 exit 124/ui_struct resume 断言/ui_click 16 行 set_trans 空值;golden L1 2.74%、L2/L3 双 0.00%)与 probe_click.log/probe_full.log/render.log 实况逐项一致,且涉案文件(battle_end_overlay 等)均不在本批 diff 内。自洽成立;「非本批新增」结论采信实现者 stash 取证。
- **09**:exit=1、指纹 1a9ad773489f 与基线一致;S13 十键全在基线内、基线外新违规 0、恶化 0——与报告 §3「零新增键(10=16−6)」同述。
**表述性瑕疵(不判缺,列已备核)**:
1. 实现报告 §2 R1 行「失败清单逐一同值=10 存量红」未随 §5-7 勘误同步为 9——T0/T1 两轮当时实况确含本批新增 wr5 共 10,勘误后终态口径 9(以 §6-② 与终闸回执为准)。
2. 实现报告 §1 各任务「分支提交」列为 squash 前中间提交号(509f41f5 等,reflog 可达、非 b704f1dc 祖先);分支终态 3 提交,内容经 cherry-pick 同入。
3. static_scan.sh S8 ok 消息「扫描面 B1 文件集 9 个 .gd」为陈旧字面量——S8_FILES 实含 10 文件且缺位自检通过,扫面无缩小;建议工程批顺手订正该消息文本。
4. level_runner.gd:14 node_entered 信号注释陈旧——实现报告 §5-6 已申报,归文档批/后续批,非本批义务。
## 总体结论
**通过**。两卡对照表七行(V1/V3/V4/R1/R2/R3/R4)逐行核实:验收测试真实存在、当轮真实跑批执行并通过、尾缀可 grep、真实入口未绕过改动点;判据绑定面抽查全中;测试削弱零申报成立(wr5 判改址非削弱,依据如第三节);V4 零漂移证明链(逐字同构+流名流时点同位+薄壳时序逐字+三调用点同参+同种子断言实跑钉住)成立;回执与呈报自洽。在册遗留事项均待用户发令,不构成本批缺漏:S13 基线重锚(--refresh --force)、PARITY 闸 11 实跑或跳过裁决、golden L1 重锚批准、03/04/05 存量红处置。
@@ -1,231 +0,0 @@
# 需求卡片——gdstyle 尾波清偿批
> **版本状态**:v2.0 定稿——设计段裁决已闭合(D1–D6 裁决记录见第 6 节,2026-10-29 用户裁),零待裁点,可编排。
> **接收方**:待办清单条目「gdstyle 尾波清偿批——基线余量 11 键定向整改(2026-10-29 登记)」。
> **来源**:gdstyle 尾波清偿分析(2026-10-29 基线重锚后余量清点)。**唯一事实源**:`tools/gdstyle_baseline.txt`(2026-10-29 重锚版,余量 16 键)+ `reports/审计-gdstyle存量债清点与清偿方案-2026-10-26.md`(§三波次方案、§六文档设计段裁定记录——裁定全部继续有效)。
## 1. 目标与完成定义
这批做什么:把 gdstyle 静态质量闸(S13)基线余量 16 键中的 11 键定向清偿——6 键降到阈值内(闸不再记它,下称归绿),5 键按第 6 节裁决维持或降值后走 architecture 豁免登记(批末随实测值落文)。手段只有两类:存量文件内部拆私有函数(呈现层先例)、按职责拆协作件(核心层先例)。
什么状态算完:
1. 11 键逐键达到第 7 节写明的预期结果(归绿 6/豁免 5——豁免键实测值落 architecture 豁免登记段)。
2. 游戏行为零变化:同种子下事件流、步骤流、断点快照、棋盘渲染逐位一致(第 4 节红线)。
3. 批末代码域闸全绿(冒烟+单元+集成+探针+渲染 golden+静态扫描),键账对账完成(第 13 节)。
4. 实现报告与反哺点清单落 `reports/`(末卡产出物落位卡)。
## 2. 设计事实源
本卡属需求性工程条目(结构整改、改游戏代码面),按五段流水线凭工程债证据写卡;四个拆件项的设计段裁决于 2026-10-29 经用户裁闭合(记录见第 6 节)。证据指认:
- `tools/gdstyle_baseline.txt`——2026-10-29 人工重锚后的现行基线,16 键;本卡 11 键逐条列于第 3 节,键名与本卡逐字一致。
- `reports/审计-gdstyle存量债清点与清偿方案-2026-10-26.md` §六裁定记录 7 条(段组织、波 2/波 6 形态、config_db 定性、判定口径、独立审查折入、2026-10-27 三卡归并)——继续有效,本卡沿用其中对呈现层「内部拆私有函数、不拆构建步件」与「全部波不改游戏规则与玩家可见行为」的裁定。
- `design/engineering/architecture/architecture.md` v1.24——轴丙 BoardInstaller(装板域拆件)已随本卡设计闭合落文(模块归属功能层新行+拆件定稿节增补),实现照册施工。
- 并排执行卡:`reports/需求卡片-level_runner商店委托层拆除-2026-10-29.md` v1.1(键 7 拆除执行合同——D6 并排编队,见第 6 节)。
## 3. 现状事实(代码级,开工自行复核;行号为 2026-10-29 实查)
基线 16 键中本批承接 11 键,其余 5 键(`main.gd` 类变量 49、`tune_sim_controller.gd` 循环内 await、`board_cell_unit.gd` 类变量 30、`standee_body.gd` 类变量 19、`battle_orchestrator.gd` 类变量 38)走豁免通道另行讨论,不在本卡。
| # | 基线键 | 现状/阈值 | 涉案位置 |
|---|---|---|---|
| 1 | `board_view.gd\|quality/max-function-length\|_paint_cell = 139` | 139/50 | `game/presentation/views/board_view.gd:601-739` |
| 2 | `board_view.gd\|quality/max-branches\|_paint_cell = 24` | 24/8 | 同上 |
| 3 | `board_view.gd\|quality/max-local-variables\|_paint_cell = 22` | 22/10 | 同上 |
| 4 | `board_view.gd\|quality/allocation-in-loop`(裸键) | 命中 | `board_view.gd:249`——rebuild() 建格循环内 `_CELL_UNIT.new()` |
| 5 | `board_view.gd\|quality/max-class-variables = 32` | 32/15 | `board_view.gd:49-85`(var 成员 31)+:93(`cell_size` 只读属性;计数以闸实测为准) |
| 6 | `board_view.gd\|quality/max-public-methods = 27` | 27/20 | 全文件:11 setter+6 探针出口+4 几何契约出口+3 入站事件+2 生命周期(rebuild/refresh)+1 访问器(board()) |
| 7 | `level_runner.gd\|quality/max-public-methods = 50` | 50/20 | `game/core/level_runner.gd`——其中商店同签名委托 17 个公开方法(751-828 行)+3 个私有转发(`_bind_shop`:728、`_spend_discounted`:772、`_shop_draw_shelf`:783)+`_shop` 成员(:44) |
| 8 | `level_runner.gd\|quality/max-class-variables = 30` | 30/15 | `level_runner.gd` 类成员区(含 `hero_hp`/`gp` 两属性) |
| 9 | `level_runner.gd\|quality/max-returns\|_enter_node = 7` | 7/6 | `level_runner.gd:486-513`——shop 分支 pool/legacy 双 return(:509、:511) |
| 10 | `battle_orchestrator.gd\|quality/max-file-length = 1035` | 1035/1000 | `game/core/battle_orchestrator.gd`——装板与变异布置域六函数合计约 140 行(:414-549) |
| 11 | `adventure_runner.gd\|quality/max-class-variables = 28` | 28/15 | `game/core/adventure_runner.gd:13-45` |
支撑事实:
- board_view 公开方法 27 个全是契约面:setter 是组合根注入面(依赖单向纪律),探针出口(cells_probe/diggable_probe/hover_probe/fog_params_probe/type_glow_probe/cell_rect_probe)是探针断言面,几何出口与入站事件是演出与输入契约。可降空间极小。
- battle_orchestrator 装板域六函数全仓零外部调用,仅本文件三处调用(:271 begin_battle、:801 _exit_distribution、:835 player_request_refresh)——拆件不触任何外部调用面。
- 六函数现行均无超标键(基线无其函数级键);`_install_new_board` 体内 443-452 行为宿主态复位块(五处计数清零+板序推进+board_changed 发射+秘宝叠加层退役)——按第 6 节 D1 裁决留宿主薄壳。
- `_board_generator` 全文件仅四处使用(:42 声明、:233 创建、:239 fatal 接线、:416 装板消费)——装板族独占,随件迁移后宿主成员退役(38→37)。
- level_runner 商店委托面被呈现层 5 文件(camp_shop_presenter/main_adventure_flow/main_overlay_flow/main_ui_build/shop_overlay_view)、`game/sim/level_autoplay.gd`、测试 4 套件(level_shop_economy/pool_case_d/tree_rules_v11/hero_ledger)引用——shop_overlay_view 三处命中均为注释投影引用(:15/:88/:152 实查),代码调用面在 presenter/组合根拆件/sim 侧。
- `tools/run_all_gates.sh` PARITY_TOUCH_FACES 含 `game/core/battle_orchestrator.gd`——本批必触面。
- level_runner 商店委托面的完整行级调用点清单(19 壳含 2 死壳、跨类同名陷阱、呈现/sim/测试逐点行号)以并排卡 v1.1 §3 为准——本卡不重复罗列。
## 4. 设计契约(违反即返工的红线条款)
- 🔴 **行为零变化**:本批全部改动为结构整改,游戏行为零变化——同种子下事件流/步骤流/断点快照/存档往返/棋盘渲染逐位一致;玩家可见面零变化;`design/gdd/systems/` 零修订预期。
- 🔴 **RNG 取号序零漂移**:禁 `randomize()`/自建随机;battle_orchestrator 装板域拆件时 `board_gen`/`variant_place` 两封闭流随件迁移**取号序不变**(流名、开流时点、消费序零漂移——先例句「fx_reveal 封闭流随件迁移取号序不变」同款)。
- 🔴 **PARITY 触面**:battle_orchestrator.gd 触 PARITY_TOUCH_FACES——实跑对拍须经用户批准、不得借机重锚。
- 🔴 **呈现零变化**:board_view 改动的画面判据=`game/tests/golden/` 既有三张棋盘基线(L1 dungeon/L2 underdark/L3 deep_underdark),对拍差异非零即红;重建基线只许用户批准,实现批禁自行换锚。
- 🔴 **拆分边界纪律**(判据权威=code-conventions §1.1,此处立卡内执行条款):①每个拆出单元须有可陈述的职责语句与单一变化原因(实现报告逐件一行承载);②拆出单元须有集体身份——命不出名字、只能说「剩下的成员」的打包=凑计数袋,禁;③「过阈值」只许作为发现信号,作为拆分或收拢的动机即违规;④按纪律拆不出内聚单元 → 停卡呈报走豁免/还债通道,禁硬拆凑绿;⑤拆分沿职责轴不沿阈值轴。
- 🔴 **禁为机检文本保留无效成员**:禁止为迎合机检消息文本(含计数)而保留或新增无效成员/别名——装板域拆件后宿主 `_board_generator` 成员随之退役(38→37);机检键与卡片契约互斥时,实现段一律停卡呈报,不得自造第三条路。
- 🔴 **基线纪律**:禁为过闸 refresh 换绿;还债=数值下降自然绿;出现恶化=停卡呈报(细则第 13 节)。
- 🔴 **attune 族与 begin_battle 序列禁动**:battle_orchestrator 的 attune 族原位保留(迭代 39 副卡语义领地);begin_battle 受理段序与五段驱动逻辑禁动——装板域拆件只改 `_install_new_board()` 调用点的取件改址。
## 5. 范围边界
做什么:第 3 节 11 键中本卡直接执行的三项改动(第 7 节逐键方案、第 12 节任务卡)——board_view 拆分(键 1–4)、_enter_node 载荷合并(键 9)、装板域拆件(键 10);键 7 的拆除执行合同=并排卡「level_runner 商店委托层拆除」v1.1(D6 裁定并排编队,见第 6 节)。
不做什么:
- 商店委托壳拆除的执行——D6 裁并排编队:执行合同=在册定稿卡 v1.1(零待裁点),本卡不重复执行、只承接键账与豁免登记。
- 悬停域拆件与断点域拆件——D2/D4 裁不拆(第 6 节),键 5/6/11 直送豁免终局。
- 5 个豁免讨论键(main.gd/tune_sim_controller/board_cell_unit/standee_body/battle_orchestrator 类变量)——去向:豁免通道批末与本批 5 键合并一次落文,本卡不落文、不落反哺点。
- 波次方案其余文件(审计报告 §三波 1–8)——已由迭代 39/40/41 清偿,不在本卡。
- `game/tests/README.md`——实现批禁写;GP 钱包行真实入口列已随本卡 v2.0 改为 ShopSession 直连(计划入口,闸双通道认卡),批末核对表上名字与实际落地一致。
- 数值表、RNG 流词表、信号载荷 schema——零触碰。
## 6. 设计段裁决记录(2026-10-29 用户裁——D1–D6 全部闭合)
| 编号 | 裁决 | 依据(推导链摘要) |
|---|---|---|
| D1 | ✅ 装板域拆新件 BoardInstaller,两修正 | 六函数构成可命名内聚单元(生成→决议→装板→摇号→布置,单一变化原因=棋盘设置顺序与变异布置算法);三调用点全宿主内实查零外泄;不在 v1.22 保留面;文件长键唯一归绿路径。**修正一**:复位块(442-451 行)留宿主薄壳 `_install_and_reset`,非逐字搬运;**修正二**:`_board_generator` 装板族独占(四处实查)随件迁移,宿主成员退役 38→37。已落 architecture v1.24 轴丙。 |
| D2 | ❌ 悬停域不拆 | 键 5/6 无一可由此归绿(类变量 32→30 仍红、公开方法持平 27);波 6 既定裁=普通视图内部拆私有函数、不立周边件;悬停 11 函数全部低于阈值(无 S13 标的),拆分仅剩计数动机、踩 §1.1-③ 灰区;新件+束注入+入站口委托的代价不成比例。键 5/6 直送豁免;`_r0` 归属认定随之作废。 |
| D3 | ✅ 商店域候选 A(删委托壳),`_shop` 公开化留宿主 | ShopSession 迭代 37 已建(33 公开方法实查),委托面=纯 Middle Man(2026-10-26 真拆分设计会话已裁「纯转传委托=反模式」);拆除方向 2026-10-26 已在册登记,本卡系执行既定发令;公开方法 50→33。`_shop` 公开化留宿主——`_enter_node` shop 分支与断点片段仍需持引用,非无效成员;类变量 30 不降,归豁免。执行合同=并排卡「level_runner 商店委托层拆除」v1.1(零待裁点)——其契约精度高于本卡初案(19 壳含 2 死壳行级清单、`_shop`→公开成员更名形态、两段式中间态、跨类同名判别),按其施工。 |
| D4 | ❌ 断点域不拆 | 键 11 无键可绿(28→22 仍红);现位置不违反任何已立边界——SlotStore 拆分立的界约束的是 save_manager 不吞断点逻辑,非要求断点逻辑离宿主,断点协议住在冒险生命周期 owner 内本身内聚;`_save_manager` 非断点独占(:371 boss 首杀读、:521 abandon 清断点写盘实查),件化须双持引用、束复杂度超收益;27 键冻结契约扰动收益为零。若未来断点协议自身扩展,届时按职责轴立件。键 11 直送豁免。 |
| D5 | ✅ 五个降值键豁免登记终局 | board_view 类变量 32/公开方法 27、level_runner 公开方法 33(删壳后)/类变量 30、adventure_runner 类变量 28——可降途径已按代价裁完,残留面全为契约承载或运行本态;无偿还计划的债=未注记豁免,不如把理由落权威文档。批末按实测值落 architecture「测试与质量域」S13 豁免登记段(先例=battle_orchestrator 第三条形态:键永久基线内、禁再恶化、豁免不等于了结)。 |
| D6 | ✅ 商店域并排编队(写卡期修正:原「吸收」案否决) | v2.0 初稿裁「本卡吸收在册条目、删除其卡」;落笔时发现该域已有定稿执行卡——「level_runner 商店委托层拆除」v1.1(2026-10-29,复核门通过零待裁点),契约精度高于本卡 T6 粗案,销定稿卡重写粗案=无收益损耗。改判:**两卡同迭代并排编队**(编排段并列排入、执行顺序先后皆可——level_runner 交叠为不相邻区段零冲突),本卡承接键账与豁免登记、不重复执行拆除;在册条目与其卡维持,随其自身批完成删除。 |
## 7. 逐键方案(11 键:现状值/阈值/方案方向/预期结果)
预期分两档:**归绿**(拆后实测低于阈值,下批重锚后键消失)与**豁免终局**(维持或降值,批末随实测落 architecture 豁免登记段)。
| 键 | 现状/阈值 | 方案方向 | 预期结果(档位) |
|---|---|---|---|
| 1 board_view _paint_cell 长度 | 139/50 | 拆分层私有函数族(键 1–3 同一改动,见 T1)——五段=基底瓦片→字形与色牌→立面投影→秘宝/变异叠加→迷雾,段间只经 u.st/glyph/digit_col 传值;段内分支仍超 8 时沿绘制层轴继续下钻 | ≤50,**归绿** |
| 2 board_view _paint_cell 分支 | 24/8 | 同上 | ≤8,**归绿** |
| 3 board_view _paint_cell 局部变量 | 22/10 | 同上 | ≤10,**归绿** |
| 4 board_view allocation-in-loop | 命中 | `.new()` 移入逐项构建私有函数 `_build_cell_unit(c, stride)`,循环体只调构建器(先例=battle_end_overlay._seal_img/_ledger_row 族) | 消除,**归绿** |
| 5 board_view 类变量 | 32/15 | 无拆分动作(D2 裁不拆——第 6 节) | 32 维持,**豁免终局** |
| 6 board_view 公开方法 | 27/20 | 无动作(27 个逐类核对全为探针契约面与依赖单向纪律承载面) | 27 维持,**豁免终局** |
| 7 level_runner 公开方法 | 50/20 | 执行合同=并排卡「level_runner 商店委托层拆除」v1.1(19 委托壳删除+`_shop` 公开化;本卡不重复执行——D6) | 约 33,**降值后豁免终局**(豁免登记随本卡批末落文) |
| 8 level_runner 类变量 | 30/15 | 无动作(`_shop` 留宿主——D3 裁,非无效成员) | 30 维持,**豁免终局** |
| 9 level_runner _enter_node 返回数 | 7/6 | shop 分支 if/else 双 return 合并为载荷变量单 return;两个 payload 字典逐字保持(pool 分支 `{"gp": gp, "shelf": true}`、legacy 分支 `{"gp": gp}`),零契约风险。备选(code-conventions §1.1-③ 红线):若实现期发现合并构成纯计数扭曲则留债呈报——本卡按「合并属同一停点语义的两条发射路径归一」认定有内聚收益 | 6,**归绿** |
| 10 battle_orchestrator 文件长 | 1035/1000 | D1 装板域拆件:六函数迁出+宿主薄壳承接复位块+`_board_generator` 成员退役 | 约 910–920(拆后实测),**归绿** |
| 11 adventure_runner 类变量 | 28/15 | 无动作(D4 裁不拆——第 6 节) | 28 维持,**豁免终局** |
## 8. 关联文档同步面
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| design/engineering/architecture/architecture.md | 「战斗编排域拆件定稿」节轴丙与功能层 BoardInstaller 行——**已随本卡 v2.0 设计闭合落文(v1.24)**,实现照册施工;level_runner 行「外部调用面由同签名委托承载」句(D3 候选 A 实现后失真);「测试与质量域」S13 豁免登记段(D5 五键——批末按实测值落文) | 设计权威文档——实现批禁直改;level_runner 句与豁免登记逐条列进 `reports/iter<N>-反哺点-<日期>.md`,用户裁决后归文档批落文 |
| game/tests/README.md | 「GP 钱包/escrow/商店收口/共享池」行真实入口列——已随本卡 v2.0 改为 ShopSession 直连(计划入口,闸双通道认卡);「棋盘悬停反馈」行已随 v1.0 入表(能力独立成立,不随 D2 裁定变化) | 机械面文档——实现批禁写;批末收尾核对表上名字与实际落地一致(改名则回表) |
| design/gdd/systems/(全树) | 无关联文档——结构整改不改游戏规则与玩家可见行为(审计报告 §六.5 判定口径沿用) | 无修订预期;若实现中发现契约句被触碰,停卡呈报走反哺点通道 |
## 9. 卡前文件结构图
| 文件 | 职责 | 改动性质 |
|---|---|---|
| game/presentation/views/board_view.gd | 棋盘视图壳层(格态渲染入口、入站事件、探针出口) | 修改(非行为改动——_paint_cell 拆分层函数族、rebuild 构建器;验收=对照表行 V1) |
| game/core/level_runner.gd | 关卡域生命周期编排者 | 修改(非行为改动——仅 _enter_node 载荷合并〔载荷逐字保持〕;商店委托壳区段归并排卡,本卡不触——验收=对照表行 V3) |
| game/core/battle_orchestrator.gd | 战斗结算编排中枢 | 修改(非行为改动——装板域六函数迁出、宿主薄壳承接复位块、`_board_generator` 成员退役、三调用点改址;验收=对照表行 V4) |
| game/core/board_installer.gd | 棋盘安装与变异布置域件(新增,architecture v1.24 功能层在册) | 新增(非行为改动;验收=对照表行 V4) |
| game/tests/unit/core/level_shop_economy_test.gd | 关卡图与商店宿主套件 | 修改(仅新增断言 _test_shop_node_entered_payload〔尾波 V1〕;委托面调用点改址归并排卡) |
| game/tests/unit/core/run_time_fatal_test.gd | 运行期违约通道负面套件 | 修改(wr5 棋盘生成半边改指 BoardInstaller 新组装点——T0 复核补查项:卡面 §3 漏查的该测试白盒取数点 `_board_generator` 随成员退役断链,wr5 断言目标违约→封印传导不变) |
| game/tests/static_scan.sh | 静态扫描域承载 | 修改(S7 B1 域文件集与 S8 await 文件集增行 board_installer——工程随动,architecture 拆件定稿节 S7/S8 随动条在册) |
新增件「为什么不能复用」理由与唯一落点核查见第 10 节;对不上即卡片不成立。
## 10. 落位与可复用性预检
- **board_installer.gd(新增)**:复用面核查——装板与变异布置逻辑现行只存在于 battle_orchestrator(全仓 grep 六函数名仅本文件三处调用,无第二实现),无既有件可复用;不能并入 BattleFxHost(效果引擎宿主域,变化原因不同)也不能并入 RewardGrant(授予管线域)。落点唯一:B1 域新文件,`game/core/`。分层:core 层 RefCounted,零 UI、零 await,经引用束注入取协作对象,禁裸引用 autoload(S5);BoardGenerator 实例件内自建并接线 fatal 回调。
- **新增函数**:_build_cell_unit、_paint_cell_* 段函数族、宿主薄壳 `_install_and_reset`——全部是既有函数体的逐字搬运或循环体内联体出函,无新增逻辑;迁移函数对账见第 11 节。**零新增数据件、零新增常量表**。
- **调用路径显式声明**:board_installer 只被 battle_orchestrator 三调用点(经宿主薄壳)调用——禁反向持有宿主引用(注入回调单向,先例=BattleFxHost 兑付回调)。
## 11. 实现规范预算(新件对照 gdstyle 默认阈值;写码前对账,超预算面=停卡退回写卡段)
| 新件 | 公开方法 ≤20 | 类变量 ≤15 | 迁移函数对账(基线源函数键) |
|---|---|---|---|
| board_installer.gd | 预算 1(install) | 预算 7(引用束成员 rng/db/minesweeper/reward_economy/encounter 引用/fatal Callable+自建 BoardGenerator) | 六函数现行均无超标键(基线无其函数级键);`_install_new_board` 拆件体与宿主薄壳两段合计行数逐字=计数不变=新文件零新增键 |
| 新增私有函数(board_view/level_runner 内) | —(私有不计数) | 零新增成员(类变量只降不升) | _paint_cell 三键随拆分消除;段函数逐个低于默认阈值(超 8 分支的段沿绘制层轴下钻,见第 7 节键 1) |
存量触面一查:涉案存量文件 T0 读数写明「S13 键较登记值只降不升」预期——board_view 6 键(3 归绿+1 消除+2 维持不升)、level_runner `_enter_node` 键归绿(键 7/8 归并排卡与豁免通道,本卡不触)、battle_orchestrator 文件长归绿(类变量 38→37 只降);adventure_runner 本批零触碰(键 11 维持)。`_init` 一律引用束注入(字典束),防 max-parameters 新键(先例=迭代 40 卡①)。
## 12. 任务卡 T0..T7(估时为区间;工作量限制只属迭代层)
**T0 读数复核与对账(0.25–0.5 工作日)**
- [ ] 以当轮 master 重测 11 键实测值,与基线登记值逐键对账(审计报告 §四.6 纪律:禁按本卡行号直接施工);对不上即停卡呈报
- [ ] 复核涉案文件行数与第 3/7/9/11 节全部 file:line 引用;漂移处就地改卡并记录
**T1 board_view 拆分——4 键归绿(1–1.5 工作日)**(取用:T0 读数;产出:归绿键 1–4)
- [ ] `_paint_cell` 拆五段分层函数族 `_paint_cell_base/_paint_cell_ink/_paint_cell_facade/_paint_cell_overlays/_paint_cell_fog`(骨架见第 7 节键 1;主函数留格态读取与终写),函数体逐字搬运、段内超 8 分支沿绘制层轴下钻
- [ ] rebuild() 建格循环抽 `_build_cell_unit(c: Vector2i, stride: float) -> Node2D`,`.new()` 与属性装配逐字迁入
- [ ] 孤立验证:`godot --headless --script res://tests/run_all.gd -- --only=type_glow,theme_projection,player_copy` 全绿+`tools/probe_gate.sh --click` 全绿(出红只跑红件最小单元)
- [ ] `tools/render_gate.sh` 棋盘 golden 三张对拍差异 0.00%(非零即停机呈报)
**T2 level_runner _enter_node 载荷合并——键 9 归绿(0.25 工作日)**
- [ ] shop 分支 pool/legacy 双 return 合并为载荷变量单 return,两 payload 字典逐字保持(pool `{"gp": gp, "shelf": true}`/legacy `{"gp": gp}`)
- [ ] 新增断言 `level_shop_economy_test.gd:_test_shop_node_entered_payload`(规格见对照表 V3)
- [ ] 孤立验证:`-- --only=level_shop_economy` 全绿
**T3 battle_orchestrator 装板域拆件——键 10 归绿(1–1.5 工作日)**(前置:architecture v1.24 轴丙在册)
- [ ] 建 `game/core/board_installer.gd`(引用束注入,第 10 节落位预检),装板逻辑六函数迁件;`_install_new_board` 拆件体=生成→决议→装板→摇号→布置(415-441 行段),宿主薄壳 `_install_and_reset` 承载复位块(443-452 行段:五处计数清零+板序推进+board_changed 发射+秘宝叠加层退役),时序逐字
- [ ] 宿主三调用点(:271/:801/:835)改调薄壳;删宿主 `_board_generator` 成员(38→37,禁无效成员)
- [ ] static_scan.sh S7 B1 域文件集与 S8 await 文件集增行
- [ ] 孤立验证:`-- --only=variant_placement,round_flow,seal_polarity` 全绿+`python tools/run_smoke.py`
- [ ] 文件长实测 ≤1000(键归绿);类变量实测 37
**T6 批末对账与收口(0.5 工作日)**
- [ ] 全量闸:`bash tools/run_all_gates.sh --code`(改动全为代码面)全绿;闸 11 触面按第 4 节 PARITY 条款由用户裁决
- [ ] 键账对账:11 键终值对照第 7 节预期逐键核(归绿 6/豁免 5;键 7 终值视并排卡落地时序——同批编队即见 33);重锚由用户发令人工 `--refresh`(第 13 节);豁免登记 5 条+既有讨论 5 键按实测值落 architecture(反哺点通道)
- [ ] 产出物落位卡:`reports/iter<N>-实现报告-<日期>.md`(各卡状态+实机目检总清单+实现决定记录+逐拆出单元职责语句一行)与 `reports/iter<N>-反哺点-<日期>.md`(第 8 节同步面逐条落点)写齐方算收口
合计估时约 3–4.25 工作日(切分预案:T3 拆件裁决被证伪时按留债口径 −1~1.5 并回写第 7 节预期;并排卡 v1.1 的 ≈1.5 工作日不占本卡估时,编队总量由编排段合并计)。
## 13. 验证闸——改动—验收对照表
域口径:本批改动全为 `game/` 下非 .md 行为载体——批末跑代码域闸(`tools/run_all_gates.sh --code`);里程碑步(T 段)出口跑一次全套闸,波内修复只做出红最小单元的最窄确认,新增测试先行孤立验证再并入全套。测试执行两入口铁规不破。总判据=每行改动以「既有断言面全绿+golden 零差异+(V4)同种子对拍」证明零行为漂移,无新增玩家可见面;全量闸电池=冒烟 run_smoke.py+系统测试 run_system_test.py+`run_all.gd` 全量+probe_gate --click --full+render_gate+static_scan(含 S13 对账)。
| 行 | 需求点(键) | 改动(文件:行) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|---|
| V1 | 键 1/2/3/4——_paint_cell 拆分层函数族+rebuild 构建器 | board_view.gd:601-739 拆五段、:246-262 抽 _build_cell_unit | 复用 theme_projection_test.gd:_smoke_type_glow、type_glow_test.gd、player_copy_sweep_test.gd:_sweep_board_glyph(既有断言零改动);新增断言零条;render_gate 棋盘 golden 三张 | 单元+探针+golden | BoardView.rebuild()→refresh()→type_glow_probe();board_shot_probe 真实场景帧 | 既有套件断言面+golden 逐像素(差 ≤16/changed ≤2%)——**既有三张基线即改前基线,对拍差异非零即红;重建基线须用户批准** | 既有:未开格类型微光(8 邻作用集/五组色相/零玩法写入);既有:玩家面文案与危险格格面字形 |
| V3 | 键 9——_enter_node 载荷合并 | level_runner.gd:503-511 双 return 并单 return | 新增 level_shop_economy_test.gd:_test_shop_node_entered_payload〔尾波 V1〕:pool 态 node_entered 载荷含 `shelf: true` 且 gp 等于进店时钱包现值;legacy 态载荷无 `shelf` 键。复用该套件商店房段既有断言 | 单元 | LevelRunner.start_level_external→pick_next_node 进 shop 节点 | node_entered 信号载荷(两 payload 字典逐字保持是本改动判据本体) | 既有:GP 钱包/escrow/商店收口/共享池 |
| V4 | 键 10——装板域拆件 | board_installer.gd 新建;battle_orchestrator.gd:414-549 迁出、:442-451 复位块留薄壳、:271/:801/:835 改址 | 复用 variant_placement_test.gd:_smoke_variant_placement/_smoke_global_variant、round_flow_skill_pool_test.gd:_smoke_full_battle、seal_polarity_test.gd 全套;新增断言零条;PARITY 对拍按第 4 节条款 | 单元+集成+MC 对拍(须批准) | BattleOrchestrator.begin_battle()/player_request_refresh() | 同种子变异布置逐位断言面+全战斗步骤流逐行回放断言;board_gen/variant_place 取号序零漂移由同种子断言钉住 | 既有:变异布置门控;既有:轮内流与结算五段全序 |
反向核对:diff 中每个行为改动均有行——本批申报行为改动仅 V3 一处(载荷合并,行为保持);其余行均为非行为改动(结构整改,判据=零漂移证明)。孤儿断言:无(新增断言仅一条:V3 行〔尾波 V1〕,已挂行)。
## 14. 基线纪律(S13)
1. 禁为过闸 refresh 换绿:基线重生成只由用户发令,批末键账对账后人工 `python tools/gdstyle_gate.py --refresh` 一次执行(禁闸内自动重生成、禁实现批中途 refresh)。
2. 还债=数值下降自然绿:拆件后同键数值下降不判红,无需动基线;归绿键在下批重锚后自然消失。
3. 出现恶化(同键数值较登记值上升、基线外新键)=停卡呈报,禁自行消化。
4. 重锚守卫:新键数较旧基线少逾 10% 须 `--force` 显式确认——本批预期归绿 6 键(16→约 10,降幅约 37%;键 7 随并排卡降值 50→33,同批编队时同一次重锚即含),须带 `--force` 由用户执行。
5. 豁免键范围:既有豁免 5 键(main.gd 类变量等——不在本批对账范围;battle_orchestrator 类变量 38→37 为已登记豁免键,只降不升)+本批 D5 裁定 5 键(批末按实测值落文——键 7 实测值视并排卡落地时序;落文前照常按基线对账)。
## 15. MC/数值与 RNG 零触碰声明
本批零数值改动、零数据表改动、零 RNG 流词表改动、零玩法字面量引入——结构整改不改数值与 RNG 消费序。board_gen/variant_place 封闭流随件迁移取号序不变(流名、开流时点、消费序零漂移——同种子逐位一致)。数值与 RNG 零触碰则 MC 对拍不补跑;battle_orchestrator.gd 触 PARITY_TOUCH_FACES——实跑对拍须经用户批准、不得借机重锚(批末闸 11 判 NEED-APPROVAL 时由用户裁决:批准实跑或裁跳过,卡内不定案)。
## 16. 异常分级
- **L1 自救**:迁移函数编译错、探针断言调用面改址漏改——就地修复重跑最窄确认。
- **L2 记录继续**:实测值与第 7 节预期区间偏离但在同档位内(如降值幅度略小)——记入实现报告「实现决定记录」。
- **L3 停机写报告等用户**:①拆分边界纪律④触发——按职责轴拆不出内聚单元(T1 五段/T3 装板域形态被证伪);②机检预算互斥——新件实数超第 11 节预算或迁移函数现出超标键=上游缺陷停卡退回写卡段;③golden 对拍差异非零;④S13 键恶化或基线外新键;⑤PARITY 触面处置分歧;⑥断言面被下游兜底吸收致判据绑不上(按 test-conventions §8.4 出口呈报)。
## 17. 测试削弱申报(允许改动的旧断言及理由)
零申报——本批不删任何断言、不改判据阈值、不缩扫描面、不把真实入口换成下层直调;唯一新增断言=V3 行〔尾波 V1〕(既有断言零改动)。商店委托面的测试改址归并排卡 v1.1 管辖(其自报零申报——只改调用地址,断言条件与期望值零变化)。未申报的削弱由独立验收审计判红。
## 18. 独立验收审计
合并前由未参与实现的会话或子代理执行;报告落 `reports/iter<N>-验收审计-<日期>.md`。审计至少做四件事(test-conventions §8.7):逐行核对第 13 节对照表(测试存在、真执行、尾缀可 grep、真实入口未绕过改动点);抽查判据绑定面;检查测试削弱(对照第 17 节申报);核对 V4 行「非行为改动」判定依据(零漂移证明是否在当轮真实跑批中成立)。未过不得合并。
## 19. 代拍板白名单(允许 agent 自行拍板的微决策)
1. 迁移函数头注注释的指址微调(词表与语义不动——「指址须真」纪律)。
2. 新件私有 helper 命名在职责语义不变前提下的微调。
3. 断言失败消息尾缀编号分配与措辞(〔尾波 Vn〕系列)。
4. 调用面改址的机械改写(import/preload 顺序、空行排版)。
5. 第 7 节键 1 段函数在五段骨架内的下钻粒度(沿绘制层轴)。
超清单决策记入实现报告「实现决定记录」节。
## 20. 裁决记录重申
D1–D6 已全部裁决闭合(2026-10-29 用户裁,第 6 节):装板域拆新件(两修正)/悬停域不拆/商店域候选 A 并排编队(执行合同=并排卡 v1.1)/断点域不拆/五降值键豁免终局——**零待裁点,卡片可编排**。豁免登记 5 条与既有讨论 5 键合并,批末按实测值经反哺点通道一次落文 architecture。
@@ -1,185 +0,0 @@
# 需求卡片——level_runner 商店委托层拆除批
- 版本:v1.1(2026-10-29,grilling 复核门通过——修正四项:跨类同名扫描判类归属、`_shop` 词级归零判据、set_shop_pool 陈旧调用方陈述订正、测试面精确计数)
- 来源:待办清单「level_runner 商店委托层拆除——迭代 37 冻结契约期过渡件」(2026-10-26 登记,来源=批次移交;需求性工程条目,改动面=游戏代码)
- 执行通道:需求改动——经迭代编排编入迭代后在独立 worktree 施工(仪式归 /iter);本卡估时合计 ≈1.5 个工作日(区间 1.5–2,超 2 停批呈报)
- 迭代号:由编排段落位(本卡 `iter<N>` 占位符届时代换)
## 1. 目标与完成定义
拆除 LevelRunner 的商店同签名委托层(19 个纯转传方法+「冻结公开面」契约注释),全部外部调用方直连 ShopSession;游戏行为零改动。
完成定义(全部满足才算完):
1. level_runner.gd 壳块(:722–728 区块注释涉委托句+:751–828 十九个委托)归零;宿主商店成员以公开名 `shop` 承载取件。
2. 产品码、sim、测试面全部调用点改为 `<runner 表达式>.shop.<方法>` 直连,全仓无旧委托调用残留。
3. 全部单元套件、冒烟、代码域闸绿;现有断言读数逐位不变(零新增断言、零断言删除)。
4. 架构文档同步点入反哺点清单;实现报告与验收审计报告落 `reports/`。
## 2. 设计事实源
跳过设计线的证据指认(需求性工程条目,第〇步核验放行 2026-10-29):
- 待办清单条目实况:委托壳=迭代 37 卡④ ShopSession 拆分时立的「冻结公开面」契约过渡件;架构登记=`design/engineering/architecture/architecture.md:109`「外部调用面由 LevelRunner 同签名委托承载(外部零变化)」。
- 拆除形态权威=`architecture.md:154`「调用直连:不留中间人委托壳(纯转传=Middle Man 反模式,2026-10-26 用户裁定)」。
- 2026-10-29 写卡会话裁决:改址定式四条(公开成员取件/零调用死壳删/测试直连私有面/契约注释随壳消失)+ spend_gp 归属确认非问题(共享冒险钱包的校验扣款原语,宿主 ShopSession 语义自洽、不迁移)。
## 3. 现状事实(代码级,开工自行复核)
委托壳块:
1. level_runner.gd:723–725 区块注释(:723「商店房兑付」节头保留;:724「本类保留同签名委托」句+:725「白盒入口——外部调用面与断点取数面零变化」两句随壳删除)+:751–828 共 19 个同签名转传方法:shop_products:751/current_price:755/purchased_tier:759/buy_product:763/player_request_refresh:767/_spend_discounted:772/set_shop_pool:778/_shop_draw_shelf:783/pool_stock:787/pool_price:791/shop_shelf:795/shop_refresh_free_left:799/shop_refresh_cost:803/shop_refresh:807/spend_gp:811/buy_pool_item:815/is_shop_pool:819/shop_bp_shelf:823/shop_bp_visit_buys:827。
2. 零外部调用方死壳 2 枚:`_spend_discounted`(全库仅 tree_rules_v11_test.gd:6 注释提及)、`pool_stock`(外部同名调用全为 CurioDeck.pool_stock,如 adventure_feats_test.gd:545——同名不同件)。
外部调用面(产品码与 sim):
3. 呈现层:camp_shop_presenter.gd:173–203(12 处)/main_adventure_flow.gd:81–86(6 处)/main_overlay_flow.gd:135/138/main.gd:773(player_request_refresh)/curio_interact_controller.gd:163(spend_gp——奇物三选一付费刷新出账)。
4. sim:level_autoplay.gd:341/350/363/372/418/421(6 处)+:335 注释。
5. 场景 .tscn 零引用、tests/system_test.gd 零引用(2026-10-29 全仓扫描)。**跨类同名方法不属本批面**(残留扫描判类归属的依据):BattleOrchestrator.player_request_refresh(round_flow_skill_pool_test ×5、seal_polarity_test:185、main.gd:775)与 CurioDeck.pool_stock(adventure_feats_test ×3、feat_vouchers_test ×2、pool_case_d_test ×3、level_shop_economy_test:1360/1361)——17 公开名 grep 命中须按接收方类归属判别,禁误改这两处同名面。
外部调用面(测试):
6. level_shop_economy_test.gd 实改址 25+白盒 `_shop_draw_shelf` :1344/:1355(公开名 grep 命中 27,内含跨类同名 `deck().pool_stock` :1360/:1361 非本批面)/hero_ledger_test.gd:60/66/adventure_feats_test.gd:364/pool_case_d_test.gd:45–47(:47=shop_bp_shelf)/treasure_effects_test.gd:229/233/curio_refresh_paid_test.gd:52–54/meta_progression_forge_test.gd:735–740。
保留面(非委托,仅随成员更名):
7. 宿主内部使用:level_runner.gd:99/102/104/305–306/506–507/704/729(建件、pool 注入、断点取数、进离店编排);钱包生命周期 `close_wallet`:718 归宿主自有(写 gp+发 clear 事件,不经商店)。
8. 商店件本体 shop_session.gd 公开面现成(spend_gp:262 等),测试直连其私有 `_draw_shelf`:133/`_spend_discounted`:59 属测试侧改址。
登记与账面:
9. 架构:architecture.md:109(委托承载句+公开面格)/:154(直连原则);`design/` 全目录仅此一处委托登记(grep 考证 2026-10-29)。
10. gdstyle 基线:tools/gdstyle_baseline.txt:11–13——level_runner 三键 max-class-variables=30/max-public-methods=50/max-returns|_enter_node=7。
11. 能力清单:game/tests/README.md 旅程段四「GP 钱包/escrow/商店收口/共享池」行真实入口列引用委托名——已随本卡写作更新为直连形态(写卡段义务,实现批禁写该文件)。
12. shop_session.gd:4 头注「公开面由 LevelRunner 同签名委托承载」句随拆除失效(商店件唯一注释级 diff,见契约 3)。
## 4. 设计契约(违反即返工;🔴=触碰停机呈报)
1. 🔴 直连不留壳:19 个委托全删(含死壳 2 枚),禁保留任何同签名别名/转发/兼容壳;外部取件唯一形态=公开成员 `LevelRunner.shop`(level_runner.gd:44 私有 `_shop` 更名,公开面=成员本身,不设访问器方法)。
2. 🔴 行为零改动:商店双模式定价、货架、RNG 取号序列、钱包账面、事件发射逐项同前;全部现有断言同种子逐位不变;`data/tables`、RngService、ConfigDB 消费零 diff;无数值改动禁跑 MC。
3. ShopSession 行为零改动:shop_session.gd 不改任何可执行行;唯一允许 diff=头注 :4 委托承载句随批更新(非行为)。
4. 测试直连私有面仅限白盒两入口(shop_session `_draw_shelf`/`_spend_discounted`),依据=「测试/探针直连件读写」(architecture.md:152 裁定段);产品码禁直连任何 `_` 前缀私有成员。
5. 拆分边界纪律(判据权威=code-conventions §1.1,本批为拆除/收敛向):本批零拆出新件——结构变化仅壳删除与成员公开化两项;保留单元(LevelRunner 商店房编排段、ShopSession、呈现控制器)职责语句不变;凡「为达标保留的转发别名」按凑计数袋处理,禁。
6. 🔴 禁为机检文本保留无效成员(code-conventions §1.1 同款):机检键与本卡壳删除契约互斥时(如任何键要求公开方法数不得下降),实现段一律停卡呈报,不得自造第三条路。
7. 测试削弱申报:零申报——不删任何断言、不改判据阈值、不缩扫描面;测试只改调用地址。实现期发现必须改判的断言=上游缺陷,停卡退回写卡段。
## 5. 范围边界
做:壳块与死壳删除;`_shop`→`shop` 公开化(含内部引用点);产品码/sim/测试调用点改址;注释同步六处(shop_session.gd:4、level_runner.gd:723–725 区块涉委托两句〔删 :724–725、留 :723 节头〕、level_autoplay.gd:335、shop_overlay_view.gd:88/152、tree_rules_v11_test.gd:6);level_runner 头注涉委托表述随批核查同步。
不做(去向):
1. spend_gp 迁 GpWallet 与三处内联扣账去重——2026-10-29 用户裁「可选微整理、不进本批」;日后要做属游戏代码重构,另立卡走流水线。
2. gdstyle 基线重锚(`python tools/gdstyle_gate.py --refresh` 人工专用)——本批公开方法数自然下降不触发重锚;基线死键清账时机归用户发令(待办清单在册)。
3. architecture.md:109 改写——实现批禁写 `design/`,入反哺点清单(§6)。
## 6. 关联文档同步面
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| design/engineering/architecture/architecture.md | :109 ShopSession 行——「外部调用面由 LevelRunner 同签名委托承载(外部零变化)」句失效;公开面格需随改址后实际对外面重写:补 spend_gp(奇物付费刷新对外出账口)与 current_price/pool_price/purchased_tier/shop_refresh_free_left/is_shop_pool/shop_bp_shelf/shop_bp_visit_buys 等实际被直连方法;set_shop_pool 调用面改述:pool 注入经 LevelRunner 构造 ctx 供给(level_runner.gd:101–102 内部直调 ShopSession.set_shop_pool;原委托块注释「AdventureRunner._start_current_level 唯一调用方」系陈旧表述——全仓 grep 证实产品码零调用方,随壳删除作废),测试面直连 shop.set_shop_pool | 反哺点清单(`reports/iter<N>-反哺点-<日期>.md`),用户裁决后归文档批落文;实现批禁直改 |
其余文档无关联点:GDD 商店/秘宝/天赋树各节机制陈述(扣账口唯一、刷新双源、折价边界、爬价公式)不因调用面搬家而变(grep 考证 2026-10-29)。
## 7. 落位与可复用性预检
- **新增件清点**:零新增文件、零新增函数、零新增数据件。唯一「新增面」=LevelRunner 公开成员 `shop`——更名既有私有成员 `_shop`(level_runner.gd:44),复用既有 ShopSession 实例与 `_bind_shop` 装配(:728),零新装配、零新引用、零新职责。
- **唯一面核查**:grep 19 个方法名全仓——委托职责拆除后调用面唯一落点=ShopSession(第二承载不存在);`_shop_draw_shelf`/`_spend_discounted` 转发壳删除后,白盒入口唯一落点=shop_session 私有方法本体。
- **复用面核查**:不新增任何 helper/访问器——「更名公开」即全部;呈现层持件沿用既有 `_runner_get` 取值回调(camp_shop_presenter.gd:170 现形态),不新引入注入面。
- **分层与交互面**:调用方向不变——views→(信号)→组合根→core;呈现控制器经取值回调持 runner 后以 `runner.shop` 取件(组合根拆件直连=架构「模块归属·呈现层」既有口径);sim 属测量面直构既有惯例;测试直连 core 公开成员+白盒两私有入口(契约 4)。
## 8. 实现规范预算
- **新件三查**:零新增文件——空转。
- **存量触面一查**(level_runner.gd,基线 tools/gdstyle_baseline.txt:11–13):max-public-methods 预期 50→33(删 17 公开委托、增 0;私有委托 2 枚同删不入此数);max-class-variables=30 不变(成员更名不改数);max-returns|_enter_node=7 不变(`_enter_node` 零触碰)。T0 读数步核对「S13 键较登记值只降不升」,基线值本批不动。
- **shop_session.gd**:零可执行行 diff,键面不变。
- **指标例外申报**:无。
## 9. 文件结构图(卡前;全部「复用既有」——零新增件,与 §7 互指)
```
game/core/level_runner.gd 壳块删除+成员公开化+内部引用更名+区块注释【非行为——R2/R3/R4】
game/core/shop_session.gd 仅头注 :4 委托句更新(零可执行行 diff)【非行为——R4】
game/presentation/camp_shop_presenter.gd 调用点改址 12 处【非行为——R1】
game/presentation/main_adventure_flow.gd 调用点改址 6 处【非行为——R1】
game/presentation/main_overlay_flow.gd 调用点改址 2 处【非行为——R1】
game/presentation/main.gd 调用点改址 1 处【非行为——R1】
game/presentation/curio_interact_controller.gd 调用点改址 1 处【非行为——R1】
game/presentation/views/shop_overlay_view.gd 注释同步 2 处【非行为——R4】
game/sim/level_autoplay.gd 调用点改址 6 处+注释 1 处【非行为——R1/R4】
game/tests/unit/core/level_shop_economy_test.gd 改址 25+白盒 2(grep 全量核对)【非行为——R1】
game/tests/unit/core/hero_ledger_test.gd 改址 2 处【非行为——R1】
game/tests/unit/core/adventure_feats_test.gd 改址 1 处【非行为——R1】
game/tests/unit/core/pool_case_d_test.gd 改址 3 处【非行为——R1】
game/tests/unit/core/treasure_effects_test.gd 改址 2 处【非行为——R1】
game/tests/unit/core/curio_refresh_paid_test.gd 改址 3 处【非行为——R1】
game/tests/unit/core/meta_progression_forge_test.gd 改址 3 处【非行为——R1】
game/tests/unit/core/tree_rules_v11_test.gd 头注同步 1 处【非行为——R4】
```
## 10. 任务卡 T0..T2
施工遵循闸机轮次纪律:里程碑步(T1)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试/工具先行孤立验证再并入全套。
### T0 调用面直连(壳仍在位——中间态全绿) 估时 0.5–1 个工作日
- 取用:—(首批)。
- 产出:全部调用点 `*.shop.*` 直连形态(壳在位,行为零改动的中间态);T1 依赖「删壳后零编译错」以本产出为完整性基线。
- [ ] level_runner.gd:44 成员更名 `var shop: ShopSession`(行注释同步),内部引用 :99/:102/:104/:305–306/:506–507/:704/:729 全部随更名;核查=grep `_shop`(词级)于 level_runner.gd 仅剩保留件 `_bind_shop`(:65/:104/:728——宿主回调装配面,非委托)
- [ ] 产品码改址六件(形态=`<runner 表达式>.shop.<方法>`,方法名与实参逐字不变):camp_shop_presenter.gd:173–203/main_adventure_flow.gd:81–86/main_overlay_flow.gd:135/138/main.gd:773/curio_interact_controller.gd:163/shop_overlay_view.gd:88/152 仅注释
- [ ] sim 改址:level_autoplay.gd:341/350/363/372/418/421+:335 注释
- [ ] 测试面改址七件:level_shop_economy_test.gd(grep 全量核对;白盒 :1344/:1355 改 `r8.shop._draw_shelf()`)/hero_ledger_test.gd:60/66/adventure_feats_test.gd:364/pool_case_d_test.gd:45–47(:46 改 `lr.shop._draw_shelf()`、:47 改 `lr.shop.shop_bp_shelf()`)/treasure_effects_test.gd:229/233/curio_refresh_paid_test.gd:52–54(`lr.shop.spend_gp(...)`)/meta_progression_forge_test.gd:735–740(`lr.shop.current_price(...)`)
- [ ] 注释同步:tree_rules_v11_test.gd:6 头注 `level_runner._spend_discounted`→`shop_session._spend_discounted`;level_autoplay.gd:335 注释调用名同步
- [ ] 验证:`python tools/run_smoke.py` 绿;单元与集成 `--script res://tests/run_all.gd` 全绿(中间态=直连可编译可过+行为零改动初证);level_runner 三键读数核对只降不升(§8 预期值)
### T1 壳拆除与完整性证明 估时 0.5 个工作日
- 取用:T0 全调用点直连形态在位。
- 产出:终态 level_runner(壳归零);T2 的闸与审计对象。
- [ ] 删除 level_runner.gd:723–725 区块注释中涉委托与白盒两句(:724–725;保留 :723「商店房兑付」节头与 :727 件注入说明)+:751–828 十九个委托全量(含死壳 `_spend_discounted`:772/`pool_stock`:787)
- [ ] shop_session.gd:4 头注委托承载句更新(「外部调用面=调用方经宿主公开成员 `shop` 直连」表述)
- [ ] 验证:`python tools/run_smoke.py` 绿+全单元套件绿(壳删后绿=T0 改址无遗漏的编译级证明)
- [ ] 残留扫描:grep 19 个方法名于 `game/`(排除 shop_session.gd 本体定义、level_runner.gd 内部 `shop.` 使用点、跨类同名方法——BattleOrchestrator.player_request_refresh 与 CurioDeck.pool_stock 按现状事实 5 清单判接收方类归属)——产品码与测试面零命中,输出留实现报告
- [ ] 注释收尾核查:level_runner 头注涉委托表述已同步(§5 做项)
- [ ] 里程碑出口:`tools/run_all_gates.sh --code` 全绿、回执落 `game/tests/.gates/receipt.json`
### T2 收口(产出物落位卡) 估时 0.5 个工作日
- 取用:T1 终态(壳归零、套件绿、回执在盘)。
- 产出:三份过程件+合回呈报。
- [ ] 反哺点清单 `reports/iter<N>-反哺点-<日期>.md`:§6 表逐条落点——architecture.md:109 ShopSession 行改写内容全文随单;无其他落点
- [ ] 实现报告 `reports/iter<N>-实现报告-<日期>.md`:各卡状态+实现决定记录+实机目检总清单(本批零玩家可观测改动——写明「无新增目检项」)+遗留读数义务(无)+残留扫描输出留痕
- [ ] 独立验收审计 `reports/iter<N>-验收审计-<日期>.md`:未参与实现的会话或子代理执行(test-conventions §8.7 四事);审计在迭代 loop 内启动的子代理算 loop
- [ ] 审计通过后呈报用户合回(worktree-guard 按 diff 文件性质推域校验回执;审计判红→修复→出红最小单元最窄确认→闸重跑)
- [ ] 批后收尾(待办条目整条删除、roadmap 换代)归 batch-closure——不在本卡任务内,此处仅登记去向
## 11. 验证闸(改动—验收对照表)
本卡零新增断言——对照表全行由既有断言与静态扫描承接,无〔卡短名 Vn〕尾缀需求。
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| R1 调用面直连改址(非行为改动——调用目标/实参/返回/副作用逐项同前,仅取件路径文本变化) | §9 结构图产品码 6 件+sim 1 件+测试 7 件全部调用点 | 既有套件回归两轮全绿:T0 中间态轮+T1 壳删后轮(level_shop_economy/hero_ledger/adventure_feats/pool_case_d/treasure_effects/curio_refresh_paid/meta_progression_forge 全套+冒烟) | 单元+接口 | 各套件既有真实入口(直构 LevelRunner/AdventureRunner 链) | 既有断言逐位不变(行为零改动正向证据)+壳删后编译通过(改址无遗漏) | 既有:GP 钱包/escrow/商店收口/共享池;既有:奖励三选一候选/刷新付费/呈现 |
| R2 壳块拆除(非行为改动——纯转传方法与契约注释删除,行为承载在 ShopSession 不变) | level_runner.gd:723–725 区块涉委托两句(:724–725)+:751–828(含死壳 `_spend_discounted`:772/`pool_stock`:787) | 残留扫描零命中(T1 静态步)+T1 套件绿 | 静态+单元 | grep 全仓(19 方法名清单固定)+套件真实入口 | 扫描面>0 前置(grep 命令对 19 名单非空可执行)+壳删后零引用可编译;命中行按接收方类归属判别(现状事实 5 跨类同名清单) | 既有:GP 钱包/escrow/商店收口/共享池 |
| R3 宿主成员公开化(非行为改动——私有 `_shop` 更名公开 `shop`,装配与读写路径不变) | level_runner.gd:44+内部引用 :99/:102/:104/:305–306/:506–507/:704/:729 | 随 R1 两轮套件绿 | 单元 | 套件真实入口 | 同 R1(内部使用点行为不变) | 既有:GP 钱包/escrow/商店收口/共享池 |
| R4 注释同步六处(非行为改动——注释文本,无运行时可观测面) | shop_session.gd:4/level_runner.gd:722–724/level_autoplay.gd:335/shop_overlay_view.gd:88/152/tree_rules_v11_test.gd:6 | 随批代码域闸绿(静态扫描覆盖文件头纪律面) | 静态 | —(静态判据) | 观测面局限申报:注释无运行时提交面,判据=静态扫描+评审注记 | 既有:GP 钱包/escrow/商店收口/共享池 |
## 12. 异常分级
- **L1 自救**:更名/改址漏点编译错→就地补改后重跑最窄确认(冒烟或单套件)。
- **L2 记录继续**:套件出红且根因属本批改址笔误→出红最小单元最窄确认修复+实现报告记录;连续 3 次同红灯升级 L3。
- **L3 停机呈报**:①出红根因=上游缺陷(非本批改动所致)→停卡退回写卡段;②机检键与本卡契约互斥(如需保留壳/别名才达标)→停机呈报,禁自造第三条路(机检预算互斥条款);③改址中发现任何行为差异(同种子读数漂移)→立即停批(行为零改动契约被打破);④ShopSession 需要可执行行改动才能达成改址→停机呈报(契约 3 被打破)。
## 13. 代拍板白名单
1. 注释措辞与所在行随改址微调(不改语义)。
2. 测试内局部变量随调用链展开的机械适配(不改断言判据)。
3. 残留扫描的 grep 命令形态与输出留痕方式(实现报告正文承载)。
4. level_runner 头注与区块注释涉委托表述的同步措辞。
5. 单元套件运行的分批执行方式(闸机轮次纪律内的最窄确认选择)。
超白名单的微决策记入实现报告「实现决定记录」节。
## 14. 待裁点
零待裁点,开工门=U0。(改址定式与 spend_gp 归属均经 2026-10-29 会话裁决,见 §2。)
+4 -4
View File
@@ -5,8 +5,8 @@
## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照)
- **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。
- **迭代位**:迭代 1–41 全部已完成——迭代 41 两卡(核心数据面结构收敛批+呈现层结构收敛批)2026-10-29 合回(合并提交 eb9bb537,测试特许移交+用户裁直接合回),同日完成批后收尾(反哺点落文+产出物退役+账面换代)。
- **下一步**:待编池:营地交互重做卡⑤(排卡④之后)、卡④(已退回美术设计段,美术设计闭合后重立卡)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。批后可裁事项:gdstyle 基线 152 死键 refresh 清账(`python tools/gdstyle_gate.py --refresh`,待办清单在册)——用户发令时机。
- **迭代位**:迭代 1–42 全部已完成——迭代 42 两卡(gdstyle 尾波清偿批+level_runner 商店委托层拆除)2026-10-29 合回(合并提交 65dff22f),2026-10-30 完成批后收尾(反哺点 1 落文 architecture v1.26、反哺点 2 被零豁免裁决消解;产出物退役+账面换代;PARITY 对拍漂移与批末小件已移交待办清单)。迭代 43(战斗一屏样张批)已合回(合并提交 3b66d1a6)——批后收尾未做。
- **下一步**:迭代 43 批后收尾(反哺点 13 条落文核对→产出物退役→账面换代,batch-closure 承接;迭代 43 行状态仍记待开工,随收尾订正);随后迭代 44 待开工(组合根注册面+战斗编排归约+测速循环三卡,编队前置=迭代 42 合回已满足)。待编池:营地交互重做卡⑤(排卡④之后)、卡④(已退回美术设计段,美术设计闭合后重立卡)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。批后可裁事项:gdstyle 基线 refresh 收账随零豁免各批合回一次人工 `--refresh --force`(待办清单在册)。
## 里程碑时间线
@@ -75,7 +75,7 @@
| 迭代 39 | 已完成(2026-10-27) | 已退役(git 历史可考) | 2026-10-26 | ≈10.15 个工作日〔用户特批 2026-10-26 超 10 个工作日〕 | 已退役(git 历史可考) |
| 迭代 40 | 已完成(2026-10-28) | 已退役(git 历史可考) | 2026-10-27 | ≈6.375 个工作日 | 已退役(git 历史可考) |
| 迭代 41 | 已完成(2026-10-29) | 已退役(git 历史可考) | 2026-10-27 | ≈13.15 个工作日〔用户特批 2026-10-27 超 10 个工作日〕 | 已退役(git 历史可考) |
| 迭代 42 | 进行中 | reports/需求卡片-gdstyle尾波清偿批-2026-10-29.md<br>reports/需求卡片-level_runner商店委托层拆除-2026-10-29.md | 2026-10-29 | ≈5.375 个工作日 | — |
| 迭代 42 | 已完成(2026-10-29) | 已退役(git 历史可考) | 2026-10-29 | ≈5.375 个工作日 | 已退役(git 历史可考) |
| 迭代 43 | 待开工 | reports/需求卡片-战斗一屏样张批-2026-10-28.md | 2026-10-29 | ≈6.5 个工作日 | — |
| 迭代 44 | 待开工 | reports/需求卡片-组合根注册面批-2026-10-29.md<br>reports/需求卡片-战斗编排归约批-2026-10-29.md<br>reports/需求卡片-测速循环批-2026-10-29.md | 2026-10-29 | ≈7.875 个工作日 | — |
| 迭代 45 | 待开工 | reports/需求卡片-呈现层状态件批-2026-10-29.md<br>reports/需求卡片-gdstyle尾波补件批-2026-10-29.md | 2026-10-29 | ≈7 个工作日 | — |
@@ -83,7 +83,7 @@
- 迭代 38 收口为带红合并〔用户特批 2026-10-26〕:09 静态扫描 S13 gdstyle 恶化 2 条经批准记入基线存量红(git 提交 c4c69701),卡② 停卡退上游,处方已于 2026-10-26 修订定稿 v1.3(git 提交 b3ea7532),随「gdstyle 存量债全量清偿」条目波 7 待编排。
- 迭代 39 收口为带红合并〔用户特批 2026-10-27〕:02 EV 锚 goblin 0.9148∉[1.00,1.20](触发器批有意行为改动,fp f74b9a48ef4a)已随 EV 锚重锚批换带归绿(git 提交 ba5105aa);08d 生涯.md:55 行号漂移已随 2026-10-28 批后收尾反哺落文修复归绿。三卡拆分后终局 gdstyle 恶化 2 条(battle_orchestrator max-file-length、level_map_screen max-class-variables)归迭代 40 卡①还债与迭代 41 存量债序列。
- 迭代 40 收口为用户特许免闸直合〔2026-10-28〕:全量域验收回执未取得(回执环节断于用户特许,验收审计报告如实记档不作绿报;独立审计结论=通过,F1 一行修 iter40 8a319369 先行入库)。卡① 契约 2 宿主行数残余债(实测 1036 行,合并适配带入 36 行)经用户裁登记归后续批清偿(待办清单「战斗域结构深拆批」条目承载);09 存量红剩 level_map_screen 类变量一条归迭代 41 卡③。
- 迭代 41 收口为测试特许移交+用户裁直接合回〔2026-10-28/2026-10-29〕:全部套件与闸停跑(gdstyle 结构闸除外——开发期读数反馈在跑),验收断言、golden 对拍与独立验收审计一并移交用户执行,2026-10-29 用户裁直接合回(合并提交 eb9bb537);golden 改前锚未建让步与四项实机目检已迁体验验证清单 ㊵;gdstyle 基线 152 死键 refresh 待用户发令(待办清单在册)。
- 迭代 41 收口为测试特许移交+用户裁直接合回〔2026-10-28/2026-10-29〕:全部套件与闸停跑(gdstyle 结构闸除外——开发期读数反馈在跑),验收断言、golden 对拍与独立验收审计一并移交用户执行,2026-10-29 用户裁直接合回(合并提交 eb9bb537);golden 改前锚未建让步与四项实机目检已迁体验验证清单 ㊵;gdstyle 基线 152 死键 refresh 已执行(2026-10-29 人工重锚 168→16 键,git 提交 fafb4fee)。
- 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。
- 「已退役(git 历史可考)」= 需求卡片或实现报告曾存在,已按「证据只留最新」退役;已完成迭代的实现报告列只填 reports/ 现存路径或本保留字,不填「—」。
- 新迭代行的编排与各列判据见 doc-conventions §12.2 与 iter-plan 技能,由流水线闸(`tools/pipeline_gate.py`)机检。
+24 -17
View File
@@ -2,6 +2,29 @@
本清单是流水线的唯一登记处:要做的事先在此登记一条,随流水线段推进改状态,做完整条删除;各系统文档的「待办」节只留一行指路存根,不再自建条目。条目格式(标题=登记元数据含可选优先级,正文=实况/缺口/改动面/状态四属性)与状态机以 [doc-conventions §12.1](design/engineering/doc-conventions.md) 为权威。
#### PARITY 对拍锚漂移查因与重锚——迭代 40/41 特许合回存量(2026-10-30 登记,来源=批次移交)
**实况**:证据=迭代 42 实现报告 §5-8/§6-5(已按吸收即死退役,git 历史可考)。gate 11 回放确定性对拍锚(tools/parity_anchor.py,2026-10-26 冻结)与现行全冒险重放在 base/attune/shop 三变体全部逐位漂移(RUNSUM 40 行全异+JSONL 行数级差异,如 base/normal 锚 9216 行 vs 今 9221 行);master 原状(ee4efad5)单独对拍 base 变体同值复现(漂移指纹 8a81884efe51/afc8c07c1bf3)=漂移系迭代 40/41 特许合回的存量(两批合并时全量闸停跑、对拍从未执行),迭代 42 在其上零新增漂移。取证件 game/tests/.gates/parity.log(终闸实跑);归因实验记录见批次提交史。gate 11 现状=baseline.json 记 SKIP——漂移指纹按迭代 42 用户裁决有意不记入基线(该指纹形态下任何未来对拍失败同指纹不可区分,记入即全量放行后续漂移)。待用户裁决=漂移的查因(定位迭代 40/41 哪笔改动改变了回放输出)与锚重制(tools/parity_anchor.py freeze)——锚重制须用户批准、禁实现批借机自办;迭代 44/45 各卡触 battle_orchestrator(PARITY 触面),闸 11 将反复记 NEED-APPROVAL,宜在迭代 44 开工前裁决。
**改动面**:游戏代码+工具代码
**状态**:待执行
#### 迭代 42 批末移交小件——工具与注释四条(2026-10-30 登记,来源=批次移交)
**实况**:证据=迭代 42 实现报告 §5-1/§5-5/§5-6 与验收审计报告表述性瑕疵 3/4(已按吸收即死退役,git 历史可考)。逐条:
| # | 事项 | 要点 |
|---|---|---|
| 1 | run_all.gd --only 逗号形态解析缺陷 | 头注文档形态 `--only=<词[,词…]>` 与闸脚本传参形态(tools/run_all_gates.sh 关联档选跑逗号拼接单旗标)自 6caf56b5 起与解析不符——整串当一个词对套件路径做子串匹配,多词必零命中 quit(2);修法二选一:run_all.gd 补逗号拆分,或闸脚本改逐词重复 `--only=` 传参(迭代 42 施工曾以逐词重复形态绕过) |
| 2 | 坑速查补条 | .zcode/skills/iter/SKILL.md「坑速查」节补条:worktree 冷检出 --editor --quit 首跑 --path 误指仓库根(未建 .godot 类缓存致首跑解析红),改指 game 切片目录重刷后正常 |
| 3 | level_runner.gd:12 node_entered 信号注释陈旧 | 注释 `shop={gp}` 与 pool 态实际载荷 `{gp, shelf:true}` 不符(迭代 42 改动前即如此,本批未触载荷) |
| 4 | static_scan.sh S8 ok 消息陈旧字面量 | :337「扫描面 B1 文件集 9 个 .gd」——S8_FILES 实含 10 文件(board_installer.gd 随迭代 42 入集),扫面无缩小,仅消息文本过期 |
**改动面**:游戏代码+工具代码
**状态**:待执行
#### 架构审查优化讨论——全库架构审计读数的逐条裁决与整改分批(2026-10-29 登记,来源=审计发现)
**实况**:2026-10-29 全库架构静态审计完成,读数见 reports/审计-全库架构审查-2026-10-29.md(七节:总评/健康面/P0/P1/P2/待裁点/取证口径;零测试执行零引擎运行,全部结论带 文件:行号)。健康面已逐条核干净:Core 零 UI 八项判据全零命中、core 内 RNG 单点 100% 成立、字符串式信号连接全库 0 处、core 层零超长函数、19 表 ↔ 19 schema 一一对应、无循环 preload。问题集中在三条「写了没闸守」的纪律被实际破坏:①数值单一事实源被 18 处硬编码击穿,最危险两处是 `presentation/main.gd:787` 与 `:790` 把 `rap_refresh_cost=8` 与 `refresh_cap_per_round=2` 写死进提示文案(紧邻 783 行是正确读表的),表改文案不改、玩家直接受错误数字;另有 4 组代码自标「机制结构常量/产出约束」的字面量(`node_map_generator.gd:12` `MAX_WIDTH`、`action_economy.gd:14` `CHARGE_LAYER_CAP`、`board_data.gd:9` `SPAWN_AREA_CELLS`、`node_map_generator.gd:83-94` 域字面量)是否入表待裁。②`game/sim/` 与 `game/core/` 四组平行实现——扫雷推理引擎双份(`board_generator.gd` `measure_inferability` 族 vs `auto_player.gd` `_deduce` 族,输入集口径不同:前者含 safe_set oracle、后者 no-peek)、伤害掷点期望重算(`damage_probe.gd:196-201`)、档位排序与驱动循环双份(`level_autoplay.gd` vs `treasure_item_table.gd:44` 与 `battle_driver.gd:17`)、FakeDB 伪造表喂生成器——直接威胁「模拟读数 = 游戏真实数值」这一数值验证前提。③RNG 单点纪律在 core 外失守(sim 4 处/probe 1 处/tests 3 处自建 `RandomNumberGenerator`,均显式定种、确定性尚存),而 `static_scan.sh` 的 S1/S2 扫描面只含 `DIR_CORE` + `DIR_PRES`。守卫面另有三缺口:S8 是 9 文件显式清单(新增结算文件忘登记=静默不扫,缺位自检只防删改不防增)、S9 类型闸与 S13 质量闸扫描面止步于 core+data+presentation(sim/probe/tests 三层除 S11/S12 外零闸)、S13 三处豁免常态化到最大户文件(`battle_orchestrator`/`main.gd`/`tune_sim_controller`);另有四个 core 文件零测试点名(`attune_loadout`/`battle_fx_host`/`meta_state_store`/`slot_store`)。P2 级:`core/settlement/` 五段类直读写编排器私有成员 20+ 处(`oc._damage.*`/`oc._enemy_system.*`,GDScript 无编译期检查、改名静默断裂);架构文档三处漂移(`architecture.md:110` 登记的 `core/hero_ledger.gd` 盘上不存在且 `hero_ledger_test.gd:171` 显式断言它必须不存在、`:135` 行数过期、EC8 热重载门后 `ConfigDb.reload()` 零调用方且走 `load()` 拿不到磁盘新值);class_name 级双向依赖(`core/config_db` → `data/schemas/board_gen_table` → `core/board_data.SPAWN_AREA_CELLS`)与 `NODE_TYPES` 词表双份;`MetaProgression` 是唯一用 `get_node("/root/...")` 取依赖、唯一跨 Autoload 直调的单例。
@@ -67,14 +90,6 @@
**状态**:待执行
#### gdstyle 尾波清偿批——基线余量 11 键定向整改(2026-10-29 登记,来源=审计发现)
**实况**:证据=`tools/gdstyle_baseline.txt`(2026-10-29 人工重锚后余量 16 键)+reports/审计-gdstyle存量债清点与清偿方案-2026-10-26.md(§三波次方案与 §六文档设计段裁定记录,裁定全部继续有效)。迭代 39/40/41 三批清偿后余 16 键:本批承接 11 键——board_view 6(_paint_cell 长度 139/分支 24/局部 22、循环内 new、类变量 32、公开方法 27)/level_runner 3(公开方法 50、类变量 30、_enter_node 返回 7)/battle_orchestrator 文件长 1035/adventure_runner 类变量 28;另 5 键走豁免通道另行讨论不在本批(main.gd 类变量 49、tune_sim_controller 循环内 await、board_cell_unit 类变量 30、standee_body 类变量 19、battle_orchestrator 类变量 38——其中三条已有架构豁免登记)。需求卡片 v2.0 定稿(零待裁点):reports/需求卡片-gdstyle尾波清偿批-2026-10-29.md 设计段裁决 2026-10-29 用户裁闭合(D1 装板域拆新件 BoardInstaller 两修正·architecture v1.24 轴丙已落文/D2 悬停域不拆/D3 商店域候选 A/D4 断点域不拆/D5 五降值键豁免终局/D6 商店域并排编队——执行合同=并排卡「level_runner 商店委托层拆除」v1.1,本卡不重复执行),零待裁点。预期两档:归绿 6 键(_paint_cell×3、循环内 new、_enter_node、文件长);豁免终局 5 键(board_view 32/27、level_runner 50→33/30、adventure 28——批末按实测值落 architecture 豁免登记,键 7 实测值视并排卡时序)。本卡估时 3–4.25 工作日(并排卡 ≈1.5 工作日另计)。MC/数值零触碰(结构整改不改数值与 RNG 消费序);battle_orchestrator 触 PARITY_TOUCH_FACES——实跑对拍须经用户批准、不得借机重锚。S13 键账对账在批末,基线重锚由用户发令人工 --refresh(预期降幅逾 10% 须 --force)。2026-10-29 用户再裁(零豁免延伸):D5 五降值键改留债——本卡批末「落 architecture 豁免登记」步骤**不执行**(键留基线冻结禁恶化、不落豁免登记);D2 悬停域与 D4 断点域改判拆件,由新条目「gdstyle 尾波补件批」承接(需求卡片已写),本卡对应任务不施工。
**改动面**:游戏代码
**状态**:文档设计已闭合+已写卡+已编迭代 42
#### gdstyle 尾波补件批——悬停域与断点域拆件(2026-10-29 登记,来源=会话提及)
**实况**:尾波卡 v2.0 裁去的 D2/D4 两拆件项经用户再裁恢复(2026-10-29,零豁免延伸+D5 留债)。设计闭合凭据=architecture.md v1.25(呈现层表 board_hover 行/核心层表 breakpoint_store 行/「冒险域拆分」节随动句)。需求卡片:reports/需求卡片-gdstyle尾波补件批-2026-10-29.md(v1.0 定稿零待裁点)。范围:board_view 拆 board_hover(11 函数族+2 成员,`_r0` 留宿主)+adventure_runner 拆 breakpoint_store(6 成员+`BREAKPOINT_FIELDS` 27 键冻结函数族,`resume_adventure` 留宿主薄壳)。键账预期:board_view 类变量 32→约30、公开方法 27 持平、adventure_runner 类变量 28→约22——三键**留债**(键留基线冻结禁恶化、禁落豁免登记)。编队:待迭代 42 合回后编入;与呈现层状态件批同代时其先行(u.st 写入面改型后 hover 拆件在新面上施工)。估时 2.5–3.5 工作日。
@@ -93,7 +108,7 @@
- 测速循环批 reports/需求卡片-测速循环批-2026-10-29.md
- 战斗编排归约批 reports/需求卡片-战斗编排归约批-2026-10-29.md(接收方=在册条目「战斗域结构深拆批」宿主瘦身子项,不在本条目记账)
编队待迭代 42 合回(battle_orchestrator/board_view 触面碰撞约束),具体迭代归属归编排段;编入前置=各卡过 grilling 复核门。gdstyle inner-class 计数截断缺陷已在册(architecture v1.25)——基线登记值欠估,各批按真实口径施工;各批全部合回后一次人工 --refresh --force 收账。2026-10-29 编排(用户裁编法):卡 A 组合根注册面批+卡 B 战斗编排归约批+卡 D 测速循环批编入**迭代 44**(≈7.875 个工作日,中值合计);卡 C 呈现层状态件批编入**迭代 45**(与补件批同批,卡 C 先于其 board_hover 半边施工)。grilling 复核门已过(reports/复核-grilling-零豁免五卡-2026-10-29.md,五卡有条件成立、修正全落,提交 9855bf0a)。
编队待迭代 42 合回(battle_orchestrator/board_view 触面碰撞约束),具体迭代归属归编排段;编入前置=各卡过 grilling 复核门。gdstyle inner-class 计数截断缺陷已在册(architecture v1.25)——基线登记值欠估,各批按真实口径施工;各批全部合回后一次人工 --refresh --force 收账(一并清迭代 42 归绿 6 键离账——批末实测已归绿而基线仍记 16 键:board_view 四键+level_runner `_enter_node`+battle_orchestrator 文件长;各留债键按重锚时实测重登记,冻结禁恶化口径不变)。2026-10-29 编排(用户裁编法):卡 A 组合根注册面批+卡 B 战斗编排归约批+卡 D 测速循环批编入**迭代 44**(≈7.875 个工作日,中值合计);卡 C 呈现层状态件批编入**迭代 45**(与补件批同批,卡 C 先于其 board_hover 半边施工)。grilling 复核门已过(reports/复核-grilling-零豁免五卡-2026-10-29.md,五卡有条件成立、修正全落,提交 9855bf0a)。
**改动面**:游戏代码
@@ -127,14 +142,6 @@
**状态**:待文档设计+已写卡+已编迭代 44
#### level_runner 商店委托层拆除——迭代 37 冻结契约期过渡件(2026-10-26 登记,来源=批次移交)
**实况**:证据=迭代 37 卡④ ShopSession 拆分时立「冻结公开面」契约,level_runner 保留 buy_product/shop_refresh 等同签名委托方法(架构模块表登记为「外部调用面由宿主同签名委托承载」)。2026-10-26 AdventureRunner 真拆分设计会话裁定新原则:纯转传委托=Middle Man 反模式,新件一律调用方直连不留壳(godot-master 技能库审查同判);本批不动该委托层(真拆分条目范围仅撤 8 条白盒转发属性),其拆除与调用文件改址由本条承接。需求卡片:reports/需求卡片-level_runner商店委托层拆除-2026-10-29.md(v1.1,2026-10-29,复核门通过零待裁点)。
**改动面**:游戏代码
**状态**:已写卡+已编迭代 42
#### 超预算图策略升级路径——等比缩放与滚动视口两案待裁(2026-10-24 登记,来源=批次移交)
**实况**:迭代 34 卡④(信息迷雾可见性批,已合回 master,提交 16a7ec80)按「参数限图」交付,图包络约 10 层×8 槽即当前冻结画布的屏预算上限。若后续定值批需要更大的完整可见图,两条升级路径都要动冻结件,均未设计:①等比缩放——动「节点图标 20px 烘焙 1:1」与「通道折线冻结 2/3/4px」两条冻结值;②滚动视口——新增视口交互范式。迭代 35 生成图实测深度域 L3 达 0–13,已超出该上限(level-map 已登记随动缺口,本批不裁方案)。