[
  {
    "id": "docs/internal/figma-technical-reference.md",
    "reason": "文件级豁免（id 无 # ⇒ 盖该文件全部 17 段）。2026-08-27 逐段读过全文后登记。为什么整份如此：这份文件是 use_figma 的 Figma Plugin API quirks 手册，它的每一个 Acceptance 段约束的都是**在对话里现写现跑的一次性 JS 脚本**（脚本必先 probe absoluteBoundingBox 再继续 / 批量前先单例验证 / getNodeById 前先 setCurrentPageAsync / 遍历前加 hasChildren 守卫 / clone 后必显式 appendChild 再设坐标 / createText 后必显式设 fills …），外加各段末尾的 handoff doc 记录要求。那些脚本**不落仓库**（use_figma 调用体，执行完即消失，无文件产物），handoff doc 是交付文本 —— 两者仓库侧都没有可扫的对象。⇒ 不是「这份文件很难测」，是结构上无被测物。⚠️ 如实登记唯一一处 borderline：#Q13 自带一句「audit-style check（可选）：扫 Figma export 看 root frame 是否 hug」—— 它自标「可选」，且输入面是 gitignored 的 Figma 快照（figma-data/mockup/），不在任何仓内闸的扫描面；要上闸得先解决快照入库，属独立提案，不在本条覆盖的承诺里。⛔ 文件级豁免会静默盖住将来往这份文件新加的段，若日后有段的被测物落进仓库，必须改成段级。"
  },
  {
    "id": "docs/internal/code-conventions.md#Acceptance",
    "reason": "段级。§Acceptance criteria（build 自审）三条全是**要作者答得出的问题**（自画 SVG 几个 / 有无库实证证据（搜索词+结果）/ 用了多少 hex literal / 复合组件 mirror 自哪个 canonical），段尾逐字「任一条答不出 → 不可宣布完成」。被测物 = 作者在 PR/handoff 里的答案，不落仓库。⚠️ 别与「后果面已被闸守」混为一谈：hex literal 的**结果**由 audit:no-hardcoded-design-tokens（硬规则 #4，L5）守、自画 SVG 的结果由 audit-product-code R1 守 —— 那是 §R1/§R2 两条规则各自的闸，不是本段这三个自审问题的闸。本段问的是「你答不答得出」，无闸可核。"
  },
  {
    "id": "docs/internal/code-conventions.md#R7",
    "reason": "段级。R7 四场景判断的自审：要求 AI 在任务开始前显式声明一行「intent classified as 场景 X.Y」、场景 2 里抑制顺手修复的冲动、命中 Hybrid 边界先 ask 用户。被测物是**AI 的 response 文本与判断过程**，不落仓库。唯一落盘的那条（保留的非 TVU 视觉标 VISUAL-FIDELITY 注释）其判据是「该不该标」= 语义判断，机器分不出哪段视觉是 from source。"
  },
  {
    "id": "docs/internal/code-conventions.md#R8",
    "reason": "段级。要求任务交付时 AI 显式声明「已 run figma-extract-css.py」「已完成自检 N 轮，diff% = X.XX%」、超阈值时显式声明豁免理由、修复轨迹记录在 commit/handoff。被测物是交付叙述 + 一次性本地脚本产出（extracted-css.css / visual-diff 截图均不入库）。段内两条实体规则（矢量源→矢量输出、禁止 approximate 重画 vector）的**违例形态**是「用了 raster 中转」/「手写近似 path」—— 判据要求分辨一段 inline SVG 是真实导出还是手绘近似，逐字撞 FIGMA_AS_SOURCE_OF_TRUTH.md §验证方法禁止的启发式。"
  },
  {
    "id": "docs/internal/code-conventions.md#R9",
    "reason": "段级。要求 AI 交付前列出「推断的交互态规则表」、hover/focus/disabled 补齐、推断方向与 active state 一致。被测物是那张表（交付文本）。⚠️ 补没补 hover 这一半在 consumer 侧确有 R9 探针，但它逐字标 ADVISORY（report-only、HIGH FP、从不 set exit 1）⇒ 结构上不是闸；且它覆盖不到「推断方向是否与 active state 逻辑一致」这条语义判断。⇒ 本段整体无闸可核，R9 升 blocking 后可重议本行。"
  },
  {
    "id": "docs/internal/code-conventions.md#R10",
    "reason": "段级。四条全是任务开始前的**显式声明**与**问不问用户**（声明 vector strategy: X (reason: ...) / ambiguous case C/D 要 ask user 而非自作主张 / case D 列疑问点等用户拍板 / 起手 run figma-extract-css.py）。被测物是对话行为与 AI response，仓库侧零对象。"
  },
  {
    "id": "docs/internal/code-conventions.md#R15",
    "reason": "段级。R15 Library-First 的自审：handoff/PR 必含一行「UI primitives used: [...]」、新写 JSX/Vue template 未 import canonical 则触发 flag、自画必须在 commit message 留 escalation 痕迹。被测物是 handoff 文本 + commit message + PR 正文。⚠️ 「新写原生控件」这一后果面确由 audit-product-code R15 守（原生 <button>/<input>/<select>/<textarea>），但本段要的是**声明与 escalation 痕迹**，R15 看不到那些；且 R15 是 consumer 侧扫描面，本段约束的是任何 implementation PR 的作者行为。"
  },
  {
    "id": "docs/internal/code-conventions.md#R17",
    "reason": "段级。module reuse 的 code review 纪律：review 时 grep 相似 pattern 应集中在 1 个 component file、handoff 必含 reused components 段（每个 module 的 import count + 是否已抽）、代码块复制 3+ 次没抽 component 视为违规。前两条的被测物是 review 行为与 handoff 文本；第三条要机检需要「相似代码块」判定 = 启发式（多相似算复制、抽到什么粒度算已抽），撞 FIGMA_AS_SOURCE_OF_TRUTH.md §验证方法。"
  },
  {
    "id": "docs/internal/code-conventions.md#R18",
    "reason": "段级。M37 Reference probe 的三条：handoff/PR 必含 5-row probe table、每个新文件标注来自 reference 复用还是新增创造、reviewer 能从 probe table 反查漏了哪条 contract。第一条的**存在性**已由 audit:handoff-sections 守（它逐字扫 \"Reference probe\" 短语），但那是 M37 那条规则的闸、不是本段；本段其余两条（逐文件来源标注 + reviewer 能否反查）的被测物是人的 review 行为，无对象可扫。⇒ 若日后要把本段改判 gated，正确动作是让 audit-handoff-deliverable-sections.mjs 增写一行 covers-acceptance 指向本 id，并删掉本行（shrink-only 会要求删）。"
  },
  {
    "id": "docs/internal/code-conventions.md#R23",
    "reason": "段级。文本截断 + tooltip 的五条：用指定 CSS pattern 之一、用 scrollWidth > clientWidth 检测、tooltip 用 library 组件而非自画、a11y 双保险（aria-describedby + title）、至少 1 个单测覆盖「截断→tooltip 触发」。被测物是**消费产品仓的代码与测试**，不在本仓任何闸的扫描面（audit:consumer-code 需在 consumer 侧跑且未实现这几条判据）。⇒ 是「被测物在别的仓」不是「不可机检」——若日后 consumer 档补上对应 probe，本行应删。"
  },
  {
    "id": "docs/internal/code-conventions.md#R-DISCIPLINE",
    "reason": "段级。R-rule 起手协议自审：写第一行 component code 前 conversation 内可见一次 TodoWrite 调用（list 含本次适用 R-rule 编号）、handoff 顶部含 \"Rule checklist: [R0 ✅ / R1 ✅ / ...]\"、宣布 ready for review 前 todo 的 pending/in_progress 数 = 0。被测物是**AI 的对话 transcript 与 todo 状态**，那是工具会话内的运行时状态，仓库里不存在。"
  },
  {
    "id": "AGENTS.md#Team",
    "reason": "段级。§Slack mrkdwn 的四条起草纪律（起草前确认平台是 Slack / 嵌套结构扁平化成 *section title* + 单层 • / 所有加粗用单 * / URL 直接粘贴不包 markdown link）。被测物是**发到 Slack 的消息正文**，不落仓库；grep 实测 scripts/*.mjs 无任何 Slack 判据，也不该有（消息发出前的形态只存在于对话里）。⛔ 用段级不用文件级：AGENTS.md 是高频活跃文档，文件级豁免会静默盖住将来新增的段。"
  },
  {
    "id": "AGENTS.md#Jira",
    "reason": "段级。§Jira 评论的七条（起草前确认平台 / 正文英文 / 对外先给 owner 过目草稿 / review 评论从简 / contentFormat adf + accountId 真 mention / 内容多于确认+link 就拆多条 / reply 提示走 UI）。被测物是**发到 Jira 的评论**（经 MCP 调用发出），仓库侧零痕迹；「先给 owner 过目」更是人在回路的动作。⛔ 同上，用段级不用文件级。"
  },
  {
    "id": "docs/meta-rules.md#触发器",
    "reason": "段级。触发器并行化的四条：任务有 ≥2 个可独立子任务时 response 顶部必含 Parallelism plan: 段、该段列出每个 track 的输入/输出/是否 independent、independent tracks 必须在单条 message 内并发触发、违例被提醒一次就写进实证段。被测物是**AI 自己那条 response 的文本与工具调用形态**（一条 message 里发了几个 tool_use），仓库里不存在该对象。⛔ 用段级不用文件级：meta-rules.md 是活跃的元规则真源，文件级会静默盖住将来新增的段。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#例外",
    "reason": "段级。§M-TXT-ICON-AUDIT 的「例外 + 硬技术约束 — 注释层正文里的排版符号」那段，唯一核查项逐字要求「逐字符扫 Roboto 段内是否残留上表 ❌ 行字符（getStyledTextSegments(['fontName'])），且**必须看渲染图确认符号真的可见**」。两半都不可仓内机检：前半的 probe 是 use_figma 对话内的实时 Plugin API 调用（同 design-process.md#参考物落地（Reference 那条的形态，它的 probe 是 getStyledTextSegments(['hyperlink'])）；后半逐字「机读 characters 里符号永远『在』，缺 glyph 只有渲染图能发现」= 人眼判据，规则自己声明了不可机读。⚠️ 别误配给 audit-mockup-typography-icon.mjs：该闸 FONT 半的判据是 ALLOWED_FONTS 字体家族白名单（Roboto / Noto Sans SC），比的是「用没用对字体」，而本段比的是「用对了字体但该字体缺这个 glyph」——方向不同。2026-08-28 [[INFRA-F142]] 第五批逐字核后登记。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#反向问题",
    "reason": "段级。§M-TXT-ICON-AUDIT 的「反向问题 — ZH 段（Noto Sans SC）里的全角化字符」那段，唯一核查项逐字要求「注释层 ZH 段落写入后，**看一次渲染图**确认拉丁词组内无异常空隙」。⭐ 本条是全表里依据最硬的一条：规则正文**自己逐字点名了所有候选闸并声明它们抓不到** ——「它比缺 glyph 更难发现 —— 字符是可见的，只是宽度不对，所有现有闸（字体白名单 / glyph 正则 / bilingual spacing / typography-icon）**全部 PASS**」，并逐字给出唯一判据「只有渲染图能发现」。⇒ 判 gated 会与规则原文直接矛盾。⛔ 重开条件：本段要脱离本豁免，需要的不是给某个现有闸加自陈，而是先有一条能测「渲染后的字符宽度」的新判据（当前无被测物——本仓无渲染像素面）。2026-08-28 [[INFRA-F142]] 第五批逐字核后登记。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M53",
    "reason": "段级。§M53「Feedback Message Copy」的四条：交付物每类提示标明 Trigger 属哪族 / user-initiated 每条能指出它报的是哪个控件的哪个新值 / 无一条只是复述用户已可见的状态 / 触发点被两族共用时写明已尝试通用措辞或为何必须分叉。⛔ 四条的被测物全部**不在本仓** —— 是 consumer 产品的 Figma 交付页与该 consumer repo 的 spec（本条实证落点 = TVU Pack/docs/specs/lcd-message-strings.md 与 Touch Screen 文件 page 10166:2），而本闸扫描面 SCAN_FILES 是 DS 仓内七份规则真源。第 2、3 条另有语义成分：判「报的是不是用户刚动的那个控件」要知道该产品的控件树与用户操作路径，判「是不是复述了用户已经看得见的状态」要知道界面此刻显示什么，二者都无仓内可扫对象。⚠️ 重开条件：第 1、4 条形态上是可扫的字符串存在性检查（Trigger: 标注 / 分叉理由段），若将来有闸把 consumer 交付层纳入扫描面，这两条可先转 gated，届时本条改为只豁免第 2、3 条。2026-08-31 随 M53 回流登记。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M54",
    "reason": "段级。§M54「多断点响应式出稿纪律」的四条：M48 起手清单含「目标断点档：〈token 名列表〉」一行（含单档豁免 rationale）/ 声明的每档有帧或有显式行为声明、换形态元素逐个声明 / 每帧过溢出自检（子树右边界 ≤ 帧宽）留 trace / 无集合外发明的档位边界。⛔ 四条的被测物都是 **Figma 侧产物或交付文本**：第 1、4 条落在 M48 起手清单与 UX 交付卡的档位声明（对话 / handoff 文本，不落仓库）；第 2、3 条落在 Figma mockup 帧的存在性与帧内几何。⚠️ **必须与「同型判据在 code 侧已有闸」分清**（同本表 #R15 / #R9 的诚实口径）：规则正文逐字点了两条 code 侧闸 —— `audit:layout-tokens` S3 核的是 CSS `@media` 字面量 ∈ token 值集合、`audit:docs-overflow` 核的是 docs 站页级横向溢出 —— 两者的输入面都是本仓 CSS 与 docs 站 DOM，**看不到任何 Figma 帧**，所以它们是 code 侧对应约束的闸、不是本段的闸。⚠️ 如实登记一处 borderline（与本表 #Q13 那条完全同型）：第 3 条「子树右边界 ≤ 帧宽」在形态上是可机械测的几何判据，`scripts/audit-mockup-integrity.mjs` 的 §I3（children-bbox wrap）已经在做同类测量 —— 但它的输入面是 gitignored 的 Figma 快照（figma-data/mockup/），不在任何仓内闸的扫描面，且要按「本次声明了哪几档」逐帧比对还需要知道档位声明（在交付文本里）。⚠️ 重开条件：若 mockup 快照入库、且有闸能把「档位声明 × 每档帧 × 帧内右边界」三者对起来，第 2、3 条应先转 gated，届时本条改为只豁免第 1、4 条。2026-09-03 随 M54 回流登记。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M55",
    "reason": "段级。§M55「多方案比选交付纪律」的四条：各方案 M48 清单同口径 / 差异对照卡存在且逐差异点三列齐 / 拍板后 design-record §6 有结论 + 落选理由且落选 Section 已标 `❌ Not Selected` 未被擅删 / 无保真度差。⛔ 被测物按条分三类，**没有一类落在本闸扫描面（DS 仓内七份规则真源）**：① 第 1 条 = M48 起手清单（对话 / handoff 文本，不落仓库）② 第 2 条与第 3 条后半 = consumer 产品的 Figma 交付页（对照卡是否三列齐 / 落选 Section 名有没有 `❌ Not Selected` 前缀）③ 第 3 条前半 = **该 consumer repo 的** design-record `## 6. 决策记录` 段 —— 与本表 #R23 同型，是「被测物在别的仓」不是「不可机检」。⚠️ 第 4 条「无保真度差」是四条里唯一**结构上不可机检**的：判两案保真度是否相同要比较两组帧的完成度，逐字撞 FIGMA_AS_SOURCE_OF_TRUTH.md §验证方法禁止的启发式（「凭形态推意图」），⛔ 不要为它写相似度判据。⚠️ 如实登记两处 borderline（与本表 #Q13 / #M54 同型）：第 2、3 条形态上都是**字符串存在性检查**（对照卡三列表头 / Section 名前缀），若将来 Figma 快照（figma-data/mockup/，现 gitignored）入库并进扫描面，这两条可先转 gated；第 3 条前半若 consumer 档补上扫 design-record §6 的 probe 亦同。届时本条改为只豁免第 1、4 条。2026-09-03 随 M55 回流登记。"
  },
  {
    "id": "docs/internal/design-process.md#M21.3",
    "reason": "段级。M21.3 要求 sibling contract 的每条 probe 值注明来源 node id **且该节点 effectivelyVisible === true**，并要求否定式结论（「本页没有 X」）注明已排除「X 存在于被停用父级下」。核心断言是**节点的有效可见性**——祖先链上任一级 visible=false 即不算数——其输入面是 Figma 实时节点树 / gitignored 的 figma-data/mockup/ 快照，**不在任何仓内闸的扫描面**（同本名单首条 figma-technical-reference 那处 borderline 的理由）。仓库里没有可扫的对象：probe 值写在 handoff 交付文本里，而「这个 id 当时可不可见」只有 Figma 侧答得出。⚠️ **如实登记 borderline，⛔ 别把本条读成整段都不可测**：两条 Acceptance 里的**前半截**（『每条 probe 值有没有带 node id』『否定式结论有没有带那句排除声明』）是纯词法的，handoff doc 落仓后可 grep ⇒ 那半**是**可机检的，只是现在没闸。⇒ 本豁免覆盖的只有「id 对应的节点当时是否 effectivelyVisible」这一半；前半截属独立提案（往 audit-mockup-handoff-evidence 加两条 grep），⛔ 不在本条承诺内，也 ⛔ 不得因本条存在而认为它已被豁免。登记于 2026-09-01，实证 RPSV3-134。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M23.19",
    "reason": "段级。§M23.19（交付卡的结构化表达）5 条 Acceptance 问的都是「这段内容的**真实结构**是什么」：Interaction 段里那几句话算不算一台状态机 / Journey 的 5 个块算不算摊开了一个可横向比较的矩阵 / PRD 的 Requirements 与 Acceptance 是不是逐条同构 / 某段是不是叙述性因而**不该**被表格化。判据的输入是 Figma 注释卡里的自然语言语义，机器读不出「本该是图却写成了散文」—— 这正是本规则要人做的那个判断，不是它的副产物。⚠️ 如实登记两处 borderline：① 第 2 条「Journey Map 是真网格」的**结果面**理论上可探（卡里有没有网格容器），但「真网格 vs 纵向文字块」仍要读结构语义，且目前无任何闸扫 Figma 注释卡的段落形态，要上闸得先解决 Figma 快照入库（同本表 figma-technical-reference 那条的边界，属独立提案）② 第 5 条「新画的状态图箭头已跑 §M23.6 (A)(C)(D)」的**被测物是「跑没跑」这个声明**，不是箭头本身 —— 箭头的 (A)(C) 确由 audit-mockup-connector.mjs 守、(D) 无闸（见 §M23.6 (D) 本文），但那是 §M23.6 各款自己的闸，不是本段的。⛔ 别据此把本段读成 gated。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#C8",
    "reason": "段级。§C8（一个视觉信号在同一交付集内只能有一种语义）三条：① 交付收尾产出一张**信号 × 语义**对照表 ② 消解走取变体而非覆盖 paint ③ 授权偏离写进消费产品的 design-record。①③ 的被测物是**交付文本**（handoff / 消费产品 repo 的 design-record），DS 仓侧无对象；② 问的是「这次是怎么消解的」= 作者意图，不是产物形态。⚠️ 核心判据本身就不可机检：本条判「**同一个信号在整套交付里是否保持单义**」，而 `colors` / `binding-fidelity` 判的是「**每一处填色是否合法**」—— 两者断言对象不同，实证 RPSV3-134 两处红都绑 token、都是库的既定定义、机检全绿而本条违例（详见 §C8 实证段）。「红在这一帧是破坏性动作、在那一帧是关闭提示」是语义读解，机器读不出。⚠️ 如实登记 borderline：② 的**后果面**（覆盖 paint）确由 §M52.1 / §C1 的闸守，但那是那两条各自的闸，不是本段的；本段允许覆盖 paint 之外的一切正当消解，闸分不出「取了变体」与「本来就没冲突」。事后一侧由 `design-walkthrough` §5.10 E8 兜 —— 那是**人工走查轴**，不是闸。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M23.6~2",
    "reason": "段级 —— §M23.6 **(D) 条件标签附着**（本文件第二个 M23.6 Acceptance 段，4 条）。被测物是 **Figma 节点几何**：标签可见字形外框距目标线段 ≤60px / 全套统一贴同一侧 / 不压线（按线段判非 bbox）/ 跑过阴性对照。DS 仓侧无可扫对象 —— Figma 快照落 `figma-data/mockup/` 且 **gitignored**（RPS 那份实测 could-not-run、分母 0），量法必须用 `use_figma` 现跑一次性探针，探针本身不落仓库。同本表 `figma-technical-reference.md` 那条的边界（要上闸得先解决快照入库，属独立提案）。⚠️ **必须登记的 borderline，别读错**：`audit-mockup-connector.mjs` 自 2026-09-01 起经 reconnect_map 的 `parts.label` 把条件标签纳入了 §C4 的**颜色**对象集 —— 但它**一条位置判据都没有**。⛔ 「闸现在读标签了」≠「本段有闸」：闸能判标签是不是绿的，判不了它离那段线多远。条文里也就地写了这句。⚠️ 第 4 条「跑过阴性对照并留下读数」的被测物是 handoff 里的读数记录，同属交付文本。"
  },
  {
    "id": "docs/internal/design-process.md#M21.4",
    "reason": "段级 —— §M21.4（视觉结构契约的作用域是**产品**：前期建 · 验收查 · 走查兜），4 条。三个被测物全部在 **DS 仓之外**：① 产品级视觉结构契约文档 —— 按三档落点规则它**本来就该落消费产品 repo**（取值 / node id 归项目侧，⛔ 不进 DS 真源），DS 仓永远扫不到它 ② 「UX 交付卡 Acceptance 段含某一条」的被测物是 Figma 卡里的文本 ③ 「走查 §1 属性表的先例列标了来源级别」的被测物是走查报告。第 4 条「出现两级都无先例的新值时契约被更新」还额外要求判断「这个值在本产品同类页有没有先例」—— 那是跨页语义比对，机器要先知道「同类页」是哪些。✅ **id 脆弱性已修（2026-09-02，[[INFRA-F142]] 候选解 ②）**：本行一度是 `design-process.md#M21.4`（序号寻址，被 M21.4 自己的加入顶到 ~7），现已改为锚点 `#M21.4`，与「该文件别处插了什么」无关。⚠️ 仍有两种残留会让 id 变：同一条规则内部有多个 Acceptance 段（owner 内序号）、以及规则标题改名（S3 会当场报红）。改动该文件后仍建议重跑 `--list` 核对本行仍落在 M21.4 上。"
  },
  {
    "id": "docs/internal/code-conventions.md#R2.2",
    "reason": "段级 —— §R2.2（§C8 的 code 端镜像），三条与 mockup 侧同构：信号 × 语义对照表 / 消解走 prop·variant 而非 override CSS / 授权偏离进 design-record·ADR。理由同本表 `mockup-conventions.md#C8` 那条，此处只记 code 侧特有的两点：① 被测物是 **PR 描述与 ADR**，仓库侧无对象 ② 核心判据「同一信号是否单义」在 code 侧同样不可机检 —— `audit:no-hardcoded-design-tokens` / `audit-product-code` R2 保证「每一处颜色都合法」，**不保证「同一信号只表达一件事」**，条文的 jump 行逐字写着「lint 全绿仍可能违例」。⚠️ borderline：override CSS 的后果面确由 R2 守，但那是 R2 自己的闸；本段问的是消解路径的选择。"
  },
  {
    "id": "docs/internal/code-conventions.md#R6.1",
    "reason": "段级 —— §R6.1（§M21.4 的 code 端镜像），三条：起手有产品级视觉结构契约（每条注明来源 `文件:行`）/ PR·handoff 含「取值全部命中契约 / 例外已列」/ 出现两级都无先例的新值时契约被更新。理由同本表 `design-process.md#M21.4`。code 侧特有：契约与 PR 描述都落**消费产品 repo**，DS 仓无扫描面；且第 3 条要判「本 app 同类视图有没有先例」—— 机器要先知道哪些视图算「同类」，属语义。⚠️ borderline：R6.1 的价值恰恰在第 2 条把契约变成 **PR 的可拒收项**（条文原话「② 是让契约有牙的那一步」）—— 那颗牙是 **reviewer**，不是闸。⛔ 别因为「它进了 review 面」就读成 gated。"
  },
  {
    "id": "docs/internal/code-conventions.md#R18.1",
    "reason": "段级 —— §R18.1（§M37.3 的 code 端镜像），三条：Reference probe 段的 `Style / spacing tokens` 行分「参考物值 / 宿主实测值（含来源 `文件:行`）」两列 / 新增·粘贴的样式声明逐属性先例核对 / ⛔ 不接受「按参考图做的」作为 review 通过理由。第 1、3 条的被测物是 **handoff·PR 文本与 review 行为**，仓库侧无对象。第 2 条是本条的实质判据，也正是不可机检的那条：要分辨一段新增 CSS 是「照抄参考物」还是「取自宿主同类视图」，机器得先认定哪些视图算同类、再判该值在其中有无先例 —— 与本表 `code-conventions.md#R8` 那条「分辨 inline SVG 是真实导出还是手绘近似」同型，逐字撞 FIGMA_AS_SOURCE_OF_TRUTH.md §验证方法所禁止的启发式。⚠️ borderline：**裸值**这一后果面由 `audit:no-hardcoded-design-tokens`（硬规则 #4，L5）守 —— 但它守的是 hex literal 的存在，管不到「这个合法 token 在本 app 同类视图里有没有先例」，后者才是本段问的。条文自己点名的高危形态（copy 一段 CSS / 一个 class / 整个组件文件过来改）在 diff 里只是「多了几行样式」，正因为**看起来完全合法**才需要人判。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M32.5",
    "reason": "段级 —— §M32.5（选源组件前先判断字段语义类别，不只挑「看起来最像的邻居」），3 条。判定对象：① 对话里那句「新字段的语义类别是 X」；② 「组件选型与上表对照一致（或有明确理由偏离）」，而它的判定输入正是 ① 那句话；③ 「克隆携带的默认装饰（图标等）已逐一评估，不契合的已移除」。为什么不在仓里：① 与 ③ 的「已说清 / 已逐一评估」是**对话过程**，执行完即消失、无文件产物；② 即便从 live Figma payload 读出这一格实际用了哪个组件（`scripts/mockup-rules/` 正在吃这份 payload），也**无从判「与语义类别一致」** —— 那个类别只存在于 ① 那句话里，仓库侧没有该输入。⚠️ 如实登记可探的那一半：③ 里「某个默认图标还在不在」在 payload 里是可数的，但「契合与否」是语义判断 ⇒ **可数的那一半不构成本条断言**。仓内同型先例：本表 `code-conventions.md#R9`（被测物是那张推断出来的交互态规则表 = 交付文本）。owner 2026-09-07 批准登记。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M32.6",
    "reason": "段级 —— §M32.6（Spec-Value Fidelity + Confirm-Before-Deviation），4 条。判定对象：① 交付的间距 / 颜色 / 字号 / 圆角能逐一指到 DS token 或**原稿实测来源**；② label / 文案与**原稿**逐字一致（简写 / 增删须用户确认）；③ 原稿之外的设计发挥，session 内有一次显式「提方案 → 用户确认」记录；④ Legacy 关联声明（`FIGMA_AS_SOURCE_OF_TRUTH` + 硬规则 #2 在 mockup 层的落地）。为什么不在仓里：①② 的判定**基准**是「原稿」—— 线上产品实拍截图 / 上一期 Figma 稿 / PRD，全部是 DS 仓外的外部基准，仓里没有它可比；③ 的被测物是对话记录。⚠️ 如实登记可探的那一半：DS 仓能从 live Figma payload 读出 mockup 现在**用的是什么值**，但读不出「这个值能不能指回原稿」—— 缺的恰是**原稿那一侧**，不是 mockup 那一侧。仓内同型先例：本表 `code-conventions.md#R8`（被测物是交付叙述 + 一次性本地脚本产出，两者均不落仓）。owner 2026-09-07 批准登记。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M46",
    "reason": "段级 —— §M46（Library Instance Iteration Discipline），3 条。判定对象全部是**动作序列**：① 改 mockup 前 probe 输出了 instance 可改性（componentProperties / text override / cell count grouping）；② detach 限制在 minimum necessary scope（不 detach 整行整表）；③ 自画 overlay 仅作 transient debugging，handoff 前删干净。为什么不在仓里：① 的 probe 输出是 `use_figma` 调用体的返回值，执行完即消失、无文件产物；②③ 要判的是「**当时的必要范围是什么**」与「这个节点当初是不是调试用的」—— 两者都是**意图**，不是状态。⚠️ 如实登记可探的那一半：某节点现在是 INSTANCE 还是已 detach 的 FRAME，在 payload 里可读（`scripts/mockup-rules/` 正在吃这份 payload），但「detach 范围是否最小必要」需要「必要范围」这个输入，而它不落盘 ⇒ **可读的那一半不构成本条断言**。仓内同型先例：本表 `mockup-conventions.md#例外`（§M-TXT-ICON-AUDIT 的硬技术约束段 —— 规则正文自己点名候选闸并声明它们抓不到）。owner 2026-09-07 批准登记。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M-DISCIPLINE",
    "reason": "段级 —— §M-DISCIPLINE 的起手协议自检段（本文件 M-DISCIPLINE 族的第三个 Acceptance 段，3 条）：① 画第一个产品 frame 前，conversation 内可见一次 `TodoWrite` 调用，list 含本次适用规则编号；② handoff doc 顶部含一行「Rule checklist: [M0 ✅ / M23 ✅ / …]」，所有适用规则状态显式；③ 任何「ready for walkthrough」声明前，todo list 内 pending / in_progress 数 = 0。为什么不在仓里：三条的被测物分别是 **AI 的工具调用序列**、**handoff 文本**、**todo list 运行时状态** —— 无一落 DS 仓。仓内同型先例是全表最硬的一条：本表已有的 `code-conventions.md#R-DISCIPLINE` **就是本条的 code 侧镜像** —— 两条同日（2026-06-01）落地、三条核查项逐条同构（只差 M-rule / R-rule 编号），理由完全同源。⚠️ handoff 那一条另有已登记的天花板：`audit-mockup-handoff-evidence.mjs` 自印逐字「DS 仓一份真 handoff 都没有」，真 handoff 全在消费仓，DS 仓侧守的只是模板不回退那一层。owner 2026-09-07 批准登记。"
  },
  {
    "id": "docs/internal/design-process.md#Step",
    "reason": "段级 —— §Step A.1（Parent ticket comment thread read，Jira-derived task mandatory），4 条：① 已用 Jira API / MCP 读了 task ticket 完整评论（`fields: [\"comment\"]` 全量）；② 已枚举 `issuelinks` 并沿 outwardIssue / inwardIssue 读完所有 linked ticket 评论；③ 评论链发现的新 context 显式登记进 PRD 草稿（Step B），含 stakeholder 决策 / open question / 跨 ticket 关联约束；④ 评论链与 description 冲突时显式标记冲突给用户拍板。为什么不在仓里：①② 的被测物是 **Jira 上的评论链与读取动作**（经 MCP 调用发生，仓库侧零痕迹）；③ 的落点是 PRD 草稿，而按 §Step B 那份 PRD 是**写进目标 Figma 文件**的（`PRD - <页面名>` frame），不落 DS 仓；④ 是对话行为。仓内同型先例：本表 `AGENTS.md#Jira`（被测物是发到 Jira 的评论，仓库侧零痕迹，且该条已记「grep 实测 scripts/*.mjs 无任何 Jira 判据，也不该有」）。owner 2026-09-07 批准登记。"
  },
  {
    "id": "docs/internal/design-process.md#M21.2",
    "reason": "段级 —— §M21.2（Feature Iteration Color Contract，功能迭代色值合同），3 条：① 代码第一块是带来源注释的 Color Contract；② Color Contract 中每个色值都标注了来源 node ID + hex 值（供 reviewer 验证）；③ 未见 TVU DS token hex 值（`#2FB54E` / `#30B54E` / `#EA4233` 等）出现在**产品 mockup 颜色常量**中，除非 sibling probe 确认两者相同。为什么不在仓里：三条的被测物全部是**消费产品那一侧的产物** —— ①② 是产品代码文件头部的 Color Contract 注释块，③ 是产品 mockup 的颜色常量。按本仓三档落点规则，取值 / node id 归项目侧、⛔ 不进 DS 真源 ⇒ DS 仓永远扫不到它们。仓内同型先例：本表 `design-process.md#M21.4` 与 `code-conventions.md#R6.1`（产品级视觉结构契约本来就该落消费产品 repo，DS 仓永远扫不到），本条与它们**同族同因**。⚠️ 方向提醒：DS 仓自己的源码里有没有裸 hex 是另一件事、由另一条闸管，与本条问的「产品 mockup 的颜色常量」方向相反，⛔ 别把那条闸的绿读成本条已覆盖。owner 2026-09-07 批准登记。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M23.10",
    "reason": "段级 —— §M23.10（UX Card Audience-Aware Language），3 条：① M23 卡里没有 code block（「样本 payload」段允许 1 个）② 显示 / 取值 / 渲染规则用白话 If-Then 表达 ③ 字段名 / 字面量值用行内 backtick 引用。为什么不可机检：**本条的断言是「读者（PM / QA / dev）读得懂」**，而能实现的两条判据（按字体判 monospace / 按语法记号判 regex 与 pseudocode）**都只是它的代理指标**。一张卡可以零 code block 却照样写得像天书，也可以带 1 个 code block 而其实很好读 ⇒ 代理绿 ≠ 断言成立。⛔ 尤其危险的是这个方向的假绿：一条只抓代理的闸每次绿，会让下一个人把它读成「这张卡的表达合格了」，比没有闸更糟。⚠️ 如实登记可探的那一半：判定面**在**扫描面内（M23 卡是 Figma 注释层文字，`scripts/mockup-rules/` 12 条模块正在吃同一份 payload，字体与语法记号都可数）—— ⛔ 所以本条的理由**不是**「输入面扫不到」，是「可数的东西不是本条的断言」。仓内同型先例：本表 `mockup-conventions.md#M23.19`（5 条问的都是「这段内容的**真实结构**是什么」）与 `mockup-conventions.md#反向问题`（规则正文自己点名候选闸并声明它们抓不到）。owner 2026-09-07 拍定不上闸，理由是频次痛感（逐字「目前的 UX 交付不包含代码块，我认为保持最新的现有的格式就 OK」）；agent 起草的理由（只抓代理）与它同向，两者都指向「不上闸」⇒ 本行按不可机检登记，⛔ 规则正文未动。**重开条件**：任一次 UX 交付卡里出现 code block（「样本 payload」段那 1 个之外）⇒ 前件成立，重议是否上那半个可数的闸。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M43.3",
    "reason": "段级 —— §M43.3（标题句里嵌变量：允许多行 + 左对齐，⛔ 不许为了排版去改文案或拆结构），4 条。被测物分四类，**没有一类落在本闸扫描面（DS 仓内七份规则真源）**：① 「含变量的标题句在 mockup 里是左对齐、且画了变量取最长值那一态」= **Figma 节点几何**，快照落 `figma-data/mockup/` 且 **gitignored** ⇒ DS 仓侧无对象可扫（同本表 `mockup-conventions.md#M23.6~2` 的封路理由，那条实测过分母 0 / could-not-run）；② 「提『改文案』或『拆结构』的方案前，报告里写明①样式层试过什么、为什么不够」= **走查交付文本**，不落仓库；③ 「没有为了凑单行而删掉标题里的限定词（若删了附判断依据）」= **作者意图**，执行完即消失、无文件产物；④ 「文案多端共用时改动前确认对端形态」= **对话过程 + 对端 consumer 仓**，两侧 DS 仓都扫不到。⚠️ 同条并入的「修复层级 ①样式 → ②文案 → ③结构，逐层试、命中即停」判据同样只能靠人读走查报告判 ——它问的是「作者试没试过更轻的那层」，是过程而非产物。仓内同型先例：本表 `mockup-conventions.md#M54`（多断点出稿纪律，被测物是 Figma 帧与交付文本）与 `mockup-conventions.md#M46`（判定对象是动作序列），本条与它们同族同因。⚠️ **如实登记 borderline**：第 ① 条**并非语义上不可机检** —— 「TEXT 节点的 textAlignHorizontal 是不是 LEFT」本身完全可数，它当前不可检只因**没有被测物**（Figma 快照不进仓）。⛔ 别把本行读成「左对齐这件事测不了」。**重开条件**：mockup 快照一旦进仓可扫（或本仓出现任何能吃 live Figma payload 的常驻闸），第 ① 条应从本豁免拆出单独上闸，届时按 S3b（既有闸自陈又挂豁免表 ⇒ 判矛盾）删掉本行。⚠️ 本行**不覆盖**日后在同一 heading 下新增的第 5 条 Acceptance —— S4 子项对位只在闸自陈 `[N]` 时才跑，豁免段无闸即无 `[N]`（该缺口本表 34 条先例共有）。owner 2026-09-14 批准登记（起因：并行 session 的 `4a0dc0e4` 引入 M43.3 ⇒ S2 棘轮 unclassified 35 → 36 变红；⛔ 未抬 BASELINE、⛔ 未动规则正文）。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M23.18",
    "reason": "段级。§M23.18 的 Acceptance 只有一行（下一行即 `##### M23.18.1` 标题），逐字要求「起手 M48 self-check 清单必含一行『本任务 PRD/UX/Journey 卡画布主题探测结果 = light/dark/unknown → 采用 M23.18/navy』」⇒ 被测物是**起手清单里的一句声明**，而 M48 是起手 Gate（`design-process.md:342` §M48 — Startup Rule-Coverage Self-Check），其产物落**起手对话 / Figma 侧** ⇒ **仓库侧零对象**。三条读数（ai-ds-lab 2026-09-15 复核，@`7161df26` 与 @`8b226335` 逐字同结论；判否类 grep ⛔ 未加 head/-m）：① `M48 Rule-Coverage|Rule-Coverage Self-Check` 在 `scripts .husky .gitea` **零命中**，阳性对照同语法查 `handoff-deliverable-sections` **15 行** ⇒ 判定面活着、⛔ 不是路径打错；② `画布主题探测结果` 全仓 `*.md` **只命中规则自己那一行**（本仓 `mockup-conventions.md:1023`）⇒ 没有任何清单 / 模板 / handoff 段承载它；③ `audit:acceptance-gate-coverage --json` 实测该段 `items: 0`（散文一行）。⛔ **别把本行读成「主题探不到」** —— `detectFrameTheme` 的 luma 算法在 payload 侧**可算**且已落成真实现（`scripts/lib/detect-frame-theme.mjs`，54 项单测），够不着的**只是「那句声明有没有写进起手清单」**；判 NMC 的理由是**声明的落点**，⛔ 不是可算性。⚠️ **与两个子号的结构性差别**：`#M23.18.1` / `#M23.18.2` 的 Acceptance **各带一句可机检的后半**（「page 画布不得停留 Figma 默认白」）⇒ 它们 `gated` 是实的；本号只有对话侧那一句。⛔ **为什么不用「造一条 payload 侧主题判据 + 自陈」凑 gated**：本闸 `gated` 纯靠自陈（头注释逐字「⛔ 本闸不判某条 Acceptance 该不该有闸」），两臂实测注入一行自陈 `[0]` 即 `unclassified → gated`，而该段 `Σ核查项 = 0` 使 S4 子项对位**恒过**（`0 === 0`）⇒ **没有任何判据会响** ⇒ 那是假绿（闸绿只说明声明与声明自洽）。**重开条件**：① M48 的 self-check 清单一旦有仓内落盘产物（任何 `.md` / JSON 承载那句声明），本行应拆出单独上闸并按 S3b 删除；或 ② 该 Acceptance 措辞被改成指向一个可扫对象。⚠️ 本行**不覆盖**日后在同一 heading 下新增的 Acceptance 条目（S4 只在闸自陈 `[N]` 时才跑，豁免段无闸即无 `[N]` —— 该缺口本表 35 条先例共有）。owner 2026-09-15 批准登记，逐字选「判 not-machine-checkable」（三条出路摊开：a 判 nmc / b 按 `#Canonical` 先例降级规则 / c 改 Acceptance 措辞）。⚠️ 前史：2026-09-08 ai-ds-lab 已判出同一结论并登记「分支 nmc 属 C4 ⇒ owner」，而 2026-09-09 Q1-d 提问时 owner 的回应是反问「第二个确定有必要做吗」、⛔ 不是批准 ⇒ 该问悬置 7 天，2026-09-15 才拍。⛔ **未动规则正文**：§M23.18 的纪律（不得凭印象跳过探测直接选样式）一字未改，本行只登记「这一条仓库侧测不了」。同批 `BASELINE_UNCLASSIFIED` 34 → 33（只许降、降了就锁住）。读数与两臂全文见 `ai-ds-lab/reports/2026-09-15-l13-m2318-gate-target-recheck.md`。"
  },
  {
    "id": "docs/internal/mockup-conventions.md#M23.20",
    "reason": "段级。M23.20 三条 Acceptance 判的都是**语义**、不是形态：① 「每段都能说出 dev 或 QA 拿它做什么」= 判断一段交付文案对读者有没有产生动作；② 「无推导过程 / 用词取舍理由 / 实测数字充当正文」= 判断一段话是不是设计者的推导；③ 「短句、一条说一件事、无文书腔」= 语体判断。⚠️ **被测物是拿得到的**（Figma 画布上的交付卡文本，audit:mockup-conformance 那套能扫）⇒ ⛔ 不适用本表多数条目那条「结构上无被测物」的理由，如实区分：这里不可机检的原因是**判据本身没有可证伪的形态特征**。以最像可机检的 ② 为例：表面可以正则扫「为什么用…而不是…」「实测 N 字符」这类措辞，但推导类内容的写法无限，正则只抓得到作者预先想得到的那几种；且会**误伤正当用法** —— Acceptance 里写「两帧文案实测 3 行」正是合规验收项，同一串字符在两处语义相反。按 §M-GATE-FALSIFIABILITY「指不出什么输入会让它红 ⇒ 按未覆盖处置、⛔ 不计绿」，这里如实登记为 not-machine-checkable，⛔ 不造一个只会命中自己预设措辞的假闸（那种闸的绿只说明「没写我想到的那几个词」，与本条要管的事无关）。**人跑的兜底**：走查时逐段问「这段 dev 或 QA 拿它做什么」，答不出即删或移走；以及 owner review —— 本条的立规实证正是 owner 两次指出同一问题（2026-08-05「像 AI 读的」、2026-09-15「模仿人类沟通的方式」）。**重开条件**：若日后出现可靠的语义判别手段（如把交付卡文本送 LLM 判读并固化成闸），应拆出单独上闸并按 S3b 从本表删除。owner 2026-09-15 回流本规则时一并批准登记。"
  }
]
