Files
workinf_Blender_Wasm/tools/web/generate-wbv2-transform-receipt.mjs
mes123456 0bd8419ae3
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled
Advance deduplicated transform apply coverage
2026-08-28 18:17:17 +08:00

2 lines
6.8 KiB
JavaScript

import assert from "node:assert/strict";import crypto from "node:crypto";import fs from "node:fs";import path from "node:path";import {execFileSync} from "node:child_process";import {fileURLToPath} from "node:url";const root=path.resolve(path.dirname(fileURLToPath(import.meta.url)),"../..");const abs=f=>path.join(root,f);const read=f=>fs.readFileSync(abs(f),"utf8");const json=f=>JSON.parse(read(f));const sha=f=>crypto.createHash("sha256").update(fs.readFileSync(abs(f))).digest("hex");const out="tests/golden/WBV2-P23-002",parent="tests/golden/WBV2-P23-001/manifest.json",selection="tests/golden/WBV2-P23-001/object-transform-selection-report.json",prod=`${out}/object-transform-production.json`,second=`${out}/object-transform-production.second.json`,report=`${out}/object-transform-receipt-report.json`,plan=`${out}/transform-task-plan.json`,manifest=`${out}/manifest.json`,status="docs/status/WBV2-P23-002.md",api="blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",test="web/tests/e2e/wbv2-object-transform-production.spec.ts",fixture="tests/files/web/basic_scene.blend";const p=json(parent),s=json(selection),x=json(prod),y=json(second);assert.equal(p.status,"done");assert.equal(p.nextTask,"WBV2-P23-002");for(const a of Object.values(p.artifacts??{}))assert.equal(sha(a.path),a.sha256,a.path);assert.equal(s.status,"PASS");assert.equal(s.candidate.legacyId,"operator:object.transform_apply");assert.deepEqual(x,y);assert.equal(x.browser,"chromium");assert.equal(x.fixtureSha256,sha(fixture));assert.equal(x.applyRevision,2);assert.equal(x.undoRevision,3);assert.equal(x.redoRevision,4);assert.notEqual(x.malformed.code,"NO_ERROR");assert.equal(x.malformedRevisionPreserved,true);assert.equal(x.reopenedRevision,1);assert.deepEqual(x.reopenedTransform,x.afterTransform);const r={schemaVersion:1,task:"WBV2-P23-002",operation:"OBJECT_TRANSFORM_APPLY_ENGINE_RECEIPT",status:"PASS",browser:"chromium",queueMutation:false,source:{manifest:parent,manifestSha256:sha(parent),selection,selectionSha256:sha(selection),api,apiSha256:sha(api),test,testSha256:sha(test),fixture,fixtureSha256:sha(fixture)},production:{report:prod,reportSha256:sha(prod),secondReport:second,secondReportSha256:sha(second),deterministic:true,objectId:x.objectId,beforeTransform:x.beforeTransform,afterTransform:x.afterTransform,reopenedTransform:x.reopenedTransform,revisions:[x.baseRevision,x.applyRevision,x.undoRevision,x.redoRevision],malformed:x.malformed,malformedRevisionPreserved:x.malformedRevisionPreserved,reopenedRevision:x.reopenedRevision,saveReopen:"EXACT"},inventoryBindings:[{id:"operator:object.transform_apply",evidence:"applyObjectTransform",exact:true,reason:"bounded protocol command applies and persists object transform"}],assertions:{transformApplied:true,undoRedoSequential:true,malformedRejected:true,mainUnchangedOnMalformed:true,saveReopenExact:true,deterministic:true,inventoryBindingsExact:true,representativeSliceOnly:true,fullFamilyParity:false,historicalReproduction:false},nextTask:"WBV2-P23-003"};if(!process.argv.includes("--write")){console.log("wbv2-transform-receipt-ok task=WBV2-P23-002 binding=operator:object.transform_apply revisions=SEQUENTIAL malformed=REJECTED saveReopen=EXACT deterministic=true next=WBV2-P23-003");process.exit(0)}fs.mkdirSync(abs(out),{recursive:true});fs.writeFileSync(abs(report),`${JSON.stringify(r,null,2)}\n`);fs.writeFileSync(abs(status),`# WBV2-P23-002 status\n\n- task: \`WBV2-P23-002\`; parent: \`WBV2-P23-001\`; status: \`done\`\n- exact inventory binding: \`operator:object.transform_apply\` via \`applyObjectTransform\`\n- object transform persisted; revisions: \`1 -> 4\` sequential\n- malformed transform rejected; save/reopen: \`EXACT\`; deterministic second run: \`true\`\n- effective pending before overlay: \`6610\`; representative slice: \`true\`\n- nextTask: \`WBV2-P23-003\`\n`);const old=json("tests/golden/WBV2-P23-001/transform-task-plan.json"),next=structuredClone(old);next.parentRecoveryPlan={path:"tests/golden/WBV2-P23-001/transform-task-plan.json",sha256:sha("tests/golden/WBV2-P23-001/transform-task-plan.json")};next.tasks=next.tasks.map(t=>t.id==="WBV2-P23-002"?{...t,status:"done",ready:false}:t.id==="WBV2-P23-003"?{...t,status:"in_progress",ready:true}:{...t,ready:false});fs.writeFileSync(abs(plan),`${JSON.stringify(next,null,2)}\n`);fs.writeFileSync(abs("docs/tasks/WBV2-P23-003.md"),read("docs/tasks/WBV2-P23-003.md").replace("- status: planned","- status: in_progress"));execFileSync(process.execPath,[abs("tools/web/generate-v2-task-index.mjs"),"--plan-path",abs(plan)],{cwd:root,stdio:"inherit"});execFileSync(process.execPath,[abs("tools/web/check-task-context.mjs"),"--task","WBV2-P23-002","--write"],{cwd:root,stdio:"inherit"});const paths={parentManifest:parent,selection,api,test,fixture,production:prod,secondProduction:second,report,generator:"tools/web/generate-wbv2-transform-receipt.mjs",status,parityPlan:plan,taskContext:`${out}/task-context.json`};const arts=Object.fromEntries(Object.entries(paths).map(([n,f])=>[n,{path:f,sha256:sha(f)}]));fs.writeFileSync(abs(manifest),`${JSON.stringify({schemaVersion:1,task:"WBV2-P23-002",parentTask:"WBV2-P23-001",operation:"OBJECT_TRANSFORM_APPLY_ENGINE_RECEIPT",status:"done",enablingTask:false,parityStateChange:true,runtime:"PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM",artifacts:arts,assertions:{exactInventoryBindings:1,boundInventoryIds:["operator:object.transform_apply"],transformApplied:true,undoRedoSequential:true,malformedRejected:true,saveReopen:"EXACT",deterministic:true,representativeSliceOnly:true,fullFamilyParity:false,inventoryTotal:6900,baseInventoryPending:6618,effectivePending:6610,historicalReproduction:false},nextTask:"WBV2-P23-003"},null,2)}\n`);let q=read("docs/EXECUTION_QUEUE.md");q=q.replace(/\| 当前任务 \| `[^`]+` \|/u,"| 当前任务 | `WBV2-P23-003` |").replace(/\| parent manifest \| `[^`]+` \|/u,"| parent manifest | `tests/golden/WBV2-P23-002/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u,"| 任务卡 | [`tasks/WBV2-P23-003.md`](tasks/WBV2-P23-003.md) |");fs.writeFileSync(abs("docs/EXECUTION_QUEUE.md"),q);let n=read("nextTask.md");n=n.replace(/\| Current task when this file was written \| `[^`]+` \|/u,"| Current task when this file was written | `WBV2-P23-003` |").replace(/\| Current task state \| `[^`]+` \|/u,"| Current task state | `in_progress` |").replace(/\| Parent manifest \| `[^`]+` \|/u,"| Parent manifest | `tests/golden/WBV2-P23-002/manifest.json` |").replace(/\| Current task card \| `[^`]+` \|/u,"| Current task card | `docs/tasks/WBV2-P23-003.md` |").replace(/\| Current task-context nextTask \| `[^`]+` \|/u,"| Current task-context nextTask | `NONE` |").replace(/\| Focused command \| `[^`]+` \|/u,"| Focused command | `node tools/web/generate-wbv2-transform-gate.mjs --write` |");fs.writeFileSync(abs("nextTask.md"),n);console.log("wbv2-transform-receipt-written task=WBV2-P23-002 binding=operator:object.transform_apply next=WBV2-P23-003");