6 lines
8.9 KiB
JavaScript
6 lines
8.9 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-P18-003",parentPath="tests/golden/WBV2-P18-002/manifest.json",receiptPath="tests/golden/WBV2-P18-002/object-create-receipt-report.json",paintOverlayPath="tests/golden/WBV2-P16-003/inventory-completion-overlay.json",objectOverlayPath="tests/golden/WBV2-P17-003/inventory-completion-overlay.json",selectionPath="tests/golden/WBV2-P18-001/object-create-selection-report.json",basePath="tests/golden/WBV2-P0-002/parity-map.json",reportPath=`${out}/object-create-gate-report.json`,overlayPath=`${out}/inventory-completion-overlay.json`,planPath=`${out}/create-task-plan.json`,manifestPath=`${out}/manifest.json`,statusPath="docs/status/WBV2-P18-003.md";
|
|
const parent=json(parentPath),receipt=json(receiptPath),paint=json(paintOverlayPath),object=json(objectOverlayPath),selection=json(selectionPath),base=json(basePath);assert.equal(parent.status,"done");assert.equal(parent.nextTask,"WBV2-P18-003");for(const a of Object.values(parent.artifacts??{}))assert.equal(sha(a.path),a.sha256,a.path);assert.equal(receipt.status,"PASS");assert.equal(receipt.inventoryBindings[0].id,"operator:object.add");assert.equal(selection.status,"PASS");assert.equal(paint.summary.effectivePending,6616);assert.equal(object.summary.effectivePending,6615);assert.equal(base.summary.pendingLegacyEntries,6618);
|
|
const entries=[...paint.entries,...object.entries,{id:"operator:object.add",capabilityId:"CAP-OBJECT-OPERATIONS",sourceReceipt:receiptPath,sourceReceiptSha256:sha(receiptPath),evidence:"createPrimitive(CUBE)",exact:true,historicalRestoration:false}];const overlay={schemaVersion:1,task:"WBV2-P18-003",operation:"INVENTORY_COMPLETION_OVERLAY",status:"PASS",baseInventory:{path:basePath,sha256:sha(basePath),total:6900,pending:6618},previousOverlays:[{path:paintOverlayPath,sha256:sha(paintOverlayPath),effectiveCompleted:paint.summary.effectiveCompleted,effectivePending:paint.summary.effectivePending},{path:objectOverlayPath,sha256:sha(objectOverlayPath),effectiveCompleted:object.summary.effectiveCompleted,effectivePending:object.summary.effectivePending}],completionEvidence:{receipt:receiptPath,receiptSha256:sha(receiptPath),deterministic:true,chromium:true,wasmMain:true,saveReopen:"EXACT"},entries,summary:{newlyVerifiedEntries:1,effectiveCompleted:285,effectivePending:6614,claimedComplete:4,basePendingPreserved:true,fullFamilyParity:false,historicalReproduction:false}};const gate={schemaVersion:1,task:"WBV2-P18-003",operation:"CLOSE_OBJECT_CREATE_GATE",status:"PASS",decision:{status:"READY_WITH_OBJECT_CREATE_SLICE_AND_INVENTORY_OVERLAY",code:"OBJECT_CREATE_AUTHORIZED_REBASELINE",featureParityClaims:["SCULPT.PAINT_ATTRIBUTES","OBJECT_OPERATIONS.DUPLICATE","OBJECT_OPERATIONS.CREATE"],featureParityClaimCount:3,newFeatureClaim:"OBJECT_OPERATIONS.CREATE",newlyVerifiedInventoryEntries:1,baseInventoryPending:6618,effectivePending:6614,effectiveCompleted:285,claimedCompleteOverlay:4,fullFamilyParity:false,engineBound:true,browser:"chromium",provenanceEpoch:2,releaseScope:"AUTHORIZED_REBASELINE_ONLY",fullHistoricalReproduction:false,inventoryTotal:6900},evidence:{receipt:{path:receiptPath,sha256:sha(receiptPath),bindings:receipt.inventoryBindings},overlay:{path:overlayPath,sha256:"PENDING",entries},previousOverlays:[{path:paintOverlayPath,sha256:sha(paintOverlayPath)},{path:objectOverlayPath,sha256:sha(objectOverlayPath)}],selection:{path:selectionPath,sha256:sha(selectionPath)},baseInventory:{path:basePath,sha256:sha(basePath),pending:base.summary.pendingLegacyEntries}},efficiency:{uniqueBehaviorRuns:4,repeatedBlenderRuns:0,repeatedChromiumRuns:0,duplicateValidationAvoided:true,baseInventoryUntouched:true},coverage:{baseTotal:6900,baseCompleted:281,basePending:6618,overlayCompleted:4,effectiveCompleted:285,effectivePending:6614,remainingObjectOperationsPending:314},negative:{missingReceipt:"REJECTED",receiptHashDrift:"REJECTED",nonChromium:"REJECTED",nonExactSaveReopen:"REJECTED",representativeAsFullFamily:"REJECTED",historicalRestorationClaim:"REJECTED"},policy:{sourceHistoryReadOnly:true,authorizedRebaselineOnly:true,overlayOnlyCompletion:true,baseInventoryPreserved:true,inventoryRemainderExplicit:true,noFalseLocalParity:true,terminalQueuePointer:true},nextTask:null};
|
|
if(!process.argv.includes("--write")){console.log("wbv2-create-gate-ok task=WBV2-P18-003 claims=3 newlyVerified=1 basePending=6618 effectivePending=6614 repeatedRuns=0 terminal=true");process.exit(0)}fs.mkdirSync(abs(out),{recursive:true});fs.writeFileSync(abs(overlayPath),`${JSON.stringify(overlay,null,2)}\n`);gate.evidence.overlay.sha256=sha(overlayPath);fs.writeFileSync(abs(reportPath),`${JSON.stringify(gate,null,2)}\n`);fs.writeFileSync(abs(statusPath),`# WBV2-P18-003 status\n\n- task: \`WBV2-P18-003\`; parent: \`WBV2-P18-002\`; status: \`done\`\n- new feature claim: \`OBJECT_OPERATIONS.CREATE\`; exact binding: \`operator:object.add\`\n- base inventory: \`6900\` total, \`281\` completed, \`6618\` pending\n- cumulative overlay: \`285\` effective completed, \`6614\` effective pending, claimed complete overlay: \`4\`\n- repeated Blender/Chromium validation: \`0\`; unique behavior batches: Paint, Object Duplicate, Object Create\n- provenance epoch: \`2\`; release: \`AUTHORIZED_REBASELINE_ONLY\`; fullHistoricalReproduction: \`false\`\n- nextTask: \`NONE\`\n\nOnly the exact createPrimitive operator is graduated. The canonical inventory remains immutable; effective counts are derived from hash-bound completion overlays.\n`);const previous=json("tests/golden/WBV2-P18-002/create-task-plan.json"),next=structuredClone(previous);next.status="COMPLETED_WITH_OBJECT_CREATE_SLICE";next.parentRecoveryPlan={path:"tests/golden/WBV2-P18-002/create-task-plan.json",sha256:sha("tests/golden/WBV2-P18-002/create-task-plan.json")};next.tasks=next.tasks.map(t=>t.id==="WBV2-P18-003"?{...t,status:"in_progress",ready:true}:{...t,ready:false});fs.writeFileSync(abs(planPath),`${JSON.stringify(next,null,2)}\n`);execFileSync(process.execPath,[abs("tools/web/generate-v2-task-index.mjs"),"--plan-path",abs(planPath)],{cwd:root,stdio:"inherit"});execFileSync(process.execPath,[abs("tools/web/check-task-context.mjs"),"--task","WBV2-P18-003","--write"],{cwd:root,stdio:"inherit"});const paths={parentManifest:parentPath,receipt:receiptPath,selection:selectionPath,paintOverlay:paintOverlayPath,objectOverlay:objectOverlayPath,baseInventory:basePath,overlay:overlayPath,report:reportPath,generator:"tools/web/generate-wbv2-create-gate.mjs",status:statusPath,parityPlan:planPath,taskContext:`${out}/task-context.json`};const artifacts=Object.fromEntries(Object.entries(paths).map(([n,f])=>[n,{path:f,sha256:sha(f)}]));fs.writeFileSync(abs(manifestPath),`${JSON.stringify({schemaVersion:1,task:"WBV2-P18-003",parentTask:"WBV2-P18-002",operation:"CLOSE_OBJECT_CREATE_GATE",status:"done",enablingTask:true,parityStateChange:true,runtime:"READ_ONLY_OBJECT_CREATE_GATE_WITH_COMPLETION_OVERLAY",artifacts,assertions:{totalFeatureClaims:3,newObjectCreateClaims:1,exactInventoryBindings:1,effectiveCompleted:285,effectivePending:6614,baseInventoryCompleted:281,baseInventoryPending:6618,claimedCompleteOverlay:4,uniqueBehaviorRuns:4,repeatedBlenderRuns:0,repeatedChromiumRuns:0,duplicateValidationAvoided:true,baseInventoryUntouched:true,provenanceEpoch:2,authorizedRebaselineOnly:true,fullHistoricalReproduction:false,deterministic:true},nextTask:null},null,2)}\n`);let q=read("docs/EXECUTION_QUEUE.md");q=q.replace(/\| 当前任务 \| `[^`]+` \|/u,"| 当前任务 | `WBV2-P18-003` |").replace(/\| parent manifest \| `[^`]+` \|/u,"| parent manifest | `tests/golden/WBV2-P18-002/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u,"| 任务卡 | [`tasks/WBV2-P18-003.md`](tasks/WBV2-P18-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-P18-003` |").replace(/\| Current task state \| `[^`]+` \|/u,"| Current task state | `done` |").replace(/\| Parent manifest \| `[^`]+` \|/u,"| Parent manifest | `tests/golden/WBV2-P18-002/manifest.json` |").replace(/\| Current task card \| `[^`]+` \|/u,"| Current task card | `docs/tasks/WBV2-P18-003.md` |").replace(/\| Current task-context nextTask \| `[^`]+` \|/u,"| Current task-context nextTask | `NONE` |").replace(/\| Focused command \| `[^`]+` \|/u,"| Focused command | `node tools/web/generate-wbv2-create-gate.mjs --write` |");fs.writeFileSync(abs("nextTask.md"),n);console.log("wbv2-create-gate-written task=WBV2-P18-003 claims=3 newlyVerified=1 basePending=6618 effectivePending=6614 repeatedRuns=0 terminal=true");
|