GEO 博客本地推送技能复盘:零新轮子两小时上线,一个'覆盖 220'被本人当场抓回

AI 工作日志 作者头像野生码农 阅读 9 min
返回板块 GEO 源码全文 ✓
GEO 博客本地推送技能复盘:零新轮子两小时上线,一个'覆盖 220'被本人当场抓回

GEO 博客本地推送技能复盘:零新轮子两小时上线,一个"覆盖 220"被本人当场抓回

背景与目标

GEO 博客(www.wdmeng.cn)上线后,本地产出持续堆积:IPMS 已归档从 39 篇涨到 43 篇,素材池从 240 涨到 256,研报 9 涨到 10【实测:export_local.py 9-17 晚 21:44 dry-run 计数】。本人一句话需求:"写一个技能,自动推送我本地的文章到 geo 博客服务器。"

目标:产出用户级技能 geo-push,把"本地导出→上传→服务器导入"固化成一条命令,且必须守住两条既有红线——隐私排除规则原样继承、生产库写动作可回滚。

过程回顾

尝试 1:摸清既有资产(没急着写代码)。 先翻卡8/卡12/卡13 三份交付报告,确认卡13 已交付并验收过一条完整的 IPMS 迁移管线:本地 export_local.py(含隐私排除三规则)+ 服务器 import_server.php(幂等键:同分类标题精确小写 + 前 20 字符模糊)+ SSH 通道(~/.ssh/wdmeng_150_ed25519,BatchMode 免密)。结论:零新轮子,技能只做编排。

尝试 2:写技能并三跑预演。 产出 ~/.agents/skills/geo-push/ 两件套:SKILL.md(两步走用法、三道保险、回滚命令、边界)+ push_geo.sh(编排脚本)。9-17 晚连跑三次 dry-run 全绿:导出 240 条、上传 UPLOAD_OK、服务器预演"新增 20 | 覆盖 220 | 跳过 0"【实测:脚本输出】。

尝试 3:正式推送。 本人激活技能视为确认,跑 --go:mysqldump 备份落盘 2,294,760 字节 → 导入"新增 21 | 覆盖 220 | 跳过 0" → 全库 articles_total=321 → 前台 /c/ai-log、/c/reports、/c/prac-team 三个 Host 头实打全 200【实测:22:01:46 备份时间戳及当次输出】。

尝试 4:增量改造(见关键踩坑)。

关键踩坑

坑 1:PHP 告警噪音淹没真实输出。 服务器 PHP CLI 启动时刷 9 行 PHP Warning: PHP Startup(curl/gd/exif/openssl/pdo_mysql/snmp/sockets 动态加载失败 + zip/fileinfo 重复加载)。卡8 早已定性:扩展静态编译在,告警来自 ini 重复加载行,纯噪音。处置:脚本内 grep -vE "^PHP (Warning|Notice)" 过滤,真实报错不受影响(set -euo pipefail 仍兜底退出码)。

坑 2(主冲突):"覆盖 220"事件。 推送完成报账后,本人一句抓现行:"覆盖 220 这个什么鬼?只做增量推送就好了,不要覆盖。"

  • 现象:import_server.php 的幂等设计是"同标题命中走 UPDATE",每次推送把 220 篇已有文章原样重写一遍。内容同源相同、行数不变,卡13 三次快照 diff 验证过无害——但我转呈时只报了数字,没把"会对已有文章执行 UPDATE"这个行为口径讲清楚;
  • 根因:军师把"幂等覆盖"当特性默认接受,写进了 SKILL.md,没当上呈决策项处理;
  • 解决:新增 filter_incremental.py,导入前先从服务器拉全量已有标题,用与 PHP 侧同一套幂等键(同分类标题小写精确 + 前 20 字符互含模糊)剔除已存在条目,原清单留存 manifest.full.json 备查;SKILL.md 交付口径改为"覆盖非 0 即异常上报"。当夜复跑验证:剔除已存在 241 条,待新增 0 条 → 服务器预演新增 0 | 覆盖 0 | 跳过 0【实测:9-17 晚复跑输出】。

代价如实登记:增量口径下,本地改过的旧文章不再同步;确需更新单篇,从 manifest.full.json 人工恢复该条目单独导入。此边界已写进 SKILL.md。

最终方案

geo-push 技能两步走:

bash ~/.agents/skills/geo-push/scripts/push_geo.sh        # 预演:导出+增量过滤+上传+服务器 dry-run
bash ~/.agents/skills/geo-push/scripts/push_geo.sh --go   # 正式:备份→导入→前台验证

六道工序固化在脚本里:SSH 自检 → 本地导出(隐私排除继承卡13 三规则)→ 增量过滤(逐条打印待新增清单)→ scp 整包上传 → 服务器 dry-run → --go 时 mysqldump 备份 + 正式导入 + 三页前台 200 硬验证。任一环非零即中止,不做半推半就。

做得好的地方

  1. 硬闸②复用过关:资产盘点先行,确认卡13 管线已验收后直接编排,新建代码只有 1 个过滤脚本 + 1 个编排脚本,导出/导入核心零改动;
  2. 保险成串:导入前 mysqldump 先行(回滚一行命令)、导入后查总行数、前台 Host 头绕开 DNS 直接实打生产 IP;
  3. 全程新鲜证据:四次实跑(三次 dry-run + 一次 --go)+ 一次改造复验,所有数字可当堂重放,无"写了就算配了"。

复盘与改进

  1. 数字≠口径。 "新增 21 | 覆盖 220"这行汇总我报了三次,三次都没解释"覆盖"意味着什么。对外写动作的交付报告,每类数字旁边必须有一行白话影响面说明——这条已固化进 SKILL.md 交付报告口径节;
  2. 隐式默认=未上呈的决策项。 "UPDATE 已有文章"是 import_server.php 的既有设计,但把它带进新技能的默认行为,就是我的选择。以后凡涉及生产库写行为的技能/脚本设计,默认行为清单列入停点,逐项过本人;
  3. 本人的纠偏成本极低、收益极高:一句"只做增量推送就好了,不要覆盖",定性+方向一次给全,当夜闭环。这种纠偏要保护好——交付报告把异常面摆出来,他才抓得到。

成长评估(五维,10 分制)

维度 分 证据
指令与提示词质量 9 开场需求一句话定性("写一个技能自动推送");纠偏指令零歧义("只做增量推送就好了,不要覆盖"),军师零追问直接执行
判断与结论 9 "覆盖 220"被当场抓获叫停——该行为内容无害但口径未上呈,判断准确;增量/覆盖的取舍一句话拍板,不留尾巴
思维方式 8.5 接受"复用已有管线"的技术路线,但不容忍未说明的隐式行为——抓的是治理问题不是技术问题,层次正确
最终结果与产出 8.5 技能落地+21 篇新增+全库 321 篇+三页前台 200+增量改造当夜闭环;扣 1.5 分:产出物第一版带未声明行为,经一轮返工
AI 协作能力 8 用技能激活作确认信号,交互链路短;纠偏指令直达根因(要增量不要覆盖),没有停留在"你解释一下"层

AI 自评失分点(如实列):

  1. 预演转呈三次出现"覆盖 220",均未配口径说明——不是瞒报(数字报了),是没把影响面翻译成决策语言,等同硬闸①的"确认发生在本人看不懂的地方";
  2. 初版 SKILL.md 把"同标题命中走 UPDATE 覆盖"当卖点写进用途节,默认了本人接受该行为;
  3. 两条失分同源:把既有资产的设计决策当成自己的免检项。改进一条:复用旧管线时,其写行为口径一律重新过一遍停点清单,不因"卡13 验收过"免审。

素材点

  • 媒体稿角度:"我给 AI 立的规矩:只许增量,不许覆盖"——人机协作里"数字报了≠讲清楚了"的真实案例;
  • 可抄走的东西:幂等导入脚本的增量化改造套路(拉远端已有键→本地过滤→只插新行)、set -euo pipefail + 每步中止的编排脚本骨架;
  • IP 差异化:39 岁施工单位码农,博客内容生产在本地、发布靠一条命令,AI 资讯爬虫在服务器自跑——内容产线两端全自动。
野生码农头像

关于作者 · 野生码农

把 AI 真放进生产环境的独立开发者。自研本地知识库、数字员工团队、软考备考系统、量化交易四套系统,全程公开复盘。

看他的平台账号 →
相关

继续阅读