#!/usr/bin/env python3 r"""doc_term_audit.py — GDD 退役术语扫描(半自动) 动机:机制换名/退役批(如 2026-09-20 伏击→警觉)之后,正文里容易残留旧措辞的 "现行语义"引用——修订记录与退役注记里的旧词是合法历史,混在一起肉眼难分。 本工具维护一份退役词表,全文档扫描命中并按上下文分两类: [疑似现行] 该行不含日期/退役/换装等白名单信号——人工判读 [留档类] 行内带日期、退役/作废/换装/继任/留档/历史等信号——默认忽略 (变更记录类节自 2026-10-19 起由 gdd_lint R4 禁设,本工具不再为其设节级豁免) 用法: python tools/doc_term_audit.py # 扫默认范围,报告模式(exit 0) python tools/doc_term_audit.py --strict # 有疑似现行命中时 exit 1(供门禁/CI) python tools/doc_term_audit.py ... # 只扫指定文件 python tools/doc_term_audit.py --json # 机器可读 口径:扫 design/gdd/ 与 design/art/ 两处文档域 + 四份根文件(`待办清单.md`/`体验验证清单.md`/ `roadmap.md`/`AGENTS.md`,2026-10-21 迭代 32 卡①反哺批扩面,用户裁;根文件同属现行文本) ——reports/(中间文档唯一暂存地)不在扫描域;design/ 全目录已无过程件目录(research 于 2026-10-21 退役); 词表扩充 = 改 RETIRED_TERMS(受 doc-conventions §4 词表冻结约束:唯一入口=用户实读反馈并经用户裁决)。 """ import argparse import json import re import sys from pathlib import Path # 退役词表:(正则词, 退役日期, 继任词/口径, 备注)。新增退役批时在此追加一行。 RETIRED_TERMS = [ (r"registry|entities\.yaml|architecture\.yaml", "2026-10-19", "术语规范名→design/gdd/术语表.md;现行值→data/tables/*.tres;取值域与字段契约→data/schemas/*.gd;架构立场→design/engineering/architecture/architecture.md", "跨系统事实登记处注销批(2026-10-19 用户裁)"), ("伏击", "2026-09-20", "警觉(blast 负向)", "伏击机制整体退役"), ("ambush_double|ambush_layers|flat_attach", "2026-09-20", "enemy_alert / effects 投影", "伏击数据键退役"), ("advantage_per_round_cap", "2026-09-20", "(已删字段——行动点天然封顶)", "单轮授予上限删除批"), ("溢出未生效", "2026-09-20", "(行类型退役;满层拒收走奖励未生效行)", "行协议 10→9 类"), ("m_amb|M_AMB", "2026-09-20", "(伏击暴露当量口径作废)", "挖掘风险不等式退役"), ("七型|五型×正负|五型 × 正负", "2026-09-20", "八型(十六格)", "格面资源八型批"), ("10 类行|行型封闭为 10 类|10 类封闭协议|行型 10 类", "2026-09-20", "9 类", "溢出未生效行下线"), ("拔旗|撤旗", "2026-09-19", "(封印印记无移除手段——封印不可逆)", "封印不可逆批(原「插旗不可逆批」,2026-10-18 术语刷新随批换代措辞)"), ("三选一反噬|标错反噬|反噬三选一", "2026-09-15", "极性矩阵负向兑付", "格面资源批"), ("defense_up", "2026-09-16", "ac_up(护甲强化)", "护甲等级掷点批换装"), ("蓄力行|charge 行", "2026-09-16", "施放行(cast)", "敌人技能池批改型"), ("行为环", "2026-09-16", "技能池(池模板+摇号)", "固定出招剧本退役"), ("heavy_multiplier|重击倍率", "2026-09-16", "技能行 damage_mult", "行为环退役随批"), ("多段命中", "2026-09-19", "(退役,无防御磨损体系)", "技能池新效应词汇批"), ("充能", "2026-09-19", "(挖掘期/战斗段充能退役;蓄力 empower 仍在)", "充能退役批——注意误报"), ("英雄卡|敌人卡", "2026-09-20", "站桩立绘", "敌人卡形态裁决批"), ("道具窗口|可选类道具|已消耗未生效|使用被拒|窗口打开锚行|窗口跳过锚行", "2026-09-15", "(随可选类道具整体删除)", "格面资源批"), ("雾格", "2026-09-14", "(雾格移除)", "不做清单"), ("兄弟精", "2026-09-26", "L2 熊地精(bugbear 复用)", "变体名未经批准退役批——用户质问查证后全仓清除"), # —— 用语规范(2026-10-15 用户令):权威=design/gdd/术语表.md「用语规范」A 表,机器闸吸收 —— # 词表冻结:本节禁再新增词条;扩表唯一入口=用户实读反馈并经用户裁决,由非迭代批写入,agent 禁自行增词 # (doc-conventions §4「词表冻结」)。 # 注意:「随批」「台账」两词本身是上方行级白名单信号(行内出现即归留档类),对其扫描会自豁免, # 故不列入;「收口」「在飞」等照常扫描。术语表「用语规范」节已加入节级豁免(词表自身不命中)。 ("对标", "2026-10-15", "参照", "用语规范 A 表(STC 1.7)"), ("若干", "2026-10-15", "写具体数值或写明数值出处", "用语规范 A 表(STC 5.4)"), ("不得", "2026-10-15", "禁止", "用语规范 A 表(STC 词表)"), ("报错", "2026-10-15", "名词用错误;动词用返回错误/显示错误", "用语规范 A 表(STC 词表)"), (r"\bbuff\b", "2026-10-15", "增益", "用语规范 A 表(STC 1.1)"), ("收口", "2026-10-15", "完成/合并进 master", "用语规范 A 表(doc-conventions 第 4 节)"), ("在飞", "2026-10-15", "正在执行中", "用语规范 A 表(doc-conventions 第 4 节)"), ("对拍", "2026-10-15", "与基线数据逐项比对", "用语规范 A 表(doc-conventions 第 4 节)"), ("销账|销号", "2026-10-15", "注销", "用语规范 A 表(doc-conventions 第 4 节)"), ("落文", "2026-10-15", "写入文档/已写入", "用语规范 A 表(doc-conventions 第 4 节同族)"), # —— 设计文档术语刷新批(2026-10-18 用户裁):权威=design/gdd/术语表.md「退役词对照」—— # GP 是唯一正式命名(「金币」系 AI 噪音);「旗」概念不存在(动作=封印、印记=封印印记, # 封印系正式术语非比喻)。注意:「插旗|标旗」与上方「拔旗|撤旗」行同族;「旗」单字不入表 # (词面误报率高,靠术语表对照行与人工判读),game/ 扫描域归代码批后另加。 ("金币", "2026-10-18", "GP(唯一正式命名)", "GP 命名统一批——「金币」全库禁用"), ("插旗|标旗", "2026-10-18", "封印(正式动作名,全库统一)", "术语刷新批——「旗」概念退役"), ("完美排雷", "2026-10-19", "完美封印(正式名见 design/gdd/术语表.md 退役词对照)", "迭代 32 卡①反哺批 2026-10-21 用户裁入表——代码注释面由 S11 承接,文档正文面由此条承接"), # —— 测试术语与层级重构批(2026-10-22 用户裁):权威=design/gdd/术语表.md「退役词对照」—— # 标准四级测试层(冒烟/单元/集成/系统)+UI 探针与 golden;闸档用语随三条频率规则消亡。 # 「重闸」用负向后行断言排除机制词「去重闸」(封印重判去重判别器,在役非退役)。 ("系统级断言套件|冒烟全量", "2026-10-22", "系统测试", "测试术语重构批——标准四级层命名(裁决录=提案 §二——提案已退役,考古=git 历史——删除批 53075baa,删除前全稿见历史版本 b4da36a8)"), ("单元套件", "2026-10-22", "单元测试", "测试术语重构批——标准四级层命名"), ("启动探针|秒级冒烟探针|L0[–-]L3", "2026-10-22", "冒烟测试", "测试术语重构批——极小启动场景"), (r"(? 8: print(f" …另有 {len(items) - 8} 处") return 1 if (args.strict and suspect) else 0 if __name__ == "__main__": sys.exit(main())