iter52-卡1:迭代52卡①(minesweeper_rules公开面还债): safe_remaining私有化21→20(函数体逐字不动,测试4行改锚)——gdstyle S13归绿零新基线键,全仓.safe_remaining(零残留; 验收档中

This commit is contained in:
DKChan committed 2026-11-05 03:04:20 +08:00
1 parent 32f9be8c4d
commit 8aec7dbff1
25 files changed
+137 -226

No files matched your search

+3 -25
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 文档域(流水线闸)。
(2026-10-18 数据整改批),本闸已注册进 tools/run_all_gates.sh 文档域(08c 流水线闸)。
用法:python tools/pipeline_gate.py [--todo PATH] [--roadmap PATH] [--repo-root PATH]
"""
import argparse
@@ -63,9 +63,6 @@ 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
@@ -501,19 +498,10 @@ def capability_names(root):
return names
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)。
"""C3 改动—验收对照表结构检查(生效 2026-10-21)。
只查:对照表节在不在、表头有没有五个必需列、有没有数据行、必填格空不空;
C5=生效日后需求点格须带现行文档行锚且指向存在(test-conventions §8.3)。
只查:对照表节在不在、表头有没有五个必需列、有没有数据行、必填格空不空。
不判断测试是否真的覆盖改动——那是独立验收审计的职责,机器闸不猜语义。
"""
lines = text.splitlines()
@@ -626,16 +614,6 @@ 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, "验收对照表零行",
"表内没有数据行"))