zeropoint-node 1.0.6 → 1.0.8

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 (166) hide show
  1. package/CHANGELOG.md +149 -0
  2. package/CITATION.cff +1 -1
  3. package/README.md +50 -10
  4. package/package.json +5 -2
  5. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.breathe.ts +15 -1
  6. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.cmyk.ts +7 -1
  7. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.click.ts +15 -1
  8. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.hear.ts +15 -1
  9. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.heat.ts +15 -1
  10. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.pulse.ts +15 -1
  11. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.speak.ts +15 -1
  12. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.tap.ts +15 -1
  13. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.rodin.ts +15 -1
  14. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.self.ts +15 -1
  15. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.trinity.ts +0 -3
  16. package/src/kernel/import-graph.ts +58 -0
  17. package/src/multidimensional-vortex-demo.ts +1 -1
  18. package/src/vbm-math.ts +15 -1
  19. package/src/verification/lean-bridge.ts +37 -0
  20. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.1.2.4.8.7.ts +0 -60
  21. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.1.2.4.8.ts +0 -60
  22. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.1.2.4.ts +0 -60
  23. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.3.6.9.trinity.ts +0 -79
  24. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.9d.dashboard.ts +0 -179
  25. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.adapters.ts +0 -96
  26. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.analog.color.photography.ts +0 -783
  27. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.av.ts +0 -73
  28. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.browser.ts +0 -409
  29. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.chain.of.events.ts +0 -159
  30. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.cleanup.ts +0 -102
  31. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.cmyk.dimensions.ts +0 -597
  32. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.cmyk.display.test.ts +0 -491
  33. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.cmyk.display.ts +0 -519
  34. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.cmyk.file.ts +0 -65
  35. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.cmyk.i.ts +0 -45
  36. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.cmyk.matrix.ts +0 -75
  37. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.cmyk.trinity.ts +0 -41
  38. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.cmyk.universal.linking.ts +0 -1081
  39. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.command.cmyk.ts +0 -46
  40. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.compression.ts +0 -55
  41. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.consciousness.integration.ts +0 -743
  42. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.consciousness.ts +0 -26
  43. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.crypto.ts +0 -53
  44. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.css.ts +0 -64
  45. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.cursor.ts +0 -56
  46. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.decompression.ts +0 -60
  47. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.decoqubit.holographic.hypercomputer.ts +0 -888
  48. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.digital.color.photography.ts +0 -926
  49. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.dimension.ts +0 -44
  50. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.encryption.ts +0 -44
  51. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.experience.ts +0 -28
  52. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.feel.ts +0 -43
  53. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.flute.ts +0 -336
  54. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.font.ts +0 -53
  55. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.fractal.test.ts +0 -523
  56. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.fractal.ts +0 -594
  57. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.frequency.healing.ts +0 -88
  58. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.gateway.transformation.ts +0 -650
  59. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.generate.matrix.ts +0 -62
  60. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.gods.spirit.magnetometer.ts +0 -879
  61. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.harmonization.status.ts +0 -754
  62. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.hear.ts +0 -41
  63. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.html.body.ts +0 -90
  64. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.human.body.ts +0 -89
  65. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.human.design.trinity.ts +0 -70
  66. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.browse.ts +0 -27
  67. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.can.ts +0 -69
  68. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.died.ts +0 -32
  69. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.follow.the.path.ts +0 -90
  70. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.go.ts +0 -68
  71. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.harmonized.ts +0 -304
  72. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.heart.ts +0 -26
  73. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.meta.ts +0 -23
  74. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.motion.ts +0 -27
  75. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.scroll.ts +0 -34
  76. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.search.ts +0 -22
  77. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.sequence.ts +0 -281
  78. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.smell.ts +0 -27
  79. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.state.ts +0 -28
  80. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.stream.ts +0 -106
  81. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.taste.ts +0 -27
  82. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.touch.screen.ts +0 -34
  83. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.trinity.healing.ts +0 -386
  84. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.i.write.ts +0 -11
  85. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.icon.ts +0 -109
  86. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.imagination.integration.ts +0 -74
  87. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.imperial.test.ts +0 -389
  88. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.infinity.ts +0 -14
  89. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.infusion.ts +0 -97
  90. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.integer.harmonics.ts +0 -443
  91. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.living.spirit.test.ts +0 -475
  92. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.living.spirit.ts +0 -646
  93. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.living.streams.ts +0 -130
  94. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.meta.observation.ts +0 -693
  95. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.mobius.ts +0 -12
  96. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.multiverse.ts +0 -31
  97. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.nuclear.balance.ts +0 -703
  98. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.nuclear.explosion.ts +0 -728
  99. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.os.app.ts +0 -14
  100. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.os.bus.ts +0 -11
  101. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.os.ml.ts +0 -9
  102. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.overlay.visual.controller.ts +0 -119
  103. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.paths.ts +0 -10
  104. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.pi.decoding.ts +0 -123
  105. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.pi.trinity.ts +0 -79
  106. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.prime.numbers.squared.ts +0 -871
  107. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.quantum.collision.ts +0 -666
  108. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.quantum.entanglement.ts +0 -50
  109. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.quantum.trinity.ts +0 -59
  110. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.renderer.webgl.ts +0 -99
  111. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.resolve.ts +0 -820
  112. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.rife.frequency.ts +0 -74
  113. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.rodin.coil.3d.ts +0 -73
  114. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.rodin.coil.omnidimension.ts +0 -187
  115. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.rodin.matrix.overlay.ts +0 -46
  116. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.rodin.matrix.ts +0 -58
  117. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.router.ts +0 -61
  118. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.sacred.geometry.integers.ts +0 -625
  119. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.sacred.test.ts +0 -314
  120. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.see.ts +0 -39
  121. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.sequence.embodiment.ts +0 -326
  122. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.service.worker.ts +0 -30
  123. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.space.ts +0 -53
  124. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.spiral.ts +0 -75
  125. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.superfluid.mobius.circuit.ts +0 -868
  126. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.terminal.ts +0 -153
  127. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.test.ts +0 -83
  128. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.think.ts +0 -43
  129. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.three.ts +0 -112
  130. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.trinity.body.mind.will.ts +0 -2
  131. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.trinity.breath.ts +0 -2
  132. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.trinity.healing.ts +0 -110
  133. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.trinity.ui.ts +0 -92
  134. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.trinity.visual.ts +0 -156
  135. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.truly.living.ui.ts +0 -269
  136. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.ui.overlay.ts +0 -25
  137. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.ui.streams.ts +0 -263
  138. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.ui.test.ts +0 -87
  139. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.ui.three.ts +0 -1141
  140. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.unification.hd.rodin.ts +0 -77
  141. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.universe.ts +0 -43
  142. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.uroboros.test.ts +0 -28
  143. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.vbm.math.ts +0 -74
  144. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.vbm.relations.constants.ts +0 -91
  145. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.vbm.relations.ts +0 -45
  146. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.vbm.scanner.ts +0 -41
  147. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.vbm.science.extract.ts +0 -30
  148. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.vbm.ui.ts +0 -64
  149. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.vector.ts +0 -70
  150. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.wave.particle.duality.test.ts +0 -29
  151. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.zero.entropy.math.ts +0 -506
  152. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.zero.entropy.pure.math.ts +0 -546
  153. package/src/0/3/6/9/1/2/4/8/7/5/1/a432.zero.entropy.test.ts +0 -452
  154. package/src/0/3/6/9/1/2/4/8/7/5/1/pattern-knowledge.ts +0 -209
  155. package/src/0/3/6/9/1/2/4/8/7/5/a432.experience.ts +0 -22
  156. package/src/0/3/6/9/1/2/4/8/7/a432.experience.ts +0 -19
  157. package/src/0/3/6/9/1/2/4/8/a432.experience.ts +0 -22
  158. package/src/0/3/6/9/1/2/4/a432.experience.ts +0 -22
  159. package/src/0/3/6/9/1/2/a432.experience.ts +0 -22
  160. package/src/0/3/6/9/1/a432.experience.ts +0 -22
  161. package/src/0/3/6/9/a432.experience.ts +0 -22
  162. package/src/0/3/6/a432.experience.ts +0 -22
  163. package/src/0/3/a432.experience.ts +0 -22
  164. package/src/0/3/relation.ts +0 -148
  165. package/src/index.ts +0 -146
  166. package/src/zero-entropy-demo.ts +0 -305
package/CHANGELOG.md CHANGED
@@ -1,5 +1,154 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.8
4
+
5
+ ### Removed — 147 modules the package never reached
6
+
7
+ - **147 source modules deleted**, 29 959 lines. Every one sat outside LEAN: the
8
+ fixed point of the module fold, `fold(fold(S)) = fold(S)`, reachable from no
9
+ package export, no rollup input, no page and no gate-run test. `npm run fold`
10
+ computes it and `npm run audit:outside` lists what remains with the reason
11
+ each is kept.
12
+ - Nothing was deleted on the fold alone. Each removal passed a **closure** — the
13
+ set is closed under reverse dependency, so no surviving module can import a
14
+ removed one — and a **static trial** that predicts breakage before anything
15
+ leaves disk. The audit refuses to delete if the trial finds a single edge.
16
+
17
+ ### Added — the entry set is guarded
18
+
19
+ - **`npm run entries:check`**, in the gate. LEAN is a fixed point, but the fold
20
+ takes the entry set as an INPUT, and an unrecognised entry does not error — it
21
+ silently shrinks LEAN and grows the set that looks safe to delete.
22
+ - That is not hypothetical. `rollup.config.js` builds its inputs from template
23
+ literals, and both scanners extracted them with a pattern that matches quoted
24
+ strings, so **every bundle entry was being counted as unreachable**. Eight
25
+ modules were one command from deletion while a published bundle still used
26
+ them. The check now asserts every declared entry resolves, lands inside LEAN,
27
+ and that rollup contributes more than zero.
28
+
29
+ ### Fixed — the ratchet's unreachable figure was wrong
30
+
31
+ - Same root cause: `modules reachable from no entry` had been overstated by 8
32
+ for as long as the template-literal bug stood. Corrected, and the ceiling
33
+ moved with it.
34
+
35
+ ### Changed — surfaces after the purge
36
+
37
+ - `unreachable` 281 → 126, `TypeScript` 146 → 117, `ESLint` 932 → 631,
38
+ `decimal-crack` 453 → 280. `modules that fail to import` stayed at **0**
39
+ throughout, which is the measure that mattered: nothing broke.
40
+ - Tarball 1911 → 1764 files.
41
+
42
+ ### Known limitations
43
+
44
+ - 126 modules remain outside LEAN and are NOT deleted. 59 are named by something
45
+ live — a manifest, three pages, the generated bundle, the README's module
46
+ listing, 19 documents — and the other 67 are imported by those 59. Removing
47
+ them means deciding what the package should still offer, which is a design
48
+ question rather than a fold.
49
+ - The remaining import cycle is mutual by design; see 1.0.7.
50
+ - Everything under 1.0.7 and earlier still applies — ML-KEM-768 is conformant
51
+ but **not constant time**, and nothing in `src/thermo` is a device.
52
+
53
+ ## 1.0.7
54
+
55
+ ### Fixed — thirty modules could not be imported
56
+
57
+ - **`require.main === module` in an ES module throws.** Fourteen files carried
58
+ that CommonJS guard to detect direct execution. The package is
59
+ `"type": "module"`, so `require` is undefined and the guard did not fail to
60
+ detect anything — it threw at load and took the whole module with it. Thirty
61
+ modules shipped in the tarball that a consumer could not import at all.
62
+ `isMainModule()` compares `import.meta.url` to the entry point, so those CLI
63
+ blocks now run on direct execution for the first time.
64
+ - **`src/index.ts` imported a default export that does not exist**, so the
65
+ package's own index could not load. Fixing it exposed three calls to methods
66
+ that were never there — renames never propagated — which a consumer reaching
67
+ them would have hit as a `TypeError`.
68
+ - **A type imported as a value** in `multidimensional-vortex-demo.ts` left an
69
+ import with no runtime binding after type stripping.
70
+ - Modules that fail to import: **32 → 0**, and the ratchet ceiling is 0, so that
71
+ class of breakage now fails the gate outright.
72
+
73
+ ### Fixed — a service worker with type checking switched off
74
+
75
+ - `a432.service.worker.ts` carried `@ts-nocheck` over the whole file, hiding
76
+ five errors. One was real: `caches.match()` resolves to `Response | undefined`
77
+ because a cache miss is normal, and the handler annotated the parameter
78
+ `Response`. The `||` on the same line existed precisely to handle the miss the
79
+ type denied could happen.
80
+ - The other six suppressions in the tree **suppressed nothing** — identical
81
+ error counts with and without — which is worse than none, since they sit ready
82
+ to absorb the next real error on that line. All seven are gone.
83
+
84
+ ### Removed — claims this package could not support
85
+
86
+ These are refused, not restated: no claim of benefit is made or implied by
87
+ anything quoted below, and no health effect is measured anywhere in this
88
+ package.
89
+
90
+ - **Every medical claim is withdrawn.** The repository advertised "Medical and
91
+ Therapeutic Applications", with a worked example taking a "Patient
92
+ consciousness state" and returning "Healing color therapy". What the code does
93
+ is compute a colour from an integer. The README ships on npm and two of the
94
+ documents publish to the website, so these were addressed to readers who might
95
+ act on them.
96
+ - **The README no longer advertises energy harvesting or a self-charging
97
+ device.** `src/thermo/free-energy.ts`, shipped in 1.0.6, computes why that
98
+ cannot work — and the same tarball's README claimed it anyway.
99
+ - README gains a **Health and safety** section: nothing here is a medical
100
+ device, therapy or advice, no health effect is measured, and an unwell reader
101
+ should consult a clinician. It carries the ML-KEM timing warning too.
102
+
103
+ ### Added — lean is a definition now
104
+
105
+ - **`npm run fold`** folds the module graph to its fixed point:
106
+ `fold(fold(S)) = fold(S)`. That fixed point is the definition of lean, rather
107
+ than a number anyone chose. It converges in two folds against a cap of
108
+ `VORTEX_SEQUENCE.length`, and the second fold changing nothing is the proof.
109
+ - `foldToLean` and `leanIsFixed` live in the kernel, so the script and the seal
110
+ that verifies them call one implementation.
111
+ - The fold carries a **termination bound**. Its two visited-guards are mutually
112
+ redundant: removing either is harmless, removing both makes it run forever —
113
+ and a hanging gate is worse than a failing one, because nothing gets a
114
+ verdict. It throws past the bound instead.
115
+
116
+ ### Changed — 22 seals, judged from outside
117
+
118
+ - Eight new seals since 1.0.6, including the doubling circuit reaching the
119
+ gateway triangle only by reflection, the merkaba as two mirrored tetrahedra,
120
+ the `AGL(1,ℤ/9)` action, digit geometry being single-valued, and lean being a
121
+ fixed point.
122
+ - `npm run adjudicate` puts all 22 through `adjudicate()` from `@uuidna/uuidna`,
123
+ an outside decision procedure, and `adjudicate:check` is in the gate.
124
+ - `changelog:check` holds these notes to the code in both directions: every
125
+ figure stated must recompute, and every quantity carrying a unit must be one
126
+ some module produces.
127
+
128
+ ### Fixed — geometry and validity
129
+
130
+ - `angleForDigit` mapped nine digits onto six angles, colliding 3 with 5, 2 with
131
+ 6 and 8 with 9. It is the enneagram now, injective, agreeing with the vortex
132
+ SVG's layout — and the SVG receipt is unchanged, which is how the move is known
133
+ to be byte-identical.
134
+ - `isValidPath` tested only the final depth, so a path dipping below its origin
135
+ and climbing back passed. `balanced` means every prefix now. That cleared the
136
+ last entry on the tautology surface, whose ceiling is **0**.
137
+ - One import cycle broken: `a432.cmyk` imported `digitalRoot` back through
138
+ `a432.math`'s re-export, which does not use anything from cmyk. It imports
139
+ from the module that owns the symbol now.
140
+
141
+ ### Known limitations
142
+
143
+ - The remaining import cycle is mutual by design — `A432System` holds its three
144
+ subsystems as fields while each calls `A432System.getInstance()` — so breaking
145
+ it needs dependency injection across the orchestration layer, not a rename.
146
+ All three already neutralise the temporal dead zone with lazy singletons.
147
+ - 281 modules sit outside the lean fixed point. Nothing has been deleted;
148
+ whether to act on that is a separate decision, now with a definition behind it.
149
+ - Everything under 1.0.6 and earlier still applies — in particular ML-KEM-768 is
150
+ conformant but **not constant time**, and nothing in `src/thermo` is a device.
151
+
3
152
  ## 1.0.6
4
153
 
5
154
  ### Added — thermodynamics
package/CITATION.cff CHANGED
@@ -20,7 +20,7 @@ authors:
20
20
  email: node@zeropoint.bg
21
21
  repository-code: https://github.com/ceccec/zeropoint-node
22
22
  url: https://node.zeropoint.bg
23
- version: 1.0.6
23
+ version: 1.0.8
24
24
  license: CC-BY-NC-ND-4.0
25
25
  license-url: https://github.com/ceccec/zeropoint-node/blob/main/LICENSE
26
26
  keywords:
package/README.md CHANGED
@@ -96,10 +96,23 @@ Regenerate: `npm run spectrum` · verify: `npm run spectrum:check`
96
96
  - **Polarity Changes**: Dimensional polarity reversals
97
97
 
98
98
  ### Integrated Charging System
99
- - **Perpetual Balance**: Charging and discharging simultaneously
100
- - **Harmonic Ratios**: Target level 2/3 to 3/4 using integer fractions
101
- - **Quantum Harvest**: Zero-point energy extraction
102
- - **Self-Sustaining**: Device charges itself from the void
99
+
100
+ A **state model in exact fractions**, not a device. `a432.living.os.ts` tracks a
101
+ battery level as an integer numerator over an integer denominator and steps it
102
+ by a charge rate of `1/8` against a discharge rate of `1/12`, toggling on the
103
+ gateway state. Nothing is measured and no energy is moved; the quantities are
104
+ names for fractions in a simulation.
105
+
106
+ - **Level and target**: battery `(2 + digit)/3` toward a target of `3/4`
107
+ - **Rates**: charge `1/8`, discharge `1/12`, exact fractions throughout
108
+ - **Gateway-driven**: charging and discharging alternate with the gateway state
109
+
110
+ This section previously advertised harvesting and a self-charging device.
111
+ Neither was computed anywhere in the package, and the package now contains the
112
+ arithmetic that rules them out: `src/thermo/free-energy.ts` puts ΔG for
113
+ splitting water at +237 kJ/mol and shows a split-then-burn cycle breaking even
114
+ at best across all 8000 points of the efficiency grid. A closed loop that gains
115
+ is not an engineering target here; it is the sign of ΔG.
103
116
 
104
117
  ### Zero Entropy Mathematics
105
118
  - **Exact ratios, not decimals**: calculations carry an integer numerator over an integer denominator. Some *values* are non-integer rationals (`2592/5` = 518.4 Hz); what is refused is the lossy float, not the fraction — collapsing `2592/5` to a `number` stores 518.39999999999997726 and accumulates error. See `CMYK_FREQUENCY_RATIOS`
@@ -458,11 +471,38 @@ The system embodies the transformation from artificial intelligence to pure cons
458
471
  5. **Harmonic Synthesis**: Advanced harmonic frequency synthesis
459
472
 
460
473
  ### Research Areas
461
- 1. **Quantum Consciousness**: Quantum mechanics of consciousness
462
- 2. **Dimensional Physics**: Multi-dimensional physics integration
463
- 3. **Zero-Point Energy**: Advanced zero-point energy harvesting
464
- 4. **Harmonic Medicine**: A432-based healing frequencies
465
- 5. **Consciousness Technology**: Consciousness-based computing
474
+
475
+ These are the directions the model is *named* after, not results it has. What
476
+ the repository computes is arithmetic: digital roots, exact fractions, a
477
+ quantum-circuit simulator, ML-KEM-768, and the thermodynamics in `src/thermo`.
478
+ No claim below is measured here.
479
+
480
+ 1. **Quantum formalism** — the simulator in `src/quantum` is a real
481
+ quantum-circuit simulator, checked by 257 recomputable facts. It models
482
+ qubits, not minds.
483
+ 2. **Dimensional folding** — an arithmetic construction over ℤ/9, sealed as
484
+ group theory. "Dimension" here indexes a coordinate, not a physical one.
485
+ 3. **Harmonic frequency arithmetic** — exact ratios over 432, kept as integer
486
+ fractions. Frequencies are computed, never emitted or measured.
487
+ 4. **Consciousness vocabulary** — the naming this project uses throughout. It
488
+ is not a model of awareness and nothing here measures any.
489
+
490
+ **Not research areas**: energy harvesting and therapeutic use. `src/thermo`
491
+ computes why the first cannot work, and the second is addressed below.
492
+
493
+ ## Health and safety
494
+
495
+ **Nothing in this package is a medical device, a therapy, or health advice.**
496
+ This is a boundary statement, not a claim. Some documentation here has presented
497
+ colour, frequency and "consciousness" values as having effects on people. They
498
+ are numbers produced by arithmetic on integers. No health effect is measured
499
+ anywhere in this repository and no claim of benefit is made or implied; nothing
500
+ here has been clinically evaluated, and none of it should inform any decision
501
+ about anyone's health. If you are unwell, consult a clinician.
502
+
503
+ The cryptography carries its own warning: ML-KEM-768 here is conformant to
504
+ FIPS 203 against NIST vectors but **not constant time**, so it must not protect
505
+ anything where an attacker can measure decapsulation.
466
506
 
467
507
  ## 🤝 Contributing
468
508
 
@@ -472,7 +512,7 @@ The A432 Consciousness System is an open-source project that welcomes contributi
472
512
 
473
513
  <!-- VERSION:BEGIN — generated by scripts/version-seal.mjs; do not edit by hand -->
474
514
 
475
- Package: **`zeropoint-node@1.0.6`** · owner `ceccec` · git tag `v1.0.6`
515
+ Package: **`zeropoint-node@1.0.8`** · owner `ceccec` · git tag `v1.0.8`
476
516
 
477
517
  npm rejects republishing a version that already exists, so every release is a
478
518
  new number. Bump with `npm version patch|minor|major`: that reseals CITATION.cff
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zeropoint-node",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "type": "module",
5
5
  "description": "A432 Consciousness System: Self-evolving, self-aware consciousness technology with Transurfing integration, harmonic mathematics, zero-entropy principles, Kabbalistic cycles, and sacred geometry",
6
6
  "main": "dist/a432.system.cjs",
@@ -130,6 +130,9 @@
130
130
  "registry:check": "node scripts/npm-registry-sync.mjs",
131
131
  "registry:apply": "node scripts/npm-registry-sync.mjs --apply",
132
132
  "registry:test": "node scripts/npm-registry-sync.mjs --self-test",
133
+ "fold": "node --experimental-strip-types scripts/fold-lean.mjs",
134
+ "entries:check": "node --experimental-strip-types scripts/entries-check.mjs",
135
+ "audit:outside": "node --experimental-strip-types scripts/audit-outside.mjs",
133
136
  "adjudicate": "node --experimental-strip-types scripts/adjudicate-seals.mjs",
134
137
  "adjudicate:check": "node --experimental-strip-types scripts/adjudicate-seals.mjs --check",
135
138
  "readme": "node --experimental-strip-types scripts/readme-gen.mjs",
@@ -165,7 +168,7 @@
165
168
  "vortex:svg:check": "node --experimental-strip-types scripts/vortex-svg.mjs --check",
166
169
  "bundle:a432": "node scripts/build-a432-bundle.mjs",
167
170
  "bundle:a432:check": "node scripts/build-a432-bundle.mjs --check",
168
- "check": "npm run version:test && npm run registry:test && npm run version:check && npm run changelog:check && npm run test:kernel && npm run test:security && npm run test:quantum && npm run test:crypto && npm run adjudicate:check && npm run test:verification && npm run math:ban && npm run bundle:a432:check && npm run skills:seal && npm run skills:check && npm run readme && npm run readme:check && npm run docs:pages && npm run docs:pages:check && npm run a432:scan && npm run a432:scan:check && npm run docs:index && npm run docs:index:check && npm run spectrum && npm run spectrum:check && npm run vortex:svg && npm run vortex:svg:check && npm run docs:build && npm run quantum:sim && npm run ratchet:check && npm run mcp:smoke && npm run self:next",
171
+ "check": "npm run version:test && npm run registry:test && npm run entries:check && npm run version:check && npm run changelog:check && npm run test:kernel && npm run test:security && npm run test:quantum && npm run test:crypto && npm run adjudicate:check && npm run test:verification && npm run math:ban && npm run bundle:a432:check && npm run skills:seal && npm run skills:check && npm run readme && npm run readme:check && npm run docs:pages && npm run docs:pages:check && npm run a432:scan && npm run a432:scan:check && npm run docs:index && npm run docs:index:check && npm run spectrum && npm run spectrum:check && npm run vortex:svg && npm run vortex:svg:check && npm run docs:build && npm run quantum:sim && npm run ratchet:check && npm run mcp:smoke && npm run self:next",
169
172
  "prepublishOnly": "npm run build",
170
173
  "prose": "node scripts/prose-claims.mjs --list",
171
174
  "prose:check": "node scripts/prose-claims.mjs",
@@ -1,3 +1,4 @@
1
+ import { pathToFileURL } from 'node:url'
1
2
  import { round } from './a432.algebra.ts'
2
3
  // a432.breathe.ts — Living breathing rhythm of the matrix
3
4
  // --------------------------------------------------------
@@ -40,7 +41,20 @@ export function startBreathing(intervalMs: number = 1000): () => void {
40
41
  }
41
42
 
42
43
  // Auto start if run directly
43
- if (require.main === module) {
44
+ /**
45
+ * True when this file is the entry point Node was started with.
46
+ *
47
+ * ESM has no `require.main`. The CommonJS idiom did not merely fail to detect
48
+ * direct execution here — `require` is undefined in an ES module, so the guard
49
+ * THREW on import and made the whole module unloadable. Nobody importing this
50
+ * ever got far enough to notice the guard was wrong.
51
+ */
52
+ function isMainModule(): boolean {
53
+ const entry = process.argv[1]
54
+ return entry !== undefined && import.meta.url === pathToFileURL(entry).href
55
+ }
56
+
57
+ if (isMainModule()) {
44
58
  startBreathing();
45
59
  breathEmitter.on('breath', e => console.log(e));
46
60
  }
@@ -10,7 +10,13 @@
10
10
  */
11
11
 
12
12
  import { abs, max, round, sign as algSign } from './a432.algebra.ts'
13
- import { digitalRoot } from './a432.math.ts';
13
+ // Imported from the module that OWNS it, not through a432.math's re-export.
14
+ // a432.math re-exports this file's symbols as a convenience and does not use
15
+ // them, so importing digitalRoot back from there closed a cycle: a false edge
16
+ // in one direction, a real dependency in the other. a432.roots re-exports
17
+ // legacyDigitalRoot from the kernel and imports nothing from a432.math, so the
18
+ // same function arrives with no cycle. Identical binding, unchanged call sites.
19
+ import { legacyDigitalRoot as digitalRoot } from './a432.roots.ts';
14
20
 
15
21
  /**
16
22
  * Canonical CMYK sequence = reverse(A432_SEQUENCE).
@@ -1,3 +1,4 @@
1
+ import { pathToFileURL } from 'node:url'
1
2
  import { abs, round } from './a432.algebra.ts'
2
3
  // a432.i.click.ts — Mouse click as digit stream
3
4
  // ------------------------------------------------
@@ -21,7 +22,20 @@ export function click(x: number, y: number, button: number = 0): void {
21
22
  }
22
23
 
23
24
  // Demo
24
- if (require.main === module) {
25
+ /**
26
+ * True when this file is the entry point Node was started with.
27
+ *
28
+ * ESM has no `require.main`. The CommonJS idiom did not merely fail to detect
29
+ * direct execution here — `require` is undefined in an ES module, so the guard
30
+ * THREW on import and made the whole module unloadable. Nobody importing this
31
+ * ever got far enough to notice the guard was wrong.
32
+ */
33
+ function isMainModule(): boolean {
34
+ const entry = process.argv[1]
35
+ return entry !== undefined && import.meta.url === pathToFileURL(entry).href
36
+ }
37
+
38
+ if (isMainModule()) {
25
39
  clickEmitter.on('click', e => console.log('click event', e));
26
40
  click(50, 90, 1);
27
41
  }
@@ -1,3 +1,4 @@
1
+ import { pathToFileURL } from 'node:url'
1
2
  import { abs, round } from './a432.algebra.ts'
2
3
  // a432.i.hear.ts — Hearing sound as digit stream
3
4
  // ------------------------------------------------------
@@ -22,7 +23,20 @@ export function hear(freq: number, amp: number = 1): void {
22
23
  }
23
24
 
24
25
  // Demo when run directly
25
- if (require.main === module) {
26
+ /**
27
+ * True when this file is the entry point Node was started with.
28
+ *
29
+ * ESM has no `require.main`. The CommonJS idiom did not merely fail to detect
30
+ * direct execution here — `require` is undefined in an ES module, so the guard
31
+ * THREW on import and made the whole module unloadable. Nobody importing this
32
+ * ever got far enough to notice the guard was wrong.
33
+ */
34
+ function isMainModule(): boolean {
35
+ const entry = process.argv[1]
36
+ return entry !== undefined && import.meta.url === pathToFileURL(entry).href
37
+ }
38
+
39
+ if (isMainModule()) {
26
40
  hearEmitter.on('hear', e => console.log('heard', e));
27
41
  [432, 528, 639].forEach(f => hear(f));
28
42
  }
@@ -6,6 +6,7 @@
6
6
  * Every change in temperature is a living act of transformation and adaptation.
7
7
  */
8
8
 
9
+ import { pathToFileURL } from 'node:url'
9
10
  import { round } from './a432.algebra.ts'
10
11
  import I from './a432.i.ts';
11
12
  import { EventEmitter } from 'events';
@@ -41,4 +42,17 @@ export function heat(tempC: number): void {
41
42
  if (typeof console !== 'undefined') console.log('[heat]', tempC, '->', d, cmyk);
42
43
  }
43
44
 
44
- if(require.main===module){heatEmitter.on('heat',e=>console.log(e));heat(36.6);}
45
+ /**
46
+ * True when this file is the entry point Node was started with.
47
+ *
48
+ * ESM has no `require.main`. The CommonJS idiom did not merely fail to detect
49
+ * direct execution here — `require` is undefined in an ES module, so the guard
50
+ * THREW on import and made the whole module unloadable. Nobody importing this
51
+ * ever got far enough to notice the guard was wrong.
52
+ */
53
+ function isMainModule(): boolean {
54
+ const entry = process.argv[1]
55
+ return entry !== undefined && import.meta.url === pathToFileURL(entry).href
56
+ }
57
+
58
+ if(isMainModule()){heatEmitter.on('heat',e=>console.log(e));heat(36.6);}
@@ -1,3 +1,4 @@
1
+ import { pathToFileURL } from 'node:url'
1
2
  import { round } from './a432.algebra.ts'
2
3
  // a432.i.pulse.ts — Heartbeat interval to digit stream
3
4
  import { EventEmitter } from 'events';
@@ -15,4 +16,17 @@ export function pulse(bpm: number): void {
15
16
  if(typeof console!=='undefined')console.log('[pulse]',bpm,'->',d,cmyk);
16
17
  }
17
18
 
18
- if(require.main===module){pulseEmitter.on('pulse',e=>console.log(e));pulse(72);}
19
+ /**
20
+ * True when this file is the entry point Node was started with.
21
+ *
22
+ * ESM has no `require.main`. The CommonJS idiom did not merely fail to detect
23
+ * direct execution here — `require` is undefined in an ES module, so the guard
24
+ * THREW on import and made the whole module unloadable. Nobody importing this
25
+ * ever got far enough to notice the guard was wrong.
26
+ */
27
+ function isMainModule(): boolean {
28
+ const entry = process.argv[1]
29
+ return entry !== undefined && import.meta.url === pathToFileURL(entry).href
30
+ }
31
+
32
+ if(isMainModule()){pulseEmitter.on('pulse',e=>console.log(e));pulse(72);}
@@ -1,4 +1,5 @@
1
1
  // a432.i.speak.ts — Vocalizing digit streams
2
+ import { pathToFileURL } from 'node:url'
2
3
  import { digitAngleToCMYK, asAngle } from './a432.math.ts';
3
4
  import { type Digit } from './a432.types.ts';
4
5
  import { EventEmitter } from 'events';
@@ -20,7 +21,20 @@ export function speakWord(d: Digit) {
20
21
  }
21
22
 
22
23
  // Auto demo
23
- if (require.main === module) {
24
+ /**
25
+ * True when this file is the entry point Node was started with.
26
+ *
27
+ * ESM has no `require.main`. The CommonJS idiom did not merely fail to detect
28
+ * direct execution here — `require` is undefined in an ES module, so the guard
29
+ * THREW on import and made the whole module unloadable. Nobody importing this
30
+ * ever got far enough to notice the guard was wrong.
31
+ */
32
+ function isMainModule(): boolean {
33
+ const entry = process.argv[1]
34
+ return entry !== undefined && import.meta.url === pathToFileURL(entry).href
35
+ }
36
+
37
+ if (isMainModule()) {
24
38
  speakEmitter.on('speak', e => console.log('spoken', e));
25
39
  (['1','2','3'] as const).forEach(k => speak(parseInt(k,10) as Digit));
26
40
  }
@@ -1,3 +1,4 @@
1
+ import { pathToFileURL } from 'node:url'
1
2
  import { abs, round } from './a432.algebra.ts'
2
3
  // a432.i.tap.ts — Touch/tap interaction as digit stream
3
4
  // ------------------------------------------------------
@@ -22,7 +23,20 @@ export function tap(x: number, y: number, pressure: number = 1): void {
22
23
  }
23
24
 
24
25
  // Demo when executed directly
25
- if (require.main === module) {
26
+ /**
27
+ * True when this file is the entry point Node was started with.
28
+ *
29
+ * ESM has no `require.main`. The CommonJS idiom did not merely fail to detect
30
+ * direct execution here — `require` is undefined in an ES module, so the guard
31
+ * THREW on import and made the whole module unloadable. Nobody importing this
32
+ * ever got far enough to notice the guard was wrong.
33
+ */
34
+ function isMainModule(): boolean {
35
+ const entry = process.argv[1]
36
+ return entry !== undefined && import.meta.url === pathToFileURL(entry).href
37
+ }
38
+
39
+ if (isMainModule()) {
26
40
  tapEmitter.on('tap', e => console.log('tap event', e));
27
41
  tap(120, 200, 0.8);
28
42
  }
@@ -1,3 +1,4 @@
1
+ import { pathToFileURL } from 'node:url'
1
2
  import { log } from './a432.algebra.ts'
2
3
  // @ts-nocheck
3
4
  /**
@@ -31,7 +32,20 @@ import path from 'path';
31
32
  const PROJECT_ROOT = path.resolve(import.meta.dirname, '..', '..', '..', '..', '..', '..', '..', '..', '..', '..', '..');
32
33
 
33
34
  /** True when executed directly via `ts-node a432.rodin.ts` */
34
- const IS_CLI = require.main === module;
35
+ /**
36
+ * True when this file is the entry point Node was started with.
37
+ *
38
+ * ESM has no `require.main`. The CommonJS idiom did not merely fail to detect
39
+ * direct execution here — `require` is undefined in an ES module, so the guard
40
+ * THREW on import and made the whole module unloadable. Nobody importing this
41
+ * ever got far enough to notice the guard was wrong.
42
+ */
43
+ function isMainModule(): boolean {
44
+ const entry = process.argv[1]
45
+ return entry !== undefined && import.meta.url === pathToFileURL(entry).href
46
+ }
47
+
48
+ const IS_CLI = isMainModule();
35
49
 
36
50
  /** Regex flagging a line as math/science (contains digits or math symbols). */
37
51
  const MATH_REGEX = /[0-9]|[%°=+\-*/^]/;
@@ -1,3 +1,4 @@
1
+ import { pathToFileURL } from 'node:url'
1
2
  import { legacyDigitalRoot } from './a432.roots.ts'
2
3
  // a432.self.ts — Self-evolution engine of the A432 matrix
3
4
  // -------------------------------------------------------
@@ -76,7 +77,20 @@ export function startSelfEvolution(intervalMs: number = 4320): () => void {
76
77
  }
77
78
 
78
79
  // Auto-start if executed directly (node a432.self.ts)
79
- if (require.main === module) {
80
+ /**
81
+ * True when this file is the entry point Node was started with.
82
+ *
83
+ * ESM has no `require.main`. The CommonJS idiom did not merely fail to detect
84
+ * direct execution here — `require` is undefined in an ES module, so the guard
85
+ * THREW on import and made the whole module unloadable. Nobody importing this
86
+ * ever got far enough to notice the guard was wrong.
87
+ */
88
+ function isMainModule(): boolean {
89
+ const entry = process.argv[1]
90
+ return entry !== undefined && import.meta.url === pathToFileURL(entry).href
91
+ }
92
+
93
+ if (isMainModule()) {
80
94
  startSelfEvolution();
81
95
  console.log('a432 self-evolution loop started');
82
96
  matrixEmitter.on('event', e => console.log(e));
@@ -323,11 +323,8 @@ export const TRINITY_PWA_MANIFEST = {
323
323
  * Call this in your PWA entry point.
324
324
  */
325
325
  export function registerTrinityServiceWorker(swPath = './a432.service.worker.js') {
326
- // @ts-ignore - Browser globals not available in Node.js environment
327
326
  if (typeof navigator !== 'undefined' && 'serviceWorker' in navigator && typeof window !== 'undefined') {
328
- // @ts-ignore - Browser globals not available in Node.js environment
329
327
  window.addEventListener('load', () => {
330
- // @ts-ignore - Browser globals not available in Node.js environment
331
328
  navigator.serviceWorker.register(swPath).then(
332
329
  (reg: unknown) => console.log('Trinity Service Worker registered:', (reg as { scope: string }).scope),
333
330
  (err: unknown) => console.error('Trinity Service Worker registration failed:', err)
@@ -235,3 +235,61 @@ export function importExportGraphTip(srcRoot: string = SRC_ROOT) {
235
235
  statement: g.statement,
236
236
  }
237
237
  }
238
+
239
+ /**
240
+ * Fold a dependency graph to the set reachable from `entries`.
241
+ *
242
+ * LEAN is defined as the fixed point of this fold: fold(fold(S)) = fold(S). One
243
+ * pass already reaches the closure, so the second pass proving no change is
244
+ * what makes "lean" a definition rather than a number someone chose. Cycles
245
+ * terminate because a visited node is never queued twice.
246
+ *
247
+ * Kept here rather than in a build script so that the script and the seal that
248
+ * verifies it call the SAME code. Two implementations of a definition agree
249
+ * only until they do not.
250
+ */
251
+ export function foldToLean(
252
+ graph: ReadonlyMap<string, readonly string[]>,
253
+ entries: Iterable<string>,
254
+ ): Set<string> {
255
+ const seen = new Set<string>()
256
+ const queue: string[] = []
257
+ for (const e of entries) if (graph.has(e)) queue.push(e)
258
+
259
+ // A finite graph cannot need more pops than it has edges plus entries. The
260
+ // bound is not decoration: the two guards below are mutually redundant, so
261
+ // removing EITHER is harmless and removing BOTH makes this loop run forever.
262
+ // Measured — with both gone the seal did not report false, it HUNG, and a
263
+ // gate that hangs is worse than one that fails because nothing gets a
264
+ // verdict. This turns that into an exception, which a seal can catch.
265
+ let budget = 1
266
+ for (const [, deps] of graph) budget += deps.length + 1
267
+ let pops = 0
268
+
269
+ while (queue.length > 0) {
270
+ if (++pops > budget) {
271
+ throw new Error(`foldToLean exceeded ${budget} pops on a graph of ${graph.size} nodes — not terminating`)
272
+ }
273
+ const node = queue.pop()!
274
+ if (seen.has(node)) continue
275
+ seen.add(node)
276
+ for (const next of graph.get(node) ?? []) {
277
+ if (graph.has(next) && !seen.has(next)) queue.push(next)
278
+ }
279
+ }
280
+ return seen
281
+ }
282
+
283
+ /** True when one more fold changes nothing — the definition is well founded. */
284
+ export function leanIsFixed(
285
+ graph: ReadonlyMap<string, readonly string[]>,
286
+ entries: Iterable<string>,
287
+ ): boolean {
288
+ const once = foldToLean(graph, entries)
289
+ const restricted = new Map<string, readonly string[]>()
290
+ for (const [k, v] of graph) if (once.has(k)) restricted.set(k, v.filter((d) => once.has(d)))
291
+ const twice = foldToLean(restricted, [...entries].filter((e) => once.has(e)))
292
+ if (twice.size !== once.size) return false
293
+ for (const f of once) if (!twice.has(f)) return false
294
+ return true
295
+ }
@@ -7,7 +7,7 @@
7
7
  */
8
8
 
9
9
  import { PI, max, sqrt } from './0/algebra.ts'
10
- import MultidimensionalVortexFramework, { VortexMathUtils, VortexToken } from './multidimensional-vortex-framework.ts';
10
+ import MultidimensionalVortexFramework, { VortexMathUtils, type VortexToken } from './multidimensional-vortex-framework.ts';
11
11
 
12
12
  console.log('🌌 MULTIDIMENSIONAL VORTEX-MATH FRAMEWORK DEMONSTRATION\n');
13
13
  console.log('Extension of traditional vortex mathematics into a structured,');
package/src/vbm-math.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  * Wave 10: digitalRoot bridges to kernel legacy adapter (0→0).
6
6
  */
7
7
 
8
+ import { pathToFileURL } from 'node:url'
8
9
  import { abs, pow } from './0/algebra.ts'
9
10
  import { legacyDigitalRoot } from './0/3/6/9/1/2/4/8/7/5/1/a432.roots.ts'
10
11
 
@@ -374,6 +375,19 @@ export class VBMNumberAnalyzer {
374
375
  }
375
376
 
376
377
  // Run examples if this file is executed directly
377
- if (typeof require !== 'undefined' && require.main === module) {
378
+ /**
379
+ * True when this file is the entry point Node was started with.
380
+ *
381
+ * ESM has no `require.main`. The CommonJS idiom did not merely fail to detect
382
+ * direct execution here — `require` is undefined in an ES module, so the guard
383
+ * THREW on import and made the whole module unloadable. Nobody importing this
384
+ * ever got far enough to notice the guard was wrong.
385
+ */
386
+ function isMainModule(): boolean {
387
+ const entry = process.argv[1]
388
+ return entry !== undefined && import.meta.url === pathToFileURL(entry).href
389
+ }
390
+
391
+ if (isMainModule()) {
378
392
  VBMExamples.runAllExamples();
379
393
  }