Orca Skill Sharing 管理指南:访问模型、吊销删除、保留契约与事故恢复
本文聚焦 Orca 技能共享(Skill Sharing)的运营合同(contract),覆盖其发布与分发的访问模型、分享链接的吊销与包删除语义、用户/组织离场处理、数据保留策略、审计隐私边界以及事故恢复流程。读完后,你将掌握在 Orca Cloud 上管理不可列名(unlisted)技能分享链接的安全边界:什么操作需要登录身份、吊销后哪些数据仍会存活、被删除对象何时不可恢复,以及数据库与 GCS 联合恢复的正确顺序。
访问模型:分享链接就是凭证
Orca 的技能共享不提供任何公开目录。根据 管理指南,其访问模型的核心规则如下:
- 共享包是"不可列名的持有型资源"(unlisted bearer resources):Orca 不提供公开浏览、搜索、接收者清单或包索引;
- 持有链接即可访问:任何拿到有效、未过期链接的人,无需登录即可检查(inspect)包内容,并申请一个短生命周期的下载授权(download grant);
- 管理操作需要认证身份:发布、包/版本管理、查看自己名下的链接清单、吊销和删除,都要求"当前仍具有组织访问权限的已认证包属主";
- 不泄露存在性:缺失、过期、已吊销、已删除、无权限这几种情况,返回完全相同的不泄露(non-disclosing)响应;
- 客户端零长期凭证:桌面端与远端运行时拿不到任何 GCP 身份或长期存储凭证,所有对存储桶的访问都经由云端 API 换发的短时效签名 URL 完成。
指南中有一句关键警告:持久分享 ID 本身就是一项凭证(The durable share ID is a credential)。不要把它写进工单、日志、分析数据或支持包(support bundle);一旦链接可能到达了非预期的接收者,应直接使用吊销,而不是追查泄露途径。
从源码结构看,这条"匿名换授权"的链路在桌面端客户端中有直接体现:skill-cloud-service.ts 中对匿名分享调用 POST /v1/skill-shares/<share-id>/download-grants,而 skill-client-mediated-transfer.ts 里 grant 的结构就是 { url, expiresAt }——一个带明确过期时间的签名下载地址。云端对缺失/过期/已吊销/已删除的分享统一返回同样的 404 skill_share_not_found(实现清单中记录了带与不带 Authorization 头的匿名请求都收到同一响应),这正是"不泄露存在性"规则在 API 层的落地。
吊销与删除:语义边界和四步删除顺序
吊销的实际效果与五分钟窗口
吊销一个分享(share)的效果需要精确理解:
- 吊销立即阻止新的链接解析和新的下载授权签发;
- 但在吊销前已签发的、绑定对象代际(generation-bound)的授权仍然有效,直到其 5 分钟自然过期——这是吊销语义的最大滞后时间;
- 已经安装到接收者机器上的技能副本不受影响,仍保留在本地。
这一点在 威胁模型 的 TM-17 条目中有对应记录:"Revocation blocks new grants immediately; existing grants expire within five minutes... Local installs remain independent."
包删除的固定顺序
删除一个包(package)不是简单的"删数据",文档给出了严格的四步顺序:
- 将包标记为已删除,并吊销其所有活跃分享;
- 以事务方式解除被保留版本(retained versions)对对象的引用;
- 只删除没有任何保留版本引用的对象代际;
- 在数据库或 GCS 出现部分失败后,对有限的"待删除"集合做对账(reconcile)。
两条补充约束:
- 只要还有一个活跃的固定版本(pinned)分享引用某个版本,该版本就不能被删除;
- 删除操作使用记录的精确 GCS 代际来定位对象,且从不覆盖已发布的不可变键(immutable key)。
从源码结构看,GCS 对象的组织方式支撑了这种精确删除:实现清单 记录了最终键形如 packages/v1/tenants/<tenant-hash>/sha256/<prefix>/<archive-sha256>/package.tar.gz(内容寻址、租户哈希隔离),而上传隔离键是 uploads/<upload-id>/package.tar.gz。相同归档只在属主租户内部去重,跨租户不会因去重产生存在性或时序泄露(TM-10)。
用户与组织离场:元数据保留与删除前检查单
包归属于属主租户(owner tenant),同时记录发布它的用户。组织租户内,发布者离开后,其他在职成员可以接管该包的管理权,但 Orca 不会改写记录的创建者身份。删除某个用户不会自动吊销组织的链接、不会删除包、也不会清除任何已安装副本。
在删除一个组织租户之前,指南要求完成以下五步:
- 禁用该租户的新授权签发(disable new grants);
- 由授权运维人员盘点并吊销全部活跃分享;
- 决定包是移交给另一个授权属主、继续保留、还是删除;
- 处理法律保留(legal hold)、数据抹除与审计保留要求;
- 执行协调的元数据与对象生命周期流程,不得绕过引用检查。
指南同时明确了一个未决事项:产品当前尚未编码通用的所有权转移或法律保留策略;在外部发布之前,隐私、安全与组织属主必须共同批准适用策略。在那之前,应保留元数据和软删除代际,而不是猜测性删除。
保留契约:每类数据的默认生命周期
以下是文档定义的保留契约(retention contract)原文表格,这是容量与合规规划的核心依据:
| 数据 | 默认行为 |
|---|---|
| 上传策略(upload policy)与待上传行(pending upload row) | 15 分钟后过期 |
被遗弃的 uploads/ 隔离对象(quarantine object) |
由 GCS 在一天后删除 |
| 已发布的不可变包对象 | 无基于时间的删除;只要仍被引用就保留 |
| 已签发的下载授权(download grant) | 5 分钟后过期 |
| 已删除的包对象 | 通过 GCS 软删除(soft delete)可恢复 7 天 |
| PostgreSQL 元数据 | 受备份与 7 天时间点恢复(PITR)覆盖 |
| 接收者已安装的本地副本 | 独立的本地数据;云端删除不会移除它 |
| 审计事件 | 遵循已批准的审计保留策略 |
两条优先级规则必须记住:
- 组织级保留、法律保留与数据抹除要求优先于产品回滚保留;
- 产品层面的删除不是法律保留机制——legal hold 不能依赖"不删"来实现,而要靠上面的协调流程。
这些数值与 实现清单 中的基础设施记录相互印证:上传授权 15 分钟 V4 签名 POST 策略、uploads/ 前缀专属的一天生命周期、5 分钟签名 GET 下载授权、7 天软删除,以及 orca_skills 数据库所在的 Cloud SQL 实例开启备份与 7 天 PITR。
审计与隐私:记录什么、绝不记录什么
指南对审计记录(audit records)划定了明确的白名单与黑名单:
可以包含:包/版本 ID、操作者(actor)ID、事件类别、结果(outcome)、时间戳。
必须排除:技能内容、文件名、清单(manifest)、组织成员列表、本地路径、持久分享 URL、上传策略、下载授权、任何凭证。
此外还有两条运行时约束:
- 匿名滥用防护不得持久化原始请求者 IP 地址(限流等控制以不落地原始 IP 的方式实现);
- 常规 Cloud 日志只允许包含:路由、方法、状态码、耗时、有限的失败类别;验证 staging 日志与诊断导出时,应使用种子化隐私金丝雀(seeded privacy canaries)——即故意植入敏感样例值,验证它们确实没有出现在任何采集输出中。
从源码与发布记录看,这套边界已有工程落点:威胁模型 TM-15 条目要求桌面安装诊断在打点前将值映射为有限类别、支持包(support bundle)测试注入私有金丝雀并证明其缺席;实现清单还记录了 Cloud PR 在 staging 增加日志项目排除(google_logging_project_exclusion.skill_share_bearer_request_urls),使逐链接的 Cloud Run 请求 URL 不进入日志存储,同时保留路由模板级遥测。
事故恢复与运维控制
三个独立的 kill switch
上传(upload)、下载(download)、远端安装(remote-install)三条操作路径各有一个独立的 kill switch。事故发生时只禁用受影响的最小操作面——其余功能(包括本地技能发现与已安装副本的使用)继续工作。实现清单记录了对应的验证:三个变更控制可以独立置为禁用,而匿名不可列名预览(unlisted preview)在此过程中仍然可用。
PostgreSQL PITR 与 GCS 代际恢复的协调流程
当需要同时恢复数据库元数据与被软删除的对象时,文档给出的顺序是:
- 把元数据恢复到隔离的数据库中;
- 从中识别出被引用的精确 GCS 代际;
- 只恢复与这些代际匹配的软删除对象(恢复时携带
ifGenerationMatch之类的代际前置条件,防止恢复错代际); - 校验归档与包的标识一致;
- 以事务方式把元数据重新指向恢复后的对象;
- 在承载者预览(bearer preview)与代际绑定下载均通过验证之前,保持授权签发处于禁用状态。
实现清单中有一条真实的恢复演练记录可作为参考:恢复 smoke 发布了隔离 bundle、软删除精确的已发布 GCS 代际、用 ifGenerationMatch=0 恢复、校验不可变元数据、事务性地重指所有匹配的数据库引用、验证不可列名下载后删除探针,全程不留下临时恢复任务或存活探针对象。
延伸阅读
- Agent skill sharing 威胁模型:安全不变量、20 条威胁登记项(TM-01 至 TM-20)与未决发布门禁;
- 实现与验证清单:产品语义确认、包契约限制、GCP 基础设施声明与各阶段验证证据;
- 桌面端云端客户端:分享解析与下载授权的实际调用路径;
- 原文档引用的运维 runbook(Orca Cloud 侧的
skill-sharing-runbook.md,覆盖部署控制、对账、饱和、签名失败、数据库故障与受保护的恢复工作流)不在当前仓库内,运维事故命令以该 runbook 为最终事实来源。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00