chore(全仓): @build/@test 旧文档别名清退为技能调用名

现状口径:/keil-build 与 /serial-boot-test 是 DSH 会话的技能调用名,
不是 shell 命令;「名 + 命令行参数」的命令形态改为可执行体
run_boot_test.py 的真实调用。

- AGENTS.md:别名说明重写为「技能调用名不是 shell 命令」,两条目改
  「编译(/keil-build)」「串口回归(/serial-boot-test)」
- keil-build / serial-boot-test 两 skill 调用名与示例同步;task-worktree
  方案文档去掉 @build/@test 惯例从句;@task 保留(不在点名范围)
- 123 文件现状陈述全改;台架捕获、变更记录/时间线、rename 映射输入
  等 41 行历史证据保留旧名
- gen_memory_svg.py 6 处措辞随改,3 张 SVG 产物同批重跑
- 顺手补并行方案同行漏网计数 51→52 钩子

验证:提交期快钩子对 123 文件实跑全 Passed;check_doc_links --all
rc=0(3038 处、无法判定 0);check_mermaid --all rc=0;YAML 解析 52
钩子不变;skill-size rc=0;py_compile 全过;字节卫生零漂移。
This commit is contained in:
2026-10-30 13:03:12 +08:00
parent dc964090ea
commit 4a4ad6bc5f
123 changed files with 455 additions and 455 deletions
+9 -9
View File
@@ -5,7 +5,7 @@
要消除的盲区
------------
`mem-numbers` / `mem-budget` 两根闸的**事实源都是 Keil 链接产物 `.map`**
(gitignore,只有真做过 `@build` 的机器上才有)。于是两处都是"没跑 = 通过":
(gitignore,只有真做过 `/keil-build` 的机器上才有)。于是两处都是"没跑 = 通过":
· CI 侧:runner 没有 Keil,workflow 只能把这根钩子**跳过**,历史上只打一条
`::warning::`(上一轮的处置)——"CI 全绿"仍不等于"体积守住了";
@@ -34,7 +34,7 @@
② 那次测量的 RAM 受管区是否 <=92%(用已提交的测量数字守红线)。
2. 本门禁**不能**判:
· CI 不重算绝对体积——runner 无 Keil/无 `.map`,绝对数字的可信度来自本地那次
`@build`;本脚本把盖戳卡在"新鲜 .map + 未超线"之后,凭证不是随手可写的。
`/keil-build`;本脚本把盖戳卡在"新鲜 .map + 未超线"之后,凭证不是随手可写的。
· **编译器选项不在指纹范围内**:`MDK-ARM/STM32F407-Demo.uvprojx` 每次构建都被 UV4
改写且按约定不入库(keil-build skill),把它放进指纹会让门禁在"刚刚构建完"
的那一刻自己变红;代价是改优化等级/预处理宏不触发本门禁,这类改动必须人工
@@ -257,7 +257,7 @@ def cmd_stamp(args):
"""用新鲜 .map 盖同码戳;三道前置任一不过即拒绝(见模块 docstring)。"""
map_path = pathlib.Path(args.map)
if not map_path.exists():
print("[FAIL] 没有 .map(%s)——先 @build 再盖戳" % map_path, file=sys.stderr)
print("[FAIL] 没有 .map(%s)——先 /keil-build 再盖戳" % map_path, file=sys.stderr)
return 1
m = measure(map_path)
if m is None:
@@ -266,7 +266,7 @@ def cmd_stamp(args):
map_mt = map_path.stat().st_mtime
src_mt = newest_source_mtime()
if src_mt > map_mt:
print("[FAIL] .map 早于最新受管源码——这份构建不含最新改动,重新 @build",
print("[FAIL] .map 早于最新受管源码——这份构建不含最新改动,重新 /keil-build",
file=sys.stderr)
print(" .map mtime=%d 最新源码 mtime=%d" % (int(map_mt), int(src_mt)),
file=sys.stderr)
@@ -290,7 +290,7 @@ def cmd_stamp(args):
file=sys.stderr)
print(" 修复:先 git add <这些文件>(凭证描述的就是你正要提交的那份),再盖戳;",
file=sys.stderr)
print(" 或把它们还原。@build 与盖戳都应在同一份内容上做。")
print(" 或把它们还原。/keil-build 与盖戳都应在同一份内容上做。")
return 1
fp, n = tree_fingerprint()
write_attestation({
@@ -339,7 +339,7 @@ def _cmd_parity(args, ci_mode):
if doc is None:
return _report(args, ci_mode, [
"体积同码凭证不可用:" + err,
" 修复:本地 @build 之后跑 python scripts/ram_baseline.py --update",
" 修复:本地 /keil-build 之后跑 python scripts/ram_baseline.py --update",
" (或单独跑 python scripts/check_size_gate.py --stamp)",
])
fp, n = tree_fingerprint()
@@ -350,14 +350,14 @@ def _cmd_parity(args, ci_mode):
"指纹范围内有 %d 处**未 staged** 的改动/未跟踪文件,凭证覆盖不到它们" % dirt,
" " + "、".join(samples) + ("…" if dirt > len(samples) else ""),
" 含义:这些内容既没进索引(凭证按索引生成),也就没被那次测量算进去",
" 修复:git add 之后 @build,再跑 python scripts/ram_baseline.py --update",
" 修复:git add 之后 /keil-build,再跑 python scripts/ram_baseline.py --update",
]
if fp != doc["fingerprint"]:
problems += [
"本次代码(指纹 %s…,%d 文件)与体积测量(指纹 %s…,%s)不同码" % (
fp[:12], n, str(doc["fingerprint"])[:12], doc.get("built_at", "?")),
" 含义:这份源码没有被真实链接测量过(或测量完又改了代码/合入了别的改动)",
" 修复:@build 0/0 之后跑 python scripts/ram_baseline.py --update 再提交",
" 修复:/keil-build 0/0 之后跑 python scripts/ram_baseline.py --update 再提交",
" (指纹取 git 索引 blob:同一份内容在任何工作树/runner 上算法一致,"
"不受 CRLF/LF 检出差异影响)",
]
@@ -441,7 +441,7 @@ def main(argv=None):
ap = argparse.ArgumentParser(
description="体积门禁强制路径(同码凭证 + CI 红线复核)")
g = ap.add_mutually_exclusive_group()
g.add_argument("--stamp", action="store_true", help="用新鲜 .map 盖同码戳(@build 后)")
g.add_argument("--stamp", action="store_true", help="用新鲜 .map 盖同码戳(/keil-build 后)")
g.add_argument("--local", action="store_true", help="本地/ci_local 自查:工作树须与测量同码")
# ⚠ help 字符串里 % 必须写成 %%(argparse 会对 help 做 %-插值;裸 % + 中文
# 如"92% 红"在**无参/非法参的 print_help 路径**上才炸:ValueError