本文回答:前端与 AI 工程师在 Schema-As-Code 体系中,消费的规则里装着什么——语义令牌、语义域、约束显化这三层设计,落到工程日常分别是什么形态?
在系列中的位置:角色工作流第 2 篇(承上:主题行 ①②③)
阅读前建议:先读《角色专题|设计系统负责人的语义生长》,理解你消费的规则在到达你之前经历了怎样的评审
角色生长来源:现有前端工程师、AI 工程师、全栈工程师——任何把设计意图变成可运行界面的人
开篇:这个角色从哪来
前端与AI工程师不是 Schema-As-Code 把设计规范写成代码格式 框架中新发明的岗位。在大多数组织中,这个角色早已存在,变化的不是岗位,是交付物的上游形态。
工程侧的每一次协作革命,都在改写工程师"按什么施工":
- 设计稿时代,按图施工,意图靠猜,设计稿只给像素,"这个红是多严重的红"靠工程师读空气
- 接口文档时代,按字段施工,语义靠枚举,但
isError: true这样的布尔值把"多严重"整个维度压没了 - AI生成时代,按提示词生成,约束靠运气,Prompt里写了"不要用红色",模型更新一次,约束失效一次
本文要展开的是第三条路:按契约施工。规则不再以"需要你去读的文档"形态存在,而是以"已经挂在你工具链上的机器产物"形态存在。
先给一个预期管理:这个角色篇读起来会比系列里其他篇"薄"。这不是内容单薄,是设计目标,约束的成本被刻意压在上游(快照的采集、契约的编写、评审的确认),消费侧的无感知,是上游工作做对的证据。一条需要你读三遍文档才能遵守的规则,是上游的失败;一条你挂着Schema就自然遵守的规则,才是这套体系的存在理由。
本文只回答一个问题:语义令牌、语义域、约束显化论证过的三层设计,在你的工作面上分别长什么样。你不生产它们,但你每天都在消费它们。
一、语义令牌(主题行①):你代码里的枚举值
1.1 角色消费场景:从布尔值到枚举值
过去你拿到的接口字段是 isError: true,一个布尔值,"多严重"这个维度根本不在数据里。你想分级都没数据,只能自己加字段硬编码,或者按 type="error" 一个参数打天下。
现在接口字段是 error_severity: "retryable",语义维度随数据一起到达。你消费的JSON Schema里,这个字段的类型定义不是 boolean,而是枚举:
{
"properties": {
"error_severity": {
"type": "string",
"enum": ["fatal", "transient", "retryable", "degraded"],
"description": "错误状态语义分级,映射语义令牌 error_severity.*"
}
},
"required": ["error_severity"]
}
你的工作没有改变,你的依据改变了。 以前是"设计稿画了红色所以用红色",现在是"字段说 retryable 所以按 retryable 的映射渲染"。枚举值写错,比如手滑写成 fatal,编译期就被Schema拦下,不需要等走查。拦下的那一刻,报错长这样:
[SCHEMA] semantic-check / contract ERR-001 v1.2.0
字段:error_severity = "urgent"
错误:取值不在注册枚举内(fatal / transient / retryable / degraded)
修复指引:"urgent" 不是语义字典已注册项,禁止自创。
按场景归级:限流场景 → retryable;系统故障 → fatal
归级依据查《语义快照的模板》impact 字段的自问题
注意这份报错的三要素:违反的是哪条契约的哪个版本、错在哪个字段哪个值、按什么指引修。一份只说"参数错误"的报错会迫使你猜规则的含义,猜测就会出错。报错的及格线和拦截报告是同一条:可追溯。
📎 关键设计详情:《Token层差异》:Design Token管"长什么样",语义令牌管"意味着什么"。你代码里的枚举值,就是语义令牌的工程形态。
翻译能力:你没有翻译动作,只有一条纪律
对语义令牌,前端与AI工程师不做翻译,翻译发生在上游(设计师标注、契约编写、评审确认),到你这层已经是确定性的枚举。你的角色只有一条纪律:不绕过枚举。
不允许的两种写法:
- 嫌 Schema 麻烦,把字段类型改回
string,校验失效 - 在组件里写死色值
#EF4444,不引用color_token,映射链路断裂
这两种写法都能跑通。跑通的代价是语义链路在你的代码里断裂:上游规则再完善,到你这层被旁路,消费追踪上的"拦截记录"就变成了"拦截不到"。
绕过枚举省的是两分钟,断的是整条证据链。
关键决策点:机器没见过时
当业务出现新场景,字典里没有对应的令牌,比如组织第一次出现"资金冻结"这类状态,现有四级枚举都不贴切,你的动作不是现场造一个 severity: "frozen",而是提交消费侧反馈:"场景 X 无对应令牌,当前用基础枚举兜底。"
反馈回到评审队列,由上游判断复用、降级还是发起新令牌评审。机器没见过时,人的动作是上报,不是就地立法。 就地发明的枚举值,是这个体系里最危险的一类"善意的绕过"。
真的发生过吗:布尔值压掉语义维度
某AI对话产品的限流误报事件:接口只下发 isError: true,前端按 type="error" 渲染红色,用户看到全红错误条以为系统崩溃,刷新后丢失未发送的长文。
问题诊断:
- 语义层:限流是 retryable(等待即可),界面表达成了 fatal(必须抢救)
- 根因:语义在接口定义时就被压缩成布尔值,前端拿到的数据里根本没有"级别"
- 修复:接口字段按契约升级为
error_severity枚举,前端按令牌映射渲染,retryable 渲染为黄色时钟加倒计时
这个案例说明:前端不是表达力不够,是接口就没给你语义数据。契约把布尔值升级为枚举之后,按映射渲染是直线,不用再猜。
案例口径:本案例为推演案例,非组织实测记录。来源是公开产品语义断层诊断中反复出现的失真模式,推演到工程工作流的消费形态。
一直在工作吗:枚举校验的持续生效
| 检查项 | 机制 | 你的动作 |
|---|---|---|
| 枚举值是否与字典同步 | 契约变更 → 编译管线重编译 → Schema自动换版 | 无 |
| 你写的值是否合法 | 编译期类型校验 | 被拦时按报错修正 |
| 字典里令牌的含义 | 语义字典查询入口 | 拿不准就查,查不到就提交反馈 |
二、语义域(主题行②):同一个组件在不同场景的合法Props
角色消费场景:域约束写进类型系统
同一个 <Alert> 组件,在系统故障里是阻断器,在新功能通知里是信息条。过去这个差异只存在于设计稿的标注里,你看不见;现在它存在于类型系统里,编译器看得见:
// transactional 域的 Alert:必须携带级别与恢复路径
interface TransactionalAlertProps {
overlay: "transactional";
error_severity: "fatal" | "retryable";
user_action: {
label: string; action: string }[]; // 必填
}
// observational 域的 Alert:中性信息,禁止携带高危样式
interface ObservationalAlertProps {
overlay: "observational";
error_severity?: "degraded";
user_action?: undefined; // 禁止阻断式行动按钮
}
跨层禁止由机器执行:在 observational 域的组件上引用 status.critical,编译期直接报错,不需要你记住"哪个域不能用什么令牌",类型系统替你记住。报错的形态:
[TYPE] semantic-domain-check / contract ERR-001 v1.2.0
位置:src/components/NoticeBar.tsx:17
绑定:overlay = "observational",引用 color_token = "status.critical"
错误:跨层禁止——status.critical 仅允许 transactional 域
修复指引:observational 域的合法令牌见 contracts/ERR-001.yaml
semantic_tokens.observational.valid_tokens
这条报错的价值不在"拦住了这一次",而在争议可裁决:验收时如果有人说"这里用红色更有警示效果",争议不再是感觉对感觉,而是"违反了哪条绑定",可引用、可定位、可裁决。
翻译能力:把"这个场景"翻译成"这个Props类型"
你依然不做翻译。域声明由设计师标注、契约定义,到你这层已经是两组不同的Props类型。你的动作是按场景选类型,而不是按视觉选组件。 选错类型,编译器会告诉你;类型不存在,按"机器没见过时"的纪律上报。
关键决策点:机器发信号时
跨层禁止的拦截报错出现在你本地时,比如在 observational 域组件上引用了高危令牌,两种可能:
- 你绑错了:修正域声明或令牌引用,结束
- 规则错了:这个绑定在该场景下业务上合理,但规则没覆盖,提交消费侧反馈,标注"疑似误报",附场景说明
判断不了是哪种,默认按第一种处理;处理不了,按第二种上报。拦截报告的条款编号会告诉你该去哪查。
真的发生过吗:域绑定错误的代价
某团队开发后台管理系统时,将"批量删除用户"按钮声明为 overlay="navigational",绑定 action.primary。理由是"它是页面里的一个操作"。
问题诊断:
- 语义层:批量删除是数据销毁操作,属于 transactional 域,应绑定
action.destructive - 后果:AI生成代码时按钮样式为蓝色实心,缺少二次确认,用户误触后批量删除数据
- 修复:纠正域声明为
transactional+action.destructive,类型系统从此拦住同类错误
这个案例说明:类型系统只能拦住"已声明的错"。域声明本身是上游评审的对象,你的责任是选对类型,域定义对不对,有专门的评审节点在管。
案例口径:推演案例,同上。
三、约束显化(主题行③):提交时的那一次拦截
角色消费场景:CI拦截报告长什么样
约束显化在你工作面上的形态,是CI流水线里的一次阻断。一次合规的拦截报告,必须包含三样东西:
[BLOCK] semantic-check / contract ERR-001 v1.2.0
违反条款:immutable_boundaries[1] —— 禁止将 fatal 级状态以中性文案表达
命中位置:src/components/ErrorBanner.tsx:42
修复指引:fatal 级状态的文案必须包含"不可恢复 / 立即处理"语义;
参照契约 user_action.fatal 定义
三条消费约定中的"可追溯阻断",就是这份报告的及格线:阻断必须能追溯到具体契约条款编号,修复指引必须指向契约定义。一份只说"语义校验失败"的报告,会迫使你猜规则的含义,猜测就会出错。报告不合格,是编译管线的问题,不是你的问题,可以反馈。
📎 关键设计详情:《编译前置校验 显式规则的5项机器安检》
翻译能力:拦截报告就是你的翻译件
你不需要读契约原文,拦截报告就是契约在你这个场景下的即时翻译:违反了哪条、在哪个文件哪一行、按什么指引修。 你的动作是按指引修,不猜。
关键决策点:机器发信号时,拦截误报怎么办
CI拦住了你,但你判断这是误报,比如边界场景合法、但规则描述没覆盖。你的动作不是绕过拦截,也不是强行降级规则,而是提交消费侧反馈并标注误报。
回流的落点是评审队列,但修订的对象从来不是评审标准本身,是规则定义是否完整、约束是否可执行、场景是否被覆盖、分级是否正确。合法的例外通过显式豁免清单处理,不通过放松规则处理。
误报不是拦截系统的失败,是规则的迭代输入。你提交的每一次误报标注,都在校准下一版契约。
一直在工作吗:拦截的纪律
| 情况 | 机器保证什么 | 你保证什么 |
|---|---|---|
| 正常提交 | 校验自动执行,不占用你的注意力 | 不绕过、不关闭校验 |
| 被拦截 | 报告附条款编号与修复指引 | 按指引修;疑似误报则标注反馈 |
| 规则变更 | 契约升版 → CI 规则自动换版 | 无;新版规则自动生效 |
四、同一约束的两层落地:引导与拦截的分工
前三章展开的三层设计,枚举值、类型约束、拦截报告,全部是确定执行:机器校验,违例必拦。但你的工作面上还有一类约束,执行性质完全不同。
一个来自行业的对照样本:Figma的增长产品经理Ezra Mechaber把自己九年的领域经验外化成了一份 CLAUDE.md 和31个 SKILL.md,全公司的产品经理都在用,其中写了"删除按钮必须二次确认"这类约束。 这类约束的执行方式是模型自觉:模型大概率遵守,但"大概率"不是"一定",它可能第三周就忘了,而没有任何机制会发现它忘了。这个体系的维护者自己承认,他不清楚这套定制配置比裸agent好多少,约束有没有被遵守,没有任何读数可以回答。
这是这类载体的属性:文档级指令载体管"怎么生成得更好",是概率执行;Schema与CI管"什么不能生成",是确定执行。 同一约束在两层各落一次,分工是:
- 写在 CLAUDE.md 里,生成时往正确的方向偏,漏网无感
- 编译进Schema与CI,跑偏了必被拦,拦下附条款定位
你工作面上的三层设计(枚举、类型、拦截报告)全部属于后者。属于你的分层工作只有一件:涉及契约已覆盖的语义边界,走产物不走散文,不止你自己不按"经验"写,你团队的 AGENTS.md 里也不要再手写"错误提示别全用红",改挂引用块。手写散文约束不是错,错的是把它当成约束已经落地。
口径提醒:上述行业案例为播客自述样本,未经独立验证;引用它说明的是载体的执行性质,不是某家公司做得不好。事实上,那套体系在"怎么做好"的层面支撑了几十人每天使用,这正是两层分工各自成立的证据。
结语:三层设计,三种工程形态
本篇展开了语义令牌、语义域、约束显化在前端与AI工程师工作面上的投影:
- 语义令牌 → 你代码里的枚举值,纪律只有一条:不绕过
- 语义域 → 你类型系统里的Props约束,动作只有一个:按场景选类型
- 约束显化 → 你提交时的CI拦截报告,及格线只有一条:报告可追溯
三层设计你都不生产,但你都是它们的终端执行面,上游所有角色的工作,最终要靠你"不绕过"来兑现。第四章补上了同一约束的两层落地:载体层的概率引导值得用,但确定性的拦截永远要有人接住漏网之鱼,在你的工作面上,这个人是机器。
这些产物从哪来、以什么形态到达你、版本怎么保持新鲜,我会在下一篇展开,包括一件为AI编码工具准备的新交付物:契约引用块。
本文由作者@魏雯,授权发布于平台,未经许可禁止转载。
1920.png.png