@memberjunction/rubrics-base 0.0.0 → 6.2.0-edge.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +183 -0
- package/README.md +35 -28
- package/dist/RubricEngineBase.d.ts +150 -0
- package/dist/RubricEngineBase.d.ts.map +1 -0
- package/dist/RubricEngineBase.js +267 -0
- package/dist/RubricEngineBase.js.map +1 -0
- package/dist/RubricScoring.d.ts +60 -0
- package/dist/RubricScoring.d.ts.map +1 -0
- package/dist/RubricScoring.js +363 -0
- package/dist/RubricScoring.js.map +1 -0
- package/dist/RubricVersionDiff.d.ts +59 -0
- package/dist/RubricVersionDiff.d.ts.map +1 -0
- package/dist/RubricVersionDiff.js +256 -0
- package/dist/RubricVersionDiff.js.map +1 -0
- package/dist/authoring.d.ts +16 -0
- package/dist/authoring.d.ts.map +1 -0
- package/dist/authoring.js +98 -0
- package/dist/authoring.js.map +1 -0
- package/dist/canonical.d.ts +22 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +152 -0
- package/dist/canonical.js.map +1 -0
- package/dist/evidence.d.ts +13 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +38 -0
- package/dist/evidence.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/sampling.d.ts +71 -0
- package/dist/sampling.d.ts.map +1 -0
- package/dist/sampling.js +63 -0
- package/dist/sampling.js.map +1 -0
- package/dist/snapshot.d.ts +16 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +114 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/types.d.ts +170 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +39 -7
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { CanonicalJson, ContentProjection, ScoringProjection } from './canonical.js';
|
|
2
|
+
const RANK = { Patch: 1, Minor: 2, Major: 3 };
|
|
3
|
+
/**
|
|
4
|
+
* The highest Published or Retired version. A Draft is not a base. Equal numbers
|
|
5
|
+
* keep the first row. A rubric with only drafts returns null, and that publish
|
|
6
|
+
* is 1.0.0.
|
|
7
|
+
*/
|
|
8
|
+
export function HighestNonDraftVersion(versions) {
|
|
9
|
+
const ranked = versions.filter(version => version.status !== 'Draft' && version.id.length > 0);
|
|
10
|
+
if (ranked.length === 0)
|
|
11
|
+
return null;
|
|
12
|
+
return ranked.reduce((best, version) => {
|
|
13
|
+
if (version.major !== best.major)
|
|
14
|
+
return version.major > best.major ? version : best;
|
|
15
|
+
if (version.minor !== best.minor)
|
|
16
|
+
return version.minor > best.minor ? version : best;
|
|
17
|
+
if (version.patch !== best.patch)
|
|
18
|
+
return version.patch > best.patch ? version : best;
|
|
19
|
+
return best;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Classifies a draft against the version it was cloned from.
|
|
24
|
+
*
|
|
25
|
+
* The bump describes whether scores stay comparable, not which rows moved.
|
|
26
|
+
* Major: a non-advisory node was added or removed, or a non-advisory node's parent,
|
|
27
|
+
* type, weight, scale, gate, gate minimum, not-applicable policy, rollup, or evaluator
|
|
28
|
+
* config changed, or IsAdvisory flipped, or the version's not-applicable policy changed,
|
|
29
|
+
* or a scale a non-advisory node uses changed its type, range, step, direction, or a
|
|
30
|
+
* level's value or normalized value. A node that is advisory on both sides does not
|
|
31
|
+
* produce a major bump from those scoring fields: they do not change ScoringHash.
|
|
32
|
+
* Minor: the pass threshold or minimum completeness changed, a band's range or tone
|
|
33
|
+
* changed, an advisory node was added or removed, or an advisory node's parent, type,
|
|
34
|
+
* weight, scale, gate, rollup, or evaluator config changed, or evidence/rationale
|
|
35
|
+
* requirements changed.
|
|
36
|
+
* Bands match by label first. A clone's new id with the same label is not a bump.
|
|
37
|
+
* A label rename of the same band is Patch. Sequence is Patch, so a sequence-only
|
|
38
|
+
* edit is not identical.
|
|
39
|
+
* Patch: wording, sequence, and display range only.
|
|
40
|
+
*
|
|
41
|
+
* The highest change wins. AppliedBump is the max of that and the author's request;
|
|
42
|
+
* the author may go higher and may not go lower. The first publish, with no base,
|
|
43
|
+
* is 1.0.0 and Initial. A draft identical to its base cannot be published.
|
|
44
|
+
*
|
|
45
|
+
* Parent links are compared by the parent key. A clone assigns new ids, so comparing
|
|
46
|
+
* ParentID strings would mark every node major.
|
|
47
|
+
*/
|
|
48
|
+
export class RubricVersionDiff {
|
|
49
|
+
static Diff(base, draft, requestedBump) {
|
|
50
|
+
if (!base) {
|
|
51
|
+
return {
|
|
52
|
+
changes: [],
|
|
53
|
+
computedBump: null,
|
|
54
|
+
appliedBump: 'Initial',
|
|
55
|
+
nextVersion: { major: 1, minor: 0, patch: 0 },
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const changes = RubricVersionDiff.collect(base, draft);
|
|
59
|
+
const computedBump = RubricVersionDiff.highest(changes);
|
|
60
|
+
if (!computedBump) {
|
|
61
|
+
return { changes, computedBump: null, appliedBump: null, nextVersion: null };
|
|
62
|
+
}
|
|
63
|
+
const applied = RubricVersionDiff.applyRequest(computedBump, requestedBump ?? null);
|
|
64
|
+
return {
|
|
65
|
+
changes,
|
|
66
|
+
computedBump,
|
|
67
|
+
appliedBump: applied,
|
|
68
|
+
nextVersion: RubricVersionDiff.nextNumber(base, applied),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Canonical major-row projection. Hash this for ScoringHash. */
|
|
72
|
+
static ScoringCanonical(version) {
|
|
73
|
+
return CanonicalJson(ScoringProjection(version));
|
|
74
|
+
}
|
|
75
|
+
/** Canonical full projection. Hash this for ContentHash. */
|
|
76
|
+
static ContentCanonical(version) {
|
|
77
|
+
return CanonicalJson(ContentProjection(version));
|
|
78
|
+
}
|
|
79
|
+
static collect(base, draft) {
|
|
80
|
+
const changes = [];
|
|
81
|
+
if (base.notApplicablePolicy !== draft.notApplicablePolicy) {
|
|
82
|
+
changes.push({ bump: 'Major', subject: 'version', property: 'NotApplicablePolicy', from: base.notApplicablePolicy, to: draft.notApplicablePolicy });
|
|
83
|
+
}
|
|
84
|
+
RubricVersionDiff.pushScalar(changes, 'Minor', 'version', 'PassThreshold', base.passThreshold ?? null, draft.passThreshold ?? null);
|
|
85
|
+
RubricVersionDiff.pushScalar(changes, 'Minor', 'version', 'MinimumCompleteness', base.minimumCompleteness ?? null, draft.minimumCompleteness ?? null);
|
|
86
|
+
RubricVersionDiff.pushScalar(changes, 'Patch', 'version', 'Instructions', base.instructions ?? null, draft.instructions ?? null);
|
|
87
|
+
RubricVersionDiff.pushScalar(changes, 'Patch', 'version', 'ScoreDisplayMin', base.scoreDisplayMin, draft.scoreDisplayMin);
|
|
88
|
+
RubricVersionDiff.pushScalar(changes, 'Patch', 'version', 'ScoreDisplayMax', base.scoreDisplayMax, draft.scoreDisplayMax);
|
|
89
|
+
const baseNodes = new Map(base.nodes.map(node => [node.key, node]));
|
|
90
|
+
const draftNodes = new Map(draft.nodes.map(node => [node.key, node]));
|
|
91
|
+
for (const [key, node] of draftNodes) {
|
|
92
|
+
const previous = baseNodes.get(key);
|
|
93
|
+
if (!previous) {
|
|
94
|
+
changes.push({ bump: node.isAdvisory ? 'Minor' : 'Major', subject: key, property: 'added', from: null, to: node.name });
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
RubricVersionDiff.diffNode(changes, base, draft, previous, node);
|
|
98
|
+
}
|
|
99
|
+
for (const [key, node] of baseNodes) {
|
|
100
|
+
if (!draftNodes.has(key)) {
|
|
101
|
+
changes.push({ bump: node.isAdvisory ? 'Minor' : 'Major', subject: key, property: 'removed', from: node.name, to: null });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
RubricVersionDiff.diffBands(changes, base, draft);
|
|
105
|
+
RubricVersionDiff.diffScales(changes, base, draft);
|
|
106
|
+
return changes;
|
|
107
|
+
}
|
|
108
|
+
static diffNode(changes, base, draft, previous, node) {
|
|
109
|
+
const subject = node.key;
|
|
110
|
+
const scoringBump = previous.isAdvisory && node.isAdvisory ? 'Minor' : 'Major';
|
|
111
|
+
const parentWas = RubricVersionDiff.parentKey(base, previous);
|
|
112
|
+
const parentNow = RubricVersionDiff.parentKey(draft, node);
|
|
113
|
+
RubricVersionDiff.pushScalar(changes, scoringBump, subject, 'ParentID', parentWas, parentNow);
|
|
114
|
+
RubricVersionDiff.pushScalar(changes, scoringBump, subject, 'NodeType', previous.nodeType, node.nodeType);
|
|
115
|
+
RubricVersionDiff.pushScalar(changes, scoringBump, subject, 'Weight', previous.weight, node.weight);
|
|
116
|
+
RubricVersionDiff.pushScalar(changes, scoringBump, subject, 'ScaleID', previous.scaleId ?? null, node.scaleId ?? null);
|
|
117
|
+
RubricVersionDiff.pushScalar(changes, 'Major', subject, 'IsAdvisory', previous.isAdvisory, node.isAdvisory);
|
|
118
|
+
RubricVersionDiff.pushScalar(changes, scoringBump, subject, 'IsGate', previous.isGate, node.isGate);
|
|
119
|
+
RubricVersionDiff.pushScalar(changes, scoringBump, subject, 'GateMinimumScore', previous.gateMinimumScore ?? null, node.gateMinimumScore ?? null);
|
|
120
|
+
RubricVersionDiff.pushScalar(changes, scoringBump, subject, 'NotApplicablePolicy', previous.notApplicablePolicy ?? null, node.notApplicablePolicy ?? null);
|
|
121
|
+
RubricVersionDiff.pushScalar(changes, scoringBump, subject, 'RollupMethod', previous.rollupMethod ?? null, node.rollupMethod ?? null);
|
|
122
|
+
RubricVersionDiff.pushScalar(changes, scoringBump, subject, 'EvaluatorConfig', CanonicalJson(previous.evaluatorConfig ?? null), CanonicalJson(node.evaluatorConfig ?? null));
|
|
123
|
+
RubricVersionDiff.pushScalar(changes, 'Minor', subject, 'EvidenceRequired', previous.evidenceRequired, node.evidenceRequired);
|
|
124
|
+
RubricVersionDiff.pushScalar(changes, 'Minor', subject, 'RationaleRequired', previous.rationaleRequired, node.rationaleRequired);
|
|
125
|
+
RubricVersionDiff.pushScalar(changes, 'Patch', subject, 'Name', previous.name, node.name);
|
|
126
|
+
RubricVersionDiff.pushScalar(changes, 'Patch', subject, 'Description', previous.description ?? null, node.description ?? null);
|
|
127
|
+
RubricVersionDiff.pushScalar(changes, 'Patch', subject, 'Guidance', previous.guidance ?? null, node.guidance ?? null);
|
|
128
|
+
RubricVersionDiff.pushScalar(changes, 'Patch', subject, 'Sequence', previous.sequence, node.sequence);
|
|
129
|
+
const previousDescriptors = (previous.anchors ?? []).map(anchor => anchor.descriptor).join('\n');
|
|
130
|
+
const descriptors = (node.anchors ?? []).map(anchor => anchor.descriptor).join('\n');
|
|
131
|
+
RubricVersionDiff.pushScalar(changes, 'Patch', subject, 'Descriptor', previousDescriptors, descriptors);
|
|
132
|
+
}
|
|
133
|
+
static diffBands(changes, base, draft) {
|
|
134
|
+
// Label is unique inside a version. Match on it so a clone's new id is not a bump.
|
|
135
|
+
// A renamed label is the same band when the id survived, or when it is the only
|
|
136
|
+
// unmatched pair. §5.2 makes that rename Patch, and Sequence Patch as well.
|
|
137
|
+
const before = new Map(base.bands.map(band => [band.label, band]));
|
|
138
|
+
const after = new Map(draft.bands.map(band => [band.label, band]));
|
|
139
|
+
const unmatchedBefore = [];
|
|
140
|
+
const unmatchedAfter = [];
|
|
141
|
+
for (const [label, band] of after) {
|
|
142
|
+
const previous = before.get(label);
|
|
143
|
+
if (!previous) {
|
|
144
|
+
unmatchedAfter.push(band);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
RubricVersionDiff.diffOneBand(changes, previous, band);
|
|
148
|
+
}
|
|
149
|
+
for (const [label, band] of before) {
|
|
150
|
+
if (!after.has(label))
|
|
151
|
+
unmatchedBefore.push(band);
|
|
152
|
+
}
|
|
153
|
+
const claimed = new Set();
|
|
154
|
+
for (const previous of unmatchedBefore) {
|
|
155
|
+
const byId = unmatchedAfter.find(band => band.id === previous.id && !claimed.has(band.id));
|
|
156
|
+
const onlyPair = unmatchedBefore.length === 1 && unmatchedAfter.length === 1 ? unmatchedAfter[0] : undefined;
|
|
157
|
+
const partner = byId ?? (onlyPair && !claimed.has(onlyPair.id) ? onlyPair : undefined);
|
|
158
|
+
if (!partner) {
|
|
159
|
+
changes.push({ bump: 'Minor', subject: previous.label, property: 'band removed', from: previous.label, to: null });
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
claimed.add(partner.id);
|
|
163
|
+
if (previous.label !== partner.label) {
|
|
164
|
+
changes.push({ bump: 'Patch', subject: previous.label, property: 'band label', from: previous.label, to: partner.label });
|
|
165
|
+
}
|
|
166
|
+
RubricVersionDiff.diffOneBand(changes, previous, partner);
|
|
167
|
+
}
|
|
168
|
+
for (const band of unmatchedAfter) {
|
|
169
|
+
if (claimed.has(band.id))
|
|
170
|
+
continue;
|
|
171
|
+
changes.push({ bump: 'Minor', subject: band.label, property: 'band added', from: null, to: { minScore: band.minScore, maxScore: band.maxScore, displayTone: band.displayTone } });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
static diffOneBand(changes, previous, band) {
|
|
175
|
+
if (previous.minScore !== band.minScore || previous.maxScore !== band.maxScore || previous.displayTone !== band.displayTone) {
|
|
176
|
+
changes.push({ bump: 'Minor', subject: band.label, property: 'band range', from: { minScore: previous.minScore, maxScore: previous.maxScore, displayTone: previous.displayTone }, to: { minScore: band.minScore, maxScore: band.maxScore, displayTone: band.displayTone } });
|
|
177
|
+
}
|
|
178
|
+
if ((previous.description ?? null) !== (band.description ?? null)) {
|
|
179
|
+
changes.push({ bump: 'Patch', subject: band.label, property: 'band wording', from: previous.description ?? null, to: band.description ?? null });
|
|
180
|
+
}
|
|
181
|
+
if (previous.sequence !== band.sequence) {
|
|
182
|
+
changes.push({ bump: 'Patch', subject: band.label, property: 'Sequence', from: previous.sequence, to: band.sequence });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
static diffScales(changes, base, draft) {
|
|
186
|
+
const used = new Set();
|
|
187
|
+
for (const node of [...base.nodes, ...draft.nodes]) {
|
|
188
|
+
if (!node.isAdvisory && node.scaleId)
|
|
189
|
+
used.add(node.scaleId);
|
|
190
|
+
}
|
|
191
|
+
for (const id of used) {
|
|
192
|
+
const previous = base.scales.find(scale => scale.id === id);
|
|
193
|
+
const next = draft.scales.find(scale => scale.id === id);
|
|
194
|
+
if (!previous || !next)
|
|
195
|
+
continue;
|
|
196
|
+
RubricVersionDiff.pushScalar(changes, 'Major', id, 'ScaleType', previous.scaleType, next.scaleType);
|
|
197
|
+
RubricVersionDiff.pushScalar(changes, 'Major', id, 'MinValue', previous.minValue ?? null, next.minValue ?? null);
|
|
198
|
+
RubricVersionDiff.pushScalar(changes, 'Major', id, 'MaxValue', previous.maxValue ?? null, next.maxValue ?? null);
|
|
199
|
+
RubricVersionDiff.pushScalar(changes, 'Major', id, 'Step', previous.step ?? null, next.step ?? null);
|
|
200
|
+
RubricVersionDiff.pushScalar(changes, 'Major', id, 'HigherIsBetter', previous.higherIsBetter, next.higherIsBetter);
|
|
201
|
+
const beforeLevels = new Map(previous.levels.map(level => [level.id, level]));
|
|
202
|
+
const afterLevels = new Map(next.levels.map(level => [level.id, level]));
|
|
203
|
+
for (const [levelId, level] of afterLevels) {
|
|
204
|
+
const was = beforeLevels.get(levelId);
|
|
205
|
+
if (!was) {
|
|
206
|
+
changes.push({ bump: 'Major', subject: id, property: 'level added', from: null, to: level.label });
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
RubricVersionDiff.pushScalar(changes, 'Major', id, 'Value', was.value, level.value);
|
|
210
|
+
RubricVersionDiff.pushScalar(changes, 'Major', id, 'NormalizedValue', was.normalizedValue, level.normalizedValue);
|
|
211
|
+
RubricVersionDiff.pushScalar(changes, 'Patch', id, 'level label', was.label, level.label);
|
|
212
|
+
RubricVersionDiff.pushScalar(changes, 'Patch', id, 'level description', was.description ?? null, level.description ?? null);
|
|
213
|
+
}
|
|
214
|
+
for (const levelId of beforeLevels.keys()) {
|
|
215
|
+
if (!afterLevels.has(levelId))
|
|
216
|
+
changes.push({ bump: 'Major', subject: id, property: 'level removed', from: beforeLevels.get(levelId)?.label ?? null, to: null });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
static parentKey(version, node) {
|
|
221
|
+
if (!node.parentId)
|
|
222
|
+
return null;
|
|
223
|
+
return version.nodes.find(item => item.id === node.parentId)?.key ?? node.parentId;
|
|
224
|
+
}
|
|
225
|
+
static pushScalar(changes, bump, subject, property, before, after) {
|
|
226
|
+
if (before === after)
|
|
227
|
+
return;
|
|
228
|
+
if (typeof before === 'number' && typeof after === 'number' && Object.is(before, after))
|
|
229
|
+
return;
|
|
230
|
+
changes.push({ bump, subject, property, from: before ?? null, to: after ?? null });
|
|
231
|
+
}
|
|
232
|
+
static highest(changes) {
|
|
233
|
+
let best = null;
|
|
234
|
+
for (const change of changes) {
|
|
235
|
+
if (!best || RANK[change.bump] > RANK[best])
|
|
236
|
+
best = change.bump;
|
|
237
|
+
}
|
|
238
|
+
return best;
|
|
239
|
+
}
|
|
240
|
+
static applyRequest(computed, requested) {
|
|
241
|
+
if (!requested || RANK[requested] <= RANK[computed])
|
|
242
|
+
return computed;
|
|
243
|
+
return requested;
|
|
244
|
+
}
|
|
245
|
+
static nextNumber(base, bump) {
|
|
246
|
+
const major = base.majorVersion ?? 0;
|
|
247
|
+
const minor = base.minorVersion ?? 0;
|
|
248
|
+
const patch = base.patchVersion ?? 0;
|
|
249
|
+
if (bump === 'Major' || bump === 'Initial')
|
|
250
|
+
return { major: major + 1, minor: 0, patch: 0 };
|
|
251
|
+
if (bump === 'Minor')
|
|
252
|
+
return { major, minor: minor + 1, patch: 0 };
|
|
253
|
+
return { major, minor, patch: patch + 1 };
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=RubricVersionDiff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RubricVersionDiff.js","sourceRoot":"","sources":["../src/RubricVersionDiff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RubricBandSnapshot, RubricNodeSnapshot, RubricScaleSnapshot } from './types.js';
|
|
2
|
+
/** Six decimal places, the same rounding scoring uses before a band boundary. */
|
|
3
|
+
export declare function Round6(value: number): number;
|
|
4
|
+
/**
|
|
5
|
+
* Half-open band ranges. A score equal to a band's max belongs to the next band.
|
|
6
|
+
* The band whose max is 1 also contains 1. The score and the bounds are rounded
|
|
7
|
+
* to six decimal places before the comparison.
|
|
8
|
+
*/
|
|
9
|
+
export declare function BandFor(normalized: number | null, bands: RubricBandSnapshot[]): RubricBandSnapshot | null;
|
|
10
|
+
/** Live weight share among a node's included siblings, as a percent. Advisory nodes are left out. */
|
|
11
|
+
export declare function WeightShares(nodes: RubricNodeSnapshot[]): Map<string, number>;
|
|
12
|
+
/** Problems that block a draft from being a publishable tree. */
|
|
13
|
+
export declare function DraftProblems(nodes: RubricNodeSnapshot[], scales: RubricScaleSnapshot[]): string[];
|
|
14
|
+
/** A scale is frozen when a published version uses it. A missing scale id is not frozen. */
|
|
15
|
+
export declare function Frozen(publishedScaleIds: Iterable<string>, scaleId: string | null): boolean;
|
|
16
|
+
//# sourceMappingURL=authoring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authoring.d.ts","sourceRoot":"","sources":["../src/authoring.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE9F,iFAAiF;AACjF,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,GAAG,IAAI,CAWzG;AAED,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAqB7E;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,EAAE,CAmBlG;AAED,4FAA4F;AAC5F,wBAAgB,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAM3F"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { NormalizeUUID, UUIDsEqual } from '@memberjunction/global';
|
|
2
|
+
/** Six decimal places, the same rounding scoring uses before a band boundary. */
|
|
3
|
+
export function Round6(value) {
|
|
4
|
+
return Math.round((value + Number.EPSILON) * 1_000_000) / 1_000_000;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Half-open band ranges. A score equal to a band's max belongs to the next band.
|
|
8
|
+
* The band whose max is 1 also contains 1. The score and the bounds are rounded
|
|
9
|
+
* to six decimal places before the comparison.
|
|
10
|
+
*/
|
|
11
|
+
export function BandFor(normalized, bands) {
|
|
12
|
+
if (normalized === null)
|
|
13
|
+
return null;
|
|
14
|
+
const rounded = Round6(normalized);
|
|
15
|
+
const ordered = [...bands].sort((left, right) => left.minScore - right.minScore || left.maxScore - right.maxScore);
|
|
16
|
+
for (const band of ordered) {
|
|
17
|
+
const min = Round6(band.minScore);
|
|
18
|
+
const max = Round6(band.maxScore);
|
|
19
|
+
const top = max === 1 && rounded === 1;
|
|
20
|
+
if (rounded >= min && (rounded < max || top))
|
|
21
|
+
return band;
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
/** Live weight share among a node's included siblings, as a percent. Advisory nodes are left out. */
|
|
26
|
+
export function WeightShares(nodes) {
|
|
27
|
+
const shares = new Map();
|
|
28
|
+
const groups = new Map();
|
|
29
|
+
for (const node of nodes) {
|
|
30
|
+
const key = NormalizeUUID(node.parentId);
|
|
31
|
+
const list = groups.get(key) ?? [];
|
|
32
|
+
list.push(node);
|
|
33
|
+
groups.set(key, list);
|
|
34
|
+
}
|
|
35
|
+
for (const siblings of groups.values()) {
|
|
36
|
+
const included = siblings.filter(node => !node.isAdvisory);
|
|
37
|
+
const total = included.reduce((sum, node) => sum + node.weight, 0);
|
|
38
|
+
for (const node of siblings) {
|
|
39
|
+
if (node.isAdvisory || total <= 0) {
|
|
40
|
+
shares.set(node.id, 0);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
shares.set(node.id, (node.weight / total) * 100);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return shares;
|
|
47
|
+
}
|
|
48
|
+
/** Problems that block a draft from being a publishable tree. */
|
|
49
|
+
export function DraftProblems(nodes, scales) {
|
|
50
|
+
const problems = [];
|
|
51
|
+
const keys = new Set();
|
|
52
|
+
for (const node of nodes) {
|
|
53
|
+
if (keys.has(node.key))
|
|
54
|
+
problems.push(`Duplicate key ${node.key}.`);
|
|
55
|
+
keys.add(node.key);
|
|
56
|
+
if (node.parentId && !nodes.some(item => UUIDsEqual(item.id, node.parentId))) {
|
|
57
|
+
problems.push(`${node.key} points at a missing parent.`);
|
|
58
|
+
}
|
|
59
|
+
if (ancestorOf(nodes, node.id, node.parentId ?? null))
|
|
60
|
+
problems.push(`${node.key} is inside its own descendant.`);
|
|
61
|
+
if (node.nodeType === 'Criterion' && !node.scaleId)
|
|
62
|
+
problems.push(`${node.key} needs a scale.`);
|
|
63
|
+
if (node.scaleId && !scales.some(scale => UUIDsEqual(scale.id, node.scaleId))) {
|
|
64
|
+
problems.push(`${node.key} names a missing scale.`);
|
|
65
|
+
}
|
|
66
|
+
if (node.isGate && (node.gateMinimumScore === undefined || node.gateMinimumScore === null)) {
|
|
67
|
+
problems.push(`${node.key} is a gate with no minimum.`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return problems;
|
|
71
|
+
}
|
|
72
|
+
/** A scale is frozen when a published version uses it. A missing scale id is not frozen. */
|
|
73
|
+
export function Frozen(publishedScaleIds, scaleId) {
|
|
74
|
+
if (!scaleId)
|
|
75
|
+
return false;
|
|
76
|
+
for (const id of publishedScaleIds) {
|
|
77
|
+
if (UUIDsEqual(id, scaleId))
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
/** True when `ancestorId` sits on the parent chain of `nodeId`, including a cycle back to itself. */
|
|
83
|
+
function ancestorOf(nodes, ancestorId, nodeId) {
|
|
84
|
+
const byId = new Map(nodes.map(node => [NormalizeUUID(node.id), node]));
|
|
85
|
+
const seen = new Set();
|
|
86
|
+
let current = nodeId;
|
|
87
|
+
while (current) {
|
|
88
|
+
if (UUIDsEqual(current, ancestorId))
|
|
89
|
+
return true;
|
|
90
|
+
const key = NormalizeUUID(current);
|
|
91
|
+
if (seen.has(key))
|
|
92
|
+
return false;
|
|
93
|
+
seen.add(key);
|
|
94
|
+
current = byId.get(key)?.parentId ?? null;
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=authoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authoring.js","sourceRoot":"","sources":["../src/authoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { RubricVersionSnapshot } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Orders strings by Unicode code point. A locale sort would place ä with a
|
|
4
|
+
* on some machines and after z on others, so two publishes of the same rubric
|
|
5
|
+
* would not share a hash.
|
|
6
|
+
*/
|
|
7
|
+
export declare function CompareCodePoints(left: string, right: string): number;
|
|
8
|
+
/** Fixed-precision decimal so 0.1 and 0.1000000 hash the same. */
|
|
9
|
+
export declare function CanonicalNumber(value: number): string;
|
|
10
|
+
/**
|
|
11
|
+
* Major-row properties plus scale levels, for non-advisory nodes only.
|
|
12
|
+
* Equal projections mean identical scores from identical answers. Adding or
|
|
13
|
+
* editing an advisory node does not change it. Wording, thresholds, and bands do not.
|
|
14
|
+
*/
|
|
15
|
+
export declare function ScoringProjection(version: RubricVersionSnapshot): unknown;
|
|
16
|
+
/** Everything, including wording. Nodes sorted by key, properties sorted by the JSON serializer below. */
|
|
17
|
+
export declare function ContentProjection(version: RubricVersionSnapshot): unknown;
|
|
18
|
+
/** Stable JSON: object keys sorted, no undefined. */
|
|
19
|
+
export declare function CanonicalJson(value: unknown): string;
|
|
20
|
+
/** SHA-256 hex of a canonical projection. Available in browsers and Node. */
|
|
21
|
+
export declare function Sha256Hex(text: string): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=canonical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2C,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEjG;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAarE;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAyBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAqBzE;AAED,0GAA0G;AAC1G,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAqDzE;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD;AAaD,6EAA6E;AAC7E,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7D"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orders strings by Unicode code point. A locale sort would place ä with a
|
|
3
|
+
* on some machines and after z on others, so two publishes of the same rubric
|
|
4
|
+
* would not share a hash.
|
|
5
|
+
*/
|
|
6
|
+
export function CompareCodePoints(left, right) {
|
|
7
|
+
let leftIndex = 0;
|
|
8
|
+
let rightIndex = 0;
|
|
9
|
+
while (leftIndex < left.length && rightIndex < right.length) {
|
|
10
|
+
const leftPoint = left.codePointAt(leftIndex) ?? 0;
|
|
11
|
+
const rightPoint = right.codePointAt(rightIndex) ?? 0;
|
|
12
|
+
if (leftPoint !== rightPoint)
|
|
13
|
+
return leftPoint - rightPoint;
|
|
14
|
+
leftIndex += leftPoint > 0xffff ? 2 : 1;
|
|
15
|
+
rightIndex += rightPoint > 0xffff ? 2 : 1;
|
|
16
|
+
}
|
|
17
|
+
if (leftIndex < left.length)
|
|
18
|
+
return 1;
|
|
19
|
+
if (rightIndex < right.length)
|
|
20
|
+
return -1;
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
/** Fixed-precision decimal so 0.1 and 0.1000000 hash the same. */
|
|
24
|
+
export function CanonicalNumber(value) {
|
|
25
|
+
return value.toFixed(6);
|
|
26
|
+
}
|
|
27
|
+
function parentKey(version, node) {
|
|
28
|
+
if (!node.parentId)
|
|
29
|
+
return null;
|
|
30
|
+
return version.nodes.find(item => item.id === node.parentId)?.key ?? null;
|
|
31
|
+
}
|
|
32
|
+
function scaleSignature(scale) {
|
|
33
|
+
if (!scale)
|
|
34
|
+
return null;
|
|
35
|
+
return {
|
|
36
|
+
higherIsBetter: scale.higherIsBetter,
|
|
37
|
+
maxValue: scale.maxValue ?? null,
|
|
38
|
+
minValue: scale.minValue ?? null,
|
|
39
|
+
scaleType: scale.scaleType,
|
|
40
|
+
step: scale.step ?? null,
|
|
41
|
+
levels: [...scale.levels]
|
|
42
|
+
.sort((a, b) => a.sequence - b.sequence || a.normalizedValue - b.normalizedValue)
|
|
43
|
+
.map(level => ({
|
|
44
|
+
id: level.id,
|
|
45
|
+
normalizedValue: CanonicalNumber(level.normalizedValue),
|
|
46
|
+
value: CanonicalNumber(level.value),
|
|
47
|
+
})),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Major-row properties plus scale levels, for non-advisory nodes only.
|
|
52
|
+
* Equal projections mean identical scores from identical answers. Adding or
|
|
53
|
+
* editing an advisory node does not change it. Wording, thresholds, and bands do not.
|
|
54
|
+
*/
|
|
55
|
+
export function ScoringProjection(version) {
|
|
56
|
+
const scales = new Map(version.scales.map(scale => [scale.id, scale]));
|
|
57
|
+
const nodes = version.nodes
|
|
58
|
+
.filter(node => !node.isAdvisory)
|
|
59
|
+
.sort((a, b) => CompareCodePoints(a.key, b.key))
|
|
60
|
+
.map(node => ({
|
|
61
|
+
evaluatorConfig: node.evaluatorConfig ?? null,
|
|
62
|
+
gateMinimumScore: node.gateMinimumScore ?? null,
|
|
63
|
+
isGate: node.isGate,
|
|
64
|
+
key: node.key,
|
|
65
|
+
nodeType: node.nodeType,
|
|
66
|
+
notApplicablePolicy: node.notApplicablePolicy ?? null,
|
|
67
|
+
parentKey: parentKey(version, node),
|
|
68
|
+
rollupMethod: node.rollupMethod ?? null,
|
|
69
|
+
scale: scaleSignature(node.scaleId ? scales.get(node.scaleId) : undefined),
|
|
70
|
+
weight: CanonicalNumber(node.weight),
|
|
71
|
+
}));
|
|
72
|
+
return {
|
|
73
|
+
nodes,
|
|
74
|
+
notApplicablePolicy: version.notApplicablePolicy,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** Everything, including wording. Nodes sorted by key, properties sorted by the JSON serializer below. */
|
|
78
|
+
export function ContentProjection(version) {
|
|
79
|
+
const scales = new Map(version.scales.map(scale => [scale.id, scale]));
|
|
80
|
+
return {
|
|
81
|
+
bands: [...version.bands]
|
|
82
|
+
.sort((a, b) => a.sequence - b.sequence || CompareCodePoints(a.label, b.label))
|
|
83
|
+
.map(band => ({
|
|
84
|
+
description: band.description ?? null,
|
|
85
|
+
displayTone: band.displayTone,
|
|
86
|
+
label: band.label,
|
|
87
|
+
maxScore: CanonicalNumber(band.maxScore),
|
|
88
|
+
minScore: CanonicalNumber(band.minScore),
|
|
89
|
+
sequence: band.sequence,
|
|
90
|
+
})),
|
|
91
|
+
instructions: version.instructions ?? null,
|
|
92
|
+
minimumCompleteness: version.minimumCompleteness ?? null,
|
|
93
|
+
nodes: [...version.nodes]
|
|
94
|
+
.sort((a, b) => CompareCodePoints(a.key, b.key))
|
|
95
|
+
.map(node => ({
|
|
96
|
+
anchors: [...(node.anchors ?? [])]
|
|
97
|
+
.map(anchor => {
|
|
98
|
+
const level = node.scaleId
|
|
99
|
+
? scales.get(node.scaleId)?.levels.find(item => item.id === anchor.scaleLevelId)
|
|
100
|
+
: undefined;
|
|
101
|
+
return {
|
|
102
|
+
anchorValue: anchor.anchorValue ?? null,
|
|
103
|
+
descriptor: anchor.descriptor,
|
|
104
|
+
normalizedValue: level ? CanonicalNumber(level.normalizedValue) : null,
|
|
105
|
+
};
|
|
106
|
+
})
|
|
107
|
+
.sort((a, b) => CompareCodePoints(a.normalizedValue ?? '', b.normalizedValue ?? '') || (a.anchorValue ?? 0) - (b.anchorValue ?? 0)),
|
|
108
|
+
description: node.description ?? null,
|
|
109
|
+
evidenceRequired: node.evidenceRequired,
|
|
110
|
+
evaluatorConfig: node.evaluatorConfig ?? null,
|
|
111
|
+
gateMinimumScore: node.gateMinimumScore ?? null,
|
|
112
|
+
guidance: node.guidance ?? null,
|
|
113
|
+
isAdvisory: node.isAdvisory,
|
|
114
|
+
isGate: node.isGate,
|
|
115
|
+
key: node.key,
|
|
116
|
+
name: node.name,
|
|
117
|
+
nodeType: node.nodeType,
|
|
118
|
+
notApplicablePolicy: node.notApplicablePolicy ?? null,
|
|
119
|
+
parentKey: parentKey(version, node),
|
|
120
|
+
rationaleRequired: node.rationaleRequired,
|
|
121
|
+
rollupMethod: node.rollupMethod ?? null,
|
|
122
|
+
scale: scaleSignature(node.scaleId ? scales.get(node.scaleId) : undefined),
|
|
123
|
+
sequence: node.sequence,
|
|
124
|
+
weight: CanonicalNumber(node.weight),
|
|
125
|
+
})),
|
|
126
|
+
notApplicablePolicy: version.notApplicablePolicy,
|
|
127
|
+
passThreshold: version.passThreshold ?? null,
|
|
128
|
+
scoreDisplayMax: CanonicalNumber(version.scoreDisplayMax),
|
|
129
|
+
scoreDisplayMin: CanonicalNumber(version.scoreDisplayMin),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** Stable JSON: object keys sorted, no undefined. */
|
|
133
|
+
export function CanonicalJson(value) {
|
|
134
|
+
return JSON.stringify(sortValue(value));
|
|
135
|
+
}
|
|
136
|
+
function sortValue(value) {
|
|
137
|
+
if (Array.isArray(value))
|
|
138
|
+
return value.map(sortValue);
|
|
139
|
+
if (value && typeof value === 'object') {
|
|
140
|
+
const entries = Object.entries(value)
|
|
141
|
+
.filter(([, item]) => item !== undefined)
|
|
142
|
+
.sort(([a], [b]) => CompareCodePoints(a, b));
|
|
143
|
+
return Object.fromEntries(entries.map(([key, item]) => [key, sortValue(item)]));
|
|
144
|
+
}
|
|
145
|
+
return value;
|
|
146
|
+
}
|
|
147
|
+
/** SHA-256 hex of a canonical projection. Available in browsers and Node. */
|
|
148
|
+
export async function Sha256Hex(text) {
|
|
149
|
+
const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(text));
|
|
150
|
+
return [...new Uint8Array(digest)].map(byte => byte.toString(16).padStart(2, '0')).join('');
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=canonical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** One quote the human scorer typed. Other evidence kinds keep their own Type. */
|
|
2
|
+
export interface QuoteEvidence {
|
|
3
|
+
Type: 'Quote';
|
|
4
|
+
Text: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Evidence stored on a score. A typed list is kept. Plain text becomes one quote.
|
|
8
|
+
* Empty text is null, not a string stuffed into the JSON column.
|
|
9
|
+
*/
|
|
10
|
+
/** True when the value is evidence. Blank text, an empty list, and `'[]'` are not. */
|
|
11
|
+
export declare function EvidenceSatisfied(value: unknown): boolean;
|
|
12
|
+
export declare function EvidenceJson(value: unknown): string | null;
|
|
13
|
+
//# sourceMappingURL=evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,sFAAsF;AACtF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQzD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAe1D"}
|