Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions peer-review-assignment-governance/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Peer Review Assignment Governance

Self-contained contribution for SCIBASE issue #15, focused on conflict-of-interest checks and reviewer assignment governance for the Community & User Reputation System.

The module helps review chairs answer:

- Which reviewers are eligible for a public, anonymous, or double-blind assignment?
- Which candidates are blocked by institution, collaboration, coauthor, financial, or disclosure conflicts?
- Does the selected slate cover the project methods and scientific topics?
- Which trust, workload, and reputation signals drove the assignment decision?

It is deterministic, dependency-free, credential-free, and uses synthetic sample data only.

## Run

```bash
cd peer-review-assignment-governance
npm run check
npm test
npm run demo
```

Demo recording: `docs/review-assignment-demo.mp4`

## What It Includes

- `src/review-assignment-governance.js` - core COI detection, trust scoring, workload balancing, reviewer slate construction, chair checklist, and audit digest logic.
- `sample-data.json` - synthetic project, reviewer profiles, workload, funder, institution, and disclosure records.
- `test.js` - Node assertion tests for overlap scoring, hard COI blocking, conditional reviewers, slate coverage, digest changes, and validation errors.
- `demo.js` - CLI reviewer-chair demo that prints the selected slate, blocked reviewers, checklist, coverage, and audit digest.
- `docs/requirement-map.md` - direct mapping to issue #15 requirements.

## Design Notes

This is intentionally not another broad reputation ledger. It focuses on the operational point where reputation can fail if conflicts are not handled before peer-review invitations:

- Hard conflicts are blocked before ranking.
- Medium-risk disclosures require chair review instead of being hidden inside a score.
- Reviewer identities are masked with blind labels in the selected slate.
- Topic and method coverage are checked after assignment so review chairs can spot gaps.
- The audit digest lets future backend work persist and compare assignment packets.
42 changes: 42 additions & 0 deletions peer-review-assignment-governance/demo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"use strict";

const fs = require("node:fs");
const path = require("node:path");
const { analyzeReviewAssignmentGovernance } = require("./src/review-assignment-governance");

const samplePath = path.join(__dirname, "sample-data.json");
const bundle = JSON.parse(fs.readFileSync(samplePath, "utf8"));
const report = analyzeReviewAssignmentGovernance(bundle);

console.log("Peer Review Assignment Governance Demo");
console.log("======================================");
console.log(`Project: ${report.projectId}`);
console.log(`Review mode: ${report.reviewMode}`);
console.log(`Decision: ${report.assignmentDecision}`);
console.log("");

console.log("Selected reviewer slate");
for (const reviewer of report.selectedReviewers) {
const conflicts = reviewer.conflictReasons.length
? ` | disclosures: ${reviewer.conflictReasons.map((reason) => reason.code).join(", ")}`
: "";
console.log(`- ${reviewer.blindLabel}: ${reviewer.status} score ${reviewer.score}${conflicts}`);
console.log(` coverage: ${reviewer.coverage.topics.concat(reviewer.coverage.methods).join("; ") || "general"}`);
}
console.log("");

console.log("Blocked reviewers");
for (const reviewer of report.blockedReviewers) {
console.log(`- ${reviewer.reviewerId}: ${reviewer.conflictReasons.map((reason) => reason.code).join(", ")}`);
}
console.log("");

console.log("Chair checklist");
for (const item of report.chairChecklist) {
console.log(`- [${item.status}] ${item.id}: ${item.message}`);
}
console.log("");

console.log(`Covered priority topics: ${report.coverage.covered.join(", ")}`);
console.log(`Missing priority topics: ${report.coverage.missing.join(", ") || "none"}`);
console.log(`Audit digest: ${report.auditDigest}`);
35 changes: 35 additions & 0 deletions peer-review-assignment-governance/docs/requirement-map.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Requirement Map

This module targets SCIBASE issue #15, Community & User Reputation System.

## Peer Reviews and Comments

- Models public, anonymous, and double-blind review safety through `project.reviewMode`.
- Blocks reviewers with self, institution, recent collaboration, coauthor, or financial conflicts.
- Produces a chair checklist so review coordinators can act on blind-review and coverage risks before invitations are sent.

## Contributor Credits

- Uses reviewer profile history, completed reviews, turnaround, reproducibility score, endorsements, dispute rate, and overdue reviews as transparent contribution signals.
- Keeps reviewer identity masked in the selected slate with stable blind labels while preserving auditability for the chair.

## Reputation Scoring

- Computes deterministic score components for expertise, trust, workload, and conflict penalties.
- Separates eligible, conditional, and blocked reviewers so reputation signals do not hide hard conflicts.
- Includes alternates and missing coverage so assignment decisions can be reviewed without private credentials or live user data.

## Abuse and Quality Guardrails

- Hard-blocks high-severity COI signals before ranking.
- Downgrades shared-funder, workload, dispute, and calibration-drift risks to conditional review instead of silently selecting them.
- Emits a SHA-256 audit digest over the assignment packet to make future reviewer slates comparable.

## Local Verification

```bash
cd peer-review-assignment-governance
npm run check
npm test
npm run demo
```
Binary file not shown.
13 changes: 13 additions & 0 deletions peer-review-assignment-governance/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"name": "peer-review-assignment-governance",
"version": "1.0.0",
"description": "Deterministic peer-review conflict-of-interest and assignment governance module for SCIBASE issue 15.",
"main": "src/review-assignment-governance.js",
"scripts": {
"check": "node --check src/review-assignment-governance.js && node --check demo.js && node --check test.js",
"demo": "node demo.js",
"test": "node test.js"
},
"license": "MIT",
"private": true
}
Loading