From 2585a3b3127c9f58fe6e67c1f5c00e814cf6b177 Mon Sep 17 00:00:00 2001 From: IOROHKI Date: Wed, 20 May 2026 03:29:13 -0700 Subject: [PATCH] Add challenge evidence freeze gate --- challenge-evidence-freeze-gate/README.md | 30 ++ challenge-evidence-freeze-gate/demo.js | 25 ++ challenge-evidence-freeze-gate/index.js | 268 ++++++++++++++++++ .../reports/arbitration-packet.md | 30 ++ .../reports/demo.mp4 | Bin 0 -> 73027 bytes .../reports/freeze-audit.json | 121 ++++++++ .../reports/freeze-gate.svg | 1 + .../requirements-map.md | 17 ++ challenge-evidence-freeze-gate/sample-data.js | 104 +++++++ challenge-evidence-freeze-gate/test.js | 33 +++ 10 files changed, 629 insertions(+) create mode 100644 challenge-evidence-freeze-gate/README.md create mode 100644 challenge-evidence-freeze-gate/demo.js create mode 100644 challenge-evidence-freeze-gate/index.js create mode 100644 challenge-evidence-freeze-gate/reports/arbitration-packet.md create mode 100644 challenge-evidence-freeze-gate/reports/demo.mp4 create mode 100644 challenge-evidence-freeze-gate/reports/freeze-audit.json create mode 100644 challenge-evidence-freeze-gate/reports/freeze-gate.svg create mode 100644 challenge-evidence-freeze-gate/requirements-map.md create mode 100644 challenge-evidence-freeze-gate/sample-data.js create mode 100644 challenge-evidence-freeze-gate/test.js diff --git a/challenge-evidence-freeze-gate/README.md b/challenge-evidence-freeze-gate/README.md new file mode 100644 index 0000000..4cc21b2 --- /dev/null +++ b/challenge-evidence-freeze-gate/README.md @@ -0,0 +1,30 @@ +# Challenge Evidence Freeze Gate + +This module is a focused slice for SCIBASE.AI issue #18, Scientific Bounty System. + +It freezes solver submission evidence at the challenge deadline, compares later sponsor/reviewer packets against the frozen manifest, and emits tamper-diff decisions before scoring, arbitration, payout, or IP transfer. + +## What It Covers + +- Deadline-locked artifact manifests and manifest hashes. +- Post-deadline checksum drift, metric drift, metadata drift, removals, and late-added artifacts. +- Reviewer-visible exception justifications. +- Scoring exclusions and payout/arbitration hold decisions. +- Public exception notes and reviewer task packets. +- JSON audit packets, Markdown arbitration packets, SVG summaries, and a short MP4 demo artifact. + +The sample data is synthetic. The module is dependency-free and does not call external services. + +## Run + +```bash +node challenge-evidence-freeze-gate/test.js +node challenge-evidence-freeze-gate/demo.js +``` + +Demo output is written to: + +- `reports/freeze-audit.json` +- `reports/arbitration-packet.md` +- `reports/freeze-gate.svg` +- `reports/demo.mp4` diff --git a/challenge-evidence-freeze-gate/demo.js b/challenge-evidence-freeze-gate/demo.js new file mode 100644 index 0000000..fb293af --- /dev/null +++ b/challenge-evidence-freeze-gate/demo.js @@ -0,0 +1,25 @@ +const fs = require("node:fs"); +const path = require("node:path"); +const data = require("./sample-data"); +const { renderMarkdown, renderSvg, runFreezeGate } = require("./index"); + +const report = runFreezeGate(data); +const reportsDir = path.join(__dirname, "reports"); +fs.mkdirSync(reportsDir, { recursive: true }); +fs.writeFileSync(path.join(reportsDir, "freeze-audit.json"), JSON.stringify(report, null, 2)); +fs.writeFileSync(path.join(reportsDir, "arbitration-packet.md"), renderMarkdown(report)); +fs.writeFileSync(path.join(reportsDir, "freeze-gate.svg"), renderSvg(report)); + +console.log(JSON.stringify({ + decision: report.summary.releaseDecision, + blockerCount: report.summary.blockerCount, + totalDiffs: report.summary.totalDiffs, + excludedFromScoring: [...new Set(report.arbitrationPacket.excludedFromScoring)], + auditDigest: report.auditDigest, + reports: [ + "reports/freeze-audit.json", + "reports/arbitration-packet.md", + "reports/freeze-gate.svg", + "reports/demo.mp4" + ] +}, null, 2)); diff --git a/challenge-evidence-freeze-gate/index.js b/challenge-evidence-freeze-gate/index.js new file mode 100644 index 0000000..4d68588 --- /dev/null +++ b/challenge-evidence-freeze-gate/index.js @@ -0,0 +1,268 @@ +const crypto = require("node:crypto"); + +const BLOCKING_DIFFS = new Set([ + "primary-artifact-added-after-deadline", + "checksum-drift", + "metric-drift" +]); + +function stableStringify(value) { + if (Array.isArray(value)) return `[${value.map(stableStringify).join(",")}]`; + if (value && typeof value === "object") { + return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`).join(",")}}`; + } + return JSON.stringify(value); +} + +function digest(value) { + return crypto.createHash("sha256").update(stableStringify(value)).digest("hex"); +} + +function byId(items) { + return new Map(items.map((item) => [item.id, item])); +} + +function isPrimary(artifact) { + return ["primary-model", "primary-result", "dataset", "analysis-notebook"].includes(artifact.type); +} + +function addDiff(diffs, severity, code, artifactId, message, task, justification = "") { + diffs.push({ severity, code, artifactId, message, task, justification }); +} + +function compareArtifact(frozen, current, challenge) { + const diffs = []; + if (frozen.checksum !== current.checksum) { + addDiff( + diffs, + challenge.rules.blockChecksumDrift ? "blocker" : "high", + "checksum-drift", + current.id, + `${current.id} checksum changed from ${frozen.checksum} to ${current.checksum}.`, + "Freeze evaluation for this artifact and route to arbitration before scoring.", + current.exceptionJustification || "" + ); + } + + if (frozen.metric?.name === current.metric?.name && frozen.metric?.value !== current.metric?.value) { + addDiff( + diffs, + challenge.rules.blockMetricDrift ? "blocker" : "high", + "metric-drift", + current.id, + `${current.id} metric ${current.metric.name} changed from ${frozen.metric.value} to ${current.metric.value}.`, + "Require reviewer-visible metric-change explanation and pre-deadline reproduction evidence.", + current.exceptionJustification || "" + ); + } + + if (frozen.bytes !== current.bytes && frozen.checksum === current.checksum) { + addDiff( + diffs, + "medium", + "metadata-size-drift", + current.id, + `${current.id} size changed while checksum stayed fixed.`, + "Verify packaging metadata and storage manifest generation.", + current.exceptionJustification || "" + ); + } + + if (JSON.stringify(frozen.metadata) !== JSON.stringify(current.metadata)) { + addDiff( + diffs, + "medium", + "metadata-drift", + current.id, + `${current.id} metadata changed after freeze.`, + "Record a reviewer-visible metadata exception before releasing the packet.", + current.exceptionJustification || "" + ); + } + + if (diffs.length && challenge.rules.requireReviewerVisibleJustification && !current.exceptionJustification) { + addDiff( + diffs, + "high", + "exception-justification-missing", + current.id, + `${current.id} changed after freeze without a reviewer-visible justification.`, + "Block sponsor preview until the solver provides an exception justification." + ); + } + + return diffs; +} + +function compareSubmissions(challenge, frozenSubmission, currentSubmission) { + const frozenMap = byId(frozenSubmission.artifacts); + const currentMap = byId(currentSubmission.artifacts); + const diffs = []; + + for (const current of currentSubmission.artifacts) { + const frozen = frozenMap.get(current.id); + if (!frozen) { + const primary = isPrimary(current); + addDiff( + diffs, + primary && challenge.rules.blockLatePrimaryArtifacts ? "blocker" : "high", + primary ? "primary-artifact-added-after-deadline" : "artifact-added-after-deadline", + current.id, + `${current.id} was added after the frozen deadline manifest.`, + primary ? "Exclude this artifact from scoring and hold payout/arbitration until reviewed." : "Route late artifact to reviewer exception queue.", + current.exceptionJustification || "" + ); + if (challenge.rules.requireReviewerVisibleJustification && !current.exceptionJustification) { + addDiff( + diffs, + "high", + "exception-justification-missing", + current.id, + `${current.id} has no reviewer-visible late-addition justification.`, + "Require a public exception note before sponsor review." + ); + } + continue; + } + diffs.push(...compareArtifact(frozen, current, challenge)); + } + + for (const frozen of frozenSubmission.artifacts) { + if (!currentMap.has(frozen.id)) { + addDiff( + diffs, + "blocker", + "artifact-removed-after-deadline", + frozen.id, + `${frozen.id} was present in the frozen manifest but is absent from the current packet.`, + "Restore the frozen artifact or mark the submission incomplete before evaluation." + ); + } + } + + return diffs; +} + +function summarizeDiffs(diffs) { + const countsBySeverity = diffs.reduce((counts, diff) => { + counts[diff.severity] = (counts[diff.severity] || 0) + 1; + return counts; + }, {}); + const countsByCode = diffs.reduce((counts, diff) => { + counts[diff.code] = (counts[diff.code] || 0) + 1; + return counts; + }, {}); + const blockerCount = diffs.filter((diff) => diff.severity === "blocker").length; + const releaseDecision = blockerCount + ? "hold-evaluation-and-payout" + : diffs.length + ? "review-exceptions-before-scoring" + : "frozen-packet-clean"; + return { + releaseDecision, + blockerCount, + totalDiffs: diffs.length, + countsBySeverity, + countsByCode + }; +} + +function buildArbitrationPacket(challenge, frozenSubmission, currentSubmission, diffs) { + return { + challengeId: challenge.id, + submissionId: frozenSubmission.submissionId, + frozenAt: frozenSubmission.frozenAt, + observedAt: currentSubmission.observedAt, + frozenManifestHash: frozenSubmission.manifestHash, + currentManifestHash: currentSubmission.manifestHash, + excludedFromScoring: diffs + .filter((diff) => diff.severity === "blocker" || BLOCKING_DIFFS.has(diff.code)) + .map((diff) => diff.artifactId), + reviewerTasks: diffs.map((diff) => diff.task), + publicExceptionNotes: diffs + .filter((diff) => diff.justification) + .map((diff) => ({ artifactId: diff.artifactId, justification: diff.justification })) + }; +} + +function runFreezeGate(data) { + const diffs = compareSubmissions(data.challenge, data.frozenSubmission, data.currentSubmission); + const summary = summarizeDiffs(diffs); + const arbitrationPacket = buildArbitrationPacket(data.challenge, data.frozenSubmission, data.currentSubmission, diffs); + const packet = { + module: "challenge-evidence-freeze-gate", + challenge: { + id: data.challenge.id, + title: data.challenge.title, + deadline: data.challenge.deadline, + reviewOpenedAt: data.challenge.reviewOpenedAt + }, + submission: { + id: data.frozenSubmission.submissionId, + teamId: data.frozenSubmission.teamId + }, + summary, + diffs, + arbitrationPacket + }; + return { + ...packet, + auditDigest: digest(packet) + }; +} + +function renderMarkdown(report) { + const lines = [ + `# Challenge Evidence Freeze Review: ${report.challenge.title}`, + "", + `Decision: **${report.summary.releaseDecision}**`, + `Blockers: **${report.summary.blockerCount}**`, + `Total diffs: **${report.summary.totalDiffs}**`, + "", + "## Tamper Diff Queue" + ]; + for (const diff of report.diffs) { + lines.push(`- [${diff.severity}] ${diff.artifactId}: ${diff.message}`); + lines.push(` Task: ${diff.task}`); + if (diff.justification) lines.push(` Justification: ${diff.justification}`); + } + lines.push("", "## Arbitration Packet"); + lines.push(`- Frozen manifest: ${report.arbitrationPacket.frozenManifestHash}`); + lines.push(`- Current manifest: ${report.arbitrationPacket.currentManifestHash}`); + lines.push(`- Excluded from scoring: ${[...new Set(report.arbitrationPacket.excludedFromScoring)].join(", ") || "none"}`); + lines.push("", `Audit digest: \`${report.auditDigest}\``); + return `${lines.join("\n")}\n`; +} + +function renderSvg(report) { + const width = 980; + const height = 500; + const blocker = report.summary.blockerCount; + const high = report.summary.countsBySeverity.high || 0; + const medium = report.summary.countsBySeverity.medium || 0; + return [ + ``, + ``, + ``, + `Challenge Evidence Freeze Gate`, + `${report.summary.releaseDecision} | Audit ${report.auditDigest.slice(0, 12)}`, + ``, + `Blockers: ${blocker}`, + ``, + `High: ${high}`, + ``, + `Medium: ${medium}`, + `Excluded: ${[...new Set(report.arbitrationPacket.excludedFromScoring)].join(", ")}`, + `Frozen ${report.arbitrationPacket.frozenManifestHash}`, + `Current ${report.arbitrationPacket.currentManifestHash}`, + `` + ].join(""); +} + +module.exports = { + runFreezeGate, + compareSubmissions, + renderMarkdown, + renderSvg, + digest +}; diff --git a/challenge-evidence-freeze-gate/reports/arbitration-packet.md b/challenge-evidence-freeze-gate/reports/arbitration-packet.md new file mode 100644 index 0000000..1c0fee1 --- /dev/null +++ b/challenge-evidence-freeze-gate/reports/arbitration-packet.md @@ -0,0 +1,30 @@ +# Challenge Evidence Freeze Review: Single-cell biomarker forecast challenge + +Decision: **hold-evaluation-and-payout** +Blockers: **4** +Total diffs: **6** + +## Tamper Diff Queue +- [blocker] model: model checksum changed from sha256:model-v1 to sha256:model-v2. + Task: Freeze evaluation for this artifact and route to arbitration before scoring. + Justification: retrained after discovering seed typo +- [blocker] model: model metric heldout_auc changed from 0.842 to 0.861. + Task: Require reviewer-visible metric-change explanation and pre-deadline reproduction evidence. + Justification: retrained after discovering seed typo +- [blocker] whitepaper: whitepaper metric page_count changed from 12 to 13. + Task: Require reviewer-visible metric-change explanation and pre-deadline reproduction evidence. + Justification: added funding acknowledgement only +- [medium] whitepaper: whitepaper size changed while checksum stayed fixed. + Task: Verify packaging metadata and storage manifest generation. + Justification: added funding acknowledgement only +- [blocker] supplement: supplement was added after the frozen deadline manifest. + Task: Exclude this artifact from scoring and hold payout/arbitration until reviewed. +- [high] supplement: supplement has no reviewer-visible late-addition justification. + Task: Require a public exception note before sponsor review. + +## Arbitration Packet +- Frozen manifest: sha256:frozen-manifest-001 +- Current manifest: sha256:current-manifest-002 +- Excluded from scoring: model, whitepaper, supplement + +Audit digest: `f9aacb2b51e4f942d760548b7e4ebcd13705da0243151e2a223c56e2d8333901` diff --git a/challenge-evidence-freeze-gate/reports/demo.mp4 b/challenge-evidence-freeze-gate/reports/demo.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8a93ea825826162c4ed12e3e7e069ecdef4d158a GIT binary patch literal 73027 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�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 O0yt=A;GmUZ|NI|#eV>H@ literal 0 HcmV?d00001 diff --git a/challenge-evidence-freeze-gate/reports/freeze-audit.json b/challenge-evidence-freeze-gate/reports/freeze-audit.json new file mode 100644 index 0000000..d5f0545 --- /dev/null +++ b/challenge-evidence-freeze-gate/reports/freeze-audit.json @@ -0,0 +1,121 @@ +{ + "module": "challenge-evidence-freeze-gate", + "challenge": { + "id": "challenge-cell-atlas-forecast", + "title": "Single-cell biomarker forecast challenge", + "deadline": "2026-05-18T23:59:59Z", + "reviewOpenedAt": "2026-05-19T09:00:00Z" + }, + "submission": { + "id": "team-northlake-final", + "teamId": "team-northlake" + }, + "summary": { + "releaseDecision": "hold-evaluation-and-payout", + "blockerCount": 4, + "totalDiffs": 6, + "countsBySeverity": { + "blocker": 4, + "medium": 1, + "high": 1 + }, + "countsByCode": { + "checksum-drift": 1, + "metric-drift": 2, + "metadata-size-drift": 1, + "primary-artifact-added-after-deadline": 1, + "exception-justification-missing": 1 + } + }, + "diffs": [ + { + "severity": "blocker", + "code": "checksum-drift", + "artifactId": "model", + "message": "model checksum changed from sha256:model-v1 to sha256:model-v2.", + "task": "Freeze evaluation for this artifact and route to arbitration before scoring.", + "justification": "retrained after discovering seed typo" + }, + { + "severity": "blocker", + "code": "metric-drift", + "artifactId": "model", + "message": "model metric heldout_auc changed from 0.842 to 0.861.", + "task": "Require reviewer-visible metric-change explanation and pre-deadline reproduction evidence.", + "justification": "retrained after discovering seed typo" + }, + { + "severity": "blocker", + "code": "metric-drift", + "artifactId": "whitepaper", + "message": "whitepaper metric page_count changed from 12 to 13.", + "task": "Require reviewer-visible metric-change explanation and pre-deadline reproduction evidence.", + "justification": "added funding acknowledgement only" + }, + { + "severity": "medium", + "code": "metadata-size-drift", + "artifactId": "whitepaper", + "message": "whitepaper size changed while checksum stayed fixed.", + "task": "Verify packaging metadata and storage manifest generation.", + "justification": "added funding acknowledgement only" + }, + { + "severity": "blocker", + "code": "primary-artifact-added-after-deadline", + "artifactId": "supplement", + "message": "supplement was added after the frozen deadline manifest.", + "task": "Exclude this artifact from scoring and hold payout/arbitration until reviewed.", + "justification": "" + }, + { + "severity": "high", + "code": "exception-justification-missing", + "artifactId": "supplement", + "message": "supplement has no reviewer-visible late-addition justification.", + "task": "Require a public exception note before sponsor review.", + "justification": "" + } + ], + "arbitrationPacket": { + "challengeId": "challenge-cell-atlas-forecast", + "submissionId": "team-northlake-final", + "frozenAt": "2026-05-18T23:58:44Z", + "observedAt": "2026-05-19T14:12:00Z", + "frozenManifestHash": "sha256:frozen-manifest-001", + "currentManifestHash": "sha256:current-manifest-002", + "excludedFromScoring": [ + "model", + "model", + "whitepaper", + "supplement" + ], + "reviewerTasks": [ + "Freeze evaluation for this artifact and route to arbitration before scoring.", + "Require reviewer-visible metric-change explanation and pre-deadline reproduction evidence.", + "Require reviewer-visible metric-change explanation and pre-deadline reproduction evidence.", + "Verify packaging metadata and storage manifest generation.", + "Exclude this artifact from scoring and hold payout/arbitration until reviewed.", + "Require a public exception note before sponsor review." + ], + "publicExceptionNotes": [ + { + "artifactId": "model", + "justification": "retrained after discovering seed typo" + }, + { + "artifactId": "model", + "justification": "retrained after discovering seed typo" + }, + { + "artifactId": "whitepaper", + "justification": "added funding acknowledgement only" + }, + { + "artifactId": "whitepaper", + "justification": "added funding acknowledgement only" + } + ] + }, + "auditDigest": "f9aacb2b51e4f942d760548b7e4ebcd13705da0243151e2a223c56e2d8333901" +} \ No newline at end of file diff --git a/challenge-evidence-freeze-gate/reports/freeze-gate.svg b/challenge-evidence-freeze-gate/reports/freeze-gate.svg new file mode 100644 index 0000000..8776724 --- /dev/null +++ b/challenge-evidence-freeze-gate/reports/freeze-gate.svg @@ -0,0 +1 @@ +Challenge Evidence Freeze Gatehold-evaluation-and-payout | Audit f9aacb2b51e4Blockers: 4High: 1Medium: 1Excluded: model, whitepaper, supplementFrozen sha256:frozen-manifest-001Current sha256:current-manifest-002 \ No newline at end of file diff --git a/challenge-evidence-freeze-gate/requirements-map.md b/challenge-evidence-freeze-gate/requirements-map.md new file mode 100644 index 0000000..8ab7f8c --- /dev/null +++ b/challenge-evidence-freeze-gate/requirements-map.md @@ -0,0 +1,17 @@ +# Requirements Map + +Source: SCIBASE.AI issue #18, Scientific Bounty System. + +| Requirement | Implementation | +| --- | --- | +| Submission engine | Frozen and current solver submission packets are modeled with artifact manifests. | +| Version control and audit logs | `manifestHash`, artifact checksums, timestamps, and deterministic audit digests record submission history. | +| Built-in submission package builder | Artifact manifests include model, notebook, whitepaper, and result package metadata. | +| Multi-phase challenge support | The gate sits between deadline close and review/arbitration scoring. | +| Automated deliverable checklists | `compareSubmissions()` checks late additions, removals, checksum drift, metric drift, and metadata drift. | +| Arbitration workflow | `arbitrationPacket` emits exclusions, reviewer tasks, public exception notes, and hold decisions. | +| Escrowed prize and payout readiness | Blocking diffs produce `hold-evaluation-and-payout` before reward or settlement. | +| IP transfer guard | Artifacts retain solver-owned licensing until clean evaluation and payout readiness. | +| Sponsor/reviewer transparency | Exception justifications are captured as reviewer-visible notes. | +| Reviewer-facing artifacts | Demo emits JSON, Markdown, SVG, and MP4 artifacts under `reports/`. | +| Local verification | `test.js` covers checksum drift, metric drift, late primary artifacts, missing justifications, clean packet behavior, digest stability, Markdown output, and SVG output. | diff --git a/challenge-evidence-freeze-gate/sample-data.js b/challenge-evidence-freeze-gate/sample-data.js new file mode 100644 index 0000000..d28e1e3 --- /dev/null +++ b/challenge-evidence-freeze-gate/sample-data.js @@ -0,0 +1,104 @@ +const challenge = { + id: "challenge-cell-atlas-forecast", + title: "Single-cell biomarker forecast challenge", + deadline: "2026-05-18T23:59:59Z", + reviewOpenedAt: "2026-05-19T09:00:00Z", + prizeAmountUsd: 100000, + rules: { + allowPostDeadlineMetadataFixes: true, + requireReviewerVisibleJustification: true, + blockLatePrimaryArtifacts: true, + blockChecksumDrift: true, + blockMetricDrift: true + } +}; + +const frozenSubmission = { + submissionId: "team-northlake-final", + teamId: "team-northlake", + frozenAt: "2026-05-18T23:58:44Z", + manifestHash: "sha256:frozen-manifest-001", + artifacts: [ + { + id: "model", + path: "models/biomarker-forecast.pkl", + type: "primary-model", + checksum: "sha256:model-v1", + bytes: 2481000, + metric: { name: "heldout_auc", value: 0.842 }, + metadata: { license: "solver-retained-until-paid", reviewerVisible: true } + }, + { + id: "notebook", + path: "analysis/final-evaluation.ipynb", + type: "analysis-notebook", + checksum: "sha256:notebook-v1", + bytes: 811000, + metric: { name: "rerun_status", value: "passed" }, + metadata: { kernel: "python3.12", reviewerVisible: true } + }, + { + id: "whitepaper", + path: "docs/methods-whitepaper.pdf", + type: "whitepaper", + checksum: "sha256:whitepaper-v1", + bytes: 402200, + metric: { name: "page_count", value: 12 }, + metadata: { license: "solver-retained-until-paid", reviewerVisible: true } + } + ] +}; + +const currentSubmission = { + submissionId: "team-northlake-final", + teamId: "team-northlake", + observedAt: "2026-05-19T14:12:00Z", + manifestHash: "sha256:current-manifest-002", + artifacts: [ + { + id: "model", + path: "models/biomarker-forecast.pkl", + type: "primary-model", + checksum: "sha256:model-v2", + bytes: 2481400, + metric: { name: "heldout_auc", value: 0.861 }, + metadata: { license: "solver-retained-until-paid", reviewerVisible: true }, + exceptionJustification: "retrained after discovering seed typo" + }, + { + id: "notebook", + path: "analysis/final-evaluation.ipynb", + type: "analysis-notebook", + checksum: "sha256:notebook-v1", + bytes: 811000, + metric: { name: "rerun_status", value: "passed" }, + metadata: { kernel: "python3.12", reviewerVisible: true } + }, + { + id: "whitepaper", + path: "docs/methods-whitepaper.pdf", + type: "whitepaper", + checksum: "sha256:whitepaper-v1", + bytes: 405900, + metric: { name: "page_count", value: 13 }, + metadata: { license: "solver-retained-until-paid", reviewerVisible: true }, + exceptionJustification: "added funding acknowledgement only" + }, + { + id: "supplement", + path: "supplement/post-deadline-ablation.csv", + type: "primary-result", + checksum: "sha256:late-ablation", + bytes: 78000, + metric: { name: "ablation_gain", value: 0.04 }, + metadata: { license: "solver-retained-until-paid", reviewerVisible: true }, + exceptionJustification: "" + } + ] +}; + +module.exports = { + challenge, + frozenSubmission, + currentSubmission +}; diff --git a/challenge-evidence-freeze-gate/test.js b/challenge-evidence-freeze-gate/test.js new file mode 100644 index 0000000..3c44072 --- /dev/null +++ b/challenge-evidence-freeze-gate/test.js @@ -0,0 +1,33 @@ +const assert = require("node:assert/strict"); +const data = require("./sample-data"); +const { compareSubmissions, digest, renderMarkdown, renderSvg, runFreezeGate } = require("./index"); + +const report = runFreezeGate(data); + +assert.equal(report.module, "challenge-evidence-freeze-gate"); +assert.equal(report.summary.releaseDecision, "hold-evaluation-and-payout"); +assert.equal(report.summary.blockerCount, 4); +assert.ok(report.auditDigest.match(/^[a-f0-9]{64}$/)); + +assert.ok(report.diffs.some((diff) => diff.code === "checksum-drift" && diff.artifactId === "model")); +assert.ok(report.diffs.some((diff) => diff.code === "metric-drift" && diff.artifactId === "model")); +assert.ok(report.diffs.some((diff) => diff.code === "primary-artifact-added-after-deadline" && diff.artifactId === "supplement")); +assert.ok(report.diffs.some((diff) => diff.code === "exception-justification-missing" && diff.artifactId === "supplement")); +assert.ok(report.diffs.some((diff) => diff.code === "metadata-size-drift" && diff.artifactId === "whitepaper")); + +assert.ok(report.arbitrationPacket.excludedFromScoring.includes("model")); +assert.ok(report.arbitrationPacket.excludedFromScoring.includes("supplement")); +assert.ok(report.arbitrationPacket.publicExceptionNotes.some((note) => note.artifactId === "model")); + +const cleanCurrent = { + ...data.currentSubmission, + manifestHash: data.frozenSubmission.manifestHash, + artifacts: data.frozenSubmission.artifacts +}; +assert.deepEqual(compareSubmissions(data.challenge, data.frozenSubmission, cleanCurrent), []); + +assert.equal(digest({ b: 2, a: 1 }), digest({ a: 1, b: 2 })); +assert.ok(renderMarkdown(report).includes("Challenge Evidence Freeze Review")); +assert.ok(renderSvg(report).startsWith("