Settings · Agent and user identity

头像随机候选设计

Agent 与用户头像共用一个 AvatarPicker。随机候选必须覆盖完整 DiceBear 样式注册表,并在选择候选时同时保存样式和 seed。

问题与边界

当前缺陷

Regenerate 只替换 seed,所有候选继续使用当前 style,因此随机结果长期保持同一种视觉类型。

目标

每批 16 个候选至少包含一次全部 14 个已发布样式;额外两个候选也从同一注册表选择。

不变范围

上传头像、字母头像、持久化字段、Agent/User profile store 和 DiceBear 依赖均不改变。

统一数据流

1 · SOURCEAVATAR_STYLES

选择器样式清单,与运行时映射双向校验

2 · GENERATEstyle + seed

完整覆盖后随机排序

3 · PREVIEW16 candidates

每格按自己的 style 渲染

4 · SAVEAvatarConfig

同时保存 style 与 seed

决策

方案结论原因
只随机 seed拒绝无法进入其他样式,是当前缺陷。
每格独立随机 style修改小样本可能遗漏多数样式,不满足完整样式可见性。
先放入全部样式,再补足并随机排序采用每批保证覆盖全部注册样式,同时保留随机顺序与随机 seed。
为 Agent 和用户分别实现拒绝两个设置入口已共用 ProfileEditorAvatarPicker

验收合同

  1. Agent 和用户设置使用同一生成逻辑。
  2. 16 个随机候选包含 AVATAR_STYLES 中全部 14 种样式。
  3. 点击候选后,预览和持久化配置同时采用候选的 styleseed
  4. 再次 Regenerate 只替换候选,不在用户点击前修改已保存头像。
  5. Letter 与 Custom 路径维持现有行为。

实现与证据

已实现。 style-options.ts 提供轻量样式元数据,variants.ts 生成完整覆盖的随机候选,AvatarPicker.tsx 渲染并保存候选的 style/seed。web/tests/avatar-randomization.test.mjs 动态验证 14 种样式覆盖,双向比较选择器与运行时样式集合,并检查 Agent/User 共享入口和保存合同。Web unit tests、TypeScript、完整 Web checks 与 production build 均已执行。