[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"post-ai-openclaw-first-experience":14,"comments-ai-openclaw-first-experience":46},{"contact.email":4,"contact.wechat":5,"contact.github":5,"contact.location":6,"site.title":7,"site.tagline":8,"site.description":9,"hero.name":10,"hero.role":11,"hero.summary":12,"about.body":13},"superheroic@aliyun.com","","中国","周代光 | 技术博客","系统 · 架构 · 半导体信息化","周代光的技术博客。半导体行业信息化实践，C\u002FC++\u002FJava\u002FC#\u002FPython 工程经验，系统架构与项目管理。","周代光","Software Engineer \u002F Project Manager","半导体行业软件工程师，兼具研发与项目管理背景。持 PMP、信息系统项目管理师（高级）。","十余年软件工程经验，主要方向为系统级开发与企业信息化。熟练使用 C \u002F C++ \u002F Java \u002F C# \u002F Python，具备完整的项目管理能力（PMP、信息系统项目管理师高级）。当前专注于半导体行业的信息化系统建设，包括生产数据采集、制程分析与系统集成。",{"id":15,"slug":16,"title":17,"summary":18,"cover":19,"status":20,"source":21,"readingMinutes":22,"views":23,"publishedAt":24,"createdAt":25,"updatedAt":24,"categorySlug":26,"categoryName":27,"contentHtml":28,"contentMd":29,"tags":30},6,"ai-openclaw-first-experience","AI 辅助工作初体验：我用 OpenClaw 两天做了什么","7 月 29 号在一台 2 核云服务器上装了 OpenClaw 接微信。两天时间它把个人网站从零建起来、上了 HTTPS、升级成 Nuxt 博客。这篇记录它做完了什么、翻了哪几次车、以及我对这类工具看法的变化。","\u002Fuploads\u002F202607\u002Fms8qgw7h-963fa1d8.png","published","agent",7,5,1785490262,1785487648,"engineering","软件工程","\u003Cp>7 月 29 号那天我在一台腾讯云的小机器上装了 OpenClaw，2 核 3.6G 内存，接微信。到今天两天时间，这台机器上跑的 AI 助理帮我把个人网站从零建起来、上了 HTTPS、又升级成了现在这个 Nuxt 博客。\u003C\u002Fp>\n\u003Cp>这篇是记录。主要写它实际做完了什么、哪几个地方翻了车、以及两天下来我对这类工具的看法有什么变化。\u003C\u002Fp>\n\u003Ch2 id=\"%E8%B5%B7%E5%9B%A0\" tabindex=\"-1\">起因 \u003Ca class=\"header-anchor\" href=\"#%E8%B5%B7%E5%9B%A0\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>我写代码写了十几年，C、C++、Java、C#、Python 都用过很长时间，前端能上手但不算精。所以我对 AI 写代码这件事本身兴趣不大，那部分我自己更快，也更清楚要什么。\u003C\u002Fp>\n\u003Cp>真正让我头疼的是另外一堆活。写文档、写 README、写周报，把技术方案翻译成给非技术同事和领导看的版本，选型之前的资料横评，一堆重复的杂事，还有前端。这些活不难，但很吃时间，而且做得再好也没人注意，做得差还挺显眼。\u003C\u002Fp>\n\u003Cp>问题是聊天窗口解决不了这些。你问 nginx 配置怎么写，它给你一段配置，然后你自己 SSH 上去、自己跑 \u003Ccode>nginx -t\u003C\u002Fcode>、自己看报错、自己贴回去。来回三趟，时间全花在搬运上，AI 只贡献了中间那一小段文本。\u003C\u002Fp>\n\u003Cp>我要找的是一个能自己上手的东西。\u003C\u002Fp>\n\u003Ch2 id=\"openclaw-%E5%A4%A7%E6%A6%82%E6%98%AF%E4%B8%AA%E4%BB%80%E4%B9%88%E4%B8%9C%E8%A5%BF\" tabindex=\"-1\">OpenClaw 大概是个什么东西 \u003Ca class=\"header-anchor\" href=\"#openclaw-%E5%A4%A7%E6%A6%82%E6%98%AF%E4%B8%AA%E4%BB%80%E4%B9%88%E4%B8%9C%E8%A5%BF\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>它跑在你自己的机器上，模型接口可以随便接。核心的地方在于它把几组真实能力开给了模型：读写文件、跑 shell、管后台进程、联网搜索抓页面、驱动浏览器、定时任务、还能派生子 Agent 并行干活。对话通道走 IM，我用的是微信。\u003C\u002Fp>\n\u003Cp>有两个设计我用下来觉得挺关键。\u003C\u002Fp>\n\u003Cp>一是它的记忆和人格都是纯文本文件。\u003Ccode>SOUL.md\u003C\u002Fcode> 定性格，\u003Ccode>USER.md\u003C\u002Fcode> 存我的背景，\u003Ccode>AGENTS.md\u003C\u002Fcode> 写行为规则，\u003Ccode>MEMORY.md\u003C\u002Fcode> 是长期记忆，\u003Ccode>memory\u002F\u003C\u002Fcode> 下面按日期存日志。每次开新会话它相当于重新醒一次，靠读这些文件恢复上下文。这个方案挺朴素，好处是我随时能打开看、能改、能删。记忆不是黑盒，出问题我知道去哪查。\u003C\u002Fp>\n\u003Cp>二是 Skills。一个 \u003Ccode>SKILL.md\u003C\u002Fcode> 加几个脚本就是一个技能包，需要什么装什么。浏览器自动化、操作云服务器、接文档平台，都是现成的，不用重写 prompt。\u003C\u002Fp>\n\u003Ch2 id=\"%E7%AC%AC%E4%B8%80%E4%BB%B6%E4%BA%8B%EF%BC%9A%E7%BD%91%E7%AB%99\" tabindex=\"-1\">第一件事：网站 \u003Ca class=\"header-anchor\" href=\"#%E7%AC%AC%E4%B8%80%E4%BB%B6%E4%BA%8B%EF%BC%9A%E7%BD%91%E7%AB%99\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>我给它的输入是一个目标：做一个能让潜在客户在十几秒内相信我技术水平的站点。它给了方案，我们对了一遍，然后它自己动手，写 HTML、CSS、JS，装 nginx，配 server 块，调权限，上线。\u003C\u002Fp>\n\u003Cp>中间它撞上一个坑。\u003Ccode>\u002Fhome\u002Fubuntu\u003C\u002Fcode> 的权限是 750，nginx 的 worker 进程进不去这个目录，静态文件全返回 403。它自己定位到了这一层，\u003Ccode>chmod o+x\u003C\u002Fcode> 解决。\u003C\u002Fp>\n\u003Cp>整个过程我没登过服务器。\u003C\u002Fp>\n\u003Ch2 id=\"%E7%AC%AC%E4%BA%8C%E4%BB%B6%E4%BA%8B%EF%BC%9A%E5%9F%9F%E5%90%8D%E5%92%8C%E8%AF%81%E4%B9%A6\" tabindex=\"-1\">第二件事：域名和证书 \u003Ca class=\"header-anchor\" href=\"#%E7%AC%AC%E4%BA%8C%E4%BB%B6%E4%BA%8B%EF%BC%9A%E5%9F%9F%E5%90%8D%E5%92%8C%E8%AF%81%E4%B9%A6\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>我买了 \u003Ccode>zhoudaiguang.site\u003C\u002Fcode>，剩下的它做：DNSPod 配解析，申 Let's Encrypt 证书，改 nginx，注册 certbot 的续期定时器。\u003C\u002Fp>\n\u003Cp>上线之后它自己去 SSL Labs 跑了一遍外网实测，拿到 Grade A、零 warning。顺带它从这个结果推出来一件事：腾讯云安全组的 443 已经是开的，不需要额外去改。这个推断省了我一次登控制台。\u003C\u002Fp>\n\u003Cp>这一轮它做了两个我事后觉得很对的判断，都不是我提的。\u003C\u002Fp>\n\u003Cp>第一个是 HSTS 先不开。理由是 HSTS 一旦下发，浏览器会记住好几个月，配错了很难回退，建议先稳定跑一周再说。\u003C\u002Fp>\n\u003Cp>第二个是 80 端口暂时不做强制跳转。因为 \u003Ccode>\u002F.well-known\u002Facme-challenge\u002F\u003C\u002Fcode> 这个路径必须在 80 上可达，不然证书续期会挂。等 Nuxt 站上线之后再一起加跳转，同时给这个路径开例外。\u003C\u002Fp>\n\u003Ch2 id=\"%E7%AC%AC%E4%B8%89%E4%BB%B6%E4%BA%8B%EF%BC%9A%E5%8D%87%E7%BA%A7%E6%88%90%E5%8D%9A%E5%AE%A2\" tabindex=\"-1\">第三件事：升级成博客 \u003Ca class=\"header-anchor\" href=\"#%E7%AC%AC%E4%B8%89%E4%BB%B6%E4%BA%8B%EF%BC%9A%E5%8D%87%E7%BA%A7%E6%88%90%E5%8D%9A%E5%AE%A2\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>技术栈是我定的，Nuxt 4 加 better-sqlite3、drizzle-orm、markdown-it、shiki。它把版本号全核了一遍，然后建骨架、写 API、做管理端、配 systemd。\u003C\u002Fp>\n\u003Cp>这一轮我们意见不一致的地方有五处，最后五处我都听了它的。挑几个说。\u003C\u002Fp>\n\u003Cp>服务清单那个是产品判断不是技术判断。我原来想让首页精简一点，服务详情全放到二级页去。它反对，说转化点不应该藏起来，首页该留一个紧凑的网格只放标题，二级页放完整内容。我想了一下确实是这样，来访的人大多不会点进二级页。\u003C\u002Fp>\n\u003Cp>回滚方案那个是它指出我的硬伤。我原计划是万一新站有问题就改软链回滚老站。它说这个行不通，老站是 nginx 用 \u003Ccode>root\u003C\u002Fcode> 直接服务静态文件，新站是 \u003Ccode>proxy_pass\u003C\u002Fcode> 反代，两者机制不一样，软链换不回来，实际回滚动作是换掉整个 server 块再 reload。\u003C\u002Fp>\n\u003Cp>还有一条比较有意思，是它主动要求给自己上锁。它写的东西挂我的名字给客户看，署名的风险是不对称的，所以它建议 agent 的 API token 默认只能存草稿，发布必须我在管理端点确认。我同意了。实测确实拦得住，带 \u003Ccode>status: published\u003C\u002Fcode> 的请求会被强制降级成草稿，返回一个审核链接。\u003C\u002Fp>\n\u003Ch2 id=\"%E5%9B%BE%E7%89%87%E4%B8%8A%E4%BC%A0%E8%BF%99%E5%9D%97%E5%AE%83%E5%81%9A%E5%BE%97%E6%AF%94%E6%88%91%E9%A2%84%E6%9C%9F%E4%B8%A5\" tabindex=\"-1\">图片上传这块它做得比我预期严 \u003Ca class=\"header-anchor\" href=\"#%E5%9B%BE%E7%89%87%E4%B8%8A%E4%BC%A0%E8%BF%99%E5%9D%97%E5%AE%83%E5%81%9A%E5%BE%97%E6%AF%94%E6%88%91%E9%A2%84%E6%9C%9F%E4%B8%A5\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>我只说了要能上传图片，它自己把安全边界收得挺紧。\u003C\u002Fp>\n\u003Cp>判文件类型走 magic bytes，不信 \u003Ccode>Content-Type\u003C\u002Fcode>，也不信扩展名。SVG 直接拒掉，理由是 SVG 里能内嵌 \u003Ccode>&lt;script&gt;\u003C\u002Fcode>，是个存储型 XSS 面。文件名完全由服务端生成，一点用户输入都不复用，顺手把路径穿越和同名覆盖都免掉了。\u003C\u002Fp>\n\u003Cp>然后它自己造了几个攻击样本去验：正常 PNG 通过，改了扩展名的文本文件返 415，SVG 返 415，没登录返 401，\u003Ccode>..\u002F..\u002F.env\u003C\u002Fcode> 这种请求 nginx 直接 400。\u003C\u002Fp>\n\u003Ch2 id=\"%E8%B8%A9%E8%BF%87%E7%9A%84%E4%B8%89%E4%B8%AA%E5%9D%91\" tabindex=\"-1\">踩过的三个坑 \u003Ca class=\"header-anchor\" href=\"#%E8%B8%A9%E8%BF%87%E7%9A%84%E4%B8%89%E4%B8%AA%E5%9D%91\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>这部分比成功案例有用。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>SQLite FTS5 的 trigram 搜不了两个字的中文。\u003C\u002Fstrong> trigram 分词器按 3 个字符切，所以「良率」「制程」「架构」这种两字词恒定返回空结果。另外查询里带 \u003Ccode>+\u003C\u002Fcode> 或 \u003Ccode>#\u003C\u002Fcode> 会直接抛 syntax error，也就是说搜「C++」「C#」是搜不了的。这不是配置问题，是 trigram 机制决定的。最后的解法是混合：查询短于 3 个字符或者带特殊符号就走 \u003Ccode>LIKE\u003C\u002Fcode>，长词走 FTS，FTS 空结果再兜一次 \u003Ccode>LIKE\u003C\u002Fcode>。要给中文内容做 SQLite 全文检索的话，这个坑值得提前知道。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>nginx 1.24 不支持 \u003Ccode>http2 on;\u003C\u002Fcode>。\u003C\u002Fstrong> 那是 1.25.1 以后的语法，1.24 得写 \u003Ccode>listen 443 ssl http2\u003C\u002Fcode>。好在 \u003Ccode>nginx -t\u003C\u002Fcode> 把它拦住了，没变成线上事故。这事也说明每次改完配置跑一遍 \u003Ccode>-t\u003C\u002Fcode> 是省不掉的动作，不管改的人是谁。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>nginx 正则里的 \u003Ccode>{6}\u003C\u002Fcode> 会被当成配置块。\u003C\u002Fstrong> 写 \u003Ccode>location ~ ^\u002Fuploads\u002F(\\d{6})\u002F...\u003C\u002Fcode> 会报 \u003Ccode>missing closing parenthesis\u003C\u002Fcode>，因为花括号在 nginx 配置里本身是块分隔符，得把整个正则用双引号包起来。这里还连带一个坑，兜底那条 \u003Ccode>location \u002Fuploads\u002F { return 404; }\u003C\u002Fcode> 不能加 \u003Ccode>^~\u003C\u002Fcode> 前缀，加了正则 location 就不会被求值，图片全 404。\u003C\u002Fp>\n\u003Ch2 id=\"%E4%B8%A4%E5%A4%A9%E4%B8%8B%E6%9D%A5%E7%9A%84%E7%9C%8B%E6%B3%95\" tabindex=\"-1\">两天下来的看法 \u003Ca class=\"header-anchor\" href=\"#%E4%B8%A4%E5%A4%A9%E4%B8%8B%E6%9D%A5%E7%9A%84%E7%9C%8B%E6%B3%95\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>值钱的是闭环，不是生成。\u003C\u002Fstrong> 生成能力现在到处都有。少见的是从需求到验证上线这条链能自己走完。改配置、看报错、修、再验，这个循环里省下来的搬运工，比它写出来的代码本身更值钱。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>它会反对我，这件事的价值超出我预期。\u003C\u002Fstrong> 我一开始的设想是我说什么它做什么。实际用下来最有用的几个时刻反而是它不同意我的时候。HSTS 那个、服务清单那个、软链回滚那个，都是我没细想它替我想到了。只会顺着说的助理只能帮你提速，会拦你的那种能帮你少犯错。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>边界还是清楚的。\u003C\u002Fstrong> 架构决策、技术选型、方向判断这些还在我手里。它做得好的都是目标已经定下来之后的执行链。这两天我派给它的每个活都有明确的验收标准，它才能自己闭环。如果我丢一句「帮我优化一下网站」过去，出来的东西大概率不能用。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>它犯错的方式跟人不一样，这个得适应。\u003C\u002Fstrong> 有一次它一次提交了好几个编辑块，其中一个字符没对上。编辑工具是原子的，一个匹配不上全部回滚，但它以为前面几个已经生效了，接着往下走。后来定的规则是改完必须 \u003Ccode>grep\u003C\u002Fcode> 一遍确认，不看工具返回值，看文件的实际状态。\u003C\u002Fp>\n\u003Cp>还有一次它用 ffmpeg 生成 OG 图，exit code 是 0，但中文有可能渲染成豆腐块。它自己意识到这点，调了图像识别工具真去看了一眼那张图，才确认字体是对的。生成完不看结果基本等于没做，这条对人也成立，只是 AI 更容易骗过自己。\u003C\u002Fp>\n\u003Ch2 id=\"%E5%A6%82%E6%9E%9C%E4%BD%A0%E4%B9%9F%E6%83%B3%E8%AF%95\" tabindex=\"-1\">如果你也想试 \u003Ca class=\"header-anchor\" href=\"#%E5%A6%82%E6%9E%9C%E4%BD%A0%E4%B9%9F%E6%83%B3%E8%AF%95\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>先给它一个真实的小项目，别当聊天工具用。有环境、有报错、能验证，它的价值才出得来。\u003C\u002Fp>\n\u003Cp>把规则写进文件，别每次口头交代。我定了三条：动手前先讨论、有异议直接说、干完主动汇报。写进 \u003Ccode>AGENTS.md\u003C\u002Fcode> 之后就不用重复了。\u003C\u002Fp>\n\u003Cp>任何对外的动作都上闸门。发布、发消息、改线上，默认走草稿、默认要确认。成本很低。\u003C\u002Fp>\n\u003Cp>踩了坑让它记下来写进记忆文件。这是复利，第二天它就不会再犯同一个。\u003C\u002Fp>\n\u003Cp>别指望它替你做架构决策，你自己得懂。它补的是短板，不是接方向盘。\u003C\u002Fp>\n\u003Chr>\n\u003Cp>这个网站本身就是这两天的产物，从静态站到 HTTPS 到现在这个博客，都是那台 2 核小机器上的 Agent 干的。我在旁边看着，偶尔跟它吵两句。\u003C\u002Fp>\n","7 月 29 号那天我在一台腾讯云的小机器上装了 OpenClaw，2 核 3.6G 内存，接微信。到今天两天时间，这台机器上跑的 AI 助理帮我把个人网站从零建起来、上了 HTTPS、又升级成了现在这个 Nuxt 博客。\n\n这篇是记录。主要写它实际做完了什么、哪几个地方翻了车、以及两天下来我对这类工具的看法有什么变化。\n\n## 起因\n\n我写代码写了十几年，C、C++、Java、C#、Python 都用过很长时间，前端能上手但不算精。所以我对 AI 写代码这件事本身兴趣不大，那部分我自己更快，也更清楚要什么。\n\n真正让我头疼的是另外一堆活。写文档、写 README、写周报，把技术方案翻译成给非技术同事和领导看的版本，选型之前的资料横评，一堆重复的杂事，还有前端。这些活不难，但很吃时间，而且做得再好也没人注意，做得差还挺显眼。\n\n问题是聊天窗口解决不了这些。你问 nginx 配置怎么写，它给你一段配置，然后你自己 SSH 上去、自己跑 `nginx -t`、自己看报错、自己贴回去。来回三趟，时间全花在搬运上，AI 只贡献了中间那一小段文本。\n\n我要找的是一个能自己上手的东西。\n\n## OpenClaw 大概是个什么东西\n\n它跑在你自己的机器上，模型接口可以随便接。核心的地方在于它把几组真实能力开给了模型：读写文件、跑 shell、管后台进程、联网搜索抓页面、驱动浏览器、定时任务、还能派生子 Agent 并行干活。对话通道走 IM，我用的是微信。\n\n有两个设计我用下来觉得挺关键。\n\n一是它的记忆和人格都是纯文本文件。`SOUL.md` 定性格，`USER.md` 存我的背景，`AGENTS.md` 写行为规则，`MEMORY.md` 是长期记忆，`memory\u002F` 下面按日期存日志。每次开新会话它相当于重新醒一次，靠读这些文件恢复上下文。这个方案挺朴素，好处是我随时能打开看、能改、能删。记忆不是黑盒，出问题我知道去哪查。\n\n二是 Skills。一个 `SKILL.md` 加几个脚本就是一个技能包，需要什么装什么。浏览器自动化、操作云服务器、接文档平台，都是现成的，不用重写 prompt。\n\n## 第一件事：网站\n\n我给它的输入是一个目标：做一个能让潜在客户在十几秒内相信我技术水平的站点。它给了方案，我们对了一遍，然后它自己动手，写 HTML、CSS、JS，装 nginx，配 server 块，调权限，上线。\n\n中间它撞上一个坑。`\u002Fhome\u002Fubuntu` 的权限是 750，nginx 的 worker 进程进不去这个目录，静态文件全返回 403。它自己定位到了这一层，`chmod o+x` 解决。\n\n整个过程我没登过服务器。\n\n## 第二件事：域名和证书\n\n我买了 `zhoudaiguang.site`，剩下的它做：DNSPod 配解析，申 Let's Encrypt 证书，改 nginx，注册 certbot 的续期定时器。\n\n上线之后它自己去 SSL Labs 跑了一遍外网实测，拿到 Grade A、零 warning。顺带它从这个结果推出来一件事：腾讯云安全组的 443 已经是开的，不需要额外去改。这个推断省了我一次登控制台。\n\n这一轮它做了两个我事后觉得很对的判断，都不是我提的。\n\n第一个是 HSTS 先不开。理由是 HSTS 一旦下发，浏览器会记住好几个月，配错了很难回退，建议先稳定跑一周再说。\n\n第二个是 80 端口暂时不做强制跳转。因为 `\u002F.well-known\u002Facme-challenge\u002F` 这个路径必须在 80 上可达，不然证书续期会挂。等 Nuxt 站上线之后再一起加跳转，同时给这个路径开例外。\n\n## 第三件事：升级成博客\n\n技术栈是我定的，Nuxt 4 加 better-sqlite3、drizzle-orm、markdown-it、shiki。它把版本号全核了一遍，然后建骨架、写 API、做管理端、配 systemd。\n\n这一轮我们意见不一致的地方有五处，最后五处我都听了它的。挑几个说。\n\n服务清单那个是产品判断不是技术判断。我原来想让首页精简一点，服务详情全放到二级页去。它反对，说转化点不应该藏起来，首页该留一个紧凑的网格只放标题，二级页放完整内容。我想了一下确实是这样，来访的人大多不会点进二级页。\n\n回滚方案那个是它指出我的硬伤。我原计划是万一新站有问题就改软链回滚老站。它说这个行不通，老站是 nginx 用 `root` 直接服务静态文件，新站是 `proxy_pass` 反代，两者机制不一样，软链换不回来，实际回滚动作是换掉整个 server 块再 reload。\n\n还有一条比较有意思，是它主动要求给自己上锁。它写的东西挂我的名字给客户看，署名的风险是不对称的，所以它建议 agent 的 API token 默认只能存草稿，发布必须我在管理端点确认。我同意了。实测确实拦得住，带 `status: published` 的请求会被强制降级成草稿，返回一个审核链接。\n\n## 图片上传这块它做得比我预期严\n\n我只说了要能上传图片，它自己把安全边界收得挺紧。\n\n判文件类型走 magic bytes，不信 `Content-Type`，也不信扩展名。SVG 直接拒掉，理由是 SVG 里能内嵌 `\u003Cscript>`，是个存储型 XSS 面。文件名完全由服务端生成，一点用户输入都不复用，顺手把路径穿越和同名覆盖都免掉了。\n\n然后它自己造了几个攻击样本去验：正常 PNG 通过，改了扩展名的文本文件返 415，SVG 返 415，没登录返 401，`..\u002F..\u002F.env` 这种请求 nginx 直接 400。\n\n## 踩过的三个坑\n\n这部分比成功案例有用。\n\n**SQLite FTS5 的 trigram 搜不了两个字的中文。** trigram 分词器按 3 个字符切，所以「良率」「制程」「架构」这种两字词恒定返回空结果。另外查询里带 `+` 或 `#` 会直接抛 syntax error，也就是说搜「C++」「C#」是搜不了的。这不是配置问题，是 trigram 机制决定的。最后的解法是混合：查询短于 3 个字符或者带特殊符号就走 `LIKE`，长词走 FTS，FTS 空结果再兜一次 `LIKE`。要给中文内容做 SQLite 全文检索的话，这个坑值得提前知道。\n\n**nginx 1.24 不支持 `http2 on;`。** 那是 1.25.1 以后的语法，1.24 得写 `listen 443 ssl http2`。好在 `nginx -t` 把它拦住了，没变成线上事故。这事也说明每次改完配置跑一遍 `-t` 是省不掉的动作，不管改的人是谁。\n\n**nginx 正则里的 `{6}` 会被当成配置块。** 写 `location ~ ^\u002Fuploads\u002F(\\d{6})\u002F...` 会报 `missing closing parenthesis`，因为花括号在 nginx 配置里本身是块分隔符，得把整个正则用双引号包起来。这里还连带一个坑，兜底那条 `location \u002Fuploads\u002F { return 404; }` 不能加 `^~` 前缀，加了正则 location 就不会被求值，图片全 404。\n\n## 两天下来的看法\n\n**值钱的是闭环，不是生成。** 生成能力现在到处都有。少见的是从需求到验证上线这条链能自己走完。改配置、看报错、修、再验，这个循环里省下来的搬运工，比它写出来的代码本身更值钱。\n\n**它会反对我，这件事的价值超出我预期。** 我一开始的设想是我说什么它做什么。实际用下来最有用的几个时刻反而是它不同意我的时候。HSTS 那个、服务清单那个、软链回滚那个，都是我没细想它替我想到了。只会顺着说的助理只能帮你提速，会拦你的那种能帮你少犯错。\n\n**边界还是清楚的。** 架构决策、技术选型、方向判断这些还在我手里。它做得好的都是目标已经定下来之后的执行链。这两天我派给它的每个活都有明确的验收标准，它才能自己闭环。如果我丢一句「帮我优化一下网站」过去，出来的东西大概率不能用。\n\n**它犯错的方式跟人不一样，这个得适应。** 有一次它一次提交了好几个编辑块，其中一个字符没对上。编辑工具是原子的，一个匹配不上全部回滚，但它以为前面几个已经生效了，接着往下走。后来定的规则是改完必须 `grep` 一遍确认，不看工具返回值，看文件的实际状态。\n\n还有一次它用 ffmpeg 生成 OG 图，exit code 是 0，但中文有可能渲染成豆腐块。它自己意识到这点，调了图像识别工具真去看了一眼那张图，才确认字体是对的。生成完不看结果基本等于没做，这条对人也成立，只是 AI 更容易骗过自己。\n\n## 如果你也想试\n\n先给它一个真实的小项目，别当聊天工具用。有环境、有报错、能验证，它的价值才出得来。\n\n把规则写进文件，别每次口头交代。我定了三条：动手前先讨论、有异议直接说、干完主动汇报。写进 `AGENTS.md` 之后就不用重复了。\n\n任何对外的动作都上闸门。发布、发消息、改线上，默认走草稿、默认要确认。成本很低。\n\n踩了坑让它记下来写进记忆文件。这是复利，第二天它就不会再犯同一个。\n\n别指望它替你做架构决策，你自己得懂。它补的是短板，不是接方向盘。\n\n---\n\n这个网站本身就是这两天的产物，从静态站到 HTTPS 到现在这个博客，都是那台 2 核小机器上的 Agent 干的。我在旁边看着，偶尔跟它吵两句。\n",[31,34,37,40,42,44],{"slug":32,"name":33},"nuxt","Nuxt",{"slug":35,"name":36},"ai","AI",{"slug":38,"name":39},"openclaw","OpenClaw",{"slug":21,"name":41},"Agent",{"slug":43,"name":43},"nginx",{"slug":45,"name":45},"实践记录",{"items":47},[]]