From 04127485f69db461ea15327c5c106b3ebd5a3c0a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 29 Oct 2026 04:33:33 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E7=99=BB=E8=AE=B0(=E5=B0=BE=E6=B3=A2?= =?UTF-8?q?=E6=B8=85=E5=81=BF=E6=89=B9):=20=E9=9C=80=E6=B1=82=E5=8D=A1?= =?UTF-8?q?=E7=89=87v1.0=E8=8D=89=E7=A8=BF=E8=90=BD=E7=9B=98=E2=80=94?= =?UTF-8?q?=E2=80=94S13=E5=9F=BA=E7=BA=BF=E9=87=8D=E9=94=9A=E5=90=8E11?= =?UTF-8?q?=E9=94=AE=E5=AE=9A=E5=90=91=E6=B8=85=E5=81=BF(board=5Fview=206/?= =?UTF-8?q?level=5Frunner=203/battle=5Forchestrator=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E9=95=BF/adventure=5Frunner=E7=B1=BB=E5=8F=98=E9=87=8F),?= =?UTF-8?q?=E5=BD=92=E7=BB=BF6=E9=99=8D=E5=80=BC5=E4=B8=8D=E6=89=BF?= =?UTF-8?q?=E8=AF=BA=E6=B8=85=E9=9B=B6;=E5=9B=9B=E6=8B=86=E4=BB=B6?= =?UTF-8?q?=E9=A1=B9(=E8=A3=85=E6=9D=BF=E5=9F=9F/=E6=82=AC=E5=81=9C?= =?UTF-8?q?=E5=9F=9F/=E5=95=86=E5=BA=97=E5=9F=9F/=E6=96=AD=E7=82=B9?= =?UTF-8?q?=E5=9F=9F)=E5=A4=87=E9=80=89=E6=A1=88=E5=B9=B6=E5=88=97?= =?UTF-8?q?=E5=BE=85=E8=AE=BE=E8=AE=A1=E6=AE=B5=E8=A3=81=E5=86=B3D1-D6,?= =?UTF-8?q?=E7=BC=96=E5=85=A5=E8=BF=AD=E4=BB=A3=E5=89=8D=E7=BD=AE=3D?= =?UTF-8?q?=E5=BE=85=E8=A3=81=E7=82=B9=E6=B8=85=E9=9B=B6;=E5=8F=91?= =?UTF-8?q?=E7=8E=B0ShopSession=E4=BB=B6=E5=B7=B2=E5=9C=A8=E4=BD=8D(?= =?UTF-8?q?=E8=BF=AD=E4=BB=A337=E5=BB=BA),=E5=95=86=E5=BA=97=E5=9F=9F=3D?= =?UTF-8?q?=E5=88=A0=E5=A7=94=E6=89=98=E5=A3=B3,=E4=B8=8E=E5=9C=A8?= =?UTF-8?q?=E5=86=8C=E6=9D=A1=E7=9B=AE=E3=80=8C=E5=95=86=E5=BA=97=E5=A7=94?= =?UTF-8?q?=E6=89=98=E5=B1=82=E6=8B=86=E9=99=A4=E3=80=8D=E5=90=8C=E9=9D=A2?= =?UTF-8?q?(D6=E5=B9=B6=E6=A1=88/=E5=89=94=E9=99=A4=E5=BE=85=E8=A3=81);?= =?UTF-8?q?=E8=83=BD=E5=8A=9B=E6=B8=85=E5=8D=95=E5=90=8C=E6=89=B9=E5=85=A5?= =?UTF-8?q?=E3=80=8C=E6=A3=8B=E7=9B=98=E6=82=AC=E5=81=9C=E5=8F=8D=E9=A6=88?= =?UTF-8?q?=E3=80=8D=E8=A1=8C(=E5=86=99=E5=8D=A1=E5=90=8C=E6=89=B9?= =?UTF-8?q?=E4=B9=89=E5=8A=A1,=E6=B5=81=E6=B0=B4=E7=BA=BF=E9=97=B8?= =?UTF-8?q?=E8=83=BD=E5=8A=9B=E8=A1=8C=E5=8F=AF=E6=A0=B8);=E5=BE=85?= =?UTF-8?q?=E5=8A=9E=E6=B8=85=E5=8D=95=E6=96=B0=E5=A2=9E=E6=9D=A1=E7=9B=AE?= =?UTF-8?q?(=E7=8A=B6=E6=80=81=3D=E6=96=87=E6=A1=A3=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E4=B8=AD=EF=BC=8B=E5=BE=85=E5=86=99=E5=8D=A1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/README.md | 1 + .../需求卡片-gdstyle尾波清偿批-2026-10-29.md | 308 ++++++++++++++++++ 待办清单.md | 10 + 3 files changed, 319 insertions(+) create mode 100644 reports/需求卡片-gdstyle尾波清偿批-2026-10-29.md diff --git a/game/tests/README.md b/game/tests/README.md index 8517ec9f..8679d774 100644 --- a/game/tests/README.md +++ b/game/tests/README.md @@ -124,6 +124,7 @@ tests/ | 结算明细带逐行呈现与排播节奏 | HUD框架 | `BattleLogView.append_row()`/`RowPacer.pace_delay_for()` | `theme_projection_test.gd:_smoke_battle_log_view`;`player_copy_sweep_test.gd:_sweep_source_names`;`pacing_queue_test.gd:_init` | | 模态覆盖层编排与输入锁 | HUD框架 | `ModalFlow.locks_input()`/`ModalFlow.open_after_playback()` | `modal_flow_test.gd:_init`;`reward_overlay_test.gd:_run` | | 未开格类型微光(8 邻作用集/五组色相/零玩法写入) | HUD框架 | `BoardView.type_glow_probe()`/`UiKit.glow_group_for_cell_type()` | `theme_projection_test.gd:_smoke_type_glow`;`type_glow_test.gd:_test_grouping_closed`;`type_glow_test.gd:_test_frozen_hue_face` | +| 棋盘悬停反馈(三语义光标/目标格边框/路径预览点迹) | HUD框架 | `ui_input_probe` 合成鼠标事件→`BoardView._gui_input()`;读面 `BoardView.hover_probe()` | `ui_input_probe.gd:_ready`(case①到达②禁入③路径预览三语义) | | UI 全局主题与按钮五态(含对比度锚) | HUD框架 | `UiKit.button()`/`UiKit.primary_button()` | `theme_projection_test.gd:_smoke_global_theme`;`theme_projection_test.gd:_smoke_button_five_states`;`theme_projection_test.gd:_smoke_contrast_inks` | | 中文字体随包与字形覆盖 | HUD框架 | `UiKit.load_font()` | `ui_font_asset_test.gd:_init`;`theme_projection_test.gd:_smoke_global_theme` | | 地形瓦片套与格面数字可读 | HUD框架 | `TilePalette.digit_ink_mode()`/`TilePalette.normalize_floor_luma()` | `terrain_tile_sets_test.gd:_test_set_completeness`;`terrain_tile_sets_test.gd:_test_hue_domains`;`terrain_tile_sets_test.gd:_test_digit_ink_modes` | diff --git a/reports/需求卡片-gdstyle尾波清偿批-2026-10-29.md b/reports/需求卡片-gdstyle尾波清偿批-2026-10-29.md new file mode 100644 index 00000000..44568da2 --- /dev/null +++ b/reports/需求卡片-gdstyle尾波清偿批-2026-10-29.md @@ -0,0 +1,308 @@ +# 需求卡片——gdstyle 尾波清偿批 + +> **版本状态**:v1.0 草稿——设计段待裁点未清(第 6 节四个拆件项待用户裁决;裁决清零前本卡不得编入迭代)。 +> **接收方**:待办清单条目「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 键经拆件降值后按设计段裁决走豁免登记或基线留债。手段只有两类:存量文件内部拆私有函数(呈现层先例)、按职责拆协作件(核心层先例)。 + +什么状态算完: + +1. 11 键逐键达到第 7 节写明的预期结果(归绿或降值后的实测值)。 +2. 游戏行为零变化:同种子下事件流、步骤流、断点快照、棋盘渲染逐位一致(第 4 节红线)。 +3. 批末代码域闸全绿(冒烟+单元+集成+探针+渲染 golden+静态扫描),键账对账完成(第 13 节)。 +4. 实现报告与反哺点清单落 `reports/`(末卡产出物落位卡)。 + +## 2. 设计事实源 + +本卡属需求性工程条目(结构整改、改游戏代码面),按五段流水线凭工程债证据直接写卡、无 GDD 设计前置。证据指认: + +- `tools/gdstyle_baseline.txt`——2026-10-29 人工重锚后的现行基线,16 键;本卡 11 键逐条列于第 3 节,键名与本卡逐字一致。 +- `reports/审计-gdstyle存量债清点与清偿方案-2026-10-26.md` §六裁定记录 7 条(段组织、波 2/波 6 形态、config_db 定性、判定口径、独立审查折入、2026-10-27 三卡归并)——继续有效,本卡沿用其中对呈现层「内部拆私有函数、不拆构建步件」与「全部波不改游戏规则与玩家可见行为」的裁定。 +- 前置设计段:四个拆件项(第 6 节)未过设计段裁决。本卡只提供职责语句、拟拆清单与耦合边界供裁决,不代替裁决;裁决产物(architecture.md 模块归属表登记行、S13 豁免登记条)经反哺点通道由文档批落文。 + +## 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 + `cell_size` 只读属性 1,以闸实测为准) | +| 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-829 行)+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`——其中断点恢复域成员 6 个(:30-37 区段) | + +支撑事实: + +- 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)——拆件不触任何外部调用面。 +- 六函数现行均无超标键(基线无其函数级键),函数体逐字搬运即计数不变,新文件零新增键。 +- 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)引用——委托面处置是跨文件改址。 +- `game/tests/unit/core/breakpoint_resume_test.gd:185` 直读 `AdventureRunnerScript.BREAKPOINT_FIELDS`——断点域若拆件,此处须随迁改址。 +- `tools/run_all_gates.sh` PARITY_TOUCH_FACES 含 `game/core/battle_orchestrator.gd`——本批必触面。 + +## 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,此处立卡内执行条款):①每个拆出单元须有可陈述的职责语句与单一变化原因(实现报告逐件一行承载);②拆出单元须有集体身份——命不出名字、只能说「剩下的成员」的打包=凑计数袋,禁;③「过阈值」只许作为发现信号,作为拆分或收拢的动机即违规;④按纪律拆不出内聚单元 → 停卡呈报走豁免/还债通道,禁硬拆凑绿;⑤拆分沿职责轴不沿阈值轴。 +- 🔴 **禁为机检文本保留无效成员**:禁止为迎合机检消息文本(含计数)而保留或新增无效成员/别名;机检键与卡片契约互斥时,实现段一律停卡呈报,不得自造第三条路。 +- 🔴 **残留处置不承诺清零**:5 个降值键拆件后的终局处置(架构豁免登记或基线留债)=设计段裁决(第 6 节 D5);实现段不得为凑阈值自造豁免或改阈值。 +- 🔴 **基线纪律**:禁为过闸 refresh 换绿;还债=数值下降自然绿;出现恶化=停卡呈报(细则第 13 节)。 +- 🔴 **attune 族与 begin_battle 序列禁动**:battle_orchestrator 的 attune 族原位保留(迭代 39 副卡语义领地);begin_battle 受理段序与五段驱动逻辑禁动——装板域拆件只改 `_install_new_board()` 调用点的取件改址。 +- 🔴 **断点键集冻结**:`BREAKPOINT_FIELDS` 27 键逐键冻结(键名、策略标签、键序零变化);随件迁移只换承载文件,不换键面。 + +## 5. 范围边界 + +做什么:第 3 节 11 键对应的六项改动(第 7 节逐键方案、第 11 节任务卡)。 + +不做什么: + +- 5 个豁免讨论键(main.gd/tune_sim_controller/board_cell_unit/standee_body/battle_orchestrator 类变量)——去向:主会话另行讨论豁免通道,本卡不收件、不落反哺点。 +- 波次方案其余文件(审计报告 §三波 1–8)——已由迭代 39/40/41 清偿,不在本卡。 +- `game/tests/README.md` 能力清单——实现批禁写;受影响行(若有)由写卡段在形态裁决后的卡修订版同批更新(第 12 节对照表注记)。 +- 数值表、RNG 流词表、信号载荷 schema——零触碰。 +- level_runner 商店域若设计段裁「剔除」(D3),该域整项退回在册条目「level_runner 商店委托层拆除」单独立卡,本卡该两键留债。 + +## 6. 前置设计段待裁点(四个拆件项——本卡编入迭代前置=待裁点经设计段由用户裁决清零) + +四项均未过设计段裁决。每项给出职责语句、单一变化原因、拟拆清单、耦合边界与备选案(推荐案在前、淘汰依据随后);**卡片不代替用户裁决**。 + +### D1 battle_orchestrator 装板域拆件 + +- **职责语句**:棋盘安装与地形变异布置域——生成棋盘、装板受理、资源摇号资格域组装、变异决议与布置。 +- **单一变化原因**:棋盘设置顺序(生成→装板→资源→变异)或变异布置算法变化时只改此件。 +- **拟拆清单**(六函数逐字搬运,约 140 行):`_install_new_board`(:414-452)、`_resolve_global_variant`(:460-468)、`_place_variants`(:480-500)、`_place_variants_apply`(:504-530)、`_variants_fringe`(:534-541)、`_adjacent_to_packs`(:545-549)。 +- **耦合边界**:新件经引用束注入取 db、rng(两封闭流同序取号)、minesweeper、reward_economy、board_generator、encounter 现值;`_fatal` 与 `board_changed` 经注入回调(协议面单点留宿主——BattleFxHost/RewardGrant 先例);宿主侧装板后状态复位(_seal_consumed/_seal_miss_seen/_perfect_* 三计数/_board_seq/_board_from_midround_refresh)保留宿主,件内不持宿主状态。静态随动:static_scan.sh 的 S7 B1 域文件集与 S8 await 文件集同批增行(工程红线防漏闸——迭代 40 两新件先例)。 +- **备选案**:推荐=新件 `game/core/board_installer.gd`(B1 域件,三调用点取件改址)。淘汰「函数留宿主只拆 _place_variants 内层」——治不了文件长键;淘汰「六函数搬入既有 BattleFxHost」——效果引擎宿主域与装板域是两个变化原因,混装违单一变化原因。 + +### D2 board_view 悬停域拆件 + +- **职责语句**:悬停预承诺呈现域——三语义光标、目标格边框、BFS 路径预览、chord 双击首遇锚。 +- **单一变化原因**:悬停反馈形态(光标语义/边框/路径预览画法)变化时只改此件。 +- **拟拆清单**:成员 `_hover`(:70)、`_last_click`(:71);函数族 11 个=`_hover_at`(:442)、`_on_shell_mouse_exited`(:453)、`_detect_chord`(:475)、`_on_cell_hover`(:486)、`_on_cell_unhover`(:491)、`_refresh_hover_after_paint`(:497)、`_apply_hover_visuals`(:503)、`_clear_hover_visuals`(:531)、`_set_cursor_shape`(:538)、`_show_path_preview`(:542)、`_hide_path_preview`(:552)。**`_r0` 不随迁**——它是出生展开区资格域成员(徽章/微光/涟漪三消费方共用,:238/:296/:563),与悬停无职责交集,划入悬停件即凑计数袋。 +- **耦合边界**:件经引用束注入取 cells 容器引用、minesweeper 只读引用、diggable 集合引用;壳层光标写入与 `hover_forbidden` 信号经注入回调;`_gui_input`/`_on_cell_input`/`click_cell` 三个入站口留宿主(Control 虚回调与探针契约面不可迁),悬停计算委托件。`hover_probe()` 留宿主读件投影。 +- **备选案**:推荐=新件 `game/presentation/views/board_hover.gd`。淘汰「悬停函数留宿主只迁两成员」——计数降 2 意义微小且函数族与成员本是一个内聚单元;淘汰「并进 hero_sprite 件」——英雄演出与悬停预承诺是两个变化原因。 +- **预期注记**:类变量 32→约 30;公开方法 27 个全为契约承载、预期持平(详见第 7 节键 5/6)。残留处置归 D5。 + +### D3 level_runner 商店域处置 + +- **职责语句**:关卡商店货架与 GP 支出(域件 ShopSession 已存在——迭代 37 建件,宿主现留同签名委托面)。 +- **单一变化原因**:商店货架与定价规则变化时只改 ShopSession。 +- **拟拆清单**:删除宿主同签名委托 17 个公开方法(shop_products/current_price/purchased_tier/buy_product/player_request_refresh/set_shop_pool/pool_stock/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,:751-829)+3 个私有转发(_bind_shop/_spend_discounted/_shop_draw_shelf);外部调用点改直连 ShopSession(宿主新增取件出口)。涉案调用点:呈现层 5 文件+`game/sim/level_autoplay.gd`+测试 4 套件(断言判据零变化、仅调用面改址)。 +- **耦合边界**:ShopSession 的共享引用(wallet/journal/level_row/attunement/tree_rules)绑定逻辑留宿主 `_init`(`_bind_shop` 内容内联);`_enter_node` shop 分支与 `breakpoint_fragment` 经取件出口访问件。`_shop` 成员去留随形态(见备选案)。 +- **备选案**:推荐=候选 A 删委托壳(Middle Man 清偿——2026-10-26 真拆分设计会话已裁「纯转传委托=反模式」先例;公开方法 50→33)。候选 B=委托面保留(现状登记为过渡件)、本卡该两键留债——淘汰依据:委托面已在册单独立项(「level_runner 商店委托层拆除」条),两批重复开工浪费;但若设计段裁本卡剔除该项(见 D6),候选 B 生效。 +- **并案裁决**:本项与在册条目「level_runner 商店委托层拆除——迭代 37 冻结契约期过渡件(2026-10-26 登记)」同面——并案(本卡吸收该条目)或剔除(该条目单独立卡)由设计段裁(D6)。 + +### D4 adventure_runner 断点恢复域拆件 + +- **职责语句**:存档断点组装与回放——断点快照拼盘、回放回填、读侧策略分发。 +- **单一变化原因**:断点键集或回放策略变化时只改此件。 +- **拟拆清单**:成员 6 个=`_save_manager`(:35)、`_resume_bp`(:36)、`_pending_next_level`(:30)、`_last_level_payload`(:31)、`_last_treasure_cleared`(:32)、`_loadout_seeded`(:37);常量 `BREAKPOINT_FIELDS`(:539-568,27 键冻结);函数族=`_snapshot_breakpoint`(:571)、`_bp_parts`(:583)、`_bp_read`(:636)、`_bp_strategy`(:646)、`_bp_read_int`(:651)、`_resume_ledger`(:182)、`_resume_curio_state`(:193)、`_resume_params`(:218)、`_resume_counters`(:237),公开入口 `resume_adventure` 留宿主薄壳。**成员归属注记**:`_pending_next_level`(冒险推进态,continue_to_next_level/_on_level_finished 消费)与 `_loadout_seeded`(同调投行标记)是否随域收编须裁——不随则类变量降幅收窄(28→约 24–26,随 6 成员全迁为约 22)。 +- **耦合边界**:件经引用束注入取 db、rng(restore_adventure 同序)、主角账三件、curio/stop/bank/loadout 四件引用;level_index/master_seed/summary 等宿主冒险态经注入引用或件返回值写回(形态随裁决);`set_save_manager` 转发件。测试侧改址:`breakpoint_resume_test.gd:185` 的 `BREAKPOINT_FIELDS` 直读随迁改址。 +- **备选案**:推荐=新件 `game/core/breakpoint_store.gd`(D3 域件命名族——SlotStore/MetaStateStore 同族)。淘汰「只迁 _bp_* 读侧函数」——写侧拼盘与读侧策略是一个登记单源表的两半,拆开违登记单源;淘汰「断点域并入 save_manager」——存档 IO 原语与冒险断点语义是两个变化原因(SlotStore 拆分已立此界)。 + +### D5 降值键残留处置(横切) + +5 个不可达阈值键(第 7 节键 5–8、11)拆件后的终局处置二选一,由设计段统一裁:**架构豁免登记**(键永久基线内、禁再恶化,理由在册 architecture「测试与质量域」豁免登记段——main.gd 探针契约面先例)或**基线留债**(键留基线随批对账,禁恶化)。淘汰「继续硬拆凑阈值」——拆不出内聚单元,违拆分边界纪律④。 + +### D6 level_runner 商店域并案归属 + +见 D3 末条:并案(本卡吸收在册条目「level_runner 商店委托层拆除」,批完删条)或剔除(本卡该两键留债,在册条目维持待写卡)。 + +### 待裁点汇总 + +| 编号 | 待裁点 | 推荐案 | +|---|---|---| +| D1 | 装板域新件形态与引用束构成;宿主侧复位行归属 | 新件 board_installer.gd;复位留宿主 | +| D2 | 悬停域新件形态;_r0 不随迁认定 | 新件 board_hover.gd;_r0 留宿主 | +| D3 | 商店域候选 A(删委托壳)/候选 B(留债);_shop 去留 | 候选 A | +| D4 | 断点域新件形态;_pending_next_level/_loadout_seeded 归属 | 新件 breakpoint_store.gd;六成员全迁 | +| D5 | 5 个降值键终局处置(豁免登记/基线留债) | 逐键裁决 | +| D6 | 商店域与本卡并案或剔除 | 并案 | + +## 7. 逐键方案(11 键:现状值/阈值/方案方向/预期结果) + +预期分两档:**归绿**(拆后实测低于阈值,下批重锚后键消失)与**降值不可达**(拆件后实测重锚降值,残留=设计段裁决豁免或留债,卡内禁承诺清零)。 + +| 键 | 现状/阈值 | 方案方向 | 预期结果(档位) | +|---|---|---|---| +| 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 悬停域拆件迁出 `_hover`/`_last_click` | 约 30,**降值不可达**——残留=D5 | +| 6 board_view 公开方法 | 27/20 | 无拆分动作(27 个逐类核对全为探针契约面与依赖单向纪律承载面,可降空间极小;随 D2 若有微降以实测为准) | 27(持平或微降),**降值不可达**——残留=D5 | +| 7 level_runner 公开方法 | 50/20 | D3 候选 A 删商店委托面 17 个公开方法(外部直连 ShopSession);候选 B 无动作留债 | 候选 A 约 33/候选 B 50,**降值不可达**——残留=D5 | +| 8 level_runner 类变量 | 30/15 | D3 随形态(_shop 收编则 −1,否则持平);无其他收编面 | 约 29–30,**降值不可达**——残留=D5 | +| 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 装板域六函数约 140 行迁出 | 约 890–900(拆后实测),**归绿** | +| 11 adventure_runner 类变量 | 28/15 | D4 断点域拆件(六成员全迁约 22;两成员留宿则约 24–26) | 约 22–26,**降值不可达**——残留=D5 | + +## 8. 关联文档同步面 + +| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 | +|---|---|---| +| design/engineering/architecture/architecture.md | 「战斗编排域拆件定稿」节与功能层模块归属表(D1 新件行登记、battle_orchestrator 行职责句随动);冒险域/功能层表(D4 新件行登记、adventure_runner 行随动);呈现层表 board_view 行(D2 悬停域件随动);level_runner 行「外部调用面由同签名委托承载」句(D3 候选 A 时换代);「测试与质量域」S13 豁免登记段(D5 若裁豁免) | 设计权威文档——实现批禁直改;逐条列进 `reports/iter-反哺点-<日期>.md`,用户裁决后归文档批落文 | +| game/tests/README.md | 能力清单「棋盘悬停反馈」能力行(已随本卡 v1.0 同批入表——写卡同批义务);「GP 钱包/escrow/商店收口/共享池」行真实入口列(D3 候选 A 时入口改经 ShopSession 直连);代表用例列(本卡新增断言落名后) | 机械面文档——实现批禁写;受影响行由写卡段在形态裁决后的卡修订版同批更新,实现期零改动 | +| design/gdd/systems/(全树) | 无关联文档——结构整改不改游戏规则与玩家可见行为(审计报告 §六.5 判定口径沿用) | 无修订预期;若实现中发现契约句被触碰,停卡呈报走反哺点通道 | + +## 9. 卡前文件结构图 + +| 文件 | 职责 | 改动性质 | +|---|---|---| +| game/presentation/views/board_view.gd | 棋盘视图壳层(格态渲染入口、入站事件、探针出口) | 修改(非行为改动——_paint_cell 拆分层函数族、rebuild 构建器、悬停域迁出;验收=对照表行 V1/V2) | +| game/presentation/views/board_hover.gd | 悬停预承诺呈现域件(D2,新增) | 新增(非行为改动;验收=对照表行 V2) | +| game/core/level_runner.gd | 关卡域生命周期编排者 | 修改(非行为改动——_enter_node 载荷合并〔载荷逐字保持〕+D3 商店域形态随裁决;验收=对照表行 V3/V6) | +| game/core/battle_orchestrator.gd | 战斗结算编排中枢 | 修改(非行为改动——装板域六函数迁出、三调用点取件改址;验收=对照表行 V4) | +| game/core/board_installer.gd | 棋盘安装与变异布置域件(D1,新增) | 新增(非行为改动;验收=对照表行 V4) | +| game/core/adventure_runner.gd | 冒险结构编排器 | 修改(非行为改动——断点域迁出、resume_adventure 薄壳化;验收=对照表行 V5) | +| game/core/breakpoint_store.gd | 存档断点组装与回放域件(D4,新增) | 新增(非行为改动;验收=对照表行 V5) | +| game/tests/unit/core/level_shop_economy_test.gd | 关卡图与商店宿主套件 | 修改(新增断言 _test_shop_node_entered_payload;D3 候选 A 时调用面改址——测试侧改址申报见第 17 节) | +| game/tests/unit/core/breakpoint_resume_test.gd | 断点往返套件 | 修改(:185 BREAKPOINT_FIELDS 直读随迁改址——测试侧改址申报见第 17 节) | +| game/tests/unit/core/pool_case_d_test.gd、tree_rules_v11_test.gd、hero_ledger_test.gd | 引用商店委托面的三套件 | 修改(仅 D3 候选 A 时调用面改址) | +| game/tests/static_scan.sh | 静态扫描域承载 | 修改(D1 落地时 S7 B1 域文件集与 S8 await 文件集增行——工程随动) | +| game/presentation/camp_shop_presenter.gd、main_adventure_flow.gd、main_overlay_flow.gd、main_ui_build.gd、game/presentation/views/shop_overlay_view.gd、game/sim/level_autoplay.gd | 商店委托面调用方 | 修改(仅 D3 候选 A 时调用面改址——非行为改动) | + +每个新增件标「新增」者,其「为什么不能复用」理由与唯一落点核查见第 10 节;两处对不上即卡片不成立。 + +## 10. 落位与可复用性预检 + +- **board_installer.gd(新增)**:复用面核查——装板与变异布置逻辑现行只存在于 battle_orchestrator(全仓 grep 六函数名仅本文件三处调用,无第二实现),无既有件可复用;不能并入 BattleFxHost(效果引擎宿主域,变化原因不同)也不能并入 RewardGrant(授予管线域)。落点唯一:B1 域新文件,`game/core/`。分层:core 层 RefCounted,零 UI、零 await,经引用束注入取协作对象,禁裸引用 autoload(S5)。 +- **breakpoint_store.gd(新增)**:复用面核查——断点拼盘与读侧策略现行在 adventure_runner 内(`BREAKPOINT_FIELDS` 登记单源表唯一);save_manager 是存档 IO 原语层(SlotStore 拆分已立界:IO 与冒险断点语义分工),meta_state_store 是元进度数据件——都不承载冒险断点组装。落点唯一:`game/core/` 新件。 +- **board_hover.gd(新增)**:复用面核查——悬停预承诺逻辑现行全在 board_view(11 函数族 grep 无外部引用);TilePalette/HeroSprite/CellUnit 各管瓦片/精灵/格件绘制,无一承载悬停交互态。落点唯一:`game/presentation/views/` 新件,由 board_view `_init` 建为子件(HeroSprite 同款挂载先例)。 +- **新增函数**:_build_cell_unit、_paint_cell_* 段函数族——全部是既有函数体的逐字搬运或循环体内联体出函,无新增逻辑;迁移函数对账见第 11 节。**零新增数据件、零新增常量表**(BREAKPOINT_FIELDS 为迁移非新增)。 +- **调用路径显式声明**:board_hover 只被 board_view 持有与调用(输入经宿主入站口委托);board_installer 只被 battle_orchestrator 三调用点取件调用;breakpoint_store 只被 adventure_runner 调用——三件均禁反向持有宿主引用(注入回调单向,先例=BattleFxHost 兑付回调)。 + +## 11. 实现规范预算(新件对照 gdstyle 默认阈值;写码前对账,超预算面=停卡退回写卡段) + +| 新件 | 公开方法 ≤20 | 类变量 ≤15 | 迁移函数对账(基线源函数键) | +|---|---|---|---| +| board_installer.gd | 预算 3(install_new_board+组件出口) | 预算 9(引用束成员) | 六函数现行均无超标键(基线无其函数级键),函数体逐字搬运=计数不变=新文件零新增键 | +| breakpoint_store.gd | 预算 8(快照/回填/读侧入口族) | 预算 6(拟拆成员)+引用束 | _bp_parts 现行 49 行/9 局部(实测 :583-630)均在默认阈值内;_resume_* 四函数均无超标键 | +| board_hover.gd | 预算 6(悬停驱动入口) | 预算 2(_hover/_last_click)+引用束 | 11 函数现行均无超标键(基线无键);_apply_hover_visuals 分支 5 | +| 新增私有函数(board_view 内) | —(私有不计数) | 零新增成员(类变量只降不升) | _paint_cell 三键随拆分消除;段函数逐个低于默认阈值(超 8 分支的段沿绘制层轴下钻,见第 7 节键 1) | + +存量触面一查:四个涉案存量文件 T0 读数写明「S13 键较登记值只降不升」预期——board_view 6 键(3 归绿+2 降值+1 持平不升)、level_runner 3 键、battle_orchestrator 文件长归绿(类变量 38 为豁免键禁恶化)、adventure_runner 1 键。`_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 工作日)**(前置:D1 裁决落定) + +- [ ] 建 `game/core/board_installer.gd`(引用束注入,第 6 节 D1 耦合边界),六函数逐字迁移,宿主三调用点(:271/:801/:835)取件改址;begin_battle 段序与 attune 族零触碰 +- [ ] static_scan.sh S7 B1 域文件集与 S8 await 文件集增行 +- [ ] 孤立验证:`-- --only=variant_placement,round_flow,seal_polarity` 全绿+`python tools/run_smoke.py` +- [ ] 文件长实测 ≤1000(键归绿) + +**T4 adventure_runner 断点域拆件——键 11 降值(1–1.5 工作日)**(前置:D4 裁决落定) + +- [ ] 建 `game/core/breakpoint_store.gd`(引用束注入,D4 耦合边界),`BREAKPOINT_FIELDS` 与函数族随裁决清单迁移;`resume_adventure` 留宿主薄壳 +- [ ] `breakpoint_resume_test.gd:185` 改址(判据零变化) +- [ ] 孤立验证:`-- --only=breakpoint_resume,save_rng_roundtrip,cross_system_flow,adventure_feats` 全绿 +- [ ] 类变量实测落第 7 节键 11 预期区间 + +**T5 board_view 悬停域拆件——键 5 降值(0.75–1 工作日)**(前置:D2 裁决落定;取用:T1 已合段) + +- [ ] 建 `game/presentation/views/board_hover.gd`,拟拆清单 2 成员+11 函数逐字迁移;三入站口留宿主委托;`hover_probe()` 改读件投影(返回语义零变化) +- [ ] 孤立验证:`tools/probe_gate.sh --click`+`--full` 全绿+render_gate 三张 golden 差异 0.00% +- [ ] 类变量实测 30 + +**T6 level_runner 商店域处置——键 7/8 降值(候选 A 1–1.5 工作日/候选 B 0.25 工作日)**(前置:D3/D6 裁决落定) + +- [ ] 候选 A:删委托面 17 公开+3 私有转发,宿主新增 `shop() -> ShopSession` 取件出口;呈现 5 文件+sim 1 件+测试 4 套件调用面改址(判据零变化);能力清单受影响行由写卡段卡修订版同批更新 +- [ ] 候选 B:零改动,两键留债记录进实现报告 +- [ ] 孤立验证:`-- --only=level_shop_economy,pool_case_d,tree_rules_v11,hero_ledger` 全绿+冒烟 + +**T7 批末对账与收口(0.5 工作日)** + +- [ ] 全量闸:`bash tools/run_all_gates.sh --code`(改动全为代码面)全绿;闸 11 触面按第 4 节 PARITY 条款由用户裁决 +- [ ] 键账对账:11 键终值对照第 7 节预期逐键核(归绿 6/降值 5);重锚由用户发令人工 `--refresh`(第 13 节) +- [ ] 产出物落位卡:`reports/iter-实现报告-<日期>.md`(各卡状态+实机目检总清单+实现决定记录+逐拆出单元职责语句一行)与 `reports/iter-反哺点-<日期>.md`(第 8 节同步面逐条落点)写齐方算收口 + +合计估时约 5.25–7.75 工作日(切分预案:D3 裁候选 B 时 −1;T3/T4 任一拆件裁决否决时按留债口径 −1~1.5 并回写第 7 节预期)。 + +## 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 邻作用集/五组色相/零玩法写入);既有:玩家面文案与危险格格面字形 | +| V2 | 键 5——悬停域拆件 | board_hover.gd 新建;board_view.gd:442-552 函数族与 :70-71 成员迁出 | 复用 ui_input_probe(悬停到达/光标语义/路径预览——合成输入路径)+ui_click_probe+type_glow_shot_probe;新增断言零条 | 探针 | 合成 InputEventMouseMotion/MouseButton 经 _gui_input 入站口;hover_probe() 读面 | 探针可见性断言面(hover_probe 返回值、光标形状、格件 st 边框/点迹字段)+golden 三张零差异 | 新增:棋盘悬停反馈(三语义光标/目标格边框/路径预览点迹) | +| 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 迁出、: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 取号序零漂移由同种子断言钉住 | 既有:变异布置门控;既有:轮内流与结算五段全序 | +| V5 | 键 11——断点域拆件 | breakpoint_store.gd 新建;adventure_runner.gd 断点函数族与成员迁出 | 复用 breakpoint_resume_test.gd 全套、save_rng_roundtrip_test.gd、cross_system_flow_test.gd:_feats_breakpoint_roundtrip;新增断言零条;breakpoint_resume_test.gd:185 改址(第 17 节申报) | 单元+集成 | AdventureRunner.resume_adventure()/start_adventure() × SaveManagerCore 断点域 | 断点快照往返逐键断言面(27 键冻结——键名/策略/键序零变化) | 既有:断点片段往返与续玩幂等;既有:存档⇄RNG 快照往返保真(集成);既有:旧档迁移链与断点续玩零跳号(集成) | +| V6 | 键 7/8——商店域处置(D3 候选 A 时) | level_runner.gd:751-829 委托面删除;调用点改址(呈现 5+sim 1+测试 4) | 复用 level_shop_economy_test/pool_case_d_test/tree_rules_v11_test/hero_ledger_test 全套(调用面改址、判据零变化);新增断言零条 | 单元 | ShopSession 直连面(候选 A)/LevelRunner 委托面(候选 B 维持现状) | 商店三收口/共享池抽买既有断言面当轮全绿 | 既有:GP 钱包/escrow/商店收口/共享池 | + +反向核对:diff 中每个行为改动均有行——本批申报行为改动仅 V3 一处(载荷合并,行为保持);其余行均为非行为改动(结构整改,判据=零漂移证明)。孤儿断言:无(新增断言仅一条:V3 行〔尾波 V1〕,已挂行)。 + +## 14. 基线纪律(S13) + +1. 禁为过闸 refresh 换绿:基线重生成只由用户发令,批末键账对账后人工 `python tools/gdstyle_gate.py --refresh` 一次执行(禁闸内自动重生成、禁实现批中途 refresh)。 +2. 还债=数值下降自然绿:拆件后同键数值下降不判红,无需动基线;归绿键在下批重锚后自然消失。 +3. 出现恶化(同键数值较登记值上升、基线外新键)=停卡呈报,禁自行消化。 +4. 重锚守卫:新键数较旧基线少逾 10% 须 `--force` 显式确认——本批预期归绿 6 键(16→约 10–11,降幅约 31–37%),重锚时须带 `--force` 由用户执行。 +5. 豁免键(main.gd 类变量等 5 键)不在本批对账范围;battle_orchestrator 类变量 38 为已登记豁免键,本批禁恶化。 + +## 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 停机写报告等用户**:①拆分边界纪律④触发——按职责轴拆不出内聚单元(含 D2/D4 成员归属裁决被证伪);②机检预算互斥——新件实数超第 11 节预算或迁移函数现出超标键=上游缺陷停卡退回写卡段;③golden 对拍差异非零;④S13 键恶化或基线外新键;⑤PARITY 触面处置分歧;⑥断言面被下游兜底吸收致判据绑不上(按 test-conventions §8.4 出口呈报)。 + +## 17. 测试削弱申报(允许改动的旧断言及理由) + +1. `breakpoint_resume_test.gd:185`——`AdventureRunnerScript.BREAKPOINT_FIELDS` 直读随件迁改址为 `BreakpointStoreScript.BREAKPOINT_FIELDS`(D4 落地时);判据零变化,仅常量承载文件换代。 +2. D3 候选 A 时——level_shop_economy/pool_case_d/tree_rules_v11/hero_ledger 四套件中调用 `runner.shop_*()` 委托面的语句改直连取件出口;断言条件与期望值零变化。 +3. 除此之外禁删断言、禁放宽阈值、禁缩小扫描面、禁把真实入口换成下层直调;未申报的削弱由独立验收审计判红。 + +## 18. 独立验收审计 + +合并前由未参与实现的会话或子代理执行;报告落 `reports/iter-验收审计-<日期>.md`。审计至少做四件事(test-conventions §8.7):逐行核对第 13 节对照表(测试存在、真执行、尾缀可 grep、真实入口未绕过改动点);抽查判据绑定面;检查测试削弱(对照第 17 节申报);核对 V2/V4/V6 行「非行为改动」判定依据(零漂移证明是否在当轮真实跑批中成立)。未过不得合并。 + +## 19. 代拍板白名单(允许 agent 自行拍板的微决策) + +1. 迁移函数头注注释的指址微调(词表与语义不动——「指址须真」纪律)。 +2. 新件私有 helper 命名在职责语义不变前提下的微调。 +3. 断言失败消息尾缀编号分配与措辞(〔尾波 Vn〕系列)。 +4. 调用面改址的机械改写(import/preload 顺序、空行排版)。 +5. 第 7 节键 1 段函数在五段骨架内的下钻粒度(沿绘制层轴)。 + +超清单决策记入实现报告「实现决定记录」节。 + +## 20. 待裁点清单(重申——全部待用户裁决,裁决清零前本卡不得编入迭代) + +D1 装板域新件形态与引用束构成/D2 悬停域新件形态与 _r0 归属认定/D3 商店域候选 A·B 与 _shop 去留/D4 断点域新件形态与 _pending_next_level·_loadout_seeded 归属/D5 五个降值键终局处置(豁免登记或基线留债)/D6 商店域与在册条目并案或剔除。详见第 6 节备选案与淘汰依据。 diff --git a/待办清单.md b/待办清单.md index 3ba15bd5..8f2fc055 100644 --- a/待办清单.md +++ b/待办清单.md @@ -58,6 +58,16 @@ **状态**:待执行 +#### 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——其中三条已有架构豁免登记)。需求卡片已成 v1.0 草稿:reports/需求卡片-gdstyle尾波清偿批-2026-10-29.md——**四个拆件项未过设计段裁决**(battle_orchestrator 装板域/adventure_runner 断点恢复域/board_view 悬停域/level_runner 商店域,卡内第 6 节各备选案并列),卡片编入迭代前置=待裁点经设计段由用户裁决清零,卡片不代替裁决。预期两档:归绿 6 键(_paint_cell×3、循环内 new、_enter_node、文件长);降值不可达 5 键(board_view 两键、level_runner 两键、adventure_runner 一键——拆件后实测重锚,残留处置豁免登记或留债归设计段裁决)。与在册条目「level_runner 商店委托层拆除」同面(并案或剔除已列卡内待裁点 D6)。MC/数值零触碰(结构整改不改数值与 RNG 消费序);battle_orchestrator 触 PARITY_TOUCH_FACES——实跑对拍须经用户批准、不得借机重锚。S13 键账对账在批末,基线重锚由用户发令人工 --refresh(预期降幅逾 10% 须 --force)。 + +**缺口**:四个拆件项的拆分形态、成员归属与残留键处置(豁免登记或留债)未经设计段裁决(D1–D6 六点);裁决落定并完成 architecture.md 登记行反哺落文后卡片定稿,方可编入迭代。 + +**改动面**:游戏代码 + +**状态**:文档设计中+待写卡 + #### 数值标定窗口总挂账——原九条数值类条目合并(2026-10-28 登记,来源=会话提及) **实况**:2026-10-28 用户令把九条数值类挂账合并为一条:削弱档位的最终数值/迭代 10 奖励重构联动欠账/调参批数值点评登记/三方向各自的解锁清单与定价/GP 经济换算失衡/天赋树实装批登记欠账余两件/商店独立刷新机制两参数/基线通关率越带加难杠杆扫描/成长系数节奏——原九条同步删除,内容全量迁入汇总文档,git 历史可考(本提交)。共同背景:M4 数值批卡已随 2026-10-16 删卡令退役;2026-10-18 用户裁=各条留待办清单、未设计未启动、不另行归属,未来数值标定窗口重开时重走设计段再写卡——本条沿用该裁定,重启条件=用户发令开窗口。合并动机=九条共享同一重启条件与同一执行形态(窗口内一次 MC 批量统一覆盖各条对比需求:全冒险期望+奖励期望+对拍锚重锚),分散登记徒增维护面。逐条挂账明细、裁定史与相关文档见汇总文档。 From c4862e7d044012f3659a96714119045bdbeb4a2b Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 29 Oct 2026 04:40:00 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=86=99=E5=8D=A1(level=5Frunner=20?= =?UTF-8?q?=E5=95=86=E5=BA=97=E5=A7=94=E6=89=98=E5=B1=82=E6=8B=86=E9=99=A4?= =?UTF-8?q?):=20=E9=9C=80=E6=B1=82=E5=8D=A1=E7=89=87=20v1.0=E2=80=94?= =?UTF-8?q?=E2=80=9419=20=E5=A7=94=E6=89=98=E5=A3=B3=E6=8B=86=E9=99=A4+?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E9=9D=A2=E7=9B=B4=E8=BF=9E=20ShopSession=20?= =?UTF-8?q?=E9=9B=B6=E8=A1=8C=E4=B8=BA=E6=94=B9=E5=8A=A8=EF=BC=9B=E8=83=BD?= =?UTF-8?q?=E5=8A=9B=E6=B8=85=E5=8D=95=20GP=20=E9=92=B1=E5=8C=85=E8=A1=8C?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E5=88=97=E9=9A=8F=E6=94=B9=E5=9D=80=E5=BD=A2?= =?UTF-8?q?=E6=80=81=E6=8D=A2=E4=BB=A3=EF=BC=9B=E5=BE=85=E5=8A=9E=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E6=8E=A8=E8=BF=9B=E5=B7=B2=E5=86=99=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/README.md | 2 +- ...�¡片-level_runner商店委托层拆除-2026-10-29.md | 185 ++++++++++++++++++ 待办清单.md | 4 +- 3 files changed, 188 insertions(+), 3 deletions(-) create mode 100644 reports/需求卡片-level_runner商店委托层拆除-2026-10-29.md diff --git a/game/tests/README.md b/game/tests/README.md index 8679d774..e1261b2d 100644 --- a/game/tests/README.md +++ b/game/tests/README.md @@ -97,7 +97,7 @@ tests/ |---|---|---|---| | 清图奖励双份与零路径 | 地图战斗资源 | `BattleOrchestrator.begin_battle()` → 步骤流行(`source_class=clear_reward`) | `seal_polarity_test.gd:_smoke_clear_reward_chain`;`seal_polarity_test.gd:_smoke_clear_reward_zero_paths` | | 奖励三选一候选/刷新付费/呈现 | 奇物×节点奖励屏 | `AdventureRunner.present_node_curio()`(数据面);奖励节点覆盖层场景(呈现面) | `curio_refresh_paid_test.gd:_init`;`reward_overlay_test.gd:_run` | -| GP 钱包/escrow/商店收口/共享池 | 地图战斗资源×商店 | `LevelRunner.buy_product()`/`player_request_refresh()`/`close_wallet()`/`set_shop_pool()` | `level_shop_economy_test.gd:_smoke_gp_wallet`;`level_shop_economy_test.gd:_smoke_shop_room`;`level_shop_economy_test.gd:_smoke_shop_pool` | +| GP 钱包/escrow/商店收口/共享池 | 地图战斗资源×商店 | `LevelRunner.shop.buy_product()`/`shop.player_request_refresh()`/`LevelRunner.close_wallet()`/`shop.set_shop_pool()` | `level_shop_economy_test.gd:_smoke_gp_wallet`;`level_shop_economy_test.gd:_smoke_shop_room`;`level_shop_economy_test.gd:_smoke_shop_pool` | | 元进度入账与锻造两轴 | 元进度×锻造工坊 | `MetaStateStore.apply_adventure_summary()`/`MetaStateStore.spend_keystone()`/`MetaStateStore.set_forge_route_level()` | `meta_progression_forge_test.gd:_meta_pricing_and_buy`;`meta_progression_forge_test.gd:_smoke_forge_axes` | | 天赋树购买与六键合成 | 天赋树 | `MetaProgression.tree_buy()`/`MetaStateStore.tree_state()`/`MetaStateStore.set_tree_level()` | `meta_progression_forge_test.gd:_smoke_tree`;`meta_progression_forge_test.gd:_smoke_tree_rules`;`tree_rules_v11_test.gd:_init` | | 秘宝结构冻结与 12 件效果 | 秘宝 | `TreasureItems.add_item()`/`query_inventory()`/`validate_use()` | `treasure_items_test.gd:_init`;`treasure_effects_test.gd:_init` | diff --git a/reports/需求卡片-level_runner商店委托层拆除-2026-10-29.md b/reports/需求卡片-level_runner商店委托层拆除-2026-10-29.md new file mode 100644 index 00000000..39fcc5d5 --- /dev/null +++ b/reports/需求卡片-level_runner商店委托层拆除-2026-10-29.md @@ -0,0 +1,185 @@ +# 需求卡片——level_runner 商店委托层拆除批 + +- 版本:v1.0(2026-10-29) +- 来源:待办清单「level_runner 商店委托层拆除——迭代 37 冻结契约期过渡件」(2026-10-26 登记,来源=批次移交;需求性工程条目,改动面=游戏代码) +- 执行通道:需求改动——经迭代编排编入迭代后在独立 worktree 施工(仪式归 /iter);本卡估时合计 ≈1.5 个工作日(区间 1.5–2,超 2 停批呈报) +- 迭代号:由编排段落位(本卡 `iter` 占位符届时代换) + +## 1. 目标与完成定义 + +拆除 LevelRunner 的商店同签名委托层(19 个纯转传方法+「冻结公开面」契约注释),全部外部调用方直连 ShopSession;游戏行为零改动。 + +完成定义(全部满足才算完): + +1. level_runner.gd 壳块(:722–728 区块注释涉委托句+:751–828 十九个委托)归零;宿主商店成员以公开名 `shop` 承载取件。 +2. 产品码、sim、测试面全部调用点改为 `.shop.<方法>` 直连,全仓无旧委托调用残留。 +3. 全部单元套件、冒烟、代码域闸绿;现有断言读数逐位不变(零新增断言、零断言删除)。 +4. 架构文档同步点入反哺点清单;实现报告与验收审计报告落 `reports/`。 + +## 2. 设计事实源 + +跳过设计线的证据指认(需求性工程条目,第〇步核验放行 2026-10-29): + +- 待办清单条目实况:委托壳=迭代 37 卡④ ShopSession 拆分时立的「冻结公开面」契约过渡件;架构登记=`design/engineering/architecture/architecture.md:109`「外部调用面由 LevelRunner 同签名委托承载(外部零变化)」。 +- 拆除形态权威=`architecture.md:152`「调用直连:不留中间人委托壳(纯转传=Middle Man 反模式,2026-10-26 用户裁定)」。 +- 2026-10-29 写卡会话裁决:改址定式四条(公开成员取件/零调用死壳删/测试直连私有面/契约注释随壳消失)+ spend_gp 归属确认非问题(共享冒险钱包的校验扣款原语,宿主 ShopSession 语义自洽、不迁移)。 + +## 3. 现状事实(代码级,开工自行复核) + +委托壳块: + +1. level_runner.gd:722–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 全仓扫描)。 + +外部调用面(测试): + +6. level_shop_economy_test.gd ≈25 处(含白盒 `_shop_draw_shelf` :1344/:1355)/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(委托承载句+公开面格)/:152(直连原则);`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:722–724 区块句、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 调用方改述为 AdventureRunner 经 runner.shop 注入 | 反哺点清单(`reports/iter-反哺点-<日期>.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)【非行为——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 归零 +- [ ] 产品码改址六件(形态=`.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:722–724 区块注释涉委托句+:725 契约注释(保留「商店房兑付」节头与件注入说明)+: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.` 使用点)——产品码与测试面零命中,输出留实现报告 +- [ ] 注释收尾核查:level_runner 头注涉委托表述已同步(§5 做项) +- [ ] 里程碑出口:`tools/run_all_gates.sh --code` 全绿、回执落 `game/tests/.gates/receipt.json` + +### T2 收口(产出物落位卡) 估时 0.5 个工作日 + +- 取用:T1 终态(壳归零、套件绿、回执在盘)。 +- 产出:三份过程件+合回呈报。 +- [ ] 反哺点清单 `reports/iter-反哺点-<日期>.md`:§6 表逐条落点——architecture.md:109 ShopSession 行改写内容全文随单;无其他落点 +- [ ] 实现报告 `reports/iter-实现报告-<日期>.md`:各卡状态+实现决定记录+实机目检总清单(本批零玩家可观测改动——写明「无新增目检项」)+遗留读数义务(无)+残留扫描输出留痕 +- [ ] 独立验收审计 `reports/iter-验收审计-<日期>.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:722–724 句+:725+:751–828(含死壳 `_spend_discounted`:772/`pool_stock`:787) | 残留扫描零命中(T1 静态步)+T1 套件绿 | 静态+单元 | grep 全仓(19 方法名清单固定)+套件真实入口 | 扫描面>0 前置(grep 命令对 19 名单非空可执行)+壳删后零引用可编译 | 既有: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。) diff --git a/待办清单.md b/待办清单.md index 8f2fc055..376264e8 100644 --- a/待办清单.md +++ b/待办清单.md @@ -98,11 +98,11 @@ #### level_runner 商店委托层拆除——迭代 37 冻结契约期过渡件(2026-10-26 登记,来源=批次移交) -**实况**:证据=迭代 37 卡④ ShopSession 拆分时立「冻结公开面」契约,level_runner 保留 buy_product/shop_refresh 等同签名委托方法(架构模块表登记为「外部调用面由宿主同签名委托承载」)。2026-10-26 AdventureRunner 真拆分设计会话裁定新原则:纯转传委托=Middle Man 反模式,新件一律调用方直连不留壳(godot-master 技能库审查同判);本批不动该委托层(真拆分条目范围仅撤 8 条白盒转发属性),其拆除与调用文件改址由本条承接。 +**实况**:证据=迭代 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.0,2026-10-29)。 **改动面**:游戏代码 -**状态**:待写卡 +**状态**:已写卡 #### 超预算图策略升级路径——等比缩放与滚动视口两案待裁(2026-10-24 登记,来源=批次移交) From cf0e40cca8f2a43dbd7e07335003de804b3dcf2c Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 29 Oct 2026 04:49:34 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=A4=8D=E6=A0=B8(level=5Frunner=20?= =?UTF-8?q?=E5=95=86=E5=BA=97=E5=A7=94=E6=89=98=E5=B1=82=E6=8B=86=E9=99=A4?= =?UTF-8?q?):=20=E5=8D=A1=E7=89=87=20v1.1=20grilling=20=E5=A4=8D=E6=A0=B8?= =?UTF-8?q?=E9=97=A8=E9=80=9A=E8=BF=87=E2=80=94=E2=80=94=E8=B7=A8=E7=B1=BB?= =?UTF-8?q?=E5=90=8C=E5=90=8D=E6=89=AB=E6=8F=8F=E5=88=A4=E7=B1=BB=E5=BD=92?= =?UTF-8?q?=E5=B1=9E=EF=BC=88BattleOrchestrator.player=5Frequest=5Frefresh?= =?UTF-8?q?/CurioDeck.pool=5Fstock=20=E6=8E=92=E9=99=A4=E9=9D=A2=EF=BC=89?= =?UTF-8?q?=E3=80=81=5Fshop=20=E8=AF=8D=E7=BA=A7=E5=BD=92=E9=9B=B6?= =?UTF-8?q?=E5=88=A4=E6=8D=AE=E3=80=81set=5Fshop=5Fpool=20=E9=99=88?= =?UTF-8?q?=E6=97=A7=E8=B0=83=E7=94=A8=E6=96=B9=E9=99=88=E8=BF=B0=E8=AE=A2?= =?UTF-8?q?=E6=AD=A3=EF=BC=88=E6=9E=84=E9=80=A0=20ctx=20=E4=BE=9B=E7=BB=99?= =?UTF-8?q?=EF=BC=8C=E4=BA=A7=E5=93=81=E7=A0=81=E9=9B=B6=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E6=96=B9=EF=BC=89=E3=80=81=E6=B5=8B=E8=AF=95=E9=9D=A2=E7=B2=BE?= =?UTF-8?q?=E7=A1=AE=E8=AE=A1=E6=95=B0=EF=BC=8827=20=E5=91=BD=E4=B8=AD=3D2?= =?UTF-8?q?5=20=E5=AE=9E=E6=94=B9+2=20=E5=90=8C=E5=90=8D=EF=BC=89=EF=BC=9B?= =?UTF-8?q?=E9=9B=B6=E5=BE=85=E8=A3=81=E7=82=B9=E6=94=BE=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...±‚卡片-level_runner商店委托层拆除-2026-10-29.md | 16 ++++++++-------- 待办清单.md | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/reports/需求卡片-level_runner商店委托层拆除-2026-10-29.md b/reports/需求卡片-level_runner商店委托层拆除-2026-10-29.md index 39fcc5d5..e555a661 100644 --- a/reports/需求卡片-level_runner商店委托层拆除-2026-10-29.md +++ b/reports/需求卡片-level_runner商店委托层拆除-2026-10-29.md @@ -1,6 +1,6 @@ # 需求卡片——level_runner 商店委托层拆除批 -- 版本:v1.0(2026-10-29) +- 版本: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` 占位符届时代换) @@ -35,11 +35,11 @@ 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 全仓扫描)。 +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)/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。 +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。 保留面(非委托,仅随成员更名): @@ -77,7 +77,7 @@ | 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 | |---|---|---| -| 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 调用方改述为 AdventureRunner 经 runner.shop 注入 | 反哺点清单(`reports/iter-反哺点-<日期>.md`),用户裁决后归文档批落文;实现批禁直改 | +| 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-反哺点-<日期>.md`),用户裁决后归文档批落文;实现批禁直改 | 其余文档无关联点:GDD 商店/秘宝/天赋树各节机制陈述(扣账口唯一、刷新双源、折价边界、爬价公式)不因调用面搬家而变(grep 考证 2026-10-29)。 @@ -107,7 +107,7 @@ game/presentation/main.gd 调用点改址 1 处【非 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)【非行为——R1】 +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】 @@ -125,7 +125,7 @@ game/tests/unit/core/tree_rules_v11_test.gd 头注同步 1 处【非行 - 取用:—(首批)。 - 产出:全部调用点 `*.shop.*` 直连形态(壳在位,行为零改动的中间态);T1 依赖「删壳后零编译错」以本产出为完整性基线。 -- [ ] level_runner.gd:44 成员更名 `var shop: ShopSession`(行注释同步),内部引用 :99/:102/:104/:305–306/:506–507/:704/:729 全部随更名;核查=grep `_shop` 于 level_runner.gd 归零 +- [ ] 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——宿主回调装配面,非委托) - [ ] 产品码改址六件(形态=`.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(...)`) @@ -139,7 +139,7 @@ game/tests/unit/core/tree_rules_v11_test.gd 头注同步 1 处【非行 - [ ] 删除 level_runner.gd:722–724 区块注释涉委托句+:725 契约注释(保留「商店房兑付」节头与件注入说明)+: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.` 使用点)——产品码与测试面零命中,输出留实现报告 +- [ ] 残留扫描: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` @@ -160,7 +160,7 @@ game/tests/unit/core/tree_rules_v11_test.gd 头注同步 1 处【非行 | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点) | 层级 | 真实入口 | 判据绑定面 | 能力行 | |---|---|---|---|---|---|---| | 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:722–724 句+:725+:751–828(含死壳 `_spend_discounted`:772/`pool_stock`:787) | 残留扫描零命中(T1 静态步)+T1 套件绿 | 静态+单元 | grep 全仓(19 方法名清单固定)+套件真实入口 | 扫描面>0 前置(grep 命令对 19 名单非空可执行)+壳删后零引用可编译 | 既有:GP 钱包/escrow/商店收口/共享池 | +| R2 壳块拆除(非行为改动——纯转传方法与契约注释删除,行为承载在 ShopSession 不变) | level_runner.gd:722–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/商店收口/共享池 | diff --git a/待办清单.md b/待办清单.md index 376264e8..d6a13fbc 100644 --- a/待办清单.md +++ b/待办清单.md @@ -98,7 +98,7 @@ #### 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.0,2026-10-29)。 +**实况**:证据=迭代 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,复核门通过零待裁点)。 **改动面**:游戏代码 From 60c1a962ab9548f6cf3af3c7bface04e8cda1195 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 29 Oct 2026 05:05:29 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E7=99=BB=E8=AE=B0(=E5=B0=BE=E6=B3=A2?= =?UTF-8?q?=E6=B8=85=E5=81=BF=E6=89=B9=C2=B7v2.0=E5=AE=9A=E7=A8=BF):=20?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=AE=B5=E8=A3=81=E5=86=B3=E9=97=AD=E5=90=88?= =?UTF-8?q?D1-D6=E2=80=94=E2=80=94D1=E8=A3=85=E6=9D=BF=E5=9F=9F=E6=8B=86?= =?UTF-8?q?=E6=96=B0=E4=BB=B6BoardInstaller=E4=B8=A4=E4=BF=AE=E6=AD=A3(?= =?UTF-8?q?=E5=A4=8D=E4=BD=8D=E5=9D=97=E7=95=99=E5=AE=BF=E4=B8=BB=E8=96=84?= =?UTF-8?q?=E5=A3=B3/=5Fboard=5Fgenerator=E9=9A=8F=E4=BB=B6=E9=80=80?= =?UTF-8?q?=E5=BD=B9,architecture=20v1.24=E8=BD=B4=E4=B8=99=E4=B8=8E?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=B1=82=E8=A1=8C=E8=90=BD=E6=96=87)=C2=B7D2?= =?UTF-8?q?=E6=82=AC=E5=81=9C=E5=9F=9F=E4=B8=8D=E6=8B=86=C2=B7D4=E6=96=AD?= =?UTF-8?q?=E7=82=B9=E5=9F=9F=E4=B8=8D=E6=8B=86=C2=B7D5=E4=BA=94=E9=99=8D?= =?UTF-8?q?=E5=80=BC=E9=94=AE=E8=B1=81=E5=85=8D=E7=BB=88=E5=B1=80=C2=B7D6?= =?UTF-8?q?=E5=86=99=E5=8D=A1=E6=9C=9F=E4=BF=AE=E6=AD=A3=E6=94=B9=E5=88=A4?= =?UTF-8?q?=E5=B9=B6=E6=8E=92=E7=BC=96=E9=98=9F(=E5=8E=9F=E5=90=B8?= =?UTF-8?q?=E6=94=B6=E6=A1=88=E5=90=A6=E5=86=B3:=E8=90=BD=E7=AC=94?= =?UTF-8?q?=E5=8F=91=E7=8E=B0=E8=AF=A5=E5=9F=9F=E5=B7=B2=E6=9C=89=E5=AE=9A?= =?UTF-8?q?=E7=A8=BF=E5=8D=A1v1.1=E9=9B=B6=E5=BE=85=E8=A3=81=E7=82=B9?= =?UTF-8?q?=E4=B8=94=E5=A5=91=E7=BA=A6=E7=B2=BE=E5=BA=A6=E6=9B=B4=E9=AB=98?= =?UTF-8?q?,=E9=94=80=E4=B9=8B=E9=87=8D=E5=86=99=E5=B1=9E=E6=8D=9F?= =?UTF-8?q?=E8=80=97;=E4=B8=A4=E5=8D=A1=E5=90=8C=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E5=90=84=E6=89=A7=E5=90=84=E5=90=88=E5=90=8C,level=5Frunner?= =?UTF-8?q?=E4=BA=A4=E5=8F=A0=E4=B8=BA=E4=B8=8D=E7=9B=B8=E9=82=BB=E5=8C=BA?= =?UTF-8?q?=E6=AE=B5);=E5=8D=A1v2.0=E5=88=A0T6/V6,=E4=BC=B0=E6=97=B63?= =?UTF-8?q?=E2=80=934.25=E5=B7=A5=E4=BD=9C=E6=97=A5,=E5=BD=92=E7=BB=BF6?= =?UTF-8?q?=E8=B1=81=E5=85=8D5,=E9=9B=B6=E5=BE=85=E8=A3=81=E7=82=B9?= =?UTF-8?q?=E5=8F=AF=E7=BC=96=E6=8E=92;=E5=BE=85=E5=8A=9E=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E7=8A=B6=E6=80=81=3D=E6=96=87=E6=A1=A3=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=B7=B2=E9=97=AD=E5=90=88=EF=BC=8B=E5=B7=B2=E5=86=99?= =?UTF-8?q?=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engineering/architecture/architecture.md | 10 +- .../需求卡片-gdstyle尾波清偿批-2026-10-29.md | 206 ++++++------------ 待办清单.md | 6 +- 3 files changed, 72 insertions(+), 150 deletions(-) diff --git a/design/engineering/architecture/architecture.md b/design/engineering/architecture/architecture.md index 0449bbb4..28be41d5 100644 --- a/design/engineering/architecture/architecture.md +++ b/design/engineering/architecture/architecture.md @@ -2,8 +2,8 @@ ## 文档状态 -- 版本:1.23 -- 最近更新:2026-10-29(迭代 41 反哺落文——ConfigDB/SlotStore/MetaStateStore/meta_progression 四行全清定稿注记转现状登记+minesweeper_rules 消费依赖补 last_round_end 方法形态注记;action_economy/variation/status_container/board_generator/unit_container/reward_economy 六行公开面零语义变化未动) +- 版本:1.24 +- 最近更新:2026-10-29(尾波清偿批设计闭合落文——「战斗编排域拆件定稿」节增补轴丙 BoardInstaller(`core/board_installer.gd`,实现批建件):装板域六函数迁出、宿主复位留薄壳、BoardGenerator 实例随件;battle_orchestrator 行 B1 域文件集句两新件→三新件随动;迭代 41 反哺注记转正文现状,沿革查 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`,文档树构成以根索引为准) @@ -115,10 +115,11 @@ | 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API | |---|---|---|---|---| -| **battle_orchestrator**(B1) | 段序骨架(七段结构冻结)、轮 facts 缓冲、可回放步骤流、[明细行协议](../../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)(基础行型+扩展行两层 + 字段分层,词表以 owner「明细流水」节为准)、条款③⑤闭合对账、**战斗域全部跨系统调用权**、效果引擎宿主面与树规则挂点施加面(**已拆出 BattleFxHost 并实装(2026-10-28 迭代 40——battle_fx_host.gd/reward_grant.gd 两件在库,效果引擎宿主面归 BattleFxHost 行承载,拆件细则见「战斗编排域拆件定稿」节)**) | `begin_battle(encounter)`;窗口/刷新意图提交面(扮演 D1);`level_clear()`;步骤流(输出契约) | B2/B3/B4 全调用面(**唯一调用方=B1 域文件集:battle_orchestrator.gd + settlement/ 五段段类 + damage_controller + 拆件后两新件**);A3 request_refresh 代理 + 回发;A2 install/retire + 三事件订阅;A1 generate(attempt 非 scope 事件);D2 SettlementTable + set_reload_gate | 无(零随机、禁 await——切片 88 冒烟实证可回放) | +| **battle_orchestrator**(B1) | 段序骨架(七段结构冻结)、轮 facts 缓冲、可回放步骤流、[明细行协议](../../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)(基础行型+扩展行两层 + 字段分层,词表以 owner「明细流水」节为准)、条款③⑤闭合对账、**战斗域全部跨系统调用权**、效果引擎宿主面与树规则挂点施加面(**已拆出 BattleFxHost 并实装(2026-10-28 迭代 40——battle_fx_host.gd/reward_grant.gd 两件在库,效果引擎宿主面归 BattleFxHost 行承载,拆件细则见「战斗编排域拆件定稿」节)**) | `begin_battle(encounter)`;窗口/刷新意图提交面(扮演 D1);`level_clear()`;步骤流(输出契约) | B2/B3/B4 全调用面(**唯一调用方=B1 域文件集:battle_orchestrator.gd + settlement/ 五段段类 + damage_controller + 拆件后三新件**);A3 request_refresh 代理 + 回发;A2 install/retire + 三事件订阅;A1 generate(attempt 非 scope 事件);D2 SettlementTable + set_reload_gate | 无(零随机、禁 await——切片 88 冒烟实证可回放) | | **BattleFxHost**(`core/battle_fx_host.gd`,B1 域·效果引擎宿主件,2026-10-26 编排域拆件设计定稿——实现批建件) | 效果引擎挂点施加面唯一承载(自 battle_orchestrator 收编 fx 族):事件发射与事实判定(_fx_emit/_fx_fact)、主角 AC 基线与本轮/本战 AC 累积、bonus_delta 四轴累积(战末宿主 drain 汇入账本)、揭示待兑队列与兑付(含 _fx_revealing 再入闸——同步信号回环防二次缓冲二次兑付)、树规则合成订阅的 round/battle 桶计数器持有(桶随编排器生灭语义不变) | 构造=引用束注入(防 _init max-parameters 新键);bind 时注入 emit Callable(行发射经宿主协议面单点)与兑付 Callable(RewardGrant 授予面——揭示队列 flush 回调);只读投影分两类消费方:AC 累积/bonus_delta 供宿主呈现快照与战末 drain,揭示态供宿主 A2 订阅旁路判定;`luck_bias_for(cell_count) -> int` 偏运合计查询口(体内三参形 dispatch——reward_roll 发射与 bias_rewards 求和自 RewardEconomy 收回本件,RewardEconomy 经注入 Callable 消费) | EffectEngine(EffectContext 引用束);RngServiceCore(fx_reveal 封闭流——除该流外零随机);A2 minesweeper(板读与 fx_reveal 调用);A3 action_economy(queue_ap_delta/charge_layers 读);B3 status_container 读;B2 unit_container 读(hp_ratio);DamageController(set_hero_ac_override);ConfigDB;encounter 引用 | 无(零 await——效果引擎全同步解释器) | | **RewardGrant**(`core/reward_grant.gd`,B1 域·奖励授予件,2026-10-26 编排域拆件设计定稿——实现批建件) | 奖励授予唯一兑付管线(自 battle_orchestrator 收编 grant 族):极性字典路由与封印溢价兑付(_grant_routed)、三种行应用(flat/percent/gp)、伤害单据提交面(_submit 族)、清图奖励与身份授予、秘宝使用编排(use_treasure 四步)、战斗域 GP 缓冲 escrow 与授予段暂存伤害闸(_defer_board_damage/_deferred_board) | use_treasure 编排入口(treasure_interact_controller 经组合根现值回调直连);授予入口(结算段类直调);只读投影(escrow 读与 GP 掉落合计——宿主呈现快照与 _roll_gp_drop 消费) | B4 RewardEconomy(polarity_row/grant);B1 域 DamageController(开单);BattleFxHost 引用(treasure_used 事件发射与计数器消耗);A2 minesweeper(校验回调/fx_reveal/remove_mines_in);A3 action_economy(相位闸/grant_ap/queue_ap_delta);B3 status_container(apply_effect/池读);B2 unit_container(hero_unit/heal);ConfigDB;注入 emit Callable、宿主 fatal Callable(battle_result 状态机唯一写点留宿主)、宿主 attune 读投影(_attune_safe_seen)、encounter 账本引用;TreasureItems 经宿主 setter 转发注入(库存注入时序在宿主构造之后) | 无(零随机零 await——授予期零随机口径,roll 值授予前已定) | | **damage_controller**(B1 域·伤害单据管线) | 伤害单据唯一兑现管线(单据九栏目声明→分量掷点/克制修正/伤害下限归一→明细行发射;双方同规) | 兑付入口(编排侧开单)+ fx 揭示回调注入位 | B2 单位实例(单据目标传入);B1 注入(EffectContext 引用束与编排回调) | 无 | +| **BoardInstaller**(`core/board_installer.gd`,B1 域·装板域件,2026-10-29 尾波清偿批设计闭合——实现批建件,细则见「战斗编排域拆件定稿」节轴丙) | 棋盘安装与变异布置域唯一承载(自 battle_orchestrator 收编装板族六函数):生成受理、全局作用域变异决议、资源摇号资格域组装(roll_board 恰一次)、region 变异决议与连通片布置;BoardGenerator 实例随件自建自接线(宿主成员退役)——宿主侧装板后状态复位(封印/完美计数清零、板序推进、board_changed 发射、秘宝叠加层退役)留宿主薄壳,时序逐字保持 | `install(during_round) -> bool` 单入口;构造=引用束注入(rng/db/minesweeper/reward_economy/encounter 只读引用+宿主 fatal Callable——防 _init max-parameters 新键) | A1 board_generator(件内持有);A2 install_board;B4 roll_board/board_skew 写;A4 变异决议行集经 ConfigDB;board_gen/variant_place 两封闭流随件、流名与开流时点零漂移 | 无(零 await——装板全同步) | | **settlement/ 五段段类**(B1 域·结算段件) | B1 每轮结算序列的五段逻辑件(授予/增益减益/战斗/衰减/判定——细则见下「战斗域装配现状」节) | 段处理入口(B1 接线调用);可直接 `new()` 单测 | B2/B3/B4 兑付面与 B1 轮 facts 缓冲(各段按职责) | 无 | | **level_runner**(C1-lite,切片已建) | 关卡域生命周期(节点链推进、共享 B4 + HP 携带、关卡末 level_clear) | 节点推进接口;LevelTable(`level.tres`——节点 enum {battle,reward,rest,boss}、末节点必须 Boss、ConfigDB 跨表校验⑧) | B1(直构 BattleOrchestrator 接线战斗)、ConfigDB LevelTable | 无 | | **run_structure**(C2) | 冒险/关卡序列、失败重开、**master_seed 唯一接线方** | (契约规范源:`../../gdd/systems/冒险循环/冒险结构.md`) | RngService.set_master_seed、C3/D2 | 无 | @@ -132,6 +133,7 @@ ### 战斗编排域拆件定稿(2026-10-26 用户裁写入——gdstyle 存量债波 1 设计闭合;同日独立审查(grilling+godot-master 双子代理)阻断 8 条去重 6 组全折入本节,v1.18;2026-10-28 迭代 40 实现批合回(合并提交 514457d1),本节为现状登记) - **轴甲两件**:battle_orchestrator(1313 行/50 成员,S13 全库单文件最大户)按变化原因拆出 BattleFxHost(效果引擎宿主域)与 RewardGrant(奖励授予域)两协作件;宿主保留架构在册职责全部——战斗状态机与生命周期、轮 facts 缓冲(_facts_reveals/seals/path)、A2 三事件订阅、结算五段驱动、attune 族原位、行发射基建(_emit_row/_assert_row_source/_fatal)、呈现投影(presentation/diagnostic_snapshot 唯一出口不变)、刷新面、nest_preview_count(巢穴预告读数口——外部直读面 main.gd 与 treasure_effects_test 随批点名冻结)。拆件动机与残留债口径见待办清单「gdstyle 存量债全量清偿」条目。 +- **轴丙一件(2026-10-29 尾波清偿批设计闭合——实现批建件)**:battle_orchestrator 装板域六函数(`_install_new_board`/`_resolve_global_variant`/`_place_variants`/`_place_variants_apply`/`_variants_fringe`/`_adjacent_to_packs`,约 140 行;全仓仅宿主三调用点——begin_battle/中途刷新受理/player_request_refresh,实查零外部调用)按变化原因拆出 BoardInstaller,职责语句「棋盘安装与变异布置域」(生成→全局变异决议→装板受理→资源摇号→变异布置;单一变化原因=棋盘设置顺序与变异布置算法)。形态两修正(实测裁,与初案「逐字搬运」之差):①宿主复位块不随件——`_install_new_board` 体内五处计数清零、板序推进、board_changed 发射与秘宝叠加层退役留宿主薄壳 `_install_and_reset`,三调用点改调薄壳、时序逐字;②`_board_generator` 全文件仅装板族使用——实例随件自建自接线(fatal 经注入 Callable),宿主成员退役(类变量 38→37,禁无效成员义务)。encounter(23 处跨宿主)与 _reward_economy(18 处)确认留宿主、经引用束注入。文件长键(1035/1000)随本件迁出归绿;attune 族与 begin_battle 受理段序禁动不变。 - **跨件单向接线**:RewardGrant 持 BattleFxHost 引用(treasure_used 事件发射与计数器消耗);BattleFxHost 对授予面走 bind 时注入的兑付 Callable(揭示队列 flush 回调)——禁双向强引用(两件均 RefCounted,环引用随每战新建泄漏)。行发射经 bind 时注入的 emit Callable(协议面单点留宿主——CurioDeck bind_handlers 同款先例,禁件回调宿主私有族);轮 facts 缓冲留宿主、fx 件经注入取值;_seal_consumed 留宿主(与 A2 seal_judged 订阅同域);fatal 经注入 Callable 转宿主 _fatal(battle_result 状态机唯一写点不变)。注入 Callable 亦属接线面、同单向纪律——禁为省参数改持对象引用。授予件对账本零强引用:战斗期消费经 `battle_hooks` 三键回调束(attune_consume/vision_add/negative_blast,bind_battle 缺键 assert),宿主侧三单点记账(2026-10-28 迭代 40 合并适配实装——RunLedger 类已随迭代 39 退役,直持对象引用无处可指)。 - **战斗域读面(RunLedger 退役后)**:账本读经编排器 `_journal()`/`_attune_loadout()` 现值派生(GainJournal/AttuneLoadout,enc 派生、无成员接收);冒险桶经 `enc["adv_bucket"]` 下传 `battle_fx_host.mount_buckets`;战末 bonus 四轴经 `GainJournal.gain_bonus` 汇入(2026-10-27 迭代 39 主角账三件落地、迭代 40 合并适配承接)。 - **settlement/ 段类随动**:段类构造注入直持宿主+两新件三引用(Middle Man 禁令封转发壳——调用点改指),授予段读写面点名:_grant_routed×5/_submit×6/escrow 写/_fx_new_resource_types/_feat_first_dig_used/_fx_bonus_delta 写/_apply_ac_bonus/_fx_enqueue_reveal/_flush_pending_reveals/_grant_clear_reward/counters_ctx;战斗段 _defer_board_damage 复位与 _deferred_board 结账改指 RewardGrant。四个授予段 helper(_feat_yield_adjust/_harmful_variants/_harmful_adjacent/_hits_of)与 _pool_effective/perfect_sweep_earned 留宿主(段类经宿主引用直调,现状形态)。 @@ -139,7 +141,7 @@ - **呈现零变化**:两快照出口签名与载荷逐字不变,内部改读两件只读投影(快照本体不读揭示态——揭示态投影消费方=宿主 A2 订阅旁路判定);treasure_interact_controller 三触点分家——use_treasure 经组合根现值回调改注 RewardGrant(每战新建编排器,禁一次性直引防悬挂),minesweeper 读与 attune_convert_state 仍走宿主取值回调(双取值面);nest_preview_count 直读面零变化。 - **S13 键账收敛义务**:12 个超标键随函数迁入新文件=基线外 NEW(use_treasure 长度/分支/局部/返回×4、_grant_routed 参数 8、_dispatch_row 参数 6、_apply_percent_row 参数 6、_apply_gp_row 参数 6、_apply_flat_row 参数 7+返回 9、_submit_flat_hero 参数 7、_fx_fact 返回 7)——卡内同步收敛为本波义务(_grant_routed 等签名随引用束注入改形、use_treasure 体拆分),禁波 0 合并 refresh 吸收新文件未还键;新件 _init 引用束注入防 max-parameters 新键。 - **验收红线**:游戏行为零变化(RNG 消费序零漂移——fx_reveal 封闭流随件迁移取号序不变、信号顺序契约冻结、明细行协议词表零触碰、同种子逐位一致);battle_orchestrator 头注发射点指址随拆件改写(词表不动,指址须真);行数恶化债清偿义务(迭代 38 特批带红合并挂账 c4c69701——本波还债归绿);PARITY 触面(battle_orchestrator.gd 被改)实跑对拍须经用户批准、不得借机重锚;S13 改善非清零口径(宿主残留 8–10 键+随迁键卡内收敛后新件零残留为达标线)。 -- **S7/S8 随动**:RewardGrant 调 B4 API,两新件一并登记进 S7 B1 域文件集与 S8 结算路径 await 文件集(static_scan.sh 两清单独立、同批更新——防 await 面漏闸)。 +- **S7/S8 随动**:RewardGrant 调 B4 API,两新件一并登记进 S7 B1 域文件集与 S8 结算路径 await 文件集(static_scan.sh 两清单独立、同批更新——防 await 面漏闸);轴丙 BoardInstaller 同规(调 B4 roll_board,实现批随批增行)。 ### 冒险域拆分(现状登记——2026-10-26 设计闭合,2026-10-27 迭代 39 拆件批实装,本节各条即现行形态) diff --git a/reports/需求卡片-gdstyle尾波清偿批-2026-10-29.md b/reports/需求卡片-gdstyle尾波清偿批-2026-10-29.md index 44568da2..9115ade9 100644 --- a/reports/需求卡片-gdstyle尾波清偿批-2026-10-29.md +++ b/reports/需求卡片-gdstyle尾波清偿批-2026-10-29.md @@ -1,27 +1,28 @@ # 需求卡片——gdstyle 尾波清偿批 -> **版本状态**:v1.0 草稿——设计段待裁点未清(第 6 节四个拆件项待用户裁决;裁决清零前本卡不得编入迭代)。 +> **版本状态**: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 键经拆件降值后按设计段裁决走豁免登记或基线留债。手段只有两类:存量文件内部拆私有函数(呈现层先例)、按职责拆协作件(核心层先例)。 +这批做什么:把 gdstyle 静态质量闸(S13)基线余量 16 键中的 11 键定向清偿——6 键降到阈值内(闸不再记它,下称归绿),5 键按第 6 节裁决维持或降值后走 architecture 豁免登记(批末随实测值落文)。手段只有两类:存量文件内部拆私有函数(呈现层先例)、按职责拆协作件(核心层先例)。 什么状态算完: -1. 11 键逐键达到第 7 节写明的预期结果(归绿或降值后的实测值)。 +1. 11 键逐键达到第 7 节写明的预期结果(归绿 6/豁免 5——豁免键实测值落 architecture 豁免登记段)。 2. 游戏行为零变化:同种子下事件流、步骤流、断点快照、棋盘渲染逐位一致(第 4 节红线)。 3. 批末代码域闸全绿(冒烟+单元+集成+探针+渲染 golden+静态扫描),键账对账完成(第 13 节)。 4. 实现报告与反哺点清单落 `reports/`(末卡产出物落位卡)。 ## 2. 设计事实源 -本卡属需求性工程条目(结构整改、改游戏代码面),按五段流水线凭工程债证据直接写卡、无 GDD 设计前置。证据指认: +本卡属需求性工程条目(结构整改、改游戏代码面),按五段流水线凭工程债证据写卡;四个拆件项的设计段裁决于 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 三卡归并)——继续有效,本卡沿用其中对呈现层「内部拆私有函数、不拆构建步件」与「全部波不改游戏规则与玩家可见行为」的裁定。 -- 前置设计段:四个拆件项(第 6 节)未过设计段裁决。本卡只提供职责语句、拟拆清单与耦合边界供裁决,不代替裁决;裁决产物(architecture.md 模块归属表登记行、S13 豁免登记条)经反哺点通道由文档批落文。 +- `design/engineering/architecture/architecture.md` v1.24——轴丙 BoardInstaller(装板域拆件)已随本卡设计闭合落文(模块归属功能层新行+拆件定稿节增补),实现照册施工。 +- 并排执行卡:`reports/需求卡片-level_runner商店委托层拆除-2026-10-29.md` v1.1(键 7 拆除执行合同——D6 并排编队,见第 6 节)。 ## 3. 现状事实(代码级,开工自行复核;行号为 2026-10-29 实查) @@ -39,16 +40,17 @@ | 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`——其中断点恢复域成员 6 个(:30-37 区段) | +| 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)——拆件不触任何外部调用面。 -- 六函数现行均无超标键(基线无其函数级键),函数体逐字搬运即计数不变,新文件零新增键。 -- 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)引用——委托面处置是跨文件改址。 -- `game/tests/unit/core/breakpoint_resume_test.gd:185` 直读 `AdventureRunnerScript.BREAKPOINT_FIELDS`——断点域若拆件,此处须随迁改址。 +- 六函数现行均无超标键(基线无其函数级键);`_install_new_board` 体内 442-451 行为宿主态复位块(五处计数清零+板序推进+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. 设计契约(违反即返工的红线条款) @@ -57,84 +59,37 @@ - 🔴 **PARITY 触面**:battle_orchestrator.gd 触 PARITY_TOUCH_FACES——实跑对拍须经用户批准、不得借机重锚。 - 🔴 **呈现零变化**:board_view 改动的画面判据=`game/tests/golden/` 既有三张棋盘基线(L1 dungeon/L2 underdark/L3 deep_underdark),对拍差异非零即红;重建基线只许用户批准,实现批禁自行换锚。 - 🔴 **拆分边界纪律**(判据权威=code-conventions §1.1,此处立卡内执行条款):①每个拆出单元须有可陈述的职责语句与单一变化原因(实现报告逐件一行承载);②拆出单元须有集体身份——命不出名字、只能说「剩下的成员」的打包=凑计数袋,禁;③「过阈值」只许作为发现信号,作为拆分或收拢的动机即违规;④按纪律拆不出内聚单元 → 停卡呈报走豁免/还债通道,禁硬拆凑绿;⑤拆分沿职责轴不沿阈值轴。 -- 🔴 **禁为机检文本保留无效成员**:禁止为迎合机检消息文本(含计数)而保留或新增无效成员/别名;机检键与卡片契约互斥时,实现段一律停卡呈报,不得自造第三条路。 -- 🔴 **残留处置不承诺清零**:5 个降值键拆件后的终局处置(架构豁免登记或基线留债)=设计段裁决(第 6 节 D5);实现段不得为凑阈值自造豁免或改阈值。 +- 🔴 **禁为机检文本保留无效成员**:禁止为迎合机检消息文本(含计数)而保留或新增无效成员/别名——装板域拆件后宿主 `_board_generator` 成员随之退役(38→37);机检键与卡片契约互斥时,实现段一律停卡呈报,不得自造第三条路。 - 🔴 **基线纪律**:禁为过闸 refresh 换绿;还债=数值下降自然绿;出现恶化=停卡呈报(细则第 13 节)。 - 🔴 **attune 族与 begin_battle 序列禁动**:battle_orchestrator 的 attune 族原位保留(迭代 39 副卡语义领地);begin_battle 受理段序与五段驱动逻辑禁动——装板域拆件只改 `_install_new_board()` 调用点的取件改址。 -- 🔴 **断点键集冻结**:`BREAKPOINT_FIELDS` 27 键逐键冻结(键名、策略标签、键序零变化);随件迁移只换承载文件,不换键面。 ## 5. 范围边界 -做什么:第 3 节 11 键对应的六项改动(第 7 节逐键方案、第 11 节任务卡)。 +做什么:第 3 节 11 键中本卡直接执行的三项改动(第 7 节逐键方案、第 12 节任务卡)——board_view 拆分(键 1–4)、_enter_node 载荷合并(键 9)、装板域拆件(键 10);键 7 的拆除执行合同=并排卡「level_runner 商店委托层拆除」v1.1(D6 裁定并排编队,见第 6 节)。 不做什么: -- 5 个豁免讨论键(main.gd/tune_sim_controller/board_cell_unit/standee_body/battle_orchestrator 类变量)——去向:主会话另行讨论豁免通道,本卡不收件、不落反哺点。 +- 商店委托壳拆除的执行——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` 能力清单——实现批禁写;受影响行(若有)由写卡段在形态裁决后的卡修订版同批更新(第 12 节对照表注记)。 +- `game/tests/README.md`——实现批禁写;GP 钱包行真实入口列已随本卡 v2.0 改为 ShopSession 直连(计划入口,闸双通道认卡),批末核对表上名字与实际落地一致。 - 数值表、RNG 流词表、信号载荷 schema——零触碰。 -- level_runner 商店域若设计段裁「剔除」(D3),该域整项退回在册条目「level_runner 商店委托层拆除」单独立卡,本卡该两键留债。 -## 6. 前置设计段待裁点(四个拆件项——本卡编入迭代前置=待裁点经设计段由用户裁决清零) +## 6. 设计段裁决记录(2026-10-29 用户裁——D1–D6 全部闭合) -四项均未过设计段裁决。每项给出职责语句、单一变化原因、拟拆清单、耦合边界与备选案(推荐案在前、淘汰依据随后);**卡片不代替用户裁决**。 - -### D1 battle_orchestrator 装板域拆件 - -- **职责语句**:棋盘安装与地形变异布置域——生成棋盘、装板受理、资源摇号资格域组装、变异决议与布置。 -- **单一变化原因**:棋盘设置顺序(生成→装板→资源→变异)或变异布置算法变化时只改此件。 -- **拟拆清单**(六函数逐字搬运,约 140 行):`_install_new_board`(:414-452)、`_resolve_global_variant`(:460-468)、`_place_variants`(:480-500)、`_place_variants_apply`(:504-530)、`_variants_fringe`(:534-541)、`_adjacent_to_packs`(:545-549)。 -- **耦合边界**:新件经引用束注入取 db、rng(两封闭流同序取号)、minesweeper、reward_economy、board_generator、encounter 现值;`_fatal` 与 `board_changed` 经注入回调(协议面单点留宿主——BattleFxHost/RewardGrant 先例);宿主侧装板后状态复位(_seal_consumed/_seal_miss_seen/_perfect_* 三计数/_board_seq/_board_from_midround_refresh)保留宿主,件内不持宿主状态。静态随动:static_scan.sh 的 S7 B1 域文件集与 S8 await 文件集同批增行(工程红线防漏闸——迭代 40 两新件先例)。 -- **备选案**:推荐=新件 `game/core/board_installer.gd`(B1 域件,三调用点取件改址)。淘汰「函数留宿主只拆 _place_variants 内层」——治不了文件长键;淘汰「六函数搬入既有 BattleFxHost」——效果引擎宿主域与装板域是两个变化原因,混装违单一变化原因。 - -### D2 board_view 悬停域拆件 - -- **职责语句**:悬停预承诺呈现域——三语义光标、目标格边框、BFS 路径预览、chord 双击首遇锚。 -- **单一变化原因**:悬停反馈形态(光标语义/边框/路径预览画法)变化时只改此件。 -- **拟拆清单**:成员 `_hover`(:70)、`_last_click`(:71);函数族 11 个=`_hover_at`(:442)、`_on_shell_mouse_exited`(:453)、`_detect_chord`(:475)、`_on_cell_hover`(:486)、`_on_cell_unhover`(:491)、`_refresh_hover_after_paint`(:497)、`_apply_hover_visuals`(:503)、`_clear_hover_visuals`(:531)、`_set_cursor_shape`(:538)、`_show_path_preview`(:542)、`_hide_path_preview`(:552)。**`_r0` 不随迁**——它是出生展开区资格域成员(徽章/微光/涟漪三消费方共用,:238/:296/:563),与悬停无职责交集,划入悬停件即凑计数袋。 -- **耦合边界**:件经引用束注入取 cells 容器引用、minesweeper 只读引用、diggable 集合引用;壳层光标写入与 `hover_forbidden` 信号经注入回调;`_gui_input`/`_on_cell_input`/`click_cell` 三个入站口留宿主(Control 虚回调与探针契约面不可迁),悬停计算委托件。`hover_probe()` 留宿主读件投影。 -- **备选案**:推荐=新件 `game/presentation/views/board_hover.gd`。淘汰「悬停函数留宿主只迁两成员」——计数降 2 意义微小且函数族与成员本是一个内聚单元;淘汰「并进 hero_sprite 件」——英雄演出与悬停预承诺是两个变化原因。 -- **预期注记**:类变量 32→约 30;公开方法 27 个全为契约承载、预期持平(详见第 7 节键 5/6)。残留处置归 D5。 - -### D3 level_runner 商店域处置 - -- **职责语句**:关卡商店货架与 GP 支出(域件 ShopSession 已存在——迭代 37 建件,宿主现留同签名委托面)。 -- **单一变化原因**:商店货架与定价规则变化时只改 ShopSession。 -- **拟拆清单**:删除宿主同签名委托 17 个公开方法(shop_products/current_price/purchased_tier/buy_product/player_request_refresh/set_shop_pool/pool_stock/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,:751-829)+3 个私有转发(_bind_shop/_spend_discounted/_shop_draw_shelf);外部调用点改直连 ShopSession(宿主新增取件出口)。涉案调用点:呈现层 5 文件+`game/sim/level_autoplay.gd`+测试 4 套件(断言判据零变化、仅调用面改址)。 -- **耦合边界**:ShopSession 的共享引用(wallet/journal/level_row/attunement/tree_rules)绑定逻辑留宿主 `_init`(`_bind_shop` 内容内联);`_enter_node` shop 分支与 `breakpoint_fragment` 经取件出口访问件。`_shop` 成员去留随形态(见备选案)。 -- **备选案**:推荐=候选 A 删委托壳(Middle Man 清偿——2026-10-26 真拆分设计会话已裁「纯转传委托=反模式」先例;公开方法 50→33)。候选 B=委托面保留(现状登记为过渡件)、本卡该两键留债——淘汰依据:委托面已在册单独立项(「level_runner 商店委托层拆除」条),两批重复开工浪费;但若设计段裁本卡剔除该项(见 D6),候选 B 生效。 -- **并案裁决**:本项与在册条目「level_runner 商店委托层拆除——迭代 37 冻结契约期过渡件(2026-10-26 登记)」同面——并案(本卡吸收该条目)或剔除(该条目单独立卡)由设计段裁(D6)。 - -### D4 adventure_runner 断点恢复域拆件 - -- **职责语句**:存档断点组装与回放——断点快照拼盘、回放回填、读侧策略分发。 -- **单一变化原因**:断点键集或回放策略变化时只改此件。 -- **拟拆清单**:成员 6 个=`_save_manager`(:35)、`_resume_bp`(:36)、`_pending_next_level`(:30)、`_last_level_payload`(:31)、`_last_treasure_cleared`(:32)、`_loadout_seeded`(:37);常量 `BREAKPOINT_FIELDS`(:539-568,27 键冻结);函数族=`_snapshot_breakpoint`(:571)、`_bp_parts`(:583)、`_bp_read`(:636)、`_bp_strategy`(:646)、`_bp_read_int`(:651)、`_resume_ledger`(:182)、`_resume_curio_state`(:193)、`_resume_params`(:218)、`_resume_counters`(:237),公开入口 `resume_adventure` 留宿主薄壳。**成员归属注记**:`_pending_next_level`(冒险推进态,continue_to_next_level/_on_level_finished 消费)与 `_loadout_seeded`(同调投行标记)是否随域收编须裁——不随则类变量降幅收窄(28→约 24–26,随 6 成员全迁为约 22)。 -- **耦合边界**:件经引用束注入取 db、rng(restore_adventure 同序)、主角账三件、curio/stop/bank/loadout 四件引用;level_index/master_seed/summary 等宿主冒险态经注入引用或件返回值写回(形态随裁决);`set_save_manager` 转发件。测试侧改址:`breakpoint_resume_test.gd:185` 的 `BREAKPOINT_FIELDS` 直读随迁改址。 -- **备选案**:推荐=新件 `game/core/breakpoint_store.gd`(D3 域件命名族——SlotStore/MetaStateStore 同族)。淘汰「只迁 _bp_* 读侧函数」——写侧拼盘与读侧策略是一个登记单源表的两半,拆开违登记单源;淘汰「断点域并入 save_manager」——存档 IO 原语与冒险断点语义是两个变化原因(SlotStore 拆分已立此界)。 - -### D5 降值键残留处置(横切) - -5 个不可达阈值键(第 7 节键 5–8、11)拆件后的终局处置二选一,由设计段统一裁:**架构豁免登记**(键永久基线内、禁再恶化,理由在册 architecture「测试与质量域」豁免登记段——main.gd 探针契约面先例)或**基线留债**(键留基线随批对账,禁恶化)。淘汰「继续硬拆凑阈值」——拆不出内聚单元,违拆分边界纪律④。 - -### D6 level_runner 商店域并案归属 - -见 D3 末条:并案(本卡吸收在册条目「level_runner 商店委托层拆除」,批完删条)或剔除(本卡该两键留债,在册条目维持待写卡)。 - -### 待裁点汇总 - -| 编号 | 待裁点 | 推荐案 | +| 编号 | 裁决 | 依据(推导链摘要) | |---|---|---| -| D1 | 装板域新件形态与引用束构成;宿主侧复位行归属 | 新件 board_installer.gd;复位留宿主 | -| D2 | 悬停域新件形态;_r0 不随迁认定 | 新件 board_hover.gd;_r0 留宿主 | -| D3 | 商店域候选 A(删委托壳)/候选 B(留债);_shop 去留 | 候选 A | -| D4 | 断点域新件形态;_pending_next_level/_loadout_seeded 归属 | 新件 breakpoint_store.gd;六成员全迁 | -| D5 | 5 个降值键终局处置(豁免登记/基线留债) | 逐键裁决 | -| 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 豁免登记段)。 | 键 | 现状/阈值 | 方案方向 | 预期结果(档位) | |---|---|---|---| @@ -142,66 +97,56 @@ | 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 悬停域拆件迁出 `_hover`/`_last_click` | 约 30,**降值不可达**——残留=D5 | -| 6 board_view 公开方法 | 27/20 | 无拆分动作(27 个逐类核对全为探针契约面与依赖单向纪律承载面,可降空间极小;随 D2 若有微降以实测为准) | 27(持平或微降),**降值不可达**——残留=D5 | -| 7 level_runner 公开方法 | 50/20 | D3 候选 A 删商店委托面 17 个公开方法(外部直连 ShopSession);候选 B 无动作留债 | 候选 A 约 33/候选 B 50,**降值不可达**——残留=D5 | -| 8 level_runner 类变量 | 30/15 | D3 随形态(_shop 收编则 −1,否则持平);无其他收编面 | 约 29–30,**降值不可达**——残留=D5 | -| 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 装板域六函数约 140 行迁出 | 约 890–900(拆后实测),**归绿** | -| 11 adventure_runner 类变量 | 28/15 | D4 断点域拆件(六成员全迁约 22;两成员留宿则约 24–26) | 约 22–26,**降值不可达**——残留=D5 | +| 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 | 「战斗编排域拆件定稿」节与功能层模块归属表(D1 新件行登记、battle_orchestrator 行职责句随动);冒险域/功能层表(D4 新件行登记、adventure_runner 行随动);呈现层表 board_view 行(D2 悬停域件随动);level_runner 行「外部调用面由同签名委托承载」句(D3 候选 A 时换代);「测试与质量域」S13 豁免登记段(D5 若裁豁免) | 设计权威文档——实现批禁直改;逐条列进 `reports/iter-反哺点-<日期>.md`,用户裁决后归文档批落文 | -| game/tests/README.md | 能力清单「棋盘悬停反馈」能力行(已随本卡 v1.0 同批入表——写卡同批义务);「GP 钱包/escrow/商店收口/共享池」行真实入口列(D3 候选 A 时入口改经 ShopSession 直连);代表用例列(本卡新增断言落名后) | 机械面文档——实现批禁写;受影响行由写卡段在形态裁决后的卡修订版同批更新,实现期零改动 | +| design/engineering/architecture/architecture.md | 「战斗编排域拆件定稿」节轴丙与功能层 BoardInstaller 行——**已随本卡 v2.0 设计闭合落文(v1.24)**,实现照册施工;level_runner 行「外部调用面由同签名委托承载」句(D3 候选 A 实现后失真);「测试与质量域」S13 豁免登记段(D5 五键——批末按实测值落文) | 设计权威文档——实现批禁直改;level_runner 句与豁免登记逐条列进 `reports/iter-反哺点-<日期>.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/V2) | -| game/presentation/views/board_hover.gd | 悬停预承诺呈现域件(D2,新增) | 新增(非行为改动;验收=对照表行 V2) | -| game/core/level_runner.gd | 关卡域生命周期编排者 | 修改(非行为改动——_enter_node 载荷合并〔载荷逐字保持〕+D3 商店域形态随裁决;验收=对照表行 V3/V6) | -| game/core/battle_orchestrator.gd | 战斗结算编排中枢 | 修改(非行为改动——装板域六函数迁出、三调用点取件改址;验收=对照表行 V4) | -| game/core/board_installer.gd | 棋盘安装与变异布置域件(D1,新增) | 新增(非行为改动;验收=对照表行 V4) | -| game/core/adventure_runner.gd | 冒险结构编排器 | 修改(非行为改动——断点域迁出、resume_adventure 薄壳化;验收=对照表行 V5) | -| game/core/breakpoint_store.gd | 存档断点组装与回放域件(D4,新增) | 新增(非行为改动;验收=对照表行 V5) | -| game/tests/unit/core/level_shop_economy_test.gd | 关卡图与商店宿主套件 | 修改(新增断言 _test_shop_node_entered_payload;D3 候选 A 时调用面改址——测试侧改址申报见第 17 节) | -| game/tests/unit/core/breakpoint_resume_test.gd | 断点往返套件 | 修改(:185 BREAKPOINT_FIELDS 直读随迁改址——测试侧改址申报见第 17 节) | -| game/tests/unit/core/pool_case_d_test.gd、tree_rules_v11_test.gd、hero_ledger_test.gd | 引用商店委托面的三套件 | 修改(仅 D3 候选 A 时调用面改址) | -| game/tests/static_scan.sh | 静态扫描域承载 | 修改(D1 落地时 S7 B1 域文件集与 S8 await 文件集增行——工程随动) | -| game/presentation/camp_shop_presenter.gd、main_adventure_flow.gd、main_overlay_flow.gd、main_ui_build.gd、game/presentation/views/shop_overlay_view.gd、game/sim/level_autoplay.gd | 商店委托面调用方 | 修改(仅 D3 候选 A 时调用面改址——非行为改动) | +| 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/static_scan.sh | 静态扫描域承载 | 修改(S7 B1 域文件集与 S8 await 文件集增行 board_installer——工程随动,architecture 拆件定稿节 S7/S8 随动条在册) | -每个新增件标「新增」者,其「为什么不能复用」理由与唯一落点核查见第 10 节;两处对不上即卡片不成立。 +新增件「为什么不能复用」理由与唯一落点核查见第 10 节;对不上即卡片不成立。 ## 10. 落位与可复用性预检 -- **board_installer.gd(新增)**:复用面核查——装板与变异布置逻辑现行只存在于 battle_orchestrator(全仓 grep 六函数名仅本文件三处调用,无第二实现),无既有件可复用;不能并入 BattleFxHost(效果引擎宿主域,变化原因不同)也不能并入 RewardGrant(授予管线域)。落点唯一:B1 域新文件,`game/core/`。分层:core 层 RefCounted,零 UI、零 await,经引用束注入取协作对象,禁裸引用 autoload(S5)。 -- **breakpoint_store.gd(新增)**:复用面核查——断点拼盘与读侧策略现行在 adventure_runner 内(`BREAKPOINT_FIELDS` 登记单源表唯一);save_manager 是存档 IO 原语层(SlotStore 拆分已立界:IO 与冒险断点语义分工),meta_state_store 是元进度数据件——都不承载冒险断点组装。落点唯一:`game/core/` 新件。 -- **board_hover.gd(新增)**:复用面核查——悬停预承诺逻辑现行全在 board_view(11 函数族 grep 无外部引用);TilePalette/HeroSprite/CellUnit 各管瓦片/精灵/格件绘制,无一承载悬停交互态。落点唯一:`game/presentation/views/` 新件,由 board_view `_init` 建为子件(HeroSprite 同款挂载先例)。 -- **新增函数**:_build_cell_unit、_paint_cell_* 段函数族——全部是既有函数体的逐字搬运或循环体内联体出函,无新增逻辑;迁移函数对账见第 11 节。**零新增数据件、零新增常量表**(BREAKPOINT_FIELDS 为迁移非新增)。 -- **调用路径显式声明**:board_hover 只被 board_view 持有与调用(输入经宿主入站口委托);board_installer 只被 battle_orchestrator 三调用点取件调用;breakpoint_store 只被 adventure_runner 调用——三件均禁反向持有宿主引用(注入回调单向,先例=BattleFxHost 兑付回调)。 +- **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 | 预算 3(install_new_board+组件出口) | 预算 9(引用束成员) | 六函数现行均无超标键(基线无其函数级键),函数体逐字搬运=计数不变=新文件零新增键 | -| breakpoint_store.gd | 预算 8(快照/回填/读侧入口族) | 预算 6(拟拆成员)+引用束 | _bp_parts 现行 49 行/9 局部(实测 :583-630)均在默认阈值内;_resume_* 四函数均无超标键 | -| board_hover.gd | 预算 6(悬停驱动入口) | 预算 2(_hover/_last_click)+引用束 | 11 函数现行均无超标键(基线无键);_apply_hover_visuals 分支 5 | -| 新增私有函数(board_view 内) | —(私有不计数) | 零新增成员(类变量只降不升) | _paint_cell 三键随拆分消除;段函数逐个低于默认阈值(超 8 分支的段沿绘制层轴下钻,见第 7 节键 1) | +| 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 归绿+2 降值+1 持平不升)、level_runner 3 键、battle_orchestrator 文件长归绿(类变量 38 为豁免键禁恶化)、adventure_runner 1 键。`_init` 一律引用束注入(字典束),防 max-parameters 新键(先例=迭代 40 卡①)。 +存量触面一查:涉案存量文件 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 引用;漂移处就地改卡并记录 +- [ ] 复核涉案文件行数与第 3/7/9/11 节全部 file:line 引用;漂移处就地改卡并记录 **T1 board_view 拆分——4 键归绿(1–1.5 工作日)**(取用:T0 读数;产出:归绿键 1–4) @@ -216,39 +161,21 @@ - [ ] 新增断言 `level_shop_economy_test.gd:_test_shop_node_entered_payload`(规格见对照表 V3) - [ ] 孤立验证:`-- --only=level_shop_economy` 全绿 -**T3 battle_orchestrator 装板域拆件——键 10 归绿(1–1.5 工作日)**(前置:D1 裁决落定) +**T3 battle_orchestrator 装板域拆件——键 10 归绿(1–1.5 工作日)**(前置:architecture v1.24 轴丙在册) -- [ ] 建 `game/core/board_installer.gd`(引用束注入,第 6 节 D1 耦合边界),六函数逐字迁移,宿主三调用点(:271/:801/:835)取件改址;begin_battle 段序与 attune 族零触碰 +- [ ] 建 `game/core/board_installer.gd`(引用束注入,第 10 节落位预检),装板逻辑六函数迁件;`_install_new_board` 拆件体=生成→决议→装板→摇号→布置(415-441 行段),宿主薄壳 `_install_and_reset` 承载复位块(442-451 行段:五处计数清零+板序推进+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(键归绿) +- [ ] 文件长实测 ≤1000(键归绿);类变量实测 37 -**T4 adventure_runner 断点域拆件——键 11 降值(1–1.5 工作日)**(前置:D4 裁决落定) - -- [ ] 建 `game/core/breakpoint_store.gd`(引用束注入,D4 耦合边界),`BREAKPOINT_FIELDS` 与函数族随裁决清单迁移;`resume_adventure` 留宿主薄壳 -- [ ] `breakpoint_resume_test.gd:185` 改址(判据零变化) -- [ ] 孤立验证:`-- --only=breakpoint_resume,save_rng_roundtrip,cross_system_flow,adventure_feats` 全绿 -- [ ] 类变量实测落第 7 节键 11 预期区间 - -**T5 board_view 悬停域拆件——键 5 降值(0.75–1 工作日)**(前置:D2 裁决落定;取用:T1 已合段) - -- [ ] 建 `game/presentation/views/board_hover.gd`,拟拆清单 2 成员+11 函数逐字迁移;三入站口留宿主委托;`hover_probe()` 改读件投影(返回语义零变化) -- [ ] 孤立验证:`tools/probe_gate.sh --click`+`--full` 全绿+render_gate 三张 golden 差异 0.00% -- [ ] 类变量实测 30 - -**T6 level_runner 商店域处置——键 7/8 降值(候选 A 1–1.5 工作日/候选 B 0.25 工作日)**(前置:D3/D6 裁决落定) - -- [ ] 候选 A:删委托面 17 公开+3 私有转发,宿主新增 `shop() -> ShopSession` 取件出口;呈现 5 文件+sim 1 件+测试 4 套件调用面改址(判据零变化);能力清单受影响行由写卡段卡修订版同批更新 -- [ ] 候选 B:零改动,两键留债记录进实现报告 -- [ ] 孤立验证:`-- --only=level_shop_economy,pool_case_d,tree_rules_v11,hero_ledger` 全绿+冒烟 - -**T7 批末对账与收口(0.5 工作日)** +**T6 批末对账与收口(0.5 工作日)** - [ ] 全量闸:`bash tools/run_all_gates.sh --code`(改动全为代码面)全绿;闸 11 触面按第 4 节 PARITY 条款由用户裁决 -- [ ] 键账对账:11 键终值对照第 7 节预期逐键核(归绿 6/降值 5);重锚由用户发令人工 `--refresh`(第 13 节) +- [ ] 键账对账:11 键终值对照第 7 节预期逐键核(归绿 6/豁免 5;键 7 终值视并排卡落地时序——同批编队即见 33);重锚由用户发令人工 `--refresh`(第 13 节);豁免登记 5 条+既有讨论 5 键按实测值落 architecture(反哺点通道) - [ ] 产出物落位卡:`reports/iter-实现报告-<日期>.md`(各卡状态+实机目检总清单+实现决定记录+逐拆出单元职责语句一行)与 `reports/iter-反哺点-<日期>.md`(第 8 节同步面逐条落点)写齐方算收口 -合计估时约 5.25–7.75 工作日(切分预案:D3 裁候选 B 时 −1;T3/T4 任一拆件裁决否决时按留债口径 −1~1.5 并回写第 7 节预期)。 +合计估时约 3–4.25 工作日(切分预案:T3 拆件裁决被证伪时按留债口径 −1~1.5 并回写第 7 节预期;并排卡 v1.1 的 ≈1.5 工作日不占本卡估时,编队总量由编排段合并计)。 ## 13. 验证闸——改动—验收对照表 @@ -257,11 +184,8 @@ | 行 | 需求点(键) | 改动(文件:行) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 | |---|---|---|---|---|---|---|---| | 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 邻作用集/五组色相/零玩法写入);既有:玩家面文案与危险格格面字形 | -| V2 | 键 5——悬停域拆件 | board_hover.gd 新建;board_view.gd:442-552 函数族与 :70-71 成员迁出 | 复用 ui_input_probe(悬停到达/光标语义/路径预览——合成输入路径)+ui_click_probe+type_glow_shot_probe;新增断言零条 | 探针 | 合成 InputEventMouseMotion/MouseButton 经 _gui_input 入站口;hover_probe() 读面 | 探针可见性断言面(hover_probe 返回值、光标形状、格件 st 边框/点迹字段)+golden 三张零差异 | 新增:棋盘悬停反馈(三语义光标/目标格边框/路径预览点迹) | | 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 迁出、: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 取号序零漂移由同种子断言钉住 | 既有:变异布置门控;既有:轮内流与结算五段全序 | -| V5 | 键 11——断点域拆件 | breakpoint_store.gd 新建;adventure_runner.gd 断点函数族与成员迁出 | 复用 breakpoint_resume_test.gd 全套、save_rng_roundtrip_test.gd、cross_system_flow_test.gd:_feats_breakpoint_roundtrip;新增断言零条;breakpoint_resume_test.gd:185 改址(第 17 节申报) | 单元+集成 | AdventureRunner.resume_adventure()/start_adventure() × SaveManagerCore 断点域 | 断点快照往返逐键断言面(27 键冻结——键名/策略/键序零变化) | 既有:断点片段往返与续玩幂等;既有:存档⇄RNG 快照往返保真(集成);既有:旧档迁移链与断点续玩零跳号(集成) | -| V6 | 键 7/8——商店域处置(D3 候选 A 时) | level_runner.gd:751-829 委托面删除;调用点改址(呈现 5+sim 1+测试 4) | 复用 level_shop_economy_test/pool_case_d_test/tree_rules_v11_test/hero_ledger_test 全套(调用面改址、判据零变化);新增断言零条 | 单元 | ShopSession 直连面(候选 A)/LevelRunner 委托面(候选 B 维持现状) | 商店三收口/共享池抽买既有断言面当轮全绿 | 既有: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〕,已挂行)。 @@ -270,8 +194,8 @@ 1. 禁为过闸 refresh 换绿:基线重生成只由用户发令,批末键账对账后人工 `python tools/gdstyle_gate.py --refresh` 一次执行(禁闸内自动重生成、禁实现批中途 refresh)。 2. 还债=数值下降自然绿:拆件后同键数值下降不判红,无需动基线;归绿键在下批重锚后自然消失。 3. 出现恶化(同键数值较登记值上升、基线外新键)=停卡呈报,禁自行消化。 -4. 重锚守卫:新键数较旧基线少逾 10% 须 `--force` 显式确认——本批预期归绿 6 键(16→约 10–11,降幅约 31–37%),重锚时须带 `--force` 由用户执行。 -5. 豁免键(main.gd 类变量等 5 键)不在本批对账范围;battle_orchestrator 类变量 38 为已登记豁免键,本批禁恶化。 +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 零触碰声明 @@ -281,17 +205,15 @@ - **L1 自救**:迁移函数编译错、探针断言调用面改址漏改——就地修复重跑最窄确认。 - **L2 记录继续**:实测值与第 7 节预期区间偏离但在同档位内(如降值幅度略小)——记入实现报告「实现决定记录」。 -- **L3 停机写报告等用户**:①拆分边界纪律④触发——按职责轴拆不出内聚单元(含 D2/D4 成员归属裁决被证伪);②机检预算互斥——新件实数超第 11 节预算或迁移函数现出超标键=上游缺陷停卡退回写卡段;③golden 对拍差异非零;④S13 键恶化或基线外新键;⑤PARITY 触面处置分歧;⑥断言面被下游兜底吸收致判据绑不上(按 test-conventions §8.4 出口呈报)。 +- **L3 停机写报告等用户**:①拆分边界纪律④触发——按职责轴拆不出内聚单元(T1 五段/T3 装板域形态被证伪);②机检预算互斥——新件实数超第 11 节预算或迁移函数现出超标键=上游缺陷停卡退回写卡段;③golden 对拍差异非零;④S13 键恶化或基线外新键;⑤PARITY 触面处置分歧;⑥断言面被下游兜底吸收致判据绑不上(按 test-conventions §8.4 出口呈报)。 ## 17. 测试削弱申报(允许改动的旧断言及理由) -1. `breakpoint_resume_test.gd:185`——`AdventureRunnerScript.BREAKPOINT_FIELDS` 直读随件迁改址为 `BreakpointStoreScript.BREAKPOINT_FIELDS`(D4 落地时);判据零变化,仅常量承载文件换代。 -2. D3 候选 A 时——level_shop_economy/pool_case_d/tree_rules_v11/hero_ledger 四套件中调用 `runner.shop_*()` 委托面的语句改直连取件出口;断言条件与期望值零变化。 -3. 除此之外禁删断言、禁放宽阈值、禁缩小扫描面、禁把真实入口换成下层直调;未申报的削弱由独立验收审计判红。 +零申报——本批不删任何断言、不改判据阈值、不缩扫描面、不把真实入口换成下层直调;唯一新增断言=V3 行〔尾波 V1〕(既有断言零改动)。商店委托面的测试改址归并排卡 v1.1 管辖(其自报零申报——只改调用地址,断言条件与期望值零变化)。未申报的削弱由独立验收审计判红。 ## 18. 独立验收审计 -合并前由未参与实现的会话或子代理执行;报告落 `reports/iter-验收审计-<日期>.md`。审计至少做四件事(test-conventions §8.7):逐行核对第 13 节对照表(测试存在、真执行、尾缀可 grep、真实入口未绕过改动点);抽查判据绑定面;检查测试削弱(对照第 17 节申报);核对 V2/V4/V6 行「非行为改动」判定依据(零漂移证明是否在当轮真实跑批中成立)。未过不得合并。 +合并前由未参与实现的会话或子代理执行;报告落 `reports/iter-验收审计-<日期>.md`。审计至少做四件事(test-conventions §8.7):逐行核对第 13 节对照表(测试存在、真执行、尾缀可 grep、真实入口未绕过改动点);抽查判据绑定面;检查测试削弱(对照第 17 节申报);核对 V4 行「非行为改动」判定依据(零漂移证明是否在当轮真实跑批中成立)。未过不得合并。 ## 19. 代拍板白名单(允许 agent 自行拍板的微决策) @@ -303,6 +225,6 @@ 超清单决策记入实现报告「实现决定记录」节。 -## 20. 待裁点清单(重申——全部待用户裁决,裁决清零前本卡不得编入迭代) +## 20. 裁决记录重申 -D1 装板域新件形态与引用束构成/D2 悬停域新件形态与 _r0 归属认定/D3 商店域候选 A·B 与 _shop 去留/D4 断点域新件形态与 _pending_next_level·_loadout_seeded 归属/D5 五个降值键终局处置(豁免登记或基线留债)/D6 商店域与在册条目并案或剔除。详见第 6 节备选案与淘汰依据。 +D1–D6 已全部裁决闭合(2026-10-29 用户裁,第 6 节):装板域拆新件(两修正)/悬停域不拆/商店域候选 A 并排编队(执行合同=并排卡 v1.1)/断点域不拆/五降值键豁免终局——**零待裁点,卡片可编排**。豁免登记 5 条与既有讨论 5 键合并,批末按实测值经反哺点通道一次落文 architecture。 diff --git a/待办清单.md b/待办清单.md index d6a13fbc..96f81622 100644 --- a/待办清单.md +++ b/待办清单.md @@ -60,13 +60,11 @@ #### 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——其中三条已有架构豁免登记)。需求卡片已成 v1.0 草稿:reports/需求卡片-gdstyle尾波清偿批-2026-10-29.md——**四个拆件项未过设计段裁决**(battle_orchestrator 装板域/adventure_runner 断点恢复域/board_view 悬停域/level_runner 商店域,卡内第 6 节各备选案并列),卡片编入迭代前置=待裁点经设计段由用户裁决清零,卡片不代替裁决。预期两档:归绿 6 键(_paint_cell×3、循环内 new、_enter_node、文件长);降值不可达 5 键(board_view 两键、level_runner 两键、adventure_runner 一键——拆件后实测重锚,残留处置豁免登记或留债归设计段裁决)。与在册条目「level_runner 商店委托层拆除」同面(并案或剔除已列卡内待裁点 D6)。MC/数值零触碰(结构整改不改数值与 RNG 消费序);battle_orchestrator 触 PARITY_TOUCH_FACES——实跑对拍须经用户批准、不得借机重锚。S13 键账对账在批末,基线重锚由用户发令人工 --refresh(预期降幅逾 10% 须 --force)。 - -**缺口**:四个拆件项的拆分形态、成员归属与残留键处置(豁免登记或留债)未经设计段裁决(D1–D6 六点);裁决落定并完成 architecture.md 登记行反哺落文后卡片定稿,方可编入迭代。 +**实况**:证据=`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-28 登记,来源=会话提及)