qlm-measure 0.1.0

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.
Files changed (64) hide show
  1. package/LICENSE +54 -0
  2. package/NOTICE +13 -0
  3. package/README.md +152 -0
  4. package/dist/clients/engine-client.d.ts +51 -0
  5. package/dist/clients/engine-client.d.ts.map +1 -0
  6. package/dist/clients/engine-client.js +59 -0
  7. package/dist/clients/engine-client.js.map +1 -0
  8. package/dist/clients/index.d.ts +5 -0
  9. package/dist/clients/index.d.ts.map +1 -0
  10. package/dist/clients/index.js +3 -0
  11. package/dist/clients/index.js.map +1 -0
  12. package/dist/clients/ontology-client.d.ts +57 -0
  13. package/dist/clients/ontology-client.d.ts.map +1 -0
  14. package/dist/clients/ontology-client.js +47 -0
  15. package/dist/clients/ontology-client.js.map +1 -0
  16. package/dist/emitter/index.d.ts +3 -0
  17. package/dist/emitter/index.d.ts.map +1 -0
  18. package/dist/emitter/index.js +2 -0
  19. package/dist/emitter/index.js.map +1 -0
  20. package/dist/emitter/measurement-emitter.d.ts +33 -0
  21. package/dist/emitter/measurement-emitter.d.ts.map +1 -0
  22. package/dist/emitter/measurement-emitter.js +98 -0
  23. package/dist/emitter/measurement-emitter.js.map +1 -0
  24. package/dist/index.d.ts +36 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +31 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/schema/enums.d.ts +19 -0
  29. package/dist/schema/enums.d.ts.map +1 -0
  30. package/dist/schema/enums.js +24 -0
  31. package/dist/schema/enums.js.map +1 -0
  32. package/dist/schema/evidence-record.d.ts +70 -0
  33. package/dist/schema/evidence-record.d.ts.map +1 -0
  34. package/dist/schema/evidence-record.js +11 -0
  35. package/dist/schema/evidence-record.js.map +1 -0
  36. package/dist/schema/index.d.ts +7 -0
  37. package/dist/schema/index.d.ts.map +1 -0
  38. package/dist/schema/index.js +3 -0
  39. package/dist/schema/index.js.map +1 -0
  40. package/dist/schema/measurement-event.d.ts +35 -0
  41. package/dist/schema/measurement-event.d.ts.map +1 -0
  42. package/dist/schema/measurement-event.js +7 -0
  43. package/dist/schema/measurement-event.js.map +1 -0
  44. package/dist/schema/observation-event.d.ts +58 -0
  45. package/dist/schema/observation-event.d.ts.map +1 -0
  46. package/dist/schema/observation-event.js +12 -0
  47. package/dist/schema/observation-event.js.map +1 -0
  48. package/dist/verifier/hash.d.ts +28 -0
  49. package/dist/verifier/hash.d.ts.map +1 -0
  50. package/dist/verifier/hash.js +75 -0
  51. package/dist/verifier/hash.js.map +1 -0
  52. package/dist/verifier/index.d.ts +5 -0
  53. package/dist/verifier/index.d.ts.map +1 -0
  54. package/dist/verifier/index.js +4 -0
  55. package/dist/verifier/index.js.map +1 -0
  56. package/dist/verifier/replay.d.ts +34 -0
  57. package/dist/verifier/replay.d.ts.map +1 -0
  58. package/dist/verifier/replay.js +51 -0
  59. package/dist/verifier/replay.js.map +1 -0
  60. package/dist/verifier/verify-record.d.ts +48 -0
  61. package/dist/verifier/verify-record.d.ts.map +1 -0
  62. package/dist/verifier/verify-record.js +163 -0
  63. package/dist/verifier/verify-record.js.map +1 -0
  64. package/package.json +63 -0
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Evidence Record Verifier
3
+ *
4
+ * Verifies the bookkeeping integrity of an evidence record WITHOUT
5
+ * containing any estimation mathematics. This distinction is the design:
6
+ * "verify instead of trust."
7
+ *
8
+ * What it checks:
9
+ * - Schema validity (required fields present, correct types)
10
+ * - Strictly monotonic version numbers
11
+ * - Timestamp monotonicity (with configurable tolerance)
12
+ * - Hash-chain integrity (prevHash linkage, entryHash recompute)
13
+ * - Posterior chain consistency (each priorPosterior = previous updatedPosterior)
14
+ * - Compaction-boundary integrity
15
+ * - Enum validity (all enum values are from the public vocabulary)
16
+ *
17
+ * What it MUST NOT do (enforced by test):
18
+ * - Never recompute a posterior
19
+ * - Never contain an update function
20
+ * - Never embed a weight or threshold
21
+ * - Never import from any estimation module
22
+ */
23
+ import type { EvidenceRecord } from "../schema/evidence-record";
24
+ export interface Violation {
25
+ /** Entry version where the violation was found, or 0 for record-level. */
26
+ version: number;
27
+ /** Category of the violation. */
28
+ category: "schema" | "version" | "timestamp" | "hash" | "posterior" | "compaction" | "enum";
29
+ /** Human-readable description. */
30
+ message: string;
31
+ }
32
+ export interface VerificationResult {
33
+ /** Whether the record passed all checks. */
34
+ valid: boolean;
35
+ /** List of violations found. */
36
+ violations: Violation[];
37
+ /** Number of entries checked. */
38
+ entriesChecked: number;
39
+ }
40
+ /**
41
+ * Verify the integrity of an evidence record.
42
+ *
43
+ * @param record The evidence record to verify.
44
+ * @param timestampToleranceMs Maximum allowed backward timestamp drift (default: 1000ms).
45
+ * @returns Verification result with any violations found.
46
+ */
47
+ export declare function verifyRecord(record: EvidenceRecord, timestampToleranceMs?: number): VerificationResult;
48
+ //# sourceMappingURL=verify-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-record.d.ts","sourceRoot":"","sources":["../../src/verifier/verify-record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,2BAA2B,CAAC;AAI/E,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,YAAY,GAAG,MAAM,CAAC;IAC5F,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,KAAK,EAAE,OAAO,CAAC;IACf,gCAAgC;IAChC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;CACxB;AAOD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,cAAc,EACtB,oBAAoB,GAAE,MAAa,GAClC,kBAAkB,CA2IpB"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Evidence Record Verifier
3
+ *
4
+ * Verifies the bookkeeping integrity of an evidence record WITHOUT
5
+ * containing any estimation mathematics. This distinction is the design:
6
+ * "verify instead of trust."
7
+ *
8
+ * What it checks:
9
+ * - Schema validity (required fields present, correct types)
10
+ * - Strictly monotonic version numbers
11
+ * - Timestamp monotonicity (with configurable tolerance)
12
+ * - Hash-chain integrity (prevHash linkage, entryHash recompute)
13
+ * - Posterior chain consistency (each priorPosterior = previous updatedPosterior)
14
+ * - Compaction-boundary integrity
15
+ * - Enum validity (all enum values are from the public vocabulary)
16
+ *
17
+ * What it MUST NOT do (enforced by test):
18
+ * - Never recompute a posterior
19
+ * - Never contain an update function
20
+ * - Never embed a weight or threshold
21
+ * - Never import from any estimation module
22
+ */
23
+ import { hashEntry } from "./hash";
24
+ const VALID_SCAFFOLD_TYPES = ["none", "socratic", "probing", "metacognitive", "scaffolding", "explain", "hint", "demonstrate"];
25
+ const VALID_DEPTH_LEVELS = ["surface", "conceptual", "transfer", "integration"];
26
+ const VALID_EPISTEMIC_MODES = ["experience", "inference", "analogy", "testimony"];
27
+ const VALID_TRIAGE_RESULTS = ["correct", "slip", "misconception", "disengagement", "ambiguous"];
28
+ /**
29
+ * Verify the integrity of an evidence record.
30
+ *
31
+ * @param record The evidence record to verify.
32
+ * @param timestampToleranceMs Maximum allowed backward timestamp drift (default: 1000ms).
33
+ * @returns Verification result with any violations found.
34
+ */
35
+ export function verifyRecord(record, timestampToleranceMs = 1000) {
36
+ const violations = [];
37
+ // Record-level schema checks
38
+ if (!record.studentScopeId || typeof record.studentScopeId !== "string") {
39
+ violations.push({ version: 0, category: "schema", message: "Missing or invalid studentScopeId" });
40
+ }
41
+ if (!Array.isArray(record.entries)) {
42
+ violations.push({ version: 0, category: "schema", message: "entries must be an array" });
43
+ return { valid: false, violations, entriesChecked: 0 };
44
+ }
45
+ // Compaction boundary check
46
+ if (record.compactedBefore) {
47
+ if (typeof record.compactedBefore.version !== "number") {
48
+ violations.push({ version: 0, category: "compaction", message: "compactedBefore.version must be a number" });
49
+ }
50
+ if (typeof record.compactedBefore.summaryHash !== "string" || !record.compactedBefore.summaryHash) {
51
+ violations.push({ version: 0, category: "compaction", message: "compactedBefore.summaryHash must be a non-empty string" });
52
+ }
53
+ // First entry version must be > compaction boundary
54
+ if (record.entries.length > 0 && record.entries[0].version <= record.compactedBefore.version) {
55
+ violations.push({
56
+ version: record.entries[0].version,
57
+ category: "compaction",
58
+ message: `First entry version (${record.entries[0].version}) must be > compaction boundary (${record.compactedBefore.version})`,
59
+ });
60
+ }
61
+ }
62
+ let prevVersion = record.compactedBefore?.version ?? 0;
63
+ let prevTimestamp = "";
64
+ let prevHash = record.compactedBefore?.summaryHash ?? "";
65
+ // Track last updatedPosterior per scope for posterior chain check
66
+ let lastUpdatedPosterior = null;
67
+ for (let i = 0; i < record.entries.length; i++) {
68
+ const entry = record.entries[i];
69
+ const v = entry.version ?? -1;
70
+ // Schema validation
71
+ if (typeof v !== "number" || v < 1) {
72
+ violations.push({ version: v, category: "schema", message: "version must be a positive integer" });
73
+ }
74
+ if (typeof entry.timestamp !== "string" || !entry.timestamp) {
75
+ violations.push({ version: v, category: "schema", message: "timestamp is required" });
76
+ }
77
+ if (entry.event === undefined || entry.event === null) {
78
+ violations.push({ version: v, category: "schema", message: "event is required" });
79
+ }
80
+ if (typeof entry.evidentialWeight !== "number") {
81
+ violations.push({ version: v, category: "schema", message: "evidentialWeight must be a number" });
82
+ }
83
+ if (typeof entry.priorPosterior !== "number") {
84
+ violations.push({ version: v, category: "schema", message: "priorPosterior must be a number" });
85
+ }
86
+ if (typeof entry.updatedPosterior !== "number") {
87
+ violations.push({ version: v, category: "schema", message: "updatedPosterior must be a number" });
88
+ }
89
+ // Strictly monotonic versions
90
+ if (v <= prevVersion) {
91
+ violations.push({
92
+ version: v,
93
+ category: "version",
94
+ message: `Version ${v} is not strictly greater than previous ${prevVersion}`,
95
+ });
96
+ }
97
+ // Timestamp monotonicity (with tolerance)
98
+ if (prevTimestamp && entry.timestamp) {
99
+ const prevMs = new Date(prevTimestamp).getTime();
100
+ const currMs = new Date(entry.timestamp).getTime();
101
+ if (!isNaN(prevMs) && !isNaN(currMs) && currMs < prevMs - timestampToleranceMs) {
102
+ violations.push({
103
+ version: v,
104
+ category: "timestamp",
105
+ message: `Timestamp goes backward: ${entry.timestamp} < ${prevTimestamp} (tolerance: ${timestampToleranceMs}ms)`,
106
+ });
107
+ }
108
+ }
109
+ // Enum validation
110
+ if (entry.scaffoldType && !VALID_SCAFFOLD_TYPES.includes(entry.scaffoldType)) {
111
+ violations.push({ version: v, category: "enum", message: `Invalid scaffoldType: ${entry.scaffoldType}` });
112
+ }
113
+ if (entry.depthLevel && !VALID_DEPTH_LEVELS.includes(entry.depthLevel)) {
114
+ violations.push({ version: v, category: "enum", message: `Invalid depthLevel: ${entry.depthLevel}` });
115
+ }
116
+ if (entry.epistemicMode && !VALID_EPISTEMIC_MODES.includes(entry.epistemicMode)) {
117
+ violations.push({ version: v, category: "enum", message: `Invalid epistemicMode: ${entry.epistemicMode}` });
118
+ }
119
+ if (entry.triageResult && !VALID_TRIAGE_RESULTS.includes(entry.triageResult)) {
120
+ violations.push({ version: v, category: "enum", message: `Invalid triageResult: ${entry.triageResult}` });
121
+ }
122
+ // Hash-chain integrity
123
+ if (entry.prevHash !== prevHash) {
124
+ violations.push({
125
+ version: v,
126
+ category: "hash",
127
+ message: `prevHash mismatch: expected "${prevHash}", got "${entry.prevHash}"`,
128
+ });
129
+ }
130
+ const computedHash = hashEntry(entry);
131
+ if (entry.entryHash !== computedHash) {
132
+ violations.push({
133
+ version: v,
134
+ category: "hash",
135
+ message: `entryHash mismatch: expected "${computedHash}", got "${entry.entryHash}"`,
136
+ });
137
+ }
138
+ // Posterior chain consistency
139
+ // Each entry's priorPosterior should equal the previous entry's updatedPosterior
140
+ if (lastUpdatedPosterior !== null && typeof entry.priorPosterior === "number") {
141
+ const diff = Math.abs(entry.priorPosterior - lastUpdatedPosterior);
142
+ if (diff > 1e-9) {
143
+ violations.push({
144
+ version: v,
145
+ category: "posterior",
146
+ message: `priorPosterior (${entry.priorPosterior}) does not match previous updatedPosterior (${lastUpdatedPosterior})`,
147
+ });
148
+ }
149
+ }
150
+ prevVersion = v;
151
+ prevTimestamp = entry.timestamp;
152
+ prevHash = entry.entryHash;
153
+ if (typeof entry.updatedPosterior === "number") {
154
+ lastUpdatedPosterior = entry.updatedPosterior;
155
+ }
156
+ }
157
+ return {
158
+ valid: violations.length === 0,
159
+ violations,
160
+ entriesChecked: record.entries.length,
161
+ };
162
+ }
163
+ //# sourceMappingURL=verify-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-record.js","sourceRoot":"","sources":["../../src/verifier/verify-record.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "qlm-measure",
3
+ "version": "0.1.0",
4
+ "description": "Open measurement SDK for education AI — evidence events, record verification, and dataset clients",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ },
14
+ "./schema": {
15
+ "import": "./dist/schema/index.js",
16
+ "types": "./dist/schema/index.d.ts"
17
+ },
18
+ "./emitter": {
19
+ "import": "./dist/emitter/index.js",
20
+ "types": "./dist/emitter/index.d.ts"
21
+ },
22
+ "./verifier": {
23
+ "import": "./dist/verifier/index.js",
24
+ "types": "./dist/verifier/index.d.ts"
25
+ },
26
+ "./clients": {
27
+ "import": "./dist/clients/index.js",
28
+ "types": "./dist/clients/index.d.ts"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "LICENSE",
34
+ "NOTICE",
35
+ "README.md"
36
+ ],
37
+ "scripts": {
38
+ "build": "tsc",
39
+ "test": "vitest run",
40
+ "test:watch": "vitest",
41
+ "lint": "tsc --noEmit",
42
+ "prepublishOnly": "npm run build && npm test"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^26.1.1",
46
+ "typescript": "^5.7.0",
47
+ "vitest": "^3.0.0"
48
+ },
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/quantumkumar/qlm-measure"
52
+ },
53
+ "keywords": [
54
+ "education",
55
+ "measurement",
56
+ "evidence",
57
+ "learning-analytics",
58
+ "misconceptions",
59
+ "open-education"
60
+ ],
61
+ "author": "Quantum Learning Machines",
62
+ "homepage": "https://play.quantumlearningmachines.com/developer"
63
+ }