diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index d4a62f8d..69e00038 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -164,7 +164,7 @@ **归属**:[天赋树](systems/跨局循环/天赋树.md) v0.8 实装(树结构换代+营地统一;跨 [锻造工坊](systems/跨局循环/锻造工坊.md)(工作间=其柜台改造对象,攻防数值唯一实装面在彼批)/ [元进度](systems/跨局循环/元进度.md)(注入通道与柜台退役面)/ [秘宝](systems/跨局循环/秘宝.md)(同调位求值与秘宝匣工作间)/ 数值批(命中值域与全部 provisional 数值)) -**状态**:✅ **已入库(2026-10-12,/goal+iter U0 开工——worktree g-plan2-iter21-tree 全量交付;T1-T6 代码批+T7 文档同步批,批末重闸全绿;实现报告=design/qa/iter21-实现报告-2026-10-12.md)**。R1 按卡片既定默认=裁撤案执行(schema 只保留点亮前置,未增设 requires_level),出口报告追认单列明。**登记欠账三条随批入册**:①AP 上限 clamp 缺位(树+AP 件+时沙同走 _pending_ap_delta 无上限——新叠加源使既有缺陷可观测化);②三选一刷新软上限(停点内倍率增长×停点间基础价随进度递增,另立待办);③Y(_attune_refresh_y)不入断点存档漏洞(用完退菜单再续玩满血复活——V15 仅验账本一致性,刷新链路可用性不受本批影响)。**需求卡片 v1.7(2026-10-12 完备性审查十一裁)**——在 v1.4→v1.6 三轮换代基础上新增裁决:①账号层攻/AC 空窗期**知情接受**(Alpha 开发阶段,不设过渡、不登记欠账);②**守侧=失误补偿**(契约 12:触发主语=当回合标错动作非在场标错旗;单格最多一次;末轮不返);③折扣(散)**只覆盖商品购买价格、不含刷新**,键名 `gp_cost_mult`(`cost_mult` 已被 `yield_mult` 占用),聚的乘算落**入账前**;④限次承载=`adventure_counters`+`domain:"adventure"`+关卡切换点清零(**不升 v7**);⑤**开发阶段无视任何文档层条款**,不为本批增设豁免/例外条款;⑥**生涯页三投影整行删**(`forge_level`/`workshop_status`/`tree_nodes`——生涯不统计天赋树与账号成长态);⑦三条登记欠账、本批不做=AP 上限 clamp / 三选一刷新软上限(另立待办)/ Y 不入断点;⑧§5 之外另查到的 42 处旧表述**不做清扫**(不做加法)。**需求卡片 v1.4→v1.6 连带换代(2026-10-11 攻防所有权切分+一线一节点+Fork一节点双态三轮)**:design/research/需求卡片-天赋树实装批-2026-10-11.md——结构目标 33→12 全卡换代(脊柱=生命/命中一线一节点×4 级、Fork=三节点双态〔购买解锁默认 A 态、零币切换、行持 a/b 双效果键〕)、锻造工坊钥匙前置改无、地脉共鸣条件效果换代、注入公式换代、营地呈现措辞对齐四柜台、行门槛平移节点等级(用户驳「合并破坏统计/门槛」之疑——节点等级可区分可计数,门槛主语=第 N 级);T 估时复核 ≈7.0-8.0d(T1 下修,其余不动);**开放待裁点 R1=schema「等级阈值前置」新形态去留(钥匙改无前置后现无消费者,推荐裁撤)**——裁决前不阻开工门(默认按裁撤案排程,用户推翻即先改文档);2026-10-11 用户令整卡编入迭代 21(不切分)不变。**历史落卡记录(v1.1→v1.3)**:grilling 五裁全落(Q1 刷新升级双入口并存·秘宝侧重复后续审查轮用户自办/Q2 槽位数量树说了算+旧条件作废删除随批清扫/Q3 开发阶段无迁移·旧存档废弃重置·迁移需求整体删除/Q4 本批程序占位重排/Q5 转排期规则默认先行);歧义扫描六裁(/grilling)已落 GDD v0.4:术语回归「危险格/安全格」/彩蛋三线/行门槛含全部节点/聚仅战斗掉落+散全消费面/限次生命周期/三处旧裁决换代(彩蛋三线后随 v0.6 攻防所有权切分换代为两线);架构面结论=现有分层承载得住零重构,三处小扩〔schema 阈值前置形态(去留=R1 待裁)/效果引擎关卡域状态/营地呈现重排〕随批 +**状态**:✅ **已入库(2026-10-12,/goal+iter U0 开工——worktree g-plan2-iter21-tree 全量交付;T1-T6 代码批+T7 文档同步批,批末重闸全绿;实现报告=design/qa/iter21-实现报告-2026-10-12.md)**。R1 按卡片既定默认=裁撤案执行(schema 只保留点亮前置,未增设 requires_level),出口报告追认单列明。**登记欠账三条随批入册**:①AP 上限 clamp 缺位(树+AP 件+时沙同走 _pending_ap_delta 无上限——新叠加源使既有缺陷可观测化);②三选一刷新软上限(停点内倍率增长×停点间基础价随进度递增,另立待办);③Y(_attune_refresh_y)不入断点存档漏洞(用完退菜单再续玩满血复活——V15 仅验账本一致性,刷新链路可用性不受本批影响)。**需求卡片 v1.7(2026-10-12 完备性审查十一裁)**——在 v1.4→v1.6 三轮换代基础上新增裁决:①账号层攻/AC 空窗期**知情接受**(Alpha 开发阶段,不设过渡、不登记欠账);②**守侧=失误补偿**(契约 12:触发主语=当回合标错动作非在场标错旗;单格最多一次;末轮不返);③折扣(散)**只覆盖商品购买价格、不含刷新**(实现=范围口径特判 `level_runner._spend_discounted`,不走效果引擎合成订阅、无效果键名;若改走合成订阅须避让已被 `yield_mult` 占用的 `cost_mult`),聚的乘算落**入账前**;④限次承载=`adventure_counters`+`domain:"adventure"`+关卡切换点清零(**不升 v7**);⑤**开发阶段无视任何文档层条款**,不为本批增设豁免/例外条款;⑥**生涯页三投影整行删**(`forge_level`/`workshop_status`/`tree_nodes`——生涯不统计天赋树与账号成长态);⑦三条登记欠账、本批不做=AP 上限 clamp / 三选一刷新软上限(另立待办)/ Y 不入断点;⑧§5 之外另查到的 42 处旧表述**不做清扫**(不做加法)。**需求卡片 v1.4→v1.6 连带换代(2026-10-11 攻防所有权切分+一线一节点+Fork一节点双态三轮)**:design/research/需求卡片-天赋树实装批-2026-10-11.md——结构目标 33→12 全卡换代(脊柱=生命/命中一线一节点×4 级、Fork=三节点双态〔购买解锁默认 A 态、零币切换、行持 a/b 双效果键〕)、锻造工坊钥匙前置改无、地脉共鸣条件效果换代、注入公式换代、营地呈现措辞对齐四柜台、行门槛平移节点等级(用户驳「合并破坏统计/门槛」之疑——节点等级可区分可计数,门槛主语=第 N 级);T 估时复核 ≈7.0-8.0d(T1 下修,其余不动);**开放待裁点 R1=schema「等级阈值前置」新形态去留(钥匙改无前置后现无消费者,推荐裁撤)**——裁决前不阻开工门(默认按裁撤案排程,用户推翻即先改文档);2026-10-11 用户令整卡编入迭代 21(不切分)不变。**历史落卡记录(v1.1→v1.3)**:grilling 五裁全落(Q1 刷新升级双入口并存·秘宝侧重复后续审查轮用户自办/Q2 槽位数量树说了算+旧条件作废删除随批清扫/Q3 开发阶段无迁移·旧存档废弃重置·迁移需求整体删除/Q4 本批程序占位重排/Q5 转排期规则默认先行);歧义扫描六裁(/grilling)已落 GDD v0.4:术语回归「危险格/安全格」/彩蛋三线/行门槛含全部节点/聚仅战斗掉落+散全消费面/限次生命周期/三处旧裁决换代(彩蛋三线后随 v0.6 攻防所有权切分换代为两线);架构面结论=现有分层承载得住零重构,三处小扩〔schema 阈值前置形态(去留=R1 待裁)/效果引擎关卡域状态/营地呈现重排〕随批 #### 秘宝体系实现重构落地批 — 已编入迭代 22(2026-10-11 用户令)(2026-10-10 用户令「文档层已改完,记录新设计的实现重构落地」登记) diff --git a/design/research/需求卡片-天赋树实装批-2026-10-11.md b/design/research/需求卡片-天赋树实装批-2026-10-11.md index 45f6e25f..d756d83d 100644 --- a/design/research/需求卡片-天赋树实装批-2026-10-11.md +++ b/design/research/需求卡片-天赋树实装批-2026-10-11.md @@ -107,7 +107,7 @@ - **危险直觉·守(标错返还行动点·每关限次)**:**按契约 12 落**——挂点 = `_judge_flag` else 分支内 **`_flag_miss_seen` 去重闸之后**(与 `:1131` 归因行同位),效果 `{"kind":"grant_ap","mode":"queue"}` ⇒ 走 `_pending_ap_delta`,**下一轮 `notify_round_start()` 才兑现**(先例「封印回响」`:756`)。**注意 `round_start` 面的 queue 是紧接着那次开轮兑现、且 payload 无标错信息,不可挂**;`round_end` payload 同样无标错信息,不可挂。需**扩 EVENTS 加一个标错事件**(L2 呈报)——**命名须避让已占用的 `flag_miss`**(`_emit_row` 的 source_class,`:1131` 战斗日志行),建议 `flag_missed`。换图 `_flag_miss_seen.clear()`(`:401`)后同坐标再插错会重触发 = 新板新算(合理态)。 - **限次承载(锋/守共用)**:**复用现成 `adventure_counters` + `domain:"adventure"`**(`effect_engine.gd:86-87/216-228`;seed/export/断点三件套现成,迭代 20 已入断点 `adventure_runner.gd:1245/:230-232`)⇒ **不新增存档域、不升 v7**(卡片 F7 那句「无跨战斗持久计数」仅对 `_counters` 成立,对冒险级已过时)。**缺口只有一处**:`domain:"adventure"` 是冒险级重置,而设计要求「**按关重置**」⇒ 需在**关卡切换点**(`adventure_runner.gd:1056` `_start_current_level()`)对限次 counter_id 做一次清零。生命周期四态(随冒险持久/按关重置/新冒险清零/断点保留)由此闭合。 - **财富之道·聚(战斗掉落 GP 增益)**:**乘算落在入账前**——`battle_orchestrator.gd:1470` `_roll_gp_drop()` 的 return 表达式内,使结算框「GP 增量」行显示的就是实得值(落在 `level_runner.gd:517` 之后则显示值与实得不符)。范围=**仅战斗掉落渠道**(不含三选一 GP 袋件、店内 escrow)。 - - **财富之道·散(GP 消费折价)**:**范围=只覆盖商品购买价格,不含刷新**(2026-10-12 用户裁:不是因为「避让在册旋钮」,而是**折扣的定义边界就是商品标价**——商店刷新价与三选一刷新价不在此列)。**键名须避让 `cost_mult`**(已被占用:`battle_orchestrator.gd:581` 是 `yield_mult` 的效果参数位,不是价格乘子),改用 **`gp_cost_mult`**。**GDD `天赋树.md:111` 那句「设计避让:不触碰商店刷新语义与 GP 换算两处在册旋钮」须改写**为定义边界口径(反哺点)。 + - **财富之道·散(GP 消费折价)**:**范围=只覆盖商品购买价格,不含刷新**(2026-10-12 用户裁:不是因为「避让在册旋钮」,而是**折扣的定义边界就是商品标价**——商店刷新价与三选一刷新价不在此列)。**实现选型=范围口径特判**(`level_runner._spend_discounted` 内 `_tree_rules.has("economy_spend")`,覆盖 legacy `current_price` + 池货架 `pool_price` 两处商品标价面),**不走效果引擎合成订阅、故无效果键名**——若将来改走合成订阅,则须避让已被 `yield_mult` 占用的 `cost_mult`(`battle_orchestrator.gd:585`)、另起 `gp_cost_mult`。**GDD `天赋树.md:111` 那句「设计避让:不触碰商店刷新语义与 GP 换算两处在册旋钮」须改写**为定义边界口径(反哺点)。 - tree_rule_keys 按激活态键集随新词表自然扩。**若需扩 EVENTS/FACTS/效果类型闭集→按契约 5 L2 呈报**(本批已预知两处:守侧 `flag_missed` 事件、姿态组 `battle_index` 事实)。 - **T4 注入换代与退役(≈1.0d)**:hero_override 换公式(树生命/命中淬炼 flat〔命中在账未注入〕+锻造路线加值位〔预留 0,随锻造工坊批填充〕);旧属性柜台退役(buy_forge 购买面下线+营地属性锻造柜台列移除+forge_flat 注入项移除);同调位槽位收编(槽位数量=树点亮节点数,Q2 裁甲——旧条件链删除);树上刷新升级购买写同账(Q1 裁乙——双入口并存,树上+秘宝匣装配段按钮都能买)。 - **T5 旧档废弃与旧逻辑删除(≈0.5d)**:①旧结构存档处理——加载检测到换代前结构(已删节点 id 残留)即废弃树域重置(开发阶段破坏性变更,Q3 用户裁),三体系迁移函数 `migrate_tree` 删除;**禁做数据迁移与折算,也禁为文档层增补任何豁免/例外条款**(契约 4)。②旧逻辑删除——forge_levels 旧柜台域清退;**生涯页三投影整行删**(`career_overlay.gd:26/69/89`「属性锻造」行 + `main.gd:1071-1073` `forge_total` 计算与 `:1082` `forge_levels_total` 键 + `生涯.md:43`「三柜台解锁完成度概览」行的三个数据源 `forge_level`/`workshop_status`/`tree_nodes` 全删——2026-10-12 用户裁:**生涯页不统计天赋树与账号成长态,只统计终身计数**);同调槽位旧条件链(条件表判定)退役;fork A/B 双行购买路径(tree_buy_fork 购侧激活语义)随单行双态换代。**保留**:`boss_kill_count` / `clear_count` 计数域(各有 5 处/2 处非槽位硬消费,见 T0⑥)。③文档同步——**只做 §5 机械面清单内已登记项**(含 `秘宝.md` 路径更正;`存档序列化.md` 按契约 4 **不更新**);**§5 之外另查到的 42 处旧表述不做清扫**(开发阶段口径 + 不做加法),版本历史行一律不动。 @@ -141,7 +141,7 @@ | V8 | §1②(彩蛋觉醒,原探针③升格) | 生命/命中两节点均 4 级拉满 且 同调位 1/2/3 全解锁→地脉共鸣自动点亮且零消费(钥石余额不动、不经购买);任一条件不满足不亮(任一节点未拉满=红、任一同调位未点亮=红)。反例:未满可手动购亮=红、觉醒扣币=红。**另加契约 9 落点断言**:`easter_ley` 行 effects 键集 ⊆ {max_hp, hit}——**含 atk 或 armor_class 即红**(现役 `meta_tree.tres:402/405` 带着这两个分量,换代必须摘除) | 冒烟。注入=save.set_tree_level 置两节点 cap4/点亮同调位→tree_buy 任一节点触发 _check_easter_egg(meta_progression.gd:304-312 换代判定)→断 tree_level("easter_ley")==1 且余额不变;effects 键集=直读表行断言 | 自动闸 | T2 | | V9 | §1③(Fork 一节点双态与切换,原探针②升格) | Fork 节点购买解锁(tree_nodes 入档 1 级、默认 A 态);零币切换(tree_toggle_fork)换态、切换后 tree_rule_keys==新激活态效果键;同态重复切换零操作(存档零变化);已解锁 Fork 重复购买=拒绝;未解锁 Fork 切换=拒绝 | 冒烟。注入=add_keystone→tree_buy_fork 解锁→tree_toggle_fork 换态→逐断解锁态/激活态/键集/余额 | 自动闸 | T2 | | V10 | §1③(Fork 六键真效果,原探针⑦升格) | 六键各一条正例+反例:先手压制=每关首轮 AP+1、第二轮不触发、第二关首轮窗口刷新再触发;稳健拓荒=首轮窗内受击出盾、窗外不出;锋=踩中危险格伤害减半·每关限次、限次耗尽全额、安全格不减(**伤害在结算战斗段末兑付**,挖到瞬间只有格子揭示、不扣血);**守=按契约 12 五场景断言(失误补偿,2026-10-12 用户裁)**:①当回合标错且结算时旗仍在场→**下一轮** AP+N(本轮 AP 逐位零变化);②当回合标错但随后挖开该格→结算**不触发**;③之前回合标错、本回合无新标错动作→**不触发**(旗仍在场也不返);④同一格标错**最多返还一次**;⑤末轮(战斗结束轮)标错→**不返、合法作废**。聚=战斗掉落 GP 乘算,三选一 GP 袋件/店内 escrow 等非战斗掉落渠道不乘(范围仅此渠道),**乘算落在入账前——结算框「GP 增量」显示实得值**;散=GP 消费折价 `gp_cost_mult`,**只覆盖商品购买价格——商店刷新价与三选一刷新价不折**(反例:刷新价被折=红;键名不得复用已被 `yield_mult` 占用的 `cost_mult`)。限次计数生命周期四态各一断言(随冒险持久/按关重置/新冒险清零/断点保留) | 冒烟+单元。注入=直构 tree_rules 键集数组直调 EffectEngine.rebuild(effect_engine.gd:73-101 合成订阅面)+dispatch 发射事件;限次=复用 `adventure_counters`+`domain:"adventure"`(**不新增存档域、不升 v7**),直调 counter_add/counter_spend 置关卡域计数后走事件路径断计数值,**按关重置=在 `adventure_runner.gd:1056` `_start_current_level()` 断清零点**;守侧五场景=直构 flag_judged 序列经 `_settle()` 授予段注入,断 `_pending_ap_delta` 与下一轮 `notify_round_start()` 后的 AP | 自动闸 | T3 | -| V11 | 契约 5(效果类型闭集不加新词) | 六键效果全部走现有 24 效果类型+既有事实/参数词表组合:合成订阅行的 on/when/do 键全部落在 EVENTS/FACTS/OPS/EFFECT_KINDS/DO_KEYS 在册词表内(validate_trigger_row 零违例);若实现需扩闭集=L2 呈报留痕,本条断言以在册词表为准转红 | 单元测试。注入=直构六键合成订阅行调 EffectEngine.validate_trigger_row(effect_engine.gd:272-314)断零违例 | 自动闸 | T3 | +| V11 | 契约 5(效果类型闭集不加新词) | **四键合成订阅行**(开局姿态 2 + 危险直觉 2)的 on/when/do 键全部落在 EVENTS/FACTS/OPS/EFFECT_KINDS/DO_KEYS 在册词表内(validate_trigger_row 零违例);**聚/散两键无合成订阅行**——实现为范围口径特判(`level_runner._spend_discounted` / `battle_orchestrator._roll_gp_drop` 内 `tree_rules.has(...)`),其验收归 V10 范围断言(含反例:刷新价被折=红)。**断言须显式登记聚散两键「无行可验」并断其确实无合成行,禁空跑冒充覆盖**〔v1.7 修正:原表述「六键」与 T3「rebuild 扩四合成订阅行」矛盾,导致 `tree_rules_v11_test.gd` 的 `synth` 字典缺聚散两项、`synth.get(key, [])` 返回空数组使循环静默跳过——测试全绿但实际只覆盖四键〕。若实现需扩闭集=L2 呈报留痕,本条断言以在册词表为准转红 | 单元测试。注入=直构四键合成订阅行调 EffectEngine.validate_trigger_row(effect_engine.gd:272-314)断零违例;另断 `economy_hoard`/`economy_spend` 在合成订阅段无行(防空跑) | 自动闸 | T3 | | V12 | §1①(注入公式换代,原探针⑤升格) | hero_override 逐字段对拍=树淬炼 flat(生命线注入——Σ 节点 effects×等级;命中线在账未注入)+锻造路线加值位(本批预留 0)+局内加算区;forge_flat 旧项退役后不再出现在公式(旧「买 atk 1 级→override==行 flat」断言摘除,见 V20);开局 runner effective_atk/max_hp/ac==表值+override 各轴逐位;全新存档(树全零)override 全零=白板 | 冒烟+单元。注入=save.set_tree_level 置脊柱节点等级→直读 hero_override 手算对拍→start_adventure 带 override 断首战读数 | 自动闸 | T4 | | V13 | 契约 6(命中线不注入) | 命中淬炼节点购若干级→hero_override 无 hit 字段位移、effective 面零命中变化(命中等级在账不入注入面——消费面归数值批) | 冒烟。注入=save.set_tree_level 置命中线等级→断 override 与首战读数与零购基线逐位一致 | 自动闸 | T4 | | V14 | §1①(同调位槽位收编,Q2 裁甲) | 槽位数量=树上同调位节点点亮数:点亮 n 个→Attunement.slots 读数==n、未点亮=0;旧条件(按击杀 Boss 次数/通关次数自动涨)判定链删除后 clear_count/boss_kill_count 计数不再进槽位判定(attunement_growth 表与访问器的去留随 T0⑥ boss_kill_count 消费面核查结论,本条断言主语=槽位判定源只剩树点亮态) | 冒烟。注入=save.set_tree_level 逐个点亮 att_socket1..3→Attunement.slots 读数阶梯断言 | 自动闸 | T4 |