@mneme-ai/core 2.22.0 → 2.22.1-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 (33) 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 +8 -1
  4. package/dist/agent_manifest.js.map +1 -1
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +11 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/physics_lathe/axioms.d.ts +79 -0
  10. package/dist/physics_lathe/axioms.d.ts.map +1 -0
  11. package/dist/physics_lathe/axioms.js +248 -0
  12. package/dist/physics_lathe/axioms.js.map +1 -0
  13. package/dist/physics_lathe/extractor.d.ts +32 -0
  14. package/dist/physics_lathe/extractor.d.ts.map +1 -0
  15. package/dist/physics_lathe/extractor.js +102 -0
  16. package/dist/physics_lathe/extractor.js.map +1 -0
  17. package/dist/physics_lathe/index.d.ts +35 -0
  18. package/dist/physics_lathe/index.d.ts.map +1 -0
  19. package/dist/physics_lathe/index.js +39 -0
  20. package/dist/physics_lathe/index.js.map +1 -0
  21. package/dist/physics_lathe/physics_lathe.test.d.ts +2 -0
  22. package/dist/physics_lathe/physics_lathe.test.d.ts.map +1 -0
  23. package/dist/physics_lathe/physics_lathe.test.js +109 -0
  24. package/dist/physics_lathe/physics_lathe.test.js.map +1 -0
  25. package/dist/physics_lathe/units.d.ts +23 -0
  26. package/dist/physics_lathe/units.d.ts.map +1 -0
  27. package/dist/physics_lathe/units.js +143 -0
  28. package/dist/physics_lathe/units.js.map +1 -0
  29. package/dist/physics_lathe/verifier.d.ts +56 -0
  30. package/dist/physics_lathe/verifier.d.ts.map +1 -0
  31. package/dist/physics_lathe/verifier.js +155 -0
  32. package/dist/physics_lathe/verifier.js.map +1 -0
  33. package/package.json +2 -5
@@ -0,0 +1,35 @@
1
+ /**
2
+ * v2.22.1 — PHYSICS LATHE.
3
+ *
4
+ * Formal physics-axiom verifier for LLM claims. Given free-text
5
+ * containing quantities + units (e.g. "the rocket needs ~50,000 km/s
6
+ * to reach LEO"), the lathe extracts the numbers, normalises them to
7
+ * SI, and checks against:
8
+ * 1. A list of well-known physical values (LEO velocity, escape
9
+ * velocity, ISS altitude, delta-v budgets, etc.)
10
+ * 2. A list of axioms (Tsiolkovsky, Kepler, ideal gas,
11
+ * Stefan-Boltzmann, Newtonian gravity, etc.)
12
+ *
13
+ * Verdict: CONFIRMED | REFUTED | OUT_OF_AXIOM_SET | INSUFFICIENT_DATA
14
+ *
15
+ * No LLM is called. All work is deterministic SAT-style numerics —
16
+ * the verdict is reproducible and auditable.
17
+ *
18
+ * Composes with:
19
+ * - `mneme.truth.check` (general claim verifier; lathe extends
20
+ * for physics)
21
+ * - `mneme.chronostasis.*` (axioms here could become Chronostasis
22
+ * crystallised claims in a future
23
+ * release)
24
+ * - `mneme conduct` (lathe verdict gates verb execution
25
+ * when conduct is asked to do something
26
+ * physics-bounded)
27
+ */
28
+ export { allAxioms, allConstants, allKnownValues, CONSTANTS, KNOWN_VALUES, AXIOMS, type Constant, type Axiom, type KnownValue, type Unit, type SiBase } from "./axioms.js";
29
+ export { parseUnit, unitsEqual, formatUnit, type ParsedUnit } from "./units.js";
30
+ export { extractQuantities, type ExtractedQuantity } from "./extractor.js";
31
+ export { verifyClaim, formatReport, type PhysicsCheckReport, type Verdict, type Hit, type AxiomHit, type KnownValueHit } from "./verifier.js";
32
+ import { type PhysicsCheckReport } from "./verifier.js";
33
+ /** One-shot verifier — extract quantities then check. */
34
+ export declare function physicsCheck(claim: string): PhysicsCheckReport;
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/physics_lathe/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,IAAI,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC3K,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9I,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAErE,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAG9D"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * v2.22.1 — PHYSICS LATHE.
3
+ *
4
+ * Formal physics-axiom verifier for LLM claims. Given free-text
5
+ * containing quantities + units (e.g. "the rocket needs ~50,000 km/s
6
+ * to reach LEO"), the lathe extracts the numbers, normalises them to
7
+ * SI, and checks against:
8
+ * 1. A list of well-known physical values (LEO velocity, escape
9
+ * velocity, ISS altitude, delta-v budgets, etc.)
10
+ * 2. A list of axioms (Tsiolkovsky, Kepler, ideal gas,
11
+ * Stefan-Boltzmann, Newtonian gravity, etc.)
12
+ *
13
+ * Verdict: CONFIRMED | REFUTED | OUT_OF_AXIOM_SET | INSUFFICIENT_DATA
14
+ *
15
+ * No LLM is called. All work is deterministic SAT-style numerics —
16
+ * the verdict is reproducible and auditable.
17
+ *
18
+ * Composes with:
19
+ * - `mneme.truth.check` (general claim verifier; lathe extends
20
+ * for physics)
21
+ * - `mneme.chronostasis.*` (axioms here could become Chronostasis
22
+ * crystallised claims in a future
23
+ * release)
24
+ * - `mneme conduct` (lathe verdict gates verb execution
25
+ * when conduct is asked to do something
26
+ * physics-bounded)
27
+ */
28
+ export { allAxioms, allConstants, allKnownValues, CONSTANTS, KNOWN_VALUES, AXIOMS } from "./axioms.js";
29
+ export { parseUnit, unitsEqual, formatUnit } from "./units.js";
30
+ export { extractQuantities } from "./extractor.js";
31
+ export { verifyClaim, formatReport } from "./verifier.js";
32
+ import { extractQuantities } from "./extractor.js";
33
+ import { verifyClaim } from "./verifier.js";
34
+ /** One-shot verifier — extract quantities then check. */
35
+ export function physicsCheck(claim) {
36
+ const qs = extractQuantities(claim);
37
+ return verifyClaim(claim, qs);
38
+ }
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/physics_lathe/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAsE,MAAM,aAAa,CAAC;AAC3K,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAmB,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAA0B,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAsF,MAAM,eAAe,CAAC;AAE9I,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAA2B,MAAM,eAAe,CAAC;AAErE,yDAAyD;AACzD,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=physics_lathe.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics_lathe.test.d.ts","sourceRoot":"","sources":["../../src/physics_lathe/physics_lathe.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { physicsCheck, formatReport, extractQuantities, parseUnit, unitsEqual, allAxioms, allKnownValues } from "./index.js";
3
+ describe("physics lathe (v2.22.1) — formal LLM-claim verifier", () => {
4
+ // ─── unit parser ────────────────────────────────────────────────
5
+ describe("unit parser", () => {
6
+ it("'km/s' parses to m·s⁻¹ with scale 1000", () => {
7
+ const r = parseUnit("km/s");
8
+ expect(r).not.toBeNull();
9
+ expect(unitsEqual(r.unit, [["m", 1], ["s", -1]])).toBe(true);
10
+ expect(r.scale).toBeCloseTo(1000, 4);
11
+ });
12
+ it("'m/s²' parses correctly", () => {
13
+ const r = parseUnit("m/s^2");
14
+ expect(unitsEqual(r.unit, [["m", 1], ["s", -2]])).toBe(true);
15
+ });
16
+ it("'N/m²' parses to Pa-equivalent (pressure)", () => {
17
+ const r = parseUnit("N/m^2");
18
+ const pa = parseUnit("Pa");
19
+ expect(unitsEqual(r.unit, pa.unit)).toBe(true);
20
+ });
21
+ it("'GPa' parses to Pa with scale 1e9", () => {
22
+ const r = parseUnit("GPa");
23
+ expect(r.scale).toBeCloseTo(1e9, 6);
24
+ });
25
+ it("'kg' is recognised", () => {
26
+ const r = parseUnit("kg");
27
+ expect(unitsEqual(r.unit, [["kg", 1]])).toBe(true);
28
+ expect(r.scale).toBe(1);
29
+ });
30
+ it("garbage tokens return null", () => {
31
+ expect(parseUnit("Xyzzy")).toBeNull();
32
+ });
33
+ });
34
+ // ─── extractor ──────────────────────────────────────────────────
35
+ describe("quantity extractor", () => {
36
+ it("extracts '9.4 km/s' from a delta-v claim", () => {
37
+ const qs = extractQuantities("Delta-v to LEO is roughly 9.4 km/s");
38
+ const hit = qs.find((q) => q.rawUnit === "km/s");
39
+ expect(hit).toBeDefined();
40
+ expect(hit.siValue).toBeCloseTo(9400, 0);
41
+ });
42
+ it("extracts large scientific notation '1.5 × 10^6'", () => {
43
+ const qs = extractQuantities("Mars escape velocity is 5.03 × 10^3 m/s");
44
+ expect(qs.some((q) => Math.abs(q.siValue - 5030) < 1)).toBe(true);
45
+ });
46
+ it("handles thousands commas '50,000 N'", () => {
47
+ const qs = extractQuantities("Engine produces 50,000 N of thrust");
48
+ const hit = qs.find((q) => q.rawUnit === "N");
49
+ expect(hit).toBeDefined();
50
+ expect(hit.siValue).toBeCloseTo(50000, 0);
51
+ });
52
+ it("ignores numbers without units", () => {
53
+ const qs = extractQuantities("Test number 42 has no unit");
54
+ // numbers must be followed by recognised unit
55
+ expect(qs.filter((q) => q.rawUnit).length).toBe(0);
56
+ });
57
+ });
58
+ // ─── verifier ───────────────────────────────────────────────────
59
+ describe("verifier — known values", () => {
60
+ it("CONFIRMS LEO velocity claim ~7.8 km/s", () => {
61
+ const r = physicsCheck("LEO orbital velocity is about 7.66 km/s");
62
+ expect(r.verdict).toBe("CONFIRMED");
63
+ expect(r.hits.some((h) => h.kind === "known-value" && h.passed)).toBe(true);
64
+ });
65
+ it("REFUTES grossly wrong LEO velocity '50 km/s'", () => {
66
+ const r = physicsCheck("To reach LEO orbital velocity you need 50 km/s");
67
+ expect(r.verdict).toBe("REFUTED");
68
+ });
69
+ it("CONFIRMS Earth escape velocity ~11.2 km/s", () => {
70
+ const r = physicsCheck("Earth escape velocity is 11.2 km/s");
71
+ expect(r.verdict).toBe("CONFIRMED");
72
+ });
73
+ it("REFUTES wrong Earth escape velocity '25 km/s'", () => {
74
+ const r = physicsCheck("To escape Earth you need an escape velocity of 25 km/s");
75
+ expect(r.verdict).toBe("REFUTED");
76
+ });
77
+ it("CONFIRMS ISS altitude 400 km", () => {
78
+ const r = physicsCheck("The ISS altitude is approximately 408 km");
79
+ expect(r.verdict).toBe("CONFIRMED");
80
+ });
81
+ it("INSUFFICIENT_DATA on text with no quantities", () => {
82
+ const r = physicsCheck("The rocket goes up");
83
+ expect(r.verdict).toBe("INSUFFICIENT_DATA");
84
+ });
85
+ it("OUT_OF_AXIOM_SET when units recognised but no axiom matches", () => {
86
+ const r = physicsCheck("My weight is 70 kg");
87
+ // bare mass with no context — no known-value matches; no axiom can solve
88
+ expect(["OUT_OF_AXIOM_SET", "INSUFFICIENT_DATA"]).toContain(r.verdict);
89
+ });
90
+ });
91
+ // ─── citations + format ─────────────────────────────────────────
92
+ it("formatReport renders verdict badge + extracted quantities + evaluations", () => {
93
+ const r = physicsCheck("LEO orbital velocity is 7.66 km/s");
94
+ const out = formatReport(r);
95
+ expect(out).toContain("PHYSICS LATHE");
96
+ expect(out).toContain("CONFIRMED");
97
+ expect(out).toContain("km/s");
98
+ });
99
+ it("CONFIRMED report includes deterministic citation(s)", () => {
100
+ const r = physicsCheck("LEO orbital velocity is 7.66 km/s");
101
+ expect(r.citations.length).toBeGreaterThan(0);
102
+ });
103
+ // ─── catalog sanity ─────────────────────────────────────────────
104
+ it("ships at least 10 axioms + 10 known-values + 15 constants", () => {
105
+ expect(allAxioms().length).toBeGreaterThanOrEqual(10);
106
+ expect(allKnownValues().length).toBeGreaterThanOrEqual(10);
107
+ });
108
+ });
109
+ //# sourceMappingURL=physics_lathe.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics_lathe.test.js","sourceRoot":"","sources":["../../src/physics_lathe/physics_lathe.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * v2.22.1 — PHYSICS LATHE · UNITS.
3
+ *
4
+ * Parse a unit string ("km/s", "m·s⁻²", "N/m²", "GPa") into the
5
+ * canonical SI base-vector form, plus a scaling factor so the
6
+ * extractor can normalise everything before comparison.
7
+ *
8
+ * Handles common unit prefixes (k / M / G / m / μ / n / p / etc.)
9
+ * and the conventional rocketry shorthands ("km/s", "g" for
10
+ * acceleration).
11
+ */
12
+ import type { Unit } from "./axioms.js";
13
+ export interface ParsedUnit {
14
+ unit: Unit;
15
+ scale: number;
16
+ }
17
+ /** Parse a unit string of the form `term/term/term · term² ...`. Returns
18
+ * null on tokens we cannot recognise — caller should report
19
+ * OUT_OF_AXIOM_SET. */
20
+ export declare function parseUnit(text: string): ParsedUnit | null;
21
+ export declare function unitsEqual(a: Unit, b: Unit): boolean;
22
+ export declare function formatUnit(u: Unit): string;
23
+ //# sourceMappingURL=units.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"units.d.ts","sourceRoot":"","sources":["../../src/physics_lathe/units.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAU,IAAI,EAAE,MAAM,aAAa,CAAC;AAuFhD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;wBAEwB;AACxB,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CA2BzD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAQpD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAG1C"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * v2.22.1 — PHYSICS LATHE · UNITS.
3
+ *
4
+ * Parse a unit string ("km/s", "m·s⁻²", "N/m²", "GPa") into the
5
+ * canonical SI base-vector form, plus a scaling factor so the
6
+ * extractor can normalise everything before comparison.
7
+ *
8
+ * Handles common unit prefixes (k / M / G / m / μ / n / p / etc.)
9
+ * and the conventional rocketry shorthands ("km/s", "g" for
10
+ * acceleration).
11
+ */
12
+ /** Multiplicative prefix factors. */
13
+ const PREFIXES = {
14
+ Y: 1e24, Z: 1e21, E: 1e18, P: 1e15, T: 1e12, G: 1e9, M: 1e6, k: 1e3,
15
+ h: 1e2, da: 10,
16
+ d: 1e-1, c: 1e-2, m: 1e-3, "μ": 1e-6, u: 1e-6, n: 1e-9, p: 1e-12, f: 1e-15, a: 1e-18,
17
+ };
18
+ /** Recognised base unit symbols + their decomposition. */
19
+ const BASE_UNITS = {
20
+ // strict base
21
+ "m": { unit: [["m", 1]], scale: 1 },
22
+ "g": { unit: [["kg", 1]], scale: 1e-3 }, // gram → kg
23
+ "kg": { unit: [["kg", 1]], scale: 1 },
24
+ "s": { unit: [["s", 1]], scale: 1 },
25
+ "A": { unit: [["A", 1]], scale: 1 },
26
+ "K": { unit: [["K", 1]], scale: 1 },
27
+ "mol": { unit: [["mol", 1]], scale: 1 },
28
+ "cd": { unit: [["cd", 1]], scale: 1 },
29
+ // derived
30
+ "N": { unit: [["kg", 1], ["m", 1], ["s", -2]], scale: 1 },
31
+ "Pa": { unit: [["kg", 1], ["m", -1], ["s", -2]], scale: 1 },
32
+ "J": { unit: [["kg", 1], ["m", 2], ["s", -2]], scale: 1 },
33
+ "W": { unit: [["kg", 1], ["m", 2], ["s", -3]], scale: 1 },
34
+ "C": { unit: [["A", 1], ["s", 1]], scale: 1 },
35
+ "V": { unit: [["kg", 1], ["m", 2], ["s", -3], ["A", -1]], scale: 1 },
36
+ "Hz": { unit: [["s", -1]], scale: 1 },
37
+ // rocketry shorthand
38
+ "bar": { unit: [["kg", 1], ["m", -1], ["s", -2]], scale: 1e5 },
39
+ "atm": { unit: [["kg", 1], ["m", -1], ["s", -2]], scale: 101325 },
40
+ "psi": { unit: [["kg", 1], ["m", -1], ["s", -2]], scale: 6894.76 },
41
+ "eV": { unit: [["kg", 1], ["m", 2], ["s", -2]], scale: 1.602176634e-19 },
42
+ };
43
+ /** Time + length shorthands beyond the strict base. */
44
+ const COMPOUND = {
45
+ "min": { unit: [["s", 1]], scale: 60 },
46
+ "hr": { unit: [["s", 1]], scale: 3600 },
47
+ "h": { unit: [["s", 1]], scale: 3600 },
48
+ "day": { unit: [["s", 1]], scale: 86400 },
49
+ "yr": { unit: [["s", 1]], scale: 365.25 * 86400 },
50
+ "Hz": { unit: [["s", -1]], scale: 1 },
51
+ };
52
+ function multiplyUnits(a, b, expB = 1) {
53
+ const m = new Map();
54
+ for (const [k, v] of a)
55
+ m.set(k, (m.get(k) ?? 0) + v);
56
+ for (const [k, v] of b)
57
+ m.set(k, (m.get(k) ?? 0) + v * expB);
58
+ return Array.from(m.entries()).filter(([, v]) => v !== 0).sort((x, y) => x[0].localeCompare(y[0]));
59
+ }
60
+ /** Strip a prefix from a symbol (e.g. "km" → "m" + factor 1e3). Returns
61
+ * null when no recognised prefix applies. */
62
+ function tryPrefix(token) {
63
+ // Try two-character prefixes first (`da`).
64
+ for (const len of [2, 1]) {
65
+ if (token.length <= len)
66
+ continue;
67
+ const p = token.slice(0, len);
68
+ if (p in PREFIXES) {
69
+ const core = token.slice(len);
70
+ if (core in BASE_UNITS || core in COMPOUND) {
71
+ return { core, scale: PREFIXES[p] };
72
+ }
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+ function lookup(token) {
78
+ // exact match
79
+ if (token in BASE_UNITS)
80
+ return BASE_UNITS[token];
81
+ if (token in COMPOUND)
82
+ return { unit: COMPOUND[token].unit, scale: COMPOUND[token].scale };
83
+ // prefixed
84
+ const p = tryPrefix(token);
85
+ if (!p)
86
+ return null;
87
+ const base = (p.core in BASE_UNITS ? BASE_UNITS[p.core] : COMPOUND[p.core]);
88
+ return { unit: base.unit, scale: base.scale * p.scale };
89
+ }
90
+ /** Parse a unit string of the form `term/term/term · term² ...`. Returns
91
+ * null on tokens we cannot recognise — caller should report
92
+ * OUT_OF_AXIOM_SET. */
93
+ export function parseUnit(text) {
94
+ if (!text || text.trim().length === 0)
95
+ return { unit: [], scale: 1 };
96
+ // Normalise separators.
97
+ let t = text.trim()
98
+ .replace(/·/g, "*")
99
+ .replace(/⁻¹/g, "^-1").replace(/⁻²/g, "^-2").replace(/⁻³/g, "^-3").replace(/⁻⁴/g, "^-4")
100
+ .replace(/²/g, "^2").replace(/³/g, "^3").replace(/⁴/g, "^4")
101
+ .replace(/\s+/g, "");
102
+ let unit = [];
103
+ let scale = 1;
104
+ // Split on "/" first to track division.
105
+ const parts = t.split("/");
106
+ for (let i = 0; i < parts.length; i++) {
107
+ const sign = i === 0 ? 1 : -1;
108
+ for (const factor of parts[i].split("*")) {
109
+ if (!factor)
110
+ continue;
111
+ let exp = 1;
112
+ let token = factor;
113
+ const m = factor.match(/^(.+?)\^?(-?\d+)$/);
114
+ if (m) {
115
+ token = m[1];
116
+ exp = parseInt(m[2], 10);
117
+ }
118
+ const def = lookup(token);
119
+ if (!def)
120
+ return null;
121
+ unit = multiplyUnits(unit, def.unit, sign * exp);
122
+ scale *= def.scale ** (sign * exp);
123
+ }
124
+ }
125
+ return { unit, scale };
126
+ }
127
+ export function unitsEqual(a, b) {
128
+ if (a.length !== b.length)
129
+ return false;
130
+ const sa = [...a].sort();
131
+ const sb = [...b].sort();
132
+ for (let i = 0; i < sa.length; i++) {
133
+ if (sa[i][0] !== sb[i][0] || sa[i][1] !== sb[i][1])
134
+ return false;
135
+ }
136
+ return true;
137
+ }
138
+ export function formatUnit(u) {
139
+ if (u.length === 0)
140
+ return "(dimensionless)";
141
+ return u.map(([s, e]) => e === 1 ? s : `${s}^${e}`).join("·");
142
+ }
143
+ //# sourceMappingURL=units.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/physics_lathe/units.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * v2.22.1 — PHYSICS LATHE · VERIFIER.
3
+ *
4
+ * Take an LLM claim + a set of extracted quantities and decide:
5
+ * - CONFIRMED — claim is consistent with at least one axiom OR
6
+ * matches a known-value within tolerance
7
+ * - REFUTED — claim is inconsistent with an axiom by more than
8
+ * its tolerance
9
+ * - OUT_OF_AXIOM_SET — no axiom or known-value applies; the lathe
10
+ * cannot speak
11
+ * - INSUFFICIENT_DATA — claim mentions quantities but the verifier
12
+ * cannot extract enough to check
13
+ *
14
+ * The verifier is deterministic; no LLM is called.
15
+ */
16
+ import type { ExtractedQuantity } from "./extractor.js";
17
+ export type Verdict = "CONFIRMED" | "REFUTED" | "OUT_OF_AXIOM_SET" | "INSUFFICIENT_DATA";
18
+ export interface KnownValueHit {
19
+ kind: "known-value";
20
+ label: string;
21
+ expected: number;
22
+ observed: number;
23
+ relativeError: number;
24
+ tolerance: number;
25
+ citation: string;
26
+ passed: boolean;
27
+ }
28
+ export interface AxiomHit {
29
+ kind: "axiom";
30
+ axiomId: string;
31
+ axiomName: string;
32
+ formula: string;
33
+ predicted: number;
34
+ observed: number;
35
+ relativeError: number;
36
+ tolerance: number;
37
+ citation: string;
38
+ computation: string;
39
+ passed: boolean;
40
+ }
41
+ export type Hit = KnownValueHit | AxiomHit;
42
+ export interface PhysicsCheckReport {
43
+ v: 1;
44
+ verdict: Verdict;
45
+ /** All quantities the extractor pulled out of the claim. */
46
+ quantities: ExtractedQuantity[];
47
+ /** Per-axiom or per-known-value evaluation results. */
48
+ hits: Hit[];
49
+ /** Plain-English rationale. */
50
+ rationale: string;
51
+ /** Citations consumed by the verdict, deduplicated. */
52
+ citations: string[];
53
+ }
54
+ export declare function verifyClaim(claim: string, qs: ExtractedQuantity[]): PhysicsCheckReport;
55
+ export declare function formatReport(r: PhysicsCheckReport): string;
56
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../src/physics_lathe/verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAEzF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,GAAG,GAAG,aAAa,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,kBAAkB;IACjC,CAAC,EAAE,CAAC,CAAC;IACL,OAAO,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,uDAAuD;IACvD,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAuED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,EAAE,GAAG,kBAAkB,CAyBtF;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAmC1D"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * v2.22.1 — PHYSICS LATHE · VERIFIER.
3
+ *
4
+ * Take an LLM claim + a set of extracted quantities and decide:
5
+ * - CONFIRMED — claim is consistent with at least one axiom OR
6
+ * matches a known-value within tolerance
7
+ * - REFUTED — claim is inconsistent with an axiom by more than
8
+ * its tolerance
9
+ * - OUT_OF_AXIOM_SET — no axiom or known-value applies; the lathe
10
+ * cannot speak
11
+ * - INSUFFICIENT_DATA — claim mentions quantities but the verifier
12
+ * cannot extract enough to check
13
+ *
14
+ * The verifier is deterministic; no LLM is called.
15
+ */
16
+ import { allAxioms, allKnownValues } from "./axioms.js";
17
+ import { unitsEqual, formatUnit } from "./units.js";
18
+ /** Match an extracted quantity to a known-value entry by units +
19
+ * best-guess label keyword overlap against the FULL claim text. */
20
+ function matchKnownValues(qs, claim) {
21
+ const hits = [];
22
+ const lowerClaim = claim.toLowerCase();
23
+ for (const q of qs) {
24
+ for (const kv of allKnownValues()) {
25
+ if (!unitsEqual(q.siUnit, kv.unit))
26
+ continue;
27
+ const tokens = kv.label.toLowerCase().split(/[\s-]+/).filter((t) => t.length > 2);
28
+ // Match: ≥1 label keyword appears in the surrounding claim text.
29
+ const overlap = tokens.filter((tok) => lowerClaim.includes(tok)).length;
30
+ if (overlap < 1)
31
+ continue;
32
+ const expected = kv.value;
33
+ const observed = q.siValue;
34
+ const relErr = Math.abs(observed - expected) / Math.max(Math.abs(expected), 1e-30);
35
+ hits.push({
36
+ kind: "known-value",
37
+ label: kv.label,
38
+ expected,
39
+ observed,
40
+ relativeError: relErr,
41
+ tolerance: kv.tolerance,
42
+ citation: kv.citation,
43
+ passed: relErr <= kv.tolerance,
44
+ });
45
+ }
46
+ }
47
+ return hits;
48
+ }
49
+ /** Group extracted quantities by guessed symbol → solve axioms when
50
+ * enough variables match. */
51
+ function matchAxioms(qs) {
52
+ const hits = [];
53
+ // Build symbol → value map from extracted quantities.
54
+ const symbols = {};
55
+ for (const q of qs)
56
+ if (q.quantityGuess)
57
+ symbols[q.quantityGuess] = q.siValue;
58
+ for (const axiom of allAxioms()) {
59
+ const known = axiom.variables.filter((v) => v.symbol in symbols);
60
+ if (known.length < 2)
61
+ continue;
62
+ // Try solving the axiom: many axioms have one "unknown" they
63
+ // compute. For our greedy v1: feed every supplied symbol and let
64
+ // the axiom return its predicted scalar.
65
+ const r = axiom.apply(symbols);
66
+ if (!r)
67
+ continue;
68
+ // Compare prediction to: (a) the unknown variable if it was also
69
+ // supplied; (b) any other supplied variable with the same units.
70
+ // For simplicity v1: compare against the LHS variable when present.
71
+ const lhs = axiom.variables[0];
72
+ if (!(lhs.symbol in symbols))
73
+ continue;
74
+ const observed = symbols[lhs.symbol];
75
+ const relErr = Math.abs(r.value - observed) / Math.max(Math.abs(r.value), 1e-30);
76
+ hits.push({
77
+ kind: "axiom",
78
+ axiomId: axiom.id,
79
+ axiomName: axiom.name,
80
+ formula: axiom.formulaText,
81
+ predicted: r.value,
82
+ observed,
83
+ relativeError: relErr,
84
+ tolerance: axiom.tolerance,
85
+ citation: axiom.citation,
86
+ computation: r.computed,
87
+ passed: relErr <= axiom.tolerance,
88
+ });
89
+ }
90
+ return hits;
91
+ }
92
+ export function verifyClaim(claim, qs) {
93
+ if (qs.length === 0) {
94
+ return { v: 1, verdict: "INSUFFICIENT_DATA", quantities: qs, hits: [], rationale: "No numeric quantities with units detected in the claim.", citations: [] };
95
+ }
96
+ const kvHits = matchKnownValues(qs, claim);
97
+ const axiomHits = matchAxioms(qs);
98
+ const hits = [...kvHits, ...axiomHits];
99
+ if (hits.length === 0) {
100
+ return { v: 1, verdict: "OUT_OF_AXIOM_SET", quantities: qs, hits, rationale: `Quantities extracted (${qs.map((q) => q.raw).join(", ")}) but no axiom or known-value applied. The lathe cannot speak to this claim — add a relevant axiom under packages/core/src/physics_lathe/axioms.ts and re-run.`, citations: [] };
101
+ }
102
+ const refuted = hits.filter((h) => !h.passed);
103
+ const confirmed = hits.filter((h) => h.passed);
104
+ const citations = Array.from(new Set(hits.map((h) => h.citation)));
105
+ if (refuted.length > 0 && confirmed.length === 0) {
106
+ return {
107
+ v: 1, verdict: "REFUTED", quantities: qs, hits,
108
+ rationale: `Claim is inconsistent with ${refuted.length} reference(s). Largest mismatch: ${(Math.max(...refuted.map((r) => r.relativeError)) * 100).toFixed(1)}% (tolerance ${(refuted[0].tolerance * 100).toFixed(1)}%).`,
109
+ citations,
110
+ };
111
+ }
112
+ return {
113
+ v: 1, verdict: "CONFIRMED", quantities: qs, hits,
114
+ rationale: `Claim is consistent with ${confirmed.length} reference(s) within tolerance; ${refuted.length} mismatch(es) below the confidence floor.`,
115
+ citations,
116
+ };
117
+ }
118
+ export function formatReport(r) {
119
+ const badge = r.verdict === "CONFIRMED" ? "✓"
120
+ : r.verdict === "REFUTED" ? "✗"
121
+ : r.verdict === "OUT_OF_AXIOM_SET" ? "·"
122
+ : "?";
123
+ const lines = [
124
+ `🔬 PHYSICS LATHE — ${badge} ${r.verdict}`,
125
+ "",
126
+ ` ${r.rationale}`,
127
+ "",
128
+ ];
129
+ if (r.quantities.length > 0) {
130
+ lines.push(" Extracted quantities:");
131
+ for (const q of r.quantities) {
132
+ lines.push(` - ${q.raw} → ${q.siValue.toExponential(3)} ${formatUnit(q.siUnit)}${q.quantityGuess ? ` (guess: ${q.quantityGuess})` : ""}`);
133
+ }
134
+ lines.push("");
135
+ }
136
+ if (r.hits.length > 0) {
137
+ lines.push(" Evaluations:");
138
+ for (const h of r.hits) {
139
+ const tag = h.passed ? "✓" : "✗";
140
+ if (h.kind === "known-value") {
141
+ lines.push(` ${tag} known-value: ${h.label}`);
142
+ lines.push(` observed ${h.observed.toExponential(3)} vs expected ${h.expected.toExponential(3)} (rel err ${(h.relativeError * 100).toFixed(1)}% / tol ${(h.tolerance * 100).toFixed(1)}%)`);
143
+ lines.push(` citation: ${h.citation}`);
144
+ }
145
+ else {
146
+ lines.push(` ${tag} axiom: ${h.axiomName} — ${h.formula}`);
147
+ lines.push(` computation: ${h.computation}`);
148
+ lines.push(` observed ${h.observed.toExponential(3)} vs predicted ${h.predicted.toExponential(3)} (rel err ${(h.relativeError * 100).toFixed(1)}% / tol ${(h.tolerance * 100).toFixed(1)}%)`);
149
+ lines.push(` citation: ${h.citation}`);
150
+ }
151
+ }
152
+ }
153
+ return lines.join("\n");
154
+ }
155
+ //# sourceMappingURL=verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/physics_lathe/verifier.ts"],"names":[],"mappings":"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"}