ip-oss-review · git:20260529.efece30 · 2026-05-29 · sha256 30d5bc5a2c0d5a3b
ip-oss-review git:20260529.efece30A
Immutable. This exact content is served forever at /api/v1/blob/30d5bc5a2c0d5a3b.
--- name: ip-oss-review description: 面向中国法的开源许可证合规审查,对依赖清单、单一组件或对外开源代码进行许可证分类、义务映射与风险标记;当用户需要审查SBOM或依赖清单的copyleft义务、判断组件能否随产品发布、或准备代码对外开源时使用 argument-hint: "[清单文件路径 | SBOM | 包名 | 代码仓库路径 | 粘贴文本]" --- # /oss-review-cn 依据团队实务配置文件中的实务画像,对开源许可证进行合规审查。按许可证族分类依赖项,将义务映射到部署模式,标记许可证未知和冒充开源的非OSI组件,给出行动建议——合规、替换、移除、寻求法律审查、寻求商业许可。 ## 使用说明 1. **加载团队实务配置。** 若配置文件缺失或仍为占位符,停止并提示:"请先完成实务画像配置——我需要在审查前了解团队的实务画像(及OSS策略,如有)。" 若实务画像指向已上传的OSS策略,一并读取——该策略是团队接受/需审查/禁止许可证的权威来源。 2. **确定审查范围:** 依赖清单(package.json、requirements.txt、go.mod、Gemfile、Cargo.toml、pom.xml、SBOM),单一组件,或团队准备对外开源的自有代码。若用户传入了路径,从文件推断;否则询问。 3. **在分类义务前确定部署模式**——SaaS、分发二进制、仅内部使用、嵌入式。同一依赖清单在不同部署模式下触发不同义务。 4. **按下方工作流执行。** 特别注意: - 阅读实际许可证文本,而非仅看元数据——LICENSE文件可能有误,包元数据可能过时。 - 将每个包分类为宽松型/弱copyleft/强copyleft/公共领域/非OSI/未知。 - 将许可证未知标记为"需审查",而非默认视为宽松型。 - 标记非OSI源可用许可证(SSPL、BUSL、Commons Clause、Elastic License、fair-source)——这些不是开源软件。 - 对外开源代码,检查所选对外许可证是否与所有嵌入依赖的许可证兼容。 5. **按下方模板输出备忘录**——工作成果抬头、底线结论、顶部标记、按严重度分组的逐包清单、中国法域注释、对外开源检查(如适用)、审批路由。 6. **遵守决策姿态。** 当copyleft触发分析取决于争议问题时(AGPL的"网络交互"与中国法下"信息网络传播权"的关系、GPL-3.0的"传达"与中国法下"发行权"的对应、LGPL链接范围),标记为律师审查并列出双方因素。任何被标记为强copyleft或许可证未知的组件,须在依赖随产品发布或代码开源前由律师评估。 ## 示例 ``` /oss-review-cn ~/code/my-project/package.json /oss-review-cn ~/code/my-project/requirements.txt /oss-review-cn redis /oss-review-cn ~/code/my-project # 仓库根目录——扫描所有清单文件 ``` --- ## 协作扩展 OSS合规审查请求通常通过工单系统提交。连接Jira、Linear或Asana后,本技能可以:监控入站OSS请求,直接在工单中回复指引(标记信息不完整、索要仓库链接、返回许可证族分类),并跨请求追踪审查状态。 未连接时,粘贴工单或描述请求,逐条处理。 ## 事项上下文 **事项上下文。** 检查实务配置中的"事项工作区"设置。若为"未启用"(内部用户的默认值),跳过本段——技能使用实务级上下文,事项机制不可见。若已启用且无活动事项,询问:"这是哪个事项的?切换到对应事项或说明使用实务级上下文。" 加载活动事项的事项文件获取事项特定上下文和覆盖。输出写入事项文件夹。除非"跨事项上下文"已开启,否则不读取其他事项的文件。 --- ## 目的 告知用户依赖树中有哪些许可证,这些许可证在给定部署方式下触发哪些义务,以及针对每个许可证应采取什么行动。输出是一份律师(或有律师访问权的工程师)可据以行动的备忘录——合规、替换、移除、寻求法律审查、寻求商业许可。 **这是首轮分类。** Copyleft分析取决于部署模式、链接程度、法域,有时取决于未经司法检验的法律问题(尤其是AGPL的"网络交互"与中国法下"信息网络传播权"的关系、GPL-3.0专利条款在中国专利法下的解读)。任何被分类为强copyleft或许可证未知的组件,须在依赖随产品发布或代码开源前由律师评估。本技能报告发现;律师决定行动。 ## 前置条件:加载实务画像 **在扫描依赖前,读取团队实务配置文件。** 若缺失或仍含占位符,停止并提示先完成实务画像配置。实务画像告知你: - 团队中谁负责OSS审查(通常是工程团队加法务签字) - Copyleft义务的上报路由 - 需添加的工作成果抬头 若实务画像有已上传的OSS策略,一并读取——该策略是团队接受哪些许可证、哪些触发审查、哪些被禁止的权威来源。 ## 工作流 ### 步骤1:审查范围是什么? 询问(或从用户提供的输入推断): > 我们要审查什么? > > 1. **依赖清单**——package.json、requirements.txt、go.mod、Gemfile、Cargo.toml、pom.xml、SBOM(SPDX/CycloneDX)、lockfile > 2. **单一组件**——考虑添加的某个具体包 > 3. **自有代码**——我们计划对外开源,需要检查其中嵌入了什么 分析路径不同: - 依赖清单 → 分类每一条目,汇总义务 - 单一组件 → 分类一个包,如可获取则遍历其传递依赖 - 对外开源代码 → 检查嵌入内容(直接和传递依赖),检查所选对外许可证是否与所有嵌入许可证兼容,检查LICENSE/NOTICE文件是否正确 ### 步骤2:部署模式是什么? 这是许可证清单之后最重要的输入——同一个库在不同交付方式下承担不同义务。询问: > 部署方式是什么? > > 1. **SaaS/托管服务**——用户通过网络访问;不向用户分发任何东西 > 2. **分发二进制**——向用户分发编译后的代码(桌面应用、移动应用、本地部署服务器、CLI工具) > 3. **仅内部使用**——仅在公司内部使用,不对外分发 > 4. **嵌入式/固件**——随硬件或作为封闭系统固件分发 | 部署模式 | 实质性触发义务的许可证 | |---|---| | SaaS | AGPL(网络触发,对应中国法"信息网络传播权"),宽松许可证在UI中的署名,SSPL/BUSL/Elastic若用作竞争服务 | | 分发二进制 | GPL、LGPL、MPL、EPL(均在中国法"发行权"范围内触发),宽松许可证署名 | | 仅内部使用 | 大部分copyleft不触发——无"发行"行为。宽松许可证署名仍为良好实践。AGPL若公司外部用户通过网络交互仍触发。 | | 嵌入式/固件 | GPL在此处极难合规(源代码披露+可重复构建+安装信息)。务必在发布前而非之后规划。 | 在输出备忘录中标记部署模式——同一依赖清单按"SaaS"vs."分发二进制"审查会产生不同义务。 ### 步骤3:分类每个依赖 对每个包,确定许可证。阅读实际许可证文本,而非仅看元数据——LICENSE文件可能有误(文件写MIT但头文件写GPL;README声称Apache但没有许可证文件),包管理器元数据可能过时。 分类为: | 类别 | 示例 | 关键义务 | |---|---|---| | **宽松型** | MIT、BSD-2-Clause、BSD-3-Clause、Apache-2.0、ISC、Zlib、Unlicense | 署名、保留许可证文本,Apache-2.0附加专利授权+NOTICE要求 | | **弱copyleft** | LGPL-2.1、LGPL-3.0、MPL-2.0、EPL-1.0、EPL-2.0、CDDL | 文件级或库级源代码披露;链接规则各异 | | **强copyleft** | GPL-2.0、GPL-3.0、AGPL-3.0、OSL、EUPL(视版本) | 广泛源代码披露;AGPL延伸至网络使用 | | **公共领域/奉献** | CC0、Unlicense、WTFPL | 通常无义务,但部分在中国法下存在争议——中国著作权法不承认"放弃著作权"的完全效力 [模型知识 — 需核验] | | **非OSI源可用** | SSPL、BUSL、Commons Clause、Elastic License、Confluent Community、fair-source族 | 非开源——限制商业使用、竞争服务使用或两者兼有。阅读具体许可证。 | | **其他/自定义/未知** | 厂商特定、专有、缺少许可证文件、文件与头文件许可证冲突 | 停止——不要默认视为宽松型 | 标记: - **双许可包**——我们使用哪个许可证?选择可能改变义务。 - **已弃用包**——该包不再维护;是否有受支持的替代品? - **传递依赖中含copyleft的包**——顶层许可证为宽松型但传递依赖为copyleft。 - **近期变更许可证的包**——Redis、MongoDB、Elastic、HashiCorp——确认所钉版本使用的许可证与预期一致。 ### 步骤4:将义务映射到部署模式 对每个已分类依赖,陈述部署模式触发的义务: ```markdown ### [package@version] — [许可证] **分类:** [宽松型 / 弱copyleft / 强copyleft / 公共领域 / 非OSI / 未知] **在我们的部署模式下的义务([SaaS / 分发二进制 / 仅内部 / 嵌入式]):** - [ ] [具体义务——例如:"在随应用分发的NOTICES文件中包含署名"] - [ ] [例如:"若修改并分发,公开我们修改部分的源代码"] - [ ] [例如:"AGPL网络触发——若用户通过网络访问我们修改后的版本,须向其提供源代码"] **风险:** 严重 | 高 | 中 | 低 **建议:** [履行义务 | 替换为[替代品] | 移除 | 发布前律师审查 | 向[厂商]寻求商业许可] ``` > **copyleft依赖如何被消费?** 链接关系决定copyleft是否实际触发。询问或判断: > - **静态链接/一起编译:** 作品合并为一个二进制。强信号表明copyleft触发(LGPL"基于库的作品"、GPL演绎作品)。中国法下对应"改编权"和"复制权"的行使 [模型知识 — 需核验]。 > - **动态链接/共享库:** 作品在运行时保持可分离。LGPL明确允许("使用库的作品")。GPL立场有争议(FSF认为是演绎作品,其他人不认同)。 > - **头文件包含/内联函数:** 可能构成演绎作品,取决于包含量。 > - **子进程/IPC:** 独立进程通过明确定义的接口通信。通常不构成演绎作品。 > - **网络API调用:** 对大多数许可证,不触发。对**AGPL**,网络交互条款意味着通过网络提供软件即为中国法下的"信息网络传播"行为。在微服务架构中,API背后的AGPL组件仍触发。 > - **文件范围copyleft(MPL):** 仅修改文件承担copyleft,而非整个作品。检查是否有copyleft文件被修改。 > > **严重度评级取决于此。** "LGPL——弱copyleft,链接规则各异"而不做链接分析,是让工程师承担法律风险的答案。专有产品中静态链接的LGPL为严重。动态链接的LGPL为低。同一许可证,评级相反。 **严重度校准:** | 级别 | 含义 | |---|---| | 严重 | 强copyleft在触发它的部署模式中(如分发二进制中的GPL,SaaS中的AGPL)。非OSI许可证与商业模式实际冲突(如SSPL用于托管服务)。无法确定许可证且该包为关键依赖。 | | 高 | 弱copyleft但团队未准备履行义务(文件级披露、NOTICE要求)。双许可但所选许可证不明确。许可证文件与头文件不一致。 | | 中 | 宽松型但署名要求未接入构建流程(缺少NOTICES文件、分发中缺少LICENSE)。传递copyleft的位置是否触发取决于库的消费方式。 | | 低 | 宽松型且义务已满足。Copyleft在不会触发的部署模式中(如GPL库仅内部使用,无再分发)。 | ### 步骤5:标记失败模式 在备忘录顶部标记区中提示以下任何情况: - **许可证未知**——分类为"需审查",而非宽松型。未分类的依赖应阻止发布决策,而非悄悄通过。 - **许可证文件与文件头冲突**——同时阅读两者并报告冲突。 - **不兼容组合**——GPL-2.0-only + Apache-2.0为已知不兼容;仔细检查MPL/EPL/GPL组合。 - **冒充开源的非OSI许可证**——SSPL、BUSL、Commons Clause、Elastic License、Confluent Community。阅读许可证;不要依赖GitHub的"开源"徽标。 - **许可证变更**——若先前版本为宽松型而当前版本为源可用型,版本钉选至关重要。 ### 步骤6:对外开源检查(若审查准备对外开源的自有代码) 若用户准备对外开源代码: - 确认所选对外许可证与每个嵌入依赖许可证兼容(例如,不能在嵌入GPL代码的情况下以MIT发布——组合作品必须为GPL) - 确认LICENSE文件存在且正确 - 确认NOTICE文件存在并列出所需署名(Apache-2.0等) - 确认第三方许可证文本在要求处已打包 - 确认仓库历史中无专有或机密代码、无客户数据、无嵌入凭据 - 确认项目名称的商标和品牌政策(独立于著作权许可) - 确认符合中国《网络安全法》《数据安全法》对开源代码的要求(若涉及关键信息基础设施相关代码或重要数据)[模型知识 — 需核验] ### 步骤7:组装备忘录 在备忘录前添加团队实务配置中的工作成果抬头。 本备忘录及所审查的任何依赖清单可能属于特权、保密或两者兼有。输出继承来源的该等属性。仅在特权圈内分发;在任何对外交付前(包括将备忘录附加到特权圈外的工程工单前)去除工作成果抬头。 > **无静默补充。** 若对备忘录所需规则的检索查询返回少量或无结果(AGPL网络触发在中国法下的可执行性、GPL-3.0专利条款在中国专利法下的范围、最近变更许可证包的最新许可证文本),报告发现结果并停止。不要未经询问从网络搜索或模型知识填补空白。说明:"检索从[工具]返回[N]条结果。对[规则/许可证/法域]的覆盖似不足。选项:(1) 扩展检索查询,(2) 尝试不同检索工具,(3) 搜索网络——结果将标记为`[网络搜索 - 需核验]`且应在依赖前对照原始来源核实,(4) 标记为未核验并停止。请选择。" 律师决定是否接受较低置信度来源。 > > **来源标注。** 备忘录引用许可证文本、解释许可证的法院判决或管理组织指南时,标注引用来源:`[OSI]`、`[SPDX]`、`[FSF]`、`[SFC/SFLC]`、`[国家法律法规数据库]`、`[中国裁判文书网]`、`[元典法规]`、`[元典案例]`、`[监管机构官网]`,或从连接器检索的引用标注工具名;`[网络搜索 - 需核验]`用于网络搜索引用;`[模型知识 - 需核验]`用于从训练数据回忆的引用;`[用户提供]`用于直接从仓库读取的许可证文本。标注`需核验`的引用具有更高的编造风险。永远不要去除或合并这些标签。 ```markdown [工作成果抬头——按实务配置] # 开源审查:[项目 / 依赖清单 / 组件] **审查日期:** [日期] **范围:** [依赖清单 / 单一组件 / 对外开源代码] **部署模式:** [SaaS / 分发二进制 / 仅内部 / 嵌入式] --- ## 底线结论 [两句话。能否发布?发布前须完成什么?] **审查包数:** [N] **按分类:** [N宽松型, N弱copyleft, N强copyleft, N公共领域, N非OSI, N未知] **问题:** [N]严重 [N]高 [N]中 [N]低 **需审批人:** [姓名,按实务画像] --- ## 顶部标记 [许可证未知列表、许可证冲突列表、冒充开源的非OSI列表、不兼容组合] --- ## 逐包分析 [步骤4的清单,按严重度分组] --- ## 中国法域注释 中国法下开源许可证的可执行性依据: - 《中华人民共和国著作权法》(2020修正)第10条:发行权与信息网络传播权 - GPL类许可证的义务触发条件在中国法下对应"发行权"(分发场景)和"信息网络传播权"(网络交互场景),而非美国法下的"conveying"或"distribution" [模型知识 — 需核验] - AGPL的网络交互条款与中国法"信息网络传播权"的对应关系尚未经中国法院直接裁判确认 [模型知识 — 需核验] - 罗盒科技诉风灵科技案(2019)确认GPL在中国法下具有合同约束力,违反GPL条款构成著作权侵权 [中国裁判文书网] - 中国著作权法下,"放弃著作权"(如CC0)的效力存在争议——著作权中人身权(署名权等)不可放弃 [模型知识 — 需核验] - 《计算机软件保护条例》对软件著作权的特殊规定 - 《中华人民共和国专利法》对开源许可证中专利授权条款的解读 标注本项目任何下游分发的适用法律选择,并标记实务画像中标记为需上报的法域。 --- ## 监管合规(中国特有) 若项目涉及以下场景,需额外审查: - **关键信息基础设施**:使用开源组件需符合《网络安全法》《关键信息基础设施安全保护条例》的供应链安全要求 [模型知识 — 需核验] - **数据安全**:开源组件处理重要数据或个人信息的,需符合《数据安全法》《个人信息保护法》要求 [模型知识 — 需核验] - **出口管制**:含加密功能的开源组件可能受《出口管制法》约束——确认是否涉及管制物项 [模型知识 — 需核验] - **软件供应链安全**:参照《软件供应链安全要求》等相关标准,审查开源组件来源可信度和安全漏洞 [模型知识 — 需核验] --- ## 对外开源检查(如适用) [来自步骤6] --- ## 审批路由 [来自实务画像——谁审批,什么触发自动上报] ``` ## 资源索引 - 脚本:见 [scripts/run_evals.py](scripts/run_evals.py)(用途:运行5项评估测试,验证SKILL.md中的中国法适配指导和行为要求) - 参考:见 [references/cn-legal-sources.md](references/cn-legal-sources.md)(何时读取:需要中国法法律法规原文、案例引用、监管文件来源及效力状态时) - 参考:见 [references/intake.json](references/intake.json)(何时读取:需要了解本次中国法适配的提交登记信息、变更类型和来源引用时) - 参考:见 [references/notes.md](references/notes.md)(何时读取:需要了解中国法适配的具体变更内容、法律推演依据和待确认问题时) - 参考:见 [references/normal-case.md](references/normal-case.md)(何时读取:需要参考SaaS项目依赖清单审查的正常样例时) - 参考:见 [references/edge-case.md](references/edge-case.md)(何时读取:需要参考AGPL网络触发的边界样例时) ## 决策姿态 当许可证无法被确信分类时,标记为**"需审查"**——不要称为宽松型。低估许可证风险是单向门:基于宽松型默认假设做出的发布决策,可能数月后变成源代码披露义务或禁令。过度标记是双向门——律师在审查中收窄清单。 同样,当copyleft触发分析取决于争议问题时(AGPL的"网络交互"与中国法"信息网络传播权"的对应、GPL-3.0的"传达"与中国法"发行权"的映射、LGPL链接范围),标记为律师审查并列出双方因素。 ## 交付前质量检查 - [ ] 实务画像及任何OSS策略已加载 - [ ] 分类义务前已确定部署模式 - [ ] 每个依赖都有分类,包括可获取的传递依赖 - [ ] 许可证未知的包已标记,未默认为宽松型 - [ ] 对任何copyleft或非OSI发现已阅读许可证文本(而非仅元数据) - [ ] 引用已加来源标签;未去除`需核验`标签 - [ ] 审批人按实务画像指定 - [ ] 输出已标记工作成果抬头 - [ ] 中国法域注释已包含 - [ ] 监管合规章节(如触发)已包含 ## 以下一步决策树收尾 以实务配置中的下一步决策树结束。根据本技能产出的内容定制选项——五个默认分支(起草X、上报、补充事实、观察等待、其他)是起点而非锁定。决策树是输出;律师选择。 若扫描涉及超过约10个包,或用户随时询问:提供仪表盘(参见实务配置中的仪表盘提议)。根据此处有用的内容定制提议——按许可证族计数(宽松型/弱copyleft/强copyleft/AGPL/专有/未知)、风险分布、发现清单含严重度和包版本。