# Compliance Metadata 设计方案 状态:第一阶段已落地发布校验和版本级 snapshot 固化;详情展示、审核 diff、搜索 facet 和 Runtime trace 集成仍按本文后续阶段推进。 ## 1. 背景 Issue #556 提出的方向是让 SkillHub 支持“可标准映射、可审计引用”的技能元数据。它参考了两个不同类型的开源仓库: - `mukul975/Anthropic-Cybersecurity-Skills`:大量 `SKILL.md` 在 frontmatter 中声明 MITRE ATT&CK、NIST CSF 等标准映射,并通过 `references/standards.md` 等文件补充证据。 - `calesthio/OpenMontage`:通过 pipeline manifest、artifact schema、checkpoint 和 review gate 证明垂直工作流的可恢复、可审核和可追踪。 这两个仓库给 SkillHub 的启发不同: - 标准映射应该进入 skill 协议和版本事实,而不是只作为 UI 标签。 - 运行时 trace 应由执行方记录,SkillHub 不应承担 Agent Runtime 的执行事实。 需要注意:`compliance` 不是当前已经被广泛应用的 `SKILL.md` 标准字段。SkillHub 现有协议文档已经约定 `x-astron-*` 作为平台私有扩展命名空间。因此第一阶段应使用 `x-astron-compliance`,先解决 SkillHub 自己的治理和审计需求;未来如果 OpenSkills / Agent Skills 生态形成公开字段,再通过兼容读取 `compliance` 或迁移工具对齐。 因此本方案采用职责分离: > SkillHub 负责“这个技能版本声明了什么合规能力”;Agent Runtime 负责“这次执行实际用了哪个技能版本”。两者通过 `skillVersionId + complianceSnapshotDigest` 关联。 这里的 compliance 是作者随技能包提交的声明型元数据。SkillHub 第一阶段只验证字段结构、取值格式、 包内证据文件是否存在、外部证据 URL 是否是合法 HTTP(S) URL,并生成不可变快照摘要;它不验证外部标准内容是否真实适用, 也不代表第三方审计、认证通过或平台背书。 ## 2. 职责边界 ### 2.1 SkillHub 职责 SkillHub 是技能注册中心和元数据权威源,负责: - 解析 `SKILL.md` frontmatter 中的 `x-astron-compliance` 字段。 - 发布时校验 compliance 元数据和证据引用。 - 将规范化结果固化为技能版本级 snapshot。 - 在已有技能详情、版本详情、审核和搜索能力中投影 compliance 信息。 - 记录 SkillHub 内部发生的发布、审核、compliance 变更审计。 - 为未来 Agent Runtime 引用提供稳定的 `skillVersionId` 和 `complianceSnapshotDigest`。 ### 2.2 Agent Runtime 职责 Agent Runtime,例如 Astron、Claude Code、Codex、OpenClaw 或其他执行方,负责: - 实际加载和执行技能。 - 生成 execution trace。 - 记录本次执行使用的 skill coordinate、skill version、`skillVersionId` 和 `complianceSnapshotDigest`。 - 记录运行时输入输出摘要、审批 gate、执行结果、错误和运行时策略。 SkillHub 不记录 Agent 每次执行,也不实现 Agent execution trace。 ## 3. 非目标 第一阶段不做以下内容: - 不新增独立 compliance 查询 API。 - 不实现 Astron execution trace。 - 不新增复杂 facet / 聚合搜索。 - 不引入外部审计系统集成。 - 不把 `compliance` 当作已经存在的上游通用标准字段。 - 不为了 compliance 过早新建复杂表结构,除非后续性能或查询需求明确。 ## 4. 协议草案 建议在 `SKILL.md` frontmatter 中先支持 SkillHub/Astron 私有扩展字段 `x-astron-compliance`: ```yaml --- name: incident-response-helper description: Guide analysts through incident response triage and evidence collection. version: "1.2.0" x-astron-compliance: - standard: mitre-attack version: "v19.1" controlId: T1059 title: Command and Scripting Interpreter evidence: - type: packaged-file path: references/standards.md - type: external-url url: https://attack.mitre.org/techniques/T1059/ --- ``` 字段含义: | 字段 | 含义 | |---|---| | `standard` | 标准名称,例如 `mitre-attack`、`nist-csf`、`soc2`、`hipaa` | | `version` | 标准版本,例如 `v19.1`、`2.0` | | `controlId` | 标准控制项、技术编号或条款 ID | | `title` | 人类可读名称 | | `evidence` | 证据列表 | | `evidence.type` | `packaged-file` 或 `external-url` | | `evidence.path` | 技能包内证据文件路径,仅 `packaged-file` 使用 | | `evidence.url` | 外部证据链接,仅 `external-url` 使用 | 未来兼容策略: - 写入规范:第一阶段只推荐作者写 `x-astron-compliance`。 - 读取兼容:如果后续生态出现公开 `compliance` 字段,解析器可以同时读取 `compliance` 和 `x-astron-compliance`,但需要定义冲突优先级。 - 对外展示:UI 和审计报告仍统一展示为“Compliance Metadata”,不暴露内部字段名前缀给普通用户。 ## 5. 版本级 Snapshot 发布时,SkillHub 将 compliance 规范化为版本级 snapshot,并写入版本元数据。 第一阶段优先复用: ```text skill_version.parsed_metadata_json ``` 建议结构: ```json { "frontmatter": { "name": "incident-response-helper", "description": "Guide analysts through incident response triage and evidence collection.", "version": "1.2.0", "x-astron-compliance": [] }, "complianceSnapshot": { "schemaVersion": "1.0", "items": [ { "standard": "mitre-attack", "version": "v19.1", "controlId": "T1059", "title": "Command and Scripting Interpreter", "evidence": [ { "type": "packaged-file", "path": "references/standards.md", "sha256": "..." }, { "type": "external-url", "url": "https://attack.mitre.org/techniques/T1059/" } ] } ], "digest": "sha256:..." } } ``` `digest` 用于未来运行时 trace 或外部审计引用。第一阶段只生成并写入 `parsed_metadata_json`,不新增独立 endpoint;后续再通过既有详情或版本详情投影给前端。 ## 6. 分步执行计划 ### Phase 1:协议和领域模型 目标:先把 `x-astron-compliance` 字段定义清楚,并放在领域层。 建议新增位置: ```text server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/metadata/ ``` 候选对象: ```text ComplianceMapping ComplianceEvidence ComplianceEvidenceType ComplianceMetadataService ComplianceSnapshot ``` 设计要求: - `SkillMetadataParser` 继续只负责解析 frontmatter,不承担 compliance 业务校验。 - `ComplianceMetadataService` 负责提取、规范化、校验 compliance。 - 不在 controller 中做 compliance 校验。 - 使用已有 `x-astron-*` 私有扩展命名空间,不新增未验证的公开字段。 ### Phase 2:发布时解析和校验 目标:技能发布时能识别并校验 compliance。 接入点: ```text SkillPackageValidator SkillPublishService SkillVersion.parsedMetadataJson ``` 基础校验规则: - `x-astron-compliance` 缺失时兼容旧技能。 - `x-astron-compliance` 存在时必须是数组。 - 每个 mapping 必须是对象。 - `standard`、`version`、`controlId` 必填。 - `title` 可选,但应有长度限制。 - `evidence` 可选;提供时必须是数组。 - 同一版本内不允许重复 `standard + version + controlId`。 - mapping 数量、evidence 数量和字符串长度要有上限。 证据校验规则: - `packaged-file.path` 必须存在于技能包。 - `packaged-file.path` 不允许 `../` 路径逃逸。 - `external-url.url` 只允许 `http` / `https`。 - 包内证据文件应计算 `sha256` 并写入 snapshot。 错误信息要求: - 使用现有 i18n 机制。 - 不在领域服务中散落不可翻译的长英文错误字符串。 ### Phase 3:固化版本级 Snapshot 目标:每个技能版本都有不可变 compliance snapshot。 实现要求: - 发布成功后生成规范化 `complianceSnapshot`。 - snapshot 内容和 digest 与该 `SkillVersion` 绑定。 - 后续详情、审核、搜索均读取 snapshot,不重新解释最新源码。 - snapshot 为空时也要有确定行为,避免旧技能受影响。 第一阶段不强制新建表。后续出现结构化过滤、统计或性能瓶颈时,再考虑: - `jsonb` GIN index; - `skill_version_compliance_mapping` 表; - 搜索 projection 表扩展。 ### Phase 4:已有接口投影,不新增独立 API 目标:让前端和审核能看到 compliance,但不发布猜测性 public API。 建议: - 在已有技能详情或版本详情 response 中增加 compliance projection。 - 审核详情中带出当前版本 compliance snapshot。 - 不新增以下 endpoint: ```text GET /api/skills/{namespace}/{slug}/versions/{version}/compliance GET /api/skills/{namespace}/{slug}/versions/{version}/metadata ``` 后续只有出现明确使用方时再新增独立 API,例如: - Agent Runtime 只需要拉 compliance snapshot,不需要完整技能详情。 - 企业审计系统按 `skillVersionId` 拉取合规声明。 - 前端需要单独比较两个版本的 compliance diff。 - 完整 detail payload 性能不可接受。 如果后续需要独立 API,优先考虑按不可变版本 ID 设计: ```text GET /api/skill-versions/{skillVersionId}/compliance ``` ### Phase 5:轻量搜索 目标:先提升可发现性,不直接做复杂 facet。 后续阶段: - 在搜索文档重建时,将 snapshot 中的 `standard`、`controlId`、`title` 加入搜索文本。 - 用户搜索 `T1059`、`mitre-attack`、`nist-csf` 时能命中对应技能。 更后续再考虑: - 按 standard filter。 - 按 controlId filter。 - compliance coverage 聚合。 - 独立索引或结构化 projection。 ### Phase 6:审核和审计 目标:只记录 SkillHub 自己发生的事实。 审核展示: - 当前版本 compliance snapshot。 - 与上一发布版本的 diff: - 新增 mapping; - 删除 mapping; - 修改 mapping; - evidence 变化; - digest 变化。 审计记录: - 发布时记录 compliance digest。 - 审核通过 / 拒绝时记录 compliance diff 摘要。 - evidence 变化作为风险信息进入 audit detail。 不记录: - Agent 执行输入输出。 - Astron trace。 - runtime 调用结果。 ### Phase 7:文档 目标:让技能作者、平台维护者和 Agent Runtime 接入方都理解边界。 需要更新的文档: - `docs/07-skill-protocol.md`:实现稳定后补充正式 `x-astron-compliance` 协议。 - 用户文档:说明如何在 `SKILL.md` 中声明 `x-astron-compliance`。 - 管理员文档:说明发布校验、审核 diff、审计记录。 - 集成文档:说明 Runtime 如何引用 `skillVersionId + complianceSnapshotDigest`。 文档必须明确: > SkillHub 只提供版本级 compliance snapshot。运行时 trace 由 Agent Runtime 记录,并可引用 SkillHub 的 `skillVersionId` 和 `complianceSnapshotDigest`。 ### Phase 8:测试 单元测试: - 无 `x-astron-compliance` 的旧技能正常发布。 - 合法 `x-astron-compliance` 正常解析。 - `standard` 缺失失败。 - `version` 缺失失败。 - `controlId` 缺失失败。 - 重复 `standard + version + controlId` 失败。 - `packaged-file.path` 不存在失败。 - `packaged-file.path` 路径逃逸失败。 - `external-url.url` scheme 非法失败。 - digest 稳定生成。 发布链路测试: - 上传含 `x-astron-compliance` 的技能包成功。 - 上传非法 `x-astron-compliance` 的技能包失败。 - 发布后 `parsedMetadataJson` 包含 `complianceSnapshot`。 - snapshot digest 与内容一致。 搜索测试: - 搜标准名能命中。 - 搜 controlId 能命中。 - 无 compliance 的旧技能不受影响。 审核测试: - 新版本新增 compliance。 - 新版本删除 compliance。 - 新版本修改 evidence。 - 审核详情能看到 diff。 ## 7. 推荐 PR 拆分 ### PR 1:协议、解析、校验、快照 范围: - domain metadata service; - package validator; - publish snapshot; - `parsedMetadataJson` 结构; - 单元测试和发布链路测试。 不包含: - UI; - 搜索 facet; - 独立 API; - Agent trace。 ### PR 2:详情页和审核展示 范围: - 既有 response 增加 compliance projection; - 技能详情展示; - 审核 diff 展示; - 前端测试。 ### PR 3:轻量搜索 范围: - 搜索文档增加 compliance keywords; - 搜索测试。 不做复杂 facet。 ### PR 4:文档和 Runtime 集成契约 范围: - 用户文档; - 管理员文档; - Runtime 引用方式; - `skillVersionId + complianceSnapshotDigest` 契约说明。 不实现 Astron trace。 ## 8. 最终架构原则 1. SkillHub 不执行技能,因此不记录执行 trace。 2. SkillHub 是 skill metadata 和 version snapshot 的权威源。 3. Agent Runtime 是 execution trace 的权威源。 4. 合规审计通过 `skillVersionId + complianceSnapshotDigest` 把两边事实关联起来。 5. 第一阶段不发布猜测性 API;先通过已有详情和版本投影满足内部使用。 6. 先做稳定协议和可验证快照,再做 UI、搜索和外部集成。