kumi 0.0.33 → 0.0.36

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 (744) hide show
  1. checksums.yaml +4 -4
  2. data/.codex +0 -0
  3. data/CHANGELOG.md +22 -0
  4. data/README.md +38 -26
  5. data/Rakefile +2 -0
  6. data/data/functions/agg/numeric.yaml +6 -0
  7. data/data/functions/core/arithmetic.yaml +26 -0
  8. data/data/kernels/javascript/agg/numeric.yaml +8 -4
  9. data/data/kernels/javascript/agg/string.yaml +4 -1
  10. data/data/kernels/javascript/core/arithmetic.yaml +8 -0
  11. data/data/kernels/ruby/agg/numeric.yaml +6 -2
  12. data/data/kernels/ruby/agg/string.yaml +4 -1
  13. data/data/kernels/ruby/core/arithmetic.yaml +10 -0
  14. data/docs/AGENTS.md +60 -0
  15. data/docs/ARCHITECTURE.md +114 -250
  16. data/docs/DEVELOPMENT.md +13 -0
  17. data/docs/GOLDEN_TESTS.md +88 -161
  18. data/docs/RELEASING.md +52 -0
  19. data/docs/SCHEMA_IMPORTS.md +85 -205
  20. data/docs/UNSAT_DETECTION.md +2 -1
  21. data/golden/array_element/expected/dfir.txt +5 -0
  22. data/golden/array_element/expected/dfir_optimized.txt +5 -0
  23. data/golden/array_element/expected/loopir.txt +11 -0
  24. data/golden/array_element/expected/schema_javascript.mjs +13 -10
  25. data/golden/array_element/expected/schema_ruby.rb +9 -9
  26. data/golden/array_element/expected/vecir.txt +5 -0
  27. data/golden/array_index/expected/dfir.txt +25 -0
  28. data/golden/array_index/expected/dfir_optimized.txt +27 -0
  29. data/golden/array_index/expected/loopir.txt +44 -0
  30. data/golden/array_index/expected/nast.txt +6 -6
  31. data/golden/array_index/expected/schema_javascript.mjs +53 -36
  32. data/golden/array_index/expected/schema_ruby.rb +40 -30
  33. data/golden/array_index/expected/snast.txt +2 -2
  34. data/golden/array_index/expected/vecir.txt +27 -0
  35. data/golden/array_operations/expected/dfir.txt +36 -0
  36. data/golden/array_operations/expected/dfir_optimized.txt +36 -0
  37. data/golden/array_operations/expected/loopir.txt +45 -0
  38. data/golden/array_operations/expected/schema_javascript.mjs +50 -41
  39. data/golden/array_operations/expected/schema_ruby.rb +40 -36
  40. data/golden/array_operations/expected/vecir.txt +36 -0
  41. data/golden/cascade_logic/expected/dfir.txt +21 -0
  42. data/golden/cascade_logic/expected/dfir_optimized.txt +22 -0
  43. data/golden/cascade_logic/expected/loopir.txt +22 -0
  44. data/golden/cascade_logic/expected/schema_javascript.mjs +18 -11
  45. data/golden/cascade_logic/expected/schema_ruby.rb +21 -11
  46. data/golden/cascade_logic/expected/vecir.txt +22 -0
  47. data/golden/chained_fusion/expected/dfir.txt +53 -0
  48. data/golden/chained_fusion/expected/dfir_optimized.txt +75 -0
  49. data/golden/chained_fusion/expected/loopir.txt +95 -0
  50. data/golden/chained_fusion/expected/schema_javascript.mjs +105 -91
  51. data/golden/chained_fusion/expected/schema_ruby.rb +87 -83
  52. data/golden/chained_fusion/expected/vecir.txt +75 -0
  53. data/golden/decimal_explicit/expected/dfir.txt +18 -0
  54. data/golden/decimal_explicit/expected/dfir_optimized.txt +28 -0
  55. data/golden/decimal_explicit/expected/loopir.txt +28 -0
  56. data/golden/decimal_explicit/expected/schema_javascript.mjs +31 -19
  57. data/golden/decimal_explicit/expected/schema_ruby.rb +34 -19
  58. data/golden/decimal_explicit/expected/vecir.txt +28 -0
  59. data/golden/element_arrays/expected/dfir.txt +42 -0
  60. data/golden/element_arrays/expected/dfir_optimized.txt +50 -0
  61. data/golden/element_arrays/expected/loopir.txt +92 -0
  62. data/golden/element_arrays/expected/schema_javascript.mjs +107 -79
  63. data/golden/element_arrays/expected/schema_ruby.rb +77 -66
  64. data/golden/element_arrays/expected/snast.txt +6 -6
  65. data/golden/element_arrays/expected/vecir.txt +50 -0
  66. data/golden/empty_and_null_inputs/expected/dfir.txt +14 -0
  67. data/golden/empty_and_null_inputs/expected/dfir_optimized.txt +25 -0
  68. data/golden/empty_and_null_inputs/expected/loopir.txt +43 -0
  69. data/golden/empty_and_null_inputs/expected/schema_javascript.mjs +49 -38
  70. data/golden/empty_and_null_inputs/expected/schema_ruby.rb +37 -35
  71. data/golden/empty_and_null_inputs/expected/vecir.txt +25 -0
  72. data/golden/example_xpto/expected/dfir.txt +10 -0
  73. data/golden/example_xpto/expected/dfir_optimized.txt +10 -0
  74. data/golden/example_xpto/expected/loopir.txt +10 -0
  75. data/golden/example_xpto/expected/schema_javascript.mjs +8 -5
  76. data/golden/example_xpto/expected/schema_ruby.rb +10 -5
  77. data/golden/example_xpto/expected/vecir.txt +10 -0
  78. data/golden/function_overload/expected/dfir.txt +10 -0
  79. data/golden/function_overload/expected/dfir_optimized.txt +12 -0
  80. data/golden/function_overload/expected/loopir.txt +12 -0
  81. data/golden/function_overload/expected/schema_javascript.mjs +17 -8
  82. data/golden/function_overload/expected/schema_ruby.rb +18 -9
  83. data/golden/function_overload/expected/snast.txt +1 -1
  84. data/golden/function_overload/expected/vecir.txt +12 -0
  85. data/golden/game_of_life/expected/dfir.txt +69 -0
  86. data/golden/game_of_life/expected/dfir_optimized.txt +207 -0
  87. data/golden/game_of_life/expected/loopir.txt +694 -0
  88. data/golden/game_of_life/expected/schema_javascript.mjs +841 -90
  89. data/golden/game_of_life/expected/schema_ruby.rb +799 -90
  90. data/golden/game_of_life/expected/vecir.txt +207 -0
  91. data/golden/hash_keys/expected/dfir.txt +14 -0
  92. data/golden/hash_keys/expected/dfir_optimized.txt +14 -0
  93. data/golden/hash_keys/expected/loopir.txt +14 -0
  94. data/golden/hash_keys/expected/schema_javascript.mjs +13 -24
  95. data/golden/hash_keys/expected/schema_ruby.rb +14 -25
  96. data/golden/hash_keys/expected/vecir.txt +14 -0
  97. data/golden/hash_value/expected/dfir.txt +21 -0
  98. data/golden/hash_value/expected/dfir_optimized.txt +25 -0
  99. data/golden/hash_value/expected/loopir.txt +31 -0
  100. data/golden/hash_value/expected/schema_javascript.mjs +34 -34
  101. data/golden/hash_value/expected/schema_ruby.rb +28 -31
  102. data/golden/hash_value/expected/vecir.txt +25 -0
  103. data/golden/hierarchical_complex/expected/dfir.txt +86 -0
  104. data/golden/hierarchical_complex/expected/dfir_optimized.txt +88 -0
  105. data/golden/hierarchical_complex/expected/loopir.txt +129 -0
  106. data/golden/hierarchical_complex/expected/schema_javascript.mjs +145 -100
  107. data/golden/hierarchical_complex/expected/schema_ruby.rb +114 -85
  108. data/golden/hierarchical_complex/expected/vecir.txt +88 -0
  109. data/golden/inline_rename_scope_leak/expected/dfir.txt +19 -0
  110. data/golden/inline_rename_scope_leak/expected/dfir_optimized.txt +27 -0
  111. data/golden/inline_rename_scope_leak/expected/loopir.txt +35 -0
  112. data/golden/inline_rename_scope_leak/expected/schema_javascript.mjs +39 -35
  113. data/golden/inline_rename_scope_leak/expected/schema_ruby.rb +31 -32
  114. data/golden/inline_rename_scope_leak/expected/vecir.txt +23 -0
  115. data/golden/input_reference/expected/dfir.txt +22 -0
  116. data/golden/input_reference/expected/dfir_optimized.txt +22 -0
  117. data/golden/input_reference/expected/loopir.txt +33 -0
  118. data/golden/input_reference/expected/schema_javascript.mjs +36 -30
  119. data/golden/input_reference/expected/schema_ruby.rb +30 -25
  120. data/golden/input_reference/expected/snast.txt +1 -1
  121. data/golden/input_reference/expected/vecir.txt +22 -0
  122. data/golden/interleaved_fusion/expected/dfir.txt +35 -0
  123. data/golden/interleaved_fusion/expected/dfir_optimized.txt +60 -0
  124. data/golden/interleaved_fusion/expected/loopir.txt +74 -0
  125. data/golden/interleaved_fusion/expected/schema_javascript.mjs +82 -65
  126. data/golden/interleaved_fusion/expected/schema_ruby.rb +65 -63
  127. data/golden/interleaved_fusion/expected/vecir.txt +60 -0
  128. data/golden/let_inline/expected/dfir.txt +16 -0
  129. data/golden/let_inline/expected/dfir_optimized.txt +20 -0
  130. data/golden/let_inline/expected/loopir.txt +20 -0
  131. data/golden/let_inline/expected/schema_javascript.mjs +28 -6
  132. data/golden/let_inline/expected/schema_ruby.rb +29 -6
  133. data/golden/let_inline/expected/vecir.txt +20 -0
  134. data/golden/loop_fusion/expected/dfir.txt +29 -0
  135. data/golden/loop_fusion/expected/dfir_optimized.txt +47 -0
  136. data/golden/loop_fusion/expected/loopir.txt +55 -0
  137. data/golden/loop_fusion/expected/schema_javascript.mjs +61 -49
  138. data/golden/loop_fusion/expected/schema_ruby.rb +49 -47
  139. data/golden/loop_fusion/expected/vecir.txt +47 -0
  140. data/golden/min_max_empty_arrays/expected/ast.txt +58 -0
  141. data/golden/min_max_empty_arrays/expected/dfir.txt +27 -0
  142. data/golden/min_max_empty_arrays/expected/dfir_optimized.txt +37 -0
  143. data/golden/min_max_empty_arrays/expected/input_plan.txt +15 -0
  144. data/golden/min_max_empty_arrays/expected/loopir.txt +67 -0
  145. data/golden/min_max_empty_arrays/expected/nast.txt +27 -0
  146. data/golden/min_max_empty_arrays/expected/schema_javascript.mjs +92 -0
  147. data/golden/min_max_empty_arrays/expected/schema_ruby.rb +90 -0
  148. data/golden/min_max_empty_arrays/expected/snast.txt +27 -0
  149. data/golden/min_max_empty_arrays/expected/vecir.txt +37 -0
  150. data/golden/min_max_empty_arrays/expected.json +7 -0
  151. data/golden/min_max_empty_arrays/input.json +12 -0
  152. data/golden/min_max_empty_arrays/schema.kumi +24 -0
  153. data/golden/min_reduce_scope/expected/dfir.txt +35 -0
  154. data/golden/min_reduce_scope/expected/dfir_optimized.txt +37 -0
  155. data/golden/min_reduce_scope/expected/loopir.txt +58 -0
  156. data/golden/min_reduce_scope/expected/schema_javascript.mjs +66 -51
  157. data/golden/min_reduce_scope/expected/schema_ruby.rb +50 -46
  158. data/golden/min_reduce_scope/expected/vecir.txt +37 -0
  159. data/golden/mixed_dimensions/expected/dfir.txt +23 -0
  160. data/golden/mixed_dimensions/expected/dfir_optimized.txt +26 -0
  161. data/golden/mixed_dimensions/expected/loopir.txt +44 -0
  162. data/golden/mixed_dimensions/expected/schema_javascript.mjs +50 -40
  163. data/golden/mixed_dimensions/expected/schema_ruby.rb +38 -36
  164. data/golden/mixed_dimensions/expected/vecir.txt +28 -0
  165. data/golden/multi_loop_reduction/expected/ast.txt +39 -0
  166. data/golden/multi_loop_reduction/expected/dfir.txt +23 -0
  167. data/golden/multi_loop_reduction/expected/dfir_optimized.txt +25 -0
  168. data/golden/multi_loop_reduction/expected/input_plan.txt +5 -0
  169. data/golden/multi_loop_reduction/expected/loopir.txt +37 -0
  170. data/golden/multi_loop_reduction/expected/nast.txt +25 -0
  171. data/golden/multi_loop_reduction/expected/schema_javascript.mjs +50 -0
  172. data/golden/multi_loop_reduction/expected/schema_ruby.rb +48 -0
  173. data/golden/multi_loop_reduction/expected/snast.txt +25 -0
  174. data/golden/multi_loop_reduction/expected/vecir.txt +25 -0
  175. data/golden/multi_loop_reduction/expected.json +5 -0
  176. data/golden/multi_loop_reduction/input.json +7 -0
  177. data/golden/multi_loop_reduction/schema.kumi +20 -0
  178. data/golden/multirank_hoisting/expected/dfir.txt +40 -0
  179. data/golden/multirank_hoisting/expected/dfir_optimized.txt +109 -0
  180. data/golden/multirank_hoisting/expected/loopir.txt +164 -0
  181. data/golden/multirank_hoisting/expected/schema_javascript.mjs +183 -99
  182. data/golden/multirank_hoisting/expected/schema_ruby.rb +151 -90
  183. data/golden/multirank_hoisting/expected/vecir.txt +109 -0
  184. data/golden/nested_hash/expected/dfir.txt +6 -0
  185. data/golden/nested_hash/expected/dfir_optimized.txt +6 -0
  186. data/golden/nested_hash/expected/loopir.txt +6 -0
  187. data/golden/nested_hash/expected/schema_javascript.mjs +5 -4
  188. data/golden/nested_hash/expected/schema_ruby.rb +6 -4
  189. data/golden/nested_hash/expected/vecir.txt +6 -0
  190. data/golden/reduction_broadcast/expected/dfir.txt +27 -0
  191. data/golden/reduction_broadcast/expected/dfir_optimized.txt +44 -0
  192. data/golden/reduction_broadcast/expected/loopir.txt +68 -0
  193. data/golden/reduction_broadcast/expected/schema_javascript.mjs +77 -62
  194. data/golden/reduction_broadcast/expected/schema_ruby.rb +59 -59
  195. data/golden/reduction_broadcast/expected/vecir.txt +44 -0
  196. data/golden/roll/expected/dfir.txt +16 -0
  197. data/golden/roll/expected/dfir_optimized.txt +16 -0
  198. data/golden/roll/expected/loopir.txt +40 -0
  199. data/golden/roll/expected/schema_javascript.mjs +44 -46
  200. data/golden/roll/expected/schema_ruby.rb +36 -42
  201. data/golden/roll/expected/vecir.txt +16 -0
  202. data/golden/schema_imports_broadcasting_with_imports/expected/dfir.txt +8 -0
  203. data/golden/schema_imports_broadcasting_with_imports/expected/dfir_optimized.txt +13 -0
  204. data/golden/schema_imports_broadcasting_with_imports/expected/loopir.txt +19 -0
  205. data/golden/schema_imports_broadcasting_with_imports/expected/schema_javascript.mjs +21 -16
  206. data/golden/schema_imports_broadcasting_with_imports/expected/schema_ruby.rb +17 -14
  207. data/golden/schema_imports_broadcasting_with_imports/expected/vecir.txt +13 -0
  208. data/golden/schema_imports_complex_order_calc/expected/dfir.txt +41 -0
  209. data/golden/schema_imports_complex_order_calc/expected/dfir_optimized.txt +168 -0
  210. data/golden/schema_imports_complex_order_calc/expected/loopir.txt +202 -0
  211. data/golden/schema_imports_complex_order_calc/expected/schema_javascript.mjs +221 -117
  212. data/golden/schema_imports_complex_order_calc/expected/schema_ruby.rb +192 -107
  213. data/golden/schema_imports_complex_order_calc/expected/snast.txt +1 -1
  214. data/golden/schema_imports_complex_order_calc/expected/vecir.txt +168 -0
  215. data/golden/schema_imports_composed_order/expected/dfir.txt +15 -0
  216. data/golden/schema_imports_composed_order/expected/dfir_optimized.txt +29 -0
  217. data/golden/schema_imports_composed_order/expected/loopir.txt +29 -0
  218. data/golden/schema_imports_composed_order/expected/schema_javascript.mjs +28 -22
  219. data/golden/schema_imports_composed_order/expected/schema_ruby.rb +29 -19
  220. data/golden/schema_imports_composed_order/expected/vecir.txt +29 -0
  221. data/golden/schema_imports_discount_with_tax/expected/dfir.txt +18 -0
  222. data/golden/schema_imports_discount_with_tax/expected/dfir_optimized.txt +31 -0
  223. data/golden/schema_imports_discount_with_tax/expected/loopir.txt +31 -0
  224. data/golden/schema_imports_discount_with_tax/expected/schema_javascript.mjs +30 -21
  225. data/golden/schema_imports_discount_with_tax/expected/schema_ruby.rb +31 -17
  226. data/golden/schema_imports_discount_with_tax/expected/vecir.txt +31 -0
  227. data/golden/schema_imports_line_items/expected/dfir.txt +11 -0
  228. data/golden/schema_imports_line_items/expected/dfir_optimized.txt +26 -0
  229. data/golden/schema_imports_line_items/expected/loopir.txt +35 -0
  230. data/golden/schema_imports_line_items/expected/schema_javascript.mjs +36 -12
  231. data/golden/schema_imports_line_items/expected/schema_ruby.rb +35 -11
  232. data/golden/schema_imports_line_items/expected/snast.txt +1 -1
  233. data/golden/schema_imports_line_items/expected/vecir.txt +26 -0
  234. data/golden/schema_imports_multiple/expected/dfir.txt +17 -0
  235. data/golden/schema_imports_multiple/expected/dfir_optimized.txt +34 -0
  236. data/golden/schema_imports_multiple/expected/loopir.txt +34 -0
  237. data/golden/schema_imports_multiple/expected/schema_javascript.mjs +33 -24
  238. data/golden/schema_imports_multiple/expected/schema_ruby.rb +34 -20
  239. data/golden/schema_imports_multiple/expected/vecir.txt +34 -0
  240. data/golden/schema_imports_nested_expressions/expected/dfir.txt +14 -0
  241. data/golden/schema_imports_nested_expressions/expected/dfir_optimized.txt +24 -0
  242. data/golden/schema_imports_nested_expressions/expected/loopir.txt +24 -0
  243. data/golden/schema_imports_nested_expressions/expected/schema_javascript.mjs +21 -17
  244. data/golden/schema_imports_nested_expressions/expected/schema_ruby.rb +23 -16
  245. data/golden/schema_imports_nested_expressions/expected/vecir.txt +24 -0
  246. data/golden/schema_imports_nested_with_reductions/expected/dfir.txt +15 -0
  247. data/golden/schema_imports_nested_with_reductions/expected/dfir_optimized.txt +44 -0
  248. data/golden/schema_imports_nested_with_reductions/expected/loopir.txt +68 -0
  249. data/golden/schema_imports_nested_with_reductions/expected/schema_javascript.mjs +76 -37
  250. data/golden/schema_imports_nested_with_reductions/expected/schema_ruby.rb +64 -34
  251. data/golden/schema_imports_nested_with_reductions/expected/snast.txt +1 -1
  252. data/golden/schema_imports_nested_with_reductions/expected/vecir.txt +44 -0
  253. data/golden/schema_imports_with_imports/expected/dfir.txt +7 -0
  254. data/golden/schema_imports_with_imports/expected/dfir_optimized.txt +9 -0
  255. data/golden/schema_imports_with_imports/expected/loopir.txt +9 -0
  256. data/golden/schema_imports_with_imports/expected/schema_javascript.mjs +8 -6
  257. data/golden/schema_imports_with_imports/expected/schema_ruby.rb +9 -5
  258. data/golden/schema_imports_with_imports/expected/vecir.txt +9 -0
  259. data/golden/shift/expected/dfir.txt +24 -0
  260. data/golden/shift/expected/dfir_optimized.txt +24 -0
  261. data/golden/shift/expected/loopir.txt +64 -0
  262. data/golden/shift/expected/schema_javascript.mjs +72 -76
  263. data/golden/shift/expected/schema_ruby.rb +60 -70
  264. data/golden/shift/expected/vecir.txt +24 -0
  265. data/golden/shift_2d/expected/dfir.txt +60 -0
  266. data/golden/shift_2d/expected/dfir_optimized.txt +60 -0
  267. data/golden/shift_2d/expected/loopir.txt +176 -0
  268. data/golden/shift_2d/expected/schema_javascript.mjs +204 -260
  269. data/golden/shift_2d/expected/schema_ruby.rb +156 -236
  270. data/golden/shift_2d/expected/vecir.txt +60 -0
  271. data/golden/simple_math/expected/dfir.txt +21 -0
  272. data/golden/simple_math/expected/dfir_optimized.txt +21 -0
  273. data/golden/simple_math/expected/loopir.txt +21 -0
  274. data/golden/simple_math/expected/schema_javascript.mjs +17 -14
  275. data/golden/simple_math/expected/schema_ruby.rb +21 -14
  276. data/golden/simple_math/expected/vecir.txt +21 -0
  277. data/golden/streaming_basics/expected/dfir.txt +43 -0
  278. data/golden/streaming_basics/expected/dfir_optimized.txt +69 -0
  279. data/golden/streaming_basics/expected/loopir.txt +76 -0
  280. data/golden/streaming_basics/expected/schema_javascript.mjs +83 -67
  281. data/golden/streaming_basics/expected/schema_ruby.rb +69 -60
  282. data/golden/streaming_basics/expected/vecir.txt +69 -0
  283. data/golden/tuples/expected/dfir.txt +28 -0
  284. data/golden/tuples/expected/dfir_optimized.txt +42 -0
  285. data/golden/tuples/expected/loopir.txt +42 -0
  286. data/golden/tuples/expected/schema_javascript.mjs +41 -18
  287. data/golden/tuples/expected/schema_ruby.rb +42 -14
  288. data/golden/tuples/expected/vecir.txt +42 -0
  289. data/golden/tuples_and_arrays/expected/dfir.txt +26 -0
  290. data/golden/tuples_and_arrays/expected/dfir_optimized.txt +37 -0
  291. data/golden/tuples_and_arrays/expected/loopir.txt +45 -0
  292. data/golden/tuples_and_arrays/expected/schema_javascript.mjs +49 -42
  293. data/golden/tuples_and_arrays/expected/schema_ruby.rb +41 -38
  294. data/golden/tuples_and_arrays/expected/vecir.txt +37 -0
  295. data/golden/us_tax_2024/expected/dfir.txt +189 -0
  296. data/golden/us_tax_2024/expected/dfir_optimized.txt +565 -0
  297. data/golden/us_tax_2024/expected/loopir.txt +685 -0
  298. data/golden/us_tax_2024/expected/schema_javascript.mjs +813 -119
  299. data/golden/us_tax_2024/expected/schema_ruby.rb +762 -125
  300. data/golden/us_tax_2024/expected/vecir.txt +567 -0
  301. data/golden/vector_make_object/expected/ast.txt +22 -0
  302. data/golden/vector_make_object/expected/dfir.txt +6 -0
  303. data/golden/vector_make_object/expected/dfir_optimized.txt +6 -0
  304. data/golden/vector_make_object/expected/input_plan.txt +5 -0
  305. data/golden/vector_make_object/expected/loopir.txt +9 -0
  306. data/golden/vector_make_object/expected/nast.txt +8 -0
  307. data/golden/vector_make_object/expected/schema_javascript.mjs +13 -0
  308. data/golden/vector_make_object/expected/schema_ruby.rb +14 -0
  309. data/golden/vector_make_object/expected/snast.txt +8 -0
  310. data/golden/vector_make_object/expected/vecir.txt +7 -0
  311. data/golden/vector_make_object/schema.kumi +11 -0
  312. data/golden/with_constants/expected/dfir.txt +9 -0
  313. data/golden/with_constants/expected/dfir_optimized.txt +9 -0
  314. data/golden/with_constants/expected/loopir.txt +9 -0
  315. data/golden/with_constants/expected/schema_javascript.mjs +8 -3
  316. data/golden/with_constants/expected/schema_ruby.rb +9 -3
  317. data/golden/with_constants/expected/vecir.txt +9 -0
  318. data/lib/kumi/analyzer.rb +20 -27
  319. data/lib/kumi/core/analyzer/pass_manager.rb +6 -1
  320. data/lib/kumi/core/analyzer/passes/codegen/loop/js/emitter.rb +204 -0
  321. data/lib/kumi/core/analyzer/passes/codegen/loop/ruby/emitter.rb +212 -0
  322. data/lib/kumi/core/analyzer/passes/codegen/loop/ruby/output_buffer.rb +74 -0
  323. data/lib/kumi/core/analyzer/passes/codegen/loop_js_pass.rb +24 -0
  324. data/lib/kumi/core/analyzer/passes/codegen/loop_ruby_pass.rb +24 -0
  325. data/lib/kumi/core/analyzer/passes/df_validate_pass.rb +24 -0
  326. data/lib/kumi/core/analyzer/passes/loop/lower_pass.rb +28 -0
  327. data/lib/kumi/core/analyzer/passes/loop_validate_pass.rb +21 -0
  328. data/lib/kumi/core/analyzer/passes/lower_to_dfir_pass.rb +37 -0
  329. data/lib/kumi/core/analyzer/passes/vec/lower_pass.rb +24 -0
  330. data/lib/kumi/core/analyzer/passes/vec_validate_pass.rb +21 -0
  331. data/lib/kumi/core/analyzer/plans.rb +2 -3
  332. data/lib/kumi/core/compiler/access_planner_v2.rb +33 -2
  333. data/lib/kumi/dev/golden/representation.rb +4 -7
  334. data/lib/kumi/dev/golden_v2.rb +292 -0
  335. data/lib/kumi/dev/pretty_printer.rb +42 -67
  336. data/lib/kumi/ir/README.md +163 -0
  337. data/lib/kumi/ir/base/block.rb +32 -0
  338. data/lib/kumi/ir/base/builder.rb +43 -0
  339. data/lib/kumi/ir/base/function.rb +45 -0
  340. data/lib/kumi/ir/base/instruction.rb +206 -0
  341. data/lib/kumi/ir/base/module.rb +37 -0
  342. data/lib/kumi/ir/base.rb +10 -0
  343. data/lib/kumi/ir/buf/lower.rb +28 -0
  344. data/lib/kumi/ir/buf/pipeline.rb +19 -0
  345. data/lib/kumi/ir/buf.rb +29 -0
  346. data/lib/kumi/ir/df/access_contract.rb +87 -0
  347. data/lib/kumi/ir/df/import_inliner.rb +89 -0
  348. data/lib/kumi/ir/df/import_loader.rb +63 -0
  349. data/lib/kumi/ir/df/lower.rb +397 -0
  350. data/lib/kumi/ir/df/ops/array_build.rb +23 -0
  351. data/lib/kumi/ir/df/ops/array_get.rb +29 -0
  352. data/lib/kumi/ir/df/ops/array_len.rb +23 -0
  353. data/lib/kumi/ir/df/ops/axis_broadcast.rb +28 -0
  354. data/lib/kumi/ir/df/ops/axis_index.rb +23 -0
  355. data/lib/kumi/ir/df/ops/axis_shift.rb +35 -0
  356. data/lib/kumi/ir/df/ops/constant.rb +21 -0
  357. data/lib/kumi/ir/df/ops/decl_ref.rb +23 -0
  358. data/lib/kumi/ir/df/ops/fold.rb +25 -0
  359. data/lib/kumi/ir/df/ops/import_call.rb +25 -0
  360. data/lib/kumi/ir/df/ops/load_field.rb +33 -0
  361. data/lib/kumi/ir/df/ops/load_input.rb +31 -0
  362. data/lib/kumi/ir/df/ops/make_object.rb +23 -0
  363. data/lib/kumi/ir/df/ops/map.rb +21 -0
  364. data/lib/kumi/ir/df/ops/node.rb +46 -0
  365. data/lib/kumi/ir/df/ops/reduce.rb +27 -0
  366. data/lib/kumi/ir/df/ops/select.rb +25 -0
  367. data/lib/kumi/ir/df/ops.rb +10 -0
  368. data/lib/kumi/ir/df/passes/broadcast_simplify.rb +74 -0
  369. data/lib/kumi/ir/df/passes/cse.rb +51 -0
  370. data/lib/kumi/ir/df/passes/decl_inlining.rb +131 -0
  371. data/lib/kumi/ir/df/passes/import_inlining.rb +272 -0
  372. data/lib/kumi/ir/df/passes/load_dedup.rb +93 -0
  373. data/lib/kumi/ir/df/passes/stencil_cse.rb +71 -0
  374. data/lib/kumi/ir/df/passes/support/instruction_cloner.rb +82 -0
  375. data/lib/kumi/ir/df/passes/tuple_fold_canonicalization.rb +181 -0
  376. data/lib/kumi/ir/df/passes/tuple_to_object.rb +58 -0
  377. data/lib/kumi/ir/df/passes.rb +11 -0
  378. data/lib/kumi/ir/df/pipeline.rb +32 -0
  379. data/lib/kumi/ir/df/validator.rb +120 -0
  380. data/lib/kumi/ir/df.rb +95 -0
  381. data/lib/kumi/ir/loop/builder.rb +84 -0
  382. data/lib/kumi/ir/loop/lower.rb +679 -0
  383. data/lib/kumi/ir/loop/ops/core_ops.rb +194 -0
  384. data/lib/kumi/ir/loop/ops/node.rb +45 -0
  385. data/lib/kumi/ir/loop/ops.rb +4 -0
  386. data/lib/kumi/ir/loop/pipeline.rb +19 -0
  387. data/lib/kumi/ir/loop/validator.rb +101 -0
  388. data/lib/kumi/ir/loop.rb +28 -0
  389. data/lib/kumi/ir/loop_definition.md +93 -0
  390. data/lib/kumi/ir/passes.rb +32 -0
  391. data/lib/kumi/ir/printer.rb +54 -0
  392. data/lib/kumi/ir/testing/snast_factory.rb +146 -0
  393. data/lib/kumi/ir/testing.rb +9 -0
  394. data/lib/kumi/ir/vec/lower.rb +131 -0
  395. data/lib/kumi/ir/vec/ops/core_ops.rb +126 -0
  396. data/lib/kumi/ir/vec/ops/node.rb +45 -0
  397. data/lib/kumi/ir/vec/ops.rb +13 -0
  398. data/lib/kumi/ir/vec/passes/axis_canonicalization.rb +57 -0
  399. data/lib/kumi/ir/vec/passes/constant_propagation.rb +110 -0
  400. data/lib/kumi/ir/vec/passes/dce.rb +52 -0
  401. data/lib/kumi/ir/vec/passes/gvn.rb +64 -0
  402. data/lib/kumi/ir/vec/passes/peephole_simplify.rb +67 -0
  403. data/lib/kumi/ir/vec/passes/stencil_detection.rb +60 -0
  404. data/lib/kumi/ir/vec/passes/support/instruction_cloner.rb +48 -0
  405. data/lib/kumi/ir/vec/passes.rb +16 -0
  406. data/lib/kumi/ir/vec/pipeline.rb +30 -0
  407. data/lib/kumi/ir/vec/validator.rb +68 -0
  408. data/lib/kumi/ir/vec.rb +66 -0
  409. data/lib/kumi/ir/vec_definition.md +102 -0
  410. data/lib/kumi/ir.rb +14 -0
  411. data/lib/kumi/support/nast_printer.rb +3 -0
  412. data/lib/kumi/version.rb +1 -1
  413. data/lib/kumi.rb +38 -37
  414. data/tasks/release.rake +129 -0
  415. metadata +298 -331
  416. data/CLAUDE.md +0 -45
  417. data/docs/COMPOSED_SCHEMAS.md +0 -137
  418. data/docs/GOLDEN_QUICK_START.md +0 -141
  419. data/golden/array_element/expected/lir_00_unoptimized.txt +0 -13
  420. data/golden/array_element/expected/lir_01_hoist_scalar_references.txt +0 -13
  421. data/golden/array_element/expected/lir_02_inlined.txt +0 -13
  422. data/golden/array_element/expected/lir_03_cse.txt +0 -13
  423. data/golden/array_element/expected/lir_04_1_loop_fusion.txt +0 -13
  424. data/golden/array_element/expected/lir_04_loop_invcm.txt +0 -13
  425. data/golden/array_element/expected/lir_06_const_prop.txt +0 -13
  426. data/golden/array_index/expected/lir_00_unoptimized.txt +0 -41
  427. data/golden/array_index/expected/lir_01_hoist_scalar_references.txt +0 -41
  428. data/golden/array_index/expected/lir_02_inlined.txt +0 -42
  429. data/golden/array_index/expected/lir_03_cse.txt +0 -40
  430. data/golden/array_index/expected/lir_04_1_loop_fusion.txt +0 -40
  431. data/golden/array_index/expected/lir_04_loop_invcm.txt +0 -40
  432. data/golden/array_index/expected/lir_06_const_prop.txt +0 -40
  433. data/golden/array_operations/expected/lir_00_unoptimized.txt +0 -47
  434. data/golden/array_operations/expected/lir_01_hoist_scalar_references.txt +0 -47
  435. data/golden/array_operations/expected/lir_02_inlined.txt +0 -47
  436. data/golden/array_operations/expected/lir_03_cse.txt +0 -47
  437. data/golden/array_operations/expected/lir_04_1_loop_fusion.txt +0 -47
  438. data/golden/array_operations/expected/lir_04_loop_invcm.txt +0 -47
  439. data/golden/array_operations/expected/lir_06_const_prop.txt +0 -43
  440. data/golden/cascade_logic/expected/lir_00_unoptimized.txt +0 -29
  441. data/golden/cascade_logic/expected/lir_01_hoist_scalar_references.txt +0 -29
  442. data/golden/cascade_logic/expected/lir_02_inlined.txt +0 -37
  443. data/golden/cascade_logic/expected/lir_03_cse.txt +0 -30
  444. data/golden/cascade_logic/expected/lir_04_1_loop_fusion.txt +0 -30
  445. data/golden/cascade_logic/expected/lir_04_loop_invcm.txt +0 -30
  446. data/golden/cascade_logic/expected/lir_06_const_prop.txt +0 -23
  447. data/golden/chained_fusion/expected/lir_00_unoptimized.txt +0 -76
  448. data/golden/chained_fusion/expected/lir_01_hoist_scalar_references.txt +0 -76
  449. data/golden/chained_fusion/expected/lir_02_inlined.txt +0 -114
  450. data/golden/chained_fusion/expected/lir_03_cse.txt +0 -97
  451. data/golden/chained_fusion/expected/lir_04_1_loop_fusion.txt +0 -99
  452. data/golden/chained_fusion/expected/lir_04_loop_invcm.txt +0 -97
  453. data/golden/chained_fusion/expected/lir_06_const_prop.txt +0 -87
  454. data/golden/decimal_explicit/expected/lir_00_unoptimized.txt +0 -30
  455. data/golden/decimal_explicit/expected/lir_01_hoist_scalar_references.txt +0 -30
  456. data/golden/decimal_explicit/expected/lir_02_inlined.txt +0 -44
  457. data/golden/decimal_explicit/expected/lir_03_cse.txt +0 -40
  458. data/golden/decimal_explicit/expected/lir_04_1_loop_fusion.txt +0 -40
  459. data/golden/decimal_explicit/expected/lir_04_loop_invcm.txt +0 -40
  460. data/golden/decimal_explicit/expected/lir_06_const_prop.txt +0 -40
  461. data/golden/element_arrays/expected/lir_00_unoptimized.txt +0 -81
  462. data/golden/element_arrays/expected/lir_01_hoist_scalar_references.txt +0 -81
  463. data/golden/element_arrays/expected/lir_02_inlined.txt +0 -85
  464. data/golden/element_arrays/expected/lir_03_cse.txt +0 -83
  465. data/golden/element_arrays/expected/lir_04_1_loop_fusion.txt +0 -83
  466. data/golden/element_arrays/expected/lir_04_loop_invcm.txt +0 -83
  467. data/golden/element_arrays/expected/lir_06_const_prop.txt +0 -77
  468. data/golden/empty_and_null_inputs/expected/lir_00_unoptimized.txt +0 -31
  469. data/golden/empty_and_null_inputs/expected/lir_01_hoist_scalar_references.txt +0 -31
  470. data/golden/empty_and_null_inputs/expected/lir_02_inlined.txt +0 -51
  471. data/golden/empty_and_null_inputs/expected/lir_03_cse.txt +0 -49
  472. data/golden/empty_and_null_inputs/expected/lir_04_1_loop_fusion.txt +0 -49
  473. data/golden/empty_and_null_inputs/expected/lir_04_loop_invcm.txt +0 -49
  474. data/golden/empty_and_null_inputs/expected/lir_06_const_prop.txt +0 -49
  475. data/golden/example_xpto/expected/lir_00_unoptimized.txt +0 -16
  476. data/golden/example_xpto/expected/lir_01_hoist_scalar_references.txt +0 -16
  477. data/golden/example_xpto/expected/lir_02_inlined.txt +0 -16
  478. data/golden/example_xpto/expected/lir_03_cse.txt +0 -16
  479. data/golden/example_xpto/expected/lir_04_1_loop_fusion.txt +0 -16
  480. data/golden/example_xpto/expected/lir_04_loop_invcm.txt +0 -16
  481. data/golden/example_xpto/expected/lir_06_const_prop.txt +0 -13
  482. data/golden/function_overload/expected/lir_00_unoptimized.txt +0 -18
  483. data/golden/function_overload/expected/lir_01_hoist_scalar_references.txt +0 -18
  484. data/golden/function_overload/expected/lir_02_inlined.txt +0 -20
  485. data/golden/function_overload/expected/lir_03_cse.txt +0 -20
  486. data/golden/function_overload/expected/lir_04_1_loop_fusion.txt +0 -20
  487. data/golden/function_overload/expected/lir_04_loop_invcm.txt +0 -20
  488. data/golden/function_overload/expected/lir_06_const_prop.txt +0 -20
  489. data/golden/game_of_life/expected/lir_00_unoptimized.txt +0 -343
  490. data/golden/game_of_life/expected/lir_01_hoist_scalar_references.txt +0 -343
  491. data/golden/game_of_life/expected/lir_02_inlined.txt +0 -1918
  492. data/golden/game_of_life/expected/lir_03_cse.txt +0 -770
  493. data/golden/game_of_life/expected/lir_04_1_loop_fusion.txt +0 -770
  494. data/golden/game_of_life/expected/lir_04_loop_invcm.txt +0 -770
  495. data/golden/game_of_life/expected/lir_06_const_prop.txt +0 -719
  496. data/golden/hash_keys/expected/lir_00_unoptimized.txt +0 -18
  497. data/golden/hash_keys/expected/lir_01_hoist_scalar_references.txt +0 -18
  498. data/golden/hash_keys/expected/lir_02_inlined.txt +0 -18
  499. data/golden/hash_keys/expected/lir_03_cse.txt +0 -18
  500. data/golden/hash_keys/expected/lir_04_1_loop_fusion.txt +0 -18
  501. data/golden/hash_keys/expected/lir_04_loop_invcm.txt +0 -18
  502. data/golden/hash_keys/expected/lir_06_const_prop.txt +0 -12
  503. data/golden/hash_value/expected/lir_00_unoptimized.txt +0 -30
  504. data/golden/hash_value/expected/lir_01_hoist_scalar_references.txt +0 -30
  505. data/golden/hash_value/expected/lir_02_inlined.txt +0 -36
  506. data/golden/hash_value/expected/lir_03_cse.txt +0 -33
  507. data/golden/hash_value/expected/lir_04_1_loop_fusion.txt +0 -33
  508. data/golden/hash_value/expected/lir_04_loop_invcm.txt +0 -33
  509. data/golden/hash_value/expected/lir_06_const_prop.txt +0 -30
  510. data/golden/hierarchical_complex/expected/lir_00_unoptimized.txt +0 -87
  511. data/golden/hierarchical_complex/expected/lir_01_hoist_scalar_references.txt +0 -87
  512. data/golden/hierarchical_complex/expected/lir_02_inlined.txt +0 -115
  513. data/golden/hierarchical_complex/expected/lir_03_cse.txt +0 -89
  514. data/golden/hierarchical_complex/expected/lir_04_1_loop_fusion.txt +0 -89
  515. data/golden/hierarchical_complex/expected/lir_04_loop_invcm.txt +0 -89
  516. data/golden/hierarchical_complex/expected/lir_06_const_prop.txt +0 -80
  517. data/golden/inline_rename_scope_leak/expected/lir_00_unoptimized.txt +0 -35
  518. data/golden/inline_rename_scope_leak/expected/lir_01_hoist_scalar_references.txt +0 -35
  519. data/golden/inline_rename_scope_leak/expected/lir_02_inlined.txt +0 -49
  520. data/golden/inline_rename_scope_leak/expected/lir_03_cse.txt +0 -49
  521. data/golden/inline_rename_scope_leak/expected/lir_04_1_loop_fusion.txt +0 -49
  522. data/golden/inline_rename_scope_leak/expected/lir_04_loop_invcm.txt +0 -49
  523. data/golden/inline_rename_scope_leak/expected/lir_06_const_prop.txt +0 -45
  524. data/golden/input_reference/expected/lir_00_unoptimized.txt +0 -39
  525. data/golden/input_reference/expected/lir_01_hoist_scalar_references.txt +0 -39
  526. data/golden/input_reference/expected/lir_02_inlined.txt +0 -39
  527. data/golden/input_reference/expected/lir_03_cse.txt +0 -39
  528. data/golden/input_reference/expected/lir_04_1_loop_fusion.txt +0 -39
  529. data/golden/input_reference/expected/lir_04_loop_invcm.txt +0 -39
  530. data/golden/input_reference/expected/lir_06_const_prop.txt +0 -39
  531. data/golden/interleaved_fusion/expected/lir_00_unoptimized.txt +0 -53
  532. data/golden/interleaved_fusion/expected/lir_01_hoist_scalar_references.txt +0 -53
  533. data/golden/interleaved_fusion/expected/lir_02_inlined.txt +0 -89
  534. data/golden/interleaved_fusion/expected/lir_03_cse.txt +0 -77
  535. data/golden/interleaved_fusion/expected/lir_04_1_loop_fusion.txt +0 -78
  536. data/golden/interleaved_fusion/expected/lir_04_loop_invcm.txt +0 -77
  537. data/golden/interleaved_fusion/expected/lir_06_const_prop.txt +0 -69
  538. data/golden/let_inline/expected/lir_00_unoptimized.txt +0 -26
  539. data/golden/let_inline/expected/lir_01_hoist_scalar_references.txt +0 -26
  540. data/golden/let_inline/expected/lir_02_inlined.txt +0 -36
  541. data/golden/let_inline/expected/lir_03_cse.txt +0 -30
  542. data/golden/let_inline/expected/lir_04_1_loop_fusion.txt +0 -30
  543. data/golden/let_inline/expected/lir_04_loop_invcm.txt +0 -30
  544. data/golden/let_inline/expected/lir_06_const_prop.txt +0 -29
  545. data/golden/loop_fusion/expected/lir_00_unoptimized.txt +0 -43
  546. data/golden/loop_fusion/expected/lir_01_hoist_scalar_references.txt +0 -43
  547. data/golden/loop_fusion/expected/lir_02_inlined.txt +0 -62
  548. data/golden/loop_fusion/expected/lir_03_cse.txt +0 -57
  549. data/golden/loop_fusion/expected/lir_04_1_loop_fusion.txt +0 -57
  550. data/golden/loop_fusion/expected/lir_04_loop_invcm.txt +0 -57
  551. data/golden/loop_fusion/expected/lir_06_const_prop.txt +0 -51
  552. data/golden/min_reduce_scope/expected/lir_00_unoptimized.txt +0 -59
  553. data/golden/min_reduce_scope/expected/lir_01_hoist_scalar_references.txt +0 -59
  554. data/golden/min_reduce_scope/expected/lir_02_inlined.txt +0 -63
  555. data/golden/min_reduce_scope/expected/lir_03_cse.txt +0 -60
  556. data/golden/min_reduce_scope/expected/lir_04_1_loop_fusion.txt +0 -60
  557. data/golden/min_reduce_scope/expected/lir_04_loop_invcm.txt +0 -60
  558. data/golden/min_reduce_scope/expected/lir_06_const_prop.txt +0 -57
  559. data/golden/mixed_dimensions/expected/lir_00_unoptimized.txt +0 -42
  560. data/golden/mixed_dimensions/expected/lir_01_hoist_scalar_references.txt +0 -42
  561. data/golden/mixed_dimensions/expected/lir_02_inlined.txt +0 -48
  562. data/golden/mixed_dimensions/expected/lir_03_cse.txt +0 -48
  563. data/golden/mixed_dimensions/expected/lir_04_1_loop_fusion.txt +0 -48
  564. data/golden/mixed_dimensions/expected/lir_04_loop_invcm.txt +0 -48
  565. data/golden/mixed_dimensions/expected/lir_06_const_prop.txt +0 -47
  566. data/golden/multirank_hoisting/expected/lir_00_unoptimized.txt +0 -75
  567. data/golden/multirank_hoisting/expected/lir_01_hoist_scalar_references.txt +0 -75
  568. data/golden/multirank_hoisting/expected/lir_02_inlined.txt +0 -126
  569. data/golden/multirank_hoisting/expected/lir_03_cse.txt +0 -109
  570. data/golden/multirank_hoisting/expected/lir_04_1_loop_fusion.txt +0 -109
  571. data/golden/multirank_hoisting/expected/lir_04_loop_invcm.txt +0 -109
  572. data/golden/multirank_hoisting/expected/lir_06_const_prop.txt +0 -100
  573. data/golden/nested_hash/expected/lir_00_unoptimized.txt +0 -10
  574. data/golden/nested_hash/expected/lir_01_hoist_scalar_references.txt +0 -10
  575. data/golden/nested_hash/expected/lir_02_inlined.txt +0 -10
  576. data/golden/nested_hash/expected/lir_03_cse.txt +0 -10
  577. data/golden/nested_hash/expected/lir_04_1_loop_fusion.txt +0 -10
  578. data/golden/nested_hash/expected/lir_04_loop_invcm.txt +0 -10
  579. data/golden/nested_hash/expected/lir_06_const_prop.txt +0 -9
  580. data/golden/reduction_broadcast/expected/lir_00_unoptimized.txt +0 -49
  581. data/golden/reduction_broadcast/expected/lir_01_hoist_scalar_references.txt +0 -49
  582. data/golden/reduction_broadcast/expected/lir_02_inlined.txt +0 -80
  583. data/golden/reduction_broadcast/expected/lir_03_cse.txt +0 -68
  584. data/golden/reduction_broadcast/expected/lir_04_1_loop_fusion.txt +0 -68
  585. data/golden/reduction_broadcast/expected/lir_04_loop_invcm.txt +0 -68
  586. data/golden/reduction_broadcast/expected/lir_06_const_prop.txt +0 -68
  587. data/golden/roll/expected/lir_00_unoptimized.txt +0 -56
  588. data/golden/roll/expected/lir_01_hoist_scalar_references.txt +0 -56
  589. data/golden/roll/expected/lir_02_inlined.txt +0 -56
  590. data/golden/roll/expected/lir_03_cse.txt +0 -55
  591. data/golden/roll/expected/lir_04_1_loop_fusion.txt +0 -55
  592. data/golden/roll/expected/lir_04_loop_invcm.txt +0 -55
  593. data/golden/roll/expected/lir_06_const_prop.txt +0 -48
  594. data/golden/schema_imports_broadcasting_with_imports/expected/lir_00_unoptimized.txt +0 -20
  595. data/golden/schema_imports_broadcasting_with_imports/expected/lir_01_hoist_scalar_references.txt +0 -20
  596. data/golden/schema_imports_broadcasting_with_imports/expected/lir_02_inlined.txt +0 -22
  597. data/golden/schema_imports_broadcasting_with_imports/expected/lir_03_cse.txt +0 -21
  598. data/golden/schema_imports_broadcasting_with_imports/expected/lir_04_1_loop_fusion.txt +0 -21
  599. data/golden/schema_imports_broadcasting_with_imports/expected/lir_04_loop_invcm.txt +0 -21
  600. data/golden/schema_imports_broadcasting_with_imports/expected/lir_06_const_prop.txt +0 -21
  601. data/golden/schema_imports_complex_order_calc/expected/lir_00_unoptimized.txt +0 -94
  602. data/golden/schema_imports_complex_order_calc/expected/lir_01_hoist_scalar_references.txt +0 -94
  603. data/golden/schema_imports_complex_order_calc/expected/lir_02_inlined.txt +0 -187
  604. data/golden/schema_imports_complex_order_calc/expected/lir_03_cse.txt +0 -131
  605. data/golden/schema_imports_complex_order_calc/expected/lir_04_1_loop_fusion.txt +0 -131
  606. data/golden/schema_imports_complex_order_calc/expected/lir_04_loop_invcm.txt +0 -131
  607. data/golden/schema_imports_complex_order_calc/expected/lir_06_const_prop.txt +0 -131
  608. data/golden/schema_imports_composed_order/expected/lir_00_unoptimized.txt +0 -25
  609. data/golden/schema_imports_composed_order/expected/lir_01_hoist_scalar_references.txt +0 -25
  610. data/golden/schema_imports_composed_order/expected/lir_02_inlined.txt +0 -33
  611. data/golden/schema_imports_composed_order/expected/lir_03_cse.txt +0 -33
  612. data/golden/schema_imports_composed_order/expected/lir_04_1_loop_fusion.txt +0 -33
  613. data/golden/schema_imports_composed_order/expected/lir_04_loop_invcm.txt +0 -33
  614. data/golden/schema_imports_composed_order/expected/lir_06_const_prop.txt +0 -33
  615. data/golden/schema_imports_discount_with_tax/expected/lir_00_unoptimized.txt +0 -30
  616. data/golden/schema_imports_discount_with_tax/expected/lir_01_hoist_scalar_references.txt +0 -30
  617. data/golden/schema_imports_discount_with_tax/expected/lir_02_inlined.txt +0 -37
  618. data/golden/schema_imports_discount_with_tax/expected/lir_03_cse.txt +0 -34
  619. data/golden/schema_imports_discount_with_tax/expected/lir_04_1_loop_fusion.txt +0 -34
  620. data/golden/schema_imports_discount_with_tax/expected/lir_04_loop_invcm.txt +0 -34
  621. data/golden/schema_imports_discount_with_tax/expected/lir_06_const_prop.txt +0 -34
  622. data/golden/schema_imports_line_items/expected/lir_00_unoptimized.txt +0 -19
  623. data/golden/schema_imports_line_items/expected/lir_01_hoist_scalar_references.txt +0 -19
  624. data/golden/schema_imports_line_items/expected/lir_02_inlined.txt +0 -24
  625. data/golden/schema_imports_line_items/expected/lir_03_cse.txt +0 -22
  626. data/golden/schema_imports_line_items/expected/lir_04_1_loop_fusion.txt +0 -22
  627. data/golden/schema_imports_line_items/expected/lir_04_loop_invcm.txt +0 -22
  628. data/golden/schema_imports_line_items/expected/lir_06_const_prop.txt +0 -22
  629. data/golden/schema_imports_multiple/expected/lir_00_unoptimized.txt +0 -29
  630. data/golden/schema_imports_multiple/expected/lir_01_hoist_scalar_references.txt +0 -29
  631. data/golden/schema_imports_multiple/expected/lir_02_inlined.txt +0 -41
  632. data/golden/schema_imports_multiple/expected/lir_03_cse.txt +0 -37
  633. data/golden/schema_imports_multiple/expected/lir_04_1_loop_fusion.txt +0 -37
  634. data/golden/schema_imports_multiple/expected/lir_04_loop_invcm.txt +0 -37
  635. data/golden/schema_imports_multiple/expected/lir_06_const_prop.txt +0 -37
  636. data/golden/schema_imports_nested_expressions/expected/lir_00_unoptimized.txt +0 -22
  637. data/golden/schema_imports_nested_expressions/expected/lir_01_hoist_scalar_references.txt +0 -22
  638. data/golden/schema_imports_nested_expressions/expected/lir_02_inlined.txt +0 -32
  639. data/golden/schema_imports_nested_expressions/expected/lir_03_cse.txt +0 -32
  640. data/golden/schema_imports_nested_expressions/expected/lir_04_1_loop_fusion.txt +0 -32
  641. data/golden/schema_imports_nested_expressions/expected/lir_04_loop_invcm.txt +0 -32
  642. data/golden/schema_imports_nested_expressions/expected/lir_06_const_prop.txt +0 -28
  643. data/golden/schema_imports_nested_with_reductions/expected/lir_00_unoptimized.txt +0 -31
  644. data/golden/schema_imports_nested_with_reductions/expected/lir_01_hoist_scalar_references.txt +0 -31
  645. data/golden/schema_imports_nested_with_reductions/expected/lir_02_inlined.txt +0 -58
  646. data/golden/schema_imports_nested_with_reductions/expected/lir_03_cse.txt +0 -49
  647. data/golden/schema_imports_nested_with_reductions/expected/lir_04_1_loop_fusion.txt +0 -51
  648. data/golden/schema_imports_nested_with_reductions/expected/lir_04_loop_invcm.txt +0 -49
  649. data/golden/schema_imports_nested_with_reductions/expected/lir_06_const_prop.txt +0 -49
  650. data/golden/schema_imports_with_imports/expected/lir_00_unoptimized.txt +0 -13
  651. data/golden/schema_imports_with_imports/expected/lir_01_hoist_scalar_references.txt +0 -13
  652. data/golden/schema_imports_with_imports/expected/lir_02_inlined.txt +0 -14
  653. data/golden/schema_imports_with_imports/expected/lir_03_cse.txt +0 -13
  654. data/golden/schema_imports_with_imports/expected/lir_04_1_loop_fusion.txt +0 -13
  655. data/golden/schema_imports_with_imports/expected/lir_04_loop_invcm.txt +0 -13
  656. data/golden/schema_imports_with_imports/expected/lir_06_const_prop.txt +0 -13
  657. data/golden/shift/expected/lir_00_unoptimized.txt +0 -96
  658. data/golden/shift/expected/lir_01_hoist_scalar_references.txt +0 -96
  659. data/golden/shift/expected/lir_02_inlined.txt +0 -96
  660. data/golden/shift/expected/lir_03_cse.txt +0 -90
  661. data/golden/shift/expected/lir_04_1_loop_fusion.txt +0 -90
  662. data/golden/shift/expected/lir_04_loop_invcm.txt +0 -90
  663. data/golden/shift/expected/lir_06_const_prop.txt +0 -78
  664. data/golden/shift_2d/expected/lir_00_unoptimized.txt +0 -274
  665. data/golden/shift_2d/expected/lir_01_hoist_scalar_references.txt +0 -274
  666. data/golden/shift_2d/expected/lir_02_inlined.txt +0 -274
  667. data/golden/shift_2d/expected/lir_03_cse.txt +0 -262
  668. data/golden/shift_2d/expected/lir_04_1_loop_fusion.txt +0 -262
  669. data/golden/shift_2d/expected/lir_04_loop_invcm.txt +0 -262
  670. data/golden/shift_2d/expected/lir_06_const_prop.txt +0 -238
  671. data/golden/simple_math/expected/lir_00_unoptimized.txt +0 -31
  672. data/golden/simple_math/expected/lir_01_hoist_scalar_references.txt +0 -31
  673. data/golden/simple_math/expected/lir_02_inlined.txt +0 -31
  674. data/golden/simple_math/expected/lir_03_cse.txt +0 -31
  675. data/golden/simple_math/expected/lir_04_1_loop_fusion.txt +0 -31
  676. data/golden/simple_math/expected/lir_04_loop_invcm.txt +0 -31
  677. data/golden/simple_math/expected/lir_06_const_prop.txt +0 -28
  678. data/golden/streaming_basics/expected/lir_00_unoptimized.txt +0 -73
  679. data/golden/streaming_basics/expected/lir_01_hoist_scalar_references.txt +0 -73
  680. data/golden/streaming_basics/expected/lir_02_inlined.txt +0 -100
  681. data/golden/streaming_basics/expected/lir_03_cse.txt +0 -84
  682. data/golden/streaming_basics/expected/lir_04_1_loop_fusion.txt +0 -84
  683. data/golden/streaming_basics/expected/lir_04_loop_invcm.txt +0 -84
  684. data/golden/streaming_basics/expected/lir_06_const_prop.txt +0 -78
  685. data/golden/tuples/expected/lir_00_unoptimized.txt +0 -40
  686. data/golden/tuples/expected/lir_01_hoist_scalar_references.txt +0 -40
  687. data/golden/tuples/expected/lir_02_inlined.txt +0 -48
  688. data/golden/tuples/expected/lir_03_cse.txt +0 -48
  689. data/golden/tuples/expected/lir_04_1_loop_fusion.txt +0 -48
  690. data/golden/tuples/expected/lir_04_loop_invcm.txt +0 -48
  691. data/golden/tuples/expected/lir_06_const_prop.txt +0 -31
  692. data/golden/tuples_and_arrays/expected/lir_00_unoptimized.txt +0 -41
  693. data/golden/tuples_and_arrays/expected/lir_01_hoist_scalar_references.txt +0 -41
  694. data/golden/tuples_and_arrays/expected/lir_02_inlined.txt +0 -62
  695. data/golden/tuples_and_arrays/expected/lir_03_cse.txt +0 -51
  696. data/golden/tuples_and_arrays/expected/lir_04_1_loop_fusion.txt +0 -51
  697. data/golden/tuples_and_arrays/expected/lir_04_loop_invcm.txt +0 -51
  698. data/golden/tuples_and_arrays/expected/lir_06_const_prop.txt +0 -47
  699. data/golden/us_tax_2024/expected/lir_00_unoptimized.txt +0 -291
  700. data/golden/us_tax_2024/expected/lir_01_hoist_scalar_references.txt +0 -291
  701. data/golden/us_tax_2024/expected/lir_02_inlined.txt +0 -1254
  702. data/golden/us_tax_2024/expected/lir_03_cse.txt +0 -626
  703. data/golden/us_tax_2024/expected/lir_04_1_loop_fusion.txt +0 -671
  704. data/golden/us_tax_2024/expected/lir_04_loop_invcm.txt +0 -626
  705. data/golden/us_tax_2024/expected/lir_06_const_prop.txt +0 -549
  706. data/golden/with_constants/expected/lir_00_unoptimized.txt +0 -17
  707. data/golden/with_constants/expected/lir_01_hoist_scalar_references.txt +0 -17
  708. data/golden/with_constants/expected/lir_02_inlined.txt +0 -17
  709. data/golden/with_constants/expected/lir_03_cse.txt +0 -17
  710. data/golden/with_constants/expected/lir_04_1_loop_fusion.txt +0 -17
  711. data/golden/with_constants/expected/lir_04_loop_invcm.txt +0 -17
  712. data/golden/with_constants/expected/lir_06_const_prop.txt +0 -12
  713. data/lib/kumi/core/analyzer/passes/codegen/js/declaration_emitter.rb +0 -337
  714. data/lib/kumi/core/analyzer/passes/codegen/js/emitter.rb +0 -75
  715. data/lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb +0 -103
  716. data/lib/kumi/core/analyzer/passes/codegen/js_pass.rb +0 -27
  717. data/lib/kumi/core/analyzer/passes/codegen/ruby/declaration_emitter.rb +0 -330
  718. data/lib/kumi/core/analyzer/passes/codegen/ruby/emitter.rb +0 -85
  719. data/lib/kumi/core/analyzer/passes/codegen/ruby/output_buffer.rb +0 -79
  720. data/lib/kumi/core/analyzer/passes/codegen/ruby_pass.rb +0 -32
  721. data/lib/kumi/core/analyzer/passes/lir/constant_propagation_pass.rb +0 -125
  722. data/lib/kumi/core/analyzer/passes/lir/dead_code_elimination_pass.rb +0 -93
  723. data/lib/kumi/core/analyzer/passes/lir/hoist_scalar_references_pass.rb +0 -115
  724. data/lib/kumi/core/analyzer/passes/lir/inline_declarations_pass.rb +0 -394
  725. data/lib/kumi/core/analyzer/passes/lir/instruction_scheduling_pass.rb +0 -198
  726. data/lib/kumi/core/analyzer/passes/lir/kernel_binding_pass.rb +0 -30
  727. data/lib/kumi/core/analyzer/passes/lir/local_cse_pass.rb +0 -121
  728. data/lib/kumi/core/analyzer/passes/lir/loop_fusion_pass.rb +0 -156
  729. data/lib/kumi/core/analyzer/passes/lir/loop_invariant_code_motion_pass.rb +0 -148
  730. data/lib/kumi/core/analyzer/passes/lir/lower_pass.rb +0 -422
  731. data/lib/kumi/core/analyzer/passes/lir/stencil_emitter.rb +0 -241
  732. data/lib/kumi/core/analyzer/passes/lir/validation_pass.rb +0 -83
  733. data/lib/kumi/core/lir/analyze.rb +0 -64
  734. data/lib/kumi/core/lir/build.rb +0 -390
  735. data/lib/kumi/core/lir/emit.rb +0 -62
  736. data/lib/kumi/core/lir/peephole.rb +0 -164
  737. data/lib/kumi/core/lir/structs/instruction.rb +0 -44
  738. data/lib/kumi/core/lir/structs/literal.rb +0 -14
  739. data/lib/kumi/core/lir/structs/stamp.rb +0 -13
  740. data/lib/kumi/core/lir/support/error.rb +0 -9
  741. data/lib/kumi/core/lir/support/ids.rb +0 -34
  742. data/lib/kumi/core/lir/validate.rb +0 -74
  743. data/lib/kumi/core/lir.rb +0 -34
  744. data/lib/kumi/support/lir_printer.rb +0 -159
data/docs/ARCHITECTURE.md CHANGED
@@ -1,277 +1,141 @@
1
- # Kumi Documentation & IDE Architecture
1
+ # Kumi Compiler Architecture
2
+
3
+ Kumi compiles schemas through a series of explicit semantic layers. Each layer
4
+ owns one kind of transformation, invariants are validated at layer boundaries,
5
+ and the backends emit syntax from fully normalized IR — never meaning from
6
+ partially-lowered IR.
7
+
8
+ ## Pipeline
9
+
10
+ ```text
11
+ Schema source (.kumi text or Ruby DSL)
12
+ -> AST parser output
13
+ -> NAST normalized AST
14
+ -> SNAST semantic AST with dimensional/type stamps
15
+ -> DFIR dataflow graph; access paths, imports, structural cleanup
16
+ -> VecIR axis-aware value semantics; every value stamped axes+dtype
17
+ -> LoopIR explicit execution structure: loops, accumulators, reads
18
+ -> Emitters Ruby / JavaScript serialization
19
+ ```
2
20
 
3
- ## Overview
21
+ The analyzer (`lib/kumi/analyzer.rb`) drives this as three pass groups:
4
22
 
5
- This document describes the automatic documentation generation system and IDE support infrastructure for Kumi functions and kernels.
23
+ - `DEFAULT_PASSES` name indexing, imports, input collection, validation,
24
+ dependency resolution, topo ordering, input access planning
25
+ - `LOWERING_PASSES` — NAST → SNAST → DFIR → VecIR → LoopIR, with a validator
26
+ pass after each IR boundary
27
+ - `TARGET_PASSES` — `Codegen::LoopRubyPass` and `Codegen::LoopJsPass`, which
28
+ serialize LoopIR
6
29
 
7
- ## System Architecture
30
+ ## Layer Responsibilities
8
31
 
9
- ```
10
- ┌─────────────────────────────────────┐
11
- │ Function & Kernel Definitions │
12
- ├─────────────────────────────────────┤
13
- │ data/functions/*.yaml │
14
- │ data/kernels/**/*.yaml │
15
- └──────────────┬──────────────────────┘
16
-
17
- ┌──────▼──────┐
18
- │ bin/kumi- │
19
- │ doc-gen │
20
- └──────┬──────┘
21
-
22
- ┌────────┴────────┐
23
- │ │
24
- ┌──▼───┐ ┌─────▼──────┐
25
- │ JSON │ │ Markdown │
26
- │ Data │ │ Reference │
27
- └──┬───┘ └─────┬──────┘
28
- │ │
29
- ┌───▼──────────┐ ┌───▼─────────────────┐
30
- │ IDE Tools │ │ Developers/Docs │
31
- ├──────────────┤ ├─────────────────────┤
32
- │ VSCode │ │ docs/FUNCTIONS.md │
33
- │ Monaco │ │ GitHub Reference │
34
- │ LSP Servers │ │ API Documentation │
35
- └──────────────┘ └─────────────────────┘
36
- ```
32
+ ### Frontend: AST, NAST, SNAST
37
33
 
38
- ## Core Components
39
-
40
- ### 1. Data Sources
41
-
42
- **Function Definitions** (`data/functions/*.yaml`)
43
- ```yaml
44
- functions:
45
- - id: agg.sum
46
- kind: reduce
47
- params: [{ name: source_value }]
48
- dtype: { rule: same_as, param: source_value }
49
- reduction_strategy: identity # KEY: Identity-based reducer
50
- aliases: ["sum"]
51
-
52
- - id: agg.min
53
- kind: reduce
54
- params: [{ name: source_value }]
55
- dtype: { rule: element_of, param: source_value }
56
- reduction_strategy: first_element # KEY: First-element reducer
57
- aliases: ["min"]
58
- ```
34
+ Source-language normalization and semantic preparation.
59
35
 
60
- **Kernel Implementations** (`data/kernels/ruby/*.yaml`)
61
- ```yaml
62
- kernels:
63
- - id: agg.sum:ruby:v1
64
- fn: agg.sum
65
- inline: "+= $1"
66
- impl: "(a,b)\n a + b"
67
- fold_inline: "= $0.sum"
68
- identity:
69
- float: 0.0
70
- integer: 0
71
- ```
36
+ - **AST** — parser output, close to source shape
37
+ - **NAST** — normalized form, removes frontend irregularity; constant folding
38
+ - **SNAST** — carries dimensional and type metadata, explicit enough to lower
72
39
 
73
- ### 2. Doc Generator Module
74
-
75
- **Location:** `lib/kumi/doc_generator/`
76
-
77
- #### Loader
78
- - Parses YAML files from `data/functions/` and `data/kernels/`
79
- - Returns raw function and kernel definitions
80
- - No transformation or filtering
81
-
82
- #### Merger
83
- - Combines function definitions with kernel implementations
84
- - Creates entries indexed by function aliases (so `sum`, `add`, `sub` all resolvable)
85
- - Extracts important metadata:
86
- - `reduction_strategy` - How the reducer initializes
87
- - `dtype` - Type inference rules
88
- - `arity` - Parameter count
89
- - `kernels` - Available implementations
90
-
91
- #### Formatters
92
-
93
- **Json Formatter**
94
- - Output: `docs/functions-reference.json`
95
- - Consumer: IDE plugins (VSCode, Monaco, etc.)
96
- - Data:
97
- - Function ID and aliases
98
- - Arity and parameter info
99
- - Type information
100
- - Kernel availability
101
- - **Reduction strategy** (for reducer distinction)
102
-
103
- **Markdown Formatter**
104
- - Output: `docs/FUNCTIONS.md`
105
- - Consumer: Developers, documentation sites
106
- - Presentation:
107
- - Human-readable function descriptions
108
- - Inline operations (`$0 = accumulator, $1 = element`)
109
- - Actual implementation code
110
- - Fold strategies
111
- - Identity values (when applicable)
112
- - **Reduction semantics** (monoid vs first-element)
113
-
114
- ### 3. VSCode Extension
115
-
116
- **Location:** `vscode-extension/`
117
-
118
- **Features:**
119
- - Autocomplete for functions when typing `fn(:`
120
- - Hover tooltips with signatures
121
- - Schema block context detection (Ruby files only)
122
- - Works with `.kumi` and `.rb` files
123
-
124
- **Components:**
125
- - `FunctionCompletionProvider` - Offers suggestions
126
- - `FunctionHoverProvider` - Shows detailed information
127
- - `isInSchemaBlock()` - Detects if inside `schema do...end` block (Ruby files)
128
-
129
- ## Key Design Decisions
130
-
131
- ### 1. Reduction Strategy Distinction
132
-
133
- **Problem:** Min/Max don't have identity values like Sum/Count do.
134
-
135
- **Solution:** Capture `reduction_strategy` from YAML:
136
- - `identity` → Monoid operation, can use identity element
137
- - `first_element` → First array element initializes accumulator
138
-
139
- **Display:**
140
- - Markdown shows: "Monoid operation with identity element" or "First element is initial value"
141
- - JSON includes: `"reduction_strategy": "identity" | "first_element"`
142
-
143
- ### 2. Kernel Implementation Visibility
144
-
145
- **Decision:** Show actual kernel code inline in markdown.
146
-
147
- **Benefits:**
148
- - Developers see what the function actually does
149
- - Inline operations (`+= $1` vs `= $1 if $1 < $0`) show the pattern
150
- - Implementation code is actual Ruby/JavaScript
151
-
152
- **Format:**
153
- ```markdown
154
- **Inline:** `+= $1` ($0 = accumulator, $1 = element)
155
- **Implementation:**
156
- ```ruby
157
- (a,b)
158
- a + b
159
- ```
160
- **Fold:** `= $0.sum`
161
- **Identity:** float: 0.0, integer: 0
162
- ```
40
+ Unsatisfiable-constraint detection and the output/input form schemas are
41
+ derived at this stage.
163
42
 
164
- ### 3. Single Source of Truth
43
+ ### DFIR
165
44
 
166
- **Flow:**
167
- ```
168
- YAML definitions
169
-
170
- bin/kumi-doc-gen (one command)
171
-
172
- ├→ docs/FUNCTIONS.md (auto-generated)
173
- ├→ docs/functions-reference.json (auto-generated)
174
- └→ IDE/Tools consume JSON
175
- ```
45
+ The first graph-shaped semantic layer.
176
46
 
177
- Changes to function definitions automatically flow to:
178
- - IDE completions
179
- - Markdown reference
180
- - JSON API
181
-
182
- ### 4. Context-Aware IDE Support
183
-
184
- **Ruby files:** Only offer completions inside `schema do...end` blocks
185
- - Prevents noise from unrelated `fn(:` calls
186
- - Tracks brace nesting to detect context
187
-
188
- **Kumi files:** Always available
189
- - Native language file type
190
-
191
- ## Data Model
192
-
193
- ### Function Entry (After Merge)
194
- ```json
195
- {
196
- "id": "agg.sum",
197
- "kind": "reduce",
198
- "arity": 1,
199
- "params": [{ "name": "source_value" }],
200
- "dtype": { "rule": "same_as", "param": "source_value" },
201
- "aliases": ["sum"],
202
- "reduction_strategy": "identity",
203
- "kernels": {
204
- "ruby": {
205
- "id": "agg.sum:ruby:v1",
206
- "inline": "+= $1",
207
- "impl": "(a,b)\n a + b",
208
- "fold_inline": "= $0.sum",
209
- "identity": { "float": 0.0, "integer": 0 }
210
- }
211
- }
212
- }
213
- ```
47
+ - lowers SNAST into per-declaration dataflow functions
48
+ - normalizes input traversal and access paths against the input plans
49
+ - inlines declaration references and **schema imports** (callee bodies are
50
+ spliced in; axis names and plan references are canonicalized to the
51
+ caller's input plans at this boundary)
52
+ - canonicalizes tuples/objects, runs CSE, dedup, and broadcast cleanup
214
53
 
215
- ## Usage Workflows
54
+ Bugs about input access, import behavior, or graph structure belong here.
216
55
 
217
- ### For End Users
56
+ ### VecIR
218
57
 
219
- **View function reference:**
220
- ```bash
221
- # Markdown documentation
222
- open docs/FUNCTIONS.md
58
+ Pure, declarative, axis-aware value semantics.
223
59
 
224
- # IDE support (VSCode)
225
- cd vscode-extension && npm install && npm run compile
226
- # Press F5 in VSCode
227
- ```
60
+ - every value is stamped with `axes` (named, ordered) and `dtype`
61
+ - broadcasts, shifts, indices, maps, selects, and reductions are explicit ops
62
+ - deterministic vector-level rewrites (GVN, canonicalization)
63
+ - no execution, storage, or target concerns
228
64
 
229
- ### For Developers
65
+ See [lib/kumi/ir/vec_definition.md](../lib/kumi/ir/vec_definition.md).
230
66
 
231
- **Modify functions:**
232
- 1. Update `data/functions/category/*.yaml`
233
- 2. Run `bin/kumi-doc-gen`
234
- 3. Commit both YAML and generated files
67
+ ### LoopIR
235
68
 
236
- **Add new reducer:**
237
- ```yaml
238
- - id: agg.product
239
- kind: reduce
240
- params: [{ name: source_value }]
241
- reduction_strategy: identity
242
- aliases: ["product"]
243
- ```
244
- Add kernel in `data/kernels/ruby/agg/numeric.yaml`, then regenerate docs.
69
+ The execution layer. Lowering from VecIR materializes:
245
70
 
246
- ## Extension Points
71
+ - loop nests (`loop_start`/`loop_end`) over axis carrier arrays
72
+ - reductions as `acc_init`/`acc_step`/`acc_load`
73
+ - `axis_index` as loop index registers; `axis_shift` as policy-explicit
74
+ shifted reads
75
+ - materialization (`array_init`/`array_push`/`index_read`) for values that
76
+ cross loop boundaries
247
77
 
248
- The architecture supports adding:
78
+ After LoopIR, emitters never infer axes, rediscover broadcasts, or branch on
79
+ rank. If a backend still needs vector semantics to emit code, LoopIR is not
80
+ finished.
249
81
 
250
- 1. **New formatters** (HTML, PDF, LSP protocol)
251
- 2. **New generators** (TypeScript definitions, GraphQL schema)
252
- 3. **New IDE support** (Neovim, Emacs plugins via LSP)
253
- 4. **Validation** (against declared types/arity)
82
+ See [lib/kumi/ir/loop_definition.md](../lib/kumi/ir/loop_definition.md).
254
83
 
255
- All through the same YAML source data.
84
+ ### BufIR
256
85
 
257
- ## Testing
86
+ A reserved boundary for storage concerns (allocation, lifetimes, layout).
87
+ LoopIR currently stays a pure execution layer and emitters serialize it
88
+ directly, so BufIR remains a stub. It becomes a real phase only if LoopIR
89
+ starts absorbing storage policy or emitters need layout knowledge.
258
90
 
259
- - 8 comprehensive tests for doc generation
260
- - All 944 existing Kumi tests pass
261
- - No regression in core functionality
91
+ ### Emitters
262
92
 
263
- ## Performance
93
+ Mechanical serializers (`Codegen::Loop::Ruby::Emitter`,
94
+ `Codegen::Loop::Js::Emitter`). Every LoopIR opcode maps to a fixed syntax
95
+ shape; emitters own naming, literal formatting, and kernel
96
+ inlining/helper emission — nothing semantic.
264
97
 
265
- - **Generation time:** <100ms for all functions
266
- - **File sizes:**
267
- - FUNCTIONS.md: ~950 lines
268
- - functions-reference.json: ~1800 lines
269
- - **IDE load time:** Instant (JSON loaded once on activation)
98
+ The architecture is healthy when emitter code is boring.
99
+
100
+ ## Boundary Validators
101
+
102
+ Each IR boundary ends with a validator pass the executable form of the
103
+ layer contract, not optional diagnostics:
104
+
105
+ - **`DFValidatePass`** — legal op families, access-path rules, root-only
106
+ `load_input`, object/tuple sanity
107
+ - **`VecValidatePass`** — axes/dtype present on every value, broadcast and
108
+ reduction shape rules
109
+ - **`LoopValidatePass`** — only execution opcodes, balanced loops,
110
+ defs-before-use, defined returns
111
+
112
+ Validator specs include negative cases for illegal states, not only golden
113
+ snapshots of successful pipelines.
114
+
115
+ ## Ownership Rule
116
+
117
+ When deciding where a fix belongs:
118
+
119
+ - meaning, traversal, axes, broadcast, or reduction semantics → DFIR / VecIR /
120
+ LoopIR
121
+ - materialization, layout, ownership, temporary storage → BufIR
122
+ - emitted target syntax only → the emitter
123
+
124
+ If a backend patch compensates for an earlier semantic bug, it is in the
125
+ wrong place.
126
+
127
+ ## Verification
128
+
129
+ Verification is staged. Each layer can be inspected and verified without
130
+ running the later ones:
131
+
132
+ ```bash
133
+ bundle exec bin/kumi pp <repr> <schema.kumi> # print one layer
134
+ bundle exec bin/kumi golden_v2 verify --repr <group> # snapshot-check a layer
135
+ bundle exec bin/kumi golden test # runtime ground truth
136
+ ```
270
137
 
271
- ## Future Improvements
138
+ Repr groups: `frontend`, `df`, `vec`, `loop`, `codegen`. Golden failures
139
+ identify which layer regressed, not just that "something failed later".
272
140
 
273
- 1. **LSP Server**: Standalone language server for any editor
274
- 2. **Type validation**: Check function call arity at compile time
275
- 3. **IDE diagnostics**: Show type mismatches as you type
276
- 4. **Documentation linking**: Cross-reference related functions
277
- 5. **Kernel visualization**: Show kernel implementations side-by-side
141
+ See [GOLDEN_TESTS.md](GOLDEN_TESTS.md).
data/docs/DEVELOPMENT.md CHANGED
@@ -79,6 +79,19 @@ bin/kumi golden test # Run all tests
79
79
  bin/kumi golden update EXAMPLE # Regenerate expected files
80
80
  ```
81
81
 
82
+ ## Debugging the Compiler Pipeline
83
+
84
+ The pipeline (SNAST → DFIR → VecIR → LoopIR → emitters) can be inspected one
85
+ layer at a time — see [ARCHITECTURE.md](ARCHITECTURE.md):
86
+
87
+ ```bash
88
+ bin/kumi pp loopir <schema.kumi> # print one representation
89
+ bin/kumi golden_v2 verify --repr df # snapshot-check one layer
90
+ bin/kumi golden_v2 diff --repr codegen <name> # unified diff for a schema
91
+ ```
92
+
93
+ [AGENTS.md](AGENTS.md) collects more inspection recipes.
94
+
82
95
  ---
83
96
 
84
97
  *For more development documentation, see the other guides in this directory.*