{
  "tool": "verify-ds-port",
  "takenAt": "2026-09-03T10:26:55.535Z",
  "verdict": "DS_PORT_PARITY = 逐字段相同（读数 no-op）",
  "env": {
    "node": "v24.15.0",
    "platform": "darwin arm64"
  },
  "subject": {
    "labModules": [
      "probes/detect-frame-theme/detect-frame-theme-tiered.mjs",
      "probes/detect-frame-theme/detect-frame-theme.mjs"
    ],
    "dsModule": "/Users/nancy/Documents/AICoding/VS_Code/tvu-design-system/scripts/lib/detect-frame-theme.mjs",
    "dsModuleSha256": "4b1be734a5418b4550d7287b5a17b03e5c9ac40b32102df606d3fc63fffd4ffc",
    "dsRepoHead": "c8667eb27f10b7f95c98a8e70ee9f8990879fff7",
    "dsRepoBranch": "lab/detect-frame-theme-port"
  },
  "comparedFields": [
    "v1",
    "v3",
    "v3strict",
    "tier",
    "backdropDepth",
    "backdropColor"
  ],
  "notComparedFields": [
    "v2 —— D6.1 那个器未移植进 DS（闸不需要），⛔ 不比是如实"
  ],
  "registeredObservations": [
    "🔴 初版把「合计 > 0」当阴性对照判据 ⇒ H 面 1 行、B 面 0 行的那个臂被判「过」。改为**逐面 × 逐臂 + 结构性分母**三态后当场变红。⇒ 合计口径会让某面的 0 被另一面掩盖。",
    "🔴 撤掉一个臂（「纯白谓词 精确 → 近似 > 0.99」）—— 它在两个面上**结构性分母都是 0**：近白但不恰为纯白的 `fills[0]` 一个都没有。独立佐证 = 两份已发表 scan 自己的 `nearWhiteFills` 字段（冻结扫描器 `countNearWhite` 口径与该臂逐字相同）**均为 0**。⇒ 按「装置在故障存在/不存在时要给出不同读数」，它在这批数据上**不成立为对照**，⛔ 不是「过了」。换成 `luma` g 系数那一臂。",
    "🔴 NC4 分母订正：初版「≥2 个铺满的子节点」过宽（B 面 15 可触发 / 0 咬中）——两个铺满子节点颜色相同时换序不改读数。改为「≥2 个**颜色互不相同**的铺满子层涂层」，并登记该分母只数第 1 层、是**下界** ⇒ H 面 5 咬中 / 4 分母，超出的那 1 个正是靠更深递归换序才分岔的，⛔ 不在下界内，⛔ 不算矛盾。",
    "🔴 NC3 分母订正②：初版只算「判定依据的那个颜色」⇒ 咬中(1920) **超过**分母(748)。成因：`v1` 走 frame 自身 `fills[0]`、`v3/v3strict` 在 T2 档走探到的铺底色，是**两条颜色路径**。改取两条的并集；且该臂不碰分档/探底 ⇒ 并集即穷尽 ⇒ **期望 hits 恰等于 triggerable**（本份实测已相等）。⚠️ 这条是靠「读数不自然（咬中 > 分母）⇒ 先追查再采信」抓到的，⛔ 不是自查清单查出来的。"
  ],
  "totals": {
    "compared": 8481,
    "blocked": 0,
    "labVsPublished": 0,
    "dsVsPublished": 0,
    "dsVsLab": 0
  },
  "controls": {
    "MH-A lab vs 已发表": "🟢 0 差异",
    "MH-B DS 移植 vs 已发表": "🟢 0 差异",
    "MH-B2 DS 移植 vs lab 模块": "🟢 0 差异",
    "MH-C 行数守恒 + 0 blocked": "🟢"
  },
  "negativeControls": [
    {
      "id": "NC1",
      "name": "递归上限 3 → 1",
      "injected": "export const MAX_BACKDROP_DEPTH = 3  ⇒  export const MAX_BACKDROP_DEPTH = 1",
      "perFace": {
        "H": {
          "hits": 17,
          "triggerable": 17,
          "state": "🟢"
        },
        "B": {
          "hits": 5,
          "triggerable": 5,
          "state": "🟢"
        }
      }
    },
    {
      "id": "NC2",
      "name": "上阈值 0.85 → 0.80",
      "injected": "export const LIGHT_THRESHOLD = 0.85  ⇒  export const LIGHT_THRESHOLD = 0.8",
      "perFace": {
        "H": {
          "hits": 1,
          "triggerable": 1,
          "state": "🟢"
        },
        "B": {
          "hits": 0,
          "triggerable": 0,
          "state": "⚪"
        }
      }
    },
    {
      "id": "NC3",
      "name": "luma 的 g 系数 0.587 → 0.299",
      "injected": "const luma = 0.299 * bg.r + 0.587 * bg.g + 0.114 * bg.b  ⇒  const luma = 0.299 * bg.r + 0.299 * bg.g + 0.114 * bg.b",
      "perFace": {
        "H": {
          "hits": 1920,
          "triggerable": 1920,
          "state": "🟢"
        },
        "B": {
          "hits": 643,
          "triggerable": 643,
          "state": "🟢"
        }
      }
    },
    {
      "id": "NC4",
      "name": "画序反向",
      "injected": "for (let i = children.length - 1; i >= 0; i--) {  ⇒  for (let i = 0; i < children.length; i++) {",
      "perFace": {
        "H": {
          "hits": 5,
          "triggerable": 4,
          "state": "🟢"
        },
        "B": {
          "hits": 0,
          "triggerable": 0,
          "state": "⚪"
        }
      }
    },
    {
      "id": "NC5",
      "name": "分档去掉「绑了变量就信它」",
      "injected": "if (!isExactWhite(color) || isFillBound(node, p0)) return 'T1'  ⇒  if (!isExactWhite(color)) return 'T1'",
      "perFace": {
        "H": {
          "hits": 0,
          "triggerable": 0,
          "state": "⚪"
        },
        "B": {
          "hits": 9,
          "triggerable": 9,
          "state": "🟢"
        }
      }
    }
  ],
  "perFace": [
    {
      "face": "H",
      "label": "holdout（D6.2）",
      "publishedRows": 4425,
      "subtreeCacheFiles": 181,
      "compared": 4425,
      "blocked": 0,
      "labVsPublished": 0,
      "dsVsPublished": 0,
      "dsVsLab": 0,
      "perFieldDsVsPublished": {
        "v1": 0,
        "v3": 0,
        "v3strict": 0,
        "tier": 0,
        "backdropDepth": 0,
        "backdropColor": 0
      },
      "negativeControls": {
        "NC1": {
          "hits": 17,
          "triggerable": 17
        },
        "NC2": {
          "hits": 1,
          "triggerable": 1
        },
        "NC3": {
          "hits": 1920,
          "triggerable": 1920
        },
        "NC4": {
          "hits": 5,
          "triggerable": 4
        },
        "NC5": {
          "hits": 0,
          "triggerable": 0
        }
      },
      "liveControls": [
        "NC1",
        "NC2",
        "NC3",
        "NC4"
      ]
    },
    {
      "face": "B",
      "label": "blind（D6.3）",
      "publishedRows": 4056,
      "subtreeCacheFiles": 170,
      "compared": 4056,
      "blocked": 0,
      "labVsPublished": 0,
      "dsVsPublished": 0,
      "dsVsLab": 0,
      "perFieldDsVsPublished": {
        "v1": 0,
        "v3": 0,
        "v3strict": 0,
        "tier": 0,
        "backdropDepth": 0,
        "backdropColor": 0
      },
      "negativeControls": {
        "NC1": {
          "hits": 5,
          "triggerable": 5
        },
        "NC2": {
          "hits": 0,
          "triggerable": 0
        },
        "NC3": {
          "hits": 643,
          "triggerable": 643
        },
        "NC4": {
          "hits": 0,
          "triggerable": 0
        },
        "NC5": {
          "hits": 9,
          "triggerable": 9
        }
      },
      "liveControls": [
        "NC1",
        "NC3",
        "NC5"
      ]
    }
  ],
  "mismatchSamples": {
    "labVsPublished": [],
    "dsVsPublished": []
  },
  "failures": []
}