f08b12a46c
按「主文留头量、深规程外置」重写本仓技能,全部是逐字搬移:
搬移前断言原文每条非空行必须出现在新主文或 reference 文件里,
0 丢失才落盘;步骤编号一律不重排(正文有「第 12 步」交叉引用);
每个切点保留原小标题 + 索引(加粗引导句与步骤标题)+ 指针行。
主文变化(上限口径 = 插件写侧 65536 字节,见上一笔 skill-size 钩子):
- id-family-semantic-migration 33392 -> 10968(17%),reference 3 篇
- stale-doc-count-sweep 19811 -> 6945(11%),reference 2 篇
- mem-budget 19963 -> 13042(19%),reference 3 篇
- keil-build 12917 -> 8879(14%),reference 2 篇
- task-worktree 72601 -> 28139(42%),reference 8 篇
task-worktree 本笔同时收录另一会话已写完的 C2/D/G 三节正文——那
三处手改与我的拆分落在同一份文件改动里,不可分离;其内容同样已
随 reference/ 外置,主文只剩标题、索引与指针。
外置语料合计 122211 字节 / 30 篇:围栏数逐篇为偶,无 BOM/CR/U+FFFD。
draw-diagram 与 serial-boot-test 脚本是另一会话的在飞改动,本笔未含。
skill-size 钩子在本笔首次真跑(前一笔无 .dsh/skills 文件可触发)。
gate: pre-commit 全绿(doc-links、id-check-new、check-yaml、
skill-size、check-added-large-files);30 篇 reference 手工字节
体检 clean;skill() 逐个复载确认加载的是拆分版。
60 lines
5.8 KiB
Markdown
60 lines
5.8 KiB
Markdown
### G. 任务树内跑门禁与审计:输出落点(ci-artifacts)与 SDL2 联接假红
|
||
|
||
三条硬规矩,全是 2026-10-29 实测付过失败成本的(两起 ENOENT + 一次假红误判):
|
||
|
||
1. **门禁/审计输出只落 `<tree>/ci-artifacts/`,而新树里它不存在 → 落盘前先 `mkdir -p`**。`ci-artifacts/` 被
|
||
`.gitignore` 忽略(不污染脏行数,E 第 4 步的备份同理),但也因此**不会被检出**——`$TW new` 出来的树里没有这个
|
||
目录。直接 `fs.writeFileSync("<tree>/ci-artifacts/head-md.md", …)` 当场 `ENOENT: no such file or directory`,
|
||
**整段程序零执行**(实测:那一轮的门禁体检与快照读取全没跑成,白重跑一次)。用 Node 写之前先
|
||
`fs.mkdirSync(dir, { recursive: true })`;用 bash 重定向就先单独敲一条 `mkdir -p ci-artifacts` 再落盘
|
||
——重定向在命令执行**之前**解析,目录没建出来时是同一条命令直接失败,后面串着的 `grep` 跟着一起报
|
||
`No such file or directory`,看着像「门禁没跑出结果」,其实是写错了地方。
|
||
2. **`cd` 进任务树之后,`../_wt/x.txt` 不是你以为的地方**:`cd` 之后 `..` = `_wt`,`../_wt/x.txt` 落到
|
||
`_wt/_wt/x.txt`(实测就是这么报的)。**树内命令的输出一律用树内相对路径**(`ci-artifacts/xxx.txt`);
|
||
要绝对路径就写完整绝对路径,跨树取文件用 `$MAIN/…`、`$WTROOT/…` 这种变量打头的全路径,
|
||
不靠 `cd` 之后的相对层级往上跳。
|
||
3. **任务树内文档门禁按单文件跑;全库 `--all` 基线留到合并后在主树跑**。任务树的 `simulator/SDL2` 是指向
|
||
主树同一份的**目录联接**(`new` 的第 2/3 步建的),`--all` 会把这份「仓库里的第二份仓库副本」一起扫:
|
||
实测任务树里 `check_doc_links.py --all` 打 `检查 222 个文档,35 处问题`、RC=1,而 **35 处全落在
|
||
`simulator/SDL2` 联接下**、要改的文档一条都没有 → 判红纯属联接带来的假红。单文件检查不受影响
|
||
(扫描根就是那一个文件,联接目录不在面内)。主树本身没有 SDL2 时不产生这类假红(联接如实镜像主树,
|
||
F 节那棵树连 SDL2 都没得联),但**别据此认为 `--all` 在树内可信**。
|
||
|
||
@T3@bash
|
||
F="docs/<子目录>/<本次改动的文件>.md" # 本次改动的那一个文件
|
||
"$PY" scripts/check_doc_links.py "$F" > ci-artifacts/dl-<slug>.txt 2>&1; echo RC=$?
|
||
cat ci-artifacts/dl-<slug>.txt
|
||
@T3@
|
||
|
||
逐文件跑的实测读数:需求文档 161 处章节引用 / 98% 机器可判定 / rc=0;方案文档 16 处 / 88% / rc=0。
|
||
确实要在树内跑 `--all` 时(例如怀疑主干基线本身),判红顺序**固定三步**,缺一步都不许下结论:
|
||
① 在**主树**跑同一条命令拿基线;② 过滤掉 `simulator/SDL2` 联接下的问题行;③ 剩下的与主树基线逐行比。
|
||
只跑 `--all` 见 RC=1 就回「文档门禁挂了」= 把基线噪声算成本任务的账;只跑「过滤后为空」就回「全绿」
|
||
= 会漏掉真红。全库 `--all` 的正解位置是**合并后的主工作树**:实测合入后在主树跑 `check_doc_links.py --all`
|
||
= 2,597 处章节引用 / 194 个文档 / rc=0 —— 这才证明「就地删叙述」没打断任何引用。
|
||
另:**不因 `--all` 的既有假红跳过对本次改动文件的单文件复检**(假红是基线的事,你的文件仍要逐个过)。
|
||
|
||
4. **文档改动在树内提交前的固定体检**(2026-10-29 实测):`lines / bytes / BOM / CR / U+FFFD / 三连续空行 /
|
||
行尾空格 / 末行单个 LF` + 一个自写的 **Markdown 表格每行列数一致性**检查(数格子前先把转义管道 `\|` 还原成占位符,
|
||
否则会把 `\|` 当成列边界数错)。为什么要自己数:`doc-links` 只管链接与章节、`no-mojibake` 只管编码面,
|
||
**表格断列与删段留下的三连续空行没有任何钩子会报**。
|
||
实测读数:需求文档 `lines=2665 bytes=196137 BOM=false CR=0 U+FFFD=0 tripleBlank=0 trailingWS=0 endLF=true`,
|
||
表格体检另报两处坏表格(`L988-992 counts=5/7`、`L2472-2486 counts=2/3`)——**与本次编辑无关的历史行**。
|
||
所以体检要**区分「本次改动 bad=0」与「整份文件 bad=0」**:先定位归属再决定动不动手,顺手改别人的区域等于把
|
||
没打算提交的内容卷进这笔改动(报告里写「本次改动引入 0 处」,并点名那两处是存量)。
|
||
|
||
5. **提交 / 合并信息一律 `-F` 读文件;清退类任务还要做禁词自检**(2026-10-29 两遍实测):消息文件写在
|
||
`ci-artifacts/`(被忽略 → 不污染脏行数),UTF-8 无 BOM、CR=0、标题 ≤100 字符、正文每行 ≤80(实测标题 31 / 32 字符、
|
||
正文最长行 50 / 55)——`-m` 会把中文按终端代码页转码搞坏,长中文标题还容易撞 gitlint。硬自检:
|
||
|
||
@T3@bash
|
||
git log -1 --pretty=%B | grep -c '485' # 被清退主题的关键词:必须是 0
|
||
git log -1 --pretty=%B | grep -ci '\bDE\b' # 同主题的次要关键词:同样 0
|
||
@T3@
|
||
|
||
关键词不许出现在**标题、正文、合并信息**任何一处(实测标题改写成「删除与本方案无关的其它串口通道对照内容」这种
|
||
语义短语替掉了它)——否则「别让我看到 X」这条要求在 `git log` 里当场破产。合并信息是另一份文件:
|
||
`ci-artifacts/merge-msg-<slug>.txt` 落盘后**同样 grep 一遍**再 `git merge --no-ff --no-edit -F`(C2 第 3 步)。
|
||
自审发现消息里的行数 / 统计算错而**尚未推送** → `git commit --amend -F <改好的文件>` 就地修(实测就这么修掉一次
|
||
off-by-one);**别追加一笔「更正」提交**——那等于把禁词和被更正的错数一起写回历史。
|