universal-physics-tensor 0.47.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (702) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +405 -383
  3. package/bin/upt.mjs +7 -1
  4. package/dist/atlas/benchmark/hybrid-retrieval.d.ts +108 -0
  5. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -0
  6. package/dist/atlas/benchmark/hybrid-retrieval.js +241 -0
  7. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -0
  8. package/dist/atlas/catalog-formal-ref.d.ts +24 -0
  9. package/dist/atlas/catalog-formal-ref.d.ts.map +1 -0
  10. package/dist/atlas/catalog-formal-ref.js +36 -0
  11. package/dist/atlas/catalog-formal-ref.js.map +1 -0
  12. package/dist/atlas/chain-pipeline.d.ts +52 -0
  13. package/dist/atlas/chain-pipeline.d.ts.map +1 -0
  14. package/dist/atlas/chain-pipeline.js +176 -0
  15. package/dist/atlas/chain-pipeline.js.map +1 -0
  16. package/dist/atlas/composition-table.d.ts +11 -46
  17. package/dist/atlas/composition-table.d.ts.map +1 -1
  18. package/dist/atlas/composition-table.js +7 -124
  19. package/dist/atlas/composition-table.js.map +1 -1
  20. package/dist/atlas/conventions.d.ts +4 -58
  21. package/dist/atlas/conventions.d.ts.map +1 -1
  22. package/dist/atlas/conventions.js +3 -88
  23. package/dist/atlas/conventions.js.map +1 -1
  24. package/dist/atlas/derive-evidence.d.ts +50 -3
  25. package/dist/atlas/derive-evidence.d.ts.map +1 -1
  26. package/dist/atlas/derive-evidence.js +73 -4
  27. package/dist/atlas/derive-evidence.js.map +1 -1
  28. package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
  29. package/dist/atlas/diffusion/bridges-closure.js +5 -1
  30. package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
  31. package/dist/atlas/index.d.ts +9 -7
  32. package/dist/atlas/index.d.ts.map +1 -1
  33. package/dist/atlas/index.js +6 -5
  34. package/dist/atlas/index.js.map +1 -1
  35. package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
  36. package/dist/atlas/oscillators/bridges-exact.js +6 -0
  37. package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
  38. package/dist/atlas/oscillators/bridges-limits.d.ts +2 -0
  39. package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
  40. package/dist/atlas/oscillators/bridges-limits.js +11 -19
  41. package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
  42. package/dist/atlas/oscillators/limit-witnesses.d.ts +93 -0
  43. package/dist/atlas/oscillators/limit-witnesses.d.ts.map +1 -0
  44. package/dist/atlas/oscillators/limit-witnesses.js +152 -0
  45. package/dist/atlas/oscillators/limit-witnesses.js.map +1 -0
  46. package/dist/atlas/oscillators/models.d.ts +2 -1
  47. package/dist/atlas/oscillators/models.d.ts.map +1 -1
  48. package/dist/atlas/oscillators/models.js +4 -3
  49. package/dist/atlas/oscillators/models.js.map +1 -1
  50. package/dist/atlas/oscillators/norm-transport-witness.d.ts +37 -0
  51. package/dist/atlas/oscillators/norm-transport-witness.d.ts.map +1 -0
  52. package/dist/atlas/oscillators/norm-transport-witness.js +58 -0
  53. package/dist/atlas/oscillators/norm-transport-witness.js.map +1 -0
  54. package/dist/atlas/oscillators/norm-transport.d.ts +44 -0
  55. package/dist/atlas/oscillators/norm-transport.d.ts.map +1 -0
  56. package/dist/atlas/oscillators/norm-transport.js +66 -0
  57. package/dist/atlas/oscillators/norm-transport.js.map +1 -0
  58. package/dist/atlas/oscillators/norms.d.ts +11 -0
  59. package/dist/atlas/oscillators/norms.d.ts.map +1 -0
  60. package/dist/atlas/oscillators/norms.js +11 -0
  61. package/dist/atlas/oscillators/norms.js.map +1 -0
  62. package/dist/atlas/oscillators/pendulum-motion.d.ts +38 -0
  63. package/dist/atlas/oscillators/pendulum-motion.d.ts.map +1 -0
  64. package/dist/atlas/oscillators/pendulum-motion.js +122 -0
  65. package/dist/atlas/oscillators/pendulum-motion.js.map +1 -0
  66. package/dist/atlas/oscillators/phase-carriage.d.ts +38 -0
  67. package/dist/atlas/oscillators/phase-carriage.d.ts.map +1 -0
  68. package/dist/atlas/oscillators/phase-carriage.js +96 -0
  69. package/dist/atlas/oscillators/phase-carriage.js.map +1 -0
  70. package/dist/atlas/oscillators/phase-translation.d.ts +46 -0
  71. package/dist/atlas/oscillators/phase-translation.d.ts.map +1 -0
  72. package/dist/atlas/oscillators/phase-translation.js +178 -0
  73. package/dist/atlas/oscillators/phase-translation.js.map +1 -0
  74. package/dist/atlas/oscillators/position-translation.d.ts +59 -0
  75. package/dist/atlas/oscillators/position-translation.d.ts.map +1 -0
  76. package/dist/atlas/oscillators/position-translation.js +254 -0
  77. package/dist/atlas/oscillators/position-translation.js.map +1 -0
  78. package/dist/atlas/path-bound.d.ts +126 -9
  79. package/dist/atlas/path-bound.d.ts.map +1 -1
  80. package/dist/atlas/path-bound.js +372 -23
  81. package/dist/atlas/path-bound.js.map +1 -1
  82. package/dist/atlas/physjs-ref.d.ts +141 -0
  83. package/dist/atlas/physjs-ref.d.ts.map +1 -0
  84. package/dist/atlas/physjs-ref.js +878 -0
  85. package/dist/atlas/physjs-ref.js.map +1 -0
  86. package/dist/atlas/proof-target.d.ts +32 -0
  87. package/dist/atlas/proof-target.d.ts.map +1 -0
  88. package/dist/atlas/proof-target.js +140 -0
  89. package/dist/atlas/proof-target.js.map +1 -0
  90. package/dist/atlas/regime.d.ts +12 -136
  91. package/dist/atlas/regime.d.ts.map +1 -1
  92. package/dist/atlas/regime.js +8 -254
  93. package/dist/atlas/regime.js.map +1 -1
  94. package/dist/atlas/serialize.d.ts.map +1 -1
  95. package/dist/atlas/serialize.js +25 -0
  96. package/dist/atlas/serialize.js.map +1 -1
  97. package/dist/atlas/translation-registry.d.ts +22 -0
  98. package/dist/atlas/translation-registry.d.ts.map +1 -0
  99. package/dist/atlas/translation-registry.js +31 -0
  100. package/dist/atlas/translation-registry.js.map +1 -0
  101. package/dist/atlas/translation.d.ts +116 -0
  102. package/dist/atlas/translation.d.ts.map +1 -0
  103. package/dist/atlas/translation.js +34 -0
  104. package/dist/atlas/translation.js.map +1 -0
  105. package/dist/atlas/types.d.ts +74 -240
  106. package/dist/atlas/types.d.ts.map +1 -1
  107. package/dist/atlas/types.js +5 -37
  108. package/dist/atlas/types.js.map +1 -1
  109. package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
  110. package/dist/atlas/waves/bridges-closure.js +4 -0
  111. package/dist/atlas/waves/bridges-closure.js.map +1 -1
  112. package/dist/atlas/waves/bridges.d.ts.map +1 -1
  113. package/dist/atlas/waves/bridges.js +3 -0
  114. package/dist/atlas/waves/bridges.js.map +1 -1
  115. package/dist/atlas/waves/models.js +1 -1
  116. package/dist/atlas/waves/models.js.map +1 -1
  117. package/dist/atlas/witness-dominance.d.ts +50 -0
  118. package/dist/atlas/witness-dominance.d.ts.map +1 -0
  119. package/dist/atlas/witness-dominance.js +86 -0
  120. package/dist/atlas/witness-dominance.js.map +1 -0
  121. package/dist/atlas/witness-specs.d.ts +30 -0
  122. package/dist/atlas/witness-specs.d.ts.map +1 -1
  123. package/dist/atlas/witness-specs.js +107 -0
  124. package/dist/atlas/witness-specs.js.map +1 -1
  125. package/dist/bridges/be53-yang-mills-confrontation.d.ts +81 -0
  126. package/dist/bridges/be53-yang-mills-confrontation.d.ts.map +1 -0
  127. package/dist/bridges/be53-yang-mills-confrontation.js +110 -0
  128. package/dist/bridges/be53-yang-mills-confrontation.js.map +1 -0
  129. package/dist/bridges/be63-chandrasekhar-mass.d.ts.map +1 -1
  130. package/dist/bridges/be63-chandrasekhar-mass.js +1 -3
  131. package/dist/bridges/be63-chandrasekhar-mass.js.map +1 -1
  132. package/dist/bridges/confrontation-coverage.d.ts +5 -61
  133. package/dist/bridges/confrontation-coverage.d.ts.map +1 -1
  134. package/dist/bridges/confrontation-coverage.js +5 -70
  135. package/dist/bridges/confrontation-coverage.js.map +1 -1
  136. package/dist/bridges/confrontations.d.ts +1 -1
  137. package/dist/bridges/confrontations.d.ts.map +1 -1
  138. package/dist/bridges/confrontations.js +291 -3
  139. package/dist/bridges/confrontations.js.map +1 -1
  140. package/dist/bridges/equations/be-13-einstein-trace.d.ts +2 -3
  141. package/dist/bridges/equations/be-13-einstein-trace.d.ts.map +1 -1
  142. package/dist/bridges/equations/be-13-einstein-trace.js +2 -3
  143. package/dist/bridges/equations/be-13-einstein-trace.js.map +1 -1
  144. package/dist/bridges/equations/be-38-mond.d.ts +7 -5
  145. package/dist/bridges/equations/be-38-mond.d.ts.map +1 -1
  146. package/dist/bridges/equations/be-38-mond.js +7 -5
  147. package/dist/bridges/equations/be-38-mond.js.map +1 -1
  148. package/dist/bridges/equations/be-42-hawking-temperature.d.ts +3 -0
  149. package/dist/bridges/equations/be-42-hawking-temperature.d.ts.map +1 -1
  150. package/dist/bridges/equations/be-42-hawking-temperature.js +8 -1
  151. package/dist/bridges/equations/be-42-hawking-temperature.js.map +1 -1
  152. package/dist/bridges/equations/be-53-yang-mills-beta.d.ts +21 -0
  153. package/dist/bridges/equations/be-53-yang-mills-beta.d.ts.map +1 -1
  154. package/dist/bridges/equations/be-53-yang-mills-beta.js +12 -0
  155. package/dist/bridges/equations/be-53-yang-mills-beta.js.map +1 -1
  156. package/dist/bridges/evaluator-inputs.d.ts +21 -0
  157. package/dist/bridges/evaluator-inputs.d.ts.map +1 -0
  158. package/dist/bridges/evaluator-inputs.js +75 -0
  159. package/dist/bridges/evaluator-inputs.js.map +1 -0
  160. package/dist/bridges/evaluators.d.ts +46 -0
  161. package/dist/bridges/evaluators.d.ts.map +1 -1
  162. package/dist/bridges/evaluators.js +57 -16
  163. package/dist/bridges/evaluators.js.map +1 -1
  164. package/dist/bridges/gravitational-lensing.d.ts +1 -1
  165. package/dist/bridges/gravitational-lensing.js +1 -1
  166. package/dist/bridges/index.d.ts +3 -2
  167. package/dist/bridges/index.d.ts.map +1 -1
  168. package/dist/bridges/index.js +15 -14
  169. package/dist/bridges/index.js.map +1 -1
  170. package/dist/bridges/observations/types.d.ts +110 -2
  171. package/dist/bridges/observations/types.d.ts.map +1 -1
  172. package/dist/bridges/observations/types.js +29 -0
  173. package/dist/bridges/observations/types.js.map +1 -1
  174. package/dist/bridges/perihelion-precession.d.ts +1 -1
  175. package/dist/bridges/perihelion-precession.js +1 -1
  176. package/dist/bridges/tensor-index.d.ts +39 -0
  177. package/dist/bridges/tensor-index.d.ts.map +1 -0
  178. package/dist/bridges/tensor-index.js +66 -0
  179. package/dist/bridges/tensor-index.js.map +1 -0
  180. package/dist/canonical/canonical-equation.d.ts +1 -1
  181. package/dist/canonical/canonical-equation.d.ts.map +1 -1
  182. package/dist/canonical/entries/atomic.d.ts.map +1 -1
  183. package/dist/canonical/entries/atomic.js +32 -10
  184. package/dist/canonical/entries/atomic.js.map +1 -1
  185. package/dist/canonical/entries/dimensional-classics.js +2 -2
  186. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  187. package/dist/canonical/entries/mechanics.d.ts.map +1 -1
  188. package/dist/canonical/entries/mechanics.js +10 -6
  189. package/dist/canonical/entries/mechanics.js.map +1 -1
  190. package/dist/canonical/entries/relativity.d.ts.map +1 -1
  191. package/dist/canonical/entries/relativity.js +41 -8
  192. package/dist/canonical/entries/relativity.js.map +1 -1
  193. package/dist/canonical/entries/thermo-nuclear-cosmo.js +5 -5
  194. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  195. package/dist/canonical/linkage.d.ts.map +1 -1
  196. package/dist/canonical/linkage.js +31 -28
  197. package/dist/canonical/linkage.js.map +1 -1
  198. package/dist/canonical/normal-form.d.ts +17 -0
  199. package/dist/canonical/normal-form.d.ts.map +1 -1
  200. package/dist/canonical/normal-form.js +21 -4
  201. package/dist/canonical/normal-form.js.map +1 -1
  202. package/dist/canonical/structural.d.ts +84 -0
  203. package/dist/canonical/structural.d.ts.map +1 -0
  204. package/dist/canonical/structural.js +107 -0
  205. package/dist/canonical/structural.js.map +1 -0
  206. package/dist/cases/brownian-sphere.d.ts +68 -0
  207. package/dist/cases/brownian-sphere.d.ts.map +1 -0
  208. package/dist/cases/brownian-sphere.js +353 -0
  209. package/dist/cases/brownian-sphere.js.map +1 -0
  210. package/dist/cases/damped-resonator.d.ts +23 -0
  211. package/dist/cases/damped-resonator.d.ts.map +1 -0
  212. package/dist/cases/damped-resonator.js +224 -0
  213. package/dist/cases/damped-resonator.js.map +1 -0
  214. package/dist/cases/index.d.ts +11 -0
  215. package/dist/cases/index.d.ts.map +1 -0
  216. package/dist/cases/index.js +29 -0
  217. package/dist/cases/index.js.map +1 -0
  218. package/dist/cases/kepler-rv.d.ts +13 -0
  219. package/dist/cases/kepler-rv.d.ts.map +1 -0
  220. package/dist/cases/kepler-rv.js +168 -0
  221. package/dist/cases/kepler-rv.js.map +1 -0
  222. package/dist/cases/lumped-cooling.d.ts +46 -0
  223. package/dist/cases/lumped-cooling.d.ts.map +1 -0
  224. package/dist/cases/lumped-cooling.js +261 -0
  225. package/dist/cases/lumped-cooling.js.map +1 -0
  226. package/dist/cases/quadrature.d.ts +14 -0
  227. package/dist/cases/quadrature.d.ts.map +1 -0
  228. package/dist/cases/quadrature.js +41 -0
  229. package/dist/cases/quadrature.js.map +1 -0
  230. package/dist/cases/resistor-noise.d.ts +14 -0
  231. package/dist/cases/resistor-noise.d.ts.map +1 -0
  232. package/dist/cases/resistor-noise.js +210 -0
  233. package/dist/cases/resistor-noise.js.map +1 -0
  234. package/dist/cases/skin-depth.d.ts +21 -0
  235. package/dist/cases/skin-depth.d.ts.map +1 -0
  236. package/dist/cases/skin-depth.js +174 -0
  237. package/dist/cases/skin-depth.js.map +1 -0
  238. package/dist/cases/types.d.ts +115 -0
  239. package/dist/cases/types.d.ts.map +1 -0
  240. package/dist/cases/types.js +20 -0
  241. package/dist/cases/types.js.map +1 -0
  242. package/dist/cli/commands/_atlas-map.d.ts +409 -0
  243. package/dist/cli/commands/_atlas-map.d.ts.map +1 -0
  244. package/dist/cli/commands/_atlas-map.js +1014 -0
  245. package/dist/cli/commands/_atlas-map.js.map +1 -0
  246. package/dist/cli/commands/_atlas-route.d.ts +111 -0
  247. package/dist/cli/commands/_atlas-route.d.ts.map +1 -0
  248. package/dist/cli/commands/_atlas-route.js +140 -0
  249. package/dist/cli/commands/_atlas-route.js.map +1 -0
  250. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  251. package/dist/cli/commands/_discovery-opts.js +10 -1
  252. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  253. package/dist/cli/commands/atlas.d.ts +20 -0
  254. package/dist/cli/commands/atlas.d.ts.map +1 -1
  255. package/dist/cli/commands/atlas.js +333 -19
  256. package/dist/cli/commands/atlas.js.map +1 -1
  257. package/dist/cli/commands/audit.d.ts.map +1 -1
  258. package/dist/cli/commands/audit.js +12 -3
  259. package/dist/cli/commands/audit.js.map +1 -1
  260. package/dist/cli/commands/axes.js +4 -4
  261. package/dist/cli/commands/candidates.d.ts.map +1 -1
  262. package/dist/cli/commands/candidates.js +3 -2
  263. package/dist/cli/commands/candidates.js.map +1 -1
  264. package/dist/cli/commands/canonical.d.ts.map +1 -1
  265. package/dist/cli/commands/canonical.js +39 -10
  266. package/dist/cli/commands/canonical.js.map +1 -1
  267. package/dist/cli/commands/confront.d.ts.map +1 -1
  268. package/dist/cli/commands/confront.js +210 -28
  269. package/dist/cli/commands/confront.js.map +1 -1
  270. package/dist/cli/commands/connectors.d.ts.map +1 -1
  271. package/dist/cli/commands/connectors.js +5 -4
  272. package/dist/cli/commands/connectors.js.map +1 -1
  273. package/dist/cli/commands/coverage.js +3 -3
  274. package/dist/cli/commands/derive.d.ts.map +1 -1
  275. package/dist/cli/commands/derive.js +22 -9
  276. package/dist/cli/commands/derive.js.map +1 -1
  277. package/dist/cli/commands/discover.d.ts.map +1 -1
  278. package/dist/cli/commands/discover.js +149 -32
  279. package/dist/cli/commands/discover.js.map +1 -1
  280. package/dist/cli/commands/eval.d.ts.map +1 -1
  281. package/dist/cli/commands/eval.js +87 -17
  282. package/dist/cli/commands/eval.js.map +1 -1
  283. package/dist/cli/commands/evaluate.d.ts +30 -0
  284. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  285. package/dist/cli/commands/evaluate.js +441 -25
  286. package/dist/cli/commands/evaluate.js.map +1 -1
  287. package/dist/cli/commands/explain.d.ts.map +1 -1
  288. package/dist/cli/commands/explain.js +38 -11
  289. package/dist/cli/commands/explain.js.map +1 -1
  290. package/dist/cli/commands/frontier.d.ts +3 -0
  291. package/dist/cli/commands/frontier.d.ts.map +1 -0
  292. package/dist/cli/commands/frontier.js +28 -0
  293. package/dist/cli/commands/frontier.js.map +1 -0
  294. package/dist/cli/commands/ground.d.ts.map +1 -1
  295. package/dist/cli/commands/ground.js +37 -12
  296. package/dist/cli/commands/ground.js.map +1 -1
  297. package/dist/cli/commands/index.d.ts +5 -0
  298. package/dist/cli/commands/index.d.ts.map +1 -1
  299. package/dist/cli/commands/index.js +5 -0
  300. package/dist/cli/commands/index.js.map +1 -1
  301. package/dist/cli/commands/map.d.ts +8 -0
  302. package/dist/cli/commands/map.d.ts.map +1 -1
  303. package/dist/cli/commands/map.js +385 -57
  304. package/dist/cli/commands/map.js.map +1 -1
  305. package/dist/cli/commands/metric.d.ts +3 -0
  306. package/dist/cli/commands/metric.d.ts.map +1 -0
  307. package/dist/cli/commands/metric.js +136 -0
  308. package/dist/cli/commands/metric.js.map +1 -0
  309. package/dist/cli/commands/path.d.ts +109 -1
  310. package/dist/cli/commands/path.d.ts.map +1 -1
  311. package/dist/cli/commands/path.js +1019 -109
  312. package/dist/cli/commands/path.js.map +1 -1
  313. package/dist/cli/commands/predict.d.ts.map +1 -1
  314. package/dist/cli/commands/predict.js +3 -2
  315. package/dist/cli/commands/predict.js.map +1 -1
  316. package/dist/cli/commands/priority.d.ts.map +1 -1
  317. package/dist/cli/commands/priority.js +3 -2
  318. package/dist/cli/commands/priority.js.map +1 -1
  319. package/dist/cli/commands/probe.d.ts +7 -0
  320. package/dist/cli/commands/probe.d.ts.map +1 -1
  321. package/dist/cli/commands/probe.js +234 -52
  322. package/dist/cli/commands/probe.js.map +1 -1
  323. package/dist/cli/commands/recover.d.ts.map +1 -1
  324. package/dist/cli/commands/recover.js +17 -6
  325. package/dist/cli/commands/recover.js.map +1 -1
  326. package/dist/cli/commands/regime.d.ts +1 -1
  327. package/dist/cli/commands/regime.d.ts.map +1 -1
  328. package/dist/cli/commands/regime.js +134 -33
  329. package/dist/cli/commands/regime.js.map +1 -1
  330. package/dist/cli/commands/retrieve.d.ts +3 -0
  331. package/dist/cli/commands/retrieve.d.ts.map +1 -0
  332. package/dist/cli/commands/retrieve.js +65 -0
  333. package/dist/cli/commands/retrieve.js.map +1 -0
  334. package/dist/cli/commands/search.d.ts +3 -0
  335. package/dist/cli/commands/search.d.ts.map +1 -0
  336. package/dist/cli/commands/search.js +70 -0
  337. package/dist/cli/commands/search.js.map +1 -0
  338. package/dist/cli/commands/symbolic.d.ts.map +1 -1
  339. package/dist/cli/commands/symbolic.js +107 -16
  340. package/dist/cli/commands/symbolic.js.map +1 -1
  341. package/dist/cli/commands/testplan.d.ts +3 -0
  342. package/dist/cli/commands/testplan.d.ts.map +1 -0
  343. package/dist/cli/commands/testplan.js +131 -0
  344. package/dist/cli/commands/testplan.js.map +1 -0
  345. package/dist/cli/conventions.d.ts +22 -0
  346. package/dist/cli/conventions.d.ts.map +1 -0
  347. package/dist/cli/conventions.js +48 -0
  348. package/dist/cli/conventions.js.map +1 -0
  349. package/dist/cli/euler-guard.d.ts +9 -0
  350. package/dist/cli/euler-guard.d.ts.map +1 -0
  351. package/dist/cli/euler-guard.js +11 -0
  352. package/dist/cli/euler-guard.js.map +1 -0
  353. package/dist/cli/eval-numbers.d.ts +26 -0
  354. package/dist/cli/eval-numbers.d.ts.map +1 -0
  355. package/dist/cli/eval-numbers.js +48 -0
  356. package/dist/cli/eval-numbers.js.map +1 -0
  357. package/dist/cli/expr-print.d.ts +25 -0
  358. package/dist/cli/expr-print.d.ts.map +1 -0
  359. package/dist/cli/expr-print.js +123 -0
  360. package/dist/cli/expr-print.js.map +1 -0
  361. package/dist/cli/graphs.d.ts +26 -0
  362. package/dist/cli/graphs.d.ts.map +1 -1
  363. package/dist/cli/graphs.js +19 -0
  364. package/dist/cli/graphs.js.map +1 -1
  365. package/dist/cli/main.d.ts +4 -10
  366. package/dist/cli/main.d.ts.map +1 -1
  367. package/dist/cli/main.js +370 -167
  368. package/dist/cli/main.js.map +1 -1
  369. package/dist/cli/map-evidence.d.ts +47 -0
  370. package/dist/cli/map-evidence.d.ts.map +1 -0
  371. package/dist/cli/map-evidence.js +53 -0
  372. package/dist/cli/map-evidence.js.map +1 -0
  373. package/dist/cli/output.d.ts +21 -1
  374. package/dist/cli/output.d.ts.map +1 -1
  375. package/dist/cli/output.js +5 -1
  376. package/dist/cli/output.js.map +1 -1
  377. package/dist/{composition → cli}/poster-source.d.ts +3 -2
  378. package/dist/cli/poster-source.d.ts.map +1 -0
  379. package/dist/{composition → cli}/poster-source.js +2 -1
  380. package/dist/cli/poster-source.js.map +1 -0
  381. package/dist/cli/record-reach.d.ts +44 -0
  382. package/dist/cli/record-reach.d.ts.map +1 -0
  383. package/dist/cli/record-reach.js +228 -0
  384. package/dist/cli/record-reach.js.map +1 -0
  385. package/dist/cli/record-tables.d.ts +38 -0
  386. package/dist/cli/record-tables.d.ts.map +1 -0
  387. package/dist/cli/record-tables.js +110 -0
  388. package/dist/cli/record-tables.js.map +1 -0
  389. package/dist/cli/record.d.ts +141 -0
  390. package/dist/cli/record.d.ts.map +1 -0
  391. package/dist/cli/record.js +612 -0
  392. package/dist/cli/record.js.map +1 -0
  393. package/dist/cli/search-index.d.ts +56 -0
  394. package/dist/cli/search-index.d.ts.map +1 -0
  395. package/dist/cli/search-index.js +190 -0
  396. package/dist/cli/search-index.js.map +1 -0
  397. package/dist/cli/statuses.d.ts +25 -0
  398. package/dist/cli/statuses.d.ts.map +1 -0
  399. package/dist/cli/statuses.js +276 -0
  400. package/dist/cli/statuses.js.map +1 -0
  401. package/dist/cli/version.d.ts +8 -0
  402. package/dist/cli/version.d.ts.map +1 -1
  403. package/dist/cli/version.js +32 -1
  404. package/dist/cli/version.js.map +1 -1
  405. package/dist/cli-api.d.ts +34 -16
  406. package/dist/cli-api.d.ts.map +1 -1
  407. package/dist/cli-api.js +32 -12
  408. package/dist/cli-api.js.map +1 -1
  409. package/dist/composition/audit-coverage.d.ts +70 -0
  410. package/dist/composition/audit-coverage.d.ts.map +1 -0
  411. package/dist/composition/audit-coverage.js +80 -0
  412. package/dist/composition/audit-coverage.js.map +1 -0
  413. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  414. package/dist/composition/bridge-analysis.js +2 -1
  415. package/dist/composition/bridge-analysis.js.map +1 -1
  416. package/dist/composition/buckingham-filter.d.ts +34 -0
  417. package/dist/composition/buckingham-filter.d.ts.map +1 -0
  418. package/dist/composition/buckingham-filter.js +64 -0
  419. package/dist/composition/buckingham-filter.js.map +1 -0
  420. package/dist/composition/canonical-compare.d.ts +29 -16
  421. package/dist/composition/canonical-compare.d.ts.map +1 -1
  422. package/dist/composition/canonical-compare.js +355 -59
  423. package/dist/composition/canonical-compare.js.map +1 -1
  424. package/dist/composition/canonical-graph.d.ts +2 -2
  425. package/dist/composition/canonical-graph.js +3 -3
  426. package/dist/composition/canonical-graph.js.map +1 -1
  427. package/dist/composition/canonical-prefactors.d.ts +24 -1
  428. package/dist/composition/canonical-prefactors.d.ts.map +1 -1
  429. package/dist/composition/canonical-prefactors.js +97 -1
  430. package/dist/composition/canonical-prefactors.js.map +1 -1
  431. package/dist/composition/catalog-graph.d.ts +4 -4
  432. package/dist/composition/catalog-graph.d.ts.map +1 -1
  433. package/dist/composition/catalog-graph.js +6 -4
  434. package/dist/composition/catalog-graph.js.map +1 -1
  435. package/dist/composition/chain-candidate.d.ts +43 -0
  436. package/dist/composition/chain-candidate.d.ts.map +1 -0
  437. package/dist/composition/chain-candidate.js +56 -0
  438. package/dist/composition/chain-candidate.js.map +1 -0
  439. package/dist/composition/chain-match.d.ts +19 -0
  440. package/dist/composition/chain-match.d.ts.map +1 -0
  441. package/dist/composition/chain-match.js +10 -0
  442. package/dist/composition/chain-match.js.map +1 -0
  443. package/dist/composition/chain-regime.d.ts +34 -0
  444. package/dist/composition/chain-regime.d.ts.map +1 -0
  445. package/dist/composition/chain-regime.js +89 -0
  446. package/dist/composition/chain-regime.js.map +1 -0
  447. package/dist/composition/compose-symbolic.js +1 -1
  448. package/dist/composition/compose-symbolic.js.map +1 -1
  449. package/dist/composition/compose.d.ts +11 -0
  450. package/dist/composition/compose.d.ts.map +1 -1
  451. package/dist/composition/compose.js +30 -10
  452. package/dist/composition/compose.js.map +1 -1
  453. package/dist/composition/composition-recovery.d.ts +47 -0
  454. package/dist/composition/composition-recovery.d.ts.map +1 -0
  455. package/dist/composition/composition-recovery.js +77 -0
  456. package/dist/composition/composition-recovery.js.map +1 -0
  457. package/dist/composition/consequence.d.ts +39 -0
  458. package/dist/composition/consequence.d.ts.map +1 -1
  459. package/dist/composition/consequence.js +37 -0
  460. package/dist/composition/consequence.js.map +1 -1
  461. package/dist/{bridges → composition}/descriptor.d.ts +6 -3
  462. package/dist/composition/descriptor.d.ts.map +1 -0
  463. package/dist/{bridges → composition}/descriptor.js +7 -4
  464. package/dist/composition/descriptor.js.map +1 -0
  465. package/dist/composition/discovery.d.ts +20 -0
  466. package/dist/composition/discovery.d.ts.map +1 -1
  467. package/dist/composition/discovery.js +27 -5
  468. package/dist/composition/discovery.js.map +1 -1
  469. package/dist/composition/edge.d.ts +1 -1
  470. package/dist/composition/edge.d.ts.map +1 -1
  471. package/dist/composition/edge.js.map +1 -1
  472. package/dist/composition/edges/_catalog-helpers.d.ts +4 -0
  473. package/dist/composition/edges/_catalog-helpers.d.ts.map +1 -1
  474. package/dist/composition/edges/_catalog-helpers.js +15 -0
  475. package/dist/composition/edges/_catalog-helpers.js.map +1 -1
  476. package/dist/composition/edges/calibration.d.ts +0 -9
  477. package/dist/composition/edges/calibration.d.ts.map +1 -1
  478. package/dist/composition/edges/calibration.js +85 -0
  479. package/dist/composition/edges/calibration.js.map +1 -1
  480. package/dist/composition/edges/catalog-condensed-matter.d.ts +0 -9
  481. package/dist/composition/edges/catalog-condensed-matter.d.ts.map +1 -1
  482. package/dist/composition/edges/catalog-condensed-matter.js +32 -1
  483. package/dist/composition/edges/catalog-condensed-matter.js.map +1 -1
  484. package/dist/composition/edges/catalog-fields.d.ts.map +1 -1
  485. package/dist/composition/edges/catalog-fields.js +2 -1
  486. package/dist/composition/edges/catalog-fields.js.map +1 -1
  487. package/dist/composition/edges/catalog-full.d.ts +4 -2
  488. package/dist/composition/edges/catalog-full.d.ts.map +1 -1
  489. package/dist/composition/edges/catalog-full.js +4 -2
  490. package/dist/composition/edges/catalog-full.js.map +1 -1
  491. package/dist/composition/edges/catalog-gravitation-cosmology.d.ts +0 -10
  492. package/dist/composition/edges/catalog-gravitation-cosmology.d.ts.map +1 -1
  493. package/dist/composition/edges/catalog-gravitation-cosmology.js +31 -1
  494. package/dist/composition/edges/catalog-gravitation-cosmology.js.map +1 -1
  495. package/dist/composition/edges/catalog-quantum.d.ts +0 -10
  496. package/dist/composition/edges/catalog-quantum.d.ts.map +1 -1
  497. package/dist/composition/edges/catalog-quantum.js +53 -17
  498. package/dist/composition/edges/catalog-quantum.js.map +1 -1
  499. package/dist/composition/edges/catalog-tranche.d.ts +0 -15
  500. package/dist/composition/edges/catalog-tranche.d.ts.map +1 -1
  501. package/dist/composition/edges/catalog-tranche.js +70 -16
  502. package/dist/composition/edges/catalog-tranche.js.map +1 -1
  503. package/dist/composition/edges/proved-seeds.d.ts +39 -0
  504. package/dist/composition/edges/proved-seeds.d.ts.map +1 -0
  505. package/dist/composition/edges/proved-seeds.js +197 -0
  506. package/dist/composition/edges/proved-seeds.js.map +1 -0
  507. package/dist/composition/enumerate.d.ts +20 -0
  508. package/dist/composition/enumerate.d.ts.map +1 -1
  509. package/dist/composition/enumerate.js +23 -0
  510. package/dist/composition/enumerate.js.map +1 -1
  511. package/dist/composition/expr-eval.d.ts +5 -4
  512. package/dist/composition/expr-eval.d.ts.map +1 -1
  513. package/dist/composition/expr-eval.js +40 -6
  514. package/dist/composition/expr-eval.js.map +1 -1
  515. package/dist/composition/expr-simplify.js +1 -1
  516. package/dist/composition/expr-simplify.js.map +1 -1
  517. package/dist/composition/expr-subst.d.ts +2 -1
  518. package/dist/composition/expr-subst.d.ts.map +1 -1
  519. package/dist/composition/expr-subst.js +9 -2
  520. package/dist/composition/expr-subst.js.map +1 -1
  521. package/dist/composition/frontier-account.d.ts +78 -0
  522. package/dist/composition/frontier-account.d.ts.map +1 -0
  523. package/dist/composition/frontier-account.js +127 -0
  524. package/dist/composition/frontier-account.js.map +1 -0
  525. package/dist/composition/graph-viz.d.ts +7 -22
  526. package/dist/composition/graph-viz.d.ts.map +1 -1
  527. package/dist/composition/graph-viz.js +4 -27
  528. package/dist/composition/graph-viz.js.map +1 -1
  529. package/dist/composition/grounding.d.ts +49 -0
  530. package/dist/composition/grounding.d.ts.map +1 -1
  531. package/dist/composition/grounding.js +38 -0
  532. package/dist/composition/grounding.js.map +1 -1
  533. package/dist/composition/index.d.ts +0 -2
  534. package/dist/composition/index.d.ts.map +1 -1
  535. package/dist/composition/index.js +1 -1
  536. package/dist/composition/index.js.map +1 -1
  537. package/dist/composition/not-composable-seeds.d.ts +30 -0
  538. package/dist/composition/not-composable-seeds.d.ts.map +1 -0
  539. package/dist/composition/not-composable-seeds.js +90 -0
  540. package/dist/composition/not-composable-seeds.js.map +1 -0
  541. package/dist/composition/probe/expression-gaps.d.ts +27 -0
  542. package/dist/composition/probe/expression-gaps.d.ts.map +1 -0
  543. package/dist/composition/probe/expression-gaps.js +47 -0
  544. package/dist/composition/probe/expression-gaps.js.map +1 -0
  545. package/dist/composition/probe/frontier.d.ts +2 -1
  546. package/dist/composition/probe/frontier.d.ts.map +1 -1
  547. package/dist/composition/probe/frontier.js +3 -2
  548. package/dist/composition/probe/frontier.js.map +1 -1
  549. package/dist/composition/probe/index.d.ts +4 -1
  550. package/dist/composition/probe/index.d.ts.map +1 -1
  551. package/dist/composition/probe/index.js +3 -1
  552. package/dist/composition/probe/index.js.map +1 -1
  553. package/dist/composition/probe/pipeline.d.ts +2 -0
  554. package/dist/composition/probe/pipeline.d.ts.map +1 -1
  555. package/dist/composition/probe/pipeline.js +6 -2
  556. package/dist/composition/probe/pipeline.js.map +1 -1
  557. package/dist/composition/probe/problem.d.ts +7 -0
  558. package/dist/composition/probe/problem.d.ts.map +1 -1
  559. package/dist/composition/probe/problem.js +15 -5
  560. package/dist/composition/probe/problem.js.map +1 -1
  561. package/dist/composition/probe/search-budget.d.ts.map +1 -1
  562. package/dist/composition/probe/search-budget.js +6 -2
  563. package/dist/composition/probe/search-budget.js.map +1 -1
  564. package/dist/composition/probe/study.d.ts +340 -0
  565. package/dist/composition/probe/study.d.ts.map +1 -0
  566. package/dist/composition/probe/study.js +1519 -0
  567. package/dist/composition/probe/study.js.map +1 -0
  568. package/dist/composition/proposed-bridges.js +1 -1
  569. package/dist/composition/proposed-bridges.js.map +1 -1
  570. package/dist/composition/quantities/_dims.d.ts +6 -0
  571. package/dist/composition/quantities/_dims.d.ts.map +1 -1
  572. package/dist/composition/quantities/_dims.js +6 -0
  573. package/dist/composition/quantities/_dims.js.map +1 -1
  574. package/dist/composition/quantities/condensed-matter.d.ts +16 -0
  575. package/dist/composition/quantities/condensed-matter.d.ts.map +1 -1
  576. package/dist/composition/quantities/condensed-matter.js +43 -2
  577. package/dist/composition/quantities/condensed-matter.js.map +1 -1
  578. package/dist/composition/quantities/fields.d.ts +10 -0
  579. package/dist/composition/quantities/fields.d.ts.map +1 -1
  580. package/dist/composition/quantities/fields.js +37 -2
  581. package/dist/composition/quantities/fields.js.map +1 -1
  582. package/dist/composition/quantities/gravitation-cosmology.d.ts +4 -0
  583. package/dist/composition/quantities/gravitation-cosmology.d.ts.map +1 -1
  584. package/dist/composition/quantities/gravitation-cosmology.js +14 -0
  585. package/dist/composition/quantities/gravitation-cosmology.js.map +1 -1
  586. package/dist/composition/quantities/quantum.d.ts +2 -0
  587. package/dist/composition/quantities/quantum.d.ts.map +1 -1
  588. package/dist/composition/quantities/quantum.js +7 -0
  589. package/dist/composition/quantities/quantum.js.map +1 -1
  590. package/dist/composition/quantities.d.ts +4 -16
  591. package/dist/composition/quantities.d.ts.map +1 -1
  592. package/dist/composition/quantities.js +4 -16
  593. package/dist/composition/quantities.js.map +1 -1
  594. package/dist/composition/retrodiction.d.ts.map +1 -1
  595. package/dist/composition/retrodiction.js +6 -2
  596. package/dist/composition/retrodiction.js.map +1 -1
  597. package/dist/composition/uncertainty.d.ts +1 -1
  598. package/dist/composition/uncertainty.d.ts.map +1 -1
  599. package/dist/composition/user-equation.d.ts +79 -8
  600. package/dist/composition/user-equation.d.ts.map +1 -1
  601. package/dist/composition/user-equation.js +224 -32
  602. package/dist/composition/user-equation.js.map +1 -1
  603. package/dist/core/constants.d.ts +17 -5
  604. package/dist/core/constants.d.ts.map +1 -1
  605. package/dist/core/constants.js +17 -5
  606. package/dist/core/constants.js.map +1 -1
  607. package/dist/core/types.d.ts +1 -1
  608. package/dist/core/types.d.ts.map +1 -1
  609. package/dist/core/types.js +2 -1
  610. package/dist/core/types.js.map +1 -1
  611. package/dist/dimensional/curvature.d.ts +7 -56
  612. package/dist/dimensional/curvature.d.ts.map +1 -1
  613. package/dist/dimensional/curvature.js +7 -76
  614. package/dist/dimensional/curvature.js.map +1 -1
  615. package/dist/dimensional/dimension-spec.d.ts +7 -1
  616. package/dist/dimensional/dimension-spec.d.ts.map +1 -1
  617. package/dist/dimensional/dimension-spec.js +131 -3
  618. package/dist/dimensional/dimension-spec.js.map +1 -1
  619. package/dist/dimensional/formula-names.d.ts +30 -0
  620. package/dist/dimensional/formula-names.d.ts.map +1 -0
  621. package/dist/dimensional/formula-names.js +37 -0
  622. package/dist/dimensional/formula-names.js.map +1 -0
  623. package/dist/dimensional/natural-units.d.ts +33 -0
  624. package/dist/dimensional/natural-units.d.ts.map +1 -0
  625. package/dist/dimensional/natural-units.js +58 -0
  626. package/dist/dimensional/natural-units.js.map +1 -0
  627. package/dist/{composition → dimensional}/symbolic-constants.d.ts +21 -2
  628. package/dist/dimensional/symbolic-constants.d.ts.map +1 -0
  629. package/dist/dimensional/symbolic-constants.js +122 -0
  630. package/dist/dimensional/symbolic-constants.js.map +1 -0
  631. package/dist/dimensional/unit-convention.d.ts +30 -0
  632. package/dist/dimensional/unit-convention.d.ts.map +1 -0
  633. package/dist/dimensional/unit-convention.js +60 -0
  634. package/dist/dimensional/unit-convention.js.map +1 -0
  635. package/dist/dimensional/units.d.ts +43 -0
  636. package/dist/dimensional/units.d.ts.map +1 -0
  637. package/dist/dimensional/units.js +197 -0
  638. package/dist/dimensional/units.js.map +1 -0
  639. package/dist/index.d.ts +11 -5
  640. package/dist/index.d.ts.map +1 -1
  641. package/dist/index.js +10 -3
  642. package/dist/index.js.map +1 -1
  643. package/dist/numerical/bianchi-residual.d.ts +55 -0
  644. package/dist/numerical/bianchi-residual.d.ts.map +1 -0
  645. package/dist/numerical/bianchi-residual.js +79 -0
  646. package/dist/numerical/bianchi-residual.js.map +1 -0
  647. package/dist/numerical/binding-value.d.ts +67 -0
  648. package/dist/numerical/binding-value.d.ts.map +1 -0
  649. package/dist/numerical/binding-value.js +349 -0
  650. package/dist/numerical/binding-value.js.map +1 -0
  651. package/dist/numerical/connection-lowering-helpers.d.ts.map +1 -1
  652. package/dist/numerical/connection-lowering-helpers.js +13 -26
  653. package/dist/numerical/connection-lowering-helpers.js.map +1 -1
  654. package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
  655. package/dist/numerical/curvature-lowering-helpers.js +9 -0
  656. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  657. package/dist/numerical/float64-engine.d.ts.map +1 -1
  658. package/dist/numerical/float64-engine.js +23 -16
  659. package/dist/numerical/float64-engine.js.map +1 -1
  660. package/dist/numerical/formula-dimension.d.ts +14 -0
  661. package/dist/numerical/formula-dimension.d.ts.map +1 -1
  662. package/dist/numerical/formula-dimension.js +56 -9
  663. package/dist/numerical/formula-dimension.js.map +1 -1
  664. package/dist/numerical/formula-mathts.d.ts.map +1 -1
  665. package/dist/numerical/formula-mathts.js +75 -6
  666. package/dist/numerical/formula-mathts.js.map +1 -1
  667. package/dist/numerical/formula.d.ts +33 -0
  668. package/dist/numerical/formula.d.ts.map +1 -1
  669. package/dist/numerical/formula.js +75 -6
  670. package/dist/numerical/formula.js.map +1 -1
  671. package/dist/numerical/spacetime-metrics.d.ts +243 -0
  672. package/dist/numerical/spacetime-metrics.d.ts.map +1 -0
  673. package/dist/numerical/spacetime-metrics.js +1056 -0
  674. package/dist/numerical/spacetime-metrics.js.map +1 -0
  675. package/dist/relations/category.d.ts +38 -0
  676. package/dist/relations/category.d.ts.map +1 -0
  677. package/dist/relations/category.js +23 -0
  678. package/dist/relations/category.js.map +1 -0
  679. package/dist/relations/composition-table.d.ts +61 -0
  680. package/dist/relations/composition-table.d.ts.map +1 -0
  681. package/dist/relations/composition-table.js +140 -0
  682. package/dist/relations/composition-table.js.map +1 -0
  683. package/dist/relations/conventions.d.ts +63 -0
  684. package/dist/relations/conventions.d.ts.map +1 -0
  685. package/dist/relations/conventions.js +93 -0
  686. package/dist/relations/conventions.js.map +1 -0
  687. package/dist/relations/regime.d.ts +159 -0
  688. package/dist/relations/regime.d.ts.map +1 -0
  689. package/dist/relations/regime.js +304 -0
  690. package/dist/relations/regime.js.map +1 -0
  691. package/dist/relations/types.d.ts +257 -0
  692. package/dist/relations/types.d.ts.map +1 -0
  693. package/dist/relations/types.js +35 -0
  694. package/dist/relations/types.js.map +1 -0
  695. package/package.json +166 -163
  696. package/dist/bridges/descriptor.d.ts.map +0 -1
  697. package/dist/bridges/descriptor.js.map +0 -1
  698. package/dist/composition/poster-source.d.ts.map +0 -1
  699. package/dist/composition/poster-source.js.map +0 -1
  700. package/dist/composition/symbolic-constants.d.ts.map +0 -1
  701. package/dist/composition/symbolic-constants.js +0 -65
  702. package/dist/composition/symbolic-constants.js.map +0 -1
@@ -14,10 +14,14 @@
14
14
  */
15
15
  import { writeFileSync } from 'node:fs';
16
16
  import { registerCommand } from '../command.js';
17
- import { resolveGraph } from '../graphs.js';
17
+ import { resolveGraph, coreAnchor, coreLine, groundTruthAnchor, groundTruthLine } from '../graphs.js';
18
18
  import { emitJson } from '../output.js';
19
19
  import { UsageError, CliError, EXIT_CHECK_FAILED } from '../errors.js';
20
20
  import { parseDiscoveryOpts } from './_discovery-opts.js';
21
+ import * as atlasMap from './_atlas-map.js';
22
+ import { canonicalCheckFailed, conventionLines } from '../conventions.js';
23
+ import { naturalConstantOverrides } from '../../dimensional/natural-units.js';
24
+ import { withCatalogEvidence } from '../map-evidence.js';
21
25
  const FLAGS = [
22
26
  { name: '--source', valueStyle: 'attached' },
23
27
  { name: '--format', valueStyle: 'attached' },
@@ -27,49 +31,143 @@ const FLAGS = [
27
31
  { name: '--proposed', valueStyle: 'none' },
28
32
  { name: '--relation', valueStyle: 'attached' },
29
33
  { name: '--evidence', valueStyle: 'attached' },
34
+ { name: '--around', valueStyle: 'either' },
35
+ { name: '--depth', valueStyle: 'attached' },
36
+ { name: '--route', valueStyle: 'either' },
37
+ { name: '--all-routes', valueStyle: 'none' },
38
+ { name: '--max-routes', valueStyle: 'attached' },
39
+ { name: '--family', valueStyle: 'either' },
40
+ { name: '--observable', valueStyle: 'either' },
41
+ { name: '--stored', valueStyle: 'none' },
42
+ { name: '--run', valueStyle: 'none' },
30
43
  // optionalValue: a bare trailing --equation stores '' so the empty-check in
31
44
  // run() owns the diagnostic (old-CLI fidelity: bin/upt.mjs did `a[i+1] ?? ''`
32
45
  // and let mapCmd emit `upt: --equation requires "TARGET = EXPR"`, exit 2).
33
46
  { name: '--equation', valueStyle: 'either', optionalValue: true },
47
+ { name: '--equation-only', valueStyle: 'none' },
48
+ { name: '--verbose', valueStyle: 'none' },
49
+ { name: '--bind-short', valueStyle: 'none' },
50
+ { name: '--natural', valueStyle: 'none' },
51
+ { name: '--geometrized', valueStyle: 'none' },
34
52
  { name: '--json', valueStyle: 'none' },
35
53
  ];
36
- const HELP = `upt map [--source=catalog|canonical|both|poster] [--format=text|mermaid|dot|svg]
37
- [--proposed] [--out=PATH] [--equation "TARGET = EXPR"]
38
- Map how the equations LINK: connected components (clusters) of the
39
- graph by shared quantities, the anchored core, the link hubs, and
40
- the isolated tail.
41
- --source defaults to 'both' (catalog + canonical) — a pure
42
- connectivity question gets the honest, all-known-physics answer by
43
- default; --source=catalog shows the bridge-catalog view alone.
44
- --source=poster draws the ATLAS PHASE 3 POSTER INDEX instead of the
45
- bridge graph: nodes are STATEMENTS (including the hidden supporting
46
- nodes — action principle, Noether, the full Maxwell system, the
47
- Lorentz group, the central limit theorem) and boxes are DERIVATIONS
48
- (premises in, conclusion out). Associations are drawn DASHED because
49
- they assert no relation at all. It also reports any premise naming a
50
- statement the registry does not define, and says so out loud when the
51
- index is not registered in this build rather than printing an empty
52
- map as an answer.
53
- --format=mermaid|dot|svg emits the VISUAL map (quantities = nodes,
54
- equations = junctions colored by status, one subgraph per component).
55
- text (default) is the unchanged linkage printout. svg renders the dot
56
- layout via the optional @viz-js/viz peer (npm i @viz-js/viz; or pipe
57
- dot through "dot -Tsvg"). --proposed overlays the unadjudicated
58
- identity-consequence relations (gray dashed). --out writes to a file
59
- (default stdout).
60
- --equation "TARGET = EXPR" injects YOUR OWN equation as a violet 'user'
61
- node and reports where it lands (which cluster / shared quantities), with
62
- a "did you mean?" hint for names that miss the catalog vocabulary. Use
63
- underscores for multi-word quantities (photon_energy -> photon-energy).
64
- --relation=TYPE keeps only edges whose recorded Atlas relation is that
65
- type; --evidence=TAG keeps only edges whose evidence set, DERIVED from
66
- the catalog row at read time, contains that tag.
67
- ⚠ Filtering changes what a missing overlay means: unfiltered, an edge
68
- with no overlay is KEPT; filtered, it is DROPPED, because nothing shows
69
- it satisfies the filter. Those drops are counted and printed separately
70
- from the edges that simply did not match — an unaudited graph must not
71
- render as a complete answer.
72
- e.g. upt map --relation=derivation --source=both`;
54
+ const HELP = `upt map [--source=catalog|canonical|both|poster] [--format=text|mermaid|dot|svg]
55
+ [--proposed [--anchor=k=v,...] [--max-orders=N]] [--out=PATH]
56
+ [--equation "TARGET = EXPR" [--equation-only] [--verbose] [--bind-short]
57
+ [--natural] [--geometrized]] [--around=QUANTITY [--depth=N]]
58
+ [--relation=TYPE] [--evidence=TAG] [--route=FROM,TO [--all-routes
59
+ [--max-routes=N]]] [--family=NAME] [--observable=NAME] [--stored | --run]
60
+ Map how the equations LINK: connected components (clusters) of the
61
+ graph by shared quantities, the anchored core, the link hubs, and
62
+ the isolated tail.
63
+ --source defaults to 'both' (catalog + canonical) — a pure
64
+ connectivity question gets the honest, all-known-physics answer by
65
+ default; --source=catalog shows the bridge-catalog view alone.
66
+ --source=poster draws the ATLAS PHASE 3 POSTER INDEX instead of the
67
+ bridge graph: nodes are STATEMENTS (including the hidden supporting
68
+ nodes — action principle, Noether, the full Maxwell system, the
69
+ Lorentz group, the central limit theorem) and boxes are DERIVATIONS
70
+ (premises in, conclusion out). Associations are drawn DASHED because
71
+ they assert no relation at all. It also reports any premise naming a
72
+ statement the registry does not define, and says so out loud when the
73
+ index is not registered in this build rather than printing an empty
74
+ map as an answer.
75
+ --format=mermaid|dot|svg emits the VISUAL map (quantities = nodes,
76
+ equations = junctions colored by status, one subgraph per component).
77
+ text (default) is the unchanged linkage printout. svg renders the dot
78
+ layout via the optional @viz-js/viz peer (npm i @viz-js/viz; or pipe
79
+ dot through "dot -Tsvg"). --proposed overlays the unadjudicated
80
+ identity-consequence relations (gray dashed); --anchor and --max-orders
81
+ tune the discovery funnel that derives them, as in \`upt discover\`.
82
+ --out writes to a file (default stdout).
83
+ --equation "TARGET = EXPR" injects YOUR OWN equation as a violet 'user'
84
+ node, dimensionally checks it, compares with the canonical registry, and
85
+ reports nearest equations by shared-quantity overlap (not a full edge
86
+ dump). Multi-word names may use underscores or catalog hyphens
87
+ (planck_length / planck-length). Unknown names get a "did you mean?",
88
+ and a registered constant of the inferred dimension (sigma → sigma_sb);
89
+ a one-letter catalog name (a, r, …) is reported and not bound; --bind-short
90
+ binds it. The alias T → temperature still binds.
91
+ An all-constant right-hand side (the Planck length) is compared at the
92
+ SI constant values when its target is a catalog quantity.
93
+ With --equation, the default is the verdict only. --verbose prints the
94
+ linkage map after it. --equation-only is the same verdict and errors
95
+ when --equation is missing (with --json: no "linkage" field).
96
+ A bare e in the formula is the elementary charge. E is energy.
97
+ Euler's number is exp(x), for example exp(1). The name euler is refused.
98
+ --natural sets ħ = c = 1 for a dimension difference that is a power of
99
+ those constants; --geometrized also allows powers of G. The SI default
100
+ still refuses rest_energy = mass.
101
+ --relation=TYPE keeps only edges whose recorded Atlas relation is that
102
+ type; --evidence=TAG keeps only edges whose evidence set, DERIVED from
103
+ the catalog row at read time, contains that tag.
104
+ ⚠ Filtering changes what a missing overlay means: unfiltered, an edge
105
+ with no overlay is KEPT; filtered, it is DROPPED, because nothing shows
106
+ it satisfies the filter. Those drops are counted and printed separately
107
+ from the edges that simply did not match — an unaudited graph must not
108
+ render as a complete answer.
109
+ --around=QUANTITY [--depth=N] keeps only the edges within N
110
+ shared-quantity hops of QUANTITY (default 1: the edges that use it),
111
+ in every output form, and prints how many of the source's edges it
112
+ kept: the others are omitted from the view, not absent from the graph.
113
+ --route=FROM,TO and --family=NAME map the ATLAS instead: models and
114
+ the recorded bridges between them, not shared quantities. --route
115
+ shows the route \`upt path\` reports, each bridge's relation,
116
+ assumptions, regime, bound and derived evidence, the composition
117
+ step by step (and where the table yields no composite claim), and
118
+ the equations each model records. --family shows one family's
119
+ models, its bridges, the bridges from other families that touch it,
120
+ and its rejections; --relation/--evidence filter its bridges, and a
121
+ bridge whose tag depends on witness results is counted as undecided,
122
+ not as a mismatch. A model's equations are only those its
123
+ canonicalRefs record; nothing is inferred from shared quantities.
124
+ --route=FROM,TO --all-routes lists every simple route (no model
125
+ visited twice), shortest first, each with its composition and route
126
+ claim, and counts the claims; --max-routes=N (default 20, at most
127
+ 1000) bounds the list, and a list cut short says so and says up to
128
+ which bridge count it is complete.
129
+ --observable=NAME maps the bridges whose RECORDED preserves text, or
130
+ declared bound translation, names that observable (a whole-word text
131
+ match, nothing inferred), lists apart those recording it as NOT
132
+ preserved, and counts the bridges that record nothing about it;
133
+ --relation/--evidence filter it as they filter a family.
134
+ --stored derives evidence from the committed witness results
135
+ (data/atlas/witness-results.json; a repository file, not shipped),
136
+ labelled with the last commit that touched it; --run runs the shown
137
+ bridges' in-process registered witnesses now (exit 3 if any is
138
+ refuted). Either resolves a tag once its witnesses have results; a
139
+ witness with no result leaves it undecided, and checked, refuted and
140
+ unresolved are counted apart.
141
+ Every atlas view states how many of the atlas's models and bridges it
142
+ shows, in text, --json and --format=mermaid|dot|svg.
143
+ e.g. upt map --relation=derivation --source=both
144
+ upt map --around=temperature --depth=2 --source=catalog
145
+ upt map --route=model-pendulum,model-lc
146
+ upt map --route=model-string,model-dalembert --all-routes --stored
147
+ upt map --family=oscillators --evidence=formally-proved
148
+ upt map --observable=frequency --run`;
149
+ /**
150
+ * The edges within `depth` shared-quantity hops of `quantity`: hop 1 is every
151
+ * edge that has it as a source or target, and each further hop adds the edges
152
+ * sharing a quantity with one already kept.
153
+ * @internal
154
+ */
155
+ export function neighbourhood(graph, quantity, depth) {
156
+ const names = (e) => [...e.sources.map((q) => q.name), e.target.name];
157
+ const reached = new Set([quantity]);
158
+ const kept = new Set();
159
+ for (let hop = 0; hop < depth; hop++) {
160
+ const frontier = graph.filter((e) => !kept.has(e) && names(e).some((n) => reached.has(n)));
161
+ if (frontier.length === 0)
162
+ break;
163
+ for (const e of frontier) {
164
+ kept.add(e);
165
+ for (const n of names(e))
166
+ reached.add(n);
167
+ }
168
+ }
169
+ return graph.filter((e) => kept.has(e));
170
+ }
73
171
  const RELATION_TYPES = [
74
172
  'derivation',
75
173
  'exact-equivalence',
@@ -88,6 +186,8 @@ const EVIDENCE_TAGS = [
88
186
  'symbolically-checked',
89
187
  'numerically-supported',
90
188
  'formally-proved',
189
+ 'formally-proved-property',
190
+ 'formally-proved-cross-check',
91
191
  'empirically-supported',
92
192
  'contradicted',
93
193
  'unresolved',
@@ -125,49 +225,71 @@ function proposedJunctions(api, graph, flags) {
125
225
  // the (testable) library analysis: parse + dimensional validation + "did you
126
226
  // mean?" hints. The library owns the physics (constants' dimensions, inference);
127
227
  // the CLI only formats.
128
- async function analyzeEquation(api, equation, graph) {
228
+ async function analyzeEquation(api, equation, graph, options) {
129
229
  const catalogDims = new Map();
130
230
  for (const e of graph) {
131
231
  for (const q of [...e.sources, e.target])
132
232
  catalogDims.set(q.name, q.dim);
133
233
  }
134
- const user = await api.analyzeUserEquation(equation, catalogDims);
234
+ const user = await api.analyzeUserEquation(equation, catalogDims, options);
135
235
  // Dimensions cannot see a prefactor: compare with the canonical equation the
136
236
  // user's one restates, when the registry holds one (persona finding L2).
137
- const comparisons = user.parseError ? [] : await api.compareUserEquation(equation, catalogDims);
237
+ const comparisons = user.parseError
238
+ ? []
239
+ : await api.compareUserEquation(equation, catalogDims, {
240
+ bindShortNames: options?.bindShortNames,
241
+ ...(options?.units === undefined ? {} : { constantOverrides: naturalConstantOverrides(options.units) }),
242
+ });
138
243
  return { user, comparisons };
139
244
  }
140
245
  // Print the dimensional verdict, where the equation landed, and any hints.
141
246
  // `out` is ctx.out (text mode → stdout) or ctx.err (visual → stderr).
142
247
  function printEquationReport(api, model, user, out, comparisons = []) {
143
248
  out('');
249
+ const placeholderNames = [
250
+ ...(user.placeholders ?? []),
251
+ ...(user.shortBindings ?? []).filter((b) => b.bound === false).map((b) => b.name),
252
+ ];
253
+ const unresolved = [...new Set([...(user.hints ?? []).map((h) => h.name), ...placeholderNames])];
144
254
  if (user.consistent === true) {
145
255
  out(` ✓ dimensionally consistent: ${api.format(user.rhsDimension)}`);
146
256
  }
147
- else if (user.consistent === false && (user.hints ?? []).length > 0) {
257
+ else if (user.consistent === false && unresolved.length > 0) {
148
258
  // An unknown name is checked as a dimensionless placeholder, so this mismatch is not a real
149
259
  // check and does not fail the command (exit 0). Say so on the line itself (persona finding N3).
150
- const names = user.hints.map((h) => `'${h.name}'`).join(', ');
260
+ const names = unresolved.map((n) => `'${n}'`).join(', ');
151
261
  out(` · UNKNOWN: RHS is ${api.format(user.rhsDimension)} but the target is ${api.format(user.targetDimension)}; ` +
152
- `the mismatch involves the unresolved placeholder${user.hints.length > 1 ? 's' : ''} ${names} ` +
262
+ `the mismatch involves the unresolved placeholder${unresolved.length > 1 ? 's' : ''} ${names} ` +
153
263
  `(taken as dimensionless), so it is not a failed check`);
154
264
  }
155
265
  else if (user.consistent === false) {
156
266
  out(` ⚠ dimensional MISMATCH: RHS is ${api.format(user.rhsDimension)} but the target is ${api.format(user.targetDimension)}`);
157
267
  }
268
+ else if (user.rhsDimension && (user.placeholders ?? []).length > 0) {
269
+ const names = user.placeholders.map((n) => `'${n}'`).join(', ');
270
+ out(` · UNKNOWN: RHS is ${api.format(user.rhsDimension)} only because ${names} ` +
271
+ `${user.placeholders.length === 1 ? 'was' : 'were'} taken as dimensionless. ` +
272
+ 'That is not the dimension of the formula, and the target is not a bound catalog name, so nothing was checked');
273
+ }
158
274
  else if (user.rhsDimension) {
159
275
  out(` · RHS dimension: ${api.format(user.rhsDimension)} (target not in the catalog, so no comparison)`);
160
276
  }
161
277
  for (const line of api.describeComparisons(comparisons))
162
278
  out(` ${line}`);
279
+ for (const line of conventionLines(comparisons.map((c) => c.id)))
280
+ out(` ${line}`);
281
+ if (user.naturalNote)
282
+ out(` ${user.naturalNote}`);
163
283
  const L = api.equationLanding(model, 'user-equation');
164
284
  if (L.isolated) {
165
285
  out(' ⚠ your equation is ISOLATED — it shares no quantity with this graph.');
166
286
  }
167
287
  else {
168
288
  out(` ● your equation joins ${L.anchored ? 'the ANCHORED cluster' : 'a cluster'} of ${L.clusterSize} via {${L.sharedQuantities.join(', ')}}`);
169
- if (L.connectedJunctionIds.length)
170
- out(` connects to: ${L.connectedJunctionIds.join(', ')}`);
289
+ // W3/I3: do not dump ~100 edge ids — that made shared length/temperature look
290
+ // like a physics claim. Summarise nearest equations by shared-quantity overlap.
291
+ for (const line of api.formatConnectedSummary(model, L))
292
+ out(line);
171
293
  }
172
294
  for (const h of user.hints ?? []) {
173
295
  if (!h.suggestions.length) {
@@ -179,10 +301,152 @@ function printEquationReport(api, model, user, out, comparisons = []) {
179
301
  else {
180
302
  out(` ⚠ '${h.name}' did not match a catalog quantity — did you mean: ${h.suggestions.join(', ')}?`);
181
303
  }
304
+ // Persona finding L5: `sigma` for the Stefan–Boltzmann constant `sigma_sb`.
305
+ if ((h.constants ?? []).length > 0) {
306
+ const list = h.constants.join(', ');
307
+ out(` '${h.name}' has the inferred dimension of the registered constant${h.constants.length > 1 ? 's' : ''} ${list}; ` +
308
+ 'write that name to use its SI value');
309
+ }
310
+ }
311
+ // Persona finding W6: a one-letter name binds to whatever the catalog calls that letter.
312
+ for (const b of user.shortBindings ?? []) {
313
+ const users = model.junctions
314
+ .filter((j) => j.id !== 'user-equation' && (j.target === b.quantity || j.sources.includes(b.quantity)))
315
+ .map((j) => j.id)
316
+ .sort();
317
+ const shown = users.slice(0, 3).join(', ') + (users.length > 3 ? `, +${users.length - 3} more` : '');
318
+ const used = users.length > 0 ? ` (used by ${shown})` : '';
319
+ if (b.bound === false) {
320
+ out(` · '${b.name}' matches the catalog quantity ${b.quantity} ${api.format(b.dim)}${used}, a one-letter name, and is not bound. ` +
321
+ 'Pass --bind-short to bind it, or write the full name you meant');
322
+ }
323
+ else {
324
+ out(` · '${b.name}' is bound to the catalog quantity ${b.quantity} ${api.format(b.dim)}, a one-letter name` +
325
+ `${used}; if you meant another quantity, write its full name`);
326
+ }
182
327
  }
183
328
  }
329
+ /** Flags that shape the equation graph, and so mean nothing on an atlas view. */
330
+ const GRAPH_ONLY_FLAGS = ['source', 'around', 'depth', 'equation', 'equation-only', 'proposed', 'max-orders', 'anchor'];
331
+ /** Flags that only an atlas view reads. */
332
+ const ATLAS_ONLY_FLAGS = ['all-routes', 'max-routes', 'stored', 'run'];
333
+ async function runAtlasView(ctx, route, family, observable) {
334
+ const { args, api, err, write } = ctx;
335
+ const chosen = [route !== undefined, family !== undefined, observable !== undefined].filter(Boolean).length;
336
+ if (chosen > 1)
337
+ throw new CliError('upt map: pick one atlas view: --route, --family or --observable');
338
+ const view = route !== undefined ? '--route' : family !== undefined ? '--family' : '--observable';
339
+ const stray = GRAPH_ONLY_FLAGS.filter((f) => args.flags.has(f));
340
+ if (stray.length > 0) {
341
+ throw new CliError(`upt map: ${view} maps the atlas, not the equation graph; ${stray.map((f) => `--${f}`).join(', ')} do${stray.length === 1 ? 'es' : ''} not apply`);
342
+ }
343
+ const relation = parseFilter(lastValue(args.flags, 'relation'), RELATION_TYPES, '--relation');
344
+ const evidence = parseFilter(lastValue(args.flags, 'evidence'), EVIDENCE_TAGS, '--evidence');
345
+ if (route !== undefined && (relation !== undefined || evidence !== undefined)) {
346
+ throw new CliError('upt map: a route is composed whole, so --relation/--evidence do not filter it; filter a family view instead (--family=NAME)');
347
+ }
348
+ const allRoutes = args.flags.has('all-routes');
349
+ if (allRoutes && route === undefined)
350
+ throw new CliError('upt map: --all-routes needs --route=FROM,TO');
351
+ const maxRaw = lastValue(args.flags, 'max-routes');
352
+ if (maxRaw !== undefined && !allRoutes)
353
+ throw new CliError('upt map: --max-routes needs --all-routes');
354
+ const maxRoutes = maxRaw === undefined ? atlasMap.DEFAULT_MAX_ROUTES : Number(maxRaw);
355
+ if (!Number.isInteger(maxRoutes) || maxRoutes < 1 || maxRoutes > atlasMap.MAX_ROUTES_CEILING) {
356
+ throw new CliError(`upt map: --max-routes=${maxRaw} must be an integer from 1 to ${atlasMap.MAX_ROUTES_CEILING}`);
357
+ }
358
+ if (args.flags.has('stored') && args.flags.has('run')) {
359
+ throw new CliError('upt map: pick one witness-results source: --stored (the committed artifact) or --run (run now)');
360
+ }
361
+ const fmt = lastValue(args.flags, 'format') ?? 'text';
362
+ const isJson = args.flags.has('json');
363
+ if (isJson && fmt !== 'text')
364
+ throw new UsageError('upt: pick one output form: --json or --format');
365
+ if (!['text', 'mermaid', 'dot', 'svg'].includes(fmt)) {
366
+ throw new CliError(`upt: unknown --format='${fmt}' (expected: text | mermaid | dot | svg)`);
367
+ }
368
+ const filter = {
369
+ ...(relation !== undefined ? { relation } : {}),
370
+ ...(evidence !== undefined ? { evidence } : {}),
371
+ };
372
+ const endpoints = route === undefined ? null : atlasMap.parseRoute(route);
373
+ const build = (results) => endpoints !== null
374
+ ? allRoutes
375
+ ? atlasMap.buildRoutesView(api, ...endpoints, maxRoutes, results)
376
+ : atlasMap.buildRouteView(api, ...endpoints, results)
377
+ : family !== undefined
378
+ ? atlasMap.buildFamilyView(api, family, filter, results)
379
+ : atlasMap.buildObservableView(api, observable, filter, results);
380
+ let results = null;
381
+ if (args.flags.has('stored'))
382
+ results = atlasMap.loadStoredResults();
383
+ else if (args.flags.has('run')) {
384
+ // Unfiltered first: a filter's verdict depends on the results, so every candidate bridge is run.
385
+ const candidates = endpoints === null
386
+ ? atlasMap.bridgeIdsOf(family !== undefined ? atlasMap.buildFamilyView(api, family, {}) : atlasMap.buildObservableView(api, observable, {}))
387
+ : atlasMap.bridgeIdsOf(build(null));
388
+ results = await atlasMap.runResults(api, candidates);
389
+ }
390
+ const v = build(results);
391
+ const exitCode = results?.mode === 'run' && results.rows.some((r) => r.status === 'refuted') ? EXIT_CHECK_FAILED : 0;
392
+ if (isJson) {
393
+ emitJson({ command: 'map', source: 'atlas', result: v }, write);
394
+ return exitCode;
395
+ }
396
+ if (fmt === 'text') {
397
+ const lines = v.view === 'route'
398
+ ? atlasMap.routeText(v)
399
+ : v.view === 'routes'
400
+ ? atlasMap.routesText(v)
401
+ : v.view === 'family'
402
+ ? atlasMap.familyText(v)
403
+ : atlasMap.observableText(v);
404
+ for (const line of lines)
405
+ ctx.out(line);
406
+ return exitCode;
407
+ }
408
+ let src;
409
+ if (fmt === 'svg') {
410
+ try {
411
+ src = await api.renderDotToSvg(atlasMap.toDot(v));
412
+ }
413
+ catch (e) {
414
+ throw new CliError(e && e.message ? e.message : String(e));
415
+ }
416
+ }
417
+ else {
418
+ src = fmt === 'mermaid' ? atlasMap.toMermaid(v) : atlasMap.toDot(v);
419
+ }
420
+ const path = lastValue(args.flags, 'out');
421
+ if (path !== undefined) {
422
+ if (!path)
423
+ throw new CliError('upt: --out= requires a non-empty PATH');
424
+ try {
425
+ writeFileSync(path, src);
426
+ }
427
+ catch (e) {
428
+ throw new CliError(e.message);
429
+ }
430
+ err(`upt: wrote ${fmt} to ${path}`);
431
+ }
432
+ else {
433
+ write(src);
434
+ }
435
+ err(`upt: ${atlasMap.viewLegend(v)}`);
436
+ return exitCode;
437
+ }
184
438
  async function run(ctx) {
185
439
  const { args, api, out, err, write } = ctx;
440
+ const route = lastValue(args.flags, 'route');
441
+ const family = lastValue(args.flags, 'family');
442
+ const observable = lastValue(args.flags, 'observable');
443
+ if (route !== undefined || family !== undefined || observable !== undefined)
444
+ return runAtlasView(ctx, route, family, observable);
445
+ const atlasOnly = ATLAS_ONLY_FLAGS.filter((f) => args.flags.has(f));
446
+ if (atlasOnly.length > 0) {
447
+ throw new CliError(`upt map: ${atlasOnly.map((f) => `--${f}`).join(', ')} appl${atlasOnly.length === 1 ? 'ies' : 'y'} to an atlas view ` +
448
+ '(--route, --family or --observable), not to the equation graph');
449
+ }
186
450
  // map asks a pure connectivity question, so it defaults to --source=both
187
451
  // (catalog + canonical) rather than graphs.ts's catalog fallback used by
188
452
  // the other --source commands (e.g. discover, which keeps catalog).
@@ -197,7 +461,32 @@ async function run(ctx) {
197
461
  const resolved = posterMode
198
462
  ? { graph: [], label: 'poster (Atlas Phase 3 index)', source: 'poster' }
199
463
  : resolveGraph(api, sourceFlags);
200
- const { graph: fullGraph, label, source } = resolved;
464
+ const { graph: wholeGraph, label, source } = resolved;
465
+ const around = lastValue(args.flags, 'around');
466
+ const depthRaw = lastValue(args.flags, 'depth');
467
+ if (depthRaw !== undefined && around === undefined)
468
+ throw new CliError('upt map: --depth needs --around');
469
+ let focus = null;
470
+ let fullGraph = wholeGraph;
471
+ if (around !== undefined) {
472
+ if (posterMode)
473
+ throw new CliError('upt map: --around focuses a quantity graph; the poster index has statements, not quantities');
474
+ const depth = depthRaw === undefined ? 1 : Number(depthRaw);
475
+ if (!Number.isInteger(depth) || depth < 1 || depth > 10)
476
+ throw new CliError(`upt map: --depth=${depthRaw} must be an integer from 1 to 10`);
477
+ const known = new Set(wholeGraph.flatMap((e) => [...e.sources.map((q) => q.name), e.target.name]));
478
+ const name = api.resolveToCatalogName(around, known);
479
+ if (name === null) {
480
+ const near = api.suggestQuantities(around, known);
481
+ throw new CliError(`upt map: '${around}' is not a quantity of the ${label} graph` + (near.length > 0 ? `; did you mean: ${near.join(', ')}?` : ''));
482
+ }
483
+ fullGraph = neighbourhood(wholeGraph, name, depth);
484
+ focus = { around: name, depth, kept: fullGraph.length, of: wholeGraph.length };
485
+ }
486
+ const focusLine = focus === null
487
+ ? null
488
+ : `focused: ${focus.kept} of ${focus.of} edges within ${focus.depth} hop(s) of '${focus.around}' [${label}]; ` +
489
+ 'the rest are omitted from this view, not absent from the graph';
201
490
  // The poster's own report line: what it contributed, or why it contributed
202
491
  // nothing (design note §6). Computed once; printed by every output form.
203
492
  const posterValidation = posterMode ? api.validatePoster(api.POSTER_GRAPH) : null;
@@ -208,10 +497,10 @@ async function run(ctx) {
208
497
  // value costs nothing and always exits 1.
209
498
  const relation = parseFilter(lastValue(args.flags, 'relation'), RELATION_TYPES, '--relation');
210
499
  const evidence = parseFilter(lastValue(args.flags, 'evidence'), EVIDENCE_TAGS, '--evidence');
211
- const filterOpts = {
500
+ const filterOpts = withCatalogEvidence({
212
501
  ...(relation !== undefined ? { relation } : {}),
213
502
  ...(evidence !== undefined ? { evidence } : {}),
214
- };
503
+ });
215
504
  // The TEXT and JSON paths filter the edge list here, because `linkageMap`
216
505
  // consumes edges. The VISUAL path hands `buildVizModel` the FULL graph with
217
506
  // the same options, so the model also judges the --proposed / --equation
@@ -219,6 +508,13 @@ async function run(ctx) {
219
508
  // One predicate, two callers: they cannot disagree about what a filter
220
509
  // selects, only about how much they were asked to count.
221
510
  const { kept: graph, stats: edgeStats } = api.filterEdges(fullGraph, filterOpts);
511
+ // Audit I3: what "anchored" means here, and the discovery ground truth when --proposed ran the funnel.
512
+ const anchor = posterMode
513
+ ? null
514
+ : {
515
+ core: coreAnchor(graph),
516
+ ...(args.flags.has('proposed') ? { groundTruth: groundTruthAnchor(api, parseDiscoveryOpts(args.flags)) } : {}),
517
+ };
222
518
  const edgeLegend = api.formatFilterLegend(edgeStats);
223
519
  const fmtValues = args.flags.get('format');
224
520
  const fmt = fmtValues && fmtValues.length > 0 ? fmtValues[fmtValues.length - 1] : 'text';
@@ -231,12 +527,27 @@ async function run(ctx) {
231
527
  let comparisons = [];
232
528
  const equationValues = args.flags.get('equation');
233
529
  const equation = equationValues && equationValues.length > 0 ? equationValues[equationValues.length - 1] : null;
530
+ // Persona finding L7: the verdict alone, without the linkage map after it.
531
+ const equationOnly = args.flags.has('equation-only');
532
+ if (equationOnly && equation == null)
533
+ throw new UsageError('upt map: --equation-only needs --equation "TARGET = EXPR"');
534
+ if (equationOnly && fmt !== 'text') {
535
+ throw new UsageError(`upt map: --equation-only prints the verdict as text or --json; it does not apply to --format=${fmt}`);
536
+ }
234
537
  if (equation != null) {
235
538
  if (!equation.trim()) {
236
539
  throw new UsageError('upt: --equation requires "TARGET = EXPR"');
237
540
  }
238
541
  try {
239
- ({ user, comparisons } = await analyzeEquation(api, equation, graph)); // throws UserEquationError on malformed structure
542
+ const units = args.flags.has('geometrized')
543
+ ? 'geometrized'
544
+ : args.flags.has('natural')
545
+ ? 'natural'
546
+ : undefined;
547
+ ({ user, comparisons } = await analyzeEquation(api, equation, graph, {
548
+ bindShortNames: args.flags.has('bind-short'),
549
+ ...(units === undefined ? {} : { units }),
550
+ })); // throws UserEquationError on malformed structure
240
551
  }
241
552
  catch (e) {
242
553
  throw new UsageError('upt: ' + (e && e.message ? e.message : String(e)));
@@ -250,15 +561,18 @@ async function run(ctx) {
250
561
  // mismatch counts only when every name resolved: an unknown name is checked
251
562
  // as a dimensionless placeholder, so its "mismatch" is not a real check.
252
563
  const exitCode = user !== null &&
253
- ((user.consistent === false && (user.hints ?? []).length === 0) ||
254
- comparisons.some((c) => c.kind === 'factor' || c.kind === 'form'))
564
+ ((user.consistent === false &&
565
+ (user.hints ?? []).length === 0 &&
566
+ (user.placeholders ?? []).length === 0 &&
567
+ !(user.shortBindings ?? []).some((b) => b.bound === false)) ||
568
+ canonicalCheckFailed(comparisons))
255
569
  ? EXIT_CHECK_FAILED
256
570
  : 0;
257
571
  const overlay = (extra) => [
258
572
  // Ranked from the UNFILTERED graph: the proposal set is a property of the
259
573
  // whole catalog, and the model then judges each overlay junction under the
260
574
  // same filter as every other junction.
261
- ...(args.flags.has('proposed') ? proposedJunctions(api, fullGraph, args.flags) : []),
575
+ ...(args.flags.has('proposed') ? proposedJunctions(api, wholeGraph, args.flags) : []),
262
576
  // The poster enters as an overlay for exactly the reason the design note
263
577
  // gives: an overlay is FILTERED, clustered and legended like every other
264
578
  // junction, so a poster source cannot quietly bypass --relation/--evidence.
@@ -282,16 +596,20 @@ async function run(ctx) {
282
596
  rhsDimension: user.rhsDimension,
283
597
  targetDimension: user.targetDimension,
284
598
  hints: user.hints,
599
+ shortBindings: user.shortBindings,
600
+ ...(user.placeholders.length === 0 ? {} : { placeholders: user.placeholders }),
285
601
  canonicalComparisons: comparisons,
286
602
  };
287
603
  }
288
604
  emitJson({
289
605
  command: 'map',
290
606
  source,
607
+ ...(anchor !== null ? { anchor } : {}),
291
608
  result: {
292
- linkage,
609
+ ...(equation != null && (equationOnly || !args.flags.has('verbose')) ? {} : { linkage }),
293
610
  ...(posterMode ? { poster: { note: posterNote, ...posterValidation } } : {}),
294
611
  ...(edgeLegend !== null ? { filter: edgeStats } : {}),
612
+ ...(focus !== null ? { focus } : {}),
295
613
  ...(user ? { landing, userEquation } : {}),
296
614
  },
297
615
  }, write);
@@ -338,6 +656,8 @@ async function run(ctx) {
338
656
  // source. The diagram itself also carries the legend (see `buildVizModel`).
339
657
  if (posterNote !== null)
340
658
  err(`upt: ${posterNote}`);
659
+ if (focusLine !== null)
660
+ err(`upt: ${focusLine}`);
341
661
  if (model.filterLegend !== null)
342
662
  err(`upt: ${model.filterLegend}`);
343
663
  if (user)
@@ -353,7 +673,7 @@ async function run(ctx) {
353
673
  extraJunctions: overlay(user ? [user.junction] : []),
354
674
  ...filterOpts,
355
675
  });
356
- out(`
676
+ out(`
357
677
  Poster index — statements and the derivations between them [source: ${label}]`);
358
678
  out(` ${posterNote}`);
359
679
  out(` (${model.junctions.length} junctions over ${model.clusters.length} clusters; ` +
@@ -365,7 +685,7 @@ Poster index — statements and the derivations between them [source: ${label}]
365
685
  out(` ⚠ '${d.derivation}' names '${d.missing}' as a ${d.role}, and nothing defines it.`);
366
686
  }
367
687
  if (user) {
368
- out(`
688
+ out(`
369
689
  Your equation: ${user.junction.label}`);
370
690
  printEquationReport(api, model, user, out, comparisons);
371
691
  }
@@ -381,13 +701,21 @@ Your equation: ${user.junction.label}`);
381
701
  });
382
702
  out(`\nYour equation: ${user.junction.label}`);
383
703
  printEquationReport(api, model, user, out, comparisons);
704
+ if (equationOnly || !args.flags.has('verbose'))
705
+ return exitCode;
384
706
  }
385
707
  const m = api.linkageMap(graph);
386
708
  const mix = (s) => Object.entries(s)
387
709
  .map(([k, v]) => `${v} ${k}`)
388
710
  .join(', ');
389
711
  out(`\nLinkage map — how the equations connect via shared quantities [source: ${label}]`);
390
- out(`(${m.componentCount} components over ${graph.length} edges; ${m.compositions} compose into chains)\n`);
712
+ out(`(${m.componentCount} components over ${graph.length} edges; ${m.compositions} compose into chains)`);
713
+ out(` ${coreLine(anchor.core)}`);
714
+ if (anchor.groundTruth)
715
+ out(` proposals: ${groundTruthLine(anchor.groundTruth)}`);
716
+ out('');
717
+ if (focusLine !== null)
718
+ out(` ${focusLine}`);
391
719
  if (edgeLegend !== null)
392
720
  out(` ${edgeLegend}`);
393
721
  for (const c of m.clusters.filter((x) => x.size > 1)) {