From 6add37b68cb47a0e6e17c7686acd66b04dee669f Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 3 Nov 2026 20:00:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(CI=E8=BF=BD=E7=BB=BF=C2=B7?= =?UTF-8?q?=E8=BF=AD=E4=BB=A350=E6=94=B6=E5=B0=BE):=20run29=E4=B8=A4?= =?UTF-8?q?=E9=97=B8=E7=BA=A2=E5=9B=A0=E4=B8=89=E5=A4=84=E2=80=94=E2=80=94?= =?UTF-8?q?=E2=91=A0roadmap=E4=B8=8B=E4=B8=80=E6=AD=A5=E3=80=8C2026-11-03?= =?UTF-8?q?=20=E6=96=B0=E6=9D=A1=E3=80=8D=E6=8E=AA=E8=BE=9E=E8=A7=A6?= =?UTF-8?q?=E5=8F=91gdd=5Flint=20R3=E6=AD=A3=E6=96=87=E4=BF=AE=E8=AE=A2?= =?UTF-8?q?=E6=B3=A8=E8=AE=B0,=E6=94=B9=E3=80=8C=E5=9C=A8=E5=86=8C?= =?UTF-8?q?=E3=80=8D=E5=8E=BB=E6=97=A5=E6=9C=9F=E5=BC=8F=E5=8F=99=E8=BF=B0?= =?UTF-8?q?=20=E2=91=A1=E8=83=BD=E5=8A=9B=E8=A1=8C=E6=95=8C=E6=96=B9?= =?UTF-8?q?=E5=A2=9E=E7=9B=8A=E8=87=AA=E4=BD=93=E8=90=BD=E7=82=B9=E4=BB=A3?= =?UTF-8?q?=E8=A1=A8=E7=94=A8=E4=BE=8B=E5=90=8D=E5=AE=9E=E6=96=AD=E8=A3=82?= =?UTF-8?q?(=5Ftest=5Fenemy=5Fbuff=5Ftargets=5Fself=E2=86=92=5Fsmoke=5Fene?= =?UTF-8?q?my=5Fbuff=5Ftargets=5Fself,=E5=AE=9E=E5=86=B5=3D=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E4=BE=A7=5Fsmoke=E5=AE=9A=E5=90=8D,iter50=E6=89=B9?= =?UTF-8?q?=E6=9C=AB=E6=A0=B8=E5=AF=B9=E6=BC=8F=E6=A3=80=E6=AD=A4=E8=A1=8C?= =?UTF-8?q?,=E5=8D=A1=E7=89=87=E9=80=80=E5=BD=B9=E5=90=8E=E5=8D=A1?= =?UTF-8?q?=E5=9C=A8=E9=80=9A=E9=81=93=E6=B6=88=E5=A4=B1=E5=8D=B3=E6=9A=B4?= =?UTF-8?q?=E9=9C=B2)=20=E2=91=A2capability=5Faudit=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E9=94=9A=E9=9D=A2=E7=BB=93=E6=9E=84=E6=80=A7?= =?UTF-8?q?=E7=BC=BA=E5=8F=A3=E2=80=94=E2=80=94=E5=85=A5=E5=8F=A3=E5=AE=BF?= =?UTF-8?q?=E4=B8=BB=E5=9C=A8game/sim/(battle=5Fdriver/auto=5Fplayer)?= =?UTF-8?q?=E8=80=8C=E6=89=AB=E6=8F=8F=E9=9D=A2=E6=8E=92=E9=99=A4sim,?= =?UTF-8?q?=E5=8D=A1=E7=89=87=E9=80=80=E5=BD=B9=E5=90=8E=E6=97=A0=E6=8C=81?= =?UTF-8?q?=E4=B9=85=E9=94=9A=E5=8D=B3=E7=BA=A2;=20=E9=94=9A=E9=9D=A2?= =?UTF-8?q?=E6=89=A9=E5=85=A5sim=E6=B5=8B=E9=87=8F=E4=BB=B6(=E5=88=A4?= =?UTF-8?q?=E6=8D=AE=E9=9D=A2=E6=9C=89=E6=84=8F=E6=94=BE=E5=AE=BD:?= =?UTF-8?q?=E8=A2=AB=E9=94=9A=E5=85=A5=E5=8F=A3=E6=9C=AC=E5=9C=A8=E5=BA=93?= =?UTF-8?q?=E5=86=85,=E8=A1=A5=E7=9A=84=E6=98=AF=E5=8D=A1=E7=89=87?= =?UTF-8?q?=E6=AD=BB=E5=90=8E=E7=9A=84=E6=8C=81=E4=B9=85=E9=94=9A=E9=80=9A?= =?UTF-8?q?=E9=81=93,=E9=9D=9E=E6=94=BE=E6=B0=B4),=E5=A4=B4=E6=B3=A8?= =?UTF-8?q?=E4=B8=8E=E6=8A=A5=E9=94=99=E6=96=87=E6=A1=88=E5=90=8C=E6=AD=A5?= =?UTF-8?q?;=20=E6=9C=AC=E5=9C=B0=E5=A4=8D=E6=A0=B8gdd=5Flint=200=E4=B8=8D?= =?UTF-8?q?=E9=80=9A=E8=BF=87+capability=5Faudit=20strict=E7=BA=A2?= =?UTF-8?q?=E9=A1=B90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/README.md | 2 +- roadmap.md | 2 +- tools/capability_audit.py | 10 ++++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/game/tests/README.md b/game/tests/README.md index 6acd7c6e..88a00411 100644 --- a/game/tests/README.md +++ b/game/tests/README.md @@ -183,7 +183,7 @@ tests/ | 同名状态合并策略(叠加/累加/并存)与剩余次数语义 | 战斗循环×增益状态 | `StatusContainer.apply_effect()`(编排宿主 begin_battle 链) | `roll_multiplier_test.gd:_smoke_armor_roll` | | 状态效果结算链(逐值衰减/到期移除/战斗结束全清/满层拒绝/独立并存/首授快照) | 增益状态 | `StatusContainer.apply_effect()`/`decay_round()`/`notify_battle_end()` | `system_contracts_test.gd:_test_status_decay_and_clear`;`system_contracts_test.gd:_test_status_stack_full_reject`;`system_contracts_test.gd:_test_status_independent_branch`;`system_contracts_test.gd:_test_status_snapshot_first_grant` | | 状态实例按个体归属:个体隔离/全体授予逐体发/死亡即清/同体合并照旧 | 增益状态 | `StatusContainer.apply_effect()`(个体键)/`purge_owner()` | `system_contracts_test.gd:_test_status_individual_isolation`;`system_contracts_test.gd:_test_status_grant_all_per_unit`;`system_contracts_test.gd:_test_status_death_clears`;`system_contracts_test.gd:_test_status_merge_per_unit` | -| 敌方增益自体落点与乘区池按个体 | 敌人系统×战斗结算×增益状态 | 技能兑付编排链/`DamageController.clamped_pool()` | `round_flow_skill_pool_test.gd:_test_enemy_buff_targets_self`;`damage_controller_test.gd:_test_pool_consumption_per_unit`;`damage_controller_test.gd:_test_defender_ac_per_unit`;`battle_narrator_test.gd:_test_snapshot_effects_per_unit` | +| 敌方增益自体落点与乘区池按个体 | 敌人系统×战斗结算×增益状态 | 技能兑付编排链/`DamageController.clamped_pool()` | `round_flow_skill_pool_test.gd:_smoke_enemy_buff_targets_self`;`damage_controller_test.gd:_test_pool_consumption_per_unit`;`damage_controller_test.gd:_test_defender_ac_per_unit`;`battle_narrator_test.gd:_test_snapshot_effects_per_unit` | | 敌人技能池跨表链接校验 | 数据配置×敌人系统 | `ConfigDbCrossValidator.validate_skill_pool_links()` | `config_db_cross_validator_test.gd:_test_all_links_valid`;`config_db_cross_validator_test.gd:_test_dangling_skill_id`;`config_db_cross_validator_test.gd:_test_cast_side_mismatch` | **覆盖域表**(`design/gdd/systems/` 逐篇对照——状态三档:已覆盖/部分覆盖/未覆盖;部分与未覆盖行的缺口指待办清单条目,覆盖面提升时同批改本表): diff --git a/roadmap.md b/roadmap.md index 7250d67a..83f1d566 100644 --- a/roadmap.md +++ b/roadmap.md @@ -6,7 +6,7 @@ - **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。 - **迭代位**:迭代 1–50 全部已完成——迭代 50(敌方状态个体化+断言补齐+架构审查 3.1+3.2 整改三卡)2026-11-03 合回(合并提交 8d3a12ec,独立验收审计两轮终判通过〔首轮缺漏三条→整改笔 6cb1cf5e→复验通过〕),批后收尾闭合(2026-11-03):反哺点十条处置闭合(增益状态 v1.6 删「实装随该批」过时行/architecture v1.32 排雷规则件 preview_reveal 只读预览口登记+天赋树 tree_rules 参数字典 API 换代/奇物 v1.5 cap 必填与取值域写入/覆盖域表减动效行翻已覆盖;SPAWN_AREA_CELLS、shop.spend_discount 表字段、battle_driver 签名三处零登记零落点,天赋树 v0.12 等五份与术语表零反哺确认)、实机目检五项登记体验验证清单 ㊿〔实现报告原编㊾与 CI 迁远端批撞号,改用㊿〕、MC 锚代表性注记落 sim-data/README(重跑归一档用户发起)、产出物退役六件(三需求卡片+反哺点+实现报告+验收审计——吸收即死+证据只留最新)、待办清单三卡条目整条删除(架构审查余项〔审计待裁点④⑤⑥⑦〕按未决先迁再死另立新条登记)。迭代 49 收尾记录见 git 提交 aa396eb9,迭代 48 见 bd54d1f4。 -- **下一步**:迭代 51 编排待发令(`/iter-plan`)。待编池:架构审查余项(闸面缺口/豁免存废/零测试点名/架构文档漂移——待办清单 2026-11-03 新条,待讨论段逐项裁决)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。 +- **下一步**:迭代 51 编排待发令(`/iter-plan`)。待编池:架构审查余项(闸面缺口/豁免存废/零测试点名/架构文档漂移——待办清单在册,待讨论段逐项裁决)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。 ## 里程碑时间线 diff --git a/tools/capability_audit.py b/tools/capability_audit.py index 8eb96e9b..8d29555d 100644 --- a/tools/capability_audit.py +++ b/tools/capability_audit.py @@ -10,8 +10,8 @@ r"""capability_audit.py — 能力清单、覆盖域表与 GDD 纯度机检( manifest 内且该文件有 `func 函数名(`,或该文件是 game/probe/ 下的探针件且件内有 `func 函数名(`—— 探针不进 run_all manifest,单独认探针面)或卡在(该文件名或函数名能在 reports/需求卡片*.md 中找到, 供写卡时当场入表的计划用例锚定);两头都无=红(清单挂了无凭证义务)。 - E 真实入口可核(双通道):能力行「真实入口」的每个 `类.方法()`——产品码(game/ 除 tests//probe//sim/) - 有 `func 方法(`,或该方法名能在 reports/需求卡片*.md 中找到(计划入口同 D 口径);两头都无=红。 + E 真实入口可核(双通道):能力行「真实入口」的每个 `类.方法()`——产品码+sim 测量件(game/ 除 + tests//probe/)有 `func 方法(`,或该方法名能在 reports/需求卡片*.md 中找到(计划入口同 D 口径);两头都无=红。 F 覆盖域表:systems 每篇一行;状态∈{已覆盖,部分覆盖,未覆盖};非未覆盖行的「能力行」非空且每项都能 对上能力表里的行名;部分/未覆盖行的缺口非空且指待办清单。 条件闸行豁免(代表用例含「条件闸」字样)不参与 D/E。 @@ -121,10 +121,12 @@ def manifest(): def product_funcs(): + # 「代码在」锚面=产品码(game/ 除 tests//probe/)+sim 测量件:调参测量与模拟驱动件 + # (battle_driver/auto_player 等)是合法的真实入口宿主,卡片退役后其入口只能锚代码面。 names = set() for p in (REPO / "game").rglob("*.gd"): rel = p.relative_to(REPO).as_posix() - if rel.startswith(("game/tests/", "game/probe/", "game/sim/")): + if rel.startswith(("game/tests/", "game/probe/")): continue names.update(re.findall(r"^(?:static\s+)?func\s+([A-Za-z_]\w*)\s*\(", read(p), re.M)) return names @@ -251,7 +253,7 @@ def check_entry(no, name, cell, funcs, cards): for _, method in tokens: if method not in funcs and not (cards and method in cards): red(README.relative_to(REPO), no, "真实入口", - "「%s」方法 %s() 无凭证——产品码无定义且需求卡片未载" % (name[:16], method)) + "「%s」方法 %s() 无凭证——产品码与 sim 测量件无定义且需求卡片未载" % (name[:16], method)) def check_coverage(cov_tables, names):