@mneme-ai/core 2.22.1-lite → 2.22.2-lite

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 (53) hide show
  1. package/dist/agent_manifest.d.ts +1 -1
  2. package/dist/agent_manifest.d.ts.map +1 -1
  3. package/dist/agent_manifest.js +14 -1
  4. package/dist/agent_manifest.js.map +1 -1
  5. package/dist/challenger_librarian/catalog.d.ts +43 -0
  6. package/dist/challenger_librarian/catalog.d.ts.map +1 -0
  7. package/dist/challenger_librarian/catalog.js +120 -0
  8. package/dist/challenger_librarian/catalog.js.map +1 -0
  9. package/dist/challenger_librarian/challenger_librarian.test.d.ts +2 -0
  10. package/dist/challenger_librarian/challenger_librarian.test.d.ts.map +1 -0
  11. package/dist/challenger_librarian/challenger_librarian.test.js +87 -0
  12. package/dist/challenger_librarian/challenger_librarian.test.js.map +1 -0
  13. package/dist/challenger_librarian/index.d.ts +49 -0
  14. package/dist/challenger_librarian/index.d.ts.map +1 -0
  15. package/dist/challenger_librarian/index.js +182 -0
  16. package/dist/challenger_librarian/index.js.map +1 -0
  17. package/dist/dimensional_oracle/dimensional_oracle.test.d.ts +2 -0
  18. package/dist/dimensional_oracle/dimensional_oracle.test.d.ts.map +1 -0
  19. package/dist/dimensional_oracle/dimensional_oracle.test.js +100 -0
  20. package/dist/dimensional_oracle/dimensional_oracle.test.js.map +1 -0
  21. package/dist/dimensional_oracle/index.d.ts +62 -0
  22. package/dist/dimensional_oracle/index.d.ts.map +1 -0
  23. package/dist/dimensional_oracle/index.js +182 -0
  24. package/dist/dimensional_oracle/index.js.map +1 -0
  25. package/dist/index.d.ts +4 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +29 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/integration_v22_2.test.d.ts +2 -0
  30. package/dist/integration_v22_2.test.d.ts.map +1 -0
  31. package/dist/integration_v22_2.test.js +95 -0
  32. package/dist/integration_v22_2.test.js.map +1 -0
  33. package/dist/mission_recorder/index.d.ts +91 -0
  34. package/dist/mission_recorder/index.d.ts.map +1 -0
  35. package/dist/mission_recorder/index.js +184 -0
  36. package/dist/mission_recorder/index.js.map +1 -0
  37. package/dist/mission_recorder/mission_recorder.test.d.ts +2 -0
  38. package/dist/mission_recorder/mission_recorder.test.d.ts.map +1 -0
  39. package/dist/mission_recorder/mission_recorder.test.js +109 -0
  40. package/dist/mission_recorder/mission_recorder.test.js.map +1 -0
  41. package/dist/overshoot_tracer/index.d.ts +59 -0
  42. package/dist/overshoot_tracer/index.d.ts.map +1 -0
  43. package/dist/overshoot_tracer/index.js +104 -0
  44. package/dist/overshoot_tracer/index.js.map +1 -0
  45. package/dist/overshoot_tracer/overshoot_tracer.test.d.ts +2 -0
  46. package/dist/overshoot_tracer/overshoot_tracer.test.d.ts.map +1 -0
  47. package/dist/overshoot_tracer/overshoot_tracer.test.js +69 -0
  48. package/dist/overshoot_tracer/overshoot_tracer.test.js.map +1 -0
  49. package/package.json +1 -1
  50. package/dist/cosmic/aurelian.bench.d.ts +0 -25
  51. package/dist/cosmic/aurelian.bench.d.ts.map +0 -1
  52. package/dist/cosmic/aurelian.bench.js +0 -127
  53. package/dist/cosmic/aurelian.bench.js.map +0 -1
@@ -0,0 +1,87 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { crossCheck, formatReport, findFailure, FAILURES } from "./index.js";
3
+ describe("challenger librarian (v2.22.2)", () => {
4
+ describe("catalog", () => {
5
+ it("ships ≥ 8 historical failure entries", () => {
6
+ expect(FAILURES.length).toBeGreaterThanOrEqual(8);
7
+ });
8
+ it("every entry has root-cause + avoidance + citation + detector", () => {
9
+ for (const f of FAILURES) {
10
+ expect(f.rootCause.length).toBeGreaterThan(20);
11
+ expect(f.avoid.length).toBeGreaterThan(15);
12
+ expect(f.citation.length).toBeGreaterThan(5);
13
+ expect(["dimensional", "physics-axiom", "keyword", "structural"]).toContain(f.detector);
14
+ }
15
+ });
16
+ it("findFailure resolves known ids", () => {
17
+ expect(findFailure("mars-climate-orbiter")?.name).toContain("Mars");
18
+ expect(findFailure("therac-25")?.name).toContain("Therac");
19
+ expect(findFailure("nope")).toBeNull();
20
+ });
21
+ });
22
+ describe("Mars Climate Orbiter detector (dimensional)", () => {
23
+ it("flags imperial-unit thrust claim with keyword cues", () => {
24
+ const r = crossCheck("Engine thrust = 500 lbf·s applied for orbit insertion.");
25
+ expect(r.matches.some((m) => m.id === "mars-climate-orbiter")).toBe(true);
26
+ });
27
+ it("flags dimensional MISMATCH in plan as Mars-Climate-Orbiter class", () => {
28
+ const r = crossCheck("Thrust = 9.8 N/m^2 needed for descent burn.");
29
+ const mco = r.matches.find((m) => m.id === "mars-climate-orbiter");
30
+ expect(mco).toBeDefined();
31
+ expect(mco.confidence).toBeGreaterThan(0.5);
32
+ });
33
+ });
34
+ describe("Challenger O-ring detector (physics-axiom + keyword)", () => {
35
+ it("fires on cold-launch wording", () => {
36
+ const r = crossCheck("O-ring qualified down to 12 °C; ambient at launch is -2 °C but proceed.");
37
+ expect(r.matches.some((m) => m.id === "challenger-o-ring")).toBe(true);
38
+ });
39
+ });
40
+ describe("Columbia foam-strike detector (keyword)", () => {
41
+ it("fires on 'normalised deviance' wording", () => {
42
+ const r = crossCheck("Foam strike noted but normalised deviance — previous flights had foam, no inspection needed.");
43
+ expect(r.matches.some((m) => m.id === "columbia-foam-strike")).toBe(true);
44
+ });
45
+ });
46
+ describe("Therac-25 detector (structural → keyword)", () => {
47
+ it("fires on race-condition + software-only-safety wording", () => {
48
+ const r = crossCheck("Software-only safety: a race condition in fast operator data-entry could miss the interlock check.");
49
+ expect(r.matches.some((m) => m.id === "therac-25")).toBe(true);
50
+ });
51
+ });
52
+ describe("Ariane 5 detector (keyword)", () => {
53
+ it("fires on legacy-software reuse without re-qualification", () => {
54
+ const r = crossCheck("Reuse Ariane 4 inertial software with 16-bit casting; untested at new range.");
55
+ expect(r.matches.some((m) => m.id === "ariane-5-501")).toBe(true);
56
+ });
57
+ });
58
+ describe("verdict bands", () => {
59
+ it("SAFE when plan has no matches", () => {
60
+ const r = crossCheck("Generic plan: write a markdown file and commit.");
61
+ expect(r.verdict).toBe("SAFE");
62
+ expect(r.matches.length).toBe(0);
63
+ });
64
+ it("BLOCK on high-confidence dimensional MISMATCH", () => {
65
+ const r = crossCheck("Thrust = 9.8 N/m^2 for the descent burn; reuse Ariane 4 16-bit casting.");
66
+ expect(["BLOCK", "WARN"]).toContain(r.verdict);
67
+ });
68
+ it("rationale text always populated", () => {
69
+ const r1 = crossCheck("Generic plan: edit file.");
70
+ expect(r1.rationale.length).toBeGreaterThan(10);
71
+ const r2 = crossCheck("Pure oxygen 16.7 psi pressurised cabin with inward-opening hatch.");
72
+ expect(r2.rationale.length).toBeGreaterThan(10);
73
+ });
74
+ });
75
+ describe("formatter", () => {
76
+ it("SAFE renders ✓ badge", () => {
77
+ const out = formatReport(crossCheck("Plain plan."));
78
+ expect(out).toContain("SAFE");
79
+ });
80
+ it("WARN/BLOCK renders root cause + citation", () => {
81
+ const out = formatReport(crossCheck("Pure oxygen 16.7 psi pressurised cabin with inward-opening hatch."));
82
+ expect(out).toMatch(/WARN|BLOCK|CAUTION/);
83
+ expect(out).toContain("citation:");
84
+ });
85
+ });
86
+ });
87
+ //# sourceMappingURL=challenger_librarian.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenger_librarian.test.js","sourceRoot":"","sources":["../../src/challenger_librarian/challenger_librarian.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * v2.22.2 — CHALLENGER LIBRARIAN.
3
+ *
4
+ * Cross-checks an AI-generated plan / spec / claim against a curated
5
+ * library of historical aerospace + safety-critical software failures.
6
+ * For each registered pattern, the librarian:
7
+ *
8
+ * - Runs the appropriate DETECTOR (keyword / dimensional /
9
+ * physics-axiom / structural)
10
+ * - Returns matches with the historical root cause + avoidance
11
+ * prescription + citation
12
+ *
13
+ * Composes:
14
+ * - dimensional_oracle.dimensionalCheck (for Mars Climate Orbiter)
15
+ * - physics_lathe.physicsCheck (for Challenger O-ring temp,
16
+ * Apollo 1 over-pressure)
17
+ * - keyword + structural rules (simple regex over plan text)
18
+ *
19
+ * No LLM is called. All judgements are deterministic.
20
+ */
21
+ import { FAILURES, listFailures, findFailure, type FailurePattern, type DetectorKind } from "./catalog.js";
22
+ export { FAILURES, listFailures, findFailure, type FailurePattern, type DetectorKind };
23
+ export interface FailureMatch {
24
+ /** Stable id from the catalog. */
25
+ id: string;
26
+ /** Plain-English failure name. */
27
+ name: string;
28
+ /** Why this matched. */
29
+ why: string;
30
+ /** Match strength 0-1 (how certain the librarian is). */
31
+ confidence: number;
32
+ /** Root cause + avoidance. */
33
+ rootCause: string;
34
+ avoid: string;
35
+ citation: string;
36
+ }
37
+ export interface CrossCheckReport {
38
+ v: 1;
39
+ plan: string;
40
+ matches: FailureMatch[];
41
+ /** Aggregate verdict: SAFE if no matches, CAUTION on 1+ low-conf,
42
+ * WARN on ≥1 high-conf, BLOCK on ≥1 max-conf + safety-critical. */
43
+ verdict: "SAFE" | "CAUTION" | "WARN" | "BLOCK";
44
+ /** Plain-English summary. */
45
+ rationale: string;
46
+ }
47
+ export declare function crossCheck(plan: string): CrossCheckReport;
48
+ export declare function formatReport(r: CrossCheckReport): string;
49
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/challenger_librarian/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE3G,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,CAAC;AAEvF,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AA8GD,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB;wEACoE;IACpE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/C,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAuBzD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAoBxD"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * v2.22.2 — CHALLENGER LIBRARIAN.
3
+ *
4
+ * Cross-checks an AI-generated plan / spec / claim against a curated
5
+ * library of historical aerospace + safety-critical software failures.
6
+ * For each registered pattern, the librarian:
7
+ *
8
+ * - Runs the appropriate DETECTOR (keyword / dimensional /
9
+ * physics-axiom / structural)
10
+ * - Returns matches with the historical root cause + avoidance
11
+ * prescription + citation
12
+ *
13
+ * Composes:
14
+ * - dimensional_oracle.dimensionalCheck (for Mars Climate Orbiter)
15
+ * - physics_lathe.physicsCheck (for Challenger O-ring temp,
16
+ * Apollo 1 over-pressure)
17
+ * - keyword + structural rules (simple regex over plan text)
18
+ *
19
+ * No LLM is called. All judgements are deterministic.
20
+ */
21
+ import { dimensionalCheck } from "../dimensional_oracle/index.js";
22
+ import { physicsCheck } from "../physics_lathe/index.js";
23
+ import { FAILURES, listFailures, findFailure } from "./catalog.js";
24
+ export { FAILURES, listFailures, findFailure };
25
+ function keywordMatch(plan, triggers) {
26
+ if (!triggers)
27
+ return { matched: [], score: 0 };
28
+ const lower = plan.toLowerCase();
29
+ const matched = triggers.filter((t) => lower.includes(t.toLowerCase()));
30
+ return { matched, score: triggers.length === 0 ? 0 : matched.length / triggers.length };
31
+ }
32
+ function runDimensional(plan, pattern) {
33
+ // Find any dimensional claim in the plan ("X = N lbf·s" etc.) by
34
+ // splitting on sentence-ending punctuation (period FOLLOWED BY space
35
+ // or end, never inside a decimal number like 9.8).
36
+ const candidates = plan.split(/(?<=[a-zA-Z²³⁻\d])\s*[.;\n]+\s+|[.;\n]+$/).map((s) => s.trim()).filter((s) => /=|is\s/.test(s));
37
+ for (const c of candidates) {
38
+ const r = dimensionalCheck(c);
39
+ if (r.verdict === "MISMATCH") {
40
+ return {
41
+ id: pattern.id,
42
+ name: pattern.name,
43
+ why: `dimensional mismatch: ${r.rationale}`,
44
+ confidence: 0.9,
45
+ rootCause: pattern.rootCause,
46
+ avoid: pattern.avoid,
47
+ citation: pattern.citation,
48
+ };
49
+ }
50
+ }
51
+ // Fallback: keyword-pass
52
+ const { matched } = keywordMatch(plan, pattern.triggers);
53
+ if (matched.length > 0) {
54
+ return {
55
+ id: pattern.id,
56
+ name: pattern.name,
57
+ why: `keyword cues: ${matched.join(", ")}`,
58
+ confidence: 0.4,
59
+ rootCause: pattern.rootCause,
60
+ avoid: pattern.avoid,
61
+ citation: pattern.citation,
62
+ };
63
+ }
64
+ return null;
65
+ }
66
+ function runPhysics(plan, pattern) {
67
+ if (!pattern.physicsProbes)
68
+ return null;
69
+ // For each probe sentence, see if the PLAN contains structurally
70
+ // similar phrasing (keyword overlap + numeric inconsistency).
71
+ // v1: simple substring match on the probe template; if both halves
72
+ // appear in plan, run physicsCheck on the whole thing.
73
+ const lower = plan.toLowerCase();
74
+ let anyMatched = false;
75
+ for (const p of pattern.physicsProbes) {
76
+ const tokens = p.toLowerCase().replace(/\$\{[^}]+\}/g, "").split(/\s+/).filter((t) => t.length > 2);
77
+ const overlap = tokens.filter((t) => lower.includes(t)).length;
78
+ if (overlap >= 2)
79
+ anyMatched = true;
80
+ }
81
+ if (anyMatched) {
82
+ const r = physicsCheck(plan);
83
+ if (r.verdict === "REFUTED") {
84
+ return {
85
+ id: pattern.id,
86
+ name: pattern.name,
87
+ why: `physics-axiom refutation: ${r.rationale}`,
88
+ confidence: 0.9,
89
+ rootCause: pattern.rootCause,
90
+ avoid: pattern.avoid,
91
+ citation: pattern.citation,
92
+ };
93
+ }
94
+ }
95
+ // Fallback keyword
96
+ const { matched } = keywordMatch(plan, pattern.triggers);
97
+ if (matched.length > 0) {
98
+ return {
99
+ id: pattern.id,
100
+ name: pattern.name,
101
+ why: `keyword cues: ${matched.join(", ")}`,
102
+ confidence: 0.5,
103
+ rootCause: pattern.rootCause,
104
+ avoid: pattern.avoid,
105
+ citation: pattern.citation,
106
+ };
107
+ }
108
+ return null;
109
+ }
110
+ function runKeyword(plan, pattern) {
111
+ const { matched, score } = keywordMatch(plan, pattern.triggers);
112
+ if (matched.length === 0)
113
+ return null;
114
+ return {
115
+ id: pattern.id,
116
+ name: pattern.name,
117
+ why: `keyword cues: ${matched.join(", ")}`,
118
+ confidence: Math.min(0.9, 0.4 + score * 0.5),
119
+ rootCause: pattern.rootCause,
120
+ avoid: pattern.avoid,
121
+ citation: pattern.citation,
122
+ };
123
+ }
124
+ function runDetector(plan, pattern) {
125
+ switch (pattern.detector) {
126
+ case "dimensional": return runDimensional(plan, pattern);
127
+ case "physics-axiom": return runPhysics(plan, pattern);
128
+ case "keyword": return runKeyword(plan, pattern);
129
+ case "structural": return runKeyword(plan, pattern); // v1: structural reduces to keyword
130
+ }
131
+ }
132
+ const HIGH_CONF = 0.7;
133
+ const BLOCK_CONF = 0.85;
134
+ export function crossCheck(plan) {
135
+ const matches = [];
136
+ for (const pattern of FAILURES) {
137
+ const m = runDetector(plan, pattern);
138
+ if (m)
139
+ matches.push(m);
140
+ }
141
+ matches.sort((a, b) => b.confidence - a.confidence);
142
+ let verdict = "SAFE";
143
+ let rationale = `No historical failure pattern matched (${FAILURES.length} catalog entries checked).`;
144
+ if (matches.length > 0) {
145
+ const top = matches[0];
146
+ if (top.confidence >= BLOCK_CONF) {
147
+ verdict = "BLOCK";
148
+ rationale = `BLOCK: plan structurally resembles ${top.name} (${(top.confidence * 100).toFixed(0)}% confidence). ${top.why}`;
149
+ }
150
+ else if (top.confidence >= HIGH_CONF) {
151
+ verdict = "WARN";
152
+ rationale = `WARN: plan resembles ${top.name} (${(top.confidence * 100).toFixed(0)}% confidence). Review root cause.`;
153
+ }
154
+ else {
155
+ verdict = "CAUTION";
156
+ rationale = `CAUTION: ${matches.length} weak match(es); top is ${top.name} (${(top.confidence * 100).toFixed(0)}%).`;
157
+ }
158
+ }
159
+ return { v: 1, plan, matches, verdict, rationale };
160
+ }
161
+ export function formatReport(r) {
162
+ const badge = r.verdict === "SAFE" ? "✓" : r.verdict === "BLOCK" ? "🚨" : r.verdict === "WARN" ? "⚠" : "·";
163
+ const lines = [
164
+ `📚 CHALLENGER LIBRARIAN — ${badge} ${r.verdict}`,
165
+ "",
166
+ ` ${r.rationale}`,
167
+ ];
168
+ if (r.matches.length > 0) {
169
+ lines.push("");
170
+ lines.push(" Matches (highest confidence first):");
171
+ for (const m of r.matches) {
172
+ lines.push("");
173
+ lines.push(` ${m.name} confidence=${(m.confidence * 100).toFixed(0)}%`);
174
+ lines.push(` why: ${m.why}`);
175
+ lines.push(` root cause: ${m.rootCause}`);
176
+ lines.push(` avoid: ${m.avoid}`);
177
+ lines.push(` citation: ${m.citation}`);
178
+ }
179
+ }
180
+ return lines.join("\n");
181
+ }
182
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/challenger_librarian/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dimensional_oracle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimensional_oracle.test.d.ts","sourceRoot":"","sources":["../../src/dimensional_oracle/dimensional_oracle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,100 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { dimensionalCheck, formatReport, listDimensions, DIMENSION_CLASSES, QUANTITY_DIMENSION } from "./index.js";
3
+ describe("dimensional oracle (v2.22.2)", () => {
4
+ describe("matches", () => {
5
+ it("MATCH: altitude in km is length", () => {
6
+ const r = dimensionalCheck("altitude = 400 km");
7
+ expect(r.verdict).toBe("MATCH");
8
+ expect(r.expected).toBe("length");
9
+ expect(r.observed).toBe("length");
10
+ });
11
+ it("MATCH: thrust in kN is force", () => {
12
+ const r = dimensionalCheck("thrust = 500 kN");
13
+ expect(r.verdict).toBe("MATCH");
14
+ expect(r.expected).toBe("force");
15
+ });
16
+ it("MATCH: velocity in m/s", () => {
17
+ const r = dimensionalCheck("velocity = 7600 m/s");
18
+ expect(r.verdict).toBe("MATCH");
19
+ expect(r.expected).toBe("velocity");
20
+ });
21
+ it("MATCH: pressure in MPa", () => {
22
+ const r = dimensionalCheck("pressure = 25 MPa");
23
+ expect(r.verdict).toBe("MATCH");
24
+ expect(r.expected).toBe("pressure");
25
+ });
26
+ });
27
+ describe("mismatches — the Mars Climate Orbiter class", () => {
28
+ it("MISMATCH: thrust in N/m² is pressure not force", () => {
29
+ const r = dimensionalCheck("thrust = 9.8 N/m^2");
30
+ expect(r.verdict).toBe("MISMATCH");
31
+ expect(r.expected).toBe("force");
32
+ expect(r.observed).toBe("pressure");
33
+ expect(r.suggestions.length).toBeGreaterThan(0);
34
+ });
35
+ it("MISMATCH: altitude in m/s is velocity not length", () => {
36
+ const r = dimensionalCheck("altitude = 400 m/s");
37
+ expect(r.verdict).toBe("MISMATCH");
38
+ expect(r.expected).toBe("length");
39
+ expect(r.observed).toBe("velocity");
40
+ });
41
+ it("MISMATCH: mass in J is energy not mass", () => {
42
+ const r = dimensionalCheck("mass = 500 J");
43
+ expect(r.verdict).toBe("MISMATCH");
44
+ expect(r.expected).toBe("mass");
45
+ expect(r.observed).toBe("energy");
46
+ });
47
+ it("MISMATCH: power in J is energy not power", () => {
48
+ const r = dimensionalCheck("power output = 1000 J");
49
+ expect(r.verdict).toBe("MISMATCH");
50
+ expect(r.expected).toBe("power");
51
+ expect(r.observed).toBe("energy");
52
+ });
53
+ });
54
+ describe("ambiguous + unknown", () => {
55
+ it("UNKNOWN_QUANTITY: unrecognised name with valid unit", () => {
56
+ const r = dimensionalCheck("flux capacitor = 1.21 GW");
57
+ expect(r.verdict).toBe("UNKNOWN_QUANTITY");
58
+ expect(r.observed).toBe("power");
59
+ });
60
+ it("UNKNOWN_UNIT: garbage unit", () => {
61
+ const r = dimensionalCheck("velocity = 5 flibbergibbets");
62
+ expect(r.verdict).toBe("UNKNOWN_UNIT");
63
+ });
64
+ });
65
+ describe("catalog", () => {
66
+ it("ships ≥ 15 dimension classes", () => {
67
+ expect(DIMENSION_CLASSES.length).toBeGreaterThanOrEqual(15);
68
+ });
69
+ it("every dimension class has shorthands + description", () => {
70
+ for (const d of DIMENSION_CLASSES) {
71
+ expect(d.shorthands.length).toBeGreaterThan(0);
72
+ expect(d.description.length).toBeGreaterThan(5);
73
+ }
74
+ });
75
+ it("every quantity-name → dimension is one of the registered dimensions", () => {
76
+ const valid = new Set(DIMENSION_CLASSES.map((d) => d.name));
77
+ for (const [, dim] of Object.entries(QUANTITY_DIMENSION)) {
78
+ if (dim === "torque")
79
+ continue; // alias for energy SI base
80
+ expect(valid.has(dim)).toBe(true);
81
+ }
82
+ });
83
+ it("listDimensions returns the full catalog", () => {
84
+ expect(listDimensions().length).toBe(DIMENSION_CLASSES.length);
85
+ });
86
+ });
87
+ describe("formatter", () => {
88
+ it("formatReport shows ✓ on MATCH", () => {
89
+ const out = formatReport(dimensionalCheck("altitude = 400 km"));
90
+ expect(out).toContain("MATCH");
91
+ expect(out).toContain("✓");
92
+ });
93
+ it("formatReport shows ✗ + suggestions on MISMATCH", () => {
94
+ const out = formatReport(dimensionalCheck("thrust = 9.8 N/m^2"));
95
+ expect(out).toContain("MISMATCH");
96
+ expect(out).toContain("Suggestions");
97
+ });
98
+ });
99
+ });
100
+ //# sourceMappingURL=dimensional_oracle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimensional_oracle.test.js","sourceRoot":"","sources":["../../src/dimensional_oracle/dimensional_oracle.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * v2.22.2 — DIMENSIONAL ORACLE.
3
+ *
4
+ * Pure unit-algebra check on any LLM claim. Catches the
5
+ * "Mars Climate Orbiter" class of bug: the claim states a quantity
6
+ * is one physical kind (force, energy) but the units it carries are a
7
+ * DIFFERENT kind (pressure, momentum). LLMs do this constantly.
8
+ *
9
+ * "thrust = 9.8 N/m²" → N/m² is pressure, not force → MISMATCH
10
+ * "burn rate = 12 J·s" → J·s is action, not power → MISMATCH
11
+ * "altitude = 400 km" → km is length; altitude IS length → MATCH
12
+ * "torque = 25 J" → J is energy; torque is N·m → AMBIGUOUS
13
+ * (same SI base vector — formally
14
+ * indistinguishable without context)
15
+ *
16
+ * Composes with:
17
+ * - physics_lathe/units.ts (SI parser + base-vector form)
18
+ * - challenger_librarian (Mars Climate Orbiter detector calls
19
+ * this primitive)
20
+ */
21
+ import type { Unit } from "../physics_lathe/axioms.js";
22
+ /** Physical-kind classification. Each entry is the canonical SI base
23
+ * vector for that kind. When a claim's parsed unit matches a
24
+ * classification, we know the dimension. */
25
+ export interface DimensionClass {
26
+ /** Human label. */
27
+ name: string;
28
+ /** Canonical SI base vector. */
29
+ unit: Unit;
30
+ /** Common unit shorthands seen in LLM claims. */
31
+ shorthands: string[];
32
+ /** Plain-English description. */
33
+ description: string;
34
+ }
35
+ export declare const DIMENSION_CLASSES: DimensionClass[];
36
+ /** Quantity-name → expected dimension. Used when a claim explicitly
37
+ * names a physical kind ("thrust", "altitude", "specific impulse"). */
38
+ export declare const QUANTITY_DIMENSION: Record<string, string>;
39
+ export type Verdict = "MATCH" | "MISMATCH" | "AMBIGUOUS" | "UNKNOWN_QUANTITY" | "UNKNOWN_UNIT";
40
+ export interface DimensionalReport {
41
+ v: 1;
42
+ verdict: Verdict;
43
+ /** The quantity name extracted (if any). */
44
+ quantity?: string;
45
+ /** Expected dimension class label (from QUANTITY_DIMENSION). */
46
+ expected?: string;
47
+ /** Observed dimension class label (from parsed unit). */
48
+ observed?: string;
49
+ /** Suggested corrections (for MISMATCH only). */
50
+ suggestions: string[];
51
+ /** Raw inputs for debug. */
52
+ raw: {
53
+ unitText: string;
54
+ siUnit: Unit | null;
55
+ };
56
+ /** Plain-English rationale. */
57
+ rationale: string;
58
+ }
59
+ export declare function dimensionalCheck(claim: string): DimensionalReport;
60
+ export declare function formatReport(r: DimensionalReport): string;
61
+ export declare function listDimensions(): DimensionClass[];
62
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dimensional_oracle/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAEvD;;6CAE6C;AAC7C,MAAM,WAAW,cAAc;IAC7B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,EAAE,IAAI,CAAC;IACX,iDAAiD;IACjD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,iBAAiB,EAAE,cAAc,EAsB7C,CAAC;AAEF;wEACwE;AACxE,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyCrD,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,kBAAkB,GAAG,cAAc,CAAC;AAE/F,MAAM,WAAW,iBAAiB;IAChC,CAAC,EAAE,CAAC,CAAC;IACL,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,4BAA4B;IAC5B,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE,CAAC;IAC/C,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAuBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CA4CjE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAoBzD;AAED,wBAAgB,cAAc,IAAI,cAAc,EAAE,CAA8B"}