踩坑实录
真实工程踩坑复盘:现象、根因、验证过的解法一条龙记录。历法计算、时区、CI/CD、LLM 应用——每篇都来自本站开发运维中亲手踩过并修复的坑,只写实测,不写理论。
加载中...
真实工程踩坑复盘:现象、根因、验证过的解法一条龙记录。历法计算、时区、CI/CD、LLM 应用——每篇都来自本站开发运维中亲手踩过并修复的坑,只写实测,不写理论。
加载中...
一台跑 sing-box(VLESS-REALITY + Hysteria2)的洛杉矶 VPS,装上 Tailscale 第二天 VPN 全断。systemctl、端口、证书全部正常,根因藏在 /etc/resolv.conf:Tailscale 默认接管 DNS,tailnet 后台没配全局 nameserver,dhclient 续租时 resolv.conf 被读成空文件,tailscaled 从此对所有公网域名回 SERVFAIL,REALITY 握手连 www.apple.com 都解析不了。本文给出完整时间线、每一步的证据命令、三种修法,以及让 AI 助手(Claude Code)以后不再踩这个坑该写进 CLAUDE.md 的几条规则。
Claude Code auto 模式(自动批准权限模式)弹出「temporarily unavailable, so auto mode cannot determine the safety of bash」?先说结论:不是你的命令危险,是安全判定器(一次额外的模型调用)暂时联不上。本文给出四步处理、模型名×工具名×原因的完整变体速查、Shift+Tab 六种权限模式速查(plan / manual / acceptEdits / dontAsk / auto / bypassPermissions,实测自 v2.1.263),以及「auto 是什么模型」「bash denied by auto mode 是不是同一个问题」这些常见困惑的答案。
生产管线连续两天早晨断更:日志停在 07:04,之后所有轮询都打「今天已有记录,跳过」。根因是给每 5 分钟唤醒的调度进程挂了 PM2 cron_restart——它对正在运行的实例是先杀再起,任何一步偶发超过周期就连子进程一起被杀。本文附本机 8 分钟对照复现:cron_restart 组 9 次起跑 0 次跑完,常驻循环组 4 次全部跑完。
某天 GitHub 登录突然回调报 error=Configuration,两台服务器同时挂,而当天恰好上线了数据库读写分离——第一反应当然是怀疑部署。本文复盘如何用依赖 lock diff + 数据库最后成功登录时间排除部署嫌疑,定位到真正根因:GitHub 2026 年 4 月起分批灰度 RFC 9207(回调注入 iss 参数),撞上 Auth.js 给无 issuer provider 用的占位符校验。修复只有一行,但排查方法和「探针验证法」值得留档。
在 zshrc 里 export 了 ANTHROPIC_BASE_URL 指向第三方中转站,Claude Code 却依然走 Google Vertex;同一台机器上,launchd 启动的 Web UI 干脆说未认证。两个坑的根子都不在中转站,而在「你以为环境变量设上了」。
公众号带参数二维码做扫码登录,上线即遭 48001——排查穿过 IP 白名单、token 缓存、后台权限页、业务域名四个假嫌疑后,官方 rid 诊断揭晓:该接口只给「认证的非个人主体服务号」,认证企业公众号也不行且类型不可互转。本文复盘 rid/quota 诊断三板斧,并给出订阅号可用的替代方案:固定二维码 + 6 位验证码 + NextAuth database session 手工铸造。
SwiftUI 里用 TimelineView 驱动一张吉祥物场景卡,两个毛病:第一次点开音色时蜗牛原地镜像翻转一下,停止播放时背景硬切。前者查了两轮——第一轮以为是 timeline 暂停导致时间源错位,改完仍在;真正的根因是相位取模时那句 `raw < 0 ? raw + 1 : raw`,它把「timeline.date 比 Date() 早了一帧」这个几十毫秒的误差,回绕放大成了 0.9999 的相位,而朝向恰好是相位在 0 处的不连续函数。这篇复盘讲清楚为什么在 TimelineView 里不能用 .transition、怎么把动画状态写成时间的纯函数、以及交叉淡化为什么要设计成「只有淡入没有淡出」。
用 TTS + 自动字幕做科普视频,字幕前半段完美、越往后漂移越大,尾部时间戳甚至退化成 00:00:00。第一反应是修对齐算法——归一化数字、调相似度阈值——都是打补丁。这篇复盘给出根因:「整段 TTS + whisper 转写 + 事后匹配」这类方案在结构上必然漂移,因为它把本该由生成过程直接产出的时序信息,交给了一个会出错的事后重建环节。解法是逐句 TTS + 采样级拼接:字幕时间戳等于每句真实 wav 采样数的累加,句边界天然重置误差,物理上不存在漂移。附完整切句规则、缓存设计与适用边界。
Mac 风扇狂转、CPU 100%,定位到元凶是 Cloudflare 的 stdio MCP server:两个进程各吃满一个核,背后还堆着一排历史会话残留的僵尸实例。本文复盘现象、定位过程、stdio MCP 的进程模型缺陷,以及为什么低频运维操作用 REST API 比挂一个常驻 MCP 更合理。
确信昨天敲过的命令,今天 Ctrl+R 搜不到,~/.zsh_history 只剩几年前的老条目——这不是你配置的问题。Michael Stapelberg 用 inotify → fatrace → bpftrace → 给 Zsh 打崩溃补丁的完整排查,定位到一个 2015 年就存在的缺陷:退出时重写历史文件的过程被 Ctrl+C 打断,Zsh 会把只读了一半的历史写回去。Zsh 5.9.2 已修复(5.9.1 漏掉了)。本文拆解根因、给出各发行版升级现状表,并纠正一个流传很广的错误解法。
Claude Fable 5 官方确认 1M token 上下文窗口,但 Claude Code 底部状态栏的分母一直是 200k。第一反应是「换个更好的 statusline」——错了。本文复盘完整排障过程:用一行 tee 抓下 statusline 的 stdin 现场,实锤官方字段对新模型误报 200000,最后用一张模型表修正。附赠一个通用教训:换工具修不了数据源的错。
一条'页面未收录、被 robots.txt 屏蔽'的反馈,差点让我们推翻整个多语言 301 架构。用 GSC URL Inspection API 一查:robots.txt 状态 ALLOWED,真实状态是'网页会自动重定向'——内容早已在目标 URL 正常收录。本文完整复盘排查链路、多语言站的 SEO 架构取舍,以及一套可复用的'查 Google 官方判定'方法论。