From baa91124d55007b0a8af4eaa27346120fe4b9ea5 Mon Sep 17 00:00:00 2001 From: taherd <183945978+taherdhanera@users.noreply.github.com> Date: Fri, 22 May 2026 23:40:03 +0530 Subject: [PATCH] Add geospatial sample provenance guard --- geospatial-sample-provenance-guard/README.md | 38 +++ .../demo-video.js | 173 ++++++++++ geospatial-sample-provenance-guard/demo.js | 18 + geospatial-sample-provenance-guard/index.js | 307 ++++++++++++++++++ .../package.json | 14 + .../reports/demo.webm | Bin 0 -> 76921 bytes .../reports/reviewer-packet.md | 46 +++ .../reports/summary.json | 158 +++++++++ .../reports/summary.svg | 16 + .../requirements-map.md | 18 + .../sample-data.js | 85 +++++ geospatial-sample-provenance-guard/test.js | 90 +++++ 12 files changed, 963 insertions(+) create mode 100644 geospatial-sample-provenance-guard/README.md create mode 100644 geospatial-sample-provenance-guard/demo-video.js create mode 100644 geospatial-sample-provenance-guard/demo.js create mode 100644 geospatial-sample-provenance-guard/index.js create mode 100644 geospatial-sample-provenance-guard/package.json create mode 100644 geospatial-sample-provenance-guard/reports/demo.webm create mode 100644 geospatial-sample-provenance-guard/reports/reviewer-packet.md create mode 100644 geospatial-sample-provenance-guard/reports/summary.json create mode 100644 geospatial-sample-provenance-guard/reports/summary.svg create mode 100644 geospatial-sample-provenance-guard/requirements-map.md create mode 100644 geospatial-sample-provenance-guard/sample-data.js create mode 100644 geospatial-sample-provenance-guard/test.js diff --git a/geospatial-sample-provenance-guard/README.md b/geospatial-sample-provenance-guard/README.md new file mode 100644 index 00000000..de436433 --- /dev/null +++ b/geospatial-sample-provenance-guard/README.md @@ -0,0 +1,38 @@ +# Geospatial Sample Provenance Guard + +Self-contained Scientific Knowledge Graph Integration slice for +`SCIBASE-AI/SCIBASE.AI#17`. + +The guard evaluates field-sample and specimen location graph edges before they +appear on entity pages or public discovery recommendations. It checks coordinate +ranges, CRS normalization, country/coordinate consistency, coordinate precision, +sensitive-site redaction, voucher identifiers, dataset DOI resolution, +collection-date plausibility, and sample-to-dataset edge alignment. + +This is intentionally separate from broad graph extraction/navigation, link +audit, ontology drift/alias/synonym controls, relationship conflict arbitration, +author-affiliation disambiguation, artifact lineage, evidence freshness, +instrument-method compatibility, reproducibility routes, recommendation +visibility/diversity, negative-result replication, measurement harmonization, +claim qualifier, ethics provenance, funder award lineage, clinical trial +registry, and software/runtime compatibility slices. + +## Run + +```bash +npm run check +npm test +npm run demo +npm run demo:video +``` + +## Outputs + +- `reports/summary.json` +- `reports/reviewer-packet.md` +- `reports/summary.svg` +- `reports/demo.webm` + +All data is synthetic. The module does not call geocoders, repositories, GIS +systems, ontology services, specimen registries, journal systems, or external +APIs. diff --git a/geospatial-sample-provenance-guard/demo-video.js b/geospatial-sample-provenance-guard/demo-video.js new file mode 100644 index 00000000..fa05eb47 --- /dev/null +++ b/geospatial-sample-provenance-guard/demo-video.js @@ -0,0 +1,173 @@ +const fs = require("fs"); +const os = require("os"); +const path = require("path"); +const { execFileSync } = require("child_process"); + +const reportDir = path.join(__dirname, "reports"); +const outputPath = path.join(reportDir, "demo.webm"); + +const chromeCandidates = [ + 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 = chromeCandidates.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` + + + + Geospatial sample provenance guard demo + + + + +
recording
+ + +`; + +fs.mkdirSync(reportDir, { recursive: true }); + +const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "geospatial-provenance-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)}`); diff --git a/geospatial-sample-provenance-guard/demo.js b/geospatial-sample-provenance-guard/demo.js new file mode 100644 index 00000000..97c3730c --- /dev/null +++ b/geospatial-sample-provenance-guard/demo.js @@ -0,0 +1,18 @@ +const fs = require("fs"); +const path = require("path"); +const { project } = require("./sample-data"); +const { buildReviewPacket, renderMarkdownReport, renderSvgSummary } = require("./index"); + +const reportDir = path.join(__dirname, "reports"); +fs.mkdirSync(reportDir, { recursive: true }); + +const packet = buildReviewPacket(project); + +fs.writeFileSync(path.join(reportDir, "summary.json"), `${JSON.stringify(packet, null, 2)}\n`, "utf8"); +fs.writeFileSync(path.join(reportDir, "reviewer-packet.md"), renderMarkdownReport(packet), "utf8"); +fs.writeFileSync(path.join(reportDir, "summary.svg"), renderSvgSummary(packet), "utf8"); + +console.log(`Generated reports for ${packet.guard}`); +console.log(`Decision: ${packet.decision}`); +console.log(`Score: ${packet.score}`); +console.log(`Findings: ${packet.findings.length}`); diff --git a/geospatial-sample-provenance-guard/index.js b/geospatial-sample-provenance-guard/index.js new file mode 100644 index 00000000..09c037da --- /dev/null +++ b/geospatial-sample-provenance-guard/index.js @@ -0,0 +1,307 @@ +const SEVERITY_WEIGHTS = { + critical: 34, + high: 22, + medium: 10, + low: 4 +}; + +function addFinding(findings, severity, rule, message, action, refs = []) { + findings.push({ severity, rule, message, action, refs }); +} + +function daysBetween(a, b) { + const left = new Date(a).getTime(); + const right = new Date(b).getTime(); + return Math.floor((right - left) / (24 * 60 * 60 * 1000)); +} + +function datasetByDoi(project) { + return new Map(project.datasets.map((dataset) => [dataset.doi, dataset])); +} + +function datasetById(project) { + return new Map(project.datasets.map((dataset) => [dataset.id, dataset])); +} + +function sampleById(project) { + return new Map(project.samples.map((sample) => [sample.id, sample])); +} + +function coordinatesInRange(sample) { + return ( + Number.isFinite(sample.latitude) && + Number.isFinite(sample.longitude) && + sample.latitude >= -90 && + sample.latitude <= 90 && + sample.longitude >= -180 && + sample.longitude <= 180 + ); +} + +function countryBoundsMatch(project, sample) { + const bounds = project.policy.acceptedCountryBounds[sample.country]; + if (!bounds || !coordinatesInRange(sample)) { + return true; + } + return ( + sample.latitude >= bounds.minLat && + sample.latitude <= bounds.maxLat && + sample.longitude >= bounds.minLon && + sample.longitude <= bounds.maxLon + ); +} + +function evaluateSample(sample, project, datasetIndex, findings) { + if (!coordinatesInRange(sample)) { + addFinding( + findings, + "critical", + "coordinate-range-invalid", + `${sample.id} has coordinates outside valid latitude/longitude ranges.`, + "Suppress the sample node and repair coordinates before graph publication.", + [sample.id] + ); + } + + if (sample.crs !== project.policy.requiredCrs) { + addFinding( + findings, + "high", + "coordinate-crs-not-normalized", + `${sample.id} uses ${sample.crs}, not ${project.policy.requiredCrs}.`, + "Normalize coordinates to the graph CRS before entity pages or recommendations are shown.", + [sample.id, sample.crs] + ); + } + + if (!countryBoundsMatch(project, sample)) { + addFinding( + findings, + "high", + "country-coordinate-mismatch", + `${sample.id} coordinates do not fall inside the expected ${sample.country} bounds.`, + "Hold location-derived graph edges until country and coordinate provenance are reconciled.", + [sample.id, sample.country] + ); + } + + const sensitiveLabels = sample.labels.filter((label) => project.policy.sensitiveLabels.includes(label)); + if (sensitiveLabels.length > 0 && sample.precisionDecimals > project.policy.maxPublicPrecisionDecimals) { + addFinding( + findings, + "critical", + "sensitive-site-overprecise-public-coordinate", + `${sample.id} exposes ${sample.precisionDecimals} decimal coordinates for ${sensitiveLabels.join(", ")}.`, + "Round or redact the location before public discovery recommendations are enabled.", + [sample.id, ...sensitiveLabels] + ); + } + + if (!sample.voucherId) { + addFinding( + findings, + "high", + "sample-voucher-missing", + `${sample.id} has no specimen or field voucher identifier.`, + "Attach a voucher/specimen accession before the sample appears in entity pages.", + [sample.id] + ); + } + + if (!datasetIndex.has(sample.datasetDoi)) { + addFinding( + findings, + "high", + "sample-dataset-doi-unresolved", + `${sample.id} references unresolved dataset DOI ${sample.datasetDoi}.`, + "Repair DOI alignment before graph edges are emitted.", + [sample.id, sample.datasetDoi] + ); + } + + if (daysBetween(project.asOfDate, sample.collectionDate) > project.policy.maxCollectionFutureDays) { + addFinding( + findings, + "medium", + "collection-date-in-future", + `${sample.id} collection date ${sample.collectionDate} is after the graph packet date.`, + "Hold temporal graph edges until the collection date is corrected or the packet date advances.", + [sample.id, sample.collectionDate] + ); + } + + if (project.policy.publicRecommendationRequiresDatasetDoi && sample.publicRecommendation && !sample.datasetDoi) { + addFinding( + findings, + "high", + "public-recommendation-without-dataset-doi", + `${sample.id} is eligible for public recommendations without a dataset DOI.`, + "Disable public discovery for the sample until dataset DOI provenance is present.", + [sample.id] + ); + } +} + +function evaluateEdges(project, findings) { + const samples = sampleById(project); + const datasets = datasetById(project); + const sampleDatasetDoi = datasetByDoi(project); + + for (const edge of project.edges) { + const sample = samples.get(edge.from); + const dataset = datasets.get(edge.to); + if (!sample || !dataset) { + addFinding( + findings, + "critical", + "graph-edge-endpoint-missing", + `${edge.id} references a missing sample or dataset node.`, + "Drop the edge until both graph endpoints exist.", + [edge.id, edge.from, edge.to] + ); + continue; + } + + const declaredDataset = sampleDatasetDoi.get(sample.datasetDoi); + if (!declaredDataset || declaredDataset.id !== dataset.id) { + addFinding( + findings, + "high", + "sample-dataset-edge-doi-mismatch", + `${edge.id} links ${sample.id} to ${dataset.id}, but the sample declares ${sample.datasetDoi}.`, + "Rebuild the graph edge from DOI-resolved dataset metadata.", + [edge.id, sample.id, dataset.id] + ); + } + } +} + +function evaluateGeospatialProvenance(project) { + const findings = []; + const datasets = datasetByDoi(project); + + for (const sample of project.samples) { + evaluateSample(sample, project, datasets, findings); + } + evaluateEdges(project, findings); + + const severitySummary = findings.reduce( + (summary, finding) => { + summary[finding.severity] += 1; + return summary; + }, + { critical: 0, high: 0, medium: 0, low: 0 } + ); + const score = Math.max(0, 100 - findings.reduce((sum, finding) => sum + SEVERITY_WEIGHTS[finding.severity], 0)); + + return { findings, severitySummary, score }; +} + +function decisionFromEvaluation(evaluation) { + if (evaluation.severitySummary.critical > 0) { + return "block-geospatial-graph-publication"; + } + if (evaluation.severitySummary.high > 0 || evaluation.score < 75) { + return "hold-geospatial-edges-for-curator-review"; + } + if (evaluation.score < 90) { + return "manual-review-before-recommendation"; + } + return "geospatial-provenance-ready"; +} + +function buildCuratorActions(findings) { + return findings.map((finding) => ({ + priority: finding.severity === "critical" || finding.severity === "high" ? "blocking" : "review", + rule: finding.rule, + action: finding.action, + refs: finding.refs + })); +} + +function buildReviewPacket(project) { + const evaluation = evaluateGeospatialProvenance(project); + return { + guard: "geospatial-sample-provenance-guard", + issue: "SCIBASE-AI/SCIBASE.AI#17", + graphPacketId: project.graphPacket.id, + entityPage: project.graphPacket.entityPage, + recommendationMode: project.graphPacket.recommendationMode, + asOfDate: project.asOfDate, + decision: decisionFromEvaluation(evaluation), + score: evaluation.score, + severitySummary: evaluation.severitySummary, + findings: evaluation.findings, + curatorActions: buildCuratorActions(evaluation.findings), + safety: [ + "Synthetic sample, dataset, coordinate, and graph-edge metadata only", + "No geocoder, repository, GIS, ontology, specimen, journal, or external API calls", + "No private field locations, real endangered species data, credentials, or live graph mutations" + ] + }; +} + +function renderMarkdownReport(packet) { + const lines = [ + "# Geospatial Sample Provenance Guard", + "", + `Issue: ${packet.issue}`, + `Graph packet: ${packet.graphPacketId}`, + `Entity page: ${packet.entityPage}`, + `Decision: ${packet.decision}`, + `Score: ${packet.score}`, + "", + "## Severity Summary", + "", + "| Severity | Count |", + "| --- | ---: |" + ]; + + for (const severity of ["critical", "high", "medium", "low"]) { + lines.push(`| ${severity} | ${packet.severitySummary[severity]} |`); + } + + lines.push("", "## Findings", ""); + for (const finding of packet.findings) { + lines.push(`- **${finding.severity} / ${finding.rule}**: ${finding.message}`); + lines.push(` - Action: ${finding.action}`); + lines.push(` - Refs: ${finding.refs.join(", ") || "none"}`); + } + + lines.push("", "## Safety", ""); + for (const item of packet.safety) { + lines.push(`- ${item}`); + } + + return `${lines.join("\n")}\n`; +} + +function renderSvgSummary(packet) { + const scoreWidth = Math.max(44, Math.min(760, packet.score * 7.6)); + return ` + + Geospatial Sample Provenance Guard + ${packet.entityPage} graph publication review + + ${packet.decision} + Critical ${packet.severitySummary.critical} | High ${packet.severitySummary.high} | Findings ${packet.findings.length} + + Provenance score + + + ${packet.score}/100 + + Protect sample-location graph edges + Checks coordinates, CRS, sensitive-site precision, vouchers, DOI alignment, dates, and public safety. + +`; +} + +module.exports = { + buildReviewPacket, + countryBoundsMatch, + decisionFromEvaluation, + evaluateGeospatialProvenance, + renderMarkdownReport, + renderSvgSummary +}; diff --git a/geospatial-sample-provenance-guard/package.json b/geospatial-sample-provenance-guard/package.json new file mode 100644 index 00000000..43670862 --- /dev/null +++ b/geospatial-sample-provenance-guard/package.json @@ -0,0 +1,14 @@ +{ + "name": "geospatial-sample-provenance-guard", + "version": "1.0.0", + "description": "Deterministic knowledge-graph guard for geospatial field-sample provenance.", + "main": "index.js", + "private": true, + "type": "commonjs", + "scripts": { + "check": "node --check index.js && node --check sample-data.js && node --check demo.js && node --check demo-video.js && node --check test.js", + "test": "node test.js", + "demo": "node demo.js", + "demo:video": "node demo-video.js" + } +} diff --git a/geospatial-sample-provenance-guard/reports/demo.webm b/geospatial-sample-provenance-guard/reports/demo.webm new file mode 100644 index 0000000000000000000000000000000000000000..b8f79e02e18aee9a786ba9c0dc6efdaf6a6b2523 GIT binary patch literal 76921 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 bf23n(sI)tr5<215 literal 0 HcmV?d00001 diff --git a/geospatial-sample-provenance-guard/reports/reviewer-packet.md b/geospatial-sample-provenance-guard/reports/reviewer-packet.md new file mode 100644 index 00000000..86a81795 --- /dev/null +++ b/geospatial-sample-provenance-guard/reports/reviewer-packet.md @@ -0,0 +1,46 @@ +# Geospatial Sample Provenance Guard + +Issue: SCIBASE-AI/SCIBASE.AI#17 +Graph packet: kg-field-samples-2026-05 +Entity page: field-sample-climate-adaptation +Decision: block-geospatial-graph-publication +Score: 0 + +## Severity Summary + +| Severity | Count | +| --- | ---: | +| critical | 1 | +| high | 5 | +| medium | 1 | +| low | 0 | + +## Findings + +- **critical / sensitive-site-overprecise-public-coordinate**: sample-001 exposes 5 decimal coordinates for endangered-species. + - Action: Round or redact the location before public discovery recommendations are enabled. + - Refs: sample-001, endangered-species +- **high / coordinate-crs-not-normalized**: sample-002 uses EPSG:3857, not EPSG:4326. + - Action: Normalize coordinates to the graph CRS before entity pages or recommendations are shown. + - Refs: sample-002, EPSG:3857 +- **high / country-coordinate-mismatch**: sample-002 coordinates do not fall inside the expected Peru bounds. + - Action: Hold location-derived graph edges until country and coordinate provenance are reconciled. + - Refs: sample-002, Peru +- **high / sample-voucher-missing**: sample-002 has no specimen or field voucher identifier. + - Action: Attach a voucher/specimen accession before the sample appears in entity pages. + - Refs: sample-002 +- **high / sample-dataset-doi-unresolved**: sample-002 references unresolved dataset DOI 10.5281/zenodo.unknown. + - Action: Repair DOI alignment before graph edges are emitted. + - Refs: sample-002, 10.5281/zenodo.unknown +- **medium / collection-date-in-future**: sample-002 collection date 2026-06-30 is after the graph packet date. + - Action: Hold temporal graph edges until the collection date is corrected or the packet date advances. + - Refs: sample-002, 2026-06-30 +- **high / sample-dataset-edge-doi-mismatch**: edge-2 links sample-002 to dataset-peru-water, but the sample declares 10.5281/zenodo.unknown. + - Action: Rebuild the graph edge from DOI-resolved dataset metadata. + - Refs: edge-2, sample-002, dataset-peru-water + +## Safety + +- Synthetic sample, dataset, coordinate, and graph-edge metadata only +- No geocoder, repository, GIS, ontology, specimen, journal, or external API calls +- No private field locations, real endangered species data, credentials, or live graph mutations diff --git a/geospatial-sample-provenance-guard/reports/summary.json b/geospatial-sample-provenance-guard/reports/summary.json new file mode 100644 index 00000000..a0073531 --- /dev/null +++ b/geospatial-sample-provenance-guard/reports/summary.json @@ -0,0 +1,158 @@ +{ + "guard": "geospatial-sample-provenance-guard", + "issue": "SCIBASE-AI/SCIBASE.AI#17", + "graphPacketId": "kg-field-samples-2026-05", + "entityPage": "field-sample-climate-adaptation", + "recommendationMode": "public-discovery", + "asOfDate": "2026-05-22", + "decision": "block-geospatial-graph-publication", + "score": 0, + "severitySummary": { + "critical": 1, + "high": 5, + "medium": 1, + "low": 0 + }, + "findings": [ + { + "severity": "critical", + "rule": "sensitive-site-overprecise-public-coordinate", + "message": "sample-001 exposes 5 decimal coordinates for endangered-species.", + "action": "Round or redact the location before public discovery recommendations are enabled.", + "refs": [ + "sample-001", + "endangered-species" + ] + }, + { + "severity": "high", + "rule": "coordinate-crs-not-normalized", + "message": "sample-002 uses EPSG:3857, not EPSG:4326.", + "action": "Normalize coordinates to the graph CRS before entity pages or recommendations are shown.", + "refs": [ + "sample-002", + "EPSG:3857" + ] + }, + { + "severity": "high", + "rule": "country-coordinate-mismatch", + "message": "sample-002 coordinates do not fall inside the expected Peru bounds.", + "action": "Hold location-derived graph edges until country and coordinate provenance are reconciled.", + "refs": [ + "sample-002", + "Peru" + ] + }, + { + "severity": "high", + "rule": "sample-voucher-missing", + "message": "sample-002 has no specimen or field voucher identifier.", + "action": "Attach a voucher/specimen accession before the sample appears in entity pages.", + "refs": [ + "sample-002" + ] + }, + { + "severity": "high", + "rule": "sample-dataset-doi-unresolved", + "message": "sample-002 references unresolved dataset DOI 10.5281/zenodo.unknown.", + "action": "Repair DOI alignment before graph edges are emitted.", + "refs": [ + "sample-002", + "10.5281/zenodo.unknown" + ] + }, + { + "severity": "medium", + "rule": "collection-date-in-future", + "message": "sample-002 collection date 2026-06-30 is after the graph packet date.", + "action": "Hold temporal graph edges until the collection date is corrected or the packet date advances.", + "refs": [ + "sample-002", + "2026-06-30" + ] + }, + { + "severity": "high", + "rule": "sample-dataset-edge-doi-mismatch", + "message": "edge-2 links sample-002 to dataset-peru-water, but the sample declares 10.5281/zenodo.unknown.", + "action": "Rebuild the graph edge from DOI-resolved dataset metadata.", + "refs": [ + "edge-2", + "sample-002", + "dataset-peru-water" + ] + } + ], + "curatorActions": [ + { + "priority": "blocking", + "rule": "sensitive-site-overprecise-public-coordinate", + "action": "Round or redact the location before public discovery recommendations are enabled.", + "refs": [ + "sample-001", + "endangered-species" + ] + }, + { + "priority": "blocking", + "rule": "coordinate-crs-not-normalized", + "action": "Normalize coordinates to the graph CRS before entity pages or recommendations are shown.", + "refs": [ + "sample-002", + "EPSG:3857" + ] + }, + { + "priority": "blocking", + "rule": "country-coordinate-mismatch", + "action": "Hold location-derived graph edges until country and coordinate provenance are reconciled.", + "refs": [ + "sample-002", + "Peru" + ] + }, + { + "priority": "blocking", + "rule": "sample-voucher-missing", + "action": "Attach a voucher/specimen accession before the sample appears in entity pages.", + "refs": [ + "sample-002" + ] + }, + { + "priority": "blocking", + "rule": "sample-dataset-doi-unresolved", + "action": "Repair DOI alignment before graph edges are emitted.", + "refs": [ + "sample-002", + "10.5281/zenodo.unknown" + ] + }, + { + "priority": "review", + "rule": "collection-date-in-future", + "action": "Hold temporal graph edges until the collection date is corrected or the packet date advances.", + "refs": [ + "sample-002", + "2026-06-30" + ] + }, + { + "priority": "blocking", + "rule": "sample-dataset-edge-doi-mismatch", + "action": "Rebuild the graph edge from DOI-resolved dataset metadata.", + "refs": [ + "edge-2", + "sample-002", + "dataset-peru-water" + ] + } + ], + "safety": [ + "Synthetic sample, dataset, coordinate, and graph-edge metadata only", + "No geocoder, repository, GIS, ontology, specimen, journal, or external API calls", + "No private field locations, real endangered species data, credentials, or live graph mutations" + ] +} diff --git a/geospatial-sample-provenance-guard/reports/summary.svg b/geospatial-sample-provenance-guard/reports/summary.svg new file mode 100644 index 00000000..e2fa7791 --- /dev/null +++ b/geospatial-sample-provenance-guard/reports/summary.svg @@ -0,0 +1,16 @@ + + + Geospatial Sample Provenance Guard + field-sample-climate-adaptation graph publication review + + block-geospatial-graph-publication + Critical 1 | High 5 | Findings 7 + + Provenance score + + + 0/100 + + Protect sample-location graph edges + Checks coordinates, CRS, sensitive-site precision, vouchers, DOI alignment, dates, and public safety. + diff --git a/geospatial-sample-provenance-guard/requirements-map.md b/geospatial-sample-provenance-guard/requirements-map.md new file mode 100644 index 00000000..496e901a --- /dev/null +++ b/geospatial-sample-provenance-guard/requirements-map.md @@ -0,0 +1,18 @@ +# Requirements Map + +Issue: `SCIBASE-AI/SCIBASE.AI#17` + +| Issue requirement | Implementation | +| --- | --- | +| Scientific knowledge graph integration | Models sample, dataset, and graph-edge metadata before entity pages and recommendations are published. | +| Entity extraction | Validates field-sample entities, coordinates, vouchers, dataset DOI links, and graph edge endpoints. | +| Knowledge navigation | Blocks unsafe or unresolved sample-location edges before they appear in graph navigation. | +| AI research recommendations | Suppresses public recommendations when geospatial provenance, sensitive-site redaction, or DOI evidence is incomplete. | +| Linked data and metadata | Checks CRS normalization, country/coordinate consistency, coordinate precision, collection dates, and sample-to-dataset DOI alignment. | +| Safe local validation | Includes dependency-free tests and demo generation from synthetic sample and graph metadata only. | + +## Non-goals + +- No live geocoder, repository, GIS, ontology, specimen, journal, or external API calls. +- No private field locations, real endangered species data, credentials, or live graph mutations. +- No replacement for ontology, clinical-trial, funder, software, ethics, evidence freshness, or recommendation-diversity workflows. diff --git a/geospatial-sample-provenance-guard/sample-data.js b/geospatial-sample-provenance-guard/sample-data.js new file mode 100644 index 00000000..a45c921c --- /dev/null +++ b/geospatial-sample-provenance-guard/sample-data.js @@ -0,0 +1,85 @@ +const project = { + asOfDate: "2026-05-22", + policy: { + requiredCrs: "EPSG:4326", + maxPublicPrecisionDecimals: 3, + sensitiveLabels: ["endangered-species", "sacred-site", "private-land"], + acceptedCountryBounds: { + Kenya: { minLat: -4.9, maxLat: 5.1, minLon: 33.5, maxLon: 42.0 }, + Peru: { minLat: -18.5, maxLat: 0.2, minLon: -82.0, maxLon: -68.0 }, + Iceland: { minLat: 63.0, maxLat: 67.5, minLon: -25.0, maxLon: -12.0 } + }, + maxCollectionFutureDays: 0, + publicRecommendationRequiresDatasetDoi: true + }, + graphPacket: { + id: "kg-field-samples-2026-05", + entityPage: "field-sample-climate-adaptation", + recommendationMode: "public-discovery" + }, + datasets: [ + { + id: "dataset-kenya-plant", + doi: "10.5281/zenodo.2026052201", + title: "Synthetic East Africa Plant Trait Survey", + license: "CC-BY-4.0" + }, + { + id: "dataset-peru-water", + doi: "10.5281/zenodo.2026052202", + title: "Synthetic Mountain Watershed Samples", + license: "CC0-1.0" + } + ], + samples: [ + { + id: "sample-001", + label: "Highland plant voucher", + country: "Kenya", + latitude: -0.27342, + longitude: 36.07119, + crs: "EPSG:4326", + precisionDecimals: 5, + collectionDate: "2026-04-12", + datasetDoi: "10.5281/zenodo.2026052201", + voucherId: "EAH-2026-0412", + labels: ["endangered-species"], + publicRecommendation: true + }, + { + id: "sample-002", + label: "Watershed sediment core", + country: "Peru", + latitude: 12.543, + longitude: -76.812, + crs: "EPSG:3857", + precisionDecimals: 3, + collectionDate: "2026-06-30", + datasetDoi: "10.5281/zenodo.unknown", + voucherId: "", + labels: [], + publicRecommendation: true + }, + { + id: "sample-003", + label: "Basalt reference swab", + country: "Iceland", + latitude: 64.145, + longitude: -21.942, + crs: "EPSG:4326", + precisionDecimals: 3, + collectionDate: "2026-03-04", + datasetDoi: "10.5281/zenodo.2026052202", + voucherId: "IS-NHM-7781", + labels: [], + publicRecommendation: true + } + ], + edges: [ + { id: "edge-1", from: "sample-001", to: "dataset-kenya-plant", predicate: "includedInDataset" }, + { id: "edge-2", from: "sample-002", to: "dataset-peru-water", predicate: "includedInDataset" }, + { id: "edge-3", from: "sample-003", to: "dataset-peru-water", predicate: "includedInDataset" } + ] +}; + +module.exports = { project }; diff --git a/geospatial-sample-provenance-guard/test.js b/geospatial-sample-provenance-guard/test.js new file mode 100644 index 00000000..1a292f7a --- /dev/null +++ b/geospatial-sample-provenance-guard/test.js @@ -0,0 +1,90 @@ +const assert = require("assert"); +const { project } = require("./sample-data"); +const { + buildReviewPacket, + countryBoundsMatch, + evaluateGeospatialProvenance, + renderMarkdownReport, + renderSvgSummary +} = require("./index"); + +const evaluation = evaluateGeospatialProvenance(project); +const packet = buildReviewPacket(project); + +assert.strictEqual(packet.guard, "geospatial-sample-provenance-guard"); +assert.strictEqual(packet.issue, "SCIBASE-AI/SCIBASE.AI#17"); +assert.strictEqual(packet.decision, "block-geospatial-graph-publication"); + +assert.ok( + evaluation.findings.some((finding) => finding.rule === "sensitive-site-overprecise-public-coordinate"), + "expected sensitive precision finding" +); +assert.ok( + evaluation.findings.some((finding) => finding.rule === "coordinate-crs-not-normalized"), + "expected CRS finding" +); +assert.ok( + evaluation.findings.some((finding) => finding.rule === "country-coordinate-mismatch"), + "expected country-coordinate mismatch finding" +); +assert.ok( + evaluation.findings.some((finding) => finding.rule === "sample-voucher-missing"), + "expected missing voucher finding" +); +assert.ok( + evaluation.findings.some((finding) => finding.rule === "sample-dataset-edge-doi-mismatch"), + "expected DOI edge mismatch finding" +); + +assert.strictEqual(countryBoundsMatch(project, project.samples[0]), true); +assert.strictEqual(countryBoundsMatch(project, project.samples[1]), false); + +const cleanProject = JSON.parse(JSON.stringify(project)); +cleanProject.samples = [ + { + id: "sample-clean-1", + label: "General plant trait sample", + country: "Kenya", + latitude: -0.273, + longitude: 36.071, + crs: "EPSG:4326", + precisionDecimals: 3, + collectionDate: "2026-04-12", + datasetDoi: "10.5281/zenodo.2026052201", + voucherId: "EAH-2026-0412", + labels: [], + publicRecommendation: true + }, + { + id: "sample-clean-2", + label: "Basalt reference swab", + country: "Iceland", + latitude: 64.145, + longitude: -21.942, + crs: "EPSG:4326", + precisionDecimals: 3, + collectionDate: "2026-03-04", + datasetDoi: "10.5281/zenodo.2026052202", + voucherId: "IS-NHM-7781", + labels: [], + publicRecommendation: true + } +]; +cleanProject.edges = [ + { id: "edge-clean-1", from: "sample-clean-1", to: "dataset-kenya-plant", predicate: "includedInDataset" }, + { id: "edge-clean-2", from: "sample-clean-2", to: "dataset-peru-water", predicate: "includedInDataset" } +]; + +const cleanPacket = buildReviewPacket(cleanProject); +assert.strictEqual(cleanPacket.decision, "geospatial-provenance-ready"); +assert.strictEqual(cleanPacket.findings.length, 0); + +const markdown = renderMarkdownReport(packet); +assert.ok(markdown.includes("## Findings")); +assert.ok(markdown.includes("sensitive-site-overprecise-public-coordinate")); + +const svg = renderSvgSummary(packet); +assert.ok(svg.includes("