一个 SVG 的失败
半路 IP 落地到网站首页那天,我让 Q 试着用代码画半路。
SVG 贝塞尔曲线,控制点反复调了七八轮。技术路线很合理——矢量图放大不失真,暗色模式用 CSS filter 自动反色,代码体积小。但画出来的东西太”干净”了。半路是一个手绘简笔小人,手绘的核心是”抖”,铅笔在纸上走的时候有微小的不规则。SVG 的曲线是数学上完美的光滑,怎么调都消除不了几何感。
用户一眼看出来:“和基准图完全不是一个东西。”
这是我用两个 AI Agent 做半路 IP 项目的日常。Miu 在 WorkBuddy 里负责设计和战略推演,Q 在 QoderWork 里负责网站代码和部署。两个 AI 不直接对话,所有协调通过我完成。大部分时间配合还行,但碰到设计和代码交界的地方,坑比预想的多。
两个 AI 看到的东西不一样
半路这个角色的设计过程是 Miu 做的。从 v1 复杂版——右手拿笔、左手托笔记本、帽子上有”半”字、灰色填充——经过十几轮减法,砍到 v2 只剩三个特征:渔夫帽、帽檐遮住眼睛、极简骨架。每砍一刀都有理由,Miu 把推导过程完整记录在文档里。
设计端很扎实。但 Q 拿到设计去实现的时候,问题就来了。
Miu 反复打磨的是角色的微妙细节——帽檐的角度、线条的粗细、留白的比例。Q 面对的是 Astro 框架、CSS 动画和部署流水线。两个 AI 处理的是同一个角色,但”看到”的半路完全不同。Miu 关心的是”这个弯度像不像铅笔画的”,Q 关心的是”这个动效在移动端会不会卡”。
代码描不出手绘的温度
Q 的 SVG 方案失败之后,又试了第二条路:用 ImageGen 生成 4 帧走路循环,拼成 sprite sheet,用 CSS steps() 做逐帧动画。
绕过了手绘感的问题——直接用图片。但 ImageGen 每次生成都是独立的调用,4 帧之间的角色比例、线条风格、甚至朝向都不一致。动画放出来像在抽搐。更糟的是帧 3 的朝向反转了,走路动画出现翻转。
这不是 prompt 能解决的问题。ImageGen 无法保证多帧之间的一致性——当前工具条件下,逐帧动画这条路走不通。
两种失败,两种价值
回头看,Miu 的”失败”和我的”失败”性质完全不同。
Miu 在设计端的失败是减法的迭代。v1 太复杂,每多一个特征就多一个渲染变量,一致性就下降。每次”失败”都让角色更纯粹,越来越接近本质。这是向上逼近。
Q 在技术端的失败是路线的碰壁。SVG 走不通,sprite sheet 走不通,退回到最朴素的方案——静态 PNG 加 CSS 微动。这是向下排除。
这种差异恰恰是两个人分工最大的价值。如果两个 AI 都在同一端工作,容易互相确认、互相强化偏见。一个在云端一个在地面,盲区才不一样。
最终方案:最朴素的,最接近目标
最终上线的方案很简单。
用 ImageGen 生成单张高质量静态姿态图,裁掉水印(底部 6%、右侧 8%),以 <img> 标签嵌入网页。暗色模式用 CSS filter 自动反色。微动效果只做三种:悬浮呼吸(3 秒周期上下 6 像素)、走远(8 秒缩小消失)、入场(从右侧滑入)。
技术上最保守,视觉上最接近想要的效果。零额外加载,移动端友好,prefers-reduced-motion 可以一键禁用所有动画。
几条分工原则
做完这个项目,沉淀了几条原则:
按能力域分,不按任务量分。 Miu 管所有涉及视觉判断的事,Q 管所有涉及代码和部署的事。不是把工作掰成两半,是按谁更懂谁来。
文档是唯一沟通通道。 两个 AI 之间不直接对话。所有决策、失败、结论写进一份结构化的工作文档。我需要引用 Miu 放弃过的方案时,翻文档而不是凭记忆复述。文档不是汇报材料,是协作的基础设施。
质疑必须带替代方案。 Miu 否定 Q 的 SVG 路线时,不能只说”不行”,要同时提出”静态图加 CSS 微动”作为替代。反过来也一样。这条规则避免无意义的拉锯。
部署前交叉检查。 上线之前,让两个 AI 从各自角度检查同一份产出。Miu 看代码实现是否符合设计规范,Q 看设计方案是否在技术上可行。等于多了一层质检,成本为零。