From c8f8a3235d9320932c0ab19aa81738f65b2b505c Mon Sep 17 00:00:00 2001 From: taherd <183945978+taherdhanera@users.noreply.github.com> Date: Sat, 23 May 2026 03:11:32 +0530 Subject: [PATCH] Add component owner approval guard --- .../README.md | 34 ++ .../demo-video.js | 186 +++++++ .../demo.js | 12 + .../index.js | 338 ++++++++++++ .../package.json | 14 + .../reports/demo.webm | Bin 0 -> 91480 bytes .../reports/reviewer-packet.md | 48 ++ .../reports/summary.json | 490 ++++++++++++++++++ .../reports/summary.svg | 1 + .../requirements-map.md | 15 + .../sample-data.js | 159 ++++++ .../test.js | 50 ++ 12 files changed, 1347 insertions(+) create mode 100644 repository-component-owner-approval-guard/README.md create mode 100644 repository-component-owner-approval-guard/demo-video.js create mode 100644 repository-component-owner-approval-guard/demo.js create mode 100644 repository-component-owner-approval-guard/index.js create mode 100644 repository-component-owner-approval-guard/package.json create mode 100644 repository-component-owner-approval-guard/reports/demo.webm create mode 100644 repository-component-owner-approval-guard/reports/reviewer-packet.md create mode 100644 repository-component-owner-approval-guard/reports/summary.json create mode 100644 repository-component-owner-approval-guard/reports/summary.svg create mode 100644 repository-component-owner-approval-guard/requirements-map.md create mode 100644 repository-component-owner-approval-guard/sample-data.js create mode 100644 repository-component-owner-approval-guard/test.js diff --git a/repository-component-owner-approval-guard/README.md b/repository-component-owner-approval-guard/README.md new file mode 100644 index 00000000..154239f0 --- /dev/null +++ b/repository-component-owner-approval-guard/README.md @@ -0,0 +1,34 @@ +# Repository Component Owner Approval Guard + +Self-contained guard for SCIBASE issue #10. It validates whether merge requests and tagged scientific repository releases have current approval coverage from the required component owners before protected-branch merge. + +The guard focuses on component-owner approval quorum, not merge queue execution, repository release generation, provenance attestation, access review, DOI tombstones, sensitive-artifact scanning, dependency licensing, branch hypothesis lineage, or legal holds. + +## What It Checks + +- Component ownership for `manuscript/`, `data/`, `code/`, `notebooks/`, `protocols/`, `results/`, and `metadata.json` +- Required owner roles per changed component +- Escalation owners for restricted data or protocol changes +- Stale approvals after the latest file change +- Conflicted self-approvals by merge request authors +- Unmapped repository paths without owner policy coverage + +## Commands + +```bash +npm run check +npm test +npm run demo +npm run demo:video +``` + +## Reviewer Artifacts + +`npm run demo` and `npm run demo:video` generate: + +- `reports/summary.json` +- `reports/reviewer-packet.md` +- `reports/summary.svg` +- `reports/demo.webm` + +All data is synthetic and local. The module does not call Git providers, repository hosting APIs, identity systems, storage systems, or external services. diff --git a/repository-component-owner-approval-guard/demo-video.js b/repository-component-owner-approval-guard/demo-video.js new file mode 100644 index 00000000..1f4b7f72 --- /dev/null +++ b/repository-component-owner-approval-guard/demo-video.js @@ -0,0 +1,186 @@ +const fs = require("fs"); +const os = require("os"); +const path = require("path"); +const { execFileSync } = require("child_process"); +const { componentPolicy, mergeRequests } = require("./sample-data"); +const { evaluateRepositoryChanges } = require("./index"); + +const result = evaluateRepositoryChanges({ + mergeRequests, + policy: componentPolicy +}); + +const reportDir = path.join(__dirname, "reports"); +const outputPath = path.join(reportDir, "demo.webm"); + +const browserCandidates = [ + process.env.CHROME_PATH, + "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", + "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", + "C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe", + "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe" +].filter(Boolean); + +function findBrowser() { + const found = browserCandidates.find((candidate) => fs.existsSync(candidate)); + if (!found) { + throw new Error("Chrome or Edge was not found. Set CHROME_PATH to generate reports/demo.webm."); + } + return found; +} + +function fileUrl(filePath) { + return `file:///${filePath.replace(/\\/g, "/")}`; +} + +const html = String.raw` + + + + Repository component owner approval guard demo + + + + +
recording
+ + +`; + +fs.mkdirSync(reportDir, { recursive: true }); + +const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "repository-owner-demo-")); +const htmlPath = path.join(tempDir, "demo.html"); +const profileDir = path.join(tempDir, "profile"); +fs.writeFileSync(htmlPath, html, "utf8"); + +const stdout = execFileSync( + findBrowser(), + [ + "--headless=new", + "--disable-gpu", + "--disable-dev-shm-usage", + "--autoplay-policy=no-user-gesture-required", + "--run-all-compositor-stages-before-draw", + "--virtual-time-budget=7500", + `--user-data-dir=${profileDir}`, + "--dump-dom", + fileUrl(htmlPath) + ], + { encoding: "utf8", maxBuffer: 30 * 1024 * 1024 } +); + +const match = stdout.match(/data:video\/webm;base64,([A-Za-z0-9+/=]+)/); +if (!match) { + throw new Error(`Demo video generation failed. Browser output ended with: ${stdout.slice(-600)}`); +} + +fs.writeFileSync(outputPath, Buffer.from(match[1], "base64")); +console.log(`Generated ${path.relative(process.cwd(), outputPath)}`); \ No newline at end of file diff --git a/repository-component-owner-approval-guard/demo.js b/repository-component-owner-approval-guard/demo.js new file mode 100644 index 00000000..c11e80cc --- /dev/null +++ b/repository-component-owner-approval-guard/demo.js @@ -0,0 +1,12 @@ +const path = require("path"); +const { componentPolicy, mergeRequests } = require("./sample-data"); +const { evaluateRepositoryChanges, writeReports } = require("./index"); + +const result = evaluateRepositoryChanges({ + mergeRequests, + policy: componentPolicy +}); + +writeReports(result, path.join(__dirname, "reports")); + +console.log(JSON.stringify(result.summary, null, 2)); diff --git a/repository-component-owner-approval-guard/index.js b/repository-component-owner-approval-guard/index.js new file mode 100644 index 00000000..958d405d --- /dev/null +++ b/repository-component-owner-approval-guard/index.js @@ -0,0 +1,338 @@ +const fs = require("fs"); +const path = require("path"); + +function normalizePath(filePath) { + return String(filePath || "").replace(/\\/g, "/").replace(/^\/+/, ""); +} + +function matchComponent(filePath, policy) { + const normalized = normalizePath(filePath); + return Object.entries(policy).find(([, rule]) => + rule.paths.some((prefix) => { + const normalizedPrefix = normalizePath(prefix); + return normalized === normalizedPrefix || normalized.startsWith(normalizedPrefix); + }) + ); +} + +function groupChangedComponents(files, policy) { + const groups = new Map(); + + for (const file of files) { + const match = matchComponent(file.path, policy); + const component = match ? match[0] : "unmapped"; + if (!groups.has(component)) { + groups.set(component, []); + } + groups.get(component).push({ + ...file, + path: normalizePath(file.path) + }); + } + + return groups; +} + +function approvalIsFresh(approval, changedAt) { + return new Date(approval.approvedAt).getTime() >= new Date(changedAt).getTime(); +} + +function approvalsForComponent(approvals, component) { + return approvals.filter((approval) => approval.components.includes(component)); +} + +function requiredRolesForComponent(component, files, policy) { + const rule = policy[component]; + if (!rule) { + return ["repository-curator"]; + } + + const roles = new Set(rule.owners); + if (files.some((file) => file.restricted) && rule.restrictedOwners) { + for (const owner of rule.restrictedOwners) { + roles.add(owner); + } + } + + return [...roles]; +} + +function requiredEscalationRolesForComponent(component, files, policy) { + const rule = policy[component]; + if (!rule || !rule.restrictedOwners) { + return []; + } + + if (!files.some((file) => file.restricted)) { + return []; + } + + return rule.restrictedOwners; +} + +function evaluateComponent({ component, files, request, policy }) { + const rule = policy[component] || { quorum: 1 }; + const requiredRoles = requiredRolesForComponent(component, files, policy); + const requiredEscalationRoles = requiredEscalationRolesForComponent(component, files, policy); + const scopedApprovals = approvalsForComponent(request.approvals, component); + const freshApprovals = scopedApprovals.filter((approval) => + approvalIsFresh(approval, request.changedAt) + ); + const eligibleApprovals = freshApprovals.filter((approval) => + requiredRoles.includes(approval.role) && !request.authors.includes(approval.user) + ); + + const findings = []; + const approvedRoles = new Set(eligibleApprovals.map((approval) => approval.role)); + const missingEscalationRoles = requiredEscalationRoles.filter((role) => !approvedRoles.has(role)); + const staleApprovals = scopedApprovals.filter( + (approval) => !approvalIsFresh(approval, request.changedAt) + ); + const selfApprovals = scopedApprovals.filter((approval) => + request.authors.includes(approval.user) + ); + const outOfScopeApprovals = scopedApprovals.filter( + (approval) => !requiredRoles.includes(approval.role) + ); + + if (component === "unmapped") { + findings.push({ + severity: "critical", + code: "unmapped-component-change", + message: "Changed files do not map to an owned repository component.", + files: files.map((file) => file.path) + }); + } + + if (eligibleApprovals.length < rule.quorum) { + findings.push({ + severity: "critical", + code: "approval-quorum-missing", + message: `${component} requires ${rule.quorum} eligible owner approval(s).`, + requiredRoles, + eligibleRoles: [...approvedRoles] + }); + } + + if (missingEscalationRoles.length > 0) { + findings.push({ + severity: "critical", + code: "required-owner-role-missing", + message: `${component} is missing restricted-change escalation owner approval(s).`, + missingRoles: missingEscalationRoles + }); + } + + if (staleApprovals.length > 0) { + findings.push({ + severity: "critical", + code: "stale-approval-after-change", + message: `${component} has approval(s) older than the latest changed file timestamp.`, + approvals: staleApprovals.map((approval) => ({ + user: approval.user, + role: approval.role, + approvedAt: approval.approvedAt + })) + }); + } + + if (selfApprovals.length > 0) { + findings.push({ + severity: "critical", + code: "conflicted-self-approval", + message: `${component} includes approval from a merge request author.`, + approvals: selfApprovals.map((approval) => ({ + user: approval.user, + role: approval.role + })) + }); + } + + if (outOfScopeApprovals.length > 0) { + findings.push({ + severity: "warning", + code: "owner-role-out-of-scope", + message: `${component} includes approval role(s) that do not satisfy this component policy.`, + approvals: outOfScopeApprovals.map((approval) => ({ + user: approval.user, + role: approval.role + })) + }); + } + + return { + component, + files: files.map((file) => file.path), + restricted: files.some((file) => file.restricted), + requiredRoles, + eligibleApprovals: eligibleApprovals.map((approval) => ({ + user: approval.user, + role: approval.role, + approvedAt: approval.approvedAt + })), + findings + }; +} + +function decisionForFindings(findings) { + if (findings.some((finding) => finding.severity === "critical")) { + return "block-merge"; + } + if (findings.some((finding) => finding.severity === "warning")) { + return "require-owner-review"; + } + return "approve-merge"; +} + +function scoreFindings(findings) { + const penalties = findings.reduce((total, finding) => { + if (finding.severity === "critical") { + return total + 30; + } + if (finding.severity === "warning") { + return total + 12; + } + return total + 4; + }, 0); + return Math.max(0, 100 - penalties); +} + +function evaluateMergeRequest(request, policy) { + const groups = groupChangedComponents(request.files, policy); + const components = [...groups.entries()].map(([component, files]) => + evaluateComponent({ component, files, request, policy }) + ); + const findings = components.flatMap((component) => component.findings); + + return { + id: request.id, + title: request.title, + authors: request.authors, + changedAt: request.changedAt, + touchedComponents: components.map((component) => component.component), + decision: decisionForFindings(findings), + score: scoreFindings(findings), + components, + findings + }; +} + +function summarizeEvaluations(evaluations) { + const decisions = evaluations.reduce((summary, evaluation) => { + summary[evaluation.decision] = (summary[evaluation.decision] || 0) + 1; + return summary; + }, {}); + + const findingCounts = evaluations + .flatMap((evaluation) => evaluation.findings) + .reduce((counts, finding) => { + counts[finding.code] = (counts[finding.code] || 0) + 1; + return counts; + }, {}); + + return { + totalMergeRequests: evaluations.length, + decisions, + findingCounts, + blocked: evaluations + .filter((evaluation) => evaluation.decision === "block-merge") + .map((evaluation) => evaluation.id), + approved: evaluations + .filter((evaluation) => evaluation.decision === "approve-merge") + .map((evaluation) => evaluation.id) + }; +} + +function evaluateRepositoryChanges({ mergeRequests, policy }) { + const evaluations = mergeRequests.map((request) => evaluateMergeRequest(request, policy)); + return { + generatedAt: new Date("2026-05-22T19:30:00Z").toISOString(), + guard: "repository-component-owner-approval-guard", + summary: summarizeEvaluations(evaluations), + evaluations + }; +} + +function renderMarkdownReport(result) { + const lines = [ + "# Repository Component Owner Approval Guard", + "", + `Generated: ${result.generatedAt}`, + "", + "## Summary", + "", + `- Total merge requests: ${result.summary.totalMergeRequests}`, + `- Approved: ${result.summary.decisions["approve-merge"] || 0}`, + `- Require owner review: ${result.summary.decisions["require-owner-review"] || 0}`, + `- Blocked: ${result.summary.decisions["block-merge"] || 0}`, + "", + "## Merge Request Decisions", + "" + ]; + + for (const evaluation of result.evaluations) { + lines.push(`### ${evaluation.id}: ${evaluation.title}`); + lines.push(""); + lines.push(`- Decision: ${evaluation.decision}`); + lines.push(`- Score: ${evaluation.score}`); + lines.push(`- Components: ${evaluation.touchedComponents.join(", ")}`); + + if (evaluation.findings.length === 0) { + lines.push("- Findings: none"); + } else { + lines.push("- Findings:"); + for (const finding of evaluation.findings) { + lines.push(` - ${finding.severity}: ${finding.code} - ${finding.message}`); + } + } + lines.push(""); + } + + return `${lines.join("\n").trimEnd()}\n`; +} + +function renderSvgSummary(result) { + const approved = result.summary.decisions["approve-merge"] || 0; + const review = result.summary.decisions["require-owner-review"] || 0; + const blocked = result.summary.decisions["block-merge"] || 0; + + return [ + '', + '', + '', + 'Repository Component Owner Approval Guard', + 'Protected-branch owner quorum check for scientific repository changes', + metricBlock(70, 175, "Approved", approved, "#1f7a4d"), + metricBlock(350, 175, "Needs Review", review, "#a15c00"), + metricBlock(630, 175, "Blocked", blocked, "#b42318"), + 'Findings: stale approvals, conflicted self-approvals, missing restricted-data owners, and unmapped component changes.', + "" + ].join(""); +} + +function metricBlock(x, y, label, value, color) { + return [ + ``, + `${label}`, + `${value}` + ].join(""); +} + +function writeReports(result, outputDir) { + fs.mkdirSync(outputDir, { recursive: true }); + fs.writeFileSync(path.join(outputDir, "summary.json"), `${JSON.stringify(result, null, 2)}\n`); + fs.writeFileSync(path.join(outputDir, "reviewer-packet.md"), renderMarkdownReport(result)); + fs.writeFileSync(path.join(outputDir, "summary.svg"), renderSvgSummary(result)); +} + +module.exports = { + evaluateMergeRequest, + evaluateRepositoryChanges, + groupChangedComponents, + matchComponent, + normalizePath, + renderMarkdownReport, + renderSvgSummary, + requiredRolesForComponent, + writeReports +}; diff --git a/repository-component-owner-approval-guard/package.json b/repository-component-owner-approval-guard/package.json new file mode 100644 index 00000000..673d771c --- /dev/null +++ b/repository-component-owner-approval-guard/package.json @@ -0,0 +1,14 @@ +{ + "name": "repository-component-owner-approval-guard", + "version": "1.0.0", + "private": true, + "description": "Component-owner approval quorum guard for scientific project repository changes.", + "main": "index.js", + "scripts": { + "check": "node --check index.js && node --check sample-data.js && node --check test.js && node --check demo.js && node --check demo-video.js", + "test": "node test.js", + "demo": "node demo.js", + "demo:video": "node demo-video.js" + }, + "license": "MIT" +} diff --git a/repository-component-owner-approval-guard/reports/demo.webm b/repository-component-owner-approval-guard/reports/demo.webm new file mode 100644 index 0000000000000000000000000000000000000000..bcf2b5f709af75d0e9bc4eb66b3db7f46aa491fe GIT binary patch literal 91480 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 Component Owner Approval GuardProtected-branch owner quorum check for scientific repository changesApproved2Needs Review0Blocked2Findings: stale approvals, conflicted self-approvals, missing restricted-data owners, and unmapped component changes. \ No newline at end of file diff --git a/repository-component-owner-approval-guard/requirements-map.md b/repository-component-owner-approval-guard/requirements-map.md new file mode 100644 index 00000000..14e05f31 --- /dev/null +++ b/repository-component-owner-approval-guard/requirements-map.md @@ -0,0 +1,15 @@ +# Requirements Map + +## Issue #10 Requirement Coverage + +- Repository structure and components: maps component owners across `manuscript/`, `data/`, `code/`, `notebooks/`, `protocols/`, `results/`, and `metadata.json`. +- File and metadata versioning: blocks stale approvals when changed files move after review. +- Collaboration and merge requests: evaluates merge request approval quorum before protected-branch merge. +- Provenance tracking: records which owner roles approved each component and why a merge is blocked. +- In-browser editors and diffs: treats changed paths as editor/diff outputs that need owner coverage. +- Computation-aware reproducibility: checks code, notebook, and result owners for reproducibility-sensitive changes. +- Repository identifiers and citation: requires metadata owner approval for `metadata.json` citation/version changes. + +## Non-Overlap Statement + +This slice is limited to component-owner approval quorum and owner freshness. It does not implement the existing repository ledger, release engine, structured diff/rollback, provenance attestation, release embargo, notebook replay, schema migration, citation impact, API/export verifier, merge queue, environment drift, access review, DOI tombstone, metadata readiness, branch hypothesis lineage, sensitive-artifact, dependency-license, or legal-hold slices. diff --git a/repository-component-owner-approval-guard/sample-data.js b/repository-component-owner-approval-guard/sample-data.js new file mode 100644 index 00000000..b022570b --- /dev/null +++ b/repository-component-owner-approval-guard/sample-data.js @@ -0,0 +1,159 @@ +const componentPolicy = { + manuscript: { + paths: ["manuscript/"], + owners: ["scientific-editor", "corresponding-author"], + quorum: 1 + }, + data: { + paths: ["data/"], + owners: ["data-steward", "privacy-reviewer"], + quorum: 1, + restrictedOwners: ["privacy-reviewer", "irb-liaison"] + }, + code: { + paths: ["code/"], + owners: ["analysis-lead", "reproducibility-engineer"], + quorum: 1 + }, + notebooks: { + paths: ["notebooks/"], + owners: ["analysis-lead", "reproducibility-engineer"], + quorum: 1 + }, + protocols: { + paths: ["protocols/"], + owners: ["protocol-owner", "lab-manager"], + quorum: 1, + restrictedOwners: ["protocol-owner", "irb-liaison"] + }, + results: { + paths: ["results/"], + owners: ["analysis-lead", "scientific-editor"], + quorum: 1 + }, + metadata: { + paths: ["metadata.json"], + owners: ["repository-curator", "corresponding-author"], + quorum: 1 + } +}; + +const mergeRequests = [ + { + id: "MR-2401", + title: "Refresh methods text and analysis notebook", + authors: ["lee"], + changedAt: "2026-05-22T09:20:00Z", + files: [ + { path: "manuscript/methods.md", changeType: "modify" }, + { path: "notebooks/analysis.ipynb", changeType: "modify" }, + { path: "results/figure-2.svg", changeType: "add" } + ], + approvals: [ + { + user: "mira", + role: "scientific-editor", + components: ["manuscript", "results"], + approvedAt: "2026-05-22T09:52:00Z" + }, + { + user: "arun", + role: "analysis-lead", + components: ["notebooks", "results"], + approvedAt: "2026-05-22T10:04:00Z" + } + ] + }, + { + id: "MR-2417", + title: "Publish restricted participant table with updated protocol", + authors: ["tess"], + changedAt: "2026-05-22T11:45:00Z", + files: [ + { path: "data/participant_export.csv", changeType: "add", restricted: true }, + { path: "protocols/collection-plan.md", changeType: "modify", restricted: true }, + { path: "metadata.json", changeType: "modify" } + ], + approvals: [ + { + user: "noor", + role: "data-steward", + components: ["data"], + approvedAt: "2026-05-22T12:01:00Z" + }, + { + user: "tess", + role: "protocol-owner", + components: ["protocols"], + approvedAt: "2026-05-22T12:04:00Z" + }, + { + user: "ivy", + role: "repository-curator", + components: ["metadata"], + approvedAt: "2026-05-22T12:08:00Z" + } + ] + }, + { + id: "MR-2422", + title: "Retag code package after model output changes", + authors: ["omar"], + changedAt: "2026-05-22T15:35:00Z", + files: [ + { path: "code/model/train.py", changeType: "modify" }, + { path: "results/model-card.md", changeType: "modify" }, + { path: "metadata.json", changeType: "modify" } + ], + approvals: [ + { + user: "arun", + role: "analysis-lead", + components: ["code", "results"], + approvedAt: "2026-05-22T14:58:00Z" + }, + { + user: "ivy", + role: "repository-curator", + components: ["metadata"], + approvedAt: "2026-05-22T16:00:00Z" + } + ] + }, + { + id: "MR-2430", + title: "Release curated dataset and citation metadata", + authors: ["nina"], + changedAt: "2026-05-22T17:00:00Z", + files: [ + { path: "data/curated-measurements.parquet", changeType: "add" }, + { path: "metadata.json", changeType: "modify" }, + { path: "manuscript/data-availability.md", changeType: "modify" } + ], + approvals: [ + { + user: "noor", + role: "data-steward", + components: ["data"], + approvedAt: "2026-05-22T17:10:00Z" + }, + { + user: "ivy", + role: "repository-curator", + components: ["metadata"], + approvedAt: "2026-05-22T17:15:00Z" + }, + { + user: "mira", + role: "scientific-editor", + components: ["manuscript"], + approvedAt: "2026-05-22T17:18:00Z" + } + ] + } +]; + +module.exports = { + componentPolicy, + mergeRequests +}; diff --git a/repository-component-owner-approval-guard/test.js b/repository-component-owner-approval-guard/test.js new file mode 100644 index 00000000..4ec5a7b0 --- /dev/null +++ b/repository-component-owner-approval-guard/test.js @@ -0,0 +1,50 @@ +const assert = require("assert"); +const { componentPolicy, mergeRequests } = require("./sample-data"); +const { + evaluateMergeRequest, + evaluateRepositoryChanges, + matchComponent, + requiredRolesForComponent +} = require("./index"); + +function codes(evaluation) { + return evaluation.findings.map((finding) => finding.code); +} + +assert.strictEqual(matchComponent("metadata.json", componentPolicy)[0], "metadata"); +assert.strictEqual(matchComponent("notebooks/run.ipynb", componentPolicy)[0], "notebooks"); + +assert.deepStrictEqual( + requiredRolesForComponent( + "data", + [{ path: "data/raw.csv", restricted: true }], + componentPolicy + ), + ["data-steward", "privacy-reviewer", "irb-liaison"] +); + +const clean = evaluateMergeRequest(mergeRequests[0], componentPolicy); +assert.strictEqual(clean.decision, "approve-merge"); +assert.strictEqual(clean.findings.length, 0); + +const restricted = evaluateMergeRequest(mergeRequests[1], componentPolicy); +assert.strictEqual(restricted.decision, "block-merge"); +assert.ok(codes(restricted).includes("required-owner-role-missing")); +assert.ok(codes(restricted).includes("conflicted-self-approval")); + +const stale = evaluateMergeRequest(mergeRequests[2], componentPolicy); +assert.strictEqual(stale.decision, "block-merge"); +assert.ok(codes(stale).includes("stale-approval-after-change")); + +const release = evaluateMergeRequest(mergeRequests[3], componentPolicy); +assert.strictEqual(release.decision, "approve-merge"); + +const result = evaluateRepositoryChanges({ + mergeRequests, + policy: componentPolicy +}); +assert.strictEqual(result.summary.totalMergeRequests, 4); +assert.deepStrictEqual(result.summary.blocked.sort(), ["MR-2417", "MR-2422"]); +assert.deepStrictEqual(result.summary.approved.sort(), ["MR-2401", "MR-2430"]); + +console.log("repository-component-owner-approval-guard tests passed");