内容锚改版批(判据锚行号形态废止): 锚形态唯一化<路径>「节名」<行关键词>——用户裁: 锚指向内容不指向行号,文档增删行不牵动锚与测试代码,判据句内容真改动才失配(失配=红,改句文档批同批改锚)。规约落文: test-conventions §8.3 判据出处锚两条文(卡片锚/测试函数注记)+§8.2 golden 预览句+§8.10 审计核对句+req-card §8 锚规格/复核门实读/description+iter 开工门+iter-plan 预检第3步+process-conventions 写卡段行; 闸件: pipeline_gate C5 与 capability_audit 注记道改核「节名在档+关键词命中节内」(共用件 tools/anchor_util.py 逻辑单点: 同名节精确命中优先、围栏内#不作节界、.gd 测量面按文件内子串),行号形态出现即红; 存量迁移: 测试/探针注记 604 条全量内容化(行号形态 568+存量残形 36 重锚)+在盘五卡 md 行号指针 74 处内容化+写卡段存量半成品锚修正(反引号吞词尾 12 处、杂尾 2 处、过期词重锚 2 处); 登记条目按新裁决改写(待执行)。区内凭据: 流水线闸 PASS(36 条目/57 行/5 卡全过)+能力审计 --strict 455 注记函数 0 红+文档域闸【验收通过】无新增红; 迁移件一次性用后即删未提交

This commit is contained in:
DKChan committed 2026-11-09 08:22:04 +08:00
1 parent c713f335a9
commit a69310b738
123 files changed
+832 -716

No files matched your search

+30 -18
View File
@@ -14,12 +14,14 @@ r"""capability_audit.py — 能力清单、覆盖域表与 GDD 纯度机检(
tests//probe/)有 `func 方法(`,或该方法名能在 reports/需求卡片*.md 中找到(计划入口同 D 口径);两头都无=红。
F 覆盖域表:systems 每篇一行;状态∈{已覆盖,部分覆盖,未覆盖};非未覆盖行的「能力行」非空且每项都能
对上能力表里的行名;部分/未覆盖行的缺口非空且指待办清单。
G 判据出处随测注记(test-conventions §8.3):game/tests/** 与 game/probe/** 内每个验证函数
(函数体含 check(/check_quiet(/_problems.append(/push_error( 判定调用,定义行与 _check( 前缀除外)
须带 ≥1 条 `# 判据出处: <design/相对路径>:<行号> <判据一句>` 注记(或节锚形态
`# 判据出处: <design/相对路径>「节名」<关键词> <判据一句>`,2026-11-07 架构收窄批立,见
test-conventions §8.3);指针指向存在的设计文档行/节且不出
design/ 全域。扫描面=game/tests/**+game/probe/**(sim/ 不进——测量面直构惯例)。
G 判据出处随测注记(test-conventions §8.3;2026-11-09 判据锚内容化改版批):game/tests/** 与
game/probe/** 内每个验证函数(函数体含 check(/check_quiet(/_problems.append(/push_error(
判定调用,定义行与 _check( 前缀除外)须带 ≥1 条内容节锚注记
`# 判据出处: <design/相对路径>「节名」<行关键词> <判据一句>`——节名首段(「·」前)须命中
目标文档标题行、行关键词须落在该节块内(核验口径归 tools/anchor_util.py 共用件;
.gd 测量面目标=节名与关键词均在文件内子串命中);行号形态 `<路径>:<行号>` 已废止、
出现即红。指针不出 design/ 全域+game/sim/ 测量面。
扫描面=game/tests/**+game/probe/**(sim/ 不进——测量面直构惯例)。
条件闸行豁免(代表用例含「条件闸」字样)不参与 D/E。
自检五道(防扫描面空转假绿):系统文档数、能力行数、manifest 套件数、覆盖表行数、判据注记扫描面文件数
@@ -35,6 +37,9 @@ import re
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
import anchor_util # 内容判据锚核验共用件(2026-11-09 判据锚内容化改版批)
REPO = Path(__file__).resolve().parents[1]
GDD_DIR = REPO / "design" / "gdd"
SYS_DIR = GDD_DIR / "systems"
@@ -339,7 +344,9 @@ def check_coverage(cov_tables, names):
red(README.relative_to(REPO), 1, "覆盖域表", "%s 未在覆盖域表登记" % doc)
CRITERION_RE = re.compile(r"^#\s*判据出处:\s*(\S+?\.(?:md|gd))(?::(\d+)|「([^」]+)」)\s*\S")
# 内容节锚注记(2026-11-09 判据锚内容化改版批——唯一有效形态;行号形态=CRITERION_DEAD_RE,出现即红)
CRITERION_RE = re.compile(r"^#\s*判据出处:\s*(\S+?\.(?:md|gd))「([^「」]+)」([^\s「」|,,、;;::()()+§`]+)\s+\S")
CRITERION_DEAD_RE = re.compile(r"^#\s*判据出处:\s*\S+?\.(?:md|gd)\s*:\s*\d+")
VERDICT_RE = re.compile(r"(?<![_\w])check(?:_quiet)?\(|_problems\.append\(|push_error\(")
CRITERION_FUNC_RE = re.compile(r"^(?:static\s+)?func\s+([A-Za-z_]\w*)")
@@ -381,16 +388,24 @@ def check_criterion_markers():
for ln in body:
st = ln.strip()
if st.startswith("#"):
if CRITERION_DEAD_RE.match(st):
# 行号锚(废止形态,2026-11-09 用户裁)——出现即红,且不算有效注记
red(rel, s0 + 1, "判据出处注记",
"%s 行号形态已废止(2026-11-09 用户裁)——改写内容节锚 "
"`<路径>「节名」<行关键词>`" % name)
flagged += 1
continue
m = CRITERION_RE.match(st)
if m:
oks.append(m)
if not oks:
red(rel, s0 + 1, "判据出处注记", "验证函数 %s 缺 # 判据出处: 注记" % name)
red(rel, s0 + 1, "判据出处注记",
"验证函数 %s 缺 # 判据出处: 内容节锚注记(`<路径>「节名」<行关键词> <判据一句>`)" % name)
flagged += 1
continue
marked += 1
for m in oks:
relp, no, sec = m.group(1), m.group(2), m.group(3)
relp, sec, kw = m.group(1), m.group(2), m.group(3)
_rp = relp.replace("\\", "/")
if not (_rp.startswith("design/") or _rp.startswith("game/sim/")):
red(rel, s0 + 1, "判据出处注记", "%s 指针越出 design/ 与测量面全域:%s" % (name, relp))
@@ -399,15 +414,12 @@ def check_criterion_markers():
if not tp.is_file():
red(rel, s0 + 1, "判据出处注记", "%s 指针不可核:%s(文件缺失)" % (name, relp))
continue
if no is not None:
if not (1 <= int(no) <= len(read(tp).splitlines())):
red(rel, s0 + 1, "判据出处注记", "%s 指针不可核:%s:%d(行号越界)" % (name, relp, int(no)))
elif sec is not None:
# 节锚(2026-11-07 架构收窄批立,test-conventions §8.3):核验节名首段(「·」前)
# 在所指文档中出现——节名首段为「·」前的标题词(如「统一随机流」),标题在档即过;关键词不核(随文档措辞漂移由人审兜)
head = sec.split("·")[0]
if head not in read(tp):
red(rel, s0 + 1, "判据出处注记", "%s 节锚不可核:%s「%s」(文档内无该节名首段)" % (name, relp, head))
why = anchor_util.verify(relp, read(tp), sec, kw)
if why is not None:
# 内容锚核验(2026-11-09 判据锚内容化改版批,口径归 anchor_util 共用件):
# 节名首段须命中标题行、行关键词须落在节块内(.gd 测量面=文件内子串命中)
red(rel, s0 + 1, "判据出处注记",
"%s 内容锚不可核:%s「%s」%s(%s)" % (name, relp, sec, kw, why))
return marked, flagged