feat(ci): abstraction_check.py 自动分类 + #16 从观测升级为阻塞#33
新建 scripts/ci/abstraction_check.py(~220 行): 按 7 条分类规则(L1~L7)把抽象化残留命中自动标注为 legit/residual:
L1 代码块内(...) → 测试数据/命令示例 L2 反引号内(...) → inline code 示例 L3 行内含反例/举例/示例/占位符/反模式 → 语义关键词 L4 多工具并列(>= 2 个商标同行) → 登记行 L5 grep -rnE 正则命令 → 自证命令 L6 文件白名单(meta-principles / tooling-landscape / quality-dashboard / governance/README) → 整文件豁免 L7 Markdown 登记表行 → 表头含语义关键词时豁免
...
--max-residual N 参数控制阈值:
改造 scripts/ci/report-abstraction.sh:
.cnb.yml 两处 stage 名同步改: p1-abstraction-observe → p1-abstraction-check (由 verify-yml-consistency.sh 实时守门保证 push/MR 两侧同步改)
本地正反双向测试: 正:29 命中 / 29 legit / 0 residual → EXIT 0 反 A(追加 1 陈述句):2 residual 精确识破 → 恰 ≤ 阈值 2 → EXIT 0 反 B(追加 2 陈述句):4 residual 超阈值 → EXIT 1 + 精确指行
关于计数从 16 → 29:不是真的涨了,而是口径从'行级'升到'匹配级'。 例如 meta-principles.md:141 的 'TAPD / 飞书 / Jira' 一行实际是 3 个独立命中,原 grep 按行算 1,新脚本按匹配算 3。29 是本仓库 抽象化讨论面的真实规模。
派生自 meta-principles.md §原则 4(抽象化自验证——本脚本就是 元原则 4 的机器可读化执行)+ §原则 2(可执行测试——本地反向测试 证明脚本能识破入侵)+ §原则 3(棘轮——#16 第二次真实上调到顶)
Refs: CHECKPOINT §五 T-04(闭环)、§四 轮次 8
新建 scripts/ci/abstraction_check.py(~220 行):
按 7 条分类规则(L1~L7)把抽象化残留命中自动标注为 legit/residual:
L1 代码块内(
...) → 测试数据/命令示例L2 反引号内(
...) → inline code 示例L3 行内含反例/举例/示例/占位符/反模式 → 语义关键词
L4 多工具并列(>= 2 个商标同行) → 登记行
L5 grep -rnE 正则命令 → 自证命令
L6 文件白名单(meta-principles /
tooling-landscape /
quality-dashboard /
governance/README) → 整文件豁免
L7 Markdown 登记表行 → 表头含语义关键词时豁免
--max-residual N 参数控制阈值:
改造 scripts/ci/report-abstraction.sh:
.cnb.yml 两处 stage 名同步改:
p1-abstraction-observe → p1-abstraction-check
(由 verify-yml-consistency.sh 实时守门保证 push/MR 两侧同步改)
本地正反双向测试:
正:29 命中 / 29 legit / 0 residual → EXIT 0
反 A(追加 1 陈述句):2 residual 精确识破 → 恰 ≤ 阈值 2 → EXIT 0
反 B(追加 2 陈述句):4 residual 超阈值 → EXIT 1 + 精确指行
关于计数从 16 → 29:不是真的涨了,而是口径从'行级'升到'匹配级'。
例如 meta-principles.md:141 的 'TAPD / 飞书 / Jira' 一行实际是
3 个独立命中,原 grep 按行算 1,新脚本按匹配算 3。29 是本仓库
抽象化讨论面的真实规模。
派生自 meta-principles.md §原则 4(抽象化自验证——本脚本就是
元原则 4 的机器可读化执行)+ §原则 2(可执行测试——本地反向测试
证明脚本能识破入侵)+ §原则 3(棘轮——#16 第二次真实上调到顶)
Refs: CHECKPOINT §五 T-04(闭环)、§四 轮次 8