universal-physics-tensor 0.7.2 → 0.14.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 (293) hide show
  1. package/README.md +147 -109
  2. package/bin/upt.mjs +508 -0
  3. package/dist/bridges/be23-planckian-confrontation.d.ts +162 -0
  4. package/dist/bridges/be23-planckian-confrontation.d.ts.map +1 -0
  5. package/dist/bridges/be23-planckian-confrontation.js +196 -0
  6. package/dist/bridges/be23-planckian-confrontation.js.map +1 -0
  7. package/dist/bridges/be36-gw170817-confrontation.d.ts +111 -0
  8. package/dist/bridges/be36-gw170817-confrontation.d.ts.map +1 -0
  9. package/dist/bridges/be36-gw170817-confrontation.js +100 -0
  10. package/dist/bridges/be36-gw170817-confrontation.js.map +1 -0
  11. package/dist/bridges/bridge-equations.d.ts +129 -0
  12. package/dist/bridges/bridge-equations.d.ts.map +1 -0
  13. package/dist/bridges/bridge-equations.js +130 -0
  14. package/dist/bridges/bridge-equations.js.map +1 -0
  15. package/dist/bridges/catalog-adapter.d.ts +1 -1
  16. package/dist/bridges/catalog-adapter.js +1 -1
  17. package/dist/bridges/confrontation-coverage.d.ts +67 -0
  18. package/dist/bridges/confrontation-coverage.d.ts.map +1 -0
  19. package/dist/bridges/confrontation-coverage.js +83 -0
  20. package/dist/bridges/confrontation-coverage.js.map +1 -0
  21. package/dist/bridges/equations/_be-helpers.d.ts +2 -1
  22. package/dist/bridges/equations/_be-helpers.d.ts.map +1 -1
  23. package/dist/bridges/equations/be-12-coherence-length.d.ts +1 -1
  24. package/dist/bridges/equations/be-13-einstein-trace.d.ts +2 -2
  25. package/dist/bridges/equations/be-13-einstein-trace.js +1 -1
  26. package/dist/bridges/equations/be-14-ryu-takayanagi.d.ts +2 -2
  27. package/dist/bridges/equations/be-15-emergence.d.ts +19 -5
  28. package/dist/bridges/equations/be-15-emergence.d.ts.map +1 -1
  29. package/dist/bridges/equations/be-15-emergence.js +18 -4
  30. package/dist/bridges/equations/be-15-emergence.js.map +1 -1
  31. package/dist/bridges/equations/be-16-landauer.d.ts +1 -1
  32. package/dist/bridges/equations/be-17-einstein-cartan.d.ts +1 -1
  33. package/dist/bridges/equations/be-18-higgs-mass.d.ts +1 -1
  34. package/dist/bridges/equations/be-19-quantum-bounce.d.ts +1 -1
  35. package/dist/bridges/equations/be-20-vacuum-energy.d.ts +4 -4
  36. package/dist/bridges/equations/be-20-vacuum-energy.d.ts.map +1 -1
  37. package/dist/bridges/equations/be-20-vacuum-energy.js +4 -2
  38. package/dist/bridges/equations/be-20-vacuum-energy.js.map +1 -1
  39. package/dist/bridges/equations/be-22-topological-entanglement.d.ts +1 -1
  40. package/dist/bridges/equations/be-23-syk-planckian.d.ts +1 -1
  41. package/dist/bridges/equations/be-24-foerster-fret.d.ts +1 -1
  42. package/dist/bridges/equations/be-25-iit-phi.d.ts +1 -1
  43. package/dist/bridges/equations/be-25-orch-or.d.ts +13 -1
  44. package/dist/bridges/equations/be-25-orch-or.d.ts.map +1 -1
  45. package/dist/bridges/equations/be-25-orch-or.js +12 -0
  46. package/dist/bridges/equations/be-25-orch-or.js.map +1 -1
  47. package/dist/bridges/equations/be-26-dna-tunneling.d.ts +2 -2
  48. package/dist/bridges/equations/be-26-dna-tunneling.js +1 -1
  49. package/dist/bridges/equations/be-27-effective-temperature.d.ts +1 -1
  50. package/dist/bridges/equations/be-28-onsager-entropy-production.d.ts +1 -1
  51. package/dist/bridges/equations/be-29-jarzynski.d.ts +1 -1
  52. package/dist/bridges/equations/be-30-flm-first-law.d.ts +2 -2
  53. package/dist/bridges/equations/be-31-causal-set-bd.d.ts +1 -1
  54. package/dist/bridges/equations/be-32-quantum-reference-frame.d.ts +1 -1
  55. package/dist/bridges/equations/be-33-hertz-millis.d.ts +1 -1
  56. package/dist/bridges/equations/be-34-kibble-zurek.d.ts +1 -1
  57. package/dist/bridges/equations/be-35-conformal-bootstrap.d.ts +1 -1
  58. package/dist/bridges/equations/be-36-gw-speed-bound.d.ts +12 -5
  59. package/dist/bridges/equations/be-36-gw-speed-bound.d.ts.map +1 -1
  60. package/dist/bridges/equations/be-36-gw-speed-bound.js +11 -4
  61. package/dist/bridges/equations/be-36-gw-speed-bound.js.map +1 -1
  62. package/dist/bridges/equations/be-38-mond.d.ts +1 -1
  63. package/dist/bridges/equations/be-39-asymptotic-safety.d.ts +2 -2
  64. package/dist/bridges/equations/be-40-composite-higgs.d.ts +1 -1
  65. package/dist/bridges/equations/be-41-swampland.d.ts +1 -1
  66. package/dist/bridges/equations/be-43-er-epr.d.ts +1 -1
  67. package/dist/bridges/equations/be-44-soft-hair.d.ts +1 -1
  68. package/dist/bridges/equations/be-45-tcc.d.ts +1 -1
  69. package/dist/bridges/equations/be-46-multiverse-measure.d.ts +1 -1
  70. package/dist/bridges/equations/be-47-bbn-dark-sector.d.ts +1 -1
  71. package/dist/bridges/equations/be-48-grw-localization.d.ts +1 -1
  72. package/dist/bridges/equations/be-49-quantum-darwinism.d.ts +1 -1
  73. package/dist/bridges/equations/be-50-wheeler-feynman.d.ts +1 -1
  74. package/dist/bridges/index.d.ts +10 -7
  75. package/dist/bridges/index.d.ts.map +1 -1
  76. package/dist/bridges/index.js +47 -34
  77. package/dist/bridges/index.js.map +1 -1
  78. package/dist/bridges/membership.d.ts +44 -0
  79. package/dist/bridges/membership.d.ts.map +1 -0
  80. package/dist/bridges/membership.js +59 -0
  81. package/dist/bridges/membership.js.map +1 -0
  82. package/dist/bridges/rejected.d.ts +40 -0
  83. package/dist/bridges/rejected.d.ts.map +1 -0
  84. package/dist/bridges/rejected.js +81 -0
  85. package/dist/bridges/rejected.js.map +1 -0
  86. package/dist/composition/bridge-analysis.d.ts +189 -0
  87. package/dist/composition/bridge-analysis.d.ts.map +1 -0
  88. package/dist/composition/bridge-analysis.js +445 -0
  89. package/dist/composition/bridge-analysis.js.map +1 -0
  90. package/dist/composition/bridge-prediction.d.ts +95 -0
  91. package/dist/composition/bridge-prediction.d.ts.map +1 -0
  92. package/dist/composition/bridge-prediction.js +0 -0
  93. package/dist/composition/bridge-prediction.js.map +1 -0
  94. package/dist/composition/catalog-graph.d.ts +20 -0
  95. package/dist/composition/catalog-graph.d.ts.map +1 -0
  96. package/dist/composition/catalog-graph.js +39 -0
  97. package/dist/composition/catalog-graph.js.map +1 -0
  98. package/dist/composition/compose-surface.d.ts +12 -0
  99. package/dist/composition/compose-surface.d.ts.map +1 -0
  100. package/dist/composition/compose-surface.js +10 -0
  101. package/dist/composition/compose-surface.js.map +1 -0
  102. package/dist/composition/compose-symbolic.d.ts +75 -0
  103. package/dist/composition/compose-symbolic.d.ts.map +1 -0
  104. package/dist/composition/compose-symbolic.js +157 -0
  105. package/dist/composition/compose-symbolic.js.map +1 -0
  106. package/dist/composition/compose.d.ts +110 -0
  107. package/dist/composition/compose.d.ts.map +1 -0
  108. package/dist/composition/compose.js +231 -0
  109. package/dist/composition/compose.js.map +1 -0
  110. package/dist/composition/consistency.d.ts +24 -0
  111. package/dist/composition/consistency.d.ts.map +1 -0
  112. package/dist/composition/consistency.js +26 -0
  113. package/dist/composition/consistency.js.map +1 -0
  114. package/dist/composition/discovery.d.ts +104 -0
  115. package/dist/composition/discovery.d.ts.map +1 -0
  116. package/dist/composition/discovery.js +165 -0
  117. package/dist/composition/discovery.js.map +1 -0
  118. package/dist/composition/edge.d.ts +139 -0
  119. package/dist/composition/edge.d.ts.map +1 -0
  120. package/dist/composition/edge.js +72 -0
  121. package/dist/composition/edge.js.map +1 -0
  122. package/dist/composition/edges/calibration.d.ts +107 -0
  123. package/dist/composition/edges/calibration.d.ts.map +1 -0
  124. package/dist/composition/edges/calibration.js +373 -0
  125. package/dist/composition/edges/calibration.js.map +1 -0
  126. package/dist/composition/edges/catalog-full.d.ts +299 -0
  127. package/dist/composition/edges/catalog-full.d.ts.map +1 -0
  128. package/dist/composition/edges/catalog-full.js +989 -0
  129. package/dist/composition/edges/catalog-full.js.map +1 -0
  130. package/dist/composition/edges/catalog-tranche.d.ts +112 -0
  131. package/dist/composition/edges/catalog-tranche.d.ts.map +1 -0
  132. package/dist/composition/edges/catalog-tranche.js +241 -0
  133. package/dist/composition/edges/catalog-tranche.js.map +1 -0
  134. package/dist/composition/enumerate.d.ts +67 -0
  135. package/dist/composition/enumerate.d.ts.map +1 -0
  136. package/dist/composition/enumerate.js +78 -0
  137. package/dist/composition/enumerate.js.map +1 -0
  138. package/dist/composition/explain.d.ts +102 -0
  139. package/dist/composition/explain.d.ts.map +1 -0
  140. package/dist/composition/explain.js +244 -0
  141. package/dist/composition/explain.js.map +1 -0
  142. package/dist/composition/expr-eval.d.ts +33 -0
  143. package/dist/composition/expr-eval.d.ts.map +1 -0
  144. package/dist/composition/expr-eval.js +95 -0
  145. package/dist/composition/expr-eval.js.map +1 -0
  146. package/dist/composition/expr-simplify.d.ts +60 -0
  147. package/dist/composition/expr-simplify.d.ts.map +1 -0
  148. package/dist/composition/expr-simplify.js +330 -0
  149. package/dist/composition/expr-simplify.js.map +1 -0
  150. package/dist/composition/expr-subst.d.ts +29 -0
  151. package/dist/composition/expr-subst.d.ts.map +1 -0
  152. package/dist/composition/expr-subst.js +60 -0
  153. package/dist/composition/expr-subst.js.map +1 -0
  154. package/dist/composition/identifiability.d.ts +103 -0
  155. package/dist/composition/identifiability.d.ts.map +1 -0
  156. package/dist/composition/identifiability.js +148 -0
  157. package/dist/composition/identifiability.js.map +1 -0
  158. package/dist/composition/index.d.ts +37 -0
  159. package/dist/composition/index.d.ts.map +1 -0
  160. package/dist/composition/index.js +27 -0
  161. package/dist/composition/index.js.map +1 -0
  162. package/dist/composition/quantities.d.ts +297 -0
  163. package/dist/composition/quantities.d.ts.map +1 -0
  164. package/dist/composition/quantities.js +1017 -0
  165. package/dist/composition/quantities.js.map +1 -0
  166. package/dist/composition/quantity.d.ts +59 -0
  167. package/dist/composition/quantity.d.ts.map +1 -0
  168. package/dist/composition/quantity.js +36 -0
  169. package/dist/composition/quantity.js.map +1 -0
  170. package/dist/composition/retrodiction.d.ts +94 -0
  171. package/dist/composition/retrodiction.d.ts.map +1 -0
  172. package/dist/composition/retrodiction.js +171 -0
  173. package/dist/composition/retrodiction.js.map +1 -0
  174. package/dist/composition/symbolic-constants.d.ts +33 -0
  175. package/dist/composition/symbolic-constants.d.ts.map +1 -0
  176. package/dist/composition/symbolic-constants.js +50 -0
  177. package/dist/composition/symbolic-constants.js.map +1 -0
  178. package/dist/composition/uncertainty.d.ts +45 -0
  179. package/dist/composition/uncertainty.d.ts.map +1 -0
  180. package/dist/composition/uncertainty.js +59 -0
  181. package/dist/composition/uncertainty.js.map +1 -0
  182. package/dist/core/axes-registry.d.ts +1 -1
  183. package/dist/core/axes-registry.js +1 -1
  184. package/dist/core/cell.d.ts +0 -8
  185. package/dist/core/cell.d.ts.map +1 -1
  186. package/dist/core/cell.js +1 -1
  187. package/dist/core/cell.js.map +1 -1
  188. package/dist/core/constants.d.ts +15 -1
  189. package/dist/core/constants.d.ts.map +1 -1
  190. package/dist/core/constants.js +15 -1
  191. package/dist/core/constants.js.map +1 -1
  192. package/dist/core/flux-rules.d.ts +10 -13
  193. package/dist/core/flux-rules.d.ts.map +1 -1
  194. package/dist/core/flux-rules.js +19 -10
  195. package/dist/core/flux-rules.js.map +1 -1
  196. package/dist/core/labeled-tensor.d.ts +80 -1
  197. package/dist/core/labeled-tensor.d.ts.map +1 -1
  198. package/dist/core/labeled-tensor.js +263 -17
  199. package/dist/core/labeled-tensor.js.map +1 -1
  200. package/dist/core/universal-index.d.ts +1 -1
  201. package/dist/core/universal-index.js +1 -1
  202. package/dist/dimensional/buckingham.d.ts +103 -0
  203. package/dist/dimensional/buckingham.d.ts.map +1 -0
  204. package/dist/dimensional/buckingham.js +284 -0
  205. package/dist/dimensional/buckingham.js.map +1 -0
  206. package/dist/dimensional/dimension-spec.d.ts +24 -0
  207. package/dist/dimensional/dimension-spec.d.ts.map +1 -0
  208. package/dist/dimensional/dimension-spec.js +110 -0
  209. package/dist/dimensional/dimension-spec.js.map +1 -0
  210. package/dist/dimensional/field-equation-helpers.d.ts +1 -1
  211. package/dist/dimensional/field-equation-helpers.js +1 -1
  212. package/dist/dimensional/friedmann-equation.d.ts +1 -1
  213. package/dist/dimensional/friedmann-equation.js +1 -1
  214. package/dist/dimensional/gauge-field.d.ts +1 -1
  215. package/dist/dimensional/gauge-field.js +1 -1
  216. package/dist/dimensional/klein-gordon-equation.d.ts +8 -5
  217. package/dist/dimensional/klein-gordon-equation.d.ts.map +1 -1
  218. package/dist/dimensional/klein-gordon-equation.js +8 -5
  219. package/dist/dimensional/klein-gordon-equation.js.map +1 -1
  220. package/dist/dimensional/tensor-trace.d.ts +1 -1
  221. package/dist/dimensional/tensor-trace.js +1 -1
  222. package/dist/dimensional/validator.d.ts +13 -3
  223. package/dist/dimensional/validator.d.ts.map +1 -1
  224. package/dist/dimensional/validator.js +129 -42
  225. package/dist/dimensional/validator.js.map +1 -1
  226. package/dist/index.d.ts +32 -2
  227. package/dist/index.d.ts.map +1 -1
  228. package/dist/index.js +63 -2
  229. package/dist/index.js.map +1 -1
  230. package/dist/numerical/be37-covariant-eikonal.d.ts.map +1 -1
  231. package/dist/numerical/be37-covariant-eikonal.js +15 -18
  232. package/dist/numerical/be37-covariant-eikonal.js.map +1 -1
  233. package/dist/numerical/curvature-lowering-helpers.d.ts +7 -13
  234. package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
  235. package/dist/numerical/curvature-lowering-helpers.js +1 -1
  236. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  237. package/dist/numerical/derivative-lowering.d.ts +2 -1
  238. package/dist/numerical/derivative-lowering.d.ts.map +1 -1
  239. package/dist/numerical/formula-dimension.d.ts +40 -0
  240. package/dist/numerical/formula-dimension.d.ts.map +1 -0
  241. package/dist/numerical/formula-dimension.js +199 -0
  242. package/dist/numerical/formula-dimension.js.map +1 -0
  243. package/dist/numerical/formula-mathts.d.ts +27 -0
  244. package/dist/numerical/formula-mathts.d.ts.map +1 -0
  245. package/dist/numerical/formula-mathts.js +98 -0
  246. package/dist/numerical/formula-mathts.js.map +1 -0
  247. package/dist/numerical/formula-registry.d.ts +30 -0
  248. package/dist/numerical/formula-registry.d.ts.map +1 -0
  249. package/dist/numerical/formula-registry.js +88 -0
  250. package/dist/numerical/formula-registry.js.map +1 -0
  251. package/dist/numerical/formula.d.ts +75 -0
  252. package/dist/numerical/formula.d.ts.map +1 -0
  253. package/dist/numerical/formula.js +275 -0
  254. package/dist/numerical/formula.js.map +1 -0
  255. package/dist/numerical/geometrized.d.ts +51 -0
  256. package/dist/numerical/geometrized.d.ts.map +1 -0
  257. package/dist/numerical/geometrized.js +66 -0
  258. package/dist/numerical/geometrized.js.map +1 -0
  259. package/dist/numerical/gl4-integrator.d.ts +8 -6
  260. package/dist/numerical/gl4-integrator.d.ts.map +1 -1
  261. package/dist/numerical/gl4-integrator.js +6 -6
  262. package/dist/numerical/gl4-integrator.js.map +1 -1
  263. package/dist/numerical/klein-gordon.d.ts +145 -0
  264. package/dist/numerical/klein-gordon.d.ts.map +1 -0
  265. package/dist/numerical/klein-gordon.js +145 -0
  266. package/dist/numerical/klein-gordon.js.map +1 -0
  267. package/dist/numerical/kretschmann.d.ts +43 -12
  268. package/dist/numerical/kretschmann.d.ts.map +1 -1
  269. package/dist/numerical/kretschmann.js +116 -29
  270. package/dist/numerical/kretschmann.js.map +1 -1
  271. package/dist/numerical/lowering.d.ts +18 -0
  272. package/dist/numerical/lowering.d.ts.map +1 -1
  273. package/dist/numerical/lowering.js +54 -42
  274. package/dist/numerical/lowering.js.map +1 -1
  275. package/dist/numerical/null-ic.d.ts +1 -1
  276. package/dist/numerical/null-ic.d.ts.map +1 -1
  277. package/dist/numerical/null-ic.js +3 -2
  278. package/dist/numerical/null-ic.js.map +1 -1
  279. package/dist/numerical/painleve-gullstrand-metric.d.ts +18 -6
  280. package/dist/numerical/painleve-gullstrand-metric.d.ts.map +1 -1
  281. package/dist/numerical/painleve-gullstrand-metric.js +31 -16
  282. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  283. package/dist/numerical/perihelion-finder.d.ts +4 -3
  284. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  285. package/dist/numerical/perihelion-finder.js +5 -4
  286. package/dist/numerical/perihelion-finder.js.map +1 -1
  287. package/dist/numerical/types.d.ts +6 -3
  288. package/dist/numerical/types.d.ts.map +1 -1
  289. package/dist/numerical/weyl-lowering.d.ts +4 -4
  290. package/dist/numerical/weyl-lowering.d.ts.map +1 -1
  291. package/dist/numerical/weyl-lowering.js +14 -1
  292. package/dist/numerical/weyl-lowering.js.map +1 -1
  293. package/package.json +21 -4
package/bin/upt.mjs ADDED
@@ -0,0 +1,508 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * upt — a small CLI over the Universal Physics Tensor bridge-inference
4
+ * suite, for people who don't read TypeScript.
5
+ *
6
+ * upt explain <quantity> [name=value | name] ...
7
+ * upt priority
8
+ * upt audit
9
+ * upt help
10
+ *
11
+ * Run from a built checkout (`npm run build`) via `npm run upt -- <cmd>`,
12
+ * or as an installed command (`npx universal-physics-tensor <cmd>`).
13
+ */
14
+ import { fileURLToPath } from 'node:url';
15
+ import { dirname, join } from 'node:path';
16
+
17
+ const here = dirname(fileURLToPath(import.meta.url));
18
+ const dist = (...p) => join(here, '..', 'dist', ...p);
19
+
20
+ let api, analysis, formulaReg, dimSpecMod, prediction, discovery, coverage, simplifyMod;
21
+ try {
22
+ api = await import(dist('index.js'));
23
+ analysis = await import(dist('composition', 'bridge-analysis.js'));
24
+ formulaReg = await import(dist('numerical', 'formula-registry.js'));
25
+ dimSpecMod = await import(dist('dimensional', 'dimension-spec.js'));
26
+ prediction = await import(dist('composition', 'bridge-prediction.js'));
27
+ discovery = await import(dist('composition', 'discovery.js'));
28
+ coverage = await import(dist('bridges', 'confrontation-coverage.js'));
29
+ simplifyMod = await import(dist('composition', 'expr-simplify.js'));
30
+ } catch (err) {
31
+ console.error('Could not load the built package. Run `npm run build` first.');
32
+ console.error(String(err.message || err));
33
+ process.exit(1);
34
+ }
35
+
36
+ const { explainQuantity, CATALOG_GRAPH, M_SUN_KG, composeSymbolic,
37
+ be42Edge, be16Edge, lawSchwarzschildRadius, be42ViaRsEdge, format } = api;
38
+ const { bridgePriority, attemptDerivation, dimensionalFreedom, dimensionallyDetermines, buckinghamPi, linkageMap, proposeLinkCandidates, proposeOrphanConnectors } = { ...analysis, ...api };
39
+ const { getFormulaParser, getFormulaParserKind, getFormulaDimensionChecker } = formulaReg;
40
+ const { parseDimensionSpec } = dimSpecMod;
41
+ const { predictMissingBridges } = prediction;
42
+ const { rankDiscoveries } = discovery;
43
+ const { auditCoverage } = coverage;
44
+ const { simplifyObservable } = simplifyMod;
45
+
46
+ const GRAPH = CATALOG_GRAPH;
47
+
48
+ // ── help ────────────────────────────────────────────────────────────────
49
+ function help() {
50
+ console.log(`upt — Universal Physics Tensor bridge-inference CLI
51
+
52
+ Usage:
53
+ upt explain <quantity> [name=value | name] ...
54
+ Explain how the graph determines a quantity: the identifiability
55
+ verdict, recovered value, derivation chains, and whether the inputs
56
+ are dimensionally sufficient.
57
+ e.g. upt explain hawking-temperature mass=1.989e30
58
+
59
+ upt priority
60
+ Triage the speculative bridges by structural DECIDABILITY against
61
+ established physics (Tiers 1-3). NOT a credibility ranking.
62
+
63
+ upt audit
64
+ Try to derive every built-in bridge equation by dimensions: which
65
+ re-derive as a recognized monomial (with the prefactor recovered),
66
+ which are decoys, which are dimensionally open.
67
+
68
+ upt map
69
+ Map how the equations LINK: connected components (clusters) of the
70
+ catalog graph by shared quantities, the anchored core, the link
71
+ hubs, and the isolated tail.
72
+
73
+ upt candidates
74
+ Propose candidate cross-cluster links (quantities of the same
75
+ dimension in different clusters) for PHYSICIST REVIEW — a
76
+ coincidence-heavy surface, not discovered bridges.
77
+
78
+ upt predict
79
+ Project the catalog onto the (scale × force) regime plane and rank
80
+ the EMPTY regime cells as undiscovered-connection hypotheses
81
+ (triadic closure). Makes the namesake tensor operational. Review
82
+ surface, not discovered bridges.
83
+
84
+ upt discover
85
+ VET the link candidates through the inference suite: hypothesise
86
+ each identification a≡b and test whether it merges disconnected
87
+ physics, unlocks quantities, and stays numerically consistent.
88
+ Ranks promising / inert / contradictory.
89
+
90
+ upt connectors
91
+ Of the 20 ISOLATED bridges, which could connect to the anchored
92
+ core via a same-dimension identification? The structural frontier —
93
+ same-kind connectors are the motivated set for physicist review.
94
+
95
+ upt coverage
96
+ Audit the catalog's empirical grounding — which bridges are
97
+ data-confronted vs graph-computable vs encoded-only vs thin — to
98
+ target the physicist review. Fabricates nothing.
99
+
100
+ upt symbolic [--simplify]
101
+ Compose bridges' SYMBOLIC (AST) forms, not just their numeric
102
+ evaluators (the Observable contract). Shows the CT-1 / CT-1b chains
103
+ composed by substitution, dimensionally validated and evaluable.
104
+ With --simplify, folds the composed AST via MathTS (k_B cancels),
105
+ re-validated dimensionally + numerically.
106
+
107
+ upt eval "<formula>" name=value ...
108
+ Evaluate YOUR OWN scalar formula (safe — arithmetic only). Knows
109
+ pi/tau and sqrt/exp/ln/sin/...; any other name must be supplied.
110
+ e.g. upt eval "hbar*c^3/(8*pi*G*M*k_B)" hbar=1.054571817e-34 \\
111
+ c=299792458 G=6.6743e-11 M=1.989e30 k_B=1.380649e-23
112
+
113
+ upt derive <target:dim> <var:dim> ... [--formula "<expr>"]
114
+ Derive YOUR OWN equation's dimensional form. <dim> is a named
115
+ dimension (length, time, mass, velocity, ...), a constant (hbar, c,
116
+ G, k_B, e), or explicit (L^3.M^-1.T^-2). With --formula, also verify
117
+ it and recover the dimensionless prefactor.
118
+ e.g. upt derive period:time length:length gravity:acceleration \\
119
+ --formula "2*pi*sqrt(length/gravity)"
120
+
121
+ upt help Show this message.
122
+
123
+ Run with no arguments for a short demo.`);
124
+ }
125
+
126
+ // ── explain ─────────────────────────────────────────────────────────────
127
+ function parseKnown(args) {
128
+ const values = {};
129
+ const names = [];
130
+ let hasValue = false;
131
+ for (const a of args) {
132
+ const eq = a.indexOf('=');
133
+ if (eq === -1) { names.push(a); continue; }
134
+ const num = Number(a.slice(eq + 1));
135
+ if (Number.isNaN(num)) { names.push(a.slice(0, eq)); }
136
+ else { values[a.slice(0, eq)] = num; hasValue = true; }
137
+ }
138
+ return hasValue ? values : names;
139
+ }
140
+
141
+ function explain(target, rest) {
142
+ if (!target) { console.error('upt explain needs a quantity name. See `upt help`.'); process.exit(2); }
143
+ const x = explainQuantity(GRAPH, target, parseKnown(rest));
144
+ console.log(`\n● ${target}`);
145
+ console.log(` ${x.summary}`);
146
+ if (x.derivations.length) {
147
+ console.log(' derivations:');
148
+ for (const d of x.derivations) {
149
+ const val = d.value !== undefined ? ` = ${d.value.toExponential(4)}` : '';
150
+ const chain = d.leafInputs.join(',') !== d.sources.join(',')
151
+ ? ` [from leaves: ${d.leafInputs.join(', ')}]` : '';
152
+ console.log(` - ${d.edge} (${d.label})${val}${chain}`);
153
+ if (d.dimensionalForm) console.log(` ${d.dimensionalForm.formula}`);
154
+ }
155
+ }
156
+ if (x.blockingFrontier.length) {
157
+ console.log(` to determine it, also supply: ${x.blockingFrontier.join(', ')}`);
158
+ }
159
+ }
160
+
161
+ // ── priority ────────────────────────────────────────────────────────────
162
+ function priority() {
163
+ const board = bridgePriority(GRAPH);
164
+ const a = (d) => (d === Infinity ? '∞' : String(d));
165
+ console.log('\nBridge triage — structural decidability against established physics');
166
+ console.log('(review/confrontation priority — NOT a credibility ranking)\n');
167
+ console.log(' tier anchor grounding cplx data bridge status');
168
+ console.log(' ' + '─'.repeat(73));
169
+ let last = 0;
170
+ for (const e of board) {
171
+ if (e.tier !== last) {
172
+ const label = e.tier === 1 ? 'anchored + grounded/tractable — confront first'
173
+ : e.tier === 2 ? 'anchored OR grounded — second pass'
174
+ : 'isolated + multi-parameter — needs literature review, not structure';
175
+ console.log(`\n ── Tier ${e.tier}: ${label}`);
176
+ last = e.tier;
177
+ }
178
+ console.log(' T' + e.tier, a(e.anchoring).padStart(5), ' ' + e.grounding.padEnd(10),
179
+ String(e.complexity).padStart(3), e.hasDataConfrontation ? ' DATA' : ' ',
180
+ ' ' + e.id.padEnd(20), e.status);
181
+ }
182
+ const tiers = board.reduce((m, e) => ((m[e.tier] = (m[e.tier] || 0) + 1), m), {});
183
+ console.log(`\n Tiers: ${JSON.stringify(tiers)} (of ${board.length} non-established bridges)`);
184
+ console.log(' Reminder: tier ranks decidability/anchoring, not truth.');
185
+ }
186
+
187
+ // ── audit ───────────────────────────────────────────────────────────────
188
+ function audit() {
189
+ const derived = [], decoy = [], open = [];
190
+ for (const e of GRAPH) {
191
+ const d = attemptDerivation(e);
192
+ const c = dimensionalFreedom(e);
193
+ if (d.status === 'derived') derived.push({ e, d, c });
194
+ else if (d.status === 'decoy') decoy.push({ e, c });
195
+ else open.push({ e, c });
196
+ }
197
+ console.log('\nDeriving the bridge equations by dimensions');
198
+ console.log('(form by dimensions; the constant is recovered by matching the evaluator)\n');
199
+ console.log(` DERIVED (${derived.length}) — recognized monomial, prefactor recovered:`);
200
+ for (const { e, d } of derived) {
201
+ const tag = d.cleanPrefactor ? '' : ' (empirical/tuned constant)';
202
+ console.log(` ${e.id.padEnd(22)} +[${(d.subset || []).join(',')}] ×${d.prefactor.toExponential(3)}${tag}`);
203
+ }
204
+ console.log(`\n DECOY (${decoy.length}) — dimensionally valid but wrong form:`);
205
+ console.log(' ' + decoy.map((x) => x.e.id).join(', '));
206
+ console.log(`\n OPEN (${open.length}) — irreducible free dimensionless group(s); by complexity:`);
207
+ for (const { e, c } of open.sort((a, b) => a.c - b.c)) {
208
+ console.log(` cplx=${c} ${e.id}`);
209
+ }
210
+ console.log('\n (derivability is ORTHOGONAL to credibility — see the priority command)');
211
+ }
212
+
213
+ // ── eval (your own formula) ───────────────────────────────────────────────
214
+ async function evalCmd(rawArgs) {
215
+ const debug = rawArgs.includes('--debug');
216
+ const args = rawArgs.filter((a) => a !== '--debug');
217
+ const expr = args[0];
218
+ if (!expr) { console.error('upt eval needs a formula, e.g. upt eval "a*b^2" a=2 b=3'); process.exit(2); }
219
+ const parser = await getFormulaParser();
220
+ if (debug) console.error(`[parser: ${await getFormulaParserKind()}]`);
221
+ let cf;
222
+ try { cf = parser.parse(expr); } catch (e) { console.error('parse error: ' + e.message); process.exit(2); }
223
+ const scope = {};
224
+ for (const a of args.slice(1)) {
225
+ const i = a.indexOf('=');
226
+ if (i > 0) scope[a.slice(0, i)] = Number(a.slice(i + 1));
227
+ }
228
+ const missing = cf.variables.filter((v) => !(v in scope));
229
+ if (missing.length) {
230
+ console.error(`missing values for: ${missing.join(', ')} (free variables: ${cf.variables.join(', ') || 'none'})`);
231
+ process.exit(2);
232
+ }
233
+ try { console.log(cf.evaluate(scope)); } catch (e) { console.error(e.message); process.exit(2); }
234
+ }
235
+
236
+ // ── derive (your own equation) ─────────────────────────────────────────────
237
+ const fmtMono = (m) => Object.entries(m).filter(([, e]) => Math.abs(e) > 1e-9)
238
+ .map(([n, e]) => (e === 1 ? n : `${n}^${e}`)).join('·') || '(dimensionless)';
239
+
240
+ const BASES = ['L', 'M', 'T', 'I', 'Theta', 'N', 'J'];
241
+ const dimsEqualTol = (a, b) => BASES.every((k) => Math.abs((a[k] || 0) - (b[k] || 0)) < 1e-9);
242
+
243
+ async function derive(args) {
244
+ let formula = null;
245
+ let debug = false;
246
+ const rest = [];
247
+ for (let i = 0; i < args.length; i++) {
248
+ if (args[i] === '--formula') formula = args[++i];
249
+ else if (args[i] === '--debug') debug = true;
250
+ else rest.push(args[i]);
251
+ }
252
+ if (rest.length < 1) { console.error('upt derive needs a target spec, e.g. upt derive period:time length:length gravity:acceleration'); process.exit(2); }
253
+ let specs;
254
+ try {
255
+ specs = rest.map((a) => {
256
+ const c = a.indexOf(':');
257
+ if (c < 1) throw new Error(`'${a}' must be name:dimension (e.g. period:time)`);
258
+ return { name: a.slice(0, c), dim: parseDimensionSpec(a.slice(c + 1)) };
259
+ });
260
+ } catch (e) { console.error(' ' + e.message); process.exit(2); }
261
+ const target = specs[0];
262
+ const governing = specs.slice(1);
263
+ const det = dimensionallyDetermines(target, governing);
264
+ console.log(`\n● ${target.name} from {${governing.map((g) => g.name).join(', ')}}`);
265
+ if (det.determined) {
266
+ console.log(` dimensionally determined up to a constant: ${target.name} ∝ ${fmtMono(det.monomial)}`);
267
+ } else {
268
+ const full = buckinghamPi([target, ...governing]);
269
+ console.log(` NOT a unique monomial — ${full.piGroupCount} free dimensionless group(s) (${full.verdict}):`);
270
+ for (const g of full.piGroups) console.log(` ${g.formula}`);
271
+ console.log(` (${det.reason})`);
272
+ }
273
+ if (formula) {
274
+ const parser = await getFormulaParser();
275
+ if (debug) console.error(` [parser: ${await getFormulaParserKind()}]`);
276
+
277
+ // Dimensional check (Phase 2) — homogeneity + dimension of the user's
278
+ // formula, independent of whether a unique monomial exists. Always
279
+ // available (MathTS AST when present, else the built-in parser's AST).
280
+ const checker = await getFormulaDimensionChecker();
281
+ const dims = Object.fromEntries(governing.map((g) => [g.name, g.dim]));
282
+ const r = checker.check(formula, dims);
283
+ if (!r.ok) {
284
+ console.log(` formula dimensional check: ✗ ${r.error}`);
285
+ } else {
286
+ const matches = dimsEqualTol(r.dim, target.dim);
287
+ console.log(` formula dimension: ${api.format(r.dim)}` +
288
+ (matches ? ` ✓ homogeneous, matches target` : ` ⚠ homogeneous but ≠ target ${api.format(target.dim)}`));
289
+ }
290
+
291
+ let cf;
292
+ try { cf = parser.parse(formula); } catch (e) { console.error(' formula parse error: ' + e.message); process.exit(2); }
293
+ if (!det.determined) { console.log(' formula given, but with no unique monomial there is no single prefactor to recover.'); return; }
294
+ const ratios = [];
295
+ for (let j = 0; j < 3; j++) {
296
+ const scope = {};
297
+ governing.forEach((g, i) => { scope[g.name] = Math.pow(1.7 + i, 1 + 0.3 * j); });
298
+ let cand = 1;
299
+ for (const g of governing) cand *= Math.pow(scope[g.name], det.monomial[g.name] || 0);
300
+ try { ratios.push(cf.evaluate(scope) / cand); }
301
+ catch (e) { console.error(' formula uses an undeclared variable: ' + e.message); process.exit(2); }
302
+ }
303
+ const mean = ratios.reduce((a, b) => a + b, 0) / ratios.length;
304
+ const cv = Math.sqrt(ratios.reduce((a, b) => a + (b - mean) ** 2, 0) / ratios.length) / Math.abs(mean);
305
+ console.log(cv < 1e-9
306
+ ? ` formula MATCHES the dimensional form — recovered prefactor ≈ ${mean.toExponential(4)}`
307
+ : ` formula does NOT match the dimensional monomial (different input-dependence — a decoy or different physics).`);
308
+ }
309
+ }
310
+
311
+ // ── map (how the equations link) ──────────────────────────────────────────
312
+ function mapCmd() {
313
+ const m = linkageMap(GRAPH);
314
+ const mix = (s) => Object.entries(s).map(([k, v]) => `${v} ${k}`).join(', ');
315
+ console.log('\nCatalog linkage map — how the equations connect via shared quantities');
316
+ console.log(`(${m.componentCount} components over ${GRAPH.length} edges; ${m.compositions} compose into chains)\n`);
317
+ for (const c of m.clusters.filter((x) => x.size > 1)) {
318
+ console.log(` ● cluster of ${c.size}${c.anchored ? ' [ANCHORED to known physics]' : ''}`);
319
+ console.log(` edges: ${c.edges.join(', ')}`);
320
+ console.log(` status: ${mix(c.statusMix)}`);
321
+ console.log(` link hubs: ${c.hubs.join(', ')}\n`);
322
+ }
323
+ console.log(` ○ isolated (${m.isolated.length}) — share no quantity with any other edge:`);
324
+ console.log(` ${m.isolated.join(', ')}`);
325
+ console.log('\n (a structural map — shared-quantity connectivity, NOT a credibility signal)');
326
+ }
327
+
328
+ // ── candidates (map-proposed links for review) ────────────────────────────
329
+ function candidatesCmd() {
330
+ const cands = proposeLinkCandidates(GRAPH);
331
+ const core = cands.filter((c) => c.touchesCore);
332
+ const ck = cands.filter((c) => c.touchesCore && c.sameKind);
333
+ console.log('\nLink candidates — cross-cluster quantities sharing a dimension');
334
+ console.log('⚠ a coincidence-heavy REVIEW SURFACE, NOT discovered bridges. Same dimension is a');
335
+ console.log(' weak signal; each needs a physicist to accept or (far more often) reject.\n');
336
+ console.log(` funnel: ${cands.length} total → ${core.length} touch the anchored core → ${ck.length} also same-kind\n`);
337
+ console.log(' same-kind + core-touching (the least-implausible set):');
338
+ for (const c of ck) console.log(` ${(c.a + ' ≟ ' + c.b).padEnd(56)} [${c.sharedToken}]`);
339
+ console.log('\n Most are still coincidences (decoherence-rate ≟ hubble-rate) or pairs the catalog');
340
+ console.log(' deliberately keeps distinct (effective-mass ≠ mass). The genuinely motivated few —');
341
+ console.log(' e.g. coarsening-length ≟ quantum-correlation-length (links the isolated Model-A');
342
+ console.log(' coarsening bridge to the Kibble-Zurek criticality cluster) — are written up in');
343
+ console.log(' docs/research/Linkage-Candidate-Proposals.md.');
344
+ }
345
+
346
+ // ── predict (empty regime cells as bridge hypotheses) ─────────────────────
347
+ function predictCmd() {
348
+ const r = predictMissingBridges(GRAPH);
349
+ const short = (k) => k.replace(/scale=/g, '').replace(/force=/g, '').replace('|', '/');
350
+ console.log('\nBridge prediction — empty (scale×force) regime cells as undiscovered-link HYPOTHESES');
351
+ console.log('⚠ STRUCTURAL hypotheses for physicist review, NOT discovered bridges. "Two regimes');
352
+ console.log(' share bridge-neighbours but are not directly linked" (triadic closure) is a weak prior.\n');
353
+ console.log(` projected ${r.placedEdges}/${r.totalEdges} edges onto ${r.occupiedRegimes.length} regimes; ` +
354
+ `${r.linkedPairCount} regime-pairs already bridged.\n`);
355
+ if (!r.predictions.length) {
356
+ console.log(' no empty regime-pair has a shared-neighbour basis — nothing to predict.');
357
+ } else {
358
+ console.log(' predicted missing bridges (by shared-neighbour count):');
359
+ for (const p of r.predictions) {
360
+ console.log(` ${(short(p.regimeA) + ' ⟷ ' + short(p.regimeB)).padEnd(46)} ` +
361
+ `score ${p.sharedNeighbors} via {${p.via.map(short).join(', ')}}`);
362
+ }
363
+ }
364
+ if (r.unexploredRegimes.length) {
365
+ console.log(`\n unexplored regimes adjacent to known ones (the tensor's empty neighbourhoods):`);
366
+ console.log(` ${r.unexploredRegimes.map(short).join(', ')}`);
367
+ }
368
+ console.log('\n (regime coords come from quantity attributes; only regime-tagged edges are placed.)');
369
+ }
370
+
371
+ // ── discover (vet link candidates through the inference suite) ─────────────
372
+ function discoverCmd() {
373
+ const ranked = rankDiscoveries(GRAPH);
374
+ const by = (v) => ranked.filter((r) => r.verdict === v);
375
+ const promising = by('promising'), inert = by('inert'), contra = by('contradictory');
376
+ console.log('\nDiscovery — link candidates VETTED through the inference suite');
377
+ console.log('⚠ a REVIEW SURFACE: `promising` means "worth a physicist\'s minute", not "true".');
378
+ console.log(' Each candidate hypothesises an identification a≡b and tests its consequences.\n');
379
+ console.log(` funnel: ${ranked.length} candidates → ${promising.length} promising ` +
380
+ `· ${inert.length} inert · ${contra.length} contradictory (falsified)\n`);
381
+ if (promising.length) {
382
+ console.log(' PROMISING (merges disconnected physics, unlocks quantities, stays consistent):');
383
+ for (const r of promising) {
384
+ console.log(` ${(r.a + ' ≟ ' + r.b).padEnd(52)} [${r.dim}] score ${r.score}`);
385
+ console.log(` unlocks: ${r.unlocksFromAnchor.join(', ') || '—'}`);
386
+ }
387
+ } else {
388
+ console.log(' no candidate is `promising` from the default {mass} anchor.');
389
+ }
390
+ if (contra.length) {
391
+ console.log(`\n CONTRADICTORY (the identification falsifies itself numerically):`);
392
+ for (const r of contra) {
393
+ console.log(` ${(r.a + ' ≟ ' + r.b).padEnd(52)} disagreeing node(s): ${r.inconsistentNodes.join(', ')}`);
394
+ }
395
+ }
396
+ console.log('\n (numeric check only exercises the anchor-reachable subgraph; weak priors on dimension.)');
397
+ }
398
+
399
+ // ── coverage (empirical-spine audit) ──────────────────────────────────────
400
+ function coverageCmd() {
401
+ const r = auditCoverage();
402
+ console.log('\nEmpirical-spine coverage — where the catalog\'s grounding is thin');
403
+ console.log('(reads the catalog/graph/confrontation modules; fabricates nothing)\n');
404
+ console.log(` ${r.total} bridges by grounding tier:`);
405
+ console.log(` data-confronted : ${r.byTier['data-confronted']} (real-data confrontation)`);
406
+ console.log(` graph-computable : ${r.byTier['graph-computable']} (graph edge + dimensional signature)`);
407
+ console.log(` encoded-only : ${r.byTier['encoded-only']} (dimensional signature, no graph edge)`);
408
+ console.log(` thin : ${r.byTier['thin']} (no dimensional signature)`);
409
+ console.log(`\n gaps: ${r.withoutDataConfrontation} without a data confrontation · ` +
410
+ `${r.withoutCitation} without any citation`);
411
+ if (r.thinBridges.length) {
412
+ console.log(` thinnest (no dimensional signature): BE-${r.thinBridges.join(', BE-')}`);
413
+ }
414
+ console.log('\n (a targeting tool for the CONTRIBUTING.md physicist review, not a quality score.)');
415
+ }
416
+
417
+ // ── symbolic (symbolic bridge composition — the Observable contract) ──────
418
+ function exprToString(n) {
419
+ if (n.kind === 'symbol') return n.name;
420
+ if (n.kind === 'op') {
421
+ if (n.op === '^') return `${exprToString(n.args[0])}^${exprToString(n.args[1])}`;
422
+ const sep = n.op === '*' ? '·' : ` ${n.op} `;
423
+ const inner = n.args.map((a) => {
424
+ const s = exprToString(a);
425
+ return a.kind === 'op' && (a.op === '+' || a.op === '-' || a.op === '/') ? `(${s})` : s;
426
+ }).join(sep);
427
+ return inner;
428
+ }
429
+ return `⟨${n.kind}⟩`;
430
+ }
431
+
432
+ async function symbolicCmd(rest) {
433
+ const doSimplify = rest.includes('--simplify');
434
+ const chains = [
435
+ { first: be42Edge, second: be16Edge, label: 'CT-1 (be-42 ∘ be-16, via hawking-temperature ≡ temperature)' },
436
+ { first: lawSchwarzschildRadius, second: be42ViaRsEdge, label: 'CT-1b (law-r_s ∘ be-42-via-rs, name-match junction)' },
437
+ ];
438
+ console.log('\nSymbolic bridge composition — composing the SYMBOLIC forms, not just numbers');
439
+ console.log('(the Observable contract: composed AST, dimensionally validated + numerically evaluable)\n');
440
+ for (const { first, second, label } of chains) {
441
+ const obs = composeSymbolic(first, second);
442
+ const num = obs.evaluate({ mass: M_SUN_KG });
443
+ console.log(` ● ${label}`);
444
+ console.log(` composed: ${obs.name}(${obs.leaves.join(',')}) = ${exprToString(obs.expr)}`);
445
+ if (doSimplify) {
446
+ const s = await simplifyObservable(obs);
447
+ const sNum = s.evaluate({ mass: M_SUN_KG });
448
+ const tag = s.expr === obs.expr ? ' (unchanged — minimal, MathTS absent, or not reducible here)' : '';
449
+ console.log(` simplified: ${s.name}(${s.leaves.join(',')}) = ${exprToString(s.expr)}${tag}`);
450
+ console.log(` value @ mass = M_sun: ${sNum.toExponential(4)} (= composed, ${format(s.dim)})`);
451
+ } else {
452
+ console.log(` dimension: ${format(obs.dim)} (validated on the composed AST)`);
453
+ console.log(` value @ mass = M_sun: ${num.toExponential(4)}`);
454
+ }
455
+ console.log('');
456
+ }
457
+ console.log(' Both compose by AST substitution at the junction and match the numeric composeEdges');
458
+ console.log(' pipeline to float precision.' + (doSimplify
459
+ ? ' --simplify folds the composed AST via MathTS (k_B cancels), guarded by re-validation.'
460
+ : ' Pass --simplify to fold the composed AST via MathTS.'));
461
+ }
462
+
463
+ // ── connectors (pull isolated bridges into the core) ──────────────────────
464
+ function connectorsCmd() {
465
+ const r = proposeOrphanConnectors(GRAPH);
466
+ console.log('\nOrphan connectors — same-dimension identifications that would pull an ISOLATED');
467
+ console.log('bridge into the anchored core (the catalog\'s structural frontier).');
468
+ console.log('⚠ A REVIEW SURFACE: same dimension is a WEAK prior; most are decoys (a Förster');
469
+ console.log(' radius is not a Schwarzschild radius). Same-kind (shared name token) = stronger.\n');
470
+ console.log(` ${r.connectedOrphans.length} of the isolated bridges have a same-kind connector; ` +
471
+ `${r.unconnectedOrphans.length} are truly unconnected.\n`);
472
+ console.log(' SAME-KIND connectors (the motivated set — orphan ≟ core via shared token):');
473
+ let lastOrphan = '';
474
+ for (const c of r.connectors.filter((x) => x.sameKind)) {
475
+ if (c.orphanEdge !== lastOrphan) { console.log(` ── ${c.orphanEdge} (isolated):`); lastOrphan = c.orphanEdge; }
476
+ console.log(` ${(c.orphanQuantity + ' ≟ ' + c.coreQuantity).padEnd(54)} [${c.dim}] → ${c.coreEdge}`);
477
+ }
478
+ console.log(`\n truly unconnected (no same-dimension bridge into them): ${r.unconnectedOrphans.join(', ')}`);
479
+ console.log('\n Physicist-reasoned ranking + the genuinely-motivated few (e.g. coarsening-length ≟');
480
+ console.log(' quantum-correlation-length; tunneling-mass ≟ effective-mass) are written up in');
481
+ console.log(' docs/research/Orphan-Connector-Analysis.md and proposed in spec Part-IX §9.');
482
+ }
483
+
484
+ // ── dispatch ──────────────────────────────────────────────────────────────
485
+ const [cmd, ...rest] = process.argv.slice(2);
486
+ switch (cmd) {
487
+ case 'explain': explain(rest[0], rest.slice(1)); break;
488
+ case 'priority': case 'prioritize': case 'triage': priority(); break;
489
+ case 'audit': audit(); break;
490
+ case 'map': case 'linkage': mapCmd(); break;
491
+ case 'candidates': case 'propose': candidatesCmd(); break;
492
+ case 'predict': case 'predictions': predictCmd(); break;
493
+ case 'discover': case 'discovery': discoverCmd(); break;
494
+ case 'connectors': case 'orphans': connectorsCmd(); break;
495
+ case 'coverage': case 'grounding': coverageCmd(); break;
496
+ case 'symbolic': case 'compose-symbolic': await symbolicCmd(rest); break;
497
+ case 'eval': case 'calc': await evalCmd(rest); break;
498
+ case 'derive': case 'dim': await derive(rest); break;
499
+ case 'help': case '--help': case '-h': help(); break;
500
+ case undefined:
501
+ console.log('upt — bridge-inference CLI. Demo (run `upt help` for usage):');
502
+ explain('hawking-temperature', ['mass=1.989e30']);
503
+ priority();
504
+ break;
505
+ default:
506
+ console.error(`Unknown command '${cmd}'. See \`upt help\`.`);
507
+ process.exit(2);
508
+ }
@@ -0,0 +1,162 @@
1
+ /**
2
+ * BE-23 × overdoped-cuprate Planckian dissipation — the second
3
+ * real-data confrontation (follows the GW170817 pattern of
4
+ * `be36-gw170817-confrontation.ts`: observation record with citations,
5
+ * a `confront` function that recomputes the published comparison, and
6
+ * honest-finding fields).
7
+ *
8
+ * Published dataset: Legros et al. 2019 *Nature Physics* 15:142,
9
+ * "Universal T-linear resistivity and Planckian dissipation in
10
+ * overdoped cuprates" (arXiv:1805.02512). The paper measures the
11
+ * T-linear resistivity slope across overdoped cuprates (Bi2212,
12
+ * Bi2201, LSCO, Nd-LSCO) and converts it, via the Drude relation
13
+ * ρ = m* / (n e² τ), into a Planckian scattering coefficient α defined by
14
+ *
15
+ * ℏ/τ = α · k_B T, finding α ≈ 1 within a factor ~2 (O(1)).
16
+ *
17
+ * ── DATA-ENCODING HONESTY LEVEL: AGGREGATE, NOT PER-MATERIAL ──
18
+ * The per-material α table from Legros et al. was NOT reproduced here:
19
+ * it could not be re-verified against the paper at encoding time
20
+ * (network access to arXiv/Nature unavailable), and reproducing table
21
+ * rows from memory risks fabricating numbers. Per the repo's
22
+ * no-fabricated-literals rule, this module encodes ONLY the paper's
23
+ * abstract-level aggregate claim, conservatively stated as
24
+ * α = 1.0 ± 0.4 (i.e., α is O(1), within roughly a factor of 2 of the
25
+ * Planckian value α = 1, across the materials studied). Anyone with
26
+ * the paper in hand can upgrade `PLANCKIAN_CUPRATES` to per-material
27
+ * rows; the `perMaterialAlphas: null` field is the explicit marker
28
+ * that this upgrade has not happened.
29
+ *
30
+ * ── WHAT IS ACTUALLY CONFRONTED ──
31
+ * BE-23's evaluator (`evaluateSYKResistivity`) computes
32
+ *
33
+ * ρ(T) = ρ_0 + (m* · k_B T)/(n_e · e² · ℏ) · α_SYK,
34
+ *
35
+ * which is exactly the Drude resistivity with the Planckian rate
36
+ * 1/τ = α_SYK · k_B T / ℏ substituted. So the encoding's α_SYK is the
37
+ * SAME dimensionless α the paper reports, and the supportable test is:
38
+ * 1. Is the published α band consistent with the O(1) assumption the
39
+ * BE-23 docstring makes for α_SYK? (Operationalized here as the
40
+ * factor-2 band [0.5, 2] — OUR reading of "O(1)", not a number
41
+ * from the paper.)
42
+ * 2. Is the evaluator's thermal term algebraically identical to
43
+ * (m* / (n_e e²)) · (α k_B T/ℏ), i.e., Drude × Planckian-rate?
44
+ * (`encodedFormConsistent`, checked numerically at an arbitrary
45
+ * positive parameter point — the parameters cancel structurally,
46
+ * so no material data is needed or fabricated for this check.)
47
+ * NOT claimed: that UPT/SYK *predicts* α (BE-23 bundles α_SYK as a
48
+ * free O(1) coefficient — status: speculative), nor that agreement
49
+ * here validates the strange-metal/black-hole bridge framing.
50
+ *
51
+ * @module bridges/be23-planckian-confrontation
52
+ */
53
+ /**
54
+ * A Planckian-dissipation observation record (aggregate-level).
55
+ *
56
+ * @public
57
+ */
58
+ export interface PlanckianObservation {
59
+ /** Materials covered by the study (names only — see `perMaterialAlphas`). */
60
+ readonly materials: readonly string[];
61
+ /** Aggregate Planckian coefficient α (dimensionless, ℏ/τ = α·k_B T). */
62
+ readonly alpha_aggregate: number;
63
+ /** Conservative spread on the aggregate α (dimensionless). */
64
+ readonly alpha_aggregate_err: number;
65
+ /**
66
+ * Per-material {material, alpha, alpha_err} rows. `null` = the
67
+ * paper's table was NOT reproduced (honesty marker — see module doc).
68
+ */
69
+ readonly perMaterialAlphas: readonly {
70
+ material: string;
71
+ alpha: number;
72
+ alpha_err: number;
73
+ }[] | null;
74
+ /** 'aggregate' until the per-material table is faithfully transcribed. */
75
+ readonly encodingHonestyLevel: 'aggregate' | 'per-material';
76
+ readonly citation: string;
77
+ readonly honestyNote: string;
78
+ }
79
+ /**
80
+ * Legros et al. 2019 overdoped-cuprate Planckian-dissipation record,
81
+ * encoded at AGGREGATE honesty level (see module doc for why).
82
+ *
83
+ * @public
84
+ */
85
+ export declare const PLANCKIAN_CUPRATES: PlanckianObservation;
86
+ /**
87
+ * The factor-2 band [0.5, 2] used to operationalize the "α_SYK is
88
+ * O(1)" assumption in BE-23's docstring. This band is UPT's reading of
89
+ * "O(1)" — it is not a number published by Legros et al.
90
+ *
91
+ * @public
92
+ */
93
+ export declare const PLANCKIAN_O1_BAND: readonly [number, number];
94
+ /**
95
+ * Result of confronting BE-23 with a Planckian-dissipation observation.
96
+ *
97
+ * @public
98
+ */
99
+ export interface BE23ConfrontationResult {
100
+ /** Central aggregate α from the observation record. */
101
+ readonly alphaAggregate: number;
102
+ /** Spread on the aggregate α (echoed; propagated by the *WithUncertainty sibling). */
103
+ readonly alphaAggregateErr: number;
104
+ /** `null` here — per-material rows were not encoded (honesty marker). */
105
+ readonly perMaterialAlphas: PlanckianObservation['perMaterialAlphas'];
106
+ /** The O(1) band [0.5, 2] the verdict is taken against. */
107
+ readonly planckianBand: readonly [number, number];
108
+ /**
109
+ * Whether all encoded α values (here: the single aggregate central
110
+ * value) lie within the O(1) band [0.5, 2] that BE-23's α_SYK
111
+ * presumes. ±1σ band coverage is the *WithUncertainty sibling's job.
112
+ */
113
+ readonly withinPlanckianBand: boolean;
114
+ /** Planckian scattering rate 1/τ = α·k_B·T/ℏ at temperature T (s⁻¹). */
115
+ readonly planckianRateAt: (T_K: number) => number;
116
+ /**
117
+ * Whether `evaluateSYKResistivity`'s thermal term numerically equals
118
+ * the Drude form (m* / (n_e e²)) · planckianRateAt(T) — i.e., the
119
+ * encoded linear-in-T resistivity IS the Planckian-rate Drude
120
+ * resistivity. Checked at an arbitrary positive parameter point
121
+ * (structural identity; no material data involved).
122
+ */
123
+ readonly encodedFormConsistent: boolean;
124
+ /** Relative error of the consistency check above. */
125
+ readonly encodedFormRelErr: number;
126
+ readonly note: string;
127
+ readonly observation: PlanckianObservation;
128
+ }
129
+ /**
130
+ * Confront BE-23's Planckian-dissipation encoding with the published
131
+ * overdoped-cuprate α band (the framework's second real-data
132
+ * confrontation, after BE-36 × GW170817).
133
+ *
134
+ * @public
135
+ */
136
+ export declare function confrontBE23(obs?: PlanckianObservation): BE23ConfrontationResult;
137
+ /**
138
+ * Confrontation result with first-order uncertainty (mirrors
139
+ * `confrontBE36WithUncertainty`).
140
+ *
141
+ * Propagates σ(α) = alpha_aggregate_err only: the Planckian rate is
142
+ * linear in α (∂rate/∂α = k_B T/ℏ), so σ_rate(T) = σ_α·k_B T/ℏ.
143
+ * `withinPlanckianBandAtOneSigma` requires the whole ±1σ interval
144
+ * [α−σ, α+σ] to sit inside [0.5, 2] — the stricter verdict.
145
+ *
146
+ * @public
147
+ */
148
+ export interface BE23ConfrontationWithUncertainty extends BE23ConfrontationResult {
149
+ /** 1σ on α (echo of alpha_aggregate_err, validated). */
150
+ readonly alphaSigma: number;
151
+ /** 1σ on the Planckian rate at temperature T (s⁻¹): σ_α·k_B·T/ℏ. */
152
+ readonly planckianRateSigmaAt: (T_K: number) => number;
153
+ /** Whether [α−σ, α+σ] ⊆ [0.5, 2] (stricter than the central verdict). */
154
+ readonly withinPlanckianBandAtOneSigma: boolean;
155
+ }
156
+ /**
157
+ * `confrontBE23` + first-order propagation of the α uncertainty.
158
+ *
159
+ * @public
160
+ */
161
+ export declare function confrontBE23WithUncertainty(obs?: PlanckianObservation): BE23ConfrontationWithUncertainty;
162
+ //# sourceMappingURL=be23-planckian-confrontation.d.ts.map