docs(card): 需求卡片 v1.3——二轮开工前自查,五处批末验收雷全部拆掉

回应用户「是否还有需裁断项」的全量审计(五词原始命中 119 行逐处实测):

1. S11 词表若收「退役词对照」首列全词 → 巢穴 20 处(玩家专名「巢穴
   预告」+风味层)与旗 6 处(闸门自指 5+更名记载 1)批末必红 →
   立显式排除单(巢穴/旗,理由:术语表风味层除外注+B3 专名豁免+
   doc_term_audit 既有判例「旗单字不入表」)。
2. enemy.tres:653 落籍留档不被旧 25 子串信号过滤豁免 → 批末 S11+A6
   必红;且该过滤实测误伤 14/17 处活注释(→/历史/登记/豁免等子串
   误判)→ 废信号过滤,改显式留档豁免单 4 处+显式待清清单。
3. 误伤的 14 处活注释补入清单:N1 16→21、N2 26→33(hud_presenter/
   ui_input_probe 两文件整文件旧漏)、N3 38→39、N4 12→14;T2/T3/T4/T5
   任务清单与 §4 计数同步(复算对拍:待清 21+33+36+13+9=112)。
4. T7 行序调换+hl 两态化会漂移 parity JSONL(_on_step_row 逐行落盘
   含 highlight,11 号闸 sha256 逐位比对)→ 立契约 12:本批不发起
   parity(NEED-APPROVAL 态 all_green 不受影响)、漂移记档、合回后另立
   用户批准的重锚批;N7 验收走 A10/A11/A12 正向断言(纪律①主力)。
5. A2 补 board_fx_view.gd:102 静态覆盖(S11 只扫注释面,字符串字面量
   归断言面);S11 扫描面补 .sh;规则说明立禁令引举句式(否则闸本体
   头注被自己判红)。

另订正:§10/§8 旧修法措辞(上移豁免→后移 _emit_row)、契约编号去重
(原两个 9)、N1 表内计数、06 条目同步(含修其自指引爆的 doc_term
红——bash tools/run_all_gates.sh --docs 复跑全绿)。
This commit is contained in:
DKChan committed 2026-10-20 04:08:52 +08:00
1 parent 869d00d678
commit a082f8a4fd
2 files changed
+91 -62

No files matched your search

+6 -6
View File
@@ -680,16 +680,16 @@
#### 代码注释禁用词清扫批——退役词换代+完美封印统一+归因锚判据修正(2026-10-20 登记,来源=会话提及,设计面=工程直入)
**现状**:2026-10-19 全量扫描 `game/`(195 个文件:.gd/.tres/.md/.json/.sh/.txt)的可复核实测读数,口径=剔除含对照性/历史信号的行后计「疑似现行残留」。
**确定违规**(术语表「退役词对照」在册,落于代码注释面)=`板级` 26 处/`门票` 38 处/`正主` 12 处(含 `tests/unit/battle_settlement/damage_math_test.gd:36`「正主角池」误报 1 处)/`落籍` 10 处(含 `data/tables/enemy.tres:653` 带 commit 号的历史注记 1 处,不追改)。
**含「雷」字面**(违反术语表「对外命名纪律」——「雷」及相关字面禁入对外命名,适用范围含 UI 文案)=`完美排雷` 16 处,其中 **3 处为玩家可见文案**:`core/battle_orchestrator.gd:925` `"完美排雷!清图奖励 ×2"`、`presentation/views/board_fx_view.gd:102` `_show_banner("完美排雷 ×2")`、`presentation/views/battle_log_view.gd:194` `"(本板完美排雷已破——归因此封印)"`(末条 `design/qa/文案审查报告-2026-10-18.md:150` 已判病句,至今未修)。
**现状**:2026-10-19 全量扫描 `game/`(195 个文件:.gd/.tres/.md/.json/.sh/.txt)的可复核实测读数;v1.3(2026-10-20)全量复核后口径订正=**命中行全部计入待清,显式豁免仅限 4 处**(`enemy.tres:653` 落籍留档/`level_runner.gd:832` 门票历史注记/`adventure_runner.gd:403` 正主历史修复注记/`damage_math_test.gd:36` 正主误报)——旧「信号子串过滤」实测误伤 14/17 处活注释且漏豁免 653,已废。
**确定违规**(术语表「退役词对照」在册,落于代码注释面)=`板级` 33 处/`门票` 39 处(含移交 3 处,本批做 36)/`正主` 14 处(含误报与历史注记各 1 处,本批做 13)/`落籍` 10 处(含 `data/tables/enemy.tres:653` 带 commit 号的历史注记 1 处,不追改;本批做 9)。
**含「雷」字面**(违反术语表「对外命名纪律」——「雷」及相关字面禁入对外命名,适用范围含 UI 文案)=`完美排雷` 21 处,其中 **3 处为玩家可见文案**:`core/battle_orchestrator.gd:925` `"完美排雷!清图奖励 ×2"`、`presentation/views/board_fx_view.gd:102` `_show_banner("完美排雷 ×2")`、`presentation/views/battle_log_view.gd:194` `"(本板完美排雷已破——归因此封印)"`(末条 `design/qa/文案审查报告-2026-10-18.md:150` 已判病句,至今未修)。
**根因**:迭代 31 卡① 完成判据 V4 只覆盖「金币/插旗/雷格/惩罚格」四词(+旗族),`排雷`/`雷`族未入完成判据;且机检闸 `tools/doc_term_audit.py` 的 `DEFAULT_DIRS = ["design/gdd"]`,**代码注释面从未进闸**——不清根则同类残留持续复发。
**裁定(2026-10-19 用户)**:完美排雷**全库统一**换代为「完美封印」,含代码内部注释。本裁**推翻** `需求卡片-凭证件裁削批`:108「内部开发用语按 v3.15 纪律保留」半句,该卡片条款订正归**文档轨批**,代码批照本裁执行。
**移交(不属本批)**:`game/data/tables/shop.tres:86` display_name「奇物门票」、`game/presentation/curio_interact_controller.gd:165-166`「开一次奇物三选一」——两处属 奇物/专长 归类表述,与 06「2026-10-18 冒记案遗留待裁两项」第①项同源,交文档侧先定性,定后另走传导批。
**扫描中查出的真缺陷(N7)**:`core/settlement/grant_segment.gd:300` 用 RAW 误标计数判「完美封印已破」,而 `core/battle_orchestrator.gd:1299` 的真正谓词用**有效误标**(总数 − 豁免数);且豁免累加(:314)排在 `_emit_row`(:302)之后。⇒ 装备「完美保险」时日志打印「已破」,实际加倍奖励仍发,日志与真值矛盾。2026-10-20 用户裁=并入本批修(判据改有效误标+豁免上移+文案两态)。
**扫描中查出的真缺陷(N7)**:`core/settlement/grant_segment.gd:300` 用 RAW 误标计数判「完美封印已破」,而 `core/battle_orchestrator.gd:1299` 的真正谓词用**有效误标**(总数 − 豁免数);且豁免累加(:314)排在 `_emit_row`(:302)之后。⇒ 装备「完美保险」时日志打印「已破」,实际加倍奖励仍发,日志与真值矛盾。2026-10-20 用户裁=并入本批修(判据改有效误标+`_emit_row` 后移至豁免循环之后+文案两态;修法 v1.2 定型——上移豁免累加需重复调用 `_fx_emit` 会重复消费限次,已核实不可行)。
**不做(待用户另裁)**:术语表 A 表词(`不得` 14/`报错` 18/`对标` 1/`若干` 1/`buff` 22——后者绝大多数是标识符与数据键)、doc-conventions 第 4 节流程动词(`收口` 128/`随批` 20/`台账` 17/`对拍` 16/`在飞` 10/`落文` 2)、简明技术中文(STC)通用禁用词(`缺省` 105/`情况` 26/`入参|出参` 23/`比较|较为|相对` 22 等)。
**不做(待用户另裁)**:术语表 A 表词一族、doc-conventions 第 4 节流程动词一族、简明技术中文(STC)通用禁用词一族——三族的逐词计数与清单见卡片 §4「不做」表(本行不复制词面:06 正文引述禁词会自指引爆 doc_term 补充通道,判红)。
**归属**:game/ 代码与数据表(代码域,走独立 worktree 批;并行避让——`changelog-retire-20261019` 在盘未合回且正在改 `AGENTS.md` 与 `design/dev/code-conventions.md`,本批禁碰这两个文件,S11 规则说明自持于 `game/tests/static_scan.sh` 头注与 `game/tests/README.md`)
**状态**:已写卡(design/research/需求卡片-代码注释禁用词清扫批-2026-10-20.md)+已编迭代 32
**状态**:已写卡(design/research/需求卡片-代码注释禁用词清扫批-2026-10-20.md,**v1.3**)+已编迭代 32
@@ -4,9 +4,10 @@
- **日期**:2026-10-20
- **批次性质**:工程债/重构 + 缺陷修复(两类均属工程直入四类,凭 06 在册条目与代码级证据直接写卡)
- **设计事实源**(唯一事实源:`design/gdd/术语表.md`「退役词对照」+「用语规范 A 表」+「对外命名纪律」节;`design/gdd/systems/战斗循环/战斗结算.md`「完美排雷」规则节;req-card 三选一之③工程直入证据指认):扫描读数=`game/` 下 195 个文件(.gd/.tres/.md/.json/.sh/.txt)逐处实测,落点带 file:line(见 §2);复现命令见 §2 末。
- **版本**:**v1.2**(2026-10-20:开工前自检查出四处会卡住施工方的未定口径——S11 词表范围/「雷」字面误伤面/N7 修法可行性与限次重复消费/A10·A11 断言落点——全部钉死;T7 修法由「上移豁免」改为「后移 `_emit_row`」,已核实 `_fx_emit` 有状态不可重复调用)
- **版本**:**v1.3**(2026-10-20:二轮开工前自查(回应用户「是否还有需裁断项」)——五词全量审计 119 行命中,查出五处会卡住批末验收的问题全部钉死:①S11 词表若收「退役词对照」首列全词,巢穴 20 处(玩家专名+风味层)与旗 6 处(闸门自指+更名记载)批末必红 → 立显式排除单;②`enemy.tres:653` 落籍留档不被旧信号过滤豁免 → 批末 S11+A6 必红 → 废 25 子串信号过滤(实测误伤 14/17 处活注释),改显式留档豁免单 4 处;③误伤的 14 处活注释补入显式待清清单(N1 16→21、N2 26→33、N3 38→39、N4 12→13/14);④T7 行序调换+`hl` 两态化会漂移 parity JSONL(`_on_step_row` 逐行落盘含 `highlight`,11 号闸按 sha256 逐位比对)→ 立契约 11:本批不发起 parity、漂移记档、合回后另立用户批准的重锚批;⑤A2 补 `board_fx_view.gd:102` 静态覆盖(S11 只扫注释面,字符串字面量归断言面)。另订正 §10/§8 旧修法措辞(上移豁免→后移 `_emit_row`)与 N1 表内计数)
- 历史:v1.2(2026-10-20:开工前自检查出四处会卡住施工方的未定口径——S11 词表范围/「雷」字面误伤面/N7 修法可行性与限次重复消费/A10·A11 断言落点——全部钉死;T7 修法由「上移豁免」改为「后移 `_emit_row`」,已核实 `_fx_emit` 有状态不可重复调用)
- 历史:v1.1(2026-10-20:grilling 复核门查出 N7 概念冲突,新增需求点与 T7 卡;T2 的对外文案由「机械换词」改为「按概念两态改写」)
- **迭代归属**:待编入 roadmap 迭代 32(本卡不自行编入;编排归 iter-plan 段)
- **迭代归属**:**已编入 roadmap 迭代 32**(`0da014d4`,周期列 ≈0.5 周;开工门=U0 `/iter 32` 用户发令)
- **上游依据**:2026-10-19 用户裁——「完美排雷」**全库统一**换代为「完美封印」,含代码内部注释
---
@@ -43,7 +44,7 @@
| 需求点 | 一句话 |
|---|---|
| **N1** | 「完美排雷」全库统一为「完美封印」(对外文案 3 处 / 代码注释与内部文档 13 处) |
| **N1** | 「完美排雷」全库统一为「完美封印」(对外文案 3 处 / 其余 18 处:注释、文档正文、断言描述与夹具) |
| **N2** | 注释里「板级」换代为「整图」 |
| **N3** | 注释里「门票」换代为「专长凭证」(标识符与数据键零改动) |
| **N4** | 注释里「正主」换代为「现行事实源」 |
@@ -53,7 +54,7 @@
**完成定义**(全部满足才算完):
1. `game/` 内 `完美排雷`/`板级`/`门票`(注释面)/`正主`/`落籍` 五词,**疑似现行计数全部为 0**(豁免=含对照/历史信号的行)。
1. `game/` 内 `完美排雷`/`板级`/`门票`(注释面)/`正主`/`落籍` 五词,**改后命中行 == §2 显式豁免单(4 处)+移交 3 处,其余为零**(v1.3 起口径=全部命中计入待清、显式豁免逐处列举;移交行非注释面,S11 与 A4 的注释面口径天然不含)。
2. 对外文案三处不含「雷」字面,读作「完美封印」。
3. **N7**:装备「完美保险」专长时本战首次标错 → `seal_miss` 行的 `highlight` 字段为 `""`(豁免态,无金框),且 `perfect_sweep_earned() == true`;未装备时首次标错 → `highlight` 为 `"perfect_broken"`(已破态,金框),且 `perfect_sweep_earned() == false`。两态各有正向断言(A10/A11)。
4. 冒烟绿数与改前基线一致(现行 1151 项 0 失败)、单元测试 34 套全绿、探针段绿。
@@ -65,12 +66,22 @@
---
## 2 · 现状事实(2026-10-19 实测,开工自行复核)
## 2 · 现状事实(2026-10-19 实测;v1.3 于 2026-10-20 全量复核——五词原始命中 119 行,开工自行复核)
扫描范围:`game/` 下 195 个文件(.gd/.tres/.md/.json/.sh/.txt)。
口径:命中行若含对照性/历史信号(`退役`/`作废`/`换装`/`继任`/`留档`/`历史`/`已删`/`不再`/`禁用`/`禁「`/`字面`/`原「`/`旧称`/`更名`/`换代`/`改为`/`→`/`禁令`/`引举`/`对照`/`豁免`/`待裁`/`已入库`/`登记`/`风味`)则不计入。
### N1 · 完美排雷(16 处 / 9 文件)
**口径(v1.3 重订——废 25 子串信号过滤,改显式豁免单)**:命中行**全部计入待清清单**;显式豁免仅限下列 4 处(逐处列举理由)。v1.2 及以前用的信号子串过滤(`退役`/`作废`/`→`/`历史`/`登记`/`豁免` 等 25 个)实测**误伤 14/17 处活注释**(行内只是行文带了 `→` 或别处主语含「豁免/作废」就被当对照行跳过),且**漏豁免** `enemy.tres:653`(批末 S11+A6 必红)——两面都不靠谱,故废。
| 豁免行 | 词 | 理由 |
|---|---|---|
| `game/data/tables/enemy.tres:653` | 落籍 | 带 commit 号(9cc4b8b)的落表留档注记——B1 历史文本(代拍板白名单 2 已裁不改) |
| `game/core/level_runner.gd:832` | 门票 | 迭代 12 T6「渠道分离退役」的历史注记——B1 历史文本 |
| `game/core/adventure_runner.gd:403` | 正主 | T4 F-1 历史修复注记(行内主语=已退役写口 `_attune_refresh_x`;且此处「正主」义为缺陷根因而非权威源,换代反毁句意) |
| `game/tests/unit/battle_settlement/damage_math_test.gd:36` | 正主 | 误报——「正主角池」=正主+角池,非词面命中 |
**移交 3 处**(不属本批,去向=文档轨批;非注释面,S11 注释面口径与 A4「注释面」口径天然不含,不入豁免单——清单见 §2 N3 节末)。
### N1 · 完美排雷(21 处 / 9 文件)
| 落点 | 行 | 面 |
|---|---|---|
@@ -83,24 +94,30 @@
| `presentation/views/board_fx_view.gd` | 2、90 | 注释 |
| `presentation/views/board_fx_view.gd` | **102** | **对外文案**(`_show_banner("完美排雷 ×2")`) |
| `presentation/views/settlement_fx_view.gd` | 14 | 注释 |
| `game/README.md` | 146 | 文档正文 |
| `smoke/smoke_all.gd` | 3512、3516、4076 | 注释/断言描述 |
| `game/README.md` | 146、168、267 | 文档正文(168=v1 遗留观测项清单、267=全屏 States 与模态段,均活文本;v1.3 补 168/267——旧信号过滤因行内别处含「作废/历史」误伤) |
| `smoke/smoke_all.gd` | 3503、3512、3513、3516、4076 | 注释/断言描述(v1.3 补 3503/3513——旧信号过滤因行内「→」误伤) |
| `smoke/smoke_all.gd` | **6201** | **冒烟夹具期望字面量**(断言比对用,非注释) |
| `tests/smoke/critical-paths.md` | 20 | 文档正文 |
### N2 · 板级(26 处 / 13 文件)
### N2 · 板级(33 处 / 15 文件)
`core/battle_orchestrator.gd`(67、265、470、482、506、507、928、1213)· `core/board_data.gd`(17、53)· `core/treasure_items.gd`(2、41)· `core/minesweeper_rules.gd`(126)· `data/schemas/variation_table.gd`(20、79)· `presentation/main.gd`(914)· `presentation/treasure_interact_controller.gd`(101)· `presentation/views/board_view.gd`(149、511)· `presentation/views/board_cell_unit.gd`(97)· `presentation/views/hero_info_panel_view.gd`(122、162)· `presentation/views/settlement_fx_view.gd`(146)· `smoke/smoke_all.gd`(2588、2630)· `tests/unit/core/feat_vouchers_test.gd`(174)
`core/battle_orchestrator.gd`(67、265、445、470、482、506、507、928、1213)· `core/board_data.gd`(17、53)· `core/treasure_items.gd`(2、41、63)· `core/minesweeper_rules.gd`(126)· `data/schemas/variation_table.gd`(20、79)· `presentation/main.gd`(914)· `presentation/hud_presenter.gd`(40、105)· `presentation/treasure_interact_controller.gd`(101)· `presentation/views/board_view.gd`(149、511、544)· `presentation/views/board_cell_unit.gd`(97)· `presentation/views/hero_info_panel_view.gd`(122、162)· `presentation/views/settlement_fx_view.gd`(146)· `smoke/smoke_all.gd`(1846、2588、2630)· `smoke/ui_input_probe.gd`(4)· `tests/unit/core/feat_vouchers_test.gd`(174)
### N3 · 门票(38 处 / 11 文件;其中 3 处移交,本批做 35 处)
(v1.3 补 7 处 2 文件:`hud_presenter.gd` 全文件、`ui_input_probe.gd` 全文件不在 v1.2 清单内;`battle_orchestrator.gd:445`/`treasure_items.gd:63`/`board_view.gd:544`/`smoke_all.gd:1846` 因行内含「→/禁用/登记」子串被旧信号过滤误伤——全是活注释。)
`core/adventure_runner.gd`(67、68、69、477、664、751、771、788、796、1033、1034)· `core/level_runner.gd`(51、781、826、831)· `data/schemas/adventure_table.gd`(92、96、97)· `data/schemas/shop_table.gd`(18)· `data/tables/shop.tres`(104)· `presentation/curio_interact_controller.gd`(89、217、237)· `presentation/views/curio_pick_overlay.gd`(110)· `smoke/level_autoplay.gd`(226)· `smoke/smoke_all.gd`(1362、1363、1370、1378、1379、1382、1384、5306)· `tests/unit/core/pool_case_d_test.gd`(98)· `tests/unit/presentation/reward_overlay_test.gd`(41)
### N3 · 门票(39 处 / 12 文件;其中 3 处移交,本批做 36 处)
`core/adventure_runner.gd`(67、68、69、477、664、751、771、788、796、1033、1034)· `core/level_runner.gd`(51、781、826、831)· `core/config_db_cross_validator.gd`(103)· `data/schemas/adventure_table.gd`(92、96、97)· `data/schemas/shop_table.gd`(18)· `data/tables/shop.tres`(104)· `presentation/curio_interact_controller.gd`(89、217、237)· `presentation/views/curio_pick_overlay.gd`(110)· `smoke/level_autoplay.gd`(226)· `smoke/smoke_all.gd`(1362、1363、1370、1378、1379、1382、1384、5306)· `tests/unit/core/pool_case_d_test.gd`(98)· `tests/unit/presentation/reward_overlay_test.gd`(41)
(v1.3 补 `config_db_cross_validator.gd:103`——「T5 门票豁免」活注释,旧信号过滤因行内「豁免」子串误伤;`level_runner.gd:832` 入豁免单,见上口径表。)
**移交 3 处**(不属本批,去向=文档轨批):`data/tables/shop.tres:86` display_name「奇物门票」、`presentation/curio_interact_controller.gd:165`/`:166` 玩家可见文案「奇物门票/开一次奇物三选一」。
### N4 · 正主(12 处 / 9 文件,含误报 1 处)
### N4 · 正主(14 处 / 10 文件,含误报 1 处)
`core/adventure_runner.gd:59` · `core/treasure_items.gd:57` · `presentation/views/board_cell_unit.gd:111`/`112` · `presentation/views/board_view.gd:122` · `smoke/board_shot_probe.gd:31` · `smoke/layout_probe.gd:2` · `smoke/shot_probe.gd:3`/`28` · `smoke/t17_defer_probe.gd:6`/`20` · `tests/unit/battle_settlement/damage_math_test.gd:36`(**误报**——「正主角池」是「正主」+「角池」,非词面命中,不改)
`core/adventure_runner.gd:59` · `core/treasure_items.gd:57` · `presentation/views/board_cell_unit.gd:111`/`112` · `presentation/views/board_view.gd:122`/`843` · `smoke/board_shot_probe.gd:31` · `smoke/layout_probe.gd:2` · `smoke/shot_probe.gd:3`/`28` · `smoke/t17_defer_probe.gd:6`/`20` · `tests/static_scan.sh:73` · `tests/unit/battle_settlement/damage_math_test.gd:36`(**误报**——「正主角池」是「正主」+「角池」,非词面命中,不改)
(v1.3 补 2 处:`board_view.gd:843`「正主 :163 照抄」(活注释,旧信号过滤因「→」误伤)、`static_scan.sh:73`「数值单一事实源的正主」(S3 规则头注,活注释;建议随批改为「数值单一事实源自身」一类等价措辞——代拍板 1)。`adventure_runner.gd:403` 入豁免单,见上口径表。)
### N5 · 落籍(10 处 / 4 文件,含历史注记 1 处)
@@ -126,7 +143,7 @@
### 已核实清零(迭代 31 成果,本批不重复动)
`金币`/`插旗`/`标旗`/`雷格`/`惩罚格`/`旗` 在 `game/` 内疑似现行计数**均为 0**。残留 3 处「旗」全在闸门逻辑(`smoke/smoke_all.gd:1319` 禁字面检查)与字形检查夹具(`tests/unit/presentation/ui_font_asset_test.gd:18`/`:19`),属对照性文本。
`金币`/`插旗`/`标旗`/`雷格`/`惩罚格`/`工作日志` 在 `game/` 内现行计数**均为 0**(v1.3 复核确认)。残留 6 处「旗」=闸门自指 5 处(`smoke/smoke_all.gd:1319`/`:1321`、`tests/unit/presentation/ui_font_asset_test.gd:18`/`:19`、`data/tables/feats.tres:10`)+更名记载 1 处(`feats.tres:11`「旗〔旧称〕=封印」)——前者由契约 9 自指豁免覆盖,后者属 B2 对照性文本;单字「旗」不入 S11 词表(契约 7 排除单)。另「巢穴」20 处全为玩家可见专名「巢穴预告」与风味层表述(`treasure_items.tres:99`/`main.gd:913` 等),同入排除单;「排雷」64 处 / 26 个文件(「排雷玩法/排雷规则」内部机制名)不扩大禁词面(§10 已裁)。
**复现命令**(仓库根):`grep -rn "完美排雷\|板级\|门票\|正主\|落籍" game/ --include=*.gd --include=*.tres --include=*.md --include=*.json --include=*.sh`
@@ -140,11 +157,15 @@
4. 🔴 **完美封印判据单点**——「是否已破」只允许由 `battle_orchestrator.perfect_sweep_earned()` 的有效误标口径派生,禁在 `grant_segment.gd` 另立 RAW 计数判据;两处口径不一致即为缺陷。
5. 🔴 **游戏行为零变化**(N1–N5、N7 判据修正前)——纯中文文本替换,禁止改动逻辑、数值、权重、条件判断。N7 判据修正是**本批唯一允许的逻辑改动**,其验收为「日志文案与真值一致」,不改奖励兑付结果。
6. 🔴 **S11 规则先落、后修码**——先把规则写进 `game/tests/static_scan.sh` 并跑出红,再动注释(code-conventions 缺陷-规范对照表纪律)。
7. 🔴 **S11 词表范围=本批清理范围,且从术语表解析不内联**——词表面=`design/gdd/术语表.md`「退役词对照」节第一列全部词面(去括号注),**显式追加 `完美排雷` 完整短语**(该词受「对外命名纪律」约束,不在退役词对照表里,故需显式列入)。**明确不收**:①术语表「用语规范」A 表词面(`不得`/`报错`/`对标`/`若干`/`buff`)——§4 已列「不做」,收进来批末必然红;②单字「雷」——会误伤 26 处保留词「排雷玩法/排雷规则」(内部机制名,§10 明定不扩大禁词面)。**禁止在脚本里另抄一份词表**(单一事实源红线,ADR 漂移教训同类)。A 表词将来若被裁决纳入,另行扩词表并单独立批清扫。
7. 🔴 **S11 词表=术语表解析+显式排除单,不内联第二份**——词表面从 `design/gdd/术语表.md`「退役词对照」节解析第一列全部词面(去括号注)得 12 个,**显式追加 `完美排雷` 完整短语**(受「对外命名纪律」约束,不在退役词对照表里),再套**显式排除单 2 个**(带理由;排除单是词表的元数据不是第二份词表):
- **排除 `巢穴`**:`game/` 内 20 处命中全为玩家可见专名「巢穴预告」(`treasure_items.tres:99` display_name/`main.gd:913` toast 等)与风味层表述(「惊动巢穴」「巢穴敌」)——术语表该行自带「世界观风味层除外」注,B3 专名豁免;「巢穴(机制表述)」的清理**不在本批范围**(§4 不做),收进来批末 S11 必红 20 处。巢穴机制表述换代需用户裁后另立批。
- **排除 `旗`**:`tools/doc_term_audit.py` 既有判例「旗单字不入表(词面误报率高——旗帜/红旗等同族误伤)」;`game/` 内 6 处命中=5 处闸门自指(契约 9 覆盖)+1 处更名记载(`feats.tres:11`,B2 对照性文本)。单字旗如需清理随旗概念批另裁。
**明确不收**:①术语表「用语规范」A 表词面(`不得`/`报错`/`对标`/`若干`/`buff` 等)——§4 已列「不做」,收进来批末必然红;②单字「雷」——会误伤 64 处 / 26 个文件的保留词「排雷玩法/排雷规则」(内部机制名,§10 明定不扩大禁词面)。**禁止在脚本里另抄一份词表**(单一事实源红线,ADR 漂移教训同类)。A 表词/巢穴/旗将来若被裁决纳入,另行扩词表并单独立批清扫。
8. 🔴 **S11 必须带两道零命中自检**——①扫描面文件数为零即判红;②从术语表解析出的词面数为零即判红(沿 S3 教训:路径写歪或表格结构变了时,自检一起歪、一起红,不会静默恒绿)。
9. 🔴 **S11 闸门自指豁免**——命中行若属「检查禁用词本身」的闸门形态(行内含 `contains(`/`find(`/`grep`/`has_char(`/`禁「`/`禁『`/`零「`/`零『` 等检查或禁令表述),或含 `doc_term_audit.py` 同源的对照/历史信号,一律豁免、不判红。现存受此豁免的两处:`game/smoke/smoke_all.gd:1319`(禁字面检查逻辑)与 `game/tests/unit/presentation/ui_font_asset_test.gd:18`/`:19`(字形覆盖夹具)。
9. 🔴 **禁碰并行会话在改的文件**——`AGENTS.md` 与 `design/dev/code-conventions.md`(分支 `changelog-retire-20261019` 在盘未合回)。S11 规则说明自持于 `game/tests/static_scan.sh` 头注与 `game/tests/README.md`。
10. 🔴 **对照性文本豁免**——含退役/更名/禁令等信号的行不改写(术语表用语规范 B 类豁免条款)。
9. 🔴 **S11 闸门自指豁免**——命中行若属「检查禁用词本身」的闸门形态(行内含 `contains(`/`find(`/`grep`/`has_char(`/`禁「`/`禁『`/`零「`/`零『` 等检查或禁令表述),或含 `doc_term_audit.py` 同源的对照/历史信号,一律豁免、不判红。现存受此豁免的 5 处:`game/smoke/smoke_all.gd:1319`(禁字面检查逻辑)/`:1321`(零「雷/旗」断言描述)、`game/tests/unit/presentation/ui_font_asset_test.gd:18`/`:19`(字形覆盖夹具)、`game/data/tables/feats.tres:10`(desc 禁令引举)。**S11 规则说明自身与登记行一律用禁令引举句式**(如「禁「板级」「门票」……」)——既落 B2 对照性文本豁免,又天然触发本条自指豁免(否则闸本体的头注会被自己判红)。
10. 🔴 **禁碰并行会话在改的文件**——`AGENTS.md` 与 `design/dev/code-conventions.md`(分支 `changelog-retire-20261019` 在盘未合回)。S11 规则说明自持于 `game/tests/static_scan.sh` 头注与 `game/tests/README.md`。
11. 🔴 **对照性文本豁免**——含退役/更名/禁令等信号的行不改写(术语表用语规范 B 类豁免条款);本批的 B 类落点已全部显式枚举进 §2 豁免单,不再用行内子串现场判定。
12. 🔴 **parity 闸本批不发起、漂移记档、合回后另立重锚批**——N7 的 `_emit_row` 后移+`hl` 两态化会互换 `seal_miss`/`insurance_used` 两行的日志顺序并改写豁免态 `highlight`(`playtest_logger._on_step_row` 逐行落盘、七公共字段含 `highlight`),而 11 号闸对 JSONL 按 sha256 逐位比对——批准实跑必红,且闸令明载「不得借机重锚」。故本批 **不发起 parity**(回执落 NEED-APPROVAL:该态指纹记 skip、入 not_run,`all_green` 不受影响);预期漂移(豁免态/未豁免态各一例)写进实现报告「已记档差异」节;合回后另立**用户批准**的 parity 重锚批并登记 06,不得借任何批「顺手」重锚。N7 的行为正确性验收走 A10/A11/A12 正向断言(测试三层分工纪律①主力)。
---
@@ -152,13 +173,13 @@
**做**:
1. `game/` 内 `完美排雷`→`完美封印`(16 处,含对外文案 3 处)
2. `game/` 内注释面 `板级`→`整图`(26 处)
3. `game/` 内注释面 `门票`→`专长凭证`(35 处,剔除移交 3 处)
4. `game/` 内注释面 `正主`→`现行事实源`(11 处,剔除误报 1 处)
5. `game/` 内注释面 `落籍`→`已入库`(9 处,剔除历史注记 1 处)
1. `game/` 内 `完美排雷`→`完美封印`(21 处,含对外文案 3 处)
2. `game/` 内注释面 `板级`→`整图`(33 处)
3. `game/` 内注释面 `门票`→`专长凭证`(36 处,剔除移交 3 处与豁免 1 处)
4. `game/` 内注释面 `正主`→`现行事实源`(13 处,剔除误报 1 处与豁免 1 处)
5. `game/` 内注释面 `落籍`→`已入库`(9 处,剔除豁免 1 处)
6. **N7**:封印未中行归因锚改用有效误标判据,文案按两态改写
7. 代码域静态扫描闸新增 S11 规则(词表=退役词对照+`完美排雷`;含两道零命中自检与闸门自指豁免)
7. 代码域静态扫描闸新增 S11 规则(词表=术语表解析+显式排除单〔巢穴/旗〕+`完美排雷`;含两道零命中自检、闸门自指豁免与 4 处显式留档豁免)
8. `game/README.md`/`game/tests/README.md` 同步
9. 全量冒烟+单元+探针验证,绿数与基线一致
@@ -171,6 +192,7 @@
| `shop.tres:86`「奇物门票」与 `curio_interact_controller.gd:165-166` 玩家文案 | 属 奇物/专长 归类表述,与 06「冒记案遗留待裁两项」第①项同源 → 交文档侧定性后另走传导批 |
| `AGENTS.md`/`design/dev/code-conventions.md` | 并行会话 `changelog-retire-20261019` 在盘未合回,本批禁碰 |
| 术语表 A 表词(不得 14/报错 18/对标 1/若干 1/buff 22) | 待用户另裁;裁入则新立 06 条目与卡片 |
| 「巢穴(机制表述)」换代与单字「旗」清理 | S11 显式排除单已收理由(巢穴=玩家专名 B3+风味层除外注;旗=doc_term_audit 既有判例+6 处全豁免);两项清理均需用户裁后另立批(06 登记) |
| doc-conventions 第 4 节流程动词(收口 128/随批 20/台账 17/对拍 16/在飞 10/落文 2) | 同上 |
| 简明技术中文(STC)通用禁用词(缺省 105/情况 26/入参·出参 23/比较·较为·相对 22 等) | 同上 |
| 任何游戏逻辑/数值改动(N7 判据修正除外) | 禁止 |
@@ -208,7 +230,7 @@
| `game/README.md` | 切片架构说明 | 措辞换代 |
| `game/core/battle_orchestrator.gd` | 战斗编排器 | 注释+对外文案换代 |
| `game/core/settlement/grant_segment.gd` | 授予段 | 注释换代 + **N7 判据修正** |
| `game/core/minesweeper_rules.gd` 等 11 个 .gd | 注释承载 | 注释换代 |
| `game/core/minesweeper_rules.gd` 等 36 个 .gd | 注释承载 | 注释换代 |
| `game/data/tables/*.tres` | 数据表注释 | 注释换代 |
| `game/smoke/smoke_all.gd` | 冒烟断言 | 注释、断言描述与夹具期望字面量换代 |
| `game/tests/unit/**` | 单元测试 | 注释与断言描述换代 |
@@ -226,17 +248,18 @@
### T1 · S11 规则落闸并见红(≈1.0–1.5h)
- [ ] 在 `game/tests/static_scan.sh` 头部注释补 S11 一行说明(规则名+权威出处+扫描面+词表来源)
- [ ] 新增 S11 段:扫描面=`game/` 全域(.gd/.tres/.md/.json),与迭代 31 V4 判据同口径
- [ ] 逐行取注释文本段(`#`/`;` 前缀),剔除含对照/历史信号的行
- [ ] 词表面从 `design/gdd/术语表.md`「退役词对照」节解析第一列全部词面(去括号注),**显式追加 `完美排雷` 完整短语**;不收 A 表词、不收单字「雷」(契约 7)
- [ ] 命中行先过闸门自指豁免(行内含 `contains(`/`find(`/`grep`/`has_char(`/`禁「`/`禁『`/`零「`/`零『` 即跳过),再判红(契约 9)
- [ ] 在 `game/tests/static_scan.sh` 头部注释补 S11 说明(规则名+权威出处+扫描面+词表来源+豁免条款;**一律用禁令引举句式**,契约 9 末款)
- [ ] 新增 S11 段:扫描面=`game/` 全域 `.gd`/`.tres`/`.md`/`.json`/`.sh`(迭代 31 V4 四类+`.sh`——闸脚本自身注释面;`.txt` 不收=第三方字体许可证非本仓库文本)
- [ ] 注释文本段按类型取:`.gd`/`.sh` 取 `#` 后文本(整行注释与行尾注释都取);`.tres` 取 `;` 后文本;`.md` 取整行(文档正文即注释面);`.json` 无注释语法——保留扩展名但不产生注释段(V4 先例,`game/` 下 .json 五词现行零命中)
- [ ] 词表面从 `design/gdd/术语表.md`「退役词对照」节解析第一列全部词面(去括号注)得 12 个,**显式追加 `完美排雷`**,套显式排除单 `巢穴`/`旗`(契约 7,理由写在头注);不收 A 表词、不收单字「雷」
- [ ] 三层豁免依序过:①闸门自指(行内含 `contains(`/`find(`/`grep`/`has_char(`/`禁「`/`禁『`/`零「`/`零『` 即跳过,契约 9);②显式留档豁免单 4 处(§2 口径表:`enemy.tres:653`/`level_runner.gd:832`/`adventure_runner.gd:403`/`damage_math_test.gd:36`);③非注释面行不取(数据值与字符串字面量天然不入段——移交 3 处由此天然不含)
- [ ] 自检一:扫描面文件数为零即 `echo "[static_scan] S11 FAIL: 扫描面为空"` 并 `fail=1`
- [ ] 自检二:解析出的词面数为零即 `echo "[static_scan] S11 FAIL: 词表解析为空"` 并 `fail=1`
- [ ] 自检二:解析并套排除单后的词面数为零即 `echo "[static_scan] S11 FAIL: 词表解析为空"` 并 `fail=1`
- [ ] 命中即打印 `file:line + 命中词`,段末 `fail=1`
- [ ] 在 `game/tests/README.md` 的静态扫描登记处补 S11 一行(规则名/扫描面/词表来源/豁免条款)
- [ ] 在 `game/tests/README.md` 的静态扫描登记处补 S11 一行(规则名/扫描面/词表来源/三层豁免条款;同用禁令引举句式)
- [ ] 注入验证:在 `game/core/battle_orchestrator.gd` 某注释里临时写回「板级」一词 → 跑 `bash game/tests/static_scan.sh` 见红并记输出摘要 → `git checkout -- game/core/battle_orchestrator.gd` 精确还原 → 记录进实现报告变异验证表
- [ ] 反向验证:在 `game/smoke/smoke_all.gd:1319`(禁字面检查行)写回原句 → 跑闸**仍为绿**(验证自指豁免生效)→ 还原
- [ ] 反向验证二:把排除单里的 `巢穴` 删掉 → 跑闸见红且命中行含 `treasure_items.tres:99`(验证排除单是唯一拦住巢穴的机制)→ 还原
**取用**:无。
**产出**:`game/tests/static_scan.sh` 的 `S11` 段(退出码语义=任一硬失败规则命中即 `exit 1`,与现役同段同规)。
@@ -248,17 +271,18 @@
- [ ] `game/core/battle_orchestrator.gd:925` 行内字符串 `"完美排雷!清图奖励 ×2"` → `"完美封印!清图奖励 ×2"`
- [ ] `game/presentation/views/board_fx_view.gd:102` `_show_banner("完美排雷 ×2")` → `_show_banner("完美封印 ×2")`
- [ ] `game/presentation/views/battle_log_view.gd:194` 按两态改写(见 T7,判据修正后语义才成立;此处只落文本占位,不留「已破」字样在豁免态)
- [ ] 其余 13 处(11 处代码注释/文档注释 + smoke_all.gd:3512/3516/4076 断言描述 + :6201 夹具期望字面量)逐处换代(清单见 §2 N1 表)
- [ ] 其余 18 处(8 处代码注释/文档注释:`battle_orchestrator.gd:265`/`:911`/`:1296`、`settlement_table.gd:8`、`row_pacer.gd:92`、`board_fx_view.gd:2`/`:90`、`settlement_fx_view.gd:14`;4 处文档正文:`game/README.md:146`/`:168`/`:267`、`tests/smoke/critical-paths.md:20`;5 处 smoke 注释/断言描述:`smoke_all.gd:3503`/`:3512`/`:3513`/`:3516`/`:4076`;1 处夹具期望字面量:`smoke_all.gd:6201`)逐处换代(清单见 §2 N1 表)
- [ ] 跑 §2 末复现命令确认 `完美排雷` 零命中
**取用**:无。
**产出**:`game/` 内「完美排雷」零命中;对外文案三处读作「完美封印」。
### T3 · 板级 → 整图(≈1.0h)
### T3 · 板级 → 整图(≈1.5h)
- [ ] `game/core/battle_orchestrator.gd` 8 处(67/265/470/482/506/507/928/1213)换代
- [ ] `game/core/battle_orchestrator.gd` 9 处(67/265/445/470/482/506/507/928/1213)换代
- [ ] `game/core/board_data.gd` 2 处(17/53)换代
- [ ] 余 11 文件 16 处逐处换代(清单见 §2 N2)
- [ ] `game/presentation/hud_presenter.gd` 2 处(40/105)+ `game/smoke/ui_input_probe.gd` 1 处(4)换代(v1.3 补——两文件整文件不在旧清单内)
- [ ] 余 11 文件 19 处逐处换代(清单见 §2 N2:treasure_items 2/41/63、minesweeper_rules 126、variation_table 20/79、main 914、treasure_interact_controller 101、board_view 149/511/544、board_cell_unit 97、hero_info_panel_view 122/162、settlement_fx_view 146、smoke_all 1846/2588/2630、feat_vouchers_test 174)
- [ ] 跑 §2 末复现命令确认 `板级` 零命中
**取用**:无。
@@ -267,7 +291,8 @@
### T4 · 门票 → 专长凭证(注释面,≈1.0h)
- [ ] `game/core/adventure_runner.gd` 11 处注释换代(67/68/69/477/664/751/771/788/796/1033/1034)
- [ ] `game/core/level_runner.gd` 4 处(51/781/826/831)
- [ ] `game/core/level_runner.gd` 4 处(51/781/826/831)换代(`:832` 为历史注记,豁免单内不动)
- [ ] `game/core/config_db_cross_validator.gd:103` 注释换代(v1.3 补——「T5 门票豁免」活注释;`level_runner.gd:832` 同场豁免见 §2 口径表)
- [ ] `game/data/schemas/adventure_table.gd` 3 处(92/96/97)+ `shop_table.gd:18`
- [ ] `game/data/tables/shop.tres:104` 注释换代
- [ ] `game/presentation/curio_interact_controller.gd` 3 处(89/217/237)+ `curio_pick_overlay.gd:110`
@@ -275,21 +300,21 @@
- [ ] 复核标识符与数据键零改动(`feat_ticket` 族、`"feat_ticket"` 行族键、存档键)
**取用**:无。
**产出**:`game/` 注释面「门票」零命中;标识符与数据键保持原样。
**产出**:`game/` 注释面「门票」残留=豁免单 1 处(`level_runner.gd:832`);标识符与数据键保持原样。
### T5 · 正主 → 现行事实源(≈0.5h)
- [ ] 11 处换代(清单见 §2 N4,剔除 `damage_math_test.gd:36` 误报)
- [ ] 13 处换代(清单见 §2 N4,剔除 `damage_math_test.gd:36` 误报与 `adventure_runner.gd:403` 历史注记;含 v1.3 补的 `board_view.gd:843` 与 `static_scan.sh:73`——后者建议改「数值单一事实源自身」一类等价措辞,代拍板 1)
**取用**:无。
**产出**:`game/` 内「正主」零命中。
**产出**:`game/` 内「正主」残留=豁免单 2 处(`adventure_runner.gd:403` 历史注记+`damage_math_test.gd:36` 误报)。
### T6 · 落籍 → 已入库(≈0.5h)
- [ ] 9 处换代(清单见 §2 N5,剔除 `enemy.tres:653` 历史注记)
**取用**:无。
**产出**:`game/` 内「落籍」零命中。
**产出**:`game/` 内「落籍」残留=豁免单 1 处(`enemy.tres:653` 历史注记)。
### T7 · N7 归因锚判据修正(≈1.5h)
@@ -298,6 +323,7 @@
- [ ] 把 `core/settlement/grant_segment.gd:302` 的 `oc._emit_row("seal_miss", ...)` **后移**到 `for h in oc._fx_emit("seal_missed", ...)` 循环(:308-317)**之后**——循环结束后 `_perfect_forgiven` 已就位,判据才有真值可用
- [ ] 判据改有效误标:`var hl := "perfect_broken" if oc._perfect_hit_false - oc._perfect_forgiven == 1 else ""`(替代原 :300 的 RAW 计数 `oc._perfect_hit_false == 1`)
- [ ] 确认行序调换的零影响:`grep -n "insurance_used\|perfect_insurance" game/smoke/smoke_all.gd` 已实测**零命中**——冒烟未断言这两行的相对顺序,调换不涉断言
- [ ] **parity 漂移记档(契约 12)**:`playtest_logger._on_step_row` 逐行落盘且含 `highlight` 字段——本修改互换 `seal_miss`/`insurance_used` 两行顺序并改写豁免态 `hl`,11 号闸 JSONL 逐位比对必红;本批不发起 parity,把预期漂移(豁免态/未豁免态各一例,含两行顺序与 `highlight` 取值)写进实现报告「已记档差异」节,供合回后的用户批准重锚批对照
- [ ] 文案两态:未豁免(`hl == "perfect_broken"`)→ `(本图完美封印已破——清图奖励不再加倍)`;已豁免(`hl == ""`)→ `(首次封印落空已豁免——不计入完美封印判定)`
- [ ] 豁免态**不加金框**——`hl == ""` 时 `battle_log_view.gd:195` 走普通色分支;金框语义=强调负面事件,豁免是正向事件,靠同批已存在的 `insurance_used` 行(:316-317)承载反馈即可。不新增高光标记
- [ ] 正向断言 A10/A11(见 §7)
@@ -309,14 +335,14 @@
- [ ] 跑代码域档验收(按本批改动域选档),确认所选域全绿
- [ ] 确认回执 `game/tests/.gates/receipt.json` 的 commit = 分支 tip 且 `all_green=true`
- [ ] 写 `reports/iter32-实现报告-<日期>.md`(各卡状态+改前改后读数对照+实机目检总清单+遗留读数义务)
- [ ] 写 `reports/iter32-实现报告-<日期>.md`(各卡状态+改前改后读数对照+实机目检总清单+遗留读数义务+**已记档差异节**:parity 预期漂移两例〔豁免态/未豁免态各一:`seal_miss`/`insurance_used` 两行顺序互换+豁免态 `highlight` 取值〕+**06 登记项**:合回后用户批准的 parity 重锚批)
- [ ] 写 `reports/iter32-代拍板-<日期>.md`
- [ ] 写 `reports/iter32-反哺点-<日期>.md`(§5 每条都要有落点)
**取用**:T1–T7 全部产出。
**产出**:`reports/` 三份产出物 + 可合回的分支 tip。
**估时合计 ≈8.5–10.0h**。切分预案(超 8h 即生效):T3/T4 各拆「核心层」与「呈现+测试」两卡串行施工;T7 独立成卡可单独验收,必要时可拆出本批另立缺陷批。
**估时合计 ≈9.0–10.5h**(v1.3:T3 26→33 处、T2 补 4 处、T4/T5 各补 1–2 处、T1 增反向验证二,T3 估时 1.0→1.5h)。切分预案(超 8h 即生效):T3/T4 各拆「核心层」与「呈现+测试」两卡串行施工;T7 独立成卡可单独验收,必要时可拆出本批另立缺陷批。
---
@@ -326,12 +352,12 @@
| # | 需求点 | 测什么(断言/行为) | 怎么测(落点) | 谁验 |
|---|---|---|---|---|
| A1 | N1 | `game/` 内 `完美排雷` 疑似现行计数 == 0 | grep 复现命令+同脚本口径 | 自动(S11+收尾 grep) |
| A2 | N1 | 对外文案三处文本恰为「完美封印…」,且不含「雷」字面 | 新冒烟断言:取清图高光行 `display_name`,断言 `find("雷") == -1` 且 `find("完美封印") >= 0`;落点 `game/smoke/smoke_all.gd` 清图段 |
| A3 | N2 | `game/` 内 `板级` 计数 == 0 | 同 A1 | 自动 |
| A4 | N3 | `game/` 注释面 `门票` 计数 == 0;且 `feat_ticket` 标识符与存档键**保持原样** | 同 A1 + 断言:`_feat_ticket_pity` 等标识符仍在位 | 自动 |
| A5 | N4 | `game/` 内 `正主` 计数 == 0 | 同 A1 | 自动 |
| A6 | N5 | `game/` 内 `落籍` 计数 == 0(历史注记行豁免) | 同 A1 | 自动 |
| A1 | N1 | `game/` 内 `完美排雷` 计数 == 0(全清,无豁免) | grep 复现命令+同脚本口径 | 自动(S11+收尾 grep) |
| A2 | N1 | 对外文案三处文本恰为「完美封印…」,且不含「雷」字面 | 新冒烟断言:取清图高光行 `display_name`,断言 `find("雷") == -1` 且 `find("完美封印") >= 0`;落点 `game/smoke/smoke_all.gd` 清图段。另两处字符串字面量(`board_fx_view.gd:102` banner/`battle_log_view.gd:194` 行)S11 扫不到(只扫注释面)——同段加静态读取断言:读两处源文本行,`find("雷") == -1` 且含「完美封印」 | 自动 |
| A3 | N2 | `game/` 内 `板级` 计数 == 0(全清,无豁免) | 同 A1 | 自动 |
| A4 | N3 | `game/` 注释面 `门票` 计数 == 豁免单 1 处(`level_runner.gd:832` 历史注记);且 `feat_ticket` 标识符与存档键**保持原样** | 同 A1(注释面口径天然不含移交 3 处)+ 断言:`_feat_ticket_pity` 等标识符仍在位 | 自动 |
| A5 | N4 | `game/` 内 `正主` 计数 == 豁免单 2 处(`adventure_runner.gd:403` 历史注记+`damage_math_test.gd:36` 误报) | 同 A1 | 自动 |
| A6 | N5 | `game/` 内 `落籍` 计数 == 豁免单 1 处(`enemy.tres:653` 历史注记) | 同 A1 | 自动 |
| A7 | N6 | S11 规则在位:注入禁用词 → 退出码 1 且输出含 `S11 FAIL`/命中行 | 注入实验,落点 `game/tests/static_scan.sh` | 自动(人工执行一次取证) |
| A8 | 全域 | 冒烟绿数 == 基线 1151、单元 34 套全绿、探针段绿 | 跑所选域档 | 自动 |
| A9 | 全域 | 回执 commit == 分支 tip 且 `all_green=true`,零新增红 | 跑闸后读 `game/tests/.gates/receipt.json` | 自动(合回闸) |
@@ -339,9 +365,9 @@
| **A11** | **N7** | **装备完美保险:本战首次标错 → `seal_miss` 行的 `highlight` 字段 == `""`,且 `perfect_sweep_earned() == true`(加倍仍发)** | 同上 | 自动 |
| **A12** | **N7** | 两态文案常量与 `battle_log_view.gd` 呈现一致:`_format_row` 对 `hl=="perfect_broken"` 输出「已破」态、对 `hl==""` 输出豁免态,两态均不含「雷」字面 | 断言落点 `tests/unit/core/feat_vouchers_test.gd`(取行字段后按同一分支规则格式化比对) | 自动 |
**测试方式两分法**:A1–A7、A10–A11 属能力验证(静态扫描/断言直取数据)与取证实验;A8–A9 为运行期验证。玩家可见文案的最终观感归**用户目检**(登记不阻塞):结算明细中封印未中行的两态文案可读性。
**测试方式两分法**:A1–A7、A10–A12 属能力验证(静态扫描/断言直取数据)与取证实验;A8–A9 为运行期验证。玩家可见文案的最终观感归**用户目检**(登记不阻塞):结算明细中封印未中行的两态文案可读性。
**闸口径**:按本批改动域选档跑 `tools/run_all_gates.sh`(本批只触 `game/` 与 `reports/` → 代码域档);跑完写回执。
**闸口径**:按本批改动域选档跑 `tools/run_all_gates.sh`(本批只触 `game/` 与 `reports/` → 代码域档);跑完写回执。**11 号 parity 闸将落 NEED-APPROVAL**(diff 触 `game/core/settlement/`)——该态指纹记 skip、入 `not_run`,`all_green` 不受影响(契约 12:本批不发起、漂移记档、合回后另立用户批准的重锚批)。
**回归措辞模板**:「里程碑步(波/T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试/工具先行孤立验证再并入全套」。
@@ -354,7 +380,8 @@
| S11 扫描面 | 临时把 `DIR_CORE` 改成不存在目录 | `bash game/tests/static_scan.sh` | `S11 FAIL: 扫描面为空` |
| **N7 判据(反)** | `grant_segment.gd` 判据改回 `_perfect_hit_false == 1`(RAW 计数) | `tests/unit/core/feat_vouchers_test.gd` | 断言 A11 红(装备专长时 `highlight` 应为 `""` 却得 `"perfect_broken"`) |
| **N7 判据(正)** | 判据改成 `_perfect_hit_false + _perfect_forgiven == 1`(符号写反) | 同上 | 断言 A10 红(未装备专长时 `highlight` 应为 `"perfect_broken"` 却得 `""`) |
| **S11 自指豁免** | 去掉 S11 的闸门自指豁免分支 | `bash game/tests/static_scan.sh` | `smoke_all.gd:1319` 与 `ui_font_asset_test.gd:18` 判红 |
| **S11 自指豁免** | 去掉 S11 的闸门自指豁免分支 | `bash game/tests/static_scan.sh` | `smoke_all.gd:1319`/`:1321`、`ui_font_asset_test.gd:18`、`feats.tres:10` 判红 |
| **S11 排除单** | 把排除单里的 `巢穴` 删掉 | `bash game/tests/static_scan.sh` | 判红且命中行含 `treasure_items.tres:99`(「巢穴预告」display_name) |
注入后一律 `git checkout -- <file>` 精确还原,四件(变异点 file:行/跑的闸/红输出摘要/还原结论)记进实现报告变异验证记录表。
@@ -370,7 +397,7 @@
3. 改前改后同种子读数不一致;
4. S11 注入后不变红(判据无效);
5. 触碰并行会话在改文件(`AGENTS.md`/`design/dev/code-conventions.md`);
6. **N7 上移 `_perfect_forgiven` 累加后,奖励兑付结果与改前不一致**(说明改到了兑付行为,而非只改文案判据)。
6. **N7 后移 `_emit_row` 后,奖励兑付结果与改前不一致**(说明改到了兑付行为,而非只改文案判据)。
---
@@ -398,6 +425,8 @@
| 完美排雷 | 全库统一换代为「完美封印」,含代码内部注释——2026-10-19 用户裁;据此推翻 `需求卡片-凭证件裁削批`:108「内部开发用语按 v3.15 纪律保留」半句,卡片条款订正归文档轨批 |
| 排雷(模块名) | **不扩大禁词面**。「排雷玩法/排雷规则」是内部机制名(=扫雷推理层的玩法动作总称,见 `00-游戏概念.md:5`),GDD 目录即 `systems/排雷循环/`,术语表正文在用,26 个文件保持原样 |
| 门票 | 仅换代注释措辞;标识符与数据键零改动;玩家可见两处(`shop.tres:86`/`curio_interact_controller.gd:165-166`)移交文档侧定性 |
| 归因锚判据(N7) | 并入本批:`grant_segment.gd:300` 改用有效误标口径(总数 − 豁免数),豁免累加上移到 `_emit_row` 之前;文案按两态改写——2026-10-20 用户裁 |
| 归因锚判据(N7) | 并入本批:`grant_segment.gd` 封印未中行改判有效误标口径(误标总数 − 豁免数),`_emit_row` 后移到 `_fx_emit` 豁免循环之后使判据有真值可用;文案按两态改写——2026-10-20 用户裁(修法 v1.2 定型:上移豁免累加需重复调用 `_fx_emit` 会重复消费限次,已核实不可行) |
**禁用词机检闸不扩到 `game/`**(用户裁:代码与文档分开管理);代码侧改用代码域自己的静态扫描闸 S11,词表从 `design/gdd/术语表.md` 解析,不内联第二份。
**S11 显式排除单 2 词**(v1.3 工程推导,非用户裁决——依据:术语表该行自带风味层除外注+B3 专名豁免+`doc_term_audit.py` 既有判例):`巢穴`(20 处全为玩家专名「巢穴预告」与风味层表述,机制表述换代需用户裁后另立批)、`旗`(单字误报率高,6 处残留全豁)。A 表词/巢穴机制表述/单字旗将来若被裁决纳入,另行扩词表并单独立批清扫。