Files
workbuddy_skills/session-mechanism/references/manifest.md
T
admin 2ed7766007 说人话落地:加每轮注入 + 英文硬核版整包纳入 + 第①段补写作口径
一、用户令(逐字)
「humanizer(英文那份) 也要纳入」「重点就是做到说人话就行了」「但是 content_marketing_agent 的会话生成的文档并没有说人话,还是我手动要求的」

二、根因(两处,都不是"没整合")
· **语气那一档只有指针、没有注入** ⇒ 实测没被读到(`SKILL.md` 必读表标题原写「三篇」而表里有 4 行,
  第 4 项=作业规矩整包,被顶在"必读"之外;已订正为「四类」)。
· **写文档的执行会话那条链上一句写作口径都没有** —— 产品规划技能里「反 AI 味」只出现在**第③段界面**
  (且指的是界面不是文字),**第①段出文档那节零口径** ⇒ 产物自然是 AI 味。

三、改法
1. **每轮注入**(照排版那条现成机制,⛔ 不改 `main()`):
   · `04-去AI味与说话方式.md` 顶部加 `<!-- VOICE-CORE -->` 紧凑块(≈450 字符:核心原则/四种高频 AI 味/交付前三问);
   · `reply-style-guard.py` 里**原地重定义** `_core`(`_core_reply = _core` 后用新 `_core` 包住它并追加语气块)
     ⇒ 注入正文自动多一段,排版那条**不受影响**。
2. **产出侧补口径**:`product-planning` 第①段(stage-discovery)在 1b 表后新增「写作口径」块 ——
   落笔前读 `humanizer-zh` 或本包 04,**定稿前过「交付前快速清单」**,并列出六种禁用 AI 味;**适用本段全部五份产出**。
3. **英文硬核版整包纳入**:原独立技能 `humanizer` **逐字**搬入本包 `references/humanizer-en/`(6 文件、
   md5 逐个一致):55 个模式 + 5 种语气档 + 0–100 AI 痕迹打分 + `--file` 就地改;
   在 `04 §9` 关系表与 `SKILL.md` 对应物段登记(冲突以本包会话场景版为先)。

四、验收
· 新增 `selftest.py::t_voice_core`(4 项);全量 **PASS 106 / FAIL 0**;manifest 70 → **76** 份、语法失败 0。
· 端到端喂真钩子:注入正文已含说人话块、排版块仍在。
· ⛔ 改的是钩子与技能目录(宿主直读)⇒ **不需要分发/重启**。
2026-10-07 22:00:13 +08:00

192 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# manifest · 包内文件清单
> 生成方式:逐文件 `compile()` / `json.loads` + md5 | **最近一次全量重算:2026-10-07 21:56 (说人话每轮注入 + 英文硬核版整包纳入 + 新判据)**
> ⚠️ **2026-10-05 局部增量**:`references/pitfalls.md`(P0-77 拆条 + P0-73/P0-77 压缩)与
> `scripts/goalctl.py`(`--switch-goal` 确认闸 + 旧目标归档)两行的 md5/大小已按当天实测值更新;**其余行仍是 10-04 基线**。
> ⛔ 本表**不含** `install.log`(运行日志)与 `references/manifest.md`(自引用,写完即失真)。
> ⚠️ **provenance 列里的 `skills/multi-session-collab/…`、`skills/workbuddy-session-forensics/…` 已是历史路径**
> —— 那两个目录 2026-10-01 已移到 `<工作区>/归档/技能-退役-20261001/`(⛔ 不在技能根了)。
文件总数:**76** | 语法 / 结构检查失败:**0**
## ✅ 已完成 · 2026-10-05 「目标唯一性 + 换目标需确认」(用户口径落地)
> 用户原话逐字:**「一个工作区 同时只能执行一个目标,如果要切换目标,需要用户确认,然后切换和关注检查切换后的目标」**
- **改前取证(三条,全实测)**:① 载体 `goal.json` **本就是单文件** ⇒ 天然满足"同时一个";② **归档零实现**
(`goalctl.py`/`collabd.py` 全文搜 `goals/` **零命中** ⇒ 那份归档件是**手工造的**);③ **确认闸零实现**
(`declare` **直接覆盖** `title`,无任何准入判断)。
- **修法(两道闸,均在 `goalctl.py::declare()`)**:① 标题变了 ⇒ **默认拒绝**(`rc=3`、**零写入**),
必须带专用开关 `--switch-goal`(⛔ **不等于** `--yes`:前者=「用户已同意换目标」,后者只是「干跑转真写」,
**混用 = 伪造用户授权**);② 确认后旧目标**整份**归档到 `goals/<旧标题≤40字>__<时间>.json` + 新目标留 `_前身目标`。
- **验收(7 项全过)**:拒绝 rc=3 /同目标细化 rc=0 **不被拦** /归档 **32 字段 / 6186 B** 且与旧目标**同源** /
**变异对照**(闸短路 ⇒ rc=0,还原 ⇒ rc=3,证判据非恒绿)/真区未污染 /副本 md5 全同。
- ⚠️ **加闸带出的连带缺陷(已一并修)**:`declare` 没给 `--title` 时**回落成工作区名** ⇒ 把"纯细化"误判成
"换目标" ⇒ 修成「**没给 ⇒ 保持现有标题**」(与 `--topics`/`--kpi` 同规矩)。
- 📂 全文 ⇒ `references/pitfalls.md` **P0-78**;`lifecycle` 那条独立铁律 ⇒ **P0-79**(**从 P0-77 拆出**)。
### 📌 同批完成:`pitfalls.md` 沉淀纪律转绿(改前既有红,顺手修掉)
- 判据=「**单条 > 6 KB 且证据密度 < 4.0 ⇒ 判流水账**」。改前基线读数:`P0-73` 7590 B/2.8。
- 修法(**两条腿**,⛔ 不靠删内容):① **拆条** —— P0-77 里"前缀改造"与"`lifecycle` 空转"是**两个主题**,
拆出 **P0-79**(P0-77 7765→5107 B/P0-79 2141 B);② **删冗余展开**(P0-73 验收段的重复读数)7795→约 5.9 KB。
- 结果:**沉淀纪律 ✓ 转绿**(5 项);自测 **`PASS 94/FAIL 3` → `PASS 95/FAIL 2`**(另 1 条报告型不计入)。
- ⚠️ ⛔ 别为压体量**删判据要点** —— 判据自带关键词对账(`MUST` 表),删了就换一种方式报红。❗原编号 77 → 79,**不许再当 77 引用**
## ✅ 已完成 · 2026-10-05 三代术语收敛(本节替代原「待办」)
- **已执行**:包内 + 两个工作区副本三方同步,md5 一致(`collabd.py`/`goalctl.py`/`board.py`/`board_ext.py`/
`selftest.py`/`collabctl.py`/`guard.py`/`init_workspace.py`/`session-rules-check.py`/`board.html` 全部 OK)。
`selftest.py` 基线 **PASS 97 / FAIL 0**(报告型 1 条不计入);改名的 5 条 `@case` 均能按新名字 `-k` 找到。
- **⛔ 三类不动,是判据不是遗漏**(下一次改名前照抄):
① **「」引述内容逐字不动**(含跨行引述块)—— 引用用户口径只写原话;
② **历史段整段不动** —— `SKILL.md` 19–27 行代际表、含 `旧称/旧词/一代/二代/第三代` 的行、`<hN> 历史…` 段落
(要讲清三代分别叫什么,就必须留着旧名);
③ **`.py` 里 `目标检查` 一律不动** —— 它是**检查会话类别名**(`_CHECK_TAGS`/`_CHECK_TOPICS`、
`[检查]-[结果检查/目标检查]`),并散在字面断言里(`CHECK_KINDS["queue-empty"][1] == "目标检查"`、
`rows.append(...)`、`【目标检查】` prompt 头)⇒ 改了直接断判据。
- ⚠️ **一处同改对**:`board.py::_ROLE_LABEL["worker"]` 与 `board.html` 的 `role==='…'` 是同一处判据的两侧。
- ⚠️ **本条暴露的存量缺陷(已一并修)**:`selftest.py` 的期望串原写 `才建立一轮任务会话`,而 `SKILL.md`
引述里逐字是 `才建立一轮执行会话` ⇒ 该子项**改前就是红的**(被基线里的 97/0 掩盖)。
- 工具:`tmp/term-apply-v3-20261005.py`(dry-run/`--apply`,写盘前自动备份)+ `tmp/term-sync-20261005.py`。
## 2026-10-04 新增文件(⛔ 由 manifest 重算登记)
- `references/01-文档索引.md` — 3604 B |md5 `825999a411e2a4f6b740063f81c01b03`
- `scripts/judge_audit.py` — 13562 B |md5 `8f14a973fa5709a3b9a60b065dc22d7d`
- `scripts/workspace_mirror.py` — 17263 B |md5 `60f104b37df3133785abb13f686eea4f`
- `assets/design-tokens.css` — 6364 B |md5 `0668feb3a4729f1022e579ac0c5d2569`
## 最近改动(⛔ 只记「什么时候改了什么」,不写流水账)
- **2026-10-02 07:0x · 开工第 0 步改名:会话「规划」→ 会话「规则机制」(本轮)**:
① **用户纠正原话**:「**就应该是检查清楚 所有会话规则机制 是否配置完整且生效, 不是规划 是 规则**」
⇒ 首版体检脚本**只查排期那一面**,当天实测出的三类失效(钩子注入指向已退役技能名 / 常驻快照写进幽灵目录 /
每轮注入的记忆指针悬空)**一条都没覆盖** ⇒ 名字还叫「规划」=第二次「在册 ≠ 生效」。
② **收敛成一个入口**:新增 `scripts/session-rules-check.py`(查 **三类十二项**:A 钩子在册·路径存在·
注入技能名存在·闸门日志新鲜 | B 每轮注入记忆的技能指针·常驻快照不比权威旧 | C 周期钟·模型可用性·
`cwds` 同形·投递心跳·活会话·`once` 从未运行的死排期);旧 `scripts/session-plan-check.py` **退役**
到 `<WS>/归档/技能包-旧件-20261002/`,**能力不回退**。
③ **状态标记改名**:`session-plan.json` → **`session-rules.json`**(旧的属过期件,⛔ 别拿来对照)。
④ **判据收紧**:`cwds` 近失配原写成「同父目录 + 字面不同」⇒ 在 `AIProject/` 这种**多业务线平级目录**下
把**别的线**报成失配(实跑当场 2 条假红)⇒ 改为「同父目录 + **名字去 `-`/`_` 后仍相同**」/「同名不同父目录」。
⑤ **判据自验**:⑨⑫ 抽成**纯函数** + 合成样本夹具(`<WS>/tmp/rules-check-mutate.py`)—— 原版 10/0 绿、
**四个变异体**逐一按预期报红。⚠️ 夹具**自己先红两次**(期望值写死:漏算样本 + 有序列表比中文名)。
- **2026-10-01 18:5x · 外置根贯通 + 两处真缺陷(本轮)**:
① `roots.env` 引导块从 9 份扩到 **16 份**(补齐 7 个非钩子脚本:`board` / `board_ext` / `collabd` /
`deliver-gateway-token` / `goalctl` / `selftest` / `stop-collab`);
② **盘符字面量清零**:配置目录兜底改 `~/.workbuddy`,工作区兜底改 `DSH_WS_ROOT`/cwd,
覆盖网日志 glob 改 `DSH_OVERLAY_LOG_GLOB`(原为死路径 —— 本机 `E:/dsh-worker-dev` 不存在);
③ 7 份加**输出编码兜底**;④ `roots.env` 增写 `CODEBUDDY_CONFIG_DIR`;
⑤ 🔴 **修「钩子把技能包当工作区」**:`wb-result-hook.py` 的 `_WS_ROOT` 原按 `3×dirname(__file__)` 推,
包内这份推出来=技能包自己 ⇒ 包里长出 `tmp/supervise-inbox/`;改为复用 `resolve_ws()`;
⑥ 🔴 **修「重定向 + GBK ⇒ print 抛异常 ⇒ 顶层记 fatal、整轮失败」**(本机实测 4 次;
这正是**常驻**跑不起来的拦路石 —— 常驻必须重定向 stdout);
⑦ `install.py` 工作区模板路径纠错(原指 `scripts/collab/`,实际在 `scripts/`);
⑧ `collabd.py` docstring + 两处活注释改**常驻定案**(上一轮漏传导);
⑨ `lock/preflight-lock.sh` + `hooks/lock-guard-hook.py` 的盘符字面量清零;
⑩ 新增 `install.py --manifest`(见下条);
⑪ 🔴 **`scripts/selftest.py` 去掉最后一处项目绝对路径**:`t_tick_wired` 原先写死
`<某工作区>/.workbuddy/tools/wb-result-hook.py` ⇒ 两处都不对:既违反「技能里只用相对路径」,
又因宿主接线已改指**包内**那份而**恒走"文件不在,跳过"** ⇒ 看着绿、其实什么都没验(静默假绿)。
现改按包内相对路径取 `hooks/wb-result-hook.py`,该用例从"跳过"变**真检**(4 项实跑通过)。
- **2026-10-01 19:0x · `install.py --manifest`**:把「重算本表」固化成子命令
(包一改表就过期 ⇒ 以前每轮临时手搓脚本、跑完即删,已因此误判两次)。
只重写**表 + 计数行 + 重算时间**,⛔ 不碰上方散文;**行尾随原文件**(本表是 CRLF,写成 LF 会造成一次无声全文件 diff)。
- **🔴 两份同源脚本「有意不一致」(⛔ 别当 bug 去修平)**:`preflight-lock.sh` 与 `lock-guard-hook.py` 在
**技能包**与**文档库 `07-scripts/`** 各有一份。包内那份住在技能包里、**推不出文档库根** ⇒ 只能走
`roots.env` +(`lock-guard-hook.py` 的)末位字面量兜底;库内那份住在 `<文档库>/07-scripts/` ⇒
**按 `__file__` 往上两级即文档库根**。⇒ 包内有引导块、库内没有,是**位置决定的**,不是漏改。
- **2026-10-01 18:2x · 瘦身(本轮)**:`references/collab-detail.md` 删去**原件 YAML 变更流水**(约 9.4 KB)+ 加**读法索引**+ 压缩 §12;
`references/{manifest,taskgraph,pitfalls}.md` 去掉过期条目与旧抬头;包内 `__pycache__/`、`hooks/bak-*/`、`tmp/` 已清。
**⛔ 本轮无机制代码改动。**
- **2026-10-01 16:5x**:`scripts/hooks/session-log-guard.py` 新增「**硬档就地回收**」—— 到 8 MiB 先试**一次**把本会话
`logs/<日期>/sdk/conversations/<sid>.log` 改名(后缀 `.recycled-<时间戳>`,⛔ 不删、⛔ 不以 `.log` 结尾故与清扫器不重叠)
⇒ 宿主立刻重建并继续写 ⇒ **会话不必再因撞 10 MiB 而停手**;失败则**逐字退回**原「停手+建接续」口径。
开关 `DSH_SLG_NO_RECYCLE=1`(只关回收、保留叫停)。⚠️ 文档库原件 `07-scripts/session-log-guard.py` **已同语义同步**。
- **2026-10-01 16:0x**:原 `multi-session-collab` 的 `SKILL.md` 全文并入 `references/collab-detail.md`(治 8 处悬空引用:
`§0.05` `§0.5.2` `§0.5.4` `§0.5.5` `§1.3` `§1.4a` `§3` `§6`);清掉 9 处旧技能路径/名的活文本;
两个原技能目录移入 `<工作区>/归档/技能-退役-20261001/`。
## 逐文件清单
| 包内路径 | 字节 | md5 | 语法检查 |
|---|---|---|---|
| `SKILL.md` | 114635 | `c779fd78f61458b62cec99e9e103a4fc` | — |
| `assets/board-launch.py.tpl` | 4355 | `7e9dfe1c4845f20dbb89f599d80e167b` | — |
| `assets/board-render-probe.js` | 14398 | `a21bd1905b34537436ce778c6bfbc288` | — |
| `assets/board.html` | 151811 | `c597cd7f21543542e9cdbe486c5ccd79` | — |
| `assets/design-tokens.css` | 6364 | `0668feb3a4729f1022e579ac0c5d2569` | — |
| `install.py` | 37297 | `55603c2e739e7b531998f5563f15f789` | ok |
| `references/00-动手前必过.md` | 7181 | `33bc86e442ccd4fcbb930c79c4ad0641` | — |
| `references/01-文档索引.md` | 4518 | `f401dd36b2d30cbc89ac91f9d633b72c` | — |
| `references/02-功能优先协作协议.md` | 35529 | `9122a6715bde02ab549805d69866d1cf` | — |
| `references/03-回复排版-核心块.md` | 7766 | `01277367d560383669ad493538e45587` | — |
| `references/04-决策方法论.md` | 35566 | `eb5bdf8f100beb8eacb9f20b042df86c` | — |
| `references/99-速查清单.md` | 9832 | `5c97728af7cb67e9be9a3e491bdc5fd9` | — |
| `references/architecture.md` | 119631 | `5fc3b103bb846b6dd903df0b7e736d22` | — |
| `references/collab-detail.md` | 98805 | `24bd0cfd10da66831f5d12f1716b7ebc` | — |
| `references/collab.md` | 16560 | `97aa751f86d9b4ba8db401b5ec592695` | — |
| `references/deploy.md` | 16754 | `4e382f7876f31754ec9629925340c2d8` | — |
| `references/dsh-decision-method/素材库-A-AI推理.md` | 19914 | `89fc178e671c989d9079c1def20591da` | — |
| `references/dsh-decision-method/素材库-U-用户决策.md` | 24597 | `94c9e860148f4265f1e21e5322346f94` | — |
| `references/dsh-decision-method/素材库-反例-X.md` | 5712 | `8bce93e8c1ce71d17e6d33aa9a2d7724` | — |
| `references/forensics.md` | 6067 | `1fb6deca9bb05bebe950d4f4e3adf043` | — |
| `references/humanizer-en/LICENSE` | 1092 | `a8440fdde2a535efdd44813bce97df57` | — |
| `references/humanizer-en/README.md` | 4204 | `f3f41dc19ef27b7591422a43140d17fe` | — |
| `references/humanizer-en/SKILL.md` | 39490 | `3fd8d0d4175d1325cc942ce65733719d` | — |
| `references/humanizer-en/references/always-on-templates.md` | 3066 | `1bbcc7aa145f5a8189f35af7f9477769` | — |
| `references/humanizer-en/references/patterns.md` | 26186 | `830c68f9e07fb6bbee297b7a9004d994` | — |
| `references/humanizer-en/references/patterns.zh.md` | 14867 | `2c661fde3d84751edc8053eedd36f930` | — |
| `references/karpathy-output-ladder/SKILL.md` | 5252 | `f1e3b07003bbc544db52d32c122e6faf` | — |
| `references/karpathy-output-ladder/assets/html-template/index.html` | 5883 | `b95c39d2cd41d8c0f21d4007e7ef3cef` | — |
| `references/karpathy-output-ladder/references/ladder-workflow.md` | 2684 | `d49840707d19302d8f61f4e1d7f4ea2e` | — |
| `references/karpathy-output-ladder/references/ste100.md` | 3022 | `fdbe3271c21a3c17f326d1e71de33b0d` | — |
| `references/pitfalls.md` | 311254 | `d321a71e38dd246b8014b4c9100b12c7` | — |
| `references/rules.md` | 9218 | `a8fd1e616600defb724fa64af67a7348` | — |
| `references/supervise-persistence.md` | 34799 | `d18d44d36fd939924f7d5752b7c2be40` | — |
| `references/taskgraph.md` | 3521 | `be6c6540be86475bb3430688c2987afc` | — |
| `references/作业规矩/00-作业总规矩(原 agent-operating-rules).md` | 70243 | `80fc5471015b237ee7aacd6976eda6fe` | — |
| `references/作业规矩/02-工作区纪律.md` | 21351 | `1a679fdeb9cca0883a47f619d1aec85d` | — |
| `references/作业规矩/03-多棒接力编排.md` | 13185 | `631b4b7455938b0c3a3a4f6f94d97eed` | — |
| `references/作业规矩/04-去AI味与说话方式.md` | 14059 | `5100e1a26c3477541eafe1c7797d3b3a` | — |
| `roots.env` | 624 | `ec38f15f9a4101d69c815aa2cdd7b477` | — |
| `scripts/apply-reply-rules.py` | 7172 | `551b0ee5bf6c7a9f6b64c1b1d53bd343` | ok |
| `scripts/board-launch.py` | 2794 | `998a66b9d335ab1863b5b871a527bf4f` | ok |
| `scripts/board.py` | 146111 | `d90395d1f1a7c3f94419a33cdf444384` | ok |
| `scripts/board_ext.py` | 45655 | `2319fb9d2d21bf961e03a42da9a1ad4b` | ok |
| `scripts/collabctl.py` | 32007 | `1c597185be099821c7b1d6dc66fadb05` | ok |
| `scripts/collabd.config.example.json` | 1158 | `6655c15c411a84e3ca12fd136dbe2c60` | ok |
| `scripts/collabd.py` | 436057 | `590688483377cb0e0b6c34ade1798c51` | ok |
| `scripts/deliver-gateway-token.py` | 5685 | `cbba9648d404ecd2683061e19dbdb24a` | ok |
| `scripts/deploy_code.py` | 5325 | `a79cf5e5ffb3e8c60a31b4d0d8845f40` | ok |
| `scripts/forensics/proc-parent.py` | 2347 | `8cdfff2dbb88303298752c3777da7b20` | ok |
| `scripts/goalctl.py` | 53820 | `c4eb6c020ac102ca3ae7f0463c5d8051` | ok |
| `scripts/guard.py` | 13653 | `43f4e279896090c6c6c3fcbdb4fa95d6` | ok |
| `scripts/hooks/_env.py` | 17743 | `e08f33d97adb640dc1657c21ae59a2ad` | ok |
| `scripts/hooks/bash-output-guard.py` | 17741 | `3f2fdfa17f66f7fcac42e06853433a26` | ok |
| `scripts/hooks/decision-rules-hook.py` | 12399 | `c521237bada7487aecf5e54ad4d19ace` | ok |
| `scripts/hooks/lock-guard-hook.py` | 20363 | `641457de0297ee7a812ccde57f67dc2b` | ok |
| `scripts/hooks/prompt-guards.py` | 9332 | `0aa1d1fdd2bf5a40cda2e60d7a785534` | ok |
| `scripts/hooks/reply-style-guard.py` | 13200 | `e044f5d3e52ae94775dfba2090e7ae8e` | ok |
| `scripts/hooks/session-log-guard.py` | 24636 | `4dd13b24d541d1afc7b4874dba6bb1eb` | ok |
| `scripts/hooks/skill-load-guard.py` | 29994 | `2450b93b4bac87cf9e99697703efa78f` | ok |
| `scripts/hooks/stop-dialog-guard.py` | 51240 | `3e0791e42f41c37438601a9d2314dd8e` | ok |
| `scripts/hooks/supervise-ensure-hook.py` | 14308 | `dc6f62584a8384baba0a1f2460828013` | ok |
| `scripts/hooks/wb-result-hook.py` | 37199 | `2d4f694acd031222bf03b98a859b6e90` | ok |
| `scripts/init_workspace.py` | 24042 | `dda53acd24bcc66d509bbdab3ebc0488` | ok |
| `scripts/judge_audit.py` | 13562 | `8f14a973fa5709a3b9a60b065dc22d7d` | ok |
| `scripts/keepalive.py` | 12265 | `b84c753917e0a34cf40800bda953e7a4` | ok |
| `scripts/lock/handoff-guard.sh` | 34616 | `f38b2ec92fdc1dab9abdaca0e0bb001a` | — |
| `scripts/lock/handoff-status.py` | 3923 | `3edb20f9c4021ebe2323478860bf8f6f` | ok |
| `scripts/lock/op-lock.sh` | 4690 | `1a31eda3642e23693a65e1519860c744` | — |
| `scripts/lock/preflight-lock.sh` | 8673 | `e985ec1cb853fae4c351cd03b171355d` | — |
| `scripts/mut_run.py` | 13323 | `3bffc12e1e57d5efc743bac55e584b62` | ok |
| `scripts/selftest.py` | 493433 | `7ebd4893ca5339c575ed64d79f2697ac` | ok |
| `scripts/session-rules-check.py` | 44412 | `b2b468992d80421106316eaf451e2477` | ok |
| `scripts/stop-collab.py` | 10462 | `d8043bedd23b52b6642aaf7ec8b8c980` | ok |
| `scripts/supervise-launch.py` | 2503 | `f416a2f197e5524a8859c1d227ba1d05` | ok |
| `scripts/wake-session.py` | 11011 | `32c6038b541249730f322f933ee287c1` | ok |
| `scripts/workspace_mirror.py` | 17263 | `60f104b37df3133785abb13f686eea4f` | ok |