iter52-卡1:迭代52卡①(minesweeper_rules公开面还债): safe_remaining私有化21→20(函数体逐字不动,测试4行改锚)——gdstyle S13归绿零新基线键,全仓.safe_remaining(零残留; 验收档中
This commit is contained in:
1 parent
32f9be8c4d
commit
8aec7dbff1
25 files changed
+137
-226
No files matched your search
+3
-25
@@ -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, "验收对照表零行",
|
||||
"表内没有数据行"))
|
||||
|
||||
Reference in new issue
Block a user