## 验证 - `$TW list`:台账段条目数 = `ls _wt` 的目录数且 ≤ 8(`MAX_CONCURRENT`);刚回收的任务与历史占位条目都不再出现 (插件树另起一段,不参与这条计数)。 - `$TW lock status`:`build 空闲(TTL 1.0h)` + `bench 空闲(TTL 6.0h)`——没有本会话留下的持有者。 - `git log --oneline -3`:能看到 `merge: task/- 合入 ` 与其后的补基线提交; `git status --porcelain` 为空(补链改动已提交,才谈得上重跑 `done`)。 - `ls _wt/.state/`:该 ID 的台账已无(清场最后一步 unlink);重复 `done` 报「任务不存在」不必再追。 - **E 节回收**:`git worktree list` 只剩主树 + 判「保留不动」的树(已拆路径逐条消失);**拆前/拆后主树 `git status --porcelain -uall` 行数相同且 `diff` 为空**(实测 0 → 0);`ci-artifacts/wt-leftover-backup/` 里每个留档件都打印过 文件名与字节数、条目数 = 分桶判「要留档」的条目数;每棵被拆的树都留有 `REPARSE: none` 预扫记录;全景输出里 `UNIQUE-UNMERGED` 归零(或全部已备份);保留树在报告里点名给出判据(`merge-base --is-ancestor` = MERGED)。 - **E 第 6 步清悬挂台账**:该 json 已从 `_wt/.state/` 消失(`.state-bak` 在备份目录里)、`$TW list` 不再打出它、 `$TW lock status` 两把锁仍空闲;全程未对该 ID 跑 `done` / `abort`。 - **F 节桥接**:`plugin list` 的「联接」列按实际三态点名(`已联` / `缺 .venv` / `缺 SDL2` / `齐(实体SDL2)`——旧实现只取样 `.venv`,半联树会说谎);**adopt/unadopt 前后主树 `.venv` 与树内文件都 还在**;主线缺 SDL2 时 `adopt` 打 `[skip]` + 「还不能算就绪」而不打「现在可以跑」;`plugin adopt ".."` 必须 exit 2;打印的 `pw:` 与 `keil_build.py` 从 cwd 反推的名字逐字相同;`done <插件树名>` 只 exit 2。 - **C2 主树被别的会话弄脏时的手工合并**:合并前打印过 `git merge-tree --write-tree` 的结果树 sha 且 `MT_RC=0`; 合并用 `git merge --no-ff --no-edit -F ci-artifacts/merge-msg-.txt`(UTF-8 无 BOM)并写明绕开 `done` 的理由; 外部文件合并前后的 `git hash-object` **逐字符相同**、`git diff --stat` 同一组数字、`status` 里仍是 `M` (没被提交也没被清掉;实测同为 `369380ca…`、2+/2−);台账先 `cp` 成 `.json.state-bak` 再由 `$TW done` (或 E 节手工路径)摘联接拆树;收工前 `git worktree list` 只剩主树 + 别人的在飞树(点名保留)、 `$TW lock status` 两把锁均空闲(`build 空闲(TTL 1.0h)` / `bench 空闲(TTL 6.0h)`)。 - **G 节树内门禁**:`/ci-artifacts/` 先 `mkdir -p` 再写、事后 `ls` 得到真实文件(`cat` 读得到内容); 树内 `check_doc_links.py` 按**单文件**跑并打印「N 处 / 机器可判定百分比 / rc」(实测 161 处/98%/rc=0、16 处/88%/rc=0); 全库 `--all` 只在合并后的**主树**跑(实测 2,597 处 / 194 个文档 / rc=0);若树内跑过 `--all` 且判红,报告里 必须给得出「过滤 `simulator/SDL2` 后与主树同命令基线对比」这一步。 - D 节归因:测量前后 `git -C "$MAIN" status --porcelain` **逐行一致**(主树全程只读); `git worktree list` 里净室路径已消失;逐文件增量之和 **等于**观察到的涨幅(实测 +6+8+2 = +16),且每处增量 都指到具体字面量类别(裸形 「字母 T 累进数字 4」)与属主;取数走 `import check_ids` 读 `ck.stats`,且门禁脚本自身 `git diff` 为空。 - 补绿链的每一条都自己 `echo RC=$?` 看到 0,最后以重跑 `done` 打出的**清场日志**(`已摘除联接` / `已删除分支` / `完成(分支此前已合入)`)为成功判据,而不是 `tail` 出来的最后一行。 - **树内提交 / 合并信息(G 节)**:`git log -1 --pretty=%B | grep -c '<被清退主题关键词>'` 打出 **0**(标题 + 正文 + 合并信息三处都查过);消息文件在 `ci-artifacts/`、UTF-8 无 BOM、CR=0、标题 ≤100、正文最长行 ≤80(实测 31/50、32/55); 自审发现消息统计算错是在**未推送**状态下 `--amend -F` 修掉的,历史里没有「更正」提交。 - **文档改动体检(G 节)**:提交前打印过 `lines/bytes/BOM/CR/U+FFFD/三连续空行/行尾空格/末行 LF` 与表格列数一致性, 并区分「本次改动引入 = 0」与「文件里既有的坏行」(实测两处历史坏表格与本次无关,只在报告里点名)。 - **F 节分级与自持理由**:判 `simulator/SDL2` 为硬需求要给出 `simulator/CMakeLists.txt:12`(非 CACHE)+ 派生路径行号 (:34/:70/:71/:180/:207);判 `.venv` 为软需求要给出 `DTU_PRECOMMIT_PYTHON` 与 `ci_local.py` 五级解释器候选顺序; 答「为什么不用插件」时报出插件包版本、文件与三个概念的 grep 命中数,并说明重叠只在 `git worktree add` 的开/收两个动作。 - **改并行上限数字**:唯一事实源 = `task_worktree.py` 的 `MAX_CONCURRENT`(报错文案与 `new` 提示都 `.format()` 插值它, 实测 `:764-766` / `:768-771`),其余全是引用同步;隔离小仓验证到「8 棵成功、第 9 棵不带 `--force` 被拒」, 且没在真仓 `../_wt` 及其 `.state/` 留下验证树。