From 30b47ffb436391c9408c5ba1079f9d1ed6e03ec9 Mon Sep 17 00:00:00 2001 From: Jiahui Wu Date: Fri, 5 Jun 2026 23:17:02 +0800 Subject: [PATCH] Add reviewer calibration assistant --- .../demo/generate-demo.js | 50 +++++ .../demo/write-svg.js | 46 ++++ reviewer-calibration-assistant/package.json | 12 ++ reviewer-calibration-assistant/readme.md | 36 ++++ .../reports/reviewer-calibration-demo.mp4 | Bin 0 -> 84307 bytes .../reports/reviewer-calibration-report.json | 89 ++++++++ .../reports/reviewer-calibration-report.md | 26 +++ .../reports/reviewer-calibration-summary.svg | 40 ++++ .../src/calibration.js | 203 ++++++++++++++++++ .../test/calibration.test.js | 94 ++++++++ 10 files changed, 596 insertions(+) create mode 100644 reviewer-calibration-assistant/demo/generate-demo.js create mode 100644 reviewer-calibration-assistant/demo/write-svg.js create mode 100644 reviewer-calibration-assistant/package.json create mode 100644 reviewer-calibration-assistant/readme.md create mode 100644 reviewer-calibration-assistant/reports/reviewer-calibration-demo.mp4 create mode 100644 reviewer-calibration-assistant/reports/reviewer-calibration-report.json create mode 100644 reviewer-calibration-assistant/reports/reviewer-calibration-report.md create mode 100644 reviewer-calibration-assistant/reports/reviewer-calibration-summary.svg create mode 100644 reviewer-calibration-assistant/src/calibration.js create mode 100644 reviewer-calibration-assistant/test/calibration.test.js diff --git a/reviewer-calibration-assistant/demo/generate-demo.js b/reviewer-calibration-assistant/demo/generate-demo.js new file mode 100644 index 00000000..2dd5116c --- /dev/null +++ b/reviewer-calibration-assistant/demo/generate-demo.js @@ -0,0 +1,50 @@ +import { mkdirSync, writeFileSync } from "node:fs"; +import { evaluateReviewerCalibration, renderMarkdownReport } from "../src/calibration.js"; + +const packet = { + projectId: "proj-neuro-118", + manuscriptId: "ms-gapfinder-204", + domainTemplate: "neuroscience", + reviewMode: "public", + reviews: [ + { + reviewerId: "rev-stat", + template: "neuroscience", + recommendation: "major_revision", + scores: { clarity: 3, rigor: 2, novelty: 4, reproducibility: 2 }, + claimChecks: [ + { claimId: "claim-primary-endpoint", evidenceIds: ["fig-2", "table-1"] }, + { claimId: "claim-causal-language", evidenceIds: ["methods-4"] }, + { claimId: "claim-replication", evidenceIds: [] } + ] + }, + { + reviewerId: "rev-domain", + template: "neuroscience", + recommendation: "minor_revision", + scores: { clarity: 4, rigor: 4, novelty: 4, reproducibility: 3 }, + claimChecks: [ + { claimId: "claim-primary-endpoint", evidenceIds: ["fig-2"] }, + { claimId: "claim-causal-language", evidenceIds: [] }, + { claimId: "claim-replication", evidenceIds: ["supp-1"] } + ] + }, + { + reviewerId: "rev-methods", + template: "clinical_trials", + recommendation: "reject", + scores: { clarity: 2, rigor: 1, novelty: 3, reproducibility: 1 }, + claimChecks: [ + { claimId: "claim-primary-endpoint", evidenceIds: ["table-1"] }, + { claimId: "claim-causal-language", evidenceIds: [] }, + { claimId: "claim-replication", evidenceIds: [] } + ] + } + ] +}; + +mkdirSync("reports", { recursive: true }); +const result = evaluateReviewerCalibration(packet); +writeFileSync("reports/reviewer-calibration-report.json", `${JSON.stringify(result, null, 2)}\n`); +writeFileSync("reports/reviewer-calibration-report.md", renderMarkdownReport(result)); +console.log(JSON.stringify(result, null, 2)); diff --git a/reviewer-calibration-assistant/demo/write-svg.js b/reviewer-calibration-assistant/demo/write-svg.js new file mode 100644 index 00000000..8f2f04f1 --- /dev/null +++ b/reviewer-calibration-assistant/demo/write-svg.js @@ -0,0 +1,46 @@ +import { readFileSync, writeFileSync } from "node:fs"; + +const result = JSON.parse(readFileSync("reports/reviewer-calibration-report.json", "utf8")); +const blockerLines = result.blockers.slice(0, 5).map((blocker, index) => + `${blocker}` +).join("\n"); + +const svg = ` + + + Reviewer Calibration Assistant + AI-Powered Research Assistant Suite evidence artifact + + + Decision + ${result.decision} + + + Agreement + ${result.pairwiseAgreement} + + + Consensus + ${result.consensusAction} + + + Blockers + ${result.blockers.length} + + Calibration blockers + ${blockerLines} + Synthetic data only. No private manuscripts, external AI APIs, credentials, or payment systems. + + +`; + +writeFileSync("reports/reviewer-calibration-summary.svg", svg); diff --git a/reviewer-calibration-assistant/package.json b/reviewer-calibration-assistant/package.json new file mode 100644 index 00000000..29bcab62 --- /dev/null +++ b/reviewer-calibration-assistant/package.json @@ -0,0 +1,12 @@ +{ + "name": "reviewer-calibration-assistant", + "version": "1.0.0", + "description": "Deterministic reviewer calibration and inter-rater agreement assistant for SCIBASE AI review workflows.", + "type": "module", + "scripts": { + "test": "node test/calibration.test.js", + "demo": "node demo/generate-demo.js", + "demo:video": "npm run demo && node demo/write-svg.js && qlmanage -t -s 1280 -o reports reports/reviewer-calibration-summary.svg >/dev/null && ffmpeg -y -loop 1 -framerate 30 -t 8 -i reports/reviewer-calibration-summary.svg.png -vf format=yuv420p reports/reviewer-calibration-demo.mp4" + }, + "license": "MIT" +} diff --git a/reviewer-calibration-assistant/readme.md b/reviewer-calibration-assistant/readme.md new file mode 100644 index 00000000..951b21ee --- /dev/null +++ b/reviewer-calibration-assistant/readme.md @@ -0,0 +1,36 @@ +# Reviewer Calibration Assistant + +This module adds a deterministic reviewer calibration and inter-rater agreement assistant for the SCIBASE AI-Powered Research Assistant Suite. + +## Scope + +The assistant evaluates review packets before AI-generated peer-review summaries, reputation updates, or author-facing recommendations are released. It focuses on a distinct quality gate not covered by the existing broad assistant, reproducibility checker, research-gap finder, structured-abstract, model-assumption, dependency, external-validity, or evidence-binder slices. + +It checks: + +- pairwise reviewer agreement across clarity, rigor, novelty, reproducibility, and recommendation; +- recommendation consensus ratio; +- severe score spread by scoring dimension; +- domain-template drift; +- evidence-anchor coverage for reviewer claim checks; +- duplicate reviewer records; +- whether disputed packets should remain double-blind during calibration. + +## Local Validation + +```sh +npm test +npm run demo +npm run demo:video +``` + +The demo writes reviewer-ready evidence artifacts to `reports/`: + +- `reviewer-calibration-report.json` +- `reviewer-calibration-report.md` +- `reviewer-calibration-summary.svg` +- `reviewer-calibration-demo.mp4` + +## Boundaries + +The implementation is dependency-free and uses synthetic data only. It does not call external AI APIs, ingest private manuscripts, access credentials, or integrate with payment systems. diff --git a/reviewer-calibration-assistant/reports/reviewer-calibration-demo.mp4 b/reviewer-calibration-assistant/reports/reviewer-calibration-demo.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..21c9a222122d792975cb247a09e4a7c14a6a5e92 GIT binary patch literal 84307 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Ⓢ4Qt>%kuThk$+HvA-MG2Oj%J2e0G@d+eW) z*asf_z+-_aIAAusU%T;OkG;2)g1`PfhVJH{z&_YxAMCLY_SnB)5A!=_UdazU_Rp|_ zhjj&ih!s5W*xwH9&zaW)kNxeyKGqXGc`NkSciKvA-SI z2Oj%JS;51)f(F9Nhtrb7wUidD_FUIV8eT#UJw2X z07U-5J=A}!kJY)m4KDuQ0Q>EJPyv8_@K^8ywZ8?HTOfY#*NSf0yBpyB{hz}4KiR`N z|G+gF@&ARu0#2Ohe!u4yBqIweD+k~)%q<*D41wcc1&9q0h=3mi2DmKztJuH2022Nt z5d`A@>%9MX4h{k#hS}NZy#|sr?Oy+=6TtdE!>`hSdjCHBT|NJ-UMS!<_ZtvMj127n zFJmBFBXe83A2C1f^uAokU-yg%Yhh@r2c!X?N&fq1=LYgDft1>R{F2th(A?%%86XE! zL%{vxUxG4lZ6&T}X=rYAp9i7L!qgIQYX-t_u=r8vU*9%~;mN_#9vHVQ@vB$mx+$MrJfLuaghJXX+Wf1Nw;Fv$dF9+@$@8Ro7c;6L( z9gOD+G*dGe2-;+OrH{Dz=KS8HDF{Q~&gLhsV4RKj5kSDUwflkj{rUYZ0)BCT<_7Wt zk8<16}@h1)s`tc_Y!2WOaBkcV(&{=-;7hGU$Hn@)f!mqLUe%!u4hZqOaTz;hd z+yU`lZvcix23+2gheBY}1F}j0N3WmfAPwO72G{@(;2izifeW4&=@?i{2KA7+49{&d&ellJF literal 0 HcmV?d00001 diff --git a/reviewer-calibration-assistant/reports/reviewer-calibration-report.json b/reviewer-calibration-assistant/reports/reviewer-calibration-report.json new file mode 100644 index 00000000..f69dc99f --- /dev/null +++ b/reviewer-calibration-assistant/reports/reviewer-calibration-report.json @@ -0,0 +1,89 @@ +{ + "projectId": "proj-neuro-118", + "manuscriptId": "ms-gapfinder-204", + "reviewerCount": 3, + "reviewMode": "public", + "consensusAction": "major_revision", + "consensusRatio": 0.333, + "pairwiseAgreement": 0.667, + "pairwiseDetails": [ + { + "reviewers": [ + "rev-stat", + "rev-domain" + ], + "agreement": 0.75 + }, + { + "reviewers": [ + "rev-stat", + "rev-methods" + ], + "agreement": 0.75 + }, + { + "reviewers": [ + "rev-domain", + "rev-methods" + ], + "agreement": 0.5 + } + ], + "scoreDivergence": [ + { + "field": "clarity", + "spread": 2 + }, + { + "field": "rigor", + "spread": 3 + }, + { + "field": "reproducibility", + "spread": 2 + } + ], + "templateDrift": [ + { + "reviewerId": "rev-methods", + "expectedTemplate": "neuroscience", + "actualTemplate": "clinical_trials" + } + ], + "evidenceGaps": [ + { + "reviewerId": "rev-stat", + "coverage": 0.667 + }, + { + "reviewerId": "rev-domain", + "coverage": 0.667 + }, + { + "reviewerId": "rev-methods", + "coverage": 0.333 + } + ], + "blindModeRisk": { + "reviewMode": "public", + "reason": "disputed review packet should remain double-blind until calibration is complete" + }, + "duplicateReviewers": [], + "blockers": [ + "low_inter_rater_agreement", + "weak_recommendation_consensus", + "severe_score_divergence", + "domain_template_drift", + "insufficient_evidence_coverage", + "blind_mode_escalation_required" + ], + "decision": "calibrate_before_release", + "nextActions": [ + "Run reviewer calibration on divergent scoring dimensions before author-facing release.", + "Request adjudication because recommendation consensus is below threshold.", + "Ask reviewers to justify high-spread score dimensions with evidence anchors.", + "Normalize all reviews to the configured domain template.", + "Require evidence anchors for unsupported claim checks.", + "Keep disputed packets double-blind until calibration is resolved." + ] +} diff --git a/reviewer-calibration-assistant/reports/reviewer-calibration-report.md b/reviewer-calibration-assistant/reports/reviewer-calibration-report.md new file mode 100644 index 00000000..e1eb1a3d --- /dev/null +++ b/reviewer-calibration-assistant/reports/reviewer-calibration-report.md @@ -0,0 +1,26 @@ +# Reviewer Calibration Assistant Report + +| Field | Value | +| --- | --- | +| Project | proj-neuro-118 | +| Manuscript | ms-gapfinder-204 | +| Reviewers | 3 | +| Decision | calibrate_before_release | +| Pairwise agreement | 0.667 | +| Consensus action | major_revision (0.333) | + +## Blockers +- low_inter_rater_agreement +- weak_recommendation_consensus +- severe_score_divergence +- domain_template_drift +- insufficient_evidence_coverage +- blind_mode_escalation_required + +## Required Actions +- Run reviewer calibration on divergent scoring dimensions before author-facing release. +- Request adjudication because recommendation consensus is below threshold. +- Ask reviewers to justify high-spread score dimensions with evidence anchors. +- Normalize all reviews to the configured domain template. +- Require evidence anchors for unsupported claim checks. +- Keep disputed packets double-blind until calibration is resolved. diff --git a/reviewer-calibration-assistant/reports/reviewer-calibration-summary.svg b/reviewer-calibration-assistant/reports/reviewer-calibration-summary.svg new file mode 100644 index 00000000..c590c0c5 --- /dev/null +++ b/reviewer-calibration-assistant/reports/reviewer-calibration-summary.svg @@ -0,0 +1,40 @@ + + + + Reviewer Calibration Assistant + AI-Powered Research Assistant Suite evidence artifact + + + Decision + calibrate_before_release + + + Agreement + 0.667 + + + Consensus + major_revision + + + Blockers + 6 + + Calibration blockers + low_inter_rater_agreement +weak_recommendation_consensus +severe_score_divergence +domain_template_drift +insufficient_evidence_coverage + Synthetic data only. No private manuscripts, external AI APIs, credentials, or payment systems. + + diff --git a/reviewer-calibration-assistant/src/calibration.js b/reviewer-calibration-assistant/src/calibration.js new file mode 100644 index 00000000..559637f1 --- /dev/null +++ b/reviewer-calibration-assistant/src/calibration.js @@ -0,0 +1,203 @@ +const DEFAULT_THRESHOLDS = { + minimumPairwiseAgreement: 0.68, + severeScoreSpread: 2, + actionConsensusRatio: 0.67, + requiredEvidenceCoverage: 0.75, + requireBlindModeForDisputedReviews: true +}; + +const ACTION_RANK = { + accept: 4, + minor_revision: 3, + major_revision: 2, + reject: 1 +}; + +const SCORE_FIELDS = ["clarity", "rigor", "novelty", "reproducibility"]; + +function clamp(value, min, max) { + return Math.max(min, Math.min(max, value)); +} + +function unique(values) { + return [...new Set(values)]; +} + +function mode(values) { + const counts = new Map(); + for (const value of values) counts.set(value, (counts.get(value) || 0) + 1); + return [...counts.entries()].sort((a, b) => b[1] - a[1] || String(a[0]).localeCompare(String(b[0])))[0]; +} + +function average(values) { + return values.length ? values.reduce((sum, value) => sum + value, 0) / values.length : 0; +} + +function scoreSpread(reviews, field) { + const scores = reviews.map((review) => Number(review.scores?.[field] ?? 0)); + return Math.max(...scores) - Math.min(...scores); +} + +function reviewVector(review) { + const scoreValues = SCORE_FIELDS.map((field) => Number(review.scores?.[field] ?? 0)); + const actionValue = ACTION_RANK[review.recommendation] ?? 0; + return [...scoreValues, actionValue]; +} + +function pairAgreement(left, right) { + const leftVector = reviewVector(left); + const rightVector = reviewVector(right); + const distances = leftVector.map((value, index) => Math.abs(value - rightVector[index]) / 4); + return clamp(1 - average(distances), 0, 1); +} + +function buildPairs(reviews) { + const pairs = []; + for (let i = 0; i < reviews.length; i += 1) { + for (let j = i + 1; j < reviews.length; j += 1) { + pairs.push({ + reviewers: [reviews[i].reviewerId, reviews[j].reviewerId], + agreement: Number(pairAgreement(reviews[i], reviews[j]).toFixed(3)) + }); + } + } + return pairs; +} + +function evidenceCoverage(review) { + const claims = review.claimChecks || []; + if (claims.length === 0) return 0; + const supported = claims.filter((claim) => claim.evidenceIds?.length > 0).length; + return supported / claims.length; +} + +function detectDomainTemplateDrift(packet) { + const expected = packet.domainTemplate; + return packet.reviews + .filter((review) => review.template !== expected) + .map((review) => ({ + reviewerId: review.reviewerId, + expectedTemplate: expected, + actualTemplate: review.template || "missing" + })); +} + +function detectEvidenceGaps(packet, thresholds) { + return packet.reviews + .map((review) => ({ + reviewerId: review.reviewerId, + coverage: Number(evidenceCoverage(review).toFixed(3)) + })) + .filter((review) => review.coverage < thresholds.requiredEvidenceCoverage); +} + +function detectScoreDivergence(reviews, thresholds) { + return SCORE_FIELDS + .map((field) => ({ field, spread: scoreSpread(reviews, field) })) + .filter((item) => item.spread >= thresholds.severeScoreSpread); +} + +function detectBlindModeRisk(packet, thresholds, scoreDivergence, pairwiseAgreement) { + if (!thresholds.requireBlindModeForDisputedReviews) return null; + if (packet.reviewMode === "double_blind") return null; + if (scoreDivergence.length === 0 && pairwiseAgreement >= thresholds.minimumPairwiseAgreement) return null; + return { + reviewMode: packet.reviewMode || "missing", + reason: "disputed review packet should remain double-blind until calibration is complete" + }; +} + +export function evaluateReviewerCalibration(packet, customThresholds = {}) { + const thresholds = { ...DEFAULT_THRESHOLDS, ...customThresholds }; + if (!packet || !Array.isArray(packet.reviews) || packet.reviews.length < 2) { + throw new Error("Reviewer calibration requires at least two review records."); + } + + const duplicateReviewers = unique( + packet.reviews + .map((review) => review.reviewerId) + .filter((reviewerId, index, all) => all.indexOf(reviewerId) !== index) + ); + const pairs = buildPairs(packet.reviews); + const pairwiseAgreement = Number(average(pairs.map((pair) => pair.agreement)).toFixed(3)); + const [consensusAction, consensusCount] = mode(packet.reviews.map((review) => review.recommendation)); + const consensusRatio = Number((consensusCount / packet.reviews.length).toFixed(3)); + const scoreDivergence = detectScoreDivergence(packet.reviews, thresholds); + const templateDrift = detectDomainTemplateDrift(packet); + const evidenceGaps = detectEvidenceGaps(packet, thresholds); + const blindModeRisk = detectBlindModeRisk(packet, thresholds, scoreDivergence, pairwiseAgreement); + + const blockers = []; + if (duplicateReviewers.length) blockers.push("duplicate_reviewer_records"); + if (pairwiseAgreement < thresholds.minimumPairwiseAgreement) blockers.push("low_inter_rater_agreement"); + if (consensusRatio < thresholds.actionConsensusRatio) blockers.push("weak_recommendation_consensus"); + if (scoreDivergence.length) blockers.push("severe_score_divergence"); + if (templateDrift.length) blockers.push("domain_template_drift"); + if (evidenceGaps.length) blockers.push("insufficient_evidence_coverage"); + if (blindModeRisk) blockers.push("blind_mode_escalation_required"); + + return { + projectId: packet.projectId, + manuscriptId: packet.manuscriptId, + reviewerCount: packet.reviews.length, + reviewMode: packet.reviewMode, + consensusAction, + consensusRatio, + pairwiseAgreement, + pairwiseDetails: pairs, + scoreDivergence, + templateDrift, + evidenceGaps, + blindModeRisk, + duplicateReviewers, + blockers, + decision: blockers.length ? "calibrate_before_release" : "release_review_summary", + nextActions: buildNextActions(blockers) + }; +} + +function buildNextActions(blockers) { + const actionMap = { + duplicate_reviewer_records: "Remove duplicate reviewer entries before reputation or review-summary updates.", + low_inter_rater_agreement: "Run reviewer calibration on divergent scoring dimensions before author-facing release.", + weak_recommendation_consensus: "Request adjudication because recommendation consensus is below threshold.", + severe_score_divergence: "Ask reviewers to justify high-spread score dimensions with evidence anchors.", + domain_template_drift: "Normalize all reviews to the configured domain template.", + insufficient_evidence_coverage: "Require evidence anchors for unsupported claim checks.", + blind_mode_escalation_required: "Keep disputed packets double-blind until calibration is resolved." + }; + return blockers.map((blocker) => actionMap[blocker]); +} + +export function renderMarkdownReport(result) { + const rows = [ + ["Project", result.projectId], + ["Manuscript", result.manuscriptId], + ["Reviewers", result.reviewerCount], + ["Decision", result.decision], + ["Pairwise agreement", result.pairwiseAgreement], + ["Consensus action", `${result.consensusAction} (${result.consensusRatio})`] + ]; + const summary = rows.map(([label, value]) => `| ${label} | ${value} |`).join("\n"); + const blockers = result.blockers.length + ? result.blockers.map((blocker) => `- ${blocker}`).join("\n") + : "- none"; + const actions = result.nextActions.length + ? result.nextActions.map((action) => `- ${action}`).join("\n") + : "- Review packet can be released."; + + return [ + "# Reviewer Calibration Assistant Report", + "", + "| Field | Value |", + "| --- | --- |", + summary, + "", + "## Blockers", + blockers, + "", + "## Required Actions", + actions, + "" + ].join("\n"); +} diff --git a/reviewer-calibration-assistant/test/calibration.test.js b/reviewer-calibration-assistant/test/calibration.test.js new file mode 100644 index 00000000..a121b7bd --- /dev/null +++ b/reviewer-calibration-assistant/test/calibration.test.js @@ -0,0 +1,94 @@ +import assert from "node:assert/strict"; +import { evaluateReviewerCalibration, renderMarkdownReport } from "../src/calibration.js"; + +const basePacket = { + projectId: "proj-crispr-042", + manuscriptId: "ms-review-17", + domainTemplate: "clinical_trials", + reviewMode: "double_blind", + reviews: [ + { + reviewerId: "rev-a", + template: "clinical_trials", + recommendation: "major_revision", + scores: { clarity: 3, rigor: 2, novelty: 3, reproducibility: 2 }, + claimChecks: [ + { claimId: "c1", evidenceIds: ["e1"] }, + { claimId: "c2", evidenceIds: ["e2"] } + ] + }, + { + reviewerId: "rev-b", + template: "clinical_trials", + recommendation: "major_revision", + scores: { clarity: 3, rigor: 2, novelty: 3, reproducibility: 2 }, + claimChecks: [ + { claimId: "c1", evidenceIds: ["e1"] }, + { claimId: "c2", evidenceIds: ["e2"] } + ] + }, + { + reviewerId: "rev-c", + template: "clinical_trials", + recommendation: "major_revision", + scores: { clarity: 4, rigor: 3, novelty: 3, reproducibility: 3 }, + claimChecks: [ + { claimId: "c1", evidenceIds: ["e1"] }, + { claimId: "c2", evidenceIds: ["e2"] } + ] + } + ] +}; + +const riskyPacket = { + ...basePacket, + reviewMode: "public", + reviews: [ + basePacket.reviews[0], + { + reviewerId: "rev-b", + template: "molecular_biology", + recommendation: "accept", + scores: { clarity: 5, rigor: 5, novelty: 5, reproducibility: 5 }, + claimChecks: [ + { claimId: "c1", evidenceIds: [] }, + { claimId: "c2", evidenceIds: [] } + ] + }, + { + reviewerId: "rev-c", + template: "clinical_trials", + recommendation: "reject", + scores: { clarity: 1, rigor: 1, novelty: 2, reproducibility: 1 }, + claimChecks: [ + { claimId: "c1", evidenceIds: ["e1"] }, + { claimId: "c2", evidenceIds: [] } + ] + } + ] +}; + +const ready = evaluateReviewerCalibration(basePacket); +assert.equal(ready.decision, "release_review_summary"); +assert.equal(ready.blockers.length, 0); +assert.equal(ready.consensusAction, "major_revision"); +assert.ok(ready.pairwiseAgreement >= 0.8); + +const risky = evaluateReviewerCalibration(riskyPacket); +assert.equal(risky.decision, "calibrate_before_release"); +assert.ok(risky.blockers.includes("low_inter_rater_agreement")); +assert.ok(risky.blockers.includes("severe_score_divergence")); +assert.ok(risky.blockers.includes("domain_template_drift")); +assert.ok(risky.blockers.includes("insufficient_evidence_coverage")); +assert.ok(risky.blockers.includes("blind_mode_escalation_required")); +assert.equal(risky.templateDrift[0].reviewerId, "rev-b"); +assert.equal(risky.evidenceGaps.length, 2); + +assert.throws(() => evaluateReviewerCalibration({ reviews: [basePacket.reviews[0]] }), /at least two/); + +const report = renderMarkdownReport(risky); +assert.match(report, /Reviewer Calibration Assistant Report/); +assert.match(report, /calibrate_before_release/); +assert.match(report, /low_inter_rater_agreement/); + +console.log("reviewer calibration assistant tests passed");