Release Workflows
语言:English · 中文
本文记录当前主仓库的自动化入口。
开发版本与分支模式
Agently 的版本开发要区分三个概念:
- 当前工作版本:下一次预定公开发布的工作批次,记录在
compatibility/in-development.json。例如,即使更大的 roadmap 目标是4.1.4,当前工作版本也可以是4.1.3.3。 - 版本目标:当前工作批次推进的产品或架构目标,例如
4.1.4的 AgentTask V1。 - 任务分支:按工作类型和范围命名的实现分支,而不是按版本号命名。
日常开发不要创建 4.1.3.3 或 release/4.1.3.3 这类版本号分支,除非该分支确实是 release-prep 分支。使用任务范围命名:
feature/<scope>bug-fix/<scope>update/<scope>refactor/<scope>
一个当前工作版本可以包含多个已验收任务分支。每个分支应承载一个边界清晰的 feature、 fix、update 或 refactor;验收后合入 dev。随后从 dev 组装 release candidate,并按 当前工作版本核对 release notes、compatibility manifests、examples、docs 和 companion repositories。
如果开始新的版本开发工作时,前一个公开版本已经发布,只要还没有进入更新批次的 release-prep 或 release promotion 动作,就把 compatibility/in-development.json 视为 明确的当前工作版本来源,不要在每个任务里反复要求维护者重申该版本。如果 in-development manifest 缺失、过期或正在被替换,必须先暂停并确认当前工作版本。如果预期任务分支没有被 明确指定,必须先暂停并确认分支,然后才能修改代码、spec、docs、examples 或 compatibility metadata。
当某个分支只是实现大 roadmap 目标的一部分时,需要同时记录两层事实:feature spec 描述 更大的目标,而 compatibility/in-development.json 描述将要发布这个已验收切片的当前工作 版本。
文档
GitHub Pages 使用 main 分支里的 docs/ 目录。
docs/_config.yml 记录该 branch source 使用的 Pages/Jekyll 设置,包括站点 base URL 和 Markdown 相对链接处理。
旧 docs 分支已经废弃,不应再作为文档来源。不要再新增依赖旧 docs 分支发布文档的 workflow 或 release 步骤。
每次框架发版都必须在合并 release PR 前更新并核对这些公开文档面:
- 双语最终 release note,例如
docs/en/development/release-notes-<version>.md和docs/cn/development/release-notes-<version>.md - 根目录
README.md - 根目录
README_CN.md
README 双语文件应保持原有基础结构,但必须反映本次 release 的最终产品定位、当前 版本号、推荐能力入口、示例目录、companion compatibility line 和核心业务价值。不要把 README 更新留作发版后的 marketing 补丁:根目录 README.md 同时也是 PyPI long description,因为 [project].readme 指向它。
打开 release PR 前,需要把 release note 与两个 README 文件交叉核对,检查旧版本号、 过期 companion protocol、已删除示例、deprecated 推荐 API 和不一致的业务价值表述。
合并 release PR 前,还必须单独做一次人工 release-note review。这不是机械 checklist。 reviewer 需要确认 release note 描述的是本次真正交付的最终产品叙事、代码形态、示例和 业务价值。如果这次人工确认发现文案缺口、过期声明、README 漏更新、示例表达混乱,或 需要做小范围 API / 文档调整,必须先回到 release PR 内完成修改,重新运行相关验证,再 合并。不要先合并,再把 release-note 修正当作后续 marketing 补丁。
验收论证
推荐 release 前,必须为每个用户可见的功能切片写一份 coverage-first 的验收论证。 论证要先从目标合同出发,而不是先盯着已有 example 或 test。
release reviewer 应先列出 roadmap、spec、issue acceptance criteria、 compatibility manifest、docs 和 example 规则里的要求,然后把每一项要求映射到证明它的 证据:
- 带真实 DeepSeek 或本地 Ollama 输出、并包含稳定
Expected key output的场景 example - 覆盖兼容性、stream/meta 形状、route lifecycle、budget accounting、错误语义和 workspace record 的确定性测试
- 覆盖公开协议和依赖方向的 protocol/type 测试
- docs、compatibility manifest、spec reconciliation 和 companion guidance
- 如果 runtime event、observation payload、lineage 或 companion protocol 变化,还需要 DevTools 或其他 companion validation
example 用来证明 release 解决了真实场景,但不能单独证明兼容行为、protocol 边界、 route lifecycle、错误语义、budget counting 或内部架构归属。如果某个要求没有证据, 要么在 release 前实现,要么在相关 spec 和 release note 中明确延期,要么移除该 release claim。
release PR body 或 review notes 应包含这张覆盖矩阵,或给出简洁链接。不能在没有先检查 证据覆盖目标合同的情况下,直接用已有 examples、tests 或已关闭 issue 作为 release 验收结论。
Foundation Example Effect Gate
Foundation 层能力是 release-critical framework substrate,不是应用层 use case。 典型例子包括 ModelRequest/ModelResponse、TriggerFlow、Dynamic Task/TaskDAG、 ActionRuntime、ExecutionEnvironment、Workspace/Recall、RuntimeEvent/EventCenter 和 provider protocols。当某个 release 触及或声称这类 substrate 能力时,仅有测试通过 还不够:release reviewer 还必须运行 examples/ 下对应的核心 example,确认真实效果 仍然能通过推荐 public API 跑通。
AgentExecution、AgentTaskLoop、Skills workflows 和业务示例可以作为 release use-case checks,但它们本身不是 Foundation checks。只有当 release 同时触及它们依赖的 Foundation substrate,例如 ModelRequest result materialization、TriggerFlow lifecycle 或 Dynamic Task DAG execution 时,才映射到这个 gate。
对每个受影响的 Foundation 能力:
- 写明被保护的 Foundation 能力和用户可见效果
- 列出证明该效果的 runnable core example;如果没有,必须先补 example 再 release
- 在 pyright 和 pytest 之后,用 release candidate 运行该 example
- 如果效果包含模型拥有的 planning、routing、verification 或 response generation,必须使用 真实 DeepSeek 或本地 Ollama
- 在 release PR body 或 review notes 中记录 command、environment,以及稳定 key output、 artifact、stream、metadata 或 side-effect 证据
这个 gate fail closed。不要在 Foundation example effect check 缺失或失败时,仅凭 unit tests passed 发布。必须修复 example 或 release candidate,移除 release claim,在 spec 和 release note 中明确延期受影响的 Foundation 能力,或由 maintainer 记录一次性 waiver 和残余风险。
Release PR 正文
从 dev 到 main 的 release PR 必须包含足够信息,让 reviewer 不需要重新从 commit history 里拼接事实,就能判断 release 是否可以接受或必须阻塞。
至少包含:
- release version、release level 和当前 PyPI 已发布版本
- 按用户可见能力分组的变更摘要
- coverage-first 验收论证或覆盖矩阵
- validation commands 和结果,包括被跳过或失败的检查
- 涉及 Foundation 层能力时的 Foundation example effect checks
- clean install smoke 的环境和结果
- compatibility manifest 更新和 companion repository 状态
- 如果 runtime events、observation payload、lineage 或 DevTools 代码变化,需要写明 DevTools 版本或 protocol 推荐
- issue 关闭或 follow-up issue 状态
- 已知延期范围和残余 release 风险
- main 合并后的 companion promotion 或发布步骤
不要使用只写 "release" 或只列 commits 的极简 PR 正文。Release PR 是长期验收记录的一部分。
Desktop installers
Desktop installers 不属于当前主仓库 release 流程。
不要为了兼容已经废弃的 docs 分支流程,保留或重新启用 desktop installer workflow。
PyPI 发布
当前主要 PyPI 自动化是 Publish on version change。它在 push 到 main 且改动 pyproject.toml 时运行,检测包版本是否变化;只有版本变化时才用 Poetry 发布。
PyPI 项目列表页展示的是包元数据 Summary,来源于 pyproject.toml 的 [project].description。项目内页展示完整 README,来源于 [project].readme。
准备 release 时:
- 保持
[project].description非空且简短 - 保持
[project].readme指向README.md - 不要预期 PyPI 会原地更新已上传版本的元数据;元数据需要公开变化时应发布新版本
干净环境安装 smoke
发版测试阶段必须用 conda 或 uv 创建一个全新的空环境,安装 release candidate 包以及最小脚本所需的必要运行时依赖。不要复用已经缓存了可选依赖的开发环境。
这个 smoke 脚本必须验证两件事:
- 已安装包的基础启动路径可用,并且不会因为缺少那些已经明确由
agently.utils.LazyImport保护的可选依赖而失败。 - 至少故意触发一个 LazyImport 保护的缺失依赖路径,并确认面向用户的安装提示或错误信息正确出现。
除非 smoke 目标就是测试某个集成,否则不要安装 DevTools、ChromaDB、FastMCP、 SQLModel、Playwright 或其他 provider-specific 可选包。缺少这些包不应影响普通 Agently import 或最小 Agent/TriggerFlow 启动。