收尾(迭代39批后): 反哺点13条落文+产出物退役+账面换代(用户裁甲路线2026-10-28)——①落文九处: architecture v1.20(三新件已实装登记/RunLedger退役注记并删四账段/拆分定稿节转现状/unit_container补check_trigger_unlocks与facts参/effect_engine adventure桶改指应用层/CurioDeck bind_handlers句退役)+存档序列化 v1.1(断点各件自交片段+应用层唯一拼盘落盘口+gain_journal扩列28键+aux_items关卡完成停点同调行留存边界)+冒险结构 v1.1(获得日记键断点面口径:plain策略/旧档缺键汇总直载/在档推导比对不符拒载)+敌人系统 v1.3(trigger列与P1表已实装标注/半血收编句摘'归实装批'/两示范定名)+难度曲线与Boss v1.1(两示范投放登记读表口径+EV锚换带注记)+体验验证清单㊲(趁隙偷袭/孤注守势两目检项)+生涯(行号越界句改语义指认:收束受理_settle+主角账两件投影)+test-conventions(check_quiet静默通道不进extract_checks扫描面备案);#4秘宝核查无双轨描述记无需改、#6战斗结算核查无漂移闭环、#13备案随报告退役留痕git;无版本号文档(存档序列化/冒险结构)补立身份标记基线=修订前全部历史;②退役删十件: 四份产出物(实现报告§六收口口径/代拍板10条含超白名单#5#7随特批合并追认/反哺点清单/验收审计)+三张需求卡(死期=合回master)+素材八份JSON(证据只留最新,第8份split_B1未跟踪件直删不入库);③账面: roadmap迭代39行已完成(2026-10-27)+卡片报告列退役保留字+当前位三行换代+表下带红合并注记;待办清单两源条目整删+gdstyle条目卡指路句改git指认(三宿主债已清偿ffb0ac15)+迭代40卡①交接注记(卡面RunLedger引用须按现态改写)自报告§六迁入;闸红修复: roadmap当前位括号日期注记改逗号连接(R3)/体验验证清单退役词buff改增益(doc_term)/gdstyle条目已删卡路径改git指认(卡片存在性校验);遗留呈报: bp_baseline_dump.gd零引用可删但属代码面,留待用户裁worktree小批

This commit is contained in:
DKChan committed 2026-10-28 04:18:57 +08:00
1 parent 21cd0f2e05
commit 6139d2deb0
24 files changed
+43 -1752743

No files matched your search

+10 -11
View File
@@ -2,8 +2,8 @@
## 文档状态
- 版本:1.19
- 最近更新:2026-10-27(gdstyle 存量债全清设计补课——ConfigDB 访问器归位与域容器持有+SlotStore/MetaStateStore 拆件+组合根句柄面与测量面两处 S13 豁免登记)
- 版本:1.20
- 最近更新:2026-10-28(迭代 39 反哺落文——冒险域拆件三新件转已实装登记+RunLedger 退役注记+拆分定稿节转现状+unit_container 补 check_trigger_unlocks)
- 引擎:Godot 4.7.2-stable(GDScript 单语言;2026-09-07 锁定)
- 评审模式:solo(`review-mode.txt`,2026-09-12 用户拍板——TD/LP 门禁按 solo 跳过,用户授权架构产出自主推进、迭代期回调)
- 覆盖 GDD:现行全集(根索引=`design/gdd/02-系统清单.md`,文档树构成以根索引为准)
@@ -92,7 +92,7 @@
| **action_economy**(A3) | AP/RAP 账本、last_round_end、轮次相位机 {Idle, Active, Waiting}、结束仲裁 | 意图与通知布尔面:notify_round_start / request_dig / request_stop / request_refresh / notify_settlement_done / notify_combat_end;预授权通道:grant_reserve_ap / finish_round_stop;ap/rap/phase 只读 | ConfigDB(ActionEconomyTable);effect_engine(事件发射 dispatch——基础层内同层引用);B1 回发 next_round_mode/battle_over | 无 |
| **variation 定义**(A4) | VariationTable schema(现行 6 行:六 region——贫矿脉 global 行 2026-10-16 用户令屏蔽删行,global 型机制代码保留)与 F1 候选池门控谓词 | `variant_pool(level_index, board_type, node_type="")`(门控三维:unlock+board_types+节点身份——global 行仅 boss/elite 入池,缺省跳过零扰动);`global_variant_row(level_index, board_type, node_type)`(全局型单行决议访问器) | ConfigDB(VariationTable) | 无 |
| **status_container**(B3) | 状态实例容器(战斗域生命周期、跨轮跨图延续) | 5 API:notify_battle_start / apply_effect / query_active / decay_round / notify_battle_end | ConfigDB(StatusEffectTable) | 无(RefCounted) |
| **effect_engine**(内容数据驱动扩展批 iter17 建域) | 零运行时可变状态的系统(见「架构原则」条 8):全同步解释器——事件由宿主在明确代码点位显式调 dispatch 进件,命中序=装载声明序(feats→treasure→树规则)写死保种子复放,不是事件总线/事件循环;事件/事实/效果类型/算子四词表封闭 + 树规则合成订阅六键(posture 每关首轮窗/sense 两组限次 counter 闸·adv_ 前缀走冒险桶跨战斗持久) | rebuild(每战重建订阅表)/`dispatch(ctx, event, payload, facts)`/`validate_trigger_row` + 静态计数口 `counter`·`counter_add`·`counter_spend`·`bucket_of`·`counter_id_legal`(计数器读写只经 EffectContext 引用束,无导出/灌入接口) | ConfigDB(feats/treasure 行集)、EffectContext(四桶引用由宿主持有:round/battle 桶归编排器、level 桶归关卡域、adventure 桶归 RunLedger) | 无(零随机全确定) |
| **effect_engine**(内容数据驱动扩展批 iter17 建域) | 零运行时可变状态的系统(见「架构原则」条 8):全同步解释器——事件由宿主在明确代码点位显式调 dispatch 进件,命中序=装载声明序(feats→treasure→树规则)写死保种子复放,不是事件总线/事件循环;事件/事实/效果类型/算子四词表封闭 + 树规则合成订阅六键(posture 每关首轮窗/sense 两组限次 counter 闸·adv_ 前缀走冒险桶跨战斗持久) | rebuild(每战重建订阅表)/`dispatch(ctx, event, payload, facts)`/`validate_trigger_row` + 静态计数口 `counter`·`counter_add`·`counter_spend`·`bucket_of`·`counter_id_legal`(计数器读写只经 EffectContext 引用束,无导出/灌入接口) | ConfigDB(feats/treasure 行集)、EffectContext(四桶引用由宿主持有:round/battle 桶归编排器、level 桶归关卡域、adventure 桶归应用层——RunLedger 已随迭代 39 拆件批退役,桶字典由 adventure_runner 持有) | 无(零随机全确定) |
| **save_system**(D3,Alpha;iter27 已升格 autoload「SaveManager」) | 存档格式与版本比较 | (契约规范源:`../../gdd/systems/表现与支撑/存档序列化.md`——契约锚:SCHEMA_VERSION + master_seed + 各流 scope 计数器快照,须在无正在执行中的 open_stream 实例时切出) | ConfigDB、RngService 只读计数器 | FileAccess——LOW |
| **settings/localization**(D6,愿景) | 设置项、翻译数据 | (契约规范源:`../../gdd/systems/表现与支撑/设置与本地化.md`) | ConfigDB | 无 |
@@ -102,14 +102,14 @@
|---|---|---|---|---|
| **board_generator**(A1) | 生成算法(五阶段管线)、BoardGenTable 回填、生成期指标集、合法性谓词(clearable / R₀≠S / min_safe)、可推理率度量(metric_version);生成姿态 = MVP 同步生成 + 加载幕(切片实证 10×10/12×12 同步可接受,WorkerThread 留扩展) | `generate(L, D, rng) -> Board`;度量独立入口×3(推理器 / F3 度量 / 合法性谓词——独立纯函数、同一实现) | ConfigDB(BoardGenTable/VariationTable);board_gen 流(一次 open_stream = 一张图);dig_ap_cost 只读 | 无 |
| **minesweeper_rules**(A2) | 棋盘状态(已开集 O / 封印集 G / 小人位)、三事件面、批次仲裁、install 四不变式 | `install_board(board)`;`settle_batch(intents)`(唯一提交入口);查询只读面(current_board / hero_pos / is_revealed / has_seal 等);`compute_move_path(cell)` 只读;`retire_board()`;三源拒绝(board_face / resource_face / phase)+ sub_reason 封闭枚举 | A1 产物(Board class_name 数据契约);A3 try_spend / last_round_end / 相位 | 无(零表读取、零 UI——切片实证) |
| **unit_container**(B2) | hero/enemy 单位实例(hp/atk/实例池:池快照+冷却+摇定动作+保底计数)、行值快照 | spawn / query_alive / rollable_skills / special_skills / set_pending_action / pending_action / basic_streak / commit_action / tick_cooldowns / apply_damage / heal / default_target / check_skill_unlocks / despawn_all(2026-09-16 敌人技能池批:query_beat/query_attack/advance 随行为环退役) | ConfigDB(EnemyTable/SkillTable/HeroTable) | 无 |
| **unit_container**(B2) | hero/enemy 单位实例(hp/atk/实例池:池快照+冷却+摇定动作+保底计数)、行值快照 | spawn / query_alive / rollable_skills / special_skills / check_trigger_unlocks / set_pending_action / pending_action / basic_streak / commit_action / tick_cooldowns / apply_damage / heal / default_target / check_skill_unlocks / despawn_all(2026-09-16 敌人技能池批:query_beat/query_attack/advance 随行为环退役;rollable_skills/special_skills/check_trigger_unlocks 带 facts 参——2026-10-27 情境条件触发器实装,事实缺键=条件假拦下,百分比事实走阈值式折算) | ConfigDB(EnemyTable/SkillTable/HeroTable) | 无 |
| **reward_economy**(B4) | 格面资源身份映射(install 期预分配、Ready 只读、换图映射消亡)、极性路由字典面((类型, 极性)→ 字典行查询;路由执行归 B1 授予段)、F6 当量供给投影 | 封闭 API:roll_board / query_identity / query_full_snapshot / grant / grant_clear / retire_mapping / polarity_row / phase / weighted_pick;另有 is_mapped 静默布尔投影(批量工具用) | ConfigDB(RewardTable);effect_engine(事件发射 dispatch——上层消费基础层);reward_roll 流(scope = 每次 install 批) | 无 |
| **helper_items**(A5,切片已实装秘宝域) | HelperItemTable、探测显影语义 | (契约规范源:`../../gdd/systems/跨局循环/秘宝.md`——桥接位:A2 查询接口 + A4 counter_item_ids) | A2 / A4 / B4 | 无 |
| **CurioDeck**(`core/curio_deck.gd`,A5 秘宝域令牌池件,迭代 37 自 AdventureRunner 拆出) | 三选一/商店共享池的持久多重集、抽签(候选抽取)、cap 库存与专长凭证三计数与判定唯一所有者——件只管池与判定,停点编排与兑付推进留冒险编排器 | `draw_candidates(channel)` 抽签;`consume_deck_token` / `consume_pool_purchase` 池消耗;`cap_ok` 上限判定;`feat_ticket_consider` 凭证判定;`stock_snapshot` / `pool_stock` 只读投影;宿主兑付单点经 `bind_handlers` 注入方法 Callable(选中摘牌后的加算区/账本落点仍在宿主) | ConfigDB(秘宝令牌行集);注入 RngServiceCore(reward_pick 封闭流,禁自建随机) | 无(RefCounted 纯逻辑) |
| **CurioDeck**(`core/curio_deck.gd`,A5 秘宝域令牌池件,迭代 37 自 AdventureRunner 拆出) | 三选一/商店共享池的持久多重集、抽签(候选抽取)、cap 库存与专长凭证三计数与判定唯一所有者——件只管池与判定,停点编排与兑付推进留冒险编排器 | `draw_candidates(channel)` 抽签;`consume_deck_token` / `consume_pool_purchase` 池消耗;`cap_ok` 上限判定;`feat_ticket_consider` 凭证判定;`stock_snapshot` / `pool_stock` 只读投影;商店购买消费经注入 Callable 链至 CurioStop 兑付单点(迭代 39 起转纯池——bind_handlers 反向回调已退役) | ConfigDB(秘宝令牌行集);注入 RngServiceCore(reward_pick 封闭流,禁自建随机) | 无(RefCounted 纯逻辑) |
| **ShopSession**(`core/shop_session.gd`,商店会话件,迭代 37 自 LevelRunner 拆出) | 关卡商店双模式(legacy 固定三件加定价/pool 共享令牌池)的货架、定价、购买与刷新唯一宿主——账本/钱包/装配集归宿主 LevelRunner(共享引用经 `bind` 注入,出账直接落同一引用改写宿主账本);legacy 模式零 RNG 零池消费(off 对照承载) | 货架与定价只读面(`shop_products` / `shop_shelf` / `current_price` / `shop_refresh_cost`)+写入口(`buy_product` / `buy_pool_item` / `shop_refresh` / `player_request_refresh` / `open_pool`);外部调用面由 LevelRunner 同签名委托承载(外部零变化) | ConfigDB(商店行集);注入 RngServiceCore;宿主钱包/账本引用;pool 模式令牌消耗与判定经注入 Callable 转 CurioDeck | 无 |
| **HeroLedger**(`core/hero_ledger.gd`,冒险域主角实体账,2026-10-26 真拆分批设计定稿——实现批建件) | 冒险生命周期主角数值与获得记录唯一所有者:生命与 GP 钱包(gain/spend/clear 单写原语,钱包事件发射点归件)、锻造强化快照、调试百分比、攻击/甲类型轴快照、特性持有集(活引用注入——关内兑付当关生效)、本局钥石增量与逐杀明细、真视使用记录;获得记录三层结构=获得记录列表(三选一件/商店购买/战末奖励各一条)→属性增益明细(带来源指回)→四轴汇总(由明细推导);生效上限与回血封顶公式单点归件 | 构造注入;单写原语族+只读投影;断点自交片段(账本键+获得日记键) | ConfigDB(表值读取);由 AdventureRunner 冒险开始创建、注入 CurioStop/level_runner/ShopSession/战斗 encounter | 无(RefCounted 纯逻辑) |
| **AttuneLoadout**(`core/attune_loadout.gd`,同调配装件,2026-10-26 真拆分批设计定稿——实现批建件) | 装备中的秘宝件对象集唯一所有者(每件内含充能单位与重置周期);同调充能的物化行为唯一事实源——种行/补行改写时同步(RunLedger 充能字典轨与差额对账函数退役);旧档 aux_items 同调行迁移归件 | 构造注入;充能查询/消耗/按周期重置原语;断点自交片段(attunement_charges 键,键名与策略不变) | ConfigDB(秘宝行集);TreasureItems(同调行投放面);注入战斗使用路径 | 无 |
| **CurioStop**(`core/curio_stop.gd`,三选一停点件,2026-10-26 真拆分批设计定稿——实现批建件) | 三选一停点编排唯一所有者(架构原则 9 本域承载):停点三态(关卡完成三选一在途/已兑付待推进/奖励节点三选一在途)、刷新三源账(刷新件 X/营地池 Y/刷新券存量/付费刷新计数)、兑付方法族(pick/refresh/redeem/skip)、凭证出箱(RAP/时沙待注入);三选一信号面自带;零自动推进停点语义承载 | 对外=开停点/刷新/兑付/放行谓词/交断点片段五组入口+信号面(curio_choice_presented/curio_resolved);由 AdventureRunner 关卡完成受理时调用 | ConfigDB;注入 CurioDeck(抽签/摘牌)与 HeroLedger(落账);随机只经 CurioDeck 的 reward_pick 封闭流 | 无 |
| **HeroLedger**(`core/hero_ledger.gd`,冒险域主角实体账,已实装(2026-10-27 迭代 39 拆件批)) | 冒险生命周期主角数值与获得记录唯一所有者:生命与 GP 钱包(gain/spend/clear 单写原语,钱包事件发射点归件)、锻造强化快照、调试百分比、攻击/甲类型轴快照、特性持有集(活引用注入——关内兑付当关生效)、本局钥石增量与逐杀明细、真视使用记录;获得记录三层结构=获得记录列表(三选一件/商店购买/战末奖励各一条)→属性增益明细(带来源指回)→四轴汇总(由明细推导);生效上限与回血封顶公式单点归件 | 构造注入;单写原语族+只读投影;断点自交片段(账本键+获得日记键) | ConfigDB(表值读取);由 AdventureRunner 冒险开始创建、注入 CurioStop/level_runner/ShopSession/战斗 encounter | 无(RefCounted 纯逻辑) |
| **AttuneLoadout**(`core/attune_loadout.gd`,同调配装件,已实装(2026-10-27 迭代 39 拆件批)) | 装备中的秘宝件对象集唯一所有者(每件内含充能单位与重置周期);同调充能的物化行为唯一事实源——种行/补行改写时同步(RunLedger 充能字典轨与差额对账函数退役);旧档 aux_items 同调行迁移归件 | 构造注入;充能查询/消耗/按周期重置原语;断点自交片段(attunement_charges 键,键名与策略不变) | ConfigDB(秘宝行集);TreasureItems(同调行投放面);注入战斗使用路径 | 无 |
| **CurioStop**(`core/curio_stop.gd`,三选一停点件,已实装(2026-10-27 迭代 39 拆件批)) | 三选一停点编排唯一所有者(架构原则 9 本域承载):停点三态(关卡完成三选一在途/已兑付待推进/奖励节点三选一在途)、刷新三源账(刷新件 X/营地池 Y/刷新券存量/付费刷新计数)、兑付方法族(pick/refresh/redeem/skip)、凭证出箱(RAP/时沙待注入);三选一信号面自带;零自动推进停点语义承载 | 对外=开停点/刷新/兑付/放行谓词/交断点片段五组入口+信号面(curio_choice_presented/curio_resolved);由 AdventureRunner 关卡完成受理时调用 | ConfigDB;注入 CurioDeck(抽签/摘牌)与 HeroLedger(落账);随机只经 CurioDeck 的 reward_pick 封闭流 | 无 |
### 功能层
@@ -125,10 +125,9 @@
| **difficulty**(C3) | DifficultyTable 回填、全部曲线数值调参所有权、战斗期望表(切片 monte_carlo 为工具原型) | 调参输出(经 D2 R1 解析/编排器传递,禁反向调用生成) | ConfigDB、B1 对账输出(调参约束清单)、A1 报告 C | 无 |
| **meta_progression**(C4,Alpha) | MetaTable、钥石账本、天赋树域(MetaTreeTable 12 节点 v0.8——Fork 一节点双态/row 字段退役/RULE_KEYS 六键/彩蛋特化觉醒,迭代 21 T1 换代)+ 同调位槽位判定(树点亮数单源——T4 槽位收编)。**2026-10-27 全清设计定稿:存档内元进度数据读写原语归 MetaStateStore(新件),本类纯转发读方法随件退役(消费方直连 store),业务规则与写口编排留本类(≤20)** | tree_can_buy/tree_buy/tree_buy_fork/tree_toggle_fork(写口唯一)、hero_override 注入(树淬炼 flat+锻造路线加值位预留 0)、tree_rule_keys | D3、C2、ConfigDB | 无 |
### 战斗域装配现状(迭代 27——2026-10-17 用户裁写入)
### 战斗域装配现状(迭代 27——2026-10-17 用户裁写入;RunLedger 段已随迭代 39 拆件批退役,四账去向见下「冒险域拆分(现状登记)」节)
- **结算五段**:B1 编排器的每轮结算序列拆为 `game/core/settlement/` 五个段类——GrantSegment(①授予段,含封印判定与 counter/grant 助手单点)→ AuraSegment(②增益/减益段)→ CombatSegment(③战斗段)→ DecaySegment(④衰减段)→ VerdictSegment(⑤判定段,返回裁定,终局早退语义留 B1)。段序骨架冻结于 `SettlementTable.segment_order` 语义,B1 退为段序编排+接线;段类可直接 `new()` 单测(`settle_segments_test` 在役)。
- **RunLedger 四账**:`game/core/run_ledger.gd` 单类持四本共享账——同调充能账/真视使用计数/冒险域计数器/统一冒险加算区。所有权:AdventureRunner 开局构造、全程唯一宿主;LevelRunner 经 `set_run_ledger` 下传装配 encounter;战斗侧(B1)经 `encounter["ledger"]` 拿引用、只走 read/append 原语族。审计 P1-4「共享可变字典跨三层三处可写」由「函数签名上不可见的共享引用」换成签名可见的显式类。冒险桶计数器无导出/灌入时点:EffectContext 持 `run_ledger.adventure_counters` 的同一字典引用,引擎静态计数口就地直写,跨战持久随 RunLedger 生灭(2026-10-21 迭代 32 卡②无状态化写入)。
### 战斗编排域拆件定稿(2026-10-26 用户裁写入——gdstyle 存量债波 1 设计闭合;同日独立审查(grilling+godot-master 双子代理)阻断 8 条去重 6 组全折入本节,v1.18;实现批完成后改写为现状登记)
@@ -141,7 +140,7 @@
- **验收红线**:游戏行为零变化(RNG 消费序零漂移——fx_reveal 封闭流随件迁移取号序不变、信号顺序契约冻结、明细行协议词表零触碰、同种子逐位一致);battle_orchestrator 头注发射点指址随拆件改写(词表不动,指址须真);行数恶化债清偿义务(迭代 38 特批带红合并挂账 c4c69701——本波还债归绿);PARITY 触面(battle_orchestrator.gd 被改)实跑对拍须经用户批准、不得借机重锚;S13 改善非清零口径(宿主残留 8–10 键+随迁键卡内收敛后新件零残留为达标线)。
- **S7/S8 随动**:RewardGrant 调 B4 API,两新件一并登记进 S7 B1 域文件集与 S8 结算路径 await 文件集(static_scan.sh 两清单独立、同批更新——防 await 面漏闸)。
### 冒险域拆分定稿(2026-10-26 用户裁写入——AdventureRunner 真拆分设计闭合;实现批完成后本节改写为现状登记)
### 冒险域拆分(现状登记——2026-10-26 设计闭合,2026-10-27 迭代 39 拆件批实装,本节各条即现行形态)
- **应用层形态**:adventure_runner 退出上帝对象、转薄应用层(DDD 应用层形态)——只留冒险状态机、关序推进、结算受理、建件接线、效果引擎冒险桶字典持有(桶=效果引擎域数据,应用层只锚定生命周期);零领域决策。核心层表三新件行(HeroLedger/AttuneLoadout/CurioStop)即本拆分目标。
- **CurioDeck 转纯池**:bind_handlers 反向回调退役;商店购买消费经注入 Callable 链至 CurioStop 兑付单点——牌库只管抽签/消耗/cap 判定/凭证计数。
+1 -1
View File
@@ -35,7 +35,7 @@
需求卡片 §8「改动—验收对照表」每一条都要落成可执行的验证;本文定统一写法,卡里定每批的具体内容(测什么/注入哪里)。写卡期查不出执行载体的条目=不可测,当场呈报,禁拖到实现期。
1. **执行载体五选一,逐条声明**:单元测试(`tests/run_all`)/系统测试断言(`tests/system_test.gd`)/场景探针(`probe/` 下 `*_probe`)/MC 同种子逐项比对/人工核对(仅限无法自动化的纪律类需求点,如命名锁定、数值占位)。行为类条目以自动化载体为主。
2. **粒度与对应关系**:每条清单条目至少一个自动断言,且断言必须从该条目的真实入口进入;多条条目可合用一个测试函数,但撤销对应改动时每条都要能单独变红。断言失败消息末尾带编号尾缀〔卡短名 Vn〕(如〔秘宝批 V3〕)——断言与卡片清单可互相 grep 查找。
2. **粒度与对应关系**:每条清单条目至少一个自动断言,且断言必须从该条目的真实入口进入;多条条目可合用一个测试函数,但撤销对应改动时每条都要能单独变红。断言失败消息末尾带编号尾缀〔卡短名 Vn〕(如〔秘宝批 V3〕)——断言与卡片清单可互相 grep 查找。**工具面局限备案(2026-10-27 迭代 39 验收审计)**:`Kit.check_quiet` 静默收集形态(计数不入判定即打印、失败消息进 problems 汇总)的断言消息不进 `tools/extract_checks.py` 扫描面——验收尾缀 grep 对该通道失效;如需覆盖属提取器改版(工程批)。
3. **断言词汇按验证对象五选一**:
| 词汇 | 适用场景 |
@@ -1,7 +1,7 @@
# 冒险结构
> 一句话:整局冒险的关卡序列、失败与大奖励
> 状态:已定稿(自旧体系迁移)
> 状态:已定稿(自旧体系迁移);现行为 v1.1
## 设计目的
@@ -193,6 +193,7 @@ GP(显示名「GP」)是冒险内的一次性属性提升货币:战斗胜
- **停点粒度**:快照只挂选路停点(入口呈现/战斗胜利后/兑付确认后的选路态)——这是唯一可恢复停点形态。战斗进行中不写快照:中断恢复后**当场战斗从头打**,棋盘中局不入档。
- **七字段拍板面**:关卡序号 / 节点位 / 生命 / 本关加成区 / GP 钱包 / 商店已购档 / 已抽模板。附随件(续玩正确性必需,顺带登记):主种子 + 取数计数器(rng 快照契约回填——续玩从断点号位精确续接原随机时间线,已抽模板零重抽)、钥石累计(Boss 掉落逐杀入账的中途值,终局摘要不失真)、已到节点序(关卡画面图条重建)、秘宝库存(奖励节点已选件防静默丢失)、**奖励选择态**(三选一停点中断:已选件 / 同调位替换在途——续玩已选不丢失;候选一致性=快照现状非强求 feature,2026-10-01 用户裁决)、**件获取次数计数**(kind 维度派生账本——断点附随件与读数承载)、**令牌池余库**(bonus_deck 逐枚还原——TP0 扩列,池消耗即上限的续玩正确性承载;旧版断点缺键=满库重建防御口径,单版本周期)、**商店货架态**(当前货架三件 + 本次进店已购次数——P2 甲扩列随迭代 11 第②批;离开店=空架合法态,货架续玩由确定性重放承载:重进店同种子同货架逐位)、**Y 刷新池余量**(attune_refresh_y——冒险周期池消耗余量随断点:续玩优先读断点、不自参数面整额重注入,堵「用完 Y 退菜单再续玩满血复活」可利用漏洞;旧断点缺键回退参数面=旧档行为零变化。2026-10-13 缺陷修批)。
- **中断与退出两口径分离**(2026-09-29 用户裁决):中断(关游戏)= 留断点可续;**退出冒险**(放弃流程)= 失败同型结算 + **清除断点**——退出后「继续上局」不再出现。
- **获得日记键**(gain_journal,2026-10-27 迭代 39 拆件批扩列——断点 28 键,沿扩列不升版先例):获得记录明细(三层结构归架构文档「冒险域拆分」节主角账条目——本域只登记断点面口径)随断点保存,回退策略 plain;旧档回退两态——旧断点缺日记键=汇总键直载并跳过比对(零迁移损失),日记在档=由日记推导汇总值与留存值比对,不符即报错中止(迁移正确性自检)。
- **续玩**:自断点重建到最近停点(逐字段回填 + 随机流回填),停点处玩家重新选路。三结局(冒险成功/失败/放弃)一律清断点——断点只活在一个进行中的冒险上。
- 与测量面的关系:断点面只在注入存档承载的正式冒险路径生效;模拟/冒烟不注入 = 整面静默,MC 逐项比对零扰动。
@@ -1,7 +1,7 @@
# 难度曲线与Boss
> 一句话:难度曲线、期望值带与 Boss 设计
> 状态:已定稿(自旧体系迁移);现行为 v1.0
> 状态:已定稿(自旧体系迁移);现行为 v1.1
## 设计目的
@@ -295,7 +295,7 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板
| 池权重 | 权重即旋钮:抬特殊技权重 = 抬输出频率,EV 随之重锚;各敌种行集读表 |
| 技能冷却(拍) | 逐技能行读表;普攻冷却恒 0 不可配(空池不可能的结构前提——域校验锁死);撕咬 = 与突刺同倍率错开冷却轴的高频小爆发轮廓;毒爆 = 蛛化卓尔精灵专属池独占技 |
| 保底 M | 全局单旋钮,读技能表 pity_threshold;连续 M 拍执行普攻 → 下拍必出特殊技;单特殊技低权重池受保底支配 |
| 触发条件 | 情境技与闩型解锁的 fact 阈值读技能表 trigger 行值(2026-10-26 触发条件批设计闭合——词表与机制归敌人系统「触发条件」节);情境技的池内份额照走池权重行 |
| 触发条件 | 情境技与闩型解锁的 fact 阈值读技能表 trigger 行值(2026-10-26 触发条件批设计闭合——词表与机制归敌人系统「触发条件」节);情境技的池内份额照走池权重行。**已投放两示范(2026-10-27 迭代 39,provisional)**:地精池孤注守势(self_hp_pct lte 35,纯增益技)+ L2/L3 群行位趁隙偷袭(last_round_end eq 停手,伤害技)——fact 阈值、权重、倍率与冷却逐行读表,本表零复制;地精池投放稀释含闸长期速率,EV 抽样锚已随重锚批换代(带宽注记随 `enemy.tres` 表注) |
| 池 EV 锚 | 静态份额与含闸长期速率实测读数登记于调参日志(EV 重锚与权重投值随本表修订)。**2026-09-19 节奏体验验证批登记**(60 distinct seeds × 双策略 × 两关,tools/skill_rhythm_audit.py——20 种子以下批次有种子偏置假象,读数须 ≥50 种子):特殊技执行份额 对表成立——地精 10.4%(静态 10%)/ 地精一伙 8.4% / 熊地精系 28.9–42.4% / 巨蜘蛛 34.8% / 酋长 28.9% / 卓尔 35.4%;**L2 池含闸速率抽样复核完成**(上项即含闸读数);保底越界 0/247(间隔 4 = M=4 合法上界);过涝信号 8/1440 场(最长连击 3);过旱按用户判读带集中在短命杂鱼(生存时长问题非池配置——见待办清单清单 Alpha 条目移交注记) |
主角表与棋盘参数表(行值分别读 `hero.tres` 与 `board_gen.tres`,provisional):
@@ -1,7 +1,7 @@
# 敌人系统
> 一句话:敌人数据、技能池出招、意图呈现
> 状态:已定稿(自旧体系迁移);现行为 v1.2
> 状态:已定稿(自旧体系迁移);现行为 v1.3
## 设计目的
@@ -116,8 +116,8 @@
| rider_mult | 仅伤害、可省 | **必中附加分量(2026-09-19 新增)**:域 (0, 1],缺省无字段 = 无附加;分量值 = max(伤害下限, floor(攻击基线 × rider_mult))——随施放者攻击基线缩放,后置加法、必中全额、不进乘区、不出暴击(后置加法同族);价位锚 0.75 = AC 折扣档最轻档"不掉档的稳定伤害" |
| cooldown_beats | 全部 | 施放后连续 N 拍不可摇中;普通攻击恒 0、不可配 |
| buff_ref / buff_duration | 仅增益与妨害 | 效果引用(指向状态效果行)与持续回合数;**落点由状态行 target_side 路由**(增益 → 敌方侧 / 妨害 → 主角侧,施放类 side 守卫加载拒绝)——妨害技零新授予通道 |
| trigger(触发条件) | 全部,可省 | {fact, op, value, latch} 四键——fact 与 op 取「触发条件」节封闭词表,value 类型与域随 fact,出域加载期拒绝;缺省无字段=无条件技,旧行为零变化(2026-10-26 情境条件触发器批立列;原池条目字段 unlock_hp_pct 收编为本字段闩型首用例) |
| P1 字段位 | — | 命中段数、目标数——随对应后置批加列(触发条件位已由 trigger 立列收编——2026-10-26;原"固定值分量"位已由 rider_mult 实装收编——2026-09-19;多段命中「命中段数」保留以防复活) |
| trigger(触发条件) | 全部,可省 | {fact, op, value, latch} 四键——fact 与 op 取「触发条件」节封闭词表,value 类型与域随 fact,出域加载期拒绝;缺省无字段=无条件技,旧行为零变化(2026-10-26 情境条件触发器批立列、2026-10-27 迭代 39 实装落地;原池条目字段 unlock_hp_pct 收编为本字段闩型首用例) |
| P1 字段位 | — | 命中段数、目标数——随对应后置批加列(触发条件位已由 trigger 立列收编——2026-10-26 立列、2026-10-27 实装;原"固定值分量"位已由 rider_mult 实装收编——2026-09-19;多段命中「命中段数」保留以防复活) |
普通攻击也是一行技能行,两条域校验锁死它的特殊性:倍率恒 1、冷却恒 0——想配倍率或冷却的就不是普攻,是伤害技。技能伤害存倍率、不存固定值:伤害 = 施放者攻击基线 × 技能倍率——同一行"重击",不同敌种按各自攻击基线缩放 = 基线 A × 技能倍率 M(行值读 enemy.tres / skills.tres),深层强化行自动缩放,这是共享技能表成立的前提;**固定的绝对值伤害不满足该前提**(不随基线缩放、跨关稀释——Brotato 教训),"固定值伤害"的合法形态是**必中附加分量 rider_mult**(×攻击基线的必中小倍率,2026-09-19 实装)。增益技带效果引用与持续回合,百分比天然按施放者同池生效,无缩放问题;妨害技同构,落点由状态行 target_side 路由到主角。
@@ -179,9 +179,9 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
| 死亡作废 | 照常——摇定后兑现前死亡,本拍作废、不进冷却不进保底计数 |
| 意图呈现 | 三档规格不变——情境技属特殊技,走类型级预告+结算明细具名,因果由技能名承载(如"趁隙偷袭");闩型保留解锁弹出规格(见"目标顺位与意图线索"节) |
半血解锁的收编:原池条目字段 unlock_hp_pct(2026-10-05 技能池执行批)收编为本字段闩型首用例——Boss 解锁技=trigger {fact: self_hp_pct, op: lte, value: 行值, latch: 真};解锁弹出规格(归因明细行+一次性技能名 toast)、单向闩语义、双面过滤行为全部不变,字段换代与行值迁移归实装批。
半血解锁的收编:原池条目字段 unlock_hp_pct(2026-10-05 技能池执行批)收编为本字段闩型首用例——Boss 解锁技=trigger {fact: self_hp_pct, op: lte, value: 行值, latch: 真};解锁弹出规格(归因明细行+一次性技能名 toast)、单向闩语义、双面过滤行为全部不变(字段换代与三 Boss 行值迁移已随 2026-10-27 迭代 39 实装落地)。
首批落地(设计定稿面):①三 Boss 解锁技迁移为闩型条件(行为零变化);②两个示范投放——地精池+低血防御增益(self_hp_pct lte 阈值)、L2/L3 群行位+停手偷袭伤害技(last_round_end eq 停手)。投放敌种、权重与阈值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md);"每池增益≤1"纪律不动,条件技照常计入预算。
首批落地(已实装——2026-10-27 迭代 39):①三 Boss 解锁技迁移为闩型条件(行为零变化);②两个示范投放——地精池+低血防御增益「孤注守势」(self_hp_pct lte 35,纯增益)、L2/L3 群行位+停手偷袭伤害技「趁隙偷袭」(last_round_end eq 停手)。投放敌种、权重与阈值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md);"每池增益≤1"纪律不动,条件技照常计入预算。
举证:触发条件为门槛过滤规则,无计算——可摇集合 = 实例池排除冷却中与触发条件不满足的技能(保底命中时 = 条件满足的全部特殊技)。
@@ -248,7 +248,7 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
| 优先级 | 内容 | 后置原因 |
|---|---|---|
| P1 | 情境条件触发器(低血触发防御、玩家停手时偷袭技等) | 设计已闭合(2026-10-26——本文「触发条件」节定稿:门槛过滤+闩型词表,半血解锁收编),待写卡实装;登记[待办清单](../../../../待办清单.md) |
| P1 | 情境条件触发器(低血触发防御、玩家停手时偷袭技等) | 已实装(2026-10-27 迭代 39——三 Boss 闩型迁移+两示范投放,见「触发条件」节与「首批落地」段) |
| P1 | 个体化变体池(A 型好斗 / B 型守势、精英专属池) | 共识点 A 的 A2 案;登记[待办清单](../../../../待办清单.md) |
| P1 | 全局特殊间隔旋钮 | 特殊技背靠背实测仍嫌时的备用闸;登记[待办清单](../../../../待办清单.md) |
| P1 | 新效应词汇批(妨害技 + 必中附加分量已实装 2026-09-19——设计权威 proposal-status-vocabulary.md〔提案已吸收退役 git a6833b6a——现行事实源=敌人系统.md 词汇表/增益状态.md〕 v1.0,实装面 = L2 Boss 卓尔;多段命中经用户拍板退役) | 妨害类型 + rider_mult 字段已落地;登记[待办清单](../../../../待办清单.md)(已解决移除,去向见状态记录) |
@@ -1,7 +1,7 @@
# 存档序列化
> 一句话:存档契约与版本迁移
> 状态:已定稿(2026-09-21 存档序列化批落地)
> 状态:已定稿(2026-09-21 存档序列化批落地);现行为 v1.1
## 设计目的
@@ -56,7 +56,7 @@ SaveManager 不依赖任何玩法系统就能工作:它是被动的承载方
第二条边界是反面清单:局内资源不入存档。行动点、储备行动点、道具库存、生命、GP 全部单局清零——各归各的系统管,没有局内数值需要持久化。若未来某局内资源要开放跨局携带(如储备行动点跨战斗携带),须修订其池规则并向本系统登记持久化归属,禁止静默超域。
**唯一豁免 = `breakpoint` 断点域**(2026-09-29 迭代 8 卡①顺带修订):断点是冒险进行中的瞬态快照,不是跨局携带——里面的生命/GP/道具库存只在「续玩上局」时还原进局内,冒险收束(通关/失败/放弃)即整域清除,永远不会渗进永久进度。反面清单的管辖对象因此收窄为 `meta` 永久进度域(冒烟域界扫描顺带收窄到 meta 域);断点域自身的字段口径归[冒险结构](../冒险循环/冒险结构.md)登记。断点 27 顶层键的登记单源=`core/adventure_runner.gd` 内 `const BREAKPOINT_FIELDS`(键→回退策略标签),写侧由 `_bp_parts()` 拼装、读侧由 `_bp_read` / `_bp_read_int` 两处派生。
**唯一豁免 = `breakpoint` 断点域**(2026-09-29 迭代 8 卡①顺带修订):断点是冒险进行中的瞬态快照,不是跨局携带——里面的生命/GP/道具库存只在「续玩上局」时还原进局内,冒险收束(通关/失败/放弃)即整域清除,永远不会渗进永久进度。反面清单的管辖对象因此收窄为 `meta` 永久进度域(冒烟域界扫描顺带收窄到 meta 域);断点域自身的字段口径归[冒险结构](../冒险循环/冒险结构.md)登记。断点顶层键(27 键+2026-10-27 迭代 39 获得日记键扩列至 28)的登记单源=`core/adventure_runner.gd` 内 `const BREAKPOINT_FIELDS`(键→回退策略标签);写读已换代为各件自交片段——主角账/停点件/关卡件各自写读自己的键(缺键回退策略随领域知识归各件),冒险应用层是唯一拼盘落盘口(收齐各件片段拼成顶层快照后写盘,写触发点不变)。**关卡完成停点的同调未用行留存**(2026-10-27 迭代 39 副卡边界裁定):`aux_items` 键在此停点形态含同调未用行(关卡末清空改选择性保留——「同调行始终留在 treasure_inventory」与「键值形态逐位不变」在关卡完成停点互斥,采行留存;玩家可见 C 区投影零变化,24 停点充能读数逐位一致)。
**三存档位(迭代 33 卡①,2026-10-22 反哺写入)**:存档是 3 个独立的 JSON 文件(`user://save_slot_1/2/3.json`,槽文件名只经 `slot_path()` 单点派生,槽 1 禁复用旧单档名),字典键一律字符串。写盘目标=当前激活槽的文件;启动(boot)不读任何槽文件——启动态=无激活态,不读写;激活态由选档界面的「新档」(`create_slot`)或「进档」(`activate_slot`)建立(选档界面归迭代 33 卡③)。数据模型(现行 = v6;示例值全为零值默认态):
+3 -3
View File
@@ -1,7 +1,7 @@
# 生涯
> **一句话定位**:营地里与三柜台平级的**局外只读界面**——营地管「花」(花钥石买永久强化),生涯管「看」(看自己跨局攒下的一切:累计战绩、历史冒险、图鉴收集)。冒险进行中不给任何数据回看(2026-10-04 用户裁决 P-C7 的延续),生涯是历史数据唯一的家。
> **状态**:期一已实装(2026-10-07 迭代 18 卡④生涯界面实装批·期一——跨局汇总页+主菜单入口+终身计数域存档 v6 落地;期二/期三另行立项,本文不预占排期)。入口拓扑已随迭代 33 卡② 三入口化换代、营地里经笔记本接入归迭代 34 卡④(信息架构节 v1.1,2026-10-22 反哺写入)。
> **状态**:期一已实装(2026-10-07 迭代 18 卡④生涯界面实装批·期一——跨局汇总页+主菜单入口+终身计数域存档 v6 落地;期二/期三另行立项,本文不预占排期)。入口拓扑已随迭代 33 卡② 三入口化换代、营地里经笔记本接入归迭代 34 卡④(信息架构节 v1.1,2026-10-22 反哺写入)。现行为 v1.2(2026-10-28 迭代 39 反哺——历史回看节行号指路句改语义指认)。
> **来源**:[待办清单「『生涯』界面——冒险中数据回看的唯一承接处」条](../../../../待办清单.md)(2026-10-04 用户裁决 P-C7——冒险中不给数据回看,历史战报与结算明细的查看去向 = 新「生涯」界面)。
## 一、信息架构
@@ -47,12 +47,12 @@
### 历史冒险回看(期二)
数据面现役事实:每局冒险收束时已有逐局摘要自动入档——`recent_summaries`(默认域 `save_manager.gd:116`、值拷贝访问器 `:316`、入账原语 `:325-338` 逐局插最前并按上限截断),上限 `SUMMARY_CAP := 10`(`:40`)。摘要字段在冒险收束时组装(`adventure_runner.gd:812-826` 的 `_settle`:结局 result、完成关数 levels_cleared、止步关 stopped_at、钥石合计 keystone_total、本局主种子 master_seed,另附逐杀掉落 keystone_drops 与终局专长持有集 relics(存档键名沿用历史形态)等);摘要的内容口径 owner = [冒险结构](../冒险循环/冒险结构.md),本文不复述其口径。
数据面现役事实:每局冒险收束时已有逐局摘要自动入档——`recent_summaries`(默认域 `save_manager.gd:116`、值拷贝访问器 `:316`、入账原语 `:325-338` 逐局插最前并按上限截断),上限 `SUMMARY_CAP := 10`(`:40`)。摘要字段在冒险收束时组装(`adventure_runner` 冒险收束受理 `_settle`:结局 result、完成关数 levels_cleared、止步关 stopped_at、钥石合计 keystone_total、本局主种子 master_seed,另附逐杀掉落 keystone_drops 与终局专长持有集 relics(存档键名沿用历史形态)等;钥石与逐杀明细、真视计数、特性持有集取数经主角账两件〔HeroStats/GainJournal〕只读投影——2026-10-27 迭代 39 拆件后形态);摘要的内容口径 owner = [冒险结构](../冒险循环/冒险结构.md),本文不复述其口径。
2026-10-06 用户裁(P2 甲):每局一行摘要,行内给**结局 / 到达关卡 / 钥石收入 / 用时**四件事,上限存最近 N 局。对应三件实绩(本批代码级复核确认的缺口,非新建数据面):
1. **扩容**:cap 10 → N。N 候选 20 / 50 / 维持 10,实装期按存档体积读数三选一;读数方法与列表形态的参数化维度由设计稿给出、实装期执行。
2. **补「用时」埋点**:全仓现在没有任何用时采集点(`game/core/` 内 grep elapsed / ticks / duration / Time 零命中;摘要字段集 `adventure_runner.gd:814-826` 无此项)——属新增埋点,随期二。
2. **补「用时」埋点**:全仓现在没有任何用时采集点(`game/core/` 内 grep elapsed / ticks / duration / Time 零命中;摘要字段集〔`adventure_runner` 收束受理组装面〕无此项)——属新增埋点,随期二。
3. **旧档迁移**:旧档既有 ≤10 条摘要原样保留迁移,向后兼容。
单局结算明细回看:遗留件 `settlement_review_overlay.gd`(`game/presentation/views/`,文件本体在盘、全仓无实例化引用——仅 `ui_kit.gd:356` 样式注记提及)由期二实装批复活承接,改挂生涯(2026-10-06 用户裁 P5 甲)。
-16
View File
@@ -1,16 +0,0 @@
# 迭代 39 代拍板追认单(2026-10-27)
接收方:用户会话追认(备案确认——授权发生在卡片审问阶段白名单,本单为批后备案)。
| # | 卡 | 白名单条目 | 裁量内容 |
|---|---|---|---|
| 1 | 主卡 | 提交切分与 worktree 命名 | 分支 iter39 单工作区;T0/T1/T2/T3/T4/T5 各一笔提交 |
| 2 | 主卡 | 测试改址等价写法 | 直读写已迁字段 30+ 处→stop()/hero() 件测试构造面;bind 句柄每回调新建故以关卡号守卫判重(Callable 相等不可靠) |
| 3 | 主卡 | 迁入注释随迁措辞 | 公式/兑付/断点段注释随迁 |
| 4 | 主卡 | 单关私有 HeroLedger 内部组织 | rebase_override 重注面+reset_for_single_level 值重置(实例不重建) |
| 5 | 主卡(超白名单,呈追认) | ctx 增 adv_bucket 键 | 卡片 ctx 键清单漏列桶传递面——按「构造注入一次给齐」意图补全 |
| 6 | 副卡 | 种行/补行内部组织 | treasure_inventory 提冒险级共享(卡片文件结构图 treasure_items.gd 零触碰保持;关卡末清空调用点改选择性保留——「同调行始终留在 treasure_inventory」的行承载前提,玩家可见 C 区投影零变化) |
| 7 | 副卡(超白名单,呈追认) | 跨版续玩键值兜底补行 | 契约 3「行集为源」的跨版例外——改前档关卡完成停点行已被关末清空(键在行缺),按键值差额补行=与字典轨续玩逐位等价;新档行集为源差额零操作 |
| 8 | 触发器卡 | 新技/状态行定名 | desperate_guard/孤注守势、sneak_ambush/趁隙偷袭、defensive_stance/护身(推荐案采纳) |
| 9 | 触发器卡 | provisional 数值 | w1/w2、lte 35、−25、×1.5、CD4、duration 2(同数量级内) |
| 10 | 触发器卡 | 断言组织与夹具 | trigger_cond_test 内部组织;V5 对拍以 skill_unlock/round_flow 编排集成承载(迁移断言+事件摘要) |
-23
View File
@@ -1,23 +0,0 @@
# 迭代 39 反哺点清单(2026-10-27)
接收方:各 owner 文档(文档批落文依据,用户裁决后执行)。
| # | 文档 | 关联点 | 改成什么 | 依据 |
|---|---|---|---|---|
| 1 | design/engineering/architecture/architecture.md | 模块归属表 HeroLedger/CurioStop/AttuneLoadout 三行「设计定稿——实现批建件」标注 | 改「已实装(2026-10-27)」;RunLedger 相关行整段退役注记;模块表 level_runner/battle 行消费依赖列 ledger 引用句删除;CurioDeck 行删 bind_handlers 句;level_runner 行补构造注入句;「冒险域拆分定稿」节转现状登记 | 主卡+副卡落地实况 |
| 2 | design/gdd/systems/表现与支撑/存档序列化.md | 断点域段机制句(写侧 _bp_parts 拼装/读侧 _bp_read 派生) | 改「各件自交片段(主角账/停点件/关卡件)+冒险应用层唯一拼盘落盘口+获得日记键扩列(gain_journal,28 键——旧档缺键汇总直载)」;同调行「始终留在 treasure_inventory」句随单源化核对 | 主卡 T4/副卡 k4 |
| 3 | design/gdd/systems/冒险循环/冒险结构.md | 断点域字段口径 owner——获得日记键字段口径登记 | 键名 gain_journal、缺省策略 plain、旧档回退(缺键=汇总直载跳过比对;在档=明细推导比对不符拒载) | 主卡契约 2 |
| 4 | design/gdd/systems/跨局循环/秘宝.md | 充能账机制句若有双轨描述 | 改单源化(物化行唯一事实源、剩余=未用行派生;同调未用行跨关存活——关卡末清空选择性保留) | 副卡落地实况(T0 核该文档若无双轨描述记「无需改」) |
| 5 | design/gdd/systems/战斗循环/敌人系统.md v1.2 | §P1 表「情境条件触发器」行「待写卡实装」 | 改「已实装(2026-10-27)」;§半血解锁收编段「字段换代与行值迁移归实装批」句摘除 | 触发器卡落地 |
| 6 | design/gdd/systems/战斗循环/战斗结算.md v1.0 | 开轮摇号排除句触发条件指针 | 查实装后无陈述漂移则记「无需改」 | 反哺核对行 |
| 7 | design/gdd/systems/冒险循环/难度曲线与Boss.md v1.0 | 技能池投值面 | 查无漂移记「无」;两示范 provisional 投值(w1/w2/lte35/−25/×1.5)登记读表口径 | 触发器卡 §二 |
| 8 | design/engineering/architecture/architecture.md | UnitContainer 新公开面(check_trigger_unlocks/事实组包口径)API Boundaries 登记面核查 | 若属登记面补行 | 触发器卡 §六 |
| 9 | 体验验证清单.md | 实机目检观测项两条入册 | ①上轮停手→下轮明细出「趁隙偷袭」②地精低血后摇出「孤注守势」 | 触发器卡(登记不阻塞) |
| 10 | 待办清单.md | 两源条目状态推进 | 「AdventureRunner 职责真拆分」「技能池情境条件触发器」→完成(batch-closure 承接) | 实现报告 |
| 11 | design/gdd/systems/跨局循环/生涯.md:55 | 代码行号指路句指 adventure_runner.gd:814(本批收薄后 627 行——行号越界,08d 引用可核新增红) | 行号指路改语义指认(结算受理段已随拆件迁 CurioStop/主角账——按 doc-conventions「引用不转述/代码↔设计追溯由 GDD 承担」改写该句;行号指路本属脆弱面,建议连同 :50/:60 两处留档句一并换代) | 本批 diff 直接后果(commit 被文档域闸拦——反哺落文后本批合回) |
| 12 | design/engineering/test-conventions.md | 验收尾缀形态:check_quiet 静默收集断言不入 extract_checks.py 扫描面(审计备案);失败消息尾缀对静默通道的字面形态 | 备案级——工具面局限登记(如需覆盖 check_quiet 属提取器改版,工程批) | 独立验收审计备案 |
| 13 | 触发器卡 V5 改前基线载体 | 卡定 game/tests/evidence/trigger_baseline.md 未落盘(代拍板 #10 改道 skill_unlock/round_flow 编排集成承载) | 备案——三 Boss 迁移零变化验证强度=语义断言级;后续同类迁移批建议保留事件序列基线落盘义务 | 独立验收审计备案 |
**边界漏判呈报(副卡契约 3 内在矛盾,已按行留存实现)**:副卡 K4「aux_items 键载库存全量快照(含同调行)」在选路/三选一停点成立、在关卡完成停点不成立(改前行已被关末 reset 清空)——「同调行始终留在 treasure_inventory」与「aux_items 键值形态逐位不变」在该停点形态互斥。实现采「行留存」(关卡末清空改选择性保留+treasure_inventory 提冒险级共享),断点档关卡完成停点 aux_items 含同调未用行(24 停点形态变化,充能读数 attunement_charges 全部逐位一致)。建议 §2 反哺时把该边界写明。
-63
View File
@@ -1,63 +0,0 @@
# 迭代 39 实现报告(2026-10-27)
接收方:待办清单「AdventureRunner 职责真拆分」「技能池情境条件触发器」两条目(batch-closure 收尾依据)+本报告 §四呈报项待用户裁决。
## 一、各卡状态
| 卡 | 状态 | 收口提交 |
|---|---|---|
| 主卡·冒险域拆件与账本实体化批 | 完成(T0-T5,wr1-wr8 落地) | 0229d5fb/8d7b12e0/4a9e4300/4da7f3e2/fa1409f4/659d59ed |
| 副卡·同调配装充能域封装批 | 完成(RunLedger 整类退役) | 80fe4b8f+收尾笔 |
| 触发器卡·技能池情境条件触发器批 | 完成(机制+三 Boss 迁移+两示范) | 4868e11b |
## 二、实际改动—验收对照表(结果格随附)
| 需求点 | 验收测试 | 真实入口 | 撤销证明 | 结果 |
|---|---|---|---|---|
| wr1 账本实体化 | hero_ledger_test hr1/hr1-s/hr2 | start_adventure 真链+商店购买真链 | 回退 shop_session gain_bonus hunk→hr1-s 红→还原复绿(本批执行,undo1) | 绿 |
| wr2/wr3 停点件+纯池化 | adventure_feats〔拆件批 V2〕/level_shop_economy〔V3〕现役断言承继 | 三选一真链/pool 购买真链 | (同族 wr1 承载——停点迁移 bp 对拍五时点零漂移主证) | 绿 |
| wr4/wr5 信号直连+构造注入 | hero_ledger_test sc3 源码断言(_bind_shop 单点/_forward_ 零命中)+adventure_feats 信号序 | 两关全流程驱动 | (bp 对拍承载) | 绿 |
| wr6 断点片段化+日记键 | bp1 对拍 292dumps×27 键六时点逐位零漂移+gain_journal 单列在档+breakpoint_resume P8 28 键 | 同种子双跑 | (bp 对拍主证) | 绿 |
| wr7 转发属性撤除 | 改址后现役断言全绿+S13 读数(§三) | 五单测套+ui_input_probe | —— | 绿 |
| wr8 产出物 | 本报告三件套 | —— | 缺项红 | 在案 |
| 副卡 wr1-wr3 充能单源化 | feat_vouchers 账本保留〔卡② R1〕+al2 单源对拍(attunement_charges 24 停点逐位一致) | 种行真链 | 回退 loadout 种行 hunk→feat_vouchers 红→还原复绿(undo2) | 绿 |
| 触发器 wr1-wr9 | trigger_cond_test V1/V2/V4/V6/V7/V8/V9/V10(manifest 登记) | db.load_tables/spawn 真实表/编排器真链 | 回退 rollable_skills 过滤 hunk→V2 红→还原复绿(undo3) | 绿 |
测试削弱申报履行:主卡契约 9 零削弱;触发器卡申报①②③④已履行(skill_unlock_test 读值源换代语义保持/round_flow expect_pools 期望值随投放改写仍精确比对/:654 直调单参保留/V4 扩行只增不删)。
## 三、S13 读数与呈报(需用户裁决——见 §四)
三宿主改善达成:adventure_runner 类变量 42→23(-19)公开方法 23→14(≤20 零警告);level_runner 38→28(卡目标约 30);board_view 45→32(精确达标)。基线文件 `tools/gdstyle_baseline.txt` 零改动。
**存量红面(收口须用户特批,同 iter38 先例)**:
- NEW 5 条:curio_stop max-class-variables=16/max-public-methods=31/max-branches|_apply_curio_pick=10/max-returns=9、hero_ledger max-public-methods=29——新件公开面为卡片接口块定义的迁移语义面(原基线 adventure_runner 对 _apply_curio_pick 同函数登记同值 branches=10/returns=9,超标形态随迁移显现)。
- WORSENED 4 条:battle_orchestrator 类变量 50→51(+_hero 拆件必要成员)/文件长 1302→1315/begin_battle 函数长 141→142;level_map_screen 类变量 21→22(iter38 存量漏登记——本批零触碰该文件)。
- 建议案:经批准将上列 9 键按实测值 refresh 进基线(含 level_map_screen iter38 存量补登)。
**EV 锚预期红(触发器卡 T4-4 预设停机呈报)**:round_flow EV 抽样对锚 goblin 实测 0.9148 ∉ [1.00,1.20]——两示范投放=池权重数值改动(孤注守势 buff 技稀释伤害期望,方向合理);钩爪恐魔同批投放。**重锚归用户档位发起,实现批不自行重锚**。
## 四、遗留读数义务与实机目检总清单
- 实机目检两项(登记不阻塞):①上轮停手→下轮结算明细出现「趁隙偷袭」;②地精低血后摇出「孤注守势」。
- MC 对拍:本批触发器卡含池权重投放=数值改动——MC 锚重锚归用户发起(见 §三)。
- 主卡 MC 口径:行为零变化重构(bp1 六时点 292 停点逐位零漂移为凭),MC 未发起。
## 五、中间产物退役清单(批末执行)
game/tests/bp_baseline_dump.gd(bp1 载体)+reports/iter39-素材/ 六份 JSON(对拍凭据,审计后随本报告退役)。
## 六、领域拆分批(v1.3)补记与收口遗留清单(2026-10-27 合并前补)
§一–§五 写于三卡收口时点;其后用户裁「不满足结构指标也是缺陷、按领域做分割」,三卡以 v1.3 在批内追加领域拆分并二次实现。本节补记拆分批事实与收口遗留,收口以本节为唯一口径。
**拆分批提交**:B1 主角账三件 fde14f1c(hero_ledger 整件退役→hero_stats/gp_wallet/gain_journal);修复A 4ca4ddbc(trigger_cond_test 旧成员读换代+adventure_runner:170 残留删除);B2 停点刷新账 012883f3(refresh_bank 新件);B3 私有助手抽取 45faa92b(含 cross_validator 入循环重复追加缺陷修复);B4 战斗指标面 741b6bd7;修复B f96632de(S9 返回类型注解);闸基线 3530144e(02/08d 特批存量红登记)。合并 master=ffb0ac15(用户特批带红合并)。
**§三 存量红面已被拆分清偿,建议案作废**:NEW 5 条(curio_stop 4/hero_ledger 1)随 B1/B2 拆分归零;WORSENED 4 条中 battle_orchestrator 类变量与 begin_battle 函数长经 B4 修复、文件长回注册值 1314。终局读数=gdstyle 基线外新违规 0、恶化恰 2 条(battle_orchestrator max-file-length 1314〔登记 1302〕、level_map_screen max-class-variables 22〔登记 21〕——存量债归迭代 40 卡①与迭代 41 卡③,与 iter38 账目一致)。§三「建议案:refresh 9 键」作废(2026-10-27 用户裁「标准是尺、不以现状为尺」后基线只降不升)。
**收口遗留清单(全在案,按处置去向分组)**:
1. **EV 锚**:round_flow goblin(地精)场景实测 0.9148 ∉ [1.00,1.20]——触发器批有意行为改动,非缺陷。已按用户特批(2026-10-27)随 02 闸记存量红(fp f74b9a48ef4a)合并;参考区间更新归后续数值批,待用户发起。
2. **生涯.md:55 引 adventure_runner.gd:814 行号漂移**(拆分后该文件 660 行)——08d 记存量红(red-nokeys)合并;修复归合并后文档批(反哺点在册);建议级同行:生涯.md :50/:60、元进度.md:70。
3. **第 8 份对拍凭据 bp_baseline_after_split_B1.json 未入库**——08d 存量红期间纯文档提交被钩子拦(无代码改动可随行),已置主仓 reports/iter39-素材/(未跟踪),随文档批一并入库。
4. **本报告与验收审计报告停在 v1.2 口径**(§一–§五 未反映拆分)——实际落地以 v1.3 卡片与上列提交为准,文档批换代;本节即补记。
5. **批后收尾未执行**(待办清单/roadmap 账面换代、§五 退役清单执行——退役凭据实为八份 JSON,§五 笔数按拆分前口径写的六份)——待用户另令 batch-closure。
6. **交接注记**:迭代 40 卡①(gdstyle 波 1)卡面接口块仍引用已退役的 RunLedger——该批 T0 须按现态改写。
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
-21
View File
@@ -1,21 +0,0 @@
# 迭代 39 独立验收审计报告(2026-10-27)
审计入口:独立子代理(未参与实现);基线=merge-base 5699192af 三点 diff。依据 test-conventions §8。
## 一、对照表逐行核对——通过(附 1 缺漏已补+2 例外)
抽查 8 行全数在案且真实入口无绕过:hr1(直构逐值+start_adventure 真链 :20-52)/hr1-s(商店购买真链 :54-69,正钉 wr1 改动点)/hr2(三通道+片段往返 :71-122)/sc3(_bind_shop 单点+_forward_ 零命中 :124-140)/〔拆件批 V2〕/〔V3〕承继断言/触发器 V1 七反例+V2 双面+V8 阈值式/P8 28 键断言。缺漏 1(V3 保底不逼断言未落码)已补(trigger_cond_test V3 段:special_skills 双态+SkillLottery 30 摇零逼出+撤销态红证)。例外:hr 系尾缀落 manifest 注记行(备案,反哺点 12)。
## 二、撤销证明抽查复现——通过
undo1 复现:基线绿→gain_bonus 行改 pass→hr1-s 恰红(断言钉在被撤改动上)→还原复绿,工作树 clean。undo2/undo3 记录面与码面对得上(抽查一条合规)。
## 三、测试削弱检查——通过
删 72 行 Kit 断言全部属改址(旧路径引用已删字段),逐条同判据替换;净增 1 行=round_flow V7 扩行(申报④兑现);EV 锚区间零触碰(预期红非削绿);申报③兑现;表迁移与申报逐字一致。残留 1(level_shop_economy:1035 RunLedger 注释)已清+al4 零引用源码断言补落。申报外等价改写 1 处(skill_unlock 零扰动/确定性载体换蜘蛛首遇带——投放致地精池含 trigger 行,50f9caa7 已申报,判例外)。
## 四、S13 基线核查——通过
tools/ 全目录零改动(基线禁改契约兑现);存量红 9 键走用户特批呈报(实现报告 §三)。
## 五、bp 基线对拍抽验——通过
before vs after_T5:292×27 键=7884 次逐值比对 mismatch 0;gain_journal 0/292→292/292 在档(契约 2 兑现)。before vs after_attune:attunement_charges 292/292 全等(单源对拍达成);aux_items 24 处=申报例外(关卡完成停点留存同调行,代拍板 #6/反哺点呈报吻合)。
## 结论
**通过(附例外)**——合并前三件已全部处理(V3 断言补落/RunLedger 残留清+al4 补/备案两行入反哺点 12-13)。收口待用户裁决三项:S13 特批(9 键 refresh)、EV 锚重锚(goblin/hook_horror 池权重投放)、08d 反哺落文(生涯.md:55 行号句)。
@@ -1,374 +0,0 @@
# 需求卡片:冒险域拆件与账本实体化批(AdventureRunner 真拆分·主卡)
- 版本:**v1.3**(v1.0→grilling 一轮「回炉」13 阻断全折入→v1.1→二轮「通过附残留 8 条」全折入→v1.2 定稿→v1.3 领域拆分修订,复核记录见 §12。v1.3=2026-10-27 领域拆分修订——用户裁结构指标=缺陷,闸 09「标准是尺」口径下的还债实现,用户令本会话讨论后修订)
- 来源:[待办清单](../待办清单.md)「AdventureRunner 职责真拆分」条目(2026-10-25 登记,P0,状态=文档设计已闭合+待写卡)(唯一事实源:[architecture](../design/engineering/architecture/architecture.md) v1.16 核心层 HeroLedger/CurioStop 新件行+「冒险域拆分定稿」节)
- 归属:`game/core/` 新二件+adventure_runner/level_runner/curio_deck/shop_session/run_ledger/battle_orchestrator 改造+呈现接线面+测量面改址
- 排期:未编入(迭代批卡片;估时 ≈5–5.5 个工作日;姊妹副卡另 ≈1.5–2)
- 开工门:U0+复核门过(§12);零待裁点
- 姊妹卡:`reports/需求卡片-同调配装充能域封装批-2026-10-26.md`(副卡,依赖本卡——本卡完成后方可开工)
## 0. 前置依赖与并行性
- **第〇步核对(2026-10-26 写卡会话)**:来源条目=设计线条目,闭合凭据=architecture v1.16(「冒险域拆分定稿」节),放行。
- **卡间依赖**:本卡为姊妹副卡(充能域封装)的前置——本卡末态 RunLedger 为「仅剩同调充能账+其战斗原语」的瘦身壳,副卡将其整体退役。本卡禁越界做充能单源化(§5)。
- **并行冲突注记(呈编排段裁先后)**:①「通关口径换代批」(已写卡在册)C 注释面含 core 六件 29 处「通关」注释——与本卡同触 adventure_runner/level_runner;两批无论先后,后做者行号基线漂移(各自 T0 事实坐实吸收);同迭代排波须错文件或串行。②「调试入口写死行删除批」(已写卡在册)触 main.gd:199 与三探针断言——本卡触 main 系装配面与探针连接面,不同行域,排波无冲突但建议串行波。③与「结构小件定点修批」「levelmap装配越界与BFS缓存批」(已写卡在册)零文件交叠。
## 1. 目标与完成定义
**目标**:adventure_runner 从 989 行/42 类变量/23 公开方法的上帝对象转为**薄应用层**(DDD 应用层形态:状态机+关序推进+结算受理+建件接线+断点拼盘落盘口+效果引擎冒险桶持有,零领域决策);新件 HeroLedger(主角实体账)与 CurioStop(三选一停点件)落码;RunLedger 三账迁移瘦身;CurioDeck 纯池化;六转发信号族删除(呈现直连);关卡对象构造注入;断点片段化+获得日记键;25 条转发属性撤除+消费方改址。**游戏行为零变化**(契约 1)。
**改动单元清单**(与文件结构图同源):
| # | 单元 | 内容 |
|---|---|---|
| u1 | HeroLedger 建件+账本迁移 | 数值面(生命/钱包/锻造快照/类型轴/特性集/钥石/真视记录)迁入;获得日记三层结构;gp 单写原语;公式单点 |
| u2 | CurioStop 建件 | 停点三态/刷新三源账/兑付方法族/凭证出箱;三选一信号面自带 |
| u3 | CurioDeck 纯池化 | bind_handlers 反向回调退役;商店消费经 Callable 链至 CurioStop 兑付单点 |
| u4 | 应用层收薄 | adventure_runner 留状态机/关序/结算受理/建件接线/桶字典持有/断点拼盘口;件出口 hero()/stop() |
| u5 | level_runner 构造注入 | 后置 setter 群与商店重绑机制删除;8 条白盒转发属性撤除;断点关卡域片段方法 |
| u6 | 信号直连 | 六转发信号族删除;呈现/模拟器在 level_started 重取点重订阅;恰好一次断言 |
| u7 | 断点片段化+日记键 | 各件自交片段;应用层唯一落盘口;既有 27 键逐键冻结;获得日记键扩列(唯一声明的写入面扩展) |
| u8 | 转发属性撤除+改址 | adventure 4 条/level 8 条/board_view 13 条撤除;A 类属性直读 49 处+B 类内部直写约 78 处(68 处迁移态+10 处 run_ledger 账本断言族)+ui_input_probe 5 处+C 类方法面约 25 文件改指件 |
| u9 | RunLedger 瘦身 | bonus 账/vision 账/adventure_counters 桶全部退役迁出(桶归宿主+encounter `"adv_bucket"` 键);attune_charges 账保留(副卡退役) |
**完成定义**:
1. u1–u9 落地;全套闸按本批改动域选档全绿;S13 计数读数改善(adventure_runner 类变量 42→约 20、level_runner 38→约 30、board_view 45→32——读数记录进实现报告,基线禁改)。**v1.3 增**:拆分后新件逐件落 gdstyle 默认线内——HeroStats 公开方法 12/GpWallet 5/GainJournal 13/RefreshBank 13(类变量各 ≤7)、CurioStop 收口公开方法恰 20、adventure_runner 公开方法 ≤23 基线内;battle_orchestrator 指标精确回位=类变量 50/begin_battle 函数长 ≤141/文件长恰 1314(闸 09 存量 FAIL 行「1314>1302」文本逐字保持,指纹 91d45583cf6d 不变);hero_ledger.gd 删除、grep `HeroLedger|hero_ledger|\.hero()` 代码引用零残留(manifest 文件名与历史性注释除外)。
2. 同种子改前改后:断点快照 27 键逐键逐位一致(含日记键前形态);冒烟/系统/单测/探针全绿。
3. 撤销证明逐 wr 行落地;三份产出物写齐(T6);独立验收审计过。
## 2. 设计事实源
| # | 出处 | 取用条款 |
|---|---|---|
| D1 | [architecture](../design/engineering/architecture/architecture.md) **v1.16** | 核心层 HeroLedger 行、CurioStop 行;「冒险域拆分定稿」节全文(应用层形态/纯池化/RunLedger 退役与瘦身边界/构造注入/断点片段化/信号直连/调用直连/验收红线) |
| D2 | 待办清单条目实况「验收面预案要点」 | 真实入口断言/撤销证明/27 键冻结/RNG 零漂移/基线禁改/MC 发起权归用户 |
| D3 | [存档序列化](../design/gdd/systems/表现与支撑/存档序列化.md) 断点域节 | 27 键登记与豁免条款(本卡不改其正文——同步义务见 §6) |
## 3. 现状事实(2026-10-26 写卡会话实查于 master daa8860b;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| G1 | adventure_runner 989 行/42 类变量/23 公开方法/65 函数;七件变化原因混装(生命周期状态机/英雄账本/三选一停点/刷新双源/断点 schema/信号转发/商店装配) | `game/core/adventure_runner.gd` 全读;条目实况 |
| G2 | 转发属性 25 条:adv `:60-77` 4 条(_curio_taken/_curio_deck/_feat_ticket_pity/_feat_ticket_sold 直指 CurioDeck 件内);level `:50-66` 8 条(直指 ShopSession 件内);board `:82-122` 13 条(直指 TilePalette/HeroSprite 件内)。生产消费零;属性直读消费=5 单测 **49 处**+ui_input_probe **5 处** | grep 全库实测+复核订正 |
| G2b | **内部状态直写面(本批迁移态的测试直改,grilling 一轮补查)**:`_curio_pending/_curio_result/_node_curio_pending/_attune_refresh_x/_attune_refresh_y/_refresh_stock/_feats/ledger["hero_hp"]` 等直写约 **68 处/11 文件**——adventure_feats_test 15、feat_vouchers_test 14、curio_refresh_paid_test 10、meta_progression_forge_test 9(:293-303 直写停点态、:368 直读 ledger)、pool_case_d 5、cross_system_flow_test(集成)4、save_manager_domain_test 3、level_shop_economy 3、breakpoint_resume 3、treasure_effects 1。全部属 u1/u2 迁入件的承载态,随 T5 三类改址 | grilling 一轮实测 |
| G3 | 商店重绑 `_bind_shop` 全 6 调用(`_init:84`/`start_level:165`〔单关模式账本重建重绑——G3 原漏计〕/`start_level_external:205`/`set_run_ledger:688`/`set_attunement:646`/`set_tree_rules:670`);后置 setter 群:set_run_ledger/set_attunement/set_feats/set_tree_rules/set_hero_axes/set_shop_pool/set_voucher_grants/set_treasure_unlocked | `game/core/level_runner.gd:50-66/80-84/151-165/194-205/644-709/757-768`;grilling 复核订正 |
| G4 | 断点:`BREAKPOINT_FIELDS` 27 键 `:864-892`;`_snapshot_breakpoint` 5 调用点(`:483/:611/:665/:806/:855`);`_bp_parts` 对关卡对象五连挖(`:907-946`:node_id/shop_shelf/shop_visit_buys/visited_ids/aux_items);`_resume_*` 回填族 `:188-279` | `game/core/adventure_runner.gd` |
| G5 | 六转发信号 `:14-19`+`_forward_*` 六方法(`:849-855/:976-989`);`_bind_level_runner` 每关 6 连接 `:724-729`;`_forward_choices_presented` 转发兼快照双职 `:853-855` | `game/core/adventure_runner.gd`;呈现订阅面=`main_adventure_flow.gd:10-15` 全六+`sim/level_autoplay.gd:143-145` 三 |
| G6 | 加算区三写通道:三选一属性件 `adventure_runner.gd:425`(run_ledger.bonus[sink]);商店属性商品 `shop_session.gd:87-88`(bonus[attr]+=flat);战末导出 `battle_orchestrator.gd:1125-1127`(bonus_add_axis——按轴合计,无明细来源)。RunLedger 类壳触点:battle `:381` 类型检查、`:239/:757/:761-762/:1125-1127` 四族原语、`shop_session.gd:322-323` 硬转型;全仓 **18 文件**引用 RunLedger。**bonus 生产消费面 5 文件 8 处**(grilling 一轮补查):main_adventure_flow:37-38、level_map_screen:334/335/343、hud_presenter:20/313、ui_click_probe:689、level_autoplay:262 | 实读+grilling 复核核验 |
| G7 | `effective_max_hp` 双写逐字一致靠注释维持(adv `:305-307`/level `:106-108`);`apply_rest` 委托 `:322-323`;回血公式 `LevelRunner.rest_heal` 静态 `:588-589` | 实读 |
| G8 | encounter 注入:level `:519` `"ledger": run_ledger` 单键;begin_battle enc 装配 `:514-526` | `game/core/level_runner.gd` |
| G9 | CurioDeck `bind_handlers` `:25-27`(adv `_init` 注入 `:85`);`consume_pool_purchase` 经回调反调宿主 `:107-113` | `game/core/curio_deck.gd` |
| G10 | 呈现方法面消费:curio_interact_controller 16 处 `adventure.pick_curio/apply_node_curio/skip_empty_curio/refresh_*` 等;方法面总量≈25 文件(呈现 5+autoplay+约 20 测试) | grep 实测 |
| G11 | 停点零自动推进守卫:`continue_to_next_level` `:327-333`(无待确认/停点未兑付双拒);关卡对象每关新建 `:698`;信号顺序契约(level_started→重取→入口候选呈现)`:_inject_level_params:752`+`_present_level_entry:756-761` | `game/core/adventure_runner.gd`;`game/core/level_runner.gd:226-241` |
| G12 | 特性集活引用语义:`set_feats` 不复制(level `:655-657` 注释——关内兑付 relic 须当关生效) | `game/core/level_runner.gd` |
## 4. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 行为零变化**:RNG 流名 reward_pick 与消费序零漂移;信号顺序契约冻结(关卡开始→重取→入口候选呈现);同种子逐位一致;玩家可见呈现零变化。MC 与基线数据逐项比对**是否发起由用户裁**(触及存档/RNG 面)。
🔴 **契约 2 · 断点冻结与唯一扩展**:既有 27 键键名/键序/缺省回退策略逐键冻结;唯一声明的扩展=新增获得日记键(扩列不升版;旧档缺日记→汇总键直载并跳过比对;日记在档→由日记推导汇总、与留存汇总不符即报错中止)。
🔴 **契约 3 · 机检纪律**:`tools/gdstyle_baseline.txt` 禁改禁 refresh,类变量计数下降属改善自然绿;**禁为迎合机检消息文本保留或新增无效成员/别名(§13)**;机检键与卡片契约互斥时停卡呈报。
🔴 **契约 4 · 新件红线**:Core 零 UI(headless 可跑完整冒险);全类型标注(S9);core↔core 接线只许方法 Callable 禁 lambda(S6);随机只经注入 RngServiceCore 的 reward_pick 封闭流;数值零字面量只读 db;文件头注=模块介绍(禁变更叙事/文档反链)。
🔴 **契约 5 · 调用直连不留壳**:不留任何纯转传委托方法(Middle Man 裁定,2026-10-26);呈现控制器经**取值回调**持件——回调只许捕获长活根对象(root),**禁件方法 Callable**(防悬挂);件出口=adventure 对象上 `hero()`/`stop()` 两个取件方法(组件出口非委托壳)。
🔴 **契约 6 · 注入纪律**:构造注入一次给齐(关卡对象后置 setter 群与商店重绑机制删除,`_bind_shop` 全仓仅构造一处——含单关模式重开:HeroLedger 实例不重建、走 `reset_for_single_level()` 值重置,shop 绑 hero 对象引用不换代,G3 第 6 处重绑因此消失);注入**活引用禁快照**(特性集/装配集语义——G12)。
🔴 **契约 7 · 重连恰好一次**:呈现/模拟器重订阅用 `is_connected` 守卫+未连即 `push_error`(release 模板剥 assert,禁裸 assert);「关卡开始信号前零发射」契约写入 level_runner 头注并配断言。
🔴 **契约 8 · RunLedger 瘦身不退役(本卡)**:瘦壳余面**只有** attune_charges 账+`attune_charge_has/set/consume` 三原语——bonus 账、vision_counter 账、adventure_counters 桶字典**全部退役迁出**(桶归宿主字典+encounter `"adv_bucket"` 键,battle :382 挂链改指);encounter `"ledger"` 键保留传瘦壳;整类文件删除归副卡。
🔴 **契约 9 · 测试改址非削弱**:A 类 49 处+B 类约 78 处与方法面改址=访问路径改写,断言语义与判据逐条保持;实现期不得借改址删断言/放宽判据(削弱申报=零)。
## 5. 范围边界
**做**:u1–u9;§8 全部验收;撤销证明;产出物。
**不做**(去向明示):
- **充能域封装**(AttuneLoadout 建件/物化行单源化/战斗使用管线改写/旧档同调行迁移/RunLedger 整类退役)→ 姊妹副卡 `reports/需求卡片-同调配装充能域封装批-2026-10-26.md`;
- **level_runner 商店方法委托层拆除**(buy_product 等同签名委托)→ 在册条目「level_runner 商店委托层拆除」(待写卡);
- 关卡主题数据缝扩展、获取即入账(用户裁维持现状)→ 不立项;
- design/ 与根规则文件任何编辑 → 反哺点清单(§6);
- MC/对拍锚重跑 → 用户发起。
## 6. 关联文档同步面
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| `design/engineering/architecture/architecture.md` | 模块归属表 HeroLedger/CurioStop 行「设计定稿——实现批建件」标注换代为现状;CurioDeck 行删 bind_handlers 句;level_runner 行补构造注入句;「冒险域拆分定稿」节转现状登记(RunLedger 行注记瘦身半程) | 反哺点 · 列清单 |
| `design/gdd/systems/表现与支撑/存档序列化.md` | :59 断点域段机制句(写侧 _bp_parts 拼装/读侧 _bp_read 派生)改写为「各件自交片段+冒险应用层唯一拼盘落盘口+获得日记键扩列」 | 反哺点 · 列清单 |
| `design/gdd/systems/冒险循环/冒险结构.md` | 断点域字段口径 owner——新增获得日记键的字段口径登记(键名/缺省策略/旧档回退) | 反哺点 · 列清单 |
| `game/tests/验证集清单.md` | A 类 49 处+B 类约 78 处+方法面改址的清单同步(机器提取重生成) | 批内机械同步(game 内 .md,非禁写面) |
| `待办清单.md` | 来源条目状态推进(实现批收尾由 batch-closure 承接) | 反哺点 · 列清单 |
## 7. 任务卡
### 卡前 · 文件结构图
| 文件 | 职责 | 行为改动 |
|---|---|---|
| `game/core/hero_stats.gd`(**新增**,v1.3 拆分) | 主角数值账:生命与特性持有集+永久强化快照+类型轴+生效公式单点+回血封顶+续玩生命钳制+断点片段(hero_hp/relics 两键) | 新件(hero_ledger 领域拆分——行为不变)→ wr1/wr6 |
| `game/core/gp_wallet.gd`(**新增**,v1.3 拆分) | GP 钱包:gain/spend/clear 单写原语+断点片段(gp 一键) | 新件(同上)→ wr1/wr6 |
| `game/core/gain_journal.gd`(**新增**,v1.3 拆分) | 加算日记:获得记录三层+统一加算区三通道+购买档数+钥石+真视+断点片段(六键) | 新件(同上)→ wr1/wr6 |
| `game/core/hero_ledger.gd`(**删除**,v1.3 拆分) | 原主角实体账整件退役——按领域拆入上三件(grep 零残留) | 结构改动(行为不变)→ wr1/wr6 |
| `game/core/refresh_bank.gd`(**新增**,v1.3 拆分) | 刷新账件:X 基数与余量/Y 池/刷新券存量账/付费刷计数与报价公式/免费位消耗序+断点片段(refresh_stock/attune_refresh_y 两键) | 新件(curio_stop 领域拆分——行为不变)→ wr2/wr6 |
| `game/core/curio_stop.gd`(**新增**) | 三选一停点件:停点三态/兑付族/谓词/凭证出箱/信号面/断点片段;刷新编排留件(查停点态→bank 支出→重抽重发);deck 纯委托删除(调用方直连 CurioDeck) | 新件(承载迁移态)→ wr2/wr3/wr6 |
| `game/core/adventure_runner.gd`(修改) | 薄应用层:删数值面/停点族/六转发信号族;建件接线(stats/wallet/journal/bank 四引用);断点拼盘口(三片段并集);件出口 stats()/wallet()/journal()/deck()/refresh_bank()/stop() | 结构改动,行为不变 → wr4/wr6 |
| `game/core/level_runner.gd`(修改) | 构造注入收参(ctx 三键 stats/wallet/journal);8 白盒属性删;重绑机制删;战斗→关卡信号族保留;断点关卡域片段方法 | 结构改动 → wr5/wr6 |
| `game/core/curio_deck.gd`(修改) | 纯池化:bind_handlers 删;consume_pool_purchase 改经注入 Callable | 结构改动 → wr3 |
| `game/core/shop_session.gd`(修改) | 账本引用换代(run_ledger→wallet+journal);商店属性加算改经 journal 单写原语 | 结构改动,写通道语义不变 → wr1 |
| `game/core/run_ledger.gd`(修改) | 瘦身:bonus 账/vision 账/adventure_counters 桶全部退役迁出(桶归宿主字典+encounter `"adv_bucket"` 键);attune_charges 账+其三原语保留 | 结构改动 → wr1 |
| `game/core/battle_orchestrator.gd`(修改) | encounter 注入面:+`"journal"` 键(v1.3——原 `"hero"` 键随拆分换代);bonus_add_axis/vision_count_add 调用改指 journal;attune_charge_* 仍走 ledger 瘦壳;结构指标回位(类变量 50/函数长/文件长——闸 09 口径) | 结构改动 → wr1 |
| `game/presentation/main_adventure_flow.gd`(修改) | 信号重连(level_started 重取点 is_connected 守卫);控制器件注入换代;bonus 读面改指 hero(:37-38) | 结构改动 → wr4/wr1 |
| `game/presentation/views/level_map_screen.gd`(修改) | bonus 读面改指 hero(:334/335/343) | 结构改动 → wr1 |
| `game/presentation/hud_presenter.gd`(修改) | bonus 读面改指 hero(:20/313) | 结构改动 → wr1 |
| `game/presentation/curio_interact_controller.gd`(修改) | 16 处调用改指 `stop()`(取值回调经 root) | 结构改动 → wr2 |
| `game/presentation/main.gd`(修改) | 装配面:冒险对象创建传参(存档承载构造注入)与件出口接线 | 结构改动(非行为) |
| `game/presentation/views/board_view.gd`(修改) | 13 条件成员同名转发属性删除 | 非行为改动(生产零消费) |
| `probe/ui_click_probe.gd`(修改) | bonus 读面改指 hero(:689) | 测量面改址 → wr1 |
| `probe/ui_input_probe.gd`(修改) | 5 处改指件(`_palette`/`_hero_sprite`) | 测量面改址 → wr7 |
| `game/tests/unit/core/` 5 文件(修改) | 49 处属性直读改指件(A 类) | 测量面改址 → wr7 |
| `game/tests/` 直写面 11 文件(修改) | 约 68 处内部状态直写改件公开构造面(B 类,G2b 清单) | 测量面改址 → wr7/wr2 |
| `sim/level_autoplay.gd`(修改) | 3 处转发信号订阅改关卡对象(level_started 重连);bonus 读面改指(:262) | 测量面改址 → wr4/wr1 |
| 其余方法面调用文件(约 20 测试文件,修改) | `adventure.pick_curio` 族改指 `adventure.stop().pick_curio`(C 类) | 测量面改址 → wr2 |
(新增二件与新增函数的复用/唯一性核查见「落位与可复用性预检」节;新增数据件=获得日记键〔断点扩列〕。)
### 接口块
**HeroStats(`game/core/hero_stats.gd`,v1.3 拆分——数值域)**
```gdscript
class_name HeroStats extends RefCounted
func _init(db_ref: ConfigDb, base_override_ref: Dictionary) -> void # 锻造强化快照构造注入
func set_debug_override(atk_pct: int, hp_pct: int) -> void # 调试百分比通道(adventure.set_hero_override 转发件内)
func clamp_hp_to_resume_cap(db_max_hp: int) -> void # 续玩生命钳制(原 _resume_params mini 式逐字收进——上限=表值+永久强化 flat 后乘调试 pct)
func rebase_override(raw: Dictionary) -> void
func reset_for_single_level() -> void # 单关重开:override 清零+本域账面重置(钱包/日记清零各归各件)
func reset_adventure_accounts() -> void # 生命置满生效上限+特性持有集清零
func effective_max_hp() -> int; func effective_atk() -> int; func effective_ac() -> int # 公式单点
static func rest_heal(pct: int, hp: int, max_hp: int) -> int # 回血公式单点
var hero_hp: int # 生命账
var feats: Array[String] # 特性持有集(活引用注入)
func feats_held() -> Array
var attack_type := ""; var armor_type := "" # 两根类型轴快照
func breakpoint_fragment() -> Dictionary # hero_hp/relics 两键
func restore_fragment(frag: Dictionary, params: Dictionary) -> void
```
**GpWallet(`game/core/gp_wallet.gd`,v1.3 拆分——钱包域)**
```gdscript
class_name GpWallet extends RefCounted
var gp: int
func gain_gp(amount: int) -> void; func spend_gp(amount: int) -> bool; func clear_wallet() -> void
func breakpoint_fragment() -> Dictionary # gp 一键
func restore_fragment(frag: Dictionary, params: Dictionary) -> void
```
**GainJournal(`game/core/gain_journal.gd`,v1.3 拆分——加算日记域)**
```gdscript
class_name GainJournal extends RefCounted
const BONUS_AXES: Array[String] = ["atk", "max_hp", "armor_class", "ap"]
func gain_bonus(axis: String, value: int, source_class: String, kind: String) -> void # 三通道统一入口(明细+汇总同拍)
func bonus_total(axis: String) -> int; func bonus_snapshot() -> Dictionary
func record_purchase(product_id: String) -> void; func purchase_tier(product_id: String) -> int
func record_keystone_drop(drop: Dictionary) -> void; func keystone_gained() -> int; func keystone_drop_log() -> Array
func record_vision_use() -> void; func vision_used() -> int
func reset_adventure_accounts() -> void # 日记域账面清零(汇总/明细/记录/已购档/钥石/真视)
func breakpoint_fragment() -> Dictionary # bonus/shop_purchased/keystone/keystone_drops/vision_counter_used/gain_journal 六键
func restore_fragment(frag: Dictionary, params: Dictionary) -> void # 缺日记→汇总直载 clamp;在档→明细推导比对不符 push_error 拒载
```
**RefreshBank(`game/core/refresh_bank.gd`,v1.3 拆分——刷新账域,零停点态依赖)**
```gdscript
class_name RefreshBank extends RefCounted
func _init(db_ref: ConfigDb) -> void
func set_refresh_x_cap(total: int) -> void # X 基数注入(装配集 bonus_refresh magnitude 合计——宿主 start/resume 时点)
func set_refresh_y(v: int) -> void; func refresh_y() -> int # Y 冒险周期池
func add_refresh_stock(n: int) -> void; func refresh_stock() -> int # 刷新券存量账(冒险级)
func free_left() -> int # 合计读面(X+Y+存量——原 attune_refresh_left 迁入)
func spend_free() -> bool # 免费位消耗(X→Y→存量序逐字;全空 false 零副作用)
func charge_paid() -> void; func gp_cost() -> int # 付费刷计数递增/报价公式(ceil 基价×曲线^已付费刷——原式迁入)
func reset_x() -> void # X 每碰三选一重置回基数(不结转)
func reset_paid() -> void # 付费刷计数随停点清零(对齐商店进店清零)
func breakpoint_fragment() -> Dictionary # refresh_stock/attune_refresh_y 两键
func restore_fragment(frag: Dictionary, params: Dictionary) -> void # Y 缺键回退参数面(params_fallback 逐字)
```
**CurioStop(`game/core/curio_stop.gd`,v1.3 收口后保留面)**
```gdscript
class_name CurioStop extends RefCounted # 生命周期=每冒险一次(AdventureRunner 冒险开始建;关卡换实例不换件)
signal curio_choice_presented(payload: Dictionary) # 载荷逐字不变
signal curio_resolved(result: Dictionary)
func _init(db_ref: ConfigDb, deps: Dictionary, snapshot_call: Callable) -> void
# deps = {deck:CurioDeck, stats:HeroStats, journal:GainJournal, bank:RefreshBank}——构造注入一次给齐
func rebind_level_runner(runner: LevelRunner, level_index: int) -> void # 每关注入时点(GP 件入账回调换代)
# ---- 停点编排保留面(公开方法恰 20——gdstyle 默认线)----
func open_level_clear(payload_base: Dictionary) -> void
func present_node_curio(candidates: Array) -> void; func node_curio_candidates() -> Dictionary
func pick_curio(kind: String, tier: String = "", feat_id: String = "") -> bool
func apply_node_curio(kind: String, tier: String = "", feat_id: String = "") -> bool
func skip_empty_curio() -> bool; func node_curio_pending_state() -> Dictionary
func refresh_curio() -> bool; func refresh_curio_paid() -> bool # 编排=查停点态→bank 支出→重抽重发
func curio_stop_pending() -> bool; func stop_resolved() -> bool
func consume_pool_purchase(kind: String, tier: String) -> bool
func reset_adventure_state() -> void
func restore_pending(bp_pending: Dictionary) -> void
func restore_resolved(payload: Dictionary) -> void # v1.3 合并 reemit——置态后重发(resume 只重发不重兑付)
func clear_resolved() -> void
func voucher_outbox() -> Dictionary # 凭证出箱 {rap:int, time_sand:int}——战首取走清零
func breakpoint_fragment() -> Dictionary # bonus_pending/bonus_result/feat_ticket_*
func restore_fragment(frag: Dictionary, params: Dictionary) -> void
# v1.3 删除:feat_ticket_consider/curio_cap_ok/pool_stock(deck 纯委托——调用方直连 CurioDeck)、
# pool_stock_snapshot/draw_candidates(同上)、resolved_payload(零消费死面)、reemit_resolved(并入 restore_resolved)、
# 刷新族七方法(set_refresh_x_cap/set_refresh_y/refresh_y/add_refresh_stock/refresh_stock/attune_refresh_left/curio_refresh_gp_cost→RefreshBank)
```
**adventure_runner 应用层(保留/新增面)**
```gdscript
func _init(db_ref: ConfigDb, rng_ref: RngServiceCore, save_manager_ref = null) -> void # 存档承载改构造注入(缺省 null=断点静默,原语义)
func stats() -> HeroStats; func wallet() -> GpWallet; func journal() -> GainJournal # 件出口(v1.3——hero() 随三件拆分换代)
func deck() -> CurioDeck; func refresh_bank() -> RefreshBank # 件出口(v1.3——停点件 deck 纯委托删除后调用方直连面)
func stop() -> CurioStop
# 保留:start_adventure/resume_adventure/continue_to_next_level/abandon/state/summary/runner()/set_hero_override
# 删除:数值面方法族/停点族方法/六转发信号与 _forward_*/_bp_parts 五连挖(改收片段)/hero()
# BREAKPOINT_FIELDS 常量保留本件=键序契约(拼盘口按此断言完整性)
```
**level_runner 构造注入**
```gdscript
func _init(db_ref: ConfigDb, rng_ref: RngServiceCore, ctx: Dictionary) -> void
# ctx 键(一次给齐,后置 setter 群删除——grilling 一轮补全 12 键;v1.3 hero 键换代三键):
# stats:HeroStats/wallet:GpWallet/journal:GainJournal(共享主角账三件——活引用)/loadout:AttuneLoadout(同调配装件)/
# adv_bucket:Dictionary(冒险桶宿主字典)/attunement:Array/tree_rules:Array/shop_mode:String/treasure_unlocked:Dictionary/
# hero_attack_type:String/hero_armor_type:String/voucher_rap:int/voucher_time_sand:int/
# pool_wiring:Dictionary(池模式装配 4 参收编:{deck:Array, consume:Callable, ticket:Callable, cap:Callable}——缺省空字典=legacy 零注入)
# start_level(单关测试模式)件内自建私有三件(_init 即建、空 override 注入——shop 绑定因此仍仅构造一次;
# start_level 收 base_override_in 经 stats 重注+三件各归各件清零,实例不重建)
# 新增:func stats() -> HeroStats # 只读出口(v1.3——hero() 换代;bonus 生产读面经 journal() 承接)
# func journal() -> GainJournal
# start_level_external 收参收窄为 (level_index:int, defer_entry:bool, resume_state:Dictionary)
# 新增:func breakpoint_fragment() -> Dictionary # 关卡域五键(node_id/visited_ids/aux_items/shop_shelf/shop_visit_buys)
# func restore_fragment(resume_state: Dictionary) -> void # 断点重建参数面收口(原 _resume_bp 直读面收编)
# 删除:_shop_pool_mode/_pool_deck/_pool_consume/_pool_ticket/_shop_shelf/_shop_visit_buys/_shop_paid_refreshes/_shop_purchased 八条白盒属性(内部访问改直指 _shop)
```
**T 卡间接口**:T1 产出 HeroLedger 全 API(T2/T3/T4 取用);T2 产出 CurioStop API 与 stop_resolved/voucher_outbox(T3 关序受理取用);T3 产出重连点与 ctx 签名(T4/T5 取用);T4 产出片段三接口(wr6 取用);各卡验收断言随卡落地。
### 落位与可复用性预检
| 新增件 | 复用面(为何不能复用既有) | 唯一面 | 分层与交互 |
|---|---|---|---|
| hero_ledger.gd | 既有 run_ledger.gd 职责=跨层共享账壳(本批瘦身退役中),非主角数值实体——主语不同不可复用;grep `hero_ledger`/`HeroLedger` 零命中 | 主角数值与获得记录唯一所有者;gp/生命/加算单写原语唯一落点(三写通道收口于此) | Core 纯逻辑;由 adventure_runner 建、注入 curio_stop/level_runner/shop_session/battle encounter;零 UI、随机零消费 |
| curio_stop.gd | 停点编排现散在 adventure_runner(本批迁出);grep 零同名类;名源=现役 `curio_stop_pending()` 谓词(:584)——件名继承在库概念 | 停点三态/刷新三源/兑付族唯一所有者 | Core 纯逻辑;随机只经注入 deck 的 reward_pick;兑付落账经注入 hero;落盘经注入方法 Callable(S6 合规) |
| 获得日记键(数据件) | 断点键族现无日记类键(BREAKPOINT_FIELDS 实查 27 键无之) | 获得记录持久化唯一载体;与汇总键并存但日记为正主(比对规则见契约 2) | 断点域扩列,owner 口径归冒险结构.md(反哺点) |
| ctx 注入字典 | 后置 setter 群(本批退役)的替代收口;CurioFlowContext 先例(curio_interact_controller.gd:31)同法 | 关卡依赖装配唯一入口 | 组合根→adventure→level 构造链 |
### T0 事实坐实+改前基线采集(≈0.35d)
- [ ] 复核 G1–G12 行号(吸收并行批漂移);记录改前读数:S13 三件计数(42/38/45)、`gdstyle_baseline.txt` 键数、五单测属性直读 49 处+直写面 68 处逐条清单(G2/G2b)。可核查结果:改前读数表进实现报告素材。
- [ ] **改前断点基线采集(bp1 载体)**:新增临时对拍脚本 `game/tests/bp_baseline_dump.gd`(`--script` 直跑:固定种子集驱动 autoplay 冒险至各停点〔选路/三选一/兑付后/入口〕,逐停点 dump 断点 Dictionary 全键值)→ JSON 落 `reports/` 实现报告素材目录;批末随中间产物退役。改后复跑同脚本对比:**比对集=原 27 键**(新日记键不在改前档,排除出比对集单列核对)。可核查结果:基线 JSON 与复跑对比表在案。
### T1 HeroLedger 建件+账本迁移(≈1.0d)
- [ ] 实装 hero_ledger.gd(接口块全签名;数值面自 adventure_runner :28-77 迁入、公式自两处 :305-307/level:101-115 迁入单点;获得日记三层与三通道入口)。可核查结果:件可 `new()` 直构单测。
- [ ] 接线换代:adventure_runner 建件;shop_session 账本引用换 hero(:322-323 硬转型退役,属性商品走 `hero.gain_bonus`〔wr1-s 断言:购买后 bonus_total 与旧径同值〕);battle encounter +`"hero"` 键、bonus_add_axis/vision_count_add 改指 hero(:1125-1127/:761-762);**bonus 生产读面 5 文件 8 处改指 `hero().bonus_total()`**(main_adventure_flow:37-38/level_map_screen:334-343/hud_presenter:20/313/ui_click_probe:689/level_autoplay:262——现经 `runner.run_ledger` 访问链,LevelRunner 侧补 `func hero() -> HeroLedger` 只读出口承接);RunLedger 删 bonus/vision 账。
- [ ] **冒险桶迁移**:adventure_runner 持 `adventure_counters` 字典(开局清/收束清/`_resume_counters` :256-258 回填改直写本字典);battle encounter 增 `"adv_bucket"` 键、:382 挂链 `counters_ctx.adventure_bucket` 改指该键(效果引擎就地直写路径不变——引用束同字典;battle 直构无注入路径以自有空字典兜底,承现 :381 `RunLedger.new()` 兜底语义)。
- [ ] 验收步骤:〔hr1〕单测——effective_max_hp/rest_heal 与改前逐值一致(真实入口:start_adventure→恢复点节点 rest 真链,封顶口径断言继承现役);〔hr2〕三通道日记断言——三选一件/商店商品/战末导出各走真链后 `bonus_total` 与改前读数相等、日记条目来源指回正确。撤销证明见 wr1。
### T2 CurioStop 建件+CurioDeck 纯池化(≈1.0d)
- [ ] 实装 curio_stop.gd(停点三态/刷新三源/兑付族/凭证出箱/信号面——全部自 adventure_runner :353-666 迁入,语义逐字);adventure_runner 停点段改调 `stop.open_level_clear`(关序受理读 `stop_resolved`/`voucher_outbox`)。
- [ ] CurioDeck 纯池化:bind_handlers 删(:25-27/:85);商店消费链 ShopSession→(注入 Callable)→`curio_stop` 兑付单点(现 `_apply_curio_pick` 同口语义)。
- [ ] 验收步骤:〔cs1〕三选一真链断言(继承条目预案:start_adventure→关卡完成→pick→断言加算区/池余量/停点态清零);〔cs2〕商店 pool 购买真链断言(buy_pool_item→兑付→摘牌/加算);〔cs3〕凭证拿到即开断言(现役断言继承改址)。撤销证明见 wr2/wr3。
### T3 应用层收薄+构造注入+信号直连(≈1.0d)
- [ ] adventure_runner 收薄:删数值面/停点族残留/六转发信号族与 `_forward_*`;`_bind_level_runner` 六连接删;`_forward_choices_presented` 的快照触发改核心侧自有受理(choices_presented 订阅归应用层,落盘口直调)。
- [ ] level_runner 构造注入:ctx 收参、setter 群删、`_bind_shop` 收敛为构造一次;八白盒属性删(内部改直指 `_shop`);头注补「关卡开始信号前零发射」契约。
- [ ] 呈现/模拟器直连:main_adventure_flow 在 level_started 重取点 `is_connected` 守卫重连六信号(守卫未连即 push_error);curio_interact_controller 16 处改 `stop()`(取值回调经 root,禁件方法 Callable——契约 5);autoplay 3 处同法改(autoplay 增订 level_started:在该回调重取 runner 并重连——现经冒险转发的 node_entered 内重取机制随转发族消亡,重取点前移)。
- [ ] 验收步骤:〔sc1〕恰好一次断言(重连后同信号处理器仅一次——探针真链驱动两关全流程);〔sc2〕信号顺序契约断言(关卡开始→重取→入口候选——现役探针断言继承);〔sc3〕源码断言——`_bind_shop` 全仓仅构造一处、`_forward_` 族零命中(static_scan/冒烟源码断言形态)。撤销证明见 wr4/wr5。
### T4 断点片段化+日记键(≈0.75d)
- [ ] 三件片段接口落地(接口块签名);adventure_runner 拼盘口(BREAKPOINT_FIELDS 键序断言完整性→收片段→拼→落盘);level_runner 五键片段替代五连挖;`_resume_*` 族改分发片段。
- [ ] 日记键写入与旧档回退(契约 2 规则)。
- [ ] 验收步骤:〔bp1〕同种子改前改后断点逐位一致——**比对集=原 27 键**(日记新键排除出比对集、单列核对在档性)——T0 基线脚本改后复跑逐键相等(集成测试载体);〔bp2〕日记在档推导比对断言+旧档(无日记键构造档)回退直载断言;〔bp3〕续玩真链(ui_click_probe wc2 继承+wr 载荷断言)。撤销证明见 wr6。
### T5 转发属性撤除+测量面三类改址(≈1.0d,grilling 一轮扩容)
- [ ] **A 类·转发属性直读改指件(49 处/5 文件)**:`a._curio_deck`→`a._curio.deck` 等 4 属性直读改指件成员(G2 清单逐条)。
- [ ] **B 类·内部状态直写改件面(约 78 处/12 文件,G2b 清单+账本断言族)**:停点态/账本态直写改走件公开构造面——`a._curio_pending={...}`→经 `stop()` 测试构造面(件补测试用写入口:`_test_set_pending` 形态或公开装配参数,语义=原直写);`adr.ledger["hero_hp"]` 直读→`hero().hero_hp`;**run_ledger 账本断言族改指**(约 10 处/3 文件:adventure_feats :351/362、feat_vouchers :30/110-111/117/141、level_shop_economy :1037/1322/1325 的 bonus/adventure_counters 读断言→`hero().bonus_total()`/宿主桶读面)。
- [ ] **C 类·方法面调用改指件(约 25 文件)**:`adventure.pick_curio` 族→`adventure.stop().pick_curio`;公式调用→`hero()`。
- [ ] 撤 25 条转发属性(adv 4/level 8/board 13——board 13 条删除即净);ui_input_probe 5 处改指件;验证集清单重生成同步(§6)。
- [ ] 验收步骤:全套闸按域选档跑一次全绿(改址后现役断言语义不变=绿);S13 计数读数记录(读数留档)。撤销证明见 wr7。
### T6 撤销证明+产出物落位卡(≈0.25d,末卡)
- [ ] 逐 wr 行撤销证明(§8.1 末列——回退对应 hunk→最窄闸红→还原复绿,记录进实现报告)。
- [ ] 写齐三份产出物(实现报告〔S13 读数对照+实机目检总清单+并行批交叠注记〕/代拍板追认单/反哺点清单〔§6 逐条落点〕)。
- [ ] 合并前置:独立验收审计(§8.3)逐行「通过」。
**估时合计 ≈5.35d**(区间 5–5.5;T0 扩基线采集、T5 扩三类改址系 grilling 一轮订正——单卡破 5d 无碍:工作量限制属迭代层非卡片层,2026-10-25 两层口径)。
## 8. 验证闸
### 8.1 改动—验收对照表
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销证明 |
|---|---|---|---|---|---|
| wr1 账本实体化(数值面/公式单点/三通道日记) | hero_ledger 新件+shop/battle/adv 接线换代 | 〔hr1〕公式逐值断言+〔hr2〕三通道日记断言+〔hr1-s〕商店加算同值断言〔拆件批 V1〕 | 单元+接口 | start_adventure→恢复点真链;商店/三选一/战末真链 | 回退 hero 接线 hunk→hr2 红(日记断言失源) |
| wr2 停点件迁移 | curio_stop 新件+关序受理改调 | 〔cs1〕三选一真链断言〔拆件批 V2〕 | 接口+集成 | start_adventure→关卡完成→pick 真链 | 回退停点段 hunk→cs1 红 |
| wr3 牌库纯池化 | curio_deck bind_handlers 删+商店链改接 | 〔cs2〕pool 购买真链断言〔拆件批 V3〕 | 集成 | buy_pool_item 真链(关内商店节点) | 回退商店链 hunk→cs2 红 |
| wr4 信号直连+恰好一次 | 六转发族删+重连点 | 〔sc1〕恰好一次+〔sc2〕顺序契约断言〔拆件批 V4〕 | 探针+系统 | 两关全流程真实驱动(探针) | 回退重连 hunk→sc1 红(双连或零连) |
| wr5 构造注入+重绑退役 | level_runner ctx 收参 | 〔sc3〕源码断言(_bind_shop 单点/_forward_ 零命中)+特性活引用现役断言〔拆件批 V5〕 | 冒烟源码断言+单元 | 现役冒烟段+关内 relic 兑付当关生效现役断言 | 回退 ctx hunk→sc3 源码断言红 |
| wr6 断点片段化+日记键 | 三件片段+拼盘口+日记键 | 〔bp1〕同种子 27 键逐位一致+〔bp2〕日记比对/旧档回退+〔bp3〕续玩真链〔拆件批 V6〕 | 集成+探针 | 同种子双跑+ui_click_probe 续玩 | 回退片段 hunk→bp1/bp2 红 |
| wr7 转发属性撤除+改址 | 25 条删+A 类 49 处+B 类约 78 处+C 类方法面改指件 | 改址后现役断言全绿+S13 计数读数记录+〔pr1〕ui_input_probe 直跑绿〔拆件批 V7〕 | 单元+探针 | 五单测套+ui_input_probe | 回退改址 hunk→对应套件红(路径不存在) |
| wr8 产出物 | T6 三份 | 件核〔wr8〕 | — | — | 缺项红 |
### 8.2 测试削弱申报
零(改址=访问路径改写,断言语义与判据逐条保持——契约 9;无任何断言删除/阈值放宽/扫描面缩小)。
### 8.3 独立验收审计
入口=未参与实现的会话或子代理;报告落 `reports/iter<N>-验收审计-<日期>.md`;抽查重点=27 键逐键比对执行记录、恰好一次断言、改址断言语义等价抽检(5 文件各 ≥3 处)、S13 基线未改(git diff 查 `tools/gdstyle_baseline.txt` 零变化)、撤销证明复现。未过不得合并。
## 9. 异常分级
- **L1(自救)**:行号漂移(T0 基线对照自核);测试改址的等价写法微调。
- **L2(记录继续)**:非断言面注释措辞;呈现装配面等价调整(不动信号契约)。
- **L3(停机呈报)**:机检键与契约互斥(契约 3);断点键序/逐位一致断言红且非测试问题;信号顺序断言红;发现第七件变化原因需扩拆件范围;RunLedger 瘦身后仍有非副卡范围的依赖残留。
## 10. 代拍板白名单(超清单必呈报)
1. 提交切分与 worktree 分支命名。
2. 测试改址的等价访问写法(语义不变前提下)。
3. 迁入代码的注释随迁措辞(语义不变前提下)。
4. 单关测试模式自建私有 HeroLedger 的内部组织。
## 11. 待裁点
**零待裁点,开工门=U0。**(全部设计裁点已在设计段闭合,凭据 architecture v1.16;本卡无新增裁量面。)
## 12. 自审六查与复核记录
**自审六查(2026-10-26 写卡会话)**:①规格覆盖——u1→T1/wr1、u2→T2/wr2、u3→T2/wr3、u4/u6→T3/wr4、u5→T3/wr5、u7→T4/wr6、u8→T5/wr7、产出物→T6/wr8,完成定义三条各有落点;②步骤扫描——每步一动作一可核查结果,无「TBD/酌情」行;③类型一致性——接口块签名与 T 卡引用逐字一致(hero()/stop()/curio_stop_pending 名源);④审查焦点——断点逐位一致(bp1)与信号恰好一次(sc1)为最可能坑点,已挂 T4/T3;文件结构图行为改动行全部指到 wr 行;⑤篇幅比例——接口块为签名非实现体,无函数体抄写;⑥落位预检——新增二件+日记键+ctx 四件各有不能复用理由与唯一落点,与结构图「新增」标记对上。
**grilling 一轮复核记录(2026-10-26,独立子代理对抗复核,判「回炉」——13 阻断+7 建议,v1.1 全数折入)**:①改址面系统性漏列(测试直写约 68 处/11 文件+生产 bonus 消费 5 文件 8 处)→ G2b 新增+G6 订正+T5 三类改址重列+结构图补五行;②HeroLedger 接口不完整(gp 读面/pct 与 base_override 注入/战末日记形态)→ 接口块补 `var gp`/`set_debug_override`/构造参 base_override/战末通道 source_class="battle_export" 定死;③契约互斥(sc3 单关模式重绑)→ 契约 6 裁「实例不重建、值重置、shop 绑对象不换代」;④set_shop_pool 四参无落点 → ctx 补 pool_wiring 键;⑤adventure_counters 桶迁移漏步 → T1 增桶迁移步骤+契约 8/u9 与副卡 K5 口径对齐(瘦壳余面=attune 仅存);⑥gp_grant_call 跨关调死对象 → CurioStop 生命周期定每冒险一次+`rebind_level_runner` 每关注入时点写死;⑦bp1 基线采集不可执行 → T0 补采集步骤(载体/落盘/28 键对 27 键排除法);⑧数字订正(49 处/5 处探针/_bind_shop 6 处/:50-66);⑨autoplay 重取机制 → T3 补 level_started 重连;⑩wallet_mutated 无消费方信号删除(§13 同款);估时 4.75→5.25。复核确认属实的关键事实(989 行、转发属性与信号行号、_bind_shop 六处、attune_charge_has 零调用、system_test/smoke 无方法面调用、通关批交叠面)已随订正吸收。
**二轮闭合复检(2026-10-26,同一独立子代理)**:判「通过(附残留 8 条,无新阻断)」——13 阻断逐条核闭合(含三处点名矛盾检查:桶迁移与契约 8 一致、rebind 时点先于该关全部信号发射无冲突、副卡键值校验与零行为变化自洽)。残留 8 条已折入 v1.2:R1 数字统一(u8/契约 9/wr7/§6 四处 47→49+B 类 68→78);R2 B 类补 run_ledger 账本断言族(约 10 处/3 文件改指);R3 bonus 读面经 LevelRunner `hero()` 只读出口承接写明;R4 单关模式 `_init` 即建私有 hero(空 override)+start_level 经 reset 重注——绑定仍仅构造一次;R5 结构图 run_ledger 行同步桶退役+battle 直构空字典兜底;R6/R7/R8 归副卡折入。估时分项和 5.35d 对齐。
**领域拆分修订动因(2026-10-27,v1.3——用户令本会话讨论后修订)**:实现批收口呈报的结构指标超标(hero_ledger 公开方法 29、curio_stop 公开方法 34/类变量 18/_apply_curio_pick 分支 10 返回 9——五条 NEW;宿主 battle_orchestrator 类变量/函数长/文件长三条恶化)经用户裁「结构指标=缺陷、按领域切分」定案为还债实现,随本卡迭代收口批执行:①hero_ledger 按领域拆三件(HeroStats 数值与公式/GpWallet 钱包/GainJournal 加算日记——断点片段三件各交各账、应用层并集拼装,28 键对拍基线逐位一致为硬验收);②curio_stop 拆出 RefreshBank 刷新账件(停点态零依赖)+删五条 deck 纯委托(调用方经 adventure.deck() 直连)+resolved_payload 死面删除+reemit_resolved 并入 restore_resolved;③battle_orchestrator 指标精确回位(类变量 50、begin_battle ≤141、文件长恰 1314——闸 09「标准是尺」存量红两行的行文本与指纹逐字保持,多一行少一行都改指纹)。行为零变化契约不变;机检口径仍按 §13——禁为计数保留无效成员,本修订的全部公开面收敛都来自真实调用面。
## 13. 禁为机检文本保留无效成员(重构类必填条款)
禁止为迎合机检消息文本(含计数)而保留或新增无效成员/别名;本批撤除的 25 条转发属性即该债务的清偿——不得以「基线计数」「探针便利」等理由保留任何一条或新增同种转发;机检键与卡片契约互斥时实现段一律停卡呈报,不得自造第三条路(code-conventions §1.1 同款)。
@@ -1,209 +0,0 @@
# 需求卡片:同调配装充能域封装批(AdventureRunner 真拆分·副卡)
- 版本:**v1.3**(v1.0→grilling 一轮「回炉」5 阻断全折入→v1.1→二轮「通过附残留」R6/R7/R8 折入→v1.2 定稿→v1.3 领域拆分修订,复核记录见 §12。v1.3=2026-10-27 领域拆分修订——用户裁结构指标=缺陷,闸 09「标准是尺」口径下的还债实现,用户令本会话讨论后修订)
- 来源:[待办清单](../待办清单.md)「AdventureRunner 职责真拆分」条目(2026-10-25 登记,P0,状态=文档设计已闭合+待写卡)(唯一事实源:[architecture](../design/engineering/architecture/architecture.md) v1.16 AttuneLoadout 新件行+「冒险域拆分定稿」节充能单源化句)
- 归属:`game/core/` 新一件(attune_loadout)+run_ledger 整类退役+battle_orchestrator 使用/重置路径+断点旧档迁移
- 排期:未编入(迭代批卡片;估时 ≈1.5–2 个工作日)
- 开工门:U0+复核门过(§12);零待裁点
- **前置卡**:`reports/需求卡片-冒险域拆件与账本实体化批-2026-10-26.md`(主卡)完成合回后方可开工——本卡消费其 RunLedger 瘦身壳与 encounter 多路注入面
## 0. 前置依赖与并行性
- **第〇步核对(2026-10-26 写卡会话)**:来源条目=设计线条目(同主卡),闭合凭据=architecture v1.16,放行。
- **前置卡接口取用**:主卡 T1 产出的主角账件(v1.3 拆分后=HeroStats/GpWallet/GainJournal 三件)与 encounter `"journal"` 键、T3 产出的 ctx 注入面与「关卡开始信号前零发射」头注契约、T4 产出的片段三接口形态——本卡在同形接口上扩展充能域。
- 并行冲突:与主卡串行(硬前置);与「通关口径换代批」(在册 v1.1)真实交叠=**adventure_runner+level_runner 两文件**(该批 C 注释面 adventure_runner 14 处/level_runner 3 处——本卡改其建件接线与 ctx;该批六件清单无 battle_orchestrator)——先后做者 T0 行号复核吸收;其余在册卡零交叠。
## 1. 目标与完成定义
**目标**:同调主动件充能从「字典轨+物化行轨双存、三处差额对账」改为**单源化**——物化行为唯一事实源,新建装备件 AttuneLoadout 拥有同调行并改「事后对账」为「写时种行/补行」;战斗使用与重置路径改指件;旧档读侧以行集为源;RunLedger 整类退役。**游戏行为零变化**(使用管线句柄语义逐位不变)。
**改动单元清单**:
| # | 单元 | 内容 |
|---|---|---|
| k1 | AttuneLoadout 建件 | 装备中的秘宝件对象集(每件内含充能单位/重置周期);种行/补行写时同步 |
| k2 | 双轨退役 | RunLedger.attune_charges 字典轨删除;三差额对账函数退役(adv `_seed_attune_charges` :521-526/level `sync_attune_inventory` :705-715/battle `_reseed_attune_charges` :228-246 改归件方法) |
| k3 | 战斗路径改指 | battle 使用/重置走 loadout 原语(使用管线 validate/相位/fx/overlay/consume 逐位不变) |
| k4 | 断点与旧档迁移 | attunement_charges 键写读归件(键名策略不变);**同调行始终留在 treasure_inventory**(不剥离——使用管线与 C 区投影载体不动);旧档读侧以行集为源 |
| k5 | RunLedger 整类退役 | 全仓零引用+文件删除;encounter `"ledger"` 键移除 |
**完成定义**:
1. k1–k5 落地;全套闸按本批改动域选档全绿;`grep -rn "RunLedger\|run_ledger" game/` 零命中(含注释面随批清与测试直构改指后;.uid 随删)。
2. 同种子改前改后:充能使用全程逐位一致(使用次数/剩余/C 区投影);旧档续玩迁移正确。
3. 撤销证明逐 wr 行;三份产出物;独立验收审计过。
## 2. 设计事实源
| # | 出处 | 取用条款 |
|---|---|---|
| D1 | [architecture](../design/engineering/architecture/architecture.md) **v1.16** | AttuneLoadout 行(物化行为唯一事实源/种行补行写时同步/旧档迁移归件/attunement_charges 键不变);「冒险域拆分定稿」节充能单源化句与 RunLedger 退役句 |
| D2 | 待办清单条目实况 2026-10-26 闭合注记 | 「充能改单源化:物化行为唯一事实源」(审查高危一修正的落定形态) |
| D3 | 主卡契约 1/2/3/4 | 行为零变化/断点冻结/机检纪律/新件红线(同款适用) |
## 3. 现状事实(2026-10-26 写卡会话实查;行号以主卡合回后 T0 复核为准)
| # | 事实 | 出处 |
|---|---|---|
| K1 | 双轨并存:字典轨=RunLedger.attune_charges(item_id→剩余次数);物化轨=treasure_inventory 内 source_class="attunement" 行(每格充能一行,used 标记消耗);两轨靠三处差额对账维持(种子满额→数未用行→差额补行防双份) | `game/core/run_ledger.gd:9`;`adventure_runner.gd:521-526`;`level_runner.gd:705-715`;`battle_orchestrator.gd:228-246` |
| K2 | 战斗使用管线(句柄驱动,全链骑在物化行上):validate_use(:703-717 目标窗口/板界/预读判定)→相位守卫→treasure_used fx 发射(:718-724,掘进蓄能 counter_spend 订阅依赖)→overlay 应用→consume 句柄(:754 消耗标 used)→attune_charge_consume 扣字典(:757 同点双写;行号以 T0 复核为准) | `game/core/battle_orchestrator.gd:703-763` |
| K3 | 重置周期三态:表列 charge_reset ∈ {adventure, battle, level};「已耗 handle 作废+差额补新=回满」语义(:225-227 注释);charges_per_adventure=0=自动兑付件不入使用面(:238) | `battle_orchestrator.gd:225-246`;`data/schemas/treasure_item_table.gd:39/153-154` |
| K4 | 断点:attunement_charges 键(keep_on_null 策略)载字典轨;aux_items 键载库存全量快照(含同调行——两键各存半边) | `adventure_runner.gd:873/927`(主卡合回后为片段面) |
| K5 | RunLedger 瘦身后余面(主卡末态):attune_charges 账+attune_charge_has/set/consume 三原语;battle :381 类型检查、:239/:757 调用点;encounter `"ledger"` 键 | 主卡 u9;`battle_orchestrator.gd:381` |
| K6 | C 区秘宝槽投影=treasure_inventory.query_inventory(含同调行,usable 预判) | `game/core/treasure_items.gd:42-48` |
## 4. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 使用管线句柄语义逐位不变**:validate_use 判据/相位守卫/treasure_used fx 发射时点与载荷/overlay 应用序/consume 的 used 不可逆/重置「已耗作废+差额补新」——全部逐位保留;本卡只改「行归谁种、账归谁记」,不改任何一步的判定与顺序。
🔴 **契约 2 · 物化行为唯一事实源**:物化行保留(禁删行——审查 H1 裁定);删除的是字典轨与事后差额对账;剩余次数=由行的未用数派生(**唯一读法,无影子账**——al2 单源对拍兜底:行派生值=T0 基线字典轨值)。
🔴 **契约 3 · 断点与旧档**:attunement_charges 键名与 keep_on_null 策略不变(写读方换件);**同调行始终留在 treasure_inventory**(aux_items 键值形态逐位不变——逐位一致断言因此成立);旧档读侧以 aux_items 行集为唯一事实源恢复使用面,attunement_charges 键读值仅作一致性校验读数(不符不 fatal、记日志——键值本就派生自行);旧档缺 attunement_charges 键行为不变。
🔴 **契约 4 · 行为零变化与机检纪律**:同种子逐位一致;RNG 零漂移(充能域零随机——实查无 RNG 消费,保持);gdstyle 基线禁改;禁为机检文本保留无效成员(同主卡 §13)。
🔴 **契约 5 · 新件红线**:同主卡契约 4(Core 零 UI/S9/S6/数值零字面量/头注规范)。
## 5. 范围边界
**做**:k1–k5;§8 验收;撤销证明;产出物。
**不做**:
- 同调位槽位判定(attunement.gd 谓词面)——零触碰;
- 秘宝道具(非同调)库存语义、C 区投影形状——零触碰(投影数据源不变,行集不变);
- level_runner 商店委托层、关卡主题——在册条目/不立项(同主卡 §5);
- design/ 与根规则文件 → 反哺点清单。
## 6. 关联文档同步面
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| `design/engineering/architecture/architecture.md` | AttuneLoadout 行标注转现状;RunLedger 相关行/句整段退役注记(「战斗域装配现状」节 RunLedger 条改写);模块表 level_runner/battle 行消费依赖列 ledger 引用句删除 | 反哺点 · 列清单 |
| `design/gdd/systems/跨局循环/秘宝.md` | 若有充能账机制句(T0 核)——双轨描述改单源化 | 反哺点 · 列清单 |
| `game/tests/验证集清单.md` | 充能断言改址同步 | 批内机械同步 |
| `待办清单.md` | 条目状态推进(batch-closure 承接) | 反哺点 · 列清单 |
## 7. 任务卡
### 卡前 · 文件结构图
| 文件 | 职责 | 行为改动 |
|---|---|---|
| `game/core/attune_loadout.gd`(**新增**) | 同调配装件:装备件对象集+充能单位+种行/补行写时同步+断点片段 | 新件(承载迁移态)→ wr1/wr3 |
| `game/core/run_ledger.gd`(**删除**,含 .uid) | 整类退役(瘦壳余面归 loadout/battle 直改后无引用) | 结构改动 → wr4 |
| `game/core/battle_orchestrator.gd`(修改) | 充能原语调用改指 loadout(经 encounter `"loadout"` 键);重置改调件方法;`"ledger"` 键移除;:381 类型检查删 | 结构改动,管线语义不变 → wr1 |
| `game/core/adventure_runner.gd`(修改) | 建件接线(装配集注入 loadout);`_seed_attune_charges` 段退役(改调件种子方法);断点片段装配(attunement_charges 键改收件片段) | 结构改动 → wr3 |
| `game/core/level_runner.gd`(修改) | `sync_attune_inventory` 退役(改调件同步);ctx 增 loadout 键、删 ledger 键 | 结构改动 |
| `game/core/treasure_items.gd`(零改动) | 物化行载体不动(投放/查询接口由件调用) | 非行为改动(零触碰——同调行始终在此) |
| `game/tests/unit/core/feat_vouchers_test.gd`(修改) | `run_ledger.attune_charges` 直写 8 处(:73-75 等)改指件测试构造面 | 测量面改址 → wr1/wr4 |
| `game/tests/unit/core/treasure_effects_test.gd`(修改) | :275 RunLedger 直构改指 | 测量面改址 → wr2 |
| `game/tests/unit/battle/round_flow_skill_pool_test.gd`(修改) | :969/994 直构与 encounter 注入改指 | 测量面改址 → wr2 |
| `game/tests/unit/core/meta_progression_forge_test.gd`(修改) | :290-291 直构改指 | 测量面改址 → wr2 |
| `game/core/effect_engine.gd`/`effect_context.gd`(修改) | 注释中 RunLedger 表述随批清(零行为) | 非行为改动 |
### 接口块
**AttuneLoadout(`game/core/attune_loadout.gd`)**
```gdscript
class_name AttuneLoadout extends RefCounted
func _init(db_ref: ConfigDb, attunement_ids: Array) -> void # 装配集注入(活引用语义同主卡契约 6)
# ---- 种行/补行(写时同步,替代三处事后差额对账)----
func seed_for_adventure(inventory: TreasureItems) -> void # 冒险开始:全部 active_charged 件种行(**不筛周期**——承现 _seed_attune_charges 全量种账+sync 全量投行语义;battle/level 周期件开局即有行,C 区投影行数不变)
func reset_cycle(cycle: String, inventory: TreasureItems) -> void # battle/level 周期回满(**按周期筛**;已耗行作废、差额补新——语义逐字承 :228-246)
# ---- 使用面(战斗路径改指)----
func consume_charge(item_id: String, inventory: TreasureItems) -> bool # 承 attune_charge_consume(一行标 used)
# ---- 读面 ----
func charges_left(item_id: String, inventory: TreasureItems) -> int # 剩余(未用行派生——唯一读法,无影子账)
func item_ids() -> Array
# ---- 断点片段 ----
func breakpoint_fragment(inventory: TreasureItems) -> Dictionary # attunement_charges 键(值形状=现字典轨 {item_id:剩余}——由行派生,键名/策略不变)
func restore_fragment(frag: Dictionary, inventory: TreasureItems) -> void # 旧档:以行集为源恢复使用面;frag 键值仅校验读数(不符记日志不 fatal);缺键保持种子态(原语义)
```
**battle_orchestrator 改指**:`begin_battle` encounter 删 `"ledger"` 键——桶挂链走主卡已建的 `"adv_bucket"` 键(:382 改指已完成于主卡 T1,本卡零动作)、`"hero"` 键沿用;encounter 增 `"loadout": AttuneLoadout` 键;`_reseed_attune_charges(reset)` 改调 `loadout.reset_cycle(reset, treasure_inventory)`(:228-246 语义逐字承);使用点 `:757` 改 `loadout.consume_charge(...)`;`:239` 充能设定改种行路径;`:381` ledger 类型检查与 `RunLedger.new()` 兜底删除。
**测试直构面改址(grilling 一轮补查)**:treasure_effects_test:275、round_flow_skill_pool_test:969/994(`load("res://core/run_ledger.gd").new()` 直构+encounter "ledger" 注入)→ 改直构主角账件+`"journal"`/`"adv_bucket"` 键注入(v1.3——原 `"hero"` 键随主角账三件拆分换代);meta_progression_forge_test:290-291 同款;effect_engine.gd:94/effect_context.gd:3 注释中 RunLedger 表述随批清(注释面,非行为)。
**主卡接口取用**:主角账件(v1.3 拆分后=HeroStats/GpWallet/GainJournal 三件——充能交互零涉及)、ctx 注入面(本卡扩两键)、片段三接口形态(本卡同形扩展)。
### 落位与可复用性预检
| 新增件 | 复用面 | 唯一面 | 分层与交互 |
|---|---|---|---|
| attune_loadout.gd | 既有 attunement.gd=槽位判定谓词(职责不同不可复用);treasure_items.gd=库存载体(行归它管、不归件管——件持投放与判定,行数据仍单点在库存);grep `attune_loadout/AttuneLoadout` 零命中 | 同调行投放/充能判定/周期回满唯一所有者;与 attunement.gd 词形区分明确 | Core 纯逻辑;由 adventure_runner 建件注入 encounter 与 level ctx;零随机(K4 承)、零 UI |
### T0 事实坐实(≈0.15d)
- [ ] 复核 K1–K6 行号(主卡合回后坐标);记录改前读数:同种子三关冒险的充能使用全程记录(种子/使用次数/各停点剩余/C 区投影行数)——wr1 对拍基线。可核查结果:基线表进实现报告素材。
### T1 AttuneLoadout 建件+双轨退役(≈0.6d)
- [ ] 实装 attune_loadout.gd(接口块全签名;种行/补行/使用面——语义逐字承三处对账函数与原语)。
- [ ] 三处对账退役:adv `_seed_attune_charges` 改调 `seed_for_adventure`;level `sync_attune_inventory` 改调件同步(或并入 reset_cycle 调用点);battle `_reseed_attune_charges` 改调 `reset_cycle`;RunLedger attune 三原语调用清零。
- [ ] 验收步骤:〔al1〕单测——三周期回满语义(adventure 全量种行+battle/level 按周期回满各态:已耗行作废、差额补新、charges=0 件不入使用面——判据值承现役断言)+**开局投影行数断言**(seed 后 C 区行集与改前同构——周期件开局即有行);〔al2〕**单源对拍断言**——`charges_left`(行派生)=T0 基线字典轨终值(改前采集),逐件逐停点相等。撤销证明见 wr1。
### T2 战斗路径改指+RunLedger 退役(≈0.5d)
- [ ] encounter 键换代(+loadout/−ledger);battle 三点改指(:239/:757/:381 承址);使用管线其余步骤零触碰(契约 1)。
- [ ] RunLedger 文件删除(全仓 grep 零引用为前置;.uid 同删)。
- [ ] 验收步骤:〔al3〕使用真链断言——真实冒险驱动同调件使用,**六步各一条**(validate 拒绝/validate 受理/**相位守卫拒绝(非 Active 拒用)**/fx 发射/overlay 应用/used 不可逆),现役断言继承改指;〔al4〕源码断言 `RunLedger|run_ledger` 全仓零命中〔配装批 V4〕。撤销证明见 wr2。
### T3 断点片段+旧档迁移(≈0.4d)
- [ ] attunement_charges 键写读归件(值由行派生——键值形态不变);旧档读侧以行集为源(键值仅校验读数——契约 3)。
- [ ] 验收步骤:〔al5〕同种子改前改后断点逐位一致(27 键全量——同调行留库存故 aux_items 值不变;承主卡 bp1 载体复跑);〔al6〕旧档读侧断言——构造含同调行的旧断点档,续玩后使用面充能=行集派生值、行集与改前一致(键值校验读数落日志)。撤销证明见 wr3。
### T4 撤销证明+产出物落位卡(≈0.15d,末卡)
- [ ] 逐 wr 行撤销证明;三份产出物(实现报告〔对拍基线表+读数〕/代拍板追认单/反哺点清单)。
- [ ] 合并前置:独立验收审计(§8.3)逐行「通过」。
**估时合计 ≈1.8d**(区间 1.5–2)。
## 8. 验证闸
### 8.1 改动—验收对照表
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销证明 |
|---|---|---|---|---|---|
| wr1 充能单源化(种行/补行/使用面) | attune_loadout 新件+三对账退役 | 〔al1〕周期回满单测+〔al2〕单源对拍断言(行派生=基线字典轨值)〔配装批 V1〕 | 单元 | 件直构单测+冒险真链驱动 | 回退种行 hunk→al1 红 |
| wr2 战斗路径改指+RunLedger 退役 | battle 三点改指+文件删除 | 〔al3〕使用真链断言+〔al4〕零引用源码断言〔配装批 V2〕 | 接口+集成+冒烟源码断言 | 真实冒险驱动同调件使用 | 回退 encounter 键 hunk→al3 红;al4 随文件复现红 |
| wr3 断点片段+旧档读侧 | attunement_charges 键归件+行集为源读侧 | 〔al5〕27 键逐位一致+〔al6〕旧档行集为源断言〔配装批 V3〕 | 集成 | 同种子双跑+构造旧档续玩 | 回退片段 hunk→al5 红 |
| wr4 产出物 | T4 三份 | 件核〔wr4〕 | — | — | 缺项红 |
### 8.2 测试削弱申报
零(改址与退役文件的断言迁移,语义逐条保持;RunLedger 相关既有断言随 al1/al3 承接改写路径,判据值不变)。
### 8.3 独立验收审计
入口=未参与实现的会话或子代理;报告落 `reports/iter<N>-验收审计-<日期>.md`;抽查重点=使用管线六步逐位核(validate/fx/overlay/consume 时点)、旧档迁移映射逐行、RunLedger 零引用复核、对拍基线表在案。未过不得合并。
## 9. 异常分级
- **L1(自救)**:行号漂移;迁移映射的等价写法。
- **L2(记录继续)**:注释措辞。
- **L3(停机呈报)**:使用管线任一步判定/顺序变化(契约 1 破);断点逐位一致红;发现非充能域的 RunLedger 残留依赖(越主卡范围)。
## 10. 代拍板白名单(超清单必呈报)
1. 提交切分与 worktree 分支命名。
2. 种行/补行的内部组织(语义不变前提下)。
## 11. 待裁点
**零待裁点,开工门=U0。**(设计裁点已闭合于 architecture v1.16;本卡无新增裁量面。)
## 12. 自审六查与复核记录
**自审六查(2026-10-26 写卡会话)**:①规格覆盖——k1→T1/wr1、k2→T1/wr1、k3→T2/wr2、k4→T3/wr3、k5→T2/wr2、产出物→T4/wr4;②步骤扫描——无「TBD/酌情」行;③类型一致性——接口块与 T 卡引用逐字一致,主卡取用面(ctx/片段形态)与主卡接口块对齐;④审查焦点——使用管线逐位不变(契约 1+al3 六步含相位钉)与旧档读侧(al6)为最可能坑点;treasure_items 零触碰行已在结构图标「非行为改动」;⑤篇幅比例——签名与断言,无实现体;⑥落位预检——新增一件有不能复用理由(attunement 槽位谓词职责不同、treasure_items 是载体非所有者),唯一落点已答。
**grilling 一轮复核记录(2026-10-26,独立子代理对抗复核,判「回炉」——阻断 5 条(编号9–13)+关联建议,v1.1 全数折入)**:⑨aux_items「剥离迁移」与逐位一致/禁删行三方互斥 → 口径裁死「同调行始终留库存」,迁移重定义为键写读归件+旧档读侧行集为源(键值仅校验读数),契约 3/k4/接口块/al5/al6 同步改写;⑩seed 筛周期与现状矛盾(battle/level 周期件开局即有行)→ seed_for_adventure 改全量种行不筛周期+开局投影行数断言;⑪RunLedger 退役后桶链无源 → encounter "adv_bucket" 键沿用主卡(:382 已改指)写明零动作;⑫grep 零命中不可达+「零交叠」不实 → 结构图补 treasure_effects/round_flow_skill_pool/meta_progression_forge 三测试与 effect_engine/effect_context 注释清,并行注记补通关批交叠;⑬charge_available 承接零调用点原语+两读法未定义 → 删该接口、al2 改「行派生值=T0 基线字典轨值」单源对拍断言。建议级折入:al3 补相位守卫钉、K2 行号小漂注(consume :754/attune :757)。
**二轮闭合复检(2026-10-26,同一独立子代理)**:判「通过(附残留,无新阻断)」——5 阻断全核闭合、「键值仅校验读数与零行为变化」边界判自洽。残留 R6/R7/R8 已折入 v1.2:R6 契约 2 旧句(两读法兜底)删、wr1 列改单源对拍、§1 目标句旧措辞(同调行迁移)改「旧档读侧以行集为源」;R7 结构图补 feat_vouchers_test 充能直写 8 处改指行;R8 并行注记事实订正(通关批 C 面六件无 battle_orchestrator,真实交叠=adventure_runner+level_runner)。
**领域拆分修订动因(2026-10-27,v1.3——用户令本会话讨论后修订)**:主卡 v1.3 领域拆分(用户裁「结构指标=缺陷」还债实现)把主角账 HeroLedger 拆为 HeroStats/GpWallet/GainJournal 三件、battle encounter `"hero"` 键换代 `"journal"`——本卡对主卡产物的取用面(前置卡接口取用句、测试直构改址行、接口取用行)随换代同步改写;本卡自身范围(AttuneLoadout 建件、RunLedger 退役、使用管线逐位不变)零改动。
## 13. 禁为机检文本保留无效成员(重构类必填条款)
同主卡:禁止为迎合机检消息文本保留或新增无效成员/别名;RunLedger 的删除不得以任何「基线便利」理由拖延或保留空壳;机检键与契约互斥时停卡呈报(code-conventions §1.1 同款)。
@@ -1,213 +0,0 @@
# 需求卡片:技能池情境条件触发器批
> 来源:待办清单「技能池情境条件触发器」条目(2026-10-18 登记)
> 唯一事实源:design/gdd/systems/战斗循环/敌人系统.md v1.2 §核心规则「触发条件」节(2026-10-26 文档设计已闭合;v1.0 立节·v1.1 单体寻址批随动·v1.2 百分比事实读数定阈值式——本卡依 v1.2)+ §技能行字段词汇表 trigger 行+ §池构成纪律+ §意图线索(半血解锁弹出规格)
> 估时:≈3 个工作日(T0 0.4/T1 0.7/T2 0.8/T3 0.4/T4 0.7)
> 状态:v1.2 定稿——grilling 两轮复核(一轮回炉:2 阻断+8 应修+5 建议全折入,含设计文档 v1.2 阈值式联动修订;二轮通过,附残留 R1-R5+S1-S3 已全部折入),零待裁点
## 一、目标与完成定义
**做什么**:把敌人系统 v1.2 定稿的触发条件机制实装——技能行加 `trigger` 字段({fact, op, value, latch} 封闭词表),开轮摇号前对每敌求值,条件不满足的技能不进可摇集合与保底集合(门槛过滤);三 Boss 半血解锁技 `unlock_hp_pct` 收编为闩型首用例(行为零变化);两个示范投放(地精池低血防御增益、钩爪恐魔池停手偷袭伤害技);事实面供给埋点(轮次/上轮结束方式/踩雷计数)。
**完成定义**:
1. 六事实词+六算子求值器全实装,fact/op 出域与 latch 语义加载期校验,缺省无 trigger 字段=旧行为零变化。
2. 三 Boss 解锁技(quake_smash/venom_curb/rockslide)迁移后同种子战斗行为逐位复现(解锁时点/归因行/enemy_hp_threshold 事件全部保持)。
3. 新池构成纪律「每池至少一行无条件特殊技」入跨表校验。
4. 两示范投放真实入口可验(低血时防御技可摇出、上轮停手后偷袭技可摇出)。
5. 验证闸对照表全行绿,独立验收审计通过。
## 二、设计事实源
- `design/gdd/systems/战斗循环/敌人系统.md` v1.2(2026-10-26 文档设计闭合凭据,与待办清单条目实况所记一致):
- §核心规则「触发条件:情境技与闩型解锁共用一套门槛」——机制(门槛过滤/求值时点/字段四键/闩语义/事实词表六词/算子六词与百分比阈值式求值/互作用表/半血解锁收编/首批落地);
- §技能行字段词汇表 trigger 行(字段域);§池构成纪律(每池至少一行无条件特殊技);§调参表技能表 trigger 行(投值归难度曲线与Boss);§验收标准触发条件条。
- 数值投值(权重/阈值终值)所有权:`design/gdd/systems/冒险循环/难度曲线与Boss.md` v1.0「技能池投值」节——本批只投 provisional 示范值。
## 三、现状事实(开工自行复核)
| # | 事实 | 位置 |
|---|---|---|
| 1 | 实例池快照:skill_id/weight/cooldown_left 三键+unlock_hp_pct 快照与 unlocked 闩标记 | game/core/unit_container.gd:84-96 |
| 2 | 锁定判定 `_entry_locked`(unlock_hp_pct 且未过闩=锁定) | game/core/unit_container.gd:137-138 |
| 3 | 可摇集合 `rollable_skills`(排除锁定+冷却中) | game/core/unit_container.gd:143-153 |
| 4 | 保底特殊技集合 `special_skills`(排除锁定;type≠basic) | game/core/unit_container.gd:158-169 |
| 5 | 半血解锁闩检查 `check_skill_unlocks`:threshold=round(max_hp×pct/100),hp≤threshold 过门、单向闩、返回新解锁 skill_id 列表 | game/core/unit_container.gd:172-186 |
| 6 | 开轮摇号 `_roll_round_actions`:保底判定→roll→behavior_roll 统一流逐敌摇定→tick_cooldowns | game/core/battle_orchestrator.gd:952-991 |
| 7 | 解锁归因明细行(skill_unlock 高光键)+enemy_hp_threshold 事件发射+target_attack_bonus 施加(pct 从池条目读) | game/core/battle_orchestrator.gd:962-983 |
| 8 | round_index 编排器自有(1 基,开战置 1,轮末递增) | game/core/battle_orchestrator.gd:44,435,1083 |
| 9 | 上轮结束方式记录 `_last_round_end={path_tag, continuation_hint}`,path_tag∈{cleared,stopped,ap_exhausted};`last_round_end` 只读属性已有 | game/core/action_economy.gd:32-34,274 |
| 10 | 技能表 schema:行字段校验+pity_threshold;无池视野(池构成纪律在跨表通道) | game/data/schemas/skill_table.gd:3,19-97 |
| 11 | 敌人表 schema:池条目 weight 校验+unlock_hp_pct 域校验 [1,99] | game/data/schemas/enemy_table.gd:108-116 |
| 12 | 跨表池构成纪律校验(每池恰一普攻/增益≤1/妨害≤1/skill_id 悬空) | game/core/config_db_cross_validator.gd:117-156 |
| 13 | 现行 8 处 unlock_hp_pct:50 池条目:quake_smash(:148,:176)/venom_curb(:416,:447)/rockslide(:659,:687,:715,:743) | game/data/tables/enemy.tres |
| 14 | 三解锁技技能行(quake_smash ×2.5/CD4 · venom_curb ×2.0/CD3 · rockslide ×2.5/CD4) | game/data/tables/skills.tres:67,73,79 |
| 15 | 地精池现状:attack w9+lunge w1(无增益行——加增益技不违 ≤1);钩爪恐魔池现状:attack w6+bite w2+charge w1(charge 是增益——加伤害技合规) | game/data/tables/enemy.tres:19-25,490-501 |
| 16 | blast 分支统一受理点——**不只过雷**:负向 enemy_alert(雷,reward.tres:90)与正向 spark_aoe(:28)、清图奖励 clear_blast(:110)同走此分支;mines 计数埋点必须加「负向 blast(雷)」守卫,否则正向爆裂格误计入踩雷数 | game/core/battle_orchestrator.gd:861+game/data/tables/reward.tres:28,90,110 |
| 17 | 既有测试锚:skill_unlock_test.gd(门谓词/闩不可逆/双面过滤/保底不逼/零扰动/确定性,期望值由表读值推导);round_flow_skill_pool_test.gd V4 池构成纪律复查 | game/tests/unit/battle_settlement/ |
| 18 | 单测 manifest 显式注册制(新单测须登记行) | game/tests/run_all.gd:40-49 |
| 19 | 减伤状态行先例:fortify(target_side enemy / magnitude −50 / percent / duration 2 / refresh / max_stack 1) | game/data/tables/status_effects.tres:71-79 |
| 20 | 编排器经 action_economy 只读属性取上轮读数先例(ap_exhausted_last) | game/core/battle_orchestrator.gd:104 |
## 四、设计契约(🔴=违反即 L3 停机呈报)
1. 🔴 **门槛过滤唯一语义**:trigger 只作可摇集合排除项(rollable 与 special 双面);禁权重改写、禁强制触发、禁保底逼出条件不满足的技。摇号公式(权重份额归一)与 `behavior_roll` 流消费序零漂移。
2. 🔴 **三 Boss 迁移零变化**:迁移后同种子战斗事件序列(解锁时点/归因行文本/enemy_hp_threshold 载荷)与迁移前逐位一致(target_attack_bonus 施加值不经本批改动面,由 V4 载荷 pct 键+V5 对拍承载)。百分比事实求值=阈值式(v1.2):先把 value 折算为绝对阈值 `round(对应 max_hp × value/100)`、再与当前 hp 作算子比较——六算子都在该阈值上定义,lte 与原解锁式逐位同;禁改为百分比读数取整后比较(取整读数与零变化在非整除血量上互斥)。
3. 🔴 **求值时点**=每轮开轮摇号前、读当时快照;逐敌事实各自求值、全局事实全场一份;本系统零随机纪律不变。
4. 🔴 **缺省零扰动**:无 trigger 字段的技能行与无 trigger 池条目行为逐位不变;旧表(除三 Boss 迁移行与两示范行外)零改动。
5. 🔴 **fail-fast**:fact/op 出域、value 越域、latch 非布尔、键白名单外的 trigger 键——加载期报错并止动;新池构成纪律违规(每池无条件特殊技行数=0)同。
6. 🔴 **数值单点**:trigger 行值与示范投放值只落 `game/data/tables/*.tres`;禁代码内数值字面量(表读值推导断言先例=skill_unlock_test)。
7. 🔴 **每池增益≤1 纪律不动**:desperate_guard 计入地精池增益预算(现状 0→1 合规);sneak_ambush 为伤害技不计入。
8. **闩型保留解锁弹出规格**;非闩型(瞬态)条件技零弹出、零新增呈现(明细行具名即因果承载——敌人系统「意图线索」节)。
9. latch=true:首次求值真后整场保持为真(治疗抬血不回锁);latch 缺省=false(每轮重求值)。
## 五、范围边界
**做**:trigger 字段全套(schema/校验/求值/过滤/闩);三 Boss unlock_hp_pct 迁移;两示范投放+一个新减伤状态行;四项事实面供给(round_index/last_round_end/mines_hit_last/mines_hit_total)+self_hp_pct/hero_hp_pct 容器内直读;跨表新纪律;测试面与验证集清单重生成。
**不做**(去向):
- hero_hp_pct/round_index/mines_hit_* 四词的投放数据行——机制承载即可,首批无投放内容(后续内容批)。
- 权重改写/强制触发形态——设计已淘汰(2026-10-26 设计段裁决记录)。
- 呈现新增(toast/归因标注)——非闩型零弹出;玩家反馈「感知不到因果」时另立批。
- 全局特殊间隔旋钮、个体化变体池——待办清单独立条目,本批不触。
- 数值终值投值——难度曲线调参批;本批示范值全标 provisional。
## 六、关联文档同步面(实现批禁写 design/ 与根规则文件,全部列反哺点)
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| design/gdd/systems/战斗循环/敌人系统.md v1.2 | §P1 表「情境条件触发器」行标注「设计已闭合待实装」→ 实装后应改「已实装(日期)」;§半血解锁收编段「字段换代与行值迁移归实装批」句随迁移完成摘除 | 反哺点:iterN-反哺点清单,文档批落文 |
| design/gdd/systems/战斗循环/战斗结算.md v1.0 | 开轮摇号排除句已含触发条件指针——查实装后无新陈述漂移则记「无需改」 | 反哺点清单记行(结论「无需改」亦成行) |
| design/engineering/architecture/architecture.md | UnitContainer 新公开方法(check_trigger_unlocks/事实组包口径)若属 API Boundaries 登记面 | 反哺点:架构登记行,文档批落文 |
| design/gdd/systems/冒险曲线域(难度曲线与Boss.md v1.0) | 触发条件行值随实装登记读表口径——正文已写机制指针,无陈述变更 | 无需改(查无漂移则记「无」) |
| 待办清单.md | 条目「技能池情境条件触发器」实现完成后的退役 | 收尾段义务(batch-closure),非实现批面 |
| 体验验证清单.md | 停手被偷袭/低血防御的实机目检观测项入册 | 反哺点:入册观测项一条,文档批落文 |
| game/tests/验证集清单.md | 新增断言全体入册 | 随批重生成(tools/extract_checks.py,机械产物) |
## 七、落位与可复用性预检
| 新增件 | 复用面判定 | 唯一面与分层 |
|---|---|---|
| 求值器(UnitContainer 内) | 不复用 effect_engine 的 FACTS/OPS:那边求值面=事件现场 payload,本面=开轮快照,语义不同;**复用的是校验范式**(封闭枚举 const+validate 出域 errs+键白名单——effect_words 同款) | 求值谓词归敌人系统语义层(unit_container,check_skill_unlocks 先例同构:谓词在容器、调用时点在编排器);词表常量落 skill_table.gd(表 schema 是字段域权威——敌人系统「调参表」) |
| trigger schema 校验 | 复用 skill_table.validate() 既有 errs 模式(domain/enum/cross_field 类别) | 技能行字段校验在 SkillTable;池构成新纪律在 config_db_cross_validator.gd(池视野唯一处)——两处职责既有分界不动 |
| mines 计数(本场累计+上轮值+当轮累计) | grep 全仓无现成战斗域踩雷计数(effect_engine fx_counters 是秘宝效果账,职责不同不复用);blast 受理点 :861 经**负向 blast(雷)守卫后**即每雷恰一次必经点 | battle 域编排事实,落 battle_orchestrator 私有状态(begin_battle 清零/负向 blast 受理累加/轮末转存 last——round_index 同款生命周期) |
| round_index/last_round_end 事实 | 直接复用编排器 :44 与 action_economy.last_round_end :33(零新增状态) | facts 组包在编排器开轮摇号前一次成型(:104 ap_exhausted_last 组包先例同构) |
| desperate_guard/sneak_ambush 技能行+defensive_stance 状态行 | 状态行复用 fortify 的消费路径(enemy_defense 池乘区——零新消费面);不复用 fortify 行本身(设计段裁「不复用硬化」) | 行落 tres 表本体;display_name 中文白话(「孤注守势」「趁隙偷袭」) |
| trigger_cond_test.gd 新单测 | 复用 test_kit(Kit.check/finish)与 skill_unlock_test 的表读值推导范式 | 落 tests/unit/battle_settlement/,manifest 登记(run_all.gd 注册制) |
## 八、验证闸(改动—验收对照表)
尾缀〔触发器批 Vn〕;撤销证明=回退该 hunk→跑最窄套件→断言红→还原复绿。
| # | 需求点 | 改动 | 验收测试 | 层级 | 真实入口 | 撤销证明 |
|---|---|---|---|---|---|---|
| 1 | trigger 立列+出域拒绝 | skill_table.gd 加 TRIGGER_FACTS/TRIGGER_OPS/TRIGGER_KEYS 常量+validate 校验段 | V1 正反六反例(fact 出域/op 出域/键白名单外/latch 非布尔/last_round_end 配非 eq·neq 算子/枚举事实 value 非法串均报错;合法行零 error)——trigger_cond_test.gd | 单元 | db.load_tables 真实加载含构造行夹具表 | 删校验段→V1 红 |
| 2 | 门槛过滤双面 | unit_container rollable_skills/special_skills 增条件排除 | V2 断言:条件假时 rollable 与 special 均不含该技;条件真时含——trigger_cond_test.gd | 单元 | spawn 真实表→直调 rollable/special | 回退过滤→V2 红 |
| 3 | 保底不逼条件不满足技 | _roll_round_actions 保底集合取 special_skills(已含排除) | V3 断言:合法构造池(无条件特殊技 A w1+条件假技 B w9999+普攻)basic_streak≥M 时,保底命中摇出的是 A——夹具经加载后内存改行(round_flow:637 白盒先例)注入;固定种子下确定性断言 | 接口 | special_skills 真实入口+SkillLottery.draw 真实摇号 | 回退 special 排除→选定经试跑验证使撤销态摇出 B 的固定种子(w9999 份额 99.99%,种子验证后钉死)→同种子必中 B→红 |
| 4 | 闩型语义+归因保持 | check_skill_unlocks 改 check_trigger_unlocks(u, facts):self_hp_pct lte 闩型,返回新过闩列表 | V4 断言:过门恰一次、治疗抬血不回锁、enemy_hp_threshold 载荷三键(unit/pct/is_boss)保持——trigger_cond_test.gd+skill_unlock_test.gd 换代断言(迁移后跑原语义);阈值式判别由 V8 同数据两态承载(hp=3 触发/hp=4 不触发),本行不重复构造 | 单元+接口 | spawn 三 Boss 坐标真实表→直调→编排器事件断言(载荷观测带处刑台订阅夹具——adventure_feats_test 先例) | 回退闩标记→V4 红 |
| 5 | 三 Boss 迁移零变化 | enemy.tres 删 8 处 unlock_hp_pct+skills.tres 三行加 trigger{self_hp_pct,lte,50,latch:true} | V5 同种子对拍:固定种子 Boss 战事件序列摘要(解锁时点/归因行文本/载荷)迁移前后逐位一致——trigger_cond_test.gd 存基线比对 | 集成 | begin_battle→逐轮 settle 真实战斗驱动 | 删 skills.tres 三行 trigger 键(表迁移半边)→check_trigger_unlocks 读不到条件→闩永不置→V4/V5 红 |
| 6 | 事实面供给 | 编排器 facts 组包(round_index/last_round_end/mines_hit_last/mines_hit_total)+计数埋点(负向 blast 守卫累加/轮末转存/开战清零) | V6 断言:真实踩雷(负向 blast)递增、**正向 blast 格(spark_aoe)与清图奖励(clear_blast)不递增**、轮末转存、开战清零;facts 组包四键在位——trigger_cond_test.gd | 集成 | 真实 request_dig→settle 驱动踩雷与正向爆裂格 | 回退累加行→V6 红;漏守卫→反例断言红 |
| 7 | 每池至少一行无条件特殊技 | config_db_cross_validator 加校验 | V7 正反:现行全表零违例;构造全条件池夹具→报 pool_composition 错——trigger_cond_test.gd | 接口 | 跨表校验真实入口 | 删校验段→V7 反例不红 |
| 8 | 示范投放:低血防御 | skills.tres desperate_guard 行(buff/defensive_stance/duration 2)+status_effects.tres defensive_stance 行+地精两行池条目 w1+trigger{self_hp_pct,lte,35} | V8 断言:地精(hp 基线 8)按阈值式 T=round(8×35/100)=3——hp>3 时该技不入可摇集合、hp≤3 后入池可摇中——trigger_cond_test.gd | 集成 | spawn 地精行→压 hp→开轮摇号真实路径 | 删池条目→V8 红 |
| 9 | 示范投放:停手偷袭 | skills.tres sneak_ambush 行(damage ×1.5/CD4)+钩爪恐魔三行池条目 w2+trigger{last_round_end,eq,"stopped"} | V9 断言:首轮(last=无)与 cleared/ap_exhausted 轮后该技不入集合;stopped 轮后入集合——trigger_cond_test.gd | 集成 | 真实 finish_round_stop→次轮摇号 | 删池条目→V9 红 |
| 10 | 缺省零扰动 | trigger 全套对无字段行为零影响 | V10 断言:无 trigger 行的池快照逐键无新增(快照键策略钉死:无 trigger 行快照零新键)、摇号结果同种子不变——skill_unlock_test.gd 既有 _test_plain_rows_zero_drift 扩展 | 单元 | goblin 池真实快照 | 回归钉(防未来给普行塞键),撤销语义由 V2/V5 联合覆盖——如实申报,不单独配撤销 |
**测试方式两分法**:V1-V10 全部走调试接口直改数据面(构造夹具表/直改 hp/直发 finish_round_stop),归自动化;实机目检项=「上轮停手→下轮结算明细出现『趁隙偷袭』」「地精低血后摇出『孤注守势』」两项,登记实现报告实机目检总清单+体验验证清单反哺点,**登记不阻塞**。
**闸口径**:本批改动含 game/ 行为载体→按改动域跑 `tools/run_all_gates.sh` 对应域档全绿才合并;里程碑步(T 段)出口跑一次全套,波内修复只做出红最小单元最窄确认,新增测试先行孤立验证再并入。
**测试削弱申报**:①skill_unlock_test.gd 既有断言因 unlock_hp_pct 字段退役需改写读值来源(表读值路径从池条目改技能行 trigger)——断言语义全部保持,仅数据源换代;②round_flow_skill_pool_test.gd :604 expect_pools 逐行精确比对——地精两行与钩爪恐魔三行的期望值随 T3 投放改写(9/1→9/1/1、6/2/1→6/2/1/2),断言语义不变仍精确比对,消息串中「unlock_hp_pct 50」措辞随字段退役同步清理;③round_flow:654/:660 直调 rollable_skills(u) 原样保留(缺省参下单参调用合法,实现若取改仅限直调面补参);④round_flow V4 池纪律复查段随新纪律扩行(只增不删)。除此之外零删除断言。
**独立验收审计**:入口=没参与实现的子代理;报告落 `reports/iter<N>-验收审计-<日期>.md`;审计三查(对照表逐行/撤销证明抽查复现/削弱检查)未过禁合并。
## 九、任务卡
### 卡前·文件结构图
| 文件 | 职责 | 行为改动 | 验收行 |
|---|---|---|---|
| game/data/schemas/skill_table.gd(改) | trigger 词表常量+行校验 | 行为改动 | V1 |
| game/core/config_db_cross_validator.gd(改) | 每池至少一行无条件特殊技 | 行为改动 | V7 |
| game/core/unit_container.gd(改) | 快照 trigger/闩标记、双面过滤、check_trigger_unlocks 求值 | 行为改动 | V2/V4/V10 |
| game/core/battle_orchestrator.gd(改) | facts 组包、mines 计数埋点、解锁调用迁移 | 行为改动 | V4/V5/V6 |
| game/data/tables/skills.tres(改) | 三 Boss 行加 trigger+两新技能行 | 行为改动 | V5/V8/V9 |
| game/data/tables/enemy.tres(改) | 删 8 处 unlock_hp_pct+五处示范池条目 | 行为改动 | V5/V8/V9 |
| game/data/tables/status_effects.tres(改) | defensive_stance 新行 | 行为改动 | V8 |
| game/tests/unit/battle_settlement/trigger_cond_test.gd(新增) | V1-V10 主体 | 新增测试 | 全行 |
| game/tests/unit/battle_settlement/skill_unlock_test.gd(改) | T1 段随改名/签名/读值源换代(语义零变化)+零扰动扩展 | 测试维护 | V4/V10 |
| game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd(改) | V4 池纪律复查扩行+expect_pools 期望值随投放改写+直调面 facts 适配 | 测试维护(含申报②③) | V7 |
| game/tests/run_all.gd(改) | manifest 登记新套件 | 非行为改动(注册表) | — |
### T0 · 基线录制与表/ schema 迁移(≈0.4d)
取用:无(首卡)。
产出:`TRIGGER_FACTS := ["self_hp_pct","hero_hp_pct","round_index","last_round_end","mines_hit_last","mines_hit_total"]`、`TRIGGER_OPS := ["eq","neq","gt","gte","lt","lte"]`、`TRIGGER_KEYS := ["fact","op","value","latch"]` 三常量(skill_table.gd);skills.tres 三 Boss 行 trigger 落位;enemy.tres 8 处键删除;V5 基线文件。
- [ ] 步骤 1(基线录制):迁移前用固定种子驱动三 Boss 各一场真实战斗(begin_battle→循环 settle 至战斗结束),把事件序列中 skill_unlock 归因行文本、enemy_hp_threshold 载荷、每轮各敌 pending_skill 序列摘要落 `game/tests/evidence/trigger_baseline.md`(批内凭据,非长期基线)——这是 V5 的「改前」半边。
- [ ] 步骤 2(schema 校验段):skill_table.validate() 加 trigger 校验——四键白名单、fact∈TRIGGER_FACTS、op∈TRIGGER_OPS、**last_round_end 行 op 只许 eq/neq(枚举算子限域)、value 类型随 fact(数值事实必整数、百分比事实域 [1,99]、枚举事实必枚举串 {none,cleared,stopped,ap_exhausted})**、latch 必须 bool;普攻行禁配 trigger(普攻恒可摇的结构前提,与倍率/冷却禁配同款 cross_field)。V1 正反断言随本步骤落地(trigger_cond_test.gd 于本卡立件——V1 是本批首组断言,含算子限域与类型分派反例,先行孤立验证后并入 manifest)。
- [ ] 步骤 3(表迁移):skills.tres quake_smash/venom_curb/rockslide 三行加 `"trigger": {"fact":"self_hp_pct","op":"lte","value":50,"latch":true}`;enemy.tres 删 8 处 `"unlock_hp_pct": 50` 行;enemy_table.gd:111-116 unlock_hp_pct 域校验段删除(字段退役);**enemy.tres:780 池注与 skills.tres:134-135 头注提及 unlock_hp_pct/解锁语义的措辞随字段退役同步清理**(J 面:注释不残留退役字段名)。
- [ ] 步骤 4(加载验证):`python tools/run_smoke.py` 绿(表加载零 error——若红,红点即迁移漏项)。
### T1 · 求值器与实例池快照(≈0.7d)
取用:T0 的 TRIGGER_* 常量与已迁移表。
产出:`UnitContainer.check_trigger_unlocks(u: Dictionary, facts: Dictionary) -> Array`(闩型条目求值,返回新过闩 skill_id 列表)、快照键 `trigger_latched: bool`(迁移原 unlocked);`rollable_skills(u, facts := {}) / special_skills(u, facts := {})` 增可选参(**缺省空字典——既有单参调用零破坏,skill_unlock_test/round_flow 直调面在 T2 前不红**)。
- [ ] 步骤 1(快照扩展):池快照循环节(unit_container.gd:85-96)——从 db.skill_row 读 trigger 存快照(技能行是字段权威);带 latch=true 行写 `trigger_latched:false` 初始;unlock_hp_pct/unlocked 双键退役。**百分比事实求值契约(v1.2 阈值式)在此钉死:六算子统一为「先折算绝对阈值 T=round(对应 max_hp × value/100),再以 hp op T 比较」——self_hp_pct/hero_hp_pct 两 fact 同式。**
- [ ] 步骤 2(求值谓词):`_entry_blocked(e: Dictionary, u: Dictionary, facts: Dictionary) -> bool`——无 trigger 恒 false;latch 已闩恒 false(过闩即不再拦);否则按 fact 分派求值(self 类读 u 自身、hero 类读主角行、其余读 facts 键,枚举事实按字符串比较);**facts 缺键=条件假(拦)——fail-safe,缺省 {} 调用遇上非 self/hero 事实时不放行**;`_entry_locked` 退役由本谓词收编。
- [ ] 步骤 3(双面过滤):rollable_skills/special_skills 接入 `_entry_blocked`(与冷却排除并列;facts 缺省 {} 对无 trigger 行为零差)。
- [ ] 步骤 4(闩检查换代):check_skill_unlocks 改名 check_trigger_unlocks(u, facts)——只处理 latch=true 且未闩条目,求值真即置 trigger_latched 并收集返回;**本方法只读 facts 原值,last_round_end 的 none 映射不在本层(唯一落点=T2 facts 组包)**。同步改 skill_unlock_test.gd 全部直调面(改名+facts 签名)与读值源(unlock_hp_pct 池键→技能行 trigger.value),断言语义零变化——**本卡出口全套必须绿**(签名缺省值保证 round_flow:654/:660 单参调用不破)。
- [ ] 步骤 5(V2/V4 并入):trigger_cond_test.gd 承接 T0 立件——V2 双面过滤、V4 闩语义(过门恰一次/抬血不回锁/阈值式判别例 max_hp=8/value=35:hp=3 触发 hp=4 不触发)断言落地,直跑本套件绿。
### T2 · 编排器接线与事实面供给(≈0.8d)
取用:T1 的 check_trigger_unlocks 与 facts 签名。
产出:`_roll_round_actions` 内 facts 组包(`{round_index, last_round_end, mines_hit_last, mines_hit_total}`);编排器私有 `_mines_hit_total/_mines_hit_last/_mines_hit_round: int`(定名与步骤 1 一致);解锁调用点迁移完成。
- [ ] 步骤 1(计数埋点):battle_orchestrator 加三变量——`_mines_hit_total`(本场累计)/`_mines_hit_last`(上轮值)/`_mines_hit_round`(当轮累计);三条公式:负向 blast(雷)受理时 `_mines_hit_round` 与 `_mines_hit_total` 各 +1(**守卫:只计负向 blast 行——正向 spark_aoe 与清图奖励 clear_blast 同走 blast 分支不得计入,reward.tres 极性判读**);轮次真正结束后 `_mines_hit_last=_mines_hit_round`、`_mines_hit_round=0`(轮内部分结算不更新);begin_battle 三者清零。
- [ ] 步骤 2(facts 组包):_roll_round_actions 开头组包 facts 字典(round_index 直读、last_round_end 经 action_economy.last_round_end——**空字典(首轮)映射 "none",否则 path_tag 原值;none 映射唯一落点在本组包处**、双 mines 键);hero 事实不进 facts(容器内直读主角行——T1 已定)。
- [ ] 步骤 3(解锁调用迁移)::965 check_skill_unlocks(u) 改 check_trigger_unlocks(u, facts);:972-975 pct_v 读值源从池条目 unlock_hp_pct 改技能行 trigger.value;归因行文本/enemy_hp_threshold 载荷格式零改动。
- [ ] 步骤 4(摇号接线)::984/:986 rollable_skills(u)/special_skills(u) 调用补 facts 实参。
- [ ] 步骤 5(V5/V6 落地):V5 同种子对拍断言(与 T0 步骤 1 基线逐位比对——解锁时点/归因文本/载荷/pending 序列);V6 计数埋点断言(真实 request_dig 踩雷→settle→读数递增/转存/清零)。直跑本套件绿。
### T3 · 跨表纪律与示范投放(≈0.4d)
取用:T0-T2 全套机制。
产出:config_db_cross_validator 新校验;desperate_guard/sneak_ambush/defensive_stance 三新行与五处池条目。
- [ ] 步骤 1(新纪律):config_db_cross_validator.gd 池构成段加「无条件特殊技行数 ≥1」校验(普攻不计;trigger 缺省行计数)——V7 正反断言(现行全表零违例+构造全条件池夹具报错)。
- [ ] 步骤 2(状态行):status_effects.tres 加 defensive_stance 行(display_name「护身」/target_side enemy/magnitude −25 provisional/percent/duration_settlements 2/refresh/max_stack 1——fortify 同构消费路径)。
- [ ] 步骤 3(技能行+池条目):skills.tres 加 desperate_guard(buff/「孤注守势」/buff_ref defensive_stance/duration 2/trigger{self_hp_pct,lte,35})与 sneak_ambush(damage/「趁隙偷袭」/damage_mult 1.5/cooldown 4/trigger{last_round_end,eq,"stopped"}——两行全部 provisional);enemy.tres 地精两行池加 desperate_guard w1、钩爪恐魔三行池加 sneak_ambush w2。
- [ ] 步骤 4(V8/V9 落地):低血防御两态断言(hp 高于阈值不入集合/打低后入)、停手偷袭三态断言(首轮无/stopped 后有/cleared 后无)——真实 finish_round_stop 驱动。直跑本套件绿。
### T4 · 测试收口与产出物落位(≈0.7d)
取用:T0-T3 全部断言。
产出:验证集清单重生成;实现报告/代拍板追认单/反哺点清单三件。
- [ ] 步骤 1(换代收尾):round_flow_skill_pool_test.gd V4 段扩「无条件特殊技 ≥1」行+expect_pools 期望值改写(申报②③);skill_unlock_test.gd 复核 T1 段换代后全套绿。
- [ ] 步骤 2(清单):`python tools/extract_checks.py` 重生成 game/tests/验证集清单.md,diff 核对新增断言全数入册、零意外删改。
- [ ] 步骤 3(撤销证明记录):按对照表逐行执行回退→红→还原→复绿,记录落实现报告(V5/V8/V9 三条必含)。
- [ ] 步骤 4(全套闸):run_all_gates.sh 本批域档全绿。**MC 口径:本批含 provisional 池权重投放=数值改动——出口闸锚内子集(地精/钩爪恐魔行为面)同种子复放预期判红,按锚流程呈报用户、重锚归用户档位发起,实现批不自行重锚。**
- [ ] 步骤 5(三产出物):实现报告(各卡状态+实机目检总清单两项+遗留读数义务)/代拍板追认单(见白名单)/反哺点清单(§六同步面各行逐条落点)。
## 十、异常分级
- **L1 自救**:测试夹具构造错误、断言消息措辞、注释与命名微调、tres 格式缩进。
- **L2 记录继续**:示范 provisional 数值在同数量级内调整(记代拍板追认单);既有断言因读值源换代的等价改写(已申报范围)。
- **L3 停机呈报**:契约任一条触红(尤其 V5 对拍不一致=迁移引入行为漂移);V5 基线无法录制;MC 对拍锚判红;schema 校验与文档词表冲突;行为_roll 消费序漂移嫌疑。
## 十一、代拍板白名单
1. 新技/状态行英文 id 与中文 display_name 定名(desperate_guard/sneak_ambush/defensive_stance 为推荐案)。
2. 示范 provisional 数值(w1/w2、lte 35、−25、×1.5、CD4、duration 2)同数量级内取值。
3. trigger_cond_test.gd 内部断言组织与夹具表构造方式。
4. V5 基线摘要的哈希/序列化具体格式。
5. 注释与措辞(符合 code-conventions §1.4.1 黑名单)。
## 十二、待裁点
零待裁点——机制/词表/收编/纪律/投放位全部经 2026-10-26 文档设计段裁定(敌人系统.md v1.0),本卡为其实现展开。开工门=U0 用户发令。
## 十三、禁为机检文本保留无效成员
本卡属机制新增批(兼含 unlock_hp_pct 退役迁移):unlock_hp_pct/unlocked/_entry_locked 等旧成员随迁移**删净**,禁为兼容既有测试文本保留别名或死键;机检/测试期望值与新契约冲突时停卡呈报(V5 对拍基线除外——它锚的就是旧行为的退役前快照,属本卡申报面)。
+4 -3
View File
@@ -5,8 +5,8 @@
## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照)
- **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。
- **迭代位**:迭代 1–38 全部已完成——迭代 38 六卡 2026-10-26 合回并完成批后收尾。
- **下一步**:迭代 39 已编三卡(2026-10-26 编入,≈10.15 个工作日——P0「AdventureRunner 职责真拆分」主副卡,副卡硬前置主卡+技能池情境条件触发器卡排末位),待开工,实现段由用户以 /iter 39 发令。迭代 38 卡②(结构小件定点修批)已随用户裁出上游修订定稿 v1.3(验收载体改独立负面套件+并修未播种分支),挂在「gdstyle 存量债全量清偿」条目波 7 待编排。待编池:营地交互重做卡⑤(排卡④之后)、卡④(已退回美术设计段,美术设计闭合后重立卡)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。
- **迭代位**:迭代 1–39 全部已完成——迭代 39 三卡 2026-10-27 特批带红合回,2026-10-28 完成批后收尾(反哺落文+产出物退役+账面换代)。
- **下一步**:迭代 40 已编两卡——2026-10-27 编入,≈6.225 个工作日,B1 战斗域拆件批〔gdstyle 波 1〕+结构小件定点修批〔波 7 现成卡,iter38 卡②停卡退上游后 v1.3 修订定稿〕——待开工,实现段由用户以 /iter 40 发令;迭代 41 已编两卡(核心数据面+呈现层结构收敛批,≈13.15 个工作日〔用户特批 2026-10-27 超 10 个工作日〕)排其后。待编池:营地交互重做卡⑤(排卡④之后)、卡④(已退回美术设计段,美术设计闭合后重立卡)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。
## 里程碑时间线
@@ -72,11 +72,12 @@
| 迭代 36 | 已完成(2026-10-25) | 已退役(git 历史可考) | 2026-10-24 | ≈5.25 个工作日 | 已退役(git 历史可考) |
| 迭代 37 | 已完成(2026-10-25) | 已退役(git 历史可考) | 2026-10-25 | ≈8.25 个工作日 | 已退役(git 历史可考) |
| 迭代 38 | 已完成(2026-10-26) | 已退役(git 历史可考) | 2026-10-26 | ≈5.225 个工作日 | 已退役(git 历史可考) |
| 迭代 39 | 待开工 | reports/需求卡片-冒险域拆件与账本实体化批-2026-10-26.md<br>reports/需求卡片-同调配装充能域封装批-2026-10-26.md<br>reports/需求卡片-技能池情境条件触发器批-2026-10-26.md | 2026-10-26 | ≈10.15 个工作日〔用户特批 2026-10-26 超 10 个工作日〕 | — |
| 迭代 39 | 已完成(2026-10-27) | 已退役(git 历史可考) | 2026-10-26 | ≈10.15 个工作日〔用户特批 2026-10-26 超 10 个工作日〕 | 已退役(git 历史可考) |
| 迭代 40 | 待开工 | reports/需求卡片-B1战斗域拆件批-2026-10-27.md<br>reports/需求卡片-结构小件定点修批-2026-10-26.md | 2026-10-27 | ≈6.225 个工作日 | — |
| 迭代 41 | 待开工 | reports/需求卡片-核心数据面结构收敛批-2026-10-27.md<br>reports/需求卡片-呈现层结构收敛批-2026-10-27.md | 2026-10-27 | ≈13.15 个工作日〔用户特批 2026-10-27 超 10 个工作日〕 | — |
- 迭代 38 收口为带红合并〔用户特批 2026-10-26〕:09 静态扫描 S13 gdstyle 恶化 2 条经批准记入基线存量红(git 提交 c4c69701),卡② 停卡退上游,处方已于 2026-10-26 修订定稿 v1.3(git 提交 b3ea7532),随「gdstyle 存量债全量清偿」条目波 7 待编排。
- 迭代 39 收口为带红合并〔用户特批 2026-10-27〕:02 EV 锚 goblin 0.9148∉[1.00,1.20](触发器批有意行为改动,fp f74b9a48ef4a)已随 EV 锚重锚批换带归绿(git 提交 ba5105aa);08d 生涯.md:55 行号漂移已随 2026-10-28 批后收尾反哺落文修复归绿。三卡拆分后终局 gdstyle 恶化 2 条(battle_orchestrator max-file-length、level_map_screen max-class-variables)归迭代 40 卡①还债与迭代 41 存量债序列。
- 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。
- 「已退役(git 历史可考)」= 需求卡片或实现报告曾存在,已按「证据只留最新」退役;已完成迭代的实现报告列只填 reports/ 现存路径或本保留字,不填「—」。
- 新迭代行的编排与各列判据见 doc-conventions §12.2 与 iter-plan 技能,由流水线闸(`tools/pipeline_gate.py`)机检。
+11
View File
@@ -426,3 +426,14 @@
| 5 | 调试角标发布态恒隐(卡⑦) | 菜单/设置面/对局中三处调试浮窗入口与角标恒不出现(写死行已删);浮窗仍可经开发工具宿主直调打开 |
- **红灯信号**:第 1、4 项与改前呈现不一致即报缺陷;第 2、3、5 项按修复/删除预期判——旧文案仍在、摘要仍缺、角标仍可见即报缺陷。
- **结论回流**:实现缺陷归待办清单登记新条目;`fx_warning_beacon` 裸键的可读性判「不可接受」时,归呈现面后续批补来源中文名映射(`settlement.tres` 的 source_label_map 补键)。
## ㊲ 迭代 39——拆件批情境触发技实机目检(2026-10-28 随批后收尾登记)
> 三卡合回(2026-10-27,git 提交 ffb0ac15):主卡冒险域拆件与账本实体化、副卡同调配装充能域封装、触发器卡技能池情境条件触发器+领域拆分 v1.3。拆件面以断点对拍 292 dumps 逐位零漂移与逐卡撤销证明机检收口,玩家可见行为零变化;触发器卡两示范投放是新出招行为——机检覆盖机制判定,真实战斗里「出得对不对、看得懂不懂」要人眼。登记不阻塞(2026-10-12 真人检测立规);读数与论证详见实现报告(git 提交 ffb0ac15 一线可考)。
| # | 目检项 | 判据 |
|---|---|---|
| 1 | 停手偷袭技(趁隙偷袭) | 任意一轮玩家停手不挖,下一轮结算明细出现「趁隙偷袭」行——L2/L3 群行位敌人对停手状态的还手可见且因果可读(技能名承载) |
| 2 | 低血防御技(孤注守势) | 地精血量降至约三分之一以下后的开轮,出「孤注守势」(自身防御向增益)——低血触发时机观感合理、增益行可读 |
- **红灯信号**:两技不出现(机制未触发)或触发时机明显不合理(如满血触发、低血不触发)即报缺陷。
- **结论回流**:实现缺陷归待办清单登记新条目;触发观感类判读(频率/时机手感)归难度曲线调参批数值面,不在目检现场改数。
+2 -34
View File
@@ -4,7 +4,7 @@
#### gdstyle 存量债全量清偿——216 键按病根分波整改(2026-10-26 登记,来源=会话提及,优先级=P0)
**实况**:S13 闸实测存量债 216 键/60 文件(2026-10-26,master f3b148ce,gdstyle v0.4.0 默认阈值;基线登记 234 键=实存 216+陈旧 18)。全量清单、波次方案与纪律见清点报告(本条目裁决源)。2026-10-26 用户裁:撤销「一条总账」与「按病根拆多条」两案,并为本条单账(存量债全部清除,紧急优先级);原「gdstyle 基线陈旧键待人工清理」条目并入波 0(基线对账刷新),原「结构审查未立项小件候审」条目并入波 7(卡已写;iter38 施工停卡后经用户裁于 2026-10-26 修订定稿 v1.3,待编排)。**2026-10-26 设计段闭合(逐波裁定全数落定)**:①段组织=逐波开设计段,纯代码波(波 0/2/3/4/5/6/8)写卡前确认零设计改动+按当时 master 重测读数即可写卡;②波 2 各文件内部拆、波 6 视图内部拆私有函数、波 8 config_db 纯代码收敛(三处零设计改动);③波 1 拆件定稿=轴甲两件——battle_orchestrator 拆出 BattleFxHost(效果引擎宿主域)+RewardGrant(奖励授予域),宿主保留状态机/facts 缓冲/订阅/段驱动/行发射基建/呈现投影,attune 族原位保留(迭代 39 副卡语义领地),emit 经 bind 注入 Callable,行数恶化债(c4c69701 挂账)本波还债归绿,残留债「改善非清零」口径预计 8–10 键;定稿落文 architecture.md v1.18(功能层两新件行+「战斗编排域拆件定稿」节);**同日独立审查折入**(grilling+godot-master 双子代理并行、双判回炉补裁级——骨架成立、接线未闭合):阻断 8 条去重 6 组+建议 5 条全数折入 v1.18——跨件单向接线裁死(RewardGrant 持 fx 件引用/fx 兑付走注入 Callable,禁 RefCounted 环)、settlement/ 段类随动(直持三引用封转发壳)、12 随迁键卡内收敛义务(禁波 0 refresh 吸收)、两新件消费依赖列补全+引用束注入、treasure_interact_controller 三触点分家(现值回调双取值面)、_fx_revealing 再入闸归 fx 件(裁定全文见清点报告 §六第 6 条);④全部波不改游戏规则与玩家可见行为,design/gdd/systems/ 零修订预期;波 5 已实查落定纯代码(open_ticket 12 参=单据声明形态)。波 7 的 wr5/wr6 验收载体重裁为写卡段用户裁点(卡 v1.2 在册,写卡补呈报)。裁定全文见清点报告 §六。
**实况**:S13 闸实测存量债 216 键/60 文件(2026-10-26,master f3b148ce,gdstyle v0.4.0 默认阈值;基线登记 234 键=实存 216+陈旧 18)。全量清单、波次方案与纪律见清点报告(本条目裁决源)。2026-10-26 用户裁:撤销「一条总账」与「按病根拆多条」两案,并为本条单账(存量债全部清除,紧急优先级);原「gdstyle 基线陈旧键待人工清理」条目并入波 0(基线对账刷新),原「结构审查未立项小件候审」条目并入波 7(卡已写;iter38 施工停卡后经用户裁于 2026-10-26 修订定稿 v1.3,待编排)。**2026-10-26 设计段闭合(逐波裁定全数落定)**:①段组织=逐波开设计段,纯代码波(波 0/2/3/4/5/6/8)写卡前确认零设计改动+按当时 master 重测读数即可写卡;②波 2 各文件内部拆、波 6 视图内部拆私有函数、波 8 config_db 纯代码收敛(三处零设计改动);③波 1 拆件定稿=轴甲两件——battle_orchestrator 拆出 BattleFxHost(效果引擎宿主域)+RewardGrant(奖励授予域),宿主保留状态机/facts 缓冲/订阅/段驱动/行发射基建/呈现投影,attune 族原位保留(迭代 39 副卡语义领地),emit 经 bind 注入 Callable,行数恶化债(c4c69701 挂账)本波还债归绿,残留债「改善非清零」口径预计 8–10 键;定稿落文 architecture.md v1.18(功能层两新件行+「战斗编排域拆件定稿」节);**同日独立审查折入**(grilling+godot-master 双子代理并行、双判回炉补裁级——骨架成立、接线未闭合):阻断 8 条去重 6 组+建议 5 条全数折入 v1.18——跨件单向接线裁死(RewardGrant 持 fx 件引用/fx 兑付走注入 Callable,禁 RefCounted 环)、settlement/ 段类随动(直持三引用封转发壳)、12 随迁键卡内收敛义务(禁波 0 refresh 吸收)、两新件消费依赖列补全+引用束注入、treasure_interact_controller 三触点分家(现值回调双取值面)、_fx_revealing 再入闸归 fx 件(裁定全文见清点报告 §六第 6 条);④全部波不改游戏规则与玩家可见行为,design/gdd/systems/ 零修订预期;波 5 已实查落定纯代码(open_ticket 12 参=单据声明形态)。波 7 的 wr5/wr6 验收载体重裁为写卡段用户裁点(卡 v1.2 在册,写卡补呈报)。裁定全文见清点报告 §六。**2026-10-28 交接注记(迭代 39 收尾批迁入——实现报告 §六第 6 条未决项出账)**:迭代 40 卡① 卡面接口块仍引用已退役的 RunLedger——该批 T0 须按现态改写(RunLedger 已随迭代 39 拆件批整类退役,encounter 注入面换代为桶字典+实体账+配装件多路)。
关联文档清单:
- 清点报告 reports/审计-gdstyle存量债清点与清偿方案-2026-10-26.md(2026-10-26,216 键全量清单+波次方案+纪律+设计段裁定记录 §六含整合裁定第 7 条)
@@ -12,8 +12,7 @@
- 需求卡片 reports/需求卡片-B1战斗域拆件批-2026-10-27.md(2026-10-27 v1.1 全清口径修订:对拍停止改 dump_battle 替代验收+settlement_table 拆两个子 Resource 段+宿主超标函数全清;估时 ≈5.25d;零待裁点)
- 需求卡片 reports/需求卡片-核心数据面结构收敛批-2026-10-27.md(2026-10-27 v1.1 全清口径修订:config_db 访问器归位+三域容器+SlotStore/MetaStateStore 拆件+adventure_table 拆段+spawn 束化;估时 ≈7.9d;零待裁点)
- 需求卡片 reports/需求卡片-呈现层结构收敛批-2026-10-27.md(2026-10-27 v1.1 全清口径修订:print 删除+七件绘制态内部收拢+main/await 两键按 v1.19 豁免申报;估时 ≈5.3d;零待裁点)
- 需求卡片 reports/需求卡片-冒险域拆件与账本实体化批-2026-10-26.md v1.2(规避指向:三宿主债归此卡与姊妹副卡,本事项禁触,残留归尾波)
- 需求卡片 reports/需求卡片-同调配装充能域封装批-2026-10-26.md v1.2(同上规避指向)
- 三宿主主副卡(已随迭代 39 实现批合回退役,git 历史可考——合并提交 ffb0ac15;原「规避指向:本事项禁触三宿主」随三宿主债清偿完成历史使命,残留归尾波)
- 需求卡片 reports/需求卡片-结构小件定点修批-2026-10-26.md v1.3(波 7 现成卡:iter38 卡②停卡退回上游后,2026-10-26 用户裁定验收载体改独立负面套件+并修未播种分支,卡面已修订定稿待编排)
**改动面**:游戏代码+工具代码
@@ -42,26 +41,6 @@
**状态**:待执行
#### AdventureRunner 职责真拆分——三宿主共 25 条转发属性属 S13 计数迎合装置,须按变化原因重立协作件(2026-10-25 登记,来源=批次移交,优先级=P0)
**实况**:
- 迎合装置本体:迭代 37 卡④ 实现(commit e5ee4d04)在 game/core/adventure_runner.gd:60-77 留 4 条、game/core/level_runner.gd:50-64 留 8 条转发属性(get/set 直指 CurioDeck/ShopSession 件内同名状态);卡③ 在 game/presentation/views/board_view.gd:82-122 留 13 条同类件(直指 TilePalette/HeroSprite 件内纹理与 tween 句柄)。三处同债种,唯一理由=让 S13 基线消息里的类变量数逐字保持 42/38/45;实现报告已按「指标迎合债」登记。
- 存在理由已消失:S13 基线键治本已入库(master 37625317,键=文件|规则|函数名,判定=改小/持平不红、仅较登记值恶化判红)⇒ 撤除这 25 条属纯代码改动、不碰基线(但须与拆件同批——单撤会让三处测试直引与探针直读面成片红,见缺口⑤)。
- 撤装置后的实测计数(迭代 37 批内逐卡缺口盘点):只撤 25 条转发属性=adventure_runner 类变量 42→38、公开方法 23 不减;level_runner 类变量 38→30、公开方法 54 不减;board_view 类变量 45→32。结论=单撤装置只还计数债、职责混合零解,撤除必须与拆件同批。
- 本体问题:adventure_runner 现 42 成员/23 公开方法/65 函数/989 行(level_runner 38/54、board_view 45/27 同状——只撤装置到不了阈值),按变化原因数混着七件事(生命周期与状态机/英雄账本与生命/三选一停点兑付/刷新 X 与 Y 双源/断点 schema 写读/呈现事件转发/商店池装配接线),属 God Class+Data Clump;卡④ 只搬数据未搬决策,件的封装是名义的——测试仍从宿主面直改件内多重集(game/tests/unit/core/adventure_feats_test.gd:390-393、feat_vouchers_test.gd:92-93、level_shop_economy_test.gd:1351-1353)。
- 验收面预案要点(迭代 37 批内成文,写卡输入):每新件至少一条真实入口断言(RewardStop 走 start_adventure→关卡完成三选一→选件→断言加算区/池余量/停点态清零;HeroLedger 的 rest 与 heal 封顶走真链;BreakpointSchema 承〔wr2〕三条+ui_click_probe wc2 续玩真链);撤销证明逐单元「回退本批 hunk→断言红→还原复绿」、禁注入式变异;断点 27 键键名/缺省/回退策略逐键冻结;RNG 流名(reward_pick)与消费序零漂移;`tools/gdstyle_baseline.txt` 禁改、计数下降属改善不判红;MC 与基线数据逐项比对是否发起由用户裁(触及存档/RNG/结算面)。
- 目标切法(待裁,非结论;各件收编范围=迭代 37 批内按变化原因划界的成文要点):AdventureFlow(留名 adventure_runner;收 state/level_index/levels_total/_runner/_pending_next_level/_last_level_payload 与 start/resume/关序推进/结算受理方法族=状态机+关序推进+结算受理一次)/RewardStop(收停点三态 _curio_pending/_curio_result/_node_curio_pending、刷新双源 _attune_refresh_x/_refresh_stock 与 pick_curio/refresh 族/兑付推进方法族)/CurioDeck(已在册:池与凭证计数已入件)/HeroLedger(收 ledger/run_ledger/_base_override/_override/purchased/keystone/_feats 与 effective_max_hp/apply_rest 等=数值叠加与生命口径)/BreakpointSchema(收 BREAKPOINT_FIELDS 27 键登记的派生段与 _snapshot_breakpoint/_bp_read/`_resume_*` 六小函数=存档格式);呈现转名(`_forward_*` 六件+信号面)下沉装配层。判据=件拥有状态与决策、宿主不留同名数据槽、件→宿主只传值不回调宿主私有族。
- 相关文档:design/engineering/architecture/architecture.md(模块归属表须随拆分登记新件)· design/gdd/systems/表现与支撑/存档序列化.md(断点域契约,27 键冻结面)· 迭代 37 卡④ 契约 1 冻结公开面(commit e5ee4d04),正是本条无法在批内完成的原因(需求卡片已退役,口径见 git 历史)
- **2026-10-26 文档设计已闭合**:设计讨论全套裁定(应用层薄编排/停点件 CurioStop/角色实体账 HeroLedger 三层获得结构/同调配装件 AttuneLoadout 充能单源化/断点片段化+获得日记键扩列/信号直连/构造注入/调用方直连不留壳)经 godot-master 技能库独立子代理审查修正后定稿——三高危修正(充能改单源化:物化行为唯一事实源;日记比对旧档豁免:缺日记回退汇总键直载;ShopSession 补入改造面:商店加算写通道经实体账单写原语)均已并入。定稿登记=design/engineering/architecture/architecture.md v1.16(核心层三新件行+「冒险域拆分定稿」节);钥石入账维持收束入账(获取即入账曾议、用户裁维持现状——中途入账有断点写盘非原子致账目撕裂的风险);获得明细随档保存(日记为正主、汇总键留作旧档兼容载入与一致性校验)
关联卡片(2026-10-26 双卡切分,副卡硬前置主卡):
- 需求卡片 reports/需求卡片-冒险域拆件与账本实体化批-2026-10-26.md(v1.2 定稿,grilling 两轮——一轮回炉 13 阻断全折入+二轮通过附残留 8 条已折入,零待裁点;估时 ≈5.35d)
- 需求卡片 reports/需求卡片-同调配装充能域封装批-2026-10-26.md(v1.2 定稿,同两轮闭合;估时 ≈1.8d)
**改动面**:游戏代码
**状态**:文档设计已闭合+已写卡+已编迭代 39
#### level_runner 商店委托层拆除——迭代 37 冻结契约期过渡件(2026-10-26 登记,来源=批次移交)
**实况**:证据=迭代 37 卡④ ShopSession 拆分时立「冻结公开面」契约,level_runner 保留 buy_product/shop_refresh 等同签名委托方法(架构模块表登记为「外部调用面由宿主同签名委托承载」)。2026-10-26 AdventureRunner 真拆分设计会话裁定新原则:纯转传委托=Middle Man 反模式,新件一律调用方直连不留壳(godot-master 技能库审查同判);本批不动该委托层(真拆分条目范围仅撤 8 条白盒转发属性),其拆除与调用文件改址由本条承接。
@@ -172,17 +151,6 @@
**状态**:待文档设计
#### 技能池情境条件触发器(2026-10-18 登记,来源=会话提及)
**实况**:低血触发防御、玩家停手时的偷袭技等情境出招——载体=技能行触发条件字段;启用是敌人系统修订,不是调参。(原条目无登记日期,按本批格式整改补登 2026-10-18。)**2026-10-26 文档设计已闭合**——设计裁定:机制=门槛过滤(条件不满足不进可摇集合,与冷却排除同构,不改权重、不强制出手);字段=技能行 trigger {fact, op, value, latch}+封闭词表(首批事实六词 self_hp_pct/hero_hp_pct/round_index/last_round_end/mines_hit_last/mines_hit_total,算子六比较词,闩修饰);半血解锁 unlock_hp_pct 收编为闩型首用例(三 Boss 行为零变化);新池构成纪律=每池至少一行无条件特殊技;呈现零新增(闩型保留解锁弹出,情境技因果由技能名承载);「每池增益≤1」纪律不动、条件技照常计入;首批落地=三 Boss 迁移+两示范投放(地精池低血防御增益、L2/L3 群行位停手偷袭伤害技,投值归难度曲线)。
- 设计定稿 design/gdd/systems/战斗循环/敌人系统.md v1.2(2026-10-26,「触发条件」节+技能行 trigger 立列+池构成纪律/调参表/P1 表/验收标准随动;v1.1 单体寻址批随动指针并入、v1.2 百分比事实读数定阈值式——与收编零变化的结构保证)
- 需求卡片 reports/需求卡片-技能池情境条件触发器批-2026-10-26.md(2026-10-26 v1.2 定稿,grilling 两轮——一轮回炉 2 阻断+8 应修全折入〔含文档 v1.2 阈值式联动〕+二轮通过附残留 8 条已折入,零待裁点;估时 ≈3 个工作日)
- 随动同步:design/gdd/systems/战斗循环/战斗结算.md v1.0(开轮摇号排除句)· design/gdd/systems/冒险循环/难度曲线与Boss.md v1.0(技能池投值面补触发条件)· design/gdd/systems/表现与支撑/数据配置.md v1.0(技能表字段清单补触发条件)
**改动面**:文档+游戏代码
**状态**:文档设计已闭合+已写卡+已编迭代 39
#### 个体化变体池(2026-10-18 登记,来源=会话提及)
**实况**:A 型好斗/ B 型守势、精英专属池(技能池共识点 A 的 A2 案);现行同敌种同池模板,实例分歧只来自摇号涌现。(原条目无登记日期,按本批格式整改补登 2026-10-18。)