状态
Accepted(Revised,2026-07-25)。
背景
最小网站、API 和小程序外壳可以不采用核心 Platform 业务能力;小型应用或 SaaS 在活跃自然人用户不超过 30 人时,也应能直接使用业务能力,不被首张许可证签发流程阻断。
“无需客户 License”不能实现为接受未签名 License、客户端自报人数或散落的 Development bypass。人数边界必须来自 Identity 主体生命周期的权威事实,并在所有用户写入口并发安全地执行。
决策
-
community.web.v1保持厂商签名的 protocol v2 共享许可证策略,精确固定到mini-api、mini-api-single、single-tenant、无 Platform/行业扩展,以及仅framework.core与framework.aspnetcore两项 Feature。 -
community.small.v1激活为产品内建容量权益,不是 License Envelope。Host 必须显式配置Licensing:Runtime:PolicyId=community.small.v1;只有 Identity owner 的持久权威计量可以触发放行。 -
同一持久
DeploymentId下跨全部租户汇总。Active、Locked的非 Host 自然人用户占用席位;PendingActivation、Disabled、Expired、软删除用户、Host 运维主体、API Client 和应用身份不占用。 -
用户聚合、
(DeploymentId, TenantId, UserId)唯一分配状态、唯一计量行与追加式流水处于同一工作单元。创建、注册、激活或重新启用先以分配状态选出唯一赢家,再以ActiveUserCount < 30的数据库条件更新原子取得席位;禁用、过期、删除或 GDPR 擦除以条件切换幂等释放,禁止“先 Count 再 Save”。 -
API 在接收业务流量前从 Identity 权威事实重建分配状态与计量;无 Host 的租户 provisioning 在创建首个管理员前调用同一入口。计量未知时失败关闭。
-
商业权益优先级固定:
签名 License 状态 小型社区权益行为 Valid/Grace签名权益优先,解除 30 人上限但继续维护计量 Unavailable/Expired权威人数为 0..30时回退到内建权益Invalid/Revoked禁止回退,避免掩盖篡改或撤销事件 -
/health/license表示当前可用运行权益。内建权益有效时报告LIC.COMMUNITY_SMALL、当前人数、上限和计量序列;基础/health/ready不受商业权益污染。
策略状态与证据口径登记在 0013-runtime-license-policy-catalog.json,由 Runtime、Identity、迁移与架构测试共同保护。
后果
- Development 默认选择
community.small.v1后,无 License 文件和公钥也能调试 30 人以内业务。 - 第 31 名用户在数据库原子写入点返回
Identity.User.CommunityActiveUserLimitExceeded;并发请求不能穿透。 - 重复或并发释放同一用户席位只允许一次递减;GDPR 擦除遇到聚合版本冲突时整事务失败,不能按陈旧状态修改计量。
- 超额部署仍可搜索、查看、禁用和删除用户以恢复到 30 人;创建、邀请、激活和重新启用继续拒绝。
- 有效商业 License 无缝解除人数上限;
Invalid/Revoked仍失败关闭。 community.small.v1不授予私有 NuGet Feed entitlement,也不改变community.web.v1的签名边界。