自编程工作流 · 架构与实施计划

拆分 Workflow 的发现、创建、修订与执行

本页定义 OpenProgram 如何让 Chat Agent 选择已有 Workflow、如何按需创建可复用 Workflow,以及用户如何通过 auto_workflow(task) 手动触发完整流程。核心约束是:选择、创建、修订和执行必须是独立公共行为;完整入口只做编排,不再保存另一套实现。

状态:源码实现与复审完成 · App 验收待完成范围:Workflow catalog / authoring / runtime / Programs UI读者:Runtime、Programs、Web 实现者兼容:旧 run 只读恢复

1. 设计结论

删除新的 agentic_workflow 调用入口。将其能力拆为 search_workflows、create_workflow、revise_workflow 和具体 Workflow 执行;另提供只供用户手动使用的 auto_workflow 完整入口。

Chat Agent 路径

Agent → 搜索 / 创建 / 修订 / 工作流

Agent自己判断是否直接调用已有Program;目录较大或候选未加载时才搜索。Agent不调用 auto_workflow。

用户手动路径

用户 → auto_workflow(task)

一次请求完成搜索、一次可见选择、必要时创建、随后执行;每一步仍在DAG中独立可见。

auto_workflow 是便捷编排入口,不是候选 Workflow,也不是组件。搜索结果必须排除它,生成代码不得 import 它,Agent 工具集合不得暴露它。
workflow/ 只用于按代码类型归类。目录、辅助文件和内部子目录都不是 Program;Programs、Registry 和调用图只把实际注册的 Agent method 作为可运行实体。目录层级不得改变公开名称、调用方式或运行语义。

工作流参数归属

用户提供任务、证据和交付要求。执行参数归工作流管理,不通过高级选项、设置对话框或参数提问暴露给用户。

工作流有多个依赖任务的参数时,在执行前发起一次不带工具的模型请求,生成完整计划。提供真实运行时能力与应用限制,验证每个字段及跨字段约束;输出无效或规划失败时应用完整回退方案,并传播取消。固定不变量仍由代码控制,模型不得修改权限、凭证或应用上限。在可恢复工作开始前持久化生效计划,恢复时复用。

规范开发示例、参数契约和验收清单位于 工作流编写。缺失任务事实时可以澄清,但不得将执行调优交给用户。

2. 当前实现与已确认缺口

当前事实问题目标处理
公开入口是 search_workflows、create_workflow、revise_workflow 和用户级 auto_workflow;旧 agentic_workflow 不再注册。resume_workflow 保留为内部函数。旧名称没有说明它会搜索、生成、发布并执行。新调用走四个明确入口;历史 run 只读恢复。
只读搜索、create/revise 发布和具体 Workflow 执行是独立公共行为;auto_workflow 只编排这些入口,不再保存另一套实现。只读发现、持久写入和业务执行不得共享一个生命周期。按公共合同拆行为;不再存在复合执行路径。
已有项目以 Git revision、snapshot 和 project_ref.json 固定运行输入。版本和恢复能力必须独立于编排入口。保留项目格式、快照、checkpoint 和显式 resume。
普通执行失败保留原错误和 checkpoint,不改写已发布 Workflow。一次普通执行不得静默修改已发布源码。发布前结构/测试修复留在 create;已发布修改只能显式 revise。
auto_workflow 出现在用户表单和 Programs 页(自动入口 · 仅用户手动),不出现在 Agent 工具清单。用户需要完整入口,Agent 已有自己的任务路由,二者语义不同。auto_workflow 用户可见、Agent 不可见。
method_options = dict(tool_visible=) 传入 Layer-2 register(..., expose);默认 True,现有函数仍全部曝光。需要用装饰器表达“用户可见、Agent 工具不可见”。auto_workflow 以 tool_visible=False 注册。
执行期 repair 已删除。create_workflow 内保留发布前 bounded author 重试(PROJECT_AUTHOR_ATTEMPTS)。普通运行失败不得自动发布新 revision。已发布修改只走显式 revise_workflow。
四个公开入口已迁入 workflow/,旧源码目录已删除。分类路径与运行身份必须持续保持独立。Programs只把分类目录用于导航,函数节点和函数级调用图来自Registry与所选入口的可达AST。
新项目使用多文件package合同,但产品页仍描述无参数 workflow()、禁止全部import和执行期自动重写。人类作者会按旧合同编写;真实规则只能从validator报错中逐项推断。以现行validator为唯一规则来源,提供英中作者页和共享CLI静态校验。
tests/test_workflow.py当前只参加AST与import检查,不会在发布前执行。静态合法不等于行为正确;直接执行未信任测试又会越过安全边界。先明确静态validate;后续以强制sandbox、禁网、凭据过滤、写目录和timeout限制实现行为测试门。

本设计复用已有的 Workflow package、Git、snapshot、checkpoint、DAG caller 和取消状态设施;不引入第二个执行Runtime、图DSL、Workflow数据库或字符串dispatcher。

代码分类与运行身份

Python目录只负责源码组织,运行身份只来自注册信息。两者不得互相推导:目录名不能自动成为Program,移动文件也不能自动改变公开函数名。

openprogram/programs/workflow/
└── workflow/                         # 分类目录,不可运行
    ├── __init__.py                   # 可放入口与共享实现
    ├── <helper>.py                   # 仅在确有独立职责时创建
    └── <subsystem>/                  # 需要时继续按职责分类

Registry / Programs 展示的运行实体:
  search_workflows
  create_workflow
  revise_workflow
  auto_workflow

不产生运行实体:
  workflow
  __init__.py
  任意 helper 文件
  任意内部子目录
层唯一职责禁止行为
文件系统按 agentic / workflow 类型组织Python源码;入口、辅助实现和内部子目录可放在同一分类树中。不得因目录或文件存在就注册Program;不预先创建 runtime.py、legacy.py 等没有独立职责的文件。
注册表以装饰器注册的函数名、Schema、exposure和来源文件作为权威运行身份。不得用父目录名覆盖函数名;不得重新注册旧 agentic_workflow。
Programs目录目录节点只用于展开;函数节点来自Registry,可点击、查看和运行。不得把 workflow/ 显示为可运行Program;不得把helper文件显示为函数。
调用图根节点使用用户选择的注册函数;依赖边从该函数的实际调用关系生成。不得以源码目录名作为根节点;不得因同文件含多个入口而显示旧聚合名称。
Runtime继续通过公共函数名调用;run、checkpoint、取消和legacy恢复合同保持不变。不得把源码移动转换成新的执行路径、状态格式或兼容入口。
长期约束:新增 Workflow 管理函数时,开发者可以在该分类目录中增加入口或辅助代码,但Programs新增可运行项必须以注册函数为依据。目录扫描只能生成导航节点,不能生成运行实体。

3. 目标架构与两条主路径

Workflow 搜索、创建和执行架构 上方是用户手动调用auto_workflow的完整流程:确定性搜索后由一个可见Selection Agent选择复用或创建,再调用具体Workflow。中间是Chat Agent按任务直接选择搜索、创建、修订或具体Workflow,不经过auto_workflow。两条路径共享catalog和Workflow Runtime。 用户手动完整流程 · ONLY USER CHAT AGENT 自主路径 · NO AUTO_WORKFLOW 共享状态与执行层 · DETERMINISTIC 用户表单任务 auto_workflow只负责编排 search_workflows确定性只读搜索 选择 Agent唯一一次模型判断 复用或创建 具体 Workflow固定 revision create_workflow创建并发布 复用create 聊天 Agent根据任务直接选择 PUBLIC WORKFLOW ABILITIES · 按需调用一个或多个入口 search_workflows目录未知时 create_workflow需要稳定资产时 revise_workflow用户明确修改时 具体 Workflow已有匹配时直接调用 搜索、创建、修订不是固定串行步骤;Agent 不经过 auto_workflow。 工作流目录元数据 + 不可变 Git 引用 工作流运行时快照 + 检查点 任务结果结果 + 引用 read发布新版本执行选定工作流
用户手动编排Chat Agent 决策公共 Workflow 能力持久状态与执行

Chat Agent 决策顺序

  1. 已加载的Program或Workflow明显匹配:直接调用,不先搜索。
  2. 可能存在未加载的动态Workflow:调用 search_workflows。
  3. 完整匹配:直接调用候选的固定revision。
  4. 只有部分能力:一次性任务可直接组合调用;需要复用、恢复、定时或稳定结构时调用 create_workflow。
  5. 没有匹配:普通一次性任务仍可由Agent直接使用工具完成;用户明确要求复用资产或任务具有稳定重复结构时才创建。

4. 公共能力合同

入口调用者职责禁止行为
search_workflows(task)Agent、用户确定性返回排序候选、固定revision、合同、权限和命中依据。不得调用模型、写文件、执行候选或发布。
create_workflow(task)Agent、用户读取候选组件,生成一个新package,验证后发布并返回ref。不得执行用户任务;不得修改已有项目。
revise_workflow(workflow_id, request)Agent、用户基于指定revision创建新候选,验证后发布新revision。不得由普通运行失败静默触发;不得覆盖旧revision。
auto_workflow(task)仅用户手动调用搜索,由一个可见的selection Agent判断reuse/create,最后调用确定的Workflow。通过Layer-2 unexposed注册实现Agent工具不可见。不得出现在Agent工具集合或搜索候选;不得自动revise已发布项目。
具体Workflow入口Agent、用户、其他Workflow执行确定业务合同。不得重新进入全局搜索或authoring。
{
  "action": "reuse | create",
  "workflow_id": "research_report",
  "workflow_revision": "<immutable git revision>",
  "result": {},
  "run_id": "<workflow run id>"
}

auto_workflow 的返回值必须说明选择了复用还是创建。搜索、创建和执行分别生成DAG子节点,不能只留下一个无法解释的总节点。

5. 搜索、组件复用与创建

唯一package合同与人类作者入口

Agent author与人类作者使用同一静态validator。新项目只能采用 pyproject.toml + README.md + __init__.py + workflow.py + tests/test_workflow.py + helper 的package格式;legacy entry.py不属于新authoring。CLI第一阶段提供 openprogram workflows validate <directory>,只读返回结构、metadata、AST、import、入口和依赖import形状诊断;依赖缺失、循环与revision pin仍由create/revise发布阶段检查。--json提供稳定脚本输出。create/revise在发布前调用同一candidate validator,不维护第二套规则。

静态validate不执行项目代码,不能称为发布测试通过。行为测试门必须在不依赖用户profile的强制sandbox中运行,默认禁网、过滤凭据、限制写目录与时间;sandbox不可用时拒绝发布。该门作为后续独立任务实现。

搜索合同

搜索以catalog metadata和固定Git HEAD为输入,只做确定性文本召回,再把候选合同交给调用它的Agent判断。Chat路径由Chat Agent判断;手动auto路径由其内部唯一的可见selection Agent判断。搜索结果不是执行许可;权限、输入Schema和side effects必须随候选返回。

{
  "workflow_id": "web_research",
  "revision": "<git revision>",
  "retrieval_score": 4,
  "matched_terms": ["web", "research"],
  "input_schema": {},
  "output_schema": {},
  "permissions": ["network"]
}

创建时复用组件

create_workflow 获得可用Workflow的只读快照和公开Program目录。生成项目通过普通Python import引用Workflow package,不复制依赖源码;manifest固定每个依赖revision,并在发布前拒绝循环依赖、缺失入口和未声明权限扩张。

research_report/
├── pyproject.toml
├── README.md
├── workflows/
│   └── research_report/
│       ├── __init__.py
│       ├── collect.py      # imports web_research
│       └── synthesize.py
└── tests/
    └── test_research_report.py
固定输入

冻结catalog revision和可达依赖;外部新提交不改变本次authoring。

生成唯一candidate

只有candidate目录可写;源仓库、依赖Workflow和用户目录保持只读。

确定性验证

检查package、唯一入口、Schema、import、依赖闭包、循环、权限和测试命令。

发布前有限修复

只修正生成候选的结构或测试失败;次数有上限,取消和provider错误不修复。

原子发布

验证全部成功后创建一个commit并更新catalog;返回Workflow ref,不执行用户任务。

一次性任务不自动创建Workflow。创建的判据是用户明确要求,或任务需要稳定复用、恢复、定时执行、版本化审查中的至少一项。

6. 生命周期、失败与信任边界

阶段允许状态变化失败规则
search无持久run;只读结果catalog损坏项被报告或跳过;不得改变项目。
create / reviserunning → completed | failed | cancelled失败和取消不发布;candidate可回收,诊断写入run state。
workflow runrunning → completed | failed | capped | cancelled | interrupted保留原错误和checkpoint;不自动改写已发布Workflow。
auto聚合子调用状态任一子调用失败即停止;不得把部分结果标记为completed。
resume只恢复指定run固定原snapshot/revision,不重新搜索或重新选择项目。

边界要求

  • authoring写入仅限本次candidate和run state;网络、凭据和外部工具遵循当前会话权限。
  • 同一目标Workflow发布必须串行;不同项目可以并行。运行snapshot不受并发发布影响。
  • 取消、权限拒绝、timeout、provider terminal error和外部Stop不进入repair。
  • 调用表单继承会话顶部Project;不提供第二个工作目录覆盖项。
  • 本地App刷新检测到活动run时拒绝刷新,不能通过重启把运行状态改写为失败或取消。
  • 旧 code.py、legacy snapshot和历史run只读恢复;新调用不再产生旧格式。

7. 官方框架对照

对照只用于确定边界,不把其他框架的Runtime或DSL引入OpenProgram。下表的“未覆盖”表示所列官方页面没有定义自动生成并发布持久Python Workflow的完整产品合同。

官方资料相关能力采用或修改未直接覆盖
OpenAI Agents SDK · 编排区分LLM决策与代码编排;manager可把专用Agent当tool调用。采用“Chat Agent拥有用户对话,专用能力是独立工具”;auto_workflow使用代码编排。不定义本地Workflow catalog的生成、Git发布和旧run兼容。
OpenAI Agents SDK · 工具搜索大型工具面可以延迟搜索和加载,搜索活动保持可观察。采用按需搜索,不要求每条消息先搜索;搜索返回合同而不是直接执行。不负责创建新的持久工具实现。
LangGraph · 工作流与 agent明确区分预定路径Workflow与动态决定工具的Agent。采用职责区分;保留Python控制流,不新增图DSL。不定义Agent自动编写、测试并发布新的Python Workflow。
LangGraph · 子图通过输入输出Schema复用subgraph,父子持久化边界明确。采用合同化组合和固定依赖revision;OpenProgram以Python import表达关系。不提供OpenProgram式Git项目catalog和authoring发布流程。
CrewAI · FlowsFlow使用显式事件、状态和Crew组合完成结构化流程。只采用“确定流程与Agent协作分层”的原则。所列页面不描述运行时搜索并生成持久Flow资产。

采用、修改与拒绝

选择结论边界
Agent按需搜索工具/Workflow采用已知Program直接调用;大目录才搜索。
可复用子流程的合同化组合修改采用用Python import、Schema和固定Git revision,不引入subgraph DSL。
manager式完整入口修改采用仅用户手动 auto_workflow;Agent不递归调用它。
运行失败自动重写已发布流程拒绝修改必须显式进入 revise_workflow。
所有一次性任务自动持久化拒绝没有复用或恢复价值时由Agent直接完成。
按任务措辞创建近似Workflow拒绝selection按候选合同判断能力;语言、输出路径、日期范围和普通参数差异不构成新执行结构。

8. 实施计划

每个阶段独立提交,并依次经过公共RED、最小GREEN、规格审查和质量审查。前一阶段未通过两类审查时不进入下一阶段。现有 tests/component/agent/test_agentic_workflow.py 锚定单体入口,各阶段必须同步迁移对应测试归属,避免最后删入口时测试整体失效。

阶段 0

曝光机制接线

给 Agent method 增加工具级曝光参数并传入Layer-2 register(..., expose);复用已有 _unexposed/exposed_names()。

Gate:最小注册合同测试证明参数生效;默认行为不变(现有函数仍全部曝光)。
阶段 1

提取只读搜索

从现有模块抽出 search_workflows 公共合同;返回固定revision、Schema、权限和匹配信息;排除 auto_workflow 与legacy项目。搜索相关测试迁到新入口。

Gate:调用前后catalog与run目录字节不变;Agent可读取候选但没有执行节点。
阶段 2

拆出创建与修订

将candidate、验证、依赖固定和publish迁入 create_workflow;再以显式目标和新revision实现 revise_workflow。创建不执行用户任务。删除执行期repair路径;author/validate/publish测试迁到新入口。

Gate:create只新增一个项目;revise只新增一个revision;失败、取消、terminal error均不发布;不存在执行期自动发布路径。
阶段 3

建立用户级 auto_workflow

使用前两阶段公共能力实现search → visible select → reuse/create → run。完整DAG显示每个步骤;调用表单仅含 task 并继承会话Project;用Phase 0机制注册为Agent不可见。

Gate:用户表单可见,Agent工具清单不可见;reuse和create两条真实App路径可区分。
阶段 4

移除新 agentic_workflow 调用

停止注册旧入口,删除只服务旧复合路径的selection/repair分支。保留显式 resume_workflow(run_id) 和legacy只读执行器。剩余锚定单体入口的测试删除或迁移,resume/legacy测试保留。

Gate:新catalog、新DAG和新run不出现 agentic_workflow;历史run仍可查看和恢复且artifact不变。
阶段 5

分类目录、UI、文档和最终门禁

先固定“目录只分类、Registry定义运行身份”的合同,再将相关源码归入 workflow/。Programs按实际目录生成可展开导航,按Registry生成函数节点;调用图根节点使用被选择的函数名。最后同步产品文档,并在默认App完成direct、reuse、create、cancel和legacy恢复验收。

Gate:源码树不存在旧 agentic_workflow/;Registry不存在旧名称;Programs中 workflow 只能展开,不能运行;展开后只显示四个注册函数;helper文件和内部目录不显示为Program;调用图根节点使用所选函数名;目录移动不改变注册Schema、执行、恢复和取消行为;这些约束必须有自动化回归测试,随后通过文档构建、0死链和默认App可视验收。
阶段 6

统一作者静态校验

把现行package validator暴露为人类CLI与agent author共用的只读入口,新增英中作者规范页;create/revise在发布前通过同一函数复验candidate。legacy读取、行为测试、scaffold、publish CLI和catalog迁移不混入本阶段。

Gate:合法目录的CLI与agent candidate得到相同metadata和文件清单;无效目录返回非零退出码和确定性诊断;校验不写目录、不初始化Git、不执行测试代码。
阶段 7

强制隔离的行为测试门

发布前运行candidate测试,但执行必须使用与用户profile无关的强制sandbox,禁网、过滤凭据、限制写目录、设置timeout;sandbox缺失、测试失败或取消均不得发布。

Gate:恶意读凭据、越界写、联网、超时和普通失败都有公共RED;create/revise的catalog与HEAD在所有失败中保持不变。

最小文件边界

范围首选改动位置明确不做
Runtime与公共函数openprogram/programs/workflow/ 分类目录;入口文件、共享实现和必要的内部子目录在该分类内按普通Python代码组织。不把分类目录注册为Program;不在移动源码时重写执行Runtime;不预造没有实际职责的文件。
注册和曝光openprogram/programs/_registry.py、_runtime.py 的现有exposure机制。不新增第二套权限或工具注册系统。
组件与运行测试现有Workflow公共入口测试、注册合同测试和legacy恢复测试;测试文件名可后续独立清理,不参与运行身份。不因源码迁移重写Runtime测试;不以mock-only测试替代公共入口。
程序界面现有Programs route、catalog和page组件;后端分别返回分类节点与注册函数节点。不在前端维护第二份Workflow函数清单;不新建Workflow数据库或独立管理应用。

9. 公共验收矩阵

场景公共入口必须观察到
Agent已有精确工具Chat消息直接Workflow Call;没有search/create/auto节点。
目录中有完整匹配search_workflows → 工作流返回固定ref并复用;没有仓库或revision变化。
只有部分组件create_workflow新package以import引用组件;没有复制依赖源码;不执行用户任务。
显式修改revise_workflow旧revision可继续执行;新revision通过全部发布门后成为active。
用户完整自动运行auto_workflowDAG显示search、唯一selection Agent、可选create和最终Workflow;结果含action和ref。
同类任务改写措辞或语言auto_workflow搜索候选携带已验证的name、summary和tags能力摘要;已有Workflow能力覆盖时复用固定revision;零词项分数本身不得作为create依据。有候选时,create必须返回具体且非空的missing_capability,否则在authoring前拒绝。
Agent工具发现聊天 Agent 工具清单包含search/create/revise和具体Workflow,不包含auto或旧agentic入口。
Programs分类浏览functions / agentic / workflowworkflow 是不可运行的分类节点;其子项只含四个注册函数;源码helper与内部目录不成为Program。
Programs调用图选择任一Workflow管理函数标题和根节点使用所选函数名;不出现旧 agentic_workflow 或目录名替代运行身份。
运行失败具体Workflow状态failed、原错误保留、已发布源码和HEAD不变。
取消或Stopcreate/revise/auto/run相关run最终为cancelled;没有repair、publish或遗留running。
并发发布同一项目两个revise调用串行验证active revision;不丢失commit,不覆盖新HEAD。
旧run恢复内部兼容恢复(resume_workflow(run_id))固定旧artifact只读执行;不创建新项目、不发布、不改旧snapshot。
最终完成不能只依据单元测试。必须通过默认 /Applications/OpenProgram.app 的真实表单和Chat路径,并在重新加载会话后核对DAG caller、运行状态、Workflow ref和catalog变化。

10. 实现状态

参数归属是设计要求,并有开发示例。现有工作流需逐个采用;Goal 当前自动选择推理强度,其他设置保留默认值。本文不将全目录的完整参数规划标为已实现。

能力当前证据状态
Git Workflow package、snapshot、checkpoint与显式resume当前运行时已有对应实现;本设计要求保留。已有
Agent method 工具级曝光接线到Layer-2method_options = dict(tool_visible=) 传入 Layer-2 register(..., expose);默认 True,现有函数仍全部曝光。已实现
独立 search_workflows公共只读入口返回固定 revision、Schema、权限和命中依据;排除 auto_workflow 与无入口 legacy 项目;不调用模型、不写文件、不执行、不发布。已实现
独立 create_workflow / revise_workflowcreate 只新增项目且不执行用户任务;revise 在候选与 active revision 内容相同时拒绝发布(revision unchanged),否则只新增一个 revision;依赖 revision 写入 pyproject.toml 的 workflow-dependencies;失败与取消不发布。已实现
用户级 auto_workflow源码位于 openprogram/programs/workflow/auto_workflow.py;用户表单与 Programs 自动入口可见;以 tool_visible=False 注册;编排 search → 可见 selection Agent(public agent(),AUTO_DECISION_ATTEMPTS=3)→ reuse/create → 按 pin 执行;不自动 revise。该入口是单文件完整 Workflow,当前没有独立 steps、依赖或测试包,因此不增加同名目录。已实现
近似Workflow创建抑制search结果向selection提供已验证的name、summary和tags;selection合同优先复用能力覆盖的候选;措辞、语言、输出路径、日期范围和普通参数差异不得触发create;零词项分数只表示检索无词项重合;候选非空时,无missing_capability的create在发布前失败。已实现
共享静态author validator与CLIAgent candidate与本地目录使用同一package合同;openprogram workflows validate只读、支持文本与JSON诊断,不import或执行candidate代码;读取开发目录时忽略Python生成的__pycache__,但不放宽源码位置合同;metadata身份、唯一公开入口、安全__all__、decorator来源和最终re-export binding均由同一validator检查。已实现
发布前行为测试门手工test/publish与生成式create/revise均在强制OS sandbox中执行行为测试,不依赖用户profile;独立审查通过,完整集成验收仍在进行。待实现
按 revision 执行与依赖 pin_run_published_workflow 通过 git archive 检出选定 revision;workflow_dependencies 随发布持久化并在执行时 pin,旧 revision 在新 HEAD 发布后仍可运行。已实现
旧版 code.py resumeresume_workflow 对 legacy run 只读重放 snapshot/code.py;失败返回 failed,不调用 planner、不改写 artifact。已实现
Workflow取消终态内部 resume_workflow(run_id) 直接回归覆盖 package snapshot、legacy code.py 和 SINGLE:CancelledError 持久化为不再执行的 cancelled run 投影,KeyboardInterrupt 持久化为允许后续调用复用 artifact/checkpoint 的 interrupted run 投影;两者均保留原异常传播。为恢复尝试生成并持久化新的 canonical execution_id 仍由统一 Execution 接入负责。已实现
停止新的 agentic_workflow 调用旧入口不再注册;新 catalog、新 DAG 和新 run 不出现 agentic_workflow;resume_workflow 保留为内部函数。已完成
分类目录与运行实体分离workflow/ 仅作为分类;Programs按Registry展示四个公开函数,支持嵌套分类和多入口文件;调用图按所选函数及可达helper分析,目录和helper不参与运行身份。规格与质量复审均通过。已实现
默认App真实验收代码与文档门禁已齐,等待默认 /Applications/OpenProgram.app 完成 direct / reuse / create / cancel / legacy resume 可视验收。待实现

Phase 0–6 的源码实现、组件回归、CLI公共路径、文档构建与两类独立复审已完成;强制sandbox行为测试门和默认App真实验收仍待完成。

11. 明确排除

  • 不新增 @workflow、图DSL、第二个Runtime、字符串 call_workflow() dispatcher。
  • 不自动把所有用户消息转成Workflow,也不为一次性任务默认创建项目。
  • 不自动修改已发布Workflow,不在普通执行错误后隐式发布revision。
  • 不建立Workflow数据库、后台Git轮询、远程push、Marketplace或远程依赖解析。
  • 本阶段不实现scaffold、人工publish命令、catalog状态目录迁移或执行未信任测试;这些分别进入后续任务。
  • 不改变Agent、Program和Workflow现有Python调用语义;本设计只拆入口与生命周期。

可迁移工作流包契约

工作流是位于以下目录的自包含 Python 包: openprogram/programs/workflow/<workflow_id>。移动 OpenProgram 检出目录时,公开函数名与包相对位置保持稳定。包元数据、导入、依赖版本、UI 链接和调用请求不得包含开发者主目录。

关注点契约
身份小写包标识符就是注册的可调用名称。Python 组合使用普通导入与直接调用,不引入新的运行时、装饰器或调用协议。
内部位置持久化 {"scope":"programs","path":"workflow/weekly_report"} ,使用由两个部分组成的规范 POSIX 路径。作用域表示当前项目中的 openprogram/programs/ 。仅在文件系统边界基于当前 OpenProgram 程序目录解析,绝不基于对话工作目录解析。拒绝作用域内绝对路径、路径穿越和歧义匹配。Wheel 中非 Git 的工作流副本不与独立版本化源码包竞争;两个匹配的 Git 项目仍视为歧义。
外部安装已安装 App 可使用 owner 显式登记的源码检出目录。唯一的 catalog_root 安装绑定标识该目录; refresh-local-app.sh 根据正在安装的检出目录更新绑定。此绑定与各包的可迁移路径不同。外部开发符号链接保留显式授权;相对标识符不授权任意外部代码。
迁移将先前获授权的项目内绝对条目转换为带作用域的相对条目,包括旧检出目录已不存在的记录。只有已知目录中结构有效且匹配的包可满足旧工作流条目。移动检出目录时不重复执行无限制目录发现。保留无关外部记录与授权撤销。
CLI 列表openprogram programs list 包含授权注册机制已经加载的已发布 Workflow 入口,包括位于一级分类目录中的项目。名称与说明来自已注册可调用对象及其源码。保留内置条目和可选 Program 安装状态,同名条目只列出一次。不得为列出条目而导入或列出任意未登记目录、改变工具暴露规则或执行 Workflow 函数体。通过隔离 owner 目录的新 CLI 进程验收,并包含一个未授权的相邻项目。
发现与界面启动参数与收藏共用一个可调用目录。刷新同时更新 React 与运行时读取方。可调用对象缺失或无效时显示错误,“使用”操作不能静默等待后消失。侧栏与程序入口共用交接流程。缓存缺失时发起一次经认证的目录请求,将响应发布给两个共享读取方;仍不可用时显示本地化错误。路由清理、新启动或聊天 owner 变化取消过期的表单打开。延迟聊天重置完成前不消费待处理启动。
编写实现前设计输入、输出、副作用、失败与取消行为。元数据、公开入口、辅助函数、测试和 README 都放在包内。验证结构、执行行为检查、发布不可变版本,再验证发现、收藏与参数表单打开。静态验证通过不等于执行证据。
兼容性保留现有函数名、schema、收藏顺序、固定依赖、普通 Python 导入与未提交工作流文件。运行时绝对路径只是内部文件系统细节,不作为持久化包身份。

编写与发布生命周期

正式手动接口为 openprogram workflows validate DIRECTORY, openprogram workflows test DIRECTORY,以及 openprogram workflows publish DIRECTORY。Validate 只读。Test 将验证后的候选和固定依赖复制到临时工作区,在必需的操作系统沙箱中运行测试,禁用网络、不含凭证、保护源文件并限制进程寿命。手动发布与生成式 create/revise 入口共用同一个必需的行为测试检查。Publish 对实际提交的快照重新验证和测试,不信任旧成功报告。现有包要求显式提供 --replace ,且目标目录干净。失败、超时、沙箱不可用或测试失败时均不发布。

文档中的 from workflows.NAME import NAME 导入与实时目录中的 openprogram.programs.workflow.NAME 解析到同一获授权可调用对象。实时别名仅暴露命名且获授权的入口。快照执行明确管理自己的 workflows 命名空间并持续加载固定内容,不回退到实时目录。包 README 说明用途、输入、输出、影响、失败/取消行为、依赖、测试与可复现调用。

验收

  • 登记后移动检出目录,无需编辑包元数据或逐包路径即可发现并解析同一获授权工作流。
  • 从失效的检出目录前缀恢复已登记的周报包,不授权无关目录。
  • 拒绝路径穿越、未知作用域、未授权包和歧义解析;保留显式安装的外部源。
  • 默认已安装 App 中显示原有 weekly_report 收藏,点击“使用”打开任务表单;验收期间不执行或提交报告。
  • 英文编写指南与中文译文规定相同的创建、验证、发布、迁移和故障排查行为,命令已对照 CLI 核实。

实现状态

带作用域的源码持久化、获授权旧路径迁移、已安装目录导入和共享表单启动已通过独立规格与质量审查。手动测试/发布、文档化导入别名与编写文档也通过独立审查。全仓验证尚未完成,不代表完整测试集通过。已安装 App 验收与部署记录在发布证据中。