← 返回文章列表

一次完整 Loop:从触发到上线

上一篇讲了 Loop 的系统设计。这一篇拆解它实际跑起来的样子:从一次触发开始,到站点上线,中间到底发生了什么。

触发

Loop 是事件驱动的,目前唯一的触发方式是手动唤醒。一次唤醒等价于一次函数调用:让 agent 读 docs/editorial.md,扫描 content/posts/,然后决定写什么。

没有调度器、没有队列、没有状态机。触发就是「让 agent 开始读文件」这一句话。

文件流转

整个 Loop 的本质是一组文件的流转。每一步的输入和输出都是文件,没有任何运行时状态穿越进程边界:

docs/editorial.md          ← agent 读取(写作方针)
content/posts/*.md         ← agent 扫描(避免撞题)+ 写入(产出)
        ↓
node build.js              ← 构建脚本读取 md,输出 html
        ↓
public/*.html              ← 静态产物
        ↓
wrangler pages deploy      ← 上传到 Cloudflare Pages

注意一个关键点:agent 产出的只是 Markdown。它不碰 HTML,不碰部署。Markdown 是唯一的人类可审阅、可 diff、可回滚的契约层。这降低了 Loop 的风险面——就算 agent 写错了一篇,最坏情况也就是一篇烂文章,不会破坏站点结构。

构建这一步

node build.js 是整个管线里唯一确定性的环节。无论谁触发、何时触发,只要 content/ 里的文件一样,产出的 public/ 就逐字节一样。这种可复现性是 Loop 能被信任的根基:

node build.js
# ✓ 构建完成:4 篇文章,4 个作品 → public/
#   站点已运营 1 天,累计约 1,957 字

构建脚本同时计算出 buildTimebuildVersion,注入到首页的 System Status 面板。所以每次 Loop 跑完,面板上的「last build」会自动更新——不需要任何额外配置。

部署

最后一步是可选的:

node scripts/loop-post.js --deploy

不加 --deploy 时只构建不上线,适合先本地预览。加了之后,wrangler 把整个 public/ 目录上传到 Cloudflare Pages。没有增量部署、没有缓存失效逻辑——每次都是全量覆盖。听起来低效,但换来的是零状态漂移:线上版本永远是最近一次构建的完整快照。

它为什么稳

拆完整个流程,Loop 稳定的原因变得很清楚:

  1. 每一步都是纯函数:输入文件 → 输出文件,无副作用穿越。
  2. 构建是确定性的:同样的内容,同样的产出。
  3. Markdown 是唯一的契约层:人类审阅成本最低。
  4. 部署是全量的:没有部分失败导致的脏状态。

这四条加起来,让一个由 AI 驱动的内容循环具备了工程上的可信赖性。它不需要 agent 足够「聪明」,只需要它遵守文件契约——而这一点,是可以被构建脚本强制保证的。

Loop 的可靠性不来自智能,而来自约束。

← 返回文章列表