# `blog.hoelee.com` 顾问二次审阅落地报告 — 同一批 11 篇 DevOps(顾问侧编号 Batch-05 / 内部 Batch-02) > **对应资料包**:顾问本轮报告的 11 篇 slug,全部为 `audit-tracker.json` 中本已 `approved` 的 Batch-02 文章 > **性质**:**二次审阅(re-review)**。顾问手上的文本快照早于上一轮修复,因此本轮报告中有相当比例的意见属于「已修好」的重复项。本文只记录**真实增量修复**与**顾问误判澄清**。 > **审批状态**:11 篇维持 `approved`,`notes` 已更新为二次审阅记录。 --- ## 一、结论摘要 | 分类 | 数量 | 说明 | | --- | --- | --- | | 真实技术硬伤,本轮已修 | 6 项 | 集中在 11、04/09、06、03、02、01 | | 上一轮已修好,顾问看到的是旧快照 | 9 项 | 标题 `折腾`、`homelabs`、`rig`/`home server`、英文有序列表坍塌、`四周`→`三周`、ZH 内链 `/zh/`、文末 CTA、代码 `
` 折叠、09 的 `updatedDate` | | 顾问误判(站上正文无此问题) | 4 项 | `Bearer ***`、06 的 User Scripts 解释「说反了」、11 的第三轮悬念「未闭环」、多篇「缺文末 CTA」 | | 需要作者本人给数字(未代填) | 1 项 | 01 的物理机型锚点 | --- ## 二、真实增量修复(本轮 commit `19de315`) ### 1. `why-telegram-bot-notifications-die`(最重的一处) - **源码级缺陷**:`b"\r\n".join(body_lines)` 里的 `\r` 转义在历史流水线中被吃掉,导致行内代码跨行断裂、`parts[]` 示例里的 `\r\n\r\n` 全部退化成 `\r\n\n`。已用正确的转义重建该章节与示例代码。 - **原理解释改写**:原文暗示 `bytes.join()` 会改写元素内部的 `\r\n`(错误)。现在明确两点真实机制:① 二进制流若先经过 `.splitlines()` 之类的按行处理,JPEG 内部的 `0x0D`/`0x0A` 会被改写为 `\r\n`,同时与 `Content-Length` 失配;② 片段自带末尾 `\r\n` 时再 join 会得到 `--boundary\r\n\r\nContent-Disposition`,在 MIME 里等于头部提前结束,`nginx/1.30.1` 在 Bot API 之前就以 400 拒绝。 - **第三轮悬念**:原文其实已有闭环段落,本轮把它写得更准(`PID 1` 跑内存中旧拼接路径、`docker exec` 用刚改的脚本 + 最小 payload)。 - **人设**:文末「internal production tool」表述上一轮已改好;本轮补物理锚点(Synology NAS / Portainer / Docker bridge / `PID 1`)。 - **Takeaway #4** 同步改写,与新的机制解释一致。 ### 2. `the-cause-was-trim-not-the-ssds` / `when-smart-says-healthy-but-your-raid-is-corrupting-data` - **`0x8941f998` 字段位置**:确实是硬伤。盘读回全零块时,该值出现在 **`found`** 一侧(= 内核按盘上实际返回字节算出的值),`wanted` 是 csum tree 里的期望值。两篇的日志行均改为 `wanted found 0x8941f998`,并补上「看它落在哪一侧」的解释。 - **字节序说明**(本轮新增的实测结论):4 KiB 全零块的规范 CRC32C 是 `0x98f94189`,内核按磁盘小端序打印出来才是 `0x8941f998`。两篇都补了这一句,避免被资深读者当成「算错了」。 - **04 的时间线**:`2026-09-22` 复核已过期,改为已发生的事实叙述(`corrected_errors: 0`、无新增 `csum failed`、`corruption_errs` 停在 sdd1=27 / sdb1=31)。 - **09 的闭环**:`## The result` / `## 结果` 补上「转接卡也洗清了 → 根因是异步 TRIM」的最终更新与续篇链接;`description` 同步为已定论版本(原文写着「仍未定论」)。 ### 3. `unraid-stop-array-hangs-on-swapfile` - **`losetup -p 100`**:确认是错的,`-p` 是 `--pass-fd`(loop 加密遗留参数),与优先级无关。`/boot/config/go` 示例与「脚本 2」均改为 `losetup "$LOOP" ...` + `swapon -p 1 "$LOOP"`。 - **`/proc/swaps` 显示 `-2`**:这是「创建时未指定优先级」的内核默认值,与脚本里的 `swapon -p 1` 冲突。已补一段说明,说明那段输出来自加 `-p` 之前的那次运行,不伪造单一时间线的证据。 ### 4. `that-dying-ssd-was-just-a-bad-sata-cable` - **`UDMA_CRC` 机制**:改为「属性 199 只统计到帧时接口校验和出错(ICRC);劣质线材通常走的是 `WRITE FPDMA QUEUED` 命令超时 + 链路重置,这类 I/O 在算出帧级 CRC 之前就被丢弃,所以计数器可以全程为 0」。 - **破坏性写入警示**:`fio --filename=/dev/sdd --rw=write` 代码块加了裸盘覆写警告(中英双语)。 ### 5. `synology-spreadsheet-api-is-a-container` - **DSM 的 `cpus:` 失效原因**:由「内核没有 CPU CFS 调度器」改为「内核未编译开启 `CONFIG_CFS_BANDWIDTH`(cgroup CPU 带宽控制),默认 CFS 调度器照常运行、只是没有配额可执行」。 - ZH CTA 的「小企业」→「中小企业(SME)」。 ### 6. `space-reclamation-wasnt-stuck-it-was-waiting` - `-344 GiB over 8 days` = `1.79 GiB/h`,正文与趋势块由 `-1.5 GiB/h` 统一为 `-1.8 GiB/h`。 - `description` 里残留的「分两步 / in two steps」改为「分三笔 / three separate reclaims」,与表格 3 条回收项对齐。 - frontmatter 补 `blueprint: self-hosted-infrastructure` + `blueprintLayer: L1-compute-storage-network`。 ### 7. frontmatter / 小项 - `uploading-large-videos-to-youtube-via-cdp`:补 `blueprint: ai-agent-automation` + `L1-deterministic-orchestration`;`CONTAINER_ID` 注释说明可直接填容器名(容器重建后短 ID 会变)。 - `the-upstream-was-deleted-then-came-back-rewritten`:补 `blueprint: sme-digital-suite` + `L4-managed-ops-handover`;首段「给我家人 / for my family」改为「付费订阅读者与内部用户」。 - `why-chrome-forgets-its-tabs-in-a-container`:`saved` 列表补空行过滤;补「空快照覆盖」边界条件与该护栏(`/json/version` 的 `webSocketDebuggerUrl` 变化时才允许重开/覆盖);补 blueprint 字段。 --- ## 三、顾问误判澄清(站上正文无此问题,勿再改) 1. **`Bearer ***` 不存在**:中英四篇的 `curl` 一直是 `$TOKEN`。顾问看到的是**批次打包文件的脱敏产物**——生成批次时把 `$TOKEN` 当密钥抹成了 `***`。这也是「中文版被误脱敏」这条意见反复出现的原因。 2. **06 的 User Scripts 解释没有说反**:正文本来就写着「`At First Array Start Only` 只在开机后第一次触发、会跳过 GUI 停止→启动循环」,与顾问的纠正完全一致;真正错的只有 `losetup -p 100`。 3. **11 的第三轮悬念上一轮已闭环**,不是断头线索。 4. **「缺文末 CTA」不成立**:01、03、04、09 等篇文末均有 `me@hoelee.com` + WhatsApp `+60 12-797 2969` 双轨联系栏。 --- ## 四、需要作者本人确认的一项 - **01 的物理硬件锚点**:全文只写 `volume1 42 TB` / DSM 日志,没有机型号。仓库内其它文章(02、mem0 篇)写的是 `Synology DS1821+`,但本文未出现机型,**没有代为填写**——避免把两台不同设备合并。若确认是同一台,建议在首段补 `Synology DS1821+ (DSM 7.x)` 一句。 --- ## 五、验证 - `npm run build` 通过(Pagefind 索引 319 页 / 35,341 词,零错误)。 - 11 篇 × 双语 22 个文件跑过禁用词扫描(`homelab` / `home server` / `rig` / `家用` / `折腾` / `玩具` / `personal project` / `给我家人` / `小企业`)与双向内链前缀检查(ZH 必须 `/posts/zh/`,EN 不得含 `/zh/`),0 命中。 - 代码围栏配对检查通过,无跨行断裂的行内代码。