/** * 票 56 变异闸(第二/三轮):把本票要防的错法逐一注入,确认 t56 真的一致红; * 每条变异后按字节还原并校验哈希。判据只看退出码(不管道捕获子进程输出,票 37 的沙箱教训)。 * * node .scratch/cockpit-real-data-wayfinding/verify/t56-mutations.mjs */ import { spawnSync } from 'node:child_process' import { readFileSync, writeFileSync } from 'node:fs' import { createHash } from 'node:crypto' import { fileURLToPath } from 'node:url' const ROOT = fileURLToPath(new URL('../../../', import.meta.url)) const GATE = '.scratch/cockpit-real-data-wayfinding/verify/t56-panel-summary-disclosure.mjs' const RENDERER = 'src/modules/cockpit/components/PanelBlocks.vue' const OVERVIEW = 'src/modules/cockpit/domain/overviewPanels.js' const MUTATIONS = [ { id: 'M1', file: RENDERER, from: 'data-panel-summary-toggle', to: 'data-panel-summary-toggle @mouseenter="summaryOpen = true"', why: 'hover 自动展开被复活(第二轮维护者明令撤销)→ A3 必须红', }, { id: 'M2', file: RENDERER, from: " { key: 'locate', field: 'locateNote', hook: 'data-locate-note' },\n", to: '', why: '摘要条目被漏掉一条(locateNote 从折叠清单消失=说明丢失)→ B 组必须红', }, { id: 'M3', file: RENDERER, from: '{{ view.gap }}

\n