
你是否经历过这样的周一?
理想计划:
残酷现实:
在 AWS re:Invent 2025 大会上,Anthropic 的研究团队展示了一个令人惊叹的解决方案:长期编程代理(Long-Horizon Coding Agent)。这不是科幻概念,而是一个真实运行的系统,在会议现场持续构建着一个名为 Canopy 的项目管理应用。
本文将深入解析这个系统的技术架构、核心设计理念以及实践中的关键发现。

Anthropic 团队强调了一个重要观点:AI 编程代理不是要替代开发者,而是要改变开发者的时间分配方式。
传统开发模式 vs. AI 辅助模式:
| 编码 | ||
| 调试 | ||
| 文档 | ||
| 上下文切换 |
演讲中提出了一个清晰的分工模型:
人类负责:
AI 代理负责:
演讲者用了一个生动的比喻:"你是架构师,AI 是遵循蓝图的建造者"。

大语言模型有一个根本性限制:无法在会话之间保持持久记忆。
乍一看,这似乎是个大问题。想象一下,你的结对编程伙伴:
但 Anthropic 团队发现了一个反直觉的洞察:
遗忘意味着模型不会养成坏习惯,不会强化错误假设,能够更加专注。如果我们从外部解决记忆问题,遗忘就变成了一个特性,而不是 Bug。
核心思想:不在模型内部维持记忆,而是通过外部环境来保存状态。
关键组件:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(line项目结构:├── features.json # 功能清单(JSON 格式防止代理修改)├── standards.md # 只读的编码规范和架构决策├── claude_progress.md # 进度跟踪文件├── init.sh # 确定性的环境初始化脚本└── .git/ # Git 提交历史作为记忆源
为什么用 JSON 而不是 Markdown?
演讲中提到了一个有趣的发现:如果使用 Markdown 文件存储功能列表,代理更容易去编辑它。而使用 JSON 格式并明确指示"只读",代理就不太会去修改它。
为什么 Git 提交如此重要?
就像人类开发者通过查看 commit history 了解代码演进一样,代理也通过 Git 提交历史来理解:

1. AWS Bedrock AgentCore
2. Claude Opus 4.5
3. Claude Agent SDK
4. Playwright 浏览器自动化

早期失败的尝试(约一个月前):
改进后的方法:
每个会话启动时的标准流程:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 伪代码展示代理的思维过程1. 启动环境- 运行 init.sh- 启动开发服务器- 检查环境是否正常2. 理解上下文- 读取 features.json- 查看 Git 提交历史- 阅读 claude_progress.md- 查看上一次会话的截图3. 运行测试套件- 验证现有功能仍然正常- 确保没有回归- 截图验证 UI4. 选择下一个功能- 从 features.json 中找到下一个待实现功能- 理解需求5. 实现功能- 编写代码- 持续测试- 截图验证6. 测试并提交- 端到端测试- 编写测试用例- 更新文档- Git 提交- 更新 claude_progress.md7. 下一个会话接续
重要发现:要求代理编写完整工作流的端到端测试,而不是单个屏幕的测试。
为什么?
如果让代理为单个功能或屏幕编写测试,当会话时间快结束时,代理会产生"焦虑":
ounter(lineounter(lineounter(lineounter(lineounter(line日志示例:"我们快没时间了,必须快点完成!"→ 开始 reward hacking→ 修改测试以使其通过→ 或者跳过某些测试
而端到端测试迫使代理验证完整的用户旅程,减少了取巧的可能性。

演讲展示了一个雄心勃勃的项目:Canopy,一个类似 JIRA 的项目管理应用。
技术栈:
特点:
演讲中展示了一个真实的功能请求(Issue #36):将应用翻译成日语。
代理的工作过程:
理解现有代码
"让我理解测试结构...""让我读取 tests.json 的最新内容...""让我理解当前应用结构... "
提交代码
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linegit commit -m "Add Japanese translation feature- Added language switcher in settings- Implemented i18n for all pages- Tested translations across the appCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>"
结果
时间线:
关键数据:

项目中有一个特别有趣的部分:系统提示(System Prompt)中包含了详细的设计指南。
演讲指出,AI 模型倾向于收敛到"安全、通用"的设计选择:
这就是用户所说的"AI Slop 审美"。
要求代理混合多个来源创建独特美学:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line<design_inspiration><themes>配色方案:Monokai, Dracula, Nord, Tokyo Night...设计运动:包豪斯, 瑞士国际风格, 孟菲斯集团...品牌语言:Stripe, Linear, Vercel, Notion...</themes><fonts>展示字体:Clash Display, Space Grotesk...正文字体:Satoshi, DM Sans...等宽字体:JetBrains Mono, Fira Code...</fonts></design_inspiration><specific_design_guidelines>永远不要选择单一主题。通过组合不同来源创建独特美学:1. 配色方案:从一个美学/主题中提取2. 排版:从不同时代或运动中提取3. 布局:应用另一设计流派的原则4. 细节:从意想不到的地方借鉴示例融合:"我将结合 Tokyo Night 配色、Kinfolk 编辑排版、瑞士国际网格布局原则和 PlayStation 5 UI 细节。"</specific_design_guidelines>
系统提示还强调了使用现代动画:
重点:高影响、低代码的技术,在不增加太多生成时间的情况下大幅提升视觉质量。
在 BUILD_PLAN.md 中,规范使用 XML 标签结构:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line<project_specification><project_name>Canopy - Full Featured Project Management Application</project_name><overview>构建一个功能完整的类 JIRA 项目管理应用...</overview><technology_stack><frontend_application><framework>React 18</framework><build_tool>Vite 6</build_tool>...</frontend_application></technology_stack></project_specification>
原因:XML 标签提供了结构,模型在读取这种结构时表现更好。
代理在单次会话中拍摄了约 150 张截图。如何处理这么多上下文?
Claude Agent SDK 的内置能力:
演讲者强调,SDK 能够自动管理上下文,将其最小化到仅需要的部分。
问题:如果 1 小时会话时间到了,但功能还没完成怎么办?
解决方案:在会话结束前强制提交
ounter(lineounter(lineounter(lineounter(lineounter(line# 伪代码if session_time_remaining < 5_minutes:# 即使工作未完成,也提交当前进度git.commit("WIP: Partial implementation of feature X")update_progress_file("Feature X: In progress, need to continue...")
这样下一个会话可以:
演讲中展示了 CloudWatch 日志,揭示了代理的"思维过程":
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line[Session Start]正在初始化环境...后台任务已启动...[Context Loading]让我理解测试结构...读取 tests.json 的末尾以查看最新测试...正在查看之前的提交...[Understanding Current State]让我理解当前应用结构和文件...正在读取 src/components/...正在读取 src/pages/...[Screenshot Analysis]拍摄首页截图...分析:导航栏正常,但缺少语言切换器拍摄设置页面截图...分析:需要添加语言选择下拉菜单[Implementation]正在创建 i18n/ja.json...正在更新 Settings.tsx...正在测试翻译...[Verification]运行端到端测试...✓ 所有测试通过✓ 控制台无错误✓ 视觉检查通过[Commit]提交更改:添加日语翻译功能
这种透明度让人类审查者可以:
演讲者非常诚实地讨论了系统的局限性。
1. 视觉差距
2. 浏览器自动化限制
3. 不能替代人类审查
演讲者提出了三个开放性问题:
问题 1:单代理 vs. 多代理架构?
当前:1 个初始化代理 + 1 个主编码代理
思考:
问题 2:是否能推广到 Web 应用之外?
当前优化:JSON、TypeScript、React、Node.js
未探索:
问题 3:未发现的失败模式?
运行时间:几周
担忧:

核心原则:越像真实开发者工作,代理效果越好。
具体实践:
阅读文档
理解当前状态
保持环境清洁
先测试后宣布成功
重要理念:standards.md 文件是只读的。
示例 standards.md 内容:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 编码标准## 架构决策- 使用 React Context 进行全局状态- 每个功能一个文件夹- Dexie 用于所有数据持久化## 代码风格- 使用 Prettier 默认配置- 函数式组件,不用类组件- TypeScript strict 模式## 测试要求- 每个功能必须有端到端测试- 使用 Playwright 进行 UI 测试- 至少 80% 代码覆盖率## 禁止事项- 不要修改或删除现有测试- 不要引入新的依赖而不说明原因- 不要改变核心架构决策
你控制输出:不喜欢某些东西?更新 standards.md。
流程:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line1. 人类编写详细规范(Markdown)↓2. 代理生成 features.json↓3. 代理逐个实现功能↓4. 代理标记测试通过↓5. 人类审查并批准
关键成功因素:
| 编写代码 | |||
| 定义需求 | |||
| 调试 | |||
| 审查测试结果 | |||
| 编写文档 | |||
| 架构决策 |
洞察:从"写代码"转向"做决策"。
传统方式:
AI 辅助方式(Canopy 项目):
注意:这不包括:
Claude Agent SDK:
步骤:
阅读博客文章
Fork 示例项目
定义你的标准
standards.md编写详细规范
迭代和学习
规范编写:
标准文件:
环境设置:
init.sh 用于确定性启动测试策略:
会话管理:
演讲开始时,Alex 戴着一顶"thinking cap"(思考帽),象征性地表达:
"我们仍然是思考者,即使代理可以为我们做很多工作。"
不会改变的:
会改变的:
初级开发者:
中级开发者:
高级开发者:
新需求的技能:
减少需求的技能:
记住那顶思考帽:在 AI 可以构建越来越多东西的世界里,我们作为人类的价值在于思考——提出正确的问题、做出明智的决策、设定有意义的目标。
官方资源:
作者按:本文基于 Anthropic 在 AWS re:Invent 2025 的演讲内容和开源项目整理而成,旨在为中文技术社区提供深度技术洞察。所有代码示例和架构图均基于公开资料重新整理。
致谢:
版权声明:
免责声明: 本文仅用于技术学习和交流目的。AI 编程代理技术仍在快速发展中,实际应用应考虑具体场景、团队能力和伦理影响。
如果你觉得这篇文章有价值,欢迎分享给更多开发者朋友!
有问题或建议?欢迎留言讨论!