产品线包典范
已被取代(2026-10-21):产品线包
product-line/1、modules.json安装和变更集审批已随旧服务器退役,文中的 meridian 样例也已删除。现在的分发单位是任务包,分产品包、工作流包和系统包,上传时自动跑包内正例与反例;见通用模型的 T01、T02。本文只作记录保留。
一个产品线接进 circle-hub,交付物只有一样东西:产品线包——四种 harness 原语的集合(Skill、MCP server 实例声明及其 Tool、Hook 处理器)加原件 role、流程版本和一份清单。hub 核心不为任何产品线改代码;产品线包按本文的布局和适配单来写,装进 hub 后经独立审批人批准生效。
本仓库里的合成产品线 meridian 是公开的样板;真实产品线包放在各自的私有 packs 仓库里,不进 hub。
和对象标准的对应
产品线包只能从扩展点插进去,插进去的东西都是资产,生效都走变更集审批,运行留下证据。
| 包里的东西 | 插到哪个扩展点 | 资产 kind | 谁解读 |
|---|---|---|---|
| MCP server 实例声明(只读连接器) | B · 连接器包(按系统类型) | connector-instance | hub 的连接器包,只按声明遍历,不认产品 |
| 原件(命令树、函数契约、手册…) | B · 原件上传(文件 + role + metadata) | knowledge-source | 方法模块;hub 只存字节与 SHA |
| 对象词表、知识映射 | B · 词表 / 清单 | 写在产品线清单里 | hub 的知识层按映射登记声明 |
| Skill(技能包) | E · 技能包 | skill-package | 无界面的 Circle 执行;hub 核对声明工具与试跑 |
| Tool 实现(解析器、契约、结果解释) | B / D · provider 的 provides |
product-line 模块 | provider 调用时在 hub 内执行,输入是 B 的字节 |
| Hook 处理器 | E · 执行链钩子点(verify.* / beforeDispatch / afterResult) | product-line 模块 | hub 在执行链第 3 步按顺序调用 |
| 流程版本 | C · 流程版本 | product-line 模块 | hub 的任务引擎按版本推进 |
| MCP server 实例声明(执行资源) | D · 资源适配器(MCP 协议)+ 凭据模式 + profile | connector-instance(执行资源) | hub 的 worker 作为 MCP client;端点与密钥在库外 profile 和保险箱 |
不在表里的东西不属于产品线包:改 hub 核心、改 Circle 核心、写死地址或凭据,都不是「适配」。
目录布局
<packs 仓库>/
modules.json 安装清单:每个模块的 root、manifestPath、version、files + sha、digest
products/<line>/
product-line.json 清单 product-line/1:连接器包、工具别名、连接器选项、知识映射、tools、hooks、流程
connectors/<package>.json 连接器实例声明模板:declaration + configuration,不含地址与凭据
sources/<role>.md 每类原件的 role、metadata 键、谁上传、怎么核对
tools/<name>.ts Tool 实现:解析器、契约、结果解释;纯函数,输入是 B 的字节
hooks/<name>.ts Hook 处理器:对一次运行的确定性判定,返回 pass 或错误码与事实;清单里声明挂点与顺序
flows/<name>.json 流程版本:阶段、等待原因枚举、交付项
resources/<name>.json 执行资源声明:writes、凭据模式、runtimeProfileRef、是否 executionIsChange
README.md 填好的适配单 + 验收记录
skills/<skill-id>/
SKILL.md 给模型看的流程:哪些步骤是脚本、哪些是判断
skillpack.json 清单:id、version、tools、inputs、outputs、triggers、model
scripts/ 有唯一答案的步骤全在这里;不调外部系统,只处理 B 给的字节
references/ 契约、规则的说明(不含原件)
tests/ 合成样本上的测试
原件、设备配置、真实返回不进仓库:它们是运行时上传到 hub 的原件,带 SHA、经独立审批人批准后才被模块读到。
适配单
把一项能力接进来,先填这张表;答案只能是「N 个资产 + M 条流程 + K 条规则」。哪一格的答案是「改 hub」,就回到设计。
| 对象 | 要回答的问题 | 答案形式 |
|---|---|---|
| B | 读哪些系统?每个系统类型一个连接器 | connectors/*.json + 清单 connectorPackages / toolAliases |
| B | 有没有要上传的原件? | sources/*.md 定义 role;运行时上传 |
| B | 产生什么证据?能提交什么声明?来源是脚本还是模型? | 技能包的 outputs;claim 的 origin |
| C | 有哪些流程?每条有版本号 | flows/*.json |
| C | 哪些动作要独立审批人? | 只有变更集;运行不审批 |
| C | 有哪些身份? | 范围策略里的角色;资源用机器身份 |
| D | 碰哪些资源?走哪种协议的适配器? | resources/*.json |
| D | 凭据怎么给? | static-secret / 平台签发 / 外部 OAuth |
| D | 什么叫未知?怎么核对? | 流程里的 unknown 分支与 reconcile |
| E | Skill 里哪些是脚本、哪些是模型判断? | SKILL.md 分段写明;脚本在 scripts/ |
| E | 产品线清单声明什么? | product-line.json |
| E | 执行链上挂哪些 Hook? | hooks/*.ts,返回固定错误码 |
| A | 用户在 Circle 里看什么、做什么? | 用到的工具、命令、卡片与登记簿;不加新界面 |
每类资产怎么写
- 连接器实例声明:只写 declaration 和 configuration 的形状;地址、账号、CA 在管理员登记时填进库外 profile 或保险箱。
- 原件:每种 role 一段说明——文件是什么、metadata 必填哪些键、怎么核对 SHA、谁有权上传与阅读。metadata 是上传者的声明,hub 不验证;要验证的事在运行时由资源回报。
- Skill:SKILL.md 先写输入、工具、输出,再按步骤写;每一步标明「脚本」或「判断」。脚本只处理 B 给的字节和自己的产物;工具返回由 hub 原样保存,脚本只拿 evidenceId 指针。试跑记录要覆盖技能声明的每条路径。
- Tool 实现:纯函数,输入字节、输出结构;不读环境、不连网、不写文件。在内存里用解析库处理字节是允许的(例如用 ExcelJS 读一个 Buffer),但只能 import hub 自带依赖集里的包(exceljs、read-excel-file、fflate、zod、saxes、parse5,精确版本),并在清单的
tools[].imports里声明;Node 内建模块(node:*)也不行,散列用全局 WebCryptocrypto.subtle,不需要 import;装载时核对,声明外的 import 以IMPORT_NOT_DECLARED拒绝装入。包的测试需要 hub 的依赖集(node_modules 软链或安装同版本)。 - Hook 处理器:输入一次运行的绑定与待核对象,输出通过或一个固定错误码加事实。判定不了的不写 Hook,交给披露。
- 流程版本:阶段枚举固定,等待原因是枚举字段,交付项列清楚。
- 资源声明:writes 写实话;要两人规则的生产资源声明 executionIsChange。
技能包与模块的登记契约
- 技能包提交体是
{manifest, files, trial}:清单含 id / version / title / owner / tools / triggers / inputs / outputs / model;owner 只是声明,实际登记者是认证身份。文件必须是安全相对路径、必有 SKILL.md、按原字节 SHA 核对,单份与总量都有上限(16 MiB)。清单、文件摘要与试跑记录一起参与 digest;同人员、同范围、同内容的重复提交复用同一登记与审批请求;已批准的版本字节不可变,改动即新版本。触发方式只有 manual / schedule / event。 - 试跑是客户端记录的证据声明:平台只机械核对声明的工具与当前目录——试跑用到但未声明的、声明但当前目录不可用的,各列一张清单,不符是
SKILLPACK_CHECK_FAILED;不能凭试跑记录宣称业务正确或试跑确实发生。两张清单在错误 message 里概述(超长截断并指向 details),details.check 里完整、去重、稳定排序;工具名用目录的规范名,不用任何 harness 的本地名,不泄露隐藏资产、地址或凭据。提交、批准、运行三处都重查当前目录。 - 批准绑定 digest 与当前资产修订:批准后状态 registered;停用或修订变化阻止新运行。登记任务产生的审批请求可被独立审批人驳回(含已被新版本取代的旧申请);申请人不能自批。批准时重查申请人的目录,运行时重查实际运行者的目录。
- 模块安装接收产品线模块清单与精确文件集的原字节/SHA:平台重核路径、清单摘要与清单自身的 id/version;技能模块的试跑必填。响应里的 digest 是模块清单摘要,与原技能包审批摘要分开。产品线模块登记为 draft 原件资产,批准不自动激活运行配置。
- Hook 处理器按清单声明的挂点与顺序执行,与 Tool 同在一个受隔离的子进程里,有时间、返回大小与堆的上限;批量核验按批推进,首个 block 即停(边界见审批与执行链)。
- 内置的兼容实现按同一规则治理:范围内须有明确批准的 knowledge-source 定义(
hub-tool-implementation/1,含 capabilityPackId / flowVersion / implementationSha256);实现摘要变化后须按当前版本重新登记并独立批准,旧任务钉住的方法资产不自动改写。已批准的产品线模块按自身冻结字节与 flow 解析,不受内置实现升版影响。
开发到生效
- 本地开发技能包与模块,用合成样本跑 tests/。
- 在 Circle 里登录 hub,开始试跑记录,按 SKILL.md 走一遍真实工具(只读),产物带 SHA。
- 推送:清单、文件、试跑记录一起作为变更集提交;hub 核对声明工具 = 试跑实际调用、引用的资产已就绪。
- 独立审批人在自己的 Circle 里决定;批准后版本不可变,改动就是新版本。
- 产品线清单、Tool 实现、Hook 处理器、流程由
modules.json列出,从仓库装入,同样是变更集。 - 运行走执行链,不审批;报错带错误码回会话,未知如实披露。
验收清单
- hub 核心零改动;产品名只出现在清单、模块、规则和数据里。
- 每个资产都能被独立审批人批准、被 SHA 钉住、被停用。
- Skill 的试跑覆盖每条声明路径;未声明的 Tool 一个都没调。
- 运行失败只有固定错误码;没有「平台批准」的记录。
- 第二条产品线装进去不改核心。
- 仓库里没有原件、地址、凭据、真实返回。
样例:meridian
packs/meridian 是一条虚构的产品线:一份 product-line/1 清单和一个源码评审技能 meridian-source-review。它读文档连接器、提交候选声明、产出评审报告,不碰任何资源,只有登记要审批。它存在的意义是证明:第二条产品线用同一套核心、权限、审批和执行走通,不改一行核心代码。
本文是 circle-hub 的设计规范之一,按 CC BY 4.0 授权:引用、借鉴须署名 Circle Hub 与 qingshanfeihu 并注明原始出处链接。见设计规范索引。