@medicine-wheel/community-review
Version:
Community-based ceremonial review protocol for Medicine Wheel — implements Wilson's validation through Elder review circles, consensus, and relational accountability
140 lines • 6.45 kB
JavaScript
;
/**
* @medicine-wheel/community-review — Accountability
*
* Review functions that assess artifacts against Wilson's three R's,
* OCAP® principles, and relational health.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.reviewerAccountability = reviewerAccountability;
exports.reviewAgainstWilson = reviewAgainstWilson;
exports.reviewAgainstOcap = reviewAgainstOcap;
exports.relationalHealthReview = relationalHealthReview;
/**
* Determine who a reviewer is accountable to.
* Returns the accountability chain for a given reviewer.
*/
function reviewerAccountability(reviewer) {
const roleStatements = {
steward: 'As steward, accountable to the community and future generations for the care of this knowledge.',
contributor: 'As contributor, accountable to the circle for the integrity of contributions.',
elder: 'As elder, accountable to the ancestors and the community for wise guidance.',
firekeeper: 'As firekeeper, accountable to the ceremony and all participants for maintaining sacred space.',
'community-member': 'As community member, accountable to the community for honest voice.',
youth: 'As youth, accountable to future generations for carrying the teachings forward.',
};
return {
reviewerId: reviewer.id,
role: reviewer.role,
accountableTo: reviewer.accountableTo,
direction: reviewer.direction,
accountabilityStatement: roleStatements[reviewer.role] ?? 'Accountable to all relations.',
};
}
/**
* Check an artifact (via its review circle) against Wilson's three R's:
* Respect, Reciprocity, Responsibility.
*/
function reviewAgainstWilson(circle) {
const observations = [];
// Respect: Are all directions and roles represented?
const directions = new Set(circle.reviewers.filter((r) => r.direction).map((r) => r.direction));
const respectHonored = directions.size >= 2 && circle.reviewers.length >= 2;
if (!respectHonored) {
observations.push('Respect: Not all perspectives are represented in the circle');
}
// Reciprocity: Has the artifact given back to the community?
const hasElderVoice = circle.talkingCircleLog.some((e) => e.role === 'elder');
const hasCommunityVoice = circle.talkingCircleLog.some((e) => e.role === 'community-member' || e.role === 'youth');
const reciprocityPresent = hasElderVoice || hasCommunityVoice;
if (!reciprocityPresent) {
observations.push('Reciprocity: Elder or community voices have not been heard');
}
// Responsibility: Has accountability been explicitly stated?
const reviewersWithAccountability = circle.reviewers.filter((r) => r.accountableTo.length > 0);
const responsibilityTaken = reviewersWithAccountability.length === circle.reviewers.length &&
circle.reviewers.length > 0;
if (!responsibilityTaken) {
observations.push('Responsibility: Not all reviewers have stated their accountability');
}
const wilsonCheck = {
respectHonored,
reciprocityPresent,
responsibilityTaken,
};
const trueCount = [respectHonored, reciprocityPresent, responsibilityTaken].filter(Boolean).length;
const score = trueCount / 3;
if (observations.length === 0) {
observations.push("Wilson's three R's are honored in this review circle");
}
return { wilsonCheck, score, observations };
}
/**
* Check an artifact's review against OCAP® principles:
* Ownership, Control, Access, Possession.
*/
function reviewAgainstOcap(circle) {
const issues = [];
// Check that community ownership is represented
const hasSteward = circle.reviewers.some((r) => r.role === 'steward');
if (!hasSteward) {
issues.push('Ownership: No steward present to represent community ownership');
}
// Check that review process includes community control
const hasElderOrFirekeeper = circle.reviewers.some((r) => r.role === 'elder' || r.role === 'firekeeper');
if (!hasElderOrFirekeeper) {
issues.push('Control: No elder or firekeeper to ensure community control');
}
// Check that access considerations are addressed
if (!circle.ocapCompliant) {
issues.push('Access/Possession: OCAP® compliance has not been confirmed');
}
return {
compliant: issues.length === 0,
issues,
};
}
/**
* Assess the relational health of the review circle itself.
* A healthy circle has diverse perspectives, active participation,
* and explicit accountability.
*/
function relationalHealthReview(circle) {
const recommendations = [];
// Diversity: How many directions and roles are represented?
const uniqueDirections = new Set(circle.reviewers.filter((r) => r.direction).map((r) => r.direction)).size;
const uniqueRoles = new Set(circle.reviewers.map((r) => r.role)).size;
const diversity = Math.min(1, (uniqueDirections + uniqueRoles) / 8);
if (diversity < 0.5) {
recommendations.push('Invite reviewers from underrepresented directions and roles');
}
// Participation: What fraction of reviewers have spoken?
const spoke = new Set(circle.talkingCircleLog.map((e) => e.speakerId));
const participation = circle.reviewers.length > 0
? [...new Set(circle.reviewers.map((r) => r.id))].filter((id) => spoke.has(id)).length / circle.reviewers.length
: 0;
if (participation < 0.75) {
recommendations.push('Not all reviewers have been heard — invite remaining voices');
}
// Accountability: Do all reviewers have stated accountability?
const withAccountability = circle.reviewers.filter((r) => r.accountableTo.length > 0).length;
const accountability = circle.reviewers.length > 0
? withAccountability / circle.reviewers.length
: 0;
if (accountability < 1) {
recommendations.push('Some reviewers have not stated who they are accountable to');
}
// Elder presence
const elderPresence = circle.elderValidator ? 1 : 0;
if (!elderPresence) {
recommendations.push('Consider requesting Elder validation');
}
const score = (diversity + participation + accountability + elderPresence) / 4;
return {
healthy: score >= 0.6,
score,
dimensions: { diversity, participation, accountability, elderPresence },
recommendations,
};
}
//# sourceMappingURL=accountability.js.map