| Files | Last commit | Last update |
|---|---|---|
| 2 months ago | ||
| 3 months ago | ||
| 3 months ago | ||
| 2 months ago | ||
| 3 months ago | ||
| 2 months ago | ||
| 3 months ago | ||
| 3 months ago | ||
| 2 months ago | ||
| 2 months ago |
changwei-code-check · 使用说明
提交前的产物检查闸:把要交出去的代码、文档、配置、交付件扫一遍,出一份问题报告。
拷贝这个目录到你的机器就能用,不需要安装任何三方包。本文只讲最常用的一条路—— 「我在本地写完 / 改完算子,提交前自己先查一遍」。他检别人 PR、扫转测交付件见 SKILL.md。
1. 装配(一次,约 2 分钟)
必需
| 依赖 | 说明 |
|---|---|
python3 |
无三方依赖。语法层面兼容 3.9+,实测环境是 3.12;低版本没实测过 |
git |
被检仓要是 git 仓库(要算 diff) |
可选,但强烈建议装
| 依赖 | 不装的后果 |
|---|---|
clang-format 18.1.8 |
组 10 的格式检查查不了;版本对不上会额外报一条版本不一致 |
验收:跑一次自检,确认这份拷贝在你机器上是好的
cd scripts
python3 selftest.py # 期望:哑弹 0
python3 lint_checkers.py # 期望:无「扫代码却不去注释」的 checker
selftest.py 会在系统临时目录里造一个带各种毛病的假仓 + 假 canndev,验证每条规则在
它必然该响的样本上真的响了。看到「哑弹 0」才算装好。 它不依赖任何外部仓库,
在任何机器上都应该是绿的;如果不是,别继续用,先来问。
2. 最短路径:查自己刚写的算子
一条命令,不用先 commit,不用管 git 版本:
cd <changwei-code-check>/scripts
python3 check.py --repo <你的算子仓> --ops <算子名> \
--report ~/check_report.md --stamp $(date +%F)
--ops 三种写法都认,多个用逗号隔开:
--ops multi_add_rms_norm_dynamic_quant # 目录名
--ops MultiAddRmsNormDynamicQuant # 驼峰名
--ops norm/multi_add_rms_norm_dynamic_quant # 仓内相对路径
--ops op_a,op_b,domain/op_c # 多个
名字打错会退出码 2 并告诉你哪个没找着,不会静默当成"这个算子没问题"。
--report生成 Markdown 问题报告;不给就只打到终端--stamp报告里的生成时间。脚本内部不取当前时间,由你传,同一输入重跑结果一致- 只想看某几组:
--groups 1,3,16 - 🟢 规范与卫生默认收起(只给每规则条数);要逐条看加
--full - 确认过的误报写进根目录
suppressions.json(必须写why/who),报告末尾会留一行「已按白名单过滤 N 条」
口令唤起(在 Claude Code / agent 里)
直接说人话,不用记命令。 agent 认下面这些说法,会自动翻成 check.py --ops ...:
| 你说 | agent 干什么 |
|---|---|
| 「检查一下 group_norm_silu_quant」 | 查这一个算子,出报告 |
| 「帮我看看 op_a 和 op_b」 | 逗号拼成 --ops op_a,op_b |
| 「提交前过一遍 xxx 算子」 | 同上 |
| 「检查我刚写的算子」 | 先问你是哪个(或从 git status 推),再查 |
| 「转测前查一下 xxx」 | 带上交付件根,多跑组 15/20/22/23(交付件与性能与新鲜度) |
| 「审一下这个 PR:<链接>」 | 走远程他检:克隆 PR → 只查不改 → 出行级评论清单 |
算子名三种写法都认:目录名 group_norm_silu_quant、驼峰 GroupNormSiluQuant、
相对路径 norm/group_norm_silu_quant。名字打错会明确告诉你哪个没找着,不会静默当没问题。
agent 会按四步汇报,不只报第一节
- 结论 N 条 —— 先讲 🔴,🟢 默认收起
- ⏳ 待判定 —— 脚本只定位、没下结论的。agent 应当直接派子 agent 答掉再汇报,
而不是把"没有结论"丢给你(题包在
<仓的父目录>/judgment_pack_<仓名>.md, 答完用--answers ans.json回填) - 跳过说明 —— 哪几组没跑、为什么。说"全查过了"之前必须先看这节
- 要不要改由你定;🟢 规范类可以直接改,🔴 功能类先说清再动
让它更好用的两件事
export CHANGWEI_CANNDEV=~/repos/canndev # 组 5/7/18 要
export CHANGWEI_DELIVERABLES_ROOT=~/repos/<交付件仓>/... # 组 15/20/22/23 要
设过之后 agent 不用每次问你路径。转测前还想查新鲜度,再补 --vendor <部署根>。
什么时候改用版本区间模式
要查「这次改动有没有污染 A2」「提交卫生(单 commit / 大量删除)」这类问题时, 判据是"改了什么",算子模式给不出这个输入。这时先提交,再按区间跑:
git add -A && git commit -m "wip"
python3 check.py --repo <仓> --base origin/master --head HEAD --local --report ~/r.md
(--base 不确定就用 git merge-base origin/master HEAD 算。)
算子模式下组 4、13 会显式跳过并写进报告,不会假装查过。
3. 两个外部对照物(不给不会报错,但会少查)
有些问题必须跟别的东西比才查得出来——"该有而没有"这一类比"写错了"难查一个数量级。 这两个对照物不在你的算子仓里,得你自己指路:
| 对照物 | 怎么给 | 不给的后果 |
|---|---|---|
| canndev(A2 权威基线,外部代码仓) | --canndev <路径> 或 export CHANGWEI_CANNDEV=<路径> |
组 5 / 7 / 18 跳过;组 4 判不了「A2 实现在不在」 |
| 转测交付件根(内部件,不在算子仓里) | --deliverables <路径> 或 export CHANGWEI_DELIVERABLES_ROOT=<路径> |
组 15 / 20 跳过 |
两者都不猜路径:猜出来的根会把"我没处可查"静默变成"它不存在",而后者是强得多的结论。 路径给错直接退出码 2,不会降级成"没给"。
设成环境变量之后,日常就不用每次带参数了:
export CHANGWEI_CANNDEV=~/repos/canndev
export CHANGWEI_DELIVERABLES_ROOT=~/repos/<你们团队的交付件仓>/changwei_deliverables
4. 报告怎么读
报告有四节,缺一不可。只看第一节会读出错误结论。
| 节 | 意思 |
|---|---|
| 结论:N 条问题 | 脚本有把握下结论的。按危害排:🔴 功能正确性 / 🟡 一致性与覆盖 / 🟢 规范与卫生 |
| ⏳ 待判定 | 脚本只定位、没下结论。要跨函数追数据流或读懂意图才能判 |
| 执行记录 | 真跑过的检查,过与不过都列。用来确认"它到底查了什么" |
| 基线与范围 / 跳过说明 | 哪组按什么权威源判、哪组根本没跑 |
三个要点:
- 「0 条问题」不等于「全查过且没事」。 先翻到「跳过说明」看有几组没跑。 一个永远返回 0 的检查比没有检查更危险,因为它看起来像通过了。
- ⏳ 待判定不是问题、也不是没问题——是没有结论。 没人去答就一直是没有结论,
不许当成通过。题目本体会写到被检仓的父目录下:
judgment_pack_<仓名>.md, 整份丢给一个能读代码的人(或 agent)去答。 - 标了
需人工复核的,是静态扫描给的提示:如果上界确实有别处保证,忽略即可。
5. 常见问题
diff 列出 N 个文件,工作树里只有 M 个存在
多半是没 checkout 到 --head 那个版本。先 git checkout <head> 再跑——
否则所有检查都会拿到空文件列表、静默返回 0 条。
某组显示「未实现」 这份版本没实现该组,报告里会明写「没查,不等于没问题」。这是故意的: 未实现的组必须每次现形,不能从报告里消失。
报告里 🔴 很多,但看着像同一个毛病刷屏
同文件同规则超过 5 条会自动折叠成一条 + 行号列表(--fold N 可调,--json 始终全量)。
挑一条改掉,同文件其余同类一般跟着一起改。
报出来的确认是误报怎么办
写进根目录 suppressions.json(rule + op/file + 必填 why/who)。
规则一律往严了报——误报开发确认一下就完了,漏报要等测试打回来才知道,那更贵。
被压掉的条目不会消失:报告末尾会留一行「🔇 已按白名单过滤 N 条」。
改了规则之后
必跑 python3 selftest.py(哑弹)+ python3 lint_checkers.py(元检查)。
新增规则要同时在夹具里加一个必然触发它的样本,否则它是个哑弹也没人知道。
6. 还能干什么
| 场景 | 入口 |
|---|---|
| 审别人的 PR,出行级评论 | check.py --json + render_comments.py,见 SKILL.md 用法 ② |
| 只扫转测交付件 | scan_handover.py --op <OpName> --deliverables <根> --write |
| 语义判定(脚本出题 → agent 判) | 跑 check.py 就会出题;单独出题见 semantic_probe.py --emit |
完整能力清单见 docs/checklist.md:三层 大类→子类→逐项,
每项标了用 📜 脚本还是 🤖 agent 执行、判据来源是什么,已知缺口也在表里。
该表由 scripts/gen_checklist.py 渲染 checkers/registry.py 生成——
规则必须先在 registry 登记才能用,未登记的构造时直接抛异常。