11-font-and-fallback-spec.md 13 KB

11: 字体授权与缺失资源降级规格

Type: spec Status: ready-for-agent Label: ready-for-agent Blocked by: 06 Category: spec

本规格固化字体授权与缺失资源降级的讨论结论,作为同一张蓝湖正式素材替换地图的子规格单。100% 仅表示规格交付,不表示任何字体已接入、已子集化或缺口清单已建立。

Problem Statement

驾驶舱要使用设计交付的正式字体与素材,但字体是法律风险最高的一类资产:合法性与「能不能下载」无关,「免费」也不等于允许 Web 嵌入与商用。而当前状态是:字体候选目录里没有任何授权文件,却混有明确保留所有权利的字库与公认商用收费字库,因此无法以目录为单位放行。

同时,素材缺口需要一个可判定的处置口径。若任何缺口都阻断发布,交付会长期卡住;若任何缺口都不阻断,则会出现「缺失被画成正常」——这正是本仓反复强调不能发生的事。目前缺少的是:什么算合格的授权证据、哪些缺口必须阻断、缺口写在哪里、以及临时资源如何不被误报为正式设计资产。

Solution

对字体实行严格开源白名单 + 系统回退栈:

  • 内置字体必须有书面/电子授权证据,明确覆盖 Web 嵌入与商用范围并注明名称与版本。
  • 只放行经证据确证的开源字族;名字暗示免费但无证据者一律按无证据处理。
  • 不引入任何商用字体,因此不存在商用字体授权索取工作项。
  • 系统自带字体只能作为回退栈,不得打包进产物。
  • 字体语义槽位仍由既有视觉 token 规格决定,本规格只给出可接入字族集合,不强制替换现有系统字体栈。
  • 中文字体必须子集化或限定字重档数,并必须保留系统字体回退链。

对素材缺口实行三级判定:

  • 三类缺口阻断发布:核心资源组不可用、视觉会误导业务语义、存在法规/授权风险。
  • 其余缺口允许带回退交付,条件是写进缺口清单、临时资源带临时标记、验收不得把临时资源当正式视觉通过。
  • 缺口可见性分三层:运行时诊断、交付缺口清单、生产仅显示用户可理解提示。

尺寸与字体统一遵循「优先现状」原则:优先沿用现有实现与渲染尺寸,仅在确实不可辨时做最小调整并记录偏差。

User Stories

  1. 作为项目负责人,我想让内置字体都有可查的授权证据,以便交付物不带来法律风险。
  2. 作为项目负责人,我想知道哪些字体被允许接入,以便不依赖个别成员的口头判断。
  3. 作为项目负责人,我想确认不引入商用字体,以便不必为字体另行采购或索取授权。
  4. 作为开发人员,我想让无授权证据的字体直接走系统回退,以便实现路径唯一、不需逐案请示。
  5. 作为开发人员,我想让系统自带字体只作回退、不被打包,以便不误触再分发限制。
  6. 作为开发人员,我想让字体语义槽位保持既有定义,以便资产替换不牵动视觉结构。
  7. 作为开发人员,我想让中文字体子集化或限定字重,以便首屏不被十几兆字体拖慢。
  8. 作为值班人员,我想在字体未接入时仍看到正常可读的中文界面,以便字体缺口不影响值守。
  9. 作为值班人员,我想动态数据里的生僻汉字仍能显示,以便设备名与点位名不出现豆腐块。
  10. 作为值班人员,我想让大屏数字换字体后不跳格,以便 KPI 卡片布局稳定。
  11. 作为值班人员,我想在生产界面只看到可理解的状态提示,以便不被内部路径和错误码干扰。
  12. 作为开发人员,我想在开发环境看到完整的字体与素材缺口诊断,以便快速定位问题。
  13. 作为验收人员,我想让缺口清单列出语义键、缺口类型、回退结果与责任人,以便逐项追踪关闭。
  14. 作为验收人员,我想让临时资源带明确临时标记,以便不会被当作正式设计资产通过验收。
  15. 作为验收人员,我想让「未替换临时项」在清单里可见,以便知道还有多少设计资产没落地。
  16. 作为项目负责人,我想明确只有三类缺口会阻断发布,以便交付不被单个非核心资源卡死。
  17. 作为值班人员,我想在状态色或状态形状缺失时无法通过验收,以便报警与正常不会被混淆。
  18. 作为项目负责人,我想让品牌标识与状态语义类资源被列为核心,以便关键视觉不被降级掩盖。
  19. 作为项目负责人,我想让无法授权或来源不明的素材直接阻断,以便不把法律风险带进交付。
  20. 作为开发人员,我想让非核心资源失败时按既有 fallback 链回退,以便单个素材问题不阻塞整批替换。
  21. 作为值班人员,我想在非核心装饰资源缺失时仍能正常使用驾驶舱,以便可视化降级但不影响业务查看。
  22. 作为开发人员,我想复用既有资产解析层的降级机制,以便不产生第二套回退逻辑。
  23. 作为开发人员,我想复用既有的分环境诊断口径,以便不新增一套诊断体系。
  24. 作为验收人员,我想让素材在现有尺寸下不可辨时才做最小调整,以便不无谓偏离设计稿。
  25. 作为验收人员,我想记录每处与设计稿的偏差,以便偏差可被审查而不是静默发生。
  26. 作为开发人员,我想让检查只验证「是否携带许可证据」,以便不假装代码能判定授权合法性。
  27. 作为开发人员,我想让未通过授权门禁的字体在解析阶段就不可用,以便不可能被误引入运行时。
  28. 作为维护者,我想让本规格与既有降级规格边界清楚,以便不出现两套说法。
  29. 作为维护者,我想让缺口清单成为唯一缺口事实来源,以便不靠口头同步。
  30. 作为验收人员,我想让缺口清单与运行时诊断结果一致,以便清单不是人工维护的猜测。
  31. 作为开发人员,我想让子集字体始终保留系统回退,以便动态文本不因缺字而显示异常。
  32. 作为值班人员,我想在不同操作系统上看到可接受的中文显示,以便部署环境差异不影响可读性。
  33. 作为项目负责人,我想让素材替换的尺寸处理遵循统一原则,以便字体与图形不各按各的标准。
  34. 作为验收人员,我想以外部可观察行为验证字体回退与缺口可见性,以便不依赖内部实现细节。
  35. 作为维护者,我想让「未接入设计字体」是一种可见且被接受的交付状态,以便交付不被非核心字体阻塞。

Implementation Decisions

  • 不新增降级机制:复用既有统一资产解析层的 fallback 链、核心资源回滚与分环境诊断;本规格只新增授权门禁与缺口分级两类判定。
  • 授权门禁:字体条目必须携带许可证据标识才能进入可解析集合;无证据的字体在解析阶段即不可用,走系统回退。证据要求为书面/电子文件,明确覆盖 Web 嵌入与商用范围,并注明字体名称与版本。
  • 白名单为证据确证制:只放行经证据确证的开源字族;名称暗示免费但缺少许可文本者不进入白名单,除非其上游许可证文本被归档进交付包,从而由「名字暗示」升级为「确证」。
  • 不引入商用字体:交付范围内不包含商用字体,因此不设商用授权索取流程。
  • 系统字体不得打包:系统自带字体只能出现在回退栈中,不进入产物。
  • 语义槽位不动:字体的语义槽位归属既有视觉 token 规格;本规格给出可接入字族集合与接入约束,不改变槽位语义,也不强制替换现有系统栈。
  • 中文交付约束:中文字体必须子集化或限定字重档数,并在缺口清单记录被裁字符集风险;子集字体必须保留系统字体回退链,因为动态数据可能包含子集外汉字。
  • 数字字体回退要求:不可授权时,回退备选需与设计字体度量兼容,避免大屏数字列宽跳动。
  • 缺口分级:阻断发布仅限三类——核心资源组不可用、视觉会误导业务语义、法规或授权风险。其余缺口允许带回退交付,条件为记录进缺口清单、临时资源带临时标记、验收不得将临时资源作为正式视觉通过。
  • 核心资源组定义(补全,非另立):至少包含品牌标识、点位与设备的状态形状语义、状态色语义;其余装饰性资源不属核心。此定义是对既有资产清单与版本策略规格中 核心标记 字段的成员补全——该规格此前使用了核心资源组这一概念但未定义成员,因而不构成第二套定义。
  • 缺口可见性:运行时诊断面向开发与测试,暴露语义键与失败类别;交付缺口清单记录语义键、缺口类型、回退结果与责任人;生产环境只显示用户可理解提示,不暴露内部路径。
  • 清单为唯一事实来源:缺口清单与运行时诊断结果保持一致,不靠人工另行维护。
  • 统一尺寸原则:字体与图形一律优先沿用现有实现与渲染尺寸,仅在确实不可辨时做最小调整,并记录与设计稿的偏差。
  • 检查的能力边界:自动化只能验证是否携带许可证据、名称与版本是否登记,不声称能判定授权合法性;授权合法性属法律事实,由证据文件与责任人负责。

Testing Decisions

  • 好测试只断言外部可观察行为:给定字体条目与证据状态,验证其是否可被解析为运行时字体、是否走系统回退、缺口清单是否产生对应条目;不测试内部函数结构。
  • 纯逻辑测试覆盖:有证据与无证据的分支结果唯一;无证据字体不可进入可解析集合;白名单命中与未命中行为;阻断三类判据的判定;缺口清单条目的字段完整;子集字体必须携带回退链;数字字体回退备选的度量兼容标记。
  • 资产解析测试覆盖:未通过授权门禁的字体在解析阶段不可用;非核心资源失败按既有 fallback 链回退且不阻断;核心资源组失败触发既有回滚路径。
  • 宿主诊断测试覆盖:开发与测试环境暴露语义键与失败类别;生产环境只暴露用户可理解提示且不含内部路径。
  • 真实页面走查覆盖:字体未接入时中文界面正常可读;动态数据中的子集外汉字不出现豆腐块;大屏数字在回退字体下不跳格;缺口清单内容与运行时诊断一致。
  • 证据齐全性测试:验证许可证据标识、名称与版本是否登记齐全;不得把它写成「授权合法性校验」,避免产出虚假保证。
  • 复用既有先例:统一资产解析层的解析与回退断言、设备资产的原因码与降级链断言、分环境诊断的宿主观测读数、以及真实页面走查的可读性检查。规格阶段只写验收契约,不运行构建、开发服务器或浏览器调试。

Out of Scope

  • 接入、子集化或部署任何具体字体;本规格只定义许可证据、白名单、交付约束与缺口分级。
  • 字体语义槽位的重新定义、字号与间距体系;由既有视觉 token 规格负责。
  • 降级链、fallback 顺序、核心资源回滚与诊断字段的重新定义;由既有资产清单与版本策略规格负责。
  • 位置符号与设备资产的具体降级层级;由对应规格负责。
  • 商用字体的采购、授权谈判与凭证索取。
  • 蓝湖画板逐项盘点、设计稿差异裁决、分批替换与终稿验收;由对应规格负责。
  • 判断某款字体在法律上是否可商用;本规格只要求证据齐全且可追溯。

Further Notes

  • 本规格的唯一决策来源是讨论票 06 的 ## Answer。
  • 讨论期间对维护者指定的字体目录做过取证:该目录内不存在任何授权/许可文件,且包含明确保留所有权利的字库与多款公认商用收费字库;因此不得以目录为单位放行。该取证结论支撑了「证据确证制白名单」的裁定。
  • 讨论期间实测:中文开源字体单字重体积约十余兆,西文开源字体不足一兆,这是「中文字体必须子集化或限定字重」的实测依据。
  • 「未接入设计字体」是一种被接受的可见交付状态,不是缺陷;它必须出现在缺口清单中。
  • 当前项目规则要求修改代码后不得自动运行构建或调试命令;实现阶段需由用户明确要求后再执行验证。