06-font-and-fallback-policy.md 13 KB

字体授权与缺失资源降级

Type: grilling Status: resolved Labels: wayfinder:grilling Blocked by: 01, 02

Question

正式字体、图标、状态资源或装饰资源缺失、不可授权、加载失败、尺寸不合格或与部署环境不兼容时,系统如何处理?裁定 Web 字体的授权证据、可接受的回退字体、逐项资源的降级层级、用户可见提示、日志/诊断信息,以及何种缺口阻止发布、何种缺口允许带回退交付。

降级必须可见且不把临时资源误报为正式设计资产;不能因为单个资源失败而静默破坏整个驾驶舱。

进度

  • 已认领(Status: claimed);阻塞票 01/02 均 closed。票 03(token 槽位)、票 04/09(manifest 降级链)、票 05(位置符号)均已完成。
  • deck 工具已按插件要求上报本票(带 effortId=lanhu-cockpit-asset-replacement)。
  • 事实侧已自查(不向维护者提问可自得的事实):
    • tokens.css 现有 --font(Microsoft YaHei UI/Microsoft YaHei/PingFang SC/Noto Sans SC)与 --num(Bahnschrift SemiBold/Bahnschrift/DIN Alternate/Segoe UI Semibold)都是系统字体栈,非 Web 字体。
    • 票 04/09 已锁 manifest 降级链(显式 fallback → 有限链 → 内置通用资源)、核心资源整包回滚、分环境诊断;票 05 已锁位置符号降级。本票不重开这些机制。
  • 维护者指定字体目录 E:\_Design\字体,实测结论见下节。

字体目录实测事实(本票自查,非推断)

对 E:\_Design\字体 做了完整取证(递归列举 + 字体内嵌元数据提取):

  • 目录结构:68 个 zip(合计 707.7 MB)+ 中文/(65 个文件,515.8 MB)+ 英文/(15 个文件,1.3 MB)。
  • 授权文件:零命中。递归搜索 license|licence|readme|授权|许可|声明|OFL|copyright|商用 无任何命中;字体.zip 的 82 个条目同样零命中。
  • 确证开源(内嵌版权/许可文本可查):
    • SourceHanSansSC-* 与 SourceHanSansCN-VF:2014-2021 Adobe, with Reserved Font Name 'Source' → 思源黑体(OFL)。
    • SourceHanSerifCN-*:Copyright 2017 Adobe Systems Incorporated … Reserved Font Name 'Source' → 思源宋体(OFL)。
    • CrimsonText-*:Copyright (c) 2010, Sebastian Kosch … with Reserved Font Name → SIL OFL 开源西文。
  • 明确保留所有权利(与「整目录免费可商用」矛盾):Modernia-Regular(Copyright © 2019 … All rights reserved)、Furore(Copyright (c) 2009 … All rights reserved)。
  • 无许可文本(名字暗示免费但未确证):SmileySans(得意黑)、PangMenZhengDao…MianFeiBan、【MianFei】CangJi…、ZQKfreefont、Versa、SendaDisplay-BECO 等。
  • 公认商用收费字库(高风险):douyuFont(斗鱼)、PingFangLaiJiangHuFeiYangTi、JiYingHuiPianHuiSong、TaiWanQuanZiKuZhengKaiTi、UnBatang、GenShinGothic、AozoraMincho、SoukouMincho、DelagothicOne、HuXiaoBoNanShenTi、HongLeiXingShuJianTi、Mengshen-Handwritten 等。
  • 体积参考(二进制字节实测):思源黑体单字重约 15–16 MB(SourceHanSansSC-Regular 15.7 MB、SourceHanSansSC-Bold 16.2 MB);思源宋体 SourceHanSerifCN-Regular 10.7 MB;西文 CrimsonText-Regular 仅 0.1 MB。中文全量内置的体积代价远高于西文。

结论:该目录是字体文件集合,不是已核验的合规库;「整目录免费可商用」的说法与实测不符(Modernia/Furore 明确保留所有权利)。

第一轮裁定(已确认)

  • Q1=B:无书面授权证据不得内置字体文件;运行时回退到已批准的系统字体栈,并在缺口清单记为「设计字体未接入」,缺口可见但不阻断整批交付。
  • Q2=B:授权证据需书面/电子文件(许可协议、采购凭证或权利人声明),明确覆盖 Web 嵌入与商用范围,注明字体名称与版本。补充裁定:系统自带字体不属于可再分发字体,只能作回退栈,不得打包进产物。
  • Q3=B:数字字体与正文同规;若不可授权,回退必须选度量兼容(字宽/字高接近)的备选,避免大屏 KPI 数字换字后跳格。
  • Q4=B:仅三类缺口阻断发布——① 核心资源组(品牌标识、点位/设备状态形状语义、状态色)不可用;② 视觉会误导业务语义(如状态色缺失致报警与正常无法区分);③ 法规/授权风险(无授权字体、无授权品牌素材)。其余缺口允许带回退交付并列入缺口清单。
  • Q5=B:三层可见——① 运行时诊断(开发/测试可见语义 key 与失败类别);② 交付缺口清单(语义 key、缺口类型、回退结果、责任人);③ 生产界面只显示用户可理解提示,不暴露内部路径。
  • Q6=B:临时资源必须带临时标记;验收不得以临时资源作为正式视觉通过;缺口清单必须列出仍未替换的临时项。

第二轮裁定(已确认)

  • Q7(维护者原话:尽量以现有情况为基准)+ Q11=A + Q15=A:统一原则——优先沿用现有渲染尺寸与既有实现,只有素材在现有尺寸下确实不可辨时才做最小调整并记录偏差;该原则同时适用于字体,Web 字体属「可选优化」而非「必需修复」。这消除了票 05 遗留的「内层图标 10.8px 是否需调整」的处置口径。
  • Q8=A:本票只新增字体授权裁定与缺口分级,不重复定义降级链、回滚或诊断字段(避免与票 04/09/05 形成两套说法)。
  • Q9=A:字体目录采用白名单制;未入白名单者按 Q1 走回退,待逐项核验后再进白名单。
  • Q10=C:不引入任何商用字体,只用开源白名单与系统字体栈。因此不存在「向设计公司索取商用字体授权凭证」的工作项。
  • Q12=A:严格白名单——只放行本目录内确证带开源许可文本的字族:思源黑体 SourceHanSans*、思源宋体 SourceHanSerif*、CrimsonText*。其余(含名字暗示免费的得意黑 SmileySans、ZQKfreefont、PangMenZhengDao…MianFeiBan、【MianFei】CangJi…)一律按无证据处理;若要纳入,须先把上游 OFL 许可证文本归档进交付包,方可从「名字暗示」升级为「确证」。
  • Q13=A:--font / --num 的语义槽位不动(票 03 已锁),本票只给出可接入字族白名单;是否启用由实现按观感决定。明确不强制用思源黑体替换现有系统栈(体积风险)。
  • Q14=B:大体积中文字体必须子集化(仅收驾驶舱实际用字)或限定字重数量(如 Regular + Bold 两档),并在缺口清单记录被裁字符集风险。子集字体必须保留系统字体回退链——因为动态数据(设备名、点位名、事件文本)可能含子集外汉字,单独使用会出现豆腐块。

Answer

本票不重开既有降级机制,只锁定「字体授权」与「缺口分级」两件事;字体采用严格开源白名单 + 系统回退栈,任何未确证授权的字体一律不内置。

字体授权

  1. 授权门槛:字体内置需书面/电子授权证据,明确覆盖 Web 嵌入与商用范围并注明名称与版本;系统自带字体只能作回退栈、不得打包。
  2. 严格白名单(本目录内确证):思源黑体 SourceHanSans*、思源宋体 SourceHanSerif*、CrimsonText*。未入白名单者按无证据处理,走系统回退。
  3. 不引入商用字体;因此不存在商用字体授权索取工作项。
  4. 槽位归属不变:--font / --num 的语义槽位仍归票 03,本票只给可接入字族集合,不强制替换现有系统栈。
  5. 交付约束:中文字体必须子集化或限定字重档数,且必须保留系统回退链(动态数据可能含子集外汉字)。
  6. 数字字体:若不可授权,回退须度量兼容,避免大屏 KPI 数字跳格。

缺口分级(阻断 / 允许带回退)

  • 阻断发布(三类):核心资源组不可用;视觉会误导业务语义;法规/授权风险。
  • 允许带回退交付:其余缺口,条件是①记录进缺口清单(语义 key、缺口类型、回退结果、责任人);②验收不得把临时资源当正式视觉通过;③临时资源必须带临时标记。
  • 可见性三层:运行时诊断(开发/测试)→ 交付缺口清单 → 生产仅显示用户可理解提示,不暴露内部路径。

与既有裁定的关系

  • 不重开:降级链与 fallback 顺序归票 04/09;位置符号降级归票 05;token 槽位语义归票 03。
  • 统一原则:尺寸与字体一律「优先现状,仅在不可辨时最小调整并记录偏差」(Q7/Q11/Q15)。

风险与边界

  • 目录非合规库:E:\_Design\字体 零授权文件且含明确保留所有权利的字库(Modernia/Furore)与多款公认商用收费字库;因此不得以目录为单位放行。
  • 子集化风险:子集外汉字会落到回退字体,可能出现同屏字形混排;实现需在走查中确认动态文本仍可读。
  • 本票不声称已接入任何 Web 字体、已子集化或已替换现有系统栈;这些属实现工作。
  • 按 AGENTS.md,本轮未运行 build/dev/浏览器调试。

真实状态与下一步

  • 状态:已完成并关闭(Status: resolved)。Q1–Q15 全部有裁定,无遗留未决项。
  • 交付物:
    1. 本票 Answer(上述结论);
    2. 规格子票字体授权与缺失资源降级规格(ready-for-agent,已挂入同一张地图);
    3. 交叉引用修正:既有运行时资产 manifest 与版本策略规格使用了「核心资源组」与 核心标记 字段但未定义成员,已加指针指向本票规格补全的定义(只加指针,不改其原口径)。
  • 对抗式审查记录(2026-10-08):规格发布后对本次产出做了对抗式复核。
    1. 抓到并修正 1 处事实错误:曾把思源黑体体积写作 16.4 MB / 17.0 MB,二进制字节复核实为 15.7 MB / 16.2 MB(原数字取自目录列表中混入的其他条目)。已更正并复检无残留。
    2. 抓到并补全 1 处真实缺口:既有资产清单规格使用「核心资源组」概念却未定义成员,本票规格补全了成员定义并建立双向交叉引用,避免读过其中一个规格的人找不到定义。
    3. 核实通过:零授权文件断言(递归命中 0);Modernia / Furore 的 All rights reserved 原样命中;白名单文件均真实存在;能力边界表述未越界(3 处均明确「不声称判定授权合法性」);与票 03 槽位归属不冲突;未重复定义票 09 的降级链与回滚。
  • 下一步:推进设计稿差异与现有业务结构保护(其阻塞票 02–06 均已关闭);实现工作由规格子票承接。

缺口清单

执行批次归视觉的偏差与未替换临时项登记于此(唯一来源;语义 key、缺口类型、回退结果、责任人四列齐全)。

语义 key 缺口类型 回退结果 责任人
icon.brand 设计稿未覆盖:蓝湖稿品牌位是渐变文字(337×27/29),无 logo 图形 维持现状:内联几何迁移的临时 SVG(manifest status: temporary)+ 标记「无设计稿依据」 维护者/设计方(是否新增 logo 需设计确认)
icon.layers 设计稿未覆盖:图层 chip 在稿中为纯文字(49×18),无图标 同上 维护者/设计方
icon.points 设计稿未覆盖:同上(chip 纯文字) 同上 维护者/设计方
icon.event 设计稿未覆盖:同上(chip 纯文字) 同上 维护者/设计方
icon.resource 设计稿未覆盖:同上(chip 纯文字) 同上 维护者/设计方
icon.blank 设计稿未覆盖:空面板占位图示在稿中无对应物 同上 维护者/设计方

(2026-10 批次 1 执行时登记,见执行-批次1:品牌/图标替换。)

2026-10 更新(依据票 19 盘点报告):上表六条原记为「正式素材未交付(蓝湖盘点未完成)」。盘点完成后事实修正为「设计稿未覆盖」——蓝湖 9 个画板中,品牌位无 logo 图形、四个功能图标在稿中为纯文字 chip,故不存在"待交付的正式切图"。按规格 12 判断表,这类差异属「设计稿未覆盖的现有 UI」→ 维持现状并标记无设计稿依据,不属素材替换;若维护者要求新增 logo/图标,属新增设计需求,须由设计方确认后另立决策票,不在批次 1 内实现。