iter52-卡4:迭代52卡④(封印印记法阵化): 着色器参数化绘制换代(环带+十字+环外光圈,半径夹cell_px/2,ui_kit六常量含SEAL_HALO_FRAC补注入源)+seal_mark_layer子件+CellUnit seal_on/fog联动+棋盘侧贴图路径三处退役(seal_mark.png只余战末蜡封)+board_shot_probe封印取证(三关环径0.826全落±1px,英雄格中心非黑); 含产出物三份/审计报告/master归并两笔/收尾笔; 验收档中; 验收审计总判定通过

This commit is contained in:
DKChan committed 2026-11-05 03:04:21 +08:00
1 parent 67024cb9ec
commit 122cdeb3d8
28 files changed
+581 -133

No files matched your search

+26 -4
View File
@@ -8,7 +8,7 @@ r"""pipeline_gate.py — 工作流程流水线闸(待办清单条目状态机
分档放行)/需求卡片口径(C1 文档义务/C2 设计事实源/C3 改动—验收对照表/C4 验收档申报)+一次交叉核。
约束:每红项一行「文件:行号 判据名 一句白话说明」,exit 0=全绿 / 1=有红 / 2=输入件缺失;
卡片与报告存在性相对 --repo-root 解析(缺省=本文件上两级);待办清单与 roadmap 均已为新格式
(2026-10-18 数据整改批),本闸已注册进 tools/run_all_gates.sh 文档域(08c 流水线闸)。
(2026-10-18 数据整改批),本闸已注册进 tools/run_all_gates.sh 文档域(流水线闸)。
用法:python tools/pipeline_gate.py [--todo PATH] [--roadmap PATH] [--repo-root PATH]
"""
import argparse
@@ -63,6 +63,9 @@ CAP_README = Path("game/tests/README.md")
# C4 验收档申报(2026-11-04 验收强度分级批,生效 2026-11-05;test-conventions §8.3)
GRADE_RULE_DATE = (2026, 11, 5)
GRADE_RE = re.compile(r"验收档\s*[::]\s*[高中低]")
# C5 判据出处行锚(2026-11-05 立;test-conventions §8.3:需求点格须带现行文档判据句锚)
ANCHOR_RULE_DATE = (2026, 11, 5)
ANCHOR_RE = re.compile(r"([A-Za-z0-9_\-.\\/]+\.(?:md))\s*:\s*(\d+)")
# 待办条目正文限长双判据(2026-11-04 立,doc-conventions §12.1:行数抓清单蔓延、字数抓单行堆砌)
ENTRY_MAX_LINES = 12
ENTRY_MAX_CHARS = 700
@@ -498,10 +501,19 @@ def capability_names(root):
return names
def check_ledger(text, path, when, issues, root):
"""C3 改动—验收对照表结构检查(生效 2026-10-21)。
def anchor_valid(root, rel, lineno):
"""判据出处行锚有效性:文档存在且行号在行数范围内(相对仓库根解析)。"""
p = root / rel.replace("\\", "/")
if not p.is_file():
return False
return 1 <= lineno <= len(p.read_text(encoding="utf-8-sig").splitlines())
只查:对照表节在不在、表头有没有五个必需列、有没有数据行、必填格空不空。
def check_ledger(text, path, when, issues, root):
"""C3 改动—验收对照表结构检查(生效 2026-10-21);C5 判据出处行锚(生效 2026-11-05)。
只查:对照表节在不在、表头有没有五个必需列、有没有数据行、必填格空不空;
C5=生效日后需求点格须带现行文档行锚且指向存在(test-conventions §8.3)。
不判断测试是否真的覆盖改动——那是独立验收审计的职责,机器闸不猜语义。
"""
lines = text.splitlines()
@@ -614,6 +626,16 @@ def check_ledger(text, path, when, issues, root):
issues.append((str(path), i + 1, "能力行不可核",
"既有能力「%s」不在 game/tests/README.md 能力表"
% cap_name[:24]))
if when >= ANCHOR_RULE_DATE:
point_cell = cells[idx["需求点"]] if idx.get("需求点", 99) < len(cells) else ""
anchors = ANCHOR_RE.findall(point_cell)
if not anchors:
issues.append((str(path), i + 1, "判据出处行锚缺失",
"「需求点」格须带判据出处行锚 `<现行文档相对路径>:<行号>`"
"(2026-11-05 起,test-conventions §8.3)"))
elif not any(anchor_valid(root, rel, int(no)) for rel, no in anchors):
issues.append((str(path), i + 1, "判据出处行锚不可核",
"锚指向的文档或行号不存在:%s" % point_cell[:40]))
if rows == 0:
issues.append((str(path), header_line, "验收对照表零行",
"表内没有数据行"))