3 lines
2.5 KiB
JavaScript
3 lines
2.5 KiB
JavaScript
import crypto from "node:crypto"; import fs from "node:fs"; import path from "node:path";
|
|
const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), ".."); const docs = path.join(root, "docs/p6"); const files = { A: "reverseengineering-source-boundary.json", B: "reverseengineering-runtime.json", C: "reverseengineering-kernel.json", D: "reverseengineering-recovery.json", E: "reverseengineering-facade.json", F: "reverseengineering-chrome.json", G: "reverseengineering-persistence.json" }; const read = file => JSON.parse(fs.readFileSync(path.join(docs, file), "utf8")); const hash = file => crypto.createHash("sha256").update(fs.readFileSync(path.join(docs, file))).digest("hex"); const contracts = Object.fromEntries(Object.entries(files).map(([step, file]) => { const value = read(file); return [step, { artifact: `docs/p6/${file}`, result: value.result ?? value.status, sha256: hash(file) }]; })); const result = Object.values(contracts).every(item => item.result === "pass" || item.result === "pass_boundary" || item.result === "completed") ? "pass" : "fail"; const report = { schema: "freecad-web-p6-reverseengineering-gate/v1", taskId: "FW-P6-REV-X", module: "ReverseEngineering", result, sourceRevision: contracts.A.sha256, closedAction: "create/recompute", contracts, moduleStatusAfterGate: "in_progress", coverage: { createRecompute: "pass", inspectSourceInventory: "pending", pythonApi: "pending", saveReopen: "pending" }, boundaries: ["X closes only the ReverseEngineering create/recompute first slice; ACT-02/03/04 are later action contracts.", "ReverseEngineering App has no dedicated persistent DocumentObject; Part::Feature is the explicit geometry result container."] }; fs.writeFileSync(path.join(docs, "reverseengineering-gate.json"), `${JSON.stringify(report, null, 2)}\n`); fs.writeFileSync(path.join(docs, "reverseengineering-gate.md"), `# ReverseEngineering first-slice gate\n\n- Result: \`${result}\`\n- Closed action: \`create/recompute\`\n- ReverseEngineering status after X: \`in_progress\`\n\nA-G evidence closes the native create/recompute action. Inspect/source-inventory, python-api and save/reopen remain later action contracts.\n`); fs.writeFileSync(path.join(root, "docs/freecad-p6-reverseengineering-x-gate.log"), `${JSON.stringify({ result, closedAction: report.closedAction, moduleStatus: report.moduleStatusAfterGate })}\n`); console.log(JSON.stringify({ result, closedAction: report.closedAction, moduleStatus: report.moduleStatusAfterGate })); if (result !== "pass") process.exitCode = 1;
|