chore(批后收尾): 迭代 31 产出物与两卡退役——吸收即死删除,06/roadmap 账面换代

- 反哺点 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(卡片退役后不留死径)
This commit is contained in:
DKChan committed 2026-10-20 15:28:38 +08:00
1 parent 76825590c2
commit df4518d878
8 files changed
+7 -777

No files matched your search

+2 -21
View File
@@ -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**,主区现值仍是旧文;合并动作归用户另会话,本批不代做。
@@ -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 历史可考。
-44
View File
@@ -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` 的定义改写为「首次标错受检」;丙:改判据需动发射时机=需重开设计 | **乙**(改文档措辞即可自洽,代码零动) |
-67
View File
@@ -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) |
-94
View File
@@ -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 处)——属卡片「发现未列落点按契约同步即可」口径,仍登记以便写卡段回看。
@@ -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 卡①,合并 `<commit>`,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)。
@@ -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」。
本卡不等冒记遗留两项(凭证归专长/资源=转换源判据句)的裁定——那两项不阻塞本卡。
+3 -3
View File
@@ -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/ 现存路径或本保留字,不填「—」。