Commit Graph
72 Commits
Author SHA1 Message Date
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
wait4xandGLM-5.3 aea21c8694 feat(migrate): Halo 全量内容迁移(压缩版)——6文/21图/1瞬间 URL 1:1
- 正文源=线上渲染页(Halo 快照层 patch 残迹:泥潭/赎罪仅 2 字符),
  pandoc html→gfm + tags API 显示名换算后分类:5 书评(五档情绪色)+1 技术
- 图库 21 张:长边 2400/q86 压缩入仓(原图 196M→9.5M——公开仓历史膨胀
  与 nginx 100M 推送上限双杀;原图在 Phase 0 备份 tar 中永久留档)
- 瞬间 1 条;URL 1:1(6 slug 全等,零 301)
- 本提交由 7 个本地提交重写而成(清除已进历史的 196M blob,未推送过);
  因 reset --soft 暂存竞态,一并包含 spec 归档文件
  (.spec/specs/archive/2026-10-24_migrate-blog-content/)

验证: check_urls.py 6==6;astro build 11 页 exit 0(8.67s);
      EXIF 管线跑通;staging 更新;halo healthy+200 全程未动

Co-authored-by: GLM-5.3
2026-10-25 00:39:08 +08:00
wait4xandGLM-5.3 7b71acf223 feat(deploy): build.sh 落地为真实构建管线(T10 补提交)
- pnpm install --frozen-lockfile + astro build + rsync staging + 构建戳
- 归档提交时漏加的工作区文件,本提交补齐(内容即 T10 验收对象)

验证: bash infra/deploy/build.sh(7 html 产物 + staging 就位 + rollback 干跑绿)

Spec: 2026-10-24_add-blog-skeleton
Co-authored-by: GLM-5.3
2026-10-25 00:17:04 +08:00
wait4x 845a4e61a7 Merge branch 'spec/2026-10-24_add-blog-skeleton'
Phase 1 前端骨架交付:设计系统/分片字体/三集合/五页型/极客层 P0/搜索 RSS;十任务机器验证收敛归档。

Spec: 2026-10-24_add-blog-skeleton
2026-10-25 00:16:22 +08:00
wait4xandGLM-5.3 094f0f0d5b chore(spec): 归档 add-blog-skeleton——Phase 1 十任务收敛交付
- T1-T10 全勾选,spec_verify --all 十项 exit=0 入 runs.jsonl
- 交付:Astro 7.3.8 全站骨架(tokens/字体分片 399 片/三集合/五页型/
  极客层 P0/pagefind+rss+sitemap/Artalk 懒挂/staging 管线)
- 无头浏览器实测:项目墙双源拉取真实仓(gitea 转公开后自托管卡置顶)

Spec: 2026-10-24_add-blog-skeleton

Co-authored-by: GLM-5.3
2026-10-25 00:16:22 +08:00
wait4xandGLM-5.3 4694428614 feat(search): 站内搜索/RSS/sitemap/Artalk 懒挂载
- astro-pagefind:构建期索引;SearchDialog 首开懒加载 + 200ms 防抖,
  入口=Header 钮 + 键盘 /(P0 键位集补全)
- @astrojs/rss:posts 全量(draft 排除),双语分流留 Phase 3
- @astrojs/sitemap:sitemap-index 产出
- ArtalkComments:IntersectionObserver 进入视口才拉 Artalk.js,
  pageKey=/archives/{slug}/(中英共键,评论不分裂)

验证: pnpm astro build exit 0;dist/pagefind 目录 + rss.xml +
      sitemap-index.xml 三件断言过

Spec: 2026-10-24_add-blog-skeleton
Co-authored-by: GLM-5.3
2026-10-25 00:13:29 +08:00
wait4xandGLM-5.3 945a9ee610 feat(pages): 五页型落地——首页/文章双模板/图库 masonry/瞬间/关于
- 首页:名片+身份陈述空槽+按年分组分轨列表(情绪色/mono标签)+影像格+项目墙
- 文章 /archives/{slug}(与 Halo 旧 URL 1:1):reading→衬线纸墨 / tech→
  TOC 侧栏(≥1120 sticky)+2px 进度条+Artalk 容器占位
- 图库:grid masonry(构建期 aspect-ratio 零 JS)+原生 dialog lightbox
  (←→/Esc+EXIF 底栏)+分组筛选
- 瞬间时间线 / 关于(三轨版图+构建说明)
- sharp ^0.35.5 入依赖(Astro 7 不内置,astro:assets 缩略图管线前提)
- 裸 blockquote 默认吃 A 墨线样式(markdown 原生输出无类名的缝隙)
- 车道 30min 超时,产物完整,主会话补 sharp+断言脚本递归修正后收编

验证: pnpm astro build exit 0(7 页);五路由产物断言过;
      scripts/check-responsive.sh 11/11 ok(1120/820/760/560 全档)

Spec: 2026-10-24_add-blog-skeleton
Co-authored-by: GLM-5.3
2026-10-25 00:11:34 +08:00
wait4xandGLM-5.3 80ff67e8fa feat(content): 三集合 schema 与 EXIF 构建期补全(T4 车道收编)
- src/content.config.ts(Astro 7 唯一合法路径,旧 config.ts 会抛
  LegacyContentConfigError——车道实测发现,经批复的边界修正)
- posts(category→track 派生单源)/moments(text-image 互斥 refine)/
  photos(json sidecar + jpg,exif 构建期 exifr 补全、frontmatter 可覆盖)
- 样例:书评+技术文各 1、瞬间 3、照片 3(横竖方三比例,EXIF 三路径覆盖)
- 附带 scripts/check-responsive.sh(T9 预置,随 T6 产物生效)
- 车道 30min 超时于过度验证循环,产物完好,主会话收编续跑

验证: pnpm astro build exit 0(1.63s,含三集合加载)

Spec: 2026-10-24_add-blog-skeleton
Co-authored-by: GLM-5.3
2026-10-24 23:36:59 +08:00
wait4xandGLM-5.3 725bfde21f feat(geek): 极客层 P0 四件套——键盘/构建透明/页面转场/项目墙
- Keyboard:? 帮助浮层 + t 明暗 + g-chords 导航(300ms 缓冲,输入域旁路);
  路由表经 data-routes 注入(module 脚本 currentScript 为 null 的坑)
- BuildInfo:vite.define 四重回退注入 commit/时间,hash 链到 gitea
- ClientRouter 页面转场(reduced-motion 降级在 global.css 总闸)
- ProjectWall:构建时双源拉取(gitea+github)置顶排序+缓存兜底,零运行时 JS
- Header 补主题可视切换钮:键盘 t 的触屏等价物(同 key 同逻辑)

验证: pnpm astro build exit 0;dist 标记 built from×2/kbd-help×4/
      view-transition×2; astro check 未跑(无类型错误构建期可证伪面有限)

Spec: 2026-10-24_add-blog-skeleton
Co-authored-by: GLM-5.3
2026-10-24 23:13:23 +08:00
wait4xandGLM-5.3 b50eddf2bb feat(layout): 基础布局/导航/页脚/明暗不闪烁
- BaseLayout:字体三轨统持、viewport-fit=cover、theme-color 双套、skip-link
- Header:≤4 项导航纪律 + sticky 毛玻璃 + aria-current;搜索 icon 占位待 T8
- Footer:ICP 备案链接(法定保留)+ built-from 具名槽位待 T7
- ThemeScript:head 内联先于首帧,手选 > 系统偏好,防白闪

验证: pnpm astro build exit 0;dist/index.html 含 ICP 文案与跳到正文链

Spec: 2026-10-24_add-blog-skeleton
Co-authored-by: GLM-5.3
2026-10-24 23:09:45 +08:00
wait4xandGLM-5.3 ee53279822 feat(fonts): 字体三轨预分片自托管接入
- lxgw-wenkai-screen-webfont + @fontsource/noto-sans-sc(400/500/700)
  + @fontsource/jetbrains-mono(400/700),均 OFL
- unicode-range 按需加载 + font-display swap;家族名与 tokens 栈首一致
- 教训:包 css 不能经 .css 文件 ESM import,须组件 frontmatter 持有

验证: pnpm astro build exit 0;dist woff2 分片 399 个(>50 门槛)

Spec: 2026-10-24_add-blog-skeleton
Co-authored-by: GLM-5.3
2026-10-24 23:08:36 +08:00
wait4xandGLM-5.3 4cb1c85cc3 feat(design): 设计 tokens 与全局样式——丙路线「灰阶骨架×分轨正文」
- tokens.css:四档灰阶/单强调蓝/蓝黑暗色/纸墨面板/情绪色五档/
  字体三轨栈/排版三角(书评20-1.75-720 技术19-1.7)/唯一缓动曲线
- global.css:轻量reset/双轨正文(.prose-reading/.prose-tech)/
  引文A墨线+D金句62px水印/终端风代码块/::selection半透明/
  560px降档18px/动效总闸prefers-reduced-motion

验证: pnpm astro build exit 0;参数与调研报告 §3 一一对应

Spec: 2026-10-24_add-blog-skeleton
Co-authored-by: GLM-5.3
2026-10-24 23:07:11 +08:00
wait4xandGLM-5.3 eeb9bde121 feat(skeleton): Astro 7.3.8 项目初始化(pnpm+TS strict)
- astro 锁 7.3.8:7.4 起 engines 要求 node>=22.23.4,宿主 22.22.3 差一档
- minimal 骨架:单页占位 + site=https://wait4x.online,集成留 T8 按任务接入

验证: pnpm astro build exit 0(1 page built)

Spec: 2026-10-24_add-blog-skeleton
Co-authored-by: GLM-5.3
2026-10-24 23:07:11 +08:00
wait4x ce41c800ba chore(spec): 创建 add-blog-skeleton 任务包(Phase 1 十任务)
Spec: 2026-10-24_add-blog-skeleton
2026-10-24 23:00:20 +08:00
wait4x dca5fe0e5e Merge branch 'spec/2026-10-24_add-blog-infra'
Phase 0 地基交付:备份/gitea 28.2.0/Artalk 2.10.0/git.wait4x.online 接入/发布链地基;七任务机器验证收敛归档。

Spec: 2026-10-24_add-blog-infra
2026-10-24 22:51:38 +08:00
wait4xandGLM-5.3 0f7c2dfe5b chore(spec): 归档 add-blog-infra——Phase 0 七任务收敛交付
- T1-T7 全部勾选,spec_verify --all 七项 exit=0 入 runs.jsonl
- check 门禁收敛;交付:备份三件套/gitea 28.2.0/Artalk 2.10.0/
  git.wait4x.online + /artalk 公网接入/发布链地基与回滚预案
- 生产 Halo 全程未动(healthy + 200 复查通过)
- 含 spec pre-commit/pre-push 门禁钩子入库

Spec: 2026-10-24_add-blog-infra

Co-authored-by: GLM-5.3
2026-10-24 22:35:24 +08:00
wait4xandGLM-5.3 f16b9487d3 feat(deploy): 发布链地基三件套——webhook 骨架/构建占位/回滚干跑
- webhook-receive.sh:HMAC 骨架 + 仅 main 分支触发(干跑验证两条 ref 路径)
- build.sh:锁发布链形态与路径约定,astro 命令留 Phase 1 TODO
- rollback-dryrun.sh:回滚四前置条件验证 + 人为操作手册(秒级回 18090)
- staging 落用户区 ~/docker_apps/blog/www-staging(宿主 sudo 不可用,nginx 以 root 读用户目录无碍)

验证: webhook 干跑 main accepted / non-main ignored;rollback-dryrun
      四要素 ok(halo vhost/容器/响应/staging)

Co-authored-by: GLM-5.3
2026-10-24 22:10:59 +08:00
wait4xandGLM-5.3 ddcda54f90 feat(gitea): 部署 gitea 28.2.0 并入库接入草稿
- 容器 gitea/gitea:28.2.0 仅绑 127.0.0.1:13020,管理员 wait4x 经 CLI 创建,
  私有空仓 wait4x/blog 就位(Phase 1 博客源码仓)
- app.ini 种子入库(INSTALL_LOCK 预置,密钥首启生成,快照严禁回覆盖运行时)
- REQUIRE_SIGNIN_VIEW 会 403 匿名 version 端点,与验收冲突已撤,坑记 README
- 凭据不进 git:初始密码并入住主 init-credentials.txt(0600),README 留指引

验证: curl -sf http://127.0.0.1:13020/api/v1/version → {"version":"28.2.0"};
      docker inspect gitea = running;wait4x/blog private+empty 经 API 查证

Co-authored-by: GLM-5.3
2026-10-24 22:09:06 +08:00
wait4xandGLM-5.3 aea11469e3 feat(artalk): 部署 Artalk 2.10.0 评论服务并入库接入草稿
- 容器 artalk/artalk-go:2.10.0 仅绑 127.0.0.1:13030,sqlite 落实例卷
- 子路径 /artalk 经 proxy_pass 尾斜杠剥前缀(官方无 base path 模式),
  nginx 草稿为 location 片段,合并主域 vhost 后需实测 sidebar 内页跳转
- 凭据不进 git:初始密码移实例目录 INITIAL-CREDENTIALS.txt(0600),
  仓库 README 仅留指引(本仓库将公开)

验证: curl -sf http://127.0.0.1:13030/api/v2/conf 返回 2.10.0 JSON;
      docker inspect artalk = running;管理员 wait4xx 经 sqlite 查证落库

Co-authored-by: GLM-5.3
2026-10-24 22:00:57 +08:00
wait4xandGLM-5.3 d8f5ecfbf5 chore(spec): T1/T2 证据落库——备份三件套验证通过,翻译引擎缺口记录
- T1: pg_dump(halo_db) 237K 可恢复 + halo2 目录归档 404M/3577 项,verify_backup.sh 实跑通过
- T2: new-api 网关鉴权/模型端点可用;通用 chat 模型缺渠道(GLM 禁用、
  OpenRouter 仅特殊别名),需用户控制台启用,不阻塞 Phase 0

验证: bash .spec/specs/2026-10-24_add-blog-infra/evidence/verify_backup.sh
      (输出 backup verified: dump readable, tar entries=3577)

Co-authored-by: GLM-5.3
2026-10-24 21:58:07 +08:00
wait4x 72025b7a43 chore(spec): 创建 add-blog-infra 任务包(Phase 0 地基七任务)
- T1 备份 / T2 翻译引擎 / T3 gitea / T4 Artalk / T5 域名接入 / T6 发布链 / T7 验收
- 每任务 boundary+verify;nginx 集成仅 orchestrator,worker 交草稿
- 集成分支 spec/2026-10-24_add-blog-infra
2026-10-24 21:50:44 +08:00
wait4xandGLM-5.3 9a61e69f2f build: 安装 commit-msg 规范钩子(ai-code-style-kit v1.0)
Co-authored-by: GLM-5.3
2026-10-24 21:48:28 +08:00
wait4xandGLM-5.3 0fbb023375 docs: 落库博客重设计调研报告 v1.8 与视觉样板 v2
调研收官产物入库:主报告(架构 C''=Astro SSG+gitea 双写作流、
Artalk 评论、分片 webfont、双语预译管线、多端适配规格、
Phase 0-5 实施规划)+ 五份侦察原稿 + 可交互单文件样板
(三路线×明暗×五页型,命令面板/终端/热力图/masonry)。

Co-authored-by: GLM-5.3
2026-10-24 21:48:11 +08:00