写卡(迭代38卡②停卡修订·v1.3): 验收载体由现役非负面套件改独立负面套件+p7 并修未播种分支——独立 grilling 复核判「不可开工(阻断3+应修6+建议2)」,其读数逐条码面复验后全数折入。阻断三件=①wr7 原用 open_stream("adventure"),PURPOSE_TAGS(:9) 无该标签且未知标签检查(:101-103)排在播种检查(:104-106)前,本点会退化成测试点②、撤销证明④改前改后皆绿→改在册标签 board_gen;②原「违约行照发号/未播种照取号→quit(2)」判据在 debug 不可观测(assert 先中断 open_stream 本体,:107-108 推计数段谁也到不了)→契约 6 与三测试点判据主体改取「有差异面」=handler 成员与调用点是否存在(记录位)+封印是否落,return 位与计数器一律降级为 grep 在位+评审注记(debug 下两态不可判别,拿它当运行期判据=假绿)并加 L3 停呈与审计阻断判据;③wr5 未禁测试体内手工接线会让「回退组装点」空转→载体纪律①钉死注入只经编排器组装点、审计加 grep fatal_handler 在测试文件零命中判据。应修折入=wr8「删登记行即红」改「删 negative 标记保留登记行→闸 02 捕获」(全仓无闸对账盘上测试文件与 manifest,登记行存在性改静态判据)、§8.1 产出物行 wr7 编号冲突改 wr9、行号按合回点 8ea7cfba 重锚(battle_orchestrator :278/:283/:1292→:285/:290/:1304、main.gd :312/:321→:311/:320 与 :722/:749→:721/:748、_open_modal 块 :282-286→:281-285、stop 守卫 :746→:743,§0 交叠论证改按语义面而非行号)、T1 补新件 .uid 边车随批入库(.gitignore:6 须提交+卡④ 曾漏带先例)、T2 补 extract_checks --extract --force(无 force 拒写返 2)并申明负面套件 quit 形态预期零新增清单行禁凑 Kit.check、契约 6 补播种断言 assert(_counter==0) 导致的每测试点新建实例纪律、完成定义改写=本批属代码面走 --code 且闸 09 现为迭代 38 特批存量红(battle_orchestrator 1313 行对基线 1302 继续恶化、rng_service 加行待实测;gdstyle SCAN_DIRS 不含 tests 故新测试件零影响),开工前须用户裁「还债或刷新基线」禁以闸 09 绿为完成条件。建议两处随折(白名单引用序号、事件命名落 *_fatal_test 约定)。§12 记停卡呈报与 v1.3 判据(按禁写变更记录红线写成判据非逐条款清单);头注估时 ≈0.75d→≈0.85d、件②独立卡指址改 git 提交、来源条目归属随「gdstyle存量债全量清偿」波 7;pipeline_gate 绿(51条目/39行/2链/12卡)

This commit is contained in:
DKChan committed 2026-10-27 01:28:11 +08:00
1 parent 9a45eee79a
commit b3ea753270
1 file changed
+79 -54
@@ -1,62 +1,71 @@
# 需求卡片:结构小件定点修批(审计 §三 其余小件五件:死变量/confirm 收口/空判/常驻 flush/fatal 违约回调)
# 需求卡片:结构小件定点修批(审计 §三 其余小件六件:死变量/confirm 收口/空判/常驻 flush/fatal 违约回调/未播种取数通道)
- 版本:**v1.2**(v1.0→一轮「通过(附四应修+一建议)」→v1.1→二轮闭合复检「通过(附三应修)」→v1.2 定稿,复核记录见 §12)
- 来源:[待办清单](../待办清单.md)「结构审查未立项小件候审」条目(2026-10-25 登记,状态=待裁决)——**2026-10-26 用户裁「全六件立项」**;本卡收五件(①③④⑤⑥,审计原编号),件②(level_map 越界/BFS)独立成卡(结构改动量独立、审查单元分立)(唯一事实源:工程证据指认=审计报告 [§三 其余小件](审计-game代码结构审查-2026-10-24.md) §90-95 逐件行号+本卡 §3 行号级实查〔迭代 37 拆件后行号重定位〕)
- 归属:`game/presentation/main_overlay_flow.gd`+`game/presentation/main.gd`+`game/presentation/row_pacer.gd`(消费一行)+`game/core/board_generator.gd`+`game/core/reward_economy.gd`+`game/core/rng_service.gd`+`game/core/battle_orchestrator.gd`(组装接线两行)+测试面(探针回归+新断言)
- 排期:未编入(迭代批卡片;估时 ≈0.75 工作日)
- 版本:**v1.3**(2026-10-26 定稿——含迭代 38 停卡后的载体修订与复核轮收紧;逐轮 grilling 与停卡呈报记录见 §12)
- 来源:[待办清单](../待办清单.md)「结构审查未立项小件候审」条目(2026-10-25 登记,状态=待裁决)——**2026-10-26 用户裁「全六件立项」**;本卡收六件(①③④⑤⑥ 审计原编号+p7 同函数第二处,2026-10-26 用户裁「并修」随 v1.3 入卡),件②(level_map 越界/BFS)独立成卡、已随迭代 38 卡① 合回退役(git 提交 b85b3b45/8ea7cfba)(唯一事实源:工程证据指认=审计报告 [§三 其余小件](审计-game代码结构审查-2026-10-24.md) §90-95 逐件行号+本卡 §3 行号级实查〔迭代 37 拆件后行号重定位〕)
- 归属:`game/presentation/main_overlay_flow.gd`+`game/presentation/main.gd`+`game/presentation/row_pacer.gd`(消费一行)+`game/core/board_generator.gd`+`game/core/reward_economy.gd`+`game/core/rng_service.gd`+`game/core/battle_orchestrator.gd`(组装接线两行)+测试面(新增负面套件一件+其 `.uid` 边车+`game/tests/run_all.gd` manifest 登记一行+探针回归)
- 排期:未编入(迭代批卡片;估时 ≈0.85 工作日——含负面套件新件、manifest 登记与清单对账 ≈0.1d;归属车道随「gdstyle 存量债全量清偿」条目波 7 或另编迭代,由编排段定)
- 开工门:U0+复核门过(§12);零待裁点
## 0. 前置依赖与并行性
- **第〇步核对(2026-10-26 写卡会话)**:来源条目=需求性工程条目(审计行号证据),用户 2026-10-26 点名全六件立项——放行。
- 审计行号基线=2026-10-24(迭代 37 拆件前);本卡 §3 已按现行 master(eb04313b)重定位(①main→main_overlay_flow 拆件迁移、③行号漂移),T0 复核。
- 与 2026-10-25 两批卡零文件交叠(卡 A 触 battle_orchestrator 的发射点/头注/校验段——本卡 p5 只动组装点 :278/:283 两行接线与两协作件 _fatal,不同面;rng_service p6 与其零叠)。同波无冲突。
- 审计行号基线=2026-10-24(迭代 37 拆件前);本卡 §3 已按现行 master 重定位(①main→main_overlay_flow 拆件迁移、③行号漂移),**v1.3 复核轮再按迭代 38 合回点 8ea7cfba 重锚一遍**(`battle_orchestrator.gd` 组装点与 `_fatal`、`main.gd` 各址均漂移),开工日 T0 仍须复核。
- 与 2026-10-25 两批卡零文件交叠(卡 A 触 battle_orchestrator 的发射点/头注/校验段——本卡 p5 只动组装点的两行接线与两协作件 `_fatal` 成员,**按语义面判交叠、不按行号**:行号随合回漂移,「发射与校验段」对「组装点接线行」的面不相交在换代后仍成立;rng_service p6/p7 与其零叠)。同波无冲突。
- p6/p7 同触 `rng_service.gd:100-112` 同一函数的两条分支——v1.3 并修后两处改动面相邻,禁拆成两波同文件互踩(一条波次内完成)。
- p5 触结算域(core 件 _fatal 形态)——parity 触面按 MC 纪律:零数值改动=零 MC(_fatal 是违约路径,合法路径零触碰)。
## 1. 目标与完成定义
**目标**:五件审计定点小件落地——①_ sync_status_entry 死变量与重复四句清除;③settle_batch 两入口显式 null 防护;④row_pacer 会话更替机制化 flush;⑤两 core 协作件 _fatal 的 release 软回退补真中止通道(经 orchestrator 既有封印传导);⑥rng_service open_stream 未知标签补 return+可测违约回调。合法路径行为逐位不变(p2 confirm 收口是唯一行为改动=锁域归位,对照表专行)。
**目标**:六件审计定点小件落地——①_ sync_status_entry 死变量与重复四句清除;③settle_batch 两入口显式 null 防护;④row_pacer 会话更替机制化 flush;⑤两 core 协作件 _fatal 的 release 软回退补真中止通道(经 orchestrator 既有封印传导);⑥rng_service open_stream 未知标签补 return+可测违约回调;⑦同函数未播种取数分支(`_master_seed < 0`)同款补 return+违约回调(p6 同病根第二处,v1.3 用户裁并修)。合法路径行为逐位不变(p2 confirm 收口是唯一行为改动=锁域归位,对照表专行)。
**验收载体口径**(v1.3 停卡修订立此,实装段禁改回落位):违约路径取证(wr5/wr6/wr7)**一律落独立负面套件**并按 manifest 登记 `expect=1, negative=true`,禁落现役非负面套件——headless 下 `assert` 失败必产 `SCRIPT ERROR` 行、不可捕获,非负面套件的输出被闸 02 扫描命中即判 FAIL(规则出处=test-conventions §5「负面套件仅可豁免第 2 闸,且须在 manifest 显式标记」;在册先例三件=`reward_dangling_treasure_test`/`counter_prefix_fatal_test`/`extended_row_violation_test`)。
**改动单元清单**(🔴 契约 1):
| # | 单元(实查·现行行号) | 改法 | 依据 |
|---|---|---|---|
| p1 | `main_overlay_flow.gd:107-124` `_sync_status_entry`::111 `var battle_live` 赋值后零消费(死变量)+首组四句 :112-116(:114 置灰注释行夹中)与重复四句 :119-122 逐字相同(:117-118「重复语句在案」注释两句自认) | 删 :111 死变量行+删 :117-122(自认注释两句+重复四句);保留首组与 :123-124 调试角标注释段(非重复组——grilling 订正 v1.0 误圈) | 审计 ①;死代码与重复句清除 |
| p2 | confirm 旁路单口违约:`main_overlay_flow.gd:88` `root.confirm_dialog.open(...)` 与 `main.gd:312/:321` `confirm_dialog.close()` 直开直关——绕过 `_open_modal/_close_modal`(main.gd:282-286 → ModalFlow.open/close 挂起兜底/遮挡记账/开侧同步),违 main.gd 自身头注单口纪律;confirm_dialog.gd:40-41「树序由构建序保证」注释失真 | 三处收口:open 前经 `root._open_modal(root.confirm_dialog)`(ModalFlow.open 承载显示编排,T0 核其与 confirm_dialog.open 设文案的先后序);close 经 `root._close_modal(...)`;:40-41 失真注释随修。**行为改动=confirm 开合进 ModalFlow 栈(输入锁/互斥域归位)**——对照表专行+探针回归 | 审计 ①后半;架构单口纪律 |
| p3 | `main.gd:722/:749` settle_batch 两入口直取 `run_scope.settlement.minesweeper.settle_batch(...)`——前置空判隐式依赖 `_input_locked` 第三例外(锁谓词保证只在局内可达) | 两入口各加显式防护:`if run_scope.settlement == null: return`(零成本双保险——锁谓词异常时不再崩于空引用) | 审计 ③「入口显式 null 防护零成本双保险」 |
| p2 | confirm 旁路单口违约:`main_overlay_flow.gd:88` `root.confirm_dialog.open(...)` 与 `main.gd:311/:320` `confirm_dialog.close()` 直开直关——绕过 `_open_modal/_close_modal`(main.gd:281-285 → ModalFlow.open/close 挂起兜底/遮挡记账/开侧同步),违 main.gd 自身头注单口纪律;confirm_dialog.gd:40-41「树序由构建序保证」注释失真 | 三处收口:open 前经 `root._open_modal(root.confirm_dialog)`(ModalFlow.open 承载显示编排,T0 核其与 confirm_dialog.open 设文案的先后序);close 经 `root._close_modal(...)`;:40-41 失真注释随修。**行为改动=confirm 开合进 ModalFlow 栈(输入锁/互斥域归位)**——对照表专行+探针回归 | 审计 ①后半;架构单口纪律 |
| p3 | `main.gd:721/:748` settle_batch 两入口直取 `run_scope.settlement.minesweeper.settle_batch(...)`——前置空判隐式依赖 `_input_locked` 第三例外(锁谓词保证只在局内可达) | 两入口各加显式防护:`if run_scope.settlement == null: return`(零成本双保险——锁谓词异常时不再崩于空引用) | 审计 ③「入口显式 null 防护零成本双保险」 |
| p4 | `row_pacer.gd:11` `_rows` 待播队列住 main 级常驻节点(违架构「局态一律住 RunScope」)——会话更替零残留靠时序约定兜底 | `main.gd:175` `_begin_session` 内加 `_row_pacer.flush()` 一行(:49 现成公开面——机制保证会话更替即清队) | 审计 ④「_begin_session 内 flush 一行变机制保证」 |
| p5 | `board_generator.gd:396-398` 与 `reward_economy.gd:366-368` 两处 `_fatal`=push_error+assert(false)——release 模板剥离 assert 后退化为软回退(无 orchestrator 的 battle_result 封印兜底) | 两件 `_fatal` 各加可注入违约回调:`var fatal_handler: Callable`(缺省 `Callable()`=现行为逐字保持)+`_fatal` 体内 handler 有效则调用;组装点 `battle_orchestrator.gd:278/:283` 各接一行 `fatal_handler = _fatal`(orchestrator 自身 _fatal :1292 已带 battle_result 封印——协作件违约即传导封印=战斗中止,release 真中止成立) | 审计 ⑤「出包前需换真中止(可经宿主注入 fatal 回调)」——经组装层传导,零穿透三层、复用既有封印 |
| p5 | `board_generator.gd:396-398` 与 `reward_economy.gd:366-368` 两处 `_fatal`=push_error+assert(false)——release 模板剥离 assert 后退化为软回退(无 orchestrator 的 battle_result 封印兜底) | 两件 `_fatal` 各加可注入违约回调:`var fatal_handler: Callable`(缺省 `Callable()`=现行为逐字保持)+`_fatal` 体内 handler 有效则调用;组装点 `battle_orchestrator.gd:285/:290` 各接一行 `fatal_handler = _fatal`(orchestrator 自身 _fatal :1304 已带 battle_result 封印——协作件违约即传导封印=战斗中止,release 真中止成立) | 审计 ⑤「出包前需换真中止(可经宿主注入 fatal 回调)」——经组装层传导,零穿透三层、复用既有封印 |
| p6 | `rng_service.gd:100-103` `open_stream` 未知标签 push_error+assert 后**无 return**——release 剥 assert 后静默继续发号(违随机流纪律) | 补违约通道:`var violation_handler: Callable`(缺省现行为)+未知标签分支 handler 有效则调用+**`return null`**(合法路径零变化;release 下返回 null 使调用方即刻崩=fail-fast 传导);handler 注入使负路径 debug 可测(见 wr6) | 审计 ⑥「补 return 即闭合」+可测性(撤销证明口径) |
| p7 | `rng_service.gd:104-106` `open_stream` 的 `_master_seed < 0` 分支=push_error+assert 后**同样无 return**(p6 同病根第二处,grilling 一轮点名、v1.3 用户裁并修)——未播种即取数在 release 剥 assert 后静默继续发号(违 EC7 与随机流纪律) | 未知标签通道同款:该分支复用 p6 的 `violation_handler`(handler 有效则调用,传用途标签)+**`return null`**(合法路径零变化;release 下调用方即刻崩=fail-fast 传导);违约取证落负面套件第 ③ 测试点(见 wr7) | 审计 ⑥同函数第二处;卡面 §9 L3 原停卡条款经用户裁转并修 |
**完成定义**:
1. p1–p6 落地;合法路径全套闸按域选档全绿;
2. wr 断言绿(p5 封印传导/p6 违约回调两条新断言+p2 锁域回归);
3. 撤销证明三条(p1/p5/p6 各一——§8);三份产出物写齐(T2)。
1. p1–p7 落地;合法路径闸按域选档处置闭合——本批属代码面(`game/` 下非 `.md`),验收=`tools/run_all_gates.sh --code`;**闸 09 现状不是绿**:09 静态扫描基线为迭代 38 带红合并时用户特批登记的存量红(`game/tests/.gates/baseline.json` 闸 09 `exit=1`、标记 `user-approved-iter38`),p5 接线两行加在 `battle_orchestrator.gd`(现 1313 行,基线 `max-file-length` 登记 1302)=同键继续恶化,p6/p7 给 `rng_service.gd` 加成员与两行是否出 NEW 键须实测(`gdstyle_gate.py` 的 SCAN_DIRS=core/data/presentation,不含 `game/tests/`,故新测试文件本身零影响)——**实现段开工前由用户二选一处置:随批还债(压缩该文件行数)或经批准刷新基线,禁以「闸 09 全绿」为完成定义**;其余闸段全绿;
2. wr 断言绿(负面套件三点=wr5 封印传导+缺省、wr6 未知标签违约通道、wr7 未播种违约通道;加 p2 锁域回归与 wr4 夹具断言);
3. 撤销证明四条(p1/p5/p6/p7 各一——§8.1,负面套件那三条按退出码口径判红);三份产出物写齐(T2)。
## 2. 设计事实源
| # | 出处 | 取用条款 |
|---|---|---|
| D1 | 工程证据指认=审计报告 §三「其余小件」段(§90-95 逐件)+本卡 §3 实查重定位 | 五件清单与判据 |
| D1 | 工程证据指认=审计报告 §三「其余小件」段(§90-95 逐件)+本卡 §3 实查重定位 | 六件清单与判据 |
| D2 | [architecture](../design/engineering/architecture/architecture.md)「局态一律住 RunScope」+单口纪律 | p2/p4 依据 |
| D3 | [code-conventions](../design/engineering/code-conventions.md) §1(死代码/重复语句)+fail-fast 红线 | p1/p3/p5/p6 依据 |
| D4 | 2026-10-26 用户令「全六件立项」 | 立项凭据 |
| D5 | 2026-10-26 用户裁「把需求变更给修正确」(迭代 38 卡② 停卡呈报后)——批准 v1.3 两处载体修订=wr5/wr6/wr7 落独立负面套件+p7 并修 | 停卡修订凭据 |
## 3. 现状事实(2026-10-26 写卡会话实查于 master eb04313b——审计 2026-10-24 行号已按拆件后重定位;开工日 T0 复核行号)
## 3. 现状事实(2026-10-26 写卡会话实查,v1.3 复核轮按迭代 38 合回点 8ea7cfba 重锚行号——审计 2026-10-24 行号已按拆件后重定位;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| S1 | `_sync_status_entry` 现住拆出件::111 死变量 battle_live(赋值零消费);首组四句 :112-116 与重复四句 :119-122 逐字相同(:117-118 注释自认「重复语句在案」;:123-124 调试角标注释独立保留) | `game/presentation/main_overlay_flow.gd:107-124` |
| S2 | confirm 旁路三处:main_overlay_flow.gd:88 open(选档删除确认流)+main.gd:312/:321 close(确认/取消两分支);单口 `_open_modal`→`_modal_flow.open(m)`(挂起兜底/排播排空/遮挡记账/开侧同步——main.gd:282-283 注释);confirm_dialog:open(:36 设文案)/close(:46)/is_open(:50),:40-41 注释「树序由构建序保证」与 ModalFlow 登记序口径不符 | `game/presentation/main_overlay_flow.gd:88`;`game/presentation/main.gd:312/321/282-286`;`game/presentation/views/confirm_dialog.gd:36-50` |
| S3 | settle_batch 两入口::722(棋盘动作批次——treasure 劫持检查后直取)与 :749(stop 批次——:746 有 `_input_locked` 守卫)均无 settlement null 防护 | `game/presentation/main.gd:722/749` |
| S2 | confirm 旁路三处:main_overlay_flow.gd:88 open(选档删除确认流)+main.gd:311/:320 close(确认/取消两分支);单口 `_open_modal`→`_modal_flow.open(m)`(挂起兜底/排播排空/遮挡记账/开侧同步——main.gd:281-282 注释);confirm_dialog:open(:36 设文案)/close(:46)/is_open(:50),:40-41 注释「树序由构建序保证」与 ModalFlow 登记序口径不符 | `game/presentation/main_overlay_flow.gd:88`;`game/presentation/main.gd:311/320/281-285`;`game/presentation/views/confirm_dialog.gd:36-50` |
| S3 | settle_batch 两入口::721(棋盘动作批次——treasure 劫持检查后直取)与 :748(stop 批次——:743 有 `_input_locked` 守卫)均无 settlement null 防护 | `game/presentation/main.gd:721/748` |
| S4 | row_pacer 常驻队列 `_rows: Array[Variant]`(:11)+现成公开 `flush()`(:49);`_begin_session`(main.gd:175)现不 flush | `game/presentation/row_pacer.gd:11/49`;`game/presentation/main.gd:175` |
| S5 | 两协作件 `_fatal`=push_error+assert(false) 两行(无兜底——board_generator 实址 :396-398,grilling 订正 v1.0 的 :391-393;reward_economy :366-368 准确);组装点在 orchestrator(:278 `BoardGenerator.new()`、:283 `RewardEconomy.new(db, rng)`);orchestrator 自身 `_fatal`(:1292)=push_error+`battle_result = "fatal_error"` 封印+assert(release 剥 assert 后封印仍在=唯一阻断面) | `game/core/board_generator.gd:396-398`;`game/core/reward_economy.gd:366-368`;`game/core/battle_orchestrator.gd:278/283/1292-1295` |
| S5 | 两协作件 `_fatal`=push_error+assert(false) 两行(无兜底——board_generator 实址 :396-398,grilling 订正 v1.0 的 :391-393;reward_economy :366-368 准确);组装点在 orchestrator(:285 `BoardGenerator.new()`、:290 `RewardEconomy.new(db, rng)`);orchestrator 自身 `_fatal`(:1304)=push_error+`battle_result = "fatal_error"` 封印+assert(release 剥 assert 后封印仍在=唯一阻断面) | `game/core/board_generator.gd:396-398`;`game/core/reward_economy.gd:366-368`;`game/core/battle_orchestrator.gd:285/290/1304-1307` |
| S6 | `open_stream` 未知标签分支(:101-103)push_error+assert 后直落 `_master_seed` 检查与发号——无 return;PURPOSE_TAGS 封闭词表(头注 EC12) | `game/core/rng_service.gd:100-112` |
| S7 | 同函数 `_master_seed < 0` 分支(:104-106,2026-10-26 v1.3 复核码面仍在)=push_error+`assert(false, "未播种取数致命(EC7)")` 后同样无 return,直落 :107 起的取号与发号段——debug 下 assert 只中断当前函数、控制流回调用方,release 下剥 assert 后静默发号 | `game/core/rng_service.gd:104-112` |
## 4. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 改动面封闭**:p1–p6 只动 §1 所列行;合法路径(无违约输入)行为逐位不变——结算、随机发号、排播时序、角标同步零变化;p2 是唯一申报的行为改动(锁域归位)。
🔴 **契约 1 · 改动面封闭**:p1–p7 只动 §1 所列行;合法路径(无违约输入)行为逐位不变——结算、随机发号、排播时序、角标同步零变化;p2 是唯一申报的行为改动(锁域归位)。
🔴 **契约 6 · 负面载体不得回落现役套件**(v1.3 停卡修订立):违约取证若被写回现役非负面套件,闸 02 必红且违 test-conventions §5 的显式标记要求——实装段禁自行「复用既有套件省事」。三测试点的回归态判据**只能取「改前改后真有差异」的可观测面**=handler 成员与调用点是否存在(记录位)、封印是否落;`return` 位与计数器读数在 debug 下两态不可判别(assert 先中断函数本体,控制流回调用方,`:107-108` 的推计数段谁也到不了),把它当运行期判据=假绿——p6/p7 的 `return` 走静态判据+grep 在位+评审注记(同 wr3 手法)。
🔴 **契约 2 · 缺省零变化**:p5/p6 的 handler 缺省(`Callable()`)时两件 `_fatal` 与 `open_stream` 行为逐字等于现状——禁顺手改 push_error 文案与 assert 条件。
@@ -68,7 +77,7 @@
## 5. 范围边界
**做**:p1–p6;新断言两条;探针回归;撤销证明;产出物。
**做**:p1–p7;一个负面套件新件(三测试点)+`run_all.gd` manifest 登记一行;wr2 锁域回归与 wr4 夹具断言;探针回归;撤销证明;产出物。
**不做**:
- 件②level_map 三段(独立卡:独立卡已随迭代 38 卡① 实现合回并按「吸收即死」退役(git 提交 b85b3b45/8ea7cfba 可考));
@@ -80,7 +89,8 @@
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| `待办清单.md` | 来源条目(六件候审)状态推进:五件归本卡+件②归独立卡+用户点名记录 | 反哺点 · 列清单(①:状态核对注记) |
| `待办清单.md` | 来源条目状态:原「结构审查未立项小件候审」六件候审条目 2026-10-26 已并入「gdstyle 存量债全量清偿」条目波 7(本卡为其登记在册的现成卡),本卡出账随该条目波 7 推进,禁另立重复条目 | 反哺点 · 列清单(①:状态归属注记) |
| `design/engineering/test-conventions.md` §5 | 负面套件豁免第 2 闸的规则**已在册、零修订预期**——本卡只是首次把「运行期违约通道取证」这条落位规则用满(先例三件在册);如复核认为该规则该升级为「违约通道类需求点必须落负面套件」的显式条款,列反哺点由文档批裁 | 反哺点 · 列清单(③:预期零改动注记) |
| [architecture](../design/engineering/architecture/architecture.md) 模块归属表 | p2/p4 若涉契约表述(单口纪律/RunScope 条款现行表述已覆盖——预期零改动;T0 核) | 反哺点 · 列清单(②:预期零改动注记) |
## 7. 任务卡
@@ -95,48 +105,56 @@
| `game/presentation/row_pacer.gd` | 零改动(flush :49 现成被消费) | — |
| `game/core/board_generator.gd` | p5 handler 注入面(复用既有·修改) | 非行为(缺省零变化)→ wr5 |
| `game/core/reward_economy.gd` | p5 同上(复用既有·修改) | 非行为 → wr5 |
| `game/core/battle_orchestrator.gd` | p5 组装接线两行(:278/:283 后各一行)(复用既有·修改) | 非行为(接线)→ wr5 |
| `game/core/rng_service.gd` | p6 handler+return(复用既有·修改) | 非行为(缺省零变化)→ wr6 |
| `game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd` | wr5 断言(封印传导)(复用既有·增断言) | 断言面 |
| `game/tests/unit/core/`(rng 现役套件,T0 定名) | wr6 断言(违约回调+返回 null)(复用既有·增断言) | 断言面 |
| `game/core/battle_orchestrator.gd` | p5 组装接线两行(:285/:290 后各一行)(复用既有·修改) | 非行为(接线)→ wr5 |
| `game/core/rng_service.gd` | p6 handler+return(未知标签分支)+p7 同款(未播种分支)(复用既有·修改) | 非行为(缺省零变化)→ wr6/wr7 |
| `game/tests/unit/core/run_time_fatal_test.gd` | **新增负面套件**(wr5+wr6+wr7 三测试点;名系提案,终名属白名单 2 代拍板范围)(新增文件) | 断言面(退出码判据) |
| `game/tests/run_all.gd` | manifest 登记一行 `expect=1, negative=true`(:73 先例同款) | 闸登记面 |
| `game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd` | **零改动**(v1.2 曾把 wr5 写进本件,v1.3 迁出——现役非负面套件禁承载违约取证) | — |
(零新增文件、零新增函数——p5/p6 是成员变量+分支段。)
(新增一处=运行期违约通道负面套件+manifest 登记一行;其余为既有件内成员/分支/行级改动,p5/p6/p7 是成员变量+分支段。)
### 接口块
- **p5 形态**(两件同款):`var fatal_handler: Callable = Callable()`(成员声明,注释「违约中止通道——缺省退化 push_error+assert;组装层注入 orchestrator._fatal 经封印真中止」);`_fatal` 体内 assert 前 `if fatal_handler.is_valid(): fatal_handler.call(msg)`。
- **p5 接线**:orchestrator 组装点 `:278` 后 `_board_generator.fatal_handler = _fatal`、`:283` 后 `_reward_economy.fatal_handler = _fatal`。
- **p5 接线**:orchestrator 组装点 `:285`(`_board_generator = BoardGenerator.new()`)后 `_board_generator.fatal_handler = _fatal`、`:290`(`_reward_economy = RewardEconomy.new(db, rng)`)后 `_reward_economy.fatal_handler = _fatal`(行号=v1.3 按迭代 38 合回后 master 重锚;orchestrator 自身 `_fatal` 现址 :1304)。
- **p6 形态**:`var violation_handler: Callable = Callable()`;未知标签分支=push_error + `if violation_handler.is_valid(): violation_handler.call(purpose)` + `assert(false, …)`(handler 有效时调用在 assert 前——debug 注入测试面可断言)+ `return null`。
- **wr5 断言**(round_flow_skill_pool_test 增,V6 装配形态同卡 A):构造 orchestrator → 直调 `_board_generator._fatal("测试违约")` → 断言 `oc.battle_result == "fatal_error"`(封印传导成立);缺省形态断言(新构造件不接线 → 直调 → battle_result 不受影响——契约 2)。
- **wr6 断言**(rng 现役套件增,T0 定名——rng_service 现役单测所在套件):注入 `violation_handler`(记录型 Callable)→ `open_stream("bogus_purpose")` → 断言 handler 被调(记录位真)且返回值为 null。
- **p7 形态**(v1.3 新增):`_master_seed < 0` 分支同款——push_error + 复用 p6 的 `violation_handler`(有效则调用,传 purpose 标签)+ `assert(false, …)` + `return null`;缺省(不注入)时行为逐字等于现状(契约 2 同样约束 p7)。分支次序事实:未知标签检查(:101-103)在播种检查(:104-106)之前,故 p7 通道只能用**在册合法标签**触达。
- **wr5/wr6/wr7 三点**:全部落**一个新增负面套件** `game/tests/unit/core/run_time_fatal_test.gd`(extends SceneTree,退出码判据:全绿尾行 `quit(1)`、回归态 `quit(2)`——`extended_row_violation_test` 同款形态),manifest 登记 `{"path": …, "expect": 1, "negative": true}`。
- **载体三纪律**(v1.3 复核轮钉死,违此即 L3 停呈):① **注入只经编排器组装点**(:285/:290 两行接线),**禁在测试体内手工 `bg.fatal_handler = oc._fatal`**——手工接线会让撤销证明②(回退组装点)空转;② 三测试点**各用新建 `RngServiceCore` 实例**,禁跨点复用、禁跑过取号后再播种(`set_master_seed` 自带 `assert(_counter == 0)`,:60——复用实例必炸在播种步);③ **回归态判据只能取「改前改后真有差异」的可观测面**——可差异的面只有两处:handler **成员与调用点是否存在**(记录位真假)与**封印是否落**。`return` 位与计数器读数在 debug 下不可判别:assert 已先中断 `open_stream` 本体,「装了 return」与「删掉 return」两态同样到不了 `:107-108` 的推计数段、同样表现为「拿不到可用 RNG」——**拿这两面当撤销证明=必假绿**;故 p6/p7 的 `return` 位按 wr3 同款「静态判据+代码评审注记(+grep 该分支 return 行在位)」承接,**禁写「违约行照发号/未播种照取号」式运行期判据**(照实装必触发 §9 L3 再停卡)。
- ① wr5 封印传导(p5):装配构造真实编排器(V6 形态,`round_flow_skill_pool_test` 现成装配链可照抄)→ 违约经**组装点注入的** handler 传导 → 直调 `_board_generator._fatal("测试违约")` → 验 `oc.battle_result == "fatal_error"`(`_fatal` :1304 先落封印再 assert);**回归态**=组装点接线被移除 → 协作件违约不落封印 → `quit(2)`。
- ② wr6 未知标签违约通道(p6):新建实例 → 注入记录型 `violation_handler` → `open_stream("bogus_purpose")`(出词表)→ 验 handler **记录位为真**(判据主体)+拿不到可用 RNG;**对照**=新实例播种后取在册合法标签(`board_gen`)返回可用 RNG 且 `counter()` +1;**回归态判据**=handler 成员与调用点不存在(未实装 p6 形态)时注入无处可注 → 记录位守不住 → `quit(2)`;`return` 位本体不可观测,走 grep 在位+评审注记。
- ③ wr7 未播种取数通道(p7):新建实例**不播种**(`_master_seed` 缺省 -1,:23)→ 注入 handler → `open_stream("board_gen")`——**必须用在册合法标签**:`PURPOSE_TAGS`(:9)不含 `adventure`,且未知标签检查排在播种检查之前,出错标签会让本点退化成测试点②(撤销证明④空转);验 handler **记录位为真**+拿不到可用 RNG;**对照**=同标签播种后照常取号;**回归态判据**=该分支 handler 调用点缺失 → 记录位守不住 → `quit(2)`;`return` 位同走静态面。
- **缺省形态断言**(契约 2):新构造件不接线 → 直调 `_fatal` → `battle_result` 不受影响;不注入 handler 的 rng 件在合法标签与已播种路径逐位不变(本段在**违约注入之前**跑完,验完再触发违约——否则 SCRIPT ERROR 混入正向判定)。
- **wr2 回归**:save_select/confirm 流现役探针(ui_click_probe 选档删除确认段——T0 定位)直跑绿+锁域断言(confirm 开时输入锁生效——若现役断言未覆盖则增一条)。
- **取用**:无。**最窄闸**:round_flow_skill_pool_test+rng 套件+ui_click_probe 直跑;全套闸按本批改动域选档。
- **取用**:无。**最窄闸**:新负面套件直跑(期望退出码 1)+`run_all.gd` 登记行核在位+pacing/round_flow 现役套件直跑绿+ui_click_probe 直跑;全套闸按本批改动域选档。
### 落位与可复用性预检
- **零新增件**:全部为既有件内成员/分支/行级改动;flush/pending_rows 复用 row_pacer 现成公开面。
- **复用面**:p5 复用 orchestrator 既有 `_fatal` 封印(不造第二中止机制——审计「可经宿主注入」的最小实现);p4 复用 flush();p2 复用 ModalFlow 单口既有编排。
- **唯一面**:违约通道各件唯一(fatal_handler/violation_handler 各一处、组装接线单点);confirm 开合收口后单口唯一。
- **新增件一处**:`game/tests/unit/core/run_time_fatal_test.gd`(运行期违约通道负面套件)——**为什么必须新增**=违约取证必产不可捕获的 SCRIPT ERROR 行,现役非负面套件被闸 02 扫描覆盖,落位无处可复用(req-card 第 13 条落位预检的答题;闸侧 `negative=true` 豁免机制与 `extended_row_violation_test` 形态照抄,闸件本身零改动)。其余全部为既有件内成员/分支/行级改动;flush/pending_rows 复用 row_pacer 现成公开面。
- **复用面**:p5 复用 orchestrator 既有 `_fatal` 封印(不造第二中止机制——审计「可经宿主注入」的最小实现);p4 复用 flush();p2 复用 ModalFlow 单口既有编排;p7 复用 p6 的 `violation_handler` 成员(不新开第二回调面);负面套件复用 run_all 的 `negative` 豁免通道。
- **唯一面**:违约通道各件唯一(`fatal_handler` 两件各一处;`violation_handler` rng_service 单件一处、覆盖未知标签与未播种两条分支;组装接线单点);confirm 开合收口后单口唯一。
- **分层**:core 件零 UI 依赖不破(Callable 注入非 UI 引用;组装接线在 core 内层间);presentation 收口经既有 ModalFlow。
### T0 事实坐实(≈0.1d)
- [ ] 复核 S1–S6(重点:S2 ModalFlow.open 与 confirm_dialog.open 先后序、wr6 落点套件名、wr2 探针段定位);确认 rng 套件与 pacing 回归面。可核查结果:定位清单进实现报告素材。
- [ ] 复核 S1–S7(重点:S2 ModalFlow.open 与 confirm_dialog.open 先后序、S6/S7 两分支现行行号、wr2 探针段定位);确认 pacing 回归面与 `round_flow_skill_pool_test` 装配链(wr5 ① 照抄用)。可核查结果:定位清单进实现报告素材。
### T1 定点修五件+断言(≈0.5d)
### T1 定点修六件+负面套件(≈0.5d)
- [ ] 实装 p1/p3/p4(删句/防护/flush)+wr4 带夹具断言。可核查结果:grep 死变量与重复组零命中(:123-124 保留段除外);pacing_queue_test 直跑绿;wr4 断言绿。
- [ ] 实装 p5/p6(handler 面+接线+return)。可核查结果:wr5/wr6 断言绿;缺省形态断言绿(契约 2)。
- [ ] 实装 p5/p6/p7(handler 面+接线+两分支 return)。可核查结果:缺省形态断言绿(契约 2);负面套件三测试点尚未建时先直跑 rng/board_generator 相关现役套件确认合法路径零红。
- [ ] 建负面套件 `run_time_fatal_test.gd` 三测试点+`run_all.gd` manifest 登记一行(`expect=1, negative=true`)+**新件的 `.gd.uid` 边车随批入库**(`.gitignore:6`「.uid 必须提交」——迭代 38 卡④ 曾漏带边车留未跟踪态)。可核查结果:本件直跑退出码恰 1;闸 02 对本件不判红(负面豁免生效);登记行与 `:73` 先例形态逐字段一致;`git status` 无残留 `?? *.uid`。
- [ ] 实装 p2(confirm 三处收口+注释)。可核查结果:wr2 回归绿;grep `confirm_dialog.open(`/`.close()` 直调仅剩方法定义与收口内调用。
- [ ] 验证步骤:全套闸按域选档跑一次全绿。
### T2 撤销证明+产出物落位卡(≈0.15d,末卡)
- [ ] 撤销证明三条:①回退 p1 hunk(死变量还原)→ grep battle_live 命中即红(或静态扫描面);②回退 p5 接线两行 → wr5 封印传导断言红(battle_result 不变)→ 还原复绿;③回退 p6 hunk(return 与 handler 还原)→ wr6 断言红(返回非 null)→ 还原复绿。记录进实现报告。
- [ ] 写齐三份产出物(实现报告〔五件逐件核对表+wr 断言读数+实机目检总清单——选档删除确认流目检一项(p2 锁域归位后行为目检)〕/代拍板追认单/反哺点清单〔§6 逐条落点〕)。
- [ ] 撤销证明四条:①回退 p1 hunk(死变量还原)→ grep `battle_live` 命中即红;②回退 p5 组装点接线两行 → 协作件违约不落封印 → 本件退出码 0 ≠ expect 1(wr5 测试点① `quit(2)`)→ 还原复绿;③回退 p6 hunk(handler 成员与调用点整体不存在→注入无处落)→ wr6 记录位守不住 → 退出码非 1 → 还原复绿;④回退 p7 hunk(同上,针对未播种分支调用点)→ wr7 记录位守不住 → 退出码非 1 → 还原复绿。**三条负面套件套一律以退出码为判据,禁写「断言变红」式口径**(assert 不改进程退出码,红只落在 `quit(2)`);p6/p7 的 `return` 位不作运行期判据(debug 下两态不可判别,见契约 6),以「grep 该分支 return 行在位+代码评审注记」出证并在实现报告如实标注观测面局限。记录进实现报告。
- [ ] 清单同步:`python tools/extract_checks.py --extract --force` 重生成 `game/tests/验证集清单.md`(清单已存在时无 `--force` 拒写并返 2),再 `--diff` 对账零差异。**预期零新增行**:提取器只认 `check(` 形态,负面套件以 `quit()` 承载、`extended_row_violation_test` 在册先例即零 check 行;新件仍会进清单头部的源文件列表——该变化不算断言新增,禁为凑行去补 `Kit.check`。
- [ ] 写齐三份产出物(实现报告〔六件逐件核对表+wr 断言读数+实机目检总清单——选档删除确认流目检一项(p2 锁域归位后行为目检)〕/代拍板追认单/反哺点清单〔§6 逐条落点〕)。
- [ ] 合并前置:独立验收审计(§8.3)逐行「通过」。
**估时合计 ≈0.75d**。编排注记:五件皆小而独立——与件②卡(levelmap)、卡 A 同迭代分波无冲突;p2 有锁域行为面(wr2 回归是合并前置)。
**估时合计 ≈0.85d**(v1.3 停卡修订随增 ≈0.1d=负面套件新件+manifest 登记+清单对账;p7 并修增量落在同一 handler 形态内,随增 0)。编排注记:六件皆小而独立——与卡 A 同迭代分波无冲突;p2 有锁域行为面(wr2 回归是合并前置);**v1.3 起验收载体已定死为负面套件,编排段与实现段禁再把 wr5/wr6/wr7 挪回现役套件**。
## 8. 验证闸
@@ -145,42 +163,49 @@
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销证明 |
|---|---|---|---|---|---|
| wr1 死代码与重复句清除(p1) | main_overlay_flow.gd:111+:117-122 | grep 判据零命中(:123-124 保留段除外)〔wr1〕+现役角标同步探针绿 | 静态+探针 | grep 真实跑批+ui 探针 | 回退 p1 hunk → grep 命中即红(T2①) |
| wr2 confirm 收口锁域归位(p2) | main_overlay_flow.gd:88+main.gd:312/321 | save_select/confirm 回归探针段〔wr2〕+锁域断言 | 探针 | 选档删除确认真实流(探针驱动) | 回退 p2 hunk → 收口判据 grep 命中即红+锁域断言红 |
| wr3 入口 null 防护(p3) | main.gd:722/749 前置防护 | 防护分支单测/静态判据〔wr3〕(防护态构造经探针锁谓词异常态不可达——静态面+代码评审注记申报) | 静态 | — | 回退 p3 hunk → grep 防护行零命中红 |
| wr2 confirm 收口锁域归位(p2) | main_overlay_flow.gd:88+main.gd:311/320 | save_select/confirm 回归探针段〔wr2〕+锁域断言 | 探针 | 选档删除确认真实流(探针驱动) | 回退 p2 hunk → 收口判据 grep 命中即红+锁域断言红 |
| wr3 入口 null 防护(p3) | main.gd:721/748 前置防护 | 防护分支单测/静态判据〔wr3〕(防护态构造经探针锁谓词异常态不可达——静态面+代码评审注记申报) | 静态 | — | 回退 p3 hunk → grep 防护行零命中红 |
| wr4 会话 flush(p4) | main.gd:175 一行 | pacing_queue_test+会话更替断言〔wr4〕(新增:**前置夹具入队若干行再调 begin_session**,断言其后 pending_rows()==0——无夹具则改前改后皆绿钉不住〔grilling 订正〕) | 单元 | _begin_session 真实调用路径+enqueue 真实入队面 | 回退 p4 hunk → 带夹具断言红(残留非零) |
| wr5 fatal 封印传导(p5) | 两件 handler+orchestrator 接线 | wr5 断言两条(传导+缺省)〔wr5〕 | 单元 | V6 装配构造真实编排器路径 | 回退接线 → 传导断言红(T2②) |
| wr6 违约回调与 return(p6) | rng_service handler+return | wr6 断言〔wr6〕(handler 被调+返回 null) | 单元 | open_stream 真实调用路径 | 回退 p6 hunk → 返回值断言红(T2③) |
| wr7 产出物 | T2 三份 | 件核〔wr7〕 | — | — | 缺项红 |
| wr5 fatal 封印传导(p5) | 两件 handler+orchestrator 组装点接线(:285/:290) | 负面套件测试点①(含缺省形态断言;注入只经组装点,禁测试内手工接线)〔wr5〕 | 单元(负面) | V6 装配构造真实编排器路径 | 回退接线两行 → 本件退出码 0 ≠ expect 1(T2②) |
| wr6 未知标签违约通道(p6) | rng_service 未知标签分支 handler+return | 负面套件测试点②(handler 记录位为判据主体+拿不到可用 RNG+在册标签对照)〔wr6〕 | 单元(负面) | open_stream 真实调用路径 | 回退 p6 hunk(成员与调用点整体消失→注入无处落)→ 记录位守不住 → 退出码非 1(T2③);`return` 位=grep 在位+评审注记(debug 下两态不可判别,禁当运行期判据) |
| wr7 未播种取数通道(p7) | rng_service 未播种分支 handler+return | 负面套件测试点③(在册合法标签+不播种实例;handler 记录位+拿不到可用 RNG+播种对照)〔wr7〕 | 单元(负面) | 未播种的 open_stream 真实路径 | 回退 p7 hunk(该分支调用点缺失)→ 记录位守不住 → 退出码非 1(T2④);`return` 位同走静态面 |
| wr8 负面载体登记 | 新件+`run_all.gd` manifest 一行 | 登记行在位判据〔wr8〕(`expect=1` 与 `negative=true` 两字段齐备,静态 grep+评审注记——全仓无闸对账盘上测试文件与 manifest,禁写「删登记行即红」的不存在判据)+闸 02 对本件不判红+验证集清单 --diff 零差异 | 闸登记 | run_all 真实批跑路径 | 删 `negative=true` 标记而保留登记行 → 本件输出被闸 02 捕获判 FAIL |
| wr9 产出物 | T2 三份 | 件核〔wr9〕 | — | — | 缺项红 |
### 8.2 测试削弱申报
零(既有断言零改动;新增断言四条;wr3 防护分支不可达性以静态判据+申报承载——不虚构不可达态的运行期断言)。
零(既有断言零改动;新增断言四条=wr4 夹具断言+wr2 锁域断言(若现役未覆盖)+负面套件内两处缺省形态断言,其中违约三点以退出码承载、非 `Kit.check` 形态;wr5/wr6/wr7 由现役套件迁至独立文件属**载体迁移**,被迁走的断言在 v1.2 从未合回 master,不存在削弱既有验证面;wr3 防护分支不可达性以静态判据+申报承载——不虚构不可达态的运行期断言)。
### 8.3 独立验收审计
入口=未参与实现的会话或子代理;报告落 `reports/iter<N>-验收审计-<日期>.md`;抽查重点=契约 1/2(合法路径逐位不变——缺省形态断言在案)、p2 锁域回归读数、p5 接线单点、p6 return 位置(assert 语义保持)。未过不得合并。
入口=未参与实现的会话或子代理;报告落 `reports/iter<N>-验收审计-<日期>.md`(多卡同批须带卡号位防撞名);抽查重点=契约 1/2(合法路径逐位不变——缺省形态断言在案)、p2 锁域回归读数、p5 接线单点、p6/p7 两分支 return 位置(assert 语义保持)、**契约 6 与载体三纪律四判据**=① manifest 的 `negative=true`+`expect=1` 在册;② 三测试点回归态判据真能变红且**只取有差异面**(变异注入实测:抹掉 handler 成员与调用点/拆掉组装接线 → 退出码非 1;若审计发现判据落在 `return` 位或计数器这类 debug 下两态不可辨的面=阻断,防假绿);③ 注入面只在编排器组装点(`grep fatal_handler` 在测试文件内零命中——防撤销证明②空转);④ 三测试点各用新建实例(复用实例会撞 `assert(_counter == 0)`,撞即证纪律失效)。未过不得合并。
## 9. 异常分级
- **L1(自救)**:p2 收口先后序形态;p5/p6 注释措辞;断言挂点。
- **L2(记录继续)**:行号漂移;wr6 落点套件名变化。
- **L3(停机呈报)**:ModalFlow.open 与 confirm_dialog.open 语义冲突(双显示/挂起兜底破坏确认流——收口形态失配停呈);p4 flush 引入排播节奏变化(契约 4 破);p5 接线后协作件违约不落封印(传导断链);发现第三处 `_fatal` 同型软回退(审计清单外);p6 同函数 master_seed<0 分支(:104-106)同款 assert 后无 return——grilling 点名属同病根第二处:**单通道停卡呈报**(不并修——扩点违契约 1 改动面封闭与实现段零裁断;呈报后由用户裁另立或并批)。
- **L1(自救)**:p2 收口先后序形态;p5/p6/p7 注释措辞;断言挂点与负面套件事件命名(在 `*_violation_test`/`*_fatal_test` 既有约定内)。
- **L2(记录继续)**:行号漂移;manifest 登记行的注释尾缀现位变化。
- **L3(停机呈报)**:ModalFlow.open 与 confirm_dialog.open 语义冲突(双显示/挂起兜底破坏确认流——收口形态失配停呈);p4 flush 引入排播节奏变化(契约 4 破);p5 接线后协作件违约不落封印(传导断链);发现第三处 `_fatal` 同型软回退(审计清单外);负面套件三测试点的回归态判据不变红(抹掉 handler 成员与调用点、或拆掉组装接线后本件仍出 1——说明判据取到了 debug 下两态不可辨的面,停呈禁改落位自救);出现测试体内手工接线(违载体纪律①,撤销证明②会空转);跨测试点复用同一 rng 实例致播种撞 `assert(_counter == 0)`(违纪律②——改正方向是每点新建实例,禁动播种断言)。
- v1.2 曾列的「p6 同函数 master_seed<0 分支(:104-106)单通道停卡呈报」条款**已由用户裁并修,随 v1.3 出账**(转 §1 p7+wr7);同型第四处仍走本条停呈通道。
## 10. 代拍板白名单(超清单必呈报)
1. p5/p6 成员命名与注释措辞。
2. wr 断言挂点与消息文本。
1. p5/p6/p7 成员命名与注释措辞(p7 复用 p6 的 `violation_handler`,禁另开第二成员)。
2. wr 断言挂点与消息文本、负面套件文件名终名(提案名 `run_time_fatal_test.gd`,须落 `*_violation_test`/`*_fatal_test` 既有约定内)。
3. p2 收口的先后序实现形态(ModalFlow.open 语义 T0 核后定形)。
4. 提交切分与 worktree 分支命名。
## 11. 待裁点
**零待裁点,开工门=U0。** 灰色推导两处(呈报可否决,随 T2 反哺点):①p5 走「组装层传导 orchestrator 封印」而非回调穿透到 presentation——依据=core 件零 UI 依赖红线+复用既有封印零新中止机制;②wr3 防护分支验收用静态判据不造运行期断言——依据=分支在锁谓词正常态不可达,虚构异常态夹具违背「真实入口」口径。
**零待裁点,开工门=U0。** 灰色推导四处(呈报可否决,随 T2 反哺点):①p5 走「组装层传导 orchestrator 封印」而非回调穿透到 presentation——依据=core 件零 UI 依赖红线+复用既有封印零新中止机制;②wr3 防护分支验收用静态判据不造运行期断言——依据=分支在锁谓词正常态不可达,虚构异常态夹具违背「真实入口」口径;③wr5/wr6/wr7 载体取独立负面套件而非改造闸 02 扫描规则——依据=闸豁免机制本为此设且已在册三件先例,改扫描规则属动闸件(工程改动面)且会削弱「断言不终止进程」的防假绿能力(test-conventions §5 三硬闸的存在理由);④p7 并修而非另立——依据=用户 2026-10-26 裁(实现报告 §三建议案),且 p7 与 p6 同函数同形态、复用同一 handler 成员,改动面仍封闭在 §1 所列行内(违不违契约 1 的答案=不违,因契约 1 的名单随 v1.3 扩到 p7)。
## 12. 自审六查与复核记录
**自审六查(2026-10-26 写卡会话)**:①规格覆盖——p1–p6→T1/wr1–wr6、撤销/产出物→T2/wr7;②步骤扫描——T1 三步各挂可核查结果;③类型一致性——接口块形态与 S1–S6 实查一致;④审查焦点——缺省零变化(契约 2+缺省断言)、锁域回归(wr2)、封印传导链(契约 3)、排播节奏护栏(契约 4);⑤篇幅比例——零实现体;⑥落位预检——零新增件、复用面(flush/ModalFlow/封印)已答。
**自审六查(v1.3 复核轮,2026-10-26)**:①规格覆盖——p1–p7→T1、wr1–wr9→§8.1 逐行有承接(wr7 承 p7、wr8 承登记面、wr9 承产出物)、撤销证明四条与清单同步→T2;②步骤扫描——T0 一步+T1 四步+T2 四步各挂可核查结果;③类型一致性——接口块三测试点与 S5/S6/S7 实查一致,退出码判据与 `run_all.gd` 的 `expect`/`negative` 字段类型一致,wr7 所用标签在册(`PURPOSE_TAGS` 无 `adventure`,取 `board_gen`);④审查焦点——缺省零变化(契约 2 覆盖 p5/p6/p7)、锁域回归(wr2)、封印传导链(契约 3)、排播节奏护栏(契约 4)、**违约取证落位与闸 02 互斥+回归态判据只取可观测面(契约 6 与载体三纪律——本轮主判点)**;⑤篇幅比例——零实现体;⑥落位预检——新增一处(负面套件)已答「为什么不能复用」,复用面(flush/ModalFlow/封印/negative 豁免通道)齐备。
**grilling 一轮复核记录(2026-10-26,独立子代理对抗复核,判「通过(附四应修+一建议)」)**:①wr4 撤销证明不可执行(无夹具时改前改后皆绿)——v1.1 折入前置夹具断言;②p1 删除边界误圈(:123 调试角标注释非重复组;首组实为 :112-116、重复组 :119-122)——订正;③S5 board_generator _fatal 实址 :396-398——订正;④缺 req-card 第 13 条——立契约 5;⑤建议=p6 同函数 master_seed<0 分支(:104-106)同款 assert 后无 return——L3 点名(二轮收紧为单通道停卡呈报)。复核确认项:S2-S4 行号逐条命中、wr3 静态判据申报诚实、p5 载体成立(round_flow_skill_pool_test 现有装配形态)、handler-before-assert 排序与 headless 实测语义相容。
**二轮闭合复检(2026-10-26,判「通过(附三应修))**:四应修核闭合(wr4 夹具/p1 边界/S5 实址/契约 5);残留三处随本轮一并处理——wr1 行与 S5 出处列的旧行号订正、master_seed 条款由「并修或停卡」收紧为单通道「停卡呈报」(并修路线违契约 1 与实现段零裁断)。
**迭代 38 实现段停卡呈报(2026-10-26,非复核件·上游缺陷移交)**:p1–p6 实装完成后,wr5/wr6 落位核查发现 v1.2 处方不成立——headless 下 `assert` 失败必产 `SCRIPT ERROR`、不可捕获且只中断当前函数,而 `run_all.gd` 对非负面套件的判定是「输出含该标记即 FAIL」(闸 02,test-conventions §5 三硬闸之二),故「wr5/wr6 绿+全套闸全绿」在同一跑次内互斥。改动全数还原、零提交(WIP 补丁 172 行留 `C:/Users/DK/AppData/Local/Temp/iter38_card2_wip.patch`;重启按合回后 master 重核行号重做,禁直接 apply)。同款缺陷卡④ 在 grilling 一轮已撞见并以独立负面套件承载(`extended_row_violation_test`,manifest `expect=1, negative=true`)——卡② 两轮复核未复现该判点,因直跑单套件不经过闸 02 扫描,只有批末全量闸才暴露。
**v1.3 裁定与判据(2026-10-26,用户裁「把需求变更给修正确」)**:①违约取证(wr5/wr6/wr7)只落**一个新增负面套件**+manifest 显式登记 `expect=1, negative=true`,现役非负面套件零改动;②`master_seed < 0` 分支经用户裁并修,立为 p7+wr7;③p7 触达前提是播种检查排在未知标签检查之后,故测试点③必须在册合法标签;④回归态判据只取 debug 可观测面,release 独有位走静态判据+评审注记;⑤载体三纪律(组装点注入/每点新建实例/禁手工接线)与撤销证明四条(①grep 面,②③④退出码面)为完成定义;⑥估时 ≈0.85d;⑦闸 09 现为迭代 38 特批存量红,本批开工前须由用户裁「还债或刷新基线」,禁以「闸 09 绿」为完成条件;⑧件②独立卡已随迭代 38 卡① 合回退役,来源指址改 git 提交号;⑨条目归属随「gdstyle 存量债全量清偿」波 7。