From 1c8e453e631b0d17c2f29e7fdc3feada13df142a Mon Sep 17 00:00:00 2001 From: IOROHKI Date: Wed, 20 May 2026 03:23:39 -0700 Subject: [PATCH] Add mentorship impact ladder --- mentorship-impact-ladder/README.md | 28 ++ mentorship-impact-ladder/demo.js | 25 ++ mentorship-impact-ladder/index.js | 265 ++++++++++++++++++ mentorship-impact-ladder/reports/demo.mp4 | Bin 0 -> 58726 bytes .../reports/institution-packet.md | 39 +++ .../reports/mentorship-audit.json | 196 +++++++++++++ .../reports/mentorship-ladder.svg | 1 + mentorship-impact-ladder/requirements-map.md | 17 ++ mentorship-impact-ladder/sample-data.js | 207 ++++++++++++++ mentorship-impact-ladder/test.js | 33 +++ 10 files changed, 811 insertions(+) create mode 100644 mentorship-impact-ladder/README.md create mode 100644 mentorship-impact-ladder/demo.js create mode 100644 mentorship-impact-ladder/index.js create mode 100644 mentorship-impact-ladder/reports/demo.mp4 create mode 100644 mentorship-impact-ladder/reports/institution-packet.md create mode 100644 mentorship-impact-ladder/reports/mentorship-audit.json create mode 100644 mentorship-impact-ladder/reports/mentorship-ladder.svg create mode 100644 mentorship-impact-ladder/requirements-map.md create mode 100644 mentorship-impact-ladder/sample-data.js create mode 100644 mentorship-impact-ladder/test.js diff --git a/mentorship-impact-ladder/README.md b/mentorship-impact-ladder/README.md new file mode 100644 index 0000000..2c1dfd2 --- /dev/null +++ b/mentorship-impact-ladder/README.md @@ -0,0 +1,28 @@ +# Mentorship Impact Ladder + +This module is a focused slice for SCIBASE.AI issue #15, Community & User Reputation System. + +It evaluates mentor/trainee reputation progression using supervised peer reviews, reproducibility reruns, dataset/code contributions, CRediT roles, independent endorsements, and conflict safeguards. The sample data is synthetic and dependency-free. + +## What It Covers + +- Mentorship-specific badge tiers such as emerging mentor, trusted mentor, and open science champion. +- Trainee growth credit from supervised reviews, validation work, dataset curation, and project comments. +- Mentor reputation deltas that require independent endorsements and reproducibility-linked evidence. +- Conflict and nepotism safeguards before badge or leaderboard promotion. +- Institution-ready mentorship packets with deterministic digests. +- JSON audit packets, Markdown review packets, SVG summaries, and a short MP4 demo artifact. + +## Run + +```bash +node mentorship-impact-ladder/test.js +node mentorship-impact-ladder/demo.js +``` + +Demo output is written to: + +- `reports/mentorship-audit.json` +- `reports/institution-packet.md` +- `reports/mentorship-ladder.svg` +- `reports/demo.mp4` diff --git a/mentorship-impact-ladder/demo.js b/mentorship-impact-ladder/demo.js new file mode 100644 index 0000000..420bbdf --- /dev/null +++ b/mentorship-impact-ladder/demo.js @@ -0,0 +1,25 @@ +const fs = require("node:fs"); +const path = require("node:path"); +const data = require("./sample-data"); +const { renderMarkdown, renderSvg, runMentorshipAudit } = require("./index"); + +const report = runMentorshipAudit(data); +const reportsDir = path.join(__dirname, "reports"); +fs.mkdirSync(reportsDir, { recursive: true }); +fs.writeFileSync(path.join(reportsDir, "mentorship-audit.json"), JSON.stringify(report, null, 2)); +fs.writeFileSync(path.join(reportsDir, "institution-packet.md"), renderMarkdown(report)); +fs.writeFileSync(path.join(reportsDir, "mentorship-ladder.svg"), renderSvg(report)); + +console.log(JSON.stringify({ + averageScore: report.summary.averageScore, + badgeEligibleCount: report.summary.badgeEligibleCount, + moderatorReviewCount: report.summary.moderatorReviewCount, + totalFindings: report.summary.totalFindings, + auditDigest: report.auditDigest, + reports: [ + "reports/mentorship-audit.json", + "reports/institution-packet.md", + "reports/mentorship-ladder.svg", + "reports/demo.mp4" + ] +}, null, 2)); diff --git a/mentorship-impact-ladder/index.js b/mentorship-impact-ladder/index.js new file mode 100644 index 0000000..c9b309a --- /dev/null +++ b/mentorship-impact-ladder/index.js @@ -0,0 +1,265 @@ +const crypto = require("node:crypto"); + +const ROLE_WEIGHTS = { + review: 8, + methodology: 9, + software: 9, + validation: 10, + "data-curation": 9, + supervision: 7 +}; + +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 mean(values) { + if (!values.length) return 0; + return values.reduce((sum, value) => sum + value, 0) / values.length; +} + +function roleCoverageScore(evidenceItems) { + const roles = new Set(evidenceItems.flatMap((item) => item.creditedRoles || [])); + const score = [...roles].reduce((total, role) => total + (ROLE_WEIGHTS[role] || 4), 0); + return Math.min(28, score); +} + +function endorsementScore(evidenceItems) { + return Math.min(18, evidenceItems.filter((item) => item.independentEndorsement).length * 6); +} + +function reproducibilityScore(evidenceItems) { + return Math.min(18, evidenceItems.filter((item) => item.reproducibilityLinked).length * 6); +} + +function visibilityScore(evidenceItems) { + const publicCount = evidenceItems.filter((item) => item.publicMode === "public").length; + const semiPrivateCount = evidenceItems.filter((item) => item.publicMode === "semi-private").length; + return Math.min(12, publicCount * 4 + semiPrivateCount * 2); +} + +function evidenceQualityScore(evidenceItems) { + return Math.round(mean(evidenceItems.map((item) => item.qualityScore)) * 0.24); +} + +function detectSafeguards(pair, mentor, trainee, evidenceItems) { + const findings = []; + if (!pair.acknowledgements.includes(pair.traineeId)) { + findings.push({ + severity: "high", + code: "trainee-acknowledgement-missing", + message: `${trainee.displayName} has not acknowledged mentorship credit for ${pair.id}.`, + task: "Hold badge promotion until the trainee acknowledges the mentorship packet." + }); + } + if (mentor.conflicts.includes(pair.traineeId) || trainee.conflicts.includes(pair.mentorId) || pair.declaredRelationship === "family-member") { + findings.push({ + severity: "high", + code: "relationship-conflict-review-required", + message: `${pair.id} has a declared relationship conflict that can bias reputation credit.`, + task: "Route this mentorship packet to an independent moderator before assigning badge credit." + }); + } + if (!evidenceItems.some((item) => item.independentEndorsement)) { + findings.push({ + severity: "medium", + code: "independent-endorsement-missing", + message: `${pair.id} has no independent endorsement evidence.`, + task: "Request an independent project owner or reviewer endorsement." + }); + } + if (!evidenceItems.some((item) => item.reproducibilityLinked)) { + findings.push({ + severity: "medium", + code: "reproducibility-evidence-missing", + message: `${pair.id} lacks reproducibility-linked mentorship evidence.`, + task: "Attach a rerun, validation, or artifact verification record." + }); + } + if (new Set(evidenceItems.map((item) => item.projectId)).size < 2 && evidenceItems.length < 4) { + findings.push({ + severity: "low", + code: "portfolio-breadth-low", + message: `${pair.id} has limited project breadth for a durable mentorship badge.`, + task: "Collect one more supervised contribution on a separate project." + }); + } + return findings; +} + +function tierFor(score, findings, ladder) { + if (findings.some((finding) => finding.code === "relationship-conflict-review-required")) return "moderator-review"; + if (score >= ladder.thresholds.champion) return "open-science-champion"; + if (score >= ladder.thresholds.trusted) return "trusted-mentor"; + if (score >= ladder.thresholds.emerging) return "emerging-mentor"; + return "not-yet-eligible"; +} + +function evaluatePair(pair, context) { + const mentor = context.members.get(pair.mentorId); + const trainee = context.members.get(pair.traineeId); + const evidenceItems = pair.evidenceIds.map((id) => context.evidence.get(id)).filter(Boolean); + const findings = detectSafeguards(pair, mentor, trainee, evidenceItems); + const score = Math.min(100, Math.round( + evidenceQualityScore(evidenceItems) + + roleCoverageScore(evidenceItems) + + endorsementScore(evidenceItems) + + reproducibilityScore(evidenceItems) + + visibilityScore(evidenceItems) + + mentor.reputation * 0.08 + )); + const tier = tierFor(score, findings, context.ladder); + const traineeGrowth = Math.max(0, Math.round(score * 0.18 - findings.length * 2)); + const mentorDelta = tier === "moderator-review" ? 0 : Math.round(score * 0.1); + return { + mentorshipId: pair.id, + mentor: { id: mentor.id, displayName: mentor.displayName }, + trainee: { id: trainee.id, displayName: trainee.displayName }, + score, + tier, + traineeGrowth, + mentorDelta, + evidenceCount: evidenceItems.length, + creditedRoles: [...new Set(evidenceItems.flatMap((item) => item.creditedRoles || []))].sort(), + findings, + packetDigest: digest({ + pair, + evidenceItems, + score, + tier, + findings + }) + }; +} + +function summarize(pairReports) { + const allFindings = pairReports.flatMap((report) => report.findings); + const countsByTier = pairReports.reduce((counts, report) => { + counts[report.tier] = (counts[report.tier] || 0) + 1; + return counts; + }, {}); + const countsBySeverity = allFindings.reduce((counts, finding) => { + counts[finding.severity] = (counts[finding.severity] || 0) + 1; + return counts; + }, {}); + return { + averageScore: Math.round(mean(pairReports.map((report) => report.score))), + badgeEligibleCount: pairReports.filter((report) => ["open-science-champion", "trusted-mentor", "emerging-mentor"].includes(report.tier)).length, + moderatorReviewCount: pairReports.filter((report) => report.tier === "moderator-review").length, + totalFindings: allFindings.length, + countsByTier, + countsBySeverity + }; +} + +function buildInstitutionPacket(pairReports) { + return pairReports.map((report) => ({ + mentorshipId: report.mentorshipId, + mentorId: report.mentor.id, + traineeId: report.trainee.id, + tier: report.tier, + creditedRoles: report.creditedRoles, + traineeGrowth: report.traineeGrowth, + mentorDelta: report.mentorDelta, + packetDigest: report.packetDigest, + actions: report.findings.map((finding) => finding.task) + })); +} + +function runMentorshipAudit(data) { + const context = { + members: byId(data.members), + evidence: byId(data.evidence), + ladder: data.community.ladders[0] + }; + const pairReports = data.mentorships.map((pair) => evaluatePair(pair, context)); + const packet = { + community: { + id: data.community.id, + domain: data.community.domain, + reviewPeriod: data.community.reviewPeriod + }, + module: "mentorship-impact-ladder", + summary: summarize(pairReports), + pairReports, + institutionPacket: buildInstitutionPacket(pairReports) + }; + return { + ...packet, + auditDigest: digest(packet) + }; +} + +function renderMarkdown(report) { + const lines = [ + `# Mentorship Impact Ladder: ${report.community.domain}`, + "", + `Average score: **${report.summary.averageScore}**`, + `Badge eligible pairs: **${report.summary.badgeEligibleCount}**`, + `Moderator review pairs: **${report.summary.moderatorReviewCount}**`, + "", + "## Mentorship Packets" + ]; + for (const pair of report.pairReports) { + lines.push("", `### ${pair.mentorshipId}: ${pair.mentor.displayName} -> ${pair.trainee.displayName}`); + lines.push(`Tier: **${pair.tier}**`); + lines.push(`Score: **${pair.score}**`); + lines.push(`Roles: ${pair.creditedRoles.join(", ") || "none"}`); + if (!pair.findings.length) { + lines.push("- No safeguards blocking badge progression."); + } else { + for (const finding of pair.findings) { + lines.push(`- [${finding.severity}] ${finding.message}`); + lines.push(` Task: ${finding.task}`); + } + } + } + lines.push("", `Audit digest: \`${report.auditDigest}\``); + return `${lines.join("\n")}\n`; +} + +function renderSvg(report) { + const width = 960; + const rowHeight = 92; + const height = 158 + report.pairReports.length * rowHeight; + const rows = report.pairReports.map((pair, index) => { + const y = 142 + index * rowHeight; + const color = pair.tier === "moderator-review" ? "#c53030" : pair.score >= 88 ? "#2f855a" : pair.score >= 70 ? "#2b6cb0" : "#b7791f"; + return [ + `${pair.mentorshipId}`, + ``, + ``, + `${pair.tier} (${pair.score})`, + `${pair.mentor.displayName} -> ${pair.trainee.displayName} | ${pair.findings.length} finding(s)` + ].join(""); + }).join(""); + return [ + ``, + ``, + ``, + `Mentorship Impact Ladder`, + `Eligible ${report.summary.badgeEligibleCount} | Moderator review ${report.summary.moderatorReviewCount} | Audit ${report.auditDigest.slice(0, 12)}`, + rows, + `` + ].join(""); +} + +module.exports = { + runMentorshipAudit, + evaluatePair, + renderMarkdown, + renderSvg, + digest +}; diff --git a/mentorship-impact-ladder/reports/demo.mp4 b/mentorship-impact-ladder/reports/demo.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..cd3e1921fd3aa9f4c73592f3624c5f8ff5412da8 GIT binary patch literal 58726 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 Lina Gomez +Tier: **open-science-champion** +Score: **100** +Roles: data-curation, methodology, review, software, supervision, validation +- No safeguards blocking badge progression. + +### pair-2: Dr. Omar Patel -> Kai Smith +Tier: **emerging-mentor** +Score: **52** +Roles: review +- [medium] pair-2 lacks reproducibility-linked mentorship evidence. + Task: Attach a rerun, validation, or artifact verification record. +- [low] pair-2 has limited project breadth for a durable mentorship badge. + Task: Collect one more supervised contribution on a separate project. + +### pair-3: Dr. Mira Chen -> Noah Chen +Tier: **moderator-review** +Score: **43** +Roles: review, supervision +- [high] Noah Chen has not acknowledged mentorship credit for pair-3. + Task: Hold badge promotion until the trainee acknowledges the mentorship packet. +- [high] pair-3 has a declared relationship conflict that can bias reputation credit. + Task: Route this mentorship packet to an independent moderator before assigning badge credit. +- [medium] pair-3 has no independent endorsement evidence. + Task: Request an independent project owner or reviewer endorsement. +- [medium] pair-3 lacks reproducibility-linked mentorship evidence. + Task: Attach a rerun, validation, or artifact verification record. +- [low] pair-3 has limited project breadth for a durable mentorship badge. + Task: Collect one more supervised contribution on a separate project. + +Audit digest: `5e5b5aeb170d943b0ed87df8174939e9c115c5c71fffb203f341f24cfc5a3d91` diff --git a/mentorship-impact-ladder/reports/mentorship-audit.json b/mentorship-impact-ladder/reports/mentorship-audit.json new file mode 100644 index 0000000..b4253d4 --- /dev/null +++ b/mentorship-impact-ladder/reports/mentorship-audit.json @@ -0,0 +1,196 @@ +{ + "community": { + "id": "community-neuro-tools", + "domain": "computational-neuroscience", + "reviewPeriod": "2026-Q2" + }, + "module": "mentorship-impact-ladder", + "summary": { + "averageScore": 65, + "badgeEligibleCount": 2, + "moderatorReviewCount": 1, + "totalFindings": 7, + "countsByTier": { + "open-science-champion": 1, + "emerging-mentor": 1, + "moderator-review": 1 + }, + "countsBySeverity": { + "medium": 3, + "low": 2, + "high": 2 + } + }, + "pairReports": [ + { + "mentorshipId": "pair-1", + "mentor": { + "id": "mentor-a", + "displayName": "Dr. Mira Chen" + }, + "trainee": { + "id": "trainee-a", + "displayName": "Lina Gomez" + }, + "score": 100, + "tier": "open-science-champion", + "traineeGrowth": 18, + "mentorDelta": 10, + "evidenceCount": 5, + "creditedRoles": [ + "data-curation", + "methodology", + "review", + "software", + "supervision", + "validation" + ], + "findings": [], + "packetDigest": "5ca41608d183976afc9e1e4a782bcb228ac8560dae5f1c6356aba9abe498ecd5" + }, + { + "mentorshipId": "pair-2", + "mentor": { + "id": "mentor-b", + "displayName": "Dr. Omar Patel" + }, + "trainee": { + "id": "trainee-b", + "displayName": "Kai Smith" + }, + "score": 52, + "tier": "emerging-mentor", + "traineeGrowth": 5, + "mentorDelta": 5, + "evidenceCount": 3, + "creditedRoles": [ + "review" + ], + "findings": [ + { + "severity": "medium", + "code": "reproducibility-evidence-missing", + "message": "pair-2 lacks reproducibility-linked mentorship evidence.", + "task": "Attach a rerun, validation, or artifact verification record." + }, + { + "severity": "low", + "code": "portfolio-breadth-low", + "message": "pair-2 has limited project breadth for a durable mentorship badge.", + "task": "Collect one more supervised contribution on a separate project." + } + ], + "packetDigest": "0bfd6ac0d0f517b0495891b1c56b555c147ffb729d1cb9e6da910b9e85e28768" + }, + { + "mentorshipId": "pair-3", + "mentor": { + "id": "mentor-a", + "displayName": "Dr. Mira Chen" + }, + "trainee": { + "id": "trainee-c", + "displayName": "Noah Chen" + }, + "score": 43, + "tier": "moderator-review", + "traineeGrowth": 0, + "mentorDelta": 0, + "evidenceCount": 2, + "creditedRoles": [ + "review", + "supervision" + ], + "findings": [ + { + "severity": "high", + "code": "trainee-acknowledgement-missing", + "message": "Noah Chen has not acknowledged mentorship credit for pair-3.", + "task": "Hold badge promotion until the trainee acknowledges the mentorship packet." + }, + { + "severity": "high", + "code": "relationship-conflict-review-required", + "message": "pair-3 has a declared relationship conflict that can bias reputation credit.", + "task": "Route this mentorship packet to an independent moderator before assigning badge credit." + }, + { + "severity": "medium", + "code": "independent-endorsement-missing", + "message": "pair-3 has no independent endorsement evidence.", + "task": "Request an independent project owner or reviewer endorsement." + }, + { + "severity": "medium", + "code": "reproducibility-evidence-missing", + "message": "pair-3 lacks reproducibility-linked mentorship evidence.", + "task": "Attach a rerun, validation, or artifact verification record." + }, + { + "severity": "low", + "code": "portfolio-breadth-low", + "message": "pair-3 has limited project breadth for a durable mentorship badge.", + "task": "Collect one more supervised contribution on a separate project." + } + ], + "packetDigest": "fba97b73e812afea2878a2284926d6c8bfeefe9aac3a88bee16a858d384ede97" + } + ], + "institutionPacket": [ + { + "mentorshipId": "pair-1", + "mentorId": "mentor-a", + "traineeId": "trainee-a", + "tier": "open-science-champion", + "creditedRoles": [ + "data-curation", + "methodology", + "review", + "software", + "supervision", + "validation" + ], + "traineeGrowth": 18, + "mentorDelta": 10, + "packetDigest": "5ca41608d183976afc9e1e4a782bcb228ac8560dae5f1c6356aba9abe498ecd5", + "actions": [] + }, + { + "mentorshipId": "pair-2", + "mentorId": "mentor-b", + "traineeId": "trainee-b", + "tier": "emerging-mentor", + "creditedRoles": [ + "review" + ], + "traineeGrowth": 5, + "mentorDelta": 5, + "packetDigest": "0bfd6ac0d0f517b0495891b1c56b555c147ffb729d1cb9e6da910b9e85e28768", + "actions": [ + "Attach a rerun, validation, or artifact verification record.", + "Collect one more supervised contribution on a separate project." + ] + }, + { + "mentorshipId": "pair-3", + "mentorId": "mentor-a", + "traineeId": "trainee-c", + "tier": "moderator-review", + "creditedRoles": [ + "review", + "supervision" + ], + "traineeGrowth": 0, + "mentorDelta": 0, + "packetDigest": "fba97b73e812afea2878a2284926d6c8bfeefe9aac3a88bee16a858d384ede97", + "actions": [ + "Hold badge promotion until the trainee acknowledges the mentorship packet.", + "Route this mentorship packet to an independent moderator before assigning badge credit.", + "Request an independent project owner or reviewer endorsement.", + "Attach a rerun, validation, or artifact verification record.", + "Collect one more supervised contribution on a separate project." + ] + } + ], + "auditDigest": "5e5b5aeb170d943b0ed87df8174939e9c115c5c71fffb203f341f24cfc5a3d91" +} \ No newline at end of file diff --git a/mentorship-impact-ladder/reports/mentorship-ladder.svg b/mentorship-impact-ladder/reports/mentorship-ladder.svg new file mode 100644 index 0000000..a897379 --- /dev/null +++ b/mentorship-impact-ladder/reports/mentorship-ladder.svg @@ -0,0 +1 @@ +Mentorship Impact LadderEligible 2 | Moderator review 1 | Audit 5e5b5aeb170dpair-1open-science-champion (100)Dr. Mira Chen -> Lina Gomez | 0 finding(s)pair-2emerging-mentor (52)Dr. Omar Patel -> Kai Smith | 2 finding(s)pair-3moderator-review (43)Dr. Mira Chen -> Noah Chen | 5 finding(s) \ No newline at end of file diff --git a/mentorship-impact-ladder/requirements-map.md b/mentorship-impact-ladder/requirements-map.md new file mode 100644 index 0000000..018fedc --- /dev/null +++ b/mentorship-impact-ladder/requirements-map.md @@ -0,0 +1,17 @@ +# Requirements Map + +Source: SCIBASE.AI issue #15, Community & User Reputation System. + +| Requirement | Implementation | +| --- | --- | +| Peer reviews and comments | Supervised peer reviews and inline review comments are mentorship evidence inputs. | +| Review history on profiles | Pair reports emit mentor and trainee progression deltas for profile timelines. | +| Contributor credits | Evidence records carry CRediT-style roles such as review, validation, software, data-curation, and supervision. | +| Visible credit on researcher profiles | `institutionPacket` provides profile-safe mentorship credit summaries and digests. | +| CRediT taxonomy support | `creditedRoles` are normalized and scored through role weights. | +| Transparent reputation metrics | Scores are built from quality, role coverage, endorsements, reproducibility, visibility, and mentor baseline reputation. | +| Badges and incentive tiers | The ladder emits emerging mentor, trusted mentor, open science champion, and moderator-review tiers. | +| Abuse resistance | Relationship conflicts, missing trainee acknowledgement, missing endorsements, and missing reproducibility evidence create moderator or repair tasks. | +| Institutional reporting | Markdown packets and deterministic packet digests support promotion and mentorship reporting. | +| Reviewer-facing artifacts | Demo emits JSON, Markdown, SVG, and MP4 artifacts under `reports/`. | +| Local verification | `test.js` covers tier assignment, conflict safeguards, trainee acknowledgement, reproducibility requirements, digest stability, Markdown output, and SVG output. | diff --git a/mentorship-impact-ladder/sample-data.js b/mentorship-impact-ladder/sample-data.js new file mode 100644 index 0000000..5baf1c5 --- /dev/null +++ b/mentorship-impact-ladder/sample-data.js @@ -0,0 +1,207 @@ +const community = { + id: "community-neuro-tools", + domain: "computational-neuroscience", + reviewPeriod: "2026-Q2", + ladders: [ + { + id: "open-science-mentor", + name: "Open Science Mentor", + thresholds: { + emerging: 45, + trusted: 70, + champion: 88 + } + } + ] +}; + +const members = [ + { + id: "mentor-a", + displayName: "Dr. Mira Chen", + role: "mentor", + institution: "Northlake Lab", + reputation: 82, + conflicts: ["trainee-c"], + priorBadge: "Trusted Reviewer" + }, + { + id: "mentor-b", + displayName: "Dr. Omar Patel", + role: "mentor", + institution: "Cedar Institute", + reputation: 61, + conflicts: [], + priorBadge: null + }, + { + id: "trainee-a", + displayName: "Lina Gomez", + role: "trainee", + institution: "Northlake Lab", + reputation: 34, + conflicts: [], + priorBadge: null + }, + { + id: "trainee-b", + displayName: "Kai Smith", + role: "trainee", + institution: "Cedar Institute", + reputation: 41, + conflicts: [], + priorBadge: null + }, + { + id: "trainee-c", + displayName: "Noah Chen", + role: "trainee", + institution: "Northlake Lab", + reputation: 29, + conflicts: ["mentor-a"], + priorBadge: null + } +]; + +const mentorships = [ + { + id: "pair-1", + mentorId: "mentor-a", + traineeId: "trainee-a", + startDate: "2026-01-12", + declaredRelationship: "formal-lab-mentor", + goal: "Train reproducible notebook review and dataset curation", + evidenceIds: ["rev-1", "rerun-1", "dataset-1", "comment-1", "credit-1"], + acknowledgements: ["trainee-a", "mentor-a", "project-owner-7"] + }, + { + id: "pair-2", + mentorId: "mentor-b", + traineeId: "trainee-b", + startDate: "2026-02-18", + declaredRelationship: "community-mentor", + goal: "Build first peer-review portfolio", + evidenceIds: ["rev-2", "comment-2", "credit-2"], + acknowledgements: ["trainee-b", "mentor-b"] + }, + { + id: "pair-3", + mentorId: "mentor-a", + traineeId: "trainee-c", + startDate: "2026-03-04", + declaredRelationship: "family-member", + goal: "Accelerate challenge reputation tier", + evidenceIds: ["rev-3", "credit-3"], + acknowledgements: ["mentor-a"] + } +]; + +const evidence = [ + { + id: "rev-1", + type: "supervised-peer-review", + projectId: "proj-brain-atlas", + qualityScore: 91, + publicMode: "semi-private", + creditedRoles: ["review", "methodology"], + independentEndorsement: true, + reproducibilityLinked: true + }, + { + id: "rerun-1", + type: "reproducibility-rerun", + projectId: "proj-brain-atlas", + qualityScore: 88, + publicMode: "public", + creditedRoles: ["software", "validation"], + independentEndorsement: true, + reproducibilityLinked: true + }, + { + id: "dataset-1", + type: "dataset-curation", + projectId: "proj-brain-atlas", + qualityScore: 84, + publicMode: "public", + creditedRoles: ["data-curation"], + independentEndorsement: true, + reproducibilityLinked: true + }, + { + id: "comment-1", + type: "inline-review-comment", + projectId: "proj-brain-atlas", + qualityScore: 78, + publicMode: "semi-private", + creditedRoles: ["review"], + independentEndorsement: false, + reproducibilityLinked: false + }, + { + id: "credit-1", + type: "credit-approval", + projectId: "proj-brain-atlas", + qualityScore: 95, + publicMode: "public", + creditedRoles: ["supervision", "validation", "data-curation"], + independentEndorsement: true, + reproducibilityLinked: true + }, + { + id: "rev-2", + type: "supervised-peer-review", + projectId: "proj-microbiome", + qualityScore: 68, + publicMode: "semi-private", + creditedRoles: ["review"], + independentEndorsement: false, + reproducibilityLinked: false + }, + { + id: "comment-2", + type: "inline-review-comment", + projectId: "proj-microbiome", + qualityScore: 71, + publicMode: "public", + creditedRoles: ["review"], + independentEndorsement: true, + reproducibilityLinked: false + }, + { + id: "credit-2", + type: "credit-approval", + projectId: "proj-microbiome", + qualityScore: 74, + publicMode: "public", + creditedRoles: ["review"], + independentEndorsement: true, + reproducibilityLinked: false + }, + { + id: "rev-3", + type: "supervised-peer-review", + projectId: "proj-private-challenge", + qualityScore: 82, + publicMode: "anonymous", + creditedRoles: ["review"], + independentEndorsement: false, + reproducibilityLinked: false + }, + { + id: "credit-3", + type: "credit-approval", + projectId: "proj-private-challenge", + qualityScore: 90, + publicMode: "anonymous", + creditedRoles: ["supervision"], + independentEndorsement: false, + reproducibilityLinked: false + } +]; + +module.exports = { + community, + members, + mentorships, + evidence +}; diff --git a/mentorship-impact-ladder/test.js b/mentorship-impact-ladder/test.js new file mode 100644 index 0000000..581450b --- /dev/null +++ b/mentorship-impact-ladder/test.js @@ -0,0 +1,33 @@ +const assert = require("node:assert/strict"); +const data = require("./sample-data"); +const { digest, renderMarkdown, renderSvg, runMentorshipAudit } = require("./index"); + +const report = runMentorshipAudit(data); +const byPair = new Map(report.pairReports.map((pair) => [pair.mentorshipId, pair])); + +assert.equal(report.module, "mentorship-impact-ladder"); +assert.equal(report.pairReports.length, 3); +assert.match(report.auditDigest, /^[a-f0-9]{64}$/); + +assert.equal(byPair.get("pair-1").tier, "open-science-champion"); +assert.ok(byPair.get("pair-1").score >= 88); +assert.equal(byPair.get("pair-1").findings.length, 0); +assert.ok(byPair.get("pair-1").creditedRoles.includes("validation")); + +assert.equal(byPair.get("pair-2").tier, "emerging-mentor"); +assert.ok(byPair.get("pair-2").findings.some((finding) => finding.code === "reproducibility-evidence-missing")); + +assert.equal(byPair.get("pair-3").tier, "moderator-review"); +assert.ok(byPair.get("pair-3").findings.some((finding) => finding.code === "trainee-acknowledgement-missing")); +assert.ok(byPair.get("pair-3").findings.some((finding) => finding.code === "relationship-conflict-review-required")); +assert.equal(byPair.get("pair-3").mentorDelta, 0); + +assert.equal(report.summary.badgeEligibleCount, 2); +assert.equal(report.summary.moderatorReviewCount, 1); +assert.ok(report.institutionPacket.every((packet) => packet.packetDigest)); + +assert.equal(digest({ b: 2, a: 1 }), digest({ a: 1, b: 2 })); +assert.ok(renderMarkdown(report).includes("Mentorship Impact Ladder")); +assert.ok(renderSvg(report).startsWith("