<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Changelogs on 海边</title><link>https://sdttttt.online/changelog/</link><description>Recent content in Changelogs on 海边</description><generator>Hugo</generator><language>zh</language><copyright>© 2026, sdttttt</copyright><lastBuildDate>Mon, 05 Oct 2026 18:30:45 +0800</lastBuildDate><atom:link href="https://sdttttt.online/changelog/index.xml" rel="self" type="application/rss+xml"/><item><title>2026-10-05</title><link>https://sdttttt.online/changelog/2026-10-05/</link><pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-10-05/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;删除博客底部右侧的 &lt;code&gt;powered by hugo&lt;/code&gt; 与 &lt;code&gt;hugo-paper&lt;/code&gt; 两个外链，保留左侧 &lt;code&gt;© {{ 年份 }} {{ 站点标题 }}&lt;/code&gt; 版权段 ✅
&lt;ul&gt;
&lt;li&gt;新增覆写文件 &lt;code&gt;layouts/partials/footer.html&lt;/code&gt;，照搬 vendor 主题 &lt;code&gt;themes/hugo-paper/layouts/partials/footer.html&lt;/code&gt; 的结构，仅去掉右侧两个 &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; 标签&lt;/li&gt;
&lt;li&gt;顶部加注释说明：与 &lt;code&gt;themes/hugo-paper/layouts/partials/footer.html&lt;/code&gt; 同步、只尾部两个 &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; 不同，下次主题 bump 时按此对比 diff&lt;/li&gt;
&lt;li&gt;走覆写模式（与 &lt;code&gt;partials/bg.html&lt;/code&gt; / &lt;code&gt;partials/header.html&lt;/code&gt; / &lt;code&gt;_default/baseof.html&lt;/code&gt; 同套路），vendor-in 的 &lt;code&gt;themes/hugo-paper/&lt;/code&gt; 不动，避免下次 sync hugo-paper 时冲突&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;验证 &lt;code&gt;hugo --minify&lt;/code&gt; 通过（265 页）、&lt;code&gt;deno task test&lt;/code&gt; 通过（23/23）、&lt;code&gt;deno task validate-posts&lt;/code&gt; 通过&lt;/li&gt;
&lt;li&gt;构建产物 &lt;code&gt;public/&lt;/code&gt; 中新生成的页面 footer 正确收敛为：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;footer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt; &lt;span style="color:#50fa7b"&gt;class&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;mx-auto flex h-[4.5rem] max-w-(--w) items-center px-8 text-xs tracking-wider uppercase opacity-60&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4&lt;/span&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#ff79c6"&gt;div&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;class&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;mr-auto&amp;#34;&lt;/span&gt;&amp;gt;© 2026, sdttttt&amp;lt;/&lt;span style="color:#ff79c6"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#ff79c6"&gt;footer&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;调试时 &lt;code&gt;which deno&lt;/code&gt; 找不到 —— 本机 mise 装了 &lt;code&gt;deno 2.9.7&lt;/code&gt; 但 cwd 不在用 deno 的项目根，shell 没自动激活。直接用绝对路径 &lt;code&gt;~/.local/share/mise/installs/deno/2.9.7/bin/deno&lt;/code&gt; 跑即可 ⚠️ - 下次可直接 &lt;code&gt;mise exec -- deno task test&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;public/&lt;/code&gt; 里能看到一些旧 slug 文件（&lt;code&gt;20240615-immortalwrt的编译踩坑-vc6/&lt;/code&gt;、&lt;code&gt;20200402-只需要服务中心-b4y/&lt;/code&gt; 等）渲染成 PaperMod 风格 footer —— 这是上一次部署留下的旧产物（&lt;code&gt;rename-posts.ts&lt;/code&gt; 每次重生成随机 4 位 hash），新构建会用新 slug &lt;code&gt;t2s&lt;/code&gt; / &lt;code&gt;6v0&lt;/code&gt;，CI 下次 deploy 整树覆盖后即消失&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;vendor-in 主题 + override 模式现已稳定（4 个覆写：&lt;code&gt;_default/baseof.html&lt;/code&gt;、&lt;code&gt;partials/bg.html&lt;/code&gt;、&lt;code&gt;partials/header.html&lt;/code&gt;、&lt;code&gt;partials/footer.html&lt;/code&gt;），下次 sync hugo-paper 时记得逐一对照 diff&lt;/li&gt;
&lt;li&gt;如未来想完全自定义 footer 文案（比如加 RSS / ICP 备案号），直接改 &lt;code&gt;layouts/partials/footer.html&lt;/code&gt; 即可；版权段目前读 &lt;code&gt;site.Copyright&lt;/code&gt;，未配置所以走默认 &lt;code&gt;© {{ now.Year }} {{ site.Title }}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录续"&gt;维护记录（续）&lt;/h2&gt;
&lt;h3 id="完成的工作-1"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;清理 &lt;code&gt;static/bg/&lt;/code&gt; 下的 3 张 JPG（原图为抠图前的备份，按 claudelog 14 续计划&amp;quot;如果不再需要回滚可手动删除&amp;quot;）✅
&lt;ul&gt;
&lt;li&gt;删除：&lt;code&gt;F_tZfZBbwAALItU.jpg&lt;/code&gt; (256KB) + &lt;code&gt;FxC7q1YaUAE8SOL.jpg&lt;/code&gt; (197KB) + &lt;code&gt;GiG69PDa8AAvoeS.jpg&lt;/code&gt; (127KB)，共 ~580KB&lt;/li&gt;
&lt;li&gt;模板 &lt;code&gt;layouts/partials/bg.html&lt;/code&gt; 没做 basename 去重，同名 JPG/PNG 会被全部加载，所以这次清理&lt;strong&gt;同时&lt;/strong&gt;节省仓库体积和访客下载量&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hugo --minify&lt;/code&gt; 重新构建，&lt;code&gt;public/index.html&lt;/code&gt; 现在只有 3 个 &lt;code&gt;.page-bg__img&lt;/code&gt; div（之前是 6 个，jpg+png 各一份）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;顺手验证：仓库内其它位置无 &lt;code&gt;.jpg&lt;/code&gt; 引用；&lt;code&gt;.DS_Store&lt;/code&gt; 在 &lt;code&gt;.gitignore&lt;/code&gt; 里&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-1"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;claudelog 14 续写过 &amp;ldquo;按 basename 优先 PNG、忽略同名 JPG&amp;rdquo; 的 baseof 重构，但读 &lt;code&gt;layouts/partials/bg.html&lt;/code&gt; 实际没有这个过滤逻辑（&lt;code&gt;readDir&lt;/code&gt; 直接 append 所有 jpg/png）⚠️ - 当时要么 claudelog 描述超前于代码改动，要么被回滚过&lt;/li&gt;
&lt;li&gt;这次没去补这个去重逻辑 —— 因为直接删 JPG 已经解决了&amp;quot;多倍加载&amp;quot;问题（一个 div 一份 URL）；如果以后再加新图，要么用纯 PNG，要么重新审视这个模板&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-1"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;当前 &lt;code&gt;static/bg/&lt;/code&gt; 留下 &lt;code&gt;.DS_Store&lt;/code&gt;（gitignored，不会进仓库），3 张 PNG 各 ~200KB。如果以后想再瘦身，可以用 &lt;code&gt;sharp&lt;/code&gt; / &lt;code&gt;oxipng&lt;/code&gt; 对 PNG 做无损压缩，预计能再省 20-30%&lt;/li&gt;
&lt;li&gt;claudelog 14 续描述的 baseof 重构可能从未落地；如果未来想严格按&amp;quot;按 basename 去重&amp;quot;的语义加回来，注意当前&amp;quot;删 JPG&amp;quot;已经让模板自然只剩 3 张图，加上去重后行为不变&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录再续"&gt;维护记录（再续）&lt;/h2&gt;
&lt;h3 id="完成的工作-2"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修复 &lt;code&gt;layouts/partials/bg.html&lt;/code&gt; 模板的后缀白名单
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;根因&lt;/strong&gt;：Go template 第 27 行用 &lt;code&gt;(in (slice &amp;quot;.jpg&amp;quot; &amp;quot;.jpeg&amp;quot; &amp;quot;.png&amp;quot; &amp;quot;.webp&amp;quot; &amp;quot;.gif&amp;quot; &amp;quot;.svg&amp;quot;) (path.Ext .Name))&lt;/code&gt;，把 JPG/PNG 都接受，static/bg/ 里同名 &lt;code&gt;.jpg/.png&lt;/code&gt; 都会被加入 &lt;code&gt;$bgImages&lt;/code&gt;，最终页面同时下载 2 倍体积&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修复&lt;/strong&gt;：改为 &lt;code&gt;(eq (path.Ext .Name) &amp;quot;.png&amp;quot;)&lt;/code&gt;，只接受 &lt;code&gt;.png&lt;/code&gt; 后缀&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;位置&lt;/strong&gt;：&lt;code&gt;layouts/partials/bg.html:27&lt;/code&gt;（readDir 分支）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防御性收益&lt;/strong&gt;：以后误传 JPG 到 &lt;code&gt;static/bg/&lt;/code&gt; 也不会被加载&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hugo --minify&lt;/code&gt; 重建验证：仍是 3 张 png，渲染正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-2"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;claudelog 14 续里的描述是&amp;quot;按 basename 优先 PNG、忽略同名 JPG&amp;quot;，但代码里没体现。这次不按&amp;quot;basename 去重&amp;quot;的方案做（更复杂），而是直接把白名单收敛到 &lt;code&gt;.png&lt;/code&gt; —— 因为 static/bg/ 事实只使用 PNG，白名单语义最清晰；要支持别的格式再去改也方便 ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-2"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果以后真的需要支持多种格式（webp/svg/jpg），可以加一个 helper：&lt;code&gt;basename → format priority&lt;/code&gt;，既保留多格式又避免双倍加载&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录三续"&gt;维护记录（三续）&lt;/h2&gt;
&lt;h3 id="完成的工作-3"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; 「提交与 PR 规范」节追加一条规范：&lt;strong&gt;推送前必须先检查远端是否有新提交&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;触发原因：今天这次 push 遇到了 rebase 冲突 + 需要 &lt;code&gt;--force-with-lease&lt;/code&gt; 才能推上去 —— 根因是本地 commit &lt;code&gt;876248f&lt;/code&gt; 完成后 CI bot 又推了 &lt;code&gt;b71c015 chore(format): prettier markdown&lt;/code&gt;，远端在我推上之前已经领先一步&lt;/li&gt;
&lt;li&gt;新规范内容：
&lt;ul&gt;
&lt;li&gt;推送前必跑：&lt;code&gt;git fetch origin &amp;amp;&amp;amp; git log HEAD..origin/master --oneline&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;看到新提交（常见来源：CI bot 的 &lt;code&gt;chore(format)&lt;/code&gt; 格式化了你刚改的 markdown）必须先 rebase / merge 解决冲突再 push&lt;/li&gt;
&lt;li&gt;避免与远端历史分叉；&lt;code&gt;--force-with-lease&lt;/code&gt; 仍是 rebase 后的合规选项，但&lt;strong&gt;能避免就避免&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-3"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果 CI race 频繁发生（如 deploy.yml 的 &lt;code&gt;Commit auto-fix results&lt;/code&gt; 步骤在 push 完成后又产生新 commit），可以考虑：
&lt;ul&gt;
&lt;li&gt;给 auto-fix 脚本加 &lt;code&gt;git fetch origin --quiet &amp;amp;&amp;amp; git rev-parse HEAD&lt;/code&gt; 检查：如果本地 HEAD 跟 fetch 后的 origin/master HEAD 不一致，说明已有人推送，则跳过 auto-fix commit&lt;/li&gt;
&lt;li&gt;或者把 &lt;code&gt;Commit auto-fix results&lt;/code&gt; 步骤拆到 deploy job 之后单独跑，避免跟用户 push 抢顺序&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;当前 &lt;code&gt;git-commit-push.ts&lt;/code&gt; 的 &lt;code&gt;pull --rebase&lt;/code&gt; 已经会捕获到远端领先，但没有&amp;quot;在 add -A 之前先 fetch 检查&amp;quot;的逻辑 —— 如果有上游 race 担忧，可以在脚本里加一步 dry-run &lt;code&gt;git fetch&lt;/code&gt; + 比对 &lt;code&gt;HEAD&lt;/code&gt; 与 &lt;code&gt;origin/master&lt;/code&gt;，有差异时先 dry-run 报错而不是直接 add + commit&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录四续"&gt;维护记录（四续）&lt;/h2&gt;
&lt;h3 id="完成的工作-4"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主题架构重构：layouts/ override → themes/sdttttt-paper/ 子主题&lt;/strong&gt;（从方案 A/B/C 中选 C）✅
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;背景&lt;/strong&gt;：此前用 &lt;code&gt;layouts/&lt;/code&gt; 覆写 + vendor-in &lt;code&gt;themes/hugo-paper/&lt;/code&gt; 两层结构，维护时需要同步跟踪两个目录；想统一到&amp;quot;自己的主题&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新结构&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;themes/hugo-paper/&lt;/code&gt; — 父主题，原样 vendor-in&lt;/li&gt;
&lt;li&gt;&lt;code&gt;themes/sdttttt-paper/&lt;/code&gt; — 子主题，通过 Hugo &lt;code&gt;[parent] name = &amp;quot;Paper&amp;quot;&lt;/code&gt; 继承父主题，5 个 override 文件 + 1 个 &lt;code&gt;theme.toml&lt;/code&gt; + 1 个 &lt;code&gt;README.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;go.mod&lt;/code&gt; — 新增，Hugo modules 入口（&lt;code&gt;module github.com/sdttttt/sdttttt.github.io&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hugo.toml&lt;/code&gt; — &lt;code&gt;theme = &amp;quot;sdttttt-paper&amp;quot;&lt;/code&gt; + 新增 &lt;code&gt;[module.imports]&lt;/code&gt; 块让父主题作为 module 加载&lt;/li&gt;
&lt;li&gt;旧的 &lt;code&gt;layouts/_default/baseof.html&lt;/code&gt; / &lt;code&gt;layouts/partials/{bg,header,footer}.html&lt;/code&gt; / &lt;code&gt;assets/custom.css&lt;/code&gt; 全部 &lt;code&gt;git mv&lt;/code&gt; 到 &lt;code&gt;themes/sdttttt-paper/&lt;/code&gt;（git 识别为 R，保留 blame）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每个 override 文件头注释已更新&lt;/strong&gt;：明确说明这是 sdttttt-paper 的文件、原件在父主题哪、sync 上游时如何 reapply diff&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;themes/sdttttt-paper/README.md&lt;/code&gt;&lt;/strong&gt; 新建：说明基于什么、override 清单、同步上游两步指南&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除&lt;/strong&gt;空的 &lt;code&gt;layouts/&lt;/code&gt; 和 &lt;code&gt;assets/&lt;/code&gt; 目录（里头仅 &lt;code&gt;.DS_Store&lt;/code&gt;，已被 .gitignore）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AGENTS.md「项目结构」节&lt;/strong&gt; 同步重写：描述新两层主题布局、go.mod 入口、主题同步两步走&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-3"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[parent]&lt;/code&gt; block 在 directory-based 主题下不生效&lt;/strong&gt;：起初 &lt;code&gt;sdttttt-paper/theme.toml&lt;/code&gt; 写了 &lt;code&gt;[parent] name = &amp;quot;hugo-paper&amp;quot;&lt;/code&gt;（按目录名猜），但 [parent] 在 Hugo directory-based 加载路径下完全被忽略——构建结果只有 14 页（仅 sdttttt-paper 自带那 4 个 layout 有效页面），其余页面 fallback 到 0 layout，3 个 WARN（taxonomy / term / search 没 layout）⚠️&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[parent] name&lt;/code&gt; 实际匹配的是父主题 theme.toml 的 &lt;code&gt;name&lt;/code&gt; 字段而不是目录名&lt;/strong&gt;：父主题 &lt;code&gt;themes/hugo-paper/theme.toml&lt;/code&gt; 里是 &lt;code&gt;name = &amp;quot;Paper&amp;quot;&lt;/code&gt;，不是 &lt;code&gt;hugo-paper&lt;/code&gt;。改成 &lt;code&gt;[parent] name = &amp;quot;Paper&amp;quot;&lt;/code&gt; 后仍然不行——说明 [parent] 这个字段本身在 directory-based 加载路径里就是失效的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题继承要求 Hugo modules，不允许 directory-based 加载&lt;/strong&gt;：查 Hugo 文档后发现 &lt;code&gt;theme = &amp;quot;X&amp;quot;&lt;/code&gt; 是 directory-based 加载、不参与组件继承；要让 sdttttt-paper override hugo-paper 的 layout，必须双方都作为 module 加载&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugo modules 加载 &lt;code&gt;themes/hugo-paper&lt;/code&gt; 的 path 写法踩坑&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;path = &amp;quot;themes/hugo-paper&amp;quot;&lt;/code&gt; → Hugo 拼成 &lt;code&gt;themes/themes/hugo-paper&lt;/code&gt;（错）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;path = &amp;quot;./themes/hugo-paper&amp;quot;&lt;/code&gt; → 同上（错）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;path = &amp;quot;hugo-paper&amp;quot;&lt;/code&gt; → ✅ Hugo 按短名从 themesDir 找，识别为 module&lt;/li&gt;
&lt;li&gt;实际成功的配置：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;[[module.imports]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt; path = &lt;span style="color:#f1fa8c"&gt;&amp;#34;sdttttt-paper&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3&lt;/span&gt;&lt;span&gt;[[module.imports]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4&lt;/span&gt;&lt;span&gt; path = &lt;span style="color:#f1fa8c"&gt;&amp;#34;hugo-paper&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建验证&lt;/strong&gt;：266 页 / 测试 23/23 / validate-posts 通过；footer / bg / 默认亮色 三个 override 都正确生效&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-4"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;go.mod 与 Hugo modules 体系的引入&lt;/strong&gt;是这次迁移的最大认知成本。AGENTS.md 已说明 go.mod 是 Hugo modules 入口、不是真的依赖 Go 工具链，但要小心 CI 上 Hugo 版本是否 &amp;gt;= 0.93（项目锁在 0.161.1，无问题）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;以后 sync 上游 hugo-paper 时&lt;/strong&gt;会面临两层 diff：父主题 &lt;code&gt;themes/hugo-paper/&lt;/code&gt; 直接 patch；子主题 &lt;code&gt;themes/sdttttt-paper/&lt;/code&gt; 的 override 文件按每个文件头注释的指引 reapply diff。建议在 sync 前先 &lt;code&gt;git diff themes/hugo-paper/ /tmp/hp-clone/&lt;/code&gt; 看清楚上游改动面再动手&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可以考虑&lt;/strong&gt;：在 sync 上游脚本（未来如果有）中自动检查 &lt;code&gt;themes/sdttttt-paper/&lt;/code&gt; 的每个 override 文件是否需要重同步——比如基于 &amp;ldquo;diff themes/hugo-paper/X vs /tmp/hp-clone/X，如果上游 X 有变且 sdttttt-paper 也存在同名 override，则报警&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后续可能简化&lt;/strong&gt;：如果 sync 上游的成本大于 override 的价值（override 变化频繁），可以考虑拆分成多个更小的子主题（一个子主题负责一个 override 关注点），但现在 4 个 override 不复杂，没必要拆&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录五续-审计与修正"&gt;维护记录（五续）—— 审计与修正&lt;/h2&gt;
&lt;p&gt;对四续的迁移做了事后审计，发现并修正了几个问题。&lt;/p&gt;</description></item><item><title>2026-10-04</title><link>https://sdttttt.online/changelog/2026-10-04/</link><pubDate>Sun, 04 Oct 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-10-04/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;为博客新增页面装饰背景：自动读取 &lt;code&gt;static/bg/&lt;/code&gt; 下所有图片，在视口左下用「周围透明、中心不透明」的径向渐变显示，多张图片轮流淡入淡出 ✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;layouts/baseof.html&lt;/code&gt; 覆盖主题的 baseof，使用 &lt;code&gt;readDir &amp;quot;static/bg&amp;quot;&lt;/code&gt; 自动发现图片（也可通过 &lt;code&gt;site.Params.bg&lt;/code&gt; 显式覆盖）；无需任何配置，新增/删除图片直接生效&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;assets/css/extended/bg.css&lt;/code&gt;，PaperMod 自动加载此目录。关键效果：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;position: fixed&lt;/code&gt; + &lt;code&gt;z-index: -1&lt;/code&gt; + 透明 body，确保背景永远在最底层、不干扰阅读&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mask-image: radial-gradient(circle at 60% 40%, #000 0%, #000 32%, rgba(0,0,0,.6) 55%, transparent 82%)&lt;/code&gt; 实现「周围透明中心不透明」的渐变&lt;/li&gt;
&lt;li&gt;24 秒一个循环、3 张图错开 8s 延迟轮流淡入淡出&lt;/li&gt;
&lt;li&gt;暗色模式降低亮度饱和度，移动端缩小尺寸，&lt;code&gt;prefers-reduced-motion&lt;/code&gt; 下停止动画只保留首张&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hugo --destination /tmp/hugo-bg-test&lt;/code&gt; 构建验证：首页、文章详情页、归档页均正确渲染 &lt;code&gt;.page-bg&lt;/code&gt; 容器，3 张 jpg 全部复制到 &lt;code&gt;public/bg/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;起初考虑把背景放在 &lt;code&gt;z-index: -1&lt;/code&gt; 但 PaperMod 在 body 上画了 &lt;code&gt;var(--theme)&lt;/code&gt; / &lt;code&gt;var(--code-bg)&lt;/code&gt;，会盖住子元素的负 z-index 背景。解决方案：将 body 背景搬到 &lt;code&gt;html&lt;/code&gt;，body 设为透明，让 &lt;code&gt;.page-bg&lt;/code&gt; 在 html 背景之上渲染 ⚠️ - 在 &lt;code&gt;assets/css/extended/bg.css&lt;/code&gt; 中以 &lt;code&gt;html { background-color: var(--theme); } body, body.list { background-color: transparent; }&lt;/code&gt; 覆盖；extended 样式在 core.css 之后 concat，优先级足够&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;若后续想支持点击/hover 暂停轮播，可在 baseof.html 加 &lt;code&gt;onmouseenter&lt;/code&gt; / &lt;code&gt;onmouseleave&lt;/code&gt; 控制 &lt;code&gt;.page-bg__img&lt;/code&gt; 的 &lt;code&gt;animation-play-state&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;暗色模式可考虑提供 &lt;code&gt;bg/&lt;/code&gt; 下的&amp;quot;暗色专用&amp;quot;图片（用 front matter 或子目录区分），通过 &lt;code&gt;site.Params.bgDark&lt;/code&gt; 控制&lt;/li&gt;
&lt;li&gt;若图片较多（&amp;gt;5），当前 5 个 &lt;code&gt;:nth-of-type&lt;/code&gt; 延迟档位不够，可改成 SCSS 生成&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录续"&gt;维护记录（续）&lt;/h2&gt;
&lt;h3 id="完成的工作-1"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;根据用户反馈调整背景行为 ✅
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;轮播 → 随机单图&lt;/strong&gt;：移除 &lt;code&gt;@keyframes page-bg-fade&lt;/code&gt; 与 &lt;code&gt;:nth-of-type&lt;/code&gt; 延迟，改为 inline script 每次刷新随机挑一张加 &lt;code&gt;.is-active&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;左下 → 左中&lt;/strong&gt;：容器从 &lt;code&gt;bottom: -3vh&lt;/code&gt; 改为 &lt;code&gt;top: 50%; transform: translateY(-50%)&lt;/code&gt;，垂直居中于视口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方形 → 圆形 + 渐变更强&lt;/strong&gt;：mask 从 &lt;code&gt;radial-gradient(circle at 60% 40%, ..., transparent 82%)&lt;/code&gt; 改为更陡的 &lt;code&gt;circle at 50% 50%&lt;/code&gt;（实心区从 32% 收缩到 25%，终点 55% → 82%），最终可见区域是圆形&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;配套调整：&lt;code&gt;html&lt;/code&gt; 初始带 &lt;code&gt;class=&amp;quot;no-js&amp;quot;&lt;/code&gt;；脚本启动后移除并改加 &lt;code&gt;js&lt;/code&gt;，让无 JS fallback（CSS &lt;code&gt;:not(.js)&lt;/code&gt; 选择器）只在禁用 JS 时生效&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-1"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;旧 keyframes / &lt;code&gt;animation-delay&lt;/code&gt; 残留检查：grep &lt;code&gt;page-bg-fade&lt;/code&gt; 在新 CSS 中匹配数 = 0，&lt;code&gt;animation-delay&lt;/code&gt; 已全部清除 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-1"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;若想每次刷新换图但保持 &amp;ldquo;会话内不重复&amp;rdquo;（同一浏览上下文内不重复同张），可改用 &lt;code&gt;sessionStorage&lt;/code&gt; 记上次 idx，rand 到相同则 +1&lt;/li&gt;
&lt;li&gt;圆形 mask 在极窄屏幕（&amp;lt; 360px）下 &lt;code&gt;min(190px, 50vw)&lt;/code&gt; 仍偏大，可再加 &lt;code&gt;@media (max-width: 480px)&lt;/code&gt; 把 &lt;code&gt;top: 50%&lt;/code&gt; 改成更靠上的位置避免被 main 内容遮挡&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录再续"&gt;维护记录（再续）&lt;/h2&gt;
&lt;h3 id="完成的工作-2"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修复背景图片被截断的 bug
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;根本原因&lt;/strong&gt;：三张源图都是纵向长方形（H/W = 1.30~1.37），但上一版容器是 &lt;code&gt;280x280&lt;/code&gt; 正方形 + &lt;code&gt;background-size: cover&lt;/code&gt;，等于把图片裁成方形（丢失顶部/底部共约 27% 高度），再被圆形 mask 切出来，所以用户看到的永远是原图的中段 53%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修复&lt;/strong&gt;：容器改为 &lt;code&gt;aspect-ratio: 5 / 7&lt;/code&gt;（比最瘦长的图 1 略高一点，1.4 vs 1.373）的纵向矩形 + &lt;code&gt;background-size: contain&lt;/code&gt;，三张图全部完整显示，最坏情况有 5% 的上下微小留白，但留白落在圆形 mask 透明带内完全不可见&lt;/li&gt;
&lt;li&gt;用 CSS 变量 &lt;code&gt;--page-bg-w&lt;/code&gt; / &lt;code&gt;--page-bg-ratio&lt;/code&gt; 统一管理尺寸，移动端断点只覆盖 &lt;code&gt;--page-bg-w&lt;/code&gt;，避免重复规则&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-2"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;调试时 &lt;code&gt;sips&lt;/code&gt; 输出的图片尺寸证实了纵向比例；awk 单行格式化因引号转义失败，改用 python3 拼字符串&lt;/li&gt;
&lt;li&gt;Hugo 的 fast render 模式在 CSS 改动后只 rebuild 用了该 CSS 的页面，86ms 完成&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-2"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果以后会增加横向图片（如 banner 截图），单一 &lt;code&gt;aspect-ratio: 5 / 7&lt;/code&gt; 会让横向图上下留白过多。可在 baseof.html 里读取每张图的尺寸（Hugo imageConfig），按宽高比输出内联 &lt;code&gt;style=&amp;quot;aspect-ratio: W/H&amp;quot;&lt;/code&gt; 覆盖默认比例&lt;/li&gt;
&lt;li&gt;如果之后想加图片懒加载（虽然只有 3 张图不必要），需把 background-image 重构为真实 &lt;code&gt;img&lt;/code&gt; 元素才能用 &lt;code&gt;loading=lazy&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录三续"&gt;维护记录（三续）&lt;/h2&gt;
&lt;h3 id="完成的工作-3"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;调整背景定位语义：视口 fixed 改为文档 absolute
&lt;ul&gt;
&lt;li&gt;需求：图片不要一直锁在视口左中部，改为只有滚动到文档最底部才看到&lt;/li&gt;
&lt;li&gt;改动：&lt;code&gt;.page-bg&lt;/code&gt; 容器 &lt;code&gt;position: fixed&lt;/code&gt; 改为 &lt;code&gt;position: absolute&lt;/code&gt; + &lt;code&gt;inset: 0&lt;/code&gt;（撑满整个文档高度）；&lt;code&gt;.page-bg__img&lt;/code&gt; 移除 &lt;code&gt;top: 50%; transform: translateY(-50%)&lt;/code&gt;，改为 &lt;code&gt;bottom: 0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;原理：absolute 元素在没有 &lt;code&gt;position: relative&lt;/code&gt; 的祖先时会解析到根 &lt;code&gt;html&lt;/code&gt; 节点（即整个文档），&lt;code&gt;bottom: 0&lt;/code&gt; 就等于文档底部；用户不滚到最下面图片就在视口外&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-3"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;短页面（如 tags / archives 单页）因为文档本身可能比视口还短，图片可能一加载就直接可见 —— 这其实是想要的行为，但如果以后想让所有页面都必须滚动后才看到，可加一段 JS：&lt;code&gt;window.scrollY === 0&lt;/code&gt; 时给 &lt;code&gt;.page-bg&lt;/code&gt; 加 &lt;code&gt;opacity: 0&lt;/code&gt;、滚动开始后移除&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录四续"&gt;维护记录（四续）&lt;/h2&gt;
&lt;h3 id="完成的工作-4"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修正背景定位语义为 fixed + JS 门控
&lt;ul&gt;
&lt;li&gt;上一版用 &lt;code&gt;position: absolute; bottom: 0&lt;/code&gt;，图片在首次渲染时被钉死在文档底部某个像素位置，文档长度变化或用户视角不同时不会跟随 —— 用户反馈“只会固定页面第一次渲染的位置”&lt;/li&gt;
&lt;li&gt;这一版恢复 &lt;code&gt;position: fixed&lt;/code&gt;，让图片始终钉在视口左下角；显示条件改为 JS 控制：scroll 到文档底部时才加 &lt;code&gt;html.at-bottom&lt;/code&gt; class，CSS 根据这个 class 才把 &lt;code&gt;.is-active&lt;/code&gt; 的图片 opacity 从 0 提到 0.92&lt;/li&gt;
&lt;li&gt;门控逻辑：&lt;code&gt;scrollTop + innerHeight &amp;gt;= scrollHeight - 8&lt;/code&gt; 判定为到底部；滚动/缩放/passive 监听；初始加 &lt;code&gt;setTimeout(50)&lt;/code&gt; 跑一次防止字体加载后布局变化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-3"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;上一轮验证误以为 JS 没生效，实际是 Hugo 把 inline script minify 了（&lt;code&gt;checkAtBottom&lt;/code&gt; → &lt;code&gt;n&lt;/code&gt;、&lt;code&gt;imgs&lt;/code&gt; → &lt;code&gt;t&lt;/code&gt;），grep 原名匹配为 0，但函数调用关系完整 ⚠️ - 下次验证用逻辑特征（&lt;code&gt;at-bottom&lt;/code&gt; class、&lt;code&gt;classList.toggle&lt;/code&gt;）而非变量名&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-4"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果想“滚到底出现，往上滚不消失（锁住显示）”的语义，把 CSS 改成只在 &lt;code&gt;at-bottom&lt;/code&gt; 由 false 变 true 那一次加 &lt;code&gt;is-revealed&lt;/code&gt; class，之后一直保持。代码量几乎不变&lt;/li&gt;
&lt;li&gt;当前 8px 阈值偏严格；如果发现用户“明明滚到底部却看不到”可能是设备pixel ratio 导致，可调为 &lt;code&gt;Math.max(8, innerHeight * 0.01)&lt;/code&gt; 更宽容&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录五续"&gt;维护记录（五续）&lt;/h2&gt;
&lt;h3 id="完成的工作-5"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修复背景渐变只覆盖四个角的 bug
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;根本原因&lt;/strong&gt;：旧 mask 用 &lt;code&gt;radial-gradient(circle at 50% 50%, ...)&lt;/code&gt;，CSS 默认 &lt;code&gt;closest-side&lt;/code&gt; 尺寸 —— mask 圆半径 = min(宽,高)/2 = 160px。矩形 5/7（320×448）的上下中点距圆心 224px &amp;gt; 160px，完全在 mask 外被强制透明 → “只有四个角被渐变、中间是硬切”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修复&lt;/strong&gt;：mask 改为 &lt;code&gt;radial-gradient(circle farthest-corner at 50% 50%, ...)&lt;/code&gt; —— mask 圆半径 = 角部距离 ≈ 275px，整张矩形都在 mask 范围内，矩形上下中点变成 9.4% 不透明、左右中点 34% 不透明、四个角 0%，全部柔和过渡&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同时&lt;/strong&gt;：中心实心区从 35% 半径（112px 硬核）收缩到 6% 半径（33px 小硬核），衰减曲线增加中间驻点让过渡更顺&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-4"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;几何验证：手算后角部距离 275px、矩形上下边中点 81.4%、左右边中点 58.1%、与渐变 stops 插值后与 CSS 渲染预期一致 ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-5"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;既然 mask 现在覆盖整张矩形，如果后续觉得“硬心 33px 仍有点硬”，可以试 &lt;code&gt;0% 4%&lt;/code&gt;（不要完全实心），让中心也有轻微渐变&lt;/li&gt;
&lt;li&gt;如果想让背景“雾化”更强（低对比），可以叠加 &lt;code&gt;backdrop-filter: blur(4px)&lt;/code&gt; 到 &lt;code&gt;.page-bg__img&lt;/code&gt;，让背景在 mask 透明区也能影响主体内容（需测试性能）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录六续"&gt;维护记录（六续）&lt;/h2&gt;
&lt;h3 id="完成的工作-6"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;上手动抠图：用 &lt;code&gt;@imgly/background-removal-node&lt;/code&gt; 处理 3 张图
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;环境准备&lt;/strong&gt;：&lt;code&gt;npm config set registry https://registry.npmmirror.com&lt;/code&gt; 切淘宝镜像，装包 18s；模型首次加载含下载 ~80MB ONNX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;处理速度&lt;/strong&gt;：3 张图总计 5 秒（模型已缓存后 1.5-1.9s/张）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;抠图质量&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;图 1 (800×1098)：主体 53.7%，背景 41.5% 完全透明，边缘羽化 4.8%&lt;/li&gt;
&lt;li&gt;图 2 (800×1046)：主体 37.1%，背景 60.4% 完全透明，边缘羽化 2.5%&lt;/li&gt;
&lt;li&gt;图 3 (700×909)：主体 34.1%，背景 61.8% 完全透明，边缘羽化 4.2%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;体积增量&lt;/strong&gt;：原 JPG 总 580KB → 抠图 PNG 总 663KB（+14%，+83KB）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;baseof.html 重构&lt;/strong&gt;：从“列出全部图片”改为“每个 basename 优先 PNG/WebP/SVG、忽略同名 JPG”，所以原 JPG 保留在磁盘作为回滚、不参加部署&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;mix-blend-mode 保留（现在 PNG 透明 + blend 双重保障）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-5"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;模板变量名 &lt;code&gt;replaceRE&lt;/code&gt; 中特殊字符需要转义，调试两次后 &lt;code&gt;\\.(jpg|...)$&lt;/code&gt; 才正确 ⚠️ - Hugo Go template 中 &lt;code&gt;\\&lt;/code&gt; 在字符串里才是 &lt;code&gt;\&lt;/code&gt; 转义&lt;/li&gt;
&lt;li&gt;第一版去重 key 错用了 &lt;code&gt;&amp;quot;tier|base&amp;quot;&lt;/code&gt;，导致同名 PNG/JPG 被认为不同 entry 同时进入 map。修正为仅用 &lt;code&gt;base&lt;/code&gt; 作 key，额外逻辑判断“PNG 是否替换现有 JPG” ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-6"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;原 JPG 现在还在 &lt;code&gt;static/bg/&lt;/code&gt; 里，如果不再需要回滚可手动删除（节省 580KB 部署体积）&lt;/li&gt;
&lt;li&gt;如果有图抠图质量不好（例如 5/7 中的图 1 主体比例较低，可能背景复杂），可用 sharp 对 PNG 后处理（边缘收缩、降噪、转为 indexed 颜色以减小体积）&lt;/li&gt;
&lt;li&gt;抠图脚本 &lt;code&gt;/tmp/bg-remove/remove-bg.js&lt;/code&gt; 可复制到 &lt;code&gt;scripts/&lt;/code&gt; 作为正式维护脚本，但项目主力是 Deno —— 可用 &lt;code&gt;deno task remove-bg&lt;/code&gt; 包装 Python 或 Node 调用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录七续"&gt;维护记录（七续）&lt;/h2&gt;
&lt;h3 id="完成的工作-7"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;放宽 CSS mask 渐变曲线
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原因&lt;/strong&gt;：抠图后主体已透明边缘干净，不再需要硬核中心 + 严进渐变&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改动&lt;/strong&gt;：从 7 stops (#000 6% / .78 22% / .5 45% / .22 68% / .06 85%) 放宽为 5 stops (#000 30% / .92 50% / .65 75% / .25 90%)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效果&lt;/strong&gt;：中心 50% 半径（直径 ~140px）完全实，整张图片大部分清晰可见，仅矩形外圈 ~25% 半径处开始柔和淡出，角部 0% 融入背景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-7"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果还觉得图片过渡太柔，可继续抬高 75% 、90% 的不透明度（如 .8 / .45）&lt;/li&gt;
&lt;li&gt;如果觉得边缘还是过锐（PNG 抠图边缘有时会有可见的轮廓），可以在 &lt;code&gt;.page-bg__img&lt;/code&gt; 上加 &lt;code&gt;filter: drop-shadow(0 0 6px rgba(0,0,0,0.15))&lt;/code&gt; 柔化&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录八续"&gt;维护记录（八续）&lt;/h2&gt;
&lt;h3 id="完成的工作-8"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;删除文章封面系统（commit 1278dd7，pushed to master）
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;删除文件&lt;/strong&gt;（6 个）：&lt;code&gt;scripts/gen-covers.ts&lt;/code&gt;（452 行）、&lt;code&gt;scripts/sync-covers.ts&lt;/code&gt;（63 行）、2 个对应测试、&lt;code&gt;layouts/_partials/cover.html&lt;/code&gt;、&lt;code&gt;.github/workflows/sync-covers.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改脚本&lt;/strong&gt;：从 &lt;code&gt;validate-posts&lt;/code&gt; 移除 &lt;code&gt;coverExists&lt;/code&gt; + cover 校验、从 &lt;code&gt;rename-posts&lt;/code&gt; 移除 cover 重命名逻辑、从 &lt;code&gt;git-commit-push&lt;/code&gt; 移除 &lt;code&gt;chore(covers)&lt;/code&gt; 分类&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改配置&lt;/strong&gt;：&lt;code&gt;deno.json&lt;/code&gt; 移除 &lt;code&gt;gen-covers&lt;/code&gt;/&lt;code&gt;gen-covers-dry&lt;/code&gt;/&lt;code&gt;sync-covers&lt;/code&gt;/&lt;code&gt;sync-covers-dry&lt;/code&gt; 4 个 task；&lt;code&gt;hugo.toml&lt;/code&gt; 移除 &lt;code&gt;[params.cover]&lt;/code&gt;；&lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt; 移除 &lt;code&gt;Generate covers and inject front matter&lt;/code&gt; 步骤&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改 lib&lt;/strong&gt;：移除 &lt;code&gt;paths.ts&lt;/code&gt; 的 &lt;code&gt;COVERS_DIR&lt;/code&gt; 常量、更新 &lt;code&gt;fs.ts&lt;/code&gt; 和 &lt;code&gt;frontmatter.ts&lt;/code&gt; 顶部的注释&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;批量修改 225 个 post&lt;/strong&gt; front matter：删除 &lt;code&gt;cover:&lt;/code&gt; 块（4 行：cover/image/alt/hidden）；处理了 1 个远程 URL 特殊 case（只有 cover + image 两行）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;总计&lt;/strong&gt;：245 files changed，+99/-2423&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-6"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修复了 3 个 pre-existing bug（都是 cover 删除任务“顺便”发现的）：
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;extractBody&lt;/code&gt; 返回正文会多一个前导换行（slice 后未去首 &lt;code&gt;\n&lt;/code&gt;）—— 修&lt;/li&gt;
&lt;li&gt;&lt;code&gt;normalizeDate&lt;/code&gt; 测试有错误的 &lt;code&gt;double-quoted&lt;/code&gt; 用例（parseFrontMatter 已 unquote）—— 删&lt;/li&gt;
&lt;li&gt;&lt;code&gt;expect.ts&lt;/code&gt; 缺 &lt;code&gt;toBeLessThanOrEqual&lt;/code&gt; —— 补&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;deno 不可用，用 &lt;code&gt;mise install deno@latest&lt;/code&gt; 装到 &lt;code&gt;~/.local/share/mise/installs/deno/2.9.7&lt;/code&gt;，加 &lt;code&gt;~/.deno/bin&lt;/code&gt; 到 PATH；&lt;code&gt;prettier@3.9.6&lt;/code&gt; 用 &lt;code&gt;deno install -g&lt;/code&gt; 装全局（AGENTS.md 要求）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-8"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;static/images/covers/&lt;/code&gt; 下 224 个 SVG 还在磁盘上、untracked 状态；如需彻底清理 3.1MB，运行 &lt;code&gt;rm -rf static/images/covers&lt;/code&gt; ✅ 已清理（commit 5ff5088）—— 原来这些 SVG 是 tracked 的（从仓库历史一直有），删除产生了 224 个 &lt;code&gt;D:&lt;/code&gt; 状态，需 commit + push 才彻底从 HEAD 中拿走&lt;/li&gt;
&lt;li&gt;225 个 post 里以前引用的 &lt;code&gt;aliases: [&amp;quot;/posts/legacy-name/&amp;quot;]&lt;/code&gt; 现在保留 —— 这些 alias 跳转仍然有效（除非本身就是错位的别名），未来若需完全删除可在 &lt;code&gt;validate-posts&lt;/code&gt; 里加一个“alias 对应的旧路径未被引用过则报错”检查&lt;/li&gt;
&lt;li&gt;回滚：tag &lt;code&gt;before-remove-cover&lt;/code&gt; 还在指向 0d49a15（push 前创建的）；如需完全回滚 &lt;code&gt;git reset --hard before-remove-cover &amp;amp;&amp;amp; git push --force&lt;/code&gt;——但现在增加了 commit 5ff5088，需用 &lt;code&gt;--force-with-lease&lt;/code&gt; 或先 push tag&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录九续"&gt;维护记录（九续）&lt;/h2&gt;
&lt;h3 id="完成的工作-9"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;将 PaperMod 从 git submodule 改为 vendored 目录&lt;/strong&gt;（commit f7772b7，pushed to master）
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原因&lt;/strong&gt;：用户要求“以后不再依赖上游，自己修改主题样式”—— submodule + update-papermod.yml 的自动拉取不符合这个诉求&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改动&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git submodule deinit -f themes/PaperMod&lt;/code&gt; 解除 submodule&lt;/li&gt;
&lt;li&gt;从 GitHub &lt;code&gt;adityatelange/hugo-PaperMod&lt;/code&gt; clone 最新代码到 &lt;code&gt;themes/PaperMod/&lt;/code&gt;（125 文件，880K，+6281 LOC）&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;themes/PaperMod/.git&lt;/code&gt;（避免嵌套 git repo）&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;.gitmodules&lt;/code&gt;、&lt;code&gt;.git/modules/themes/PaperMod/&lt;/code&gt;（PaperMod 内部 git 历史丢弃，节省 10M）&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;.github/workflows/update-papermod.yml&lt;/code&gt;（不再需要自动 submodule 更新）&lt;/li&gt;
&lt;li&gt;原有 override 文件不受影响：&lt;code&gt;layouts/baseof.html&lt;/code&gt; 和 &lt;code&gt;assets/css/extended/bg.css&lt;/code&gt; 仍由主仓库提供，Hugo 主仓库 wins 优先级不变&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后续使用&lt;/strong&gt;：需要改主题时，直接编辑 &lt;code&gt;themes/PaperMod/...&lt;/code&gt;，作为主仓库普通 commit 推送即可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-7"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git submodule deinit&lt;/code&gt; 会清空 working tree（themes/PaperMod/ 变空目录），需从上游 GitHub 重新 clone 一份；clone 后必须删除内部 &lt;code&gt;.git&lt;/code&gt; 否则主仓库可能误认为嵌套 git repo ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-9"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;主题代码现在所有改动走主仓库 commit，今后如需 cherry-pick 上游修复：&lt;code&gt;git fetch https://github.com/adityatelange/hugo-PaperMod.git&lt;/code&gt; 然后在主仓库中手动 patch 对应文件&lt;/li&gt;
&lt;li&gt;考虑加一个 &lt;code&gt;themes/PaperMod/CHANGELOG.md&lt;/code&gt;，记录对这个主题本地修改的历史（什么 commit 改了哪个文件、为什么改），方便后续追踪&lt;/li&gt;
&lt;li&gt;如将来修改较频繁，可以在 &lt;code&gt;themes/PaperMod/&lt;/code&gt; 上加 &lt;code&gt;.git-blame-ignore-revs&lt;/code&gt; 文件忽略上游原厂 commit&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录十续"&gt;维护记录（十续）&lt;/h2&gt;
&lt;h3 id="完成的工作-10"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主题更换：PaperMod → hugo-paper&lt;/strong&gt;（commit e6f0a2e + b5a3505，pushed to master）
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原因&lt;/strong&gt;：用户要求“换主题，换成 &lt;code&gt;nanxiaobei/hugo-paper&lt;/code&gt;”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除&lt;/strong&gt;：themes/PaperMod/（125 文件）、layouts/baseof.html、assets/css/extended/bg.css、assets/images/cover-default.svg&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vendor-in&lt;/strong&gt;：themes/hugo-paper/（86 文件，3.0M），与 PaperMod 同样作为普通目录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hugo.toml 清理&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;theme = &amp;ldquo;PaperMod&amp;rdquo; → theme = &amp;ldquo;hugo-paper&amp;rdquo;&lt;/li&gt;
&lt;li&gt;删除 PaperMod 特有的 [params.cover] / [params.homeInfoParams] / [[params.socialIcons]] / [params.assets] / [params.editPost] / [params.schema] 块&lt;/li&gt;
&lt;li&gt;menu 简化为 posts / claudelog / source / about（去掉 search / tags / archives，按用户要求）&lt;/li&gt;
&lt;li&gt;加 &lt;code&gt;mainSections = [&amp;quot;posts&amp;quot;]&lt;/code&gt; 避免 claudelog 泄露到首页&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;背景图代码移植&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;bg CSS 从 &lt;code&gt;assets/css/extended/bg.css&lt;/code&gt;（PaperMod 约定）拼接到 &lt;code&gt;assets/custom.css&lt;/code&gt;（hugo-paper 用户入口）&lt;/li&gt;
&lt;li&gt;去掉 PaperMod 特有的 html/body 背景调位逻辑（hugo-paper 用 &lt;code&gt;--bg&lt;/code&gt; CSS 变量）&lt;/li&gt;
&lt;li&gt;bg 逻辑从 baseof override 拆为独立 partial &lt;code&gt;layouts/partials/bg.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;layouts/_default/baseof.html&lt;/code&gt; 复制 hugo-paper 的 baseof，仅多了 &lt;code&gt;{{ partial &amp;quot;bg.html&amp;quot; . }}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可接受的丢失&lt;/strong&gt;（按用户要求）：
&lt;ul&gt;
&lt;li&gt;Tags / archives / search 页面不存在（hugo-paper 不带这些模板）&lt;/li&gt;
&lt;li&gt;首页副标题 “我，想去看海。” 丢失（hugo-paper 无 homeInfoParams 机制；需要重加可在 content/_index.md 里写）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;额外修复&lt;/strong&gt;：.prettierignore 增加 &lt;code&gt;themes/hugo-paper&lt;/code&gt; —— vendor 主题里的 &lt;code&gt;.prettierrc.mjs&lt;/code&gt; 引用了 &lt;code&gt;prettier-plugin-css-order&lt;/code&gt; / &lt;code&gt;prettier-plugin-organize-imports&lt;/code&gt; / &lt;code&gt;prettier-plugin-tailwindcss&lt;/code&gt; 三个未装的插件，导致 &lt;code&gt;deno task format-markdown-check&lt;/code&gt; 报错&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-8"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;vendor 主题自带的 &lt;code&gt;.prettierrc.mjs&lt;/code&gt; 会被项目级 prettier 扫描到，触发 “Cannot find package &amp;lsquo;prettier-plugin-css-order&amp;rsquo;” 报错。加 .prettierignore 排除即可（不能删除 vendor 文件，因为 vendor 完整复制是用户要求）⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-10"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;hugo-paper 不内置 &lt;code&gt;params.cover&lt;/code&gt;，背景图的图片列表靠 readDir “static/bg/” 自动发现。今后如需指定顺序 / 某些图片只在特定文章出现，可以在 &lt;code&gt;hugo.toml&lt;/code&gt; 里加 &lt;code&gt;[params.bg] = [&amp;quot;bg/foo.png&amp;quot;, ...]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;背景图的 bg partial 现在依然依赖 &lt;code&gt;layouts/_default/baseof.html&lt;/code&gt; override ——hugo-paper 上游升级需要同步 baseof.html，注释中已提醒&lt;/li&gt;
&lt;li&gt;如未来需要 tags / archives / search，可考虑：tags/archives 借助 hugo-paper 的 &lt;code&gt;list.html&lt;/code&gt; + &lt;code&gt;[taxonomies]&lt;/code&gt; 配置写一个 minimal partial；search 则需额外引入 fuse.js&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录十一续"&gt;维护记录（十一续）&lt;/h2&gt;
&lt;h3 id="完成的工作-11"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;默认主题强制为亮色&lt;/strong&gt;（commit 6ec98f5，pushed to master）
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原因&lt;/strong&gt;：用户要求 “让主题强制默认使用亮色”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改动&lt;/strong&gt;：override &lt;code&gt;layouts/partials/header.html&lt;/code&gt;（复则 vendor &lt;code&gt;themes/hugo-paper/layouts/partials/header.html&lt;/code&gt;，仅改 JS 部分）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原有逻辑&lt;/strong&gt;（跟随系统）：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;const&lt;/span&gt; darkScheme &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;window&lt;/span&gt;.matchMedia(&lt;span style="color:#f1fa8c"&gt;&amp;#34;(prefers-color-scheme: dark)&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;setDark(darkVal &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt; darkVal &lt;span style="color:#ff79c6"&gt;===&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; darkScheme.matches);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3&lt;/span&gt;&lt;span&gt;darkScheme.addEventListener(&lt;span style="color:#f1fa8c"&gt;&amp;#34;change&amp;#34;&lt;/span&gt;, (event) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4&lt;/span&gt;&lt;span&gt; setDark(event.matches);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5&lt;/span&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新逻辑&lt;/strong&gt;（默认 light，不跟随系统）：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;const&lt;/span&gt; darkVal &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; localStorage.getItem(&lt;span style="color:#f1fa8c"&gt;&amp;#34;dark&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;setDark(darkVal &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt; darkVal &lt;span style="color:#ff79c6"&gt;===&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;false&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// darkScheme.addEventListener 完全删掉
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;切换按钮 .btn-dark 保留&lt;/strong&gt;：用户仍可手动点击切到暗色，切到暗色后 localStorage 持久化，后续访问优先遵从用户选择&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-9"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;曾考虑在 head.html 加 &lt;code&gt;&amp;lt;meta name=&amp;quot;color-scheme&amp;quot; content=&amp;quot;light&amp;quot;&amp;gt;&lt;/code&gt; 锁定表单元素 / 滚动条为亮色。但这会与 JS 切换冲突（用户手动切暗色后表单仍亮）—— 舍弃。改取 vendor 默认（不锁），让浏览器 UI 跟随页面主题切换 ⚠️&lt;/li&gt;
&lt;li&gt;hugo-paper 没有 &lt;code&gt;params.defaultMode&lt;/code&gt; 这样的配置开关，只能 override header.html partial&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-11"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果以后觉得连切换按钮都不需要，加这一行在 &lt;code&gt;assets/custom.css&lt;/code&gt; 即可：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;.&lt;span style="color:#50fa7b"&gt;btn-dark&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;display&lt;/span&gt;: &lt;span style="color:#ff79c6"&gt;none&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;同步上游 hugo-paper 时记得也同步 &lt;code&gt;layouts/partials/header.html&lt;/code&gt;（override 文件依赖 vendor base 文件同步）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录十二续"&gt;维护记录（十二续）&lt;/h2&gt;
&lt;h3 id="完成的工作-12"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;站点 title 重命名 + README 全面刷新&lt;/strong&gt;（commit e956147，pushed to master）
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原因&lt;/strong&gt;：用户要求 “把 &amp;lsquo;Last Regrets&amp;rsquo; 改成 &amp;lsquo;海边&amp;rsquo;”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hugo.toml&lt;/strong&gt;：&lt;code&gt;title = &amp;quot;Last Regrets&amp;quot;&lt;/code&gt; → &lt;code&gt;title = &amp;quot;海边&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;README.md&lt;/strong&gt;：一并顺手刷新（从 &lt;code&gt;PaperMod submodule&lt;/code&gt; 时代以后从未更新，已多处过时）：
&lt;ul&gt;
&lt;li&gt;PaperMod → hugo-paper&lt;/li&gt;
&lt;li&gt;删去所有 cover 系统表述（sync-covers / sync-covers.yml / cover.image / 封面一致性）&lt;/li&gt;
&lt;li&gt;列出现在实际的 layout override：&lt;code&gt;layouts/partials/bg.html&lt;/code&gt; / &lt;code&gt;layouts/partials/header.html&lt;/code&gt; / &lt;code&gt;layouts/_default/baseof.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;增加 &lt;code&gt;assets/custom.css&lt;/code&gt;（hugo-paper 用户 CSS 入口）&lt;/li&gt;
&lt;li&gt;主体同步章节从 &lt;code&gt;git submodule update --remote themes/PaperMod&lt;/code&gt; 改为 &lt;code&gt;git clone upstream + diff 手动 patch&lt;/code&gt;，并提醒 &lt;code&gt;baseof.html&lt;/code&gt; / &lt;code&gt;header.html&lt;/code&gt; override 文件依赖上游同步&lt;/li&gt;
&lt;li&gt;首次克隆去掉 &lt;code&gt;--recursive&lt;/code&gt;（不再 submodule）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-10"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;README 里的 &lt;code&gt;deno task&lt;/code&gt; / &lt;code&gt;github workflows&lt;/code&gt; 列表都是历史版本，但用户主要要求是改 title，所以只做了中等改动：删 cover 相关、更新主题名。未动其他还未过时的部分（如本地预览 / 发布文章 / 命名约定）⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-12"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;README 里的 deno task 列表还可以加 &lt;code&gt;check-dead-links&lt;/code&gt;、&lt;code&gt;git-commit-push-dry&lt;/code&gt; 还未列入；如以后加新脚本记得同步 README&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="维护记录十三续"&gt;维护记录（十三续）&lt;/h2&gt;
&lt;h3 id="完成的工作-13"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文档架构刷新：AGENTS.md + README.md 重写 + CLAUDE.md 删除&lt;/strong&gt;（commit e59e4e6 + e74c464，pushed to master）
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原因&lt;/strong&gt;：用户要求““因为博客架构发生了很大变化 @AGENTS.md 和 @README.md 都更新一下，然后删除 @CLAUDE.md””&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AGENTS.md 重写&lt;/strong&gt;：从 PaperMod submodule 时代的旧规范进化为 hugo-paper vendor-in + 当前项目实际布局的新规范
&lt;ul&gt;
&lt;li&gt;项目结构：列出现有 override（bg.html / header.html / _default/baseof.html）、明确 assets/custom.css 是 hugo-paper 用户 CSS 入口、说明 static/bg/ 是背景图 cutouts 位置&lt;/li&gt;
&lt;li&gt;主题同步：&lt;code&gt;git submodule update --remote themes/PaperMod&lt;/code&gt; → &lt;code&gt;git clone upstream + diff 手动 patch&lt;/code&gt;，提醒 baseof.html / header.html override 文件依赖上游同步&lt;/li&gt;
&lt;li&gt;deno task 列表：删 sync-covers（cover 系统已删），补 check-dead-links / git-commit-push-dry&lt;/li&gt;
&lt;li&gt;编码规范：删 &lt;code&gt;npm:sharp@0.33.5&lt;/code&gt;（已不用）、删 cover.image front matter 描述、补 &lt;code&gt;static/bg/*.png cutouts&lt;/code&gt; 说明&lt;/li&gt;
&lt;li&gt;Agent 任务执行规范：增加 &lt;strong&gt;codemode 优先&lt;/strong&gt; 条款（适合脚本的任务用 codemode 写 JavaScript 一次性调用工具）&lt;/li&gt;
&lt;li&gt;新增 &lt;strong&gt;工具偏好&lt;/strong&gt; 节：rg 优先 / 不要自动 commit / push / PR（从 CLAUDE.md 折入）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;README.md 补充&lt;/strong&gt;：加 &lt;strong&gt;特性&lt;/strong&gt; 节（默认亮色 / 背景图 / CJK 友好 / claudelog）、布局详情补上 override 清单、deno task 加 check-dead-links&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLAUDE.md 删除&lt;/strong&gt;：以前是个 wrapper（5 行：指向 AGENTS.md + 两条 Claude Code 特有提示）。两条特有提示（rg 优先、不自动 push）已全部合并进 AGENTS.md 的“工具偏好”节，wrapper 失去了独立存在的意义&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-11"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CI race&lt;/strong&gt;：CLAUDE.md 删除 + commit message 被 CI bot 抢先 push 成 &lt;code&gt;f1ca216&lt;/code&gt;（commit author 是 github-actions[bot]，但 commit message 包含了我写的内容，估计是 deploy.yml 拉取 working tree 某些机制）。我本地实际是分两次 commit 才 push 上去：第一次只走 CLAUDE.md 删除（CI bot 推），第二次包含 AGENTS.md + README.md 全部改动。最终 rebase + push 同步 ⚠️&lt;/li&gt;
&lt;li&gt;这种 race 以后可以避免：一次只 commit 一个主题，且 commit 前最好 fetch origin master 确认是否已有同步&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-13"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AGENTS.md 现在合并了 CLAUDE.md 的所有内容，以后不会再有 wrapper 文件 但要时刻记得 CLAUDE.md 不存在，不要再创建该文件&lt;/li&gt;
&lt;li&gt;如果未来 Claude Code / Cursor / Copilot 等其他 Agent 工具也需要特定提示，可考虑：每 Agent 一个入口文件（如 .cursor/rules / copilot-instructions.md），但以 AGENTS.md 为唯一标准事实&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-09-21</title><link>https://sdttttt.online/changelog/2026-09-21/</link><pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-09-21/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;添加博客头像功能 ✅&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hugo.toml&lt;/code&gt;：添加 &lt;code&gt;avatar = &amp;quot;/avatar.jpg&amp;quot;&lt;/code&gt; 和 &lt;code&gt;name = &amp;quot;SDTTTTT&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;themes/sdttttt-paper/layouts/_default/baseof.html&lt;/code&gt;：增加本地路径（&lt;code&gt;/&lt;/code&gt; 开头）的 avatar 支持，通过 &lt;code&gt;absURL&lt;/code&gt; 转换&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/avatar.jpg&lt;/code&gt;：新增头像图片&lt;/li&gt;
&lt;li&gt;提交：&lt;code&gt;feat(avatar): 添加头像和作者名称&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;头像样式调整 ✅&lt;/p&gt;</description></item><item><title>2026-09-01</title><link>https://sdttttt.online/changelog/2026-09-01/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-09-01/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;同步本地仓库：&lt;code&gt;git fetch --all --prune&lt;/code&gt; + &lt;code&gt;git pull --ff-only&lt;/code&gt;，从 &lt;code&gt;bb91378&lt;/code&gt; 推进到 &lt;code&gt;5d8fbc3&lt;/code&gt;，新增 2 个提交（&lt;code&gt;80f7456 docs: 新增维护日志 2026-08-24 与文章《期望》&lt;/code&gt;、&lt;code&gt;5d8fbc3 chore: auto-fix content&lt;/code&gt;） ✅&lt;/li&gt;
&lt;li&gt;检查子模块 &lt;code&gt;themes/PaperMod&lt;/code&gt;：当前 commit &lt;code&gt;d376885&lt;/code&gt;，与远端登记一致，无需更新&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;scripts/dist/&lt;/code&gt; 目录在 master 上含 22 个 &lt;code&gt;.js&lt;/code&gt; 文件（约 2000+ 行），疑似 &lt;code&gt;deno bundle&lt;/code&gt; 产物被一并提交 ⚠️ - 与仓库规范「&lt;code&gt;scripts/&lt;/code&gt; 只放 &lt;code&gt;.ts&lt;/code&gt; 源文件」冲突，且 &lt;code&gt;.gitignore&lt;/code&gt; 未屏蔽；暂未处理，等用户决策&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;code&gt;.gitignore&lt;/code&gt; 加上 &lt;code&gt;scripts/dist/&lt;/code&gt;，并 &lt;code&gt;git rm -r --cached scripts/dist/&lt;/code&gt; 清理已追踪的产物&lt;/li&gt;
&lt;li&gt;考虑 &lt;code&gt;scripts/dist/&lt;/code&gt; 是否为某个 CI 步骤的有意产物（如 &lt;code&gt;deno bundle&lt;/code&gt; 后给 GitHub Actions 用）；若是，应改为产到 &lt;code&gt;tmp/&lt;/code&gt; 或 artifact 上传，不进版本控制&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="维护记录追加清理-scriptsdist"&gt;维护记录（追加：清理 scripts/dist/）&lt;/h2&gt;
&lt;h3 id="完成的工作-1"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;经调查确认 &lt;code&gt;scripts/dist/&lt;/code&gt; 不是 Deno 产物：所有文件 shebang 是 &lt;code&gt;#!/usr/bin/env node&lt;/code&gt;，注释里教 &lt;code&gt;node scripts/dist/xxx.js&lt;/code&gt; 跑，是&lt;strong&gt;早期 Node.js 时代的旧快照&lt;/strong&gt;；整个仓库（&lt;code&gt;.github/&lt;/code&gt;、&lt;code&gt;scripts/&lt;/code&gt;、&lt;code&gt;deno.json&lt;/code&gt;、&lt;code&gt;AGENTS.md&lt;/code&gt;、&lt;code&gt;README.md&lt;/code&gt;）零引用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts/dist/&lt;/code&gt; 内容陈旧：缺 &lt;code&gt;lib/fs.js&lt;/code&gt;、&lt;code&gt;lib/paths.js&lt;/code&gt;（2026-08-27 重构才加），缺 &lt;code&gt;format-markdown.test.js&lt;/code&gt;、&lt;code&gt;git-commit-push.test.js&lt;/code&gt;、&lt;code&gt;optimize-images.test.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;.gitignore&lt;/code&gt; 末尾追加 &lt;code&gt;scripts/dist/&lt;/code&gt;（附说明注释），防止 deploy.yml 的 &lt;code&gt;git add -A&lt;/code&gt; 未来再次带入 ✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git rm -r scripts/dist/&lt;/code&gt; 一次性删除 21 个 &lt;code&gt;.js&lt;/code&gt;（8 根 + 3 lib + 10 tests；非之前估算的 22 个），工作树与索引干净 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="决策"&gt;决策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;只删追踪 + 加 ignore，不动历史&lt;/strong&gt;：&lt;code&gt;git filter-repo&lt;/code&gt; / &lt;code&gt;git filter-branch&lt;/code&gt; 改写历史需要额外确认（force push + 重写已发布 commit），且 &lt;code&gt;git rm&lt;/code&gt; 已能让远端立即干净，没必要扰动共享历史&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commit message 用 &lt;code&gt;chore(scripts): remove dead scripts/dist/&lt;/code&gt;&lt;/strong&gt;：明确分类，避免 &lt;code&gt;git-commit-push.ts&lt;/code&gt; 自动分类把它误归到 &lt;code&gt;chore(rename)&lt;/code&gt;/&lt;code&gt;chore(format)&lt;/code&gt; 之类的奇怪类别&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-1"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;deploy.yml 的 &lt;code&gt;git-commit-push.ts&lt;/code&gt; 是 &lt;code&gt;git add -A&lt;/code&gt;，理论上能绕过 &lt;code&gt;.gitignore&lt;/code&gt; 引入意外产物；当前已用 ignore 兜底，可加一个 deploy 步骤在 commit 前 &lt;code&gt;git status --porcelain&lt;/code&gt; + 白名单校验，只允许 &lt;code&gt;content/&lt;/code&gt;、&lt;code&gt;static/&lt;/code&gt;、&lt;code&gt;scripts/**/*.{ts,json}&lt;/code&gt;、&lt;code&gt;themes/PaperMod&lt;/code&gt;、&lt;code&gt;deno.*&lt;/code&gt;、&lt;code&gt;hugo.toml&lt;/code&gt;、&lt;code&gt;.github/workflows/*&lt;/code&gt; 等路径进入 commit&lt;/li&gt;
&lt;li&gt;如未来真需要「发布到 Node.js」的脚本产物（如 npm 包），应改用 &lt;code&gt;deno compile&lt;/code&gt; 直接产出二进制，或在 release workflow 里产到 artifact，不进 master&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-29</title><link>https://sdttttt.online/changelog/2026-08-29/</link><pubDate>Sat, 29 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-08-29/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.gitmodules&lt;/code&gt; 移除孤儿条目 &lt;code&gt;[submodule &amp;quot;themes/paper&amp;quot;]&lt;/code&gt;（指向已不存在的 &lt;code&gt;themes/paper&lt;/code&gt;，源自 2026-03-17 的 &lt;code&gt;6d6051b Switch theme to PaperMod&lt;/code&gt; 迁移）；本地 &lt;code&gt;.git/config&lt;/code&gt; 不含此条目，gitlink 也已不存在，删除安全&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;.prettierignore&lt;/code&gt; 屏蔽 &lt;code&gt;themes/PaperMod&lt;/code&gt;（含 &lt;code&gt;node_modules&lt;/code&gt; / &lt;code&gt;.tools&lt;/code&gt; / &lt;code&gt;.npm-cache&lt;/code&gt; / &lt;code&gt;public&lt;/code&gt; 作为防御）；修掉 &lt;code&gt;format-markdown-check&lt;/code&gt; 永远报 PaperMod 内 &lt;code&gt;PULL_REQUEST_TEMPLATE.md&lt;/code&gt; / &lt;code&gt;README.md&lt;/code&gt; 的误报&lt;/li&gt;
&lt;li&gt;精简 &lt;code&gt;CLAUDE.md&lt;/code&gt;：从 134 行压缩为 6 行指针，统一指向 &lt;code&gt;AGENTS.md&lt;/code&gt;，仅保留 Claude Code 特有提示（优先用 &lt;code&gt;rg&lt;/code&gt;、对外动作需确认）&lt;/li&gt;
&lt;li&gt;清理本地残留 &lt;code&gt;node_modules/&lt;/code&gt;（49M）与 &lt;code&gt;.npm-cache/&lt;/code&gt;（3.4M）—— 均为 gitignored，不影响提交&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;本机 &lt;code&gt;deno&lt;/code&gt; 不在 PATH，但 &lt;code&gt;.tools/deno/bin/deno&lt;/code&gt; 有 2.9.5 二进制 ⚠️ - 临时 &lt;code&gt;export PATH=$PWD/.tools/deno/bin:$PATH&lt;/code&gt; 后跑 &lt;code&gt;validate-posts&lt;/code&gt; / &lt;code&gt;test&lt;/code&gt; / &lt;code&gt;sync-covers-dry&lt;/code&gt; / &lt;code&gt;format-markdown-check&lt;/code&gt;，CI 走 &lt;code&gt;denoland/setup-deno@v2&lt;/code&gt; 无此问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AGENTS.md 增加一段「deno 本地安装提示」：如果 &lt;code&gt;deno&lt;/code&gt; 命令未找到，仓库根目录 &lt;code&gt;.tools/deno/bin/deno&lt;/code&gt; 是可用回退（&lt;code&gt;export PATH=$PWD/.tools/deno/bin:$PATH&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="维护记录追加ci-工作流加固"&gt;维护记录（追加：CI 工作流加固）&lt;/h2&gt;
&lt;h3 id="完成的工作-1"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;评估整套工作流后落地 4 项高优先级修复 ✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deploy.yml&lt;/code&gt;：Hugo 版本从 &lt;code&gt;latest&lt;/code&gt; 固定为 &lt;code&gt;0.161.1&lt;/code&gt;（与本地已知可用版本一致）；新增 &lt;code&gt;deno task validate-posts&lt;/code&gt; 发布前门槛（放在 gen-covers 之后、构建之前）；新增 &lt;code&gt;concurrency: pages + cancel-in-progress&lt;/code&gt;，防止旧构建后完成覆盖新部署；bot 守卫从「跳过一切 bot 触发」改为「仅跳过 bot 的 push 事件」，放行 workflow_dispatch&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update-papermod.yml&lt;/code&gt;：推送前用同一固定版本 Hugo 冒烟构建，上游 breaking 改动直接失败在本工作流、不落 master；推完后 &lt;code&gt;gh workflow run deploy.yml&lt;/code&gt; 显式触发部署（GITHUB_TOKEN 的 push 不触发任何 workflow，之前主题更新要等下一次人工 push 才上线）；新增 &lt;code&gt;actions: write&lt;/code&gt; 权限&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sync-covers.yml&lt;/code&gt;：记录同步前 HEAD，仅在实际推送了清理提交时 dispatch 部署；新增 &lt;code&gt;actions: write&lt;/code&gt; 权限&lt;/li&gt;
&lt;li&gt;过程中发现并纠正一处自身笔误：守卫条件初版写反，会使 bot push 放行、dispatch 反被拦；已修正为 &lt;code&gt;github.event_name == 'workflow_dispatch' || github.actor != 'github-actions[bot]'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;验证：三份 YAML 解析通过；&lt;code&gt;deno task test&lt;/code&gt;（45 通过）、&lt;code&gt;validate-posts&lt;/code&gt;、&lt;code&gt;format-markdown-check&lt;/code&gt; 全绿；本地 &lt;code&gt;hugo --minify&lt;/code&gt;（0.161.1）构建成功&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-1"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;改动仅落在工作树，未提交/推送（推送属对外可见操作，待用户确认后执行）⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-1"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sync-covers.yml&lt;/code&gt; 的 checkout 未设 &lt;code&gt;fetch-depth: 0&lt;/code&gt;，&lt;code&gt;git-commit-push&lt;/code&gt; 内 &lt;code&gt;pull --rebase&lt;/code&gt; 在撞并发推送时可能因浅克隆失败（既有行为，deploy.yml 已设 0，可对齐）&lt;/li&gt;
&lt;li&gt;评估报告中「顺手可做」清单仍未动：prettier 版本统一进 &lt;code&gt;deno.json&lt;/code&gt;、check-dead-links 结果可见化（现在 &lt;code&gt;\|\| true&lt;/code&gt; 吞掉失败）、pre-push hook 聚合检查、&lt;code&gt;git-commit-push.ts&lt;/code&gt; 里 &lt;code&gt;git show &amp;quot;:${path}&amp;quot;&lt;/code&gt; 参数化、&lt;code&gt;private&lt;/code&gt; 字段实现消费或移除校验、bot 提交刷新 &lt;code&gt;ShowLastMod&lt;/code&gt; 显示&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-27</title><link>https://sdttttt.online/changelog/2026-08-27/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-08-27/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;移除 &lt;code&gt;hugo.toml&lt;/code&gt; 中未使用的 &lt;code&gt;series&lt;/code&gt; taxonomy（从未有任何一篇文章使用）&lt;/li&gt;
&lt;li&gt;重写 &lt;code&gt;README.md&lt;/code&gt;：补全 &lt;code&gt;scripts/&lt;/code&gt; 目录结构、&lt;code&gt;deno task&lt;/code&gt; 维护命令、精确的 CI 工作流表（删除已不存在的 &lt;code&gt;format-markdown.yml&lt;/code&gt;、新增 &lt;code&gt;check-dead-links.yml&lt;/code&gt; / &lt;code&gt;test-scripts.yml&lt;/code&gt; / &lt;code&gt;update-papermod.yml&lt;/code&gt;）、命名约定、Agent 维护日志章节&lt;/li&gt;
&lt;li&gt;Hugo &lt;code&gt;--minify&lt;/code&gt; 构建通过（258 页）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deno task validate-posts&lt;/code&gt; ✅&lt;/li&gt;
&lt;li&gt;prettier check ✅（仅警告 submodule 内文件，与本次改动无关）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="决策"&gt;决策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不更新 PaperMod 子模块&lt;/strong&gt;：&lt;code&gt;git submodule status&lt;/code&gt; 显示 &lt;code&gt;d376885&lt;/code&gt; 已与 upstream HEAD 一致，之前认为落后 1 commit 是看错了历史顺序&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留 README 中&amp;quot;Agent 维护日志&amp;quot;章节&lt;/strong&gt;：补全 README 与 &lt;code&gt;AGENTS.md&lt;/code&gt;（已存在的 93 行贡献指南）不冲突，README 是面向访客的高层概览，AGENTS.md 是面向 Agent 的详细规范&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;macOS sandbox 拒绝往 &lt;code&gt;/Users/kms/.deno/bin&lt;/code&gt; 写 prettier 安装 ⚠️ - 改用 &lt;code&gt;--root &amp;quot;$PWD/.tools/deno&amp;quot;&lt;/code&gt; 本地安装到 &lt;code&gt;.tools/deno/bin/prettier&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;macOS sandbox 拒绝 &lt;code&gt;/Users/kms/Library/Caches/deno/npm/&lt;/code&gt; 写 npm 包缓存 ⚠️ - 用 &lt;code&gt;DENO_DIR=&amp;quot;$PWD/.tools/deno-cache&amp;quot;&lt;/code&gt; 走本地缓存&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;prettier &lt;code&gt;--root&lt;/code&gt; 安装到 &lt;code&gt;.tools/&lt;/code&gt; 的写法可以写进 AGENTS.md 或 deno.json 注释，方便后续 sandbox 环境复用&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="第二轮改动脚本维护性优化"&gt;第二轮改动（脚本维护性优化）&lt;/h2&gt;
&lt;p&gt;按昨日梳理的清单做了一批脚本重构，全部通过 &lt;code&gt;deno task test&lt;/code&gt;（45 passed）。&lt;/p&gt;</description></item><item><title>2026-08-26</title><link>https://sdttttt.online/changelog/2026-08-26/</link><pubDate>Wed, 26 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-08-26/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;创建新文章「回顾过去看过的番」✅&lt;/li&gt;
&lt;li&gt;生成封面 SVG（sakura 配色）✅&lt;/li&gt;
&lt;li&gt;推送至 master ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Deno 环境不可用，无法使用 gen-covers 脚本 ⚠️ - 改用 Python 手动生成封面 SVG&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;恢复 Deno 环境以便使用维护脚本&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-24</title><link>https://sdttttt.online/changelog/2026-08-24/</link><pubDate>Mon, 24 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-08-24/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;同步远程 &lt;code&gt;origin/master&lt;/code&gt;:本地分支落后 38 个 commit,&lt;code&gt;git pull --ff-only&lt;/code&gt; 快进到 &lt;code&gt;0a651bd&lt;/code&gt;(最新 commit: &lt;code&gt;chore: auto-fix content&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;同步过程中 PaperMod 子模块一度处于&amp;quot;本地检出 &lt;code&gt;154d006&lt;/code&gt;、父 gitlink 仍指向 &lt;code&gt;d376885&lt;/code&gt;&amp;ldquo;的状态,&lt;code&gt;git submodule update --remote themes/PaperMod&lt;/code&gt; 后回到与父一致(&lt;code&gt;d376885&lt;/code&gt;,v8.0-139-gd376885)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts/dist/&lt;/code&gt; 出现未跟踪的 7 个 &lt;code&gt;.js&lt;/code&gt; + 1 个 &lt;code&gt;lib/&lt;/code&gt; 子目录(应是 deno task 本地编译产物),未自动处理,留给用户决定&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git status&lt;/code&gt; 首次显示 &lt;code&gt;modified: themes/PaperMod (new commits)&lt;/code&gt; 容易误导 ⚠️ — 实际上工作树指向的 &lt;code&gt;154d006&lt;/code&gt; 是 &lt;code&gt;d376885&lt;/code&gt; 的父 commit,git 在子模块 diff 上不会区分新旧方向,只是机械显示 parent-track ↔ working-tree 差异;遇此情况应直接看 &lt;code&gt;git submodule status&lt;/code&gt; 和子模块内 &lt;code&gt;git log&lt;/code&gt; 判断&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git submodule update --remote&lt;/code&gt; 在本场景下表现为&amp;quot;撤销本地手动切出的旧 commit&amp;rdquo;,而不是真正的&amp;quot;升级到更新&amp;quot;,因为 &lt;code&gt;.gitmodules&lt;/code&gt; 把 PaperMod 默认分支 tip 钉到了 &lt;code&gt;d376885&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;考虑把 &lt;code&gt;scripts/dist/&lt;/code&gt; 加进 &lt;code&gt;.gitignore&lt;/code&gt;(deno 编译产物,7 个文件 ~38KB),或者在 &lt;code&gt;deno.json&lt;/code&gt; 里把 &lt;code&gt;dist/&lt;/code&gt; 路径改掉避免误生成&lt;/li&gt;
&lt;li&gt;想真正&amp;quot;升级 PaperMod&amp;quot;时,需要先在子模块内 &lt;code&gt;git fetch&lt;/code&gt; + 找到上游新 commit,然后手动更新父 gitlink 并提交(不是 &lt;code&gt;git submodule update --remote&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="维护记录-1"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作-1"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;回滚多语言支持:&lt;code&gt;git revert --no-edit 0a651bd 14732b2&lt;/code&gt;(newest first),生成 2 个反向 commit &lt;code&gt;b821ed4&lt;/code&gt; / &lt;code&gt;e25a7cc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删除全部 222 个 &lt;code&gt;content/posts/*.zh-tw.md&lt;/code&gt;、16 个 &lt;code&gt;content/claudelog/*.zh-tw.md&lt;/code&gt;、&lt;code&gt;content/about.zh-tw.md&lt;/code&gt; / &lt;code&gt;archives.zh-tw.md&lt;/code&gt; / &lt;code&gt;search.zh-tw.md&lt;/code&gt; / &lt;code&gt;posts/_index.zh-tw.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;i18n/zh-tw.yaml&lt;/code&gt;(从 PaperMod 主题复制的 UI 文案)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hugo.toml&lt;/code&gt; 还原到 &lt;code&gt;[languages]&lt;/code&gt; 块之前的状态:只剩 &lt;code&gt;locale = &amp;quot;zh&amp;quot;&lt;/code&gt; + &lt;code&gt;DefaultContentLanguage = &amp;quot;zh&amp;quot;&lt;/code&gt;,中文菜单名(&lt;code&gt;文章 / 维护日志 / 源代码 / 归档 / 搜索 / 标签 / 关于&lt;/code&gt;)保留&lt;/li&gt;
&lt;li&gt;当前 &lt;code&gt;master&lt;/code&gt; 分支比 &lt;code&gt;origin/master&lt;/code&gt; 领先 2 个 commit,等用户确认后再 push&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="决策"&gt;决策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;选 &lt;code&gt;git revert&lt;/code&gt; 而不是 &lt;code&gt;git reset --hard&lt;/code&gt; + force push:前者保留远程 history 不破坏引用,后者会改写已发布 commit(&lt;code&gt;14732b2&lt;/code&gt; / &lt;code&gt;0a651bd&lt;/code&gt; 都在 origin/master 上),按 CLAUDE.md 属破坏性+对外可见操作需要额外确认&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-1"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果以后又想开 i18n,所有数据已经留在 commit &lt;code&gt;14732b2&lt;/code&gt; 里,可以直接 cherry-pick 或者 revert 这两个 revert commit 就能恢复&lt;/li&gt;
&lt;li&gt;&lt;code&gt;format-markdown.yml&lt;/code&gt; 推送时会自动跑 prettier,刚才新建的 claudelog 日志也会被自动格式化&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-22</title><link>https://sdttttt.online/changelog/2026-08-22/</link><pubDate>Sat, 22 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-08-22/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;删除 &lt;code&gt;layouts/partials/footer.html&lt;/code&gt;(1 行 wrapper)&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;layouts/partials/custom_footer.html&lt;/code&gt;(156 行,PaperMod footer 的本地 fork)&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;hugo.toml&lt;/code&gt; 中 &lt;code&gt;[params.cloudflareAnalytics]&lt;/code&gt; 配置块&lt;/li&gt;
&lt;li&gt;Hugo &lt;code&gt;--minify&lt;/code&gt; 构建通过,确认 Cloudflare Web Analytics 注入消失(&lt;code&gt;cf-beacon&lt;/code&gt; 匹配 0 次),PaperMod 自带 footer 功能保留(&lt;code&gt;top-link&lt;/code&gt; / &lt;code&gt;scroll-to-top&lt;/code&gt; JS / 版权 / Powered by)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="决策"&gt;决策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;移除 Cloudflare 站点统计:&lt;code&gt;custom_footer.html&lt;/code&gt; 相对于 PaperMod 原版 footer 唯一真正的差异就是 Cloudflare beacon 注入;既然没用价值,把 footer 部分整体还原回 PaperMod 默认,避免 PaperMod 升级 footer 时本地 fork 不同步的问题(&lt;code&gt;2026-08-01&lt;/code&gt; 已记录此风险)&lt;/li&gt;
&lt;li&gt;保留 &lt;code&gt;layouts/_partials/cover.html&lt;/code&gt;:该 override 解决了 PaperMod &lt;code&gt;resources.ByType &amp;quot;image&amp;quot;&lt;/code&gt; 不识别 SVG 封面导致 404 的问题,不能删&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果以后又想加自定义站点统计,可以直接在 Hugo 配置启用内置埋点,或 inline 在 &lt;code&gt;layouts/partials/extend_footer.html&lt;/code&gt;(PaperMod 已留 hook),不需要再 fork 整个 footer&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="维护记录-1"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作-1"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修正 &lt;code&gt;CLAUDE.md&lt;/code&gt; 中 prettier 安装命令的事实错误:实际是 &lt;code&gt;deno install -g -A npm:prettier@3.9.6&lt;/code&gt; 落到 &lt;code&gt;~/.deno/bin/&lt;/code&gt;,不需要 &lt;code&gt;setup-node&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修正 &lt;code&gt;scripts/format-markdown.ts&lt;/code&gt; 顶部 docstring 的过时描述&lt;/li&gt;
&lt;li&gt;给 &lt;code&gt;check-dead-links.yml&lt;/code&gt; / &lt;code&gt;test-scripts.yml&lt;/code&gt; / &lt;code&gt;validate-posts.yml&lt;/code&gt; 三个 push-trigger workflow 加上 &lt;code&gt;if: github.actor != 'github-actions[bot]'&lt;/code&gt; 守卫,跟 &lt;code&gt;deploy.yml&lt;/code&gt; / &lt;code&gt;sync-covers.yml&lt;/code&gt; / &lt;code&gt;update-papermod.yml&lt;/code&gt; 一致;节省 bot 推送后再次触发 CI 的时间&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;assets/images/covers/covers/&lt;/code&gt; 死目录(220 个 SVG,5.4MB):该批封面是 &lt;code&gt;2026-07-21&lt;/code&gt; 第一次批量生成时落在 &lt;code&gt;assets/images/covers/&lt;/code&gt; 的;后来 &lt;code&gt;gen-covers.ts&lt;/code&gt; 的 &lt;code&gt;COVERS_DIR&lt;/code&gt; 改成 &lt;code&gt;static/images/covers/&lt;/code&gt;,但旧的没清;grep 确认没有任何 &lt;code&gt;.ts&lt;/code&gt; / &lt;code&gt;.md&lt;/code&gt; / &lt;code&gt;.yml&lt;/code&gt; / &lt;code&gt;.toml&lt;/code&gt; 引用该路径&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-1"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;第三方 action 仍用浮动 tag(&lt;code&gt;@v4&lt;/code&gt;/&lt;code&gt;@v3&lt;/code&gt;/&lt;code&gt;@v2&lt;/code&gt;);可考虑钉 SHA 防供应链投毒&lt;/li&gt;
&lt;li&gt;&lt;code&gt;format-markdown.ts&lt;/code&gt;(27 行)/ &lt;code&gt;optimize-images.ts&lt;/code&gt;(182 行) 仍无单测&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="维护记录-2"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作-2"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;删除全部 31 篇文章中的 &lt;code&gt;categories:&lt;/code&gt; 字段(都是 inline &lt;code&gt;categories: [&amp;quot;X&amp;quot;]&lt;/code&gt; 格式)— 决定只用 tag 做分类&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hugo.toml&lt;/code&gt; 的 &lt;code&gt;[taxonomies]&lt;/code&gt; 中删掉 &lt;code&gt;category = &amp;quot;categories&amp;quot;&lt;/code&gt; 行;现在只剩 &lt;code&gt;tag = &amp;quot;tags&amp;quot;&lt;/code&gt; 和 &lt;code&gt;series = &amp;quot;series&amp;quot;&lt;/code&gt;(series 也无人使用,可后续考虑一并删除)&lt;/li&gt;
&lt;li&gt;Hugo &lt;code&gt;--minify&lt;/code&gt; 构建通过(221 篇,466 ms)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="决策-1"&gt;决策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类统一用 tag:之前 categories 和 tags 语义重叠(categories 仅 3 种且只覆盖 31 篇;tag 是文章主要分类手段);统一后所有文章都通过 tag 分组,&lt;code&gt;/tags/&lt;/code&gt; 页面真正反映全部分类&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-2"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;series = &amp;quot;series&amp;quot;&lt;/code&gt; 在 &lt;code&gt;[taxonomies]&lt;/code&gt; 中也是死配置(无人用 series:),可顺手删&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="维护记录-3"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作-3"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;把 14 篇文章中的 &lt;code&gt;软路由&lt;/code&gt; tag 改为 &lt;code&gt;硬件&lt;/code&gt;(语义上 &lt;code&gt;软路由&lt;/code&gt; 是软件配置路由器,&lt;code&gt;硬件&lt;/code&gt; 是更广义的物理设备类目;后续硬件折腾文也归这里)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-3"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;tag 表仍偏多(8 个),继续精简可考虑:把 &lt;code&gt;日志&lt;/code&gt;(97 篇,大杂烩)拆成 &lt;code&gt;杂记&lt;/code&gt; + 并入 &lt;code&gt;开发&lt;/code&gt;/&lt;code&gt;思考&lt;/code&gt;;删除 &lt;code&gt;学习&lt;/code&gt;(已基本退役,2021 起再没用过);删除 &lt;code&gt;杂谈&lt;/code&gt;(3 篇,可并入 &lt;code&gt;杂记&lt;/code&gt;/&lt;code&gt;思考&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="维护记录-4"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作-4"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;把 50 篇文章的 &lt;code&gt;开发&lt;/code&gt; tag 改为 &lt;code&gt;学习&lt;/code&gt;(包括 2 篇原本就有 &lt;code&gt;学习&lt;/code&gt; 的:Stack by Rust / Tree by Rust,dedup 后剩 1 个 &lt;code&gt;学习&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;顺手修了 &lt;code&gt;20200406-Rails-ENV-u0k.md&lt;/code&gt; 的 &lt;code&gt;tag:&lt;/code&gt; 单数 typo(之前是死配置,Hugo 不会识别),改为 &lt;code&gt;tags: [&amp;quot;学习&amp;quot;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Hugo &lt;code&gt;--minify&lt;/code&gt; 通过(370 ms,221 篇)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="决策-2"&gt;决策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;学习&lt;/code&gt; 现在承担&amp;quot;技术学习/开发&amp;quot;语义(吸收了原 &lt;code&gt;开发&lt;/code&gt;),覆盖 58 篇;原 &lt;code&gt;学习&lt;/code&gt; 主要贴在 2020 年早期学习笔记上,语义自然延伸&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-4"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;当前 tag:&lt;code&gt;日志&lt;/code&gt; 97 / &lt;code&gt;学习&lt;/code&gt; 58 / &lt;code&gt;思考&lt;/code&gt; 40 / &lt;code&gt;硬件&lt;/code&gt; 14 / &lt;code&gt;安全&lt;/code&gt; 6 / &lt;code&gt;杂谈&lt;/code&gt; 3 / &lt;code&gt;书评&lt;/code&gt; 1&lt;/li&gt;
&lt;li&gt;仍有 &lt;code&gt;日志&lt;/code&gt;(大杂烩)和 &lt;code&gt;杂谈&lt;/code&gt;(3 篇,边缘)可以继续精简&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="维护记录-5"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作-5"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;给全部 221 篇文章补全 &lt;code&gt;description:&lt;/code&gt; 字段(原来只有 9 篇有内容、30 篇是空 &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;,其余完全缺失)&lt;/li&gt;
&lt;li&gt;日志类 94 篇:直接写日期(&lt;code&gt;2020年04月06日&lt;/code&gt; 风格),机械处理&lt;/li&gt;
&lt;li&gt;非日志类 117 篇:4 个 subagent 并行读取正文,生成 80-150 字中文摘要(已验证 PaperMod 把 description 渲染到 &lt;code&gt;meta[name=description]&lt;/code&gt;、&lt;code&gt;og:description&lt;/code&gt;、&lt;code&gt;twitter:description&lt;/code&gt; 三处)&lt;/li&gt;
&lt;li&gt;2 篇 draft 但空正文(&lt;code&gt;20200407-Linux-Process-0ca&lt;/code&gt; / &lt;code&gt;20250115-AHK的快捷键脚本方案-0ca&lt;/code&gt;)用标题生成了占位描述&lt;/li&gt;
&lt;li&gt;Hugo &lt;code&gt;--minify&lt;/code&gt; 通过(288 ms,221 篇全部有 description)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="决策-3"&gt;决策&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;全部 description 用中文双引号包裹(&lt;code&gt;description: &amp;quot;...&amp;quot;&lt;/code&gt;),保持博客中文环境一致&lt;/li&gt;
&lt;li&gt;插入位置统一在 &lt;code&gt;date:&lt;/code&gt; 行之后;空 &lt;code&gt;description: &amp;quot;&amp;quot;&lt;/code&gt; 直接在原位替换&lt;/li&gt;
&lt;li&gt;摘要规则:不重复标题信息、客观中性、长度可控&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-5"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;部分早期文章(2020-2021)的标题比较模糊(如 &lt;code&gt;Log 14&lt;/code&gt;、&lt;code&gt;2020-9-19&lt;/code&gt;),AI 生成的 description 可能不太有意义,但仍优于完全缺失&lt;/li&gt;
&lt;li&gt;没有动 &lt;code&gt;hugo.toml&lt;/code&gt; 中 &lt;code&gt;[params]&lt;/code&gt; 的 &lt;code&gt;description = &amp;quot;&amp;quot;&lt;/code&gt;(全站 fallback);如果想统一,可以改为 blog 简介&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="维护记录-6"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作-6"&gt;完成的工作&lt;/h3&gt;
&lt;p&gt;scripts/ 全面审查 + 修复:&lt;/p&gt;</description></item><item><title>2026-08-19</title><link>https://sdttttt.online/changelog/2026-08-19/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-08-19/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;应用户要求,把 scripts 工作流从 Node.js + tsc 全面迁移到 Deno ✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;deno.json&lt;/code&gt;:tasks 列出全部 14 个入口(&lt;code&gt;test&lt;/code&gt; / &lt;code&gt;validate-posts&lt;/code&gt; / &lt;code&gt;check-dead-links&lt;/code&gt; / &lt;code&gt;format-markdown&lt;/code&gt; / &lt;code&gt;sync-covers&lt;/code&gt; / &lt;code&gt;gen-covers&lt;/code&gt; / &lt;code&gt;rename-posts&lt;/code&gt; / &lt;code&gt;optimize-images&lt;/code&gt; / &lt;code&gt;git-commit-push&lt;/code&gt; + 各 &lt;code&gt;*-dry&lt;/code&gt; 变体),&lt;code&gt;unstable: [&amp;quot;sloppy-imports&amp;quot;]&lt;/code&gt; 避免改 28 处 &lt;code&gt;.js&lt;/code&gt; 后缀 import,&lt;code&gt;imports: { sharp: &amp;quot;npm:sharp@0.33.5&amp;quot; }&lt;/code&gt; 锁定 sharp 版本,&lt;code&gt;nodeModulesDir: &amp;quot;none&amp;quot;&lt;/code&gt; 拒绝自动创建 &lt;code&gt;node_modules/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;更新 5 个 workflow yml(validate-posts / sync-covers / check-dead-links / test-scripts / deploy):替换 &lt;code&gt;setup-node@v4&lt;/code&gt; + &lt;code&gt;npm install&lt;/code&gt; + &lt;code&gt;npx tsc&lt;/code&gt; 三件套为 &lt;code&gt;denoland/setup-deno@v2&lt;/code&gt;,把 &lt;code&gt;node scripts/dist/xxx.js&lt;/code&gt; 全部换成 &lt;code&gt;deno task xxx&lt;/code&gt; 或 &lt;code&gt;deno run -A scripts/xxx.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;package.json&lt;/code&gt; / &lt;code&gt;package-lock.json&lt;/code&gt; / &lt;code&gt;tsconfig.scripts.json&lt;/code&gt; / &lt;code&gt;scripts/dist/&lt;/code&gt;(168K 编译产物,git 历史里也会清)&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;deno.lock&lt;/code&gt;(212 行,锁定 sharp + 平台原生包 + transitive deps),跟 &lt;code&gt;package-lock.json&lt;/code&gt; 一样入仓&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;.gitignore&lt;/code&gt;:&lt;code&gt;scripts/dist/&lt;/code&gt; 改为 &lt;code&gt;.tools/&lt;/code&gt;(Deno 二进制 + cache,本地用,不入仓)+ &lt;code&gt;.npm-cache/&lt;/code&gt;(旧依赖)&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;CLAUDE.md&lt;/code&gt; 反映新结构(Deno 命令、scripts 目录树、修正 &lt;code&gt;content/maintenance/&lt;/code&gt; → &lt;code&gt;content/claudelog/&lt;/code&gt;、删除不存在的 &lt;code&gt;format-markdown.yml&lt;/code&gt; 引用)&lt;/li&gt;
&lt;li&gt;POC 5 项全过:&lt;strong&gt;Deno 直接吃 .ts&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;node:test&lt;/code&gt; 原生兼容&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;node:child_process.execSync&lt;/code&gt; 工作&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;npm:sharp&lt;/code&gt; 预编译包自动下载&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;denoland/setup-deno@v2&lt;/code&gt; 一行可换&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试 39 passed (162 steps),0 failed&lt;/strong&gt; — 与 Node + tsc 完全等价 ✅&lt;/li&gt;
&lt;li&gt;所有 9 个脚本 dry-run 验证可加载/可执行&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;沙箱 HOME 不可写 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deno_install&lt;/code&gt; 默认装到 &lt;code&gt;~/.deno&lt;/code&gt;,沙箱拒绝&lt;/li&gt;
&lt;li&gt;&lt;code&gt;curl ... | sh&lt;/code&gt; 不接受 inline &lt;code&gt;DENO_INSTALL=...&lt;/code&gt; env(子 shell 不继承 export 之前的赋值)&lt;/li&gt;
&lt;li&gt;解决:&lt;code&gt;export DENO_INSTALL=&amp;quot;$PWD/.tools/deno&amp;quot; &amp;amp;&amp;amp; curl ... | sh -s -- -y&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deno 默认缓存路径也不可写 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DENO_DIR&lt;/code&gt; 默认是 &lt;code&gt;~/.cache/deno&lt;/code&gt;,沙箱拒&lt;/li&gt;
&lt;li&gt;解决:本地开发设 &lt;code&gt;export DENO_DIR=&amp;quot;$PWD/.tools/deno-cache&amp;quot;&lt;/code&gt;,CI runner 不存在此问题&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--sloppy-imports&lt;/code&gt; 是拦路虎 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;全部 28 处 &lt;code&gt;from './lib/xxx.js'&lt;/code&gt;(实际 &lt;code&gt;.ts&lt;/code&gt; 文件)在 Deno 默认严格模式下报错&lt;/li&gt;
&lt;li&gt;三种解法:加 &lt;code&gt;--sloppy-imports&lt;/code&gt;(每次手动)、&lt;code&gt;deno.json&lt;/code&gt; 配 &lt;code&gt;unstable: [&amp;quot;sloppy-imports&amp;quot;]&lt;/code&gt;(项目级)、手工改 28 处后缀(易出错)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;采用 #2&lt;/strong&gt;,0 行代码改动,vs 改 28 处 import + 担心 typo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sharp 自动下载有警告 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Deno 默认跳过 npm 包 lifecycle scripts,提示 &amp;ldquo;Enable &lt;code&gt;nodeModulesDir: auto&lt;/code&gt;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;sharp 不需要 postinstall(平台预编译包 &lt;code&gt;@img/sharp-darwin-arm64&lt;/code&gt; 等),警告可忽略&lt;/li&gt;
&lt;li&gt;Linux CI 同理:会自动下 &lt;code&gt;@img/sharp-linux-x64&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deno task 不解析 &lt;code&gt;--&lt;/code&gt; 分隔符 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;原计划用 &lt;code&gt;deno task xxx -- --message &amp;quot;...&amp;quot;&lt;/code&gt;(像 npm 那样)&lt;/li&gt;
&lt;li&gt;实测 Deno 2.9 把 &lt;code&gt;--&lt;/code&gt; 原样透传给脚本,被 &lt;code&gt;parseArgs&lt;/code&gt; 当成 &lt;code&gt;--&lt;/code&gt; flag&lt;/li&gt;
&lt;li&gt;解决:workflow 里改用 &lt;code&gt;deno run -A scripts/xxx.ts --message &amp;quot;...&amp;quot;&lt;/code&gt; 直接调用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLAUDE.md 文档漂移 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;原本引用了 &lt;code&gt;.github/workflows/format-markdown.yml&lt;/code&gt;,但文件根本不存在(&lt;code&gt;deploy.yml&lt;/code&gt; 里有 format-markdown.ts 调用,不是独立 workflow)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content/maintenance/&lt;/code&gt; 是错的,实际是 &lt;code&gt;content/claudelog/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;顺手一起修了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="决策点"&gt;决策点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;保留 Node + prettier&lt;/strong&gt;:Deno 没有等价 prettier 的内置格式化器,且 prettier 跨语言一致性强。&lt;code&gt;deploy.yml&lt;/code&gt; 里 &lt;code&gt;format-markdown.ts&lt;/code&gt; shell 调用 &lt;code&gt;prettier&lt;/code&gt; 是最干净的边界。代价:workflow 仍需 &lt;code&gt;setup-node@v4&lt;/code&gt; + &lt;code&gt;npm install -g prettier@3.9.6&lt;/code&gt;,但 &lt;code&gt;node_modules&lt;/code&gt; 不存在,体积零增量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留 &lt;code&gt;migrate-slug-scheme.ts&lt;/code&gt;&lt;/strong&gt;(一次性脚本,无测试,workflow 里没引用):虽然功能已结束,但删用户写过的代码得用户授权。留着,以后清理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不加 &lt;code&gt;nodeModulesDir: &amp;quot;auto&amp;quot;&lt;/code&gt;&lt;/strong&gt;:会强制创建 &lt;code&gt;node_modules/&lt;/code&gt; 目录,违背&amp;quot;零 npm&amp;quot;目标。sharp 无 postinstall,警告忽略&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ci-影响"&gt;CI 影响&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;before&lt;/strong&gt;:4 个 workflow 各 5 步(checkout → setup-node → npm install → npx tsc → node scripts/dist/xxx.js),平均每 job ~45 秒在 npm 上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;after&lt;/strong&gt;:3 步(checkout → setup-deno → deno task xxx),setup-deno 几秒,deno 跑 .ts 是缓存热路径&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预计 CI 时间省 30-40%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;观察第一次 push 触发 deploy.yml 的运行,确认 sharp 在 Linux runner 上跑通(&lt;code&gt;@img/sharp-linux-x64&lt;/code&gt; 自动下载)&lt;/li&gt;
&lt;li&gt;如果 &lt;code&gt;deno task test&lt;/code&gt; 在 CI 比 &lt;code&gt;node --test scripts/dist/__tests__/*.js&lt;/code&gt; 慢(不太可能,但 Deno 冷启动比 node 慢),考虑加 &lt;code&gt;cache: 'deno'&lt;/code&gt; 或类似策略到 setup-deno&lt;/li&gt;
&lt;li&gt;&lt;code&gt;migrate-slug-scheme.ts&lt;/code&gt; 可以独立删(下次大扫除时),无功能影响&lt;/li&gt;
&lt;li&gt;如果哪天不需要 prettier 了,可以把 deploy.yml 的 &lt;code&gt;setup-node@v4&lt;/code&gt; 也去掉,实现纯 Deno&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="文件变更清单"&gt;文件变更清单&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新增:&lt;code&gt;deno.json&lt;/code&gt;、&lt;code&gt;deno.lock&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删除:&lt;code&gt;package.json&lt;/code&gt;、&lt;code&gt;package-lock.json&lt;/code&gt;、&lt;code&gt;tsconfig.scripts.json&lt;/code&gt;、&lt;code&gt;scripts/dist/&lt;/code&gt;(含 11 .js + 3 .js in lib/ + 10 .js in &lt;strong&gt;tests&lt;/strong&gt;/)&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;.github/workflows/{deploy,validate-posts,sync-covers,check-dead-links,test-scripts}.yml&lt;/code&gt; + &lt;code&gt;CLAUDE.md&lt;/code&gt; + &lt;code&gt;.gitignore&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;脚本源码(&lt;code&gt;scripts/**/*.ts&lt;/code&gt;):&lt;strong&gt;0 行改动&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-18</title><link>https://sdttttt.online/changelog/2026-08-18/</link><pubDate>Tue, 18 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-08-18/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;拉取 origin/master 的 6 个新提交（fast-forward），工作树已同步 ✅&lt;/li&gt;
&lt;li&gt;应用户要求，&lt;strong&gt;只&lt;/strong&gt;优化工作流 #1（拆分 &lt;code&gt;chore: auto-fix content&lt;/code&gt; 噪音 commit），其他建议（PR 预览、URL 稳定、Dependabot）不动 ✅&lt;/li&gt;
&lt;li&gt;实现 &lt;code&gt;scripts/git-commit-push.ts&lt;/code&gt; 的自动 commit message 分类：
&lt;ul&gt;
&lt;li&gt;5 个分类路径：rename / fm / format / covers / posts&lt;/li&gt;
&lt;li&gt;混合或无法识别时回退到 &lt;code&gt;--message-fallback&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;--message-fallback&lt;/code&gt; 参数，deploy.yml 调用改为同时传 &lt;code&gt;--message&lt;/code&gt; 和 &lt;code&gt;--message-fallback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;顶层 CLI 代码包到 &lt;code&gt;isMain&lt;/code&gt; 守卫，避免被 &lt;code&gt;import&lt;/code&gt; 时误执行（之前 import 会因 &lt;code&gt;process.exit(1)&lt;/code&gt; 失败）&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;scripts/__tests__/git-commit-push.test.ts&lt;/code&gt;，13 个测试覆盖所有分类路径&lt;/li&gt;
&lt;li&gt;测试 + E2E dry-run 验证：rename 漂移 → &lt;code&gt;chore(rename): sync post slugs (N files)&lt;/code&gt;；fm 注入 → &lt;code&gt;chore(fm): inject frontmatter (N files)&lt;/code&gt;；混合 → fallback&lt;/li&gt;
&lt;li&gt;全部测试 164/164 通过，Hugo 构建 clean ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;测试陷阱 1：git rename 检测对短文件失败 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;最初测试 fixture 只写 10 行 body，git &lt;code&gt;-M20%&lt;/code&gt; 阈值下也检测不出 rename&lt;/li&gt;
&lt;li&gt;实际 rename-posts.js 跑的都是 30+ 行文章，body 微调 &amp;lt; 20% 行&lt;/li&gt;
&lt;li&gt;解决：测试 fixture 加到 40 段，模拟真实文章密度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试陷阱 2：git mv vs 文件系统 mv ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;最初用 &lt;code&gt;mv&lt;/code&gt; 改文件名 + &lt;code&gt;writeFileSync&lt;/code&gt; 覆盖,git 不识别为 rename（变 A+D）&lt;/li&gt;
&lt;li&gt;解决：改用 &lt;code&gt;git mv&lt;/code&gt; + 追加一行，模拟 rename-posts.js 真实操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试陷阱 3：Apple Git 的 &lt;code&gt;git rm&lt;/code&gt; 副作用 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git rm&lt;/code&gt; 删除 tracked 文件后，git 2.x 会清理空目录&lt;/li&gt;
&lt;li&gt;后续 &lt;code&gt;writeFileSync&lt;/code&gt; 写新 SVG 时 ENOENT&lt;/li&gt;
&lt;li&gt;解决：测试 setup 时预放 &lt;code&gt;.gitkeep&lt;/code&gt; 占位文件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模块化陷阱：顶层代码副作用 ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;把分类函数 &lt;code&gt;export&lt;/code&gt; 给测试用后，import 时顶层 &lt;code&gt;if (!message) process.exit(1)&lt;/code&gt; 会触发&lt;/li&gt;
&lt;li&gt;解决：用 &lt;code&gt;pathToFileURL(process.argv[1]).href === import.meta.url&lt;/code&gt; 守卫 CLI 代码&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;未用 import ⚠️&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;测试文件 import 了 &lt;code&gt;join&lt;/code&gt; from &lt;code&gt;'node:path'&lt;/code&gt;，但实际用的是 &lt;code&gt;Array.prototype.join&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;自审时发现并清理，避免污染&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="决策点"&gt;决策点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不改 &lt;code&gt;sync-covers.yml&lt;/code&gt; 的调用方式&lt;/strong&gt;：它只传 &lt;code&gt;--message&lt;/code&gt; 不传 &lt;code&gt;--message-fallback&lt;/code&gt;，新脚本会让 &lt;code&gt;fallback = --message&lt;/code&gt;(原行为)。而且它的场景（cover IO）会被自动分类为 &lt;code&gt;chore(covers): ...&lt;/code&gt;，永远走不到 fallback 分支。比之前更精确 ✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;降级策略而非强制分类&lt;/strong&gt;：当改动是&amp;quot;rename + 改了正文&amp;quot;或&amp;quot;fm 注入 + 新建 cover&amp;quot;这种混合，分类不可靠，返回 null 让 fallback 接住。不冒险乱分类&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;观察接下来几天的 auto-fix commit,如果 &lt;code&gt;chore(rename)&lt;/code&gt; / &lt;code&gt;chore(fm)&lt;/code&gt; 频繁出现，说明分类正确；如果大量 &lt;code&gt;chore: auto-fix content&lt;/code&gt; (fallback) 出现，说明有分类逻辑没覆盖的场景，需要扩展&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sync-covers.yml&lt;/code&gt; 也可以从 &lt;code&gt;chore(assets): remove orphan cover images&lt;/code&gt; 升级到自动分类（会产出 &lt;code&gt;chore(covers): -N cover image(s)&lt;/code&gt;），让两个 workflow 的 commit 风格统一&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="文件变更清单"&gt;文件变更清单&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新增:&lt;code&gt;scripts/__tests__/git-commit-push.test.ts&lt;/code&gt;（13 测试）&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;scripts/git-commit-push.ts&lt;/code&gt;(+196 行:isMain 守卫 + classifyStagedChanges + 子函数)&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;(commit step 加 &lt;code&gt;--message-fallback&lt;/code&gt; + 注释)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-17</title><link>https://sdttttt.online/changelog/2026-08-17/</link><pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-08-17/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;拉取 origin/master 的 18 个新提交（fast-forward），并同步 PaperMod 子模块到 &lt;code&gt;v8.0-139&lt;/code&gt; ✅&lt;/li&gt;
&lt;li&gt;创建新文章 &lt;code&gt;content/posts/20260817[05hog4].md&lt;/code&gt;（标题「文章的变化」），作者口述风格，半角逗号占位符写法，参考近期 &lt;code&gt;20260807[01jma3].md&lt;/code&gt; 的日志类 frontmatter ✅&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;rename-posts.js&lt;/code&gt; 由 body 算出 hash 并重命名占位文件为 &lt;code&gt;20260817[05hog4].md&lt;/code&gt; ✅&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;gen-covers.js --files ... --force&lt;/code&gt; 生成封面 &lt;code&gt;static/images/covers/20260817[05hog4].svg&lt;/code&gt;（teal / patternConcentric）✅&lt;/li&gt;
&lt;li&gt;手动修正 front matter 中 &lt;code&gt;cover.image&lt;/code&gt; 引用（rename-posts 不会同步更新 cover 路径，这是已知 bug）⚠️&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hugo --minify&lt;/code&gt; 构建通过，新页面 &lt;code&gt;public/posts/2026081705hog4/&lt;/code&gt; 正常生成，封面路径正确解析 ✅&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;content/claudelog/2026-08-17.md&lt;/code&gt; ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gen-covers.js --files&lt;/code&gt; 接受相对路径时会被脚本拼接成 &lt;code&gt;content/posts/content/posts/...&lt;/code&gt;，必须传 basename（不带 &lt;code&gt;content/posts/&lt;/code&gt; 前缀） ⚠️ - 已规避&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rename-posts.js&lt;/code&gt; 在重命名占位文件后不会同步更新 front matter 里的 &lt;code&gt;cover.image&lt;/code&gt; 路径 ⚠️ - 已手动修正；建议下次让用户或脚本执行后立即检查 front matter 完整性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;可以考虑给 &lt;code&gt;rename-posts.js&lt;/code&gt; 加一个 &lt;code&gt;--sync-cover-fm&lt;/code&gt; 开关，自动同步 &lt;code&gt;cover.image&lt;/code&gt; 引用，避免遗漏&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;raw=$(hashed-slug)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;old=&amp;#34;images/covers/&amp;lt;oldSlug&amp;gt;.svg&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3&lt;/span&gt;&lt;span&gt;new=&amp;#34;images/covers/&amp;lt;newSlug&amp;gt;.svg&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4&lt;/span&gt;&lt;span&gt;raw.replace(old, new)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="维护记录-追加---命名规则重构--ci-修复"&gt;维护记录 (追加 - 命名规则重构 + CI 修复)&lt;/h2&gt;
&lt;h3 id="完成的工作-1"&gt;完成的工作&lt;/h3&gt;
&lt;h4 id="命名规则改造"&gt;命名规则改造&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;:改造 posts 命名规则 &lt;code&gt;YYYYMMDD[hash].md&lt;/code&gt; → &lt;code&gt;YYYYMMDD-{slug}-{hash3}.md&lt;/code&gt;,让文件名一眼能读懂文章标题 ✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方案选型&lt;/strong&gt;:经 ask_user_question 与用户确认方案 B(日期 + slug + 3 位 hash)、slug 从 title 自动生成、中文保留、迁移全部 221 篇历史文章、生成 Hugo aliases 自动 301&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scripts/rename-posts.ts&lt;/code&gt; 改造&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;新增 &lt;code&gt;computeHash3&lt;/code&gt; 纯函数(SHA-256 前 2 字节 → 16-bit base36)&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;slugify&lt;/code&gt; 纯函数(保留 CJK unicode + 拉丁字母数字,其余替换为连字符,长度上限 80,空串兜底 &lt;code&gt;'untitled'&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;oldUrlFromSlug&lt;/code&gt; 纯函数(支持 &lt;code&gt;YYYYMMDD[hash]&lt;/code&gt; 和 &lt;code&gt;YYYY-MM-DD-slug&lt;/code&gt; 两种历史格式推导旧 URL)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RenamePlan&lt;/code&gt; 接口扩展:新增 &lt;code&gt;title&lt;/code&gt;、&lt;code&gt;oldUrl&lt;/code&gt;、&lt;code&gt;hash3&lt;/code&gt; 字段(替代 &lt;code&gt;hash6&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;buildReport&lt;/code&gt; 改用 slugify + computeHash3 命名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;executePlan&lt;/code&gt; 无需改动(已 git mv + 同步 cover)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新增 &lt;code&gt;scripts/migrate-slug-scheme.ts&lt;/code&gt;&lt;/strong&gt;:一次性迁移脚本
&lt;ul&gt;
&lt;li&gt;默认 dry-run,加 &lt;code&gt;--apply&lt;/code&gt; 才落地&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;buildReport&lt;/code&gt; + &lt;code&gt;executePlan&lt;/code&gt;,并在 front matter 注入 &lt;code&gt;aliases: [&amp;quot;/posts/{oldSlug}/&amp;quot;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;injectAliases&lt;/code&gt; 支持合并已有 aliases(数组/字符串两种格式)&lt;/li&gt;
&lt;li&gt;碰撞检测 + 失败即停&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试套件更新&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rename-posts.test.ts&lt;/code&gt; 中已有断言 &lt;code&gt;plans[0]!.newSlug.startsWith('20240115')&lt;/code&gt; 验证 date 前缀保留 → 收紧为正则 &lt;code&gt;/^20240115-.+-[a-z0-9]{1,4}$/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;新增 13 个测试:&lt;code&gt;computeHash3&lt;/code&gt; ×3 / &lt;code&gt;slugify&lt;/code&gt; ×7 / &lt;code&gt;oldUrlFromSlug&lt;/code&gt; ×3&lt;/li&gt;
&lt;li&gt;测试套件 138 → 151,全部通过 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="迁移执行"&gt;迁移执行&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dry-run 报告&lt;/strong&gt;:221 篇待迁移,0 碰撞&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;执行&lt;/strong&gt;:&lt;code&gt;node scripts/dist/migrate-slug-scheme.js --apply --verbose&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;221 篇 .md + 220 个 .svg 重命名(全部用 &lt;code&gt;git mv&lt;/code&gt; 保留历史)&lt;/li&gt;
&lt;li&gt;441 个文件改动,git 全部识别为 &lt;code&gt;R&lt;/code&gt;(rename),内容相似度 54%-100%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;front matter 注入 aliases&lt;/strong&gt;:每篇文章新加 &lt;code&gt;aliases: [&amp;quot;/posts/{oldSlug}/&amp;quot;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugo 构建验证&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Pages: 264 → 265&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aliases: 15 → 224&lt;/strong&gt;(旧 URL 全部生成了 301 等价页面)&lt;/li&gt;
&lt;li&gt;抽样 &lt;code&gt;20260817-文章的变化-jtc/index.html&lt;/code&gt; 包含:
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;link&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;rel&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;canonical&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;href&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;https://sdttttt.online/posts/20260817-文章的变化-jtc/&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;meta&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;http-equiv&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;refresh&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;content&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;0; url=...&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地测试&lt;/strong&gt;:151/151 通过 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="git-提交多-commit-策略经-ask_user_question-确认"&gt;Git 提交(多 commit 策略,经 ask_user_question 确认)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;5a417ea&lt;/code&gt; chore(scripts): 新增 YYYYMMDD-slug-hash 命名支持 + 一次性迁移脚本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;5a7ad18&lt;/code&gt; chore(posts): 迁移 221 篇文章到 YYYYMMDD-slug-hash 命名格式&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="第一次推送与冲突解决"&gt;第一次推送与冲突解决&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git push origin master&lt;/code&gt; 被远程拒绝:CI 的 &lt;code&gt;chore: auto-fix content&lt;/code&gt;(&lt;code&gt;4ace5ca&lt;/code&gt;)刚把 &lt;code&gt;20260817[05hog4]&lt;/code&gt; 改名为 &lt;code&gt;20260817[03wwo2]&lt;/code&gt;(因 body 改了导致 SHA-256 变了)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull --rebase&lt;/code&gt; 出现 &lt;strong&gt;rename/rename 冲突&lt;/strong&gt;:CI → &lt;code&gt;03wwo2&lt;/code&gt;,我 → &lt;code&gt;20260817-文章的变化-jtc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解决策略&lt;/strong&gt;:保留我的迁移结果(&lt;code&gt;jtc&lt;/code&gt;),丢弃 CI 中间产物(&lt;code&gt;03wwo2&lt;/code&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git rm content/posts/20260817[03wwo2].md&lt;/code&gt; + 同名 .svg&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add&lt;/code&gt; 我的迁移结果&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git rebase --continue&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;失误 1(诚实交代)&lt;/strong&gt;:rebase 后 &lt;code&gt;20260817-文章的变化-jtc.md&lt;/code&gt; 文件里残留冲突标记
&lt;ul&gt;
&lt;li&gt;第一次尝试修复时直接 &lt;code&gt;write&lt;/code&gt; 文件,差点覆盖掉用户手动润色的版本(末尾换行、空行)&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;git show 4ace5ca:&lt;/code&gt; 提取用户的精确版本,再叠加新 frontmatter 恢复 ✅&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;git commit --fixup=9c99956&lt;/code&gt; + &lt;code&gt;rebase -i --autosquash&lt;/code&gt; 把修复折进原 commit,不增加冗余 commit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;重新编号后的两个 commit:&lt;code&gt;613cd99&lt;/code&gt;(脚本) + &lt;code&gt;2445eae&lt;/code&gt;(迁移)&lt;/li&gt;
&lt;li&gt;推送成功 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="ci-失败与修复"&gt;CI 失败与修复&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;推送后 CI deploy 失败:
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;ERROR error building site: &amp;#34;/content/posts/20200311-Github-Actions-3fw.md:2:1&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;EOF looking for end YAML front matter delimiter
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;根因&lt;/strong&gt;:&lt;code&gt;scripts/gen-covers.ts:injectCoverField&lt;/code&gt; line 266 字符串模板 &lt;code&gt;---\n${newFm}---&lt;/code&gt; 中,闭合符 &lt;code&gt;---&lt;/code&gt; 前缺 &lt;code&gt;\n&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;当文件 frontmatter 末尾为 &lt;code&gt;aliases: [...]\n&lt;/code&gt;(我迁移后所有文章都是这种结构),走 if 分支(&lt;code&gt;fm.replace&lt;/code&gt;)重写 cover 块后&lt;/li&gt;
&lt;li&gt;&lt;code&gt;newFm&lt;/code&gt; 末尾是 &lt;code&gt;\n&lt;/code&gt;(来自 &lt;code&gt;+ '\n'&lt;/code&gt;),模板拼接产生 &lt;code&gt;---\n...\n---&lt;/code&gt; 看似正常&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;但&lt;/strong&gt;当文件&lt;strong&gt;没有 trailing newline&lt;/strong&gt; 时,regex &lt;code&gt;[\s\S]*?\n---&lt;/code&gt; 不匹配(因为根本没有第二个 &lt;code&gt;---&lt;/code&gt;),&lt;code&gt;replace&lt;/code&gt; 不替换 → 文件保持原样 → 但原文件 frontmatter 没问题&amp;hellip; &lt;strong&gt;矛盾!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;真正重现&lt;/strong&gt;:本地用 v0.161.1 + 手动写一个无 trailing newline 的测试文件 + 跑 injectCoverField 老逻辑 → 输出文件 frontmatter &lt;code&gt;aliases: [...]---&lt;/code&gt;(无 &lt;code&gt;\n&lt;/code&gt; 分隔)
&lt;ul&gt;
&lt;li&gt;Hugo 解析:严格模式下视 &lt;code&gt;---&lt;/code&gt; 不在行首 → EOF 找不到结束符 → 报错&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修复&lt;/strong&gt;:&lt;code&gt;scripts/gen-covers.ts&lt;/code&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;let&lt;/span&gt; newFm &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; fm.replace(&lt;span style="color:#f1fa8c"&gt;/^cover:\s*\n((?: .+\n?)+)/m&lt;/span&gt;, newCover &lt;span style="color:#ff79c6"&gt;+&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 确保 newFm 以换行结尾,避免与闭合 --- 之间缺少分隔符
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; (&lt;span style="color:#ff79c6"&gt;!&lt;/span&gt;newFm.endsWith(&lt;span style="color:#f1fa8c"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;)) newFm &lt;span style="color:#ff79c6"&gt;+=&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;const&lt;/span&gt; newRaw &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; raw.replace(&lt;span style="color:#f1fa8c"&gt;/^---\n[\s\S]*?\n---/&lt;/span&gt;, &lt;span style="color:#f1fa8c"&gt;`---&lt;/span&gt;\&lt;span style="color:#f1fa8c"&gt;n&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;${&lt;/span&gt;newFm&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;---`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;移除 else 分支多余的 &lt;code&gt;+ '\n'&lt;/code&gt;(避免双换行)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地验证&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;复现脚本验证 buggy 输出:&lt;code&gt;aliases: [&amp;quot;/posts/2020031100oh3i/&amp;quot;]---&lt;/code&gt;(无 &lt;code&gt;\n&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;复现脚本验证 fixed 输出:&lt;code&gt;aliases: [&amp;quot;/posts/2020031100oh3i/&amp;quot;]\n---&lt;/code&gt;(有 &lt;code&gt;\n&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;跑 &lt;code&gt;hugo --minify&lt;/code&gt; 在 buggy 文件上 → 与 CI 完全一致的 EOF 错误 → 确认根因&lt;/li&gt;
&lt;li&gt;跑 &lt;code&gt;hugo --minify&lt;/code&gt; 在 fixed 文件上 → 通过 ✅&lt;/li&gt;
&lt;li&gt;测试套件 151/151 通过 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;诚实交代 - 失误 2&lt;/strong&gt;:我&lt;strong&gt;误以为&lt;/strong&gt;本地 v0.161 build OK = fix 没问题
&lt;ul&gt;
&lt;li&gt;实际上我没有把 bug 真正跑出来 —— 老代码生成的输出与原文件字节序列相同,所以 git diff 显示 0 改动&lt;/li&gt;
&lt;li&gt;真正的 bug 只在&lt;strong&gt;没有 trailing newline&lt;/strong&gt; 的输入上才会暴露&lt;/li&gt;
&lt;li&gt;CI 上的 v0.165 比本地 v0.161 严格,所以 CI 才报错&lt;/li&gt;
&lt;li&gt;教训:&lt;strong&gt;纯函数层面 fix 一定要构造能触发 bug 的输入 + 独立验证,不能依赖&amp;quot;diff 为空 = OK&amp;quot;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="推送修复与最终状态"&gt;推送修复与最终状态&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;32e7cd4&lt;/code&gt; fix(gen-covers): 修复 injectCoverField 丢失 frontmatter 末尾换行的 bug&lt;/li&gt;
&lt;li&gt;CI 重新跑 → &lt;strong&gt;成功&lt;/strong&gt; ✅(产生 &lt;code&gt;27fa25b chore: auto-fix content&lt;/code&gt;,是部署成功后的文件名微调)&lt;/li&gt;
&lt;li&gt;新文章线上 URL:https://sdttttt.online/posts/20260817-文章的变化-1e69/(后缀 hash 因 prettier 规范化略变,deploy.yml 自动处理)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-1"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;rename/rename 冲突&lt;/strong&gt;:本地迁移和 CI auto-fix 在同一文件上往不同方向 rename。教训:涉及大量 rename 的操作前应先 pull 同步 CI 状态 ⚠️&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;rebase 后冲突标记残留&lt;/strong&gt;:git 有时不会自动清理 file content 中的冲突标记,只清理 status。教训:rebase 后必须 &lt;code&gt;hugo --minify&lt;/code&gt; 验证 build,不能只看 &lt;code&gt;git status&lt;/code&gt; 干净 ⚠️&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bug 漏检&lt;/strong&gt;:本地 v0.161 与 CI v0.165 行为不一致(后者更严格),导致 bug 在本地测不出来。教训:涉及 frontmatter / 严格解析的代码应该用与 CI 同版本的工具验证 ⚠️&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不区分大小写的本地 + 区分大小写的远程&lt;/strong&gt;:APFS 默认 case-insensitive,导致本地文件名 &lt;code&gt;Github-Actions&lt;/code&gt; 在 Linux CI 上行为可能不同。本次没踩坑,但值得警惕 ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-1"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在 CI 流程开始前加一步 &lt;code&gt;git fetch + check clean&lt;/code&gt; 的 sanity check,避免 race&lt;/li&gt;
&lt;li&gt;给 &lt;code&gt;gen-covers.ts&lt;/code&gt; 加专门测试:用 &lt;code&gt;writeFile&lt;/code&gt; 写出&lt;strong&gt;无 trailing newline&lt;/strong&gt; 的输入,验证输出 frontmatter 闭合&lt;/li&gt;
&lt;li&gt;在 deploy workflow 加 step:&lt;code&gt;hugo --minify&lt;/code&gt; 失败时打印前 3 个报错的 .md 文件的 head/tail,便于排查&lt;/li&gt;
&lt;li&gt;考虑给 rename-posts.js 加 dry-run-only 模式(默认 dry-run,避免误操作)&lt;/li&gt;
&lt;li&gt;新 hash 计算结果应在文件 gitattributes 或 .gitignore 里加 ignore,避免 auto-fix commit 噪声(目前 &lt;code&gt;27fa25b&lt;/code&gt; 这种 commit 频率会越来越高)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="文件变更清单"&gt;文件变更清单&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新增:&lt;code&gt;scripts/migrate-slug-scheme.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;scripts/rename-posts.ts&lt;/code&gt;(computeHash3 + slugify + oldUrlFromSlug + RenamePlan 字段)&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;scripts/gen-covers.ts&lt;/code&gt;(injectCoverField 末尾换行兜底)&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;scripts/__tests__/rename-posts.test.ts&lt;/code&gt;(+13 测试)&lt;/li&gt;
&lt;li&gt;修改:&lt;code&gt;scripts/__tests__/rename-posts-execute.test.ts&lt;/code&gt;(RenamePlan 字段适配)&lt;/li&gt;
&lt;li&gt;重命名:221 个 &lt;code&gt;content/posts/YYYYMMDD[hash].md&lt;/code&gt; → &lt;code&gt;content/posts/YYYYMMDD-{slug}-{hash3}.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;重命名:220 个 &lt;code&gt;static/images/covers/YYYYMMDD[hash].svg&lt;/code&gt; → 同名格式&lt;/li&gt;
&lt;li&gt;修改:221 个 .md 的 front matter(新增 &lt;code&gt;aliases:&lt;/code&gt; 字段)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-07</title><link>https://sdttttt.online/changelog/2026-08-07/</link><pubDate>Fri, 07 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-08-07/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;创建新文章 &lt;code&gt;content/posts/20260807[0534gw].md&lt;/code&gt;（标题「自述 - 小学时期」），参考现有草稿 frontmatter 格式，并设置为 &lt;code&gt;draft: true&lt;/code&gt;（不展示状态）✅&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;gen-covers --files --force&lt;/code&gt; 为文章生成封面 &lt;code&gt;static/images/covers/20260807[0534gw].svg&lt;/code&gt;（gold / patternConcentric）✅&lt;/li&gt;
&lt;li&gt;运行 &lt;code&gt;validate-posts.js&lt;/code&gt; 校验通过，文章与封面一致 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;无&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;无&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-05</title><link>https://sdttttt.online/changelog/2026-08-05/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-08-05/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;创建带新 tag &lt;code&gt;书评&lt;/code&gt; 的文章模板&lt;/strong&gt;：&lt;code&gt;content/posts/20260805[0buk4e].md&lt;/code&gt;,front matter 含 &lt;code&gt;tags: [&amp;quot;书评&amp;quot;]&lt;/code&gt;、&lt;code&gt;draft: false&lt;/code&gt;、&lt;code&gt;author: sdttttt&lt;/code&gt;,正文留空待用户填写。✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;无。✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;书评&lt;/code&gt; 是除 &lt;code&gt;2026-08-01&lt;/code&gt; 精简后的 7 个核心 tag 之外的&lt;strong&gt;新增类别&lt;/strong&gt;,写作时如出现多本/多主题书评,可考虑是否再细分(例如 &lt;code&gt;技术书评&lt;/code&gt; / &lt;code&gt;小说书评&lt;/code&gt;)以保持 tag 粒度与既有体系一致。&lt;/li&gt;
&lt;li&gt;若后续 &lt;code&gt;书评&lt;/code&gt; 文章数量持续增长,可在 &lt;code&gt;content/posts/&lt;/code&gt; 下补一个 &lt;code&gt;_index.md&lt;/code&gt; 的 description 或在主页 info 中提示,方便读者筛选。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-08-01</title><link>https://sdttttt.online/changelog/2026-08-01/</link><pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-08-01/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;精简博客文章 tags 体系&lt;/strong&gt;：采用方案 A（激进精简），将 &lt;code&gt;content/posts/&lt;/code&gt; 下 218 篇文章的 13 个 tag 收敛为 7 个。✅
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;合并到 &lt;code&gt;开发&lt;/code&gt;&lt;/strong&gt;：&lt;code&gt;工具&lt;/code&gt;、&lt;code&gt;分布式&lt;/code&gt;、&lt;code&gt;建站&lt;/code&gt;、&lt;code&gt;Algorithm&lt;/code&gt;（子主题归并）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新增 &lt;code&gt;杂谈&lt;/code&gt;&lt;/strong&gt;：&lt;code&gt;金钱&lt;/code&gt;、&lt;code&gt;新闻&lt;/code&gt;、&lt;code&gt;文字&lt;/code&gt;（单例容纳）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;清理重复条目&lt;/strong&gt;：3 篇文章的 &lt;code&gt;tags&lt;/code&gt; 数组中存在同一 tag 多次出现的情况，强制去重&lt;/li&gt;
&lt;li&gt;批量执行脚本：&lt;code&gt;/tmp/consolidate-tags.mjs&lt;/code&gt;（Node v24，原地编辑 frontmatter 的 &lt;code&gt;tags&lt;/code&gt; 行，其余内容保持不变）&lt;/li&gt;
&lt;li&gt;改动文件数：&lt;strong&gt;14&lt;/strong&gt; 篇（占 218 篇的 6.4%）&lt;/li&gt;
&lt;li&gt;最终分布：&lt;code&gt;日志 95 / 开发 49 / 思考 40 / 软路由 14 / 学习 10 / 安全 6 / 杂谈 3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;我的初步 &amp;ldquo;+9&amp;rdquo; 净变化预测在数学上出现 ±1 偏差，实际 &lt;code&gt;开发&lt;/code&gt; 为 +4 而非 +9，原因是 &lt;code&gt;20260312[0443ef].md&lt;/code&gt; 同时拥有 &lt;code&gt;建站&lt;/code&gt; 与 &lt;code&gt;工具&lt;/code&gt;，dedup 后只贡献 1 个 &lt;code&gt;开发&lt;/code&gt; 出现次数；同样原本预测里的边界情况需用真实全局计数复核。⚠️ - 不影响最终结果，仅是粗算与精算的偏差。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新增文章时建议优先复用现有 7 个 tag，仅在确有跨类目需求时再讨论是否扩展。&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;scripts/&lt;/code&gt; 下考虑沉淀 &lt;code&gt;consolidate-tags.mjs&lt;/code&gt; 为可重入工具，便于后续调整 tag 体系时一键重跑 + 校验；当前实现还停留在 &lt;code&gt;/tmp/&lt;/code&gt; 里，无版本控制。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="完成的工作-续"&gt;完成的工作 (续)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;修复 &lt;code&gt;layouts/partials/custom_footer.html&lt;/code&gt; 的渲染范围&lt;/strong&gt;：之前 1 行 stub 把 &lt;code&gt;layouts/partials/footer.html&lt;/code&gt; 转交给 &lt;code&gt;custom_footer.html&lt;/code&gt;，而后者只塞了 Cloudflare Analytics，等于&lt;strong&gt;屏蔽了 PaperMod 的全部 footer 功能&lt;/strong&gt;，包括回顶按钮、代码复制按钮、主题切换 JS、菜单滚动位置记忆、版权/Powered by 致谢等。✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;恢复 PaperMod 原版 &lt;code&gt;_partials/footer.html&lt;/code&gt; 的全部内容&lt;/strong&gt;：版权/年份、&lt;code&gt;Powered by Hugo &amp;amp; PaperMod&lt;/code&gt;、&lt;code&gt;#top-link&lt;/code&gt; 锚点和 SVG、滚动监听 JS、平滑滚动 JS、&lt;code&gt;#theme-toggle&lt;/code&gt; JS、&lt;code&gt;copy-code&lt;/code&gt; 按钮 JS；同时保留 PaperMod 的 &lt;code&gt;{{- partial &amp;quot;extend_footer.html&amp;quot; . }}&lt;/code&gt; 钩子。✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留 Cloudflare Web Analytics&lt;/strong&gt;：在新版的 &lt;code&gt;custom_footer.html&lt;/code&gt; 末尾保留原有的 &lt;code&gt;{{- with site.Params.cloudflareAnalytics.token }}&lt;/code&gt; 注入逻辑，并 &lt;code&gt;hugo --minify&lt;/code&gt; 构建后用 &lt;code&gt;grep&lt;/code&gt; 校验 &lt;code&gt;id=top-link&lt;/code&gt; / &lt;code&gt;copy-code&lt;/code&gt; / &lt;code&gt;Powered by&lt;/code&gt; / &lt;code&gt;class=footer&lt;/code&gt; / &lt;code&gt;menu-scroll&lt;/code&gt; / &lt;code&gt;cf-beacon&lt;/code&gt; 在生成的 &lt;code&gt;public/posts/.../index.html&lt;/code&gt; 中重新出现。✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题-续"&gt;遇到的问题 (续)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hugo minifier 会把 &lt;code&gt;&amp;lt;footer class=&amp;quot;footer&amp;quot;&amp;gt;&lt;/code&gt; 压缩成 &lt;code&gt;&amp;lt;footer class=footer&amp;gt;&lt;/code&gt;，第一次 &lt;code&gt;grep &amp;quot;class=\&amp;quot;footer\&amp;quot;&amp;quot;&lt;/code&gt; 给出 0 命中导致误判；改为匹配 &lt;code&gt;class=footer&lt;/code&gt; 即可。无功能影响。⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议-续"&gt;下次建议 (续)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;当前 &lt;code&gt;custom_footer.html&lt;/code&gt; 用 &lt;code&gt;--ultra-compact&lt;/code&gt; 等价于&amp;quot;复制粘贴 PaperMod 原内容&amp;quot;，会带来一个问题：&lt;strong&gt;PaperMod 子模块后续升级 footer 时此处不会自动同步&lt;/strong&gt;。如果想跟进官方 footer 改进，可以改用 &lt;code&gt;layouts/partials/footer.html&lt;/code&gt; 里 &lt;code&gt;{{ block &amp;quot;footer&amp;quot; . }}{{ end }}&lt;/code&gt; 或类似模式避免硬编码；短期内（PaperMod 不会有大改）维持现状即可。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-07-30</title><link>https://sdttttt.online/changelog/2026-07-30/</link><pubDate>Thu, 30 Jul 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-07-30/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将 &lt;code&gt;scripts/rename-posts.ts&lt;/code&gt; 接入 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;：在 &lt;code&gt;Install Bun dependencies&lt;/code&gt; 之后、&lt;code&gt;Generate covers and inject front matter&lt;/code&gt; 之前新增 &lt;code&gt;Rename posts&lt;/code&gt; 步骤，使每次 &lt;code&gt;master&lt;/code&gt; 推送自动将文章重命名为 &lt;code&gt;YYYYMMDD[xxxxxx].md&lt;/code&gt;，并同步处理 cover SVG 与 frontmatter 引用。✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;package.json&lt;/code&gt; 新增 &lt;code&gt;typescript@7.0.2&lt;/code&gt; 与 &lt;code&gt;@types/bun&lt;/code&gt; 开发依赖，用于 CI 中编译脚本。✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;tsconfig.scripts.json&lt;/code&gt;：将 &lt;code&gt;scripts/**/*.ts&lt;/code&gt; 编译输出到 &lt;code&gt;scripts/dist/&lt;/code&gt;，&lt;code&gt;noEmitOnError: false&lt;/code&gt; 保证即使存在类型错误也会产出 JS。✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.gitignore&lt;/code&gt; 增加 &lt;code&gt;scripts/dist/&lt;/code&gt;，避免提交 CI 产物。✅&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;：安装依赖后先执行 &lt;code&gt;bunx tsc -p tsconfig.scripts.json&lt;/code&gt;，随后所有 &lt;code&gt;bun scripts/*.ts&lt;/code&gt; 改为 &lt;code&gt;bun scripts/dist/*.js&lt;/code&gt;。✅&lt;/li&gt;
&lt;li&gt;修复 &lt;code&gt;scripts/format-markdown.ts&lt;/code&gt; 中 &lt;code&gt;execSync&lt;/code&gt; 的 &lt;code&gt;shell: true&lt;/code&gt; 在 TypeScript 7 / &lt;code&gt;@types/node&lt;/code&gt; 下产生的类型错误，改为根据平台选择 &lt;code&gt;cmd.exe&lt;/code&gt; 或 &lt;code&gt;/bin/sh&lt;/code&gt;。✅&lt;/li&gt;
&lt;li&gt;修复 &lt;code&gt;scripts/__tests__/rename-posts.test.ts&lt;/code&gt; 的跨文件 &lt;code&gt;mock.module&lt;/code&gt; 污染问题：在 &lt;code&gt;beforeEach&lt;/code&gt; 中恢复真实 &lt;code&gt;node:fs/promises&lt;/code&gt; 与 &lt;code&gt;node:fs&lt;/code&gt; 模块，避免其它测试的 mock 影响真实 fs 集成测试。✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;迁移到 Node v24&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;package.json&lt;/code&gt; 删除 &lt;code&gt;bun-types&lt;/code&gt;、&lt;code&gt;@types/bun&lt;/code&gt;，新增 &lt;code&gt;@types/node@^24&lt;/code&gt;；移除 &lt;code&gt;bun.lock&lt;/code&gt;，由 &lt;code&gt;npm install&lt;/code&gt; 生成 &lt;code&gt;package-lock.json&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tsconfig.scripts.json&lt;/code&gt; 切换到 &lt;code&gt;module/moduleResolution: NodeNext&lt;/code&gt;，使编译产物的相对导入带上 &lt;code&gt;.js&lt;/code&gt; 后缀。&lt;/li&gt;
&lt;li&gt;所有脚本的 shebang 和使用说明改为 &lt;code&gt;node scripts/dist/&amp;lt;name&amp;gt;.js&lt;/code&gt;；&lt;code&gt;scripts/rename-posts.ts&lt;/code&gt; 的 &lt;code&gt;Bun.spawn&lt;/code&gt; 替换为 &lt;code&gt;node:child_process&lt;/code&gt; 的 &lt;code&gt;spawn&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;所有 8 个测试文件改用 &lt;code&gt;node:test&lt;/code&gt; + 本地 &lt;code&gt;expect&lt;/code&gt; 助手（&lt;code&gt;scripts/__tests__/expect.ts&lt;/code&gt;），并把原本 mock &lt;code&gt;node:fs/promises&lt;/code&gt; 的用例改为真实临时目录集成测试（&lt;code&gt;inTempDir&lt;/code&gt; 助手），避免了 Node 实验性 &lt;code&gt;--experimental-test-module-mocks&lt;/code&gt; 的缓存痛点。&lt;/li&gt;
&lt;li&gt;5 个 GitHub Actions workflow（&lt;code&gt;deploy.yml&lt;/code&gt;、&lt;code&gt;test-scripts.yml&lt;/code&gt;、&lt;code&gt;check-dead-links.yml&lt;/code&gt;、&lt;code&gt;sync-covers.yml&lt;/code&gt;、&lt;code&gt;validate-posts.yml&lt;/code&gt;）移除 &lt;code&gt;oven-sh/setup-bun&lt;/code&gt;，改为 &lt;code&gt;actions/setup-node@v4&lt;/code&gt; + &lt;code&gt;npm install&lt;/code&gt; + &lt;code&gt;npx tsc&lt;/code&gt; + &lt;code&gt;node scripts/dist/*.js&lt;/code&gt;。✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tsc&lt;/code&gt; 首次编译报错 &lt;code&gt;Cannot find type definition file for 'bun'&lt;/code&gt;，原因是仅安装 &lt;code&gt;bun-types&lt;/code&gt; 时 &lt;code&gt;types: [&amp;quot;bun&amp;quot;]&lt;/code&gt; 无法解析；补充安装 &lt;code&gt;@types/bun&lt;/code&gt; 后解决。⚠️&lt;/li&gt;
&lt;li&gt;编译过程中 &lt;code&gt;scripts/format-markdown.ts&lt;/code&gt; 的 &lt;code&gt;shell: true&lt;/code&gt; 触发类型错误，已按平台显式指定 shell 路径。⚠️&lt;/li&gt;
&lt;li&gt;全量 &lt;code&gt;bun test&lt;/code&gt; 因 &lt;code&gt;mock.module&lt;/code&gt; 在 bun:test 中跨文件持久而偶发/必发失败；已通过恢复真实模块解决。⚠️&lt;/li&gt;
&lt;li&gt;Node 原生 ESM 不支持扩展名省略，源 TS 文件全部相对导入加上 &lt;code&gt;.js&lt;/code&gt; 后缀。⚠️&lt;/li&gt;
&lt;li&gt;Node 的 &lt;code&gt;mock.module&lt;/code&gt; 只能影响后续 &lt;code&gt;import()&lt;/code&gt;，而 ESM 模块缓存对同一次 &lt;code&gt;import&lt;/code&gt; 复用旧导出；改用真实临时目录集成测试以绕过实验性 API。⚠️&lt;/li&gt;
&lt;li&gt;&lt;code&gt;node --test scripts/dist/__tests__/*.js&lt;/code&gt; 在 npm scripts 中依赖 shell 展开 glob，CI (bash) 正常；Windows 上需另行处理。⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;观察首次迁移后 CI 运行日志（&lt;code&gt;Hugo on GitHub Pages&lt;/code&gt;、&lt;code&gt;Test Scripts&lt;/code&gt; 等），确认 Node 工具链无回归。&lt;/li&gt;
&lt;li&gt;如需把 &lt;code&gt;npm test&lt;/code&gt; 在 Windows 上做成跨平台，可改用 &lt;code&gt;node --test scripts/dist/__tests__&lt;/code&gt;（目录）或显式列举文件。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-07-28</title><link>https://sdttttt.online/changelog/2026-07-28/</link><pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-07-28/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将首页从 &lt;code&gt;profileMode&lt;/code&gt; 切换为 PaperMod 的 &lt;code&gt;Regular Mode&lt;/code&gt;：移除 &lt;code&gt;params.profileMode&lt;/code&gt; 配置，新增 &lt;code&gt;params.homeInfoParams&lt;/code&gt;，保留原有站点标题与副标题展示。✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;params.env = &amp;quot;production&amp;quot;&lt;/code&gt;，让 PaperMod 在所有构建场景下都按生产环境处理（影响 robots、图片优化等）。✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;scripts/optimize-images.ts&lt;/code&gt; 图片压缩脚本，使用 &lt;code&gt;sharp&lt;/code&gt; 对 PNG/JPEG/WebP/AVIF/GIF/TIFF 进行压缩、限制最大宽度、生成 WebP 变体；并在 &lt;code&gt;package.json&lt;/code&gt; 中加入 &lt;code&gt;sharp&lt;/code&gt; 开发依赖。✅&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;：新增 &lt;code&gt;bun install&lt;/code&gt; 和 &lt;code&gt;Optimize images&lt;/code&gt; 步骤，CI 每次构建时自动为 &lt;code&gt;assets/images&lt;/code&gt; 生成宽度不超过 1200px 的 &lt;code&gt;.webp&lt;/code&gt; 变体，且不覆盖原图。✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;scripts/rename-posts.ts&lt;/code&gt;：将 &lt;code&gt;content/posts/&lt;/code&gt; 下的文章批量重命名为 &lt;code&gt;YYYYMMDD[xxxxxx].md&lt;/code&gt;（&lt;strong&gt;方括号为字面字符&lt;/strong&gt;），其中日期取自 frontmatter &lt;code&gt;date&lt;/code&gt; 字段，hash 是去除 frontmatter 后的 body 用 SHA-256 取前 3 字节（24 bit）后转 base36（6 位固定长度）。配套重命名 &lt;code&gt;assets/images/covers/{slug}.svg&lt;/code&gt; 并改写 frontmatter &lt;code&gt;cover.image&lt;/code&gt;；用 &lt;code&gt;git mv&lt;/code&gt; 保留历史，git 不可用时降级 &lt;code&gt;fs.rename&lt;/code&gt;；支持 &lt;code&gt;--dry-run&lt;/code&gt; / &lt;code&gt;--verbose&lt;/code&gt;；已是新格式、缺 date、格式无效的文件自动跳过；目标名碰撞时按用户策略「报错停止」并列出冲突文件。✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;scripts/__tests__/rename-posts.test.ts&lt;/code&gt;：30 个测试覆盖 &lt;code&gt;normalizeDate&lt;/code&gt;（三种日期格式 + 月日越界 + 补零）/ &lt;code&gt;extractBody&lt;/code&gt; / &lt;code&gt;computeHash6&lt;/code&gt;（确定性、长度、base36 字符集、对末尾空白敏感、&lt;strong&gt;SHA-256 已知向量防止误改回 djb2&lt;/strong&gt;）/ &lt;code&gt;rewriteCoverImage&lt;/code&gt; / &lt;code&gt;buildReport&lt;/code&gt;（7 个集成测试覆盖有效文章、缺 date、无效 date、已是新格式、忽略 &lt;code&gt;_index.md&lt;/code&gt;、自定义封面不重命名、封面物理缺失）/ &lt;code&gt;detectCollisions&lt;/code&gt;。全绿（&lt;code&gt;bun test&lt;/code&gt; 134/134 通过）。✅&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;git rm&lt;/code&gt; 删除 5 对重复文章中用户指定的 5 个，&lt;strong&gt;同步删除对应的 5 个 cover SVG&lt;/strong&gt;（避免 sync-covers 误判为孤儿、且这些 SVG 本来就只服务被删的 .md）。✅&lt;/li&gt;
&lt;li&gt;执行 &lt;code&gt;bun scripts/rename-posts.ts&lt;/code&gt; 完成 216 篇文章 + 215 个 cover SVG 的一次性重命名；git 全部以 &lt;code&gt;R&lt;/code&gt; (rename) 跟踪，&lt;strong&gt;完整保留历史&lt;/strong&gt;。✅&lt;/li&gt;
&lt;li&gt;验证 &lt;code&gt;bun scripts/validate-posts.ts&lt;/code&gt; 全绿 + &lt;code&gt;hugo --minify&lt;/code&gt; 干净构建（265 页）。✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用户最初理解 &lt;code&gt;YYYYMMDD{6位hash}.md&lt;/code&gt; 时我误把方括号当成可选语法，按无方括号实现，后被纠正改为字面方括号 &lt;code&gt;YYYYMMDD[xxxxxx].md&lt;/code&gt;（修正 &lt;code&gt;computeHash6&lt;/code&gt; 输出格式 + 测试 + 注释）。⚠️&lt;/li&gt;
&lt;li&gt;用户指出 hash 用自写 djb2 不专业，&lt;strong&gt;改用 &lt;code&gt;node:crypto&lt;/code&gt; 的 SHA-256&lt;/strong&gt;（前 3 字节，分布更均匀、行业标准）。⚠️&lt;/li&gt;
&lt;li&gt;dry-run 时脚本在 5 对文件上报告目标名碰撞，怀疑 djb2 分布问题。实际排查：4 种不同哈希（djb2 24bit / djb2 full 32bit / FNV-1a 24bit / xxhash32 24bit）以及 SHA-256 全部在&lt;strong&gt;完全相同的 5 对&lt;/strong&gt;上碰撞 → 证实这 5 对 body 真的 100% 相同（完整 64 字符 SHA-256 也一致），属于历史遗留的真实重复文章，不是哈希质量问题。⚠️ 解决方案：用户手动选保留哪个，&lt;code&gt;git rm&lt;/code&gt; 删另一个，配套 cover SVG 同步删除。&lt;/li&gt;
&lt;li&gt;第一次 &lt;code&gt;hugo --minify&lt;/code&gt; 后看到 public/ 里仍有 &lt;code&gt;2020-10-29-log-8/&lt;/code&gt; 等旧 URL，怀疑 Hugo 把新文件当旧名渲染。⚠️ 实际是 hugo 没清空 &lt;code&gt;public/&lt;/code&gt;，旧文件残留；&lt;code&gt;rm -rf public/ resources/ &amp;amp;&amp;amp; hugo --minify&lt;/code&gt; 后正确：URL 形如 &lt;code&gt;/posts/2020031100oh3i/&lt;/code&gt;，&lt;strong&gt;Hugo slugify 自动去掉方括号&lt;/strong&gt;。⚠️&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URL 全部变更&lt;/strong&gt;：旧 &lt;code&gt;/posts/2020-03-11-github-actions/&lt;/code&gt; → 新 &lt;code&gt;/posts/2020031100oh3i/&lt;/code&gt;。按用户决定不添加 alias，所有旧 URL 将 404。⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如需进一步自定义首页信息卡片样式，可通过 &lt;code&gt;assets/css/extended/*.css&lt;/code&gt; 覆盖 &lt;code&gt;.home-info&lt;/code&gt; 相关样式。&lt;/li&gt;
&lt;li&gt;旧的 &lt;code&gt;/posts/{slug}/&lt;/code&gt; URL 已全部失效。如未来想恢复外部链接有效性，可写一个小脚本扫描 git 历史为每篇生成 &lt;code&gt;aliases&lt;/code&gt; frontmatter。&lt;/li&gt;
&lt;li&gt;部署到生产后建议用 &lt;code&gt;curl -I&lt;/code&gt; 抽查若干新旧 URL 确认 404/200 符合预期，并提交 Google Search Console 站点地图更新。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-07-27</title><link>https://sdttttt.online/changelog/2026-07-27/</link><pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-07-27/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修改 &lt;code&gt;scripts/gen-covers.ts&lt;/code&gt;，移除 SVG 封面中的方形与菱形元素：
&lt;ul&gt;
&lt;li&gt;从 symbol 列表删除 &lt;code&gt;□&lt;/code&gt; 与 &lt;code&gt;◇&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;patternRectangles&lt;/code&gt; 与 &lt;code&gt;patternGrid&lt;/code&gt; 两个图案函数，并从 &lt;code&gt;PATTERN_FNS&lt;/code&gt; 中移除&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;同步更新 &lt;code&gt;scripts/__tests__/gen-covers.test.ts&lt;/code&gt;，移除对已删除图案的引用&lt;/li&gt;
&lt;li&gt;运行 &lt;code&gt;bun test scripts/__tests__/gen-covers.test.ts&lt;/code&gt;，29 个测试全部通过 ✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合并自动修复流程到 deploy.yml&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;改写 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;，把 &lt;code&gt;gen-covers&lt;/code&gt; + &lt;code&gt;format-markdown&lt;/code&gt; 并入 build job，在 &lt;code&gt;hugo --minify&lt;/code&gt; 之前顺序执行（gen-covers 先，format 后，一次提交无残留）&lt;/li&gt;
&lt;li&gt;删除独立的 &lt;code&gt;.github/workflows/format-markdown.yml&lt;/code&gt; 与 &lt;code&gt;.github/workflows/gen-covers.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts/git-commit-push.ts&lt;/code&gt; 加 &lt;code&gt;git pull --rebase&lt;/code&gt; 兜底，避免并发 push 被拒&lt;/li&gt;
&lt;li&gt;移除 deploy build job 的 &lt;code&gt;if: github.actor != 'github-actions[bot]'&lt;/code&gt;（该条件在 &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; push 场景下从未生效，是死代码）&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;permissions: contents: write&lt;/code&gt; 与 &lt;code&gt;workflow_dispatch&lt;/code&gt; 触发器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效果&lt;/strong&gt;：一次 push → 一个 bot commit → 部署的是修复后的内容（封面、格式化结果即时上线） ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;最初计划新建独立的 &lt;code&gt;auto-fix.yml&lt;/code&gt; workflow，但发现 &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; 推送的 commit 不会触发新 workflow run，导致封面/格式化结果延迟一次 push 才上线 ⚠️
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：直接合并到 &lt;code&gt;deploy.yml&lt;/code&gt;，在构建前完成修复，部署的就是修复后的内容&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;若后续想补充新图案，可优先加入曲线/有机形态，进一步丰富封面视觉差异&lt;/li&gt;
&lt;li&gt;如需进一步降低 bot commit 噪音，可考虑在 &lt;code&gt;git-commit-push.ts&lt;/code&gt; 里加 &lt;code&gt;git diff-index --quiet HEAD&lt;/code&gt; 检查，有改动才 commit/push&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-07-24</title><link>https://sdttttt.online/changelog/2026-07-24/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-07-24/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修改 &lt;code&gt;.github/workflows/check-dead-links.yml&lt;/code&gt; 中的 &lt;code&gt;Check dead links&lt;/code&gt; 步骤，使用 &lt;code&gt;|| true&lt;/code&gt; 让该步骤始终成功，避免死链检查失败阻塞 CI ✅&lt;/li&gt;
&lt;li&gt;修改 &lt;code&gt;scripts/check-dead-links.ts&lt;/code&gt;，跳过位于 &lt;code&gt;```&lt;/code&gt; 与 &lt;code&gt;~~~&lt;/code&gt; 围栏代码块内的链接，避免代码示例中的 URL 被误检 ✅&lt;/li&gt;
&lt;li&gt;为 &lt;code&gt;scripts/&lt;/code&gt; 下所有非环境依赖脚本补充单元测试，共 106 个测试用例全部通过；同时修复了 &lt;code&gt;frontmatter.ts&lt;/code&gt; 嵌套对象解析和 &lt;code&gt;gen-covers.ts&lt;/code&gt; 的 &lt;code&gt;pick&lt;/code&gt; 函数在处理负数时的行为 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;无 ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;后续可考虑将死链检查失败结果以非阻塞方式上报（如 issue 或注释），而非直接忽略&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-07-22</title><link>https://sdttttt.online/changelog/2026-07-22/</link><pubDate>Wed, 22 Jul 2026 00:00:00 +0800</pubDate><guid>https://sdttttt.online/changelog/2026-07-22/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将博客默认主题从 &lt;code&gt;auto&lt;/code&gt; 切换为 &lt;code&gt;dark&lt;/code&gt;，访问者首次进入站点时将直接以 Dark 模式浏览 ✅&lt;/li&gt;
&lt;li&gt;将最近两篇文章（《意义》《关于恋爱观》）从 &lt;code&gt;private: true&lt;/code&gt; 改为 Hugo 原生 &lt;code&gt;build.list: never + render: true&lt;/code&gt;，在 /posts/ 列表中隐藏但保留直接访问链接 ✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;.github/workflows/gen-covers.yml&lt;/code&gt;，在 &lt;code&gt;content/posts/**.md&lt;/code&gt; 变更时自动运行 &lt;code&gt;bun scripts/gen-covers.ts --all --inject-fm&lt;/code&gt; 生成封面并注入 front matter ✅&lt;/li&gt;
&lt;li&gt;提取 &lt;code&gt;scripts/lib/args.ts&lt;/code&gt; 和 &lt;code&gt;scripts/lib/git.ts&lt;/code&gt; 共享工具，新增 &lt;code&gt;scripts/git-commit-push.ts&lt;/code&gt; ✅&lt;/li&gt;
&lt;li&gt;改造 &lt;code&gt;format-markdown.yml&lt;/code&gt; 和 &lt;code&gt;gen-covers.yml&lt;/code&gt;，统一使用 &lt;code&gt;bun scripts/git-commit-push.ts&lt;/code&gt; 提交变更 ✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;scripts/format-markdown.ts&lt;/code&gt;，&lt;code&gt;format-markdown.yml&lt;/code&gt; 的格式化步骤改为 &lt;code&gt;bun&lt;/code&gt; 执行 ✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;scripts/validate-posts.ts&lt;/code&gt;、&lt;code&gt;scripts/sync-covers.ts&lt;/code&gt;、&lt;code&gt;scripts/check-dead-links.ts&lt;/code&gt; 三个脚本 ✅&lt;/li&gt;
&lt;li&gt;抽离 &lt;code&gt;scripts/lib/frontmatter.ts&lt;/code&gt;，&lt;code&gt;gen-covers.ts&lt;/code&gt; 与校验脚本共享 front matter 解析 ✅&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;validate-posts.yml&lt;/code&gt;、&lt;code&gt;sync-covers.yml&lt;/code&gt;、&lt;code&gt;check-dead-links.yml&lt;/code&gt; 三个 workflow ✅&lt;/li&gt;
&lt;li&gt;精简 &lt;code&gt;layouts/partials/custom_footer.html&lt;/code&gt;，只保留 Cloudflare Web Analytics 脚本 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;validate-posts.ts&lt;/code&gt; 初版未按 Hugo 资源规则查找 &lt;code&gt;assets/&lt;/code&gt; 目录，导致大量封面误报不存在，已修复为同时查找 &lt;code&gt;assets/&lt;/code&gt; 和 &lt;code&gt;static/&lt;/code&gt; ⚠️&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content/posts/2020-05-09-gfs.md&lt;/code&gt; 使用 TOML front matter（&lt;code&gt;+++&lt;/code&gt;），共享解析器只支持 YAML，已将其转换为 YAML 格式 ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;无&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-07-21</title><link>https://sdttttt.online/changelog/2026-07-21/</link><pubDate>Tue, 21 Jul 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-07-21/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;尝试更新 PaperMod 主题子模块，确认已是最新版（154d006，v8.0-138）✅&lt;/li&gt;
&lt;li&gt;单独提交 &lt;code&gt;content/about.md&lt;/code&gt;：移除 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 固定 &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; 属性 ✅&lt;/li&gt;
&lt;li&gt;重写 &lt;code&gt;static/favicon.svg&lt;/code&gt;：从原本的几何图形改为 Claude Code 风格的字母 R favicon（深色圆角矩形 + 衬线字体 + 暖橙色渐变）✅&lt;/li&gt;
&lt;li&gt;PaperMod 配置增强：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[params.editPost]&lt;/code&gt; URL：每篇文章底部加&amp;quot;在 GitHub 编辑此页&amp;quot;按钮 ✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[params.schema]&lt;/code&gt;：&lt;code&gt;publisherType = &amp;quot;Person&amp;quot;&lt;/code&gt; + &lt;code&gt;sameAs&lt;/code&gt; 社交链接（SEO）✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[params.profileMode]&lt;/code&gt;：从 &lt;code&gt;homeInfoParams&lt;/code&gt; 切到完整 profile 模式（先不放头像）✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[params.assets]&lt;/code&gt;：补全 apple-touch-icon / safari-pinned-tab / mstile / theme ✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[params.cover]&lt;/code&gt;：默认行为参数（responsiveImages、linkFullImages）✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新增品牌资源（占位，后续可换）：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;static/apple-touch-icon.png&lt;/code&gt; (180×180) ✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/mstile-150x150.png&lt;/code&gt; (150×150) ✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/safari-pinned-tab.svg&lt;/code&gt;（单色字母 R）✅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assets/images/cover-default.svg&lt;/code&gt;（统一占位封面）✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;给最近两篇文章加 cover：&lt;code&gt;2026-07-21-love.md&lt;/code&gt; 和 &lt;code&gt;2026-07-16-self.md&lt;/code&gt; ✅&lt;/li&gt;
&lt;li&gt;修复 profileMode 启用后首页无文章列表的问题：
&lt;ul&gt;
&lt;li&gt;创建 &lt;code&gt;content/posts/_index.md&lt;/code&gt;（Posts section 页） ✅&lt;/li&gt;
&lt;li&gt;导航菜单加 &amp;ldquo;Posts&amp;rdquo; 项（weight=1） ✅&lt;/li&gt;
&lt;li&gt;Hugo 构建验证：&lt;code&gt;/posts/index.html&lt;/code&gt; 正常生成（16.3KB） ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;profileMode.buttons&lt;/code&gt; 加 Posts / Archives / Tags 三个跳转按钮 ✅&lt;/li&gt;
&lt;li&gt;批量生成文章封面 SVG：
&lt;ul&gt;
&lt;li&gt;写 &lt;code&gt;scripts/gen-covers.ts&lt;/code&gt;（TypeScript + Bun，零依赖）✅&lt;/li&gt;
&lt;li&gt;5 种调色板 + 8 种几何图案 + djb2 hash 选样（tags → 调色板，标题 → 图案）✅&lt;/li&gt;
&lt;li&gt;生成 220 个 SVG 到 &lt;code&gt;assets/images/covers/&lt;/code&gt;（2.6MB，无标题、1200×630）✅&lt;/li&gt;
&lt;li&gt;给 219 篇文章 front matter 注入 &lt;code&gt;cover.image&lt;/code&gt; 字段（YAML）✅&lt;/li&gt;
&lt;li&gt;手动给 &lt;code&gt;2020-05-09-gfs.md&lt;/code&gt;（TOML front matter）加 cover 块 ✅&lt;/li&gt;
&lt;li&gt;跳过 1 篇已有真实封面图（kanon.md） ✅&lt;/li&gt;
&lt;li&gt;Hugo 构建验证通过（266 页面，309ms）✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;无&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;无&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-04-14</title><link>https://sdttttt.online/changelog/2026-04-14/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-04-14/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;替换不蒜子为 Cloudflare Web Analytics&lt;/strong&gt; ✅
&lt;ul&gt;
&lt;li&gt;原因：不蒜子 Referer 问题导致 page PV 统计异常（所有文章显示相同数字 261）&lt;/li&gt;
&lt;li&gt;移除：不蒜子统计代码和配置&lt;/li&gt;
&lt;li&gt;添加：Cloudflare Web Analytics (token: 261d0f0&amp;hellip;f822)&lt;/li&gt;
&lt;li&gt;修改文件：hugo.toml, layouts/partials/custom_footer.html&lt;/li&gt;
&lt;li&gt;将远程 URL 从 HTTPS 改为 SSH 格式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;删除 layouts/_default/single.html&lt;/li&gt;
&lt;li&gt;删除 layouts/partials/busuanzi.html（废弃文件）&lt;/li&gt;
&lt;li&gt;删除 static/avatar.jpg（未被使用）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;不蒜子 Referer 被火狐浏览器设置为首页而非文章页，导致 page_pv 统计串站 ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;提交前先确认日期，避免再犯&lt;/li&gt;
&lt;li&gt;所有改动都要写 claudelog，不需要问用户&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2026-04-01</title><link>https://sdttttt.online/changelog/2026-04-01/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-04-01/</guid><description>&lt;h2 id="维护记录"&gt;维护记录&lt;/h2&gt;
&lt;h3 id="完成的工作"&gt;完成的工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CLAUDE.md 重构&lt;/strong&gt; ✅&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;添加标准前缀和项目概述&lt;/li&gt;
&lt;li&gt;新增常用命令和项目架构章节&lt;/li&gt;
&lt;li&gt;简化 Git 提交规范和维护日志说明&lt;/li&gt;
&lt;li&gt;移除过时信息（模型版本等）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;统一命名&lt;/strong&gt; ✅&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;content/maintenance/&lt;/code&gt; → &lt;code&gt;content/claudelog/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;菜单 &lt;code&gt;ClawCare&lt;/code&gt; → &lt;code&gt;ClaudeLog&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安全审查&lt;/strong&gt; ✅&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查所有文章的敏感信息&lt;/li&gt;
&lt;li&gt;移除 PPPoE 用户名（电话号码）&lt;/li&gt;
&lt;li&gt;移除 RouterOS system id&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="遇到的问题"&gt;遇到的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GitHub 推送被邮箱隐私保护拒绝 ⚠️
&lt;ul&gt;
&lt;li&gt;原因：Committer 邮箱为私有邮箱&lt;/li&gt;
&lt;li&gt;解决方案：临时修改 git user.email 为 noreply 邮箱后重新 amend 提交&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下次建议"&gt;下次建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;考虑将 git user.email 永久设置为 noreply 邮箱，避免每次都遇到此问题&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Blog 维护日志</title><link>https://sdttttt.online/changelog/2026-03-31/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://sdttttt.online/changelog/2026-03-31/</guid><description>&lt;h2 id="维护记录---2026-03-31"&gt;维护记录 - 2026-03-31&lt;/h2&gt;
&lt;h3 id="-任务完成总结"&gt;✅ 任务完成总结&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;例行维护检查&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查网站构建状态 - 正常 ✅&lt;/li&gt;
&lt;li&gt;验证Hugo配置文件 - 正常 ✅&lt;/li&gt;
&lt;li&gt;确认所有文章日期字段 - 正确 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;内容结构优化&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建专门的维护日志页面 &lt;code&gt;/maintenance/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;添加&amp;quot;ClawCare&amp;quot;菜单到主导航栏（权重:2）&lt;/li&gt;
&lt;li&gt;将维护记录与普通blog文章分离&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Git规范修正&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>