From 0cfe928c9b35468a5a1fd8b3c260ce5eeff59ff7 Mon Sep 17 00:00:00 2001 From: Jorel97 Date: Mon, 1 Jun 2026 12:44:55 -0600 Subject: [PATCH] Add spreadsheet formula provenance guard --- .../README.md | 17 ++ spreadsheet-formula-provenance-guard/demo.js | 61 +++++ .../demo_video.py | 46 ++++ spreadsheet-formula-provenance-guard/index.js | 246 ++++++++++++++++++ .../package.json | 13 + .../reports/clean-spreadsheet.json | 22 ++ .../reports/clean-spreadsheet.md | 21 ++ .../reports/clean-spreadsheet.svg | 12 + .../reports/demo.gif | Bin 0 -> 56321 bytes .../reports/demo.mp4 | Bin 0 -> 42178 bytes .../reports/risky-spreadsheet.json | 114 ++++++++ .../reports/risky-spreadsheet.md | 33 +++ .../reports/risky-spreadsheet.svg | 12 + .../requirements-map.md | 13 + .../sample-data.js | 89 +++++++ spreadsheet-formula-provenance-guard/test.js | 47 ++++ 16 files changed, 746 insertions(+) create mode 100644 spreadsheet-formula-provenance-guard/README.md create mode 100644 spreadsheet-formula-provenance-guard/demo.js create mode 100644 spreadsheet-formula-provenance-guard/demo_video.py create mode 100644 spreadsheet-formula-provenance-guard/index.js create mode 100644 spreadsheet-formula-provenance-guard/package.json create mode 100644 spreadsheet-formula-provenance-guard/reports/clean-spreadsheet.json create mode 100644 spreadsheet-formula-provenance-guard/reports/clean-spreadsheet.md create mode 100644 spreadsheet-formula-provenance-guard/reports/clean-spreadsheet.svg create mode 100644 spreadsheet-formula-provenance-guard/reports/demo.gif create mode 100644 spreadsheet-formula-provenance-guard/reports/demo.mp4 create mode 100644 spreadsheet-formula-provenance-guard/reports/risky-spreadsheet.json create mode 100644 spreadsheet-formula-provenance-guard/reports/risky-spreadsheet.md create mode 100644 spreadsheet-formula-provenance-guard/reports/risky-spreadsheet.svg create mode 100644 spreadsheet-formula-provenance-guard/requirements-map.md create mode 100644 spreadsheet-formula-provenance-guard/sample-data.js create mode 100644 spreadsheet-formula-provenance-guard/test.js diff --git a/spreadsheet-formula-provenance-guard/README.md b/spreadsheet-formula-provenance-guard/README.md new file mode 100644 index 00000000..466ada07 --- /dev/null +++ b/spreadsheet-formula-provenance-guard/README.md @@ -0,0 +1,17 @@ +# Spreadsheet Formula Provenance Guard + +Self-contained SCIBASE Scientific/Engineering Data & Code Hosting slice for issue #14. The guard checks whether uploaded spreadsheet datasets are reproducible and safe to publish before metadata-aware previews, normalized exports, or DOI-ready research packets are generated. + +## Why this slice is distinct + +Existing #14 submissions cover broad FAIR manifests, artifact package integrity, preview cache/version drift, raw-instrument previews, notebook previews, retention/tombstones, model-card lineage, license metadata, sensitive redaction, schema evolution, data dictionaries, persistent identifiers, SBOM/advisory checks, upload checkpoints, replica consistency, column sensitivity, malware/archive quarantine, executable sandbox egress policy, and supplementary media accessibility previews. This module focuses only on spreadsheet formula provenance: formula cells, volatile functions, stale calculated values, hidden sheets, external workbook links, macro-enabled files, normalized export checksums, and reviewer-ready transformation evidence. + +## Run + +```bash +npm test +npm run demo +npm run demo:video +``` + +Demo artifacts are written to `reports/`, including JSON, Markdown, SVG, GIF, and MP4 files. diff --git a/spreadsheet-formula-provenance-guard/demo.js b/spreadsheet-formula-provenance-guard/demo.js new file mode 100644 index 00000000..b0d166b3 --- /dev/null +++ b/spreadsheet-formula-provenance-guard/demo.js @@ -0,0 +1,61 @@ +const fs = require("fs"); +const path = require("path"); + +const { assessSpreadsheetProvenance } = require("./index"); +const { cleanSpreadsheet, riskySpreadsheet } = require("./sample-data"); + +const reportsDir = path.join(__dirname, "reports"); +fs.mkdirSync(reportsDir, { recursive: true }); + +function markdownReport(name, report) { + const findings = report.findings.length + ? report.findings + .map((item) => `- ${item.severity.toUpperCase()} ${item.code}: ${item.message}`) + .join("\n") + : "- No spreadsheet provenance findings."; + return `# Spreadsheet Formula Provenance Guard + +Scenario: ${name} + +Dataset: ${report.datasetId} +File: ${report.filename} +Decision: ${report.decision.toUpperCase()} + +Reviewed ${report.summary.sheetsReviewed} sheets, ${report.summary.formulaCellsReviewed} formula cells, and ${report.summary.exportsReviewed} exports. + +## Findings + +${findings} + +## Release Criteria + +${report.releaseCriteria.map((item) => `- ${item}`).join("\n")} +`; +} + +function svgReport(report) { + const color = report.decision === "hold" ? "#b91c1c" : report.decision === "revise" ? "#c2410c" : "#15803d"; + return ` + + Spreadsheet Formula Provenance Guard + ${report.datasetId} / ${report.filename} + + ${report.decision.toUpperCase()} + Formula cells: ${report.summary.formulaCellsReviewed} + High: ${report.summary.high} + Medium: ${report.summary.medium} + Low: ${report.summary.low} + Synthetic spreadsheet packets only. No private research data or external services. +`; +} + +for (const [name, spreadsheet] of [ + ["clean-spreadsheet", cleanSpreadsheet], + ["risky-spreadsheet", riskySpreadsheet], +]) { + const report = assessSpreadsheetProvenance(spreadsheet); + fs.writeFileSync(path.join(reportsDir, `${name}.json`), JSON.stringify(report, null, 2)); + fs.writeFileSync(path.join(reportsDir, `${name}.md`), markdownReport(name, report)); + fs.writeFileSync(path.join(reportsDir, `${name}.svg`), svgReport(report)); + console.log(`${name}: ${report.decision} (${report.summary.findings} findings)`); +} diff --git a/spreadsheet-formula-provenance-guard/demo_video.py b/spreadsheet-formula-provenance-guard/demo_video.py new file mode 100644 index 00000000..9b525849 --- /dev/null +++ b/spreadsheet-formula-provenance-guard/demo_video.py @@ -0,0 +1,46 @@ +from pathlib import Path + +import imageio.v3 as iio +import numpy as np +from PIL import Image, ImageDraw, ImageFont + + +ROOT = Path(__file__).resolve().parent +REPORTS = ROOT / "reports" +REPORTS.mkdir(exist_ok=True) + + +def font(size): + for name in ("arial.ttf", "segoeui.ttf"): + try: + return ImageFont.truetype(name, size) + except OSError: + pass + return ImageFont.load_default() + + +slides = [ + ("Spreadsheet Formula Guard", "Scientific/Engineering Data & Code Hosting #14"), + ("Checks", "formula cells, volatile functions, stale cached values"), + ("Checks", "external workbook links, hidden sheets, macro-enabled files"), + ("Decision", "hold publication until spreadsheet datasets are reproducible"), +] + +frames = [] +for index, (title, subtitle) in enumerate(slides, start=1): + image = Image.new("RGB", (960, 544), "#10201b") + draw = ImageDraw.Draw(image) + draw.rectangle((44, 52, 916, 492), outline="#34d399", width=3) + draw.text((80, 124), title, fill="#f8fafc", font=font(40)) + draw.text((80, 206), subtitle, fill="#d1fae5", font=font(25)) + draw.rectangle((80, 326, 818, 382), fill="#065f46") + draw.text((104, 342), "spreadsheet previews must be reproducible outside Excel", fill="#ecfdf5", font=font(22)) + draw.text((80, 438), f"Slide {index}/4 - synthetic reviewer artifact", fill="#cbd5e1", font=font(20)) + frames.extend([image] * 14) + +gif_path = REPORTS / "demo.gif" +mp4_path = REPORTS / "demo.mp4" +frames[0].save(gif_path, save_all=True, append_images=frames[1:], duration=120, loop=0) +iio.imwrite(mp4_path, [np.asarray(frame) for frame in frames], fps=8, codec="libx264") +print(f"wrote {gif_path}") +print(f"wrote {mp4_path}") diff --git a/spreadsheet-formula-provenance-guard/index.js b/spreadsheet-formula-provenance-guard/index.js new file mode 100644 index 00000000..7d103f02 --- /dev/null +++ b/spreadsheet-formula-provenance-guard/index.js @@ -0,0 +1,246 @@ +const HIGH = "high"; +const MEDIUM = "medium"; +const LOW = "low"; + +const VOLATILE_FUNCTIONS = ["NOW", "TODAY", "RAND", "RANDBETWEEN", "OFFSET", "INDIRECT"]; + +function requiredString(value, field) { + if (typeof value !== "string" || value.trim() === "") { + throw new TypeError(`${field} must be a non-empty string`); + } + return value.trim(); +} + +function array(value, field) { + if (!Array.isArray(value)) { + throw new TypeError(`${field} must be an array`); + } + return value; +} + +function unique(values) { + return [...new Set(values.map(String))]; +} + +function isSha256(value) { + return typeof value === "string" && /^[a-f0-9]{64}$/.test(value); +} + +function normalizeCell(raw, sheetName, index) { + return { + address: requiredString(raw.address, `${sheetName}.cells[${index}].address`), + formula: raw.formula ? String(raw.formula) : "", + cachedValue: raw.cachedValue === undefined ? null : raw.cachedValue, + recalculatedAt: raw.recalculatedAt ? String(raw.recalculatedAt) : "", + sourceRefs: unique(raw.sourceRefs || []), + }; +} + +function normalizeSheet(raw, index) { + const name = requiredString(raw.name, `sheets[${index}].name`); + return { + name, + hidden: Boolean(raw.hidden), + purpose: raw.purpose ? String(raw.purpose) : "", + cells: array(raw.cells || [], `${name}.cells`).map((cell, cellIndex) => normalizeCell(cell, name, cellIndex)), + }; +} + +function normalizeSpreadsheet(raw) { + return { + datasetId: requiredString(raw.datasetId, "datasetId"), + filename: requiredString(raw.filename, "filename"), + uploadedAt: requiredString(raw.uploadedAt, "uploadedAt"), + sha256: requiredString(raw.sha256, "sha256").toLowerCase(), + macroEnabled: Boolean(raw.macroEnabled), + externalLinks: unique(raw.externalLinks || []), + exports: array(raw.exports || [], "exports").map((item, index) => ({ + format: requiredString(item.format, `exports[${index}].format`), + path: requiredString(item.path, `exports[${index}].path`), + sha256: requiredString(item.sha256, `exports[${index}].sha256`).toLowerCase(), + })), + sheets: array(raw.sheets || [], "sheets").map(normalizeSheet), + }; +} + +function finding(code, severity, sourceId, message, remediation) { + return { code, severity, sourceId, message, remediation }; +} + +function formulaFunctions(formula) { + const matches = String(formula).toUpperCase().match(/[A-Z][A-Z0-9_.]*\s*\(/g) || []; + return unique(matches.map((item) => item.replace(/\s*\($/, ""))); +} + +function hasExternalReference(formula) { + return /\[[^\]]+\]|\bhttps?:\/\//i.test(String(formula)); +} + +function assessSpreadsheetProvenance(rawSpreadsheet) { + const spreadsheet = normalizeSpreadsheet(rawSpreadsheet); + const findings = []; + const formulaCells = spreadsheet.sheets.flatMap((sheet) => + sheet.cells + .filter((cell) => cell.formula) + .map((cell) => ({ ...cell, sheet: sheet.name, sourceId: `${sheet.name}!${cell.address}` })) + ); + + if (!isSha256(spreadsheet.sha256)) { + findings.push( + finding( + "INVALID_SPREADSHEET_DIGEST", + HIGH, + spreadsheet.filename, + `${spreadsheet.filename} does not have a valid SHA-256 upload digest.`, + "Record the original spreadsheet hash before accepting it as a citable dataset artifact." + ) + ); + } + + if (spreadsheet.macroEnabled) { + findings.push( + finding( + "MACRO_ENABLED_DATASET", + HIGH, + spreadsheet.filename, + `${spreadsheet.filename} is macro-enabled and cannot be treated as inert tabular data.`, + "Quarantine macro-enabled files or publish a macro-free normalized export with reviewed transformation notes." + ) + ); + } + + if (spreadsheet.externalLinks.length > 0) { + findings.push( + finding( + "EXTERNAL_WORKBOOK_LINKS", + HIGH, + spreadsheet.filename, + `${spreadsheet.filename} depends on external workbook links: ${spreadsheet.externalLinks.join(", ")}.`, + "Bundle source workbooks or replace formulas with reproducible local references before publication." + ) + ); + } + + for (const sheet of spreadsheet.sheets) { + if (sheet.hidden && sheet.cells.length > 0) { + findings.push( + finding( + "HIDDEN_SHEET_WITH_DATA", + MEDIUM, + sheet.name, + `${sheet.name} is hidden but contains data or formulas.`, + "Expose the sheet, document its purpose, or exclude it from the release with an audit note." + ) + ); + } + } + + for (const cell of formulaCells) { + const functions = formulaFunctions(cell.formula); + const volatile = functions.filter((name) => VOLATILE_FUNCTIONS.includes(name)); + if (volatile.length > 0) { + findings.push( + finding( + "VOLATILE_FORMULA", + HIGH, + cell.sourceId, + `${cell.sourceId} uses volatile functions: ${volatile.join(", ")}.`, + "Replace volatile formulas with fixed values or a scripted, versioned transformation." + ) + ); + } + + if (hasExternalReference(cell.formula)) { + findings.push( + finding( + "FORMULA_EXTERNAL_REFERENCE", + HIGH, + cell.sourceId, + `${cell.sourceId} references an external workbook or URL.`, + "Bundle the dependency and record its checksum, or normalize the formula into a local reproducible dataset." + ) + ); + } + + if (cell.cachedValue === null || cell.recalculatedAt === "") { + findings.push( + finding( + "STALE_OR_MISSING_CALCULATION_EVIDENCE", + MEDIUM, + cell.sourceId, + `${cell.sourceId} lacks cached value or recalculation timestamp evidence.`, + "Recalculate the workbook in a controlled environment and record cached values before preview/export." + ) + ); + } + + if (cell.sourceRefs.length === 0) { + findings.push( + finding( + "FORMULA_WITHOUT_PROVENANCE", + MEDIUM, + cell.sourceId, + `${cell.sourceId} has no provenance references for its inputs.`, + "Attach source ranges, instruments, upstream datasets, or transformation tickets for formula-derived values." + ) + ); + } + } + + const exportFormats = new Set(spreadsheet.exports.map((item) => item.format)); + if (!exportFormats.has("csv") && !exportFormats.has("parquet")) { + findings.push( + finding( + "MISSING_NORMALIZED_EXPORT", + HIGH, + "exports", + "Spreadsheet dataset has no CSV or parquet normalized export.", + "Publish a normalized tabular export so reviewers can diff and re-use the dataset outside spreadsheet software." + ) + ); + } + + for (const exported of spreadsheet.exports) { + if (!isSha256(exported.sha256)) { + findings.push( + finding( + "INVALID_EXPORT_DIGEST", + HIGH, + exported.path, + `${exported.path} does not have a valid SHA-256 digest.`, + "Record a digest for every normalized export before publication." + ) + ); + } + } + + const high = findings.filter((item) => item.severity === HIGH).length; + const medium = findings.filter((item) => item.severity === MEDIUM).length; + return { + datasetId: spreadsheet.datasetId, + filename: spreadsheet.filename, + decision: high > 0 ? "hold" : medium > 0 ? "revise" : "release", + summary: { + sheetsReviewed: spreadsheet.sheets.length, + formulaCellsReviewed: formulaCells.length, + exportsReviewed: spreadsheet.exports.length, + findings: findings.length, + high, + medium, + low: findings.filter((item) => item.severity === LOW).length, + }, + findings, + releaseCriteria: [ + "Original spreadsheet and normalized exports have stable SHA-256 digests.", + "Formula-derived cells avoid volatile functions and external workbook references.", + "Formula cells carry cached value, recalculation timestamp, and provenance evidence.", + "Hidden sheets, macros, and external links are disclosed or blocked before publication.", + "At least one normalized CSV or parquet export is available for reproducible reuse.", + ], + }; +} + +module.exports = { + assessSpreadsheetProvenance, + normalizeSpreadsheet, +}; diff --git a/spreadsheet-formula-provenance-guard/package.json b/spreadsheet-formula-provenance-guard/package.json new file mode 100644 index 00000000..dfbb7ebf --- /dev/null +++ b/spreadsheet-formula-provenance-guard/package.json @@ -0,0 +1,13 @@ +{ + "name": "spreadsheet-formula-provenance-guard", + "version": "1.0.0", + "description": "Spreadsheet formula provenance guard for SCIBASE scientific data hosting", + "main": "index.js", + "type": "commonjs", + "scripts": { + "test": "node test.js", + "demo": "node demo.js", + "demo:video": "python demo_video.py" + }, + "license": "MIT" +} diff --git a/spreadsheet-formula-provenance-guard/reports/clean-spreadsheet.json b/spreadsheet-formula-provenance-guard/reports/clean-spreadsheet.json new file mode 100644 index 00000000..ab52a18e --- /dev/null +++ b/spreadsheet-formula-provenance-guard/reports/clean-spreadsheet.json @@ -0,0 +1,22 @@ +{ + "datasetId": "dataset-climate-yield-001", + "filename": "climate-yield-model.xlsx", + "decision": "release", + "summary": { + "sheetsReviewed": 2, + "formulaCellsReviewed": 1, + "exportsReviewed": 2, + "findings": 0, + "high": 0, + "medium": 0, + "low": 0 + }, + "findings": [], + "releaseCriteria": [ + "Original spreadsheet and normalized exports have stable SHA-256 digests.", + "Formula-derived cells avoid volatile functions and external workbook references.", + "Formula cells carry cached value, recalculation timestamp, and provenance evidence.", + "Hidden sheets, macros, and external links are disclosed or blocked before publication.", + "At least one normalized CSV or parquet export is available for reproducible reuse." + ] +} \ No newline at end of file diff --git a/spreadsheet-formula-provenance-guard/reports/clean-spreadsheet.md b/spreadsheet-formula-provenance-guard/reports/clean-spreadsheet.md new file mode 100644 index 00000000..7db3f7a1 --- /dev/null +++ b/spreadsheet-formula-provenance-guard/reports/clean-spreadsheet.md @@ -0,0 +1,21 @@ +# Spreadsheet Formula Provenance Guard + +Scenario: clean-spreadsheet + +Dataset: dataset-climate-yield-001 +File: climate-yield-model.xlsx +Decision: RELEASE + +Reviewed 2 sheets, 1 formula cells, and 2 exports. + +## Findings + +- No spreadsheet provenance findings. + +## Release Criteria + +- Original spreadsheet and normalized exports have stable SHA-256 digests. +- Formula-derived cells avoid volatile functions and external workbook references. +- Formula cells carry cached value, recalculation timestamp, and provenance evidence. +- Hidden sheets, macros, and external links are disclosed or blocked before publication. +- At least one normalized CSV or parquet export is available for reproducible reuse. diff --git a/spreadsheet-formula-provenance-guard/reports/clean-spreadsheet.svg b/spreadsheet-formula-provenance-guard/reports/clean-spreadsheet.svg new file mode 100644 index 00000000..00b0b893 --- /dev/null +++ b/spreadsheet-formula-provenance-guard/reports/clean-spreadsheet.svg @@ -0,0 +1,12 @@ + + + Spreadsheet Formula Provenance Guard + dataset-climate-yield-001 / climate-yield-model.xlsx + + RELEASE + Formula cells: 1 + High: 0 + Medium: 0 + Low: 0 + Synthetic spreadsheet packets only. No private research data or external services. + \ No newline at end of file diff --git a/spreadsheet-formula-provenance-guard/reports/demo.gif b/spreadsheet-formula-provenance-guard/reports/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f3bd928519c79f9c855644e93e3aa42b2ef5c97 GIT binary patch literal 56321 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 |8_k+8h=>CB2$Z53RQ{DV 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 z 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 literal 0 HcmV?d00001 diff --git a/spreadsheet-formula-provenance-guard/reports/risky-spreadsheet.json b/spreadsheet-formula-provenance-guard/reports/risky-spreadsheet.json new file mode 100644 index 00000000..3a202983 --- /dev/null +++ b/spreadsheet-formula-provenance-guard/reports/risky-spreadsheet.json @@ -0,0 +1,114 @@ +{ + "datasetId": "dataset-fragile-xlsx-002", + "filename": "fragile-field-results.xlsm", + "decision": "hold", + "summary": { + "sheetsReviewed": 2, + "formulaCellsReviewed": 2, + "exportsReviewed": 1, + "findings": 13, + "high": 8, + "medium": 5, + "low": 0 + }, + "findings": [ + { + "code": "INVALID_SPREADSHEET_DIGEST", + "severity": "high", + "sourceId": "fragile-field-results.xlsm", + "message": "fragile-field-results.xlsm does not have a valid SHA-256 upload digest.", + "remediation": "Record the original spreadsheet hash before accepting it as a citable dataset artifact." + }, + { + "code": "MACRO_ENABLED_DATASET", + "severity": "high", + "sourceId": "fragile-field-results.xlsm", + "message": "fragile-field-results.xlsm is macro-enabled and cannot be treated as inert tabular data.", + "remediation": "Quarantine macro-enabled files or publish a macro-free normalized export with reviewed transformation notes." + }, + { + "code": "EXTERNAL_WORKBOOK_LINKS", + "severity": "high", + "sourceId": "fragile-field-results.xlsm", + "message": "fragile-field-results.xlsm depends on external workbook links: ../lab-shared/master-calibration.xlsx.", + "remediation": "Bundle source workbooks or replace formulas with reproducible local references before publication." + }, + { + "code": "HIDDEN_SHEET_WITH_DATA", + "severity": "medium", + "sourceId": "hidden-calibration", + "message": "hidden-calibration is hidden but contains data or formulas.", + "remediation": "Expose the sheet, document its purpose, or exclude it from the release with an audit note." + }, + { + "code": "VOLATILE_FORMULA", + "severity": "high", + "sourceId": "hidden-calibration!C7", + "message": "hidden-calibration!C7 uses volatile functions: RAND.", + "remediation": "Replace volatile formulas with fixed values or a scripted, versioned transformation." + }, + { + "code": "FORMULA_EXTERNAL_REFERENCE", + "severity": "high", + "sourceId": "hidden-calibration!C7", + "message": "hidden-calibration!C7 references an external workbook or URL.", + "remediation": "Bundle the dependency and record its checksum, or normalize the formula into a local reproducible dataset." + }, + { + "code": "STALE_OR_MISSING_CALCULATION_EVIDENCE", + "severity": "medium", + "sourceId": "hidden-calibration!C7", + "message": "hidden-calibration!C7 lacks cached value or recalculation timestamp evidence.", + "remediation": "Recalculate the workbook in a controlled environment and record cached values before preview/export." + }, + { + "code": "FORMULA_WITHOUT_PROVENANCE", + "severity": "medium", + "sourceId": "hidden-calibration!C7", + "message": "hidden-calibration!C7 has no provenance references for its inputs.", + "remediation": "Attach source ranges, instruments, upstream datasets, or transformation tickets for formula-derived values." + }, + { + "code": "FORMULA_EXTERNAL_REFERENCE", + "severity": "high", + "sourceId": "hidden-calibration!C8", + "message": "hidden-calibration!C8 references an external workbook or URL.", + "remediation": "Bundle the dependency and record its checksum, or normalize the formula into a local reproducible dataset." + }, + { + "code": "STALE_OR_MISSING_CALCULATION_EVIDENCE", + "severity": "medium", + "sourceId": "hidden-calibration!C8", + "message": "hidden-calibration!C8 lacks cached value or recalculation timestamp evidence.", + "remediation": "Recalculate the workbook in a controlled environment and record cached values before preview/export." + }, + { + "code": "FORMULA_WITHOUT_PROVENANCE", + "severity": "medium", + "sourceId": "hidden-calibration!C8", + "message": "hidden-calibration!C8 has no provenance references for its inputs.", + "remediation": "Attach source ranges, instruments, upstream datasets, or transformation tickets for formula-derived values." + }, + { + "code": "MISSING_NORMALIZED_EXPORT", + "severity": "high", + "sourceId": "exports", + "message": "Spreadsheet dataset has no CSV or parquet normalized export.", + "remediation": "Publish a normalized tabular export so reviewers can diff and re-use the dataset outside spreadsheet software." + }, + { + "code": "INVALID_EXPORT_DIGEST", + "severity": "high", + "sourceId": "exports/fragile-field-results.xlsx", + "message": "exports/fragile-field-results.xlsx does not have a valid SHA-256 digest.", + "remediation": "Record a digest for every normalized export before publication." + } + ], + "releaseCriteria": [ + "Original spreadsheet and normalized exports have stable SHA-256 digests.", + "Formula-derived cells avoid volatile functions and external workbook references.", + "Formula cells carry cached value, recalculation timestamp, and provenance evidence.", + "Hidden sheets, macros, and external links are disclosed or blocked before publication.", + "At least one normalized CSV or parquet export is available for reproducible reuse." + ] +} \ No newline at end of file diff --git a/spreadsheet-formula-provenance-guard/reports/risky-spreadsheet.md b/spreadsheet-formula-provenance-guard/reports/risky-spreadsheet.md new file mode 100644 index 00000000..9eb71ddf --- /dev/null +++ b/spreadsheet-formula-provenance-guard/reports/risky-spreadsheet.md @@ -0,0 +1,33 @@ +# Spreadsheet Formula Provenance Guard + +Scenario: risky-spreadsheet + +Dataset: dataset-fragile-xlsx-002 +File: fragile-field-results.xlsm +Decision: HOLD + +Reviewed 2 sheets, 2 formula cells, and 1 exports. + +## Findings + +- HIGH INVALID_SPREADSHEET_DIGEST: fragile-field-results.xlsm does not have a valid SHA-256 upload digest. +- HIGH MACRO_ENABLED_DATASET: fragile-field-results.xlsm is macro-enabled and cannot be treated as inert tabular data. +- HIGH EXTERNAL_WORKBOOK_LINKS: fragile-field-results.xlsm depends on external workbook links: ../lab-shared/master-calibration.xlsx. +- MEDIUM HIDDEN_SHEET_WITH_DATA: hidden-calibration is hidden but contains data or formulas. +- HIGH VOLATILE_FORMULA: hidden-calibration!C7 uses volatile functions: RAND. +- HIGH FORMULA_EXTERNAL_REFERENCE: hidden-calibration!C7 references an external workbook or URL. +- MEDIUM STALE_OR_MISSING_CALCULATION_EVIDENCE: hidden-calibration!C7 lacks cached value or recalculation timestamp evidence. +- MEDIUM FORMULA_WITHOUT_PROVENANCE: hidden-calibration!C7 has no provenance references for its inputs. +- HIGH FORMULA_EXTERNAL_REFERENCE: hidden-calibration!C8 references an external workbook or URL. +- MEDIUM STALE_OR_MISSING_CALCULATION_EVIDENCE: hidden-calibration!C8 lacks cached value or recalculation timestamp evidence. +- MEDIUM FORMULA_WITHOUT_PROVENANCE: hidden-calibration!C8 has no provenance references for its inputs. +- HIGH MISSING_NORMALIZED_EXPORT: Spreadsheet dataset has no CSV or parquet normalized export. +- HIGH INVALID_EXPORT_DIGEST: exports/fragile-field-results.xlsx does not have a valid SHA-256 digest. + +## Release Criteria + +- Original spreadsheet and normalized exports have stable SHA-256 digests. +- Formula-derived cells avoid volatile functions and external workbook references. +- Formula cells carry cached value, recalculation timestamp, and provenance evidence. +- Hidden sheets, macros, and external links are disclosed or blocked before publication. +- At least one normalized CSV or parquet export is available for reproducible reuse. diff --git a/spreadsheet-formula-provenance-guard/reports/risky-spreadsheet.svg b/spreadsheet-formula-provenance-guard/reports/risky-spreadsheet.svg new file mode 100644 index 00000000..7a597b1b --- /dev/null +++ b/spreadsheet-formula-provenance-guard/reports/risky-spreadsheet.svg @@ -0,0 +1,12 @@ + + + Spreadsheet Formula Provenance Guard + dataset-fragile-xlsx-002 / fragile-field-results.xlsm + + HOLD + Formula cells: 2 + High: 8 + Medium: 5 + Low: 0 + Synthetic spreadsheet packets only. No private research data or external services. + \ No newline at end of file diff --git a/spreadsheet-formula-provenance-guard/requirements-map.md b/spreadsheet-formula-provenance-guard/requirements-map.md new file mode 100644 index 00000000..7450d321 --- /dev/null +++ b/spreadsheet-formula-provenance-guard/requirements-map.md @@ -0,0 +1,13 @@ +# Requirements Map + +Issue #14 asks for scientific data and code hosting with major file-type support, metadata-aware previews, upload versioning and diffing, FAIR-oriented metadata, executable/reusable artifacts, and machine-discoverable exports. + +This slice covers a focused spreadsheet dataset gate: + +- Major file types: targets `.xlsx`/`.xlsm` spreadsheet datasets before they are accepted as research artifacts. +- Metadata-aware previews: blocks previews when formula-derived values lack recalculation evidence or provenance. +- Upload versioning and diffing: requires stable SHA-256 digests for the original workbook and normalized exports. +- Reusable data: requires CSV or parquet normalized exports so reviewers can inspect data without spreadsheet software. +- FAIR and provenance: requires formula source references for derived values and flags hidden sheets, volatile functions, macros, and external workbook links. + +Out of scope by design: broad repository manifests, executable sandboxes, model cards, data dictionaries, malware/archive scans, access embargoes, and accessibility previews, because those are already covered by separate same-issue slices. diff --git a/spreadsheet-formula-provenance-guard/sample-data.js b/spreadsheet-formula-provenance-guard/sample-data.js new file mode 100644 index 00000000..7fa860ab --- /dev/null +++ b/spreadsheet-formula-provenance-guard/sample-data.js @@ -0,0 +1,89 @@ +const digestA = "a".repeat(64); +const digestB = "b".repeat(64); +const digestC = "c".repeat(64); + +const cleanSpreadsheet = { + datasetId: "dataset-climate-yield-001", + filename: "climate-yield-model.xlsx", + uploadedAt: "2026-06-01T19:00:00Z", + sha256: digestA, + macroEnabled: false, + externalLinks: [], + exports: [ + { format: "csv", path: "exports/climate-yield-model.csv", sha256: digestB }, + { format: "parquet", path: "exports/climate-yield-model.parquet", sha256: digestC }, + ], + sheets: [ + { + name: "observations", + hidden: false, + purpose: "Raw normalized observations", + cells: [ + { address: "A2", cachedValue: "MX-001", sourceRefs: ["instrument:station-mx-001"] }, + { address: "B2", cachedValue: 18.2, sourceRefs: ["instrument:station-mx-001"] }, + ], + }, + { + name: "model", + hidden: false, + purpose: "Derived yield score", + cells: [ + { + address: "D2", + formula: "=ROUND(observations!B2*1.8,2)", + cachedValue: 32.76, + recalculatedAt: "2026-06-01T19:05:00Z", + sourceRefs: ["observations!B2", "protocols/yield-transform-v3.md"], + }, + ], + }, + ], +}; + +const riskySpreadsheet = { + datasetId: "dataset-fragile-xlsx-002", + filename: "fragile-field-results.xlsm", + uploadedAt: "2026-06-01T19:00:00Z", + sha256: "not-a-digest", + macroEnabled: true, + externalLinks: ["../lab-shared/master-calibration.xlsx"], + exports: [ + { format: "xlsx", path: "exports/fragile-field-results.xlsx", sha256: "bad-export-digest" }, + ], + sheets: [ + { + name: "raw", + hidden: false, + purpose: "Raw observations", + cells: [ + { address: "A2", cachedValue: "BR-204", sourceRefs: [] }, + ], + }, + { + name: "hidden-calibration", + hidden: true, + purpose: "Undocumented calibration", + cells: [ + { + address: "C7", + formula: "='[master-calibration.xlsx]Sheet1'!B4+RAND()", + cachedValue: null, + recalculatedAt: "", + sourceRefs: [], + }, + { + address: "C8", + formula: "=WEBSERVICE(\"https://example.invalid/current-factor\")", + cachedValue: null, + recalculatedAt: "", + sourceRefs: [], + }, + ], + }, + ], +}; + +module.exports = { + cleanSpreadsheet, + riskySpreadsheet, +}; diff --git a/spreadsheet-formula-provenance-guard/test.js b/spreadsheet-formula-provenance-guard/test.js new file mode 100644 index 00000000..bb06073f --- /dev/null +++ b/spreadsheet-formula-provenance-guard/test.js @@ -0,0 +1,47 @@ +const assert = require("assert"); + +const { assessSpreadsheetProvenance, normalizeSpreadsheet } = require("./index"); +const { cleanSpreadsheet, riskySpreadsheet } = require("./sample-data"); + +const clean = assessSpreadsheetProvenance(cleanSpreadsheet); +assert.strictEqual(clean.decision, "release"); +assert.strictEqual(clean.summary.findings, 0); +assert.strictEqual(clean.summary.formulaCellsReviewed, 1); + +const risky = assessSpreadsheetProvenance(riskySpreadsheet); +assert.strictEqual(risky.decision, "hold"); +for (const code of [ + "INVALID_SPREADSHEET_DIGEST", + "MACRO_ENABLED_DATASET", + "EXTERNAL_WORKBOOK_LINKS", + "HIDDEN_SHEET_WITH_DATA", + "VOLATILE_FORMULA", + "FORMULA_EXTERNAL_REFERENCE", + "STALE_OR_MISSING_CALCULATION_EVIDENCE", + "FORMULA_WITHOUT_PROVENANCE", + "MISSING_NORMALIZED_EXPORT", + "INVALID_EXPORT_DIGEST", +]) { + assert(risky.findings.some((finding) => finding.code === code), `missing ${code}`); +} + +const reviseOnly = assessSpreadsheetProvenance({ + ...cleanSpreadsheet, + sheets: cleanSpreadsheet.sheets.map((sheet) => + sheet.name === "model" + ? { + ...sheet, + cells: sheet.cells.map((cell) => ({ ...cell, recalculatedAt: "" })), + } + : sheet + ), +}); +assert.strictEqual(reviseOnly.decision, "revise"); +assert(reviseOnly.findings.some((finding) => finding.code === "STALE_OR_MISSING_CALCULATION_EVIDENCE")); + +assert.throws( + () => normalizeSpreadsheet({ ...cleanSpreadsheet, datasetId: "" }), + /datasetId must be a non-empty string/ +); + +console.log("spreadsheet formula provenance guard tests passed");