> @ux-team/tvu-design-system@1.2.0 report:gate-output-harvest /Users/nancy/.ai-ds-lab/wt-fault > node scripts/gate-output-harvest.mjs [report:gate-output-harvest] gate-chain 39 步 → 在链闸 36 条 v1 收割面 = 在链 ∩ figma-sync/ = 11 条 · v2 棘轮表 25 条(shrink-only) npm key exit findings checkedUnits unit 判定 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────── audit:icon-fill-currentcolor 0 0 644 icon-entry clean audit:no-hardcoded-design-tokens 0 19 0 source-file ⚠️ empty-denominator audit:component-no-inline-svg 0 0 72 vue-file clean audit:figma-conformance 0 0 0 generated-wrapper-file ⚠️ empty-denominator audit:docs-site 0 9 38 docs-page reported-not-blocked audit:docs-single-theme 0 0 38 docs-page-file clean audit:component-tokens 0 3 8095 token-ref reported-not-blocked audit:tokenized-diff 0 0 685 tokenized-component-file clean audit:design-system 0 0 34 component-file clean audit:published-vs-code 0 0 43 component-mapping-row clean audit:translation-completeness 0 0 26 translation-entry clean 本次收割到 11 条闸,其中 11 条解析出契约块、11 条读出 findings 计数。 ⚠️ 「吐了 JSON」与「读得出计数」不是一回事 —— 上契约前实测 10 条在吐 JSON、只有 4 条读得出计数。 ℹ️ 1 条**具名豁免**的存量异常(打印但不阻断,shrink-only): · audit:figma-conformance [empty-denominator] since 2026-08-24 事实:src/canonical/generated/ 下 0 个 .vue(git ls-files 只有一个 0 字节 index.ts)⇒ 扫描面恒空 修法:待 owner 裁定:该闸退役,还是把扫描面改指向真正在用的 canonical 目录。⛔ 别默认「补分母」——它挂在 prepublishOnly(L5) 上,改指向会改变发布链的判据强度。 ❌ 1 条**新**异常(**报出来而不是吞掉**): - audit:no-hardcoded-design-tokens [empty-denominator] exit 0 · findings=19 · checkedUnits=0 —— 分母是空的,这条读数不可解读(假绿);且 findings>0 与空分母**自相矛盾**:不可能在 0 个单位里找到问题 { "generatedFrom": "package.json#scripts.gate-chain", "contractScope": "v1 = in-chain ∩ figma-sync/", "chainSteps": 39, "prepublishOnlySteps": 39, "chainParseError": null, "inChainGates": 36, "v1FaceSize": 11, "parsedCount": 11, "findingsReadableCount": 11, "anomalies": [ { "npmKey": "audit:no-hardcoded-design-tokens", "verdict": "empty-denominator", "why": "exit 0 · findings=19 · checkedUnits=0 —— 分母是空的,这条读数不可解读(假绿);且 findings>0 与空分母**自相矛盾**:不可能在 0 个单位里找到问题" } ], "excusedAnomalies": [ { "npmKey": "audit:figma-conformance", "verdict": "empty-denominator" } ], "staleAnomalyExemptions": [], "controls": [ { "id": "must-not-hit:report-gate-regression-face", "why": "它是 report: 前缀的量具、不是闸、不在链上。按文件特征扫会把它误收进分母。", "pass": true }, { "id": "must-not-hit:self", "why": "收割器自己不能进收割面(否则递归 + 自证)。", "pass": true }, { "id": "must-hit:tokenized-diff-parsed", "why": "散文前缀 + 末尾 JSON 的形态。旧的 body.startsWith(\"{\") 判据正是漏了它。", "pass": true }, { "id": "must-hit:translation-completeness-parsed", "why": "同上,第二条被旧判据漏掉的。", "pass": true }, { "id": "must-hit:v1-face-is-11", "why": "v1 收割面 = in-chain ∩ figma-sync/。实测 11 条;变了就是链或范围规则动了,要人看一眼。", "pass": true }, { "id": "fail-closed:chain-parses", "why": "步骤面真源解析不出来(key 缺失 / 某步引用了不存在的 npm key)⇒ 判定面塌了,⛔ 不是「链上没有闸」。", "pass": true }, { "id": "fail-closed:in-chain-not-empty", "why": "解析不出任何在链闸 ⇒ 不是「没有闸」,是判据形态变了 / scripts.gate-chain 被改空。", "pass": true } ], "ratchet": { "size": 25, "stale": [], "orphan": [], "unexcused": [] }, "rows": [ { "npmKey": "audit:icon-fill-currentcolor", "script": "figma-sync/audit-icon-fill-currentcolor.mjs", "exitCode": 0, "parsed": true, "auditId": "icon-fill-currentcolor", "findings": 0, "checkedUnits": 644, "checkedUnit": "icon-entry", "validationErrors": [], "trailingAfterJson": "", "verdict": "clean", "anomaly": false, "why": "exit 0 · findings=0 · checkedUnits=644 —— 真通过", "stdoutBytes": 385, "spawnError": null }, { "npmKey": "audit:no-hardcoded-design-tokens", "script": "figma-sync/audit-no-hardcoded-design-tokens.mjs", "exitCode": 0, "parsed": true, "auditId": "no-hardcoded-design-tokens", "findings": 19, "checkedUnits": 0, "checkedUnit": "source-file", "validationErrors": [], "trailingAfterJson": "", "verdict": "empty-denominator", "anomaly": true, "why": "exit 0 · findings=19 · checkedUnits=0 —— 分母是空的,这条读数不可解读(假绿);且 findings>0 与空分母**自相矛盾**:不可能在 0 个单位里找到问题", "stdoutBytes": 6418, "spawnError": null }, { "npmKey": "audit:component-no-inline-svg", "script": "figma-sync/audit-component-no-inline-svg.mjs", "exitCode": 0, "parsed": true, "auditId": "component-no-inline-svg", "findings": 0, "checkedUnits": 72, "checkedUnit": "vue-file", "validationErrors": [], "trailingAfterJson": "", "verdict": "clean", "anomaly": false, "why": "exit 0 · findings=0 · checkedUnits=72 —— 真通过", "stdoutBytes": 239, "spawnError": null }, { "npmKey": "audit:figma-conformance", "script": "figma-sync/audit-figma-conformance.mjs", "exitCode": 0, "parsed": true, "auditId": "figma-conformance", "findings": 0, "checkedUnits": 0, "checkedUnit": "generated-wrapper-file", "validationErrors": [], "trailingAfterJson": "", "verdict": "empty-denominator", "anomaly": true, "why": "exit 0 · findings=0 · checkedUnits=0 —— 分母是空的,这条读数不可解读(假绿)", "stdoutBytes": 864, "spawnError": null }, { "npmKey": "audit:docs-site", "script": "figma-sync/audit-docs-site-readiness.mjs", "exitCode": 0, "parsed": true, "auditId": "docs-site-readiness", "findings": 9, "checkedUnits": 38, "checkedUnit": "docs-page", "validationErrors": [], "trailingAfterJson": "", "verdict": "reported-not-blocked", "anomaly": false, "why": "exit 0 且 findings=9 —— 只报不拦(合法;需登记是哪条闸的设计)", "stdoutBytes": 30907, "spawnError": null }, { "npmKey": "audit:docs-single-theme", "script": "figma-sync/audit-docs-single-theme.mjs", "exitCode": 0, "parsed": true, "auditId": "docs-single-theme", "findings": 0, "checkedUnits": 38, "checkedUnit": "docs-page-file", "validationErrors": [], "trailingAfterJson": "", "verdict": "clean", "anomaly": false, "why": "exit 0 · findings=0 · checkedUnits=38 —— 真通过", "stdoutBytes": 299, "spawnError": null }, { "npmKey": "audit:component-tokens", "script": "figma-sync/audit-component-token-linkage.mjs", "exitCode": 0, "parsed": true, "auditId": "component-token-linkage", "findings": 3, "checkedUnits": 8095, "checkedUnit": "token-ref", "validationErrors": [], "trailingAfterJson": "", "verdict": "reported-not-blocked", "anomaly": false, "why": "exit 0 且 findings=3 —— 只报不拦(合法;需登记是哪条闸的设计)", "stdoutBytes": 12501, "spawnError": null }, { "npmKey": "audit:tokenized-diff", "script": "figma-sync/audit-tokenized-diff.mjs", "exitCode": 0, "parsed": true, "auditId": "tokenized-diff", "findings": 0, "checkedUnits": 685, "checkedUnit": "tokenized-component-file", "validationErrors": [], "trailingAfterJson": "", "verdict": "clean", "anomaly": false, "why": "exit 0 · findings=0 · checkedUnits=685 —— 真通过", "stdoutBytes": 635, "spawnError": null }, { "npmKey": "audit:design-system", "script": "figma-sync/audit-design-system.mjs", "exitCode": 0, "parsed": true, "auditId": "design-system", "findings": 0, "checkedUnits": 34, "checkedUnit": "component-file", "validationErrors": [], "trailingAfterJson": "", "verdict": "clean", "anomaly": false, "why": "exit 0 · findings=0 · checkedUnits=34 —— 真通过", "stdoutBytes": 450, "spawnError": null }, { "npmKey": "audit:published-vs-code", "script": "figma-sync/audit-figma-published-vs-code.mjs", "exitCode": 0, "parsed": true, "auditId": "figma-published-vs-code", "findings": 0, "checkedUnits": 43, "checkedUnit": "component-mapping-row", "validationErrors": [], "trailingAfterJson": "", "verdict": "clean", "anomaly": false, "why": "exit 0 · findings=0 · checkedUnits=43 —— 真通过", "stdoutBytes": 999, "spawnError": null }, { "npmKey": "audit:translation-completeness", "script": "figma-sync/audit-translation-completeness.mjs", "exitCode": 0, "parsed": true, "auditId": "translation-completeness", "findings": 0, "checkedUnits": 26, "checkedUnit": "translation-entry", "validationErrors": [], "trailingAfterJson": "", "verdict": "clean", "anomaly": false, "why": "exit 0 · findings=0 · checkedUnits=26 —— 真通过", "stdoutBytes": 536, "spawnError": null } ] }  ELIFECYCLE  Command failed with exit code 1.