From ed19453d25694b0df29d5a129512dc150de6a787 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 20 Oct 2026 14:54:53 +0800 Subject: [PATCH 1/7] =?UTF-8?q?chore(=E6=89=B9=E5=90=8E=E6=94=B6=E5=B0=BE)?= =?UTF-8?q?:=20=E8=BF=AD=E4=BB=A3=2027=20=E4=BA=A7=E5=87=BA=E7=89=A9?= =?UTF-8?q?=E9=80=80=E5=BD=B9=E2=80=94=E2=80=94=E5=AE=9E=E7=8E=B0=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E4=B8=8E=E6=8E=A2=E9=92=88=E8=BF=81=E7=A7=BB=E5=AF=B9?= =?UTF-8?q?=E7=85=A7=E6=8C=89=E5=90=B8=E6=94=B6=E5=8D=B3=E6=AD=BB=E5=88=A0?= =?UTF-8?q?=E9=99=A4=EF=BC=88=E5=8F=8D=E5=93=BA=E7=82=B9=E5=B7=B2=E8=90=BD?= =?UTF-8?q?=20architecture/code-conventions=202026-10-17=20=E7=89=88?= =?UTF-8?q?=E3=80=81=E8=BF=BD=E8=AE=A4=E5=8D=95=E5=8D=81=E4=BA=94=E9=A1=B9?= =?UTF-8?q?=E5=B7=B2=E8=BF=BD=E8=AE=A4=E3=80=81=E7=9B=AE=E6=A3=80=E5=B7=B2?= =?UTF-8?q?=E7=99=BB=E8=AE=B0=2007=20=E3=89=96=E3=80=81=E8=A7=82=E5=AF=9F?= =?UTF-8?q?=E4=B9=89=E5=8A=A1=E5=B7=B2=E8=BF=81=2006=EF=BC=89=EF=BC=9Broad?= =?UTF-8?q?map=20=E8=BF=AD=E4=BB=A3=2027=20=E8=A1=8C=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E5=88=97=E6=94=B9=E9=80=80=E5=BD=B9=E4=BF=9D?= =?UTF-8?q?=E7=95=99=E5=AD=97=EF=BC=8Creports/README=20=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E6=B3=A8=E8=AE=B0=E9=80=80=E5=BD=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reports/README.md | 2 +- reports/iter27-实现报告-2026-10-14.md | 96 ----------------------- reports/iter27-探针迁移对照-2026-10-14.md | 28 ------- roadmap.md | 2 +- 4 files changed, 2 insertions(+), 126 deletions(-) delete mode 100644 reports/iter27-实现报告-2026-10-14.md delete mode 100644 reports/iter27-探针迁移对照-2026-10-14.md diff --git a/reports/README.md b/reports/README.md index e3e4d205..7efc21c6 100644 --- a/reports/README.md +++ b/reports/README.md @@ -10,7 +10,7 @@ | `iter-实现报告-<日期>.md` | 各任务卡状态、实机目检总清单、遗留读数义务 | 迭代批 | | `iter-代拍板-<日期>.md` | 批内 agent 替你拍的决定清单,等你追认或推翻 | 迭代批 | | `iter-反哺点-<日期>.md` | 需要写进 `design/` 权威文档的点,逐条列清"哪个文件哪一节、改成什么、依据是什么" | 迭代批 | -| `iter-<交付物名>-<日期>.md` | 需求卡片点名的其它交付物(例:`iter27-探针迁移对照-2026-10-14.md`=11 个探针的成员依赖面清单) | 迭代批 | +| `iter-<交付物名>-<日期>.md` | 需求卡片点名的其它交付物(例:`iter27-探针迁移对照-2026-10-14.md`=11 个探针的成员依赖面清单,已随迭代 27 收尾退役) | 迭代批 | ## 不放什么 diff --git a/reports/iter27-实现报告-2026-10-14.md b/reports/iter27-实现报告-2026-10-14.md deleted file mode 100644 index 7a2da38d..00000000 --- a/reports/iter27-实现报告-2026-10-14.md +++ /dev/null @@ -1,96 +0,0 @@ -# 迭代 27 实现报告——代码架构技术债修复批(五波全量入库) - -- 日期:2026-10-14(单会话 /goal+iter U0 交付,worktree g-plan2-iter27-techdebt 分支 iter27-techdebt-20261014) -- 需求卡片:已退役(git 历史可考)——原「代码架构技术债修复批」v1.2——三点待裁 2026-10-14 用户三裁全按推荐案:①SaveManager/MetaProgression=第三个 autoload/②Ledger=单类持四账/③_settle=审计五段) -- 来源审计:代码架构与实现质量审计报告-2026-10-14(双席基线 97de02c;**本批收口时按退役规则 git rm——吸收即死,结论迁本报告与卡片**) -- 核心验收(V1):**重构前后同种子完整局输出逐位一致**——parity_anchor 三变体(base/attune/shop)×40 局×RUNSUM+JSONL 剔 ts 双面哈希对拍,**五波出口五跑全同**(锚冻结于 T0,种子面 71000/72000/73000) - -## 一、五波交付 - -### 波一 场景拆分+局生命周期物化(P0-1/P0-2,7a0d57d) - -- 三屏壳场景 `presentation/scenes/`:menu_screen/camp_screen/adventure_screen(内含 level_map/battle 两容器)——视图代码原样构建(装配器/视图类零 .tscn 化,契约 2);组合根句柄全部保留(探针挂载假设 main.X 一级路径零迁移);树序=屏壳在前全模态之下(视觉共存对逐对验算:legend/battle、debug/level_screen、shop/level_screen 等全部保序)。 -- 会话物化 `run_scope.gd`:adventure/runner/settlement/局态旗/账本随会话节点承载;`_begin_session` 建会话(_ready 即建闲时态=永非 null)、终局整节点 queue_free()——`_reset_run_scope` 三项+`_on_battle_end_continue` 置空四件手工清单消亡。 -- SaveManager/MetaProgression 升格 autoload(裁点①甲;类名加 Core 后缀沿 RngService 先例);探针隔离改 attach_path 原地重置(set_master_seed 先例);**发现并修复**:屏壳根全屏 Control 默认 STOP 吃掉下层模态鼠标输入(ui_input 实证)——三屏壳根 mouse_filter=IGNORE+V2 回归闸。 -- V2 屏壳独立实例化 11 断言+V3 两连局复位 11 断言进 smoke。 - -### 波二 _settle 五段拆 Segment(P1-1,26301ba) - -- `core/settlement/` 五段类:GrantSegment(授予段体+旗判随段迁入+counter_add 五位/grant_material 三位分支单点化)/AuraSegment/CombatSegment/DecaySegment/VerdictSegment(返回裁定,终局早退语义留宿主);编排器 1725→1325 行退为段序编排+行发射原语单点。 -- 姊妹病灶:`_resolve_hero_attack` 148 行拆四步(ctx 命中面→基值装配→掷点兑现→交付),ctx/redemption 字典穿线算序逐字保留。 -- V4 settle_segments_test 16 断言进 run_all。 - -### 波三 账本收口(P1-2/P1-3/P1-4,6fd7d78) - -- `core/run_ledger.gd` RunLedger 单类持四账(裁点②甲):attune_charges/vision_counter/adventure_counters/bonus;战斗侧只拿 read/append 原语;AR 持账→LR set_run_ledger→enc 单键下传;编排器三裸引用成员退役;调试/单场缺省新账=零扰动面(vision_counter 缺省空=不计,原 enc 缺键守卫语义保留)。 -- 刷新双账:main 副本删除;presentation_snapshot 成文面升键 refresh_used(can_refresh 邻位)——HUD 余量/遥询单源读快照;V5 快照一致性断言×3。 -- GP 影子账:summary 增 gp_final 键(close_wallet 清账前快照);gp_shadow_ledger.gd 全件退役;终局面板 GP 行取数=summary 键;ui_probe 断言换代。 - -### 波四 组合根可测化+模态协议内聚(P1-5/P2-7,8b9e556) - -- **重估结论(卡片 T4 前置义务)**:场景拆分落地后,模式状态机已随 RunScope 物化、屏构建已随屏壳迁出——抽取面收敛为**模态编排域**:`modal_flow.gd` ModalFlow 纯逻辑类(依赖仅 ModalStack+查询 Callable,审计处方形态)——开合编排(挂起兜底/排播排空/遮挡记账/开合同步)/输入锁谓词(三例外注入)/双形制角标谓词。 -- **V6 测试抓出并修正一处真分歧**:挂起兜底递归后误加 return(原 main 语义=先结挂起后继续开本层两拍都走)——单测缝的结构价值实证。 -- ModalStack 互斥域随层登记:register(m, tags)+TAG_NON_LOCKING/TAG_SCREEN_STATE 封闭词表+has_open_excluding_tags 组查询;原调用点排除式拼装(:404-409 输入锁等五处)退役;main._modals=flow.stack(ui_struct _list 断言缝保留)。 -- 控制器构造收拢 context:curio 16 参→CurioFlowContext/camp 13 参→CampFlowContext(字段逐一同名,控制器可独立实例化)。 - -### 波五 类型闸+卫生件(P1-6/P2 组,b605022+T6 笔) - -- 类型闸:`tools/audit_type_hints.py` 机器闸(R1 无类型容器注解/R2 有值返回缺类型/R3 参数缺类型+行级白名单通道);368 处容器注解机械参数化(Array[Variant]/Dictionary[Variant, Variant] 零行为面)、13 处参数真类型;project.godot 拉起 untyped_declaration=1;static_scan 新 S9 规则。 -- 卫生件:死代码 13 函数删除(审计 16 处复核后其中 ui_kit:486 一处经实读为现役非死码,见追认单)+FeatsEngine 整文件退役;字符串 Callable×10 位换方法引用形态(编译期方法存在性校验);冒险状态机/standee 主角三态 enum 化(外部 String 契约逐位一致);ConfigDB `_fatal` 退出归根(核心层去 quit/crash,置 `_fatal_flag`,退出决策归组合根既有 fail-fast 通道)+resolver 诊断/数据通道全面 Callable 化(ConfigDb↔Resolver 类型环断根)。 - -## 二、闸记录(每波出口+批末) - -| 闸 | 基线(T0 冻结) | 波一 | 波二 | 波三 | 波四 | 波五 | -|---|---|---|---|---|---|---| -| 逐位一致对拍(V1 核心) | 锚冻结 | ✓ 全同 | ✓ 全同 | ✓ 全同 | ✓ 全同 | ✓ 全同 | -| 冒烟 | 1055/0 | 1077/0 | 1077/0 | 1079/0 | 1079/0 | 1081/0 | -| run_all | 25 套 | 25 | 26 | 26 | 27 | 27 | -| probe_gate --click | 绿 | 绿 | 绿 | 绿 | 绿 | 绿 | -| render_gate golden | 0.00% | 0.00% | 0.00% | 全绿 | 全绿 | 全绿 | -| static_scan | (历史 cd 错位恒跳过) | — | — | — | — | S1/S2/S4/S9 全绿 | - -批末(T6 后)run_all 27 套全绿+冒烟 1081/0+probe/render 全绿+对拍全同(T6 对拍见 /tmp/parity_check6.log 记录,exit 0)。 - -## 三、代拍板追认单(白名单九项执行实录+计划外决断) - -> **追认结果(2026-10-17 用户令)**:以下十五项**全部同意,无修改意见**——第 1–9 项白名单执行实录、第 10–15 项计划外决断均认作本批既定做法。第 7 项附带的元素精化(`Array[Variant]`→具体元素型)仍是后续批的渐进面,不随本追认提前。第 15 项的取数面换代已生效。 - -1. **屏场景命名/落位**(白名单①):`presentation/scenes/{menu,camp,adventure}_screen.tscn`——三屏壳与卡片三屏一一对应。 -2. **屏壳内部分层**(白名单②):adventure 屏壳内 battle_root+level_screen 平级(无同时可见态,层内先后零视觉差)。 -3. **Segment 五类命名/落位**(白名单③):`core/settlement/{grant,aura,combat,decay,verdict}_segment.gd`,类名 XxxSegment。 -4. **Ledger 命名/原语形状**(白名单④):`core/run_ledger.gd` RunLedger;原语=attune_charge_has/set/consume、vision_count_add、counters_seed_snapshot/merge_export、bonus_add_axis(各站点原语义逐字收拢)。 -5. **run-scope 物化形态**(白名单⑤):RunScope Node 挂 main;_ready 即建闲时态(永非 null——全组合根免空判);会话更替=旧节点 queue_free+新节点同拍建。 -6. **探针迁移最小改动**(白名单⑥):组合根句柄保留策略使 10 探针中 7 个零迁移、3 个仅 run_scope 路径换代;pacing 测试改 attach 隔离。 -7. **类型标注写法**(白名单⑦):368 处机械参数化取 `Array[Variant]`/`Dictionary[Variant, Variant]` 零行为面口径——**元素精化(如 Array[Dictionary])留后续批渐进**(机器闸已封住新增无类型)。 -8. **死代码删除切分**(白名单⑧):随 T6 单笔提交。 -9. **enum 命名**(白名单⑨):adventure `State`/standee `HeroState`(+_HS_NAME/_HS_VALUE 双向映射常量)。 -10. **〔计划外〕P2-2 autoload 直取降格实现**:审计处方「编译期全局名」与本仓 --script 模式编译器不解析裸 autoload 标识符**硬冲突**(run_all.gd 头注在案+pacing 实测 Parse Error)——降格为路径常量单点(AUTOLOAD_PATH_* 四常量)+T1 读视图属性;拼写风险收敛一处,类型面保留。 -11. **〔计划外〕board_generator 四 db 参白名单**:generate/_attempt/legality/_finalize 的 db 参保持鸭子型(测量面 _BoardRowStub 冒烟夹具注入,typed 参拒 stub)——`# type-hint: ignore` 显式白名单通道首用。 -12. **〔计划外〕static_scan 历史 cd 错位修复**:9-24 布局迁移后 `dirname/..` 落 game/ 致 `game/core` 守卫恒跳过=静默空转遗产——修 `/../..` 后 S1-S4/S9 首次实跑,暴露并处置两笔存量(S1/S2 main `_seed_value` randi=文档化豁免面→`rng-seed-exempt` 标记豁免通道;S9 即本批闸)。 -13. **〔计划外〕V6 测试抓出挂起兜底分歧**:ModalFlow 初版在挂起兜底后误加 return(原 main 语义两拍都走)——以原语义为准修正;该处即单测缝价值的直接实证。 -14. **〔计划外〕审计「死代码 16 处」复核为 13 处**:ui_kit.gd:486 一处实读为现役代码(审计抽样误差),不删;其余 12 函数+FeatsEngine 整文件照删。 -15. **〔计划外〕刷新遥测取数面换代**:`ux_refresh_attempt` 的 round_refresh_index 从 main 副本改读快照(P1-2 连带,载荷键与数值语义零变化)。 - -## 四、GDD 反哺点(两条,已登记 06,待用户逐点裁决另批落文) - -| # | 文档 | 反哺点 | -|---|---|---| -| 1 | design/dev/architecture/architecture.md | 场景分层陈述(三屏壳+组合根句柄面);会话生命周期(RunScope 物化+_begin_session/_end_session 语义);结算五段 Segment 结构(core/settlement/);RunLedger 四账所有权模型;ModalFlow 模态编排层与互斥域 tags 协议——architecture 现行陈述均滞后于实态 | -| 2 | design/dev/code-conventions.md | §4 语言纪律机器化(S9+audit_type_hints.py 三规则);`:= {}` 推断形态=类型推断合法面不算债的口径;`# type-hint: ignore` 行级白名单通道;`# rng-seed-exempt` S1/S2 标记豁免通道;--script 模式禁裸 autoload 标识符纪律(新);Variant 参数化口径与元素精化后续 | - -## 五、实机目检总清单(登记 07 ㉖——真人检测不阻塞,2026-10-12 立规) - -1. 全流程操作观感零变化走查:开始菜单→营地(四柜台)→开新冒险→选路→战斗(挖/旗/刷新/停手)→三选一→商店→Boss→终局逐屏过一遍(场景拆分+会话物化后唯一人闸面)。 -2. 续玩断点恢复:停点退出→继续上局(断点文案/恢复落点)。 -3. 调试浮窗对局中可开不锁棋盘(:407-408 事故回归——互斥域 tags 化后行为钉面)。 -4. 刷新按钮余量显示与受理一致(双账删副本后 HUD 单源读快照)。 -5. DS_DEBUG=1 启动即开浮窗+两屏角标(同步面随 ModalFlow 迁移)。 - -## 六、残留与去向 - -- 残留人闸:07 ㉖ 五件(登记不阻塞)。 -- **卡片核对补登(2026-10-15)**:逐条核对卡片 §2/§4/§6/§7 兑现面,补齐三项——①V8 卫生 grep 断言落地(smoke `_smoke_hygiene_gates`:字符串 Callable 产品码零命中/FeatsEngine 文件退役/死代码抽查/GP 影子账零残留);②卡片 §4「长函数 17 个登记 06 观察」+§2.3「lambda 连接 76 处登记防回归」两条义务补登 06(17 中 3 件已随波一/二消解,余 14 件备忘);③漏网字符串 Callable×2 补装(config_db resolver 通道——T6 新增位点,追认单#15 换装面覆盖)+main 头注死引用清理。核对结论:§1 五波/§3 六契约/§6 T0-T7/§7 V1-V9 其余条目全部兑现(详见各波闸记录)。 -- 代拍板追认单十五项(上表)待用户逐项追认。 -- GDD 反哺点两条(06 在册)待裁决另批落文。 -- 审计报告本体已按退役规则 git rm(吸收即死;修正后计数已由需求卡片 v1.2 承载)。 -- 元素精化(Array[Variant]→具体元素型)为类型闸后续渐进面(06 反哺点②附带)。 diff --git a/reports/iter27-探针迁移对照-2026-10-14.md b/reports/iter27-探针迁移对照-2026-10-14.md deleted file mode 100644 index bbbcd9e9..00000000 --- a/reports/iter27-探针迁移对照-2026-10-14.md +++ /dev/null @@ -1,28 +0,0 @@ -# 迭代 27 T0 交付:smoke 探针挂载假设对照表(2026-10-14) - -卡片 T0.3 交付物。11 个挂载面 = 10 个 smoke 探针 + 1 个单测套件(pacing_queue_test,全库唯一直接 load main.tscn 的单元测试)。 -迁移原则(卡片 🔴 探针契约零破坏):**「实例化 main.tscn 得到完整产品树 + 组合根 API」这一挂载假设本身保留**—— -场景拆分后 main.tscn 仍是组合根(屏场景为其子节点挂载),探针入口零改动; -迁移面 = 探针内部对 main 私有成员的树寻址/状态探视,随成员落位逐个改写(改写即新结构的回归断言)。 -另两个挂载假设探针(adventure_monte_carlo/level_autoplay,SceneTree 直驱 level_runner 不挂 main.tscn)不在迁移面。 - -| # | 探针 | 挂载行 | 挂 main.tscn 得到什么 | 成员依赖面(实测 grep) | 迁移方向(T1 落位后改写) | -|---|---|---|---|---|---| -| 1 | ui_probe.gd | :15 | 完整产品树+驱动 `_start_adventure_from_menu()`(唯一试玩入口) | `_start_overlay/_battle_root/_row_queue/_debug/_is_settling/_on_adventure_finished/_on_camp_closed/_on_wallet_changed/_reset_run_scope/_adventure_gp_final/_adventure_gp_view/_close_modal` + `adventure/ap_bar/board_view/board_zone/camp_overlay/db/debug_overlay/info_panel/level_screen/log_view/meta/runner/settlement/stage` | 屏成员→屏场景属性路径;局态成员→run-scope 节点路径;`_reset_run_scope` 断言随手工清单消亡换代为 run 节点释放断言 | -| 2 | ui_click_probe.gd | :45 | 全输入链走查(行进/战斗/营地/商店点击 10935 预算) | 最广:`_adventure_mode/_battle_root/_camp_data/_end_overlay/_exit_level_screen/_input_locked/_inter_overlay/_last_gain_amount/_locked_click/_on_camp_closed/_refresh_resume_button/_refresh_used_round/_row_queue/_settlement_stop_pending/_start_adventure_from_menu/_start_overlay` + 全部屏成员 | `_input_locked` 输入锁随 T4 模态协议内聚落位;`_refresh_used_round` 随 T3 双账删除改快照通道断言;余同 #1 | -| 3 | ui_struct_probe.gd | :25 | 模态栈纪律走查(开合/遮挡/输入锁) | `_close_debug_overlay/_end_overlay/_gp_summary_text/_level_active/_modals/_on_camp_closed/_on_career_closed/_on_settings_closed/_on_status_closed/_open_modal/_open_settings/_open_status_panel/_refresh_resume_button/_resume_from_menu/_show_debug_overlay/_start_adventure_from_menu/_start_overlay` + 屏成员 | `_modals`(ModalStack)随 T4 内聚后寻址换代;模态层清单断言随屏场景化改挂屏壳 | -| 4 | ui_layout_probe.gd | :17 | 四区布局几何断言 | `_start_adventure_from_menu/board_view/board_zone/debug_overlay/info_panel/get_child/get_children/save_manager/stage` | board_zone/info_panel/stage 随屏场景化改屏壳属性路径;`get_child` 序数寻址须换名寻址(子场景化后序号漂移) | -| 5 | ui_input_probe.gd | :27 | 输入锁+宝珠辉光链路 | `_input_locked/_start_adventure_from_menu/_sync_treasure_glow/board_view/board_zone/build_adventure_params/debug_overlay/runner/save_manager/settlement/status_panel` | `_sync_treasure_glow`/`build_adventure_params` 随局态物化落位;余同 #1/#2 | -| 6 | ui_audit_probe.gd | :27 | 全屏巡检(12 模态层/入口可达) | `_close_debug_overlay/_end_overlay/_on_settings_closed/_open_settings/_refresh_resume_button/_show_debug_overlay/_start_overlay/board_view/camp_overlay/confirm_dialog/curio_overlay/legend_overlay/level_screen/save_manager/shop_overlay` | 模态层清单随屏场景化改挂屏壳;余同 #1 | -| 7 | ui_tune_probe.gd | :36 | 调试浮窗只读巡检(种子框/批量模拟) | `_close_debug_overlay/_input_locked/_seed_value/_show_debug_overlay/_start_adventure_from_menu/_start_overlay/adventure/board_zone/confirm_dialog/db/debug_overlay/level_screen/save_manager/settlement` | `_seed_value` 随种子框落位改路径;debug_overlay 归属屏待 T1 定(全局层 vs 屏内层) | -| 8 | shot_probe.gd | :35 | 截图(四屏+营地/设置) | `_start_overlay/board_zone/camp_overlay/career_overlay/level_screen/settings_overlay/settings_store/stage/status_panel` | 屏成员→屏场景路径;settings_store 随升格 autoload 改全局访问 | -| 9 | fx_shot_probe.gd | :28 | 特效截图(棋盘 fx) | `_start_overlay/level_screen/settings_store/settlement` | 同 #8 | -| 10 | t17_defer_probe.gd | :15 | 延迟模态时序断言(结算行分帧) | `_deferred_modal/_end_overlay/_row_pacer/_start_overlay/db/level_screen/meta/save_manager/settings_store/settlement` | `_row_pacer/_deferred_modal` 随 T4 模态协议落位;meta 随升格 autoload 改全局 | -| 11 | tests/unit/presentation/pacing_queue_test.gd | :19 | 行队列节奏单测(真实冒险至首战结算) | `_flush_row_queue/_refresh_resume_button/_row_queue/_start_adventure_from_menu/adventure/db/level_screen/log_view/meta/pace_delay_for/runner/save_manager` | `_row_queue/_flush_row_queue/pace_delay_for` 随 T4 抽取落位(该单测即 V6 新纯逻辑类直接 new() 的前哨);余同 #1 | - -**共性迁移点**(T1 施工照单改写,改写后逐探针全绿=V2 闸): -1. `meta`/`save_manager`/`settings_store` → 裁点① 第三/四 autoload 后改全局名访问(探针里的 `main.meta` 全数换代)。 -2. `runner/adventure/settlement/_adventure_mode/_row_queue` 等局态 → run-scope 节点(`main.run_scope.X` 形态,命名属代拍板白名单#5)。 -3. `_start_overlay/camp_overlay/level_screen/...` 屏成员 → 屏场景属性(组合根保留装配属性,路径一级化)。 -4. `get_child`/子序数寻址(ui_layout #4)→ 名寻址(子场景化后序数漂移是 breaking 面)。 -5. 手工复位断言(ui_probe `_reset_run_scope`)→ run 节点 `queue_free()` 复位断言(V3 配套)。 diff --git a/roadmap.md b/roadmap.md index 6a21bb60..639fee5b 100644 --- a/roadmap.md +++ b/roadmap.md @@ -60,7 +60,7 @@ | 迭代 24 | 已完成(2026-10-13) | 已退役(git 历史可考) | 2026-10-13 | — | 已退役(git 历史可考) | | 迭代 25 | 已完成(2026-10-13) | 已退役(git 历史可考) | 2026-10-13 | — | 已退役(git 历史可考) | | 迭代 26 | 已完成(2026-10-14) | 已退役(git 历史可考) | 2026-10-14 | — | 已退役(git 历史可考) | -| 迭代 27 | 已完成(2026-10-14) | 已退役(git 历史可考) | 2026-10-14 | — | reports/iter27-实现报告-2026-10-14.md | +| 迭代 27 | 已完成(2026-10-14) | 已退役(git 历史可考) | 2026-10-14 | — | 已退役(git 历史可考) | | 迭代 28 | 已完成(2026-10-15) | 已退役(git 历史可考) | 2026-10-15 | — | reports/iter28-实现报告-2026-10-15.md | | 迭代 29 | 已完成(2026-10-16) | 已退役(git 历史可考) | 2026-10-16 | — | reports/iter29-实现报告-2026-10-16.md | | 迭代 30 | 已完成(2026-10-17) | 已退役(git 历史可考) | 2026-10-16 | — | reports/iter30-实现报告-2026-10-17.md | From f8191a3bc6716102a7803cfa85a9d3348a3bb629 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 20 Oct 2026 14:59:04 +0800 Subject: [PATCH 2/7] =?UTF-8?q?chore(=E6=89=B9=E5=90=8E=E6=94=B6=E5=B0=BE)?= =?UTF-8?q?:=20=E8=BF=AD=E4=BB=A3=2028=20=E5=AE=9E=E7=8E=B0=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E9=80=80=E5=BD=B9=E2=80=94=E2=80=94=E5=90=B8=E6=94=B6?= =?UTF-8?q?=E5=8D=B3=E6=AD=BB=E5=88=A0=E9=99=A4=EF=BC=88=E5=8F=8D=E5=93=BA?= =?UTF-8?q?=E7=82=B9=E4=B8=89=E6=9D=A1=E5=B7=B2=E8=90=BD=E6=96=87=20archit?= =?UTF-8?q?ecture=202026-10-17=20=E7=89=88=E3=80=81=E8=BF=BD=E8=AE=A4=201?= =?UTF-8?q?=E2=80=9313=20=E5=B7=B2=E5=90=8C=E6=84=8F=E3=80=81#14=20?= =?UTF-8?q?=E5=BE=85=E8=A3=81=E5=B7=B2=E8=BF=81=2006=E3=80=81t17=5Fdefer?= =?UTF-8?q?=20=E5=AD=98=E9=87=8F=E7=BA=A2=E5=B7=B2=E6=B6=88=E8=A7=A3--full?= =?UTF-8?q?=20=E7=8E=B0=E7=BB=BF=E3=80=81=E7=9B=AE=E6=A3=80=E5=B7=B2?= =?UTF-8?q?=E7=99=BB=E8=AE=B0=2007=20=E3=89=97=EF=BC=89=EF=BC=9Broadmap=20?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=2028=20=E8=A1=8C=E5=AE=9E=E7=8E=B0=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E5=88=97=E6=94=B9=E9=80=80=E5=BD=B9=E4=BF=9D=E7=95=99?= =?UTF-8?q?=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reports/iter28-实现报告-2026-10-15.md | 194 -------------------------- roadmap.md | 2 +- 2 files changed, 1 insertion(+), 195 deletions(-) delete mode 100644 reports/iter28-实现报告-2026-10-15.md diff --git a/reports/iter28-实现报告-2026-10-15.md b/reports/iter28-实现报告-2026-10-15.md deleted file mode 100644 index 3eacf186..00000000 --- a/reports/iter28-实现报告-2026-10-15.md +++ /dev/null @@ -1,194 +0,0 @@ -# 迭代 28 实现报告——启动装配与生命周期验收补全批(六任务全量入库) - -**日期**:2026-10-15 **分支**:iter28-bootlife-20261015(worktree `g-plan2-iter28-bootlife`,基点 39c6544) -**需求卡片**:已退役(git 历史可考)——原「启动装配与生命周期验收补全批」v1.0(零待裁点,用户预批连做全批,不入 git) -**一句话**:把「启动后玩家该看到什么、状态对象何时该活何时该死」从口头约定变成**可执行验收函数**,并逐条用变异实验证明这些函数真能抓住对应缺陷。 - ---- - -## 一、六卡交付 - -| 卡 | 内容 | 提交 | -|---|---|---| -| T0 | worktree + 基线三查 + 运行期树序实采(临时探针两枚,采完即删) | 无产物(定义面已在前置笔 39c6544) | -| T1 | 装配语义合同单点化 + 装配顺序修复 + V2 断言重写 | `6f71509` | -| T2 | boot 链路时序后置条件(`_smoke_boot_chain`) | `a35581e` | -| T3 | 生命周期存活性矩阵(`_smoke_lifecycle_matrix`) | `77075e6` | -| T4 | 渲染面内容断言三件(探针自检 + 墨色判据 + 启动态菜单 golden) | `67342c6` | -| T5 | 变异验证(横切,六次注入;**零提交——注入即还原**) | 无提交(见 §五) | -| T6 | 规范三处落文 + 机械面文档同步闸 | `db1bf42` | -| T1 补 | 类型闸 S9 归零(`main.gd` 合同装配容器注解) | `140e440` | - -### T0 开工基线与事实复核 - -基线冻结:冒烟 **1086/0**(roadmap 与卡片所记 1081 系 iter27 补遗批 `d5eea25` +V8×5 未回写,以实跑为准,**已随本批回写**)、run_all **27 套**全绿、probe_gate --click 全绿残留 0。 - -运行期实采修正了计划书与卡片的三处描述偏差(按「诊断订正」惯例以代码/运行期为准): - -1. **屏壳是容器、不当「顶层可见层」候选**(卡片诊断订正①,运行期实证):三屏壳根均 `MOUSE_FILTER_IGNORE` 纯容器,camp 壳 boot 态 `visible=true` 但成员恒隐;裸树遍历自顶向下会先命中透明壳。断言改为遍历合同**内容层**候选集。 -2. **`_row_pacer` 句柄数**(卡片诊断订正②):计划书称 6 视图句柄,实查 5 + 2 Callable。 -3. **`main.gd:378` 十二模态登记数组**形态与卡片描述有差异——合同常量按运行期实采自行定义为 **16 层自洽表**(含 host 宿住层、shell 屏壳占树位两类特例)。 - -T0 临时探针 `t28_treeorder_probe.gd` / `t28_treeorder_probe2.gd` 采完即删,未提交。 - -### T1 装配语义合同单点化 + 顺序修复 + V2 断言重写 - -- **合同常量 `LAYER_CONTRACT`**(`main.gd`)=全仓唯一事实源:16 层(屏壳 shell / 模态 modal / 全屏态 state / 非视觉 node),带 `tags`(模态互斥域)、`host`(宿住层:level_screen 宿冒险屏壳)、`shell`(屏壳占树位、成员占登记位:camp_overlay/camp_screen)四类字段。树序=登记序=z 序同源派生。 -- **唯一落位口 `_apply_layer_contract()`**:按合同序 `move_child(node, slot)` + `_register_modal(member, tags)`;删除了原先散落在 `_build_ui` 的两处 `move_child`(camp 屏壳插位、curio 对位)。新增 `_layer_node(key)` 查表寻址函数。 -- **装配顺序修复**:`_adventure_screen` 先实例化挂树、`_menu_screen` 后挂——修复坏事实①「菜单屏先挂垫底被冒险屏盖死,F5 见战斗界面」。 -- **V2 断言重写**(坏事实②:旧断言把错误顺序写成期望值,测试在保护 bug):删除三条裸下标断言(`kids.find(_menu_screen)==0 and kids.find(_adventure_screen)==1` 等),改为 - - **V1a** 启动态顶层可见层=start_overlay(内容层遍历,屏壳不当候选) - - **V1b** 语义关系:菜单屏壳树序 > 冒险屏壳树序 - - **V1c** 合同树序链逐对保序(运行期树序 == `LAYER_CONTRACT` 序) - - **V1d** 落位单口源码断言(`_apply_layer_contract` 函数体之外 `move_child(` 计数 == 0) - - 场景探针同步:`ui_struct_probe` 新增 `_modal_registry_contract`(登记序==合同模态序逐位点名、直接子层树序==合同序、level_screen 宿主特例、camp 屏壳夹位特例),旧 `_career_registry_contract` 同批退役。 - -### T2 boot 链路时序后置条件 - -新增 `_smoke_boot_chain`,**十断言**(卡片写「六断言」,实施期按可断言面扩为十):ConfigDB 就绪且表已载 / 音量与减动效引擎态 == settings_store 现值 / start_overlay 可见 / **续玩钮态 == 断点在档态(boot 路径关系判据 + 隔离新档双向三子态:无断点隐、合成断点显、清断点回隐)** / run_scope 闲时会话在树 / 调试浮窗态 == DS_DEBUG 门控。存档隔离走 `attach_path("user://smoke_boot_chain.json")`。 - -### T3 生命周期存活性矩阵 - -新增 `_smoke_lifecycle_matrix`,**九阶段 × 五引用面**:闲时 / 开局停点(地图选路停点态合并)/ 战斗中 / 结算后(胜利停点)/ 选路页 / 终局面 / 回菜单收束 / 各模态开合后(菜单域四模态)/ 两连局 + 续玩。每阶段判 20+ 取数面的存活性:`run_scope` 在树、adventure / runner / settlement 三面活死、四处回调句柄(treasure/bonus/camp/modal_flow)与 `run_scope` 成员同源。活战斗驱动复用现有 `_auto_play_round` 模式(phase/round 守卫 + `AutoPlayer.choose_dig`)。 - -### T4 渲染面内容断言三件(坏事实③) - -1. **`shot_probe.gd` 两自检**:boot 态顶层可见层 == start_overlay;菜单标题/副标题 `is_visible_in_tree` 且 `get_global_rect()` 落视口内。隔离调用改 `ProbeUiUtil.isolate_save(main, "smoke_shot_probe", false, true, true)`(refresh_resume 开——菜单截图/golden 不依赖真实档断点态)。 -2. **`shot_checker.py` 墨色判据 F**:新增 `check_text_presence()`——与中位灰度差 >60 的像素占比落在 [2%, 55%] 带(**极性无关**,不预设字色深浅)。 -3. **启动态菜单 golden**:`golden_baseline_refresh.sh` 新增 `--menu` 模式(含字体与 `button_stone.png` 素材守卫),基线 `game/tests/golden/menu_boot.png` 入库;`render_gate.sh` 补菜单 golden 逐像素对比段(基线缺失=FAIL、截图/素材缺位=SKIP,沿既有 Q5 口径)。帧差前置验证:菜单 **changed=0.0000% / max_diff=0**(光柱是静态贴片),故全屏 golden 安全、无需收窄区。 - -### T6 规范落文 + 机械面文档同步 - -- **新硬规则「验收函数无变异红记录不算验收成立」**三处落文:`CLAUDE.md` 批次工作流第 9 条(原 9–14 顺延 10–15)、`design/dev/code-conventions.md` §3.6 变异验证操作细则(注入→最窄闸见红→`git checkout` 精确还原→记录四步;变异不红的二选一处理;判据强弱分层)、req-card 技能 §7 验证闸(WorkBuddy 与 ZCode 两份副本已同步;CodeBuddy / Qoder CN 无此技能副本,不动)。 -- 机械面文档随批更新:roadmap 迭代 28 行换代+近期主战场前沿改 29+ M4;06 登记条销号改写+反哺点三条专条;07 新增 ㉗ 启动态菜单目检节;doc 三闸对基线零新增。 - ---- - -## 二、闸记录 - -| 闸 | 结果 | -|---|---| -| 冒烟全量 | **1125 / 0**(基线 1086/0,+39) | -| 单元测试 run_all | **27 套全绿** | -| probe_gate --click | **全绿**,残留 Godot = 0 | -| probe_gate --full | ⚠️ **t17_defer_probe 红**(存量红,非本批引入——详见 §六),其余五件全绿 | -| render_gate | **全绿**:shot_checker A–D 过(含新增 F 判据 I-OK×2)、棋盘 golden 0.00%×3、**菜单 golden 0.00%** | -| doc 三闸 | 对基线零新增(gdd_lint 三件 / 死链 3 / 术语 5 组,与 master 39c6544 同) | -| static_scan | S1/S2 ok、S4 ok、**S9 归零**、S10 FAIL=文件头存量 125 处(2026-10-15 新立规,清偿批在册待发令,非本批引入) | -| MC 模拟 | **零跑**(本批零数值零行为变更,装配顺序修复除外) | - -**类型闸自纠一笔**:批末 static_scan 报 S9(类型闸)**存量 1 处**——`main.gd:453` `_apply_layer_contract` 内 `var tags: Array` 未带元素类型,系本批新增代码触发(iter27 立闸时 S9 全绿)。随批修为 `Array[Variant]`,S9 归零,冒烟复跑 1125/0 不变。**这笔正是「闸不是摆设」的反面印证**:本批新增的验收函数抓别人的错,既有的类型闸同样抓本批的错。 - -**顺带清理(非本批引入,基线带入)**:`design/gdd/07-体验验证清单.md` v1.0 行处残留 `<<<<<<<` / `=======` / `>>>>>>>` 合并冲突标记(iter27-techdebt-20261014 分支合并进 master 时漏解)。两侧均有效故全留(qa 收尾批人闸核销行 + ㉖ 目检节登记行与正文节),版本号顺延 v1.1,清理注记入 v1.2 行。 - ---- - -## 三、代拍板追认单 - -> **追认结果(2026-10-17 用户令)**:第 1–13 项**全部同意,无修改意见**(含第 9–13 项五条白名单外)。第 14 项本批动作(只补 ZCode 副本、未擅自取齐)照认;其**"两副本是否取齐"仍是待裁问题**,挂在 active.md 未决面,不因本追认自动通过。 - -白名单内八项(卡片 §9)全部按授权执行;以下为实施期实际取定的形态与**白名单外需追认项**: - -| # | 事项 | 取定 | 归属 | -|---|---|---|---| -| 1 | 合同常量数据形态 | 有序 `Array[Dictionary]` + tags/host/shell 特例字段(白名单①) | 白名单 | -| 2 | 特例层断言表达 | 经宿主屏壳 / 成员间接比较(白名单②) | 白名单 | -| 3 | boot 顶层断言候选集 | 显式内容层清单(屏壳不当候选)(白名单③) | 白名单 | -| 4 | 墨色阈值 | 差 >60、占比带 [2%, 55%],按菜单文字实测定 provisional(白名单④) | 白名单 | -| 5 | 菜单 golden 收窄区 | 不收窄——帧差实证 0.0000%,直接全屏比对(白名单⑤,结论为「无需收窄」) | 白名单 | -| 6 | 变异注入手段 | 改常量序 / 插 `move_child` / 注释 `add_child` / 注释 `queue_free` / `visible=false` / 状态源取反(白名单⑥) | 白名单 | -| 7 | 新冒烟段挂载位置 | `_smoke_scene_split` → `_smoke_boot_chain` → `_smoke_run_lifecycle` → `_smoke_lifecycle_matrix`,挂 `_split_tail`(白名单⑦) | 白名单 | -| 8 | 计划书存档文件名 | `.zcode/plans/启动装配与生命周期验收补全批-loop-plan-2026-10-15.md`(白名单⑧) | 白名单 | -| 9 | **合同表规模 12 → 16 层** | 卡片基于「十二模态登记数组」,实采后扩为覆盖全视觉层的 16 层(屏壳/非视觉节点/全屏态亦入表)——约束「单点化+同源派生」未破 | **白名单外,请追认** | -| 10 | **T2 断言数 6 → 10** | 卡片写六断言,实施期把续玩钮拆出隔离三子态、补全 ConfigDB/设置/会话/浮窗门控面 | **白名单外,请追认** | -| 11 | **T3 阶段划分调整** | 卡片写「十阶段」,实施期把「地图选路停点态」并入「开局停点」(同一运行期状态,无独立断言面),得九阶段 | **白名单外,请追认** | -| 12 | **变异 2b 形态偏离计划书** | 计划书原文「注释 `_begin_session`/提前 free」;实施期取 2a=注释 `add_child`(该活不活)、2b=**注释 `queue_free`(该死不死)** 互补双向。「提前 free」改为 `free()` 会与 V3f 断言同向(仍绿),不构成有效变异,故未取 | **白名单外,请追认** | -| 13 | **07 冲突标记清理** | 基线带入的未解合并标记,本批因需同文件登记 ㉗ 而顺手解开(两侧全留,零内容发明) | **白名单外,请追认** | -| 14 | **req-card 技能双副本** | ZCode 副本与 WorkBuddy 副本已各自演进(ZCode 多两条自有条目),本批只把变异验证一条补进 ZCode 副本,**未擅自取齐**两副本差异 | 知会项;是否取齐请裁 | - ---- - -## 四、GDD 反哺点(三条,已登记 06,待用户逐点裁决另批落文) - -| # | 文档 | 反哺点 | -|---|---|---| -| 1 | `design/dev/architecture/architecture.md` | **视觉层装配合同**=`main.gd` 的 `LAYER_CONTRACT` 常量(16 层),树序=登记序=z 序同源派生,全仓唯一落位口 `_apply_layer_contract`;现行架构文档无此条款(仅 :124 提「组合根 main.gd」、:173 提「主场景装配视图单元」)——是否立条款、合同表是否随架构文档摘录待裁 | -| 2 | `design/dev/architecture/architecture.md` | **boot 链路后置条件**已由 `_smoke_boot_chain` 十断言成文;架构文档启动流程(:173)只有装配动作无后置条件——是否入册待裁 | -| 3 | `design/dev/architecture/architecture.md` | **RunScope 生命周期存活性矩阵**(九阶段×五引用面)已可执行化;架构文档 :124 只登记了 RunScope 的存在——矩阵是否入册、阶段划分是否认账待裁 | - -**与迭代 27 反哺点①的关系**:iter27 只登记了「场景分层/会话生命周期陈述滞后于实态」的方向性缺口;本批把其中「层序=谁说了算」「boot 后置条件是什么」「会话引用面何时活何时死」三件做成了代码级事实与可执行断言,本条是其**具体化承接**,落文时可合并处理。 - ---- - -## 五、变异验证记录表(六次注入,全部见红并精确还原) - -判据:**注入 → 跑最窄的那一道闸 → 见红 → `git checkout -- <文件>` 精确还原 → 复跑确认回绿**。还原后统一复跑冒烟得 **1125/0**,六轮全以 `REVERTED-CLEAN` 收尾。 - -| # | 变异点(file:line) | 注入方式 | 缺陷类 | 跑的闸 | 红输出(摘要) | -|---|---|---|---|---|---| -| 变异 1 | `game/presentation/main.gd` `LAYER_CONTRACT` 首两行 | `adventure_screen` / `menu_screen` 对调(翻装配序) | 装配序错 | `python tools/run_smoke.py` | 1125 项 **2 失败**:`V1a`(实测顶层=`@VBoxContainer@648`,菜单被冒险屏盖住)、`V1b`(菜单屏壳树序不在冒险屏壳之上)红;`V1c/V1d` 绿 | -| 变异 1b | `main.gd` `_apply_layer_contract()` 调用后 | 插入散落 `move_child(debug_overlay, 0)` | 层序硬编码(合同外落位) | 同上 | 1125 项 **2 失败**:`V1d`(函数体之外 move_child 调用点=1 应=0)、`V1c`(违例 `@Control@1057(14)≤@Control@1119(0)`)红 | -| 变异 2a | `main.gd:195` `_begin_session` | 注释 `add_child(run_scope)`(会话对象不挂树) | 对象该活不活 | 同上 | 1125 项 **22 失败**:`V2e` 红 + V3 全部 21 个阶段面「run_scope=不在树」 | -| 变异 2b | `main.gd:191-192` `_begin_session` | 注释 `run_scope.queue_free()`(旧会话不销毁) | 对象该死不死 | 同上 | 1125 项 **1 失败**:`V3f`「收束后旧局经 queue_free 消亡(is_instance_valid=false)」红 | -| 变异 3 | `main.gd:218` `_ready` | `_start_overlay.visible = false`(藏菜单层) | 层被盖/不可见 | 冒烟 + 窗口化 `shot_probe` + `golden_compare` + `shot_checker` | 冒烟 **3 失败**(`V1a`/`V2c`/`V3a`);探针自检 **3 问题**(顶层≠start_overlay、标题/副标题 `is_visible_in_tree=false`);golden `changed=34.23%` FAIL;`shot_checker` exit=1 | -| 变异 4 | `main.gd:531` `_refresh_resume_button` | `_resume_btn.visible = not has`(状态源倒置) | 状态源/时序倒置 | `python tools/run_smoke.py` | 1125 项 **6 失败**:`V2d` 四条全红(boot 态、无断点态、有断点态、清断点回隐)+ `V3a` + `V3i` | - -### ⚠️ 变异 3 暴露的一条判据边界(重要,如实记录) - -**F 判据(墨色占比)本身没有红**——菜单层被藏后,底层棋盘内容透过标题框仍给出 33.48% 的高反差像素,落在 [2%, 55%] 带内,`I-OK` 照过。真正拦下这个缺陷的是另外两件:探针的 `is_visible_in_tree` 自检,和 golden 逐像素(34.23%)。`shot_checker` 虽 exit=1,但红的是 **C 判据**(背景纹理幅度 79.4 > 18),属间接命中。 - -**结论**:F 判据只能证伪「整框空白/整框糊」,**不证明「框里是菜单标题」**。菜单内容断言的强判据是「可见性自检 + golden 逐像素」,F 判据为补充。这条边界已同步写进 `code-conventions.md` §3.6 的「判据强弱分层」,供后续写卡配判据时援引。 - ---- - -## 六、残留与去向 - -### 6.1 probe_gate --full 的 t17_defer_probe 红(存量红,**非本批引入**,待裁) - -**① 现象**:`tools/probe_gate.sh --full` 中 `t17_defer_probe` 失败——`[t17_defer] FAIL — 关卡画面未出现`(exit=2;首次运行时表现为 exit=124 超时挂死,同一根因的两种表现)。`--full` 的其余五件(ui_input / ui_struct / ui_contrast / ui_probe / ui_tune / fx)**全绿**,`--click` 亦全绿。 - -**② 证据链(三条,均指向「非本批引入」)**: - -| 证据 | 结果 | -|---|---| -| 主区 master 39c6544(**不含本批任何改动**)跑同一探针 | **同样 FAIL 4/4**,失败行与本批完全一致 | -| 把真实档 `user://save.json` 临时改名移开后跑同一探针 | **PASS**(exit=0,15s,`胜利同帧挂起+排播完开窗 两断言全过`) | -| 探针自身行为 | 首次跑绿、跑完即把真实档写成带断点状态,其后必红——**探针会污染它本应隔离的真实档** | - -**③ 机理**:`_start_adventure_from_menu()`(`main.gd:498`)在 `save_manager.has_breakpoint()` 为真时不开冒险,改弹「已有未完冒险」确认框。真实 `user://save.json` 当前存在未完冒险断点时,探针的隔离(`main.save_manager = iso_c`)没能覆盖到这条路径,于是 60 帧内等不到 `level_screen.visible` → FAIL。 - -**④ 补充事实(须告知)**:`user://` 目录(`%APPDATA%/Godot/app_userdata/DungeonSweeperVerticalSlice/`)由**全部 worktree 共享**(同 project name),所以主区与任何 worktree 的探针/冒烟都在读写同一份存档。本机这份真实档现在带有一个未完冒险断点。**本批验证过程中曾为定位根因临时改名移开该档,已按原样还原并通过逐字节 `cmp` 校验一致**(备份留 `/d/tmp_save_backup_20261015.json`)。 - -**⑤ 历史沿革**:iter26 台账记「probe click/full 全绿」,**iter27 台账只记了 `probe click` 未记 `--full`** —— 该红大概率自 iter27(row_pacer 排播泵迁出 + ModalFlow 抽取)起就存在而未被跑到。probe_gate 头注亦有预言:「超时多半=探针未适配新停点层,归 probe 适配批」。 - -**⑥ 待裁(不擅自处理)**:本红属**探针适配存量债**,修它=改探针隔离方式,是卡片外的新需求。三个选项请裁: - -- **甲**:认可存量红、照常合并——红与本批无关,master 现状同红,合并不会使任何东西变差; -- **乙**:先修探针隔离(补真实档隔离/跑前清断点)再合并——属新需求,需用户批后另起小批; -- **丙**:用户先自行处置本机真实档断点(游戏内开新冒险覆盖或删档),我再复跑 `--full` 取绿后合并——但此法只治本机这一次,探针自污染的根因仍在。 - -### 6.2 实机目检(登记不阻塞,2026-10-12 立规) - -已登记 `design/gdd/07-体验验证清单.md` **㉗ 启动态菜单目检**五观测项:启动即见主菜单 / 菜单六钮可点 / 菜单与战斗互不遮挡 / 各覆盖层开合层级正确 / 音量与减动效启动即生效。**登记完毕即批内义务了结**,用户自行安排时间验收。 - -### 6.3 其他 - -- 计划书存档:`.zcode/plans/启动装配与生命周期验收补全批-loop-plan-2026-10-15.md`(不入 git)。 -- 需求卡片按「中间产物吸收即死」惯例不入 git;卡片所记基线 1081 与实测 1086 的差异已随本批回写 roadmap 与 06。 -- req-card 技能两份副本(WorkBuddy / ZCode)本批各补一条后**仍有两条 ZCode 自有条目未取齐**,是否取齐请裁(§三 #14)。 - ---- - -## 七、冒烟断言数增量呈报 - -**1086 → 1125,净 +39**,逐项可溯源: - -| 项 | 条数 | -|---|---| -| 新增 V1(装配合同四断言:V1a/V1b/V1c/V1d) | +4 | -| 新增 V2(boot 链路十断言) | +10 | -| 新增 V3(生命周期矩阵,九阶段面 + 各附加判据) | +28 | -| 退役裸下标断言(`kids.find(...)` 三处——合同链断言已覆盖) | −3 | -| **合计** | **+39** | - -(新增 42 条全部带 `〔装配生命批 Vn〕` 尾缀,可与需求卡片 §7 逐条 grep 对账。) diff --git a/roadmap.md b/roadmap.md index 639fee5b..6504b50b 100644 --- a/roadmap.md +++ b/roadmap.md @@ -61,7 +61,7 @@ | 迭代 25 | 已完成(2026-10-13) | 已退役(git 历史可考) | 2026-10-13 | — | 已退役(git 历史可考) | | 迭代 26 | 已完成(2026-10-14) | 已退役(git 历史可考) | 2026-10-14 | — | 已退役(git 历史可考) | | 迭代 27 | 已完成(2026-10-14) | 已退役(git 历史可考) | 2026-10-14 | — | 已退役(git 历史可考) | -| 迭代 28 | 已完成(2026-10-15) | 已退役(git 历史可考) | 2026-10-15 | — | reports/iter28-实现报告-2026-10-15.md | +| 迭代 28 | 已完成(2026-10-15) | 已退役(git 历史可考) | 2026-10-15 | — | 已退役(git 历史可考) | | 迭代 29 | 已完成(2026-10-16) | 已退役(git 历史可考) | 2026-10-16 | — | reports/iter29-实现报告-2026-10-16.md | | 迭代 30 | 已完成(2026-10-17) | 已退役(git 历史可考) | 2026-10-16 | — | reports/iter30-实现报告-2026-10-17.md | | 迭代 31 | 待开工 | reports/需求卡片-代码术语刷新批-2026-10-18.md、reports/需求卡片-凭证件裁削批-2026-10-18.md | 2026-10-18 | ≈1.5 周 | — | From 487c2072f10c92054ef52f54bcf728762ad6bd41 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 20 Oct 2026 15:03:26 +0800 Subject: [PATCH 3/7] =?UTF-8?q?chore(=E6=89=B9=E5=90=8E=E6=94=B6=E5=B0=BE)?= =?UTF-8?q?:=20=E8=BF=AD=E4=BB=A3=2029=20=E5=AE=9E=E7=8E=B0=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E9=80=80=E5=BD=B9=E2=80=94=E2=80=94=E5=90=B8=E6=94=B6?= =?UTF-8?q?=E5=8D=B3=E6=AD=BB=E5=88=A0=E9=99=A4=EF=BC=88=E5=8F=8D=E5=93=BA?= =?UTF-8?q?=E7=82=B9=E4=B8=89=E6=9D=A1=E5=B7=B2=E8=90=BD=E6=96=87=20test-c?= =?UTF-8?q?onventions=20=C2=A77/=C2=A78=20=E4=B8=8E=2007=20=E3=89=96=20?= =?UTF-8?q?=E6=9C=BA=E6=A3=80=E6=89=BF=E6=8E=A5=E6=B3=A8=E8=AE=B0=E3=80=81?= =?UTF-8?q?12=20=E9=A1=B9=E4=BB=A3=E6=8B=8D=E6=9D=BF=E5=B7=B2=E8=BF=BD?= =?UTF-8?q?=E8=AE=A4=E3=80=81=E6=B5=8B=E8=AF=95=E5=9F=9F=E9=81=97=E7=95=99?= =?UTF-8?q?=E4=B8=83=E9=A1=B9=E5=9C=A8=E5=86=8C=2006=E3=80=81=C2=A7?= =?UTF-8?q?=E5=85=AD.1=20parity=20=E5=BE=85=E6=89=B9=E5=87=86=E4=BA=8B?= =?UTF-8?q?=E9=A1=B9=E6=8C=89=E3=80=8CMC=20=E6=97=A0=E6=95=B0=E5=80=BC?= =?UTF-8?q?=E6=94=B9=E5=8A=A8=E9=9B=B6=E8=B7=91=E3=80=8D=E7=BA=A2=E7=BA=BF?= =?UTF-8?q?=E5=88=A4=E9=97=AD=E5=90=88=EF=BC=9A=E6=9C=AC=E6=89=B9=E5=AF=B9?= =?UTF-8?q?=20battle=5Forchestrator.gd=20=E4=BB=85=E5=8A=A0=E6=96=AD?= =?UTF-8?q?=E8=A8=80=E8=B1=81=E5=85=8D=E5=B8=B8=E9=87=8F=E3=80=81=E9=9B=B6?= =?UTF-8?q?=E6=95=B0=E5=80=BC=E6=94=B9=E5=8A=A8=EF=BC=8C=E4=B8=8D=E8=A1=A5?= =?UTF-8?q?=E8=B7=91=EF=BC=8C=E7=90=86=E7=94=B1=E7=94=A8=E6=88=B7=E8=A3=81?= =?UTF-8?q?=202026-10-20=EF=BC=89=EF=BC=9B=E6=9C=AC=E6=89=B9=E6=97=A0?= =?UTF-8?q?=E5=AE=9E=E6=9C=BA=E7=9B=AE=E6=A3=80=E9=A1=B9=E3=80=8107=20?= =?UTF-8?q?=E6=97=A0=E6=96=B0=E5=A2=9E=EF=BC=9Broadmap=20=E8=BF=AD?= =?UTF-8?q?=E4=BB=A3=2029=20=E8=A1=8C=E5=AE=9E=E7=8E=B0=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E5=88=97=E6=94=B9=E9=80=80=E5=BD=B9=E4=BF=9D=E7=95=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reports/iter29-实现报告-2026-10-16.md | 169 -------------------------- roadmap.md | 2 +- 2 files changed, 1 insertion(+), 170 deletions(-) delete mode 100644 reports/iter29-实现报告-2026-10-16.md diff --git a/reports/iter29-实现报告-2026-10-16.md b/reports/iter29-实现报告-2026-10-16.md deleted file mode 100644 index 180caba0..00000000 --- a/reports/iter29-实现报告-2026-10-16.md +++ /dev/null @@ -1,169 +0,0 @@ -# 迭代 29 实现报告 · 测试分层与门禁语义修正批(2026-10-16) - -- 需求卡片:已退役(git 历史可考)——原「测试分层与门禁语义修正批」**v2.0**,三轮复查定稿、零待裁点 -- 开工门 U0:用户 `/iter 29` 发令(2026-10-16)。基线 master `752c9a0a` -- worktree:`g-plan2-iter29-testlayers`,分支 `iter29-testlayers-20261016`,八提交(`698d864d` … `c3b64030`) -- 用户原始诉求(本批要兑现的三条):①最单元的逻辑代码有它的单元测试;②整体的模块有它的接口测试; - ③整体的系统在执行之后,也有它 UI 方面的和场景切换相关的测试。**并且验收不能只是"冒烟"—— - 可以是冒烟,但更重要的是逻辑正确性** - ---- - -## 一、批次概览 - -| 卡 | 内容 | 状态 | -|---|---|---| -| T0 | 证据坐实与基线冻结(三反例实测 + 墙钟 + 行号复核 + 存量红留档) | ✅ | -| T1 | 本地闸判定三硬闸(退出码/脚本错误扫描/断言数下限) | ✅ | -| T2 | 术语订正 + CI 残留清除(机械面) | ✅ | -| T3 | L2 接口层建承载(`integration/` + parity 条件闸件收编) | ✅ | -| T4 | L3 屏壳切换探针 `screen_flow_probe`(入轻闸默认段) | ✅ | -| T5 | L1 覆盖补洞(4 个 core + 呈现层两件) | ✅ | -| T6 | 扫描域:S3 路径修正 + 零命中自检 + 补 S5 | ✅ | -| T7 | 游离脚本台账 + golden 时效判定 | ✅ | -| T8 | 文档同步闸(架构事实源回写 + 06 登记)与全闸 | ✅ | - -**读数**:冒烟 **1127/0**(与开工日持平,本批零新增冒烟断言);单元套件 **27 → 33 套**; -在闸探针 **9 → 10 件**(新增 `screen_flow_probe`);轻闸 `--quick` 墙钟 363s → 405s; -全量重闸 **exit=0,存量红零新增**。 - ---- - -## 二、四件事的交付 - -### ① 本地闸三硬闸(本批改造成效最大的一卡) - -判定语义从「超时 + 日志含 PASS 串」扭到三硬闸,**每一条都有反例实证**(不是推断,是跑出来的): - -| 硬闸 | 反例构造 | 改前判定 | 改后判定 | -|---|---|---|---| -| 退出码为唯一权威判据 | 探针打印 PASS 后 `quit(1)` | `[probe_gate] 全绿` ❌ | `FAIL — 退出码=1(PASS 串不抵)` ✅ | -| 脚本错误扫描命中即红 | 套件中途触发 `SCRIPT ERROR` 后仍退出 0 | `[run_all] PASS` ❌ | `FAIL — 输出含脚本错误标记` ✅ | -| 断言数为零即红 | `Kit.finish()` 时 `checks==0` | `all green (0 checks)` ❌ | 返回专用退出码 **2** → `FAIL` ✅ | - -实现要点: -- `probe_gate.sh` 八件探针判定统一走 `verdict` 函数(退出码优先 → 脚本错误扫描 → 签名标记附加判据); - `ui_click_probe` 本就走退出码语义、日志不写 PASS,签名标记传它自己的 `click_probe` 串,不强加。 -- 新闸件 `tools/error_scan.py`:错误标记 `import` 自 `run_smoke.py` 的 `ERROR_MARKERS`,**禁第二份清单**。 -- `run_all.gd` 侧遇到两个本机事实(都写进注释防复发): - ① `OS.execute` 的输出管道在本机恒空(实测 0 行)——子套件输出必须交给系统命令解释器重定向落盘再读; - ② `OS.get_executable_path()` 返回的是 GUI 子系统 exe,它起的子进程 stdout/stderr 句柄无效—— - 必须换 `*_console.exe`(`GODOT_BIN` 优先)。 -- 断言下限用**专用退出码 2**(不是 1):致命类套件 manifest 期望 1,零断言若也返回 1 会被 expect 协议放过。 - -### ② L2 接口层从零建承载 - -- 建 `game/tests/integration/`,首个集成用例 `save_rng_roundtrip_test.gd`(17 条断言):存档 ⇄ RNG 快照往返, - 跨 SaveManager(落盘 + 版本迁移链)× AdventureRunner(断点消费)× RngService(续跑零跳号)× 停点态确定性。 - 与 `unit/core/breakpoint_resume_test` 的分工:那件是单测只验首战开板一致,本件验跨系统闭环, - 含**「旧版本档经迁移链后断点仍可续玩」**这条真实玩家路径。 -- `tools/parity_anchor.py` 收编为重闸 **11 号条件闸件**:每次跑批都对 merge-base 做一遍触面判定 - (`data/tables`/`rng_service`/`save_manager`/`meta_progression`/`settlement`/`damage_math`/ - `damage_controller`/`battle_orchestrator`/`adventure_monte_carlo`),未触面 SKIP;**触面也不自动跑**—— - 它调的是 MC 脚本,属「跑批发起前须用户批准」红线,闸只负责把触面判定做一遍并显式要求批准 - (批准后 `PARITY_APPROVED=1` 重跑)。**本批即判为触面(改了 `battle_orchestrator.gd`),故挂在 NEED-APPROVAL 待你批准**(见第六节)。 - -### ③ L3 屏壳切换探针 - -新建 `game/smoke/screen_flow_probe.gd/.tscn`:走 菜单→营地→菜单→冒险→(关卡屏⇄战斗屏)→放弃→终局→菜单 -六步主流程与两条回退路径,每步断言屏级互斥 + 流程状态位,入**轻闸默认段**。全库 `change_scene` 零命中、 -屏切换全靠 visible 互斥,这正是最容易被装配顺序改动悄悄破坏又最难被单测覆盖的面。 - -判据两处订正(首跑实测抓出):① 屏标记不能裸看 `visible`——战斗容器 `battle_root` 在局外也 visible, -会把 boot 态误判成「菜单与冒险同时在场」;② 互斥不能用「可见屏计数 ≤1」——终局覆盖层合法叠在冒险内容之上 -(终局态 `is_adventure` 尚未收束,是设计如此),改为冲突对判定,合法叠加仅「终局+冒险」这一对。 - -### ④ L1 补洞 + 术语订正 + 台账清理 - -- 新增六套(全部进 manifest):`board_generator`(9 条)/`minesweeper_rules`(12 条)/ - `config_db_resolver`(8 条)/`config_db_cross_validator`(4 条)/`hud_presenter`(5 条)/`battle_narrator`(9 条)。 - 三屏壳的断言面由 ③ 的探针承担,不另起第二载体。 -- 术语:「冒烟」回归本义=秒级存活检查,写进 README 术语小节,并显式点破两处历史遗留命名 - (`run_smoke.py` 与 `game/smoke/` 名带 smoke,实际承载的是系统级断言面与场景探针——判定看语义不看文件名)。 -- 台账:`game/smoke/` 15 个不带 `.tscn`、不入闸的手动入口件逐个定性成表(用途 + 触发方式 + 结果由谁判), - 存疑一律按在役登记并标注,禁「没看见=死件」式清理。 -- golden:**先判再动**——实测棋盘三图 changed 0.00%/0.00%/0.00%、菜单 0.15%,均远低于 2% 阈值 ⇒ 判有效, - 留在位不重制(禁「重制一下就绿了」掩盖真实视觉回归)。 - ---- - -## 三、代拍板追认单(超清单必呈报;本批共 12 项) - -> **追认结果(2026-10-17 用户令)**:以下十二项**全部同意,无修改意见**。第四节「经你裁决的四项」是施工中已问过、你已答的四条,不在本追认范围,维持原记录。 - -| # | 代拍板事项 | 处置与依据 | -|---|---|---| -| 1 | 三硬闸的具体实现写法 | `probe_gate` 抽 `verdict` 函数;错误扫描抽独立闸件 `tools/error_scan.py`(标记 import 自 `run_smoke.py`) | -| 2 | 断言数下限的阈值 | 每套件 ≥1(防误伤小套件);零断言用专用退出码 2 与「断言失败=1」区分 | -| 3 | `integration/` 内部目录分类 | 平铺,按系统命名(`save_rng_roundtrip_test.gd`)——首例而已,够用不加层 | -| 4 | 新集成套并入 `run_all` manifest 的执行细节 | 零新机制,与单元套件同一入口同一协议 | -| 5 | 新单测/新探针的文件命名与落点 | 沿用 `[system]_[feature]_test.gd` 与 `presentation/` 归位 | -| 6 | 4 个 core 模块单测的断言面取舍 | 各 4–12 条真值断言,期望值一律由盘上/注入内容数出来(零玩法数值字面量) | -| 7 | **断言本身写错且与现行设计冲突**时的修法(契约 1 唯一例外) | 见第四节「经你裁决的四项」,逐条列明 | -| 8 | 游离脚本「在役/失效」的判定 | 存疑按在役登记并标注;`CLAUDE.md` 在册入口禁当死件 | -| 9 | S5 规则的正反例构造 | 形态=标识符后紧跟 `.` 的成员访问,排除注释行与字符串字面量;core 实测零命中 | -| 10 | 提交切分与分支命名 | 八提交按 T0–T8 一卡一笔;分支 `iter29-testlayers-20261016` | -| 11 | **S3 零命中自检的实现形态** | 扫描路径收为单点变量 + 规则自己数扫描面文件数,为零即判红,且规则体包进自检成立分支 | -| 12 | **条件闸件的 diff 触面路径表** | 写进 `run_all_gates.sh` 内(不自造第二份清单),见上文 ② | - ---- - -## 四、经你裁决的四项(施工中冒出的分歧,未自答) - -1. **`fx_grant_gp` 补进行来源断言豁免表**(你裁「本批补豁免」):`grant_segment.gd:221` 发「专长·GP 入账」 - 效果行(source_class=`fx_grant_gp`、origin_cell=(-1,-1)),而 `SOURCE_EXEMPT_CLASSES` 只豁免了 `fx_reveal` - ⇒ 每局触发行来源断言失败 7 次,因脚本错误不改退出码被闸长期漏过。改动=一行常量加一个字符串, - 零玩法行为变更(迭代 21 同款修过 `fx_reveal`,本例是同一张表的漏网)。 -2. **manifest 增 `negative` 字段**(负面套件豁免错误扫描一闸):仅 `reward_dangling_treasure` 一件—— - 坏表是它的测试目标,输出里的 Parse Error 属误伤。退出码与断言下限照判,不是开后门。 -3. **`config_db_test` 的 10 条被吞断言**(你裁「本批全修」):`rows` 是 `Array[Dictionary]` 定型属性, - 直接赋 untyped 数组字面量触发 `Invalid assignment` ⇒ **中断整个函数**,敌人表「行集构成三条纪律」 - 的 10 条断言从未执行过(文件 31 处 check,实跑 21 条)。改 `rows.assign([...])` 后 26 条全跑, - 其中两条正向断言见红,根因是**夹具缺 depth-0 锚行**(`validate` 的 anchor 规则),补锚行后全绿。 -4. **`system_contracts_test` 的空桩换真实实例**(同上):`RngStub`/`UnitContainerStub` 赋给定型成员 - 报 `Trying to assign value of type ''`,`RngStub` 类删除,`UnitContainer`/`StatusContainer` 改真实实例。 - ---- - -## 五、闸与读数(全量重闸 `tools/run_all_gates.sh`,commit `c3b64030`) - -| 闸 | exit | 说明 | -|---|---|---| -| 01 冒烟全量 | 0 | **1127 项检查 0 项失败**(与开工日持平) | -| 02 单元套件 | 0 | **33 套**(26 单元 + 1 集成 + 6 新单测);编排层另扫 `unit.log` 零命中 | -| 03 探针 --click | 0 | 五件(含新增 screen_flow)全绿,残留 Godot=0 | -| 04 探针 --full | 0 | 四件全绿 | -| 05 渲染闸 | 0 | shot_checker 全过;棋盘 golden 三图 0.00%;菜单 0.15%(≤2%) | -| 06 gdd_lint / 07 doc_link / 08 doc_term | 0 | doc_term 首跑抓到我新写的退役词「对拍」1 处,已改正 | -| 08b active.md 体量 | 0 | — | -| 09 静态扫描 | 1 | **存量红零新增**:S10 文件头存量 127 处,指纹与基线 `4354b2aa72a7` 一致 | -| 10 熵增闸 | 0 | — | -| 11 回放确定性对拍 | NEED-APPROVAL | 本批 diff 触及结算面,对拍需你批准发起(见第六节) | - -**验收通过**(`all_green=true`,存量红零新增)。轻闸 `--quick` 墙钟 405s(开工日 363s + 新探针约 40s)。 - ---- - -## 六、待裁与遗留 - -0. **【合回状态:已合并进 master(`fff4f120`,十提交,2026-10-16)】** 本项原文为「暂不合回,等两个非本批红处理完」 - (2026-10-16 用户裁),两个红其后各自结案:①渲染闸 `menu_boot.png` changed=4.61%(菜单 golden 热区漂移) - ——基线已在合并代码上显式重采(`dac9a94b`),现行菜单与棋盘三张 golden 均 0.00%;②gdd_lint - `01-核心循环.md` R5 缺流程图——由引入批补流程图结案(提交 `fcb8c3f8`+`8c18b52b`),基线 06 已回绿。 - 本段为 2026-10-17 迁位批(`design/qa/` → `reports/`)改写,原待裁文字 git 历史可考。 - -1. **11 号闸的 parity 对拍要不要跑一次**(需你批准,我不能自行发起):触面判定是机械的路径匹配, - 本批对 `battle_orchestrator.gd` 的改动实际只是加一个断言豁免常量(零玩法行为变更、零数值改动)。 - - 若按「MC 无数值改动零跑」红线 ⇒ 不跑,闸维持 NEED-APPROVAL(回执里留名,不判失败); - - 若要验证一次 ⇒ 批准后 `PARITY_APPROVED=1 tools/run_all_gates.sh`(三变体约 10–15 分钟)。 -2. **GDD 反哺点三条**(2026-10-17 用户逐条裁决:三条全部写入): - - 「三硬闸」与「新写测试件全类型标注」→ **test-conventions.md §7**(code-conventions §3 已独立成文至此,故落此处); - - 「判定可靠性优先于覆盖率」→ **test-conventions.md §8**(本批核心命题成节); - - `screen_flow_probe` 转机检 → **07 v1.4**:㉖① 保留不注销,节首加机检承接注记。 - 本条补登记为 06 专条(原漏登)。 -3. **06 已登记本批未收的七项**(不阻塞不排期):余下 3 个 core 零指名模块、`render_gate` 的脚本错误扫描缺失、 - S7/S8(S6 亦仍在 TODO)、E 级卫生件、行覆盖率度量、`smoke_all` 拆分、parity 触面判定偏粗。 -4. **本批最有价值的副产品**(2026-10-17 用户裁决:写入):脚本错误会**静默中断所在函数的剩余断言**而 - 套件仍报「全绿」——本批至少三处实证(敌人表行集纪律 10 条零覆盖、`Callable` 形参类型写错让解析函数 - 返回 null)。已由三硬闸之二机制性拦住;机制事实与「写验收函数须自证断言全数执行」义务已写入 - **test-conventions.md §8**。 diff --git a/roadmap.md b/roadmap.md index 6504b50b..76be4d80 100644 --- a/roadmap.md +++ b/roadmap.md @@ -62,7 +62,7 @@ | 迭代 26 | 已完成(2026-10-14) | 已退役(git 历史可考) | 2026-10-14 | — | 已退役(git 历史可考) | | 迭代 27 | 已完成(2026-10-14) | 已退役(git 历史可考) | 2026-10-14 | — | 已退役(git 历史可考) | | 迭代 28 | 已完成(2026-10-15) | 已退役(git 历史可考) | 2026-10-15 | — | 已退役(git 历史可考) | -| 迭代 29 | 已完成(2026-10-16) | 已退役(git 历史可考) | 2026-10-16 | — | reports/iter29-实现报告-2026-10-16.md | +| 迭代 29 | 已完成(2026-10-16) | 已退役(git 历史可考) | 2026-10-16 | — | 已退役(git 历史可考) | | 迭代 30 | 已完成(2026-10-17) | 已退役(git 历史可考) | 2026-10-16 | — | reports/iter30-实现报告-2026-10-17.md | | 迭代 31 | 待开工 | reports/需求卡片-代码术语刷新批-2026-10-18.md、reports/需求卡片-凭证件裁削批-2026-10-18.md | 2026-10-18 | ≈1.5 周 | — | From 893aac795ffd391610b2a89142cb0fa1276328cd Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 20 Oct 2026 15:08:18 +0800 Subject: [PATCH 4/7] =?UTF-8?q?chore(=E6=89=B9=E5=90=8E=E6=94=B6=E5=B0=BE)?= =?UTF-8?q?:=20=E8=BF=AD=E4=BB=A3=2030=20=E4=BA=A7=E5=87=BA=E7=89=A9?= =?UTF-8?q?=E9=80=80=E5=BD=B9=E2=80=94=E2=80=94=E5=AE=9E=E7=8E=B0=E6=8A=A5?= =?UTF-8?q?=E5=91=8A/=E4=BB=A3=E6=8B=8D=E6=9D=BF=E8=BF=BD=E8=AE=A4?= =?UTF-8?q?=E5=8D=95/=E5=8F=8D=E5=93=BA=E7=82=B9=E6=B8=85=E5=8D=95?= =?UTF-8?q?=E4=B8=89=E4=BB=BD=E6=8C=89=E5=90=B8=E6=94=B6=E5=8D=B3=E6=AD=BB?= =?UTF-8?q?=E5=88=A0=E9=99=A4=EF=BC=88=E5=8F=8D=E5=93=BA=E7=82=B9=E4=B8=83?= =?UTF-8?q?=E6=9D=A1=E5=B7=B2=E4=BA=8E=202026-10-17=20=E5=85=A8=E9=83=A8?= =?UTF-8?q?=E5=9B=9E=E5=86=99=E5=B9=B6=E5=A4=8D=E6=A0=B8=E8=90=BD=E6=96=87?= =?UTF-8?q?=E3=80=817=20=E9=A1=B9=E4=BB=A3=E6=8B=8D=E6=9D=BF=E5=B7=B2?= =?UTF-8?q?=E8=BF=BD=E8=AE=A4=E3=80=8107=20=E3=89=98=20=E4=BA=94=E9=A1=B9?= =?UTF-8?q?=E5=AE=9E=E6=9C=BA=E7=9B=AE=E6=A3=80=E5=9C=A8=E5=86=8C=E3=80=81?= =?UTF-8?q?.uid=20=E5=8D=AB=E7=94=9F=E7=BC=BA=E5=8F=A3=E5=B7=B2=E9=9A=8F?= =?UTF-8?q?=E5=90=8E=E7=BB=AD=E6=89=B9=E9=97=AD=E5=90=88=EF=BC=89=EF=BC=9B?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=20=C2=A7=E5=85=AD-1=20=E9=98=94=E8=A7=86?= =?UTF-8?q?=E9=87=8E=E5=B8=A6=E8=A1=A8=E8=BF=B0=E5=86=B2=E7=AA=81=E8=BF=81?= =?UTF-8?q?=2006=20=E6=96=B0=E6=9D=A1=EF=BC=88=E7=A7=98=E5=AE=9D=E8=A1=A8?= =?UTF-8?q?=E4=B8=8E=20treasure=5Fitems.tres=20desc=20=E4=BB=8D=E5=86=99?= =?UTF-8?q?=E3=80=8C=E7=B1=BB=E5=9E=8B=E5=BE=AE=E5=85=89=208=E2=86=9212=20?= =?UTF-8?q?=E6=A0=BC=E3=80=8D=EF=BC=8C=E4=B8=8E=20HUD=E6=A1=86=E6=9E=B6?= =?UTF-8?q?=E3=80=8C=E5=BE=AE=E5=85=89=E4=B8=8D=E9=9A=8F=E8=A7=86=E9=87=8E?= =?UTF-8?q?=E6=89=A9=E3=80=8D=E5=86=B2=E7=AA=81=EF=BC=8C=E5=BE=85=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=96=87=E6=9C=AC=E8=AE=A2=E6=AD=A3=EF=BC=89=EF=BC=9B?= =?UTF-8?q?=E5=AD=98=E6=A1=A3=E5=88=B6=E5=8D=A1=E7=89=87=20F8=20=E7=9A=84?= =?UTF-8?q?=E5=9F=BA=E7=BA=BF=E8=AF=BB=E6=95=B0=E6=8C=87=E8=B7=AF=E6=94=B9?= =?UTF-8?q?=E5=86=85=E8=81=94=EF=BC=8Bcommit=207ffd1dc0=EF=BC=9Broadmap=20?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=2030=20=E8=A1=8C=E5=AE=9E=E7=8E=B0=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E5=88=97=E6=94=B9=E9=80=80=E5=BD=B9=E4=BF=9D=E7=95=99?= =?UTF-8?q?=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/gdd/06-待办清单.md | 8 ++ reports/iter30-代拍板追认单-2026-10-17.md | 19 ---- reports/iter30-反哺点-2026-10-17.md | 31 ------- reports/iter30-实现报告-2026-10-17.md | 92 ------------------- .../需求卡片-存档制数据层改造批-2026-10-18.md | 2 +- roadmap.md | 2 +- 6 files changed, 10 insertions(+), 144 deletions(-) delete mode 100644 reports/iter30-代拍板追认单-2026-10-17.md delete mode 100644 reports/iter30-反哺点-2026-10-17.md delete mode 100644 reports/iter30-实现报告-2026-10-17.md diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index de5f2bc8..532eae41 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -311,6 +311,14 @@ **状态**:待写卡 +#### 阔视野带效果表述与类型微光口径冲突(2026-10-20 登记,来源=批次移交,设计面=工程直入) + +**现状**:迭代 30 卡①实现报告登记的存量冲突(报告随批后收尾退役,git 历史可考):[秘宝](systems/跨局循环/秘宝.md) 普通档表「阔视野带」行一句话写作「类型微光范围 8 格→12 格」,`game/data/tables/treasure_items.tres` 该行 `desc` 同口径;但 [HUD框架](systems/表现与支撑/HUD框架.md) 迷雾节配套拍板已定「类型微光不随视野扩大(贴身 8 格、微光锚=可挖域)」,实现面微光作用集恒为 `_diggable` 子集,该件实际效果是 `light_radius_bonus` 扩灯光区(迷雾视野 8→12),不扩类型微光。两处表述属提灯功能承接时期的遗留措辞。 + +**归属**:秘宝.md 普通档表该行 + treasure_items.tres 该行 desc(数据文本订正批;只改文字、不改机制) + +**状态**:待写卡(备选) + #### 第二 / 三关棋盘观感——亮度与对比度(2026-10-13 登记,来源=playnote,设计面=双轨) **现状**:来源=playnote 用户试玩记录「UI 优化,第二第三关的棋盘看着太累了;不知道是因为亮度还是对比度的原因,看着非常费劲,非常不舒服」。2026-10-13 用户裁定:**这是需要做的**,且本就属版本标准的覆盖范围——[08-Alpha版本标准](08-Alpha版本标准.md)「五 · 表现」已新增「棋盘观感(第二 / 三关亮度与对比度)」行,标待做。**开工前须先定性(沿用既有裁决)**:是**素材轴**问题(棋盘瓦片与格面图标本身的明度与色相),还是 **UI 轴**问题(舞台底色与叠加层的对比关系)——两轴修法完全不同,定性错了等于白改一轮;该定性要求(原备忘 (e) 项)是本条的开工前置。2026-10-16 曾编入迭代 30 卡③(UI 呈现三卡批序位③),2026-10-17 用户裁定剔除回待设计(自身挂「素材轴/UI 轴」定性人闸+甲/乙〔recolor/远程生图重产〕素材裁点;若裁乙,其瓦片规格依赖战斗一屏样张批的目标规格清单产出)。v1.4 旧卡留 reports/需求卡片-二三关棋盘观感批-2026-10-16.md 作素材,非已写卡状态。与已完成注销的「呈现层残余 <4.5:1 文字位」分工:本条管**棋盘区域整体的观感**(亮度/对比度/费劲感,体感问题),彼条管**具体文字位的对比度读数**(机检可判硬指标),两条不同面不互相替代。 diff --git a/reports/iter30-代拍板追认单-2026-10-17.md b/reports/iter30-代拍板追认单-2026-10-17.md deleted file mode 100644 index f27a50e5..00000000 --- a/reports/iter30-代拍板追认单-2026-10-17.md +++ /dev/null @@ -1,19 +0,0 @@ -# 迭代 30 卡① 未开格类型徽章批 · 代拍板追认单 - -- 批次:迭代 30 卡①(分支 `iter30-glow-20261017`,worktree `g-plan2-iter30-glow`) -- 依据:卡片 §9 代拍板白名单(超清单必呈报);Q1–Q5 本体不在白名单(v1.2 已裁,见 §10 裁定行,本批未开放重裁) -- 完成日 2026-10-17。以下 7 项为批内代拍板决定,逐项留痕待追认或推翻 - -| # | 白名单项 | 批内决定 | 理由/备注 | -|---|---|---|---| -| 1 | 新常量与函数命名、文件落点 | 色板与归组落 `ui_kit.gd` 单点:组号常量 `GLOW_NONE/BUFF/HEAL/PIERCE/MAGIC/AOE`、五组色值 `TG_GLOW_BUFF/HEAL/PIERCE/MAGIC/AOE`、呈现参数 `TYPE_GLOW_ALPHA/BAND_FRAC/SOFT/CORNER`;函数 `glow_group_for_cell_type()`(九值封闭)+`glow_color_for_group()`(组号→色值,透明出口)。绘制面新建单点件 `cell_type_glow.gdshader`(canvas_item 距离场)+`cell_type_glow_layer.gd`(承载/注参),不塞进 `board_cell_unit.gd` | 守卫「新增色值一律入 ui_kit 单点、呈现层裸 Color8 = 0」可机检(静态段既有);shader 与承载件分离 = uniform 参数表可直读可断言。与既有 TG_* 卡顶带**两套并存、禁互为引用**(Q3 甲案) | -| 2 | 泛光实现细节取舍 | 走 Q1 丙案主路径 shader 距离场衰减(非 draw_rect 分段叠层/非 draw_polygon 渐变近似);a 案程序绘制兜底件**未实例化启用**(共存实测未撞墙,L3 预授权①未触发;兜底路径留档于卡片 T1,不落码) | shader 内缘带 SDF+圆角掩码+`mask_rect` 豁免区(预读徽章位)一步到位;带宽/α/软边/圆角全参数化,调参不改代码 | -| 3 | shader uniform 命名与参数表 | `glow_col / glow_alpha / band_frac / soft / corner / cell_px / mask_rect`(`cell_type_glow.gdshader:12-18`);参数值全部由 ui_kit 常量注入(`cell_type_glow_layer.gd` set_shader_parameter),shader 内默认值仅占位 | 命名与 art-bible §4.2 v2 呈现参数一一对应(α170/cell÷8);hint_range 限幅防误调出界 | -| 4 | 呼吸相位驱动写法 | **未启用呼吸**(Q5 甲案静态);shader 相位通道未预留 uniform,`_process` 呼吸仅接触带既有件在跑(3 rad/s≈0.48Hz,减动效 `motion_scale<1.0` 停格)。微光相位门控复用 `set_dig_glow_enabled`(与接触带同源) | Q5 甲案下 V8 空转;若出口后追裁呼吸再议,本批不预设通道 | -| 5 | 冒烟/探针断言取值与夹具板配置 | 冒烟夹具:seed 4242 L1 板+`install_board`+novice 驱动到未开邻格 ≥5(初始展开覆盖 8 邻→必驱动);八邻派八型(attack/heal/pierce/blast/magic/defense/action/gp)+哈希兜底九型全集;清单外负样本 `"keystone"`;封锁集返回 null;契约 1 双实例 = 同板同 12 步 novice 序列逐步对照 digest(hero/已开集/旗数/AP/相位)。探针 case⑰ 活板面 = 生产身份面(真实点击挖开)。board_shot 双帧 = 每关 18 步 novice+`motion_scale=0.5` 停格+生产身份接线 | 夹具确定性(全缸可复现);「同板同序列」隔离唯一定位在开关;双帧前置停格否则接触带相位漂移污染「非生效格零变化」 | -| 6 | 取样阈值 provisional 数值 | 带内判据 `band_px = cell×0.125`(L1 格边 46 → 5.75px);互辨判据线 CR ≥ 1.20(相邻组,合成空间模型域);golden 容差沿用 ≤16 差/≤2% 占比(render_gate 现值,未新立);砖心灰度扰动阈值以「带外零变化」等效承载(禁侵判据 = 变化像素全部落在内缘带内) | 首版取严:判据线 1.20 高于实测最弱对 1.232 的 97%;模型域与实测差(shader 距离场权重非扁平混合)由探针实测兜底,故阈值不收紧到模型值 | -| 7 | 提交切分与 worktree 分支命名 | 分支 `iter30-glow-20261017`/worktree `g-plan2-iter30-glow`;提交按「实施本体(色板/shader/承载件/board_view 生命周期)→ 断言三件(冒烟段/单测/探针段)→ 渲染取证(board_shot 双帧)→ reports/ 三份产出物」切分;自产 `.uid` 4 个随件提交(type_glow_test.gd.uid 为批末编辑器导入通行补齐) | 与 iter29 单批十提交的颗粒度对齐;合回前 `git merge master`(master 已到 bd6ab32e,本分支基于 d984d47c)再重闸 | - -**追认请求**:以上 7 项如无异议即视为追认;有异议项指出#号,按 L1(自救)或重裁处理。 - -**追认结果(2026-10-17 用户令「追认没有问题」)**:以上 7 项全部追认通过,无异议项。 diff --git a/reports/iter30-反哺点-2026-10-17.md b/reports/iter30-反哺点-2026-10-17.md deleted file mode 100644 index d2d4f7ba..00000000 --- a/reports/iter30-反哺点-2026-10-17.md +++ /dev/null @@ -1,31 +0,0 @@ -# 迭代 30 卡① 未开格类型徽章批 · 反哺点清单 - -- 批次:迭代 30 卡①(分支 `iter30-glow-20261017`);依据卡片 §5 同步面(v1.3 执行口径:实现批禁写 `design/`,逐条列清单、用户会话裁决后归文档批落文) -- 完成日 2026-10-17;清单条数 7 = 卡片 §5「反哺点 · 列清单待裁」行数(V9 对表;`active.md` 行属本批已更新例外、`game/presentation/views/*`+`game/smoke/*` 行属实施本体,均不计入) - -| # | 文件 · 节 | 改成什么 | 依据 | -|---|---|---|---| -| 1 | `design/gdd/06-待办清单.md` :429-435 | ①「未开格类型微光」条目状态:待办 → **完成**(批末重闸全绿后);②:431「候选值,样张批冻结」色相措辞修正为「色相 = art-bible §4.2 样张 v2 冻结值(既裁),本批只动明度」——06 :431 自身 2026-09-30 口径已声明「只承载实施状态、不承载定义」,措辞修正属批内机械面;③:435 旧读数(bonus_pick_overlay 位点)刷新为现行读数;④明度档 provisional 值登记去向 = 第 4 条 art-bible 修订条目,复核义务移交样张卡 | Q2 甲案裁定;art-bible :66/:551 冻结依据;§5 行 1 | -| 2 | `design/gdd/systems/表现与支撑/HUD框架.md` :140 / :269 | ①:140 实装状态行「游戏内待实施批」→「**已实装(迭代 30 卡① 2026-10-17)**」;②:269 验收行去「待实施批落地后验收」括注、转正式验收行;③文首状态行换代(同批体例) | Q4 丙案默认开已入库;§5 行 2 | -| 3 | `design/gdd/08-Alpha版本标准.md` 「五 · 表现」表 | 新增「未开格类型微光」行:待做 → **在役**;行内注「明度档 provisional 值(Q2 甲案),战斗一屏样张批复核转正」;文首状态行换代 | Q2 甲案;Alpha 判据(阻塞主流程/无法联调才算 alpha 阻塞——呈现增强不属);§5 行 3 | -| 4 | `design/art/art-bible.md` §4.2 修订条目(Q2 项) | 以修订条目登记五组明度档 provisional 值:芥末黄 #F7DF43/黄绿 #68D042/青 #30A6A6/紫罗兰 #7B5BD6/绯红 **#A61D37**(冻结 #FF2D55 的 V=0.65 档,色相零移动);注明生成口径 = 渲染合成空间(伽马)阶梯、相邻组模型 CR 1.245/1.234/1.239/1.270、复核归样张批。§4.2/§4.6.3 权威面零改动;§2.1 修订条目不追加(Q5 甲案静态、条件分支不触发) | Q2 甲案;2026-10-17 停机呈报用户裁「换更暗档 #A61D37」留痕(实现报告 §二-1);§5 行 4 | -| 5 | `roadmap.md` 迭代 30 行 | 编入笔已在案(2026-10-16 用户令);批内状态更新 = 卡① 完成(卡②样张批、卡③观感批串行待启),批末重闸 `--code` 全绿读数 | 三卡串行序位;§5 行 5 | -| 6 | `design/gdd/06-待办清单.md`(Q3 甲案追加) | ①「卡顶带与格面带分工」说明写入文档注记面(art-bible §4.2 或 HUD框架 微光节):两带并存、TG_* 卡顶带管货架卡面、TG_GLOW_* 管未开格微光,禁互为引用;②另登 06 一条新待办「卡顶色带与格面微光两带统一」(TG_* 迁移 = 原 T3 条件卡内容,Q3 甲案不并入本批) | Q3 甲案(不并入);§5 行 6 | -| 7 | `design/gdd/07-体验验证清单.md` | 新增实机目检人闸条:五组互辨观感(一眼可分)/不遮数字/出圈灭/整屏不脏+群伤暗档(#A61D37)实机辨识;人闸不可代、登记不阻塞。目检项全文已进 `reports/iter30-实现报告-2026-10-17.md` §五 总清单 | V10;§5 行 7 | - -## 回写结果(2026-10-17 用户令「反哺点可以都进行回写」) - -七条全部回写完成(文档批 `iter30-fb-20261017`,2026-10-17): - -- 第 1 条(06 待办清单)→ **已回写**:条目状态待办→已完成(入库 7ffd1dc0、冒烟 1151/0、单测 34 套、探针 case⑰、07 ㉘ 人闸五项);色相措辞修正为「样张 v2 冻结既裁值」;2026-10-05 实查读数刷新(bonus_pick_overlay.gd 已改名 curio_pick_overlay.gd:97、TG_* 五族在役 ui_kit.gd:49-53、裸 Color8 读数作废);明度档 provisional 值登记去向按第 4 条落 art-bible v3.15 文首登记 -- 第 2 条(HUD框架)→ **已回写**:实装状态行转「已实装(迭代 30 卡① 2026-10-17 入库,合并 `7ffd1dc0`)」;验收行转正式验收(去「待实施批落地后验收」括注);文首状态行换代 v0.19 -- 第 3 条(08)→ **已回写**:「五 · 表现」表新增「未开格类型微光(五组色相+明度档)」行(在役;明度档 provisional 值,样张批复核转正);文头状态行换代 v1.9 -- 第 4 条(art-bible)→ **已回写**:五组明度档 provisional 值+生成口径(渲染合成空间伽马阶梯、相邻组模型 CR 1.245/1.234/1.239/1.270、判据线 1.20、实测最弱对 1.232、群伤暗档停机呈报留痕)落 v3.15 文首登记;§4.2/§4.6.3 权威面零改动、§2.1 未追加(Q5 甲案静态);头注「现行为」漏更顺带订正 v3.11→v3.15 -- 第 5 条(roadmap)→ **已回写**:迭代进度行与迭代 30 表行状态列同步卡①已入库(2026-10-17,7ffd1dc0;②③待 `/iter` 发令) -- 第 6 条(06 Q3 甲案追加)→ **已回写**:两带分工注记落 HUD框架 微光节口径史注记后(卡顶带=条目级静态色带/格面微光=棋盘格内动态微光,禁互为引用);06 新增「卡顶色带与格面微光两带统一」待办条 -- 第 7 条(07)→ **已回写**:新增 ㉘ 节五项人闸(五组一眼可分/不遮数字〔环不外溢〕/出圈灭入圈复亮/整屏不脏/群伤暗档 #A61D37 观感〔provisional,读数归样张批〕),文首状态行换代 v1.5 - -## 附:不占反哺点条数的遗留(归实现报告 §六) - -- 阔视野带 desc「类型微光范围 8 格→12 格」与卡 §4「微光不随视野扩」冲突(`treasure_items.tres:47` 存量文本)——属数据文本批处置,非 design/ 文档同步面。 -- `type_glow_test.gd.uid` 已由批末编辑器导入通行补齐并随批提交(该件平时只经 `--script` 跑);库内另有 9 个存量未跟踪 `.uid` 属卫生缺口,留卫生批/文档批处置。 diff --git a/reports/iter30-实现报告-2026-10-17.md b/reports/iter30-实现报告-2026-10-17.md deleted file mode 100644 index 1616e360..00000000 --- a/reports/iter30-实现报告-2026-10-17.md +++ /dev/null @@ -1,92 +0,0 @@ -# 迭代 30 卡① 未开格类型徽章批 · 实现报告 - -- 批次:迭代 30 卡①「未开格类型徽章批」(卡片已退役——git 历史可考,原「未开格类型徽章批」**v1.4**) -- 分支 `iter30-glow-20261017`/worktree `g-plan2-iter30-glow`;闸口径 = 本批只碰 `game/` → `tools/run_all_gates.sh --code` -- 完成日 2026-10-17;三卡串行序位第 1(卡②战斗一屏样张批、卡③二三关棋盘观感批不在本会话范围) -- 裁决基线:Q1 丙(shader 为主、程序绘制兜底)/Q2 甲(明度档 provisional 值本批定、样张批复核转正)/Q3 甲(TG_* 两带统一**不并入**)/Q4 丙(默认开)/Q5 甲(静态无呼吸);v1.4 开工前预授权 U1 四项(T0-③ 判据自判+调参上限 2 轮、卡③ Q2 判据自动裁、卡③目标带批内自定、L3 分类预授权) - -## 一、各任务卡状态 - -| 卡 | 状态 | 要点 | -|---|---|---| -| T0-① 归组表 | ✅ | 九 cell_type → 五组封闭表落 `ui_kit.gd:106 glow_group_for_cell_type`(attack/defense/weaken/action/gp→增益/heal→治疗/pierce→穿刺/blast→群伤/magic→魔法;清单外 → GLOW_NONE+显式登记,禁静默空光)。大宝箱(未来第十型)按 reward_economy :106 归通用增益组的路径在注释与单测负样本留位 | -| T0-② 明度档 provisional 值 | ✅ | 五档按**渲染合成空间**(伽马)单调阶梯定值(生成口径订正见 §二-3);相邻组模型 CR = 1.245/1.234/1.239/1.270(判据线 1.20),实测最弱对 1.232 | -| T0-③ 路线原型帧 | ✅ | 判据自判(U1-①):三条像素判据全过——①五组并列去色相模拟仍可分(V6 同口径抽检)②砖心数字字形占位区灰度扰动 ≤阈值(V4)③接触带不越圈、非生效格零变化(V4)。调参 2 轮内收敛(未触上限)。shader 与 `_desat_mat` 共存实测**未撞墙**(L3 预授权①未触发),丙案主路径全程有效、a 案兜底未启用 | -| T0-④ 基线与行号复核 | ✅ | golden 基线 2026-09-30 代三图判读有效(本批 off 帧漂移 0.10–0.13%,见 §三);未重制任何基线 | -| T1 实装 | ✅ | 色值单点 `ui_kit.gd:87-95 TG_GLOW_*`;shader 面 `cell_type_glow.gdshader`+承载件 `cell_type_glow_layer.gd`(CanvasItem 距离场,uniform 参数化);作用集与生命周期 `board_view.gd:329 _recompute_glow`(= `_diggable` ∩ 身份可查 ∩ 灯光区 − r0)、`:355 set_type_glow_enabled`(Q4 丙开关,生产写入面=组合根单点)、`:859 set_dig_glow_enabled` 相位门控与接触带同源;`type_glow_probe():1209`/`cell_rect_probe():1217` 取证面 | -| T2-① 冒烟断言段 | ✅ | `smoke_all.gd:1756 _smoke_type_glow` 八相 24 项新断言(作用集恒等/九型映射/清单外登记/封锁格/解封复位/开关两态/换图重算/契约 1 双实例) | -| T2-② 单测 | ✅ | `tests/unit/presentation/type_glow_test.gd` 五段 51 检查;登记 `run_all.gd:80`(33→34 套件) | -| T2-③ 探针走查段 | ✅ | `ui_input_probe.gd:495` case⑰(活板面:作用集恒等/真实挖开灭/移动复亮出圈灭/相位门控/两态零扰动);十八断言全绿 | -| T2-④ 渲染闸双帧 | ✅ | `board_shot_probe.gd` on/off 双帧+`_check_dual_frames:156`;三关 glow=2/4/4、outside=0、生效格实绘非空;off 帧 golden 0.13/0.11/0.10%(≤2%)。修通记录见 §二-2 | -| T4 产出物 | ✅ | 本报告+代拍板追认单+反哺点清单三份落 `reports/` | - -冒烟合计 **1151 项全绿**(基线 1127+本批新增 24);单测 **51/51**(34 套件全绿)。 - -## 二、停机呈报与裁定留痕 - -### 1. 群伤组微光色值触碰冻结色相(§8 L3——唯一一次停机呈报) - -- **事实**:群伤组(blast) provisional 初版取 #FF1A31,与 art-bible §4.2 冻结绯红 #FF2D55 的 HSV 对照 ΔH = 5.40°、ΔS = +0.075(V 不变)——色相朝纯红移动,侵蚀「冻结绯红刻意错开危险红」的间距,属翻动 §4.2 五组色相既裁冻结面(Q2 复核结论明令 L3 停机呈报,U1 预授权不含此项)。 -- **呈报**:四选项交用户裁(A 维持 #FF1A31=翻色相/B 退回纯 V 缩放更深档/C 换更暗档 #A61D37/D 停机回 Q2 复议)。 -- **裁定(2026-10-17 用户)**:**「换更暗档 #A61D37」**——冻结 #FF2D55 的 V=0.65 明度档,色相零移动(H=348.57°/S=0.824 逐位不动)。 -- **落地与复验**:`ui_kit.gd:91` 改值+头注稽核史登记(:72-86);复跑判据源探针与单测全绿。现五组 ΔH:BUFF 0.08°/HEAL 0.13°/PIERCE 0.00°/MAGIC 0.00°/AOE 0.042°——全部满足「只动明度、不动色相」。 - -### 2. board_shot_probe 双帧取证「glow=0」缺陷(批内自救,非停机项) - -两次实跑三关 glow=0:第一次根因 = 裸视图 `_dig_glow=false`(加 `set_dig_glow_enabled(true)` 修复);第二次根因 = **裸视图从未接身份解析回调**(生产由 main.gd:251 接线,`_recompute_glow` 拿不到身份 ⇒ 作用集恒空、双帧比对空转、PASS 假绿)。修复 = `board_shot_probe.gd:83` 接生产同源 `_probe_identity_lookup:146`(板在守卫+Active 相位守卫+`query_reward_identity` 只读代理,相位前提:每轮 settle_batch 末尾 `_exit_distribution` 已 `notify_round_start`)。附带排一个 Godot 坑:`Callable.bind()` 动态派发对类型化参数做 Object 硬校验(「Cannot convert argument 2 from Object to Vector2i」)→ 改成员现值+直接方法引用(代码注释留痕)。 - -### 3. 明度阶梯生成口径订正(T0-② 内自救) - -首版按 CIE L*(线性域)排档,把群伤/魔法排反(绯红线性亮于紫罗兰,但伽马空间绯红 G+B 通道低、合成后更暗——实测最弱对 CR 仅 1.05)。订正 = 阶梯改在**渲染合成空间**排(引擎 canvas 混合在帧缓冲 sRGB 空间做线性插值,色弱玩家看到的是合成值);合成模型「带内均值 ≈ 0.49×色值 + 0.51×瓦片(BRICK #C9AF83)」,模型域与实测差 = shader 距离场权重非扁平混合 ⇒ 互辨判据终审在渲染取证探针实测(`ui_kit.gd:78-86` 头注留痕)。 - -## 三、闸读数表 - -| 闸 | 读数 | 判定 | -|---|---|---| -| 冒烟(run_smoke.py) | 1151 项/0 失败(新增 24 项:八相全绿) | 绿 | -| 单测(run_all.gd) | 34 套件全绿;type_glow_test 51/51 | 绿 | -| ui_input_probe | 十八断言全绿(⑰ 新增;活板面 glow=2、相位门控两态零扰动) | 绿 | -| type_glow_shot_probe(判据源探针) | glow_cells=5、groups=[1–5]、changed_total=4760、changed_outside=0;相邻组实测 CR 最弱对 1.232(组2/组3)、组4/组5=1.423 | 绿 | -| board_shot_probe 双帧(on/off) | L1 glow=2 changed=1912 outside=0;L2 glow=4 changed=3816 outside=0;L3 glow=4 changed=3792 outside=0(band_px=5.75 = 格边 46×0.125) | 绿 | -| golden 逐像素(off 帧 vs 2026-09-30 基线) | L1 0.13%/L2 0.11%/L3 0.10%(≤16 差/≤2%) | 绿 | -| 菜单 golden | menu_boot 0.14% | 绿 | -| 静态扫描(09) | 相对基线「改善」(批内两处新增红已修:R1A 无类型容器、文件头 9 行;基线存量红 fp=4354b2aa72a7 不属本批) | 绿 | -| render_gate.sh 整闸 | 全绿(shot_probe 七屏 A-D/fx 取证/双帧/golden 四图/残留 0) | 绿 | - -> 双帧 glow 格数(2/4/4)低于判据源探针(5)是**真实面与夹具面的差异**:探针接 settlement 真实 `query_reward_identity`,作用集随当板摇号与 18 步 novice 揭示态而定;五组齐现的互辨取证在判据源探针(夹具面)承载,两面分工不混。 - -## 四、变异验证记录表(新建断言段的注入实验) - -| # | 变异点(file:行) | 注入内容 | 跑的闸 | 红输出(实录) | 还原结论 | -|---|---|---|---|---|---| -| M1 | `ui_kit.gd:111` | `"heal"` 错映 GLOW_BUFF | 单测 type_glow_test | `[FAIL] 九型封闭:heal → 组1(期望组2)`(1/51 失败) | ✅ 还原后复跑 51/51 | -| M1' | 同上(保留叠加) | 同上 | 冒烟 run_smoke.py | `[FAIL] V2 九型→五组逐格映射 … 违例:(2, 1):heal→组1(期望组2)` | ✅ 同轮还原 | -| M2 | `board_view.gd:344-349` | 清单外 cell_type 静默跳过(去 `_glow_errors` 登记) | 冒烟(与 M1 同轮,断言足迹不相交) | `[FAIL] V2 清单外 cell_type 显式登记(errors=[])`+`[FAIL] V1 封锁格零登记(errors 仍仅清单外一条——[])` | ✅ 还原后复跑全绿 | -| M3 | `board_view.gd:874` | 相位切换不重算作用集(注掉 `_sync_glow_to_units` 内 `_recompute_glow`) | 冒烟 | `[FAIL] V1 作用集恒等:微光格集合 == _diggable ∩ 身份可查(期望 5,实测 0)` | ✅ 还原后复跑全绿 | -| M3' | 同上 | 同上 | ui_input_probe | `FAIL — case⑰ 结算相位未灭(作用集 1 格——相位门控破)` | ✅ 同轮还原 | -| M5 | `board_view.gd:332-337` | 微光派生路径误触玩法 API(`_recompute_glow` 内 `settle_batch(flag_place)`——契约 1「纯派生零玩法写入」破坏面) | 冒烟 | `[FAIL] 契约 1 同板同序列 on/off 两态结算逐位一致 … 第 0 步(move)后摘要分叉`+`[FAIL] 契约 1 对照前提:同序列 ≥5 步(实测 0)` | ✅ 还原后复跑全绿 | -| M4 | `ui_kit.gd:92` | `TYPE_GLOW_ALPHA := 0.0`(不绘) | render_gate.sh | 三关全红:`微光开帧整板零变化(微光未生效)`+每生效格 `零实绘像素(微光空转)`;闸 exit 1 | ✅ 还原后整闸复跑全绿 | - -五组变异覆盖五类断言面:归组封闭(M1)/禁静默空光(M2)/生命周期接线(M3)/契约 1 零玩法写入(M5)/像素实绘(M4)。变异残留零检出(`grep M[1-5] 变异` 全库为空)后才进的批末重闸。 - -## 五、实机目检总清单(V10 人闸——登记不阻塞) - -> 人闸不可代。以下项待用户实机过目;T0-③ 原型帧三道判据为目检第一道(已自判过,见 §一),批末本清单为第二道。 - -| # | 目检项 | 判据 | 状态 | -|---|---|---|---| -| 1 | 五组一眼可分 | 色相+明度双码下去色相仍可分组(机检预判已过:最弱对 CR 1.232;误读率终判归样张批 §4.6.3 :325 既裁) | 待用户目检 | -| 2 | 不遮数字 | 微光不入砖心数字字形占位区(机检已过:带外零侵入、砖心留白;V4) | 待用户目检 | -| 3 | 出圈灭 | 英雄移出可挖域/相位切结算即灭(机检已过:case⑰) | 待用户目检 | -| 4 | 整屏不脏 | 默认开态下棋盘观感无杂乱感(「很丑」质疑的终审位) | 待用户目检 | -| 5 | 群伤组暗档观感 | #A61D37 实机辨识度(停机呈报裁定的暗档,样张批复核转正前的 provisional 态) | 待用户目检 | - -「入册 07-体验验证清单」列反哺点(见反哺点清单第 7 条)。 - -## 六、遗留读数义务 - -1. **阔视野带 desc 与微光口径冲突(存量观察,不占反哺点条数)**:`game/data/tables/treasure_items.tres:47` 阔视野带(wide_scout_band)desc 写「类型微光范围 8 格→12 格」,与卡 §4「不扩微光环半径——贴身 8 格是已拍板口径(HUD框架 :167),阔视野带类道具一律不扩微光」冲突;且实现面微光作用集恒为 `_diggable`(英雄 8 邻)子集,`light_radius_bonus` 只放大灯光区(`FOG_RADIUS + _fog_lantern` 门控),不可能把微光扩到 12 格。desc 属数据文本滞后(早于本批写成),建议归秘宝/数据文本批订正——本批不改数据表(只碰代码与断言面),仅登记。 -2. **`.uid` 伴生状态**:本批自产 4 个 `.uid`(cell_type_glow.gdshader/cell_type_glow_layer.gd/type_glow_shot_probe.gd/type_glow_test.gd)均随件提交(type_glow_test.gd 的 `.uid` 为批末编辑器导入通行补齐——该件平时只经 `--script` 跑、编辑器不导入,故开发期未生成)。库内另有 9 个**存量**未跟踪 `.uid`(layout_probe/screen_flow_probe/save_rng_roundtrip/board_generator/config_db_cross_validator/config_db_resolver/minesweeper_rules/battle_narrator/hud_presenter 各测试件)属卫生缺口,不随本批提交,留卫生批/文档批处置。 -3. **golden 基线未重制**:本批 off 帧对 2026-09-30 代三基线漂移 0.10–0.13%(接触带静态化预期面,契约 6 未触发),基线原样在库。 -4. **群伤暗档 provisional 属性**:#A61D37 为 Q2 甲案 provisional 值,复核转正归战斗一屏样张批(卡②);样张冻结值若与本值不一致,走 `ui_kit` 色值单点改值+冒烟/单测色值断言同步(机械面,不构成路线翻案)。 -5. **V6 误读率指标**:本批只跑机检抽检预判(去色相五组可分),误读率定量终判归样张批(§4.6.3 :325 既裁),本报告不代拍。 diff --git a/reports/需求卡片-存档制数据层改造批-2026-10-18.md b/reports/需求卡片-存档制数据层改造批-2026-10-18.md index c81ed365..1208c4a0 100644 --- a/reports/需求卡片-存档制数据层改造批-2026-10-18.md +++ b/reports/需求卡片-存档制数据层改造批-2026-10-18.md @@ -42,7 +42,7 @@ | F5 | SaveManager 为 autoload(工程序 ConfigDB→RngService→SaveManager→MetaProgression);MetaProgression 持有 `var save: SaveManagerCore`,`_ready` 取 `/root/SaveManager` 一次——消费面对存档的引用是单实例单引用;全部访问器为 `save.xxx()` 动态分发、无缓存 | `game/project.godot:21`;`game/core/meta_progression.gd:9`/:21-25/:54 | | F6 | 探针/冒烟隔离机制在役且面比初查大:`_META_SMOKE_PATHS` 注入清单 **18 条**(smoke_all.gd:5701-5708);另有 `user://smoke_save_*` 15 条(:6499-6511)、boot/lifecycle/lifecycle_resume/run_lifecycle 段(:277/:321/:463/:594)、`test_pacing_queue_save`(pacing_queue_test.gd:28)、`smoke_tune_probe_*`(ui_tune_probe.gd:167/:171)、probe tag 族(probe_ui_util.gd:98-121,10 探针 15 处调用);`attach_path` 直接消费 8 处+isolate_save 间接 15 处 | `game/smoke/smoke_all.gd:5701-5708`/:6499-6511 等;`game/smoke/probe_ui_util.gd:98-121` | | F7 | 文档侧早已预写多档去向:存档序列化.md P2 后置表载「多存档槽位|单档 MVP(2026-09-21 裁决);多档等有真实需求再立项」——本批即该条预写的「真实需求」落地;同文 :61 现行口径=「存档是单文件 JSON(user://save.json)」;:20 系统范围负责表载「单档 JSON 存档的域划分与读写约定」 | `design/gdd/systems/表现与支撑/存档序列化.md:165`/:61/:20/:16 | -| F8 | 近期闸基线:冒烟 1151/0、单测 51/51(34 套件),载于 iter30 实现报告——开工日 T0 重测取当期值 | `reports/iter30-实现报告-2026-10-17.md:23`/:46-47 | +| F8 | 近期闸基线:冒烟 1151/0、单测 51/51(34 套件),载于迭代 30 卡① 合并提交 `7ffd1dc0` 的回执读数(实现报告已退役,git 历史可考)——开工日 T0 重测取当期值 | git 提交 `7ffd1dc0`(迭代 30 卡① 合并) | ## 3. 设计契约(红线,违反 = L3 停机呈报) diff --git a/roadmap.md b/roadmap.md index 76be4d80..65080a92 100644 --- a/roadmap.md +++ b/roadmap.md @@ -63,7 +63,7 @@ | 迭代 27 | 已完成(2026-10-14) | 已退役(git 历史可考) | 2026-10-14 | — | 已退役(git 历史可考) | | 迭代 28 | 已完成(2026-10-15) | 已退役(git 历史可考) | 2026-10-15 | — | 已退役(git 历史可考) | | 迭代 29 | 已完成(2026-10-16) | 已退役(git 历史可考) | 2026-10-16 | — | 已退役(git 历史可考) | -| 迭代 30 | 已完成(2026-10-17) | 已退役(git 历史可考) | 2026-10-16 | — | reports/iter30-实现报告-2026-10-17.md | +| 迭代 30 | 已完成(2026-10-17) | 已退役(git 历史可考) | 2026-10-16 | — | 已退役(git 历史可考) | | 迭代 31 | 待开工 | reports/需求卡片-代码术语刷新批-2026-10-18.md、reports/需求卡片-凭证件裁削批-2026-10-18.md | 2026-10-18 | ≈1.5 周 | — | - 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。 From ca86d18811ac2779f7ed5fdeb0da4b68ac3eda8f Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 20 Oct 2026 15:08:38 +0800 Subject: [PATCH 5/7] =?UTF-8?q?fix(06):=20=E9=98=94=E8=A7=86=E9=87=8E?= =?UTF-8?q?=E5=B8=A6=E6=96=B0=E6=9D=A1=E5=8E=BB=E6=8E=89=E9=80=80=E5=BD=B9?= =?UTF-8?q?=E8=AF=8D=E3=80=8C=E9=9A=8F=E6=89=B9=E3=80=8D=E2=80=94=E2=80=94?= =?UTF-8?q?=E6=94=B9=E3=80=8C=E5=9C=A8=E8=BF=99=E6=AC=A1=E6=94=B6=E5=B0=BE?= =?UTF-8?q?=E4=B8=AD=E9=80=80=E5=BD=B9=E3=80=8D=EF=BC=8808=20doc=5Fterm=20?= =?UTF-8?q?=E6=96=B0=E7=BA=A2=E4=BF=AE=E6=AD=A3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/gdd/06-待办清单.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index 532eae41..68e500dc 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -313,7 +313,7 @@ #### 阔视野带效果表述与类型微光口径冲突(2026-10-20 登记,来源=批次移交,设计面=工程直入) -**现状**:迭代 30 卡①实现报告登记的存量冲突(报告随批后收尾退役,git 历史可考):[秘宝](systems/跨局循环/秘宝.md) 普通档表「阔视野带」行一句话写作「类型微光范围 8 格→12 格」,`game/data/tables/treasure_items.tres` 该行 `desc` 同口径;但 [HUD框架](systems/表现与支撑/HUD框架.md) 迷雾节配套拍板已定「类型微光不随视野扩大(贴身 8 格、微光锚=可挖域)」,实现面微光作用集恒为 `_diggable` 子集,该件实际效果是 `light_radius_bonus` 扩灯光区(迷雾视野 8→12),不扩类型微光。两处表述属提灯功能承接时期的遗留措辞。 +**现状**:迭代 30 卡①实现报告登记的存量冲突(报告已在这次收尾中退役,git 历史可考):[秘宝](systems/跨局循环/秘宝.md) 普通档表「阔视野带」行一句话写作「类型微光范围 8 格→12 格」,`game/data/tables/treasure_items.tres` 该行 `desc` 同口径;但 [HUD框架](systems/表现与支撑/HUD框架.md) 迷雾节配套拍板已定「类型微光不随视野扩大(贴身 8 格、微光锚=可挖域)」,实现面微光作用集恒为 `_diggable` 子集,该件实际效果是 `light_radius_bonus` 扩灯光区(迷雾视野 8→12),不扩类型微光。两处表述属提灯功能承接时期的遗留措辞。 **归属**:秘宝.md 普通档表该行 + treasure_items.tres 该行 desc(数据文本订正批;只改文字、不改机制) From 76825590c28b0ab3ff33b92a5de92ab98860240c Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 20 Oct 2026 15:27:25 +0800 Subject: [PATCH 6/7] =?UTF-8?q?docs(iter31=20=E5=8F=8D=E5=93=BA=E7=82=B9?= =?UTF-8?q?=E8=90=BD=E6=96=87):=20=E6=9C=AF=E8=AF=AD=E8=A1=A8=E8=A1=A5=20s?= =?UTF-8?q?eal=5F*=20=E5=A5=91=E7=BA=A6=E9=94=AE=E4=B8=8E=E6=95=88?= =?UTF-8?q?=E6=9E=9C=E8=AF=8D=E6=9D=A1=EF=BC=9B=E5=A5=87=E7=89=A9=E5=AE=8C?= =?UTF-8?q?=E7=BE=8E=E4=BF=9D=E9=99=A9=E8=90=BD=E8=A1=A8=E6=8C=87=E5=90=91?= =?UTF-8?q?=E4=B8=8E=E8=B1=81=E5=85=8D=E8=B4=A6=EF=BC=9B07=20=E3=89=99=20?= =?UTF-8?q?=E4=B8=83=E9=A1=B9=E7=9B=AE=E6=A3=80=EF=BC=9B=E7=BE=8E=E6=9C=AF?= =?UTF-8?q?=E4=BB=B6=E5=90=8D=20seal=5Fmark=20=E4=B8=8E=E8=A7=84=E7=BA=A6?= =?UTF-8?q?=E5=AE=88=E5=8D=AB=E4=BE=8B=E5=A4=96=E6=9D=A1=E6=AC=BE=EF=BC=9B?= =?UTF-8?q?06=20=E6=96=B0=E5=A2=9E=E7=8E=A9=E5=AE=B6=E9=9D=A2=E6=AE=8B?= =?UTF-8?q?=E7=95=99=E7=A6=81=E5=AD=97=E5=80=99=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 术语表:封印行补代码契约键 seal_*(原 flag_* 全族换代)与单字字形「封」;新增 seal_missed/forgive_seal_miss 词条;退役词表加 flag_*→seal_*;用语规范 B 类补第 4 条「被检查的禁字不算使用」与复扫口径 - 奇物.md:v3.18 件表注③「归独立批」指向改指迭代 31 卡②合回 commit 3e076e22;§1.3 补完美资格豁免走订阅式自有累加账 - 07:新增 ㉙ 节七个目检项(GP 显示、封印字样、结算来源名、seal_mark.png 加载、完美保险文案、稀有档三选一、豁免后第二份额) - interaction-patterns:perfect_broken 判据句读作「首次标错受检」(B=乙,代码零动) - art-bible v3.16/asset-path-map:封印印记件名 flag_seal.png → seal_mark.png,补 32×32 规格 - 06:新增「玩家面残留禁字清扫」候选条目(来源=批次移交,设计面=工程直入) --- design/art/art-bible.md | 4 ++-- design/art/asset-path-map.md | 2 +- design/gdd/06-待办清单.md | 10 ++++++++++ design/gdd/07-体验验证清单.md | 16 ++++++++++++++++ design/gdd/systems/冒险循环/奇物.md | 3 ++- design/gdd/ux/interaction-patterns.md | 2 +- design/gdd/术语表.md | 13 +++++++++++-- 7 files changed, 43 insertions(+), 7 deletions(-) diff --git a/design/art/art-bible.md b/design/art/art-bible.md index c402355c..8c20509c 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -1,6 +1,6 @@ # 美术圣经(Art Bible)— Dungeon Sweeper -> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**(§6 环境/§7 UI/§8 资产规范/§9 参考与反参考已于 2026-09-23 v1.8 按 D1/D2/D4/D5 框架成文;D3=§5 角色已于 v1.6 落地、v1.7 抽离独立文档;框架 2026-09-22 用户拍板,原登记于中间产物修订指导,经裁决不入库,明细归状态记录 125);现行为 v3.15,历次修订明细见 git 提交史 +> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**(§6 环境/§7 UI/§8 资产规范/§9 参考与反参考已于 2026-09-23 v1.8 按 D1/D2/D4/D5 框架成文;D3=§5 角色已于 v1.6 落地、v1.7 抽离独立文档;框架 2026-09-22 用户拍板,原登记于中间产物修订指导,经裁决不入库,明细归状态记录 125);现行为 v3.16,历次修订明细见 git 提交史 > > **Art Director Sign-Off (AD-ART-BIBLE)**:历次批均 SKIPPED(v1.8 §6–9 补全亦 SKIPPED)— Lean/Solo mode(非 PHASE-GATE;§6–9 已成文,full 门禁签核时机待用户表态) > 风格基调(2026-09-10 用户定稿):地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身 @@ -164,7 +164,7 @@ - **装饰变体(未开格氛围层)**:覆尘完整砖之上叠加裂纹/碎石斑/物件级点缀等装饰;2026-09-29 v3.0 物件级解禁——物件级装饰(小石块/陶片/骨殖等)须走**专属装饰形状家族**(与信息元素形状语言隔离、灰度下不与任何逻辑元素同形),数量配额按图类型定(候选 3–5 种,样张 v3 冻结),一律残缺、内凹、低对比而自然后退(§3.4);零信息纪律(分布随机、与雷/安/类型零相关、灰度下禁止制造新分类特征、分布每板一次跨轮不复掷)以原则三为准,此处不赘。←原三 - **结果整格表达(已开格)**:已开格按当格结果整格表达(结果清单见原则三);画法——产资源格的家族物件纹样用 §3.1 道具点剪影语言(直线几何体)角嵌于砖缘,砖心与数字字形占位区留白(已开格仍承载数字);危险格巢穴纹较已开格更凶一档,形状+颜色双通道不变。←原三;P3 - **未开格预读通道(微光单通道)**:类型预读 = 类型微光单通道(色相+明度双码,色带 §4.2);色弱类型主通道 = 微光明度梯度(组粒度——组间互辨;§2 微光明度例外);格内零角嵌/箭头/加号类附加形(2026-09-28 用户裁「微光格只留微光」,退役史见 git 提交史)。←原一;原三 -- **旗(封印印记)**:插旗动作的叙事呈现 = **封印**(玩家可见专名,术语定义见 [术语表](../gdd/术语表.md)「封印」条;插旗动作面见《排雷玩法》)——旗 = 封印印记;封印色(§4.1,现行封印黑)与格内优先级栈位(§1.2)不变。封印特效(施印瞬间 + 印记常显形态)资产归清单 §4 演出类;旗印记纹理已落位、字形占位退役(迭代 9 卡⑬兑现;原 06 债务条目已完成移除)。←原一;P2;术语批 2026-09-25;封印紫批 2026-09-26;封印黑批 2026-09-28 +- **封印印记**:封印动作的叙事呈现 = **封印**(玩家可见专名,术语定义见 [术语表](../gdd/术语表.md)「封印」条;动作面见《排雷玩法》)——封印动作落在格上的印记称封印印记;封印色(§4.1,现行封印黑)与格内优先级栈位(§1.2)不变。封印特效(施印瞬间 + 印记常显形态)资产归清单 §4 演出类;封印印记纹理已落位(现行件=`seal_mark.png`,32×32 可选件)、字形占位退役(迭代 9 卡⑬已实现;原 06 债务条目已完成移除)。←原一;P2;术语批 2026-09-25;封印紫批 2026-09-26;封印黑批 2026-09-28 - **可挖域接触带微光(交互反馈层,2026-09-25 用户拍板)**:挖掘期,英雄格周界与可挖域(概念见《排雷玩法》动作合法性节;呈现义务见《HUD框架》可挖域指示)的接触面画呼吸微光——正交邻墙=该侧整条边,斜向邻墙=共享角点+向两侧各延伸半条边;光只画英雄格(空间)一侧、不进墙格(与装饰变体零冲突,数字砖心不涉);微光=空间的灯光边界(画法口径)。色相=蓝族浅一档(§4.2 蓝条;与主角蓝框的分层归样张批);呼吸=§2.1 挖掘期唯一在动元素,减动效停格。角点为斜墙与正交墙共享、不逐格归因,逐格指认=悬停金框(呈现交互归《HUD框架》悬停指示域)。←§2.1;§4.2;P1 - **墙体**:圆角砌块堆叠,禁尖刺装饰——尖刺专属危险语义,装饰禁止伪装逻辑差异。←原三 - **高墙瓦片体系(2026-09-26 定稿,样张批追认)**:未挖格=**一整块 32×32 自含凸起岩体**(方案甲核心定义);素材语义名——未开格素材=**墙瓦片**,已开格素材=**地面瓦片**(术语 2026-09-26 用户立)。**边界=墨线纪律**:墙瓦片与相邻格分界一律 1px 深墨线、直线贴格边、零锯齿;墨线职责=分隔,不追求与地面融合(Tiny Dungeon 样图实证调研后否决出局——TD 拼块套不进方案甲自含岩体定义,2026-09-25 终局维持方案甲;记录=git 提交 70d2320)。**光照=单一北受光**:北缘=墨线内侧 1px 微亮棱(就地取色提亮,禁宽亮带);西/东缘=墨线后直进纹理、不加修饰;南缘=墨线+立面窄暗条(约 1/3 格高,横层理叠石、禁竖条纹栅栏感)。**凹角**:角点单像素落线;南立面侧凹角加 1px 立面收头——带身与转角竖线同列收尾,禁悬空、禁突出(v9.1/v9.2 两版返工实证)。现行定稿=`game/assets/art/board/terrain_*`(16 唯一墙瓦片+5 地面瓦片变体;词表与查表逻辑见 `高墙瓦片词表(已落码 board_world.gd 查表,文件已退役)`)。**高墙感 D 投影档+整板悬崖(样张 v2 定稿 2026-09-28,用户 2026-09-27 四变体挑档)**:南临空墙格=立面口沿高光 2px `Color8(196,172,132)`+双段暗带(0.16/0.25 格边,黑罩 α0.60/0.82);北邻墙地面格=三段渐隐投影(顶带 0.22 格边,α0.28 起);整板悬崖=板底/右侧 `DEPTH_PX 8px` 暗面+列分隔竖缝+岩层横纹+口沿高光+接触 AO+底线收边+悬浮影(游戏 `board_world.gd` 同款结构件,样张脚本与游戏渲染常量同源——机检 F7 承载)。←原三;状态记录 164;样张 v2 批 2026-09-28 diff --git a/design/art/asset-path-map.md b/design/art/asset-path-map.md index 42262455..6173e83d 100644 --- a/design/art/asset-path-map.md +++ b/design/art/asset-path-map.md @@ -27,7 +27,7 @@ |---|---|---| | `character/` | 角色棋盘帧 + B 区立绘 | character_hero_idle/walk(棋盘 32×32 朝左基准)、character_hero_portrait(B 区立绘 46×48)+ character_enemy_<键> 八敌 | | `fx/` | 特效帧 | shovel_swing_f0/f1/f2(挥铲三帧,握把锚 (18,12)) | -| `board/` | 砖面/旗印记(三关换皮 + 封印旗;2026-10-06 对账更正——旧 `board_floor/wall/pillar_dungeon_*` 命名退役) | terrain_floor__.png(三关地面系)、flag_seal.png | +| `board/` | 砖面/封印印记(三关换皮 + 封印印记件;2026-10-06 对账更正——旧 `board_floor/wall/pillar_dungeon_*` 命名退役) | terrain_floor__.png(三关地面系)、seal_mark.png | ## 4. 坐标/朝向等工程侧约定备查 diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index 68e500dc..ea7dc883 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -689,3 +689,13 @@ **归属**:①`奇物.md` §1.1/§2.2/v2.2 行(已订正写入文档);②`奇物.md` §1.3(:121/:223/:229)与 `02-系统清单.md:49`(待裁) **状态**:已写入(design/gdd/systems/冒险循环/奇物.md v3.19——第①项专长凭证归类订正)+待裁决(第②项资源判据句,心智模型未对齐,不列候选不提前处置) + +--- + +#### 玩家面残留禁字清扫——图例/明细/日志/字形五处(2026-10-20 登记,来源=批次移交,设计面=工程直入) + +**现状**:迭代 31 卡① 已把 `game/` 的金币/插旗/雷格/惩罚格/`flag` 清零,但玩家可见文本仍残留「雷/排雷/插」五处(v3.15 命名纪律:玩家面禁「雷」,危险格对外风味=地下城陷阱/怪物巢穴):①`legend_overlay.gd:11` 图例行「插错可左键直接挖开…危险格吃**挖雷**惩罚」;②`status_slot_row.gd:42` 与 `settlement.tres:14` 明细来源名 `"mine_hit": "踩雷"`;③`battle_log_view.gd:194` 战斗日志「本板**完美排雷**已破——归因此封印」;④`board_fx_view.gd:102` 横幅「**完美排雷** ×2」;⑤`board_view.gd:737` 已开危险格单字字形 `glyph = "雷"`。①-④ 纯文案零风险;⑤ 改字形会动 golden 基线,须同步重制 C 档基准。开发注记面(`ui_kit.gd:37` 常量名 `RED_MINE` 与其注释)属内部语,按纪律保留。 + +**归属**:`game/presentation/` 与 `game/data/tables/settlement.tres`(走独立 worktree 批;⑤ 连带渲染基线) + +**状态**:待写卡 diff --git a/design/gdd/07-体验验证清单.md b/design/gdd/07-体验验证清单.md index fca4e440..23fd6bc9 100644 --- a/design/gdd/07-体验验证清单.md +++ b/design/gdd/07-体验验证清单.md @@ -302,3 +302,19 @@ | 3 | 出圈灭、入圈复亮 | 角色走远出 8 格圈→微光灭;走回→复亮;换图随旧图全重置 | | 4 | 整屏不脏 | 满圈微光同屏时棋盘不显脏、不抢焦点(焦点预算观感的人眼侧) | | 5 | 群伤暗档观感 | 绯红暗档 #A61D37(V=0.65 provisional)与其余四组同屏时的区分度、以及与危险红不误读的观感——读数归样张批复核 | + +--- + +## ㉙ 代码术语刷新与凭证件裁削批——玩家面目检(迭代 31 卡①/卡②;能力验证半=冒烟 1151 项 0 失败+单元 34 套全绿+对拍 120 局真差异 0 行+`feat_vouchers` 39 项全绿+变异六条五红) + +> 卡① 是纯重命名批(行为零变化),卡② 删两件凭证、把完美保险改为专长订阅式。机检能证明词面清零、数值零漂移与验收组全绿,但玩家面「旧词是否真的不见了、贴图是否还在、豁免的实际观感」仍要人眼看。登记不阻塞(2026-10-12 真人检测立规)。 + +| # | 目检项 | 判据 | +|---|---|---| +| 1 | 商店货币显示 | 商店界面货币显示「GP」,不再出现「金币」 | +| 2 | 图例/HUD 封印文案 | 图例与 HUD 显示「封印/封印印记」,不再出现「插旗/旗」;板面单字字形现为「封」 | +| 3 | 结算明细来源 | 结算明细来源显示「封印命中/封印未中」 | +| 4 | 封印印记贴图三关加载 | `seal_mark.png` 在 L1/L2/L3 三关均正常加载,非字形回退态 | +| 5 | 完美保险卡面文案 | 专长卡面文案读作「本场首次封印落空,不计入完美封印判定」,零「雷」字 | +| 6 | 稀有档三选一 | 三选一带不再出现同调电池/完美保险;稀有档仅剩 ap/rap/time_sand 三种 | +| 7 | 豁免后的完美第二份 | 带完美保险专长时,首次标错后清图仍能拿到「完美第二份」(订阅式豁免的实际观感) | diff --git a/design/gdd/systems/冒险循环/奇物.md b/design/gdd/systems/冒险循环/奇物.md index 4719d536..19f0dea7 100644 --- a/design/gdd/systems/冒险循环/奇物.md +++ b/design/gdd/systems/冒险循环/奇物.md @@ -104,7 +104,7 @@ 惊巢反制=退役进素材库(不迁入)。 -**资源类迁出件(2026-10-18 用户裁)**:完美保险自资源类迁入专长——理由:它给的是**规则豁免**而非可调动的余量(§1.1 判据「给规则的是专长」),效果=本场首次封印落空不计入完美封印判定。旧「资源类成员」归类系 2026-10-08 框架批写入、无用户裁断支撑,随本次改判注销。专长行的触发器规格与代码实现(含效果引擎词表扩签)归独立批,见 06 登记。 +**资源类迁出件(2026-10-18 用户裁)**:完美保险自资源类迁入专长——理由:它给的是**规则豁免**而非可调动的余量(§1.1 判据「给规则的是专长」),效果=本场首次封印落空不计入完美封印判定。旧「资源类成员」归类系 2026-10-08 框架批写入、无用户裁断支撑,随本次改判注销。专长行已于迭代 31 卡② 落表(合并 `3e076e22`):`feats.tres` 单行 `when counter(insurance_used) lt 1` 承载「本场首次」,效果类型 `forgive_seal_miss` 随引擎扩签;配额按净删重裁(rare 9→7、总量 104→102)。 ### 扩签登记(迭代 20 实装已承载——2026-10-12 追认④写入文档换代) @@ -231,6 +231,7 @@ **补给类内部的异质性(统一表述)**:凭证全部即时消尽——不存在「持有凭证」这种状态;异质性不在凭证上,而在**被写入的系统资源的寿命**上:GP 钱包 / 生命 / 刷新存量 = 冒险级,储备池 = 节点级,时沙暂记 = 至下一战首轮兑付(系统资源清单对齐「凭证件表(新 3+留任 2)」节;「AP 上限」已归属性值提升轴,见 1.2)。 - 原在册的「秘宝充能」「完美资格」两笔随 2026-10-18 两件裁削注销——`attune_charges` 账本本身仍为秘宝基础设施保留(迭代 11,主动件充能每冒险重置),本次只删奇物侧写它的入口。 +- 完美资格的豁免走**订阅式自有累加账**:授予段在 `seal_missed` 命中时累加豁免数,判定取「误标总数 − 豁免数」得有效数;**不改写误标账本身、不拦截事件**(迭代 31 卡② 契约 2/3)。 - 登记此节防止把凭证当成会持续生效的东西去结算。 #### 1.4 分类判据 diff --git a/design/gdd/ux/interaction-patterns.md b/design/gdd/ux/interaction-patterns.md index f8c7e79e..584fc018 100644 --- a/design/gdd/ux/interaction-patterns.md +++ b/design/gdd/ux/interaction-patterns.md @@ -87,7 +87,7 @@ MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab - 数据源:[战斗结算](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)步骤流(9 类行封闭协议(现行);公共字段 `type/source_class/origin_cell/round_index/display_name/value/highlight?`);**无来源行 = 断言失败** - 行模板:「{行为} {值} → {目标}(来源)」——来源标注(第 N 轮 · 安全格式);行文案最长 token = 来源标签(4 汉字封闭枚举),模板预留 40% 膨胀宽度 - 聚合纪律:未生效类行(奖励未生效——现行 9 类行协议唯一未生效型,2026-09-20 收敛)按聚合计数呈现(防逐行惩罚轰炸);衰减行聚合计数;效果行 value=单次贡献值、禁与 pool_value(池合成值)相加呈现;零值行可见不吞(免伤轮归因不断点) -- 高亮:highlight 字段 {flag_hit, clear_reward_h2, perfect_broken} → 金框强调;完美排雷 = 独立高光行 + 全屏喝彩级反馈 +- 高亮:highlight 字段 {flag_hit, clear_reward_h2, perfect_broken} → 金框强调;完美排雷 = 独立高光行 + 全屏喝彩级反馈。`perfect_broken` 的判据句读作「本板首次标错受检」,不等于完美资格已失——专长「完美保险」可在本场首次标错时豁免,实际资格按有效误标(误标总数 − 豁免数)判定 - 布局:固定槽高 + clip_contents;正文 ≥14px;数值暗底高对比;未生效类行带 icon/划线形状冗余 - 击杀标记呈现(H3 数据源 = 战斗结算流水击杀结果字段) diff --git a/design/gdd/术语表.md b/design/gdd/术语表.md index 7e816b21..5c080b48 100644 --- a/design/gdd/术语表.md +++ b/design/gdd/术语表.md @@ -11,7 +11,7 @@ | 安全格 | 没有惩罚的格子——挖开安全并获得其上信息与收益 | | 整图 | 单张棋盘(的整个范围)——原「整图」退役(2026-10-11 用户裁)。例:整图叠加层、整图作用域 | | 叠加层(整图叠加层) | 秘宝产生的信息的自持容器:按效果分类的格集,随图消亡、不回写棋盘(见[秘宝](systems/跨局循环/秘宝.md)) | -| 封印 / 控制 | 封印动作的机制名/玩家名:封印印记落在危险格上为「标中」(危险格被控制、化险为利),封错为「标空」(原「旗 / 控制」,2026-10-18 用户裁:「旗」概念不存在——动作=封印、印记=封印印记) | +| 封印 / 控制 | 封印动作的机制名/玩家名:封印印记落在危险格上为「标中」(危险格被控制、化险为利),封错为「标空」(原「旗 / 控制」,2026-10-18 用户裁:「旗」概念不存在——动作=封印、印记=封印印记);代码契约键与标识符统一用 `seal_*`(原 `flag_*` 全族换代),板面单字字形=「封」 | | 真视 | 直接告诉玩家某范围内哪些格是危险格的效果(秘宝承重契约:一次最多 3×3,见[秘宝](systems/跨局循环/秘宝.md)核心规则) | | 类型微光 | 棋盘上按格子类型显示的提示光效(视野参数控制其显示范围) | | 换图 / 弃图刷新 | 清完一图进入下一图 / 花储备放弃当前图重开一张(代价见[行动经济](systems/排雷循环/行动经济.md)) | @@ -81,6 +81,13 @@ 两类的判定与道具定义卡必答见[核心循环](01-核心循环.md)「结算目标分两类:总线与抽屉」节。 +## 战斗与效果 + +| 术语 | 定义 | +|---|---| +| `seal_missed` | 封印落空事件(原 `flag_missed` 换代):封印动作落在安全格上时发出,订阅面据此做限次与豁免判定(迭代 31 卡② 落地) | +| `forgive_seal_miss` | 本场首次封印落空豁免——专长「完美保险」的效果类型,`domain=battle` 首例;有效误标=误标总数 − 豁免数,豁免不改写误标账(迭代 31 卡② 落地) | + ## 开发流程 | 术语 | 定义 | @@ -113,11 +120,12 @@ 注:「注销」仅用于清单条目办结义(销号/销账的替换词);「结束登录状态」义仍按 STC 用「退出登录」。 -### B. 豁免条款(三类文本不改写) +### B. 豁免条款(四类文本不改写) 1. **历史文本**:git 提交说明、裁决记录中引用用户原话的句子——保留原用词,不按 A 表追改。 2. **对照性文本**:「退役词对照」表本身、「原 ××」式更名记载、禁令引举句——旧词在这些位置是内容本身,不是残留。 3. **玩家可见专名与机制词**:按「对外命名纪律」节与各系统文档现行用语使用(标中/踩雷等机制词在文档内部照常用)。 +4. **被检查的禁字不算使用**:守卫代码里作为检查对象的禁字字面量——`game/smoke/smoke_all.gd` 的 `contains("旗")` 检查项、`game/tests/unit/presentation/ui_font_asset_test.gd` 的字形集负探针、`game/data/tables/feats.tres` 头注的「desc 禁『雷/旗』字面」、`tools/doc_term_audit.py` 的退役词表定义行——不属换代范围:被检查的字不是对该字的使用,改写等于自毁守卫。术语清扫的复扫口径按 **game/ 全部文件类型、不排除任何扩展名**执行(迭代 31 卡① 实测:金币/插旗/雷格/惩罚格/`flag` 均 0 命中,残留仅为上述保留面)。 存量口径:A 表生效前已入库的正文不做强制清扫;文件后续被批次触碰时,顺带按 A 表换代。 @@ -135,6 +143,7 @@ | 金币 | GP(2026-10-18 用户裁:GP 是唯一正式命名,「金币」系 AI 噪音全库禁用) | | 插旗 | 封印(2026-10-18 用户裁:封印=正式动作名,全库统一,非比喻非「对外表达」别名) | | 旗(游戏概念语境) | 封印印记(2026-10-18 用户裁:「旗」概念不存在——封印动作落下的印记称封印印记) | +| flag_*(代码契约键/标识符) | seal_*(2026-10-18 用户裁全族换代;迭代 31 卡① 已清零) | ## 对外命名纪律(玩家可见命名,2026-10-11 用户令) From df4518d8789a95b4233255855ace1635dcb66a3a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 20 Oct 2026 15:28:38 +0800 Subject: [PATCH 7/7] =?UTF-8?q?chore(=E6=89=B9=E5=90=8E=E6=94=B6=E5=B0=BE)?= =?UTF-8?q?:=20=E8=BF=AD=E4=BB=A3=2031=20=E4=BA=A7=E5=87=BA=E7=89=A9?= =?UTF-8?q?=E4=B8=8E=E4=B8=A4=E5=8D=A1=E9=80=80=E5=BD=B9=E2=80=94=E2=80=94?= =?UTF-8?q?=E5=90=B8=E6=94=B6=E5=8D=B3=E6=AD=BB=E5=88=A0=E9=99=A4=EF=BC=8C?= =?UTF-8?q?06/roadmap=20=E8=B4=A6=E9=9D=A2=E6=8D=A2=E4=BB=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 反哺点 14 条已于 7682559 落文(术语表 seal_* 契约键与效果词条、奇物完美保险指向、07 ㉙ 七项目检、美术件名与守卫例外条款、06 新候选) - 代拍板追认:13 项全部追认(卡① 1-6、卡② 7-13);待裁 A=甲——玩家面残留禁字另开小批、已登记 06;B=乙——perfect_broken 判据句改文档措辞、代码零动 - 实现报告 §六-1 未闭项迁 06「计数器寿命域未统一」:domain=battle/adv​enture 寿命判据无法由单测 rig 变异证红,闭合时补 runner/MC 对照读数或确认不设机检 - 06 删除两条已完成条目(代码术语刷新批、凭证件裁削批·代码侧) - roadmap 迭代 31 行改「已完成(2026-10-19)」、两列改已退役保留字;当前位换代至迭代 1–31 全完成 - 代码术语审计报告的卡片指路句改指合回 commit 4f953ce8/3e076e22(卡片退役后不留死径) --- design/gdd/06-待办清单.md | 23 +- .../research/代码术语审计报告-2026-10-18.md | 4 +- reports/iter31-代拍板-2026-10-19.md | 44 --- reports/iter31-反哺点-2026-10-19.md | 67 ---- reports/iter31-实现报告-2026-10-19.md | 94 ----- reports/需求卡片-代码术语刷新批-2026-10-18.md | 330 ------------------ reports/需求卡片-凭证件裁削批-2026-10-18.md | 216 ------------ roadmap.md | 6 +- 8 files changed, 7 insertions(+), 777 deletions(-) delete mode 100644 reports/iter31-代拍板-2026-10-19.md delete mode 100644 reports/iter31-反哺点-2026-10-19.md delete mode 100644 reports/iter31-实现报告-2026-10-19.md delete mode 100644 reports/需求卡片-代码术语刷新批-2026-10-18.md delete mode 100644 reports/需求卡片-凭证件裁削批-2026-10-18.md diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index ea7dc883..4479afd8 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -555,17 +555,6 @@ **状态**:文档设计已闭合(design/research/需求澄清-营地交互重做-2026-10-18.md v1.0)+待美术设计+已写卡(reports/需求卡片-存档制数据层改造批-2026-10-18.md)+已写卡(reports/需求卡片-主菜单三入口化批-2026-10-18.md)+已写卡(reports/需求卡片-选档界面新建批-2026-10-18.md)+已写卡(reports/需求卡片-营地场景图新建批-2026-10-18.md)+已写卡(reports/需求卡片-ESC浮窗与营地顶栏批-2026-10-18.md) -#### 代码术语刷新批——禁用词全库清扫+flag→seal 标识符重命名(2026-10-18 登记,来源=会话提及,设计面=工程直入) - -**现状**:2026-10-18 用户裁定三组术语刷新(记忆 `project-terminology-rulings-20261018.md`):①GP 是唯一正式命名,「金币」系 AI 噪音全库禁用;②「插旗」全库禁用,正式动作名=封印,「旗」概念不存在;③代码英文标识符 flag_* 全换 seal_*。另「雷格」「惩罚格」2026-10-11 已裁退役→危险格,代码域尚未执行。审计报告(`design/research/代码术语审计报告-2026-10-18.md`)实查:game/ 代码域实测读数(2026-10-18 需求卡片 v1.4 复核;口径=区分大小写逐处计数,命令见卡片 §2):含 `flag` 的文件 57 个(.gd 53 + .tres 4)共 617 处,剔除 `size_flags_*` 70 处(19 个文件)与 `_fatal_flag` 4 处后**净待改 543 处/42 个文件**;中文禁用词 金币 39 处、插旗 62 处、雷格 75 处、惩罚格 1 处、「旗」含复合词共 376 处。涉及核心逻辑(minesweeper_rules.gd 净 59、battle_orchestrator.gd 33、grant_segment.gd 38)、数据表(feats.tres 15、settlement.tres、action_economy.tres、reward.tres、treasure_items.tres)、呈现层(board_view.gd 23、battle_end_overlay.gd 11、shop_overlay_view.gd、legend_overlay.gd)与冒烟测试(smoke_all.gd 单文件净 156 处=全集 29%)。订正说明:审计报告原记「game/ 约 757 处(flag_ 314 处/29 个 .gd;金币 116/插旗 210/雷格 109)」在现行代码上两种口径都复现不出:中文三词的读数属全库面(全库实测 金币 381/插旗 600/雷格 394 处),与本条的 game/ 范围混记;flag 侧则低估约一倍。逐文件读数以需求卡片 §2 为准。文档面(design/)由另批处理,本条只覆盖 game/ 代码域。 - -**归属**:全工程(排雷循环/战斗循环/冒险循环/呈现层/数据表/冒烟测试均触及;主责=术语表裁定执行) - -**状态**:已写卡(reports/需求卡片-代码术语刷新批-2026-10-18.md)+已编迭代 31 - - ---- - #### 需求卡片入库纪律未登记——502 批遗留的悬空待办(2026-10-18 登记,来源=批次移交,设计面=反哺点) **现状**:2026-10-16 迭代 29 编入批(提交 `21c83f5`)认定「需求卡片写进了 roadmap 却没在 06 登记」属流程漏洞,需要补一条卡片入库纪律。该条至今在 06 清单内查无(2026-10-17 与 2026-10-18 两次全文检索零命中)。唯一记过它的地方是根目录状态文件未决面第 31 行,该文件已于 2026-10-18 用户裁废除,故改记本条防遗忘。 @@ -642,22 +631,14 @@ **现状**:效果的「寿命/作用域」现由三套互不同属的机制拼成,无统一枚举——①`domain` 键仅作用于计数器,只有 `battle`(缺省,每战清零)/`adventure`(跨战持久)两值;②`reset_at: round_start` 表达回合级重置(`feats.tres` 用 4 处);③「按关重置」是**硬编码名单**(`adventure_runner.gd:873-877` 按关清零 `tree_*_used`),不在任何词表内;④**效果自身(非计数器)的寿命没有任何字段**——`effect_engine.gd:32` 的「封印桩本轮/石肤本场」是拿 cap 参数凑的注释,机器不可读。另有名实不符:`domain=adventure` 实际承担「按关重置」语义(代码现状即证:`effect_engine.gd` 词表无寿命字段)。`effect_engine.gd:119-121` 自称「生命周期四态」(跨战持久/按关重置/新冒险清零/断点保留),却未按枚举落地。**后果**:任何带寿命权重的核算(期望收益/强度摊销/「每 X 一次」折算)无法在数据层进行,须逐条读注释或读清除侧代码。**用户已裁:本批不动寿命域**,完美保险按现役 `domain=battle` 落地,此项仅登记、不入本批改动面。 +**证据面缺口(迭代 31 卡② 移交)**:`domain=battle` 每战清零与 `domain=adventure` 跨战持久这一对判据,现无法由单元测试 rig 变异证红(`feat_vouchers_test` 的变异②只钉住事件发射时机,未覆盖寿命域)。闭合此项时须在 runner/MC 面补一次「adventure 域计数器跨战持久 vs battle 域清零」的对照读数,或在文档批确认该判据只由代码注释与装载面约束、不设机检。 + **归属**:architecture.md 与 game/core/effect_engine.gd(待立独立批) **状态**:待裁决(是否统一寿命域口径) --- -#### 凭证件裁削批·代码侧迁移(2026-10-18 登记,来源=会话提及,设计面=文档轨) - -**现状**:GDD 侧已随 2026-10-18 文档批定稿(见 `奇物.md` v3.18),**代码零改动**。待做五件事——①`CURIO_KINDS` 移除 attune_battery/perfect_insurance 两枚及配套配额字段、件值字段、分发表分支;②`TIER_QUOTAS` rare 9→7、总量 104→102(**结构锚须重裁**——用户已裁「净删」,不接受转给别件;连带 rare 档品种 5→3,仅剩 ap/rap/time_sand);③`adventure_runner.gd` 清 `_pending_insurance`/`_battery_pending`/`choose_battery_target`/`battery_pending()`/断点存档键(🔴 `run_ledger.attune_charges` 账本与 `_seed_attune_charges` **禁删**——迭代 11 秘宝基础设施);④`feats.tres` 增完美保险行(rarity 取 rare、desc=「本场首次封印落空,不计入完美封印判定」、triggers 走 on=flag_missed + 每战限次),前置依赖**效果引擎 `EFFECT_KINDS` 扩签一种**(该行将成为 feats.tres 首例 `domain=battle`;候选名 forgive_flag_miss 已作废,2026-10-18 用户补裁效果类型名=**forgive_seal_miss**(随卡① flag→seal 命名接续,见需求卡片 v1.1 顶部通则);⑤`grant_segment.gd` 硬编码 `_fx_insurance` 改订阅式——**按用户指定做法**:新增自有累加计数,判定时取「误标总数 − 豁免数」得有效数,**不改写既有 `_perfect_hit_false`、不拦截事件**(原方案的回退式与拦截式均已否决)。测试面 `feat_vouchers_test.gd` V9/V16 同步。玩家面术语统一用「完美封印」、不用「完美排雷」(命名纪律见奇物.md v3.15)。 - -**归属**:game/ 代码与数据表(走独立 worktree 批) - -**状态**:文档设计已闭合(design/gdd/systems/冒险循环/奇物.md v3.18)+已写卡(reports/需求卡片-凭证件裁削批-2026-10-18.md)+已编迭代 31 - ---- - #### 2026-10-19 定名传导遗留二项(2026-10-19 登记,来源=会话提及,设计面=文档轨) **现状**:2026-10-19「系统资源/补给」定名批(`42d64ec2`/`17ef0180`)遗留两件文档面未结——①`design/gdd/systems/战斗循环/增益状态.md` 用「账/账本」指战斗内状态容器(:10「增益状态就是这本账」、:44「增益减益同账本」、:14「容器只记账」)。经用户确认它与「系统资源」**不是同一个东西**(前者是战斗内状态实例容器,后者是玩家可增减的数值容器),但用词冲突;是否改名(候选方向:容器/状态池)与连带指路句范围待用户裁。②`design/art/art-bible.md:198`(奖励金配色行「金币/宝箱/蜡封」)、`:211`(语义物件「金币=收益金」)与 `design/art/art-assets-checklist.md:105`(九家族图标名)应换代 GP,`design/registry/entities.yaml:623/:629/:637` 三处「金币」同批——均已在分支 `gpsweep-20261019`(`c5d50192`)改完但**未合回 master**,主区现值仍是旧文;合并动作归用户另会话,本批不代做。 diff --git a/design/research/代码术语审计报告-2026-10-18.md b/design/research/代码术语审计报告-2026-10-18.md index 5f59a0ec..b04e3117 100644 --- a/design/research/代码术语审计报告-2026-10-18.md +++ b/design/research/代码术语审计报告-2026-10-18.md @@ -34,7 +34,7 @@ 注:「封印」现有 170 处命中(46 文件),其中大部分是正确用法(封印=正式术语),但部分语境把它当「比喻」或「对外表达」描述,需修正措辞。 -**读数订正(2026-10-18 需求卡片 v1.4 实测,本表数字保留作历史读数不作施工依据)**:上表的 game/ 侧数字用现行代码复现不出。同一命令口径实测(`game/` 内、区分大小写逐处计数):含 `flag` 的 .gd 53 个文件 595 处 + .tres 4 个文件 22 处,剔除 `size_flags_*`(70 处/19 文件)与 `_fatal_flag`(4 处)后**净 543 处/42 个文件**;「金币」39 处、「插旗」62 处、「雷格」75 处、「惩罚格」1 处、「旗」含复合词 376 处。两处口径错误:①中文三词用的是**全库**读数(全库实测 金币 381/插旗 600/雷格 394 处),被记进了 game/ 范围行;②flag 侧低估约一倍(原记 270+22+22=314)。施工判据以 [需求卡片-代码术语刷新批](../reports/需求卡片-代码术语刷新批-2026-10-18.md) §2 的复现命令为准。 +**读数订正(2026-10-18 需求卡片 v1.4 实测,本表数字保留作历史读数不作施工依据)**:上表的 game/ 侧数字用现行代码复现不出。同一命令口径实测(`game/` 内、区分大小写逐处计数):含 `flag` 的 .gd 53 个文件 595 处 + .tres 4 个文件 22 处,剔除 `size_flags_*`(70 处/19 文件)与 `_fatal_flag`(4 处)后**净 543 处/42 个文件**;「金币」39 处、「插旗」62 处、「雷格」75 处、「惩罚格」1 处、「旗」含复合词 376 处。两处口径错误:①中文三词用的是**全库**读数(全库实测 金币 381/插旗 600/雷格 394 处),被记进了 game/ 范围行;②flag 侧低估约一倍(原记 270+22+22=314)。施工判据见需求卡片 §2 的复现命令(卡片已随迭代 31 实现批退役,git 历史可考;合回 `4f953ce8`)。 --- @@ -119,4 +119,4 @@ design/research/(提案、需求卡片)、design/qa/(审查报告)、des ## 6. 建议拆批 -见同目录需求卡片:`reports/需求卡片-代码术语刷新批-2026-10-18.md` +拆批已由迭代 31 执行(卡① 代码术语刷新+卡② 凭证件裁削,合回 `4f953ce8`/`3e076e22`);对应需求卡片已随实现批退役,git 历史可考。 diff --git a/reports/iter31-代拍板-2026-10-19.md b/reports/iter31-代拍板-2026-10-19.md deleted file mode 100644 index 82dadef8..00000000 --- a/reports/iter31-代拍板-2026-10-19.md +++ /dev/null @@ -1,44 +0,0 @@ -# 迭代 31 代拍板追认单(2026-10-19) - -- 批次:迭代 31 卡①「代码术语刷新批」(卡片 v1.4)+卡②「凭证件裁削批·代码侧」(卡片 v1.1),串行同迭代 -- 分支/worktree:`iter31-c1-term-20261019`/`g-plan2-iter31-c1-term`;`iter31-c2-curio-20261019`/`g-plan2-iter31-c2-curio` -- 口径:授权发生在卡片审问阶段(Q1–Q8/D1–D3),本单只登记**实现段超出卡片明列范围**的代拍板项,等你追认或推翻。 - -## 一、开工前你已裁的两项(不是代拍板,是裁决留痕) - -| # | 事项 | 你的裁定 | 落法 | -|---|---|---|---| -| R-1 | 素材实体名 `assets/art/board/flag_seal.png` 卡住卡① 的 V1「flag 零命中」(代码两处 res:// 字符串) | **甲:现在改素材名** | 改名 `seal_mark.png`;代码 2 处+`COL_FLAG`/`CURSOR_FLAG` 常量+闸件四处(`tools/run_all_gates.sh`/`render_gate.sh`/`golden_baseline_refresh.sh`/`path_check.py`)随批;盘上素材改名+导入重刷(素材不入 git);主区与两 worktree 三份同态 | -| R-2 | 卡① V7 对拍锚(`anchor.json` 的 jsonl 面是 sha256 清单,手改键名与摘要面不兼容) | **甲:重跑+重锚+改前改后 diff** | 卡① 重锚一次(三变体 120 局全跑),卡② 再重锚一次;改前原始面另起临时 worktree(`g-plan2-iter31-oldface`,检出 ed2dfaf6)实跑 dump 取证 | - -## 二、实现段代拍板清单(超卡片明列范围) - -### 卡① - -| # | 决定 | 依据与影响面 | -|---|---|---| -| 1 | 板面单字槽字形 `"旗"` → `"封"`(`board_view.gd:752` 赋值+`:785` 比较,消费面共 4 处:`board_view`/`ui_click_probe:556`/`ui_input_probe:217`) | 术语裁定「旗概念不存在」+字形槽是单字位;选「封」而非「封印」为保位宽与 golden 稳定。字体在册字形含「封」(`ui_font_asset_test` 原断言面即攻/雷/旗/封) | -| 2 | 大写常量 `COL_FLAG`→`COL_SEAL`、`CURSOR_FLAG`→`CURSOR_SEAL` | 卡片 §2 计数口径是小写 `flag`,未列大写形态;V1 精神是全族换代。零行为(纯标识符) | -| 3 | **守卫的禁字面量不换代**:`smoke_all.gd:1319` 的 `contains("旗")`、`ui_font_asset_test.gd:19` 的 `has_char("旗")` 保持原字 | 被检查的字不是对该字的使用;改写等于把「对外命名纪律」守卫自毁(禁「旗」变成禁「封印」)。卡片 §2 只订正了 `ui_assembler` 注释一处,未涵盖检查面。与卡片「术语表对照行不在本卡范围」同口径 | -| 4 | `game/README.md` 历史批注里的英文标识符(`_do_flag_place`/`flag_hit`/`minesweeper_flags` 等)随批换代 | 卡片 §5 只写「雷格/插旗随批替换」,而完成定义是 game/ 全局 grep 零命中;README 属本批直改文件。历史叙述的指称对象已改名,留旧名即失真 | -| 5 | 旧锚 `anchor.json` 的 RUNSUM 文本随代码同批改名,随后重锚(不再手改) | R-2 甲案;重锚后手改面作废 | -| 6 | `ui_assembler.gd:203` 注释按卡片 v1.4 订正句改写为「0=不设最小宽度」 | 卡片明列(非代拍板,登记免漏) | - -### 卡② - -| # | 决定 | 依据与影响面 | -|---|---|---| -| 7 | 完美保险专长**单行落表**(代拍板 3 的选型):`when counter(insurance_used) lt 1` 承载「本场首次」,`do` 自带 `counter_id`+`value` 由授予段消费点落账 | 卡片预设的「双行(forgive+counter_add)」实测不成立——效果引擎 `dispatch()` 只收集命中、**不代执行计数器**,counter_add 须由消费段显式调用;双行会在同一次 dispatch 内双双放行(第二次标错仍被豁免)。改单行后限次真生效(变异 `lt 1→lt 99` 证红)。DO_KEYS 的 `cap` 语义核不出「本 effect 累计上限」,故未走 cap 省行路线 | -| 8 | 豁免归因行 `source_class` 取 `"seal_miss"` | 旧代码 `_emit_row("insurance_used", "", …)` 空来源会触发行来源断言(`battle_orchestrator._assert_row_source`);旧路径因呈现层零接线从未真正走到,属**存量潜伏缺陷**。新订阅面一旦执行即红,故补真实来源(指回当格,满足「棋盘来源行必须指回真实格」);行型仍用在册 `insurance_used`,零新增行型 | -| 9 | `level_runner` 的 `voucher_insurance` 注入通道整链拆除(`set_voucher_grants` 降为两参) | 卡片 §2 落点表未列 `level_runner`(:478/:484/:646/:649/:652),但它是「战首注入链」的实际承载面;不拆即留死通道+参数空转。签名改动波及 `adventure_runner:920` 与 `smoke_all` 四处 rig | -| 10 | 卡② 新测试全部并入 `feat_vouchers_test.gd`(39 项),不新建套件 | 卡片代拍板 4(避免套件数膨胀);`run_all.gd` 登记面零改动(34 套不变) | -| 11 | 谓词抽成 `battle_orchestrator.perfect_sweep_earned()` 单点 | R2「真值表断言」需要可调用面;抽函数是零行为变化的取法(原式内联在清图奖励段),并使「漏减豁免」变异可证红 | -| 12 | 完美资格**归因行**的 `hl="perfect_broken"` 判据保持原样(仍按 `_perfect_hit_false == 1` 落,先于 `seal_missed` 发射) | 卡片契约 3 明令发射时机不得动;若把归因改到豁免之后再算,就得挪发射点或新增纠正行型(超范围)。后果:首次标错那一行仍带「完美已破」归因锚,而实际完美资格可能已被豁免保住——**文案层不一致,已列反哺点等你裁** | -| 13 | 断点兼容按「旧档多键不报错」验,不做迁移 | 卡片 L2 口径+卡① Q4 同源(Alpha 可作废) | - -## 三、需你裁决的两项(本单唯一待裁面) - -| # | 待裁点 | 两种读法 | 建议 | -|---|---|---|---| -| A | 玩家面残留禁字:`legend_overlay.gd:11` 图例行含「插错可左键直接挖开」「危险格吃**挖雷惩罚**」(v3.15 命名纪律:玩家面禁「雷」「插旗」) | 甲:本批已合回,另开小批清这两处文案;乙:视为卡① N2 未尽面,退回补做 | **甲**——「插错/挖雷」不属卡① 四个门禁词(金币/插旗/雷格/惩罚格),批内自扩判据=越权;已登记 06 候选 | -| B | 卡② 反哺:完美资格归因锚与豁免后实际态的文案层不一致(见代拍板 12) | 甲:维持现状(归因锚按「首次标错」语义);乙:文档批把 `perfect_broken` 的定义改写为「首次标错受检」;丙:改判据需动发射时机=需重开设计 | **乙**(改文档措辞即可自洽,代码零动) | diff --git a/reports/iter31-反哺点-2026-10-19.md b/reports/iter31-反哺点-2026-10-19.md deleted file mode 100644 index ce991abf..00000000 --- a/reports/iter31-反哺点-2026-10-19.md +++ /dev/null @@ -1,67 +0,0 @@ -# 迭代 31 反哺点清单(2026-10-19) - -- 口径:本批是代码实现批,禁写 `design/` 与根规则文件。下列每条写清「哪个文件哪一节/改成什么/依据」,由你在会话中裁决后归**文档批**落笔;落笔后本条即可删(`reports/README.md` 生命周期同口径)。 -- 依据批次:卡①「代码术语刷新批」v1.4(`reports/需求卡片-代码术语刷新批-2026-10-18.md`)+卡②「凭证件裁削批·代码侧」v1.1。 - -## 一、06-待办清单(`design/gdd/06-待办清单.md`) - -| # | 条目 | 改成什么 | 依据 | -|---|---|---|---| -| 1 | 「代码术语刷新批——禁用词全库清扫+flag→seal 标识符重命名」状态行(:550 段) | 由「已写卡+已编迭代 31」推进为「已完成(迭代 31 卡①,合并 `<卡① merge commit>`,2026-10-19)」 | 卡① §5 首行;合回 commit 见实现报告 §一 | -| 2 | 「凭证件裁削批·代码侧迁移」状态行(:643 段) | 推进为「已完成(迭代 31 卡②,合并 `<卡② merge commit>`,2026-10-19)」 | 卡② §5 末行 | -| 3 | 新增候选条目(可选) | 「玩家面残留禁字词清扫——图例/呈现文案两处」(见本清单 §六-A) | 实现期实测发现 | - -## 二、术语表(`design/gdd/术语表.md`) - -| # | 节 | 改成什么 | 依据 | -|---|---|---|---| -| 4 | 「旗/控制」相关对照行 | 对照行代号换代:`flag_*` 契约键全部改记 `seal_*`;动作名=**封印**、呈现名=**封印印记**、单字字形=**封** | 卡① N1/N2+代拍板 1(字形取「封」) | -| 5 | 效果类型/事件词条 | 新增 `forgive_seal_miss`(本场首次封印落空豁免,domain=battle 首例)与 `seal_missed`(原 `flag_missed` 换代) | 卡② §5 末行;实装点 `effect_engine.gd:44`、`feats.tres` 第 30 行 | -| 6 | 显式补一条「禁字守卫面例外」 | 注明:守卫代码里的**被检查禁字**(`smoke_all.gd:1319` 的「旗」、`ui_font_asset_test.gd:19` 的「旗」)不属换代范围——被检查的字不是对该字的使用 | 卡① 完成定义与 V4 判据的边界,实现期已按此执行(代拍板 3),需成文防后来者误清 | - - -## 三、GDD 奇物篇(`design/gdd/systems/冒险循环/奇物.md` v3.18) - -| # | 位置 | 改成什么 | 依据 | -|---|---|---|---| -| 11 | v3.18 登记⑤与件表注「归独立批」指针 | 销号:代码侧已落地(删件/迁出/配额净删/引擎扩签/订阅式改写五项全落),指针改指本迭代合回 commit | 卡② §5 首行 | -| 12 | §1.3 异质性账清单 | 「完美资格」账的写法可补一句「豁免走订阅式自有累加账,不改写误标账」 | 卡② 契约 2 落地形态(实现无反哺新设计,仅既有陈述的换代) | - -## 四、07-体验验证清单(`design/gdd/07-体验验证清单.md`) - -| # | 改成什么 | 依据 | -|---|---|---| -| 13 | 新增目检项三条(卡① 玩家面换代):①商店界面显示「GP」不再出现「金币」;②图例/HUD 显示「封印/封印印记」不再出现「插旗/旗」;③结算明细来源显示「封印命中/封印未中」不再出现「标中旗/标旗未中」 | 卡① §7 正常流程体验三项 | -| 14 | 新增目检项两条(卡②):R5 完美保险专长卡面文案(desc 读作「本场首次封印落空,不计入完美封印判定」、零「雷」字);R6 三选一再不出现同调电池/完美保险,稀有档仅剩 ap/rap/time_sand 三种 | 卡② §7.1 R5/R6(本批禁写 07,先记实现报告总清单) | -| 15 | 注销两件奇物在 07 的既有观测项(若在册) | 卡② §5 第三行 | - -## 五、待你裁后才好落文的三项(本清单唯一非换代面) - -| # | 事项 | 建议落点 | -|---|---|---| -| A | **玩家可见文本残留「雷/排雷/插」全表五处**(v3.15 命名纪律:玩家面禁「雷」,危险格对外风味=地下城陷阱/怪物巢穴):① `legend_overlay.gd:11` 图例行「插错可左键直接挖开…危险格吃**挖雷**惩罚」;② `status_slot_row.gd:42` 与 `settlement.tres:14` 明细来源名 `"mine_hit": "踩雷"`;③ `battle_log_view.gd:194` 战斗日志「本板**完美排雷**已破——归因此封印」;④ `board_fx_view.gd:102` 横幅「**完美排雷** ×2」;⑤ `board_view.gd:737` 已开危险格单字字形 `glyph = "雷"`(**注意:改字形会动 golden 基线,须同步重制 C 档基准**)。 | 归 06 新条目+文案小批一次清完;①-④ 纯文案零风险,⑤ 需连带渲染基线换代。开发注记面(`ui_kit.gd:37` 常量名 RED_MINE 与其注释)属内部语,按纪律保留 | -| B | 完美资格**归因锚**文案层不一致:首次标错那一行仍标 `perfect_broken`,而该次可能已被豁免 | 建议只改文档措辞(判据句读作「首次标错受检」),代码零动(详见代拍板单 §三-B) | -| C | 闸件面:`screen_flow_probe` 因 `user://save.json` 全 worktree 共用而假红(本次实测:主区基线与卡① worktree 首跑均红,把存档移开即全绿)。`run_all_gates.sh`/`probe_gate.sh` 是否应自带「跑批期隔离 user 目录」或「探针前预清档」 | 归工具批候选,登记 06(本批只按既有手册处置=人工移档) | - -## 六、美术与素材面(卡① R-1 甲案的文档欠账) - -| # | 文件 | 改成什么 | 依据 | -|---|---|---|---| -| 16 | `design/art/asset-path-map.md:30`(board/ 行现役清单) | 件名 `flag_seal.png` → **`seal_mark.png`**;类目措辞「砖面/旗印记…封印旗」→「砖面/封印印记…」 | 素材已实改名(盘上+两 worktree+主区三处同态),文档现役清单落后于代码=B3 路径核对器的声明面失实风险 | -| 17 | `design/art/art-bible.md`(board 域挂点条款、v3.9 P2 ②句中的 `flag_seal`) | 同件名换代+规格注记(32×32 封印印记可选件) | 素材命名唯一事实源在 art-bible,须与盘上同步;本批禁写 | -| 18 | `tools/path_check.py`/`render_gate.sh`/`run_all_gates.sh`/`golden_baseline_refresh.sh` | **已随卡① 改**(新件名),无需文档批再动 | 你已裁甲案授权本批改这四处 | - -## 七、roadmap(根规则文件 `roadmap.md`,本批禁写) - -| # | 位置 | 改成什么 | 依据 | -|---|---|---|---| -| 19 | 迭代 31 行(:67)状态列 | 「待开工」→「已完成(2026-10-19)」;产出物列填 `reports/iter31-实现报告-2026-10-19.md` | 卡② §5 第四行;两卡合回 commit `4f953ce8`(卡①)+`3e076e22`(卡②)+`afe91cb5`(产出物) | -| 20 | 顶部「当前位」三行(:8-9) | 「迭代位」改记迭代 1–31 全部已完成或已终止、迭代 32 待编排;「下一步」改记 06 在册候选(营地交互重做五卡待编迭代、迭代 30 原卡②③待重新立卡、本批新增 06 候选见 §六-A/§六-C) | 卡② §5 第四行+roadmap 自订纪律(当前位只答「现在该做什么」,三行内换代) | - -## 八、门禁词全类型复扫结果与保留面(本批判据的成文补充) - -| # | 事项 | 内容 | -|---|---|---| -| 21 | V1/V4 复扫口径升级 | 原口径按 `.gd/.tres/.md/.json` 四类扩展名扫;已按**game/ 全部文件类型不排除任何扩展名**重扫:金币/插旗/雷格/惩罚格 **0 命中**,`flag`(不分大小写、减两类假阳性后)**0 命中**,「旗」字命中仅存在于下表保留面 | -| 22 | 保留的「旗/雷」**被检查字面量**(六处,改写=自毁守卫) | `smoke_all.gd:1319` 的 `contains("旗")` 与 `:1321` 检查项描述、`ui_font_asset_test.gd:18-19` 的字形集断言(含退役字「旗」的字体覆盖面负探针)、`feats.tres:10-11` 头注「desc 禁『雷/旗』字面」与命名纪律对照句;`tools/doc_term_audit.py:34,60-64` 的退役词表定义行(同族,属工具侧词表声明面,卡① §4 归文档批/工具批) | -| 23 | 建议成文口径 | 术语类清扫的判据应写成「**被检查的禁字不算使用**」——建议在 doc-conventions 或术语表「对外命名纪律」节补一条,防止后来者把守卫字面量当残留清掉(本批已按此执行并留代拍板 3) | diff --git a/reports/iter31-实现报告-2026-10-19.md b/reports/iter31-实现报告-2026-10-19.md deleted file mode 100644 index 5d2e0856..00000000 --- a/reports/iter31-实现报告-2026-10-19.md +++ /dev/null @@ -1,94 +0,0 @@ -# 迭代 31 实现报告(卡① 代码术语刷新批 + 卡② 凭证件裁削批·代码侧) - -- 卡片:`reports/需求卡片-代码术语刷新批-2026-10-18.md` **v1.4**、`reports/需求卡片-凭证件裁削批-2026-10-18.md` **v1.1**(roadmap 迭代 31 行两卡,串行:卡①→卡②) -- 分支/worktree:卡① `iter31-c1-term-20261019`/`g-plan2-iter31-c1-term`;卡② `iter31-c2-curio-20261019`/`g-plan2-iter31-c2-curio`;取证专用临时区 `g-plan2-iter31-oldface`(检出 ed2dfaf6,跑完即删,不入库) -- 闸口径:两卡均触 `game/` → 代码域;卡① 另触 `tools/` 四处(素材名随批,你裁甲案授权)→ 合回前跑**全量档**(代码+文档两域),卡② 触 `game/`+`reports/` → 同按两域 -- 开工门:U0=本会话 `/iter 31`;开工检查的自洽扫描核出两处卡片缺口,均由你当场裁(见代拍板单 §一 R-1/R-2),零待裁点前提下才动工 -- 完成日 2026-10-19 - -## 一、各任务卡状态 - -### 卡① 代码术语刷新批 - -| 卡 | 状态 | 要点与取证 | -|---|---|---| -| T0 基线 | ✅ | 主区 `ed2dfaf6` 全量代码域跑批:冒烟 **1151 项 0 失败**/单元 **34 套全绿**/探针 --click 与 --full 仅 `screen_flow_probe` 红(后证=`user://save.json` 全 worktree 共用污染,移开存档即全绿,见 §五-3)/渲染闸·静态扫描·熵增闸绿 | -| T1 .tres 重命名 | ✅ | `action_economy.tres`/`settlement.tres`/`feats.tres`/`treasure_items.tres`/`reward.tres`/`status_effects.tres` 键名与显示名全换代(`seal_place_ap_cost`/`seal_hit_premium`/`"seal_hit": "封印命中"`/`"seal_miss": "封印未中"`/`echo_seals`/`smith_seals`/`seal_burst`/`dug_under_seal`/`seal_range_free`/`"GP 袋"`) | -| T2 schema 同步 | ✅ | `action_economy_table.gd`/`settlement_table.gd`/`treasure_item_table.gd`/`reward_table.gd` 与 T1 同批改(契约:键名与读取面禁分两批);卡片未列的 `flag_pull_ap_cost` 一并换代(同批同步=契约面) | -| T3 核心层 | ✅ | `effect_engine.gd` EVENTS/MINE_EVENTS/FACTS 三词表换代(含卡片 v1.4 补的 `seals_count`/`dug_under_seal` 全链);`minesweeper_rules.gd` signal `flag_judged`→`seal_judged`+`battle_orchestrator` 连接与回调同名;`grant_segment`/`action_economy`/`config_db_cross_validator` 等同批 | -| T4 呈现层 | ✅ | 18 个文件;UI 字符串「金币→GP」「插旗→封印」「此格已有封印印记」(按卡① T4.9 措辞);单字字形按代拍板 1 取「封」 | -| T5 冒烟与测试 | ✅ | 24 条明列落点+grep 兜网全部收敛;卡片 v1.4 补列的 5 文件(`screen_flow_probe`/`effect_words_t1_test`/`ui_probe`/`type_glow_shot_probe`/`fx_probe`)均改;净命中文件数 42→0(V1 判据口径) | -| T6 README+锚+验证 | ✅ | `game/README.md` 换代(含英文标识符历史注记,代拍板 4);`anchor.json` 走你裁的重锚路线;V1/V2/V3/V4/V5/V6/V7 全过(读数见 §二) | - -### 卡② 凭证件裁削批·代码侧 - -| 卡 | 状态 | 要点与取证 | -|---|---|---| -| T0 开工基线 | ✅ | 基于卡① 合回后的 master 建区;先跑 `git merge` 取卡① 成果并按卡片通则复核标识符与行号(卡片 §2 旧名 `flag_*` 全部按 `seal_*` 现形态执行) | -| T1 电池表侧删 | ✅ | `CURIO_KINDS` 摘 kind;`curio_quota/value/cap_attune_battery*` 三字段+三处分发表分支删净;表头注记换代 | -| T2 电池 runner 侧删 | ✅ | `_battery_pending`、断点回填与断点键、开局重置、`_apply_curio_pick` 路由分支、`choose_battery_target()`、`battery_pending()` 全清;`attune_charges` 账本与 `_seed_attune_charges()` **零改动**(契约 1) | -| T3 完美保险出池 | ✅ | kind/三字段/三处分发表分支删;`_pending_insurance` 与路由分支删;**注入链整链拆除**含卡片未列的 `level_runner`(`voucher_insurance` enc 键、`_voucher_insurance`、`set_voucher_grants` 降为两参)与 `battle_orchestrator._fx_insurance` 及注入点 | -| T4 引擎扩签+两账相减 | ✅ | `EFFECT_KINDS` 31→32 增 `forgive_seal_miss`;消费点在 `grant_segment` 的 `seal_missed` 命中循环内(新增 elif 分支,累加 `_perfect_forgiven` 并落 `insurance_used` 归因行,source_class=seal_miss);谓词抽成 `battle_orchestrator.perfect_sweep_earned()`(有效误标=误标−豁免);`_perfect_hit_false` 全程未被任何效果改写(契约 2);`seal_missed` 发射点与时机零改动(契约 3,变异②与「事件不吞」断言双向钉住) | -| T5 专长行落表 | ✅ | `feats.tres` 第 30 行 `perfect_insurance`/rarity rare/cap 省略/`on: "seal_missed"`/`kind: "forgive_seal_miss"`/`domain: "battle"` 显式写出(战斗域首例,行内+表头注双留痕);`FeatTable.validate()` 零违例;引擎装载后可派发(39 项验收组实测) | -| T6 配额重裁落地 | ✅ | `TIER_QUOTAS` rare 9→7、总量 104→102;`validate()` 硬断言过;`adventure.tres` 实例值核对(两件在本表无实例覆盖,零同步项);rare 档品种实测={ap, rap, time_sand} | -| T7 测试补齐 | ✅ | 并入 `feat_vouchers_test.gd`(代拍板 10):**39 项全绿**——出池词表/兑付反例/符号清零(`has_method` 编译级)/未知 kind 分发表兜底/账本保留/断点缺键与多键兼容/配额锚/专长行合法与 desc 零「雷」/限次一次/计数纯净/两账相减真值表(2−1、1−1、标中=0 三格)/事件不吞(守侧订阅对拍)/跨战清零;`forge_table_test` 词表闭集断言 31→32;变异验证见 §三 | -| T8 产出物+代码域闸 | ✅ | 本报告+代拍板追认单+反哺点清单三份落 `reports/`;合回前全量档回执见 §四 | - -## 二、改前/改后读数对照 - -### 卡①(纯重命名批——行为零变化的三层证词) - -| 面 | 改前(主区 ed2dfaf6 实跑) | 改后(卡① worktree 实跑) | 判读 | -|---|---|---|---| -| V1 `flag` 零命中 | 57 文件 617 处(净 543 处/42 文件) | **0**(豁免面仅 `size_flags_*` 与 `_fatal_flag`) | 过 | -| V4 四禁用词零命中 | 金币 39/插旗 62/雷格 75/惩罚格 1(另「旗」族 376) | **0**(`game/` 内 .gd/.tres/.md/.json 全域);「旗」字残留=0 | 过 | -| V2 冒烟 | 1151 项 0 失败 | 1151 项 0 失败 | 绿数一致 | -| V3 单元 | 34 套全绿 | 34 套全绿 | 一致 | -| V6/V7 对拍 | 改前=master 同代旧代码**实跑 dump**(`_parity_old`,三变体 120 局) | 改后=卡① 重锚(同 120 局) | **标签归一后 120 行真差异 0 行**;jsonl 事件流六面行数 **6/6 全同**(8051/43795/10579/40180/7060/43844),改前原始面含 `flag` 标签行 2175–10424/面,换代后仅标签名变、数值零漂移 | -| 锚的陈旧面(登记) | 合入前仓库里的 `anchor.json` 系 2026-10-15 冻结,与 10-18 的 master 已有 45/120 行漂移(历次代码批未重锚) | — | 该漂移**不属本批**;卡① 重锚把它一次性对齐(你的甲案口径) | - -### 卡②(裁断驱动的行为变化批——变化面须可解释) - -| 面 | 改前(卡① 合回后锚 `2c5cece4`) | 改后(卡② 重锚 `0170071d`) | 变化归因 | -|---|---|---|---| -| RUNSUM | 120 行 | 120 行,97 行差异 | 差异字段分布=`reward_events`×97、`relics`×78、`seal_*`×76、`taken/rounds/hero_dmg`… 全链派生自「稀有档候选集少两件」——三选一抽取序列改变→后续账全面位移;正是用户逐裁的预期效果面(非回归) | -| jsonl 行数 | 8051/43795/10579/40180/7060/43844 | 8945/39811/9620/38435/7499/45132 | 同因:牌库与豁免语义变化改变对局长度与事件数,方向不一(有增有减)=非单调劣化 | -| 完美保险 | 无玩家入口、`_fx_insurance` 恒 0、豁免行路径从未被执行 | 专长订阅式,每战首次标错豁免一次 | 39 项验收组+5 条变异证红 | - -## 三、变异验证记录(卡② §7.2 六条,最窄闸=`feat_vouchers` 套件) - -| 变异点 | 注入形态 | 结果 | 命中红项 | -|---|---|---|---| -| 两账相减漏减豁免 | `perfect_sweep_earned()` 改回 `_perfect_hit_false <= 0` | 红 ✅ | 「判定相减:误标 1 − 豁免 1 = 有效 0 且标中≥1 → 完美成立」 | -| 计数纯净(改回退式) | 消费点改 `oc._perfect_hit_false -= 1` | 红 ✅ | 「计数纯净:首次标错 _perfect_hit_false 落 1 未被回退改写(契约 2)」 | -| 限次 | 行 `when` 的 `lt 1` 改 `lt 99` | 红 ✅ | 「限次:第二次标错不获豁免(forgiven 恒 1)」 | -| 寿命域 | 行 `domain: battle` 改 `adventure` | **未红 ⚠️** | 本 rig 不可观测:`adventure` 域计数器在单测里由 `counters_seed({})` 起零,次战同样从 0 开始→与 `battle` 域表现相同。真正的差异面在 runner 的 `counters_export/seed` 跨战持久路径(需 MC 或 runner 级 rig)。**遗留读数义务**(见 §五-1) | -| 配额锚 | `rare: 7` 改回 `9` | 红 ✅ | 表加载失败→「数值表加载失败」(validate 硬断言在加载期即致命,符合「改总量=重裁」) | -| 电池出池 | kind 加回 `CURIO_KINDS` | 红 ✅ | 「出池词表:CURIO_KINDS 零两件」 | - -## 四、闸况与合回凭据 - -| 步骤 | 凭据 | -|---|---| -| 卡① 合回前重闸(全量档,两域) | worktree `g-plan2-iter31-c1-term` 回执 commit `2c5cece4`,domain=full,**all_green=true**,12 闸零新增红(含 05 渲染闸、11 对拍 check 绿、06/07/08/08c 文档四闸绿);主区合回 commit `4f953ce8` | -| 卡② 合回前重闸(全量档,两域) | worktree `g-plan2-iter31-c2-curio` 回执 commit `<待填>`,结果 `<待填>`;主区合回 commit `4f953ce8` | -| 合回后主区复跑 | `--editor --quit` 重刷类名缓存后 `run_all_gates.sh --code`:主区 `3e076e22` 复跑回执 **all_green=true**、无新增红;冒烟 1151 项 0 失败、单元 34 套全绿(卡② 合回后主区实态) | - -## 五、实机目检总清单(登记 07 的凭据面;真人检测只登记不阻塞) - -| # | 目检项 | 来源 | -|---|---|---| -| M1 | 商店界面货币显示「GP」,不再出现「金币」 | 卡① §7 | -| M2 | 图例/HUD 显示「封印/封印印记」,不再出现「插旗/旗」;板面单字字形现为「封」(代拍板 1) | 卡① §7 | -| M3 | 结算明细来源显示「封印命中/封印未中」 | 卡① §7 | -| M4 | 封印印记贴图(素材已改名 `seal_mark.png`)在 L1/L2/L3 三关均正常加载,非字形回退态 | 卡① R-1 甲案新增 | -| M5 | 完美保险专长卡面文案:「本场首次封印落空,不计入完美封印判定」,零「雷」字 | 卡② R5 | -| M6 | 三选一带不再出现同调电池/完美保险;稀有档仅剩 ap/rap/time_sand | 卡② R6 | -| M7 | 清图奖励的「完美第二份」在带完美保险专长时于首次标错后仍能拿到(订阅式豁免的实际观感) | 卡② R2 玩家面 | - -## 六、遗留读数义务与已知项 - -1. **卡② 寿命域变异不可由单测 rig 证红**(§三 第 4 行)——需 runner/MC 面补一次「adventure 域计数器跨战持久 vs battle 域清零」的对照读数,或在文档批确认该判据只由代码注释与装载面约束。未闭。 -2. **旧断点存档的 `battery_pending`/`echo_flags`/`smith_flags` 键**:Alpha 阶段按你裁定不做迁移;实机续玩旧档时该两族计数器归零,属预期。 -3. **`user://save.json` 全 worktree 共用导致探针假红**:本次实测把存档移开即全绿(六/七道闸均受影响)。已列反哺点 §六-C 归工具批候选。本批跑闸期间存档临时移开,收口时原样还原(备份件 `_save_json_backup_user_20261019.json`)。 -4. **卡片 §2 现状读数的两处不实**:卡① v1.4 已订正计数面;本批另实测发现卡片未列的落点共 8 处(`flag_pull_ap_cost`、大写 `COL_FLAG`/`CURSOR_FLAG`、`level_runner` 注入链、守卫禁字面量 2 处、README 英文历史注记、`smoke_all` 行数/牌库构成断言 4 处)——属卡片「发现未列落点按契约同步即可」口径,仍登记以便写卡段回看。 diff --git a/reports/需求卡片-代码术语刷新批-2026-10-18.md b/reports/需求卡片-代码术语刷新批-2026-10-18.md deleted file mode 100644 index 2f654c06..00000000 --- a/reports/需求卡片-代码术语刷新批-2026-10-18.md +++ /dev/null @@ -1,330 +0,0 @@ -# 需求卡片:代码术语刷新批(flag→seal+中文禁用词清扫) - -- 版本:**v1.4**(2026-10-18 卡片正确性复核批:§2 现状事实的命中数改为**可复现实测读数**——v1.x 沿用审计报告的计数在现行代码上无法复现,且总量低估约一倍、文件数少记 24 个;历史:v1.3 冲突修订批、v1.2 grilling Q4–Q8、v1.1 Q1–Q3) -- 来源: - - [06-待办清单](../design/gdd/06-待办清单.md)「代码术语刷新批——禁用词全库清扫+flag→seal 标识符重命名」(2026-10-18 登记,工程直入) - - 用户裁定(2026-10-18,记忆 `project-terminology-rulings-20261018.md`) - - 审计报告:[代码术语审计报告-2026-10-18](../design/research/代码术语审计报告-2026-10-18.md) -- 归属:全工程(排雷循环/战斗循环/冒险循环/呈现层/数据表/冒烟测试);术语权威=[术语表](../design/gdd/术语表.md) -- 排期:**已编入 roadmap 迭代 31**(2026-10-18 用户确认;卡片状态=已编入,开工门=U0) -- **设计前置声明**:本卡属**重构/工程债**类,凭 2026-10-18 用户裁定与审计报告代码级证据直接写卡,跳过设计轨。 -- **设计事实源**(req-card §2 三选一之③工程直入证据指认,2026-10-18 立规;v1.3 补声明):[代码术语审计报告-2026-10-18](../design/research/代码术语审计报告-2026-10-18.md)(已入库 HEAD)逐条 file:line + 06 条目「代码术语刷新批——禁用词全库清扫+flag→seal 标识符重命名(设计面=工程直入)」现状段。两处读数一致:`game/` 命中约 757 处(flag_ 270 处/29 个 .gd + 22 处 .tres;金币 116/插旗 210/雷格 109)。 - -## 1. 目标与完成定义 - -| 需求点 | 一句话 | -|---|---| -| **N1** | 代码标识符 flag_* 全族重命名为 seal_*(变量名、函数名、字典键、事件名、数据表字段、字符串值) | -| **N2** | .gd 注释与 UI 字符串中中文禁用词清扫:金币→GP、插旗→封印、雷格→危险格、惩罚格→危险格、旗(游戏概念)→封印印记 | -| **N3** | .tres 数据文件中中文禁用词清扫(display_name、desc、注释) | -| **N4** | game/README.md 同步 | - -**完成定义**:game/ 目录内全局搜索 `flag`(排除非游戏语境如 git flag)零命中;全局搜索「金币」「插旗」「雷格」「惩罚格」零命中(术语表对照行不在本卡范围);全量冒烟(smoke_all.gd)+单元测试(tests/run_all.gd)全绿,绿数与改前基线一致;`reports/` 三份产出物写齐(实现报告/代拍板追认单/反哺点清单)。 - -**文档面不在本卡完成定义内**(2026-10-17 req-card §6 改口径:代码实现批禁写 `design/` 整目录与根规则文件,唯一可写目录=`reports/`)——06 条目状态推进、术语表、entities.yaml、07 目检项一律列进 `reports/iter31-反哺点-<日期>.md`,由用户在会话中裁决后归文档批落文。 - -## 2. 现状事实(2026-10-18 代码级实查) - -### N1 · flag_* 标识符分布 - -**总量(v1.4 实测,2026-10-18,口径见下)**:`game/` 内含 `flag` 的文件 **57 个**(.gd 53 个 595 处 + .tres 4 个 22 处,合计 617 处);剔除假阳性 `size_flags_*` 70 处(19 个文件)与 `_fatal_flag` 4 处(1 个文件)后,**净待改 543 处、42 个文件**。 -复现命令(在 `game/` 目录):`grep -ro 'flag' --include=*.gd --include=*.tres . | wc -l`(总处数);净处数=逐文件 `grep -o 'flag'` 减 `grep -o 'size_flags[a-z_]*'` 减 `grep -o '_fatal_flag'` 再求和。 -> **v1.x 读数不可复现的订正说明**:原记载「~314 处(270 处 .gd + 22 处 .tres + 22 独立 flag 词)/29 个 .gd 文件」来自审计报告,其计数口径(疑为 `flag_` 前缀且不含注释内英文词)在现行代码上两种口径都对不上——单文件抽样:`minesweeper_rules.gd` 原记 18、`flag_` 前缀口径 18、`flag` 全口径 59;`smoke_all.gd` 原记 105、两种口径分别 136/157。**低估面约为实测的 1.9 倍,文件数少记 24 个**。§6 估时 ≈3.75d 是按旧读数定的,是否上调归编排段/用户(本卡不改估时)。完成判据不受影响——V1 本来就是「grep 零命中」,与计数无关。 - -**核心逻辑文件(v1.4 实测:净命中=`flag` 处数 − `size_flags_*` − `_fatal_flag`;降序,2026-10-18)**: - -| 文件 | 净命中 | 关键标识符 | -|---|---|---| -| smoke/smoke_all.gd | 156 | flag_place, flag_hit, flag_miss, flag_placed, _flag_consumed + 注释断言文本 | -| core/minesweeper_rules.gd | 59 | flag_place, has_flag, flag_range_free, _flag_miss_seen, was_flagged, dug_under_flag 载荷键(:300/:306/:313/:348) | -| smoke/ui_input_probe.gd | 40 | flag_place, flag_cell | -| core/settlement/grant_segment.gd | 38 | flag_hit, flag_miss, _flag_consumed, flag_settle, dug_under_flag(:30/:93) | -| core/battle_orchestrator.gd | 33 | flag_hit, flag_hit_premium, _flag_consumed | -| smoke/level_autoplay.gd | 30 | flag_placed, flag_hit, flag_miss | -| presentation/views/board_view.gd | 23 | tex_flag, has_flag, flag_cell | -| smoke/ui_click_probe.gd | 21 | **_flags_placed**(:22 声明+:263/:279/:287/:309/:330 等清空点)——v1.3 的 T5.4 只记了「注释插旗 3 处」,漏了 18 处标识符 | -| data/tables/feats.tres | 15 | "flag_hit"(on 触发), "echo_flags", "smith_flags", "flag_burst"(feat_id), "dug_under_flag"(fact) | -| core/effect_engine.gd | 15 | `EVENTS` 含 flag_hit(:13)、flag_missed(:15);`MINE_EVENTS` 含 flag_hit、flag_settle(:20);**`FACTS` 含 flags_count(:51)与 dug_under_flag(:52)**——v1.3 的 T3.1 漏了 FACTS 两键;天赋树合成行 `{"on": "flag_missed"}`(:149、:152) | -| smoke/adventure_monte_carlo.gd | 14 | flag_placed, flag_hit, flag_miss(MC 输出键源) | -| smoke/auto_player.gd | 13 | flag_place 调用+注释「雷格」 | -| presentation/views/battle_end_overlay.gd | 11 | flag_hit, flag_miss 统计显示 | - -**净命中 >0 的文件共 42 个**(其余 15 个含 `flag` 的文件只有 `size_flags_*`/`_fatal_flag` 假阳性)。上表列 13 个,余 29 个净 1–8 处,其中 **v1.3 任务卡完全未列的 5 个**(v1.4 已补进 T5.20–T5.24):`smoke/screen_flow_probe.gd` 8(`_screen_flags`/`_flags_text`/`_expect_adventure_flag`)、`tests/unit/core/effect_words_t1_test.gd` 2(**断言 `FACTS.has("dug_under_flag")`——不改必红**)、`smoke/ui_probe.gd` 2、`smoke/type_glow_shot_probe.gd` 2(`kind == "flag"`/`op = "flag_place"`)、`smoke/fx_probe.gd` 2(`flag_dots` 键)。 - -**数据表字段(.tres 键名,改动必须与 schema .gd 同步)**: - -| 文件 | 字段 | 改后 | -|---|---|---| -| action_economy.tres:9 | `flag_place_ap_cost = 1` | `seal_place_ap_cost = 1` | -| settlement.tres:9 | `flag_hit_premium = 125` | `seal_hit_premium = 125` | -| settlement.tres:13 | `"flag_hit": "标中旗"` | `"seal_hit": "封印命中"` | -| settlement.tres:18 | `"flag_miss": "标旗未中"` | `"seal_miss": "封印未中"` | -| feats.tres:257,305,320,328,352,806,844 | `"on": "flag_hit"` | `"on": "seal_hit"` | -| feats.tres:260,269,285,292 | `"echo_flags"` | `"echo_seals"` | -| feats.tres:323,332 | `"smith_flags"` | `"smith_seals"` | -| feats.tres:838 | `"feat_id": "flag_burst"` | `"feat_id": "seal_burst"` | -| feats.tres:615 | `"fact": "dug_under_flag"` | `"fact": "dug_under_seal"` | -| treasure_items.tres:223 | `"flag_range_free"` | `"seal_range_free"` | - -**Schema 校验文件(.gd 中读 .tres 键名的代码)**: - -| 文件 | 涉及 | -|---|---| -| data/schemas/action_economy_table.gd | 读 flag_place_ap_cost(4 处) | -| data/schemas/settlement_table.gd | 读 flag_hit_premium(3 处) | -| data/schemas/treasure_item_table.gd | 读 flag_range_free(3 处) | -| core/action_economy.gd | "flag_place" 事件名(2 处) | -| core/config_db_cross_validator.gd | required_sources 含 "flag_hit", "flag_miss"(2 处) | - -**Godot 信号声明(API 契约,连接方必须同名)**: - -| 文件 | 声明/连接 | 改后 | -|---|---|---| -| core/minesweeper_rules.gd:9 | `signal flag_judged(evt: Dictionary)` | `signal seal_judged(evt: Dictionary)` | -| core/battle_orchestrator.gd:287 | `minesweeper.flag_judged.connect(_on_flag_judged)` | `minesweeper.seal_judged.connect(_on_seal_judged)` | - -**已知假阳性(显式排除,不改)**: - -| 文件 | 标识符 | 原因 | -|---|---|---| -| **`game/` 内 19 个 .gd 文件全体**(v1.4 订正:v1.3 只写了 ui_assembler.gd 一个,漏 18 个) | `size_flags_*`(含 `size_flags_vertical`/`size_flags_horizontal`/`size_flags_stretch_ratio`,共 70 处) | Godot 引擎 Control 内置属性与布局写法,禁改 | -| core/config_db.gd | `_fatal_flag`(4 处) | 无关变量(致命错误标记),禁改 | -| presentation/views/ui_assembler.gd:203 | 注释里的「min/flags」字样 1 处 | **不是豁免项,须改写注释**(v1.4 订正)——V1 判据是「grep `flag` 零命中减两类假阳性」,这处注释既非 `size_flags_*` 也非 `_fatal_flag`,不改写则 V1 永远红一项。改法:把「0=不设 min/flags」写成「0=不设最小宽度」 | - -**存档影响面(Alpha 阶段可接受作废,不做迁移)**: - -| 持久化路径 | 涉及键 | 影响 | -|---|---|---| -| save.json → breakpoint.adventure_counters | `"echo_flags"`, `"smith_flags"` | 旧档计数器失效,Alpha 阶段可接受(2026-10-18 用户裁定) | - -### N2 · 中文禁用词分布(v1.4 实测,`game/` 内 .gd+.tres,2026-10-18) - -| 禁用词 | 实测处数/行数/文件数 | 主要落点(实测 top 3 文件) | -|---|---|---| -| 金币 | 39 / 36 / 16 | smoke_all 10、shop_overlay_view 5、camp_shop_presenter 3(+battle_narrator 2、curio_pick_overlay 2、legend_overlay 1 等 UI 字符串) | -| 插旗 | 62 / 60 / 23 | smoke_all 14、grant_segment 6、**tests/unit/core/minesweeper_rules_test.gd 4**(v1.3 误记为 minesweeper_rules.gd 4) | -| 雷格 | 75 / 70 / 19 | smoke_all 31、battle_orchestrator 11、minesweeper_rules 5(+grant_segment、board_generator、测试断言文本) | -| 惩罚格 | 1 / 1 / 1 | treasure_items.gd 注释(v1.3 记 ~2 处,实为 1) | -| 旗(含复合词) | **376 / 285 / 50** | 内已含 插旗 62、标中旗 21、标旗 20;其余为注释里的「旗格/旗判定/旗溢价/旧板旗/无旗/拔旗/旗经济」等散句,v1.3 记 ~15 处严重低估——但落点几乎全是注释与断言描述文本,按 §9 代拍板白名单第 1、3 条语义等价改写即可,不需逐条请示 | - -### N3 · .tres 中文禁用词 - -| 文件 | 命中 | -|---|---| -| reward.tres:188 | `"display_name": "金币袋"` | -| reward.tres 注释 | 金币袋、雷格(~5 处) | -| feats.tres:10-11 | 注释含「插旗=封印」「禁『雷/插旗』字面」 | -| treasure_items.tres:212 | `"desc": "插旗不限相邻(可对任何未开格插旗)"` | -| settlement.tres:13,18 | `"标中旗"` / `"标旗未中"` | -| action_economy.tres:18 | 注释含「雷格」 | -| status_effects.tres:96 | 注释含「雷格」 | - -### N4 · game/README.md - -雷格 8 处、插旗 1 处,均为架构说明注释。 - -### 关联面(本卡不动) - -- design/ 目录文档面(另批委派处理) -- tools/*.py 中的「雷格」(analyze_playtest.py 1 处、render_sample_sheet*.py 6 处)——归文档批或工具批 -- sim-data/analyze.py(1 处雷格)——同上 -- 术语表自身修正——归文档批 - -## 3. 设计契约(红线,违反=L3 停机呈报) - -- 🔴 **游戏行为零变化**:本批是纯重命名/文本替换,禁止改动任何游戏逻辑、数值、权重、条件判断。改前改后同种子冒烟读数必须逐位一致。 -- 🔴 **.tres 键名与 schema .gd 必须同批同步**:改 settlement.tres 的 `flag_hit_premium` 必须同批改 settlement_table.gd 里读它的代码,否则数据加载失败。 -- 🔴 **事件名字符串全链一致**:`"flag_hit"` 作为事件名贯穿 effect_engine.gd EVENTS 常量 → grant_segment.gd 发射 → feats.tres `"on"` 触发 → config_db_cross_validator.gd 校验 → battle_log_view.gd 呈现。改一处必须全链同步。 -- 🔴 **Godot 信号声明与连接同名**:`signal flag_judged`(minesweeper_rules.gd:9)→ `seal_judged`;连接方 `battle_orchestrator.gd:287` 的 `.connect(_on_flag_judged)` → `.connect(_on_seal_judged)`;回调函数名同步。 -- 🔴 **冒烟断言文本同步**:smoke_all.gd 中 check() 的描述字符串含「雷格」「插旗」「金币」的,随批替换;断言逻辑(数值、条件)零改动。 -- 🔴 **显式排除清单(假阳性)**:`size_flags_vertical` / `size_flags_horizontal` / `size_flags_stretch_ratio`(Godot 引擎 Control 属性,ui_assembler.gd)与 `_fatal_flag`(config_db.gd 无关变量)**不在重命名范围**,盲替换命中即 L3。 -- 🔴 **本批不保证旧存档兼容**:`echo_flags` / `smith_flags` 等 counter_id 持久化在 save.json 的 `breakpoint.adventure_counters` 中,重命名后旧档该键失效。Alpha 阶段可接受存档作废,不做迁移逻辑(2026-10-18 用户裁定)。 -- 🔴 **不改 design/ 目录**:实现批禁写 design/(process-conventions §3 第 13 条)。 -- 🔴 **不改 tools/*.py**:工具脚本归文档批。 -- 🔴 **FACTS 两键全链同步(v1.4 补,v1.3 完全漏列)**:`flags_count`→`seals_count` 三处落点(`core/effect_engine.gd:51` 词表、`core/battle_orchestrator.gd:180` 载荷、`core/settlement/grant_segment.gd:179` 发射);`dug_under_flag`→`dug_under_seal` 十一处落点(`effect_engine.gd:47/:52`、`minesweeper_rules.gd:300/:306/:313/:348`、`grant_segment.gd:30/:88/:93`、`data/tables/feats.tres:615`、`smoke/smoke_all.gd:1559/:1560`、`tests/unit/core/effect_words_t1_test.gd:18/:21`)。改词表不改消费者=运行期取不到事实值;改消费者不改词表=加载期四词表校验致命。两名现行代码零占用(实测 `seals_count`/`dug_under_seal` 各 0 命中),无重名风险。 -- 🔴 **非游戏语境的 flag 不动**:如 `git flag`、编译标志等(实查 game/ 内无此情况,但作为纪律登记)。 -- 🔴 **与卡② 的命名接续(2026-10-18 用户补裁,v1.3 新增)**:本卡合回后,卡②(凭证件裁削批)新写的标识符一律 `seal_` 族——其效果类型名 `forgive_flag_miss` 已由同日补裁换代为 **`forgive_seal_miss`**,事件订阅写 `on: "seal_missed"`。故本卡的 V1「`flag` 零命中」在迭代 31 出口仍成立,不需要为卡② 打排除补丁。本卡执行时 `flag_missed` 必须一并改名为 `seal_missed`(原 v1.2 映射表漏列,v1.3 补入 T3.1)。 - -## 4. 范围边界 - -**做**: - -- game/ 目录内全部 .gd、.tres、.md 文件的 flag→seal 重命名与中文禁用词替换 -- 替换后全量冒烟+单元测试验证 - -**不做(去向)**: - -| 不做的 | 去向 | -|---|---| -| design/ 全部文档 | 文档批(用户委派另会话) | -| tools/*.py | 文档批或工具批 | -| sim-data/ | 同上 | -| 术语表自身修正 | 文档批 | -| 游戏逻辑/数值改动 | 禁止(本批纯重命名) | -| doc_term_audit.py 词表扩充与扫描域扩展 | 文档批(T5) | - -## 5. 关联文档同步面 - -> **口径(v1.3,2026-10-17 起生效)**:本批禁写 `design/` 整目录与根规则文件,唯一可写目录=`reports/`。下表凡标「反哺点」者=把「哪个文件哪一节、改成什么、依据是什么」写进 `reports/iter31-反哺点-<日期>.md`,由用户裁决后归文档批落文;本批一律不落笔 `design/`。v1.2 及以前的「机械面随批」措辞作废。 - -| 文档 | 关联点 | 同步义务 | -|---|---|---| -| [06-待办清单](../design/gdd/06-待办清单.md) | 「代码术语刷新批」条目状态推进为「已完成(迭代 31 卡①,合并 ``,2026-10-XX)」 | **反哺点**(`design/` 内,本批禁写):推进句写进 `reports/iter31-反哺点清单`,文档批落笔后本条清掉 | -| [术语表](../design/gdd/术语表.md) | flag→seal 重命名后,术语表「旗/控制」条目需同步改为「封印/控制」 | **反哺点**:文档批处理,本卡不改 design/ | -| [entities.yaml](../design/registry/entities.yaml) | 第 268 行「机制键与规则(flag_place/flag_rules/标中旗三向效果)全不变,纯呈现层命名」+source_label_map 键集标注「结构冻结」——代码批执行后此条款失效,需解冻并换代为 seal_* | **反哺点**:文档批需显式废止「结构冻结」条款、将 flag_* 契约键全部换代为 seal_*。窗口期(代码已改、registry 未改)可接受——registry 非运行时依赖(2026-10-18 grilling Q4 裁定) | -| game/README.md | 架构说明中雷格/插旗 | **本批直改**(文件在 `game/` 内,不属 `design/` 禁写面)——随批替换 | -| game/tests/evidence/parity/anchor.json | MC 输出基线含 ~600 处 flag_* 键(flag_hit/flag_hit_gain/flag_miss/flag_miss_penalty/flag_placed/flag_burst) | **本批直改**(在 `game/` 内):手动替换键名(行为零变化故不重跑 MC),替换后跑 parity 闸确认绿 | -| [07-体验验证清单](../design/gdd/07-体验验证清单.md) | UI 文本换代后目检项 | **反哺点**:登记「商店/图例/HUD 文本是否显示 GP/封印而非金币/插旗」目检项,文档批落 | - -## 6. 任务卡 - -### T0 · 基线记录(≈10min) - -1. 跑全量冒烟(smoke_all.gd),记录绿数基线。 -2. 跑单元测试(tests/run_all.gd),记录套数与绿数。 -3. 记录当前 game/ 内 `flag` 总命中数(grep 计数,作为改后零残留的对照)。 - -### T1 · .tres 数据文件重命名(≈0.5d) - -先改数据层(被 .gd 读取的源头),再改 .gd 消费侧,避免中间态加载失败。 - -1. action_economy.tres:`flag_place_ap_cost` → `seal_place_ap_cost`;注释中「雷格」→「危险格」 -2. settlement.tres:`flag_hit_premium` → `seal_hit_premium`;`"flag_hit": "标中旗"` → `"seal_hit": "封印命中"`;`"flag_miss": "标旗未中"` → `"seal_miss": "封印未中"`;注释中「雷格」→「危险格」 -3. feats.tres:全部 `"on": "flag_hit"` → `"on": "seal_hit"`;`echo_flags` → `echo_seals`;`smith_flags` → `smith_seals`;`flag_burst` → `seal_burst`;`dug_under_flag` → `dug_under_seal`;注释中「插旗」→「封印」 -4. treasure_items.tres:`flag_range_free` → `seal_range_free`;desc「插旗不限相邻(可对任何未开格插旗)」→「封印不限相邻(可对任何未开格封印)」 -5. reward.tres:`"display_name": "金币袋"` → `"display_name": "GP 袋"`;注释中「金币袋」「雷格」替换 -6. status_effects.tres:注释中「雷格」→「危险格」 - -### T2 · Schema .gd 同步(≈0.25d) - -与 T1 同批完成(.tres 键名改了,读它的 schema 必须同步): - -1. action_economy_table.gd:flag_place_ap_cost → seal_place_ap_cost(4 处) -2. settlement_table.gd:flag_hit_premium → seal_hit_premium(3 处) -3. treasure_item_table.gd:flag_range_free → seal_range_free(3 处) -4. reward_table.gd:注释中「雷格」→「危险格」 - -### T3 · 核心逻辑 .gd 重命名(≈1d) - -按依赖序改(底层→上层): - -1. core/effect_engine.gd:EVENTS/MINE_EVENTS 常量 "flag_hit"→"seal_hit", "flag_settle"→"seal_settle", **"flag_missed"→"seal_missed"**;**FACTS 两键:"flags_count"→"seals_count"(:51)、"dug_under_flag"→"dug_under_seal"(:52)**(v1.4 补——v1.3 的 T3.1 漏了 FACTS,改了 .tres 的 fact 值而词表不放行=加载期校验致命);天赋树合成行 :149/:152 的 `{"on": "flag_missed"}` 同步改名;头注 :9 文本随批(净 15 处,以 V1 grep 零命中为准) -2. core/minesweeper_rules.gd:flag_place→seal_place, has_flag→has_seal, flag_range_free→seal_range_free, _flag_miss_seen→_seal_miss_seen(18 处)+注释中「插旗」「雷格」替换 -3. core/action_economy.gd:"flag_place"→"seal_place"(2 处) -4. core/battle_orchestrator.gd:flag_hit→seal_hit, flag_hit_premium→seal_hit_premium, _flag_consumed→_seal_consumed(17 处)+注释替换 -5. core/settlement/grant_segment.gd:flag_hit→seal_hit, flag_miss→seal_miss, _flag_consumed→_seal_consumed(23 处)+注释中「插旗」「雷格」替换 -6. core/config_db_cross_validator.gd:required_sources 中 "flag_hit"→"seal_hit", "flag_miss"→"seal_miss"(2 处)+注释「雷格」 -7. core/reward_economy.gd:注释「雷格」→「危险格」 -8. core/board_generator.gd:注释「雷格」→「危险格」 -9. core/treasure_items.gd:注释「插旗」「惩罚格」替换 - -### T4 · 呈现层 .gd 重命名+UI 字符串(≈0.5d) - -1. presentation/views/board_view.gd:tex_flag→tex_seal, has_flag→has_seal, flag_cell→seal_cell(7 处)+注释 -2. presentation/views/board_cell_unit.gd:tex_flag→tex_seal(2 处)+注释「插旗」「雷格」 -3. presentation/views/shop_overlay_view.gd:UI 字符串「金币」→「GP」(5 处) -4. presentation/camp_shop_presenter.gd:「金币不足」→「GP 不足」(3 处) -5. presentation/curio_interact_controller.gd:「金币不足」→「GP 不足」(1 处) -6. presentation/battle_narrator.gd:「金币」→「GP」(2 处) -7. presentation/views/curio_pick_overlay.gd:「金币」→「GP」(2 处) -8. presentation/views/legend_overlay.gd:「金=金币」→「金=GP」;「右键插旗」→「右键封印」;「旗」→「封印印记」(3 处) -9. presentation/hud_presenter.gd:「不能插旗:此格已有旗」→「不能封印:此格已有封印印记」(1 处) -10. presentation/main.gd:「插旗后轮末自动判定标中」→「封印后轮末自动判定」(2 处)+注释 -11. presentation/views/battle_log_view.gd:"flag_miss"→"seal_miss"(1 处)+注释「金币」 -12. presentation/views/battle_end_overlay.gd:flag_hit/flag_miss 统计键(9 处) -13. presentation/views/ui_kit.gd:注释「金币」「插旗」「雷格」+TEX_ICON_COINBAG 注释 -14. presentation/views/level_map_screen.gd:注释「金币」 -15. presentation/views/board_fx_view.gd:flag 相关(1 处) -16. presentation/views/standee_body.gd:flag 相关(1 处) -17. presentation/row_pacer.gd:"flag_hit"→"seal_hit"(2 处) -18. presentation/views/status_slot_row.gd:flag 相关(1 处) - -### T5 · 冒烟与测试 .gd 重命名(≈1d) - -1. smoke/smoke_all.gd:105 处 flag_ 替换+注释/断言文本中「金币」「插旗」「雷格」替换(~50 处) -2. smoke/level_autoplay.gd:16 处 flag_ +注释「插旗」 -3. smoke/ui_input_probe.gd:23 处 flag_ +注释「插旗」 -4. smoke/ui_click_probe.gd:净 21 处——`_flags_placed` 声明(:22)+各清空点(:263/:279/:287/:309/:330 等)改名 `_seals_placed` +注释「插旗」3 处(v1.4 订正:v1.3 只记了注释,漏 18 处标识符) -5. smoke/adventure_monte_carlo.gd:5 处 flag_ +注释 -6. smoke/auto_player.gd:注释「雷格」(4 处) -7. smoke/fx_shot_probe.gd:注释「插旗」(1 处) -8. smoke/board_shot_probe.gd:"flag_place"→"seal_place"(1 处) -9. smoke/ui_contrast_probe.gd:注释「金币」(1 处) -10. tests/unit/core/minesweeper_rules_test.gd:flag 相关(5 处)+「插旗」 -11. tests/unit/core/board_generator_test.gd:「雷格」(1 处) -12. tests/unit/core/treasure_effects_test.gd:flag 相关(3 处)+「插旗」 -13. tests/unit/core/feat_vouchers_test.gd:「金币」(1 处) -14. tests/unit/presentation/hud_presenter_test.gd:「插旗」(1 处) -15. tests/unit/presentation/reward_overlay_test.gd:「金币」(2 处) -16. tests/unit/core/tree_rules_v11_test.gd:flag 相关(2 处) -17. tests/unit/core/treasure_items_test.gd:flag 相关(1 处) -18. tests/run_all.gd:注释「插旗」(1 处) -19. tests/smoke/critical-paths.md:「雷格」「插旗」(2 处) -20. **smoke/screen_flow_probe.gd:净 8 处(v1.4 补列,v1.3 全漏)**——`_screen_flags()`(:50)、`_flags_text()`(:59)、`_expect_adventure_flag()`(:68)三函数改名 + 调用点(:75/:83/:91 等)。注意:本件是 L3 屏壳探针,受 `user://save.json` 断点污染的在册已知项,跑红先按该条排查再判归因 -21. **tests/unit/core/effect_words_t1_test.gd:净 2 处(v1.4 补列)**——断言 `FACTS.has("dug_under_flag")`(:18)与描述文本(:21)须随 FACTS 词表改 `dug_under_seal`,**不改即红**(与 §3 FACTS 全链契约同批) -22. **smoke/ui_probe.gd:净 2 处(v1.4 补列)**——数据行里的 flag 族键/字符串(:179 附近),逐处改名 -23. **smoke/type_glow_shot_probe.gd:净 2 处(v1.4 补列)**——`kind == "flag"`(:60)与 `op = "flag_place"`(:61) -24. **smoke/fx_probe.gd:净 2 处(v1.4 补列)**——`flag_dots` 键(:64/:65)须与发射端同名改 - -**余下 29 个净 1–8 处的文件不逐列**(净处数总和 543,V1 的 grep 零命中判据即兜网):施工期每轮以「净命中文件数递减、终态 42→0」为进度读数,发现卡片未列的落点属正常,按 §3 契约同步即可,不属卡片缺陷。 - -### T6 · game/README.md+anchor.json+全量验证(≈0.5d) - -1. game/README.md:雷格(8 处)→危险格、插旗(1 处)→封印 -2. game/tests/evidence/parity/anchor.json:手动替换全部 flag_* 键名为 seal_*(~600 处:flag_hit→seal_hit, flag_hit_gain→seal_hit_gain, flag_miss→seal_miss, flag_miss_penalty→seal_miss_penalty, flag_placed→seal_placed, flag_burst→seal_burst) -3. 全量冒烟+单元测试,绿数与 T0 基线一致 -4. parity 闸跑通(anchor.json 键名替换后与 MC 新输出一致) -5. 全局搜索验证:game/ 内 `flag`(排除 size_flags_* 和 _fatal_flag)零命中;「金币」「插旗」「雷格」「惩罚格」零命中 -6. **产出物落位卡**(req-card §7:末卡必含):`reports/` 三份写齐——`iter31-实现报告-<日期>.md`(含 V1–V7 读数+改前改后同种子读数对照+实机目检总清单)、`iter31-代拍板-<日期>.md`、`iter31-反哺点-<日期>.md`(§5 每条反哺点都要有落点:06 推进句/术语表/entities.yaml/07 目检项)。**禁改 `design/` 与 `roadmap.md`** - -**估时合计 ≈3.75d**(v1.4 注:实测面约为 v1.3 旧读数的 1.9 倍(净 543 处/42 文件 vs 原记 ~314 处/29 文件),但落点高度集中在 `smoke_all.gd`(净 156 处=全集 29%),改动是机械替换+grep 兜网。**2026-10-18 用户裁:不上调**,估时保持 ≈3.75d;roadmap 迭代 31 行预计周期同步维持「≈1.5 周」不变)。 - -## 7. 验证闸(逐需求点验收清单) - -**能力验证(自动化,随批)**: - -- **V1(N1)**:改后全局 grep `flag` game/ 目录,排除 `size_flags_*` 和 `_fatal_flag` 后零命中。 -- **V2(N1)**:全量冒烟绿数 == T0 基线(行为零变化证词)。 -- **V3(N1)**:单元测试绿数 == T0 基线。 -- **V4(N2/N3)**:改后全局 grep「金币」「插旗」「雷格」「惩罚格」game/ 目录零命中。 -- **V5(N2)**:settlement.tres 的 source_class 显示名不含「旗」字(「封印命中」「封印未中」)。 -- **V6(回归)**:同种子冒烟读数逐位一致(纯重命名不改行为的最强证词)。 -- **V7(parity)**:anchor.json 键名替换后 parity 闸绿(MC 输出与基线逐位一致)。 - -**正常流程体验(用户目检,登记 07 不阻塞)**: - -1. 商店界面显示「GP」而非「金币」。 -2. 图例/HUD 显示「封印」而非「插旗」「旗」。 -3. 结算明细来源显示「封印命中」而非「标中旗」。 - -## 8. 异常分级 - -- **L1(自救)**:单个文件漏改导致 grep 验证未过——补改即修,不改批结构。 -- **L2(记录继续)**:冒烟绿数与基线偏差 ≤2(断言文本替换引起的描述性变化,非逻辑变化)——记录偏差原因,确认非逻辑回归后继续。 -- **L3(停机呈报)**:冒烟绿数下降 >2 或出现逻辑断言红(说明重命名触及了行为);.tres 加载失败(schema 不同步);同种子读数不一致(行为变化)。 - -## 9. 代拍板白名单(超清单必呈报) - -1. 注释替换时的措辞微调(如「挖雷格」→「挖危险格」vs「挖掘危险格」)——语义等价即可,不必逐条请示。 -2. seal_* 的具体拼写形态(如 `_seal_consumed` vs `_consumed_seals`)——与 flag_* 原形态保持同构即可。 -3. 测试断言描述文本的替换措辞——语义等价即可。 -4. settlement.tres 显示名「封印命中」「封印未中」的具体措辞——若用户有异议呈报。 - -## 10. 待裁点 - -**零待裁点,开工门=U0。** Q1–Q3 于 2026-10-18 用户令「按推荐来」全裁;Q4–Q8 于同日 grilling 复核后用户裁定落定: - -| # | 裁定 | 落定结论 | -|---|---|---| -| Q1 | reward.tres display_name | **GP 袋**(金币袋→GP 袋) | -| Q2 | settlement.tres 显示名 | **封印命中 / 封印未中**(标中旗→封印命中、标旗未中→封印未中) | -| Q3 | feats.tres feat_id | **seal_burst**(flag_burst→seal_burst) | -| Q4 | 存档兼容 | **不做迁移,Alpha 阶段旧存档可作废**(echo_flags/smith_flags 计数器失效可接受) | -| Q5 | anchor.json 处理 | **手动替换键名**(行为零变化不重跑 MC),替换后跑 parity 闸确认绿 | -| Q6 | 假阳性排除 | **显式排除清单入红线**:size_flags_*(Godot 引擎属性)、_fatal_flag(config_db 无关变量) | -| Q7 | registry 契约窗口期 | **可接受**(registry 非运行时依赖;文档批紧随其后;entities.yaml「结构冻结」条款标注为反哺点,文档批需显式废止并换代) | -| Q8 | 信号声明补全 | **signal flag_judged → seal_judged 显式入映射表**(Godot 信号=API 契约,连接方必须同名) | - ---- - -**卡片成立前置**:~~grilling 复核门~~(2026-10-18 已过,Q4–Q8 全裁)+~~用户卡审~~(2026-10-18 已过,用户确认编入迭代 31)。 diff --git a/reports/需求卡片-凭证件裁削批-2026-10-18.md b/reports/需求卡片-凭证件裁削批-2026-10-18.md deleted file mode 100644 index eaec4a59..00000000 --- a/reports/需求卡片-凭证件裁削批-2026-10-18.md +++ /dev/null @@ -1,216 +0,0 @@ -# 需求卡片·凭证件裁削批(代码侧迁移) - -- **批次名**:凭证件裁削批(代码侧) -- **日期**:2026-10-18 -- **批次性质**:工程债/错置修正(凭 06 在册条目直接写卡;设计已于同日文档批在奇物.md v3.18 定稿) -- **设计事实源**(req-card §2 三选一之①GDD 文档节+版本号,2026-10-18 立规;v1.1 补声明):`design/gdd/systems/冒险循环/奇物.md` **v3.18**(删件/迁出/配额净删三段定稿)。**前置门见 §10**。 -- **标识符形态通则(v1.1,2026-10-18 用户补裁)**:本卡成文于卡① 之前。凡卡① 改名范围内的标识符(`flag_hit`/`flag_miss`/`flag_missed`/`flag_settle`/`flag_judged`),本卡 §2 现状事实的旧名与行号**按卡① 合回后的 `seal_` 形态**复核执行,不逐处更新旧名;本卡新写的标识符一律 `seal_` 族——效果类型名取 **`forgive_seal_miss`**(取代 D1 原裁 `forgive_flag_miss`),feats.tres 触发行写 `on: "seal_missed"`。 -- **版本**:**v1.1**(2026-10-18 卡片冲突修订批:补设计事实源与标识符形态通则;D1 换代为 `forgive_seal_miss`;契约 3/8 订正;§5/§6 文档同步义务改为 `reports/` 反哺点清单;§10 补前置门。原 v1.0=2026-10-18 立卡) -- **迭代归属**:迭代 31 第二张卡(与卡①「代码术语刷新批」串行) -- **上游依据**:用户 2026-10-18 逐裁四项——①同调电池**删除**;②完美保险**改归专长**、语义档=**甲(每战首次封印落空豁免)**;③desc 用 A「本场首次封印落空,不计入完美封印判定」;④寿命域**本批不动**、完美保险按现役 `domain=battle` 落地;配额处置=**净删**(rare 9→7/总量 104→102) - ---- - -## 1. 目标与完成定义 - -**目标**:把用户 10-18 两项裁断落到代码与数据表——同调电池自奇物体系整体删除、完美保险自资源类迁入专长表并按订阅式重写——同时完成 `TIER_QUOTAS` 结构锚的重裁落地。 - -**完成定义**(全部满足才算完): - -1. `CURIO_KINDS` 不再含 `attune_battery`/`perfect_insurance`,两件在三选一池不可再出现; -2. 同调电池的 runner 侧全部入口(待分配账、玩家点选函数、getter、断点键)清零,无孤儿引用; -3. `feats.tres` 增完美保险专长行,四词表校验通过,效果引擎装载并可派发; -4. 完美排雷判定改为「误标总数 − 豁免数」两账相减式,`_perfect_hit_false` 保持纯净、不被任何效果改写; -5. `TIER_QUOTAS` rare 9→7、总量 104→102,`validate()` 硬断言通过; -6. 代码域闸全绿(冒烟+单元测试+场景探针+改前改后读数对拍)+`reports/` 三份产出物写齐(实现报告/代拍板追认单/反哺点清单)。**文档面(奇物.md 指针销号、entities.yaml 104→102、07 观测项、roadmap 行)不在本条完成定义内**——实现批禁写 `design/` 与根规则文件,一律列进反哺点清单归文档批落笔(v1.1 订正,原句「机械面文档同步完毕」属 2026-10-17 改口径前的旧措辞)。 - ---- - -## 2. 现状事实(代码级,开工自行复核) - -### 2.1 同调电池(待删) - -| 位置 | 事实 | -|---|---| -| `game/data/schemas/adventure_table.gd:21-22` | `CURIO_KINDS` 含 `"attune_battery"` | -| `adventure_table.gd:59` | `curio_quota_attune_battery_rare = 1`(rare 档投放) | -| `adventure_table.gd:76` | `curio_value_attune_battery_rare = 1`(充能 +N) | -| `adventure_table.gd:91` | `curio_cap_attune_battery = 99` | -| `adventure_table.gd:138` | 配额分发表分支 `["attune_battery", TIER_RARE]` | -| `adventure_table.gd:159` | 件值分发表分支 | -| `adventure_table.gd:176` | cap 分发表分支 | -| `game/core/adventure_runner.gd:55` | `_battery_pending`(冒险级待分配充能) | -| `adventure_runner.gd:213` | 断点回填 `battery_pending` 键 | -| `adventure_runner.gd:261` | 冒险开局重置 | -| `adventure_runner.gd:415-417` | `_apply_curio_pick` 路由分支 | -| `adventure_runner.gd:598-610` | `choose_battery_target(item_id)`——玩家点选分配 | -| `adventure_runner.gd:615-616` | `battery_pending()` getter | -| `adventure_runner.gd:1076` | 断点存档键 `"battery_pending"` | -| `game/tests/unit/core/feat_vouchers_test.gd:56-64` | V9-5 断言组(兑付受理/待分配 1/禁自动替选反例/跨层写账) | - -**关键事实**:`choose_battery_target` 的调用方只有定义自身、getter、单元测试与断点键——**呈现层零接线**(全库检索 `battery`/电池在 presentation 层零命中)。玩家拿到电池后 `_battery_pending` 挂着花不出去,且随断点一直挂下去。它不是「零途径所以撤」,而是「有 API 有账本有测试、唯独没有玩家入口」。 - -### 2.2 完美保险(待迁专长) - -| 位置 | 事实 | -|---|---| -| `adventure_table.gd:21-22` | `CURIO_KINDS` 含 `"perfect_insurance"` | -| `adventure_table.gd:61` | `curio_quota_perfect_insurance_rare = 1` | -| `adventure_table.gd:78` | `curio_value_perfect_insurance_rare = 1` | -| `adventure_table.gd:93` | `curio_cap_perfect_insurance = 99` | -| `adventure_table.gd:140`/`:161`/`:178` | 配额/件值/cap 三处分发表分支 | -| `adventure_runner.gd:57` | `_pending_insurance`(节点级,下一战标错豁免 N 次) | -| `adventure_runner.gd:263` | 冒险开局重置 | -| `adventure_runner.gd:423-425` | `_apply_curio_pick` 路由分支 | -| `adventure_runner.gd:920-923` | 战首 `set_voucher_grants(...)` 注入后清零 | -| `game/core/battle_orchestrator.gd:81` | `_fx_insurance`(本战标错豁免余量) | -| `battle_orchestrator.gd:422` | `_fx_insurance = enc.get("voucher_insurance", 0)` | -| `battle_orchestrator.gd:266-267` | `_perfect_hit_true`/`_perfect_hit_false`(板级计数,install 重置) | -| `battle_orchestrator.gd:471-472` | install 重置点 | -| `game/core/settlement/grant_segment.gd:295-308` | 标错时 `_perfect_hit_false += 1`;`_fx_insurance > 0` 则 `-=1` 且 `_perfect_hit_false -= 1`(回退)+归因行 | -| `grant_segment.gd:314` | `flag_missed` 事件发射(**晚于计分**) | -| `feat_vouchers_test.gd:52-53` | V9-4 断言(兑付受理/豁免待注入 1) | - -**判定式现状**:`_perfect_hit_false == 0 && _perfect_hit_true >= 1` → 完美成立(权威定义 `entities.yaml:254`:板级零误标 ∧ ≥1 标中 → 清图奖励当量 ×P_perfect,默认 ×2)。 - -### 2.3 配额结构锚 - -`adventure_table.gd:34`:`TIER_QUOTAS := {"common": 70, "excellent": 25, "rare": 9, "legendary": 0}`(总量 104)。现行分配:rare=ap 3+rap 2+attune_battery 1+time_sand 2+perfect_insurance 1=9。`:4`/`:30-33` 明载「改投放总量=重裁非调参,`validate()` 硬断言」。 - -### 2.4 效果引擎词表 - -`game/core/effect_engine.gd`:`EVENTS`(:13-16,已含 `flag_missed`,迭代 21 T3 扩签)/`EFFECT_KINDS`(:25-41,**现 31 项**,v1.1 订正——原记 30 项,无豁免型;本卡 T4 加 `forgive_seal_miss` 后为 32)/`FACTS`(:50-54,含 `counter`)/`OPS`(:61-62,含 `lt`)/`DO_KEYS`(:72-75,含 `domain`=battle/adventure)。四词表出域=加载期校验致命。 - ---- - -## 3. 设计契约(🔴 触碰=L3 停机呈报) - -1. 🔴 **`attune_charges` 账本与 `_seed_attune_charges` 禁删**(`adventure_runner.gd:29/:109/:201/:243/:559-564`)——迭代 11 秘宝基础设施(主动件充能每冒险重置)。本批只删奇物侧写它的入口,不碰账本本体。 -2. 🔴 **`_perfect_hit_false` 保持纯净**:任何效果不得改写该值。豁免必须走「自有累加计数 + 判定时相减」,即新增 `_perfect_forgiven` 单向累加,判定取 `effective_miss = _perfect_hit_false - _perfect_forgiven`。**禁止回退式(改别人的值)与拦截式(吞事件)**——两者均已由用户否决。 -3. 🔴 **`seal_missed` 事件照常发射**(卡① 合回前名 `flag_missed`——见顶部标识符形态通则),不得因本件改动改变发射时机或吞并事件,其它订阅方(危险直觉·守等)零感知。 -4. 🔴 **玩家面禁「雷」字**(奇物.md v3.15 命名纪律:插旗=封印、危险格风味=地下城陷阱/怪物巢穴)。本批新增的 `feats.tres` 行 desc 与任何 UI 字符串不得含「雷」。 -5. 🔴 **四词表封闭**:新增 effect kind 必须同步进 `EFFECT_KINDS` 并在解释器 switch 加分支,否则行校验致命。 -6. 🔴 **`domain=battle` 显式写出**:该行将是 `feats.tres` 首例 battle 域(现役 29 行全为 adventure 或不写),须在数据行与代码注释双处留痕,防止后来者误读为缺省。 -7. 🔴 **改总量=重裁**:`TIER_QUOTAS` 总量变动是结构锚。用户已裁「净删」(rare 9→7/总量 104→102),本批不得自行把令牌转给别件来保住总量。 -8. 🔴 **本批与迭代 31 卡①串行同迭代**(v1.1 订正实证陈述):卡① 改标识符与玩家面字符串。**字段集不重叠**(卡① 不动 `CURIO_KINDS`/`TIER_QUOTAS`/`curio_*`),但**文件集重叠**——`core/effect_engine.gd`(卡① 改 EVENTS/本卡 T4 加 EFFECT_KINDS+switch)、`core/settlement/grant_segment.gd`(卡① 改名/本卡 T4 改判定式)、`core/battle_orchestrator.gd`(卡① 改名/本卡 T3 删 `_fx_insurance`)。故**禁两卡并行开 worktree**;本卡必须在卡① 合回 master 后开工,开工前 `git merge master` 取卡① 成果并按顶部通则复核标识符名与行号。 - ---- - -## 4. 范围边界 - -**做**:上列 6 项完成定义内的全部代码与数据表改动、测试更新、`reports/` 三份产出物(实现报告/代拍板追认单/反哺点清单)。 - -**不做**(去向明确): - -| 不做的事 | 去向 | -|---|---| -| 计数器寿命域统一(三套机制并存问题) | 已在 06 登记「计数器寿命域未统一」,本批不动 | -| `entities.yaml:254`「完美排雷」内部术语改名 | 内部开发用语按 v3.15 纪律保留;仅玩家面用「完美封印」 | -| 冒记遗留两项(凭证归专长/资源=转换源判据句)的正式裁定与重写 | 06 已登记「冒记案遗留待裁两项」,等用户裁 | -| `shop.tres` 货架行、`feat_ticket` 体系 | 与本批无关,不碰 | -| 旧 27 件素材库表 | 不碰 | - ---- - -## 5. 关联文档同步面 - -> **口径(v1.1,2026-10-17 起生效)**:本批禁写 `design/` 整目录与根规则文件,唯一可写目录=`reports/`。凡标「反哺点」者=把「哪个文件哪一节、改成什么、依据是什么」写进 `reports/iter31-反哺点-<日期>.md`,由用户裁决后归文档批落笔。v1.0 的「机械面随批」措辞作废(属 2026-10-17 改口径前的旧口径)。 - -| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 | -|---|---|---| -| `design/gdd/systems/冒险循环/奇物.md` | v3.18 已定稿删件/迁出;本批代码落地后,件表注与迁入登记段中「归独立批」的指针可销号 | **反哺点**·列清单(`design/` 内,本批禁写) | -| `design/registry/entities.yaml:633` | 「104 总量」读数须改为 102(当前注记明写"仍为代码现值,改数随独立代码批同步");:254 完美排雷判据句须补「有效误标=误标数−豁免数」口径 | **反哺点**·列清单(含两处:104→102 读数换代+判据句补写) | -| `design/gdd/07-体验验证清单.md` | 两件退出后相关观测项注销;本卡新增 R5/R6 目检项(专长卡面文案/三选一池面观感)入册 | **反哺点**·列清单(本批禁写 07;R5/R6 目检项先记 `reports/` 实现报告总清单) | -| `roadmap.md` | 迭代 31 行状态由「待开工」改「已完成」;顶部「当前位」三行换代 | **反哺点**·列清单(根规则文件,本批禁写;第 3 步搬运定义面除外——那是提交既有文件,不是本批撰写) | -| `game/README.md` | 若载有两件名或配额读数 | **本批直改**(文件在 `game/` 内,不属 `design/` 禁写面)——随批核对更新 | -| `design/gdd/06-待办清单.md` | 「凭证件裁削批·代码侧迁移」条目状态推进为已完成 | **反哺点**·列清单(本批禁写;§10 前置门 2 的推进归用户/文档批) | -| GDD 设计结论 | **零新增**——设计侧已在 v3.18 定稿,本批无新设计决策需反哺 | 无(上述五行是既有陈述的换代,不是新设计) | - ---- - -## 6. 任务卡 - -| 卡 | 内容 | 估时 | -|---|---|---| -| **T0 开工基线** | 建 worktree+分支;`git status` 归属核对(并行遗留只标旗不碰);跑冒烟/单元/探针/三闸基线并记档;确认卡①是否已合回(若未合回,本批基于当前 master 开工并登记) | 0.25–0.5d | -| **T1 同调电池·表侧删除** | `CURIO_KINDS` 移除 kind;删 `curio_quota_attune_battery_rare`/`curio_value_attune_battery_rare`/`curio_cap_attune_battery` 三字段及分发表三处分支(:138/:159/:176);同步 schema 头注(:19-20 五件入池表述) | 0.25–0.5d | -| **T2 同调电池·runner 侧删除** | 删 `_battery_pending`、断点回填(:213)、重置(:261)、路由分支(:415-417)、`choose_battery_target`(:598-610)、`battery_pending()`(:615-616)、断点键(:1076);`feat_vouchers_test.gd` V9-5 断言组整组删 | 0.25–0.5d | -| **T3 完美保险·出池** | `CURIO_KINDS` 移除 kind;删配额/件值/cap 三字段与分发表三处分支;删 runner 侧 `_pending_insurance`、重置、路由分支、战首注入链(:920-923)中该件分量;删 `battle_orchestrator._fx_insurance` 与 `:422` 注入;`feat_vouchers_test.gd` V9-4 断言组整组删 | 0.5–1d | -| **T4 引擎扩签+两账相减** | `EFFECT_KINDS` 增 **`forgive_seal_miss`**(v1.1 换代,原 `forgive_flag_miss`);解释器 switch 加分支;`battle_orchestrator` 增 `_perfect_forgiven`(install 重置同 :471-472);`grant_segment` 判定改 `effective_miss = _perfect_hit_false - _perfect_forgiven`,删硬编码 if;`seal_missed` 发射位置与时机不动(卡① 合回前该事件名仍为 `flag_missed`) | 0.5–1d | -| **T5 专长行落表** | `feats.tres` 增完美保险行(规格=§10 D2,已裁:rarity rare/cap 省略/desc「本场首次封印落空,不计入完美封印判定」/feat_id 取 `perfect_insurance`);**触发行 `on` 取 `"seal_missed"`**(卡① 合回前该名仍为 `flag_missed`)、`kind` 取 `forgive_seal_miss`、`domain=battle` 显式写出;`feat_table` 校验通过;确认 rebuild 装载并在 `_triggers` 出现 | 0.25–0.5d | -| **T6 配额重裁落地** | `TIER_QUOTAS` rare 9→7、总量 104→102;`validate()` 硬断言通过;`adventure.tres` 实例值同步;核对 rare 档剩余品种=ap/rap/time_sand 三种 | 0.25d | -| **T7 测试补齐** | 新增专长侧验收(见验证闸);变异验证逐条执行并记录 | 0.5–1d | -| **T8 产出物落位卡+代码域闸** | 轻闸全绿后:`reports/` 三份写齐——实现报告(各 T 卡状态+改前改后读数对拍+实机目检总清单含 R5/R6+变异验证记录表)、代拍板追认单、**反哺点清单**(§5 每条都要有落点:奇物.md 指针销号句、entities.yaml 104→102 与 :254 判据句、07 观测项换代、roadmap 迭代 31 行与「当前位」换代、06 本条状态推进句、术语表 `forgive_seal_miss`/`seal_missed` 换代);`game/README.md` 属 `game/` 内文件、本批直改核对;跑代码域闸全绿。**禁改 `design/` 与 `roadmap.md`** | 0.25–0.5d | - -**合计**:≈2.75–4.75d(超软盒预案:T3/T4 若撞断点兼容问题,先落 T1/T2/T6 的可独立验证部分,T3–T5 转下一批并登记 06)。 - ---- - -## 7. 验证闸(逐需求点验收) - -### 7.1 逐需求点验收清单 - -| 需求点 | 测什么 | 测试落点 | 归谁验 | -|---|---|---|---| -| R1 电池出池 | `_apply_curio_pick("attune_battery", ...)` 不再被受理;三选一候选集不含该令牌;`CURIO_KINDS` 无该值 | 单元:`adventure_table` 词表断言+`feat_vouchers_test` 反例断言(改后应变红→改为断言"不再受理") | 调试接口 | -| R1 电池无孤儿 | `choose_battery_target`/`battery_pending()` 符号不存在(编译级);断点存档结构无 `battery_pending` 键;旧断点档缺键不报错 | 单元:断点 roundtrip 测试(save_rng_roundtrip 或既有断点套)加缺键兼容断言 | 调试接口 | -| R1 账本保留 | `_seed_attune_charges` 仍每冒险重置主动件充能;`run_ledger.attune_charges` 语义不变 | 单元:既有冒烟断言复核+补一条"删件后充能账本仍按装备重置" | 调试接口 | -| R2 专长行合法 | `feats.tres` 新行通过 `FeatTable.validate`;`EffectEngine.rebuild` 装载后 `_triggers` 含该行两段 | 单元:`effect_words` 类测试加行断言 | 调试接口 | -| R2 豁免一次 | 同战两次标错:首次 `effective_miss` 不增、第二次增;跨战后首次标错又豁免一次(domain=battle 每战清零) | 单元:直构引擎+编排 rig(参照 `smoke_all.gd:6091` 守侧五场景的 rig 法) | 调试接口 | -| R2 计数纯净 | 触发豁免后 `_perfect_hit_false` **值不变**(仍是误标原值);`_perfect_forgiven` 单向 +1 | 单元:同上 rig,双值对拍断言 | 调试接口 | -| R2 判定正确 | `_perfect_hit_false=2 / _perfect_forgiven=1` → effective 1 → 不完美;`1/1` → 完美成立;`_perfect_hit_true=0` 时不成立 | 单元:真值表断言 | 调试接口 | -| R2 事件不吞 | 触发豁免的同一标错,`seal_missed`(卡① 合回前名 `flag_missed`)仍被其它订阅方收到(以危险直觉·守的 AP 返还为观测点) | 冒烟:复用既有守侧场景 | 调试接口 | -| R3 配额锚 | `validate()` 通过;rare 合计 7;总量合计 102;rare 品种集={ap, rap, time_sand} | 单元:`adventure_table` validate 断言 | 调试接口 | -| R4 词表合法 | 新 kind 在 `EFFECT_KINDS`;数据行 do.kind 出域即加载致命(反例实证) | 单元:词表成员断言 | 调试接口 | -| R5 玩家面文案 | 新行 desc 不含「雷」;卡面显示正常 | 用户目检(登记 07) | 用户目检 | -| R6 池面观感 | 三选一再不出现两件;稀有档仅剩三种 | 用户目检(登记 07) | 用户目检 | - -### 7.2 变异验证伴生(新增/改写断言必配) - -| 变异点 | 注入形态 | 跑哪道最窄闸 | 期望红 | -|---|---|---|---| -| 两账相减判定 | 把 `effective_miss` 改回 `_perfect_hit_false`(漏减豁免) | 单元:真值表那条 | 「1/1 → 完美成立」变红 | -| 计数纯净 | 把豁免实现改回退式(`_perfect_hit_false -= 1`) | 单元:计数纯净断言 | 「_perfect_hit_false 值不变」变红 | -| 限次 | 把 `when` 的 `lt 1` 改成 `lt 99` | 单元:豁免一次断言 | 「第二次标错不豁免」变红 | -| domain=battle | 把 `domain` 改成 `adventure` | 单元:跨战豁免断言 | 「跨战不再豁免」变红 | -| 配额锚 | 把 rare 合计改回 9(漏删一张) | 单元:validate 断言 | 「rare 合计 7」变红 | -| 电池出池 | 把 kind 加回 `CURIO_KINDS` | 单元:词表断言 | 「CURIO_KINDS 无该值」变红 | - -### 7.3 闸口径 - -轻闸(每轮):`tools/run_all_gates.sh --quick`。重闸(批末):`tools/run_all_gates.sh --code`(本批只碰 `game/` 与 `tools/`)。批末四闸=冒烟+单元测试+场景探针+改前改后读数对拍,全绿才合并。 - ---- - -## 8. 异常分级 - -- **L1 自救**:字段删除后编译报错(漏改引用)——按报错定位补齐,属本批范围。 -- **L2 记录继续**:旧断点档含 `battery_pending` 键(缺键兼容路径已验证不报错);`adventure.tres` 实例字段与 schema 不同步导致加载警告——记录后继续,批末统一核对。 -- **L3 停机写报告**:①删 `attune_charges` 账本被误触(契约 1);②四词表校验出现非预期致命(说明扩签方式与引擎假设冲突);③T3/T4 触断点版本兼容须迁移(本批无迁移授权);④卡①未合回且其改动与本卡文件集出现意外重叠。 - ---- - -## 9. 代拍板白名单 - -1. `feat_id` 取 `perfect_insurance`(与旧 kind 同名,便于追溯旧讨论);display_name 取「完美保险」。 -2. 豁免计数 `counter_id` 命名取 `insurance_used`(与 `tree_*_used` 同族)。 -3. 若核出 `DO_KEYS.cap` 语义适用于"本 effect 累计上限",则省掉第二条 `counter_add` 触发行(外部行为等价,单行更简);核不出则维持双行。**须在实现报告注明最终选型与依据**。 -4. 测试文件落点:能并进 `feat_vouchers_test.gd` 就并,不新建套件(避免套件数膨胀)。 -5. `_perfect_forgiven` 的 install 重置点紧随 `:471-472` 既有重置,不新设重置钩子。 - -超清单必呈报。 - ---- - -## 10. 待裁点(2026-10-18 已裁毕;开工门=U0) - -- ✅ **D1 效果类型命名**=`forgive_flag_miss`(用户裁「合动宾惯例的」)→ **v1.1 换代为 `forgive_seal_miss`**(2026-10-18 用户补裁)。原裁定管的是命名形状(动词+宾语,与 EFFECT_KINDS 现役 `add_ticket_rider`/`modify_ticket`/`damage_mult` 同族),不是 flag/seal 之争;卡① 要求 `game/` 内 `flag` 零命中,故新名取 seal 族。 -- ✅ **D2 专长行规格**=`rarity` 取 `rare`/`cap` 省略(承 twin_pick/geologist 惯例)/`desc`=「本场首次封印落空,不计入完美封印判定」(用户确认,沿用 A 案)。 -- ✅ **D3 roadmap 目标句措辞**=维持现落地的「两卡串行:卡①代码术语刷新批+卡②凭证件裁削批·代码侧」事实式表述(用户裁「没有问题」)。 - -**开工门**:用户发开工令(U0)+**两项前置门(v1.1 补列,2026-10-18 卡片冲突修订批核出)**—— - -1. **卡① 已合回 master**(本卡所有 flag_ 旧名要按 seal_ 形态复核,且 T3/T4 与卡① 同改三文件,见契约 8); -2. **设计事实源已进 HEAD**(2026-10-18 本会话复核:本门**已满足**):`design/gdd/systems/冒险循环/奇物.md` v3.18 已随提交 `39523dd4` 进 master,`HEAD:奇物.md` 含 v3.18,worktree 从 HEAD 检出读得到本卡事实源。06「凭证件裁削批·代码侧迁移」状态列也已由「待写卡」推进为「文档设计已闭合(奇物.md v3.18)+已写卡(本卡路径)+已编迭代 31」。 - -本卡不等冒记遗留两项(凭证归专长/资源=转换源判据句)的裁定——那两项不阻塞本卡。 diff --git a/roadmap.md b/roadmap.md index 65080a92..250ebc0e 100644 --- a/roadmap.md +++ b/roadmap.md @@ -5,8 +5,8 @@ ## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照) - **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。 -- **迭代位**:迭代 1–30 全部已完成或已终止;**迭代 31 待开工**(两卡串行:卡①代码术语刷新批+卡②凭证件裁削批·代码侧,均 2026-10-18 编入)。 -- **下一步**:迭代 31 开工令(U0)归用户发。其余候选在 06 状态列——营地交互重做五卡(已写卡待编迭代)、迭代 30 原卡②③(待美术/设计定稿后重新立卡)。 +- **迭代位**:迭代 1–31 全部已完成或已终止;下一迭代位待用户编排。 +- **下一步**:06 在册候选——营地交互重做五卡(已写卡待编迭代)、迭代 30 原卡②③(待美术/设计定稿后重新立卡)、玩家面残留禁字清扫(待写卡)。 ## 里程碑时间线 @@ -64,7 +64,7 @@ | 迭代 28 | 已完成(2026-10-15) | 已退役(git 历史可考) | 2026-10-15 | — | 已退役(git 历史可考) | | 迭代 29 | 已完成(2026-10-16) | 已退役(git 历史可考) | 2026-10-16 | — | 已退役(git 历史可考) | | 迭代 30 | 已完成(2026-10-17) | 已退役(git 历史可考) | 2026-10-16 | — | 已退役(git 历史可考) | -| 迭代 31 | 待开工 | reports/需求卡片-代码术语刷新批-2026-10-18.md、reports/需求卡片-凭证件裁削批-2026-10-18.md | 2026-10-18 | ≈1.5 周 | — | +| 迭代 31 | 已完成(2026-10-19) | 已退役(git 历史可考) | 2026-10-18 | ≈1.5 周 | 已退役(git 历史可考) | - 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。 - 「已退役(git 历史可考)」= 需求卡片或实现报告曾存在,已按「证据只留最新」退役;已完成迭代的实现报告列只填 reports/ 现存路径或本保留字,不填「—」。