自动头像补 4 套风格:avataaars / bottts(许可为「个人与商业可用」,当初误判为不明) #7

Closed
opened 2026-10-25 11:37:00 +00:00 by laoyang · 1 comment
Owner

现象

3.2.36 / 3.2.37 交付的「自动头像」共收录 14 套风格。用户指出:avataaars 同批的 4 套(avataaars、avataaars-neutral、bottts、bottts-neutral)没在里面,而这一批的许可明确是「个人与商业可用」。

排查结论:当初的许可证判断错了

3.2.36 盘点 31 套时,把 npm 包 license 字段里写 See LICENSE file 的 4 套当成了「措辞不明、先不收」。实际情况:

  • 这 4 套的 LICENSE 文件里明确写:License: Free for personal and commercial use(设计者 Pablo Stanley,来源 avataaars.com / bottts.com)。
  • 官网原文:Free for personal and commercial use. 😇
  • 不要求署名 —— 比 CC BY 4.0 那 13 套(强制署名)宽松得多。

所以这是判断错误,不是许可限制。当时还顺手把它们错列进了「CC BY,不收」的禁止清单,方向反了。

作为对照,实测 29 套的许可分布:

许可 套数 是否署名
CC0 1.0 12 否
MIT 1(icons) 否
作者自定义「个人与商业可用」 4 否
CC BY 4.0 12 是(不收)

需要做的事

把上述 4 套编译成纯数组 PHP 模板并收录,风格从 14 套增加到 18 套。

验收标准

  1. 4 套逐字节与 DiceBear 官方 Node 库输出一致(每套 20 个种子)。
  2. avataaars 的 onPostCreate 三条规则必须复刻(背景清空 ×2、头巾删胡子)。
  3. 原有 14 套逐字节回归不得退化。
  4. 后台风格列表出现 18 个卡片,缩略图全部出图。
  5. 许可文案对外不再写「CC0 或 MIT」(已不准确),改为「可自由使用与商用,且不要求署名」。
  6. 守卫里错误的「CC BY 禁止清单」必须改正。

备注

  • 发布仍走 /theme-update/ 通道,不覆盖服务器主题目录。
  • 3.2.36 / 3.2.37 的功能代码不返工,只增补风格。
## 现象 3.2.36 / 3.2.37 交付的「自动头像」共收录 14 套风格。用户指出:**`avataaars` 同批的 4 套(`avataaars`、`avataaars-neutral`、`bottts`、`bottts-neutral`)没在里面**,而这一批的许可明确是「个人与商业可用」。 ## 排查结论:当初的许可证判断错了 3.2.36 盘点 31 套时,把 npm 包 `license` 字段里写 **`See LICENSE file`** 的 4 套当成了「措辞不明、先不收」。实际情况: - 这 4 套的 `LICENSE` 文件里明确写:`License: Free for personal and commercial use`(设计者 Pablo Stanley,来源 `avataaars.com` / `bottts.com`)。 - 官网原文:`Free for personal and commercial use. 😇` - **不要求署名** —— 比 CC BY 4.0 那 13 套(强制署名)宽松得多。 所以这是**判断错误**,不是许可限制。当时还顺手把它们错列进了「CC BY,不收」的禁止清单,方向反了。 作为对照,实测 29 套的许可分布: | 许可 | 套数 | 是否署名 | |---|---|---| | CC0 1.0 | 12 | 否 | | MIT | 1(`icons`) | 否 | | 作者自定义「个人与商业可用」 | 4 | **否** | | CC BY 4.0 | 12 | 是(不收) | ## 需要做的事 把上述 4 套编译成纯数组 PHP 模板并收录,风格从 14 套增加到 18 套。 ## 验收标准 1. 4 套逐字节与 DiceBear 官方 Node 库输出一致(每套 20 个种子)。 2. `avataaars` 的 `onPostCreate` 三条规则必须复刻(背景清空 ×2、头巾删胡子)。 3. 原有 14 套逐字节回归不得退化。 4. 后台风格列表出现 18 个卡片,缩略图全部出图。 5. 许可文案对外不再写「CC0 或 MIT」(已不准确),改为「可自由使用与商用,且不要求署名」。 6. 守卫里错误的「CC BY 禁止清单」必须改正。 ## 备注 - 发布仍走 `/theme-update/` 通道,不覆盖服务器主题目录。 - 3.2.36 / 3.2.37 的功能代码不返工,只增补风格。
Author
Owner

交付:3.2.38 已发布到主题更新通道

先更正本单正文里的一处数据错误

正文的许可分布表写的是「CC0 12 / MIT 1 / 自定义 4 / CC BY 12」= 29 套。实测是 31 套,两处 12 都少算了一个。以实测为准(node_modules/@dicebear/*/package.json 逐个读 + LICENSE 逐个点开):

npm license 字段 套数 设计部分实际许可 要署名
MIT AND CC-BY-4.0 13 CC BY 4.0 是(不收)
MIT 14 13 套是 CC0 1.0;icons 是纯 MIT 否
See LICENSE file 4 Free for personal and commercial use 否

合计 31 套,收录 18 套,未收的 13 套全部落在 CC BY 那 13 套里,一一对应、无遗漏。另交叉核对过:npm 有而模板没收的恰好 13 个,模板有而 npm 没有的 0 个。

avataaars/LICENSE 原文(这次直接贴原文,不再转述):

# Design
Source: Avataaars (https://avataaars.com/)
Designer: Pablo Stanley (https://twitter.com/pablostanley)
License: Free for personal and commercial use (https://avataaars.com/)

改动

  • 新增 4 份模板:avataaars / avataaars_neutral / bottts / bottts_neutral(合计 227 KB),风格总数 14 → 18,模板总体积 1.1 MB → 1.20 MB

  • yang_avatar_styles() 注册四套及中文名,排在「首字母」之后(不改动原有 14 套的相对顺序)

  • avataaars 的 onPostCreate 三条规则逐条复刻:

    1. style 组为 circle 时清空背景
    2. 背景恰好只剩 65c9ff 一项时清空(判「恰好一个」,不是「包含」)
    3. 戴头巾(top = hijab)且胡子概率非 100 时去掉胡子

    为此 yang_avatar_post_create() 增加 $picked 形参(官方读的是 components.style.name / components.top.name,不传判别不出来),返回值由 2 项改 3 项($on 会被改,必须带出来),调用点同步接回 $on = $res[2]。

  • 后台风格说明由「都是 CC0 或 MIT 许可」改为「都可自由使用与商用,且不要求署名」——加了这四套后前者已不成立

  • style.css 版本 3.2.37 → 3.2.38

验证结果(每一项都先证明判据能红,再看是否通过)

项目 结果
4 套逐字节比对官方 Node 库(每套 20 种子,用产品代码 inc/theme-avatar.php) 80 通过 / 0 失败
逐字节反向(删分支 / 不清 65c9ff / 返回值退 2 项) 3/3 全被捕获,各红 20 项
avataaars 三条规则白盒(含「多色背景不误清」「含 65c9ff 但不止一项要保留」「概率=100 时胡子保留」) 9 通过 / 0 失败
规则白盒反向(写坏任一分支) 6/6 全被捕获,且每条都命中预期那一条
原有 14 套逐字节回归 108 通过 / 0 失败
18 套全量冒烟(合法 SVG、3 种种子互异) 18 正常 / 0 异常
严格错误级别,PHP 8.4.25 与 8.5.12(线上同版) 47 / 0 与 47 / 0
后台几何+交互(视口 1600×1000) 29 / 0:18 卡片 / 18 单选 / 18 缩略图全部解码
源码守卫 _guard336_avatar.py 55 / 0,反向 17/17
源码守卫 _guard337_layout.py 20 / 0
包内契约 _pkgcheck337.py(含新增「逐份点名」) 34 / 0,反向 8/8
后台标签 / CDN 3.2.34 / CDN 3.2.35 / 3.2.28 回归 88 / 0、56 / 0、77 / 0、13 / 0
93 个 php 文件 php -l 全通过

有一点值得记下来:逐字节比对抓不到全部三条规则。20 个种子里 style 组只有 ['default'] 一个取值(「circle 才清空」永不触发),top 也一个 hijab 都没抽到。所以「注入后 0 项变红」不等于判据假,而是用例没覆盖到 —— 另写白盒脚本直接构造触发条件才验证到。

顺带修正两处错误的守卫(都是这次暴露的)

  • _guard336_avatar.py 的 FORBIDDEN 清单里把 avataaars / bottts 错列为「CC BY 禁止收录」,还带一个不存在的 adventaas。已按实测重写为 13 套真正的 CC BY,并在代码里留了注释说明为什么当初会搞错。
  • _guard336_falsify.py 的 F2 锚点仍在匹配旧文案「自动头像」(3.2.37 已改名为「启用自动头像」),导致该注入恒失效;版本锚点也停在上一个版本。两处都已跟随。

发布与验收

  • 提交:16cc7d8(带 #7),7 个文件
  • 包:kratos_yang-3.2.38.zip,201 个文件 / 4.38 MB
  • 发布脚本 65 项检查全绿后才落 update.json(顺序:先验包 → 备份 → 替换 → HTTP 冒烟与 md5 比对 → 最后改版本号)
  • 线上独立复核(不采信脚本自述):
    • update.json → 3.2.38 ✓
    • kratos_yang.zip 200,4,590,003 字节,md5 3b32fecdae3602078b285257767aff9a,与本地包一致 ✓
    • readme.html 200,首行即本版标题 ✓
    • 服务器主题目录仍是 3.2.37、inc/avatar-styles/ 只有 14 份,未被覆盖 ✓
    • theme-update/ 无 .new 残留 ✓

需要你操作的

服务器上的主题目录不会被这次发布改动(按约定只发 zip + readme + update.json)。要在 WP 后台点一次「更新主题」才会装上 3.2.38,装完「自动头像」页的风格列表就是 18 个卡片。

请确认没问题后我再关闭本单(以及仍开着的 #5、#6)。

## 交付:3.2.38 已发布到主题更新通道 ### 先更正本单正文里的一处数据错误 正文的许可分布表写的是「CC0 12 / MIT 1 / 自定义 4 / CC BY 12」= 29 套。**实测是 31 套**,两处 12 都少算了一个。以实测为准(`node_modules/@dicebear/*/package.json` 逐个读 + `LICENSE` 逐个点开): | npm `license` 字段 | 套数 | 设计部分实际许可 | 要署名 | |---|---|---|---| | `MIT AND CC-BY-4.0` | **13** | CC BY 4.0 | 是(不收) | | `MIT` | **14** | 13 套是 CC0 1.0;`icons` 是纯 MIT | 否 | | `See LICENSE file` | **4** | Free for personal and commercial use | **否** | 合计 31 套,收录 18 套,未收的 13 套全部落在 CC BY 那 13 套里,一一对应、无遗漏。另交叉核对过:npm 有而模板没收的恰好 13 个,模板有而 npm 没有的 0 个。 `avataaars/LICENSE` 原文(这次直接贴原文,不再转述): ``` # Design Source: Avataaars (https://avataaars.com/) Designer: Pablo Stanley (https://twitter.com/pablostanley) License: Free for personal and commercial use (https://avataaars.com/) ``` ### 改动 - 新增 4 份模板:`avataaars` / `avataaars_neutral` / `bottts` / `bottts_neutral`(合计 227 KB),风格总数 14 → 18,模板总体积 1.1 MB → 1.20 MB - `yang_avatar_styles()` 注册四套及中文名,排在「首字母」之后(不改动原有 14 套的相对顺序) - `avataaars` 的 `onPostCreate` 三条规则逐条复刻: 1. `style` 组为 `circle` 时清空背景 2. 背景**恰好只剩** `65c9ff` 一项时清空(判「恰好一个」,不是「包含」) 3. 戴头巾(`top = hijab`)且胡子概率非 100 时去掉胡子 为此 `yang_avatar_post_create()` 增加 `$picked` 形参(官方读的是 `components.style.name` / `components.top.name`,不传判别不出来),返回值由 2 项改 3 项(`$on` 会被改,必须带出来),调用点同步接回 `$on = $res[2]`。 - 后台风格说明由「都是 CC0 或 MIT 许可」改为「都可自由使用与商用,且不要求署名」——加了这四套后前者已不成立 - `style.css` 版本 3.2.37 → 3.2.38 ### 验证结果(每一项都先证明判据能红,再看是否通过) | 项目 | 结果 | |---|---| | 4 套逐字节比对官方 Node 库(每套 20 种子,用**产品代码** `inc/theme-avatar.php`) | **80 通过 / 0 失败** | | 逐字节反向(删分支 / 不清 65c9ff / 返回值退 2 项) | **3/3 全被捕获**,各红 20 项 | | `avataaars` 三条规则白盒(含「多色背景不误清」「含 65c9ff 但不止一项要保留」「概率=100 时胡子保留」) | **9 通过 / 0 失败** | | 规则白盒反向(写坏任一分支) | **6/6 全被捕获**,且每条都命中预期那一条 | | 原有 14 套逐字节回归 | **108 通过 / 0 失败** | | 18 套全量冒烟(合法 SVG、3 种种子互异) | **18 正常 / 0 异常** | | 严格错误级别,PHP 8.4.25 与 8.5.12(线上同版) | **47 / 0** 与 **47 / 0** | | 后台几何+交互(视口 1600×1000) | **29 / 0**:18 卡片 / 18 单选 / 18 缩略图全部解码 | | 源码守卫 `_guard336_avatar.py` | **55 / 0**,反向 **17/17** | | 源码守卫 `_guard337_layout.py` | **20 / 0** | | 包内契约 `_pkgcheck337.py`(含新增「逐份点名」) | **34 / 0**,反向 **8/8** | | 后台标签 / CDN 3.2.34 / CDN 3.2.35 / 3.2.28 回归 | 88 / 0、56 / 0、77 / 0、13 / 0 | | 93 个 php 文件 `php -l` | 全通过 | 有一点值得记下来:**逐字节比对抓不到全部三条规则**。20 个种子里 `style` 组只有 `['default']` 一个取值(「circle 才清空」永不触发),`top` 也**一个 hijab 都没抽到**。所以「注入后 0 项变红」不等于判据假,而是用例没覆盖到 —— 另写白盒脚本直接构造触发条件才验证到。 ### 顺带修正两处错误的守卫(都是这次暴露的) - `_guard336_avatar.py` 的 `FORBIDDEN` 清单里把 `avataaars` / `bottts` 错列为「CC BY 禁止收录」,还带一个不存在的 `adventaas`。已按实测重写为 13 套真正的 CC BY,并在代码里留了注释说明为什么当初会搞错。 - `_guard336_falsify.py` 的 F2 锚点仍在匹配旧文案「自动头像」(3.2.37 已改名为「启用自动头像」),导致该注入恒失效;版本锚点也停在上一个版本。两处都已跟随。 ### 发布与验收 - 提交:`16cc7d8`(带 `#7`),7 个文件 - 包:`kratos_yang-3.2.38.zip`,**201 个文件 / 4.38 MB** - 发布脚本 65 项检查全绿后才落 `update.json`(顺序:先验包 → 备份 → 替换 → HTTP 冒烟与 md5 比对 → 最后改版本号) - 线上独立复核(不采信脚本自述): - `update.json` → `3.2.38` ✓ - `kratos_yang.zip` 200,4,590,003 字节,md5 `3b32fecdae3602078b285257767aff9a`,与本地包一致 ✓ - `readme.html` 200,首行即本版标题 ✓ - **服务器主题目录仍是 3.2.37、`inc/avatar-styles/` 只有 14 份,未被覆盖** ✓ - `theme-update/` 无 `.new` 残留 ✓ ### 需要你操作的 服务器上的主题目录**不会**被这次发布改动(按约定只发 zip + readme + update.json)。要在 WP 后台点一次「更新主题」才会装上 3.2.38,装完「自动头像」页的风格列表就是 18 个卡片。 请确认没问题后我再关闭本单(以及仍开着的 #5、#6)。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/wordpress-kratos-yang#7