COLUMNS ── 专栏

六个专栏,各管一件事。

COLUMN ── 工程手记(16)

方法论与决策记录——为什么这么做的完整推理。

012026-09-10AI 项目做多以后,真正难的是把边界接起来从多个 AI 项目的 Git 记录和设计文档看,工程难点已经从“能不能生成”转向任务、计费、交付、恢复与用户反馈能否形成闭环。工程手记022026-08-15上线前,我把整个仓库审了一遍一次上线前的静态安全审查:四个并行只读代理加人工逐条复核,产出 20 条分级风险与三档修复路线图。本文记录方法,不复述条目。工程手记032026-08-02首页改成八屏把博客首页从连续滚动改成八屏整屏分页。吸附用 Lenis 自带能力而不是 CSS 原生,断点按实测调整,每一档的溢出与填充率都有数字。工程手记042026-07-29一年八千次提交,我是怎么干的从需求澄清到故障归档,一套系统化的 AI 辅助开发流程:先设计文档过审,再分阶段实施验证,最后代码审查与故障存档,三条铁律支撑整个流程。工程手记052026-07-20密码,不该由我保管两层加密保护远程桌面凭据,本机用 DPAPI 便利性换易用性,备份用 PBKDF2 固定 60 万迭代;为什么迭代次数不可配置,性能数据如何解读。工程手记062026-07-17转不成演示的设计文档,本来就没讲清不做通用PPT编辑器,只做文档→演示的单向转换;关键在识别文档的稳定结构。工程手记072026-07-05这个动效,是在帮用户还是在展示我?三条判据分辨哪些动效值得做、哪些该砍,以及性能与可访问性的硬要求。工程手记082026-06-13让模型决定分类,但不让它碰文件系统设计一套通过微信私聊向 Claude 发送内容,自动分类、起标题、格式化后落入本机 Obsidian 的管线,核心是让 Claude 只做决策,Node 确定性写盘。工程手记092026-05-18不装远控软件,从 Mac 进客户的 Windows通过 SSH 隧道 + VPS 中继接客户 Windows,支持 10 并发、一次性证书、5-10 秒快速连接。工程手记102026-04-28两天,27 个模块的设计文档批量产出设计文档的方法——统一模板、共享核心模型、按模板填充。27 个业务模块若逐个手写撑不住进度,通过先定死文档骨架和跨模块通用数据结构,可以降低重复劳动。工程手记112026-04-17造到第 30 个 agent,我开始怀疑该不该造独立 agent 的价值来自它携带的专有约束量,不是职责名称听起来有多不同。工程手记122026-04-15一周四个演示项目,什么可以是假的?演示项目的核心是取舍:什么路径必须打磨到真实,什么细节可以简化甚至假装。工程手记132026-04-12三端并行开发,谁先接谁?三端并行开发时顺序错了导致大量返工;可行顺序是后台自测→后台+小程序→后台+设备→三端,理由是后台是唯一事实源。工程手记142026-04-08设备明明在线,状态却一直跳MQTT连接状态与业务在线状态不同步导致频繁抖动的原因分析,以及心跳机制、去抖、会话识别三层防护方案。工程手记152026-04-05设备还没接上,后端先做什么?设备接入系统如何确保数据有归属,为什么用户和厂商模块必须先建,MQTT 主题设计如何支撑权限隔离。工程手记162026-03-3077 个规则文件——一层通用规则不够用通用规则会自相矛盾——Go 的指针接收器和"始终返回新对象"直接冲突,而后者对 TypeScript 是对的。这是分层的起因。工程手记

COLUMN ── 故障档案(25)

事故现场五段式复盘:现象、时间线、根因、修复、预防。

012026-09-10登录失效不能只显示空白页一次登录令牌过期问题的修复:从分散的接口错误,收口到同源 API 的统一失效提示,同时保留未保存内容和多标签页续期场景。故障档案022026-08-31同一批活儿,扣了两遍钱点「批量生视频」把 10 张已经出好的分镜图整套重跑并再次扣费。两处独立成因:前端把祖先闭包当目标传给后端,后端落库的行 ID 与唯一约束不一致导致重复派发。故障档案 FA-024032026-08-28图是好的,链接死了画布上的素材图集体裂开,刷新只换来另一条同样会死的链接。三处独立问题:签名客户端每请求重建、前端把签名 URL 当永久地址存、面向浏览器的链路签了 15 分钟的直链。故障档案 FA-023042026-08-24上游没报错,片子不对视频链路上一批不报错的失败:猜不出渠道名导致重复提交、成片地址是相对路径、参考图签名在排队时就过期、熔断被当成永久失败、上游欠费显示成用户余额不足。故障档案 FA-022052026-08-19成本算错的时候,没有任何报错一天内查出四处成本口径错误:按量资源没乘用量、图生视频把输入秒算进成本、成本缺口红名单误判全部模型,以及后台填的成本因为中间一层 schema 没声明字段而从未落库。故障档案 FA-021062026-08-13没人报错,因为错误被吞了一次上线前审查翻出的十四处静默失败:连接断了不重连、参数发错被吞吐、写入失败当成功、该拦的入口没拦,全都不产生任何日志。故障档案 FA-020072026-08-12生成中排查发现多类任务没有终态:有的停在生成中 450 小时、有的 670 小时、有的 834 小时,有的扣了 1350 视频点后无限重试。统一判死与退款机制的建立过程。故障档案 FA-019082026-07-23一个 PVC 装所有用户,当时看不出有什么问题K8s 共享 PVC + subPath 方案在实施中暴露的四个陷阱:权限不匹配、目录创建时机、节点级故障域、无 per-subPath 配额。故障档案 FA-018092026-07-11三个超时机制,一起把长任务掐死了长耗时分析请求(几十秒到分钟级)用同步 HTTP 导致网关超时、CDN切断、客户端重试重复扣费。改异步任务需同时解决幂等、持久化、失败语义。故障档案 FA-017102026-06-17日志里没有重连记录——它根本没在重连客户端重连逻辑中三处独立的"静默终止"缺陷导致 WS 永久断开,任何一条路径命中就不再调度重连计时器。故障档案 FA-016112026-06-05监控全绿。52 个实例已经死了几小时。节点 kubelet 虚假 Ready,但容器运行时 hang 住导致 52 个用户实例网关集体失效,数小时无告警。故障档案 FA-015122026-05-30每一层都对——用户看到的还是旧版改样式后部署完成但用户端看不到,排查发现五层缓存全链失效,最隐蔽的陷阱是 Docker bind mount 的 inode 绑定。故障档案 FA-014132026-05-25一天,247 次 OOM一场波及全站用户掉线的故障根因不是单一 bug,而是九个独立缺陷在内存压力下叠加放大;修复需要基础设施和业务代码两条线并行推进。故障档案 FA-013142026-05-22一个默认配置,决定了我能有多少用户一行 apt 改动引出的 16 倍网络扩容:docker daemon.json 的配置陷阱如何偷偷限制了业务增长。故障档案 FA-012152026-05-16端口在听。健康检查超时。日志零字节。隐藏的 conhost 控制台缓冲满后阻塞 JS 主线程,导致网关端口监听但永不响应。故障档案 FA-011162026-05-14三个组件都没做错,token 还是被删了激活后 token 写到 USB,但 guardian 最终同步用镜像模式把它删了,导致反复激活。故障档案 FA-010172026-05-12点更新是降级,不点就动不了客户端版本比对逻辑缺陷导致强推已撤回的旧版本,陷入升降级循环;两层修复确保版本单调性是独立防御。故障档案 FA-009182026-05-11签名文件比这次更新,早了三小时跨版本 OTA 时复用了上一轮失败留下的旧签名文件,导致所有后续升级验签必然失败。问题根源在文件存在性判断替代了版本校验。故障档案 FA-008192026-05-10同一个弹窗,我修了三次状态机的终态只由 phase 表示,不校验实际产物导致假报成功。修复是入口处检测 applied_version 与目标版本不一致时强制重置。故障档案 FA-007202026-05-0912 个卡死的进程,全是用户点出来的前端 OTA 回调用页面刷新而非进程退出,导致 launcher worker 堆积。故障档案 FA-006212026-05-08「升级成功」,但它觉得自己没升级portable 客户升级后版本判定用错了数据源,launcher 不断读旧版本号导致无限循环更新。故障档案 FA-005222026-05-04配置填好了,切个页面——没了防抖保存依赖 300ms 计时器,cleanup 直接丢弃 pending 任务,导致页面切换或应用关闭时配置静默丢失。故障档案 FA-004232026-05-02「输出超时」——可文件已经装好了前端超时 watchdog 误杀长工具链,同时掩盖后端真实错误,导致排障困难。故障档案 FA-003242026-05-01一次 sessions.list,23 秒Gateway 启动首阶段 event loop 长期阻塞,sessions.list 慢到 23 秒;根因是 plugin staging 跑主线程,结合 auth 同步等待被卡 22 秒。故障档案 FA-002252026-04-30什么日志都没有——因为进程没活到能写日志NTFS长路径限制导致便携包拷贝时文件截断,网关入口缺失无进程。缺文件症状表现为无日志,排查应优先验证交付物完整性。故障档案 FA-001

COLUMN ── Agent 平台(20)

一个人维护 AI 平台:架构、计费、运营与边界。

012026-08-31阈值不能推,只能量知识库检索质量的三次修正:分块阈值按比例推算算出了全场最差点,精排阈值设高了会随分数漂移随机漏召,超时余量不够会静默降级。三次都靠实测数据定值。Agent 平台022026-08-20画布这一步:深链、运行历史与续跑一次补齐八项画布操作:URL 深链、小地图、运行历史、复制粘贴、批量框、一键整理布局、便签,以及失败运行的单节点续跑。Agent 平台032026-08-08同一张能力表,抄了三份上游模型的分辨率、时长、提示词长度散落在三处各自维护,各自漂移。一次用户反馈把三处一起翻出来:多出的档位、被砍掉的秒数、翻倍的板数。Agent 平台042026-07-26一个人,能维护到多大规模?从 270 到 1987 日活,每一次规模跃升前都先撞了一次墙。这条增长曲线记录的不是预设设计,而是每次故障都被完整归档后逐步演进出来的可行性边界。Agent 平台052026-07-24引入的第二天,我决定不再跟随上游前一天刚定下「前端原样保留、定期同步上游」,二十小时后就废掉了同步这条。触发点是一条冲突:上游的松散连线与旧引擎的端口模型接不上。Agent 平台062026-07-22皮是它的,脏器是我的引入一个开源的画布工作台:前端全量原样保留,只把服务层换掉。这是一份决策记录——记录了替换范围、必须守的纪律,以及这条路线的前提条件。Agent 平台072026-07-14一笔充值,要拆成几条流水?分销系统最容易在财务对账出错。单笔充值需同时产生平台收入、代理佣金等多条记录,必须在同一事务内闭合。四条规则与一个恒等式是账本设计的全部。Agent 平台082026-06-29模型记错了,用户得能删掉表格优先的记忆管理:用高信息密度工作台承载持久要点,可视化只作辅助,设计令牌贯穿全局。Agent 平台092026-06-27「赠送额度不能提现」——这句话得写进数据结构平台核心计费改造:余额从单一池拆成多个受限的桶,资源计价从各自为政统一为声明式框架。Agent 平台102026-06-23切成 N 份并行,产出反而更差编排引擎就位后,多 Agent 分工的关键不在并行度,而在分权、汇合规则与失败隔离。Agent 平台112026-06-21一次扇出,就能把机器打满从顺序调用升级为分阶段扇出的通用执行引擎,用 AI 规划编排拓扑、并发控制防爆、失败隔离传播。Agent 平台122026-06-11用量要算钱,那密钥就不能给客户端通过短期 Token、设备绑定、实时复校与 fail-closed 策略,阻断客户端绕过网关直连上游的三类路径。Agent 平台132026-06-07服务挂了,我是用户告诉我才知道的节点假 Ready 导致 52 实例宕机,用户反馈才发现。通过穿透式健康检测、分级自愈、分级告警,从被动反应改为主动防御。Agent 平台142026-06-03搬 574 个用户之前,先拿两个人试老 Swarm 平台向新 K8s 集群迁移 574 用户及其 124G 用户数据,以测试用户踩出的七个关键点固化成执行 runbook。Agent 平台152026-06-01不是撑不住,是每次撑不住都要停机平台从 Swarm 迁到 K8s 的核心理由不是功能完整度,而是增长代价——每次容量扩张都需要停机。Agent 平台162026-05-13一个用户一个容器——这个决定管了后面两年桌面便携方案无法规模化后,转向多租户云端是必然。核心决策:每用户独享容器。这个选择为隔离但代价是资源线性放大。Agent 平台172026-04-25接口能统一,能力差异不能如何设计一个Provider Registry来统一多家模型供应商接入,同时暴露关键能力差异。Agent 平台182026-04-23客户机上什么都没有,连运行库都没有客户机器不一定有 Node、Python、VC++ 运行库,交付物必须自带整个运行环境。解决方案的分层设计与三个隐藏的坑。Agent 平台192026-04-21Electron 要 60MB——在 U 盘上这不成比例便携 AI 助手的配置中心为什么选 Tauri 2 而不是默认答案 Electron,涉及包体积、工程复用、更新成本、系统集成四个决策点与代价分析。Agent 平台202026-04-19一切,从一个 U 盘启动器开始为什么从 USB 便携方案起步,带来的三个硬约束如何演化成后续架构的基石。Agent 平台

COLUMN ── 内容流水线(11)

AI 视频、漫剧、数字人的生产线工程。

012026-08-30提示词里的 @图片1 是从哪来的脚本节点批量出分镜图,资产却没成组、分镜节点没连线、@ 引用不生效。根因是自造了一套画布不认识的引用格式,整条链路脱离原生体系。内容流水线022026-08-19三十集的项目,点了十几轮提取一个 30 集项目点了十几轮资产提取,198 次模型调用烧掉 145.77 元,其中 95% 是重复的。断点续传的实现方式与费用确认浮窗的设计取舍。内容流水线032026-07-08配音时长不可控——那就让画面跟着它走数字人口播成片的最后一环:配音时长不可控,如何反向驱动画面?原片如何作为独立图层无损合成?成片路径如何保证确定性?内容流水线042026-07-02搬一条生产线,难的不是业务逻辑两条生产工作流从旧平台迁移到新平台,难点不在业务逻辑重写,而在解耦三处平台依赖——任务调度、存储约定、计费接口。内容流水线052026-06-25三十万字之后,AI 该记住什么?长篇到几十万字后,用分层记忆解决剧情断裂和设定崩坏——设定层硬约束、事实层概率检索、文本层按需取用,层级的存储与检索策略完全不同。内容流水线062026-06-19同一个角色,跨 60 个镜头不能换脸漫剧生成比单纯文生图复杂得多,需要在剧本→素材→分镜→成片四阶段维持一致性并优雅处理失败。内容流水线072026-06-09Star 数,不是选型依据建立选型方法论,把能力项拆细,对每个候选用具体模块而非笼统评分,再叠合复用度与活跃度,避免选型变成看 Star 数。内容流水线082026-03-29写第 40 章,该喂哪些前文?长篇章节生成的关键难点不是单章质量,而是如何在上下文窗口限额内,调度出真正有用的设定与前文,同时保证事实一致性。内容流水线092026-03-22把「写得像谁」变成机器能执行的参数如何把模糊的文风描述结构化成可执行的 Prompt 约束,并通过检测与修正形成闭环。内容流水线102026-03-15几十万字之后,设定得能被查出来长篇设定膨胀后无法精确召回。通过分层存储和世界切片策略,把稳定约束与演进事实分离,实现定向检索而非全量向量搜索。内容流水线112026-03-08你写一句,AI 补一句——写不出长篇聊天式续写在长篇小说上的三个结构性失效原因,与对应的系统化改造方向。内容流水线

COLUMN ── 交付与更新(8)

OTA、发版与桌面端交付的工程细节。

012026-08-16让会话记住目录,让回答能停下两个看似无关的功能:把工作目录从单次工具调用提升为会话级能力;让正在生成的回答可以中途停止并继续。共同点是给长动作加上用户的控制权。交付与更新022026-07-07桌面端只做壳,不装页面桌面端只加载远端地址,不把前端打进安装包。这条路线换来了独立的发版节奏,代价是离线不可用、首屏依赖网络,以及壳里必须自带的那部分本地运行时。交付与更新032026-06-16不让 AI 碰发版,不等于靠人记住每一步发版是明确不交给 AI 自主执行的操作。通过触发词精确化、步骤验证链条、故障处置内联,把流程固化到 skill,让高风险操作失败概率趋零。交付与更新042026-06-15两天连发两版,第二版是为了补第一版两天内连发两版解决 WS 端点变更与僵尸令牌问题,从手动兜底到全自动发版的演进。交付与更新052026-05-27跳过一个撤回的版本,客户就少了个 DLL增量包是相邻两版的差分,跳过中间版本会漏掉某版本引入的文件,导致客户启动崩溃。交付与更新062026-05-06更新包,能往客户机写任何文件构建三层防御阻止 OTA 恶意包注入:签名验证、解压边界、版本单调性。交付与更新072026-05-05同一个更新链路,我改了十一版设计OTA 链路 11 个设计版本的演进轨迹:从后端签名→前端下载验证→容错恢复→故障注入,两个关键转折点。交付与更新082026-04-26把文件拷到 U 盘——整条链路最脆的一环便携版看起来只是"把文件拷到 U 盘",实际涉及完整性、状态同步、就地更新、环境检测四大难点——这些问题构成了后续大量交付故障的根源。交付与更新

COLUMN ── 工具链观察(2)

AI 辅助开发的工具选择、规矩与边界。

012025-09-14那 5%,我不交给 AI绝大部分开发工作可以交给 AI,但有三类明确不交:架构设计、AI 多轮未解决的问题、极高风险操作。边界比能力更能说明判断力。工具链观察022025-07-20五个模型我都熟,只用一个Claude、GPT、Gemini、GLM、Kimi 都用熟了,日常固定只用一个。切换模型的真实成本不在学习模型本身,而在重建围绕它沉淀的一切。工具链观察