docs(迭代32收尾批): 批后收尾与中间文档退役——八件产出物退役+账面换代,文档域闸全绿
- reports/ 退役六件 iter32 产出物(实现报告/代拍板追认单/反哺点清单×2卡)+两张需求卡片(判据全过:29 项反哺已写入、代拍板 14 条用户全追认、遗留读数义务已迁体验验证清单 ㉚/待办清单重锚条目) - 待办清单整条删除四处:计数器寿命域未统一/代码注释禁用词清扫批(完成即删)/卡①卡②反哺专条(已写入即删);重锚条目指针改结论内联+git 提交号 - 提案死链改写(卡片指路句换 git 提交号 f2bb5871);roadmap 迭代 32 行「已完成(2026-10-21)」+卡片与报告列填退役保留字;当前位三行换代(下一动作=编排迭代 33) 〔迭代 32 收口登记:卡① 880ee91b/卡② d00f24a8/反哺写入 fc1e8027〕
This commit is contained in:
1 parent
fc1e802721
commit
cd72943032
11 files changed
+5
-1147
No files matched your search
@@ -555,7 +555,7 @@ func counters_merge_export(exported):
|
||||
|
||||
### 10.1 行号订正汇总
|
||||
|
||||
> 🔴 **2026-10-20 再漂移注记**:本表「实际」列的行号以提案复核时点为准;其后的 `c5200b6b`(禁写变更记录批·代码注释清偿)已使本文件部分行号再度漂移(如引擎成员块现役 :83-88、`counters_seed` :255、`EffectEngine.new` :271、树合成行 :136-155)。行号时效以需求卡片 `reports/需求卡片-效果引擎无状态化批-2026-10-20.md`(开工前实查)为准,本节数字仅作沿革参考。
|
||||
> 🔴 **2026-10-20 再漂移注记**:本表「实际」列的行号以提案复核时点为准;其后的 `c5200b6b`(禁写变更记录批·代码注释清偿)已使本文件部分行号再度漂移(如引擎成员块现役 :83-88、`counters_seed` :255、`EffectEngine.new` :271、树合成行 :136-155)。行号时效以开工前代码实查为准(对应需求卡片已随迭代 32 退役,全文见 git 提交 f2bb5871),本节数字仅作沿革参考。
|
||||
|
||||
| 草案初版写法 | 实际 | 说明 |
|
||||
|---|---|---|
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
# 迭代 32 卡① 代拍板追认单(2026-10-20)
|
||||
|
||||
批次内落入卡片 §9 代拍板白名单的微决策,逐条备案确认(授权发生于卡片审问阶段,实现只执行预授权)。
|
||||
|
||||
| # | 决策 | 白名单条目 | 落点 |
|
||||
|---|---|---|---|
|
||||
| 1 | 注释换代措辞等价微调:`static_scan.sh:73`「数值单一事实源的正主」→「数值单一事实源自身」(等价表述,非硬套「现行事实源」致句意断裂) | §9.1 | static_scan.sh:73 |
|
||||
| 2 | `落籍`→`已入库` 在带 commit 号(9cc4b8b)的历史注记行不改,保留「已落籍」 | §9.2 | enemy.tres:653 |
|
||||
| 3 | `正主` 误报处「正主角池」(正主+角池)不改 | §9.3 | damage_math_test.gd:36 |
|
||||
| 4 | 测试断言描述文本替换措辞取语义等价 | §9.4 | smoke_all 注释/断言描述 |
|
||||
| 5 | S11 规则段 shell 写法:用 `find + xargs awk` 单次调用(词表 getline 载入、三文件类型分道),与现役 S 段同构退出码语义 | §9.5 | static_scan.sh S11 段 |
|
||||
| 6 | N7 两态文案末字:已破态「清图奖励不再加倍」、豁免态「不计入完美封印判定」,因果不变成立 | §9.6 | battle_log_view.gd:192 |
|
||||
| 7 | battle_log_view 局部变量改名 `suffix`→`miss_note` 避开外层同名遮蔽(实现细节,非语义) | §9.5 延伸 | battle_log_view.gd |
|
||||
|
||||
**超白名单呈报(已停机自查消解,非代裁)**:
|
||||
- 卡片 §2 豁免单预测的 `level_runner.gd:832`、`adventure_runner.gd:403` 两处,开工复核发现现行代码该行已无对应退役词(卡片成文后代码前进)。据「开工自行复核」条款按现实处理:无需豁免(词已不在该位),S11 注释面为权威判据。不新增豁免、不改代码凑绿。
|
||||
- 全局 sed 曾误改移交三处(display_name/玩家文案)与 static_scan.sh 词表追加行,已逐处精确还原并补 S11 自指豁免,属施工返工非代拍板。
|
||||
@@ -1,44 +0,0 @@
|
||||
# 迭代 32 卡① 反哺点清单(2026-10-20)
|
||||
|
||||
本批为代码实现批,禁写 `design/` 整目录与根规则文件。发现要改文档的点逐条列此,用户在会话裁决后归文档批落文(`design/` 对本批只读)。落点对应卡片 §5 关联文档同步面。
|
||||
|
||||
## GDD 文档面(「完美排雷」→「完美封印」措辞同步)
|
||||
|
||||
| # | 文档 | 关联点 | 建议改成 | 依据 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | `design/gdd/术语表.md` | 「对外命名纪律」节可补「完美封印」为玩家面正式名对照行(现仅散见于各系统文档) | 增一行:完美排雷〔旧〕→完美封印〔现行正式名〕 | 2026-10-19 用户裁全库统一;代码侧 S11 词表已显式追加「完美排雷」禁词 |
|
||||
| 2 | `design/gdd/systems/战斗循环/战斗结算.md`(:85/:108/:116/:139/:141/:161/:259/:342) | 全篇仍称「完美排雷」,与 `奇物.md` v3.18 的「完美封印」同名异称 | 正文「完美排雷」→「完美封印」;当量公式行 :108 同步 | 卡片 §0 出处;对外命名纪律含 UI 文案 |
|
||||
| 3 | `design/gdd/systems/战斗循环/地图战斗资源.md`(:155/:194) | 兑付结构段称「完美排雷」 | →「完美封印」 | 同上 |
|
||||
| 4 | `design/gdd/systems/战斗循环/战斗表现.md`(:53/:68) | 表现段称「完美排雷」 | →「完美封印」 | 代码 `board_fx_view`/`settlement_fx_view` 已换 |
|
||||
| 5 | `design/gdd/systems/表现与支撑/HUD框架.md`(:277) | HUD 文案引用「完美排雷」 | →「完美封印」 | 代码 `battle_log_view` 已换 |
|
||||
| 6 | `design/gdd/systems/冒险循环/难度曲线与Boss.md`(:224/:227/:313) | 「完美排雷」措辞 | →「完美封印」 | 同名异称统一 |
|
||||
| 7 | `design/gdd/ux/battle.md`(:85/:222/:422) | 战斗画面交互文案「完美排雷」 | →「完美封印」 | 对外命名纪律 |
|
||||
| 8 | `design/gdd/ux/interaction-patterns.md`(:90) | 「完美排雷」 | →「完美封印」 | 同上 |
|
||||
| 9 | `design/art/art-bible.md`(:8/:88/:562/:574) | 「完美排雷」措辞 | →「完美封印」 | 同名异称 |
|
||||
|
||||
## 07 体验验证清单(真人目检入册)
|
||||
|
||||
| # | 文档 | 关联点 | 建议 |
|
||||
|---|---|---|---|
|
||||
| 10 | `design/gdd/07-体验验证清单.md`(:142) | 「完美排雷」措辞;本批对外文案变更需登记目检项 | 措辞→「完美封印」;新增目检项:结算明细 seal_miss 两态文案(已破带金框/已豁免普通色)呈现与 `perfect_sweep_earned()` 真值一致 |
|
||||
|
||||
## 待文档侧定性的归类项(非本批代裁)
|
||||
|
||||
| # | 项 | 现状 | 建议去向 |
|
||||
|---|---|---|---|
|
||||
| 11 | `shop.tres:86`「奇物门票」display_name + `curio_interact_controller.gd:165/166` 玩家文案 | 移交三处,本批保留「门票」原词(属 奇物/专长 归类表述,与 06「冒记案遗留待裁两项」第①项同源) | 交文档侧定性后另走传导批;勿并入本清扫 |
|
||||
| 12 | 「巢穴(机制表述)」换代 + 单字「旗」清理 | S11 显式排除单已收理由(巢穴=玩家专名+风味层除外注;旗=doc_term_audit 判例,残留全豁) | 两项均需用户裁后另立批(登记 06) |
|
||||
| 13 | S11 词表纳入 A 表词(不得/报错/对标/若干/buff) | 本批明确不收(收则批末必红) | 若将来裁决纳入,另扩词表并单独立清扫批 |
|
||||
| 14 | 卡片 §2 豁免单预测 `level_runner.gd:832`、`adventure_runner.gd:403` | 开工复核:现行代码该行已无对应退役词(卡片成文后代码前进) | 反哺点记录卡片与现实偏差;卡片如需订正归文档批 |
|
||||
|
||||
## parity 重锚批(登记 06)
|
||||
|
||||
| # | 项 | 建议 |
|
||||
|---|---|---|
|
||||
| 15 | N7 改动致 `seal_miss`/`insurance_used` 行序与 highlight 漂移(契约 12) | 合回后另立**用户批准**的 parity 重锚批并登记 06;预期漂移两例见实现报告「已记档差异」节 |
|
||||
|
||||
## 06 待办清单
|
||||
|
||||
| # | 项 | 建议 |
|
||||
|---|---|---|
|
||||
| 16 | 本批条目「代码注释禁用词清扫」状态推进 | 卡①合回后由文档批推进至「实现已闭合」;本批不写 06 |
|
||||
@@ -1,77 +0,0 @@
|
||||
# 迭代 32 卡① 实现报告·代码注释禁用词清扫批(2026-10-20)
|
||||
|
||||
- **批次**:迭代 32 执行序①(代码注释禁用词清扫批)
|
||||
- **分支**:`g-plan2-iter32-card1-comment-sweep`
|
||||
- **合回前 tip**:`b3b77ff1`
|
||||
- **闸回执**:`game/tests/.gates/receipt.json`,domain=code,all_green=true,commit=1bbbdba4(T7 提交后单测与变异重跑绿)
|
||||
|
||||
## 各任务卡状态
|
||||
|
||||
| T 卡 | 状态 | 说明 |
|
||||
|---|---|---|
|
||||
| T0 基线 | 完成 | 主区基线:冒烟 1151/0、单元 34 套全绿、探针 --click 全绿、static_scan 退出 0 |
|
||||
| T1 S11 落闸见红 | 完成 | 规则先落、见红 89 处;提交 85dce2c7 |
|
||||
| T2 完美排雷→完美封印 | 完成 | 21 处(含对外文案 3 处 + 冒烟夹具期望字面量 6201) |
|
||||
| T3 板级→整图 | 完成 | 33 处 |
|
||||
| T4 门票→专长凭证 | 完成 | 注释面 36 处;移交 3 处保留「门票」 |
|
||||
| T5 正主→现行事实源 | 完成 | 13 处;`正主角池` 误报守护 |
|
||||
| T6 落籍→已入库 | 完成 | 9 处;enemy.tres:653 历史注记保留 |
|
||||
| T7 N7 判据修正 | 完成 | 提交 1bbbdba4 |
|
||||
| T8 验证与产出物 | 进行中 | 本报告 + 代拍板单 + 反哺点清单 |
|
||||
|
||||
T2–T6 合并提交 b6629d68(39 文件 / 118 行纯文本)。
|
||||
|
||||
## 改前改后读数对照
|
||||
|
||||
| 读数 | 改前 | 改后 |
|
||||
|---|---|---|
|
||||
| 冒烟绿数 | 1151 | 1151(零变) |
|
||||
| 单元套件 | 34 全绿 | 34 全绿(含新增 A10–A12) |
|
||||
| static_scan 退出码 | 0 | 0 |
|
||||
| S11 注释面命中 | 89(T1 见红) | 0(T2–T7 清零) |
|
||||
| 五词 raw grep 残留 | 119 | 8(全为豁免/移交/闸门自指,非注释面) |
|
||||
|
||||
**五词 raw grep 残留 8 处逐条**:`enemy.tres:653`(落籍·豁免·历史注记)、`shop.tres:86`(门票·移交 display_name)、`curio_interact_controller.gd:165/166`(门票·移交玩家文案)、`static_scan.sh:97/100/122`(完美排雷·S11 闸门自指)、`damage_math_test.gd:36`(正主角池·误报豁免)。
|
||||
注:卡片 §2 豁免单预测的 `level_runner.gd:832`、`adventure_runner.gd:403` 经开工复核,现行代码该行已无对应退役词(卡片成文后代码前进),故不出现;S11 注释面口径为权威判据,现绿。
|
||||
|
||||
## N7 归因锚修正(本批唯一逻辑改动)
|
||||
|
||||
- `_emit_row("seal_miss")` 从 `_fx_emit("seal_missed")` 循环**之前**后移到**之后**,使 `_perfect_forgiven` 先就位;
|
||||
- 判据从 RAW(`_perfect_hit_false == 1`)改为有效误标(`_perfect_hit_false - _perfect_forgiven == 1`);
|
||||
- 文案两态:`perfect_broken` →「本图完美封印已破——清图奖励不再加倍」+金框;`""` →「首次封印落空已豁免——不计入完美封印判定」+普通色;
|
||||
- `battle_log_view` 变量 `suffix` 与外层同名冲突,改名 `miss_note`;
|
||||
- 奖励兑付结果零变(只改日志文案判据,契约 5)。
|
||||
|
||||
## 验收断言 A10–A12(落 feat_vouchers_test.gd,随 T7 同轮)
|
||||
|
||||
- **A10** 未豁免:无保险首次标错 → seal_miss 行 `highlight=="perfect_broken"` 且 `perfect_sweep_earned()==false`;
|
||||
- **A11** 豁免:带保险首次标错 → seal_miss 行 `highlight==""` 且 `perfect_sweep_earned()==true`;
|
||||
- **A12** 呈现:`_format_row` 两态文案含「完美封印已破」/「已豁免」,均零「雷」字面。
|
||||
|
||||
## 变异验证记录表
|
||||
|
||||
| 变异点 | 注入形态 | 跑的闸 | 红输出 | 还原 |
|
||||
|---|---|---|---|---|
|
||||
| S11 拦截 | battle_orchestrator.gd:265 注释追加「板级」 | static_scan.sh | `S11 FAIL 命中 1 处` | checkout 还原→ok(194 文件/10 词) |
|
||||
| N7 反(RAW) | grant_segment 判据改回 `_perfect_hit_false == 1` | feat_vouchers | `A11 豁免…FAIL` EXIT=1 | 还原 |
|
||||
| N7 阈值(破 A10) | 判据 `== 1` 改 `== 2` | feat_vouchers | `A10 未豁免…FAIL` EXIT=1 | 还原 |
|
||||
|
||||
注:卡片 §7「正变异(符号写反 +)」经实测在未装备专长(forgiven=0)时 `−`/`+` 等价、不破坏 A10,故改用阈值变异 `== 2` 证 A10 拦截能力;A11 由 RAW 变异证拦截。A12 为文案常量比对,随 A10/A11 判据承载,无独立变异。
|
||||
|
||||
## 已记档差异(parity·契约 12)
|
||||
|
||||
本批 N7 改动互换 `seal_miss`/`insurance_used` 两行日志顺序并改写豁免态 `highlight`,`playtest_logger._on_step_row` 逐行落盘含 `highlight` 字段,11 号闸 JSONL sha256 逐位比对必红。**本批不发起 parity**(回执 11 号落 skip、入 not_run,all_green 不受影响)。
|
||||
|
||||
预期漂移两例(供合回后用户批准重锚批对照):
|
||||
1. **豁免态**(带保险首次标错):改前 `seal_miss`(highlight=perfect_broken)先于 `insurance_used`;改后 `insurance_used` 先、`seal_miss`(highlight 空)后,highlight 取值由 perfect_broken 变空;
|
||||
2. **未豁免态**(无保险首次标错):两行相对顺序不变(无 insurance_used 行),`seal_miss` highlight 恒 perfect_broken,但 emit 时点后移到 seal_missed 循环之后。
|
||||
|
||||
## 实机目检总清单(登记不阻塞)
|
||||
|
||||
- 结算明细中「完美保险·标错豁免」行与「封印未中」行的先后呈现是否符合预期(豁免在前、未中不带金框);
|
||||
- 无保险首次标错的「封印未中」行带金框+「本图完美封印已破——清图奖励不再加倍」文案可读性;
|
||||
- 对外高光行「完美封印!清图奖励 ×2」与 banner「完美封印 ×2」显示正确。
|
||||
|
||||
## 遗留读数义务
|
||||
|
||||
- 合回后另立**用户批准**的 parity 重锚批(登记 06),本批不借任何批顺手重锚。
|
||||
@@ -1,17 +0,0 @@
|
||||
# 迭代 32 卡② 代拍板追认单(2026-10-20)
|
||||
|
||||
批次内落入卡片 §11 代拍板白名单的微决策,逐条备案确认(授权发生于卡片审问阶段,实现只执行预授权)。
|
||||
|
||||
| # | 决策 | 白名单条目 | 落点 |
|
||||
|---|---|---|---|
|
||||
| 1 | 负面套件命名/夹具诊断文案("违规表被放行""校验通道静默化""正确拒绝")措辞,退出码协议 1/2 已锁 | §11.6 | counter_prefix_fatal_test.gd |
|
||||
| 2 | 引用闭合声明集口径:采「任一 do.counter_id 行」而非「仅 kind=counter_add」——因 insurance_used 经 `forgive_seal_miss` 行的 do.counter_id 由 _apply_counter_hit 写入,严版会误判其为悬空 | §11.3 延伸(判据语义微调,成员判定本体不变) | config_db_cross_validator.gd ⑦ |
|
||||
| 3 | S12 段 shell 写法:`find | xargs -0 grep -lEn` 命中文件数 + 非空自检,与现役 S 段同构 | §11.7 | static_scan.sh S12 |
|
||||
| 4 | 冒烟裸引擎段 ctx 取用:rig 段取 `orch.counters_ctx`(真实挂载路径),_smoke_tree_rules standalone 引擎自建 `EffectContext.new()`(sense 用共享 level 字典引用复刻跨战持久) | §11.2 | smoke_all.gd |
|
||||
| 5 | effect_words_t1 ⑥⑦重写措辞(adventure 桶共享字典往返/round_ 前缀整桶清空 vs battle 无前缀存活),断言语义承卡片 §4.1 D1/E1 | §11.1 | effect_words_t1_test.gd |
|
||||
| 6 | parity 复放文件名与判读排版(off/formed/rules 三组、--mode 两判据、字段集从基线推导)内部实现自由 | §11.7/§11.8 | parity_compare.py |
|
||||
| 7 | V16 既有断言写键 twin_digs→adv_twin_digs、V13 旧键用字符串拼接构造(避 S12 旧件扫描字面,语义不变) | §11.1 延伸 | feat_vouchers_test.gd |
|
||||
|
||||
**超白名单呈报(消解,非代裁)**:
|
||||
- **S 编号冲突**:卡片 §7 写「static_scan.sh 新增 S11 段」,但卡①(执行序①,先合入 master)已占用 S11(代码注释禁用词)。本批旧件扫描落 **S12**(顺延取下一号),判据与扫描面严格按卡片 §7 F1/V10 实现。此属卡片成文时 S11 未定义的现实偏差,归反哺点,未改卡片、未凑绿。
|
||||
- **V12 基线重采**:卡片 T0 记录预采基线 game 树哈希 f75acc15;卡① 改 game/ 后树前进到 4b34a656,据卡片 T0「若不等则留盘基线作废、按 T7 命令重采」条款重采三组 40 局;重采基线哈希 2d3d4247/0fcbcb26 逐字复现卡片在册值,证明重采口径与卡片一致。
|
||||
@@ -1,51 +0,0 @@
|
||||
# 迭代 32 卡② 反哺点清单(2026-10-20)
|
||||
|
||||
代码实现批,禁写 `design/` 与根规则文件。要改文档的点逐条列此,用户裁决后归文档批落文。对应卡片 §6 关联文档同步面。
|
||||
|
||||
## architecture.md(三处)
|
||||
|
||||
| # | 位置 | 现陈述 | 建议改成 | 依据 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 模块归属表 effect_engine 行「对外暴露」列(:116) | 记 `counters_export·counters_seed` 与「domain=adventure 跨战斗持久」 | 改写为 ctx 形态:`dispatch(ctx,...)`/静态 `counter_add·counter_spend·bucket_of`;跨战持久=经 EffectContext 引用宿主持有桶(无 export/seed) | 搬运链已整段删除,该陈述失义 |
|
||||
| 2 | 战斗域装配现状节(:125) | 「战末 export/开局 seed 时点语义不变」 | 删除或改「adventure 桶经 ctx 引用直写 RunLedger,无搬运时点」 | 同上 |
|
||||
| 3 | 「架构原则」节 | 缺「系统无状态」条目 | 补一条(立项判据)——**指向 06 在册条目「效果引擎系统无状态原则缺架构文档条目」**,由文档批执行补条 | 卡片 §6 + 提案 §7.9#1/§7.10.16 B1 |
|
||||
|
||||
## tests/README.md
|
||||
|
||||
| # | 现陈述 | 建议改成 |
|
||||
|---|---|---|
|
||||
| 4 | :58「manifest 已登记实跑 26 套件」(卡片所载) | 本批实跑单元 35 套件(+1 counter_prefix_fatal 负面套件);套件数与段描述由文档批更新到现实数(注意卡①/卡②并行期计数漂移,以 run_all.gd 现况为准) |
|
||||
|
||||
## 06-待办清单
|
||||
|
||||
| # | 项 | 建议 |
|
||||
|---|---|---|
|
||||
| 5 | 上游条目「计数器寿命域未统一」 | 随本批完成整条删除(收口=batch-closure 技能);其现状内引用的行号(adventure_runner :838-841 等)随实现漂移,删除时一并消亡 |
|
||||
| 6 | 新增条目「效果引擎系统无状态原则缺架构文档条目」 | 本批实现落地后,该文档轨条目待文档批补 architecture.md 原则条;06 状态推进与条目清掉归文档批 |
|
||||
|
||||
## 07-体验验证清单
|
||||
|
||||
| # | 项 | 建议 |
|
||||
|---|---|---|
|
||||
| 7 | 天赋树锋/守「每关第 3 次起无减半/无返 AP」=玩家可感知削弱 | 登记目检项(实现报告实机目检总清单已列 V14),用户实战验;只登记不阻塞 |
|
||||
|
||||
## design/research/提案-效果引擎无状态化(三处口径订正——依卡片 §12 裁决以卡片为准)
|
||||
|
||||
| # | 提案节 | 卡片裁定 | 建议 |
|
||||
|---|---|---|---|
|
||||
| 8 | §7.10.3 前缀判据「meta_ 及其余未知前缀→违例」 | 14 枚 id 全含下划线,严版误伤全部既有 battle id;封闭前缀词表=第二事实源 | 采「只禁 meta_+其余落 battle」松版+引用闭合承接(提案随文档批订正) |
|
||||
| 9 | §7.10.12 复放判读「27 字段+levels_cleared 不得上行」 | 实采 33 字段;单一不得上行判据把增强组与削弱组混判 | 采三组分类判据(off 逐位/formed·rules 输入面恒等,方向只记报告)——本批已按此实现 |
|
||||
| 10 | §7.7「零采集」定值 | 现行锚 24 字段与本批不同构,不可作复放基线 | 改批内重采三组 40 局(已做);提案随文档批订正 |
|
||||
|
||||
## sim-data/README.md
|
||||
|
||||
| # | 项 | 建议 |
|
||||
|---|---|---|
|
||||
| 11 | 配套纪律③「对拍=0 新跑」⑦「零数值改动=零 MC」 | 登记本批批次例外:V12 三组 40 局基线重采+40 局复放(二档上限内,依卡片 §12 裁点①);现行锚与读数文件未动 |
|
||||
|
||||
## 卡片与现实偏差(本批实况,非代裁)
|
||||
|
||||
| # | 项 | 说明 |
|
||||
|---|---|---|
|
||||
| 12 | static_scan 编号 | 卡片写「S11 段」,卡① 已占 S11;本批旧件扫描落 S12(顺延)。卡片如订正归文档批,或后续以「S12=旧件零残留」为准 |
|
||||
| 13 | V12 基线哈希 | 卡片 T0 记 f75acc15 基线;卡① 改 game/ 致树前进 4b34a656,据 T0 条款重采,新基线复现卡片 formed/rules 在册哈希 2d3d4247/0fcbcb26 |
|
||||
@@ -1,99 +0,0 @@
|
||||
# 迭代 32 卡② 实现报告·效果引擎无状态化批(2026-10-20)
|
||||
|
||||
- **批次**:迭代 32 执行序②(效果引擎无状态化批·架构重构 restructure)
|
||||
- **分支**:`g-plan2-iter32-card2-stateless`(基点 master 880ee91b=卡① 合回点)
|
||||
- **设计事实源**:`design/research/提案-效果引擎无状态化-2026-10-19.md` v1.2
|
||||
- **合回前 tip**:b42463c9(+ 本报告等产出物提交后为最终 tip)
|
||||
- **闸回执**:`game/tests/.gates/receipt.json` domain=code,all_green=true,11 号 parity 落 skip
|
||||
|
||||
## 完成定义 8 条逐项核对
|
||||
|
||||
| # | 完成定义 | 状态 | 证据 |
|
||||
|---|---|---|---|
|
||||
| 1 | EffectEngine 实例零运行时可变数据 | ✅ | 仅剩 `_triggers`(编译产物)+`db`(只读);`_counters/_reset_on_round_start/_adventure_counter_ids` 删除(T2 a721e52) |
|
||||
| 2 | 四桶外置、宿主持有、随宿主生灭 | ✅ | round/battle→BattleOrchestrator、level→LevelRunner.level_counters、adventure→run_ledger.adventure_counters(T1 ae5baed) |
|
||||
| 3 | 搬运链整段删除零残留 | ✅ | counters_export/counters_seed/counters_merge_export/counters_seed_snapshot 删除;S12 静态扫描 game/**/*.gd+*.tres 零命中(T7 003581f) |
|
||||
| 4 | 硬编码清除名单删除、按关清零改由 level 桶 new 承载 | ✅ | _reset_tree_limited_counters 删除(T1) |
|
||||
| 5 | 前缀归属机器可读+加载期可校验+引用闭合 | ✅ | validate_trigger_row 前缀致命 + _push_trigger assert + config_db ⑦ 引用闭合;负面套件两断言(meta_ 非法/悬空读点)正确拒绝(T5 4c5bdbc) |
|
||||
| 6 | V12 批内同种子复放三组判读通过 | ✅ | off 组 base==post 逐字节一致(bf084ef3…);formed/rules input-parity PASS(详见 V12 节) |
|
||||
| 7 | dig_combo 死读数连同 combo 分支删除、零行为差 | ✅ | T3 删除;S12 含 dig_combo 相关旧件零残留;off 组逐位一致佐证零行为差 |
|
||||
| 8 | 旧档断点含改名前旧键加载不崩(无迁移) | ✅ | V13/H1 断言(430f97f):注入 tree_sense_*/twin_digs 旧键 resume 受理零崩溃、留桶成死键 |
|
||||
|
||||
## 改前改后读数对照
|
||||
|
||||
| 读数 | 改前(master 880ee91b) | 改后(卡② tip) |
|
||||
|---|---|---|
|
||||
| 冒烟绿数 | 1150 | 1150(旧 V10 直呼断言随函数退役 −1,本批裸引擎段迁移净变化归零) |
|
||||
| 单元套件 | 34 全绿 | 35 全绿(+1=counter_prefix_fatal 负面套件) |
|
||||
| static_scan 退出 | 0 | 0(新增 S12 绿) |
|
||||
| 代码域闸 all_green | — | true |
|
||||
|
||||
## T 卡状态
|
||||
|
||||
| T | 提交 | 状态 |
|
||||
|---|---|---|
|
||||
| T0 基线+采集器 rules 档类型修复 | a8db2257 | ✅ 首提交单列(无玩法改动);基线因卡① 改 game/ 树哈希漂移,据卡片 T0「重采」条款重采三组 40 局 |
|
||||
| T1 EffectContext+四宿主接线 | ae5baed6 | ✅ |
|
||||
| T2 引擎删状态+ctx 接口+静态写口 | a721e529 | ✅ |
|
||||
| T3 7 施加点+dig_combo 删+run_ledger 搬运链删 | 96d31705 | ✅ |
|
||||
| T4 round 泛化+宿主清零确认 | 并入 T2/T3 | ✅(round 整桶 clear+宿主 new 天然空) |
|
||||
| T5 前缀双落点+引用闭合+负面套件+manifest | d402ea14, 4c5bdbc9 | ✅ |
|
||||
| T6 数据行/合成行改名+domain/reset_at 删 | 7f45f904 | ✅ |
|
||||
| T7 断言迁移+§9 正向断言+S12+V12+变异 | b226a292, 003581f4, a9d5ac13, b42463c9, 33e1f110 | ✅(§9 见下) |
|
||||
| T8 产出物 | 本批 reports | ✅ |
|
||||
|
||||
## §9 逐需求点正向验收主力(V1–V14·补漏记录 33e1f110)
|
||||
|
||||
> 首合(d00f24a8)时本节缺 V1/V2/V6——只靠迁移旧测+V12 兜底。V12 formed/rules 输出面不作判据,adventure 桶跨战持久若坏不会红,核心缺陷消解无回归网。补漏批建齐并打〔无状态化 Vn〕尾缀:
|
||||
|
||||
| V | 需求点 | 落点 | 断言 | 变异拦截 |
|
||||
|---|---|---|---|---|
|
||||
| V1 | adventure 桶跨战持久(真实事件面) | smoke `_smoke_counter_buckets` | 同一 RunLedger 两 begin_battle 各真实 request_dig→adv_twin_digs 经 ctx 累积=2、第2战读到持久值1 | **变异红**(桶引用改新建空字典→3 断言 FAIL) |
|
||||
| V2 | adventure 桶新冒险置空 | feat_vouchers | start_adventure 后 run_ledger.adventure_counters 空 | — |
|
||||
| V3 | adventure 桶随断点往返 | feat_vouchers V16 换代 | 写桶→快照→回读逐键一致 | — |
|
||||
| V4 | level 桶同关跨战保持 | smoke `_smoke_tree_rules` | 共享 level 字典引用第2战读到限次值 | **变异红**(level 不共享→FAIL) |
|
||||
| V5 | tree_sense 每关限 2 | smoke `_smoke_tree_rules` | 置 2 后 mine_hit 闸关零命中 | — |
|
||||
| V6 | battle 桶随宿主销毁 | smoke `_smoke_counter_buckets` | 次战新编排器读 insurance_used=0 | — |
|
||||
| V7 | 保险每战限次迁移保绿 | feat_vouchers V25 | 组内断言原样绿(双账不改面) | — |
|
||||
| V8 | round 桶轮始清空 | effect_words_t1 ⑦ | round_ 前缀随 round_start 整桶 clear | — |
|
||||
| V9 | 前缀致命+引用闭合 | counter_prefix_fatal_test | meta_/悬空读点两断言拒绝 | **变异红**(前缀分支置 false/闭合降 info→quit2) |
|
||||
| V10 | 旧件零残留 | static_scan.sh S12 | game/**/*.gd+*.tres 旧符号 0 命中 | **变异红**(注入 counters_export→命中) |
|
||||
| V11 | 旧断言同批摘除 | F2 迁移 | smoke 裸引擎段+4 单测件 ctx 化 | — |
|
||||
| V12 | 同种子复放三组 | parity_compare.py | off 逐位/formed·rules 输入面恒等 | rules≠off 0 相同=非空转 |
|
||||
| V13 | 旧档加载不崩 | feat_vouchers | 含改名前旧键 resume 受理零崩 | — |
|
||||
| V14 | tree_sense 削弱目检 | 实机目检清单 | 每关第3次无减半/无返 AP | 用户实战验(只登记) |
|
||||
|
||||
|
||||
## V12 同种子复放三组判读(完成定义 6 主力证据)
|
||||
|
||||
基线码=master 880ee91b+采集器 rules 档类型修复(单独 worktree 采集);post 码=卡② tip。命令行逐字一致(normal/route=min/attune=off/shop=off)。
|
||||
|
||||
| 组 | 档 | 局数 | base sha | post sha | 判据 | 结论 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| off | feat_mode=off | 20(81000–81019) | bf084ef3… | bf084ef3… | 整条逐位相等 | **PASS(字节级一致)** |
|
||||
| formed | mode=formed | 10 | 2d3d4247… | 6e6423a5… | 输入面八字段+字段集恒等 | **PASS** |
|
||||
| rules | rules+sense 两键 | 10 | 0fcbcb26… | f8af8da3… | 输入面八字段+字段集恒等 | **PASS** |
|
||||
|
||||
- off 组 base==post 逐字节一致=未受影响路径(零 feats/零计数器触碰)确定性零漂移,结构迁移对其透明。
|
||||
- formed/rules 输入面(policy/seed/atk_pct/hp_pct/route/attune/equipped/feat_mode)恒等、种子集与局数一致、字段集恒等、零崩溃;输出面差异=已定性预期行为变更(adventure 桶真跨战持久、sense 每关限次、pain_layers 不跨战——契约 1 三处),**不声称零漂移**。
|
||||
- 判红先排除环境:基线哈希 2d3d4247/0fcbcb26 与卡片 T0 在册预采值逐字复现,证明基线采集口径正确。
|
||||
- **rules≠off 0 局相同**(分组非空转)——证采集器类型修复(T0 首提交)生效,rules 组确按 sense 两键注入。
|
||||
|
||||
## 变异验证记录表(test-conventions §6)
|
||||
|
||||
| 断言 | 注入形态 | 跑的最窄闸 | 期望 | 结果 |
|
||||
|---|---|---|---|---|
|
||||
| V9(.tres 前缀侧) | validate_trigger_row 前缀分支置 `if false` | counter_prefix_fatal_test | ①非法前缀放行→quit2 | **EXIT=2 捕获** |
|
||||
| V9(引用闭合侧) | 闭合 push_diag 严重级 error→info | counter_prefix_fatal_test | ②悬空读点放行→quit2 | **EXIT=2 捕获** |
|
||||
| V10(S12) | reward_economy 注释写回 counters_export | static_scan.sh | S12 FAIL | **命中 1 文件见红**,还原回绿 |
|
||||
| V12(采集器侧) | 去 Array 包裹(还原 T0 修复形态)→ 已在基线验证 | rules 组判读 | rules==off 即空转 | 实测 rules≠off 0 相同=非空转 |
|
||||
|
||||
## 实机目检总清单(登记不阻塞·V14)
|
||||
|
||||
- 天赋树锋/守:同一关内第 3 次起踩危险格不再伤害减半、第 3 次标错不再返 AP(每战限 2→每关限 2 的削弱,玩家可感知)——用户实战目检。
|
||||
- 断点续玩旧档(含改名前 counter 键)正常进入不崩(V13 自动化已覆盖崩溃面,此处目检手感)。
|
||||
|
||||
## 遗留读数义务
|
||||
|
||||
- 三处已定性行为变更由 V12 formed/rules 输入面判据+负面套件+冒烟桶断言承载;本批不声称零漂移。
|
||||
- V12 采集文件落 `sim-data/`(数据件不入 git,常驻留盘供报告与后续核对;本批不动现行锚)。
|
||||
@@ -1,432 +0,0 @@
|
||||
# 需求卡片·代码注释禁用词清扫批(退役词换代+完美封印统一+归因锚判据修正)
|
||||
|
||||
- **批次名**:代码注释禁用词清扫批
|
||||
- **日期**: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.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**(`0da014d4`,周期列 ≈0.5 周;开工门=U0 `/iter 32` 用户发令)
|
||||
- **上游依据**:2026-10-19 用户裁——「完美排雷」**全库统一**换代为「完美封印」,含代码内部注释
|
||||
|
||||
---
|
||||
|
||||
## 0 · 概念定义(动笔前必读,本卡所有措辞以此为准)
|
||||
|
||||
**完美封印**(玩家面正式名;机制文档旧称「完美排雷」)= **一张图的清图奖励加倍条件**。
|
||||
|
||||
| 项 | 内容 |
|
||||
|---|---|
|
||||
| 成立判据 | 一张图「零有效误标」**且**「至少一次封印标中」 |
|
||||
| 有效误标 | = 误标总数 − 豁免数(迭代 31 卡② T4 落的两账相减口径) |
|
||||
| 计数纯净 | `_perfect_hit_false` 全程不被任何效果改写;豁免只累加 `_perfect_forgiven` |
|
||||
| 成立效果 | 清图奖励对象追加**第二份同身份**兑付(乘数 `p_perfect`,现行值读 `settlement.tres`) |
|
||||
| **被破之后** | 不再满足零有效误标 ⇒ 完美封印不成立 ⇒ **清图奖励只发一份,不加倍** |
|
||||
| 计数起算 | 从装板起算;换图重置 |
|
||||
| 高光行 | 成立时发一行;首份即零兑付则高光行不发 |
|
||||
|
||||
**出处**:
|
||||
- 规则本体 — `design/gdd/systems/战斗循环/战斗结算.md:161`
|
||||
- 当量公式 — 同文件 :108(`完美排雷的清图奖励: E = 奖励表值 × 完美乘数 ÷ 100`)
|
||||
- 乘数字义 — 同文件 :116
|
||||
- 调参表 — 同文件 :321(`完美乘数 | percent {100, 200} | 100 为仅高光、无第二份`)
|
||||
- 清图批 — 同文件 :139;刷新图重置 — :259
|
||||
- 兑付结构 — `design/gdd/systems/战斗循环/地图战斗资源.md:155`/:194
|
||||
|
||||
**玩家面命名纪律**:术语表「对外命名纪律」禁「雷」字面进对外命名,适用范围**含 UI 文案**;该概念的玩家面正式名=「完美封印」,现由 `design/gdd/systems/冒险循环/奇物.md` v3.18 与 `game/data/tables/feats.tres:861` desc 在用。
|
||||
|
||||
---
|
||||
|
||||
## 1 · 目标与完成定义
|
||||
|
||||
**目标**:把术语表已在册的退役词从 `game/` 的代码注释里清干净,把「完美排雷」统一为玩家面正式名「完美封印」,修掉扫描中查出的归因锚判据矛盾;同时在**代码域自己的静态扫描闸**里补一条规则,让这类残留以后自动见红。
|
||||
|
||||
| 需求点 | 一句话 |
|
||||
|---|---|
|
||||
| **N1** | 「完美排雷」全库统一为「完美封印」(对外文案 3 处 / 其余 18 处:注释、文档正文、断言描述与夹具) |
|
||||
| **N2** | 注释里「板级」换代为「整图」 |
|
||||
| **N3** | 注释里「门票」换代为「专长凭证」(标识符与数据键零改动) |
|
||||
| **N4** | 注释里「正主」换代为「现行事实源」 |
|
||||
| **N5** | 注释里「落籍」换代为「已入库」 |
|
||||
| **N6** | 代码域静态扫描闸新增 S11「代码注释禁用词」规则,先落规则再见红 |
|
||||
| **N7** | 封印未中行的「完美封印已破」归因锚改用**有效误标**判据,文案按「未豁免/已豁免」两态改写 |
|
||||
|
||||
**完成定义**(全部满足才算完):
|
||||
|
||||
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 套全绿、探针段绿。
|
||||
5. S11 规则在位:注入一次禁用词 → `game/tests/static_scan.sh` 判红;还原后绿;变异验证记录进实现报告。
|
||||
6. 代码域闸按域选档跑通,回执 `game/tests/.gates/receipt.json` 的 commit = 分支 tip 且 `all_green=true`。
|
||||
7. `reports/` 三份产出物写齐(实现报告/代拍板追认单/反哺点清单)。
|
||||
|
||||
**文档面不在本卡完成定义内**——迭代批禁写 `design/` 整目录与根规则文件,唯一可写目录=`reports/`(process-conventions §3 第 13 条)。
|
||||
|
||||
---
|
||||
|
||||
## 2 · 现状事实(2026-10-19 实测;v1.3 于 2026-10-20 全量复核——五词原始命中 119 行,开工自行复核)
|
||||
|
||||
扫描范围:`game/` 下 195 个文件(.gd/.tres/.md/.json/.sh/.txt)。
|
||||
|
||||
**口径(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 文件)
|
||||
|
||||
| 落点 | 行 | 面 |
|
||||
|---|---|---|
|
||||
| `core/battle_orchestrator.gd` | 265、911 | 注释 |
|
||||
| `core/battle_orchestrator.gd` | **925** | **对外文案**(`"完美排雷!清图奖励 ×2"`) |
|
||||
| `core/battle_orchestrator.gd` | 1296 | `##` 文档注释(谓词说明) |
|
||||
| `data/schemas/settlement_table.gd` | 8 | 注释 |
|
||||
| `presentation/row_pacer.gd` | 92 | 注释 |
|
||||
| `presentation/views/battle_log_view.gd` | **194** | **对外文案**(「本板完美排雷已破」) |
|
||||
| `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、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 · 板级(33 处 / 15 文件)
|
||||
|
||||
`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)
|
||||
|
||||
(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` 因行内含「→/禁用/登记」子串被旧信号过滤误伤——全是活注释。)
|
||||
|
||||
### 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 · 正主(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`/`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 处)
|
||||
|
||||
`core/config_db.gd`(22、23、42、45、280、337、390)· `data/tables/enemy.tres:653`(**历史注记**——「已落籍 9cc4b8b」带 commit 号,属留档文本,不追改)· `presentation/views/board_view.gd:35` · `tests/unit/data_config/config_db_test.gd:133`
|
||||
|
||||
### N7 · 归因锚判据与概念定义矛盾(真缺陷,本批一并修)
|
||||
|
||||
三个落点构成一条矛盾链:
|
||||
|
||||
| # | 落点 | 现状 |
|
||||
|---|---|---|
|
||||
| 1 | `core/settlement/grant_segment.gd:295` | `oc._perfect_hit_false += 1` —— 累加的是 **RAW 误标总数** |
|
||||
| 2 | `core/settlement/grant_segment.gd:300-301` | `if oc._perfect_hit_false == 1: hl = "perfect_broken"` —— 判据**只看 RAW 计数** |
|
||||
| 3 | `core/battle_orchestrator.gd:1298-1299` | `perfect_sweep_earned()` 用的却是**有效误标**=`_perfect_hit_false − _perfect_forgiven <= 0` |
|
||||
|
||||
**矛盾实证**:`grant_segment.gd:308-315` 里 `_fx_emit("seal_missed")` 与 `_perfect_forgiven += 1`(:314)都排在 `_emit_row`(:302)**之后**。装备「完美保险」专长时:
|
||||
- 第 300 行 RAW 计数 `== 1` 成立 ⇒ 打印「完美封印已破」
|
||||
- 但第 314 行随后把 `_perfect_forgiven` 加到 1 ⇒ 有效误标 = 0 ⇒ `perfect_sweep_earned()` 仍为 **true**,加倍奖励照发
|
||||
|
||||
⇒ **日志告诉玩家"加倍没了",实际加倍还在。** 这不是病句,是断言了与真值相反的状态。
|
||||
|
||||
引用口径:`奇物.md` v3.18 已改用「完美封印」;`feats.tres:861` desc =「本场首次封印落空,不计入完美封印判定」。
|
||||
|
||||
### 已核实清零(迭代 31 成果,本批不重复动)
|
||||
|
||||
`金币`/`插旗`/`标旗`/`雷格`/`惩罚格`/`工作日志` 在 `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`
|
||||
|
||||
---
|
||||
|
||||
## 3 · 设计契约(🔴 违反=L3 停机呈报)
|
||||
|
||||
1. 🔴 **标识符零改动**——`feat_ticket_*`(`_feat_ticket_pity`/`_feat_ticket_sold`/`_feat_ticket_appeared`/`_redeem_feat_ticket()`/`_pool_ticket`/`feat_ticket_chance`/`feat_ticket_quota`)、`SHELF_KINDS` 的 `"feat_ticket"`、断点存档键 `"feat_ticket_pity"`/`"feat_ticket_sold"`(持久化在 `save.json` 的 `breakpoint.adventure_counters`)**一律不动**。改名会断旧存档与跨文件契约,且上游 `需求卡片-凭证件裁削批`:109 明列「feat_ticket 体系|与本批无关,不碰」。
|
||||
2. 🔴 **对外文案只动三处**——`battle_orchestrator.gd:925`/`board_fx_view.gd:102`/`battle_log_view.gd:194`;其余对外文案(含 `shop.tres:86`、`curio_interact_controller.gd:165-166`)零改动。
|
||||
3. 🔴 **语义先行,禁纯词面替换**(grilling 复核门查出后立)——改写玩家可见文案前,必须先读 §0 概念定义并确认这句在讲什么;机检只能判字面,判不了语义对错。
|
||||
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`「退役词对照」节解析第一列全部词面(去括号注)得 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` 同源的对照/历史信号,一律豁免、不判红。现存受此豁免的 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/engineering/code-conventions.md`(在 `design/` 目录内):依据=迭代批禁写 `design/` 与根规则文件这条流水线红线(process-conventions §2),本批无例外。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 正向断言(测试三层分工纪律①主力)。
|
||||
|
||||
---
|
||||
|
||||
## 4 · 范围边界
|
||||
|
||||
**做**:
|
||||
|
||||
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 规则(词表=术语表解析+显式排除单〔巢穴/旗〕+`完美排雷`;含两道零命中自检、闸门自指豁免与 4 处显式留档豁免)
|
||||
8. `game/README.md`/`game/tests/README.md` 同步
|
||||
9. 全量冒烟+单元+探针验证,绿数与基线一致
|
||||
|
||||
**不做**(去向):
|
||||
|
||||
| 不做的 | 去向 |
|
||||
|---|---|
|
||||
| `design/` 全部文档(术语表/战斗结算/地图战斗资源/难度曲线与Boss/art-bible/ux 各件/07 清单) | **反哺点**——落 `reports/iter32-反哺点-<日期>.md`,由用户在会话裁决后归文档轨批(迭代批禁写 `design/`) |
|
||||
| `门票` 标识符与数据键(`feat_ticket_*`/`SHELF_KINDS`/存档键) | 上游卡 §4 明列不碰;若将来要改,另立独立批并连带处理存档兼容 |
|
||||
| `shop.tres:86`「奇物门票」与 `curio_interact_controller.gd:165-166` 玩家文案 | 属 奇物/专长 归类表述,与 06「冒记案遗留待裁两项」第①项同源 → 交文档侧定性后另走传导批 |
|
||||
| `AGENTS.md`/`design/engineering/code-conventions.md` | 本批禁碰——迭代批禁写 `design/` 与根规则文件(流水线既有红线,见契约 10) |
|
||||
| 术语表 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 判据修正除外) | 禁止 |
|
||||
|
||||
---
|
||||
|
||||
## 5 · 关联文档同步面(必填)
|
||||
|
||||
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|
||||
|---|---|---|
|
||||
| `design/gdd/术语表.md` | 「退役词对照」节有「门票→专长凭证」行,代码侧换代后该对照行应保留(对照行合法);「完美封印」尚未入表,玩家面正式名应由文档侧登记 | **反哺点** |
|
||||
| `design/gdd/systems/战斗循环/战斗结算.md`(:85/:108/:116/:139/:141/:161/:259/:342) | 全篇称「完美排雷」,与 `奇物.md` v3.18+ 的「完美封印」同名异称 | **反哺点** |
|
||||
| `design/gdd/systems/战斗循环/地图战斗资源.md`(:155/:194) | 同上 | **反哺点** |
|
||||
| `design/gdd/systems/冒险循环/难度曲线与Boss.md`(:224/:227/:313) | 同上 | **反哺点** |
|
||||
| `design/gdd/systems/战斗循环/战斗表现.md`(:53/:68) | 同上 | **反哺点** |
|
||||
| `design/gdd/systems/表现与支撑/HUD框架.md`(:277) | 同上 | **反哺点** |
|
||||
| `design/gdd/ux/battle.md`(:85/:222/:422) | 同上 | **反哺点** |
|
||||
| `design/gdd/ux/interaction-patterns.md`(:90) | 同上 | **反哺点** |
|
||||
| `design/art/art-bible.md`(:8/:88/:562/:574) | 同上;另 :198/:211 的「金币」换代 GP 已由分支 `gpsweep-20261019` 完成但未合回 | **反哺点** |
|
||||
| `design/gdd/07-体验验证清单.md`(:142) | 「完美排雷」措辞;本批对外文案变更需登记目检项 | **反哺点** |
|
||||
| `game/README.md`(:146/:168/:267) | 措辞换代 | **本批直改**(文件在 `game/` 内) |
|
||||
| `game/tests/README.md` | S11 规则说明与扫描面登记 | **本批直改** |
|
||||
| `game/tests/static_scan.sh` | S11 规则承载 | **本批直改** |
|
||||
|
||||
---
|
||||
|
||||
## 6 · 任务卡
|
||||
|
||||
### 卡前·文件结构图
|
||||
|
||||
| 文件 | 职责 | 本批动作 |
|
||||
|---|---|---|
|
||||
| `game/tests/static_scan.sh` | 静态扫描域可执行承载(现 S1–S5、S9、S10) | 增 S11 段 |
|
||||
| `game/tests/README.md` | 测试分层与闸口径登记 | 增 S11 说明 |
|
||||
| `game/README.md` | 切片架构说明 | 措辞换代 |
|
||||
| `game/core/battle_orchestrator.gd` | 战斗编排器 | 注释+对外文案换代 |
|
||||
| `game/core/settlement/grant_segment.gd` | 授予段 | 注释换代 + **N7 判据修正** |
|
||||
| `game/core/minesweeper_rules.gd` 等 36 个 .gd | 注释承载 | 注释换代 |
|
||||
| `game/data/tables/*.tres` | 数据表注释 | 注释换代 |
|
||||
| `game/smoke/smoke_all.gd` | 冒烟断言 | 注释、断言描述与夹具期望字面量换代 |
|
||||
| `game/tests/unit/**` | 单元测试 | 注释与断言描述换代 |
|
||||
|
||||
### T0 · 基线记录(≈15 min)
|
||||
|
||||
- [ ] 在 worktree 内跑全量冒烟,记录绿数(现行基线 1151 项 0 失败)
|
||||
- [ ] 跑单元测试,记录套数与绿数(现行基线 34 套全绿)
|
||||
- [ ] 跑 `bash game/tests/static_scan.sh`,记录现行退出码 0
|
||||
- [ ] 跑 §2 末复现命令,存改前命中清单(五词逐处),作为改后零残留的对照
|
||||
- [ ] 取证「豁免态下日志仍打印已破」:装 `perfect_insurance` 专长 → 首次标错 → 打印日志行原文
|
||||
|
||||
**取用**:无(首卡)。
|
||||
**产出**:`reports/iter32-实现报告-<日期>.md` 的「改前基线」四数——`baseline_smoke_green:int`/`baseline_unit_suites:int`/`baseline_scan_exit:int`/`baseline_forgiven_log_line:String`。
|
||||
|
||||
### T1 · S11 规则落闸并见红(≈1.0–1.5h)
|
||||
|
||||
- [ ] 在 `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`
|
||||
- [ ] 命中即打印 `file:line + 命中词`,段末 `fail=1`
|
||||
- [ ] 在 `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`,与现役同段同规)。
|
||||
|
||||
### T2 · 完美排雷 → 完美封印(≈1.5h)
|
||||
|
||||
**判据(先立后改,§0 为准)**:这句日志在讲「本图的完美封印资格被这次标错打破 ⇒ 清图奖励不再加倍」。
|
||||
|
||||
- [ ] `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,判据修正后语义才成立;此处只落文本占位,不留「已破」字样在豁免态)
|
||||
- [ ] 其余 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.5h)
|
||||
|
||||
- [ ] `game/core/battle_orchestrator.gd` 9 处(67/265/445/470/482/506/507/928/1213)换代
|
||||
- [ ] `game/core/board_data.gd` 2 处(17/53)换代
|
||||
- [ ] `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 末复现命令确认 `板级` 零命中
|
||||
|
||||
**取用**:无。
|
||||
**产出**:`game/` 内「板级」零命中。
|
||||
|
||||
### 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)换代(`: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`
|
||||
- [ ] `smoke/level_autoplay.gd:226`+`smoke_all.gd` 8 处+`tests/**` 2 处换代
|
||||
- [ ] 复核标识符与数据键零改动(`feat_ticket` 族、`"feat_ticket"` 行族键、存档键)
|
||||
|
||||
**取用**:无。
|
||||
**产出**:`game/` 注释面「门票」残留=豁免单 1 处(`level_runner.gd:832`);标识符与数据键保持原样。
|
||||
|
||||
### T5 · 正主 → 现行事实源(≈0.5h)
|
||||
|
||||
- [ ] 13 处换代(清单见 §2 N4,剔除 `damage_math_test.gd:36` 误报与 `adventure_runner.gd:403` 历史注记;含 v1.3 补的 `board_view.gd:843` 与 `static_scan.sh:73`——后者建议改「数值单一事实源自身」一类等价措辞,代拍板 1)
|
||||
|
||||
**取用**:无。
|
||||
**产出**:`game/` 内「正主」残留=豁免单 2 处(`adventure_runner.gd:403` 历史注记+`damage_math_test.gd:36` 误报)。
|
||||
|
||||
### T6 · 落籍 → 已入库(≈0.5h)
|
||||
|
||||
- [ ] 9 处换代(清单见 §2 N5,剔除 `enemy.tres:653` 历史注记)
|
||||
|
||||
**取用**:无。
|
||||
**产出**:`game/` 内「落籍」残留=豁免单 1 处(`enemy.tres:653` 历史注记)。
|
||||
|
||||
### T7 · N7 归因锚判据修正(≈1.5h)
|
||||
|
||||
**修法(已核实可行,禁另选他法)**:`_fx_emit`(`battle_orchestrator.gd:90-93`)是 `_fx.dispatch` 的**有状态派发**——`forgive_seal_miss` 行走 `when lt 1` 限次并由 `_apply_counter_hit` 记账,**重复调用会重复消费限次**。因此**禁止**"先跑一次 `_fx_emit` 算 `hl` 再在原位置跑一次"的做法。
|
||||
|
||||
- [ ] 把 `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)
|
||||
|
||||
**取用**:T2 的对外文案换代结果。
|
||||
**产出**:日志文案与 `perfect_sweep_earned()` 真值一致(装备专长时豁免态不再出现「已破」)。
|
||||
|
||||
### T8 · 全量验证与产出物落位(≈1.0h)
|
||||
|
||||
- [ ] 跑代码域档验收(按本批改动域选档),确认所选域全绿
|
||||
- [ ] 确认回执 `game/tests/.gates/receipt.json` 的 commit = 分支 tip 且 `all_green=true`
|
||||
- [ ] 写 `reports/iter32-实现报告-<日期>.md`(各卡状态+改前改后读数对照+实机目检总清单+遗留读数义务+**已记档差异节**:parity 预期漂移两例〔豁免态/未豁免态各一:`seal_miss`/`insurance_used` 两行顺序互换+豁免态 `highlight` 取值〕+**06 登记项**:合回后用户批准的 parity 重锚批)
|
||||
- [ ] 写 `reports/iter32-代拍板-<日期>.md`
|
||||
- [ ] 写 `reports/iter32-反哺点-<日期>.md`(§5 每条都要有落点)
|
||||
|
||||
**取用**:T1–T7 全部产出。
|
||||
**产出**:`reports/` 三份产出物 + 可合回的分支 tip。
|
||||
|
||||
**估时合计 ≈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 独立成卡可单独验收,必要时可拆出本批另立缺陷批。
|
||||
|
||||
---
|
||||
|
||||
## 7 · 验证闸
|
||||
|
||||
### 逐需求点验收清单
|
||||
|
||||
| # | 需求点 | 测什么(断言/行为) | 怎么测(落点) | 谁验 |
|
||||
|---|---|---|---|---|
|
||||
| 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` | 自动(合回闸) |
|
||||
| **A10** | **N7** | **未装备完美保险:本战首次标错 → `seal_miss` 行的 `highlight` 字段 == `"perfect_broken"`,且 `perfect_sweep_earned() == false`** | 新增断言,落点 `tests/unit/core/feat_vouchers_test.gd`(现有专长套件,core 层可直取行字段) | 自动 |
|
||||
| **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–A12 属能力验证(静态扫描/断言直取数据)与取证实验;A8–A9 为运行期验证。玩家可见文案的最终观感归**用户目检**(登记不阻塞):结算明细中封印未中行的两态文案可读性。
|
||||
|
||||
**闸口径**:按本批改动域选档跑 `tools/run_all_gates.sh`(本批只触 `game/` 与 `reports/` → 代码域档);跑完写回执。**11 号 parity 闸将落 NEED-APPROVAL**(diff 触 `game/core/settlement/`)——该态指纹记 skip、入 `not_run`,`all_green` 不受影响(契约 12:本批不发起、漂移记档、合回后另立用户批准的重锚批)。
|
||||
|
||||
**回归措辞模板**:「里程碑步(波/T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试/工具先行孤立验证再并入全套」。
|
||||
|
||||
### 变异验证(新增判据必做)
|
||||
|
||||
| 变异点 | 注入形态 | 跑的闸 | 期望红 |
|
||||
|---|---|---|---|
|
||||
| `game/core/battle_orchestrator.gd:265` 注释 | 写回「板级完美排雷」原措辞 | `bash game/tests/static_scan.sh` | `S11 FAIL` + 命中行输出 |
|
||||
| 同上对外文案 | `game/core/battle_orchestrator.gd:925` 写回「完美排雷!…」 | 冒烟清图段 | 断言 A2 红 |
|
||||
| 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`/`: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:行/跑的闸/红输出摘要/还原结论)记进实现报告变异验证记录表。
|
||||
|
||||
---
|
||||
|
||||
## 8 · 异常分级
|
||||
|
||||
- **L1(自救)**:单文件漏改致 grep 未过 → 补改重跑该段,不改批结构。
|
||||
- **L2(记录继续)**:冒烟绿数与基线偏差 ≤2 且已归因到断言描述文本替换 → 记录偏差原因后继续。
|
||||
- **L3(停机呈报)**:
|
||||
1. 冒烟绿数下降 >2,或出现逻辑断言红(说明改动触及行为);
|
||||
2. `.tres` 加载失败或 schema 不同步;
|
||||
3. 改前改后同种子读数不一致;
|
||||
4. S11 注入后不变红(判据无效);
|
||||
5. 触碰 `AGENTS.md` 或 `design/` 目录下任何文件(迭代批越界——流水线红线);
|
||||
6. **N7 后移 `_emit_row` 后,奖励兑付结果与改前不一致**(说明改到了兑付行为,而非只改文案判据)。
|
||||
|
||||
---
|
||||
|
||||
## 9 · 代拍板白名单
|
||||
|
||||
1. 注释换代时的措辞微调(如「板级变异」→「整图变异」vs「整图作用域变异」),语义等价即可。
|
||||
2. `落籍`→`已入库` 在带 commit 号的历史注记行**不改**(留档文本)。
|
||||
3. `正主` 误报处(`damage_math_test.gd:36`「正主角池」)不改。
|
||||
4. 测试断言描述文本的替换措辞,语义等价即可。
|
||||
5. S11 规则段的 shell 写法(grep 组合、计数方式),与现役 S 段同构即可。
|
||||
6. **N7 两态文案的末字微调**(保持「未豁免=已破、已豁免=不计入」这一因果不变成立即可)。
|
||||
|
||||
超清单必呈报。
|
||||
|
||||
---
|
||||
|
||||
## 10 · 待裁点
|
||||
|
||||
**零待裁点,开工门=U0(`/iter 32` 发令)。**
|
||||
|
||||
已落裁决四条,卡片据以成文:
|
||||
|
||||
| 裁定 | 结论 |
|
||||
|---|---|
|
||||
| 完美排雷 | 全库统一换代为「完美封印」,含代码内部注释——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` 封印未中行改判有效误标口径(误标总数 − 豁免数),`_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 表词/巢穴机制表述/单字旗将来若被裁决纳入,另行扩词表并单独立批清扫。
|
||||
@@ -1,339 +0,0 @@
|
||||
# 需求卡片:效果引擎无状态化批(计数器外置·分桶)
|
||||
|
||||
- **日期**:2026-10-20
|
||||
- **来源**:06-待办清单「计数器寿命域未统一」条目(2026-10-18 登记,来源=会话提及,设计面=文档轨),设计已闭合推进至待写卡(唯一事实源:`design/research/提案-效果引擎无状态化-2026-10-19.md` v1.2——§3 目标形态、§7 N1–N6 定值、§7.7 采集定值、§7.10 缺口闭合定值)
|
||||
- **批性质**:工程直入类·架构重构(restructure)——代码域批,禁写 `design/` 整个目录与根规则文件,产出物只落 `reports/`
|
||||
- **估时**:≈4.5–6.25d(=T0–T8 加总;超盒切分预案=T7 拆「断言新增/迁移」与「复放比对」两波先后挂,T3 与 T7 测试迁移互不阻塞可并行切)
|
||||
- **状态**:成文待审——零待裁点(对抗复核六项已裁并并入正文,见 §12),开工门=U0(用户发令)
|
||||
|
||||
---
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
把 `EffectEngine` 从「解释器+自带状态计数器容器」改为**纯计算引擎(零运行时状态)**:效果侧计数器按 round/battle/level/adventure 四只桶外置、由各生命周期的宿主对象持有(寿命随宿主生灭,不需要寿命字段),事件触发时经 ctx 参数传入,引擎只做判定;计数器归属用 id 前缀表达并加载期强校验。
|
||||
|
||||
**完成定义**(全部满足才算完):
|
||||
|
||||
1. `EffectEngine` 实例内无任何运行时可变数据(仅剩编译产物 `_triggers` 与只读依赖 `db`);
|
||||
2. 计数器四桶外置:round/battle 桶挂 `BattleOrchestrator`、level 桶挂 `LevelRunner`、adventure 桶挂 `run_ledger.adventure_counters`,桶随宿主生灭;
|
||||
3. 搬运链整段删除:`counters_export`/`counters_seed`(引擎)与 `counters_seed_snapshot`/`counters_merge_export`(RunLedger)零残留;
|
||||
4. `adventure_runner.gd:838-841` 硬编码清除名单(`_reset_tree_limited_counters`)删除,按关清零由 LevelRunner 每关 new 天然承载;
|
||||
5. 计数器归属机器可读且加载期可校验:`.tres` 行(errs→加载致命)与树合成行(`_push_trigger` assert)双落点,写错前缀即致命;另加装载期**引用闭合**——凡被读到的计数器 id(`when` 内 `fact: counter` 的 `id`/`do.value_counter`/`counter_spend` 的 `counter_id`)必须能在声明集(feats 行+秘宝行+树合成行的 `do.counter_id`)里找到同名写入行,找不到即加载致命;
|
||||
6. 批内同种子复放比对按三组判读通过(V12):**off 组**(`feat_mode=off`)RUNSUM 全字段逐位一致;**formed 组**(`formed`)与 **rules 组**(`rules`+sense 两键)输入面字段与字段集恒等、局数与种子集一致、零崩溃;输出面差异与 `levels_cleared` 方向只记报告不作判据——**不声称零漂移**(三处已定性预期差异见契约 1);
|
||||
7. `dig_combo` 死读数连同 combo 分支删除,零行为差(§7.10.14);
|
||||
8. 旧档断点含旧计数键加载不崩(V13,无迁移——2026-10-18 代码术语刷新批先例)。
|
||||
|
||||
## 2. 设计事实源
|
||||
|
||||
`design/research/提案-效果引擎无状态化-2026-10-19.md` **v1.2**(2026-10-20 设计闭合版)——本卡全部设计定值的唯一出处:
|
||||
|
||||
- 目标形态与四桶表=提案 §3(3.1 宿主定值/3.2 接口定稿/3.3 前缀归属);
|
||||
- N1–N6 定值=提案 §7;不发起全冒险模拟采集=提案 §7.7(零数值改动=零采集——本批唯一例外是 V12 的复放采集,见 §12 裁点①);搬运链缺陷全解=提案 §7.8;
|
||||
- 写卡前缺口闭合定值=提案 §7.10(ctx 结构/容器类型与测试接口/前缀校验双落点/写口静态化/施加面补列/改名传播面/保险双账不改面/A1 注入口径/level 桶接口/复放分组判读/mine_hit 构造/dig_combo 删除/H1 补条)。
|
||||
|
||||
与 06 条目状态里的闭合凭据一致(v1.2)。
|
||||
|
||||
**与本卡口径不一致的提案节以本卡为准**,三处冲突及裁决见 §12:§7.10.3 前缀判据(封闭词表方案在现实 id 面上误伤全部既有 battle id)、§7.10.12 复放判读(所记 27 字段与实采 33 字段不符,且单一「不得上行」判据把增强组与削弱组混判)、§7.7 零采集定值(现行锚与本批不同构,不可用作复放基线)。实现批禁写 `design/`,三处订正随反哺点清单归文档批。
|
||||
|
||||
## 3. 现状事实(2026-10-20 代码级实查,开工自行复核)
|
||||
|
||||
**引擎侧**:
|
||||
|
||||
- `game/core/effect_engine.gd:83-88` 五成员:`_triggers`(:83,编译产物,留)、`_counters`(:84,运行时容器,搬走)、`_reset_on_round_start`(:85)/`_adventure_counter_ids`(:86-87 含续行,编译名单,随分桶删除)、`db`(:88,只读,留)。
|
||||
- 接口与调用点:`rebuild()` :98;`dispatch()` :208(调用点 6 处——`battle_orchestrator.gd:91` `_fx_emit` 汇聚面/`damage_controller.gd:78` `_fx_hits` 汇聚面/`action_economy.gd:103/:164/:191`/`reward_economy.gd:65`);`counter()` :224(外部读 4 处:`battle_orchestrator.gd:638`、`damage_controller.gd:345`、`grant_segment.gd:103/:205`);`counter_add()` :228(写 6 面:`action_economy.gd:108/:111/:169`、`damage_controller.gd:351/:464`、`grant_segment.gd:327`);`counter_spend()` :237(`battle_orchestrator.gd:714` 受理闸);`counters_export()`/`counters_seed()` :246/:255;`validate_trigger_row()` :351(静态,`data/schemas/feat_table.gd:44`、`treasure_item_table.gd:104` 消费)。
|
||||
- round_start 清零在 `dispatch` 特判内(:210-212 按名单清零);真实发射点=`battle_orchestrator.gd:97 _emit_round_start()`(调用点 `:425` 首轮/`:1077` 续轮)。
|
||||
- `DO_KEYS` :72-75 含 `domain`/`reset_at` 两键;树合成行 `:136-155` 硬编码 `tree_sense_sharp_used`/`tree_sense_guard_used`(走 `_push_trigger`,现仅 assert 事件域——前缀零校验)。
|
||||
|
||||
**搬运链与自锁**:`run_ledger.gd:40-45` `counters_merge_export` 判空早退(:42)⇒ 全新开局 adventure 域四枚整局不写入(断点回填 :206-208 是唯一解锁路径);战末导出在 `battle_orchestrator.gd:1122-1123`,战首回灌 `:390`。
|
||||
|
||||
**宿主侧**:`battle_orchestrator.gd:271` `_fx = EffectEngine.new`(_init :268-292 段内 `set_fx` 三处注入 :280-282);`begin_battle` :372-373 `_ledger = enc["ledger"]` 或缺省新账;`level_runner.gd:450-482` `_start_battle` 每战 new 编排器、enc 装配(:471 `"ledger"` 下传行);`adventure_runner.gd:843-845` 每关 new LevelRunner+调 `_reset_tree_limited_counters`;`:255` 新冒险置空 `run_ledger.adventure_counters = {}`;断点写键 `:1033`/回填 `:206-208`。
|
||||
|
||||
**保险双账**:`grant_segment.gd:311-317` 同一标错分支内 `_perfect_forgiven` 加一(:314)与 `_apply_counter_hit` 落 `insurance_used`(:315→:327)**同点双记各司其职**——前者供判定段两账相减、后者供 when `lt 1` 限次闸;本批不改面(V25 迁移保绿即证)。
|
||||
|
||||
**死路**:`battle_orchestrator.gd:635-647` `_feat_yield_adjust` 读 `dig_combo`(全仓无数据行声明——feats.tres/treasure_items.tres/树合成行三源零命中;feats.tres 唯一 `"cap"` 行属石肤 ac_bonus `:576-583`,yield_mult 带 cap 行零个)⇒ `combo_val` 恒 0、`combo_cap` 恒 ≤0,分支恒短路。
|
||||
|
||||
**数据行**:`feats.tres` 计数 id 共 14 枚+树合成 2 枚=16 枚,**14 枚全含下划线**(`round_digs`/`round_mines`/`round_blast_spent` 三枚既有 id 已自带 `round_` 前缀);`reset_at: round_start` 恰 4 行(`round_blast_spent` :212/`instinct_atk` :494/`round_mines` :518/`round_digs` :723——三枚 round_ 前缀行现役已按轮始清零、改名零涉及,分桶后「整桶清空」与现役名单清零逐键等价);`domain` 键行:`twin_digs` :31/`pain_layers` :377/:535/:628(另 :407 附近 set 行)/`insurance_used` :877(battle)。**写点与读点成对同名**:`twin_digs` 写 :29/读 `when.id` :39;`instinct_atk` 写 :492/读 `value_counter` :501——改名必须成对同改,只改写点会把读写拆进两只桶且前缀校验查不出。
|
||||
|
||||
**残留 `domain` 键两处**:`effect_engine.gd:145/:155` 树合成行与 `tree_rules_v11_test.gd:33/:39` 夹具行仍带 `"domain": "adventure"`——`DO_KEYS` 删键后该夹具在 `validate_trigger_row` 面当场转红,在 T6 一并清除。
|
||||
|
||||
**过期注释面**:`effect_engine.gd:42`(「feats.tres 首例 domain=battle 行」)/`:70-71`(domain 键说明)/`:118-120`(adventure 域计数器按关重置叙述)、`grant_segment.gd:307`(「限次=合成行 adventure 域计数器闸」——sense 两键改 level 桶后失义)、`run_ledger.gd:7-8` 与 `:12`(export/seed 时点语义、「rebuild 回灌/战末导出回写目标」字段注)、`level_runner.gd:630`(T1 已列)——分桶后字面全部失义,在 T6 一并清除。
|
||||
|
||||
**采集器与复放数据面(2026-10-20 实跑复核)**:现行锚 `runsum_m3iter9exit_81000_n400_20261003.jsonl` 是 24 字段面、无 `feat_mode`/`attune`/`equipped`/`seal_miss`,与现役采集器的 33 字段面不同构;`sim-data/` 整目录不入 git,批 worktree 内本就没有该文件——两条合起来判锚不可用作本批复放基线,改批内重采(T0/T7)。另查出采集器缺陷:`adventure_monte_carlo.gd:65` 的 `rules` 档用 `String.split()` 产出 `PackedStringArray`,被 `adventure_runner.gd:118/:200` 的 `is Array` 守卫整组静默丢弃——对照实跑为 `ab_a`(字面量 Array)逐局改变轨迹、`rules` 与 `off` 除 `feat_mode` 标签外逐位相同;不修此行则 V12 的 rules 组恒假绿(修复列 T0 首提交)。
|
||||
|
||||
**静态扫描面**:`static_scan.sh:20-24` 的扫描路径单点只有 `game/core` 与 `game/presentation`,`scan_files` 只数 `.gd`——`feats.tres`、`game/tests/`、`game/smoke/` 全不在面内,新 S 段必须自带扩面(T7),否则「全仓零命中」是空转出来的绿。
|
||||
|
||||
**测试面**:`tests/run_all.gd` manifest(负面套件协议 `expect:1`+`negative:true`,先例 `reward_dangling_treasure_test.gd` 夹具注入);`tests/README.md:58` 记套件数 26;`game/presentation/` 全目录 counter_id 与 16 枚 id 字面零命中(呈现层不入改名传播)。
|
||||
|
||||
## 4. 设计契约(违反即返工;🔴 触碰=L3 停机呈报)
|
||||
|
||||
1. 🔴 **确定性**:除三处已定性行为变更(①adventure 桶真跨战持久;②天赋树锋/守真每关限 2;③旧档续玩时 `pain_layers` 不再跨战携带——见契约 8)外,同种子复放必须逐位一致——读写时序、装载序、命中序零变化;命中序=装载声明序写死不碰。全新开局不受③影响(缺陷态下本就未跨战,提案 §7.8 自锁)。
|
||||
2. 🔴 **数值零改动**:本批不改任何数值表值;天赋树锋/守「每战 2→每关 2」是回到设计意图(`effect_engine.gd:137` 注释),不是平衡调整;禁顺手调任何 provisional 值。
|
||||
3. 🔴 **round 桶就地清空**:轮始清零必须 `.clear()`(或等效就地清空),**禁 `= {}` 重赋值**——重赋值会切断 ctx 持有的引用。
|
||||
4. 🔴 **搬运链删除后禁留任何副本同步时点**:战末导出/战首回灌/判空守卫三类代码不得以任何形态复活(含「防御性保留」)。
|
||||
5. 🔴 **保险双账不改面**:`_perfect_forgiven` 与 `insurance_used` 同点双记关系原样保持(§3 现状事实),禁合并、禁迁账、禁改判定段两账相减语义(N6 定值)。
|
||||
6. 🔴 **两落点同源**:前缀校验的判定函数唯一(静态单点),`validate_trigger_row` 与 `_push_trigger` 共用;禁两处各写一份前缀表。引用闭合校验(T5)只做「读点 id ∈ 声明集」的成员判定,**禁在其中再写一份前缀判据**——前缀归桶的唯一出处仍是 `bucket_of`。
|
||||
7. 🔴 **容器与接口逐字锁定**:`EffectContext` 四字段名 `round_bucket`/`battle_bucket`/`level_bucket`/`adventure_bucket`;编排器成员 `fx_counters_round`/`fx_counters_battle`/`counters_ctx`;LevelRunner 成员 `level_counters`;enc 下传键 `"level_counters"`;改名 4 枚新 id `adv_twin_digs`/`lvl_tree_sense_sharp_used`/`lvl_tree_sense_guard_used`/`round_instinct_atk`。实现期不得另起名。
|
||||
8. 🔴 **pain_layers 归 battle**:只改归属(删 `domain` 键),单战内「攒层→下次攻击附加→用后清零」行为逐位不变(N4)。跨战口径按设计意图统一为「不跨战」:全新开局本就如此(`run_ledger.gd:42` 自锁),旧档续玩经 `adventure_runner.gd:206-208` 回灌后原可跨战携带,改后不再携带——该差异属缺陷消解(契约 1 第③项),不是语义回归,V13 旧档夹具须带 `pain_layers` 旧键。
|
||||
9. 🔴 **旧档不迁移**:改名后旧档断点旧键成死键属预期(H1 只断言不崩);禁加迁移体、禁动 `SAVE_FORMAT_VERSION`。
|
||||
10. 🔴 **实现批禁写 `design/` 与根规则文件**;`sim-data/` 只允许 V12 的两次采集(批前三组 40 局基线——已采完留盘,见 T0;批后同种子复放 40 局),二档上限内;现行锚与读数文件一律不动、不改名、不替换;对 `sim-data/README.md` 纪律③⑦的批次例外,依据见 §12 裁点①。
|
||||
11. 🔴 **同名成员禁遮蔽内建**:ctx 字段名已避讳(`round_bucket` 非 `round`),实现期引入新成员时同规。
|
||||
|
||||
## 5. 范围边界
|
||||
|
||||
**做**:§1 完成定义 1–8 全部;`EffectContext` 新类;引擎接口 ctx 化与写口静态化;7 个施加点迁移;前缀校验双落点+装载期引用闭合校验;4 枚 id 改名(写点与读点成对)+`domain`/`reset_at` 键删除(含引擎合成行与测试夹具两处残留);七处过期注释清扫;`dig_combo` 死路删除;采集器 `rules` 注入类型缺陷修复(一行,T0 首提交);测试新增/迁移/变异验证;批内同种子复放比对(三组 40 局基线已采+40 局复放+`tools/parity_compare.py` 判读);`static_scan.sh` 新增 S11 段(扫描面自带扩至 `game/**` 含 `.tres`)+`run_all.gd` manifest 登记。
|
||||
|
||||
**不做**(去向已定):
|
||||
|
||||
| 不做项 | 去向 |
|
||||
|---|---|
|
||||
| `charge_reset`(秘宝充能周期)、凭证件裸标量、SaveManager meta 域 | 提案 §9 已排除,不动 |
|
||||
| 断点快照结构(level 桶不进断点——N3:写入时刻恒空,「进」是空操作) | 不动;「退菜单续玩可刷新每关限次」属既有行为,登记真人检测面(V14 目检项) |
|
||||
| 编排器 5 个效果运行态(`_fx_ac_round`/`_fx_ac_battle`/`_fx_new_resource_types`/`_fx_bonus_delta`/`_perfect_forgiven`) | N6 定值:只归计数器,留编排器 |
|
||||
| 天赋树锋/守重新定价 | 独立议题,不进本批(§4.5 B3) |
|
||||
| architecture.md「系统无状态」原则补条 | 已登记 06 新条目(文档轨·待文档设计),归文档批;本批反哺点带依据 |
|
||||
| `roadmap.md`「当前位」三行 | 实现批不动——该节由编排段与批末登记维护(本卡编入迭代 32 时已由编排段同步) |
|
||||
| 与同迭代卡①(代码注释禁用词清扫批)并行开工 | 禁并行:两批都改写 `effect_engine.gd`/`grant_segment.gd`/`run_ledger.gd` 等文件的注释面,本批开工须排在卡①合回之后(roadmap 迭代 32 行执行序①→②) |
|
||||
| MC 采集(V12 复放之外的任何档) | §7.7 定值:零数值改动=零采集——本批只跑 V12 的三组 40 局基线(已采完)与 40 局复放,不开任何读数档、不动现行锚与读数文件 |
|
||||
| 元素类型精化(`Dictionary[String, int]`) | S9 现行口径 `Dictionary[Variant, Variant]` 合格,精化另走裁决 |
|
||||
|
||||
## 6. 关联文档同步面(实现批禁写本表所列文档——义务全部走 `reports/iter<N>-反哺点-<日期>.md`)
|
||||
|
||||
| 文档 | 关联点(本批实现改变它的哪条陈述) | 同步义务 |
|
||||
|---|---|---|
|
||||
| `design/engineering/architecture/architecture.md` | ①模块归属表 effect_engine 行「对外暴露」列记 `counters_export·counters_seed` 与「domain=adventure 跨战斗持久」(:116)——改后均不存在;②战斗域装配现状节「战末 export/开局 seed 时点语义不变」(:125)随搬运链删除失义;③「架构原则」节缺「系统无状态」条目(立项判据补条) | 反哺点清单逐条列出(①②改写成 ctx 形态描述、③指向 06 在册条目「效果引擎系统无状态原则缺架构文档条目」),用户裁决后归文档批 |
|
||||
| `game/tests/README.md` | :58 记「manifest 已登记实跑 26 套件」——本批新增 1 负面套件 | 反哺点(机械面文档,批后由文档批更新套件数与段描述) |
|
||||
| `design/gdd/06-待办清单.md` | 上游条目「计数器寿命域未统一」随批完成整条删除(收口=batch-closure 技能);条目现状内引用的行号(:838-841 等)随实现漂移 | 批内不动;收口时整条删除(行号订正随之消亡) |
|
||||
| `design/gdd/07-体验验证清单.md` | 天赋树锋/守第二次后无减免=玩家可感知削弱,需真人目检入册 | 反哺点(登记项见 §9 真人目检面) |
|
||||
| `design/research/提案-效果引擎无状态化-2026-10-19.md` | 三处与本卡口径不同(裁决见 §12):①§7.10.3「`meta_` 及其余未知前缀→违例」——14 枚 id 全含下划线,该判据误伤全部既有 battle id,且封闭前缀词表=第二事实源;②§7.10.12 记「RUNSUM 共 27 字段」且「受影响局 `levels_cleared` 不得上行」——实采 33 字段,且双管镐组是增强方向,单一判据把增强组与削弱组混判;③§7.7「零采集」定值所依赖的现行锚与本批不同构,不可作复放基线 | 反哺点清单逐条列出(本卡为准,提案随文档批订正;`design/` 对本批只读) |
|
||||
| `sim-data/README.md` | 配套纪律③「对拍断言=0 新跑」与⑦「零数值改动=零 MC」在本批开例外(三组 40 局基线+40 局复放,二档上限内);「现行锚」节与本批复放无关 | 反哺点(登记批次例外与判据,不改档位表本身) |
|
||||
| `design/gdd/术语表.md` | 零关联(本批不造新术语;四桶/前缀均为代码标识符非玩家术语;未新增 `battle_` 前缀词) | 无 |
|
||||
|
||||
## 7. 卡前文件结构图
|
||||
|
||||
**新建**:
|
||||
|
||||
| 文件 | 职责 |
|
||||
|---|---|
|
||||
| `game/core/effect_context.gd` | `EffectContext`——四桶引用束(RefCounted,四公开类型化字段,零方法) |
|
||||
| `game/tests/unit/data_config/counter_prefix_fatal_test.gd` | E1 负面套件:坏前缀 counter_id 行→load_tables 拒绝 + 读点 id 无声明行(引用闭合)→load_tables 拒绝(expect 1,两断言同套件) |
|
||||
| `tools/parity_compare.py` | V12 复放比对器:解析 `RUNSUM` 行按 seed 配对;`--mode parity`(整条记录逐位相等)与 `--mode input-parity`(输入面八字段+顶层字段集恒等)两判据;`--expect <局数>`;输出差异表与 `levels_cleared` 直方图(后者仅报告)。退出码 0 绿/1 红/2 用法或解析错;字段集从基线文件推导,禁硬编码 |
|
||||
|
||||
**修改**:
|
||||
|
||||
| 文件 | 改动 |
|
||||
|---|---|
|
||||
| `game/core/effect_engine.gd` | 删三状态成员与搬运接口;dispatch/counter 带 ctx;写口改静态纯函数+`bucket_of`;`_push_trigger` 前缀校验;DO_KEYS 删两键;合成行(:136-155)id 改名**并删 :145/:155 两处 `"domain": "adventure"`**;:42/:70-71/:116-122 过期注释改前缀口径 |
|
||||
| `game/core/battle_orchestrator.gd` | 两桶公开成员+ctx 构造挂载;set_fx 扩参;`dig_combo` 死路删除;战末导出两行删除 |
|
||||
| `game/core/action_economy.gd` | set_fx 扩参;3 dispatch 面+3 写口静态化 |
|
||||
| `game/core/damage_controller.gd` | set_fx 扩参;dispatch 汇聚面+1 读 2 写静态化 |
|
||||
| `game/core/reward_economy.gd` | set_fx 扩参;dispatch 面加 ctx |
|
||||
| `game/core/settlement/grant_segment.gd` | `_apply_counter_hit` 静态化;2 读口 ctx 化;`combo_cap` 收集与实参删除;:307「限次=合成行 adventure 域计数器闸」注释改 level 桶口径 |
|
||||
| `game/core/run_ledger.gd` | 删 `counters_seed_snapshot`/`counters_merge_export`;:7-8 头注契约句与 :12 字段注(「rebuild 回灌/战末导出回写目标」)改 ctx 直写口径 |
|
||||
| `game/core/adventure_runner.gd` | 删 `_reset_tree_limited_counters` 及调用点 |
|
||||
| `game/core/level_runner.gd` | `level_counters` 公开成员+enc `"level_counters"` 下传 |
|
||||
| `game/data/tables/feats.tres` | 4 枚 id 改名(**写点 :29/:492 与读点 :39/:501 成对同改**);`domain`/`reset_at` 键逐行删除 |
|
||||
| `game/core/config_db_cross_validator.gd` | 新增计数器引用闭合校验(声明集 vs 读点集,违例入 errs→加载致命) |
|
||||
| `game/smoke/adventure_monte_carlo.gd` | `:65` `rules` 档类型修复(`split` 结果包 `Array(…)`、`split(",", false)`)——T0 首提交,V12 rules 组生效前提 |
|
||||
| `game/tests/static_scan.sh` | 新增 S11 段:旧件符号+带引号旧 id 字面零命中;**扫描面自带扩至 `game/**/*.gd` 与 `game/data/tables/*.tres`**(现役 :20-24 只覆盖 core/presentation 的 `.gd`,不扩面即空转)+扫描面非空自检 |
|
||||
| `game/tests/run_all.gd` | manifest 登记负面套件 |
|
||||
| `game/tests/unit/core/effect_words_t1_test.gd` | ⑥ export/seed 块、⑦ reset_at/spend 块重写为桶语义;裸 dispatch/写口 ctx 化 |
|
||||
| `game/tests/unit/core/tree_rules_v11_test.gd` | :29-39 合成行字面 id 随改名+**删 :33/:39 两处 `"domain": "adventure"`**(不删则 `validate_trigger_row` 面当场转红) |
|
||||
| `game/tests/unit/core/feat_vouchers_test.gd` | V16 键名随前缀;V25 迁移保绿;新增 H1 旧档不崩断言 |
|
||||
| `game/tests/unit/core/settle_segments_test.gd` | `:32-33` 样本 id 换活 id+ctx 形态 |
|
||||
| `game/tests/unit/core/treasure_effects_test.gd` | 裸 dispatch 面 ctx 化(:34/:45/:53-56) |
|
||||
| `game/smoke/smoke_all.gd` | 新增 V1–V6/V8/V12 冒烟断言段;`:6076-6083`/`:6124-6128` 旧链删除;`:1419-1602` 裸引擎段 53 处 dispatch+8 处写口改 ctx 形态;各 rig enc `"adventure_counters"` 死键清除;`:1610` rebuild 调用零迁移 |
|
||||
|
||||
## 8. 任务卡 T0–T8
|
||||
|
||||
### T0 基线(0.25d)
|
||||
|
||||
- [ ] worktree/分支开工(process-conventions §1);拷主区 `.godot/` 与字体 `.import` 边车
|
||||
- [ ] **首提交=采集器 `rules` 注入类型缺陷修复**:`adventure_monte_carlo.gd:65` 的 `String(args[7] if args.size() >= 8 else "").split(",")` 改为 `Array(String(args[7] if args.size() >= 8 else "").split(",", false))`(不包则 `PackedStringArray` 被 `adventure_runner.gd:118` 的 `is Array` 整组静默丢弃——实测 `rules` 档与 `off` 逐位相同);单独一个提交,提交信息注明「测试工具类型修复,无玩法改动」
|
||||
- [ ] 基线三查记档:冒烟全绿数目、单元 26 套件全绿、探针基线
|
||||
- [ ] **V12 批前基线=卡片成文后的准备阶段已采完,批内不重跑**:三组文件(`sim-data/v12_base_off_n20_81000_f75acc1.jsonl` 20 局 81000–81019,sha256 `bf084ef3…`/`sim-data/v12_base_formed_n10_81000_f75acc1.jsonl` 10 局 81000–81009,sha256 `2d3d4247…`/`sim-data/v12_base_rules-sense_n10_81000_f75acc1_p1.jsonl` 10 局 81000–81009,sha256 `0fcbcb26…`,`_p1` 后缀=依赖上一条采集器修复),主区 `sim-data/` 与卡片 worktree `sim-data/` 两处留盘(`sim-data/` 不入 git,实现批新 worktree 内无此目录——开工时从主区拷入本 worktree 的 `sim-data/`,或让比对器按绝对路径读主区文件);采集时工作区无改动,有效码=commit `826e7ea1` 的 `game` 树 `f75acc15…` +本 T0 首提交。**开工先核 `git rev-parse HEAD:game`**:若不等于 `f75acc15…`(master 的 `game/` 在准备阶段之后前进过),留盘基线作废,按 T7 命令重采三组 40 局
|
||||
- [ ] `git log --oneline -1` 与 `tools/run_all_gates.sh --code` 基线档记档(起点绿态)
|
||||
|
||||
**产出**:基线档(实现报告 T0 节)。
|
||||
|
||||
### T1 `EffectContext` 新建+四宿主接线(0.5–1d)
|
||||
|
||||
**取用**:无。**产出**:`EffectContext`(字段名见契约 7)——T2–T7 全部引用。
|
||||
|
||||
- [ ] 新建 `game/core/effect_context.gd`:`class_name EffectContext extends RefCounted`;四字段 `var round_bucket: Dictionary[Variant, Variant] = {}`(battle_bucket/level_bucket/adventure_bucket 同型);文件头注 ≤8 行两类白名单;跑一次编辑器扫描刷新全局类缓存(code-conventions §4.5)
|
||||
- [ ] `BattleOrchestrator` 增三公开成员:`fx_counters_round`/`fx_counters_battle`(`Dictionary[Variant, Variant]`)+`counters_ctx: EffectContext`;`_init` 内构造 ctx 并挂自有两桶引用
|
||||
- [ ] `LevelRunner` 增公开成员 `level_counters: Dictionary[Variant, Variant]`;`_start_battle` enc 增 `"level_counters": level_counters`(`"ledger"` 行 :471 后);:630 过期契约注释(「战斗侧只走账类原语,战末 export/开局 seed」)随批改写
|
||||
- [ ] `begin_battle` :373 后挂载:`counters_ctx.adventure_bucket = _ledger.adventure_counters`;`enc.get("level_counters")` 为 Dictionary 时 `counters_ctx.level_bucket = enc["level_counters"]`(缺省=调试/单场空桶,与 `_ledger` 缺省新账同式)
|
||||
- [ ] `set_fx` 三处扩参:`func set_fx(fx: EffectEngine, ctx: EffectContext) -> void`(action_economy.gd:48/damage_controller.gd:70/reward_economy.gd:23),三协同件各增 `_ctx` 成员;`battle_orchestrator.gd:280-282` 调用点同步
|
||||
- [ ] 删 `adventure_runner.gd:838-841` `_reset_tree_limited_counters` 与 `:845` 调用点(同批摘除冒烟 `:6125` 直呼——F2 面随 T7 断言同轮)
|
||||
- [ ] 孤立验证:`--headless --script` 最小驱动 `EffectContext.new()`+编排器 `_init` 构造 ctx 成功(新码先行孤立验证纪律)
|
||||
|
||||
### T2 引擎删状态+ctx 接口+静态写口(0.5–1d)
|
||||
|
||||
**取用**:T1 的 `EffectContext`。**产出**:引擎新接口面——`dispatch(ctx, event, payload, facts)`/`counter(ctx, id)`/`static bucket_of(ctx, id)`/`static counter_add(ctx, id, value, set_mode=false)`/`static counter_spend(ctx, id, value) -> bool`。
|
||||
|
||||
- [ ] 删成员 `_counters`/`_reset_on_round_start`/`_adventure_counter_ids`(:84-87 含续行)与 rebuild 内三处清零/收集(:100-101/:156-157/:181-190)
|
||||
- [ ] `rebuild()` 签名不变(`feat_ids, item_ids, tree_rules`)——冒烟 `:1610` 调用面零迁移
|
||||
- [ ] `dispatch(ctx: EffectContext, event: String, payload: Dictionary, facts: Callable = Callable()) -> Array`;round_start 特判(:210-212)改 `ctx.round_bucket.clear()`——**就地清空**(契约 3)
|
||||
- [ ] `counter(ctx: EffectContext, counter_id: String) -> int`(读 `bucket_of(ctx, counter_id)`)
|
||||
- [ ] 新增 `static func bucket_of(ctx: EffectContext, counter_id: String) -> Dictionary[Variant, Variant]`:`round_`→round_bucket/`lvl_`→level_bucket/`adv_`→adventure_bucket/其余→battle_bucket(前缀规则唯一出处)
|
||||
- [ ] 新增静态 `counter_add`/`counter_spend`(签名见产出块;算术与阈值闸语义从现役 :228-242 逐字保留);删实例版两方法与 `counters_export`/`counters_seed`(:246-257)
|
||||
- [ ] `run_ledger.gd` 删 `counters_seed_snapshot`(:36-37)与 `counters_merge_export`(:40-45);头注契约句「战斗侧只走 read/append 两族原语」同步改写(ctx 直写后字面失义、签名可见显式引用的立意由 EffectContext 承接)
|
||||
- [ ] `DO_KEYS` 删 `"domain"`/`"reset_at"`(:72-75)
|
||||
- [ ] 孤立验证:裸引擎 rig `EffectEngine.new(null)`+自建 ctx,合成一行 counter_add 行 dispatch→静态写口→counter 读回一致
|
||||
|
||||
### T3 施加点改写+dig_combo 死路删除(0.5–1d)
|
||||
|
||||
**取用**:T2 全部接口。**产出**:生产侧零 `_fx.counter_add(`/`_fx.counter_spend(`/`counters_export` 残留(V10 静态扫描可证)。
|
||||
|
||||
- [ ] `action_economy.gd`::103/:164/:191 dispatch 加 `_ctx`;:108/:111/:169 写口改 `EffectEngine.counter_add(_ctx, ...)`——:103-108「counter_spend 订阅→加收对价+积计数」读-判-写序列逐字保留(§7.10.6)
|
||||
- [ ] `damage_controller.gd`::78 dispatch 加 ctx;:345 读改 `EffectEngine.counter(_ctx, ...)`;:351/:464 写口静态化
|
||||
- [ ] `reward_economy.gd`::65 dispatch 加 ctx
|
||||
- [ ] `grant_segment.gd`::103/:205 读口 ctx 化(经 `oc.counters_ctx`);:327 `_apply_counter_hit` 内写口改静态(调用点 :66/:122/:156/:215/:264 零改动);:54/:61/:62 `combo_cap` 收集与实参删除
|
||||
- [ ] `battle_orchestrator.gd`::88 `_fx_emit` 加 `counters_ctx`;:714 受理闸改 `EffectEngine.counter_spend(counters_ctx, ...)`;:390 回灌调用 `_fx.counters_seed(_ledger.counters_seed_snapshot())` 连同 :389 注释行删除;:635-647 删 `dig_combo` 死读数+combo 加成分支+`_feat_yield_adjust` 第五参(§7.10.14,零行为差);:1122-1123 战末导出两行删除(:1118-1121 bonus_delta 汇入保留——那是 N6 留编排器的运行态,不是计数器)
|
||||
- [ ] 孤立验证:单场编排 rig begin_battle→request_dig 一次→`run_ledger.adventure_counters` 立即可见写入(无战末时点依赖)
|
||||
|
||||
### T4 round 泛化+宿主清零确认(0.25d)
|
||||
|
||||
**取用**:T2 的 round_start 特判、T1 的宿主成员。**产出**:三清零点在位(轮始一处+宿主 new 两处)。
|
||||
|
||||
- [ ] 确认轮始清零唯一入口=引擎 dispatch 特判(T2 已改);编排器侧零新增清零代码
|
||||
- [ ] 确认 battle/level 桶零显式清零代码(宿主 new 天然空);全仓 grep `_reset_on_round_start`/`_adventure_counter_ids`/`_reset_tree_limited_counters` 零命中
|
||||
- [ ] 孤立验证:round 桶写非零→dispatch("round_start")→整桶空;battle 前缀键同一 dispatch 下不动
|
||||
|
||||
### T5 前缀校验双落点+引用闭合(0.5d)
|
||||
|
||||
**取用**:T2 的 `bucket_of` 前缀规则。**产出**:加载期前缀致命通道+读点无声明致命通道(V9 两侧)。
|
||||
|
||||
- [ ] 新增静态判定函数 `static func counter_id_legal(counter_id: String) -> bool`(名字锁定;判据见提案 §3.3 与 §12 裁点②):`round_`/`lvl_`/`adv_` 前缀=true;`meta_` 前缀=false(引擎不接存档级);其余=true(无前缀落 battle——「其余未知前缀也非法」在语法上不可判定:`feats.tres` 现有 14 枚 id 全含下划线,除三枚已带 `round_` 前缀外首段全是普通词(`pain_`/`geo_`/`helm_`…),封闭前缀词表会把它们全部判成违例,且自造词表=第二事实源红线)。自造新前缀静默落 battle 的残余风险由下条引用闭合校验(拦写读不一致)与 V10 扫描承接,不再单靠人工评审
|
||||
- [ ] **引用闭合校验**落 `config_db_cross_validator.gd`(既有跨表校验面,非单行校验):三源装载完成后收集声明集=各行 `do.counter_id` ∪ 树合成行 `do.counter_id`;再遍历全部读点(`when` 内 `fact: counter` 的 `id`、`do.value_counter`、`counter_spend` 的 `counter_id`),读点 id 不在声明集→errs 追加 `{"category": "enum", ...}` 违例→加载致命。判据只做成员判定,禁在其中再写前缀规则(契约 6)。两判据互补且不可互相替代:`meta_`/自造前缀由 `counter_id_legal` 拦,写点与读点拼错不一致由本条拦(现役 `feats.tres` 的 `:29`/`:39` 与 `:492`/`:501` 就是成对同名形态,改一半即中招)
|
||||
- [ ] `validate_trigger_row` 增分支:`do` 含 `counter_id` 时校验,非法→errs 追加 `{"category": "enum", ...}` 违例
|
||||
- [ ] `_push_trigger` 增 assert:`do` 含 `counter_id` 时同规则 assert(树合成行路径,写错调试期致命;assert 消息以 `[效果引擎]` 前缀起头,供孤立验证扫描)
|
||||
- [ ] 孤立验证(V9 assert 侧):`--headless --script` 最小驱动**直调 `_push_trigger`** 塞一条 `"counter_id": "meta_probe"` 行——`rebuild` 只认固定规则键,坏前缀合成行无法经 `rebuild` 从外部注入,故注入点必须是 `_push_trigger`;输出扫到 `[效果引擎]` assert 签名=拦截在位(debug 通道;assert 不改退出码,判据=输出签名扫描)
|
||||
- [ ] 新建 `game/tests/unit/data_config/counter_prefix_fatal_test.gd`:copy_tables 夹具两断言——①向 feats.tres 注入 `"counter_id": "meta_probe"` 行→`load_tables` 必须拒绝;②把某行 `when` 内 `fact: counter` 的读点 id 改成表内无声明的 `"pain_layer"`(比 `pain_layers` 少一个 s)→`load_tables` 必须拒绝。任一条违规放行即 quit(2)(reward_dangling_treasure_test.gd 同构,退出码协议同款)
|
||||
- [ ] `tests/run_all.gd` manifest 登记:`{"path": "res://tests/unit/data_config/counter_prefix_fatal_test.gd", "expect": 1, "negative": true}`
|
||||
|
||||
### T6 数据行与合成行改名(0.25d)
|
||||
|
||||
**取用**:契约 7 的 4 枚新 id。**产出**:16 枚 id 全部合规(前缀即归属)。
|
||||
|
||||
- [ ] `feats.tres`:**写点与读点成对改名**——`"twin_digs"`→`"adv_twin_digs"`(写 :29/读 `when.id` :39);`"instinct_atk"`→`"round_instinct_atk"`(写 :492/读 `value_counter` :501);`pain_layers` 各行删 `"domain": "adventure"` 键(:375-377/:407 邻近/:533-535/:626-628——归 battle,N4);`twin_digs` 行删 domain 键、`insurance_used` 行删 `domain: battle` 键(:875-877);全部 `reset_at` 键删除(:209-212/:490-494/:514-518/:719-723)
|
||||
- [ ] `effect_engine.gd` 合成行(:136-155):`tree_sense_sharp_used`→`lvl_tree_sense_sharp_used`、`tree_sense_guard_used`→`lvl_tree_sense_guard_used`(when id 与 counter_id 共六处字面:锋/守各 when 两行+do counter_id 一行);**删除 :145/:155 两处 `"domain": "adventure"`**(随 DO_KEYS 删键,否则合成行自带出域键);:116-122 注释内「domain=adventure」叙述同步改前缀口径
|
||||
- [ ] `tree_rules_v11_test.gd` 夹具行(:33/:39)随合成行同源改 id + **删两处 `"domain": "adventure"`**——该夹具经 `validate_trigger_row` 校验,`DO_KEYS` 删键后不删此处即当场转红
|
||||
- [ ] 过期注释清扫(§3 清单逐处):`effect_engine.gd:42/:70-71/:118-120`、`grant_segment.gd:307`、`run_ledger.gd:7-8/:12`、`level_runner.gd:630`
|
||||
- [ ] 全仓 grep 确认零 `domain`/`reset_at` 键残留(feats.tres+引擎合成行+测试夹具三处都算);`pain_layers`/`geo_types` 等 9 枚无前缀 id 零改名(前缀判据只禁 `meta_`,其余落 battle 即归属——判据理由与残余风险的承接面见 T5 与 §12 裁点②;14 枚去三枚已带 `round_` 前缀、再去本批改名的 `twin_digs`/`instinct_atk` 两枚,落地后无前缀者恰为 9 枚)
|
||||
|
||||
### T7 验收断言+旧测试迁移+变异验证+同种子复放比对(1.25–1.75d)
|
||||
|
||||
**取用**:T1–T6 全部产物;§9 验证闸清单(V1–V14 断言内容以本卡为唯一规格)。**产出**:V1–V13 全绿+变异验证记录表+三组复放判读记录(承载提案 §7.10.12 的 G1 已知差异面条目)。
|
||||
|
||||
- [ ] **新增单测断言**(套件内新增,断言尾缀〔无状态化 Vn〕):V2/V3/V7/V13 落 `feat_vouchers_test.gd`(V16 键名 `pain_layers:3, twin_digs:5`→`adv_twin_digs:5` 等活键改写;V25 全组保绿不改断言内容;新增 H1:bp_legacy 同时注入 `"tree_sense_sharp_used": 2` 与 `"pain_layers": 3` 两枚旧键,resume 受理零崩溃、旧键留桶成死键——`pain_layers` 旧键即契约 8 的续玩差异面);V9 落 `counter_prefix_fatal_test.gd`(T5 两断言)
|
||||
- [ ] **新增冒烟断言段**(`smoke_all.gd` 树规则段近旁;每条夹具的 enc 键写死,不留给实现期自由发挥):V1(夹具=同一 `RunLedger` 下两次 `begin_battle`,**两 enc 均带 `"feats": ["twin_pick"]`**——不带则 `adv_twin_digs` 无订阅行,断言空转;第 1 战 `orch1.action_economy.request_dig(0, false)` 一次无返还+桶值 1,第 2 战一次返还成立+桶值 2);V4/V5(夹具=两编排器 enc 均带 `"tree_rules": ["sense_sharp", "sense_guard"]` 且 `"level_counters"` 传同一字典引用:第 1 战两次 `_fx.dispatch(counters_ctx, "mine_hit", {})` 命中桶值 2,第 2 战同 dispatch 返回空且桶值不动;新 LevelRunner 新桶为空);V6(第 1 战经 `_judge_seal` 置 `insurance_used=1`,第 2 战读 0);V8(round 桶直写非零→`orch._emit_round_start()`→全零,battle 前缀键不动)
|
||||
- [ ] **旧断言迁移/摘除**(F2——同批同轮):`effect_words_t1_test.gd` ⑥(:77-94 export/seed 往返)改桶语义断言(共享 adventure 桶字典往返)、⑦(:96-124 reset_at/spend)重写(round 桶轮始清空语义+静态 spend);`smoke_all.gd` `:6076-6083`(counter_add+export/seed 链)改共享桶形态、`:6124-6128`(`_reset_tree_limited_counters` 直呼)删除;`:1419-1602` 裸引擎段 53 处 dispatch+8 处写口改 ctx 形态(逐行扫尽,rig 顶自建 ctx 或取 `orch.counters_ctx`);`tree_rules_v11_test.gd:29-39` 字面随 T6 新 id;`settle_segments_test.gd:32-33` 样本 id `dig_combo`→`geo_types`+ctx 形态;`treasure_effects_test.gd:34/:45/:53-56` dispatch 加 ctx;各 rig enc `"adventure_counters": {}` 死键删除(编排器只读 `enc["ledger"]`,:372 实证)
|
||||
- [ ] **静态扫描 S 段**(`static_scan.sh` 新增 S11):规则=`counters_export`/`counters_seed`/`counters_merge_export`/`counters_seed_snapshot`/`_reset_tree_limited_counters` 零命中+带引号旧 id 字面 `"tree_sense_sharp_used"`/`"tree_sense_guard_used"`/`"twin_digs"`/`"instinct_atk"` 零命中(带引号匹配防新名误伤)。**扫描面必须自带扩面**:现役 `:20-24` 的扫描路径单点只有 `game/core` 与 `game/presentation`、`scan_files` 只数 `.gd`,而改名与旧字面同时存在于 `feats.tres`、`game/tests/`、`game/smoke/` 三处——本段单独声明扫 `game/**/*.gd` 与 `game/data/tables/*.tres`,并沿用 `require_scan_face` 同规做扫描面非空自检(空面判红,防静默空转);`run_all_gates.sh` 域内已有 static_scan,无闸件清单改动
|
||||
- [ ] **变异验证**(§9 变异表 7 行逐条:注入→最窄闸见红→`git checkout -- <文件>` 还原→复跑回绿→记录)
|
||||
- [ ] **批内同种子复放比对**(V12):批后码按 T0 的同一命令行重跑三组 40 局(STATE=post,落 `sim-data/v12_post_*_<POSTSHA7>.jsonl`),再用 `tools/parity_compare.py` 三组各判读一次——off 组 `--mode parity` 要求 20 局整条记录逐位相等;formed 组与 rules 组 `--mode input-parity` 要求输入面八字段(`policy`/`seed`/`atk_pct`/`hp_pct`/`route`/`attune`/`equipped`/`feat_mode`)与顶层字段集恒等、种子集与局数一致;输出面差异打差异表、`levels_cleared` 合计与直方图作报告行(formed 组预期不降、rules 组预期不升;10 局无统计功效,**方向不作判红依据**)。采集命令与分组(normal 档、route=min、attune/shop 显式 off,逐字与 T0 准备阶段一致):
|
||||
|
||||
```bash
|
||||
mc () { "$GODOT" --headless --path "$(cygpath -m "$PWD/game")" \
|
||||
--script res://smoke/adventure_monte_carlo.gd -- \
|
||||
"$1" "$2" normal min off off "$3" "$4" 2>&1 | grep '^RUNSUM ' > "$5"; }
|
||||
mc 20 81000 off "" sim-data/v12_post_off_n20.jsonl
|
||||
mc 10 81000 formed "" sim-data/v12_post_formed_n10.jsonl
|
||||
mc 10 81000 rules "sense_sharp,sense_guard" sim-data/v12_post_rules-sense_n10.jsonl
|
||||
```
|
||||
|
||||
判红后的归因顺序(先排除环境再查码):在基线码上重放 5 局对哈希——一致=代码漂移(L3),不一致=环境漂移(console exe/导入缓存/种子面),按 process-conventions 环境自救清单处理后再判。逐位差异明细与三组判读结论记实现报告;40 局合计约 1.5 分钟(准备阶段实测 normal 档单局 1.8 秒),禁顺手加档
|
||||
- [ ] 里程碑步出口:`tools/run_all_gates.sh --code`(代码域闸全绿);波内修复只做出红最小单元的最窄确认
|
||||
|
||||
### T8 产出物落位卡(0.25d)
|
||||
|
||||
**取用**:T0–T7 全部记录。**产出**:`reports/` 三份齐+06 状态就绪。
|
||||
|
||||
- [ ] 实现报告 `reports/iter<N>-实现报告-<日期>.md`:各 T 卡状态+变异验证记录表(注入点 file:line/跑的闸/红输出摘要/还原结论)+三组复放判读记录(基线与复放六个文件的 sha256、T0 首提交 SHA、逐位差异明细、`levels_cleared` 直方图)+实机目检总清单(V14 登记)
|
||||
- [ ] 代拍板追认单 `reports/iter<N>-代拍板-<日期>.md`(§11 白名单内微决策逐条备案)
|
||||
- [ ] 反哺点清单 `reports/iter<N>-反哺点-<日期>.md`:§6 同步面逐条落点(architecture.md 三处改写文案与依据、tests/README 套件数、07 目检入册项、**提案三处口径订正(§7.10.3/§7.10.12/§7.7,依 §12 裁决以本卡为准)**、`sim-data/README.md` 批次例外登记)
|
||||
- [ ] 轻闸全绿后合并前自查:`game/` 与 `tools/` 改动全在案、`design/` 与根规则文件零触碰(`git diff --stat` 核对)
|
||||
|
||||
## 9. 验证闸(逐需求点验收清单)
|
||||
|
||||
**闸口径**:批末=代码域闸全绿(冒烟+单元+探针+渲染/静态,`tools/run_all_gates.sh --code`)+批内同种子复放比对(V12,批后 40 局,二档上限内)。里程碑步(波/T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试/工具先行孤立验证再并入全套。本批无数值改动,三处预期行为差异(契约 1)由 V12 三组判读与 V1/V4/V5 确定性断言共同承载——方向性结论只由后者下,V12 只负责「没改坏」。
|
||||
|
||||
**逐需求点清单**(断言尾缀〔无状态化 Vn〕;「测什么/怎么测/谁验」三问逐条可答):
|
||||
|
||||
| # | 需求点 | 测什么 | 怎么测(注入粒度) | 落点 | 谁验 |
|
||||
|---|---|---|---|---|---|
|
||||
| V1 | adventure 桶跨战持久(`run_ledger.gd:42` 缺陷消解回归钉面) | 第 1 战写入第 2 战可读、读写走真实事件面 | 夹具=同一 `RunLedger` 下两次 `begin_battle`、两 enc 均带 `"feats": ["twin_pick"]`:第 1 战 `orch1.action_economy.request_dig(0, false)`(无返还,`adv_twin_digs`=1)→第 2 战一次挖返还成立+桶值 2 | 冒烟新段 | 自动 |
|
||||
| V2 | adventure 桶新冒险置空 | `start_adventure` 后桶空 | `start_adventure(301,...)` 后 `run_ledger.adventure_counters` 为空 | `feat_vouchers_test.gd` | 自动 |
|
||||
| V3 | adventure 桶随断点往返 | 快照/回填逐位相等 | 写桶→`_on_level_finished`→`breakpoint_snapshot`→`resume_adventure`→逐键比对(键随新 id) | `feat_vouchers_test.gd`(V16 改写) | 自动 |
|
||||
| V4 | level 桶同关跨战保持、进关清零 | 共享桶第 2 战保值;新 LevelRunner 新桶空 | 两编排器 enc["level_counters"] 同引用:第 2 战读 `lvl_tree_sense_*` 保持;再 new LevelRunner 断言 `level_counters` 空 | 冒烟新段 | 自动 |
|
||||
| V5 | tree_sense 每关限 2 次(削弱正面确认) | 第 1 战用满→第 2 战 lt 2 闸关零命中 | 夹具=V4 同款共享 `level_counters` 引用、两 enc 均带 `"tree_rules": ["sense_sharp", "sense_guard"]`:第 1 战两次 dispatch mine_hit 命中(桶值 2)→第 2 战同 dispatch 返回空且桶值不动 | 冒烟新段 | 自动 |
|
||||
| V6 | battle 桶随宿主销毁 | 第 2 战读 `insurance_used`==0 | 第 1 战 `_judge_seal` 置 1→新编排器 begin_battle 后读 0 | 冒烟新段 | 自动 |
|
||||
| V7 | 完美保险每战限次一次(卡② V25 迁移保绿) | V25 全组断言原样绿 | 沿用 V25 注入口径零改写——双账同点双记不改面(契约 5) | `feat_vouchers_test.gd:130-188` | 自动 |
|
||||
| V8 | round 桶轮始清空 | 轮始后 round 桶全零、他桶不动 | round 桶直写非零→`orch._emit_round_start()`→全零;`fx_counters_battle` 内键不动 | 冒烟新段 | 自动 |
|
||||
| V9 | counter_id 非法前缀加载致命(.tres 行+树合成行双落点)+读点无声明加载致命(引用闭合) | 坏前缀行 load_tables 拒绝;合成行 assert 触发有据;读点 id 不在声明集 load_tables 拒绝 | 夹具①注入 `"counter_id": "meta_probe"`→load_tables false;夹具②把某 `when` 读点 id 改成 `"pain_layer"`(无声明)→load_tables false;assert 侧=T5 孤立验证(**直调 `_push_trigger`** 塞坏前缀行,输出扫 `[效果引擎]` assert 签名——`rebuild` 不认外部键,经它注入不可执行)+变异表第 4/5 行证明拦截 | `counter_prefix_fatal_test.gd`(expect 1, negative)+T5 孤立验证 | 自动 |
|
||||
| V10 | 旧件零残留 | 五符号+四带引号旧 id 字面在 `game/**/*.gd` 与 `game/data/tables/*.tres` 零命中(面含测试与 smoke,不只 core) | static_scan 新增 S11 段(扫描面自带扩面+非空自检,规则见 T7) | `static_scan.sh` | 自动 |
|
||||
| V11 | 旧断言同批摘除 | 冒烟/单测无旧件断言残留 | V10 扫描面覆盖测试文件+F2 清单逐项核对(`effect_words_t1` ⑥⑦/`smoke :6076-6083`/`:6124-6128`/`:1419-1602`) | 冒烟+单测迁移轮 | 自动+实现报告核对表 |
|
||||
| V12 | 批内同种子复放三组判读 | off 组整条记录逐位相等;formed 组/rules 组输入面八字段与顶层字段集恒等、种子集与局数一致、零崩溃;输出面差异与 `levels_cleared` 方向只记报告 | T0 留盘基线(三组 40 局,哈希在册)vs 批后同命令同种子复放 40 局;`tools/parity_compare.py` 三组各跑一次(判据与命令见 T7) | 复放比对器+实现报告判读记录 | 自动+人工判读 |
|
||||
| V13 | 旧档断点加载不崩 | 旧键 resume 受理零崩溃 | bp_legacy 同时注入 `"tree_sense_sharp_used": 2` 与 `"pain_layers": 3`→`resume_adventure` 受理、旧键留桶成死键 | `feat_vouchers_test.gd`(V16 同构) | 自动 |
|
||||
| V14 | 天赋树锋/守削弱玩家可感知(登记不阻塞) | 每关第 3 次起无减免/无返还 | 用户实战目检:同关第 3 次踩雷不再减半、第 3 次标错不再返 AP | 实机目检总清单+07 入册(反哺点) | 用户目检 |
|
||||
|
||||
**变异验证必做**(无变异红记录只写「已实现,拦截能力未证」):
|
||||
|
||||
| 断言 | 注入形态 | 跑的最窄闸 | 期望 |
|
||||
|---|---|---|---|
|
||||
| V1 | T1 挂载行改 `counters_ctx.adventure_bucket = {}`(丢共享引用——复刻副本不同步缺陷类) | 跑 `smoke_all.gd` 单脚本,核对 V1 断言红 | V1 红 |
|
||||
| V5 | V4/V5 两编排器改传各自新建 level 字典(复刻 :838-841 旧形态跨战不共享) | 跑 `smoke_all.gd` 单脚本,核对 V5 断言红 | V5 红 |
|
||||
| V9(.tres 侧) | 注释 `validate_trigger_row` 前缀校验分支 | `counter_prefix_fatal_test.gd` 单跑 | 套件转「违规放行」态判红 |
|
||||
| V9(合成行侧) | 注释 `_push_trigger` 内前缀 assert 行 | T5 孤立验证驱动单跑(输出签名扫描) | assert 签名消失=拦截失效判红 |
|
||||
| V9(引用闭合侧) | 注释 `config_db_cross_validator.gd` 的闭合校验调用行 | `counter_prefix_fatal_test.gd` 单跑 | 夹具②(读点无声明)违规放行=拦截失效判红 |
|
||||
| V10 | 任一源文件临时写回一处 `"counters_export"` 引用 | `static_scan.sh` 单跑 S11 段 | 扫描红 |
|
||||
| V12(采集器侧) | 还原 T0 首提交那一行(`Array(…)` 包裹去掉) | T7 复放 rules 组判读 | rules 组与 off 组逐位相同=分组空转,被 L3「采集器补丁缺位」条款捕获 |
|
||||
|
||||
**测试方式两分法**:V1–V13 全部=调试接口直改/直调核心层(共享字典注入、`request_dig`/`_judge_seal`/`_emit_round_start` 核心写口直调),不经 UI;V14=用户目检(登记不阻塞,验收时间用户自定)。
|
||||
|
||||
## 10. 异常分级
|
||||
|
||||
- **L1 自救**:编译错/笔误级红;孤立验证失败(新类/新函数首跑);复放脚本参数错重跑。
|
||||
- **L2 记录继续**:V12 的 formed/rules 两组输出面差异面过大(半数以上字段位移)——属轮数一变后的 RNG 级联放大,如实记录不判红;负面套件在 release 模式 assert 剥离致假绿——换 debug 通道验证并记录(配置问题非代码缺陷)。
|
||||
- **L3 停机呈报**:V12 的 off 组出现任何逐位差异,或 formed/rules 两组输入面八字段/字段集/种子集/局数任一不一致(确定性破约);rules 组复放结果与 off 组逐位相同(采集器补丁缺位,分组空转、数据不可信);V7/V25 任何一条红(契约 5 破);V13 崩溃;`pain_layers` 单战「攒层→附加→清零」行为漂移(契约 8 破);写口语义与现役不一致导致 V1–V8 连带红且无法归因单点。
|
||||
- 环境故障(worktree 缓存/资源导入/console exe)按 process-conventions 异常分级自救清单处理。
|
||||
|
||||
## 11. 代拍板白名单(超清单必呈报)
|
||||
|
||||
1. 新测试函数/夹具变量命名、断言消息文案(编号尾缀〔无状态化 Vn〕已锁)。
|
||||
2. 冒烟新段的段落插入位置与段名(须紧邻现役树规则段)。
|
||||
3. 静态 `counter_add`/`counter_spend`/`bucket_of` 内部语句序(签名与语义已锁,实现体自由)。
|
||||
4. `feats.tres` 行内键序调整(键集与值已锁)。
|
||||
5. `effect_engine.gd` 合成行注释的措辞更新(口径已锁:前缀表述)。
|
||||
6. 负面套件内诊断文案措辞(退出码协议已锁)。
|
||||
7. `tools/parity_compare.py` 的内部实现与输出排版(两判据模式、`--expect`、退出码 0/1/2 与「字段集从基线推导」四条已锁)。
|
||||
8. 复放文件名里的码态后缀取值与差异表行数(三组名、种子面、留盘位置已锁)。
|
||||
|
||||
## 12. 待裁点
|
||||
|
||||
**零待裁点,开工门=U0。**
|
||||
|
||||
本卡全部设计定值承自提案 §7(N1–N6)、§7.7(零采集)、§7.10(缺口闭合),均为「已生效裁定+硬纪律」推导所得并写明依据;其中以下各项带「可否决」标注(提案 §7.9/§7.10.14 同口径),用户审卡时可单独推翻、推翻即回改卡:§7.9 五条(立项判据载体/domain+reset_at 删键/`adventure_counters` 容器名不改/旧档不迁移/两编译名单删除)与 B6(dig_combo 死路删除)。卡片成立还需 grilling 复核通过(零待裁点+验收三问逐条可答已自查,见下)。
|
||||
|
||||
**owner 已裁六项(对抗复核轮 2026-10-20,已并入正文对应节,非待裁点)**:
|
||||
|
||||
| # | 裁决 | 落点 | 判据 |
|
||||
|---|---|---|---|
|
||||
| ① | 复放基线改批内重采(三组 40 局,二档上限内),`sim-data/` 纪律③⑦开批次例外 | §1.6/契约 10/T0/T7/V12 | 现行锚 24 字段面与现采 33 字段面不同构、无 `feat_mode` 分组面,且 `sim-data/` 不入 git 致批 worktree 内根本没有该文件——「锚新鲜度核对」一步必红,原方案不可执行 |
|
||||
| ② | 前缀判据采「只禁 `meta_`+其余落 battle」的松版,另加装载期引用闭合校验 | §1.5/契约 6/T5/V9 | `feats.tres` 现有 14 枚 id 全含下划线、首段除三枚 `round_` 外全是普通词,严版误伤全部既有 battle id;封闭前缀词表=第二事实源(2026-10-19 registry 注销裁定同类);实测风险形态是写读成对字面改一半,闭合校验正面拦截 |
|
||||
| ③ | 改名与删键面扩到读点、合成行、测试夹具与过期注释 | T6/§7 文件结构 | `:39`/`:501` 读点、`effect_engine.gd:145/:155` 与 `tree_rules_v11_test.gd:33/:39` 的 `domain` 残留、七处注释——原卡遗漏,其中夹具残留会当场转红 |
|
||||
| ④ | `pain_layers` 措辞改为「单战零变更+旧档续玩不再跨战」,列第三处预期差异 | 契约 1/8/V13 | 断点回灌路径(`adventure_runner.gd:206-208`→`:1033`)使旧档续玩可跨战携带该键,改后不再携带——属缺陷消解,不得写成「零语义变化」 |
|
||||
| ⑤ | 验收夹具写死到 enc 键字面;V9 assert 侧注入点改直调 `_push_trigger` | §9 V1/V5/V9/T7 | `rebuild` 只认固定规则键,经它注入坏前缀合成行不可执行;V1/V5 不带 `"feats"`/`"tree_rules"` 则订阅行为空、断言空转 |
|
||||
| ⑥ | 采集器 `rules` 注入类型缺陷修复入本批(T0 首提交),不单独开非迭代批 | T0/§7 文件结构/V12 | 一行测试工具修复在本批末的代码域闸里一起验,省一次全量闸;不修则 rules 组恒假绿,V12 削弱面失去复放承载 |
|
||||
|
||||
---
|
||||
|
||||
## 附:任务卡自审五查记录(2026-10-20 成文自检)
|
||||
|
||||
**grilling 复核轮**:成文后经独立会话对抗复核(新会话视角、不带写卡人假设),五项回炉点已全落——①行号群订正(成员块 :83-88/:84-87、`counters_seed` :255、`EffectEngine.new` :271、合成行 :136-155、注释 :137、rebuild :1610、裸引擎段实数 53 处、合成行字面六处);②V12 复放基线的取数面与判据(现落定为批内三组 40 局,见 §12 裁点①);③V9 assert 侧补孤立验证与变异行;④T5 判定函数名落定 `counter_id_legal`;⑤估时头对齐 T 表加总+超盒切分预案。复核结论「定点回炉后可交用户审」已执行。
|
||||
|
||||
1. **规格覆盖**:完成定义 1–8 ↔ T 卡映射——1→T2;2→T1;3→T2/T3;4→T1;5→T5;6→T7(V12);7→T3;8→T7(V13)。验收 V1–V14 逐条有落点。✓
|
||||
2. **步骤扫描**:各步一动作一核查结果;实现体未写(签名+断言已锁);无「TBD/酌情」句式。✓
|
||||
3. **类型一致性**:`EffectContext` 字段名、编排器/LevelRunner 成员名、enc 键名、静态函数签名在 T1/T2/T3/T7 引用处逐字一致(契约 7 锁定)。✓
|
||||
4. **审查焦点**:规格暗示的失败模式对照——确定性漂移(V12 off 组逐位判据+判红先归因环境再归因码)、引用切断(契约 3+V1 变异)、限次失效回退(V5 变异)、加载致命旁路(V9 三侧变异:`.tres`/合成行/引用闭合)、死路复活(V10)、复放分组空转(rules 组与 off 组同形即 L3,配采集器侧变异行)——均有承载;「同轮 dispatch 内 round 桶清空与订阅行命中并存」的时序语义由 V8+现役特判位置保持承载。✓
|
||||
5. **篇幅比例**:本卡以签名/断言/落点为主,无函数体代码块。✓
|
||||
+3
-3
@@ -5,8 +5,8 @@
|
||||
## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照)
|
||||
|
||||
- **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。
|
||||
- **迭代位**:迭代 1–31 全部已完成或已终止;**迭代 32 待开工**(卡①代码注释禁用词清扫批+卡②效果引擎无状态化批,2026-10-20 编入,执行序①→②)。
|
||||
- **下一步**:迭代 32 开工令(U0)归用户发。其余候选在待办清单状态列——营地交互重做五卡(已写卡待编迭代)、冒险前资源配比预设(备选)、迭代 30 原卡②③(待美术/设计定稿后重新立卡)、玩家面残留禁字清扫(待写卡)。
|
||||
- **迭代位**:迭代 1–32 全部已完成或已终止;迭代 33 起未编排——候选为待编池(见下一步行),编入哪一迭代由用户经迭代编排段发令。
|
||||
- **下一步**:编排下一迭代(iter-plan)从待编池点名——营地交互重做五卡(已写卡待编排)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(待美术/设计定稿后重新立卡)、玩家面残留禁字清扫(待写卡)、结算明细日志行序重锚(2026-10-21 授权发起、时点另定)。
|
||||
|
||||
## 里程碑时间线
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
| 迭代 29 | 已完成(2026-10-16) | 已退役(git 历史可考) | 2026-10-16 | — | 已退役(git 历史可考) |
|
||||
| 迭代 30 | 已完成(2026-10-17) | 已退役(git 历史可考) | 2026-10-16 | — | 已退役(git 历史可考) |
|
||||
| 迭代 31 | 已完成(2026-10-19) | 已退役(git 历史可考) | 2026-10-18 | ≈1.5 周 | 已退役(git 历史可考) |
|
||||
| 迭代 32 | 待开工 | reports/需求卡片-代码注释禁用词清扫批-2026-10-20.md、reports/需求卡片-效果引擎无状态化批-2026-10-20.md | 2026-10-20 | ≈1.75 周 | — |
|
||||
| 迭代 32 | 已完成(2026-10-21) | 已退役(git 历史可考) | 2026-10-20 | ≈1.75 周 | 已退役(git 历史可考) |
|
||||
|
||||
- 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。
|
||||
- 「已退役(git 历史可考)」= 需求卡片或实现报告曾存在,已按「证据只留最新」退役;已完成迭代的实现报告列只填 reports/ 现存路径或本保留字,不填「—」。
|
||||
|
||||
@@ -641,19 +641,6 @@
|
||||
|
||||
---
|
||||
|
||||
#### 计数器寿命域未统一(2026-10-18 登记,来源=会话提及,设计面=文档轨)
|
||||
|
||||
**现状**:原「寿命域统一口径」方案 2026-10-19 作废,改走效果引擎无状态化重构(提案 §8)。关联文档:
|
||||
- 设计定稿:design/research/提案-效果引擎无状态化-2026-10-19.md(v1.2,2026-10-20 §7.10 闭合)
|
||||
- 需求卡片:reports/需求卡片-效果引擎无状态化批-2026-10-20.md
|
||||
|
||||
**证据面缺口(迭代 31 卡② 移交)**:`domain=battle` 每战清零与 `domain=adventure` 跨战持久这一对判据,现无法由单元测试 rig 变异证红(`feat_vouchers_test` 的变异②只钉住事件发射时机,未覆盖寿命域)。闭合此项时须在 runner/MC 面补一次「adventure 域计数器跨战持久 vs battle 域清零」的对照读数,或在文档批确认该判据只由代码注释与装载面约束、不设机检。
|
||||
|
||||
**归属**:architecture.md 与 game/core/effect_engine.gd(待立独立批)
|
||||
|
||||
**状态**:待裁决+文档设计已闭合+待写卡+已写卡+已编迭代 32
|
||||
|
||||
---
|
||||
|
||||
#### 2026-10-19 定名传导遗留二项(2026-10-19 登记,来源=会话提及,设计面=文档轨)
|
||||
|
||||
@@ -689,27 +676,6 @@
|
||||
|
||||
---
|
||||
|
||||
#### 代码注释禁用词清扫批——退役词换代+完美封印统一+归因锚判据修正(2026-10-20 登记,来源=会话提及,设计面=工程直入)
|
||||
|
||||
**现状**: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`「开一次奇物三选一」——两处属 奇物/专长 归类表述,与待办清单「2026-10-18 冒记案遗留待裁两项」第①项同源,交文档侧先定性,定后另走传导批。
|
||||
**扫描中查出的真缺陷(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 表词一族、doc-conventions 第 4 节流程动词一族、简明技术中文(STC)通用禁用词一族——三族的逐词计数与清单见卡片 §4「不做」表(本行不复制词面:待办清单正文引述禁词会自指引爆 doc_term 补充通道,判红)。
|
||||
|
||||
需求卡片:reports/需求卡片-代码注释禁用词清扫批-2026-10-20.md(v1.3)。
|
||||
|
||||
反哺写入与代拍板追认结果见本清单「迭代 32 卡① 反哺点写入」条目(2026-10-21 文档批)。
|
||||
|
||||
**归属**:game/ 代码与数据表(代码域,走独立 worktree 批;`AGENTS.md` 与 `design/` 依流水线红线本批禁碰,S11 规则说明自持于 `game/tests/static_scan.sh` 头注与 `game/tests/README.md`)
|
||||
|
||||
**状态**:已写卡+已编迭代 32
|
||||
|
||||
---
|
||||
|
||||
#### 效果引擎「系统无状态」原则缺架构文档条目(2026-10-20 登记,来源=会话提及,设计面=文档轨)
|
||||
|
||||
@@ -733,43 +699,11 @@
|
||||
|
||||
---
|
||||
|
||||
#### 迭代 32 卡① 反哺点写入(2026-10-21 登记,来源=批次移交,设计面=反哺点)
|
||||
|
||||
**现状**:清单=reports/iter32-卡①反哺点-2026-10-20.md(16 项);关联文档:
|
||||
- 术语表:design/gdd/术语表.md(「退役词对照」新增「完美排雷→完美封印」行,2026-10-21 写入)
|
||||
- 措辞换代八件:design/gdd/systems/战斗循环/战斗结算.md、地图战斗资源.md、战斗表现.md、design/gdd/systems/表现与支撑/HUD框架.md、design/gdd/systems/冒险循环/难度曲线与Boss.md、design/gdd/ux/battle.md、design/gdd/ux/interaction-patterns.md、design/art/art-bible.md(v3.17)
|
||||
- 文档域禁词闸:tools/doc_term_audit.py(词表加「完美排雷」+扫描域扩 design/art,2026-10-21 用户裁;变异验证=注入见红、还原回绿)
|
||||
- 目检入册:体验验证清单.md ㉚ 节(2026-10-21)
|
||||
- 代拍板追认:reports/iter32-卡①代拍板-2026-10-20.md 七条,2026-10-21 用户全部追认
|
||||
- 遗留去向:#11 门票三处随「2026-10-18 冒记案遗留待裁两项」②另批(用户裁);#12 巢穴换代与单字「旗」清理待用户裁后另立批;#13 A 表词不纳 S11 词表(用户裁维持现状);#15 重锚见本清单「结算明细日志行序重锚批」条目;#16 状态推进已执行(见「代码注释禁用词清扫批」条目)
|
||||
|
||||
**归属**:design/gdd/ 八件+design/art/art-bible.md+tools/doc_term_audit.py(文档域)
|
||||
|
||||
**状态**:已写入
|
||||
|
||||
---
|
||||
|
||||
#### 迭代 32 卡② 反哺点写入(2026-10-21 登记,来源=批次移交,设计面=反哺点)
|
||||
|
||||
**现状**:清单=reports/iter32-卡②反哺点-2026-10-20.md(13 项);关联文档:
|
||||
- 架构三处:design/engineering/architecture/architecture.md v1.9(effect_engine 行与 battle_orchestrator 行改 ctx 形态、战斗域装配节去 export/seed 语义、架构原则补第 8 条「系统无状态」;同批订正旧事件名 flag_missed→seal_missed 两处)
|
||||
- 立项条闭合:本清单「效果引擎系统无状态原则缺架构文档条目」状态已推进(v1.9 凭据在册)
|
||||
- 寿命域条目:本清单「计数器寿命域未统一」整条删除归收尾批执行(其证据面缺口=V1 变异红已闭,见实现报告 §9 补漏记录)
|
||||
- 提案订正三处:design/research/提案-效果引擎无状态化-2026-10-19.md v1.3(§7.7 零采集改批内重采、§7.10.3 前缀判据采松版、§7.10.12 字段面 33+三组判读,依卡片 §12 裁①②)
|
||||
- 目检入册:体验验证清单.md ㉚ 节(V14 锋/守限次观感)
|
||||
- 代拍板追认:reports/iter32-卡②代拍板-2026-10-20.md 七条,2026-10-21 用户全部追认
|
||||
- 偏差注记:#12 S 编号以 S12=旧件零残留为准、#13 V12 基线哈希以重采值为准(均随卡片与实现报告退役消亡)
|
||||
- 采集纪律例外:sim-data/README.md 配套纪律③⑦批次例外登记(2026-10-21 写入;现行锚与读数文件未动)
|
||||
|
||||
**归属**:design/engineering/architecture/+design/research/提案+sim-data/README.md+本清单(文档域)
|
||||
|
||||
**状态**:已写入
|
||||
|
||||
---
|
||||
|
||||
#### 结算明细日志行序重锚批(2026-10-21 登记,来源=批次移交,设计面=反哺点)
|
||||
|
||||
**现状**:迭代 32 卡① N7 改动互换 `seal_miss`/`insurance_used` 两行日志顺序并改写豁免态 highlight(依据与预期漂移两例见 reports/iter32-卡①实现报告-2026-10-20.md「已记档差异」节);与基线数据逐项比对的 JSONL sha256 校验必红,实现批按规未发起、11 号闸落 skip。**用户 2026-10-21 裁=批准另立重锚批,发起时点另定**(重锚批只能由用户发起)。
|
||||
**现状**:迭代 32 卡① N7 改动互换 `seal_miss`/`insurance_used` 两行日志顺序并改写豁免态 highlight(豁免态=insurance_used 行先行且 highlight 置空;未豁免态=两行相对序不变但 `seal_miss` 发射时点后移——完整对照见 git 提交 d00f24a8 批内实现报告,报告已退役);`playtest_logger._on_step_row` 逐行落盘含 highlight 字段,与基线数据逐项比对的 JSONL sha256 校验必红,实现批按规未发起、11 号闸落 skip。**用户 2026-10-21 裁=批准另立重锚批,发起时点另定**(重锚批只能由用户发起)。
|
||||
|
||||
**归属**:`sim-data/` 锚与 `tools/parity_anchor.py`(重锚执行归用户发令批)
|
||||
|
||||
|
||||
Reference in new issue
Block a user