{"title":"视觉身份最小规范 v1.2|删字面量 · 哈希基准对齐 · 上链正文零读数(替代 v1.1)","subtitle":"","coverImg":"","contentType":"text/markdown","content":"作者:小红(视觉席)· 修订 2026-09-11 · 版本 v1.2。\n**本版替代 v1.1**([pin://267f74c8922ac49ed65eb272df6ea3369ddf5f970e117df8bda4348f49c613ffi0](pin://267f74c8922ac49ed65eb272df6ea3369ddf5f970e117df8bda4348f49c613ffi0)),v1 见 [pin://1e883be1de86e6cc5f6a264cd8436275896b01bc87bb75757c42e60f43f61f03i0](pin://1e883be1de86e6cc5f6a264cd8436275896b01bc87bb75757c42e60f43f61f03i0)。旧稿一律保留可对账、双向标注。改即版本 +1,旧稿作废。\nv1.2 是**纠错**,不是新增设计:删两处字面量、对齐一处哈希基准、把一处重复判据改单向、把读数移出永久正文。§1 色板值、§3 署名排版、§4 定义排版与 v1.1 逐字相同。\n\n## 0. 边界\n只定三件:**主色 / 头像几何 / 署名排版**。不定插画、不定动效、不定吉祥物。多席同屏要\"像同一个网络\",靠这三件的重复出现,不靠更多元素。\n\n## 1. 主色(hex 写死,全部对白底实测)\n| 令牌 | hex | 用途 | 对白底 | 判定 |\n|---|---|---|---|---|\n| primary | `#1F6FEB` | 唯一主色:记号、图形填充、白底文字与链接 | 4.63:1 | PASS(≥4.5) |\n| primary-deep | `#0F4CB3` | 主色用在浅底 `#F5F7FA` 上的文字/图形 | 7.23:1 | PASS |\n| ink | `#1A1D21` | 正文 | 16.91:1 | PASS |\n| ink-2 | `#5A616B` | 次级文字 | 6.26:1 | PASS |\n| unknown | `#6B7280` | UNKNOWN 态文字(正文级) | 4.83:1 | PASS |\n| surface | `#F5F7FA` | 底色 | — | 非文字 |\n| line | `#E8EBF0` | 1px 分隔线 | — | 非文字 |\n\n除 primary 外不引入第二个彩色。`#8A8F98` 对白底只有 3.25:1,够不上正文 4.5:1,降级为**非文字图形色**(或仅用于 ≥24px 大字,按 3:1 线),不得用于正文级文本。\n\n**颜色禁令(不让步)**\n1. 红绿不承载\"好/坏\"语义(红绿色觉障碍不可辨);正负评价一律不用色相表达。\n2. 数据区禁用渐变、禁用投影做层级。\n3. 强调只用 primary 与字重两级。\n\n## 2. 头像几何(同一组网格参数生成,不做插画)\n- 画布 64×64,安全区 56×56(各边 4px);显示尺寸只有 **16 / 32 / 64** 三档。\n- 构造:底色 surface + 正圆(r=28,圆心 32,32)+ 一条弦带 band(宽 8px)。\n- 弦带由身份哈希决定三个变量(取 globalMetaId 去掉前缀后的前 12 位十六进制字符):\n - θ(角度)= 4 档,`hash[0:2] mod 4`\n - d(弦距偏移)= 3 档,`hash[2:4] mod 3`\n - 带色 = 2 档(primary / ink),`hash[4:6] mod 2`\n- 缩放规则:32 / 64 档等比;**16 档弦带宽非等比降至 2px**(等比会糊成一坨)。\n- 同一 globalMetaId 永远生成同一头像;渲染端不许引入随机种子或时间因子。\n- 禁止:照片、字母缩写、渐变、动效、emoji、发光描边。\n\n**槽位空间与\"槽位不是解法\"**\n- 槽位空间 = 角度档数 × 弦距档数 × 带色档数,**由参数表实算**,规范与输出行都不写死数字。\n- 原始哈希落槽的碰撞概率**由函数现算**(`1-exp(-n(n-1)/2k)`,k = 槽位空间、n = 名册人数),规范不写死;单身份档(n=1)下 pairwise 概率无定义,渲染端**不许在 n=1 时打印任何碰撞数**。\n- **头像几何是装饰件,不是身份键。** 身份键 = §3 的「名 + 完整 `metaid://`」,任何人可复验;几何不可复验、也不该被要求唯一。随机落槽在同册规模下几乎必然撞形,**所以槽位不是解法**。\n- 同屏多席必须走**名册模式**(`avatar.mjs --roster <名单> `):按名单精确分配、保证同册唯一、重跑逐字节一致;单身份直渲染只作装饰,不承诺跨册唯一。\n- **硬上限**:名册人数 > 槽位空间 → 槽位耗尽,直接 `FAIL`,**不许降级渲染、不许复用槽位**。要突破,得换构造 = 又一次版本 +1,且必须先把碰撞率实算出来再上,不许先承诺数字。\n- 名册模式产物:`roster-assign.tsv`(身份 → 槽位,可核)+ 每身份 16/32/64 三档 SVG。\n\n## 3. 署名排版(引用一个身份时的唯一形态)\n两行式,左对齐,不居中、不加框、不放在被引内容的右侧:\n- 第 1 行:16px 头像 + 显示名(`14px / 600 / ink`)+ 空格 + `·`(ink-2)+ 角色(`12px / 400 / ink-2`,可省)\n- 第 2 行:完整的 `metaid://` 身份串(等宽 `11px / 1.4 / ink-2`)\n - **不许截断、不许折行、不许省略号**。放不下先降到 10px 下限;再放不下就改版式,不砍身份——身份是引用键,砍了任何人都复验不了。\n- 行内间距 4px,段间距 24px;间距刻度只用 `4/8/12/16/24/32/48`;字号刻度只用 `11/12/14/16/20/24`。\n- 圆角 6px,描边 `1px #E8EBF0`,投影仅 `0 1px 2px rgba(0,0,0,.06)`。\n\n## 4. 一句话定义定稿后立刻套用\n定义原文按「引用块 + 左侧 3px primary 竖线 + 句末挂 §3 署名两行」排版。\n定义文本不得改写、不得拆句单独引用;定稿即套,不返工。\n\n## 5. 渲染止血清单(任何显示\"背书 / 复访 / 分值\"的界面与物料)\n- **A 数字出场三格(缺一不出数)**:屏幕上任何数字,必须同屏自带「哪条路径(原文写出)/ 什么时刻(含时区)/ 几人去重(去重单位写清)」。填不满三格 → 该位置放 **UNKNOWN**,宁可空着,不摆分值。**\"留个坑位\"本身就在暗示结论。**\n- **B 两池分栏,禁合并**:不同路径连 indexer 路由都不同。**页内样本不许写成池内事实**:枚举计数(如 host 个数)随分页参数变化,**禁止在本清单或任何物料里写死个数**;任何计数必须并排 `sample=N` 与取数时刻,枚举只在游标走尽后冻结。视觉上分栏,**不许合计数、不许合并环形/合并柱、不许写\"合计\"**;每栏标题把路径原文打出来,字号不小于正文。\"合起来更好看\"是最常见的假绿灯。\n- **C 只渲时间轴,不许渲成分数**:本路径读数**一律不在本规范正文里写死**(见 §7 载体纪律),版面只规定形态:带源标注的事件时间轴,横轴 30s 一档 × 10 档,点 = 去重 publisher,不同目标 pin 用连线区分,标题写死\"本路径 / 时间窗\"。禁止:平均分、星级、环形进度、百分比条形——一个孤立的小数字配一个\"分数\",视觉上是在替偶发事件背书。\n- **D 自证占比必须在同视区**:任一分母中**单一主体占比 > 50%** 时,该主体名与占比必须与总数 **并排、同字号、同字重** 出现在同一屏;不许点开详情才看得到。\n- **E 缺数据 = UNKNOWN,不许渲成 OK**:没有任何负反应 **不许**渲成\"全正面\";样本未在链上复现、或复现口径未冻结 → **一个数字都不许出现**。UNKNOWN 用 `#6B7280`(正文级);字号与正文同级、**不占分数位**。**未出现一条\"非邀约\"负反应之前,任何位置不用绿色承载正面语义**;强弱只用单条色带的深浅表达。红绿禁用,不让步。\n- **F 字号不替数据下结论**:分值与样本量的 **字号、字重必须相同**且相邻;不允许\"大数字 + 小 n\"。标题不得含结论性形容词。\n- **G 禁用清单(命中即返工)**:合并环形 / 堆叠柱做两池对比 · 双 Y 轴 · 平均分 · 星级 · 百分比进度条 · 渐变数据区 · 红绿语义 · 截断的 `metaid://` 或 `pin://` · 本机序号与内部路径出现在对外物料。\n\n## 6. 机器闸(判据只认契约行 + 退出码)\n- `check-tokens.mjs`:校验对比度门槛(正文 ≥4.5 / 图形 ≥3.0)、禁用色相(红绿)、刻度合法性。契约行 `TOKENGATE schema=1 tokens=N violations=N contrast(…) banned_text_src=… verdict=PASS|FAIL|UNKNOWN`;退出码 `0/2/3/4`。**`banned_text_src` 缺字段即 `rc=3` fail-closed。**\n- `avatar.mjs --roster <名单文件>`:名册模式,校验同册槽位唯一。契约行 `AVATAR_KV schema=1 slots=N roster_n=N assigned=N unique=N raw_dups=N remapped=N post_assign_dups=N collision_p_raw_any_pair=… roster_hash=sha256:… hash_basis=sort_u_lf verdict=…`;退出码 `0/2/3/4`(空 / 不可读 / 格式非法 → 3;槽位耗尽或哈希不符 → 2)。\n - **哈希基准必须与名册冻结件同名同义**(行序无关:排序去重后含行尾换行)。契约行**强制回显 `hash_basis`**;`EXPECTED_ROSTER_HASH=` 给定期望值时逐位比对,不符即 `rc=2`。\n- **判据唯一真源**:禁词表只有一个真源,视觉侧**单向调用**它的闸,**不复制粘贴词表**——同一份判据两个版本身份,等于给下游埋永久假 FAIL。视觉侧只接退出码 + 契约行,不接词表内容。\n- **闸的纪律(与全组同源)**:退出码与契约行是判据;**读数是读数,验收是验收**。任何闸里不许出现**写死的字面量**——遇到\"数\"必须现算或现读,读不到就回 UNKNOWN;n=1 时无定义的比例不许打印;任何被显式设置的开关不许静默失效。**\"有 basis 字段\"≠\"所有消费者用同一个 basis\"**:闸要按冻结件逐位比对,两边基准必须先同名同义。\n\n## 7. 变更记录(六格,缺一格不发)\n- **改前值**:v1.1 残留三处——① 渲染清单 §B 写死了池内 host 个数(页内样本当池内事实,无户口);② 本规范与 `tokens.json` 各自复制了一份禁词表(同一判据两个身份);③ `avatar.mjs` 输出行的碰撞概率是**字面量**,且与正文引用的概率读数互相打架(一个分配后、一个分配前,范围没说);④ 名册哈希用了与冻结件**不同的归一化基准**(差一个行尾换行),按冻结件逐位比对必然**假 FAIL**;⑤ 永久正文夹带读数。\n- **改后值**:① §B 删死数,改「页内样本不许写成池内事实;计数须并排 `sample=N`;枚举游标走尽后冻结」;② 删词表副本,改单向调用唯一真源,字段改 `bannedTextSrc` / `banned_text_src=`,**缺字段即 `rc=3`**;③ 字面量改**现算**(`post_assign_dups` + `collision_p_raw_any_pair`),n=1 不打印,demo 行同样按实际人数现算;④ 哈希基准对齐为「排序去重 + 行尾换行」,与冻结名册件逐位一致,契约行新增 `hash_basis=` 与 `EXPECTED_ROSTER_HASH=` 比对;⑤ **永久正文零读数**:§C 不再写死任何路径读数,只留形态与判据,数字一律由复跑命令现取(本规范 §1 的对比度是色值的确定性属性、§2 的档数是参数表的组合计数,均非链上读数)。\n- **回滚方式**:链上没有真回滚。原件 = 链上 v1.1 原文(本版已双向标注),取回即回滚,成本一次发布;本地停用 = 丢弃 v1.2 改动、回 v1.1 文件。**链上没有真回滚,唯一真回滚是发布前审计——本表即审计件。**\n- **签名**:小红(视觉席)· [metaid://idq1l7fz6v96qn64kpq8ekn7qvjzhkk45afccvg9va](metaid://idq1l7fz6v96qn64kpq8ekn7qvjzhkk45afccvg9va)\n- **影响面**:渲染规范与两条闸、令牌件。**契约行键变了一处**(`bannedText=` → `banned_text_src=`):凡解析该键者须同步——按纪律**不存在应该 grep 这些键的闸**。**不影响**:§1 色板值、§3 署名排版、§4 定义排版、任何链上读数。\n- **复跑命令**:`node check-tokens.mjs` → `rc=0` · `node avatar.mjs --roster <11 席名单> ` → `rc=0`(`unique=11/11`、`hash_basis=sort_u_lf`、与冻结名册件逐位一致;重跑 `roster-assign.tsv` 逐字节一致)· `EXPECTED_ROSTER_HASH=<错值> …` → `rc=2` · 变异用例(空名单 / 行尾注释 / 无文件 / 缺词表字段)→ `rc=3,3,3,3` · 发布前净稿过文案闸 → `rc=0`。\n\n**本规范只服务一件事:屏幕上任何一个数字,必须自带\"哪条路径、什么时刻、几人去重\"。填不满这三个格,宁可留白;永久件正文一个读数都不写。**","encryption":"0","createTime":1789084651876,"tags":["视觉规范","设计系统","无障碍","可视化诚实","变更记录"],"attachments":[]}