From 89540ba5e44ab2f83bc1e10ef94b824a6f34dbfa Mon Sep 17 00:00:00 2001 From: yunrongy424-oss Date: Thu, 28 May 2026 20:18:32 +0800 Subject: [PATCH] feat(reputation): Add citation coercion guard Add a focused SCIBASE issue #15 module that evaluates peer-review citation pressure before reputation, badge, leaderboard, and project timeline updates apply. Include dependency-free tests, deterministic reports, requirement mapping, acceptance notes, and a generated demo video artifact. Refs #15 --- peer-review-citation-coercion-guard/README.md | 23 + .../acceptance-notes.md | 17 + peer-review-citation-coercion-guard/demo.js | 85 ++++ peer-review-citation-coercion-guard/index.js | 425 ++++++++++++++++++ .../make-demo-video.py | 71 +++ .../package.json | 12 + .../reports/citation-coercion-packet.json | 391 ++++++++++++++++ .../reports/citation-coercion-report.md | 34 ++ .../reports/demo.mp4 | Bin 0 -> 71150 bytes .../reports/summary.svg | 12 + .../requirements-map.md | 26 ++ peer-review-citation-coercion-guard/test.js | 101 +++++ 12 files changed, 1197 insertions(+) create mode 100644 peer-review-citation-coercion-guard/README.md create mode 100644 peer-review-citation-coercion-guard/acceptance-notes.md create mode 100644 peer-review-citation-coercion-guard/demo.js create mode 100644 peer-review-citation-coercion-guard/index.js create mode 100644 peer-review-citation-coercion-guard/make-demo-video.py create mode 100644 peer-review-citation-coercion-guard/package.json create mode 100644 peer-review-citation-coercion-guard/reports/citation-coercion-packet.json create mode 100644 peer-review-citation-coercion-guard/reports/citation-coercion-report.md create mode 100644 peer-review-citation-coercion-guard/reports/demo.mp4 create mode 100644 peer-review-citation-coercion-guard/reports/summary.svg create mode 100644 peer-review-citation-coercion-guard/requirements-map.md create mode 100644 peer-review-citation-coercion-guard/test.js diff --git a/peer-review-citation-coercion-guard/README.md b/peer-review-citation-coercion-guard/README.md new file mode 100644 index 00000000..76930a44 --- /dev/null +++ b/peer-review-citation-coercion-guard/README.md @@ -0,0 +1,23 @@ +# Peer Review Citation Coercion Guard + +This module adds a focused Community & User Reputation slice for SCIBASE issue #15. It evaluates structured peer reviews before they update reviewer reputation, badges, leaderboards, or project timelines when citation pressure is present. + +The guard detects unsupported reviewer self-citation demands, reciprocal citation pressure, journal or editor citation quotas, and clusters of off-topic mandatory citation requests. It also protects authors from reputation or badge penalties while a steward reviews the citation pressure. + +## Run + +```bash +npm test +npm run demo +npm run video +npm run check +``` + +## Outputs + +- `reports/citation-coercion-packet.json` +- `reports/citation-coercion-report.md` +- `reports/summary.svg` +- `reports/demo.mp4` + +All data is synthetic. The module does not use credentials, private users, live review systems, payment systems, or external APIs. diff --git a/peer-review-citation-coercion-guard/acceptance-notes.md b/peer-review-citation-coercion-guard/acceptance-notes.md new file mode 100644 index 00000000..95771521 --- /dev/null +++ b/peer-review-citation-coercion-guard/acceptance-notes.md @@ -0,0 +1,17 @@ +# Acceptance Notes + +The implemented slice is intentionally distinct from existing #15 submissions: + +- It is not a broad reputation ledger. +- It is not citation context-fit, citation venue integrity, or citation diversity work for the research-tools issue. +- It is not review civility, recusal or COI assignment, workload equity, rubric validation, accessibility, identity verification, CRediT role evidence, profile visibility, or evidence recertification. +- It focuses on reviewer-driven citation coercion before peer reviews affect reputation, badges, leaderboards, or project timelines. + +Validation targets: + +- unsupported mandatory reviewer self-citations trigger steward review +- reciprocal citation pressure is flagged without punishing authors +- journal citation quota pressure blocks reputation changes +- legitimate contextual citation suggestions still earn reviewer credit +- double-blind reviewer identity is redacted from outputs +- summary counts and audit digest are deterministic diff --git a/peer-review-citation-coercion-guard/demo.js b/peer-review-citation-coercion-guard/demo.js new file mode 100644 index 00000000..522fdcf2 --- /dev/null +++ b/peer-review-citation-coercion-guard/demo.js @@ -0,0 +1,85 @@ +const fs = require('fs'); +const path = require('path'); +const { + evaluateCitationCoercion, + buildSampleReviewPacket +} = require('./index'); + +const reportsDir = path.join(__dirname, 'reports'); +fs.mkdirSync(reportsDir, { recursive: true }); + +const packet = buildSampleReviewPacket(); +const result = evaluateCitationCoercion(packet); + +const packetPath = path.join(reportsDir, 'citation-coercion-packet.json'); +const reportPath = path.join(reportsDir, 'citation-coercion-report.md'); +const svgPath = path.join(reportsDir, 'summary.svg'); + +fs.writeFileSync(packetPath, `${JSON.stringify(result, null, 2)}\n`); + +const flaggedReviews = result.reviewDecisions + .filter((decision) => decision.decision === 'steward-review-required') + .map((decision) => `- ${decision.id}: ${decision.flags.join(', ')}`) + .join('\n'); + +const taskList = result.stewardTasks + .map((task) => `- ${task.id} (${task.priority}): ${task.requiredAction}`) + .join('\n'); + +const authorProtections = result.authorProtections + .map((protection) => `- ${protection.projectId}: ${protection.blockedUpdates.join(', ')}`) + .join('\n'); + +const markdown = `# Peer Review Citation Coercion Guard + +Packet: ${result.packetId} +Generated: ${result.generatedAt} + +## Summary + +- Total reviews evaluated: ${result.summary.totalReviews} +- Flagged reviews: ${result.summary.flaggedReviews} +- Held reviewer credit: ${result.summary.heldReviewerCredit} +- Protected projects: ${result.summary.protectedProjects} +- Recommended action: ${result.summary.recommendedAction} +- Audit digest: ${result.auditPacket.auditDigest} + +## Flagged Citation Pressure + +${flaggedReviews} + +## Steward Tasks + +${taskList} + +## Author Protections + +${authorProtections} + +## Privacy Notes + +Double-blind reviewer identifiers are replaced with anonymous labels before reports, tasks, and timeline events are emitted. The packet uses synthetic data only and does not contain credentials, private profile emails, live user data, external API calls, payment systems, or real review records. +`; + +fs.writeFileSync(reportPath, markdown); + +const svg = ` + + + Peer Review Citation Coercion Guard + Flagged reviews: ${result.summary.flaggedReviews} / ${result.summary.totalReviews} + Held reviewer credit: ${result.summary.heldReviewerCredit} + Protected projects: ${result.summary.protectedProjects} + Action: ${result.summary.recommendedAction} + Detects self-citation demands, reciprocal pressure, and journal quota coercion. + Blind reviewer labels are preserved without raw identity leakage. + ${result.auditPacket.auditDigest} + +`; + +fs.writeFileSync(svgPath, svg); + +console.log(`Wrote ${path.relative(__dirname, packetPath)}`); +console.log(`Wrote ${path.relative(__dirname, reportPath)}`); +console.log(`Wrote ${path.relative(__dirname, svgPath)}`); +console.log(`Recommended action: ${result.summary.recommendedAction}`); diff --git a/peer-review-citation-coercion-guard/index.js b/peer-review-citation-coercion-guard/index.js new file mode 100644 index 00000000..d0116272 --- /dev/null +++ b/peer-review-citation-coercion-guard/index.js @@ -0,0 +1,425 @@ +const crypto = require('crypto'); + +const BLOCKED_UPDATES = [ + 'reviewer-reputation', + 'trusted-reviewer-badge', + 'leaderboards', + 'project-timeline' +]; + +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 `sha256:${crypto.createHash('sha256').update(stableStringify(value)).digest('hex')}`; +} + +function isBlindReview(mode) { + return ['anonymous', 'blind', 'double-blind', 'fully-anonymous'].includes(mode); +} + +function reviewerLabel(review) { + if (isBlindReview(review.mode)) { + return review.anonymousLabel || 'anonymous-reviewer'; + } + + return `reviewer:${review.reviewerId}`; +} + +function unique(values) { + return [...new Set(values)]; +} + +function pressureText(citation) { + return `${citation.requestText || ''} ${citation.condition || ''}`.toLowerCase(); +} + +function hasReciprocalPressure(citation) { + const text = pressureText(citation); + return Boolean( + citation.reciprocalPromise || + text.includes('cite mine and i will cite yours') || + text.includes('reciprocal citation') || + text.includes('mutual citation') || + text.includes('citation exchange') + ); +} + +function hasQuotaPressure(citation) { + const text = pressureText(citation); + return Boolean( + citation.journalQuota || + citation.editorialQuota || + text.includes('journal impact factor') || + text.includes('citation quota') || + text.includes('minimum journal citations') || + text.includes('cite at least') + ); +} + +function isCoerciveRequirement(citation) { + const text = pressureText(citation); + return Boolean( + citation.requiredForAcceptance || + text.includes('must cite') || + text.includes('required for acceptance') || + text.includes('before i can recommend acceptance') || + text.includes('mandatory') + ); +} + +function evaluateCitation(review, citation) { + const flags = []; + const reasons = []; + const relevanceScore = citation.relevanceScore ?? 0; + + if (citation.requestedByReviewerAuthor && relevanceScore < 0.5 && isCoerciveRequirement(citation)) { + flags.push('unsupported-self-citation-demand'); + reasons.push('reviewer-authored citation is mandatory but weakly related to the manuscript'); + } + + if (hasReciprocalPressure(citation)) { + flags.push('reciprocal-citation-pressure'); + reasons.push('citation request offers or implies reciprocal citation benefit'); + } + + if (hasQuotaPressure(citation)) { + flags.push('journal-citation-quota-pressure'); + reasons.push('citation request appears tied to journal or editor citation quota pressure'); + } + + return { + citationId: citation.id, + title: citation.title, + relevanceScore, + requestedByReviewerAuthor: Boolean(citation.requestedByReviewerAuthor), + requestedByEditorOrVenue: Boolean(citation.requestedByEditorOrVenue || citation.journalQuota), + requiredForAcceptance: Boolean(isCoerciveRequirement(citation)), + flags: unique(flags), + reasons, + reviewMode: review.mode + }; +} + +function findReviewFlags(review, citationFindings) { + const flags = citationFindings.flatMap((finding) => finding.flags); + const lowRelevanceRequired = review.requestedCitations.filter( + (citation) => (citation.relevanceScore ?? 0) < 0.35 && isCoerciveRequirement(citation) + ); + + if (lowRelevanceRequired.length >= 2) { + flags.push('off-topic-citation-cluster'); + } + + return unique(flags); +} + +function highestSeverity(flags) { + if ( + flags.includes('unsupported-self-citation-demand') || + flags.includes('reciprocal-citation-pressure') || + flags.includes('journal-citation-quota-pressure') + ) { + return 'high'; + } + + if (flags.length > 0) { + return 'medium'; + } + + return 'none'; +} + +function evaluateReview(review) { + const citationFindings = review.requestedCitations.map((citation) => evaluateCitation(review, citation)); + const flags = findReviewFlags(review, citationFindings); + const flagged = flags.length > 0; + + return { + id: review.id, + projectId: review.projectId, + reviewer: reviewerLabel(review), + mode: review.mode, + submittedAt: review.submittedAt, + decision: flagged ? 'steward-review-required' : 'allow-reputation-update', + highestSeverity: highestSeverity(flags), + flags, + citationFindings, + requiredStewardAction: flagged + ? 'review-citation-demands-before-score-or-badge-update' + : 'none' + }; +} + +function buildReputationAction(review, decision) { + if (decision.decision === 'allow-reputation-update') { + return { + id: `apply-${review.id}`, + reviewId: review.id, + reviewer: decision.reviewer, + action: 'apply-reviewer-credit', + originalReviewerDelta: review.reviewerDelta, + effectiveReviewerDelta: review.reviewerDelta, + evidenceDigest: digest({ + reviewId: review.id, + decision: decision.decision, + flags: decision.flags + }) + }; + } + + return { + id: `hold-${review.id}`, + reviewId: review.id, + reviewer: decision.reviewer, + action: 'hold-reviewer-credit', + originalReviewerDelta: review.reviewerDelta, + effectiveReviewerDelta: 0, + blockedUpdates: BLOCKED_UPDATES, + evidenceDigest: digest({ + reviewId: review.id, + decision: decision.decision, + flags: decision.flags + }) + }; +} + +function buildStewardTask(review, decision) { + if (decision.decision === 'allow-reputation-update') { + return null; + } + + return { + id: `task-${review.id}`, + reviewId: review.id, + projectId: review.projectId, + reviewer: decision.reviewer, + priority: decision.highestSeverity === 'high' ? 'high' : 'normal', + requiredAction: 'remove-or-justify-coercive-citation-requests', + blockedUpdates: BLOCKED_UPDATES, + flags: decision.flags, + citationIds: decision.citationFindings + .filter((finding) => finding.flags.length > 0 || finding.requiredForAcceptance) + .map((finding) => finding.citationId) + }; +} + +function buildAuthorProtections(reviewDecisions) { + const protectedProjects = new Map(); + + for (const decision of reviewDecisions) { + if (decision.decision !== 'steward-review-required') { + continue; + } + + if (!protectedProjects.has(decision.projectId)) { + protectedProjects.set(decision.projectId, { + id: `protect-${decision.projectId}`, + projectId: decision.projectId, + action: 'block-author-penalty', + reasons: ['citation-pressure-under-review'], + blockedUpdates: [ + 'author-response-penalty', + 'project-quality-badge-decay', + 'timeline-negative-review-event' + ], + relatedReviewIds: [] + }); + } + + protectedProjects.get(decision.projectId).relatedReviewIds.push(decision.id); + } + + return [...protectedProjects.values()]; +} + +function buildAuditPacket(packet, reviewDecisions, reputationActions, stewardTasks, authorProtections) { + const events = [ + ...reviewDecisions.map((decision) => ({ + type: decision.decision === 'allow-reputation-update' ? 'citation-review-allowed' : 'citation-pressure-held', + reviewId: decision.id, + projectId: decision.projectId, + reviewer: decision.reviewer, + flags: decision.flags, + decision: decision.decision + })), + ...stewardTasks.map((task) => ({ + type: 'steward-task-created', + taskId: task.id, + reviewId: task.reviewId, + projectId: task.projectId, + priority: task.priority + })), + ...authorProtections.map((protection) => ({ + type: 'author-protection-applied', + projectId: protection.projectId, + relatedReviewIds: protection.relatedReviewIds + })) + ]; + + const auditDigest = digest({ + packetId: packet.packetId, + generatedAt: packet.asOf, + events + }); + + return { + packetId: packet.packetId, + generatedAt: packet.asOf, + events, + auditDigest + }; +} + +function evaluateCitationCoercion(packet) { + const reviewDecisions = packet.reviews.map(evaluateReview); + const reputationActions = packet.reviews.map((review, index) => + buildReputationAction(review, reviewDecisions[index]) + ); + const stewardTasks = packet.reviews + .map((review, index) => buildStewardTask(review, reviewDecisions[index])) + .filter(Boolean); + const authorProtections = buildAuthorProtections(reviewDecisions); + const auditPacket = buildAuditPacket(packet, reviewDecisions, reputationActions, stewardTasks, authorProtections); + const heldReviewerCredit = reputationActions + .filter((action) => action.action === 'hold-reviewer-credit') + .reduce((total, action) => total + action.originalReviewerDelta, 0); + + return { + packetId: packet.packetId, + generatedAt: packet.asOf, + reviewDecisions, + reputationActions, + stewardTasks, + authorProtections, + auditPacket, + summary: { + totalReviews: reviewDecisions.length, + flaggedReviews: reviewDecisions.filter((decision) => decision.decision === 'steward-review-required').length, + heldReviewerCredit, + protectedProjects: authorProtections.length, + recommendedAction: + stewardTasks.length > 0 + ? 'pause-coerced-citation-reputation-updates' + : 'allow-citation-related-reputation-updates' + } + }; +} + +function buildSampleReviewPacket() { + return { + packetId: 'citation-coercion-review-batch-2026-05-28', + asOf: '2026-05-28T12:30:00Z', + reviews: [ + { + id: 'review-r1-self-citation', + projectId: 'project-neuro-open', + reviewerId: 'orcid:0000-0001-reviewer-alpha', + mode: 'public', + submittedAt: '2026-05-28T09:00:00Z', + reviewerDelta: 10, + requestedCitations: [ + { + id: 'cite-alpha-2024', + title: 'Alpha Lab Editorial Notes On Cognitive Maps', + relevanceScore: 0.22, + requestedByReviewerAuthor: true, + requiredForAcceptance: true, + requestText: 'You must cite this before I can recommend acceptance.' + }, + { + id: 'cite-alpha-2023', + title: 'Unrelated Rodent Navigation Commentary', + relevanceScore: 0.18, + requestedByReviewerAuthor: true, + requiredForAcceptance: true, + requestText: 'This reviewer-authored citation is mandatory.' + }, + { + id: 'cite-domain-2019', + title: 'Domain Background Review', + relevanceScore: 0.71, + requestedByReviewerAuthor: false, + requiredForAcceptance: false, + requestText: 'Consider as optional context.' + } + ] + }, + { + id: 'review-r2-reciprocal-pressure', + projectId: 'project-neuro-open', + reviewerId: 'orcid:0000-0002-private-pressure', + anonymousLabel: 'anonymous-reviewer-42', + mode: 'double-blind', + submittedAt: '2026-05-28T09:30:00Z', + reviewerDelta: 7, + requestedCitations: [ + { + id: 'cite-mutual-2025', + title: 'Mutual Citation Network Preprint', + relevanceScore: 0.55, + requestedByReviewerAuthor: true, + reciprocalPromise: true, + requiredForAcceptance: true, + requestText: 'Cite mine and I will cite yours in our next review.' + } + ] + }, + { + id: 'review-r3-quota-pressure', + projectId: 'project-protein-open', + reviewerId: 'orcid:0000-0003-editorial-pressure', + mode: 'semi-private', + submittedAt: '2026-05-28T10:00:00Z', + reviewerDelta: 6, + requestedCitations: [ + { + id: 'cite-journal-quota-2026', + title: 'Recent Articles From The Target Journal', + relevanceScore: 0.42, + requestedByEditorOrVenue: true, + journalQuota: true, + requiredForAcceptance: true, + requestText: 'Cite at least three recent papers from this journal to satisfy the journal impact factor target.' + } + ] + }, + { + id: 'review-r4-legitimate-context', + projectId: 'project-microbiome-open', + reviewerId: 'orcid:0000-0004-methods-reviewer', + mode: 'public', + submittedAt: '2026-05-28T10:30:00Z', + reviewerDelta: 8, + requestedCitations: [ + { + id: 'cite-methods-2021', + title: 'Benchmark Dataset Normalization Methods', + relevanceScore: 0.91, + requestedByReviewerAuthor: false, + requiredForAcceptance: false, + requestText: 'This optional context may help readers compare normalization methods.' + } + ] + } + ] + }; +} + +module.exports = { + evaluateCitationCoercion, + buildSampleReviewPacket, + digest +}; diff --git a/peer-review-citation-coercion-guard/make-demo-video.py b/peer-review-citation-coercion-guard/make-demo-video.py new file mode 100644 index 00000000..6286b31b --- /dev/null +++ b/peer-review-citation-coercion-guard/make-demo-video.py @@ -0,0 +1,71 @@ +from pathlib import Path + +from PIL import Image, ImageDraw, ImageFont + + +ROOT = Path(__file__).resolve().parent +REPORTS = ROOT / "reports" +REPORTS.mkdir(exist_ok=True) +OUTPUT = REPORTS / "demo.mp4" + + +def load_font(size): + for candidate in [ + "C:/Windows/Fonts/arial.ttf", + "C:/Windows/Fonts/segoeui.ttf", + "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", + ]: + path = Path(candidate) + if path.exists(): + return ImageFont.truetype(str(path), size) + return ImageFont.load_default() + + +def frame(progress): + image = Image.new("RGB", (1280, 720), "#13221c") + draw = ImageDraw.Draw(image) + draw.rounded_rectangle((60, 70, 1220, 650), radius=18, fill="#1d342c", outline="#8ee6b5", width=4) + + title = load_font(44) + heading = load_font(30) + body = load_font(24) + small = load_font(18) + + draw.text((100, 125), "Peer Review Citation Coercion Guard", fill="white", font=title) + lines = [ + "Detects mandatory self-citation requests", + "Flags reciprocal citation pressure", + "Blocks journal quota driven citation demands", + "Holds reviewer credit until steward review", + "Protects authors from reputation penalties", + "Redacts double-blind reviewer identity" + ] + + visible = min(len(lines), 1 + int(progress * len(lines))) + for index, line in enumerate(lines[:visible]): + y = 205 + index * 54 + draw.text((100, y), line, fill="#d9fff0", font=heading if index < 3 else body) + + bar_width = int(980 * progress) + draw.rounded_rectangle((100, 590, 1080, 615), radius=10, fill="#294d40") + draw.rounded_rectangle((100, 590, 100 + bar_width, 615), radius=10, fill="#8ee6b5") + draw.text((100, 635), "SCIBASE issue #15 community reputation slice - synthetic demo", fill="#a8dcc8", font=small) + return image + + +def main(): + try: + import imageio.v3 as iio + except Exception as exc: # pragma: no cover - helper path for local artifact generation + raise SystemExit( + "imageio and imageio-ffmpeg are required to regenerate reports/demo.mp4. " + "The committed demo.mp4 is already generated for review." + ) from exc + + frames = [frame(index / 59) for index in range(60)] + iio.imwrite(OUTPUT, frames, fps=15, codec="libx264", quality=8, macro_block_size=16) + print(f"Wrote {OUTPUT.relative_to(ROOT)}") + + +if __name__ == "__main__": + main() diff --git a/peer-review-citation-coercion-guard/package.json b/peer-review-citation-coercion-guard/package.json new file mode 100644 index 00000000..f17e7f55 --- /dev/null +++ b/peer-review-citation-coercion-guard/package.json @@ -0,0 +1,12 @@ +{ + "name": "peer-review-citation-coercion-guard", + "version": "1.0.0", + "private": true, + "description": "Dependency-free peer-review citation coercion guard for SCIBASE issue #15.", + "scripts": { + "test": "node test.js", + "demo": "node demo.js", + "video": "python make-demo-video.py", + "check": "node --check index.js && node --check test.js && node --check demo.js" + } +} diff --git a/peer-review-citation-coercion-guard/reports/citation-coercion-packet.json b/peer-review-citation-coercion-guard/reports/citation-coercion-packet.json new file mode 100644 index 00000000..671eaa4f --- /dev/null +++ b/peer-review-citation-coercion-guard/reports/citation-coercion-packet.json @@ -0,0 +1,391 @@ +{ + "packetId": "citation-coercion-review-batch-2026-05-28", + "generatedAt": "2026-05-28T12:30:00Z", + "reviewDecisions": [ + { + "id": "review-r1-self-citation", + "projectId": "project-neuro-open", + "reviewer": "reviewer:orcid:0000-0001-reviewer-alpha", + "mode": "public", + "submittedAt": "2026-05-28T09:00:00Z", + "decision": "steward-review-required", + "highestSeverity": "high", + "flags": [ + "unsupported-self-citation-demand", + "off-topic-citation-cluster" + ], + "citationFindings": [ + { + "citationId": "cite-alpha-2024", + "title": "Alpha Lab Editorial Notes On Cognitive Maps", + "relevanceScore": 0.22, + "requestedByReviewerAuthor": true, + "requestedByEditorOrVenue": false, + "requiredForAcceptance": true, + "flags": [ + "unsupported-self-citation-demand" + ], + "reasons": [ + "reviewer-authored citation is mandatory but weakly related to the manuscript" + ], + "reviewMode": "public" + }, + { + "citationId": "cite-alpha-2023", + "title": "Unrelated Rodent Navigation Commentary", + "relevanceScore": 0.18, + "requestedByReviewerAuthor": true, + "requestedByEditorOrVenue": false, + "requiredForAcceptance": true, + "flags": [ + "unsupported-self-citation-demand" + ], + "reasons": [ + "reviewer-authored citation is mandatory but weakly related to the manuscript" + ], + "reviewMode": "public" + }, + { + "citationId": "cite-domain-2019", + "title": "Domain Background Review", + "relevanceScore": 0.71, + "requestedByReviewerAuthor": false, + "requestedByEditorOrVenue": false, + "requiredForAcceptance": false, + "flags": [], + "reasons": [], + "reviewMode": "public" + } + ], + "requiredStewardAction": "review-citation-demands-before-score-or-badge-update" + }, + { + "id": "review-r2-reciprocal-pressure", + "projectId": "project-neuro-open", + "reviewer": "anonymous-reviewer-42", + "mode": "double-blind", + "submittedAt": "2026-05-28T09:30:00Z", + "decision": "steward-review-required", + "highestSeverity": "high", + "flags": [ + "reciprocal-citation-pressure" + ], + "citationFindings": [ + { + "citationId": "cite-mutual-2025", + "title": "Mutual Citation Network Preprint", + "relevanceScore": 0.55, + "requestedByReviewerAuthor": true, + "requestedByEditorOrVenue": false, + "requiredForAcceptance": true, + "flags": [ + "reciprocal-citation-pressure" + ], + "reasons": [ + "citation request offers or implies reciprocal citation benefit" + ], + "reviewMode": "double-blind" + } + ], + "requiredStewardAction": "review-citation-demands-before-score-or-badge-update" + }, + { + "id": "review-r3-quota-pressure", + "projectId": "project-protein-open", + "reviewer": "reviewer:orcid:0000-0003-editorial-pressure", + "mode": "semi-private", + "submittedAt": "2026-05-28T10:00:00Z", + "decision": "steward-review-required", + "highestSeverity": "high", + "flags": [ + "journal-citation-quota-pressure" + ], + "citationFindings": [ + { + "citationId": "cite-journal-quota-2026", + "title": "Recent Articles From The Target Journal", + "relevanceScore": 0.42, + "requestedByReviewerAuthor": false, + "requestedByEditorOrVenue": true, + "requiredForAcceptance": true, + "flags": [ + "journal-citation-quota-pressure" + ], + "reasons": [ + "citation request appears tied to journal or editor citation quota pressure" + ], + "reviewMode": "semi-private" + } + ], + "requiredStewardAction": "review-citation-demands-before-score-or-badge-update" + }, + { + "id": "review-r4-legitimate-context", + "projectId": "project-microbiome-open", + "reviewer": "reviewer:orcid:0000-0004-methods-reviewer", + "mode": "public", + "submittedAt": "2026-05-28T10:30:00Z", + "decision": "allow-reputation-update", + "highestSeverity": "none", + "flags": [], + "citationFindings": [ + { + "citationId": "cite-methods-2021", + "title": "Benchmark Dataset Normalization Methods", + "relevanceScore": 0.91, + "requestedByReviewerAuthor": false, + "requestedByEditorOrVenue": false, + "requiredForAcceptance": false, + "flags": [], + "reasons": [], + "reviewMode": "public" + } + ], + "requiredStewardAction": "none" + } + ], + "reputationActions": [ + { + "id": "hold-review-r1-self-citation", + "reviewId": "review-r1-self-citation", + "reviewer": "reviewer:orcid:0000-0001-reviewer-alpha", + "action": "hold-reviewer-credit", + "originalReviewerDelta": 10, + "effectiveReviewerDelta": 0, + "blockedUpdates": [ + "reviewer-reputation", + "trusted-reviewer-badge", + "leaderboards", + "project-timeline" + ], + "evidenceDigest": "sha256:e47ae057aab045d09cd71b67fae4e71de856f625be2db42d63520c006e978017" + }, + { + "id": "hold-review-r2-reciprocal-pressure", + "reviewId": "review-r2-reciprocal-pressure", + "reviewer": "anonymous-reviewer-42", + "action": "hold-reviewer-credit", + "originalReviewerDelta": 7, + "effectiveReviewerDelta": 0, + "blockedUpdates": [ + "reviewer-reputation", + "trusted-reviewer-badge", + "leaderboards", + "project-timeline" + ], + "evidenceDigest": "sha256:65f2d44483fc7d53bfbe65a59c7c36f485d33c3d291c7a4047f4b739e349fc94" + }, + { + "id": "hold-review-r3-quota-pressure", + "reviewId": "review-r3-quota-pressure", + "reviewer": "reviewer:orcid:0000-0003-editorial-pressure", + "action": "hold-reviewer-credit", + "originalReviewerDelta": 6, + "effectiveReviewerDelta": 0, + "blockedUpdates": [ + "reviewer-reputation", + "trusted-reviewer-badge", + "leaderboards", + "project-timeline" + ], + "evidenceDigest": "sha256:4815f9ae8aa71fd9fd867004fdd7546fbb886c875bc54fbd916b2f659c039f74" + }, + { + "id": "apply-review-r4-legitimate-context", + "reviewId": "review-r4-legitimate-context", + "reviewer": "reviewer:orcid:0000-0004-methods-reviewer", + "action": "apply-reviewer-credit", + "originalReviewerDelta": 8, + "effectiveReviewerDelta": 8, + "evidenceDigest": "sha256:f01205e6060ee151fd289a95dbcf7980d47357160a93edd1bad26fc88b6b18ab" + } + ], + "stewardTasks": [ + { + "id": "task-review-r1-self-citation", + "reviewId": "review-r1-self-citation", + "projectId": "project-neuro-open", + "reviewer": "reviewer:orcid:0000-0001-reviewer-alpha", + "priority": "high", + "requiredAction": "remove-or-justify-coercive-citation-requests", + "blockedUpdates": [ + "reviewer-reputation", + "trusted-reviewer-badge", + "leaderboards", + "project-timeline" + ], + "flags": [ + "unsupported-self-citation-demand", + "off-topic-citation-cluster" + ], + "citationIds": [ + "cite-alpha-2024", + "cite-alpha-2023" + ] + }, + { + "id": "task-review-r2-reciprocal-pressure", + "reviewId": "review-r2-reciprocal-pressure", + "projectId": "project-neuro-open", + "reviewer": "anonymous-reviewer-42", + "priority": "high", + "requiredAction": "remove-or-justify-coercive-citation-requests", + "blockedUpdates": [ + "reviewer-reputation", + "trusted-reviewer-badge", + "leaderboards", + "project-timeline" + ], + "flags": [ + "reciprocal-citation-pressure" + ], + "citationIds": [ + "cite-mutual-2025" + ] + }, + { + "id": "task-review-r3-quota-pressure", + "reviewId": "review-r3-quota-pressure", + "projectId": "project-protein-open", + "reviewer": "reviewer:orcid:0000-0003-editorial-pressure", + "priority": "high", + "requiredAction": "remove-or-justify-coercive-citation-requests", + "blockedUpdates": [ + "reviewer-reputation", + "trusted-reviewer-badge", + "leaderboards", + "project-timeline" + ], + "flags": [ + "journal-citation-quota-pressure" + ], + "citationIds": [ + "cite-journal-quota-2026" + ] + } + ], + "authorProtections": [ + { + "id": "protect-project-neuro-open", + "projectId": "project-neuro-open", + "action": "block-author-penalty", + "reasons": [ + "citation-pressure-under-review" + ], + "blockedUpdates": [ + "author-response-penalty", + "project-quality-badge-decay", + "timeline-negative-review-event" + ], + "relatedReviewIds": [ + "review-r1-self-citation", + "review-r2-reciprocal-pressure" + ] + }, + { + "id": "protect-project-protein-open", + "projectId": "project-protein-open", + "action": "block-author-penalty", + "reasons": [ + "citation-pressure-under-review" + ], + "blockedUpdates": [ + "author-response-penalty", + "project-quality-badge-decay", + "timeline-negative-review-event" + ], + "relatedReviewIds": [ + "review-r3-quota-pressure" + ] + } + ], + "auditPacket": { + "packetId": "citation-coercion-review-batch-2026-05-28", + "generatedAt": "2026-05-28T12:30:00Z", + "events": [ + { + "type": "citation-pressure-held", + "reviewId": "review-r1-self-citation", + "projectId": "project-neuro-open", + "reviewer": "reviewer:orcid:0000-0001-reviewer-alpha", + "flags": [ + "unsupported-self-citation-demand", + "off-topic-citation-cluster" + ], + "decision": "steward-review-required" + }, + { + "type": "citation-pressure-held", + "reviewId": "review-r2-reciprocal-pressure", + "projectId": "project-neuro-open", + "reviewer": "anonymous-reviewer-42", + "flags": [ + "reciprocal-citation-pressure" + ], + "decision": "steward-review-required" + }, + { + "type": "citation-pressure-held", + "reviewId": "review-r3-quota-pressure", + "projectId": "project-protein-open", + "reviewer": "reviewer:orcid:0000-0003-editorial-pressure", + "flags": [ + "journal-citation-quota-pressure" + ], + "decision": "steward-review-required" + }, + { + "type": "citation-review-allowed", + "reviewId": "review-r4-legitimate-context", + "projectId": "project-microbiome-open", + "reviewer": "reviewer:orcid:0000-0004-methods-reviewer", + "flags": [], + "decision": "allow-reputation-update" + }, + { + "type": "steward-task-created", + "taskId": "task-review-r1-self-citation", + "reviewId": "review-r1-self-citation", + "projectId": "project-neuro-open", + "priority": "high" + }, + { + "type": "steward-task-created", + "taskId": "task-review-r2-reciprocal-pressure", + "reviewId": "review-r2-reciprocal-pressure", + "projectId": "project-neuro-open", + "priority": "high" + }, + { + "type": "steward-task-created", + "taskId": "task-review-r3-quota-pressure", + "reviewId": "review-r3-quota-pressure", + "projectId": "project-protein-open", + "priority": "high" + }, + { + "type": "author-protection-applied", + "projectId": "project-neuro-open", + "relatedReviewIds": [ + "review-r1-self-citation", + "review-r2-reciprocal-pressure" + ] + }, + { + "type": "author-protection-applied", + "projectId": "project-protein-open", + "relatedReviewIds": [ + "review-r3-quota-pressure" + ] + } + ], + "auditDigest": "sha256:637ed41ba3ea2b5506c1ee609c4ae56f1834c2670483849429566620b2402ecc" + }, + "summary": { + "totalReviews": 4, + "flaggedReviews": 3, + "heldReviewerCredit": 23, + "protectedProjects": 2, + "recommendedAction": "pause-coerced-citation-reputation-updates" + } +} diff --git a/peer-review-citation-coercion-guard/reports/citation-coercion-report.md b/peer-review-citation-coercion-guard/reports/citation-coercion-report.md new file mode 100644 index 00000000..1644b686 --- /dev/null +++ b/peer-review-citation-coercion-guard/reports/citation-coercion-report.md @@ -0,0 +1,34 @@ +# Peer Review Citation Coercion Guard + +Packet: citation-coercion-review-batch-2026-05-28 +Generated: 2026-05-28T12:30:00Z + +## Summary + +- Total reviews evaluated: 4 +- Flagged reviews: 3 +- Held reviewer credit: 23 +- Protected projects: 2 +- Recommended action: pause-coerced-citation-reputation-updates +- Audit digest: sha256:637ed41ba3ea2b5506c1ee609c4ae56f1834c2670483849429566620b2402ecc + +## Flagged Citation Pressure + +- review-r1-self-citation: unsupported-self-citation-demand, off-topic-citation-cluster +- review-r2-reciprocal-pressure: reciprocal-citation-pressure +- review-r3-quota-pressure: journal-citation-quota-pressure + +## Steward Tasks + +- task-review-r1-self-citation (high): remove-or-justify-coercive-citation-requests +- task-review-r2-reciprocal-pressure (high): remove-or-justify-coercive-citation-requests +- task-review-r3-quota-pressure (high): remove-or-justify-coercive-citation-requests + +## Author Protections + +- project-neuro-open: author-response-penalty, project-quality-badge-decay, timeline-negative-review-event +- project-protein-open: author-response-penalty, project-quality-badge-decay, timeline-negative-review-event + +## Privacy Notes + +Double-blind reviewer identifiers are replaced with anonymous labels before reports, tasks, and timeline events are emitted. The packet uses synthetic data only and does not contain credentials, private profile emails, live user data, external API calls, payment systems, or real review records. diff --git a/peer-review-citation-coercion-guard/reports/demo.mp4 b/peer-review-citation-coercion-guard/reports/demo.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..27d47269c385efe0066233d6ee1d4aa7ac92b8ac GIT binary patch literal 71150 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 Lz)YY6PXvDfDg*KE literal 0 HcmV?d00001 diff --git a/peer-review-citation-coercion-guard/reports/summary.svg b/peer-review-citation-coercion-guard/reports/summary.svg new file mode 100644 index 00000000..39cf2c33 --- /dev/null +++ b/peer-review-citation-coercion-guard/reports/summary.svg @@ -0,0 +1,12 @@ + + + + Peer Review Citation Coercion Guard + Flagged reviews: 3 / 4 + Held reviewer credit: 23 + Protected projects: 2 + Action: pause-coerced-citation-reputation-updates + Detects self-citation demands, reciprocal pressure, and journal quota coercion. + Blind reviewer labels are preserved without raw identity leakage. + sha256:637ed41ba3ea2b5506c1ee609c4ae56f1834c2670483849429566620b2402ecc + diff --git a/peer-review-citation-coercion-guard/requirements-map.md b/peer-review-citation-coercion-guard/requirements-map.md new file mode 100644 index 00000000..662ffbb4 --- /dev/null +++ b/peer-review-citation-coercion-guard/requirements-map.md @@ -0,0 +1,26 @@ +# Requirements Map + +## Peer Reviews And Comments + +- Structured peer reviews are evaluated before reputation and timeline updates. +- Public, semi-private, and double-blind review modes are represented. +- Citation requests are reviewed as part of peer-review quality and trust. +- Steward tasks preserve an auditable review history. + +## Contributor Credits + +- Reviewer credit is held when citation pressure may have biased the review. +- Legitimate citation suggestions still receive reviewer credit. +- Author-facing penalties are blocked while citation pressure is under review. + +## Reputation Scoring + +- Coercive citation findings block reviewer reputation deltas, trusted-reviewer badges, leaderboards, and project timeline updates. +- Clear steward tasks explain what must be removed or justified before credit is applied. +- The audit packet has a deterministic digest for transparent review. + +## Privacy And Trust + +- Double-blind reviewer IDs and private emails are not emitted in decisions, tasks, reports, or audit events. +- Synthetic data only; no private profile data, credentials, or external API calls. +- Author protections prevent coerced-citation disputes from harming project reputation. diff --git a/peer-review-citation-coercion-guard/test.js b/peer-review-citation-coercion-guard/test.js new file mode 100644 index 00000000..8eae4145 --- /dev/null +++ b/peer-review-citation-coercion-guard/test.js @@ -0,0 +1,101 @@ +const assert = require('assert'); +const { + evaluateCitationCoercion, + buildSampleReviewPacket +} = require('./index'); + +function byId(items, id) { + return items.find((item) => item.id === id); +} + +function testUnsupportedSelfCitationDemandTriggersStewardReview() { + const result = evaluateCitationCoercion(buildSampleReviewPacket()); + const decision = byId(result.reviewDecisions, 'review-r1-self-citation'); + + assert.equal(decision.decision, 'steward-review-required'); + assert.equal(decision.highestSeverity, 'high'); + assert.ok(decision.flags.includes('unsupported-self-citation-demand')); + assert.ok(decision.flags.includes('off-topic-citation-cluster')); + + const reputationHold = byId(result.reputationActions, 'hold-review-r1-self-citation'); + assert.equal(reputationHold.action, 'hold-reviewer-credit'); + assert.equal(reputationHold.effectiveReviewerDelta, 0); + assert.deepEqual(reputationHold.blockedUpdates, [ + 'reviewer-reputation', + 'trusted-reviewer-badge', + 'leaderboards', + 'project-timeline' + ]); +} + +function testReciprocalCitationPressureIsFlaggedWithoutPunishingAuthors() { + const result = evaluateCitationCoercion(buildSampleReviewPacket()); + const decision = byId(result.reviewDecisions, 'review-r2-reciprocal-pressure'); + + assert.equal(decision.decision, 'steward-review-required'); + assert.ok(decision.flags.includes('reciprocal-citation-pressure')); + + const authorProtection = byId(result.authorProtections, 'protect-project-neuro-open'); + assert.equal(authorProtection.action, 'block-author-penalty'); + assert.ok(authorProtection.reasons.includes('citation-pressure-under-review')); +} + +function testJournalQuotaPressureBlocksReputationChanges() { + const result = evaluateCitationCoercion(buildSampleReviewPacket()); + const decision = byId(result.reviewDecisions, 'review-r3-quota-pressure'); + + assert.ok(decision.flags.includes('journal-citation-quota-pressure')); + assert.equal(decision.requiredStewardAction, 'review-citation-demands-before-score-or-badge-update'); + + const task = byId(result.stewardTasks, 'task-review-r3-quota-pressure'); + assert.equal(task.priority, 'high'); + assert.equal(task.requiredAction, 'remove-or-justify-coercive-citation-requests'); +} + +function testLegitimateCitationSuggestionStaysAllowed() { + const result = evaluateCitationCoercion(buildSampleReviewPacket()); + const decision = byId(result.reviewDecisions, 'review-r4-legitimate-context'); + + assert.equal(decision.decision, 'allow-reputation-update'); + assert.deepEqual(decision.flags, []); + + const action = byId(result.reputationActions, 'apply-review-r4-legitimate-context'); + assert.equal(action.action, 'apply-reviewer-credit'); + assert.equal(action.effectiveReviewerDelta, 8); +} + +function testBlindReviewerIdentityIsRedactedFromOutputs() { + const result = evaluateCitationCoercion(buildSampleReviewPacket()); + const serialized = JSON.stringify(result); + + assert.ok(serialized.includes('anonymous-reviewer-42')); + assert.ok(!serialized.includes('orcid:0000-0002-private-pressure')); + assert.ok(!serialized.includes('private-pressure@example.edu')); +} + +function testSummaryAndAuditDigestAreDeterministic() { + const first = evaluateCitationCoercion(buildSampleReviewPacket()); + const second = evaluateCitationCoercion(buildSampleReviewPacket()); + + assert.equal(first.summary.totalReviews, 4); + assert.equal(first.summary.flaggedReviews, 3); + assert.equal(first.summary.heldReviewerCredit, 23); + assert.equal(first.summary.recommendedAction, 'pause-coerced-citation-reputation-updates'); + assert.equal(first.auditPacket.auditDigest, second.auditPacket.auditDigest); + assert.ok(first.auditPacket.auditDigest.startsWith('sha256:')); +} + +const tests = [ + testUnsupportedSelfCitationDemandTriggersStewardReview, + testReciprocalCitationPressureIsFlaggedWithoutPunishingAuthors, + testJournalQuotaPressureBlocksReputationChanges, + testLegitimateCitationSuggestionStaysAllowed, + testBlindReviewerIdentityIsRedactedFromOutputs, + testSummaryAndAuditDigestAreDeterministic +]; + +for (const test of tests) { + test(); +} + +console.log(`${tests.length} peer-review citation coercion guard tests passed`);