现状口径:/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 全过;字节卫生零漂移。
3.6 KiB
构建副产物:%SystemDrive% 字面量垃圾目录(2026-10-26 两次复发 → 2026-10-28 定性并加守卫)(自 SKILL.md 外置)
本文由 keil-build 的 SKILL.md「构建副产物:
%SystemDrive%字面量垃圾目录(2026-10-26 两次复发 → 2026-10-28 定性并加守卫)」一节逐字外置而来(渐进展开:主文件只留索引与指针)。步骤号沿用原文,未重编。
症状:/keil-build(或 scripts/check_font_charset.py 这类 fontTools 字体工具)跑完,仓库根
冒出未跟踪目录 %SystemDrive%/ProgramData/Microsoft/Windows/Caches/,里面是几个 .db
(cversions.2.db + {6AF0698E-…} 图标缓存 + {DDF571F2-…} 字体缓存,合计约 1 MB)——
就是本机 C:\ProgramData\Microsoft\Windows\Caches 那份缓存被按字面量原地复刻了一份。
根因(2026-10-28 实测):Windows 的 known-folder 路径在注册表里是可展开串;展开不了, 它就变成一个相对路径,于是按「当前目录」(= 仓库根)建出来。三条现场证据:
reg.exe query HKCU\Environment # 本机 TMP/TEMP = REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp
env | wc -l # ops_bash 里 = 74(完整环境)
node -e "console.log(Object.keys(process.env).length)" # run_code 里 = 0(空环境!)
run_code 的 Node 进程 process.env 是空的,从它里面 spawn 出去的 UV4 / 字体脚本就拿不到
SystemDrive/ProgramData/ALLUSERSPROFILE;实测 os.path.expandvars("%SystemDrive%\ProgramData")
原样返回、且 os.path.isabs() = False → 目录就长在工作区里(同族还会冒出
%USERPROFILE%/AppData/Local/Temp)。正解不是「让用户去设环境变量」,是别在残缺环境里跑构建(见第 2 条)。
清理(有安全阀):
- ⚠ 绝不用 cmd / PowerShell 直接删:
rd /s /q %SystemDrive%会被 cmd 展开成C:—— 等于对整块系统盘下令递归强删且不带确认。 - ✅ 只用 bash 引号形态(
%在 bash 里没有特殊含义):先find '%SystemDrive%' -type l确认不是 reparse point / 符号链接,再rm -rf -- '%SystemDrive%';或 Nodefs.rmSync("%SystemDrive%", { recursive: true, force: true })。 - 它是工具副产物,不是谁在飞的改动——直接删,别 stash、更别提交(提交它 = 把本机缓存塞进历史)。
让它不再污染工作区(两层,均已落地、可核验):
- 进不了版本库:
.gitignore:167的%SystemDrive%/(2026-10-26 入库,注释里就写着复发证据)。 核验三步(2026-10-28 复跑全绿):造一份同名目录 +.db→git status --porcelain零命中 →git check-ignore -v <路径>落在.gitignore:167:%SystemDrive%/→git add -A --dry-run零暂存。 - 根本别再长出来:本 skill 脚本 2026-10-28 起在拉起 UV4 前跑
harden_windows_env()——回填SystemDrive/SystemRoot/windir/ComSpec/ProgramData/ALLUSERSPROFILE/ProgramFiles与USERPROFILE/APPDATA/LOCALAPPDATA/TMP/TEMP,就地展开环境里未展开的%VAR%字面量, 并把TMP/TEMP指到真实目录;命中即打WARN: ENV_SPARSE:。构建后再跑check_percent_literal_junk(),看到%SystemDrive%/%USERPROFILE%一类字面量目录就打WARN: JUNK_DIR:(只告警不自动删——删目录不该由构建脚本代劳)。守卫是兜底不是许可:/keil-build仍要走ops_bash/ PowerShell(继承完整环境),非在 Node 里 spawn 就把env传全。