Commit Graph
100 Commits
Author SHA1 Message Date
wait4xandGLM-5.3 a761cf8129 feat(papers): 论文内置阅读——arXiv iframe 零再分发合规方案
Agensh(arXiv 2609.26781)在线研读页:/papers/agensh/ 双轨薄壳
_PaperView 共享视图+六词条;信息条含标题/作者/abs 链接/授权声明
(arXiv nonexclusive-distrib 1.0,非本站托管)/下载钮。

合规红线:许可证禁第三方再分发→仓内零 PDF 副本,iframe 直嵌
arxiv(实测无 X-Frame-Options);微信 webview 前置 UA 检测加
is-wechat 类、iframe 不挂 src 零无用请求、兜底卡指引右上角浏览
器打开;非微信 data-src 懒挂载+9s 弱兜底+noscript 兜底。正文
入口卡双轨已渲染。

车道:op-gitea(专项四断言+E2E 34/34);收编复验六断言全过
(iframe/授权/微信降级/en/入口卡/零 PDF)

验证: E2E 34/34;微信 UA 模拟 is-wechat=true src 空 提示在;
      git status 零 .pdf

Spec: none (论文阅读页,车道级交付)

Co-authored-by: GLM-5.3
2026-11-02 08:41:39 +08:00
wait4xandGLM-5.3 bbb52b9e24 docs(post): 删除《单人博客的多智能体工程》(用户拍板)
与三篇工具详解定位重叠,用户选择保留详解三部曲。删除为单点
操作:无 en 版、无 translation-state 条目、无他文内链引用;构
建 42 页、lint 43 页 0 违例复验通过。

验证: pnpm astro build 42 页;content-lint 0 断链 0 缺图 0 配对
      警告;dist 无残留页

Spec: none (内容删除,用户决策)

Co-authored-by: GLM-5.3
2026-11-02 08:39:02 +08:00
wait4xandGLM-5.3 8571acdc8b feat(post): 工具三部曲——spec-harness/pi-mesh 全家桶/Agensh 论文笔记
用户直派车道交付:①Spec Harness 详解(任务包解剖+流水线图,
boundary/verify 实例+12 命令+门禁)②pi-mesh 四件套(stack 图+
合奏循环图+上手安装)③Agensh 论文笔记(三支柱/协作环/规模收
益图,DeLM 血统+issue#13→pi-board 诞生线)。七张自绘 SVG、双
语(en 手写直译 locked:true,禁 TMT 覆盖)。与既有 spec-
workflow-and-mesh(实战复盘向)互补并存。

车道:worker-one(build/lint/外链 curl/视觉两轮 7/7 全绿);收
编复验 E2E 34/34+lint 43 页 0/0/0

验证: pnpm astro build 39 文;E2E 34/34;content-lint 0/0/0

Spec: none (内容三篇,直派车道收编)

Co-authored-by: GLM-5.3
2026-11-01 13:35:27 +08:00
wait4xandGLM-5.3 127f349fb2 feat(gallery): 灯箱 v2.1 十项全量——起飞开合/隐层/侧置 meta/HD
①FLIP 原位起飞/回落(克隆双态矩形插值,关闭回落取缩略图实时
矩形)②背景点击关(containRect 几何判定——img 盒铺满 figure 的
元素链判定失效坑)③chrome 双层淡入+i 键/zoom 自动隐(换片重置)
④相邻预载 ⑤双指缩放 ⑥换片侧向过渡 ⑦缩放指示+首开提示 ⑧竖
图侧置 meta ⑨>1.5x HD 原图交换+404 兜底 ⑩竖拖关闭。reduced-
motion 全豁免;钳制数学保留。

验收三连修:chrome-in 动画 both 填充锁死 opacity(animation:none
掐填充——动画填充压制普通声明的级联陷阱);× 钮独立于双层
chrome 补隐(全隐口径=只剩图,Esc/i 逃逸);视觉终审四问修复
后全过(起飞连贯/侧置成立/隐层纯净/亮暗同判)。

车道:op-artalk(专项逐项+E2E 34/34);收编验收+视觉终审双绿

验证: E2E 34/34;三态隐层 computed 实测(i 隐/复原/zoom 隐全
过);全隐残留零(×/caption/箭头);Esc 逃逸 ✓

Spec: none (灯箱 v2.1 定版,车道级交付)

Co-authored-by: GLM-5.3
2026-11-01 13:21:15 +08:00
wait4xandGLM-5.3 d8997c3c72 feat(gallery): 灯箱 v2 收编——caption 字段全链+21 条视觉轨拟稿
schema caption?:string(人为描述,注释区别 alt 无障碍语义)+
Sveltia textarea 字段+21 条 json 全量上稿(视觉轨看图代拟策展
语气,用户可后台逐条改);GalleryPage 灯箱重构与缩放交互已随
44626f8/54769bc 入库,本笔补数据面。

车道:op-artalk(专项 8/8+E2E 34/34);视觉复核三问 PASS
(舞台纯净/meta 分层/caption 策展语气),唯一需修点=放大态
caption 遮挡→v2.1 ③ zoom 自动隐层已立项在治

验证: E2E 34/34;caption 渲染实测「落日把海与城一齐烫成金
箔…」;content-lint 0/0/0;schema 过构建

Spec: none (灯箱 v2 数据面收编,交互面已在库)

Co-authored-by: GLM-5.3
2026-11-01 12:51:20 +08:00
wait4xandGLM-5.3 44626f8edc fix(lightbox): 回 1x 自动归中+平移四向钳制(用户实测 bug)
用户实测:缩放回 100% 图片不回中显示不全;另放大态可拖飞出舞台。
三修:zoomAt next<=1 归零 translate;applyZoom 平移钳制 |t|≤尺
寸差/2(放大态不变量=图盒覆盖舞台而非缩在视口内);滚轮下限
0.5x→1x(fit 即最小,0.5x 制造偏移态)。mockup 同步三修。

验证: 回 1x transform=none 实测;四角极限拖拽覆盖舞台不变量
全过;E2E 34/34

Spec: none (用户实测 bug 热修,线上 v2+mockup 双修)

Co-authored-by: GLM-5.3
2026-11-01 12:34:11 +08:00
wait4xandGLM-5.3 54769bcfdf docs(research): 灯箱深度美化探索+可交互 mockup(v2.1 提案)
五站研究(PhotoSwipe 源码级核对/medium-zoom/Unsplash◐/图虫◐/Flickr)
→ 六维差距 → v2.1 增强提案十项(P0=原位起飞开合+背景点击关;P1=
chrome 双层淡入/相邻预载/双指缩放;P2=换片过渡/缩放指示/长图侧置
meta/HD 交换/竖拖关闭)+ 明确不做清单八条 + 可交互单文件 mockup
(仓内实拍 5 张、13 项交互可点)。

验证: mockup 引用路径 ../content/photos/ 相对仓根可开;文档引文对
PhotoSwipe defaultOptions 源码核对注记

Spec: none (研究文档+设计预览稿,v2.1 立项待用户拍板)

Co-authored-by: GLM-5.3
2026-11-01 12:09:51 +08:00
wait4xandGLM-5.3 541710b50a feat(post): 单人博客的多智能体工程——spec 与 mesh 实战复盘
四节+结语:19 连发压力日引入 / spec 任务包(blog-5f 实引 verify
原文与已证伪路径)/ mesh 交通规则(契约式下达-预约拦刀实录-守卫
铁律)/ 纪律从事故长出来(验收先探实值-口径错配-五段式运维-视觉
双轨-解封后 SEO 100)。全部数字与命令对档核验。

车道:worker-one(1906 字/schema 过/lint 0 违例);收编补引文精度
(T1 verify 对齐原文四条件)

验证: pnpm astro build 36 页;E2E 34/34;content-lint 0/0/0

Spec: none (内容文章,车道级交付)

Co-authored-by: GLM-5.3
2026-11-01 11:58:42 +08:00
wait4xandGLM-5.3 2b8353837a feat(ops): SEO 解封收尾脚本——default 混合文件逐块精确锚定
default 内四 server 块共存(三面板+博客),文件级 v3 脚本无法区
分;本脚本按各自 server_name 锚定:面板块补 noindex、博客块加
/admin/ 局部;幂等可重跑、备份出加载路径、nginx -t 失败回滚、
nginx -T 配置级终验(不受边缘缓存干扰)。

验证: bash -n 语法过;锚定正则对 default 实文件 server_name 四行
干跑(面板命中/博客精确/互不误中)

Spec: none (用户操作单自动化收尾件)

Co-authored-by: GLM-5.3
2026-11-01 11:17:45 +08:00
wait4xandGLM-5.3 3b65cc47ec fix(ops): seo-unblock v3 补——博客主站判定字符类修正
v2 残留:([[:space:]];|$) 被解析为空格+分号序列而非字符类,-x 兜底
吃行首缩进——admin location 两轮未落。统一 (^|[[:space:];]) 词边界
并显式排除 git 子域。

验证: bash -n 过;判定正则对 /etc/nginx/sites-enabled/default 实文件
干跑(博客行命中/git 行排除双验)

Spec: none (脚本热修 v3 补)

Co-authored-by: GLM-5.3
2026-11-01 11:16:21 +08:00
wait4xandGLM-5.3 ca7d71325c fix(ops): seo-unblock v3——补回判定反转名单制为 include 圈
v2 名单制漏 dpanel/ms365/ddns(同 default 文件 include snippet,剥
离后集体失守 noindex,实弹发现);v3 改凡 include esa-origin-ssl
且非博客主站一律补回,博客判定同步修正字符类。

验证: bash -n 语法过;判定正则对 default 实文件 server_name 复核

Spec: none (脚本热修 v3)

Co-authored-by: GLM-5.3
2026-11-01 11:16:03 +08:00
wait4xandGLM-5.3 d41fcc058c fix(ops): seo-unblock v2——备份出加载路径+主机判定精确 token
v1 实弹暴露两缺陷:①.bak-seo 备份留在 sites-enabled/ 内被 nginx
glob 加载→duplicate default server 全链崩;②grep -w 词边界点号
之误,git.wait4x.online 也被当博客主站注入 admin location。
v2:备份入 /tmp 专属目录+回滚后清理(含 v1 遗留)+server_name
精确 token 判定。

验证: bash -n 语法过;dry-run 计划段与判定正则复核

Spec: none (脚本热修:v1 事故根因双修)

Co-authored-by: GLM-5.3
2026-11-01 11:11:27 +08:00
wait4xandGLM-5.3 50c7595838 feat(ops): SEO 解封一键脚本——预览确认执行自检回滚五段式
nginx 侧全自动(snippet 剥离/内部 vhost 补回/admin 局部/失败回
滚/源站终验),ESA 三动作打印手动步骤;dry-run 先行+确认门。

验证: bash -n 语法过;dry-run 输出与 Phase 5f T1 操作单变更计划一致

Spec: none (用户操作单自动化,Phase 5f T1 收尾件)

Co-authored-by: GLM-5.3
2026-11-01 11:06:58 +08:00
wait4xandGLM-5.3 bb29c8abaf fix(deploy): 构建抓取通道可配+构建日志落盘——ESA 522 事故双根治
- build.sh:BLOG_GIT_URL 环境变量(默认公网,同机构建可指内网
  http://127.0.0.1:13020);每次构建 remote set-url 后 fetch——
  2026-10-26 事故:ESA 边缘对 git.wait4x.online 522 时公网 fetch
  set -e 静默死,staging 冻结 150s+ 无痕
- webhook_receiver.py:构建输出落盘 ~/docker_apps/blog/build.log
  (capture_output 丢弃=黑洞,本次事故"构建为何没跑"零证据);
  与运行副本双同步纪律维持
- 宿主 unit 补 BLOG_GIT_URL 内网通道(配置在 unit 不在仓——主机
  特定值不污染仓库默认)

验证: 手动构建实测 stamp=19b2390+robots.txt 352B 上线;18743 测试
      床恢复 200;smoke 对 staging 软门容忍符合 T1 转硬门前设计

Spec: none (发布链通道与可观测性修复,事故驱动)

Co-authored-by: GLM-5.3
2026-11-01 09:58:47 +08:00
wait4x 19b2390cbf Merge branch 'spec/2026-10-26_blog-5f'
Phase 5f 交付:SEO 解封仓库侧(robots+操作单)+ localePath 三处一刀治与 canonical 全量 + 构建期内容 lint/生产冒烟 + reader 纯文本模式 + 版式基底(流距 token/灰阶降档/字重/focus ring)+ 首屏 tagline + 图库暗衬底 + 代码块窗条 + 书评纸卡(视觉双轨复核 PASS)。

Spec: 2026-10-26_blog-5f
2026-11-01 09:51:27 +08:00
wait4xandGLM-5.3 983527a79d chore(spec): 归档 blog-5f——八任务收敛
Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:51:26 +08:00
wait4xandGLM-5.3 23ea8e5a55 chore(spec): 5.1 归位——全项目检查含升级条件+升级触发双字段
Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:49:52 +08:00
wait4xandGLM-5.3 57f19d855b chore(spec): 5.1 升级条件措辞对齐门禁
Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:42:01 +08:00
wait4xandGLM-5.3 a2395be379 chore(spec): T6 verify 管道笔误修正(-q 无输出喂 grep -v 恒退 1)
Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:40:04 +08:00
wait4xandGLM-5.3 90b8d0fbc0 test(e2e): ? 帮助浮层断言加固——焦点残留竞态三连治
面板测试后焦点可能残留输入域致 ? 键被吞(今日第三次偶发):
Esc 收场+activeElement blur+重试三连,3/3 稳定复现。

验证: E2E_BASE=dist 口连跑三轮 34/34 全绿

Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:34:47 +08:00
wait4xandGLM-5.3 4e24fe510f chore(spec): verify 命令统一 E2E_BASE 本地 dist 口
staging=origin/main 纪律下 spec 分支在途代码的 E2E 只能打本地
dist——T2 canonical 断言对 staging 必挂属预期非缺陷。

Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:31:48 +08:00
wait4xandGLM-5.3 2bfe2ef3db feat(5f): 代码块窗条+书评纸卡(T5/T6 车道收编,视觉复核 PASS)
- T5:≥4 行块挂 .code-win 窗条(JS 数行标类+伪元素渲染:语言
  标签取 shiki pre[data-language]+灰阶三点 #30363d 投影法一点化
  三点,弃红黄绿;条 #161b22 恒深区亮暗同判);单行/2行裸块;
  csge 文 4/18 判定边界实测准确;scoped 够不着 Content 内 pre
  坑用 :global 解
- T6:书评正文圆角纸卡(亮 #f4f4f2/暗 #201d18 暖棕夜灯,零新
  变量吃 T7 已入 tokens;1px hairline 四边抑制长文竖线感;标题
  区外置结构未动)
- 视觉复核(glm-5.3-flash:max 像素级):T5 四项全 PASS(三点实
  采样无红黄绿、条/点/体 github-dark 同族灰、与块顶圆角对齐);
  T6 双态 PASS;暗态窗条未入截图框为残留观察项(恒定 CSS 推定
  成立,判词 /tmp/beauty-impl/verdict.md)
- tasks.md T5 verify 落点修正(src/pages/archives,车道如实报
  告);E2E ? 浮层偶发竞态 2/2 复跑绿

车道:op-artalk(自验 5/5+2/2);收编验收:窗条 4/18+data-lang+
纸卡双态 computed+视觉双卡 PASS

验证: E2E 34/34 PASS(E2E_BASE=dist 口);窗条/纸卡 computed 与
      像素采样全对

Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:31:22 +08:00
wait4xandGLM-5.3 814b138f89 test(e2e): E2E_BASE 环境变量覆写——本地 dist 口验未推代码
staging=origin/main 纪律下,spec 分支在途代码的 E2E 只能打本地
dist;此前 BASE 硬编码迫使车道手工绕(T2 收编验收实锤)。

验证: E2E_BASE=http://127.0.0.1:18924 node tests/e2e.mjs 34/34
      PASS(含新 canonical 断言)

Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:13:44 +08:00
wait4xandGLM-5.3 c307285a25 fix(i18n): localePath 三处双 en 一刀治+canonical 全量(blog-5f T2/T3 车道收编)
- T2:localePath 先归一 zh 再拼前缀(Header/CommandPalette/
  BaseLayout 三处 /en/en/ 同源病根一刀),返回值统一尾斜杠;
  BaseLayout 自指 canonical 全量 35 页;E2E 新增 en canonical
  自指断言(33→34)
- T3:content-lint.mjs 零依赖三检(断链 FAIL/缺图 FAIL/zh-en
  配对 WARN;CONTENT_LINT 逃生门;photos-originals 叠加层与
  /admin 单语两误报已修);prod-smoke.sh 三断言(robots 未落明
  确 FAIL 不静默);build.sh 守卫行挂载(smoke 对 staging 首版
  容忍,T1 robots 上线后转硬门,触发条件注释在案)
- tasks.md verify 字面量 33→34 联动同步(6 处)

车道:op-gitea(verify 六条实录);收编验收:E2E 34/34+产物零
/en/en/+lint 0/0/0 实跑复现

验证: node tests/e2e.mjs 34/34 PASS;! grep -r /en/en/ dist/;
      content-lint 三检 0 违例;bash -n+test -x 过

Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:12:01 +08:00
wait4xandGLM-5.3 8ec1712135 feat(5f): reader 模式+版式基底+首屏 tagline+图库质感(T4/T7/T8)
- T4 reader:html.reader 单 class(去装饰非去内容:隐辉光/图标
  钮/pv 行,ICP 合规底线永留;正文字号+1px 行宽 56ch;入场动效
  关);命令面板 reader 命令+r 键+localStorage;ThemeScript 预绘
  防闪
- T7 基底:--flow-* 五流距变量双轨应用;暗色 hairline 降档;
  页面标题 700→600(裁定 #6 减字重不减号);focus-visible ring
  统一;列表行距 +2px;--paper/--radius-img/--ease-out 入库
- T8:首页 IdCard slot 落 tagline「写作者 · 读者 · 快门按压者,
  拥抱开源。」;图库暗色 4% 轻衬底+圆角统一(裁定 #4 双模式分判)

验证: E2E 33/33;reader r 键触发+辉光 none+刷新保持实测;流距
      computed 0.6em 实算;tagline 渲染实测

Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:09:27 +08:00
wait4xandGLM-5.3 22930cfffd feat(seo): robots.txt 与 SEO 解封操作单(blog-5f T1)
robots 404 补齐(Allow 全站/Disallow admin+draft/Sitemap 行);
操作单三步走:nginx snippet 剥 noindex+内部 vhost 补回+admin 局部
保留、ESA purge+TTL+绕缓存、curl 三验证——用户侧执行入口。

验证: T1 verify 命令全过(robots 三断言+操作单节存在)

Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:06:54 +08:00
wait4xandGLM-5.3 5d18591967 chore(spec): blog-5f 任务清单格式修正
Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:06:02 +08:00
wait4xandGLM-5.3 c1e3d30954 chore(spec): 立项 blog-5f——SEO 解封+功能优化批+美化首批
Spec: 2026-10-26_blog-5f

Co-authored-by: GLM-5.3
2026-11-01 09:05:26 +08:00
wait4xandGLM-5.3 975cf5e58b docs(research): 美化方案并入视觉裁定(§6 七问定案)
两案之争全部落定:首屏=融合(加 tagline 不 banner 化);纸面板=
选圆角纸卡(书评轨);代码块=多行窗条+灰阶三点;图库=亮直贴/
暗轻衬底;热力图=亮灰维持暗色补救(绿系亮色不换);标题 27px
维持(要轻减字重不减号);灰阶 5 档够用(hairline 更淡+行距微
增)。视觉轨 glm-5.3-flash:max,25 张证据图亮暗双态逐问裁定。

验证: 裁定含信心等级+落地注意+双模式分判;与 §5 问题清单一一
      对应

Spec: none (方案定案文档,待用户审批实施)

Co-authored-by: GLM-5.3
2026-10-26 23:07:56 +08:00
wait4xandGLM-5.3 7c5455278b docs(research): 美化专项方案(文本轨,K-S 卡片,视觉待验标注)
现状审计 16 项(间距阶/灰阶档/圆角混用/流距/focus ring/代码块/
纸面板/热力图灰绿之争)× 5 站补充探索(rauno 12 级灰+paco alpha
阶梯+mattdesl 等宽层级+tw93 手写体温+antfu blur-up)× 卡片 K-S
(token 值级改法+computed-style 断言)× 截图问题清单 7 问(交
glm-5.3-flash:max 视觉轨复核中,verdict 合并后定案)。

验证: 截图床 /tmp/beauty-shots 25 张就位;文档 149 行入仓

Spec: none (方案文档文本轨,视觉裁定合并后呈审)

Co-authored-by: GLM-5.3
2026-10-26 22:55:05 +08:00
wait4xandGLM-5.3 6b35356e91 docs(research): 博客优化方案 v2(深度版,scout max 推理车道)
六站补面(rauno/diygod/xeiaso/shud.in/vincentwill/sabrina)+
自查实证(生产 SEO 60-63 根因=noindex 封印+robots 404+ESA 30 天
头缓存;localePath 双 en;Artalk 评论数 API 实测;reader 落点
清单)+ 实施卡片 A-J(文件级落点+断言验收+工作量)+ 三批排期 +
明确不做清单。

验证: 关键断言独立复核(nginx snippet noindex 行/robots 404 生产
      curl 实测一致)

Spec: none (方案文档,待用户批 A/B/C/E 立即批后立项)

Co-authored-by: GLM-5.3
2026-10-26 20:29:05 +08:00
wait4xandGLM-5.3 a9da765cb1 docs(research): 六站博客体验研究与优化方案(scout 车道)
qh1009/nbfox/yongyuan/阮一峰/antfu/innei 六站直连抓取分析:
共性 12 项(阅读时长/双语互链/纯文本模式/评论数前置/周刊化/
EXIF 元数据卡/归档全量/偏好面板等)+ 差异化护城河 6 项 +
Sveltia vs 主流后台差距与补齐方案 + P0-P2 分级建议表。

验证: 文档 125 行入仓可读;来源快照 /tmp/uxstudy/(会话级)

Spec: none (调研文档,方案待用户审阅后立项)

Co-authored-by: GLM-5.3
2026-10-26 20:05:00 +08:00
wait4xandGLM-5.3 3941a34f04 feat(pwa): SW 预缓存自动生成 + Sveltia 瞬间管理(池 4/5)
- gen-sw-precache.mjs post-build:按 dist 产物推导路由重写 dist/sw.js
  预缓存段(AUTO 标记锚定;规则=顶层+/en/ 轨深度≤1、/admin 永不入
  列)——新增顶层页自动进离线包,根治手工清单漏页维护债;实测 19
  路由含 moments 双轨、admin 排除
- build.sh 守卫挂钩(守卫先行纪律);sw.js 源内兜底清单保留
- Sveltia 加 moments 集合:随手发瞬间(text/image 可选+hint 自查条
  件必填、pubDate 日期件、tags、slug 日期模板)——管理后台从只管
  照片扩到内容面第一步

验证: 产物 sw 19 路由断言全过;E2E 33/33 PASS;yaml 解析过;bash -n 过

Spec: none (离线包自动化+后台扩容,车道级交付)

Co-authored-by: GLM-5.3
2026-10-26 20:02:32 +08:00
wait4xandGLM-5.3 3a59edc79a feat(nav): 书架进导航(车道 G)——图标钮出舱钉死右侧
- 评估实数:第 6 项增量 zh +34-44/en +49-51px,旧结构 en 达
  102-125px 滚区且主题钮出首屏——收纳策略=搜索/语言/主题三钮
  移出 nav 滚动区钉死 .nav-actions 常驻右侧,内滚只波及文本项,
  任何宽度三功能钮可见(搜索是移动端主发现路径不可藏)
- nav 序:开源 · 文章 · 书架 · 图库 · 瞬间 · 关于(书架=阅读轨
  延伸紧跟文章);ui.ts +nav_books/kbd_gs_books
- Keyboard g-chord 增 s 键(g s→书架,双轨前缀路由),帮助表
  按既有 kbd_* 词条模式接入
- E2E en 导航断言扩为 ≥6 且含 /en/books/
- 已知余量:en 390-430 文本区滚 ~114px(词条已最短化,再省需砍
  语义留观);zh 全宽段 1-16px 基本无感

车道:op-gitea(八格扫描+E2E 33/33);收编验收:序/双轨 href/
三宽度三功能钮可见性/g s 实跳全过

验证: pnpm astro build exit 0;本地 dist 六项 playwright 全过;
      E2E 33/33(推送后 staging 复验)

Spec: none (导航扩容+出舱策略,车道级交付)

Co-authored-by: GLM-5.3
2026-10-25 22:47:17 +08:00
wait4xandGLM-5.3 73c31ffb2a feat(pwa): 瞬间页安装引导与启动快捷方式(车道 H)
- manifest shortcuts:瞬间直达(/moments/ + 复用 192 图标;lang
  zh 单份中文)
- 安装 CTA:时间线后灰阶虚线小条+ghost 按钮;beforeinstallprompt
  模块级立即绑定(跨软导航存活),三态=可装显示/已装
  (display-mode:standalone 或 iOS standalone)永不显/不支持默认
  hidden;prompt 后 accepted/appinstalled 清引用;文案组件内
  locale 双份
- SW 复核零改动:PRECACHE 已含双轨瞬间、IMMUTABLE 覆盖
  /_astro/ 瞬间图片管线、NEVER_CACHE 拦 pv 走 '–' 降级——三处
  现成正确;离线实证:断网瞬间页 200+时间线完整+pv 降级;图片
  0/0 为数据现状(3 条瞬间均无图),同管线文章页图片离线 1/1
  等价实证成立

车道:op-artalk(自验 11/11);收编验收:CTA hidden 态+离线 200+
标题+manifest shortcuts 解析实测(首轮探针 context API 误用致假
FAIL,selector 复核全过)

验证: pnpm astro build exit 0;E2E 33/33;断网瞬间页 playwright
      实测 200

Spec: none (PWA 增强:shortcuts+CTA+离线实证,车道级交付)

Co-authored-by: GLM-5.3
2026-10-25 22:45:18 +08:00
wait4xandGLM-5.3 215760c38a style(nav): en 开源词条 Open Source→Projects——窄屏免内滚
390-430px 尾部主题钮原本需导航内滚一滑才可见;短词省 35px,
三宽度全直显(用户拍板)。页面标题与热力图词条不动,仅导航。

验证: en@390/410/430 主题钮右缘全在屏内+页面零溢出实测;E2E
      33/33 PASS

Spec: none (单词条更名,宽度收益实测)

Co-authored-by: GLM-5.3
2026-10-25 22:32:02 +08:00
wait4xandGLM-5.3 55cfc73cb7 feat(interact): 访问量小字+瞬间时间线动效(车道 F)
- pv:ArtalkComments/MomentsPage 组件级独立 POST /artalk/api/v2/
  pages/pv(页面加载即计,不等懒加载;POST 天然绕 ESA 边缘缓存);
  init 加 pvAdd:false 防双计(默认 true 此前评论加载一直在默默计
  数——mian-sha pv=2 即此来源);双轨 pageKey 分开计数
- 瞬间动效:.tl-item IntersectionObserver 进入视口一次性渐显
  (opacity 0+8px);降级链=data-mom-anim 前置标记——无 JS/
  reduced-motion/无 IO 三情形标记缺席则初始隐藏不生效;软导航
  astro:page-load 重注册
- Artalk 后台真根因修复(车道侧宿主件,非仓内):容器日志实锤
  登录从未成功过(12+ 次 401/400,非会话丢失)——CLI 重置密码+
  凭据入 INITIAL-CREDENTIALS.txt 0600+login_timeout 3d→30d+
  容器重启;API 全链 200 实测
- 遗留(ESA 侧归 orchestrator):ESA 缓存 /artalk/api GET 响应
  (stats Age 头实锤),需边缘规则绕缓存

车道:op-artalk(自验 8/8 含 route mock/reduced-motion/无 JS 三降
级);收编验收:pv 元素+动效标记+reduced-motion 豁免实测

验证: pnpm astro build exit 0;E2E 33/33;三降级链 playwright 实测

Spec: none (pv+动效,车道级交付)

Co-authored-by: GLM-5.3
2026-10-25 22:19:41 +08:00
wait4xandGLM-5.3 d00ca7e447 fix(i18n): 语言轨导航修复+重排,热力图切 GitHub(车道 E)
- 真 bug(用户实测:切 en 后点板块回中文):Header nav href 硬编码
  zh 路径,curLocale 只喂了词条——localeOf(Astro.url) 构建期自推断
  +五项+品牌链接全轨化(brand 原指 / 同病同修),aria 同步
- 导航重排(用户拍板):开源 · 文章 · 图库 · 瞬间 · 关于;瞬间
  新进导航;移动 320-430×双轨八格页面级溢出全 0(内滚阈值 350→450
  +中段地板再收;en 390-430 尾部约 55px 靠内滚——'Open Source'→
  'Projects' 改名可省 35px,留用户拍板)
- 热力图纯切 GitHub(用户拍板):GraphQL contributionsCollection
  53 周窗口(上海日界);token=宿主 0600 github-token.txt,缺位→
  WARN 降级样例数据(当前站点即样例);三级回落 token→样例→空网格
- E2E 新增 2 断言:en 页 nav 全 /en/ 前缀+brand 指 /en/(本 bug
  的回归测试)

车道:op-gitea(自验 33/33);收编验收:en/zh 序实测+三宽度溢出 0+
E2E 33/33(本地 dist 口径——staging 未含未推代码为既定纪律)

验证: pnpm astro build 34 页 exit 0;node tests/e2e.mjs 33/33;
      en/zh 导航序与 href 前缀 playwright 实测

Spec: none (Header 修复+重排+热力图换源,车道级交付)

Co-authored-by: GLM-5.3
2026-10-25 22:19:40 +08:00
wait4xandGLM-5.3 363cc616f7 feat(motion): 动效层三件——背景辉光/入场/心跳,页脚撤双入口
- 背景鼠标辉光:ink 色 4% 径向渐变跟随(pointer:fine×非
  reduced-motion 才有 JS,raf 节流 document 级监听 VT 存活)——
  丙灰阶语言的"活背景",触屏/减动效自动隐藏
- 正文入场 rise-in 12px/0.4s(VT 换页自然重放)+ 列表行悬停
  1px 微浮;全量 prefers-reduced-motion 豁免
- 首页"最近心跳":构建期拉 blog 仓最新 commit(gitea API 8s 超时
  静默降级),脉冲点+相对时长——本站自己的脉搏
- 页脚撤「装备/制作」入口(页面保留,用户决策:只删入口)
- E2E 加固:g-chords 修好后 location.href 与 goto 竞态(en 页弦
  导航迟到提交打断 goto)——中断重试模式
- 过程教训:str.replace 静默无操作再犯(锚点瞄错组件文件)——
  脚本未进产物却报"全落地",replace 必须 assert 配对 grep 产物

验证: --mx 鼠标双跳 15.6% 实测跟随;E2E 31/31 PASS(竞态重试后
      确定性);构建 34 页 exit 0

Spec: none (动效层+页脚撤口+测试加固,车道级交付)

Co-authored-by: GLM-5.3
2026-10-25 22:09:41 +08:00
wait4xandGLM-5.3 0b6524f53c perf(home): 首屏 eager+关键 CSS 内联,Lighthouse 伪影根因修毕
- 车道 D 三件收编(op-gitea):①index.astro 首两图 eager+首图
  fetchpriority=high(Image 默认 lazy 曾压 LCP 至 6.4s,好模式现
  1.3s)②inline-home-css.mjs:BaseLayout 11KB 内联首页 head(省
  发现+下载跳)③build.sh 守卫挂钩
- 诊断结论入档:home 中位漂移根因=测试床伪影(python server 不压
  缩,裸传 67KB vs 生产 gzip 9.2KB;lantern 对未压缩 HTML 流式归因
  双峰 99↔165ms 翻转出两个世界)——gzip 等价口径中位 100
  (FCP 0.9-1.1s/LCP 1.3-1.4s/TBT 0/CLS 0)
- 测试床转正:gz-server.py 泛化入仓(ThreadingHTTPServer+gzip
  [端口 目录] 参数化)——兼治 SW 预缓存风暴竞速(单线程 server
  曾把 E2E /gallery/ networkidle 饿死,实锤于收编验收)
- E2E serviceWorkers:'block':SW 有专属测试,站点 E2E 求确定性
- 三连否定留档:SW✗/css链✗/子集内联 v3✗(6×63 反例钉死,已
  回滚)——残尾 20% 离群属 lantern trace 抖动,采中位+多轮

车道:op-gitea(过程三连否定+测试床移交);收编验收:内联 10KB
实出+首图 eager 实证+E2E 31/31(SW 屏蔽后确定性复现)

验证: gz 测试床 18743 gzip 10KB(生产等价口径);node tests/e2e.mjs
      31/31 PASS;构建+守卫链复跑

Spec: none (性能三件+测试床转正,车道级交付)

Co-authored-by: GLM-5.3
2026-10-25 21:37:38 +08:00
wait4xandGLM-5.3 71b8985c17 fix(keyboard): g g chord 不可达——路由判断先于武装分支
Phase 1 潜伏缺陷:g 键分支先于路由检查 return,第二击 g 永远
重新武装,routes['g'](gallery)全站不可达。修序即愈,g→g 自身
是合法 chord。en 轨随上一提交前缀化后同步受益。

验证: chord 矩阵 5 检(zh/en × g g/g h/g m 实跳目标全中);
      E2E 31/31 PASS

Spec: none (keydown 分支修序,矩阵测试入档)

Co-authored-by: GLM-5.3
2026-10-25 21:18:58 +08:00
wait4xandGLM-5.3 3e73fe957e fix(i18n): g-chords 导航目标随轨前缀化——en 页 g h 跳 /en/
C 车道已知边界补刀:routes 表构建期按 locale 前缀化,en 页
g-chords 不再跳中文轨。

验证: playwright 双轨 g-chords 实跳(en g h→/en/、zh g g→
/gallery/);E2E 31/31 PASS

Spec: none (五路由前缀化一行模式,C 车道边界补刀)

Co-authored-by: GLM-5.3
2026-10-25 21:14:56 +08:00
wait4xandGLM-5.3 810cf44d3d fix(deploy): receiver 改调构建仓自己的 build.sh——发布链执行源归一
- 架构债(20:31 事故根因层):receiver 此前执行工作树
  infra/deploy/build.sh,车道在途半成品状态可断生产链——改为
  build-repo/infra/deploy/build.sh(origin/main 硬跟版本),
  构建仓缺失时首克引导(匿名 clone)
- 双副本纪律入档头注:仓内源与 ~/docker_apps/blog/ 运行副本改一
  须同步二并 restart(systemd 跑的是运行副本,漂移即事故)
- 深意:构建脚本演化自此走 git 评审流,main=可部署铁律闭环

验证: 签名 POST 端到端实测(HMAC 构造无 git 污染):202 queued →
      90s 后 stamp=1fdd0cc;healthz 200;单元 active

Spec: none (发布链架构修正:单执行源切换+端到端实测)

Co-authored-by: GLM-5.3
2026-10-25 21:12:48 +08:00
wait4xandGLM-5.3 0c569b0b31 feat(i18n): Keyboard 帮助表全量双语——构建期 localeOf 自推断
- 10 词条+标题+hint 全走 t(key, locale)(ui.ts 新增 kbd_* 11 键,
  零文案字面量复制);en/terminal 车道的运行时 replaceChildren
  补丁退役(构建期已渲染正确文案)
- hint 行精简:删过程性标注"Phase 4 上线 ~"(~ 并非实际绑定,
  有误导),改 /terminal 彩蛋引导语
- 已知边界另车道:g-chords 路由表仍 zh 路径(en 页 g h 跳 / 而非
  /en/)——routes 表 locale 化待办

车道:op-artalk(自验 7/7:zh/en 深层路由自感知/inField 旁路
(?正常入框不弹层)/blur 回归);收编验收 dialog 作用域复验全过
(首验 2 FAIL 均系验收方断言姿势:大小写+全 body 作用域,非车道
缺陷——验收先探实值再断言的教训第三次入档)

验证: pnpm astro build 34 页 exit 0;E2E 31/31 PASS;en 深层路由
      /en/terminal/ 帮助表纯英文实测

Spec: none (组件双语化,车道级交付)

Co-authored-by: GLM-5.3
2026-10-25 21:12:48 +08:00
wait4xandGLM-5.3 1fdd0cc162 perf(build): 按页字体 CSS 子集化 + gallery 响应式图片阶梯
- subset-font-css.mjs post-build:扫每页文本(含 attr)+ ui.ts 全
  词条 + Latin/标点永保三防线,命中 unicode-range 才留 @font-face,
  子集按内容哈希去重共享,孤儿原 CSS 清出——全站字体 CSS 6.7→2.6MB
  (61%),mian-sha 声明 101→48/家族
- build.sh 挂载(存在性守卫:车道在途文件不断发布链——20:31 事故
  纪律)
- GalleryPage srcset 阶梯 320/560/720→480/800/1200(首图
  fetchpriority 维持)
- Lighthouse:mian-sha 61→78、gallery 74→79、en 70→83、terminal
  74→88(A11y/BP/SEO 持平;unused-css 370→36KB)
- 过程坑:v1 重写 href 丢前导斜杠致嵌套页 404——v2 只换文件名

车道:op-gitea(A/B 渲染等价证明:serif 916 字 0-miss;分数复采
入 /tmp/e2e-shots/lighthouse-ap/);收编验收:serif 字形
fonts.check 实测 true、srcset 产出、E2E 31/31

验证: pnpm astro build + subset 跑通 35 页;E2E 31/31 PASS;
      staging 部署后 stamp 复核

Spec: none (构建管线性能二连:post-build 子集化+图片阶梯)

Co-authored-by: GLM-5.3
2026-10-25 21:05:15 +08:00
wait4xandGLM-5.3 aa050d8035 feat(pages): /stack 装备页 + /colophon 制作页(双语)与页脚入口
- colophon:五节灰阶数据表讲"这站怎么造的"(build/visual/写作流
  /i18n/features,变字体提速等实数入表)
- stack:homelab/自托管/站点依赖/日常四节(版本号实读
  package.json;硬件细节与 daily 清单 TODO(下轮) 待补)
- Footer 顺手修真缺陷:locale prop 机制存在但从未透传,en 全站
  页脚实为 zh 文案——改 Astro.url.pathname 构建期自推断(localeOf
  复用,显式 prop 优先),零 BaseLayout 改动
- 页脚「装备 · 制作」双入口(en 轨自动 /en/ 前缀)

车道:op-artalk(自验 15/15:双页双语桌面+390 溢出断言+Footer
双轨感知);收编验收 6 检全过

验证: pnpm astro build 34 页 exit 0;双页双语 390 视口无溢出;E2E
      31/31 PASS

Spec: none (两静态页+Footer 修复,车道级交付)

Co-authored-by: GLM-5.3
2026-10-25 20:51:02 +08:00
wait4xandGLM-5.3 a347ce8baf feat(pwa): 全站 PWA 化——manifest+Service Worker+图标三件
- manifest.webmanifest:standalone 双语描述、192/512/maskable 图标
  (favicon.svg 经 sharp 直出)
- sw.js 保守策略:HTML network-first(不比 ESA 边缘更激进,防双重
  陈旧)+ install 预缓存 16 核心路由(SSG 全站 <1MB,全站离线可读)
  + /_astro|fonts|photos 不可变 cache-first + 评论 API/CMS 绕行
- BaseLayout:manifest+双 scheme theme-color+apple-touch-icon+一次性
  SW 注册(controller 守卫×VT 不重跑双保险)
- 踩坑入档:python 单线程 http.server 拖慢 16 并发预缓存,验收须等
  缓存键数稳定(曾误判 install 未跑);allSettled 静默是调试黑洞,
  install 失败必须探针可见

验证: 离线导航 6 页全 200(预缓存 16 条 500ms 就绪);node
      tests/e2e.mjs 31/31 PASS;manifest/sw/图标三路由 200

Spec: none (PWA 基建:manifest+SW+图标,离线矩阵入档)

Co-authored-by: GLM-5.3
2026-10-25 20:49:16 +08:00
wait4xandGLM-5.3 8fe9455c23 perf(fonts): 思源黑/宋切换变字体——CSS 345→106KB 全站提速
- @fontsource-variable/{noto-sans,noto-serif}-sc 替换静态三档:
  wght 轴单文件覆盖 400-700(font-face 303→101/family)
- tokens 字体栈前插 Variable 族名(旧静态名留兜底链)
- 全站 Lighthouse:home 64→70 / en 73→82 / terminal 79→84 /
  gallery 68→74,FCP 4-6s→2-3.5s(主线程解析减半)
- 已知取舍:mian-sha 字节反增(变体切片 2-4x,55 片 3.4MB)但
  FCP 关键路径不受影响(swap);按页字体 CSS 子集化立为后续包
- E2E 加固:软导航主题切换断言加 VT 竞态重试(今日第二次偶发,
  隔离 3/3 过=测试姿势问题非产品缺陷)

验证: node tests/e2e.mjs 31/31 PASS;本地 dist Lighthouse 五页型
      对比(lh-var vs lh-local 两轮全量审计)

Spec: none (性能二轮:字体管线单点换包,Lighthouse 前后对照已入档)

Co-authored-by: GLM-5.3
2026-10-25 20:31:54 +08:00
wait4xandGLM-5.3 b18d019a2e feat(terminal): /en/terminal 双语薄壳——命令行为零分叉
- terminal.astro 抽 locale prop:frontmatter 静态文案 + script 层
  zh/en 双 DICT(命令描述/ls 路由表/whoami/exit 目标),双轨共享
  一份 chunk;路径守卫 Set{/terminal,/en/terminal}
- en/terminal.astro 四行薄壳 <TerminalPage locale="en" />
- Keyboard 帮助表 terminal 词条按 /en/ 前缀改写(其余表格文案
  双语化留给独立车道,注释已标)

车道:op-artalk(自验 15/15);收编验收 build+双轨 playwright 过——
首验 FAIL 系验收方误用 textContent 吞了内联脚本中文注释,innerText
复核零中文,非车道缺陷

验证: pnpm astro build 30 页 exit 0(双产物);双轨 playwright 验收
      (en 可见文案零中文/ls en 路由表/zh 回归/Keyboard 词条)全过

Spec: none (页型双语薄壳,车道级小活)

Co-authored-by: GLM-5.3
2026-10-25 20:24:13 +08:00
wait4xandGLM-5.3 f57b1bde5f feat(admin): Sveltia 管理台正式收编——页脚入口与使用指南
- Footer「管理」入口(data-astro-reload 绕 ClientRouter,官方集成守则)
- docs/管理台.md:Token 登录/上传流/纪律(title 必填、内建优化禁用的
  why、删除连带实测行为)/已知限制——试水期结论"值得留"转正

验证: pnpm astro build exit 0;dist 页脚含 /admin/ 入口

Spec: none (收编小特性:入口+文档,单提交意图)

Co-authored-by: GLM-5.3
2026-10-25 20:16:40 +08:00
wait4xandGLM-5.3 e57c853f20 fix(theme): 软导航主题回退——ThemeScript 补 data-astro-rerun
- 病根:ClientRouter 软导航换 html 属性把 data-theme 抹回无主题态,
  而内联脚本默认仅首次执行(Astro 规矩:重跑须显式 data-astro-rerun)
  ——切换明暗后一切栏目即回系统默认(用户实测报告)
- 写入端审计:Header/Keyboard t/命令面板/终端四入口均写同一
  localStorage key,无第二套实现,病灶唯一
- E2E 补软导航持久断言(原仅测 reload,漏了真实 bug 场景)

验证: node tests/e2e.mjs 31/31 PASS(软导航后=dark 断言新增)

Spec: none (线上热修:单属性缺陷 + 回归断言)

Co-authored-by: GLM-5.3
2026-10-25 20:15:06 +08:00
wait4x a10141dfd8 Merge branch 'spec/2026-10-25_add-blog-5c' (archive close)
Spec: 2026-10-25_add-blog-5c
2026-10-25 20:02:12 +08:00
wait4xandGLM-5.3 bcfd0c35bf chore(spec): 归档 add-blog-5c——五任务收敛(spec.md 补全后)
Spec: 2026-10-25_add-blog-5c

Co-authored-by: GLM-5.3
2026-10-25 20:02:11 +08:00
wait4x 48a2383efa Merge branch 'spec/2026-10-25_add-blog-5c' (archive close)
Spec: 2026-10-25_add-blog-5c
2026-10-25 19:56:43 +08:00
wait4xandGLM-5.3 709b18eb45 chore(spec): 归档 add-blog-5c(5.1 模板占位修正后收敛)
Spec: 2026-10-25_add-blog-5c

Co-authored-by: GLM-5.3
2026-10-25 19:56:43 +08:00
wait4x dd1a59bc21 Merge branch 'spec/2026-10-25_add-blog-5c'
Phase 5c 交付:裸 clone 构建(Sveltia 自动上线)+ 移动端全站溢出修复(Header clamp 流式化)+ Lighthouse Perf 62→88 字体优化 + en/archives 补页。

Spec: 2026-10-25_add-blog-5c
2026-10-25 19:52:36 +08:00
wait4xandGLM-5.3 ad731aea69 chore(spec): 归档 add-blog-5c——五任务收敛
Spec: 2026-10-25_add-blog-5c

Co-authored-by: GLM-5.3
2026-10-25 19:52:36 +08:00
wait4xandGLM-5.3 93992cb515 refactor(header): 断点阶梯升级为 clamp 流式自适应(用户设计诉求)
- 430/370 两档阶梯替换为 clamp() 连续收缩(字号/间距/图标钮随视口
  线性插值)——任意宽度合身,不再逐档打补丁
- <350px 超窄兜底:导航内滚(scrollbar 隐藏)代替页面晃动——页面级
  scrollWidth 恒等视口,任何机型不破版
- 设计哲学入档:布局层早已流式(auto-fill/容器查询),正文排版断点
  是可读性台阶(有意),Header 是最后的固定像素残留——本次归流

验证: 密集扫描 44 检 × 11 宽度档(320-768)全过;E2E 30/30 PASS

Spec: 2026-10-25_add-blog-5c

Co-authored-by: GLM-5.3
2026-10-25 19:49:53 +08:00
wait4xandGLM-5.3 2802278be6 fix(mobile): 移动端全站横向溢出修复——Header 三档断点与长词断行
- B1(移动审计 blocker):Header 7 项一行在 390px 溢出 51-88px(主题钮
  被推出屏、整页可晃——用户实测报告的"布局存在问题"实锤)→ 430px
  断点收紧(字号/边距/间隙/图标钮 32px)+ 370px 末档(en Open Source
  长词)
- M1:.prose-tech 补 overflow-wrap:break-word(裸长 URL 曾撑破 88px,
  只给了书评轨是漏)
- m1:ProjectWall 标题 i18n(en 页曾硬编码中文)+ locale prop
- m3:列表标题两行钳制(en 长标题截断丢信息);m4:页脚/pn/书架
  触控目标 ≥24px
- 已知边界:320px 超窄屏 en 仍溢 23px(超出现实机型范围,记录不改)

验证: 移动溢出回归 390/360 × 12 页全过(scrollWidth 断言,曾全站
      51-118px);E2E 30/30 PASS;技术文长 URL 页 +88→0

Spec: 2026-10-25_add-blog-5c

Co-authored-by: GLM-5.3
2026-10-25 19:46:06 +08:00
wait4xandGLM-5.3 147f00fe1c perf(fonts): 字体按轨瘦身与非阻塞加载——Perf 62→88(Lighthouse P0)
- BaseLayout:8 个字体包 CSS 改 ?url + preload/onload 非阻塞(614 个
  @font-face 曾 708KB 渲染阻塞,Lighthouse P0 元凶);noscript 回退
- 按轨条件挂载:serif+文楷仅 reading 轨(书评/书架——BooksPage 传
  track),tech 页省 299 块 @font-face
- Gallery LCP:前 3 张 eager+fetchpriority=high(曾全 lazy 10.3s)
- 对比度:PostList .track 与 .post-cat 提 --ink-2(A11y P1)
- favicon.svg 补缺(BP 扣分项)
- 教训:python replace 再犯静默失配(车道改过导入顺序)——已用 edit
  工具精确替换 + assert 意识持续强化

验证: 本地 dist lighthouse 首页 Perf 62→88,render-blocking 无;
      FCP 2.5s/LCP 3.2s;E2E 30/30 PASS(staging)

Spec: 2026-10-25_add-blog-5c

Co-authored-by: GLM-5.3
2026-10-25 19:32:53 +08:00
wait4xandGLM-5.3 f8add5ad15 feat(deploy): 裸 clone 构建改造与 en/archives 补页(T1/T4)
- build.sh:构建源改 ~/docker_apps/blog/build-repo(fetch+reset 硬跟
  origin/main,匿名 fetch)——线上=远端 main 确定性闭环,Sveltia 保存
  即自动上线生效;stamp 记录构建 commit;node_modules 留仓内做增量
  (loader 逻辑变更时须清 node_modules/.astro——EXIF 教训已注)
- en/archives/index.astro 补缺(此前 404):PostList locale 复用 +
  译题映射;三级目录 import 深度坑再犯一次(已修)

验证: bash infra/deploy/build.sh → staging 29 html @0e792a7(裸 clone
      实测);build 本地 28+1 页;E2E 30/30 PASS

Spec: 2026-10-25_add-blog-5c

Co-authored-by: GLM-5.3
2026-10-25 19:23:40 +08:00
wait4xandGLM-5.3 ad5f9d3d95 chore(spec): 创建 add-blog-5c 任务包(五任务)
Spec: 2026-10-25_add-blog-5c

Co-authored-by: GLM-5.3
2026-10-25 19:19:26 +08:00
wait4xandGLM-5.3 0e792a70cc chore(spec): 归档 add-terminal-books-admin——五任务四车道收敛
Spec: 2026-10-25_add-terminal-books-admin

Co-authored-by: GLM-5.3
2026-10-25 13:46:56 +08:00
wait4xandGLM-5.3 cef648db9a fix(exif): 构建 EXIF 提取全线复活——拦截式 loader + 数据仓清障
- 根因双层:①包装层 post-load 的 store.set 被 Astro 7 解析层静默丢弃
  → 改拦截 baseLoader 写入内联增强(enrich 在 set 时机完成)
  ②内容层增量同步的持久化数据仓复用旧空条目 → rm node_modules/.astro
  全量重提取(loader 注释已记此坑:改 loader 逻辑须清数据仓或换 loader 名)
- 图库 19/21 张参数条实出(镜头/光圈/快门/ISO/焦距/时间)
- 同时并入 op-gitea T3 交付:public/admin/ 三件(Sveltia 0.252 pinned
  自托管)+ gitea [cors] 台账;其发现的 title omit 坑已在 config 修正

验证: build 28 页;dist/gallery data-exif 19 条含 ISO;E2E 30/30 PASS
      (staging 29 html)

Spec: 2026-10-25_add-terminal-books-admin

Co-authored-by: GLM-5.3
2026-10-25 13:46:56 +08:00
wait4xandGLM-5.3 40346c3f21 fix(books): 泥潭策展语与回退契约实现;自托管仓星标语义
- BooksPage 实现 schema 注释承诺的 description 回退(正文首段去记号
  取 60 字)——视觉复核抓到的"文档说了代码没做"缺口
- 泥潭补人工策展语(回退之上);自托管仓星标改 self-hosted 徽标
  (gitea 无 star 真值,★0 语义突兀——视觉复核次要备注)

验证: build 28 页 exit 0;dist/books 含泥潭策展语;dist/opensource
      self-hosted 徽标与 ★57 并存实测

Spec: 2026-10-25_add-terminal-books-admin

Co-authored-by: GLM-5.3
2026-10-25 13:46:56 +08:00
wait4xandGLM-5.3 ce587236e2 test(e2e): staging 服务端口 18742→18743(让位 Sveltia 冒烟)
18742 被 op-gitea 车道 T3 从 public/ 起的服务占用(团队协作:车道
临时服务与主验证端口分离的教训,preflight 同步迁移)

验证: node tests/e2e.mjs 30/30 PASS(18743 实测)

Spec: 2026-10-25_add-terminal-books-admin

Co-authored-by: GLM-5.3
2026-10-25 13:46:56 +08:00
wait4xandGLM-5.3 90574edce7 feat(pages): /books 书架与 /opensource 开源页——导航第四项(T2/T5)
- BooksPage:色脊排版卡(mood 竖脊+文楷书名+作者+三行截断策展语)
  × 年份分组规整网格;zh/en 双路由;阅读轨标题旁「书架 →」入口
- /opensource:全量仓墙(ProjectWall 加 limit prop,首页精选 6 不变)
  + 热力图 + 本站开源叙事段;导航第四项「开源」(i18n nav_opensource)
- 五书 frontmatter 策展字段(含泥潭=刘楚昕)

验证: build 28 页 exit 0;books/opensource zh/en 五路由产物断言过;
      五书卡与作者 grep 在案;E2E 30/30 PASS

Spec: 2026-10-25_add-terminal-books-admin

Co-authored-by: GLM-5.3
2026-10-25 13:46:56 +08:00
wait4xandGLM-5.3 3bd8369eda feat(books): 五书策展字段与泥潭作者;顺带入 T1 终端页文件
- schema 加 description/bookAuthor 可选;五书补字段(一句话策展评语
  + 原书作者;泥潭=刘楚昕 用户提供)
- 任务包入 T5 /opensource 独立页(用户追加需求,方案 A 复用扩展)
- 因 add -A 顺带包含 op-artalk 车道已自验 12/12 的 src/pages/terminal.astro
  (T1 交付物,验收随后)

验证: grep bookAuthor content/posts/*.md 五篇命中;schema 可选字段
      对既有构建零破坏

Spec: 2026-10-25_add-terminal-books-admin

Co-authored-by: GLM-5.3
2026-10-25 13:46:56 +08:00
wait4xandGLM-5.3 b789d30a5d chore(spec): 创建 add-terminal-books-admin 任务包(Phase 5b 四任务三车道)
Spec: 2026-10-25_add-terminal-books-admin

Co-authored-by: GLM-5.3
2026-10-25 13:46:56 +08:00
wait4x f1ee07838d Merge branch 'spec/2026-10-25_add-media-and-polish'
媒体支持(图/视频/音频+写作指南)+ 灯箱胶囊按钮 + 评论区美化(Artalk.css 缺陷修复与 tokens 主题);六任务机器验证+视觉双轮收敛。

Spec: 2026-10-25_add-media-and-polish
2026-10-25 12:26:56 +08:00
wait4xandGLM-5.3 6da2b7cecf chore(spec): 归档 add-media-and-polish——六任务三车道收敛
spec_verify --all 六项同指纹 exit=0;视觉终审+复验双轮 可上线

Spec: 2026-10-25_add-media-and-polish

Co-authored-by: GLM-5.3
2026-10-25 12:26:56 +08:00
wait4xandGLM-5.3 76b6b6b022 fix(polish): 视觉终审两阻塞+两建议——胶囊真挂载与图注字面量化
- 灯箱:.lb-act class+图标真实挂载(T1 的 python replace 对 i18n 化后
  文案静默失配成死代码——replace 无 assert 的教训);清 560px 媒体
  查询内整段重复规则
- 样张图注:斜体行内裸 <video>/<audio> 字面量化(markdown 渲染成
  真元素:黑盒+吞文字);指南加图注警示
- Artalk 建议项:输入框边界加深一档(--line 白底近不可见);暗色
  发送按钮换深字(白字压浅底 2.4:1 低于 AA)

验证: build 23 页;样张页 video 元素 2→1(幽灵元素消失);
      node tests/e2e.mjs 30/30 PASS;复验图 18/19 待视觉确认

Spec: 2026-10-25_add-media-and-polish

Co-authored-by: GLM-5.3
2026-10-25 12:20:42 +08:00
wait4xandGLM-5.3 80ab3ee3f3 feat(atalk): 评论区美化——CSS 加载缺陷修复与 tokens 主题接管(T2)
- 缺陷修复(op-gitea 车道发现):Artalk JS 不自动注入样式,评论区自
  上线起一直跑 UA 默认样式——mount() 补挂 dist/Artalk.css,onload 后
  init(失败降级不阻塞评论可用)
- 主题接管:18 个 --at-color-* 变量全套映射站点 tokens(var() 引用,
  明暗随 [data-theme] 自动翻转);init 锁 darkMode:false 防双暗叠加
- 气质层:8px 圆角/squircle 头像/时间戳与 UA 转 JetBrains Mono/
  正文链接 underline 纪律/弹层选择器 body 前缀提特异性

验证: build 23 页 exit 0;--at-color-main:var(--accent) 入产物;
      生产页注入同款 CSS 探针矩阵全中(亮 #3454d1/暗 #8ea2ff);
      双态截图 /tmp/e2e-shots/at-polish-{light,dark}.png 待视觉终审

Spec: 2026-10-25_add-media-and-polish

Co-authored-by: GLM-5.3
2026-10-25 12:08:10 +08:00
wait4xandGLM-5.3 bbbd4ef11c chore(spec): T1/T3/T4/T5 勾选——媒体支持四任务闭环
Spec: 2026-10-25_add-media-and-polish

Co-authored-by: GLM-5.3
2026-10-25 11:54:30 +08:00
wait4xandGLM-5.3 a4388df35e fix(media): 详情页路径全量+prev/next 滤 hidden(op-artalk 车道指正)
- getStaticPaths 恢复只滤 draft:hidden 样张需出静态页(可访问不列出)
- prev/next 从 hidden 过滤后的导航数组取位:真实文章上下篇不链样张

验证: build 23 页;media-sample zh/en 双页产物在;/media/ 绝对引用 ✓;
      首页与 RSS 零 media-sample 泄漏

Spec: 2026-10-25_add-media-and-polish

Co-authored-by: GLM-5.3
2026-10-25 11:53:22 +08:00
wait4xandGLM-5.3 71a799bd97 feat(media): hidden 标签过滤与指南 public/media 约定(T5 补)
- 首页/归档/RSS(zh+en)集合查询统一 draft+hidden 双过滤——样张
  永久保留为可访问不列出的活样例(回归测试资产)
- 写作指南视音频段更正:raw HTML 相对路径不走资产管线(实测),
  媒体放 public/media/{slug}/ 用绝对 /media/ 引用,与仓外 store
  同命名空间

验证: pnpm astro build exit 0(hidden 过滤后样张退出列表与 RSS)

Spec: 2026-10-25_add-media-and-polish

Co-authored-by: GLM-5.3
2026-10-25 11:50:53 +08:00
wait4xandGLM-5.3 dcc20e9fb3 docs: 写作指南——三媒插入语法与体积纪律(T5)
Spec: 2026-10-25_add-media-and-polish

Co-authored-by: GLM-5.3
2026-10-25 11:45:39 +08:00
wait4xandGLM-5.3 19ffcf180b feat(media): 灯箱动作胶囊化与正文三媒样式段(T1/T3)
- 原图/下载:裸链 → 与 lbnav 同语言的胶囊按钮(图标+文字+暗底描边)
- global.css 媒体段:正文 img 圆角限宽、*斜体独立段*图注约定、
  video/audio 全宽样式(raw HTML 直书方案,指南随后)

验证: pnpm astro build 21 页 exit 0

Spec: 2026-10-25_add-media-and-polish

Co-authored-by: GLM-5.3
2026-10-25 11:45:06 +08:00
wait4xandGLM-5.3 b0b7e2cd00 chore(spec): 创建 add-media-and-polish 任务包(六任务三车道)
Spec: 2026-10-25_add-media-and-polish

Co-authored-by: GLM-5.3
2026-10-25 11:43:33 +08:00
wait4x b9dbece2df Merge branch 'spec/2026-10-25_fix-site-polish'
上线四缺陷修复(明暗/图库/评论/书评宋体)+ 三轮视觉打磨 + E2E 30 项与视觉四轮复核闭环。

Spec: 2026-10-25_fix-site-polish
2026-10-25 11:30:41 +08:00
wait4xandGLM-5.3 59b7baae51 chore(spec): 归档 fix-site-polish——四缺陷+双轨验证六任务收敛
Spec: 2026-10-25_fix-site-polish

Co-authored-by: GLM-5.3
2026-10-25 11:30:40 +08:00
wait4xandGLM-5.3 86e8009f34 fix(polish): en 首页按 zh 全结构重写——PostList locale 化与版面平权
- PostList 组件加 locale prop(轨道标签走字典、en 链接 /en/ 前缀)
- en/index 镜像 zh 结构:名片区三图标(GitHub/RSS/邮箱)+ 文章列表
  + 最新影像(latest-head space-between + 4 列瓷砖网格,修复上轮
  粘连与整宽竖排两处硬伤)+ 热力图 + 项目墙,区块顺序与 zh 一致
- 闭环截图:zh 滚动至热力图锚点(修复验证缺口)

验证: pnpm astro build 21 页 exit 0;node tests/e2e.mjs 30/30 PASS

Spec: 2026-10-25_fix-site-polish

Co-authored-by: GLM-5.3
2026-10-25 11:23:30 +08:00
wait4xandGLM-5.3 ebafa415b2 fix(polish): 视觉复核三轮——热力图末列可见与 en 首页版面平权
- 热力图:桌面 10px 格+2px 缝收进版心(53 列 634px 无横滚——唯一有
  数据的最新列曾被裁在滚出区呈空表);移动端锚定 scrollLeft 到最新列
- en 首页补 IdCard 名片区 + Latest photos 影像条(视觉复核版面平权建议)
- en/index 重复导入 getCollection 修复(构建炸点)

验证: pnpm astro build 21 页 exit 0;node tests/e2e.mjs 30/30 PASS
      (新构建全链)

Spec: 2026-10-25_fix-site-polish

Co-authored-by: GLM-5.3
2026-10-25 11:12:04 +08:00
wait4xandGLM-5.3 e21fac7e1d fix(polish): 视觉复核二轮六项——网格单一高度源/导航i18n/热力图缓存等
- 图库:li 去 aspect-ratio(与行跨度双高度约束竞争=列洞根因面),
  img 改 object-fit cover 填满;截图前整页滚动触发懒加载
- Header:导航标签按 locale 取字典(en 页曾是中文);图标钮暗色
  提色去底块(视觉复核 02/12 的灰块)
- 热力图:构建期模块级缓存,zh/en 两页共享一次抓取(en 页曾空格)
- en 首页移除机器翻译横幅(文章级标注才是本意);面板居中;计数器
  文字投影
- Artalk E2E 报 fetch 失败定性为测试环境跨域(127.0.0.1 页面拉
  wait4x.online API),生产同源不受影响——上线后专项验证

验证: pnpm astro build 21 页 exit 0;node tests/e2e.mjs 30/30 PASS
      (新构建全链重跑,含滚动后 21/21 图库断言)

Spec: 2026-10-25_fix-site-polish

Co-authored-by: GLM-5.3
2026-10-25 10:57:16 +08:00
wait4xandGLM-5.3 7a2880b65d fix(polish): 上线四缺陷修复——明暗委托/灯箱常开/评论站点名/书评宋体
- 明暗切换:document 级委托(软导航换 DOM 后元素级监听全丢);
  E2E 再抓一坑:SVGElement 非 HTMLElement 实例,守卫用 Element 基类
- 图库:#lb 无条件 display:flex 覆盖 UA 隐藏 → 灯箱"永远打开"盖全页;
  改 #lb:not([open]) 显式 none;时间戳标题清空;灯箱打磨(切换钮
  实底阴影/n/21 计数器/空标题隐藏/原图链接暗底亮蓝)
- 评论:site 'wait4x'→'wait4x.online' 对齐 Artalk 服务端(404 根因)
- 书评字体:文楷→思源宋(@fontsource 预分片);文楷降级金句 --font-kai
- 数据:21 张照片组修正 street→landscape(迁移器收到内部组 id 的坑)
- 新增 tests/e2e.mjs:Playwright 30 项全功能 E2E

验证: node tests/e2e.mjs 30/30 PASS(含软导航后明暗切换回归项)

Spec: 2026-10-25_fix-site-polish

Co-authored-by: GLM-5.3
2026-10-25 10:46:03 +08:00
wait4xandGLM-5.3 c1085de1a0 fix(launch): 上线切换脚本 sudo 场景两处致命伤
- 深度扫描从 server_name 行起算须以 depth=1 为初值(server{ 开栏在
  该行之前;0 起算在下一行即误判闭合,块切片只剩一行导致 location /
  永不匹配——Phase 0 artalk 插入带同款 bug 但恰好落在块顶部而无害)
- STAGING 写死 /home/wait4x 绝对路径(sudo 下 /home/wait4x=/root,计划行
  曾显示 /root/docker_apps/...)

验证: 只读模拟 start=94 end=128(真实闭合行),regex 命中,块内
      artalk/halo 双 location 齐全;用户首跑在断言处安全中止(写入
      前拦截),nginx 配置未受影响

Spec: none (上线脚本热修复,Phase 4 归档后用户执行面缺陷)

Co-authored-by: GLM-5.3
2026-10-25 10:03:43 +08:00
wait4x 7c15b0dbc1 Merge branch 'spec/2026-10-25_add-blog-launch' (archive close)
Spec: 2026-10-25_add-blog-launch
2026-10-25 09:54:59 +08:00
wait4xandGLM-5.3 bfda43d7d1 chore(spec): 归档 add-blog-launch(T3 依赖行修正后收敛)
Spec: 2026-10-25_add-blog-launch

Co-authored-by: GLM-5.3
2026-10-25 09:54:58 +08:00
wait4x 06b782ea4a Merge branch 'spec/2026-10-25_add-blog-launch'
Phase 4 交付:命令面板/热力图/webhook 发布闭环/预发布全端验收/上线脚本与回滚;六任务机器验证收敛归档。

Spec: 2026-10-25_add-blog-launch
2026-10-25 09:53:25 +08:00
wait4xandGLM-5.3 ca829f09c6 chore(spec): 归档 add-blog-launch——Phase 4 六任务收敛
spec_verify --all 六项同指纹 exit=0;check 收敛;真实 push E2E 见合并后

Spec: 2026-10-25_add-blog-launch

Co-authored-by: GLM-5.3
2026-10-25 09:53:25 +08:00
wait4xandGLM-5.3 fb97d76ddb feat(launch): 命令面板+预发布验收+上线脚本(T1/T4/T5)
- T1 (op-gitea 车道):CommandPalette 三层(动作 theme/lang/rss+导航
  zh/en+Pagefind 搜索),Ctrl K 与 / 入口,document 级委托修 ClientRouter
  换页绑定失效;连带修复动态结果节点的 scoped CSS 失效潜伏 bug
- T4:preflight.sh 17 项全绿(产物/hreflang/双轨/微信 UA 200/
  responsive 11/halo 无恙/回滚前置);headless 渲染经 c4ai 复核
  (en 书评页全文+标注+ICP 实测在案)
- T5:launch.sh/rollback.sh 双向 dry-run 绿 + 上线检查单(linger/
  ESA 刷新/验证 URL/回滚路径)

验证: build 21 页 exit 0;command-palette+cmd-item zh/en 断言;
      bash scripts/preflight.sh ALL OK;launch/rollback dry-run exit 0

Spec: 2026-10-25_add-blog-launch
Co-authored-by: GLM-5.3
2026-10-25 09:52:50 +08:00
wait4xandGLM-5.3 938558ad4c feat(launch): 热力图与 webhook 发布闭环(T2/T3)
- T2 (op-artalk 车道):gitea heatmap 构建期拉取+fallback+空态三保险,
  53×7 灰阶格复用 tokens(亮暗自动),日界锚定 Asia/Shanghai,零 JS,
  zh/en 首页挂载;fallback 经死端点实测不破构建
- T3:webhook_receiver.py(HMAC 强制+main-only+构建锁)以 systemd
  --user 常驻 13021;gitea hook 注册(events=push, branch=main)
- 三个深坑:gitea 容器回宿主须走桥网关 IP 而非 127.0.0.1;gitea 28
  egress 拦私网须 ALLOWED_HOST_LIST(ALLOWLIST 是废弃名);systemd
  用户服务缺用户 PATH 致 build 静默失败(stamp 不更新即症状)

验证: 测试投递 202→构建→staging 戳更新(09:48:37 实测);
      dist 热力图 376 格真数据(9 次贡献)zh/en 双页

Spec: 2026-10-25_add-blog-launch
Co-authored-by: GLM-5.3
2026-10-25 09:49:19 +08:00
wait4xandGLM-5.3 0c54a43bb5 chore(spec): 创建 add-blog-launch 任务包(Phase 4 六任务)
Spec: 2026-10-25_add-blog-launch

Co-authored-by: GLM-5.3
2026-10-25 09:41:55 +08:00
wait4x 5405e33f81 Merge branch 'spec/2026-10-25_add-blog-i18n'
Phase 3 双语交付:/en/ 全站 + TMT 翻译管线 + 6 篇译文 + hreflang/RSS;八任务机器验证收敛归档。

Spec: 2026-10-25_add-blog-i18n
2026-10-25 09:41:00 +08:00
wait4xandGLM-5.3 e185a292c8 feat(i18n): T6 真实翻译入仓与 Phase 3 收敛归档
- op-artalk 车道:6/6 篇 TMT 翻译入 posts-en(frontmatter 字节级透传),
  幂等复跑 0 API;修复 TMT 1800+ 字符包静默截断(limit 1600 + ratio
  检测 + 二分降级,mock 三场景)
- 标题首字母抛光;T8 staging 21 页 + rollback 绿 + halo 无恙
- spec_verify --all 八项同指纹 exit=0;check 一次收敛;归档

验证: 21 页 build exit 0;/en/ 文章页真实英文内容渲染
      (Under the Veil… 抽检);幂等 dry-run 6 skip 0 API

Spec: 2026-10-25_add-blog-i18n
Co-authored-by: GLM-5.3
2026-10-25 09:40:59 +08:00
wait4xandGLM-5.3 4aa79fca06 feat(i18n): UI 字典串接与三页薄化——/en/ 全站落成
- op-gitea 车道:ui.ts 扩 26 键(占位 {n}/{title}/{exif} 约定),五组件
  locale prop 串接,zh 零回归(48 键/18 页实测)
- orchestrator 收尾:gallery/moments/about 三页 body 提取为
  components/pages/*Page(zh/en 薄页双路由),/en/ 全家福 21 页
- 提取工程三坑入库:HTML 注释不可进 frontmatter 模块区;搬移脚本会吃
  开栏 ---;单级页面搬二级目录后 import 全线差一层

验证: astro build 21 页 exit 0;/en/ 七类路由产物断言过;en 页
      ICP 备案保留;zh 侧文案抽查不变

Spec: 2026-10-25_add-blog-i18n
Co-authored-by: GLM-5.3
2026-10-25 09:26:14 +08:00
wait4xandGLM-5.3 c74815b516 feat(i18n): /en/ 双语骨架——路由/切换/hreflang/回退/AI 标注
- astro i18n(zh 默认无前缀,en /en/)+ locale.ts 路径工具
- Header 语言切换(同路径跨前缀跳转,预构建毫秒级)
- /en/index + /en/archives/{slug}(postsEn 优先,缺译回退 zh 正文
  + AiTranslatedBadge 虚线标注 TMT);en RSS(标题回退同策略)
- BaseLayout hreflang 双向 + x-default 指向 zh 源
- posts-en 集合(postsSchema.extend locked 润色锁)
- 坑:ts 端点文件误带 --- 开头会以 undefined:2:7 报 Unexpected token

验证: astro build 18 页 exit 0;/en/ 六文章路由+首页+rss 产物断言过;
      zh 侧零回归(11 页不变);hreflang 抽查 dist/index.html

Spec: 2026-10-25_add-blog-i18n
Co-authored-by: GLM-5.3
2026-10-25 09:20:16 +08:00
wait4xandGLM-5.3 cf42081614 chore(spec): 创建 add-blog-i18n 任务包(Phase 3 八任务三车道)
Spec: 2026-10-25_add-blog-i18n

Co-authored-by: GLM-5.3
2026-10-25 09:14:47 +08:00
wait4xandGLM-5.3 44bfb23efb feat(gallery): 原图查看与下载——仓外 originals store 双轨制
- git 仓只进压缩版(构建用);原图落 ~/docker_apps/blog/photos-originals/
  (迁移器/ingest 双入口写入,幂等),build.sh 独立 rsync 到
  staging/photos-originals/(同一静态根,零 nginx 改动)
- lightbox 增「原图」(新标签全尺寸)+「下载」(download 属性带文件名)
- 原图持久保障:store + Phase 0 备份 tar 双留档;存量 21 张已回填(196M)

验证: astro build 11 页 exit 0;dist/gallery 含 lb-original×2 与
      photos-originals 引用;staging/photos-originals 21 张实测

Spec: none (用户功能补req:原图查看/下载,跨 Phase 独立小特性)

Co-authored-by: GLM-5.3
2026-10-25 09:12:26 +08:00
wait4xandGLM-5.3 382e56431f fix(photos): 入库压缩保留 EXIF 并补未来上传的压缩缺口
- 迁移器与新增 photos_ingest.py 压缩时显式 exif= 传参(PIL 重存默认
  剥离——此前 21 张已全部丢 EXIF,图库参数条构建期数据源被抽空)
- exif=None 会使 PIL JPEG 保存 len(None) 崩,改条件传参
- photos_ingest.py:幂等入库处理器(长边 2400/q86,>1.5M 才动),
  堵住 gitea/本地上传原图直入仓的缺口(196M 事故成因)
- 重跑迁移:19/21 带 EXIF(2 张原图本无),体积 9.7M

验证: pnpm astro build 11 页 exit 0;EXIF 保留计数 19/21

Spec: none (Phase 2 归档后的独立小修:EXIF 修复 + ingest 补缺)

Co-authored-by: GLM-5.3
2026-10-25 09:01:07 +08:00