diff --git a/data/committee-config.json b/data/committee-config.json index d411822..717ecd2 100644 --- a/data/committee-config.json +++ b/data/committee-config.json @@ -8,5 +8,8 @@ {"login": "shaal", "name": "Ofer Shaal", "role": "member"}, {"login": "inde5media", "name": "Mat Mathews", "role": "member"}, {"login": "rcraw", "name": "Robert Ranson", "role": "member"} + ], + "contributors": [ + {"login": "CraftsMan-Labs", "name": "Rishub C R (Craftsman)", "role": "contributor"} ] } diff --git a/scripts/build-dashboard.mjs b/scripts/build-dashboard.mjs index 1fbbb96..a6b0afd 100644 --- a/scripts/build-dashboard.mjs +++ b/scripts/build-dashboard.mjs @@ -80,6 +80,7 @@ const dashboard = { name: config.committee_name, quorum_rule: config.quorum_rule, members: config.members, + contributors: config.contributors || [], }, submissions, approved, diff --git a/test/committee-config.test.js b/test/committee-config.test.js new file mode 100644 index 0000000..ce2f2b0 --- /dev/null +++ b/test/committee-config.test.js @@ -0,0 +1,26 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; + +const cfg = JSON.parse(readFileSync(new URL('../data/committee-config.json', import.meta.url))); + +test('committee-config: members drive quorum, contributors do not', () => { + // Quorum is Math.floor(members.length / 2) + 1 in the vote workflows. + // Contributors MUST NOT be in members[], or they would change the quorum denominator. + assert.equal(cfg.members.length, 6, 'voting roster size (quorum denominator) unchanged'); + const quorum = Math.floor(cfg.members.length / 2) + 1; + assert.equal(quorum, 4, 'simple-majority quorum is 4'); +}); + +test('committee-config: Craftsman is a non-voting contributor', () => { + const contribLogins = (cfg.contributors || []).map((c) => c.login); + assert.ok(contribLogins.includes('CraftsMan-Labs'), 'Craftsman listed as contributor'); + const memberLogins = cfg.members.map((m) => m.login); + // Non-voting invariant: no login appears in both arrays. + for (const l of contribLogins) { + assert.ok(!memberLogins.includes(l), `${l} must not also be a voting member`); + } + for (const c of cfg.contributors || []) { + assert.equal(c.role, 'contributor', `${c.login} role is contributor`); + } +});