Runtime 生命周期扩展开发 SOP
一、先判断是否需要扩展
- 配置、Tool API、Workflow、事件订阅能解决时,不创建扩展。
- 写清楚所需事件、输入字段、输出副作用、失败处理和维护负责人。
- 如果需要修改审批、Checkpoint、终态或 Provider 内部对象,停止;这些不属于公开扩展面。
二、定义能力与信任
- 使用稳定、小写的扩展 id 和明确版本。
- 逐项声明
files、process、network、credentials、ui;没有需要就使用最小值。 - 宿主代码显式注册扩展,将 id 写入
trustedIds,并在grants中只授予所需能力。 - 不扫描工作区寻找扩展,不根据文件存在自动信任。
三、实现 handler
- 只处理所需生命周期;payload 视为只读。
before-tool只返回{ deny: { reason } }或不返回决定。- Trace exporter 只导出必要字段,禁止记录密钥、完整用户数据或 Provider 私有对象。
- handler 必须幂等、短时、有界;外部系统失败时由收据暴露,不改变 Runtime 终态。
四、失败与安全测试
- 同步与异步 handler 各测一次。
- 注入永不完成 Promise,验证
timed_out收据且 Runtime 继续真实收口。 - 注入异常,验证错误脱敏且不抛回 Runtime。
- 先让通用权限或人工审批拒绝工具,验证扩展不会执行或改写拒绝。
- 让通用权限允许,再由扩展拒绝,验证工具未执行且没有 Checkpoint。
- 验证
run-finished看到completed、paused或failed的真实 operation。 - 使用测试值验证输出不包含密钥、认证头、Cookie、私钥、URL 敏感参数或命令敏感值,同时确认普通业务字段没有被意外删除。
五、交付与回滚
- 运行模块清单中的测试和
npm run check:modules。 - 在 Windows/Linux 分别执行同一交互 Case。
- 保存扩展版本、grants、超时、Trace 和收据。
- 回滚时从
extensions、trustedIds和grants同时移除扩展;不删除既有审计证据。 - 未经明确授权,不提交、推送或发布。