From 3a8634ab92d0d3f8ea2d3f107236fa01741d39e3 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 1 Nov 2026 01:53:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=99=E5=8D=A1(=E5=8D=A1C=20v2.0=C2=B7grill?= =?UTF-8?q?ing=E5=A4=8D=E6=A0=B8=E4=BF=AE=E6=AD=A3):=20=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E5=A4=8D=E6=A0=B8=E5=9B=9B=E9=A1=B9=E6=89=93=E5=9B=9E=E5=85=A8?= =?UTF-8?q?=E8=90=BD=E2=80=94=E2=80=94=E2=91=A0=C2=A73=E8=A1=A5=E4=B8=A4?= =?UTF-8?q?=E6=9D=A1=E9=87=8D=E6=9E=84=E7=B1=BB=E5=BF=85=E5=A1=AB=E6=9D=A1?= =?UTF-8?q?=E6=AC=BE(=E7=A6=81=E4=B8=BA=E6=9C=BA=E6=A3=80=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E4=BF=9D=E7=95=99=E6=97=A0=E6=95=88=E6=88=90=E5=91=98?= =?UTF-8?q?/=E6=8B=86=E5=88=86=E8=BE=B9=E7=95=8C=E7=BA=AA=E5=BE=8B?= =?UTF-8?q?=E5=9B=9B=E8=A6=81=E4=BB=B6,=E5=88=A4=E6=8D=AE=E6=9D=83?= =?UTF-8?q?=E5=A8=81=3Dcode-conventions=20=C2=A71.1);=E2=91=A1S13=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E7=B0=87=E5=AE=9E=E6=B5=8B=E6=9B=B4=E6=AD=A3max-class?= =?UTF-8?q?-variables=2032=E2=86=9231(baseline:11),=E8=BF=9E=E5=B8=A6?= =?UTF-8?q?=C2=A71/=C2=A79L3#1=E5=8D=8732/=C2=A713/T4=E5=9B=9B=E5=A4=84;?= =?UTF-8?q?=E2=91=A2=E5=88=A0=E5=AF=B9=E7=85=A7=E8=A1=A8=E8=A1=8C4?= =?UTF-8?q?=E6=8E=A8=E5=AE=9Aest=E2=89=A40=E6=AD=BB=E6=96=AD=E8=A8=80(clam?= =?UTF-8?q?pi=E5=85=9C=E5=BA=95=E4=B8=8B=E6=95=B0=E5=AD=A6=E4=B8=8D?= =?UTF-8?q?=E5=8F=AF=E8=BE=BE,=E6=AD=A3=E4=B8=ADtest-conventions=C2=A78.4?= =?UTF-8?q?=E5=A4=9A=E5=B1=82=E9=98=B2=E5=BE=A1=E7=A6=81=E5=88=99),?= =?UTF-8?q?=E6=8E=A8=E5=AE=9A=E6=9C=89=E6=95=88=E6=80=A7=E5=BD=92=E9=9B=B6?= =?UTF-8?q?=E5=B0=BA=E5=AF=B8=E5=89=8D=E7=BD=AE;=E2=91=A3=E6=8E=A8?= =?UTF-8?q?=E5=AE=9A=E8=AF=BB=E6=95=B0=E5=AF=B9=E6=8B=8D=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E5=A4=84=E7=BD=AE=E5=8F=A5=3D=C2=A79L3#2=E5=91=88?= =?UTF-8?q?=E6=8A=A5=E7=A6=81=E5=AE=9E=E7=8E=B0=E4=BE=A7=E6=94=B9=E9=94=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...œ€求卡片-棋盘格边长口径收口批-2026-10-30.md | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/reports/需求卡片-棋盘格边长口径收口批-2026-10-30.md b/reports/需求卡片-棋盘格边长口径收口批-2026-10-30.md index 8f9cdc2b..35ec7be8 100644 --- a/reports/需求卡片-棋盘格边长口径收口批-2026-10-30.md +++ b/reports/需求卡片-棋盘格边长口径收口批-2026-10-30.md @@ -16,7 +16,7 @@ 1. 代码侧人造阈值归零:`layout_probe.gd` 的 `MIN_CELL` 常量删除,`grep -rn "MIN_CELL\|可读门槛\|可读下限" game/` 零残留;30 与 36 均不得以任何形态回到代码或测试判据。 2. 格边长算式只剩一处落点(`BoardView._cell_for`),`set_cell_area` 只调它;探针与单元测试不再各自复写算式。 3. 13×13 与 14×14 两档进入守卫并在当轮真实跑批中执行通过(单元四档冒烟+探针等价断言与推定留痕)。 -4. 代码域闸全绿;`tools/gdstyle_baseline.txt` 中 board_view.gd 各键只许持平或下降(MATCH——`max-public-methods` 保持 27、`max-class-variables` 保持 32)。 +4. 代码域闸全绿;`tools/gdstyle_baseline.txt` 中 board_view.gd 各键只许持平或下降(MATCH——`max-public-methods` 保持 27、`max-class-variables` 保持 31)。 5. 产出物三份落 `reports/`(实现报告/反哺点清单/验收审计报告),独立验收审计未过不合并。 **编队注记与估时**:估时 **0.5 个工作日**(T0 0.1/T1 0.15/T2 0.1/T3 0.1/T4 0.05),远低于迭代冻结线(5 个工作日),可编批;编入哪个迭代由迭代编排段定(worktree iter46 的未提交 WIP 三件中,T1 与 T3 两件按 v2 原样复用,T2 探针件按本卡新判据返工——见 §12)。本批触面=`game/presentation/views/board_view.gd`+`game/probe/layout_probe.gd`+`game/tests/unit/core/board_gen_reward_test.gd`,与在飞批次无文件交叠需编排段复核。 @@ -29,7 +29,7 @@ 2. 生产调用路径两条:`game/presentation/views/board_zone_view.gd:91-92`(`board_area.resized` → `set_cell_area(_board_area.size)`)与 `board_view.gd` `rebuild` 末尾 `set_cell_area(size)`——传入的都是棋盘视图实际可用区尺寸,`board_view` 为 `PRESET_FULL_RECT` 子级,故 `board_view.size` 即生产传入值。 3. 探针阈值手抄件:`game/probe/layout_probe.gd:15` `const MIN_CELL := 36.0`,注释自陈出处为旧算例表「1280 档 12×12 → 36px」;`:93-95` 断言 `cell < MIN_CELL` 记红;`:44-45` PASS 消息引用 MIN_CELL。探针只进 L1(`:27` 起始冒险)、`:31` `press_candidate(0)`,实跑只遇 10×10(实读 40px),36 阈值从未在 28–35px 区间生效过——**该常量与旧算例表同源,旧算例表已退役(1cdef6ba),此抄本成为无源之值**。 4. 格边长冒烟:`game/tests/unit/core/board_gen_reward_test.gd:53-69`(`_smoke_layout_cell_formula`):`:57` `for L in [1, 2]`、`:60` 样本 `avail := Vector2(1036, 460)`、`:63` 读 `board_view.get("_cell")`、`:64-66` 网格高 ≤ 可用高−24、`:67-68` 格边长 ∈ [26,46]。13×13 与 14×14 两档从未进入断言。 -5. **S13 顶格事实(本机 gdstyle v0.4.0 实测,v1 卡 §2 第 5 条实测仍有效)**:`tools/gdstyle_baseline.txt:22` 登记 `board_view.gd|quality/max-public-methods = 27` 与实测相等;`max-class-variables = 32` 同为顶格。对同一文件副本加一个公开静态函数后实测升 28(WORSENED 红);改名为下划线前缀(`_cell_for`)后持平 27。**故算式提取必须用私有名,且本批禁给 board_view.gd 新增任何成员(钳制界不得提取为公开常量——32 顶格)**。 +5. **S13 顶格事实(2026-11-01 实查,gdstyle v0.4.0)**:`tools/gdstyle_baseline.txt` 登记 `board_view.gd|quality/max-public-methods = 27`(`:22`)与 `max-class-variables = 31`(`:11`),与静态清点逐一相符。对同一文件副本加一个公开静态函数后实测升 28(WORSENED 红);改名为下划线前缀(`_cell_for`)后持平 27。**故算式提取必须用私有名,且本批禁给 board_view.gd 新增任何成员(31 同样不容新增——钳制界不得提取为公开常量)**。 6. 四档板型取档(`board_gen.tres` 实查 (level_index, node_depth) → 尺寸):L1 depth 0–3=10×10、L1 depth 4–6=12×12、L2 depth 0–9=12×12、L3 depth 0–8=13×13、L3 depth 9–13=14×14。即 `generate(1,0)`=10、`generate(2,0)`=12、`generate(3,0)`=13、`generate(3,9)`=14。 7. **锚点读数(2026-10-31 探针实读,停机呈报在案;2026-11-01 用户裁定为现行锚点)**:基座 1280×800 档 `board_view.size`=(1022.0, 454.0),10/12/13/14 板 → 40/33/30/28px;16:9 1920×1080 档 (1662.0, 734.0) → 四档全部 46px(钳制顶格)。代入复核(1280 档 14 板):`min(1022−12−8, 454−32) = 422`;`(422 − 13×2) / 14 = 28.28 → floor 28` → 钳制 [26,46] 内 → 28px。 8. 布局事实源换代(2026-10-31 布局几何单点化批,1cdef6ba):分区几何唯一事实源=`battle_layout.tres` 五字段(实查 `stage_h=252`/`ap_bar_h=44`/`info_panel_w=240`/`log_band_h_dig=24`/`log_band_h_settle=84`);容器内部结构(VBox 间距 4px、常驻操作提示条、面板边距)在代码中,实板可用面积以探针实读 `board_view.size` 为准,不静态推算。 @@ -40,8 +40,10 @@ - 🔴 **锚点唯一**:格边长的判据锚=①用户验收的现行渲染值(§2 第 7 条读数表,只作记录与对照,不作判红阈值)+②公式自身结构钳制 [26,46](battle.md `:143`,单元冒烟既有断言承载)。**本批起全仓禁任何人造格边长可读阈值**——30、36 及其变体不得出现在任何代码、测试、探针判据中;发现即 L3。 - 🔴 **阈值手抄禁令**:探针与测试不得新增阈值常量。与算式相关的判据一律经 `BoardViewScript._cell_for(...)` 等价比较或既有公开出口(`cell_size`)承载;唯一例外=单元冒烟既有的 [26,46] 区间断言(v1 前已存在,逐字保留)。 - 🔴 **算式单点**:格边长算式只在 `BoardView._cell_for` 一处;`set_cell_area` 只调它。探针、测试、任何新调用方都不得复写这条算式(复写=造第二口径)。 -- 🔴 **私有名固定**:提取函数名必须是 `_cell_for`(下划线前缀)。依据=§2 第 5 条实测:公开名即令 `max-public-methods` 27→28 恶化;同理禁新增任何成员(`max-class-variables` 32 顶格)。实现期「顺手改成公开方法更好看」=L3。 +- 🔴 **私有名固定**:提取函数名必须是 `_cell_for`(下划线前缀)。依据=§2 第 5 条实测:公开名即令 `max-public-methods` 27→28 恶化;同理禁新增任何成员(`max-class-variables` 31 顶格)。实现期「顺手改成公开方法更好看」=L3。 - 🔴 **行为零变化**:`set_cell_area` 的副作用顺序与数值逐位不变;`rebuild`/`resized` 两条调用路径不改;画面像素零变化。 +- 🔴 **禁为机检文本保留无效成员**(重构类卡条款,2026-10-25 立):禁止为迎合机检消息文本(含计数)而保留或新增无效成员/别名;机检键与本卡契约互斥时,实现段一律停卡呈报,不得自造第三条路。 +- 🔴 **拆分边界纪律**(结构类卡条款,2026-10-28 立,判据权威=code-conventions §1.1):①拆出单元 `_cell_for` 职责语句=「按 battle.md 格尺寸公式,由板型 N 与可用面积算格边长的无状态纯函数」,单一变化原因=公式本身,实现报告逐件一行承载;②集体身份=「算式唯一落点」(命得出名字,非凑计数袋);③「过阈值」只许作为发现信号,作为拆分或收拢的动机即违规;④按纪律拆不出内聚单元 → 停卡呈报走豁免/还债通道,禁硬拆凑绿(进 §9 L3)。 - 🔴 **测试削弱申报制**:允许改动的旧断言全集见 §8「测试削弱申报」,未申报的删改由独立验收审计判红。 - 🔴 **禁变异类测试与撤销类取证**:不得靠回退 hunk 或注入破坏证明断言有效。 @@ -98,7 +100,7 @@ - [ ] 删除 `layout_probe.gd:15` `const MIN_CELL := 36.0` 整行。 - [ ] `:93-95` 阈值断言替换为**等价断言**:读 `var b = bv.get("_board")`(内部字段直查——受控例外,对照表行 1 注明理由:实跑板型 N 无公开出口),`var n := maxi(b.width, b.height)`;断言 `cell == float(BoardViewScript._cell_for(n, bv.size))`,失败消息含实板可用面积、n、两值(生产写入 vs 单点返回)。文件顶部加 `const BoardViewScript := preload("res://presentation/views/board_view.gd")`(静态调用载体)。 - [ ] `:44-45` PASS 消息改写:去 MIN_CELL 引用,改为「三区几何不变量全过+格边长等价成立(基座实读 %.0fpx)」。 -- [ ] `_check_one` 追加两段:①board_view 零尺寸前置——`bv.size.x <= 0.0 or bv.size.y <= 0.0` 时记问题「board_view 零尺寸(可用面积不可信,推定无依据)」;②**推定留痕**:对 `n2 in [13, 14]` 取 `var est := BoardViewScript._cell_for(n2, bv.size)`,`est <= 0` 记红(无效读数——退化判据,非阈值),否则随 PASS 打印「13 板推定 %dpx/14 板推定 %dpx」留痕(实现报告对拍 §2 第 7 条锚点读数 30/28)。 +- [ ] `_check_one` 追加两段:①board_view 零尺寸前置——`bv.size.x <= 0.0 or bv.size.y <= 0.0` 时记问题「board_view 零尺寸(可用面积不可信,推定无依据)」;②**推定留痕**:对 `n2 in [13, 14]` 取 `var est := BoardViewScript._cell_for(n2, bv.size)`,随 PASS 打印「13 板推定 %dpx/14 板推定 %dpx」留痕(实现报告对拍 §2 第 7 条锚点读数 30/28;对拍不一致=§9 L3 #2 呈报,禁实现侧改锚)。 - [ ] 孤立验证:单件跑 `layout_probe`(两档全绿,PASS 行含推定读数)+`tools/probe_gate.sh` 默认段退出码 0+`grep -rn "MIN_CELL" game/` 零命中。 - 取用:T1 `_cell_for`。产出:绿的两档探针日志含四档推定读数(T4 对拍基准)。 @@ -113,7 +115,7 @@ ### 7.5 T4——批末收口与产出物落位(估时 0.05 个工作日) - [ ] 批末代码域闸:`tools/run_all_gates.sh --code` 全绿(本批改动含 `game/` 下非 `.md` 行为载体 → 代码域)。里程碑步出口跑一次全套;波内修复只做出红最小单元的最窄确认。 -- [ ] S13 键账对账:board_view.gd 各键持平(`max-public-methods` 27 不变、`max-class-variables` 32 不变、无 NEW 键);探针与测试不在 S13 扫描面。 +- [ ] S13 键账对账:board_view.gd 各键持平(`max-public-methods` 27 不变、`max-class-variables` 31 不变、无 NEW 键);探针与测试不在 S13 扫描面。 - [ ] **产出物落位卡**(轻闸全绿后、合并前写齐,方算收口): - `reports/iter-实现报告-<日期>.md`——各卡状态+T0 三份改前读数与各卡改后读数对拍+**锚点读数留档**(两档视口 × 四板型实读/推定全表=§2 第 7 条,未来批次对照基准)+实机目检总清单(登记不阻塞:「第三关 14×14 板格面数字清楚可辨」一项——2026-11-01 用户已实际背书现行画面,登记照留)。 - `reports/iter-反哺点-<日期>.md`——§5 同步面第 1 行(battle.md `:144` 退役)有落点。 @@ -129,11 +131,11 @@ | 1 | 探针阈值退役+格边长接线守卫(等价判据) | `layout_probe.gd:15` 删常量;`:93-95` 阈值断言换 `cell == _cell_for(n, bv.size)` | 「layout_probe 两档几何不变量」`layout_probe.gd:_ready`(尾缀〔格边长 V1〕) | 探针 | `godot --headless --path game res://probe/layout_probe.tscn` | 实读 `cell_size`(生产经 `set_cell_area` 真实写入)与 `_cell_for` 同输入返回严格相等——生产停止调单点算式即红;`grep -rn "MIN_CELL" game/` 零命中 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | | 2 | 算式单点(`_cell_for`) | `board_view.gd:206-215` 抽函数并改调;`:204-205` 注释补唯一落点句 | 「格边长算式单点等价」`board_gen_reward_test.gd:_smoke_layout_cell_formula`(尾缀〔格边长 V2〕) | 单元 | `godot --headless --path game --script res://tests/unit/core/board_gen_reward_test.gd` | `set_cell_area` 写入的 `_cell` 与 `BoardView._cell_for(n, avail)` 返回值逐档严格相等(同一事实两路读取,分叉即红) | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | | 3 | 13×13/14×14 进入冒烟 | `board_gen_reward_test.gd:53-69` 循环集改四档取样+板型一致断言 | 「格边长冒烟四档板型」同函数(尾缀〔格边长 V3〕) | 单元 | 同上 | 13/14 两档首次被断言:取档尺寸与实表一致、网格高 ≤ 可用高−24、格边长 ∈ [26,46](公式自身结构钳制——既有断言逐字保留) | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | -| 4 | 最大板推定守卫(实板可用面积,留痕型) | `layout_probe.gd:_check_one` 新增零尺寸前置+`n∈{13,14}` 推定(≤0 记红+读数打印) | 「最大板推定留痕」同探针(尾缀〔格边长 V4〕) | 探针 | `godot --headless --path game res://probe/layout_probe.tscn` | ①零尺寸前置(size ≤ 0 记红);②推定返回 ≤0 记红(退化判据,非阈值);③推定读数打印并与实现报告留档的锚点读数(30/28)对拍一致 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | +| 4 | 最大板推定守卫(实板可用面积,留痕型) | `layout_probe.gd:_check_one` 新增零尺寸前置+`n∈{13,14}` 推定(读数打印) | 「最大板推定留痕」同探针(尾缀〔格边长 V4〕) | 探针 | `godot --headless --path game res://probe/layout_probe.tscn` | ①零尺寸前置(size ≤ 0 记红);②推定读数打印并与实现报告留档的锚点读数(基座档 30/28px)逐值对拍,不一致=§9 L3 #2 呈报(禁实现侧改锚) | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | | 5 | 批末收口 | 全批 | 代码域闸:`tools/run_all_gates.sh --code` | 全量闸 | `tools/run_all_gates.sh --code` | 所选域全绿回执(`game/tests/.gates/receipt.json`) | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | **测试削弱申报**(实现期允许的旧断言改动全集,超出即审计判红): -1. **删除探针阈值断言**(`:93-95` `cell < MIN_CELL` 记红)=人造阈值退役的执行面(v1 申报的「36→30 放宽」作废,v2 直接删除)。补偿=行 1 等价断言(同测量对象上严格相等,强于区间阈值——生产接线断开即红)+行 3 结构钳制四档+行 4 有效性判据与读数留痕;目检项「第三关 14×14 板格面数字清楚可辨」继续登记(2026-11-01 用户已实际背书现行画面)。 +1. **删除探针阈值断言**(`:93-95` `cell < MIN_CELL` 记红)=人造阈值退役的执行面(v1 申报的「36→30 放宽」作废,v2 直接删除)。补偿=行 1 等价断言(同测量对象上严格相等,强于区间阈值——生产接线断开即红)+行 3 结构钳制四档+行 4 读数留痕对拍;目检项「第三关 14×14 板格面数字清楚可辨」继续登记(2026-11-01 用户已实际背书现行画面)。 2. `:44-45` PASS 消息改写=文案随判据换代,非削弱。 3. 行 3 循环集从 2 档扩到 4 档=纯增量;`avail` 样本值不改;既有两条断言逐字保留。 4. 显式禁止:恢复任何人造阈值(30/36 及变体)、删任何旧断言、放宽区间 [26,46]、把格子读取从 `cell_size`/`_cell` 换成别的入口。 @@ -145,8 +147,8 @@ - **L1 自救**:单件跑红→定位该件最小单元修后重跑;探针单件超时→孤立复跑该件;`--only` 选跑零命中(用法错 exit 2)→修正选词重跑。 - **L2 记录继续**:同一红连续 3 次同因→在实现报告「实现决定记录」记因后继续最窄确认。 - **L3 停机写报告等用户**: - 1. **机检预算互斥=上游缺陷停卡退回写卡段**——`gdstyle_gate` 出 NEW 键或 board_view.gd `max-public-methods` 升 28/`max-class-variables` 升 33(即 `_cell_for` 的下划线被去掉或钳制界被提取为成员);禁改基线换绿,禁开豁免。 - 2. **锚点冲突复现**——实现期任何一方(用户目检/新读数)推翻 §2 第 7 条现行渲染锚点,或有人再提人造阈值方案;停卡呈报,禁实现侧自裁。 + 1. **机检预算互斥=上游缺陷停卡退回写卡段**——`gdstyle_gate` 出 NEW 键或 board_view.gd `max-public-methods` 升 28/`max-class-variables` 升 32(即 `_cell_for` 的下划线被去掉或钳制界被提取为成员);禁改基线换绿,禁开豁免。 + 2. **锚点冲突复现**——实现期任何一方(用户目检/新读数)推翻 §2 第 7 条现行渲染锚点,或有人再提人造阈值方案,或探针推定读数与 §2 第 7 条留档读数对拍不一致且复测排除环境因素;停卡呈报,禁实现侧自裁。 3. **四档取档对不上**——`resolve_row(1,0)/(2,0)/(3,0)/(3,9)` 实测尺寸与 §2 第 6 条不符(表已改而本卡未跟上)。 4. **算式等价性破**——T1 后既有四套断言出现改前不存在的红,说明提取改变了算式语义。 5. **battle_layout.tres 被并发批改动**——T0 实读五字段与本卡 §2 第 8 条不符(布局几何单点化批之后又有布局批落地),读数锚点须重测重锚,停卡呈报。 @@ -176,7 +178,7 @@ **新件三查**:本批零新增文件——三查不适用(写「无新增件」)。 -**存量触面一查**:触碰的存量件为 `board_view.gd`(S13 扫描面内)与探针/测试两件(不在 S13 扫描面)。`board_view.gd` 预期:`quality/max-public-methods` 保持 **27**(私有静态不计数,§2 第 5 条实测)、`quality/max-class-variables` 保持 **32**(零新增成员——钳制界禁提取为常量,§3 契约④)、`quality/max-branches|_paint_cell` 等函数级键持平(本批不增分支、不增成员、不增局部变量——`set_cell_area` 局部变量反而减少)。达成手段:算式整体搬出,函数体只留一行调用。 +**存量触面一查**:触碰的存量件为 `board_view.gd`(S13 扫描面内)与探针/测试两件(不在 S13 扫描面)。`board_view.gd` 预期:`quality/max-public-methods` 保持 **27**(私有静态不计数,§2 第 5 条实测)、`quality/max-class-variables` 保持 **31**(零新增成员——钳制界禁提取为常量,§3 契约④)、`quality/max-branches|_paint_cell` 等函数级键持平(本批不增分支、不增成员、不增局部变量——`set_cell_area` 局部变量反而减少)。达成手段:算式整体搬出,函数体只留一行调用。 **指标例外申报**:无。