# ============================================================ # 许可证成色分级 → 镜像可见性规则 # ------------------------------------------------------------ # 这是新增项目时的**第一判断项**:先定级,再决定源码镜像能不能公开。 # 定错级的代价:L3 项目被公开镜像,等于替对方做了一次未经授权的公开分发。 # # 判定顺序自上而下,命中即停。 # ============================================================ tiers: - level: L1 label: 完全开源 redistributable: true visibility: public match_spdx: - MIT - Apache-2.0 - BSD-2-Clause - BSD-3-Clause - ISC - MPL-2.0 - GPL-2.0 - GPL-3.0 - LGPL-3.0 - Unlicense note: "可自由镜像与再分发,保留原许可证声明即可。" - level: L2 label: 有限开源 redistributable: true visibility: public match_spdx: - AGPL-3.0 - SSPL-1.0 - BUSL-1.1 - Elastic-2.0 note: "有附加限制(网络使用即触发开源义务、或限制商业化托管)。可公开镜像,但档案中必须记录限制条款。" - level: L3 label: 源码可得 · 非开源 redistributable: false visibility: private match_spdx: - NOASSERTION - OTHER - LicenseRef-scanned note: | SPDX 无法识别的自定义许可,典型为 source-available。 必须人工读 LICENSE 原文确认,再决定是否归 L3 或 L4。 判为 L3 时镜像**一律私有**,仅作个人代码级研究,不构成公开分发。 - level: L4 label: 不可得 redistributable: false visibility: none match_spdx: - "" - null note: "无 LICENSE 文件或明确 proprietary。不镜像,档案里只留仓库链接与 commit 快照。" # ---------- 人工复核触发条件 ---------- # 命中以下任一情形,脚本必须停下来要求人工确认,不得自动定级: manual_review_triggers: - "SPDX 为 NOASSERTION 且 LICENSE 文件超过 200 行(条款复杂,容易漏掉分发限制)" - "同一仓库存在多个 LICENSE 文件(如 LICENSE + LICENSES/ 目录,可能混合许可)" - "README 自称 open source 但 SPDX 不是 OSI 认证标识(名实不符,需显式记录)" - "LICENSE 中出现 SaaS / hosting / white-label / marketplace / resale 任一关键词" # ---------- 混合许可的降级规则 ---------- # 自动定级只认 SPDX 标识,无法识别「目录切分许可」这类混合形态。 # 遇到需人工复核的仓库,按此流程处理: mixed_license_procedure: - "定位受限目录:读根目录 LICENSE 与各子目录 LICENSE,找出采用非 OSI 许可的路径" - "评估剩余部分:确认排除受限目录后,其余内容是否为单一 OSI 许可" - "若成立 -> 镜像时排除受限目录,可见性按剩余部分的许可定级(通常可 public)" - "若不成立 -> 整仓按最严格的那个许可定级(通常 L3 / private)" - "必须在档案 mirror.sync_note 与仓库内 MIRROR-NOTE.md 写明:排除了什么、为什么、如何恢复完整镜像" # 补这条规则的缘由(注意:这是独立顶层键,不能写进上面的列表里—— # YAML 不允许序列与映射键同级混用,写进去会直接让整份 schema 解析失败) mixed_license_note: | 这条规则是 2026-09-01 处理 different-ai/openwork 时补上的。 自动定级把它判成 L3/private,但人工复核后发现 ee/ 之外是纯 MIT, 排除 ee/ 后完全可以公开镜像——同一个仓库,两种正确答案, 取决于镜像是否包含受限目录。没有这条规则就会做出过度保守的误判。 # ---------- 已定级样本(供后续同类项目参照) ---------- precedents: - repo: Devin-AXIS/iPolloWork level: L3 visibility: private license_name: "iPolloWork Source Available License 1.0" decided_at: 2026-09-01 reason: | 条款原文要求:任何售卖、转售、收费服务、SaaS、托管、白标、市场分发或 面向客户的使用,无论个人还是企业,均需事先书面授权;且面向用户的前端 必须保留 iPolloWork 名称、Logo 与产品归属。公开镜像落入「托管/市场分发」 的解释空间,故设为私有。 - repo: different-ai/openwork level: L3 visibility: public decided_at: 2026-09-01 manual_review: true trigger_hit: - "同一仓库存在多个 LICENSE 文件(LICENSE + ee/LICENSE)" - "README 自称 open source 但 SPDX 为 NOASSERTION" - "ee/LICENSE 含 production / subscription / resale 关键词" license_name: "目录切分许可:ee/ 之外 MIT;ee/ 为 OpenWork EE License" reason: | 根目录 LICENSE(36 行)声明 ee/ 之外的部分为 MIT; ee/LICENSE(72 行)为 OpenWork EE License,要求生产使用需订阅, 仅 5 人以下组织、30 天评估、开发测试三种情形豁免, 且每个 ee/ 版本公开发布满两年后自动追加 MIT 授权。 **排除 ee/ 目录后,镜像内容为纯 MIT,可公开分发**; 若完整镜像(含 ee/)则必须私有。 mirror_strategy: "镜像时排除 ee/ -> public;完整镜像 -> private" lesson: | 这是「自动定级过度保守」的典型案例:SPDX=NOASSERTION 直接判 L3/private 是安全的默认值,但对目录切分许可仓库会误伤。 已据此补充 mixed_license_procedure 规则。