@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
package/dist/evidence.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence stored on a score. A typed list is kept. Plain text becomes one quote.
|
|
3
|
+
* Empty text is null, not a string stuffed into the JSON column.
|
|
4
|
+
*/
|
|
5
|
+
/** True when the value is evidence. Blank text, an empty list, and `'[]'` are not. */
|
|
6
|
+
export function EvidenceSatisfied(value) {
|
|
7
|
+
if (value == null)
|
|
8
|
+
return false;
|
|
9
|
+
if (Array.isArray(value))
|
|
10
|
+
return value.length > 0;
|
|
11
|
+
if (typeof value === 'string') {
|
|
12
|
+
const text = value.trim();
|
|
13
|
+
return text.length > 0 && text !== '[]';
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
export function EvidenceJson(value) {
|
|
18
|
+
if (value == null)
|
|
19
|
+
return null;
|
|
20
|
+
if (Array.isArray(value))
|
|
21
|
+
return value.length === 0 ? null : JSON.stringify(value);
|
|
22
|
+
const text = String(value).trim();
|
|
23
|
+
if (!text)
|
|
24
|
+
return null;
|
|
25
|
+
if (text.startsWith('[')) {
|
|
26
|
+
try {
|
|
27
|
+
const parsed = JSON.parse(text);
|
|
28
|
+
if (Array.isArray(parsed))
|
|
29
|
+
return parsed.length === 0 ? null : JSON.stringify(parsed);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// The scorer typed a sentence that happens to start with a bracket.
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const quote = { Type: 'Quote', Text: text };
|
|
36
|
+
return JSON.stringify([quote]);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,sFAAsF;AACtF,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC5C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACvC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;YAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1F,CAAC;QAAC,MAAM,CAAC;YACL,oEAAoE;QACxE,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACnC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { RUBRIC_CACHE_ENTITIES, RubricEngineBase } from './RubricEngineBase.js';
|
|
2
|
+
export type { AgentRubricRecord, CachedPublishedVersion, RubricCacheSnapshot, RubricCategoryRecord, RubricRecord, RubricScaleLevelRecord, RubricScaleRecord, RubricVersionRecord, } from './RubricEngineBase.js';
|
|
3
|
+
export { BandFor, DraftProblems, Frozen, WeightShares } from './authoring.js';
|
|
4
|
+
export { EvidenceJson, EvidenceSatisfied, type QuoteEvidence } from './evidence.js';
|
|
5
|
+
export { RubricScoring, RubricValidationError, SCORING_ENGINE_VERSION } from './RubricScoring.js';
|
|
6
|
+
export { HighestNonDraftVersion, RubricVersionDiff } from './RubricVersionDiff.js';
|
|
7
|
+
export type { VersionNumberRow } from './RubricVersionDiff.js';
|
|
8
|
+
export { DriftDeltas, DriftSeries, KeepSample, PeriodMeans, RubricIdFromVersion, SampleBucket, type DriftEvaluationRow, type DriftRunRow, type DriftScoreRow, } from './sampling.js';
|
|
9
|
+
export { CanonicalJson, ContentProjection, ScoringProjection, Sha256Hex } from './canonical.js';
|
|
10
|
+
export { NodeSnapshotFromRecord, SnapshotFromRows, type SnapshotRows } from './snapshot.js';
|
|
11
|
+
export type { NotApplicablePolicy, RollupMethod, RubricAnswer, RubricBandSnapshot, RubricLevelAnchorSnapshot, RubricNodeSnapshot, RubricNodeType, RubricOutcome, RubricScaleLevelSnapshot, RubricScaleSnapshot, RubricScaleType, RubricScoreInput, RubricScoreResult, RubricVersionSnapshot, ScoredNode, VersionBump, VersionChange, VersionDiffResult, } from './types.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAChF,YAAY,EACR,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACnF,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EACH,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EACjD,mBAAmB,EAAE,YAAY,EACjC,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,GAChE,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5F,YAAY,EACR,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,UAAU,EACV,WAAW,EACX,aAAa,EACb,iBAAiB,GACpB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { RUBRIC_CACHE_ENTITIES, RubricEngineBase } from './RubricEngineBase.js';
|
|
2
|
+
export { BandFor, DraftProblems, Frozen, WeightShares } from './authoring.js';
|
|
3
|
+
export { EvidenceJson, EvidenceSatisfied } from './evidence.js';
|
|
4
|
+
export { RubricScoring, RubricValidationError, SCORING_ENGINE_VERSION } from './RubricScoring.js';
|
|
5
|
+
export { HighestNonDraftVersion, RubricVersionDiff } from './RubricVersionDiff.js';
|
|
6
|
+
export { DriftDeltas, DriftSeries, KeepSample, PeriodMeans, RubricIdFromVersion, SampleBucket, } from './sampling.js';
|
|
7
|
+
export { CanonicalJson, ContentProjection, ScoringProjection, Sha256Hex } from './canonical.js';
|
|
8
|
+
export { NodeSnapshotFromRecord, SnapshotFromRows } from './snapshot.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAWhF,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAsB,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEnF,OAAO,EACH,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EACjD,mBAAmB,EAAE,YAAY,GAEpC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAqB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** Stable bucket 0..9999 for a run id. The same id always lands in the same bucket. */
|
|
2
|
+
export declare function SampleBucket(runId: string): number;
|
|
3
|
+
/** True when the run falls inside the link's sample rate. Rate is 0..1. */
|
|
4
|
+
export declare function KeepSample(runId: string, sampleRate: number): boolean;
|
|
5
|
+
export interface DriftScoreRow {
|
|
6
|
+
evaluationId: string;
|
|
7
|
+
criterionId: string;
|
|
8
|
+
/** The criterion's Key. Drift is keyed by this, not by the row id. */
|
|
9
|
+
criterionKey?: string;
|
|
10
|
+
normalizedScore: number;
|
|
11
|
+
}
|
|
12
|
+
export interface DriftEvaluationRow {
|
|
13
|
+
id: string;
|
|
14
|
+
subjectRecordId: string;
|
|
15
|
+
/** The evaluation stores a version id. The rubric id comes from that version. */
|
|
16
|
+
rubricVersionId: string;
|
|
17
|
+
at: string;
|
|
18
|
+
}
|
|
19
|
+
export interface DriftRunRow {
|
|
20
|
+
id: string;
|
|
21
|
+
agentId: string;
|
|
22
|
+
}
|
|
23
|
+
/** Rubric id stored on the version. An unknown version resolves to an empty string. */
|
|
24
|
+
export declare function RubricIdFromVersion(versionId: string, versions: {
|
|
25
|
+
id: string;
|
|
26
|
+
rubricId: string;
|
|
27
|
+
}[]): string;
|
|
28
|
+
/**
|
|
29
|
+
* Joins a score to its evaluation and that evaluation's agent run.
|
|
30
|
+
* The key is agent, rubric, and criterion. A score with no matching run is left out.
|
|
31
|
+
*/
|
|
32
|
+
export declare function DriftSeries(input: {
|
|
33
|
+
scores: DriftScoreRow[];
|
|
34
|
+
evaluations: DriftEvaluationRow[];
|
|
35
|
+
runs: DriftRunRow[];
|
|
36
|
+
versions: {
|
|
37
|
+
id: string;
|
|
38
|
+
rubricId: string;
|
|
39
|
+
}[];
|
|
40
|
+
/** Criterion id to Key. The series key uses Key, so two ids of one criterion stay together. */
|
|
41
|
+
criteria?: {
|
|
42
|
+
id: string;
|
|
43
|
+
key: string;
|
|
44
|
+
}[];
|
|
45
|
+
}): {
|
|
46
|
+
key: string;
|
|
47
|
+
score: number;
|
|
48
|
+
at: string;
|
|
49
|
+
}[];
|
|
50
|
+
/** Mean score of each key whose timestamp falls in [start, end). */
|
|
51
|
+
export declare function PeriodMeans(rows: {
|
|
52
|
+
key: string;
|
|
53
|
+
score: number;
|
|
54
|
+
at: string;
|
|
55
|
+
}[], start: string, end: string): {
|
|
56
|
+
key: string;
|
|
57
|
+
mean: number;
|
|
58
|
+
}[];
|
|
59
|
+
/** Drop of the current period's mean below the previous period. A drop past the threshold alerts. */
|
|
60
|
+
export declare function DriftDeltas(current: {
|
|
61
|
+
key: string;
|
|
62
|
+
mean: number;
|
|
63
|
+
}[], previous: {
|
|
64
|
+
key: string;
|
|
65
|
+
mean: number;
|
|
66
|
+
}[], threshold: number): {
|
|
67
|
+
key: string;
|
|
68
|
+
drop: number;
|
|
69
|
+
alert: boolean;
|
|
70
|
+
}[];
|
|
71
|
+
//# sourceMappingURL=sampling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampling.d.ts","sourceRoot":"","sources":["../src/sampling.ts"],"names":[],"mappings":"AAEA,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED,MAAM,WAAW,aAAa;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,iFAAiF;IACjF,eAAe,EAAE,MAAM,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,CAE3G;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IAC/B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7C,+FAA+F;IAC/F,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5C,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,CAe/C;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAS3I;AAED,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,QAAQ,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,EAAE,CAMnL"}
|
package/dist/sampling.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { NormalizeUUID, UUIDsEqual } from '@memberjunction/global';
|
|
2
|
+
/** Stable bucket 0..9999 for a run id. The same id always lands in the same bucket. */
|
|
3
|
+
export function SampleBucket(runId) {
|
|
4
|
+
let hash = 0;
|
|
5
|
+
for (const char of NormalizeUUID(runId))
|
|
6
|
+
hash = Math.imul(hash, 31) + char.charCodeAt(0);
|
|
7
|
+
return (hash >>> 0) % 10000;
|
|
8
|
+
}
|
|
9
|
+
/** True when the run falls inside the link's sample rate. Rate is 0..1. */
|
|
10
|
+
export function KeepSample(runId, sampleRate) {
|
|
11
|
+
if (sampleRate <= 0)
|
|
12
|
+
return false;
|
|
13
|
+
if (sampleRate >= 1)
|
|
14
|
+
return true;
|
|
15
|
+
return SampleBucket(runId) < sampleRate * 10000;
|
|
16
|
+
}
|
|
17
|
+
/** Rubric id stored on the version. An unknown version resolves to an empty string. */
|
|
18
|
+
export function RubricIdFromVersion(versionId, versions) {
|
|
19
|
+
return versions.find(row => UUIDsEqual(row.id, versionId))?.rubricId ?? '';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Joins a score to its evaluation and that evaluation's agent run.
|
|
23
|
+
* The key is agent, rubric, and criterion. A score with no matching run is left out.
|
|
24
|
+
*/
|
|
25
|
+
export function DriftSeries(input) {
|
|
26
|
+
const evaluations = new Map(input.evaluations.map(row => [row.id, row]));
|
|
27
|
+
const agents = new Map(input.runs.map(row => [row.id, row.agentId]));
|
|
28
|
+
const criterionKeys = new Map((input.criteria ?? []).map(row => [row.id, row.key]));
|
|
29
|
+
const rows = [];
|
|
30
|
+
for (const score of input.scores) {
|
|
31
|
+
const evaluation = evaluations.get(score.evaluationId);
|
|
32
|
+
if (!evaluation || !Number.isFinite(score.normalizedScore))
|
|
33
|
+
continue;
|
|
34
|
+
const agentId = agents.get(evaluation.subjectRecordId);
|
|
35
|
+
const rubricId = RubricIdFromVersion(evaluation.rubricVersionId, input.versions);
|
|
36
|
+
const criterionKey = score.criterionKey || criterionKeys.get(score.criterionId) || score.criterionId;
|
|
37
|
+
if (!agentId || !rubricId || !criterionKey)
|
|
38
|
+
continue;
|
|
39
|
+
rows.push({ key: `${agentId}|${rubricId}|${criterionKey}`, score: score.normalizedScore, at: evaluation.at });
|
|
40
|
+
}
|
|
41
|
+
return rows;
|
|
42
|
+
}
|
|
43
|
+
/** Mean score of each key whose timestamp falls in [start, end). */
|
|
44
|
+
export function PeriodMeans(rows, start, end) {
|
|
45
|
+
const buckets = new Map();
|
|
46
|
+
for (const row of rows) {
|
|
47
|
+
if (row.at < start || row.at >= end)
|
|
48
|
+
continue;
|
|
49
|
+
const list = buckets.get(row.key) ?? [];
|
|
50
|
+
list.push(row.score);
|
|
51
|
+
buckets.set(row.key, list);
|
|
52
|
+
}
|
|
53
|
+
return [...buckets.entries()].map(([key, scores]) => ({ key, mean: scores.reduce((sum, score) => sum + score, 0) / scores.length }));
|
|
54
|
+
}
|
|
55
|
+
/** Drop of the current period's mean below the previous period. A drop past the threshold alerts. */
|
|
56
|
+
export function DriftDeltas(current, previous, threshold) {
|
|
57
|
+
return current.map(row => {
|
|
58
|
+
const prior = previous.find(item => item.key === row.key);
|
|
59
|
+
const drop = prior == null ? 0 : prior.mean - row.mean;
|
|
60
|
+
return { key: row.key, drop, alert: prior != null && drop > threshold };
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=sampling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../src/sampling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEnE,uFAAuF;AACvF,MAAM,UAAU,YAAY,CAAC,KAAa;IACtC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;AAChC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,UAAkB;IACxD,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,UAAU,GAAG,KAAK,CAAC;AACpD,CAAC;AAuBD,uFAAuF;AACvF,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,QAA4C;IAC/F,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAO3B;IACG,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,IAAI,GAAiD,EAAE,CAAC;IAC9D,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC;YAAE,SAAS;QACrE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjF,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC;QACrG,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY;YAAE,SAAS;QACrD,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,IAAI,QAAQ,IAAI,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,eAAe,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IAClH,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,WAAW,CAAC,IAAkD,EAAE,KAAa,EAAE,GAAW;IACtG,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG;YAAE,SAAS;QAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACzI,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,WAAW,CAAC,OAAwC,EAAE,QAAyC,EAAE,SAAiB;IAC9H,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACvD,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,SAAS,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RubricNodeSnapshot, RubricVersionSnapshot } from './types.js';
|
|
2
|
+
/** One version, its criteria, anchors, bands, and scales, as rows the database returned. */
|
|
3
|
+
export interface SnapshotRows {
|
|
4
|
+
version: unknown;
|
|
5
|
+
rubricId: string;
|
|
6
|
+
criteria: unknown[];
|
|
7
|
+
anchors: unknown[];
|
|
8
|
+
bands: unknown[];
|
|
9
|
+
scales: unknown[];
|
|
10
|
+
levels: unknown[];
|
|
11
|
+
}
|
|
12
|
+
/** The one snapshot every scorer uses. EvaluatorConfig JSON is parsed. Anchors are ordered. */
|
|
13
|
+
export declare function SnapshotFromRows(rows: SnapshotRows): RubricVersionSnapshot;
|
|
14
|
+
/** One criterion or group row, including parsed EvaluatorConfig. */
|
|
15
|
+
export declare function NodeSnapshotFromRecord(row: unknown, anchors?: unknown[]): RubricNodeSnapshot;
|
|
16
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAE5E,4FAA4F;AAC5F,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,+FAA+F;AAC/F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,qBAAqB,CAgD1E;AAED,oEAAoE;AACpE,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,OAAO,EAAO,GAAG,kBAAkB,CA0BhG"}
|
package/dist/snapshot.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { CompareCodePoints } from './canonical.js';
|
|
2
|
+
/** The one snapshot every scorer uses. EvaluatorConfig JSON is parsed. Anchors are ordered. */
|
|
3
|
+
export function SnapshotFromRows(rows) {
|
|
4
|
+
const version = rows.version;
|
|
5
|
+
const anchors = [...rows.anchors].sort((left, right) => {
|
|
6
|
+
const sequence = number(field(left, 'Sequence')) - number(field(right, 'Sequence'));
|
|
7
|
+
return sequence !== 0 ? sequence : CompareCodePoints(String(field(left, 'ID') ?? ''), String(field(right, 'ID') ?? ''));
|
|
8
|
+
});
|
|
9
|
+
return {
|
|
10
|
+
id: String(field(version, 'ID') ?? ''),
|
|
11
|
+
rubricId: rows.rubricId,
|
|
12
|
+
majorVersion: numberOrNull(field(version, 'MajorVersion')),
|
|
13
|
+
minorVersion: numberOrNull(field(version, 'MinorVersion')),
|
|
14
|
+
patchVersion: numberOrNull(field(version, 'PatchVersion')),
|
|
15
|
+
notApplicablePolicy: (text(field(version, 'NotApplicablePolicy')) || 'ExcludeAndRedistribute'),
|
|
16
|
+
passThreshold: numberOrNull(field(version, 'PassThreshold')),
|
|
17
|
+
minimumCompleteness: numberOrNull(field(version, 'MinimumCompleteness')),
|
|
18
|
+
instructions: textOrNull(field(version, 'Instructions')),
|
|
19
|
+
scoreDisplayMin: number(field(version, 'ScoreDisplayMin')),
|
|
20
|
+
scoreDisplayMax: number(field(version, 'ScoreDisplayMax') ?? 100),
|
|
21
|
+
nodes: rows.criteria.map(row => NodeSnapshotFromRecord(row, anchors.filter(anchor => String(field(anchor, 'CriterionID')) === String(field(row, 'ID'))))),
|
|
22
|
+
scales: rows.scales.map(scale => ({
|
|
23
|
+
id: String(field(scale, 'ID') ?? ''),
|
|
24
|
+
scaleType: (text(field(scale, 'ScaleType')) || 'Levels'),
|
|
25
|
+
minValue: numberOrNull(field(scale, 'MinValue')),
|
|
26
|
+
maxValue: numberOrNull(field(scale, 'MaxValue')),
|
|
27
|
+
step: numberOrNull(field(scale, 'Step')),
|
|
28
|
+
higherIsBetter: field(scale, 'HigherIsBetter') === true || field(scale, 'HigherIsBetter') === 1,
|
|
29
|
+
levels: rows.levels.filter(level => {
|
|
30
|
+
const scaleId = field(level, 'ScaleID');
|
|
31
|
+
return scaleId == null || scaleId === '' || String(scaleId) === String(field(scale, 'ID'));
|
|
32
|
+
}).map(level => ({
|
|
33
|
+
id: String(field(level, 'ID') ?? ''),
|
|
34
|
+
label: String(field(level, 'Label') ?? ''),
|
|
35
|
+
value: number(field(level, 'Value')),
|
|
36
|
+
normalizedValue: number(field(level, 'NormalizedValue')),
|
|
37
|
+
description: textOrNull(field(level, 'Description')),
|
|
38
|
+
sequence: number(field(level, 'Sequence')),
|
|
39
|
+
})),
|
|
40
|
+
})),
|
|
41
|
+
bands: rows.bands.map(row => ({
|
|
42
|
+
id: String(field(row, 'ID') ?? ''),
|
|
43
|
+
label: String(field(row, 'Label') ?? ''),
|
|
44
|
+
description: textOrNull(field(row, 'Description')),
|
|
45
|
+
minScore: number(field(row, 'MinScore')),
|
|
46
|
+
maxScore: number(field(row, 'MaxScore')),
|
|
47
|
+
displayTone: text(field(row, 'DisplayTone')) || 'Neutral',
|
|
48
|
+
sequence: number(field(row, 'Sequence')),
|
|
49
|
+
})),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** One criterion or group row, including parsed EvaluatorConfig. */
|
|
53
|
+
export function NodeSnapshotFromRecord(row, anchors = []) {
|
|
54
|
+
return {
|
|
55
|
+
id: String(field(row, 'ID') ?? ''),
|
|
56
|
+
key: String(field(row, 'Key') ?? ''),
|
|
57
|
+
parentId: textOrNull(field(row, 'ParentID')),
|
|
58
|
+
name: String(field(row, 'Name') ?? field(row, 'Key') ?? ''),
|
|
59
|
+
description: textOrNull(field(row, 'Description')),
|
|
60
|
+
guidance: textOrNull(field(row, 'Guidance')),
|
|
61
|
+
nodeType: field(row, 'NodeType') === 'Group' ? 'Group' : 'Criterion',
|
|
62
|
+
scaleId: textOrNull(field(row, 'ScaleID')),
|
|
63
|
+
weight: field(row, 'Weight') == null ? 1 : number(field(row, 'Weight')),
|
|
64
|
+
isAdvisory: field(row, 'IsAdvisory') === true || field(row, 'IsAdvisory') === 1,
|
|
65
|
+
isGate: field(row, 'IsGate') === true || field(row, 'IsGate') === 1,
|
|
66
|
+
gateMinimumScore: numberOrNull(field(row, 'GateMinimumScore')),
|
|
67
|
+
notApplicablePolicy: textOrNull(field(row, 'NotApplicablePolicy')),
|
|
68
|
+
rollupMethod: textOrNull(field(row, 'RollupMethod')),
|
|
69
|
+
evidenceRequired: field(row, 'EvidenceRequired') === true || field(row, 'EvidenceRequired') === 1,
|
|
70
|
+
rationaleRequired: field(row, 'RationaleRequired') === true || field(row, 'RationaleRequired') === 1,
|
|
71
|
+
sequence: number(field(row, 'Sequence')),
|
|
72
|
+
evaluatorConfig: parseConfig(field(row, 'EvaluatorConfig')),
|
|
73
|
+
anchors: anchors.map(anchor => ({
|
|
74
|
+
scaleLevelId: textOrNull(field(anchor, 'ScaleLevelID')),
|
|
75
|
+
anchorValue: numberOrNull(field(anchor, 'AnchorValue')),
|
|
76
|
+
descriptor: String(field(anchor, 'Descriptor') ?? ''),
|
|
77
|
+
})),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function field(row, name) {
|
|
81
|
+
const record = row;
|
|
82
|
+
if (record && record[name] === undefined && typeof record.Get === 'function')
|
|
83
|
+
return record.Get(name);
|
|
84
|
+
return record?.[name];
|
|
85
|
+
}
|
|
86
|
+
function parseConfig(value) {
|
|
87
|
+
if (typeof value !== 'string' || value.length === 0)
|
|
88
|
+
return value ?? null;
|
|
89
|
+
try {
|
|
90
|
+
return JSON.parse(value);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
throw new Error(`EvaluatorConfig is not valid JSON. ${error instanceof Error ? error.message : String(error)}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function text(value) {
|
|
97
|
+
return value == null ? '' : String(value);
|
|
98
|
+
}
|
|
99
|
+
function textOrNull(value) {
|
|
100
|
+
if (value == null || value === '')
|
|
101
|
+
return null;
|
|
102
|
+
return String(value);
|
|
103
|
+
}
|
|
104
|
+
function number(value) {
|
|
105
|
+
const parsed = Number(value ?? 0);
|
|
106
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
107
|
+
}
|
|
108
|
+
function numberOrNull(value) {
|
|
109
|
+
if (value == null || value === '')
|
|
110
|
+
return null;
|
|
111
|
+
const parsed = Number(value);
|
|
112
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/** How a not-applicable answer changes the node's weight. Criterion policy wins over the version policy. */
|
|
2
|
+
export type NotApplicablePolicy = 'ExcludeAndRedistribute' | 'CountAsZero' | 'FailEvaluation' | 'NotAllowed';
|
|
3
|
+
/** How a group combines its included, non-advisory children. Null on a group means WeightedMean. */
|
|
4
|
+
export type RollupMethod = 'WeightedMean' | 'Minimum' | 'Maximum';
|
|
5
|
+
export type RubricNodeType = 'Group' | 'Criterion';
|
|
6
|
+
export type RubricScaleType = 'Levels' | 'Numeric';
|
|
7
|
+
/** First match wins. See RubricScoring.Compute. */
|
|
8
|
+
export type RubricOutcome = 'Incomplete' | 'NotApplicableFailure' | 'GateFailed' | 'BelowThreshold' | 'Passed' | 'Scored';
|
|
9
|
+
/** How much a draft differs from the version it was cloned from. Initial is the first publish. */
|
|
10
|
+
export type VersionBump = 'Major' | 'Minor' | 'Patch' | 'Initial';
|
|
11
|
+
export interface RubricScaleLevelSnapshot {
|
|
12
|
+
id: string;
|
|
13
|
+
label: string;
|
|
14
|
+
value: number;
|
|
15
|
+
/** Explicit 0..1 position. A levels answer scores this, not a linear map of value. */
|
|
16
|
+
normalizedValue: number;
|
|
17
|
+
description?: string | null;
|
|
18
|
+
sequence: number;
|
|
19
|
+
}
|
|
20
|
+
export interface RubricScaleSnapshot {
|
|
21
|
+
id: string;
|
|
22
|
+
/** Display name. The author select shows this, not the id. */
|
|
23
|
+
name?: string;
|
|
24
|
+
scaleType: RubricScaleType;
|
|
25
|
+
minValue?: number | null;
|
|
26
|
+
maxValue?: number | null;
|
|
27
|
+
step?: number | null;
|
|
28
|
+
higherIsBetter: boolean;
|
|
29
|
+
levels: RubricScaleLevelSnapshot[];
|
|
30
|
+
}
|
|
31
|
+
export interface RubricLevelAnchorSnapshot {
|
|
32
|
+
scaleLevelId?: string | null;
|
|
33
|
+
anchorValue?: number | null;
|
|
34
|
+
descriptor: string;
|
|
35
|
+
}
|
|
36
|
+
export interface RubricNodeSnapshot {
|
|
37
|
+
id: string;
|
|
38
|
+
/** Stable identity across versions. Diff and hashes match nodes by this, not by id. */
|
|
39
|
+
key: string;
|
|
40
|
+
parentId?: string | null;
|
|
41
|
+
name: string;
|
|
42
|
+
description?: string | null;
|
|
43
|
+
guidance?: string | null;
|
|
44
|
+
nodeType: RubricNodeType;
|
|
45
|
+
scaleId?: string | null;
|
|
46
|
+
weight: number;
|
|
47
|
+
isAdvisory: boolean;
|
|
48
|
+
isGate: boolean;
|
|
49
|
+
gateMinimumScore?: number | null;
|
|
50
|
+
notApplicablePolicy?: NotApplicablePolicy | null;
|
|
51
|
+
rollupMethod?: RollupMethod | null;
|
|
52
|
+
evidenceRequired: boolean;
|
|
53
|
+
rationaleRequired: boolean;
|
|
54
|
+
sequence: number;
|
|
55
|
+
evaluatorConfig?: unknown;
|
|
56
|
+
anchors?: RubricLevelAnchorSnapshot[];
|
|
57
|
+
}
|
|
58
|
+
export interface RubricBandSnapshot {
|
|
59
|
+
id: string;
|
|
60
|
+
label: string;
|
|
61
|
+
description?: string | null;
|
|
62
|
+
minScore: number;
|
|
63
|
+
maxScore: number;
|
|
64
|
+
displayTone: string;
|
|
65
|
+
sequence: number;
|
|
66
|
+
}
|
|
67
|
+
/** One published or draft version, already loaded. Ids are local to this snapshot. */
|
|
68
|
+
export interface RubricVersionSnapshot {
|
|
69
|
+
id: string;
|
|
70
|
+
rubricId: string;
|
|
71
|
+
majorVersion?: number | null;
|
|
72
|
+
minorVersion?: number | null;
|
|
73
|
+
patchVersion?: number | null;
|
|
74
|
+
instructions?: string | null;
|
|
75
|
+
passThreshold?: number | null;
|
|
76
|
+
minimumCompleteness?: number | null;
|
|
77
|
+
notApplicablePolicy: NotApplicablePolicy;
|
|
78
|
+
scoreDisplayMin: number;
|
|
79
|
+
scoreDisplayMax: number;
|
|
80
|
+
nodes: RubricNodeSnapshot[];
|
|
81
|
+
scales: RubricScaleSnapshot[];
|
|
82
|
+
bands: RubricBandSnapshot[];
|
|
83
|
+
}
|
|
84
|
+
/** One leaf answer. Groups are not answered; the scorer writes their rows. */
|
|
85
|
+
export interface RubricAnswer {
|
|
86
|
+
criterionId: string;
|
|
87
|
+
scaleLevelId?: string | null;
|
|
88
|
+
rawValue?: number | null;
|
|
89
|
+
isNotApplicable?: boolean;
|
|
90
|
+
/** 0..1 when the evaluator reported one. Omitted values are left out of the confidence mean. */
|
|
91
|
+
confidence?: number | null;
|
|
92
|
+
/** The evaluator's reason for this leaf. Copied onto the score row. */
|
|
93
|
+
rationale?: string;
|
|
94
|
+
/** Quotes or other evidence the evaluator attached. Copied onto the score row as JSON. */
|
|
95
|
+
evidence?: unknown;
|
|
96
|
+
}
|
|
97
|
+
export interface RubricScoreInput {
|
|
98
|
+
version: RubricVersionSnapshot;
|
|
99
|
+
answers: RubricAnswer[];
|
|
100
|
+
/** Consumer override. Stored as PassThresholdApplied. Null means the version threshold. */
|
|
101
|
+
passThresholdOverride?: number | null;
|
|
102
|
+
}
|
|
103
|
+
export interface ScoredNode {
|
|
104
|
+
id: string;
|
|
105
|
+
key: string;
|
|
106
|
+
/** 0..1, or null when the node is excluded or unanswered. Rounded to 6 places. */
|
|
107
|
+
normalizedScore: number | null;
|
|
108
|
+
/** This node's share of its included siblings. Null when the node is not in the rollup. */
|
|
109
|
+
effectiveWeight: number | null;
|
|
110
|
+
/**
|
|
111
|
+
* normalizedScore times the product of effective weights from this node to the root.
|
|
112
|
+
* Null when any ancestor rolls up by Minimum or Maximum.
|
|
113
|
+
*/
|
|
114
|
+
overallContribution: number | null;
|
|
115
|
+
gateFailed: boolean;
|
|
116
|
+
isNotApplicable: boolean;
|
|
117
|
+
isAdvisory: boolean;
|
|
118
|
+
/** Group rows: scored applicable descendants over applicable descendants. Null on a leaf. */
|
|
119
|
+
completeness?: number | null;
|
|
120
|
+
/** A leaf's reported confidence, or a group's path-weighted mean of those reports. */
|
|
121
|
+
confidence?: number | null;
|
|
122
|
+
}
|
|
123
|
+
export interface RubricScoreResult {
|
|
124
|
+
/** 0..1 WeightedMean of the included top-level nodes, or null when nothing was included. */
|
|
125
|
+
normalizedScore: number | null;
|
|
126
|
+
/**
|
|
127
|
+
* Scored applicable non-advisory leaves divided by applicable non-advisory leaves.
|
|
128
|
+
* 1 when nothing is applicable.
|
|
129
|
+
*/
|
|
130
|
+
completeness: number | null;
|
|
131
|
+
outcome: RubricOutcome;
|
|
132
|
+
/** True only for Passed. Null for Scored, and for Incomplete when there is no threshold and no gate. */
|
|
133
|
+
passed: boolean | null;
|
|
134
|
+
gateFailed: boolean;
|
|
135
|
+
passThresholdApplied: number | null;
|
|
136
|
+
bandId: string | null;
|
|
137
|
+
/** Path-weight mean of leaf confidences that were reported. Path weight is the product of effective weights to the root, not the score. */
|
|
138
|
+
confidence: number | null;
|
|
139
|
+
/** Non-advisory leaves that received a score. */
|
|
140
|
+
scoredCriteriaCount: number;
|
|
141
|
+
/** Non-advisory leaves that count toward completeness. */
|
|
142
|
+
applicableCriteriaCount: number;
|
|
143
|
+
/** Non-advisory leaves on the version. */
|
|
144
|
+
totalCriteriaCount: number;
|
|
145
|
+
nodes: ScoredNode[];
|
|
146
|
+
scoringEngineVersion: '1.0';
|
|
147
|
+
}
|
|
148
|
+
export interface VersionChange {
|
|
149
|
+
bump: 'Major' | 'Minor' | 'Patch';
|
|
150
|
+
/** Node key, band id, scale id, or "version". */
|
|
151
|
+
subject: string;
|
|
152
|
+
property: string;
|
|
153
|
+
/** Previous value. Null when the subject was added. */
|
|
154
|
+
from: unknown;
|
|
155
|
+
/** Next value. Null when the subject was removed. */
|
|
156
|
+
to: unknown;
|
|
157
|
+
}
|
|
158
|
+
export interface VersionDiffResult {
|
|
159
|
+
changes: VersionChange[];
|
|
160
|
+
/** Null when the draft is identical to its base and cannot be published. */
|
|
161
|
+
computedBump: 'Major' | 'Minor' | 'Patch' | null;
|
|
162
|
+
/** max(computed, requested). An author may go higher, never lower. Initial on the first publish. */
|
|
163
|
+
appliedBump: VersionBump | null;
|
|
164
|
+
nextVersion: {
|
|
165
|
+
major: number;
|
|
166
|
+
minor: number;
|
|
167
|
+
patch: number;
|
|
168
|
+
} | null;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,10 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/rubrics-base",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "6.2.0-edge.2",
|
|
5
|
+
"description": "UI-safe rubric scoring and version classification. Pure functions: no database and no Angular.",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"/dist"
|
|
10
|
+
],
|
|
5
11
|
"keywords": [
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
12
|
+
"MemberJunction",
|
|
13
|
+
"rubrics"
|
|
14
|
+
],
|
|
15
|
+
"author": "MemberJunction.com",
|
|
16
|
+
"license": "BUSL-1.1",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "https://github.com/MemberJunction/MJ"
|
|
20
|
+
},
|
|
21
|
+
"peerDependencies": {
|
|
22
|
+
"typescript": ">=5.0.0"
|
|
23
|
+
},
|
|
24
|
+
"peerDependenciesMeta": {
|
|
25
|
+
"typescript": {
|
|
26
|
+
"optional": true
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@memberjunction/core": "6.2.0-edge.2",
|
|
31
|
+
"@memberjunction/global": "6.2.0-edge.2"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"typescript": "^5.9.3",
|
|
35
|
+
"tsc-alias": "^1.8.16",
|
|
36
|
+
"vitest": "^4.0.18"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc && tsc-alias -f",
|
|
40
|
+
"test": "vitest run"
|
|
41
|
+
}
|
|
42
|
+
}
|