From b3ea753270cb92c959b6e929538801195e7c0065 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 27 Oct 2026 01:28:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=99=E5=8D=A1(=E8=BF=AD=E4=BB=A338?= =?UTF-8?q?=E5=8D=A1=E2=91=A1=E5=81=9C=E5=8D=A1=E4=BF=AE=E8=AE=A2=C2=B7v1.?= =?UTF-8?q?3):=20=E9=AA=8C=E6=94=B6=E8=BD=BD=E4=BD=93=E7=94=B1=E7=8E=B0?= =?UTF-8?q?=E5=BD=B9=E9=9D=9E=E8=B4=9F=E9=9D=A2=E5=A5=97=E4=BB=B6=E6=94=B9?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E8=B4=9F=E9=9D=A2=E5=A5=97=E4=BB=B6=EF=BC=8B?= =?UTF-8?q?p7=20=E5=B9=B6=E4=BF=AE=E6=9C=AA=E6=92=AD=E7=A7=8D=E5=88=86?= =?UTF-8?q?=E6=94=AF=E2=80=94=E2=80=94=E7=8B=AC=E7=AB=8B=20grilling=20?= =?UTF-8?q?=E5=A4=8D=E6=A0=B8=E5=88=A4=E3=80=8C=E4=B8=8D=E5=8F=AF=E5=BC=80?= =?UTF-8?q?=E5=B7=A5=EF=BC=88=E9=98=BB=E6=96=AD3=EF=BC=8B=E5=BA=94?= =?UTF-8?q?=E4=BF=AE6=EF=BC=8B=E5=BB=BA=E8=AE=AE2=EF=BC=89=E3=80=8D?= =?UTF-8?q?=EF=BC=8C=E5=85=B6=E8=AF=BB=E6=95=B0=E9=80=90=E6=9D=A1=E7=A0=81?= =?UTF-8?q?=E9=9D=A2=E5=A4=8D=E9=AA=8C=E5=90=8E=E5=85=A8=E6=95=B0=E6=8A=98?= =?UTF-8?q?=E5=85=A5=E3=80=82=E9=98=BB=E6=96=AD=E4=B8=89=E4=BB=B6=3D?= =?UTF-8?q?=E2=91=A0wr7=20=E5=8E=9F=E7=94=A8=20open=5Fstream("adventure")?= =?UTF-8?q?=EF=BC=8CPURPOSE=5FTAGS(:9)=20=E6=97=A0=E8=AF=A5=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E4=B8=94=E6=9C=AA=E7=9F=A5=E6=A0=87=E7=AD=BE=E6=A3=80?= =?UTF-8?q?=E6=9F=A5(:101-103)=E6=8E=92=E5=9C=A8=E6=92=AD=E7=A7=8D?= =?UTF-8?q?=E6=A3=80=E6=9F=A5(:104-106)=E5=89=8D=EF=BC=8C=E6=9C=AC?= =?UTF-8?q?=E7=82=B9=E4=BC=9A=E9=80=80=E5=8C=96=E6=88=90=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=82=B9=E2=91=A1=E3=80=81=E6=92=A4=E9=94=80=E8=AF=81=E6=98=8E?= =?UTF-8?q?=E2=91=A3=E6=94=B9=E5=89=8D=E6=94=B9=E5=90=8E=E7=9A=86=E7=BB=BF?= =?UTF-8?q?=E2=86=92=E6=94=B9=E5=9C=A8=E5=86=8C=E6=A0=87=E7=AD=BE=20board?= =?UTF-8?q?=5Fgen=EF=BC=9B=E2=91=A1=E5=8E=9F=E3=80=8C=E8=BF=9D=E7=BA=A6?= =?UTF-8?q?=E8=A1=8C=E7=85=A7=E5=8F=91=E5=8F=B7/=E6=9C=AA=E6=92=AD?= =?UTF-8?q?=E7=A7=8D=E7=85=A7=E5=8F=96=E5=8F=B7=E2=86=92quit(2)=E3=80=8D?= =?UTF-8?q?=E5=88=A4=E6=8D=AE=E5=9C=A8=20debug=20=E4=B8=8D=E5=8F=AF?= =?UTF-8?q?=E8=A7=82=E6=B5=8B=EF=BC=88assert=20=E5=85=88=E4=B8=AD=E6=96=AD?= =?UTF-8?q?=20open=5Fstream=20=E6=9C=AC=E4=BD=93=EF=BC=8C:107-108=20?= =?UTF-8?q?=E6=8E=A8=E8=AE=A1=E6=95=B0=E6=AE=B5=E8=B0=81=E4=B9=9F=E5=88=B0?= =?UTF-8?q?=E4=B8=8D=E4=BA=86=EF=BC=89=E2=86=92=E5=A5=91=E7=BA=A6=206=20?= =?UTF-8?q?=E4=B8=8E=E4=B8=89=E6=B5=8B=E8=AF=95=E7=82=B9=E5=88=A4=E6=8D=AE?= =?UTF-8?q?=E4=B8=BB=E4=BD=93=E6=94=B9=E5=8F=96=E3=80=8C=E6=9C=89=E5=B7=AE?= =?UTF-8?q?=E5=BC=82=E9=9D=A2=E3=80=8D=EF=BC=9Dhandler=20=E6=88=90?= =?UTF-8?q?=E5=91=98=E4=B8=8E=E8=B0=83=E7=94=A8=E7=82=B9=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=EF=BC=88=E8=AE=B0=E5=BD=95=E4=BD=8D=EF=BC=89?= =?UTF-8?q?=EF=BC=8B=E5=B0=81=E5=8D=B0=E6=98=AF=E5=90=A6=E8=90=BD=EF=BC=8C?= =?UTF-8?q?return=20=E4=BD=8D=E4=B8=8E=E8=AE=A1=E6=95=B0=E5=99=A8=E4=B8=80?= =?UTF-8?q?=E5=BE=8B=E9=99=8D=E7=BA=A7=E4=B8=BA=20grep=20=E5=9C=A8?= =?UTF-8?q?=E4=BD=8D=EF=BC=8B=E8=AF=84=E5=AE=A1=E6=B3=A8=E8=AE=B0=EF=BC=88?= =?UTF-8?q?debug=20=E4=B8=8B=E4=B8=A4=E6=80=81=E4=B8=8D=E5=8F=AF=E5=88=A4?= =?UTF-8?q?=E5=88=AB=EF=BC=8C=E6=8B=BF=E5=AE=83=E5=BD=93=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E6=9C=9F=E5=88=A4=E6=8D=AE=EF=BC=9D=E5=81=87=E7=BB=BF=EF=BC=89?= =?UTF-8?q?=E5=B9=B6=E5=8A=A0=20L3=20=E5=81=9C=E5=91=88=E4=B8=8E=E5=AE=A1?= =?UTF-8?q?=E8=AE=A1=E9=98=BB=E6=96=AD=E5=88=A4=E6=8D=AE=EF=BC=9B=E2=91=A2?= =?UTF-8?q?wr5=20=E6=9C=AA=E7=A6=81=E6=B5=8B=E8=AF=95=E4=BD=93=E5=86=85?= =?UTF-8?q?=E6=89=8B=E5=B7=A5=E6=8E=A5=E7=BA=BF=E4=BC=9A=E8=AE=A9=E3=80=8C?= =?UTF-8?q?=E5=9B=9E=E9=80=80=E7=BB=84=E8=A3=85=E7=82=B9=E3=80=8D=E7=A9=BA?= =?UTF-8?q?=E8=BD=AC=E2=86=92=E8=BD=BD=E4=BD=93=E7=BA=AA=E5=BE=8B=E2=91=A0?= =?UTF-8?q?=E9=92=89=E6=AD=BB=E6=B3=A8=E5=85=A5=E5=8F=AA=E7=BB=8F=E7=BC=96?= =?UTF-8?q?=E6=8E=92=E5=99=A8=E7=BB=84=E8=A3=85=E7=82=B9=E3=80=81=E5=AE=A1?= =?UTF-8?q?=E8=AE=A1=E5=8A=A0=20grep=20fatal=5Fhandler=20=E5=9C=A8?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=96=87=E4=BB=B6=E9=9B=B6=E5=91=BD=E4=B8=AD?= =?UTF-8?q?=E5=88=A4=E6=8D=AE=E3=80=82=E5=BA=94=E4=BF=AE=E6=8A=98=E5=85=A5?= =?UTF-8?q?=3Dwr8=E3=80=8C=E5=88=A0=E7=99=BB=E8=AE=B0=E8=A1=8C=E5=8D=B3?= =?UTF-8?q?=E7=BA=A2=E3=80=8D=E6=94=B9=E3=80=8C=E5=88=A0=20negative=20?= =?UTF-8?q?=E6=A0=87=E8=AE=B0=E4=BF=9D=E7=95=99=E7=99=BB=E8=AE=B0=E8=A1=8C?= =?UTF-8?q?=E2=86=92=E9=97=B8=2002=20=E6=8D=95=E8=8E=B7=E3=80=8D=EF=BC=88?= =?UTF-8?q?=E5=85=A8=E4=BB=93=E6=97=A0=E9=97=B8=E5=AF=B9=E8=B4=A6=E7=9B=98?= =?UTF-8?q?=E4=B8=8A=E6=B5=8B=E8=AF=95=E6=96=87=E4=BB=B6=E4=B8=8E=20manife?= =?UTF-8?q?st=EF=BC=8C=E7=99=BB=E8=AE=B0=E8=A1=8C=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E6=80=A7=E6=94=B9=E9=9D=99=E6=80=81=E5=88=A4=E6=8D=AE=EF=BC=89?= =?UTF-8?q?=E3=80=81=C2=A78.1=20=E4=BA=A7=E5=87=BA=E7=89=A9=E8=A1=8C=20wr7?= =?UTF-8?q?=20=E7=BC=96=E5=8F=B7=E5=86=B2=E7=AA=81=E6=94=B9=20wr9=E3=80=81?= =?UTF-8?q?=E8=A1=8C=E5=8F=B7=E6=8C=89=E5=90=88=E5=9B=9E=E7=82=B9=208ea7cf?= =?UTF-8?q?ba=20=E9=87=8D=E9=94=9A=EF=BC=88battle=5Forchestrator=20:278/:2?= =?UTF-8?q?83/:1292=E2=86=92:285/:290/:1304=E3=80=81main.gd=20:312/:321?= =?UTF-8?q?=E2=86=92:311/:320=20=E4=B8=8E=20:722/:749=E2=86=92:721/:748?= =?UTF-8?q?=E3=80=81=5Fopen=5Fmodal=20=E5=9D=97=20:282-286=E2=86=92:281-28?= =?UTF-8?q?5=E3=80=81stop=20=E5=AE=88=E5=8D=AB=20:746=E2=86=92:743?= =?UTF-8?q?=EF=BC=8C=C2=A70=20=E4=BA=A4=E5=8F=A0=E8=AE=BA=E8=AF=81?= =?UTF-8?q?=E6=94=B9=E6=8C=89=E8=AF=AD=E4=B9=89=E9=9D=A2=E8=80=8C=E9=9D=9E?= =?UTF-8?q?=E8=A1=8C=E5=8F=B7=EF=BC=89=E3=80=81T1=20=E8=A1=A5=E6=96=B0?= =?UTF-8?q?=E4=BB=B6=20.uid=20=E8=BE=B9=E8=BD=A6=E9=9A=8F=E6=89=B9?= =?UTF-8?q?=E5=85=A5=E5=BA=93=EF=BC=88.gitignore:6=20=E9=A1=BB=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=EF=BC=8B=E5=8D=A1=E2=91=A3=20=E6=9B=BE=E6=BC=8F?= =?UTF-8?q?=E5=B8=A6=E5=85=88=E4=BE=8B=EF=BC=89=E3=80=81T2=20=E8=A1=A5=20e?= =?UTF-8?q?xtract=5Fchecks=20--extract=20--force=EF=BC=88=E6=97=A0=20force?= =?UTF-8?q?=20=E6=8B=92=E5=86=99=E8=BF=94=202=EF=BC=89=E5=B9=B6=E7=94=B3?= =?UTF-8?q?=E6=98=8E=E8=B4=9F=E9=9D=A2=E5=A5=97=E4=BB=B6=20quit=20?= =?UTF-8?q?=E5=BD=A2=E6=80=81=E9=A2=84=E6=9C=9F=E9=9B=B6=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E8=A1=8C=E7=A6=81=E5=87=91=20Kit.check?= =?UTF-8?q?=E3=80=81=E5=A5=91=E7=BA=A6=206=20=E8=A1=A5=E6=92=AD=E7=A7=8D?= =?UTF-8?q?=E6=96=AD=E8=A8=80=20assert(=5Fcounter=3D=3D0)=20=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E7=9A=84=E6=AF=8F=E6=B5=8B=E8=AF=95=E7=82=B9=E6=96=B0?= =?UTF-8?q?=E5=BB=BA=E5=AE=9E=E4=BE=8B=E7=BA=AA=E5=BE=8B=E3=80=81=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E5=AE=9A=E4=B9=89=E6=94=B9=E5=86=99=EF=BC=9D=E6=9C=AC?= =?UTF-8?q?=E6=89=B9=E5=B1=9E=E4=BB=A3=E7=A0=81=E9=9D=A2=E8=B5=B0=20--code?= =?UTF-8?q?=20=E4=B8=94=E9=97=B8=2009=20=E7=8E=B0=E4=B8=BA=E8=BF=AD?= =?UTF-8?q?=E4=BB=A3=2038=20=E7=89=B9=E6=89=B9=E5=AD=98=E9=87=8F=E7=BA=A2?= =?UTF-8?q?=EF=BC=88battle=5Forchestrator=201313=20=E8=A1=8C=E5=AF=B9?= =?UTF-8?q?=E5=9F=BA=E7=BA=BF=201302=20=E7=BB=A7=E7=BB=AD=E6=81=B6?= =?UTF-8?q?=E5=8C=96=E3=80=81rng=5Fservice=20=E5=8A=A0=E8=A1=8C=E5=BE=85?= =?UTF-8?q?=E5=AE=9E=E6=B5=8B=EF=BC=9Bgdstyle=20SCAN=5FDIRS=20=E4=B8=8D?= =?UTF-8?q?=E5=90=AB=20tests=20=E6=95=85=E6=96=B0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=BB=B6=E9=9B=B6=E5=BD=B1=E5=93=8D=EF=BC=89=EF=BC=8C=E5=BC=80?= =?UTF-8?q?=E5=B7=A5=E5=89=8D=E9=A1=BB=E7=94=A8=E6=88=B7=E8=A3=81=E3=80=8C?= =?UTF-8?q?=E8=BF=98=E5=80=BA=E6=88=96=E5=88=B7=E6=96=B0=E5=9F=BA=E7=BA=BF?= =?UTF-8?q?=E3=80=8D=E7=A6=81=E4=BB=A5=E9=97=B8=2009=20=E7=BB=BF=E4=B8=BA?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=9D=A1=E4=BB=B6=E3=80=82=E5=BB=BA=E8=AE=AE?= =?UTF-8?q?=E4=B8=A4=E5=A4=84=E9=9A=8F=E6=8A=98=EF=BC=88=E7=99=BD=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E5=BC=95=E7=94=A8=E5=BA=8F=E5=8F=B7=E3=80=81=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E5=91=BD=E5=90=8D=E8=90=BD=20*=5Ffatal=5Ftest=20?= =?UTF-8?q?=E7=BA=A6=E5=AE=9A=EF=BC=89=E3=80=82=C2=A712=20=E8=AE=B0?= =?UTF-8?q?=E5=81=9C=E5=8D=A1=E5=91=88=E6=8A=A5=E4=B8=8E=20v1.3=20?= =?UTF-8?q?=E5=88=A4=E6=8D=AE=EF=BC=88=E6=8C=89=E7=A6=81=E5=86=99=E5=8F=98?= =?UTF-8?q?=E6=9B=B4=E8=AE=B0=E5=BD=95=E7=BA=A2=E7=BA=BF=E5=86=99=E6=88=90?= =?UTF-8?q?=E5=88=A4=E6=8D=AE=E9=9D=9E=E9=80=90=E6=9D=A1=E6=AC=BE=E6=B8=85?= =?UTF-8?q?=E5=8D=95=EF=BC=89=EF=BC=9B=E5=A4=B4=E6=B3=A8=E4=BC=B0=E6=97=B6?= =?UTF-8?q?=20=E2=89=880.75d=E2=86=92=E2=89=880.85d=E3=80=81=E4=BB=B6?= =?UTF-8?q?=E2=91=A1=E7=8B=AC=E7=AB=8B=E5=8D=A1=E6=8C=87=E5=9D=80=E6=94=B9?= =?UTF-8?q?=20git=20=E6=8F=90=E4=BA=A4=E3=80=81=E6=9D=A5=E6=BA=90=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E5=BD=92=E5=B1=9E=E9=9A=8F=E3=80=8Cgdstyle=E5=AD=98?= =?UTF-8?q?=E9=87=8F=E5=80=BA=E5=85=A8=E9=87=8F=E6=B8=85=E5=81=BF=E3=80=8D?= =?UTF-8?q?=E6=B3=A2=207=EF=BC=9Bpipeline=5Fgate=20=E7=BB=BF=EF=BC=8851?= =?UTF-8?q?=E6=9D=A1=E7=9B=AE/39=E8=A1=8C/2=E9=93=BE/12=E5=8D=A1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../需求卡片-结构小件定点修批-2026-10-26.md | 133 +++++++++++------- 1 file changed, 79 insertions(+), 54 deletions(-) diff --git a/reports/需求卡片-结构小件定点修批-2026-10-26.md b/reports/需求卡片-结构小件定点修批-2026-10-26.md index 4415c69b..547515fd 100644 --- a/reports/需求卡片-结构小件定点修批-2026-10-26.md +++ b/reports/需求卡片-结构小件定点修批-2026-10-26.md @@ -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-验收审计-<日期>.md`;抽查重点=契约 1/2(合法路径逐位不变——缺省形态断言在案)、p2 锁域回归读数、p5 接线单点、p6 return 位置(assert 语义保持)。未过不得合并。 +入口=未参与实现的会话或子代理;报告落 `reports/iter-验收审计-<日期>.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。