qasida 2.0.0__tar.gz

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 (752) hide show
  1. qasida-2.0.0/CHANGELOG.md +1163 -0
  2. qasida-2.0.0/LICENSE +21 -0
  3. qasida-2.0.0/MANIFEST.in +5 -0
  4. qasida-2.0.0/PKG-INFO +538 -0
  5. qasida-2.0.0/README.md +522 -0
  6. qasida-2.0.0/docs/AI_ML_ROADMAP.md +158 -0
  7. qasida-2.0.0/docs/BENCHMARKS.md +58 -0
  8. qasida-2.0.0/docs/BENCHMARKS_SAFETY.md +185 -0
  9. qasida-2.0.0/docs/BENCHMARKS_VS.md +76 -0
  10. qasida-2.0.0/docs/BOOK.md +391 -0
  11. qasida-2.0.0/docs/DEBUGGING.md +130 -0
  12. qasida-2.0.0/docs/ECOSYSTEM.md +562 -0
  13. qasida-2.0.0/docs/FREESTANDING.md +788 -0
  14. qasida-2.0.0/docs/HIGH_SCHOOL_GUIDE.md +232 -0
  15. qasida-2.0.0/docs/INTEGRATION.md +98 -0
  16. qasida-2.0.0/docs/LIBRARY_ROADMAP_100.md +244 -0
  17. qasida-2.0.0/docs/ML_STACK.md +218 -0
  18. qasida-2.0.0/docs/PLATFORMS.md +105 -0
  19. qasida-2.0.0/docs/STABILITY.md +53 -0
  20. qasida-2.0.0/docs/TOP_500_FEATURES.md +569 -0
  21. qasida-2.0.0/docs/TOP_500_PROGRESS.md +572 -0
  22. qasida-2.0.0/docs/TOUR.md +293 -0
  23. qasida-2.0.0/docs/WASM_STRINGS.md +118 -0
  24. qasida-2.0.0/docs/WIT.md +71 -0
  25. qasida-2.0.0/examples/allocator_demo.fg +56 -0
  26. qasida-2.0.0/examples/allocfail_demo.fg +30 -0
  27. qasida-2.0.0/examples/apps/moon-browser.fg +55 -0
  28. qasida-2.0.0/examples/apps/moon-code.fg +208 -0
  29. qasida-2.0.0/examples/apps/moon-gallery.fg +35 -0
  30. qasida-2.0.0/examples/apps/moon-notes.fg +233 -0
  31. qasida-2.0.0/examples/apps/registry_server.fg +494 -0
  32. qasida-2.0.0/examples/apps/todo.fg +74 -0
  33. qasida-2.0.0/examples/arena_demo.fg +45 -0
  34. qasida-2.0.0/examples/autograd_demo.fg +34 -0
  35. qasida-2.0.0/examples/avec_demo.fg +17 -0
  36. qasida-2.0.0/examples/base64_demo.fg +12 -0
  37. qasida-2.0.0/examples/bench_demo.fg +19 -0
  38. qasida-2.0.0/examples/benchmark.fg +35 -0
  39. qasida-2.0.0/examples/benchmark_scaling.fg +30 -0
  40. qasida-2.0.0/examples/big32/break.fg +13 -0
  41. qasida-2.0.0/examples/big32/fib.fg +11 -0
  42. qasida-2.0.0/examples/big32/forge_os.fg +22 -0
  43. qasida-2.0.0/examples/big32/hello.fg +5 -0
  44. qasida-2.0.0/examples/big32/loop_call.fg +14 -0
  45. qasida-2.0.0/examples/big32/muldiv.fg +8 -0
  46. qasida-2.0.0/examples/big32/sum.fg +10 -0
  47. qasida-2.0.0/examples/big32_float_demo.fg +28 -0
  48. qasida-2.0.0/examples/big32_struct_demo.fg +21 -0
  49. qasida-2.0.0/examples/bitset_demo.fg +15 -0
  50. qasida-2.0.0/examples/bloom_demo.fg +11 -0
  51. qasida-2.0.0/examples/break_demo.fg +35 -0
  52. qasida-2.0.0/examples/break_gc_demo.fg +14 -0
  53. qasida-2.0.0/examples/calendar_demo.fg +7 -0
  54. qasida-2.0.0/examples/changelog_demo.fg +7 -0
  55. qasida-2.0.0/examples/checksum_demo.fg +10 -0
  56. qasida-2.0.0/examples/circle_demo.fg +8 -0
  57. qasida-2.0.0/examples/cli-table_demo.fg +12 -0
  58. qasida-2.0.0/examples/cnn_demo.fg +148 -0
  59. qasida-2.0.0/examples/cnn_stacked_demo.fg +218 -0
  60. qasida-2.0.0/examples/color_demo.fg +10 -0
  61. qasida-2.0.0/examples/complex_demo.fg +10 -0
  62. qasida-2.0.0/examples/compress_demo.fg +8 -0
  63. qasida-2.0.0/examples/cone_demo.fg +8 -0
  64. qasida-2.0.0/examples/config_demo.fg +10 -0
  65. qasida-2.0.0/examples/counter_demo.fg +12 -0
  66. qasida-2.0.0/examples/cow_demo.fg +18 -0
  67. qasida-2.0.0/examples/cuboid_demo.fg +7 -0
  68. qasida-2.0.0/examples/cuda/README.md +42 -0
  69. qasida-2.0.0/examples/cylinder_demo.fg +7 -0
  70. qasida-2.0.0/examples/dates_rand_demo.fg +16 -0
  71. qasida-2.0.0/examples/db_demo.fg +12 -0
  72. qasida-2.0.0/examples/dbg_demo.fg +12 -0
  73. qasida-2.0.0/examples/dbg_helper.fg +6 -0
  74. qasida-2.0.0/examples/decagon_demo.fg +7 -0
  75. qasida-2.0.0/examples/deque_demo.fg +16 -0
  76. qasida-2.0.0/examples/dev_demo.fg +53 -0
  77. qasida-2.0.0/examples/difflib_demo.fg +10 -0
  78. qasida-2.0.0/examples/digitsum_demo.fg +7 -0
  79. qasida-2.0.0/examples/diwali_diya.fg +22 -0
  80. qasida-2.0.0/examples/dotenv_demo.fg +11 -0
  81. qasida-2.0.0/examples/drop_demo.fg +34 -0
  82. qasida-2.0.0/examples/ecosystem/word_stats.fg +22 -0
  83. qasida-2.0.0/examples/ecs_demo.fg +24 -0
  84. qasida-2.0.0/examples/ellipse_demo.fg +7 -0
  85. qasida-2.0.0/examples/email-parse_demo.fg +12 -0
  86. qasida-2.0.0/examples/embeddings_demo.fg +17 -0
  87. qasida-2.0.0/examples/enums_match.fg +24 -0
  88. qasida-2.0.0/examples/evalharness_demo.fg +12 -0
  89. qasida-2.0.0/examples/events_demo.fg +12 -0
  90. qasida-2.0.0/examples/factorial_demo.fg +6 -0
  91. qasida-2.0.0/examples/ffi_demo.fg +11 -0
  92. qasida-2.0.0/examples/fft_demo.fg +16 -0
  93. qasida-2.0.0/examples/fib_demo.fg +7 -0
  94. qasida-2.0.0/examples/file_and_args.fg +17 -0
  95. qasida-2.0.0/examples/fractions_demo.fg +12 -0
  96. qasida-2.0.0/examples/fuzzy_demo.fg +6 -0
  97. qasida-2.0.0/examples/gamedev_demo.fg +11 -0
  98. qasida-2.0.0/examples/gc_array_demo.fg +25 -0
  99. qasida-2.0.0/examples/gc_demo.fg +20 -0
  100. qasida-2.0.0/examples/gc_struct_demo.fg +24 -0
  101. qasida-2.0.0/examples/gcd_demo.fg +7 -0
  102. qasida-2.0.0/examples/generic_enums_demo.fg +32 -0
  103. qasida-2.0.0/examples/generics_demo.fg +22 -0
  104. qasida-2.0.0/examples/geo_demo.fg +12 -0
  105. qasida-2.0.0/examples/gpt_forward_demo.fg +32 -0
  106. qasida-2.0.0/examples/gpt_scaled.fg +147 -0
  107. qasida-2.0.0/examples/gpt_scaled_forward_demo.fg +32 -0
  108. qasida-2.0.0/examples/gpt_tinystories.fg +236 -0
  109. qasida-2.0.0/examples/gpt_tinystories_eval.fg +148 -0
  110. qasida-2.0.0/examples/gpt_tinystories_eval_nonunk.fg +92 -0
  111. qasida-2.0.0/examples/graph_demo.fg +13 -0
  112. qasida-2.0.0/examples/heap_demo.fg +15 -0
  113. qasida-2.0.0/examples/hello2.fg +13 -0
  114. qasida-2.0.0/examples/hemisphere_demo.fg +7 -0
  115. qasida-2.0.0/examples/heptagon_demo.fg +7 -0
  116. qasida-2.0.0/examples/hexagon_demo.fg +7 -0
  117. qasida-2.0.0/examples/histogram_demo.fg +12 -0
  118. qasida-2.0.0/examples/http_server_demo.fg +36 -0
  119. qasida-2.0.0/examples/i18n_demo.fg +10 -0
  120. qasida-2.0.0/examples/ical-lite_demo.fg +7 -0
  121. qasida-2.0.0/examples/image_demo.fg +33 -0
  122. qasida-2.0.0/examples/import_dedup_demo.fg +29 -0
  123. qasida-2.0.0/examples/imported_demo.fg +12 -0
  124. qasida-2.0.0/examples/imported_weights.fg +9 -0
  125. qasida-2.0.0/examples/inference_demo.fg +142 -0
  126. qasida-2.0.0/examples/inference_gpt2_demo.fg +92 -0
  127. qasida-2.0.0/examples/ini_demo.fg +12 -0
  128. qasida-2.0.0/examples/interval_demo.fg +12 -0
  129. qasida-2.0.0/examples/iris_pipeline_demo.fg +58 -0
  130. qasida-2.0.0/examples/jal_pari_demo.fg +7 -0
  131. qasida-2.0.0/examples/kernel_demo.fg +15 -0
  132. qasida-2.0.0/examples/lifetime_demo.fg +27 -0
  133. qasida-2.0.0/examples/lru_demo.fg +14 -0
  134. qasida-2.0.0/examples/map_json_demo.fg +13 -0
  135. qasida-2.0.0/examples/markdown_demo.fg +9 -0
  136. qasida-2.0.0/examples/mathex_demo.fg +8 -0
  137. qasida-2.0.0/examples/matrix.fg +13 -0
  138. qasida-2.0.0/examples/matrix2_demo.fg +12 -0
  139. qasida-2.0.0/examples/minmax_demo.fg +9 -0
  140. qasida-2.0.0/examples/ml_classical_demo.fg +115 -0
  141. qasida-2.0.0/examples/ml_linear_regression.fg +27 -0
  142. qasida-2.0.0/examples/ml_mlp_xor.fg +18 -0
  143. qasida-2.0.0/examples/ml_regression_trace.fg +29 -0
  144. qasida-2.0.0/examples/ml_train_xor.fg +72 -0
  145. qasida-2.0.0/examples/mmap_demo.fg +11 -0
  146. qasida-2.0.0/examples/mmap_grow32_demo.fg +18 -0
  147. qasida-2.0.0/examples/mock_demo.fg +10 -0
  148. qasida-2.0.0/examples/money_demo.fg +8 -0
  149. qasida-2.0.0/examples/move_branch_demo.fg +26 -0
  150. qasida-2.0.0/examples/move_demo.fg +8 -0
  151. qasida-2.0.0/examples/movingavg_demo.fg +12 -0
  152. qasida-2.0.0/examples/nested_array_demo.fg +23 -0
  153. qasida-2.0.0/examples/nested_array_gc.fg +11 -0
  154. qasida-2.0.0/examples/nlp_demo.fg +9 -0
  155. qasida-2.0.0/examples/nn_demo.fg +29 -0
  156. qasida-2.0.0/examples/nonagon_demo.fg +7 -0
  157. qasida-2.0.0/examples/numpy_demo.fg +15 -0
  158. qasida-2.0.0/examples/octagon_demo.fg +7 -0
  159. qasida-2.0.0/examples/octahedron_demo.fg +7 -0
  160. qasida-2.0.0/examples/optimization_demo.fg +8 -0
  161. qasida-2.0.0/examples/option_result_demo.fg +25 -0
  162. qasida-2.0.0/examples/os/README.md +56 -0
  163. qasida-2.0.0/examples/os/jalos.fg +1408 -0
  164. qasida-2.0.0/examples/os/kernel_accel.fg +44 -0
  165. qasida-2.0.0/examples/os/kernel_adc.fg +45 -0
  166. qasida-2.0.0/examples/os/kernel_alarm.fg +49 -0
  167. qasida-2.0.0/examples/os/kernel_alloc.fg +79 -0
  168. qasida-2.0.0/examples/os/kernel_altitude.fg +42 -0
  169. qasida-2.0.0/examples/os/kernel_battery.fg +49 -0
  170. qasida-2.0.0/examples/os/kernel_beep.fg +55 -0
  171. qasida-2.0.0/examples/os/kernel_ble.fg +42 -0
  172. qasida-2.0.0/examples/os/kernel_bootmenu.fg +68 -0
  173. qasida-2.0.0/examples/os/kernel_calc.fg +95 -0
  174. qasida-2.0.0/examples/os/kernel_calendar.fg +70 -0
  175. qasida-2.0.0/examples/os/kernel_clock.fg +44 -0
  176. qasida-2.0.0/examples/os/kernel_co2.fg +42 -0
  177. qasida-2.0.0/examples/os/kernel_color.fg +44 -0
  178. qasida-2.0.0/examples/os/kernel_compass.fg +46 -0
  179. qasida-2.0.0/examples/os/kernel_crc.fg +44 -0
  180. qasida-2.0.0/examples/os/kernel_current.fg +46 -0
  181. qasida-2.0.0/examples/os/kernel_disk.fg +51 -0
  182. qasida-2.0.0/examples/os/kernel_distance.fg +43 -0
  183. qasida-2.0.0/examples/os/kernel_dma.fg +53 -0
  184. qasida-2.0.0/examples/os/kernel_drivers.fg +263 -0
  185. qasida-2.0.0/examples/os/kernel_dust.fg +43 -0
  186. qasida-2.0.0/examples/os/kernel_ecall3.fg +80 -0
  187. qasida-2.0.0/examples/os/kernel_editor.fg +53 -0
  188. qasida-2.0.0/examples/os/kernel_eeprom.fg +46 -0
  189. qasida-2.0.0/examples/os/kernel_encoder.fg +46 -0
  190. qasida-2.0.0/examples/os/kernel_fan.fg +42 -0
  191. qasida-2.0.0/examples/os/kernel_fb.fg +83 -0
  192. qasida-2.0.0/examples/os/kernel_finder.fg +2060 -0
  193. qasida-2.0.0/examples/os/kernel_fingerprint.fg +50 -0
  194. qasida-2.0.0/examples/os/kernel_flame.fg +44 -0
  195. qasida-2.0.0/examples/os/kernel_flow.fg +43 -0
  196. qasida-2.0.0/examples/os/kernel_fm.fg +83 -0
  197. qasida-2.0.0/examples/os/kernel_freelist.fg +149 -0
  198. qasida-2.0.0/examples/os/kernel_fs.fg +190 -0
  199. qasida-2.0.0/examples/os/kernel_fs2.fg +255 -0
  200. qasida-2.0.0/examples/os/kernel_fs3.fg +100 -0
  201. qasida-2.0.0/examples/os/kernel_full.fg +1135 -0
  202. qasida-2.0.0/examples/os/kernel_full_soc2.fg +1136 -0
  203. qasida-2.0.0/examples/os/kernel_gas.fg +42 -0
  204. qasida-2.0.0/examples/os/kernel_gesture.fg +46 -0
  205. qasida-2.0.0/examples/os/kernel_gpio.fg +43 -0
  206. qasida-2.0.0/examples/os/kernel_gps.fg +42 -0
  207. qasida-2.0.0/examples/os/kernel_gui.fg +96 -0
  208. qasida-2.0.0/examples/os/kernel_gyro.fg +43 -0
  209. qasida-2.0.0/examples/os/kernel_hall.fg +43 -0
  210. qasida-2.0.0/examples/os/kernel_humidity.fg +46 -0
  211. qasida-2.0.0/examples/os/kernel_i2c.fg +44 -0
  212. qasida-2.0.0/examples/os/kernel_ipc.fg +84 -0
  213. qasida-2.0.0/examples/os/kernel_joystick.fg +44 -0
  214. qasida-2.0.0/examples/os/kernel_kbd.fg +44 -0
  215. qasida-2.0.0/examples/os/kernel_keypad.fg +46 -0
  216. qasida-2.0.0/examples/os/kernel_lcd.fg +42 -0
  217. qasida-2.0.0/examples/os/kernel_led.fg +39 -0
  218. qasida-2.0.0/examples/os/kernel_level.fg +44 -0
  219. qasida-2.0.0/examples/os/kernel_lifetime.fg +72 -0
  220. qasida-2.0.0/examples/os/kernel_lifetime2.fg +176 -0
  221. qasida-2.0.0/examples/os/kernel_light.fg +46 -0
  222. qasida-2.0.0/examples/os/kernel_loadcell.fg +47 -0
  223. qasida-2.0.0/examples/os/kernel_mac.fg +1682 -0
  224. qasida-2.0.0/examples/os/kernel_mac_interactive.fg +1846 -0
  225. qasida-2.0.0/examples/os/kernel_mbox.fg +48 -0
  226. qasida-2.0.0/examples/os/kernel_mon.fg +54 -0
  227. qasida-2.0.0/examples/os/kernel_motor.fg +44 -0
  228. qasida-2.0.0/examples/os/kernel_mouse.fg +38 -0
  229. qasida-2.0.0/examples/os/kernel_net.fg +210 -0
  230. qasida-2.0.0/examples/os/kernel_net2.fg +62 -0
  231. qasida-2.0.0/examples/os/kernel_netdev.fg +201 -0
  232. qasida-2.0.0/examples/os/kernel_netdev_soc2.fg +202 -0
  233. qasida-2.0.0/examples/os/kernel_notes.fg +58 -0
  234. qasida-2.0.0/examples/os/kernel_oled.fg +43 -0
  235. qasida-2.0.0/examples/os/kernel_pages.fg +68 -0
  236. qasida-2.0.0/examples/os/kernel_paint.fg +74 -0
  237. qasida-2.0.0/examples/os/kernel_ph.fg +41 -0
  238. qasida-2.0.0/examples/os/kernel_pipe.fg +68 -0
  239. qasida-2.0.0/examples/os/kernel_pir.fg +42 -0
  240. qasida-2.0.0/examples/os/kernel_pix.fg +248 -0
  241. qasida-2.0.0/examples/os/kernel_power.fg +44 -0
  242. qasida-2.0.0/examples/os/kernel_pressure.fg +43 -0
  243. qasida-2.0.0/examples/os/kernel_proc.fg +203 -0
  244. qasida-2.0.0/examples/os/kernel_proximity.fg +43 -0
  245. qasida-2.0.0/examples/os/kernel_pwm.fg +54 -0
  246. qasida-2.0.0/examples/os/kernel_rain.fg +43 -0
  247. qasida-2.0.0/examples/os/kernel_relay.fg +44 -0
  248. qasida-2.0.0/examples/os/kernel_rfid.fg +43 -0
  249. qasida-2.0.0/examples/os/kernel_ringbuf.fg +48 -0
  250. qasida-2.0.0/examples/os/kernel_rng.fg +51 -0
  251. qasida-2.0.0/examples/os/kernel_rtc.fg +46 -0
  252. qasida-2.0.0/examples/os/kernel_sbi_demo.fg +97 -0
  253. qasida-2.0.0/examples/os/kernel_sched.fg +124 -0
  254. qasida-2.0.0/examples/os/kernel_sched2.fg +63 -0
  255. qasida-2.0.0/examples/os/kernel_sdcard.fg +45 -0
  256. qasida-2.0.0/examples/os/kernel_sem.fg +46 -0
  257. qasida-2.0.0/examples/os/kernel_servo.fg +45 -0
  258. qasida-2.0.0/examples/os/kernel_shell.fg +252 -0
  259. qasida-2.0.0/examples/os/kernel_shell2.fg +81 -0
  260. qasida-2.0.0/examples/os/kernel_snake.fg +72 -0
  261. qasida-2.0.0/examples/os/kernel_soil.fg +43 -0
  262. qasida-2.0.0/examples/os/kernel_sound.fg +44 -0
  263. qasida-2.0.0/examples/os/kernel_spi.fg +46 -0
  264. qasida-2.0.0/examples/os/kernel_stepper.fg +46 -0
  265. qasida-2.0.0/examples/os/kernel_stopwatch.fg +43 -0
  266. qasida-2.0.0/examples/os/kernel_synth.fg +36 -0
  267. qasida-2.0.0/examples/os/kernel_tds.fg +42 -0
  268. qasida-2.0.0/examples/os/kernel_temp.fg +50 -0
  269. qasida-2.0.0/examples/os/kernel_term.fg +2333 -0
  270. qasida-2.0.0/examples/os/kernel_term_uart.fg +114 -0
  271. qasida-2.0.0/examples/os/kernel_tick.fg +47 -0
  272. qasida-2.0.0/examples/os/kernel_touch.fg +47 -0
  273. qasida-2.0.0/examples/os/kernel_uart16550.fg +76 -0
  274. qasida-2.0.0/examples/os/kernel_unified.fg +785 -0
  275. qasida-2.0.0/examples/os/kernel_unified_soc2.fg +786 -0
  276. qasida-2.0.0/examples/os/kernel_uv.fg +41 -0
  277. qasida-2.0.0/examples/os/kernel_vibration.fg +42 -0
  278. qasida-2.0.0/examples/os/kernel_voltage.fg +46 -0
  279. qasida-2.0.0/examples/os/kernel_watchdog.fg +48 -0
  280. qasida-2.0.0/examples/os/kernel_wind.fg +43 -0
  281. qasida-2.0.0/examples/pagination_demo.fg +9 -0
  282. qasida-2.0.0/examples/palindrome_demo.fg +7 -0
  283. qasida-2.0.0/examples/pandas_demo.fg +11 -0
  284. qasida-2.0.0/examples/parallelogram_demo.fg +7 -0
  285. qasida-2.0.0/examples/password_demo.fg +10 -0
  286. qasida-2.0.0/examples/pathlib_demo.fg +11 -0
  287. qasida-2.0.0/examples/pentagon_demo.fg +7 -0
  288. qasida-2.0.0/examples/physics2d_demo.fg +17 -0
  289. qasida-2.0.0/examples/pin_demo.fg +27 -0
  290. qasida-2.0.0/examples/plot_demo.fg +12 -0
  291. qasida-2.0.0/examples/polynomials_demo.fg +10 -0
  292. qasida-2.0.0/examples/prime_demo.fg +9 -0
  293. qasida-2.0.0/examples/prism_demo.fg +7 -0
  294. qasida-2.0.0/examples/profiler_demo.fg +12 -0
  295. qasida-2.0.0/examples/progress_demo.fg +10 -0
  296. qasida-2.0.0/examples/property_demo.fg +8 -0
  297. qasida-2.0.0/examples/py_interop/lib.fg +9 -0
  298. qasida-2.0.0/examples/py_interop/lib2.fg +32 -0
  299. qasida-2.0.0/examples/py_interop/lib3.fg +51 -0
  300. qasida-2.0.0/examples/pyramid_demo.fg +7 -0
  301. qasida-2.0.0/examples/qasida_demo.fg +6 -0
  302. qasida-2.0.0/examples/queue_demo.fg +12 -0
  303. qasida-2.0.0/examples/rag_demo.fg +9 -0
  304. qasida-2.0.0/examples/ratelimit_demo.fg +17 -0
  305. qasida-2.0.0/examples/rc_demo.fg +16 -0
  306. qasida-2.0.0/examples/rea_bridge.fg +48 -0
  307. qasida-2.0.0/examples/rect_demo.fg +8 -0
  308. qasida-2.0.0/examples/regex_demo.fg +52 -0
  309. qasida-2.0.0/examples/retry-backoff_demo.fg +10 -0
  310. qasida-2.0.0/examples/rhombus_demo.fg +7 -0
  311. qasida-2.0.0/examples/rl_demo.fg +9 -0
  312. qasida-2.0.0/examples/rnn_curriculum_demo.fg +160 -0
  313. qasida-2.0.0/examples/rnn_demo.fg +180 -0
  314. qasida-2.0.0/examples/scope_demo.fg +12 -0
  315. qasida-2.0.0/examples/score_demo.fg +8 -0
  316. qasida-2.0.0/examples/search_demo.fg +9 -0
  317. qasida-2.0.0/examples/sector_demo.fg +7 -0
  318. qasida-2.0.0/examples/selfhost_mini.fg +234 -0
  319. qasida-2.0.0/examples/semver_demo.fg +11 -0
  320. qasida-2.0.0/examples/set_demo.fg +14 -0
  321. qasida-2.0.0/examples/sklearn_demo.fg +34 -0
  322. qasida-2.0.0/examples/slice_demo.fg +18 -0
  323. qasida-2.0.0/examples/slugify_demo.fg +9 -0
  324. qasida-2.0.0/examples/sort_demo.fg +11 -0
  325. qasida-2.0.0/examples/spawn_demo.fg +10 -0
  326. qasida-2.0.0/examples/sphere_demo.fg +7 -0
  327. qasida-2.0.0/examples/sql_demo.fg +16 -0
  328. qasida-2.0.0/examples/stack_demo.fg +12 -0
  329. qasida-2.0.0/examples/statistics_demo.fg +8 -0
  330. qasida-2.0.0/examples/str_index_demo.fg +16 -0
  331. qasida-2.0.0/examples/strings_demo.fg +10 -0
  332. qasida-2.0.0/examples/struct_array_demo.fg +25 -0
  333. qasida-2.0.0/examples/struct_array_gc.fg +18 -0
  334. qasida-2.0.0/examples/structpush_demo.fg +18 -0
  335. qasida-2.0.0/examples/structs_point.fg +20 -0
  336. qasida-2.0.0/examples/svg_demo.fg +9 -0
  337. qasida-2.0.0/examples/table_demo.fg +13 -0
  338. qasida-2.0.0/examples/teju_special.fg +43 -0
  339. qasida-2.0.0/examples/tempfile_demo.fg +6 -0
  340. qasida-2.0.0/examples/template_demo.fg +9 -0
  341. qasida-2.0.0/examples/tensor_autograd_demo.fg +162 -0
  342. qasida-2.0.0/examples/tensor_checkpoint_demo.fg +55 -0
  343. qasida-2.0.0/examples/tensor_demo.fg +20 -0
  344. qasida-2.0.0/examples/tensor_ops2_demo.fg +119 -0
  345. qasida-2.0.0/examples/tetrahedron_demo.fg +7 -0
  346. qasida-2.0.0/examples/textwrap_demo.fg +13 -0
  347. qasida-2.0.0/examples/tfidf_demo.fg +11 -0
  348. qasida-2.0.0/examples/tgt_tinystories.fg +255 -0
  349. qasida-2.0.0/examples/tgt_tinystories_big.fg +259 -0
  350. qasida-2.0.0/examples/tgt_tinystories_scaled.fg +258 -0
  351. qasida-2.0.0/examples/timers_demo.fg +9 -0
  352. qasida-2.0.0/examples/timezone_demo.fg +10 -0
  353. qasida-2.0.0/examples/tiny_gpt.fg +107 -0
  354. qasida-2.0.0/examples/tinystories_load_demo.fg +39 -0
  355. qasida-2.0.0/examples/tokenizer_demo.fg +37 -0
  356. qasida-2.0.0/examples/toml_demo.fg +13 -0
  357. qasida-2.0.0/examples/torus_demo.fg +7 -0
  358. qasida-2.0.0/examples/tour/step01_hello.fg +4 -0
  359. qasida-2.0.0/examples/tour/step02_vars.fg +9 -0
  360. qasida-2.0.0/examples/tour/step03_flow.fg +11 -0
  361. qasida-2.0.0/examples/tour/step04_funcs.fg +7 -0
  362. qasida-2.0.0/examples/tour/step05_arrays.fg +6 -0
  363. qasida-2.0.0/examples/tour/step06_strings.fg +6 -0
  364. qasida-2.0.0/examples/tour/step07_structs.fg +9 -0
  365. qasida-2.0.0/examples/tour/step08_enums.fg +15 -0
  366. qasida-2.0.0/examples/tour/step09_scope.fg +11 -0
  367. qasida-2.0.0/examples/tour/step10_wasm.fg +6 -0
  368. qasida-2.0.0/examples/trapezoid_demo.fg +7 -0
  369. qasida-2.0.0/examples/triangle_demo.fg +10 -0
  370. qasida-2.0.0/examples/try_demo.fg +41 -0
  371. qasida-2.0.0/examples/units_demo.fg +8 -0
  372. qasida-2.0.0/examples/url_demo.fg +12 -0
  373. qasida-2.0.0/examples/uuid_demo.fg +9 -0
  374. qasida-2.0.0/examples/vec2_demo.fg +13 -0
  375. qasida-2.0.0/examples/vec3_demo.fg +15 -0
  376. qasida-2.0.0/examples/vision_demo.fg +13 -0
  377. qasida-2.0.0/examples/wasm/break_nested.fg +17 -0
  378. qasida-2.0.0/examples/wasm/fib.fg +9 -0
  379. qasida-2.0.0/examples/wasm/float_demo.fg +8 -0
  380. qasida-2.0.0/examples/wasm/str_index.fg +11 -0
  381. qasida-2.0.0/examples/wasm/sum.fg +9 -0
  382. qasida-2.0.0/examples/wasm/wit_add.fg +18 -0
  383. qasida-2.0.0/examples/wasm/wit_list.fg +14 -0
  384. qasida-2.0.0/examples/wasm_strings_demo.fg +39 -0
  385. qasida-2.0.0/examples/wav_demo.fg +20 -0
  386. qasida-2.0.0/examples/weak_demo.fg +21 -0
  387. qasida-2.0.0/examples/xml_demo.fg +12 -0
  388. qasida-2.0.0/examples/zero_free_demo.fg +24 -0
  389. qasida-2.0.0/forge_lang/__init__.py +4 -0
  390. qasida-2.0.0/forge_lang/allocfail.py +28 -0
  391. qasida-2.0.0/forge_lang/ast_nodes.py +345 -0
  392. qasida-2.0.0/forge_lang/checker.py +2680 -0
  393. qasida-2.0.0/forge_lang/cli.py +277 -0
  394. qasida-2.0.0/forge_lang/codegen.py +4377 -0
  395. qasida-2.0.0/forge_lang/codegen_cuda.py +94 -0
  396. qasida-2.0.0/forge_lang/codegen_rv.py +1492 -0
  397. qasida-2.0.0/forge_lang/codegen_wasm.py +992 -0
  398. qasida-2.0.0/forge_lang/compiler.py +234 -0
  399. qasida-2.0.0/forge_lang/defers.py +36 -0
  400. qasida-2.0.0/forge_lang/docgen.py +61 -0
  401. qasida-2.0.0/forge_lang/drops.py +19 -0
  402. qasida-2.0.0/forge_lang/errors.py +6 -0
  403. qasida-2.0.0/forge_lang/fixedints.py +166 -0
  404. qasida-2.0.0/forge_lang/generics.py +109 -0
  405. qasida-2.0.0/forge_lang/infer.py +391 -0
  406. qasida-2.0.0/forge_lang/lexer.py +175 -0
  407. qasida-2.0.0/forge_lang/lsp.py +173 -0
  408. qasida-2.0.0/forge_lang/mmaps.py +33 -0
  409. qasida-2.0.0/forge_lang/moves.py +29 -0
  410. qasida-2.0.0/forge_lang/never.py +105 -0
  411. qasida-2.0.0/forge_lang/opaques.py +121 -0
  412. qasida-2.0.0/forge_lang/parser.py +715 -0
  413. qasida-2.0.0/forge_lang/pins.py +29 -0
  414. qasida-2.0.0/forge_lang/pkg.py +462 -0
  415. qasida-2.0.0/forge_lang/pretty.py +276 -0
  416. qasida-2.0.0/forge_lang/ranges.py +68 -0
  417. qasida-2.0.0/forge_lang/readonly.py +109 -0
  418. qasida-2.0.0/forge_lang/registry_server.py +163 -0
  419. qasida-2.0.0/forge_lang/repl.py +125 -0
  420. qasida-2.0.0/forge_lang/sizedarrays.py +182 -0
  421. qasida-2.0.0/forge_lang/stdlib/allocator.fg +45 -0
  422. qasida-2.0.0/forge_lang/stdlib/arena.fg +50 -0
  423. qasida-2.0.0/forge_lang/stdlib/autograd.fg +182 -0
  424. qasida-2.0.0/forge_lang/stdlib/avec.fg +69 -0
  425. qasida-2.0.0/forge_lang/stdlib/base64.fg +110 -0
  426. qasida-2.0.0/forge_lang/stdlib/bench.fg +24 -0
  427. qasida-2.0.0/forge_lang/stdlib/bitset.fg +37 -0
  428. qasida-2.0.0/forge_lang/stdlib/bloom.fg +32 -0
  429. qasida-2.0.0/forge_lang/stdlib/calendar.fg +41 -0
  430. qasida-2.0.0/forge_lang/stdlib/changelog.fg +18 -0
  431. qasida-2.0.0/forge_lang/stdlib/checksum.fg +41 -0
  432. qasida-2.0.0/forge_lang/stdlib/circle.fg +19 -0
  433. qasida-2.0.0/forge_lang/stdlib/cli-table.fg +43 -0
  434. qasida-2.0.0/forge_lang/stdlib/cli.fg +71 -0
  435. qasida-2.0.0/forge_lang/stdlib/cnn.fg +98 -0
  436. qasida-2.0.0/forge_lang/stdlib/collections.fg +93 -0
  437. qasida-2.0.0/forge_lang/stdlib/color.fg +97 -0
  438. qasida-2.0.0/forge_lang/stdlib/complex.fg +36 -0
  439. qasida-2.0.0/forge_lang/stdlib/compress.fg +79 -0
  440. qasida-2.0.0/forge_lang/stdlib/cone.fg +20 -0
  441. qasida-2.0.0/forge_lang/stdlib/config.fg +56 -0
  442. qasida-2.0.0/forge_lang/stdlib/counter.fg +55 -0
  443. qasida-2.0.0/forge_lang/stdlib/cow.fg +34 -0
  444. qasida-2.0.0/forge_lang/stdlib/csv.fg +97 -0
  445. qasida-2.0.0/forge_lang/stdlib/cuboid.fg +17 -0
  446. qasida-2.0.0/forge_lang/stdlib/cylinder.fg +16 -0
  447. qasida-2.0.0/forge_lang/stdlib/dataset.fg +153 -0
  448. qasida-2.0.0/forge_lang/stdlib/dates.fg +59 -0
  449. qasida-2.0.0/forge_lang/stdlib/db.fg +70 -0
  450. qasida-2.0.0/forge_lang/stdlib/decagon.fg +15 -0
  451. qasida-2.0.0/forge_lang/stdlib/deque.fg +56 -0
  452. qasida-2.0.0/forge_lang/stdlib/difflib.fg +63 -0
  453. qasida-2.0.0/forge_lang/stdlib/digitsum.fg +22 -0
  454. qasida-2.0.0/forge_lang/stdlib/dotenv.fg +82 -0
  455. qasida-2.0.0/forge_lang/stdlib/ecs.fg +67 -0
  456. qasida-2.0.0/forge_lang/stdlib/ellipse.fg +16 -0
  457. qasida-2.0.0/forge_lang/stdlib/email-parse.fg +44 -0
  458. qasida-2.0.0/forge_lang/stdlib/embeddings.fg +85 -0
  459. qasida-2.0.0/forge_lang/stdlib/evalharness.fg +39 -0
  460. qasida-2.0.0/forge_lang/stdlib/events.fg +51 -0
  461. qasida-2.0.0/forge_lang/stdlib/factorial.fg +9 -0
  462. qasida-2.0.0/forge_lang/stdlib/fft.fg +121 -0
  463. qasida-2.0.0/forge_lang/stdlib/fib.fg +15 -0
  464. qasida-2.0.0/forge_lang/stdlib/fractions.fg +63 -0
  465. qasida-2.0.0/forge_lang/stdlib/fuzzy.fg +50 -0
  466. qasida-2.0.0/forge_lang/stdlib/gamedev.fg +26 -0
  467. qasida-2.0.0/forge_lang/stdlib/gcd.fg +14 -0
  468. qasida-2.0.0/forge_lang/stdlib/geo.fg +48 -0
  469. qasida-2.0.0/forge_lang/stdlib/gpt.fg +497 -0
  470. qasida-2.0.0/forge_lang/stdlib/gpt2.fg +520 -0
  471. qasida-2.0.0/forge_lang/stdlib/graph.fg +48 -0
  472. qasida-2.0.0/forge_lang/stdlib/heap.fg +72 -0
  473. qasida-2.0.0/forge_lang/stdlib/hemisphere.fg +15 -0
  474. qasida-2.0.0/forge_lang/stdlib/heptagon.fg +15 -0
  475. qasida-2.0.0/forge_lang/stdlib/hexagon.fg +15 -0
  476. qasida-2.0.0/forge_lang/stdlib/histogram.fg +20 -0
  477. qasida-2.0.0/forge_lang/stdlib/http_server.fg +38 -0
  478. qasida-2.0.0/forge_lang/stdlib/i18n.fg +34 -0
  479. qasida-2.0.0/forge_lang/stdlib/ical-lite.fg +55 -0
  480. qasida-2.0.0/forge_lang/stdlib/image.fg +151 -0
  481. qasida-2.0.0/forge_lang/stdlib/inference.fg +95 -0
  482. qasida-2.0.0/forge_lang/stdlib/inference_gpt2.fg +205 -0
  483. qasida-2.0.0/forge_lang/stdlib/ini.fg +79 -0
  484. qasida-2.0.0/forge_lang/stdlib/interval.fg +26 -0
  485. qasida-2.0.0/forge_lang/stdlib/json.fg +18 -0
  486. qasida-2.0.0/forge_lang/stdlib/lifetime.fg +60 -0
  487. qasida-2.0.0/forge_lang/stdlib/log.fg +51 -0
  488. qasida-2.0.0/forge_lang/stdlib/lru.fg +47 -0
  489. qasida-2.0.0/forge_lang/stdlib/map.fg +44 -0
  490. qasida-2.0.0/forge_lang/stdlib/markdown.fg +100 -0
  491. qasida-2.0.0/forge_lang/stdlib/mathex.fg +33 -0
  492. qasida-2.0.0/forge_lang/stdlib/matrix2.fg +18 -0
  493. qasida-2.0.0/forge_lang/stdlib/metrics.fg +125 -0
  494. qasida-2.0.0/forge_lang/stdlib/minmax.fg +37 -0
  495. qasida-2.0.0/forge_lang/stdlib/ml.fg +54 -0
  496. qasida-2.0.0/forge_lang/stdlib/ml_classical.fg +245 -0
  497. qasida-2.0.0/forge_lang/stdlib/mock.fg +20 -0
  498. qasida-2.0.0/forge_lang/stdlib/money.fg +25 -0
  499. qasida-2.0.0/forge_lang/stdlib/movingavg.fg +37 -0
  500. qasida-2.0.0/forge_lang/stdlib/nlp.fg +90 -0
  501. qasida-2.0.0/forge_lang/stdlib/nn.fg +510 -0
  502. qasida-2.0.0/forge_lang/stdlib/nonagon.fg +15 -0
  503. qasida-2.0.0/forge_lang/stdlib/numpy.fg +174 -0
  504. qasida-2.0.0/forge_lang/stdlib/octagon.fg +15 -0
  505. qasida-2.0.0/forge_lang/stdlib/octahedron.fg +15 -0
  506. qasida-2.0.0/forge_lang/stdlib/optimization.fg +46 -0
  507. qasida-2.0.0/forge_lang/stdlib/option.fg +23 -0
  508. qasida-2.0.0/forge_lang/stdlib/pagination.fg +18 -0
  509. qasida-2.0.0/forge_lang/stdlib/palindrome.fg +16 -0
  510. qasida-2.0.0/forge_lang/stdlib/pandas.fg +104 -0
  511. qasida-2.0.0/forge_lang/stdlib/parallelogram.fg +16 -0
  512. qasida-2.0.0/forge_lang/stdlib/password.fg +20 -0
  513. qasida-2.0.0/forge_lang/stdlib/pathlib.fg +78 -0
  514. qasida-2.0.0/forge_lang/stdlib/pentagon.fg +15 -0
  515. qasida-2.0.0/forge_lang/stdlib/physics2d.fg +41 -0
  516. qasida-2.0.0/forge_lang/stdlib/plot.fg +50 -0
  517. qasida-2.0.0/forge_lang/stdlib/polynomials.fg +59 -0
  518. qasida-2.0.0/forge_lang/stdlib/preprocess.fg +175 -0
  519. qasida-2.0.0/forge_lang/stdlib/prime.fg +21 -0
  520. qasida-2.0.0/forge_lang/stdlib/prism.fg +17 -0
  521. qasida-2.0.0/forge_lang/stdlib/profiler.fg +54 -0
  522. qasida-2.0.0/forge_lang/stdlib/progress.fg +28 -0
  523. qasida-2.0.0/forge_lang/stdlib/property.fg +29 -0
  524. qasida-2.0.0/forge_lang/stdlib/pyramid.fg +16 -0
  525. qasida-2.0.0/forge_lang/stdlib/queue.fg +31 -0
  526. qasida-2.0.0/forge_lang/stdlib/rag.fg +36 -0
  527. qasida-2.0.0/forge_lang/stdlib/rand.fg +15 -0
  528. qasida-2.0.0/forge_lang/stdlib/ratelimit.fg +24 -0
  529. qasida-2.0.0/forge_lang/stdlib/rc.fg +26 -0
  530. qasida-2.0.0/forge_lang/stdlib/rect.fg +20 -0
  531. qasida-2.0.0/forge_lang/stdlib/regex.fg +247 -0
  532. qasida-2.0.0/forge_lang/stdlib/result.fg +20 -0
  533. qasida-2.0.0/forge_lang/stdlib/retry-backoff.fg +36 -0
  534. qasida-2.0.0/forge_lang/stdlib/rhombus.fg +16 -0
  535. qasida-2.0.0/forge_lang/stdlib/rl.fg +27 -0
  536. qasida-2.0.0/forge_lang/stdlib/rnn.fg +161 -0
  537. qasida-2.0.0/forge_lang/stdlib/score.fg +33 -0
  538. qasida-2.0.0/forge_lang/stdlib/search.fg +27 -0
  539. qasida-2.0.0/forge_lang/stdlib/sector.fg +16 -0
  540. qasida-2.0.0/forge_lang/stdlib/semver.fg +58 -0
  541. qasida-2.0.0/forge_lang/stdlib/set.fg +43 -0
  542. qasida-2.0.0/forge_lang/stdlib/sklearn.fg +259 -0
  543. qasida-2.0.0/forge_lang/stdlib/slice.fg +37 -0
  544. qasida-2.0.0/forge_lang/stdlib/slugify.fg +124 -0
  545. qasida-2.0.0/forge_lang/stdlib/sort.fg +35 -0
  546. qasida-2.0.0/forge_lang/stdlib/sphere.fg +15 -0
  547. qasida-2.0.0/forge_lang/stdlib/sql.fg +152 -0
  548. qasida-2.0.0/forge_lang/stdlib/stack.fg +31 -0
  549. qasida-2.0.0/forge_lang/stdlib/statistics.fg +74 -0
  550. qasida-2.0.0/forge_lang/stdlib/stats.fg +78 -0
  551. qasida-2.0.0/forge_lang/stdlib/strings.fg +35 -0
  552. qasida-2.0.0/forge_lang/stdlib/svg.fg +70 -0
  553. qasida-2.0.0/forge_lang/stdlib/table.fg +71 -0
  554. qasida-2.0.0/forge_lang/stdlib/tempfile.fg +9 -0
  555. qasida-2.0.0/forge_lang/stdlib/template.fg +56 -0
  556. qasida-2.0.0/forge_lang/stdlib/tensor.fg +337 -0
  557. qasida-2.0.0/forge_lang/stdlib/tensor_autograd.fg +799 -0
  558. qasida-2.0.0/forge_lang/stdlib/test.fg +42 -0
  559. qasida-2.0.0/forge_lang/stdlib/tetrahedron.fg +15 -0
  560. qasida-2.0.0/forge_lang/stdlib/textwrap.fg +43 -0
  561. qasida-2.0.0/forge_lang/stdlib/tfidf.fg +55 -0
  562. qasida-2.0.0/forge_lang/stdlib/tgt.fg +311 -0
  563. qasida-2.0.0/forge_lang/stdlib/timers.fg +22 -0
  564. qasida-2.0.0/forge_lang/stdlib/timezone.fg +32 -0
  565. qasida-2.0.0/forge_lang/stdlib/tokenizer.fg +206 -0
  566. qasida-2.0.0/forge_lang/stdlib/toml.fg +133 -0
  567. qasida-2.0.0/forge_lang/stdlib/torus.fg +16 -0
  568. qasida-2.0.0/forge_lang/stdlib/trapezoid.fg +17 -0
  569. qasida-2.0.0/forge_lang/stdlib/triangle.fg +20 -0
  570. qasida-2.0.0/forge_lang/stdlib/units.fg +43 -0
  571. qasida-2.0.0/forge_lang/stdlib/url.fg +221 -0
  572. qasida-2.0.0/forge_lang/stdlib/uuid.fg +59 -0
  573. qasida-2.0.0/forge_lang/stdlib/vec2.fg +20 -0
  574. qasida-2.0.0/forge_lang/stdlib/vec3.fg +21 -0
  575. qasida-2.0.0/forge_lang/stdlib/vision.fg +55 -0
  576. qasida-2.0.0/forge_lang/stdlib/wav.fg +54 -0
  577. qasida-2.0.0/forge_lang/stdlib/xml.fg +108 -0
  578. qasida-2.0.0/forge_lang/traits.py +10 -0
  579. qasida-2.0.0/forge_lang/tuples.py +165 -0
  580. qasida-2.0.0/forge_lang/unions.py +136 -0
  581. qasida-2.0.0/forge_lang/weaks.py +31 -0
  582. qasida-2.0.0/forge_lang/wit.py +336 -0
  583. qasida-2.0.0/pyproject.toml +31 -0
  584. qasida-2.0.0/qasida.egg-info/PKG-INFO +538 -0
  585. qasida-2.0.0/qasida.egg-info/SOURCES.txt +750 -0
  586. qasida-2.0.0/qasida.egg-info/dependency_links.txt +1 -0
  587. qasida-2.0.0/qasida.egg-info/entry_points.txt +2 -0
  588. qasida-2.0.0/qasida.egg-info/requires.txt +4 -0
  589. qasida-2.0.0/qasida.egg-info/top_level.txt +1 -0
  590. qasida-2.0.0/setup.cfg +4 -0
  591. qasida-2.0.0/tests/test_alias_sized_fix.py +73 -0
  592. qasida-2.0.0/tests/test_aliases_v1.py +229 -0
  593. qasida-2.0.0/tests/test_allocator_v1.py +57 -0
  594. qasida-2.0.0/tests/test_allocfail_v1.py +200 -0
  595. qasida-2.0.0/tests/test_arena_v1.py +105 -0
  596. qasida-2.0.0/tests/test_avec_v1.py +82 -0
  597. qasida-2.0.0/tests/test_bitwise.py +186 -0
  598. qasida-2.0.0/tests/test_checked_casts_v1.py +140 -0
  599. qasida-2.0.0/tests/test_chelp_fix.py +150 -0
  600. qasida-2.0.0/tests/test_cow_v1.py +59 -0
  601. qasida-2.0.0/tests/test_defer_v1.py +154 -0
  602. qasida-2.0.0/tests/test_drop_v1.py +137 -0
  603. qasida-2.0.0/tests/test_fixedints_v1.py +200 -0
  604. qasida-2.0.0/tests/test_freestanding.py +218 -0
  605. qasida-2.0.0/tests/test_hex_literals.py +121 -0
  606. qasida-2.0.0/tests/test_infer_v1.py +121 -0
  607. qasida-2.0.0/tests/test_kernel_accel.py +45 -0
  608. qasida-2.0.0/tests/test_kernel_adc.py +45 -0
  609. qasida-2.0.0/tests/test_kernel_alarm.py +50 -0
  610. qasida-2.0.0/tests/test_kernel_alloc.py +70 -0
  611. qasida-2.0.0/tests/test_kernel_altitude.py +45 -0
  612. qasida-2.0.0/tests/test_kernel_battery.py +45 -0
  613. qasida-2.0.0/tests/test_kernel_beep.py +51 -0
  614. qasida-2.0.0/tests/test_kernel_ble.py +45 -0
  615. qasida-2.0.0/tests/test_kernel_bootmenu.py +44 -0
  616. qasida-2.0.0/tests/test_kernel_calc.py +44 -0
  617. qasida-2.0.0/tests/test_kernel_calendar.py +51 -0
  618. qasida-2.0.0/tests/test_kernel_clock.py +49 -0
  619. qasida-2.0.0/tests/test_kernel_co2.py +45 -0
  620. qasida-2.0.0/tests/test_kernel_color.py +45 -0
  621. qasida-2.0.0/tests/test_kernel_compass.py +45 -0
  622. qasida-2.0.0/tests/test_kernel_crc.py +45 -0
  623. qasida-2.0.0/tests/test_kernel_current.py +45 -0
  624. qasida-2.0.0/tests/test_kernel_disk.py +51 -0
  625. qasida-2.0.0/tests/test_kernel_distance.py +45 -0
  626. qasida-2.0.0/tests/test_kernel_dma.py +45 -0
  627. qasida-2.0.0/tests/test_kernel_drivers.py +69 -0
  628. qasida-2.0.0/tests/test_kernel_dust.py +45 -0
  629. qasida-2.0.0/tests/test_kernel_ecall3.py +54 -0
  630. qasida-2.0.0/tests/test_kernel_editor.py +51 -0
  631. qasida-2.0.0/tests/test_kernel_eeprom.py +45 -0
  632. qasida-2.0.0/tests/test_kernel_encoder.py +45 -0
  633. qasida-2.0.0/tests/test_kernel_fan.py +45 -0
  634. qasida-2.0.0/tests/test_kernel_fb.py +69 -0
  635. qasida-2.0.0/tests/test_kernel_finder.py +78 -0
  636. qasida-2.0.0/tests/test_kernel_fingerprint.py +45 -0
  637. qasida-2.0.0/tests/test_kernel_flame.py +45 -0
  638. qasida-2.0.0/tests/test_kernel_flow.py +45 -0
  639. qasida-2.0.0/tests/test_kernel_fm.py +51 -0
  640. qasida-2.0.0/tests/test_kernel_freelist.py +74 -0
  641. qasida-2.0.0/tests/test_kernel_fs.py +86 -0
  642. qasida-2.0.0/tests/test_kernel_fs2.py +78 -0
  643. qasida-2.0.0/tests/test_kernel_fs3.py +53 -0
  644. qasida-2.0.0/tests/test_kernel_full.py +105 -0
  645. qasida-2.0.0/tests/test_kernel_gas.py +45 -0
  646. qasida-2.0.0/tests/test_kernel_gesture.py +45 -0
  647. qasida-2.0.0/tests/test_kernel_gpio.py +45 -0
  648. qasida-2.0.0/tests/test_kernel_gps.py +45 -0
  649. qasida-2.0.0/tests/test_kernel_gui.py +64 -0
  650. qasida-2.0.0/tests/test_kernel_gyro.py +45 -0
  651. qasida-2.0.0/tests/test_kernel_hall.py +45 -0
  652. qasida-2.0.0/tests/test_kernel_humidity.py +45 -0
  653. qasida-2.0.0/tests/test_kernel_i2c.py +45 -0
  654. qasida-2.0.0/tests/test_kernel_ipc.py +53 -0
  655. qasida-2.0.0/tests/test_kernel_joystick.py +45 -0
  656. qasida-2.0.0/tests/test_kernel_kbd.py +50 -0
  657. qasida-2.0.0/tests/test_kernel_keypad.py +45 -0
  658. qasida-2.0.0/tests/test_kernel_lcd.py +45 -0
  659. qasida-2.0.0/tests/test_kernel_led.py +50 -0
  660. qasida-2.0.0/tests/test_kernel_level.py +45 -0
  661. qasida-2.0.0/tests/test_kernel_lifetime.py +55 -0
  662. qasida-2.0.0/tests/test_kernel_lifetime2.py +57 -0
  663. qasida-2.0.0/tests/test_kernel_light.py +45 -0
  664. qasida-2.0.0/tests/test_kernel_loadcell.py +45 -0
  665. qasida-2.0.0/tests/test_kernel_mac.py +68 -0
  666. qasida-2.0.0/tests/test_kernel_mac_int.py +73 -0
  667. qasida-2.0.0/tests/test_kernel_mbox.py +45 -0
  668. qasida-2.0.0/tests/test_kernel_mon.py +51 -0
  669. qasida-2.0.0/tests/test_kernel_motor.py +45 -0
  670. qasida-2.0.0/tests/test_kernel_mouse.py +50 -0
  671. qasida-2.0.0/tests/test_kernel_net.py +72 -0
  672. qasida-2.0.0/tests/test_kernel_net2.py +51 -0
  673. qasida-2.0.0/tests/test_kernel_netdev.py +70 -0
  674. qasida-2.0.0/tests/test_kernel_notes.py +51 -0
  675. qasida-2.0.0/tests/test_kernel_oled.py +45 -0
  676. qasida-2.0.0/tests/test_kernel_pages.py +49 -0
  677. qasida-2.0.0/tests/test_kernel_paint.py +52 -0
  678. qasida-2.0.0/tests/test_kernel_ph.py +45 -0
  679. qasida-2.0.0/tests/test_kernel_pipe.py +51 -0
  680. qasida-2.0.0/tests/test_kernel_pir.py +45 -0
  681. qasida-2.0.0/tests/test_kernel_pix.py +65 -0
  682. qasida-2.0.0/tests/test_kernel_power.py +45 -0
  683. qasida-2.0.0/tests/test_kernel_pressure.py +45 -0
  684. qasida-2.0.0/tests/test_kernel_proc.py +117 -0
  685. qasida-2.0.0/tests/test_kernel_proximity.py +45 -0
  686. qasida-2.0.0/tests/test_kernel_pwm.py +45 -0
  687. qasida-2.0.0/tests/test_kernel_rain.py +45 -0
  688. qasida-2.0.0/tests/test_kernel_relay.py +45 -0
  689. qasida-2.0.0/tests/test_kernel_rfid.py +45 -0
  690. qasida-2.0.0/tests/test_kernel_ringbuf.py +46 -0
  691. qasida-2.0.0/tests/test_kernel_rng.py +51 -0
  692. qasida-2.0.0/tests/test_kernel_rtc.py +51 -0
  693. qasida-2.0.0/tests/test_kernel_sbi_demo.py +60 -0
  694. qasida-2.0.0/tests/test_kernel_sched.py +100 -0
  695. qasida-2.0.0/tests/test_kernel_sched2.py +51 -0
  696. qasida-2.0.0/tests/test_kernel_sdcard.py +45 -0
  697. qasida-2.0.0/tests/test_kernel_sem.py +45 -0
  698. qasida-2.0.0/tests/test_kernel_servo.py +45 -0
  699. qasida-2.0.0/tests/test_kernel_shell.py +82 -0
  700. qasida-2.0.0/tests/test_kernel_shell2.py +44 -0
  701. qasida-2.0.0/tests/test_kernel_snake.py +51 -0
  702. qasida-2.0.0/tests/test_kernel_soil.py +45 -0
  703. qasida-2.0.0/tests/test_kernel_sound.py +45 -0
  704. qasida-2.0.0/tests/test_kernel_spi.py +45 -0
  705. qasida-2.0.0/tests/test_kernel_stepper.py +45 -0
  706. qasida-2.0.0/tests/test_kernel_stopwatch.py +50 -0
  707. qasida-2.0.0/tests/test_kernel_synth.py +50 -0
  708. qasida-2.0.0/tests/test_kernel_tds.py +45 -0
  709. qasida-2.0.0/tests/test_kernel_temp.py +45 -0
  710. qasida-2.0.0/tests/test_kernel_term.py +83 -0
  711. qasida-2.0.0/tests/test_kernel_term_uart.py +50 -0
  712. qasida-2.0.0/tests/test_kernel_tick.py +74 -0
  713. qasida-2.0.0/tests/test_kernel_touch.py +45 -0
  714. qasida-2.0.0/tests/test_kernel_uart16550.py +56 -0
  715. qasida-2.0.0/tests/test_kernel_uart16550_soc2.py +73 -0
  716. qasida-2.0.0/tests/test_kernel_unified.py +102 -0
  717. qasida-2.0.0/tests/test_kernel_uv.py +45 -0
  718. qasida-2.0.0/tests/test_kernel_vibration.py +45 -0
  719. qasida-2.0.0/tests/test_kernel_voltage.py +45 -0
  720. qasida-2.0.0/tests/test_kernel_watchdog.py +50 -0
  721. qasida-2.0.0/tests/test_kernel_wind.py +45 -0
  722. qasida-2.0.0/tests/test_lifetime_v1.py +87 -0
  723. qasida-2.0.0/tests/test_mmap_grow32_fix.py +154 -0
  724. qasida-2.0.0/tests/test_mmap_v1.py +105 -0
  725. qasida-2.0.0/tests/test_move_branch_field.py +161 -0
  726. qasida-2.0.0/tests/test_move_v1.py +88 -0
  727. qasida-2.0.0/tests/test_nested_empty_fix.py +113 -0
  728. qasida-2.0.0/tests/test_nestedpush_fix.py +146 -0
  729. qasida-2.0.0/tests/test_never_v1.py +146 -0
  730. qasida-2.0.0/tests/test_newtypes_v1.py +177 -0
  731. qasida-2.0.0/tests/test_opaques_v1.py +202 -0
  732. qasida-2.0.0/tests/test_peek_poke.py +162 -0
  733. qasida-2.0.0/tests/test_pin_v1.py +214 -0
  734. qasida-2.0.0/tests/test_proxy_connect.py +279 -0
  735. qasida-2.0.0/tests/test_ranges_v1.py +157 -0
  736. qasida-2.0.0/tests/test_rc_v1.py +80 -0
  737. qasida-2.0.0/tests/test_read_line.py +139 -0
  738. qasida-2.0.0/tests/test_readonly_v1.py +166 -0
  739. qasida-2.0.0/tests/test_sizedarrays_v1.py +165 -0
  740. qasida-2.0.0/tests/test_sizedunif_fix.py +150 -0
  741. qasida-2.0.0/tests/test_slice_v1.py +79 -0
  742. qasida-2.0.0/tests/test_struct_nested_fix.py +91 -0
  743. qasida-2.0.0/tests/test_structpush_fix.py +177 -0
  744. qasida-2.0.0/tests/test_top500_batch1.py +201 -0
  745. qasida-2.0.0/tests/test_traits_v1.py +176 -0
  746. qasida-2.0.0/tests/test_traps.py +201 -0
  747. qasida-2.0.0/tests/test_tuples_v1.py +169 -0
  748. qasida-2.0.0/tests/test_unions_v1.py +219 -0
  749. qasida-2.0.0/tests/test_void_v1.py +124 -0
  750. qasida-2.0.0/tests/test_weak_v1.py +83 -0
  751. qasida-2.0.0/tests/test_wrapping_v1.py +143 -0
  752. qasida-2.0.0/tests/test_zero_free_v1.py +257 -0
@@ -0,0 +1,1163 @@
1
+ # Changelog — Qasida
2
+
3
+ All notable changes are listed here. Version numbers follow
4
+ semantic versioning: 1.0.0 (26 Oct 2026) is the first stable
5
+ release — the documented language surface will not break
6
+ without a major version bump (see docs/STABILITY.md).
7
+ 0.x releases were pre-stable; breaking changes were possible then.
8
+
9
+ ## 2.0.0 — 7 Nov 2026
10
+
11
+ - Renamed to Qasida. The command is now `qasida`, the PyPI package is `qasida`, and the runtime error prefix is `qasida:`. The version is bumped to 2.0.0 because the command name and error prefix are breaking changes. Technical names (`forge.py`, `forge_lang`, `.fg` files, RED-MOON-) are unchanged, so existing programs keep working.
12
+
13
+ - Daily batch 7 Nov 2026 (verified, pushed 7 Nov 2026
14
+ 14:10 IST as 210ad252, tag v1.5.0 + GitHub Release): 10 OS kernels (relay 1/4, stepper 200/120, oled
15
+ 128/64, gps 2861/7, ble 72/2, sdcard 8192/2048, loadcell
16
+ 512/12, color 255/128, gesture 3/94, fingerprint 97/5 —
17
+ each a freestanding big32 kernel with a model test:
18
+ exact UART transcript, halted, final memory word) and
19
+ 10 stdlib geometry modules with demos verified by
20
+ `qasida run` (heptagon 100/35, octagon 125/40, nonagon
21
+ 150/45, decagon 200/50, torus 360/360, hemisphere
22
+ 250/225, prism 60/94, tetrahedron 64/32, octahedron
23
+ 27/27, sector 900/9000; integer-scaled formulas, same
24
+ convention as pentagon/circle). Full suite PASS (log
25
+ forge_suite_daily_20261107_31670.log).
26
+ - Zeroing on free (Top-500 #35, v1, default-on):
27
+ every heap buffer the native runtime frees is zeroed
28
+ before free() — arrays, strs, read_bytes temp, HTTP
29
+ recv buffer, spawn thread args. No new syntax; native
30
+ only in v1.
31
+ - Pinning / immovable values (Top-500 #34, v1):
32
+ `pin(x);` marks an owned binding immovable for the
33
+ rest of its scope — any whole-value use (let, call
34
+ argument, return), move(x), a move of one of its
35
+ fields, reassignment, or push is a checker error,
36
+ while in-place field/index writes, scalar field
37
+ and element reads, len/refcount, and for-iteration
38
+ still work. Pinning joins path-sensitively over
39
+ branches, loops, and match arms (pinned on any
40
+ path counts after the join), like move v2; native
41
+ codegen emits nothing for the statement. Native
42
+ only; big32/WASM reject pin programs with a named
43
+ error. Limits (rejected with named errors): pin
44
+ needs a variable, not a field; pinning a struct
45
+ with a drop method; indexing a pinned string.
46
+
47
+ ## 1.5.1 — 7 Nov 2026
48
+
49
+ - PyPI packaging rework (no language change): the
50
+ compiler is now a real installable package. The CLI
51
+ moved from forge.py into forge_lang/cli.py
52
+ (`qasida = "forge_lang.cli:main"`; forge.py is a
53
+ thin shim, `python3 forge.py ...` still works, and
54
+ VERSION stays importable from it). The standard
55
+ library moved from repo-root stdlib/ into
56
+ forge_lang/stdlib/ and ships as package data, so an
57
+ installed `qasida` finds its stdlib; the compiler
58
+ looks in-package first and keeps the old repo-root
59
+ stdlib/ as a legacy fallback. setup.py and
60
+ bin/qasida-pip are deleted (the old data_files
61
+ install under share/qasida is gone); packaging is
62
+ fully in pyproject.toml with the version read from
63
+ forge_lang/__init__.py:__version__ (single source
64
+ of truth). MANIFEST.in ships examples/ and docs/ in
65
+ the sdist. .github/workflows/release.yml builds the
66
+ wheel + sdist, publishes to PyPI, and creates the
67
+ GitHub Release on every v* tag (needs the
68
+ PYPI_API_TOKEN secret; the file itself cannot ride
69
+ the Contents-API push, it lands with a git push).
70
+ Docs, the CI formatter check, and the web playground
71
+ now point at forge_lang/stdlib/.
72
+
73
+ ## 1.5.0 — 6 Nov 2026
74
+
75
+ - Allocation failure as a value (#36, 7 Nov 2026):
76
+ new builtin try_alloc(n: int) -> Result<[int], str>,
77
+ native-only in v1: Ok with a zero-initialised [int]
78
+ array via calloc, Err("out of memory") when calloc
79
+ returns NULL (verified with try_alloc(2^60) = 2^63
80
+ bytes), Err("bad size") for n < 0, Ok empty for
81
+ n == 0. Works with `?` propagation (an Err reaches
82
+ the caller as a Result). Requires import "result.fg";
83
+ big32/WASM reject it with a named error. Limits:
84
+ [int] only, no fallible implicit allocations, and
85
+ the tiny bookkeeping mallocs (refcount, error-string
86
+ copy) can still forge_fail — only the big calloc is
87
+ fallible.
88
+
89
+ - Move semantics v2 (fix track, #27 extension):
90
+ moves in branches and loops now work via a
91
+ runtime moved flag per owned variable, with
92
+ path-sensitive checker joins (a use after a
93
+ conditional move is a checker error until
94
+ reassignment revives the variable; a second
95
+ loop move fails at runtime instead of
96
+ transferring a freed buffer), and field moves
97
+ now work in straight-line code (move(s.field)
98
+ transfers that field; sibling fields stay
99
+ usable, the whole struct and the moved field
100
+ do not, assigning the field revives it).
101
+ Limits, rejected with named errors: field
102
+ moves in branches/loops (need per-field
103
+ runtime flags) and moves of for-loop
104
+ variables (borrowed views). Native-only;
105
+ big32/WASM still reject move programs.
106
+
107
+ - mmap grow + word-width access (fix track, #31
108
+ extension): mmap_grow(m, new_len) extends the
109
+ mapped file with ftruncate and remaps it under
110
+ the same id, returning the new length (grow-only;
111
+ a smaller or equal size fails with a named
112
+ error), and mmap_get32/mmap_set32 read and write
113
+ a 32-bit little-endian word at a byte offset
114
+ (zero-extended, like peek32; a word crossing the
115
+ end fails with "mmap index out of bounds").
116
+ Native-only; big32/WASM still reject mmap
117
+ programs.
118
+
119
+ - Fix: struct-array push copy-on-write (fix track):
120
+ the per-struct forge_<T>_push helper realloced a
121
+ shared buffer in place — a two-sided push read
122
+ a[2].x == 9 where 4 was expected and ASan reported
123
+ a double-free in realloc. It now detaches first,
124
+ mirroring the scalar helpers: fresh buffer, copy
125
+ slots gaining ownership of their fields each
126
+ (str fields deep-copied, array fields inc'd),
127
+ drop this holder's count on the old buffer. The
128
+ fix track is now complete (all 7 items).
129
+
130
+ - Daily batch 6 Nov 2026 (unpushed — push
131
+ authorization spent): 10 OS sensor kernels
132
+ (hall 512, pir 1, ph 70, tds 320, flow 12,
133
+ level 80, current 15, voltage 330, power 99,
134
+ encoder 360; each freestanding big32, exact
135
+ UART transcript, halts, final memory word)
136
+ and 10 geometry libraries (sphere, cone,
137
+ cylinder, pyramid, ellipse, trapezoid,
138
+ parallelogram, rhombus, hexagon, pentagon;
139
+ pure Qasida, pi ≈ 3, demos exact). Full
140
+ suite PASS (log forge_suite_daily_20261106_16215.log).
141
+
142
+ ## 1.4.0 — 3 Nov 2026
143
+
144
+ - Fix: C-helper param-consumption audit (batch-25 follow-up):
145
+ write_bytes freed its array parameter while builtin callers
146
+ transfer no hold — a sole-holder variable died with
147
+ heap-use-after-free on later use, and a shared variable
148
+ drove its refcount below the true holder count (both
149
+ reproduced under ASan; batch 25 had only tested a fresh
150
+ literal). Native gen_expr now wraps a non-fresh array
151
+ argument in a temp with forge_arr_inc, exactly the
152
+ user-function call pattern; fresh arguments pass as-is
153
+ and are freed. All other str/array helpers audited clean
154
+ by code reading + probes (file, read/write, mmap, split,
155
+ join, substr, trim, parallel dot/matmul, http, refcount,
156
+ weak_register). Documented, not fixed here: fresh heap
157
+ string temps passed to a builtin and discarded leak, and
158
+ weak_new on a fresh temp registers an entry that never
159
+ dies — both need semantic follow-ups, not helper edits.
160
+ - Fix: type aliases inside sized-array spellings
161
+ now expand (the batch-12 gap: "[N; 3]" reached
162
+ later passes unexpanded and failed as an unknown
163
+ field type; expand_aliases now expands the
164
+ element part and keeps the literal length).
165
+ - Fix: nested empty array literals now work
166
+ (`let x: [[int]] = [[]];`, mixed `[[], [1]]`,
167
+ call args, assignment, tuples): the checker
168
+ accepts types up to `[?]` holes in
169
+ dynamic-array/tuple positions (never sized),
170
+ and infer fills literal types from context so
171
+ codegen never sees a hole. Bare holes and
172
+ genuine mismatches still error.
173
+ - Fix: nested arrays as struct fields now work
174
+ (`[[int]]` and `[Point]` fields): the typedefs
175
+ were collected but emitted after the struct
176
+ bodies, which hold array fields by value — the
177
+ typedef lines now precede composite bodies
178
+ (helpers still follow the bodies). Enum payload
179
+ structs with nested-array payloads remain a
180
+ documented residual.
181
+ - Fix: push to a shared nested array now
182
+ copies-on-write (the batch-18 gap: the inline
183
+ nested-array push path realloced the shared
184
+ buffer in place, dangling the other holders and
185
+ double-freeing at scope exit — reproduced as a
186
+ tcache double free; the path now detaches first
187
+ like the scalar push helpers, copying slots and
188
+ gaining an inner reference each, so the free
189
+ counts stay exact. Inner arrays stay shared by
190
+ reference, as elsewhere).
191
+ - Fix: nested sized-array literals now unify
192
+ (`[[1, 2], [3, 4]]` against `[[int; 2]; 2]` was
193
+ rejected as `[[int]]`: the sized-literal check
194
+ compared each element's inferred dynamic type
195
+ against the sized element type instead of
196
+ recursing; it now recurses into nested literals
197
+ at any depth, and under a dynamic outer array
198
+ with sized inner arrays, and infer assigns the
199
+ sized type to inner literals. Precise count
200
+ errors now fire at the offending level, and
201
+ wrong inner sizes / element types are still
202
+ rejected. Native only; big32/WASM keep their
203
+ named sized rejections).
204
+ - Top-500 batch 1: binary/octal literals and digit separators
205
+ (0b1010, 0o777, 1_000; malformed literals are compile errors)
206
+ and the `continue` statement (native, big32, WASM, formatter;
207
+ a for-loop continue still runs the increment).
208
+ - Top-500 batch 2: traits v1 — trait declarations, impl blocks
209
+ (with or without a trait), method-call syntax with static
210
+ dispatch, and checker-enforced trait conformance. big32 and
211
+ WASM reject trait programs in v1 (no struct parameters /
212
+ structs there yet); generic traits, trait objects, and
213
+ generic bounds are later slices.
214
+ - Top-500 batch 3: type aliases v1 — transparent `type`
215
+ shorthands expanded in the checker before other checking,
216
+ so they work on every backend for already-supported types.
217
+ Chains, arrays, concrete generic instantiations, struct and
218
+ enum aliases, and struct literals via bare-struct aliases
219
+ are in; aliases take no type arguments.
220
+ - Top-500 batch 4: wrapping arithmetic (wrapping_add/sub/mul/
221
+ neg, never failing, on native + big32 + WASM) and distinct
222
+ newtypes v1 (`newtype UserId = int;`, cast-only crossings,
223
+ same-newtype equality, native + big32 verified, WASM a
224
+ later slice).
225
+ - Top-500 batch 5: union types v1 — `int | str` as a tagged
226
+ value, wrapping at assignment/argument/return/struct-field/
227
+ cast sites, narrowing through match arms named by member
228
+ type, str-payload copy/free discipline; native verified,
229
+ big32/WASM reject union programs in v1. Members are the
230
+ four scalars in v1.
231
+ - Top-500 batch 6: opaque types v1 — `opaque Trait` as an
232
+ existential over its implementations, tag-dispatched
233
+ method calls/copies/frees; native verified, big32/WASM
234
+ reject opaque programs in v1.
235
+ - Top-500 batch 7: fixed-width integers v1 — i8/i16/i32/
236
+ u8/u16/u32/u64 as distinct scalars (i64 is int), fitting
237
+ literals adapt, checked arithmetic and narrowing casts,
238
+ struct fields; native verified, big32/WASM reject
239
+ fixed-width programs in v1.
240
+ - Top-500 batch 8: sized arrays v1 — `[T; N]` as a distinct
241
+ type from `[T]`, exact-count literals, push rejected,
242
+ index/len/iteration like dynamic arrays; native verified,
243
+ big32/WASM reject sized programs in v1.
244
+ - Top-500 batch 9: readonly views v1 — `readonly [T]` as a
245
+ read-only handle (index/len/iteration work, push and
246
+ index assignment rejected), mutable-to-view coercion
247
+ within the same array kind; native verified, big32/WASM
248
+ reject readonly programs in v1.
249
+ - Top-500 batch 10: never type v1 — `never` as the bottom
250
+ type (never functions must diverge and cannot return,
251
+ never values coerce to any expected type at value
252
+ sites, diverging bodies satisfy the return rule);
253
+ native verified, big32/WASM reject never programs
254
+ in v1.
255
+ - Top-500 batch 11: checked float-to-int casts v1 —
256
+ safe mode fails on out-of-range, NaN, or infinite
257
+ floats; fast mode keeps the truncating cast; WASM
258
+ already traps, big32 already rejects.
259
+ - Top-500 batch 12: tuple types v1 — `(T1, T2, ...)`
260
+ with owned elements, flowing through let,
261
+ assignment, arguments, returns, and struct fields;
262
+ native verified, big32/WASM reject tuple programs
263
+ in v1. Also: composite structs now emit in
264
+ dependency order (forward struct references work)
265
+ and the lexer treats numbers after a dot as tuple
266
+ indices.
267
+ - Top-500 batch 13: local type inference v1 — an
268
+ empty array literal infers its element type from
269
+ a later constraining use (push, assignment,
270
+ annotated let, call argument, return, struct
271
+ field, field assignment); unconstrained literals
272
+ fail with a clear message.
273
+ - Top-500 batch 14: first-class ranges v1 — lazy
274
+ half-open `a..b` values of type `range`, with
275
+ len / contains / start / end / sum methods and
276
+ for-loop iteration; big32/WASM reject ranges
277
+ in v1.
278
+ - Top-500 batch 15: void/unit consistency v1 —
279
+ void is allowed only as a function or method
280
+ return type; every other use fails in the
281
+ checker with a clear message instead of
282
+ invalid C. §1 Types/safety is now complete.
283
+ - Top-500 batch 16: defer v1 — `defer call();`
284
+ runs at the enclosing block's exit, LIFO,
285
+ including early returns, breaks, and
286
+ continues; loop-body defers run each
287
+ iteration. big32/WASM reject defer in v1.
288
+ - Top-500 batch 17: allocator-as-value v1 —
289
+ stdlib/allocator.fg, pure Qasida: one
290
+ Allocator struct passed explicitly to
291
+ functions, in bump, freelist, and arena
292
+ kinds; out-of-memory returns -1 as a value.
293
+ - Top-500 batch 18: arena allocation v1 —
294
+ stdlib/arena.fg, pure Qasida: a growing
295
+ region with mark/restore for temporary
296
+ allocations. Also fixed two real ownership
297
+ bugs: copy-on-write push on shared arrays,
298
+ and field-assignment ownership for array and
299
+ struct fields.
300
+ - Top-500 batch 19: reference counting v1 —
301
+ a `refcount` builtin plus stdlib/rc.fg:
302
+ shared ownership made observable, clone
303
+ gains a holder, last drop frees.
304
+ - Top-500 batch 20: weak references v1 —
305
+ a runtime weak table: weak_new registers
306
+ without gaining a holder, weak_upgrade
307
+ reports the current array while alive and
308
+ (false, []) after the last strong holder
309
+ drops.
310
+ - Top-500 batch 21: move semantics v1 —
311
+ move(a) transfers the one hold instead of
312
+ copying; the source is dead afterwards and
313
+ any later use is a checker error.
314
+ - Top-500 batch 22: copy-on-write arrays v1,
315
+ opt-in — stdlib/cow.fg: a Cow shares its
316
+ buffer until a write (shared writer gets a
317
+ private copy, sole holder writes in place).
318
+ Marked partial: language-default CoW needs
319
+ an explicit decision (it would break Rc's
320
+ shared mutation).
321
+ - Top-500 batch 23: stack-allocated slices v1
322
+ — stdlib/slice.fg: a stack header over an
323
+ existing array's buffer, no copy, writes
324
+ through, slicing composes.
325
+ - Top-500 batch 24: lifetime-ordered placement
326
+ v1 — stdlib/lifetime.fg: shorts from the
327
+ front, longs from the back, one reset frees
328
+ all shorts while longs survive.
329
+ - Top-500 batch 25: memory-mapped files v1 —
330
+ a runtime mmap table: open/get/set/close,
331
+ writes land in the file itself. Also fixed
332
+ two real leaks the demo exposed (read_bytes
333
+ freshness, write_bytes param consumption).
334
+ - Top-500 batch 26: allocator-aware collections
335
+ v1 — AVec over the #22 Allocator (one element
336
+ per slot; bump stays exhausted after a pop,
337
+ freelist reuses the freed slot; OOM is a
338
+ value). Pure Qasida. Maps are the next
339
+ slice, so #32 lands PARTIAL.
340
+ - Top-500 batch 27: destructor hooks v1 — a
341
+ `drop` method runs when an owned binding dies
342
+ (block/function end, return, break), before
343
+ the free, via an owned copy; the receiver
344
+ parameter itself never hooks (else infinite
345
+ recursion). Native only.
346
+
347
+ ## 1.3.0 — 31 Oct 2026
348
+
349
+ - Daily batch 31 Oct 2026 (10 OS kernels + 10 libraries, all
350
+ verified by real runs): OS kernels, each a new freestanding
351
+ big32 kernel with a model test (exact UART transcript,
352
+ halted) — rng (LCG driver), beep (note table), rtc (HH:MM:SS
353
+ app), editor (type/backspace), fm (file manager), paint (8x8
354
+ framebuffer), mon (system monitor), bootmenu (app launcher),
355
+ notes (notes app), pipe (byte-stream ring IPC). Libraries,
356
+ each a new pure Qasida stdlib file with a demo verified by
357
+ `qasida run` — uuid, retry-backoff, cli-table, progress,
358
+ email-parse, tfidf, ical-lite, config, timers, changelog.
359
+ Regression suite `tests/run_tests.py` passed.
360
+ - Language upgrade 30 Oct 2026: `ecall3(eid, arg0, arg1) -> int`
361
+ (big32 only) — extension id in `a7`, arguments in `a0`/`a1`,
362
+ result in `a0`. Proved by `examples/os/kernel_ecall3.fg` +
363
+ `tests/test_kernel_ecall3.py` (exact transcript `2 / 141 / -2 /
364
+ DONE`, halted; the 141 proves the second argument arrives in `a1`).
365
+ Scope note: this is the three-register call; real SBI also uses
366
+ `a6` for the function id, so exact firmware-SBI calls remain a
367
+ future slice.
368
+ - Language upgrade 30 Oct 2026: hex integer literals (`0xFF`,
369
+ `0x10000000`, uppercase `0X` also accepted) — lexer-only, so
370
+ every backend and the checker see a plain int; a bare `0x` with
371
+ no hex digit is a compile error. Proved by
372
+ `tests/test_hex_literals.py` (native values + a big32 model
373
+ kernel using `0x10000000` as the UART address).
374
+ - Daily batch 30 Oct 2026 (15 libraries, all pure Qasida with a
375
+ demo each, verified by `qasida run`): fft (radix-2 + inverse,
376
+ Taylor-series twiddles), mathex (erf, gamma), textwrap,
377
+ difflib (LCS ratio — documented as not Python's SequenceMatcher
378
+ ratio), slugify, markdown-lite (to text; HTML pending),
379
+ toml (subset), ini, xml-lite, dotenv, pathlib (POSIX), url
380
+ (parse/build/encode of the reserved set), compress (RLE only;
381
+ Huffman/gzip pending), nlp-words (tokenize/stopwords/stem-lite),
382
+ i18n-lite (two-locale catalog, plural-lite). Two bugs caught by
383
+ the demos and fixed before push: mathex `sign` needed `mut`,
384
+ slugify dropped uppercase letters. No kernel sims this day: a
385
+ big32 diagnostic sim (privilege trace, then CSR-write trace)
386
+ was running, so per the daily rules the OS track is reported
387
+ short honestly instead of colliding with it.
388
+ - Daily batch 29 Oct 2026 (16 libraries, all pure Qasida with a
389
+ demo each, verified by `qasida run`): numpy (flat row-major
390
+ arrays, matmul, reductions), pandas (flat DataFrame, filter,
391
+ sort, means), complex, fractions, statistics (mode, quantiles,
392
+ IQR), checksum (crc32/fnv1a/adler32 over byte arrays),
393
+ base64 + hex, semver (struct API — no int-to-string builtin
394
+ exists yet), units, polynomials, optimization (gradient
395
+ descent, least squares), fuzzy (Levenshtein), calendar
396
+ (Zeller weekday), template ({{name}} rendering), color
397
+ (hex/rgb/hsl), money (integer cents). Checksums cross-checked
398
+ against Python; weekdays cross-checked against `date`.
399
+ - Daily batch 29 Oct 2026 (10 OS kernels, all freestanding big32
400
+ verified on the Python big32 model with exact UART transcripts
401
+ + memory checks): lifetime-ordered allocator (short pool freed
402
+ by epoch reset, long pool survives), terminal command core
403
+ (prompt/echo/backspace/dispatch over UART RX — the SOC2 window
404
+ draw itself is still pending), shell v2 with digit arguments,
405
+ page bitmap allocator, IPC ring queue, priority scheduler
406
+ policy, filesystem v3 (delete + rename), network loopback
407
+ checksum, calculator app, clock app. No SOC2 vvp sims were run
408
+ this day: the big32 Linux continuation sim was running.
409
+ - Traps + firmware calls (Phase D of the freestanding track;
410
+ see docs/FREESTANDING.md): csr_read/csr_write/csr_set/
411
+ csr_clear (literal CSR numbers only), trap_handler hook
412
+ (mtvec + full register save/restore stub + mret), ecall(eid,
413
+ arg) SBI-call primitive; program end clears mtvec before
414
+ halting. Checkpoint is ecall-driven (the model has no timer
415
+ or SBI emulation) with exact UART transcript SCRTK.
416
+ - `--freestanding` build mode (Phase C of the freestanding
417
+ track; see docs/FREESTANDING.md): native builds with
418
+ `-nostdlib` and the program's own `_start` (raw exit_group
419
+ syscall, main's return value = exit code); OS needs
420
+ (files, sockets, threads, clock, args, print, libm, extern)
421
+ are clean checker errors and strings/arrays are clean
422
+ codegen errors; big32 runs under the same flag, WASM
423
+ refuses it. `fail()` halts instead of exiting.
424
+ - Raw memory builtins `peek32`/`poke32` (Phase B of the
425
+ freestanding track; see docs/FREESTANDING.md): volatile 32-bit
426
+ load/store through a raw address — native via volatile pointer
427
+ helpers, big32 via `lw`/`sw`, WASM rejects loudly. `peek32` is
428
+ an expression, `poke32` is statement-only like `push`; both
429
+ unchecked in every mode, by design. Proven by a big32 model
430
+ run (UART byte write, status/RX reads, RAM round-trip) in
431
+ `tests/test_peek_poke.py`.
432
+ - Bitwise operators `& | ^ << >> ~` on ints (first step toward a
433
+ freestanding, bare-metal-capable language; see
434
+ docs/FREESTANDING.md): C-like precedence, two's-complement
435
+ `& | ^`, wrapping `<<`, arithmetic `>>`, shift counts masked
436
+ (0..63 native/WASM, 0..31 big32). Native, WASM, and big32
437
+ backends; `tests/test_bitwise.py` covers all three plus
438
+ checker rejections and formatter stability.
439
+
440
+ ## 1.2.0 — 27 Oct 2026
441
+
442
+ - HTTPS proxy (CONNECT) support in `http_get` (native backend):
443
+ `https_proxy` / `HTTPS_PROXY` (`http://[user[:pass]@]host[:port]`,
444
+ port defaults to 8080) now tunnels HTTPS through a plain HTTP
445
+ proxy with a `CONNECT host:443` handshake before the TLS
446
+ handshake (SNI, certificate verification, and all existing
447
+ failure messages unchanged); `no_proxy` / `NO_PROXY` bypasses
448
+ the proxy (exact, leading-dot suffix, or `*`). Other proxy
449
+ schemes are ignored and the connection goes direct, as before;
450
+ plain `http://` never uses a proxy. Tested end to end with a
451
+ local CONNECT proxy + local TLS server on a private CA
452
+ (`tests/test_proxy_connect.py`, 6/6): direct, via proxy,
453
+ no_proxy bypass, proxy refusal (clean "proxy CONNECT refused"
454
+ error), proxy auth, and non-http scheme ignored. WASM/big32
455
+ unaffected (native C only).
456
+ - Windows port (MinGW-w64, cross-compile verified, not yet
457
+ run-verified): the generated C now has a `#ifdef _WIN32`
458
+ branch — winsock headers, a `forge_sock_t` socket type
459
+ (`SOCKET` on Windows, `int` elsewhere), `closesocket`
460
+ via `forge_sock_close`, lazy `WSAStartup`, link
461
+ `-lws2_32`; fast mode drops `-march=native` for MinGW
462
+ targets. HTTPS is off by default on Windows (no MinGW
463
+ OpenSSL here): `https_get` compiles to a stub that
464
+ fails at runtime with a clear message; plain HTTP and
465
+ non-network programs are unaffected. Opt back in with
466
+ `QASIDA_HAVE_OPENSSL=1` (MSYS2 OpenSSL, untested).
467
+ `QASIDA_NO_OPENSSL=1` builds any platform without
468
+ OpenSSL (same stub). Verified: hello, HTTP registry
469
+ server, scope/threads, struct-array, nested-array,
470
+ break, and https programs all cross-compile with
471
+ `x86_64-w64-mingw32-gcc-posix` 13.2.0. No Wine here,
472
+ so no `.exe` has executed yet — Windows is not
473
+ claimed as supported until one runs.
474
+ - Registry deploy files completed (registry/): the server
475
+ now reads `PORT` and `FORGE_REGISTRY_TOKEN` from the
476
+ environment (CLI flags still win), `GET /` and
477
+ `GET /health` answer for health checks, and the
478
+ Dockerfile no longer passes an empty `--token` (which
479
+ used to lock publishing even in open mode). New:
480
+ `render.yaml` (Blueprint), `fly.toml` (with a
481
+ persistent volume for published packages), a systemd
482
+ unit for VPS installs, and a rewritten README with
483
+ exact steps for each. Verified live without Docker
484
+ (no daemon in this VM): health, empty list, publish
485
+ 401 without token / ok with token / 409 on republish,
486
+ byte-exact file round-trip, and open-mode publish.
487
+ The Docker image itself is not built here — the
488
+ Dockerfile is a 10-line copy of the verified script.
489
+ - JalOS (examples/os/jalos.fg, ~1300 lines): a complete
490
+ teaching OS in Qasida — boot, priority scheduler
491
+ (29-tick demo: printer, counter, fibber, sorter,
492
+ idler), first-fit heap allocator with coalescing,
493
+ hierarchical VFS with permissions, users, /proc,
494
+ networking (real HTTP fetch), a package manager
495
+ that really installs registry packages over HTTPS,
496
+ cron/syslog services, and a ~30-command shell with
497
+ script-file and single-command modes. The demo tour
498
+ is offline, deterministic, and wired into the suite
499
+ as an exact-output test. Honest limits (see
500
+ examples/os/README.md): simulated, not bootable;
501
+ text shell, no GUI; plain-string passwords; no
502
+ persistence across shutdown; HTTPS needs direct
503
+ internet (proxied sandboxes break the TLS handshake
504
+ — the language HTTP client has no proxy CONNECT
505
+ yet).
506
+
507
+ ## 1.1.0 — 27 Oct 2026
508
+
509
+ - Book, Tour, LSP parity, fix-ending diagnostics:
510
+ docs/BOOK.md rewritten as the complete current guide
511
+ (replacing the stale starter: WASM strings/arrays, autograd,
512
+ and GPU training are no longer "not yet"), docs/TOUR.md is a
513
+ 10-step guided tour with runnable programs in
514
+ examples/tour/ and verified outputs, the language server now
515
+ completes from the checker's own keyword and builtin sets
516
+ (so `scope`, `break`, `http_listen`, `alloc_count`, and
517
+ friends can no longer drift stale) with an end-to-end stdio
518
+ smoke test in tests/lsp_smoke.py, and checker errors now end
519
+ with fixes where a fix is mechanical — did-you-mean
520
+ suggestions for variables, functions (including builtins),
521
+ types, and enum variants, int/float conversion hints
522
+ ("convert the value with 'value as float'"), missing-return
523
+ and break-outside-loop fix lines, and rejection of C
524
+ keywords as names ("'double' is a C keyword ... rename it")
525
+ instead of cryptic C compiler failures.
526
+ - WIT-first WASM components (docs/WIT.md): `forge.py build
527
+ prog.fg --target wasm --wit prog.wit` (and `emit-wasm --wit`)
528
+ checks the program against the WIT world before generating
529
+ the module — every non-`main` function must be declared in
530
+ the world's exports with matching arity, parameter types in
531
+ order, and return type, or the build fails naming the
532
+ difference. Type mapping: int -> s64, float -> f64,
533
+ bool -> bool, str -> string, [T] -> list<T>. World imports
534
+ are rejected (the backend emits a self-contained module with
535
+ no imports), and `--wit` with another target is rejected
536
+ instead of silently ignored. This is interface-contract
537
+ checking, not component-model binary encoding: the emitted
538
+ module is still a core module (see docs/WIT.md for the
539
+ boundary).
540
+ - Structured concurrency (`scope`, native backend): a `scope {
541
+ ... }` block joins every task spawned inside it — directly or
542
+ transitively by functions called from inside it — at the
543
+ closing brace, and on any `return` or `break` that leaves the
544
+ scope, so no task outlives its block. Scopes nest (an inner
545
+ join is never repeated by an outer join or by `main`'s
546
+ exit join); tasks spawned outside any scope keep the old
547
+ behaviour (joined at `main`'s return). `scope` is not a
548
+ reserved word — it is recognised only as `scope` followed by
549
+ `{` at statement position, so `scope` still works as an
550
+ ordinary variable name. On WASM and big32 a scope block runs
551
+ as a plain block and `spawn` inside it fails as before.
552
+ No results, cancellation, or channels yet: spawned functions
553
+ are void, and a hung task still hangs the scope that waits
554
+ on it.
555
+ - Safe-mode check elimination (native backend only, SPEC §6b):
556
+ duplicate checks within one statement are emitted once (the
557
+ repeat uses the unchecked access; the cache is per-statement
558
+ and cleared by any call); guard intervals skip overflow/div
559
+ checks proven safe by if-guards (e.g. `n - 1` after `if n < 2
560
+ { return n; }`), with hull joins across arms and clearing
561
+ around loops and matches; string-index comparisons (`s[i] ==
562
+ "a"`, `s[i] == s[j]`) compare bytes directly with no
563
+ allocation, keeping the bounds check in safe mode. Nothing
564
+ observable changes: aborts and results are identical, and
565
+ tests pin both the eliminations (emitted-C probes) and the
566
+ checks that must remain (overflow after reassignment, guards
567
+ around loops, out-of-bounds string compares and duplicate
568
+ reads). WASM and big32 keep every check.
569
+
570
+ - Cost of safety published (docs/BENCHMARKS_SAFETY.md,
571
+ tools/bench_vs/run_safety_bench.py): safe vs fast mode on six
572
+ tasks, compared two ways — shipped flags (safe -O2 vs fast -O3
573
+ -march=native) and matched flags (both -O2, so the only
574
+ difference is the checks). Pure check cost: overflow-check-heavy
575
+ fib 2.7-3.7x, string bounds checks ~1.7x, nested bounds checks
576
+ ~1.4x, array bounds on float work ~1.0x, loop-counter checks
577
+ ~1.0x. The big shipped fast-mode wins (matmul 3.9-5.3x) come
578
+ from -O3/-march=native auto-vectorization, not from dropping
579
+ checks — the matched comparison proves it. Safe and fast compute
580
+ identical results on all six tasks. Caveat, stated in the doc:
581
+ this VM's timing noise moves absolute times up to ~2x between
582
+ runs, so ranges from two runs are reported, not single numbers.
583
+
584
+ - Registry seeded from 7 to 30 packages (all 0.1.0, each with a
585
+ demo with self-checks and a smoke test): percentages, loans,
586
+ bmi, colors, sorting, search, primes, factors, statistics,
587
+ grades, tax, cooking, budget, checks (Luhn, ISBN-10/13), morse,
588
+ textstats, speed, data, angle, fractions, vectors, matrices
589
+ (built on the new nested arrays), polynomials. All 30 demos
590
+ and 30 smokes pass (60/60); publish of all 30, list, local
591
+ add, and HTTP add-remote verified against a local registry
592
+ server with a fresh consumer. Public hosting still needs the
593
+ maintainer's account.
594
+
595
+ - Platforms investigated (docs/PLATFORMS.md): Linux x86_64
596
+ remains the verified platform. Windows cross-compilation was
597
+ attempted with MinGW-w64 13.2.0 and fails at the generated
598
+ C's POSIX socket headers — a Windows port needs a winsock
599
+ branch in the runtime, MinGW OpenSSL or conditional HTTPS,
600
+ and the -posix MinGW variant. macOS was not buildable here
601
+ (no SDK/clang/zig); its path is a native build with Xcode
602
+ tools + Homebrew OpenSSL. No macOS or Windows binary is
603
+ claimed. Enabler shipped: `QASIDA_CC` selects the C compiler
604
+ for `run`/`build`/shared-library builds (default `cc`,
605
+ unchanged).
606
+
607
+ - Killer app: examples/apps/registry_server.fg — a package
608
+ registry server written in Qasida itself, speaking the same
609
+ HTTP API as the Python reference server, so the real `forge
610
+ pkg publish-remote` / `add-remote` clients work against it.
611
+ Verified live: publish (incl. 401 unauthorized, 409 version
612
+ already exists), list, versions, files, byte-exact file
613
+ round-trip, and a fresh consumer installing and running two
614
+ packages. One real bug found and fixed along the way: the
615
+ first version read each request with a single recv, which
616
+ fails when a client sends headers and body as separate
617
+ writes — the server now reads until headers plus
618
+ Content-Length body bytes arrive. Flat on-disk layout plus
619
+ an index file (no directory-listing builtin); listings in
620
+ publish order, not sorted; ASCII-only publish bodies.
621
+ HTTP status reasons gained 401 Unauthorized and 409
622
+ Conflict.
623
+
624
+ - `break` exits the innermost `while`/`for` loop, on all three
625
+ backends (native, WASM, big32). Breaking frees the loop body's
626
+ locals, so the break path does not leak (verified: 4 allocs, 4
627
+ frees in examples/break_gc_demo.fg). `break` outside a loop is a
628
+ compile error, including inside a function called from a loop.
629
+ This is an addition under the stability promise, not a break:
630
+ no existing program used `break` as an identifier.
631
+
632
+ - String indexing: `s[i]` returns a 1-character string (byte
633
+ indexing), on native and WASM; safe mode aborts out of bounds,
634
+ fast mode skips the check. Strings stay immutable: `s[i] = ...`
635
+ is a compile error. Not yet on big32 (clear error for now:
636
+ big32 has no runtime string allocation).
637
+
638
+ - Arrays of structs (native): `[Point]` works — literals, `len`,
639
+ `xs[i]` (owned copy), `xs[i].field` (direct read, no leaked
640
+ sibling fields), `for` loops (borrowed element view), `push`,
641
+ index assignment (frees the old element first), and array free
642
+ (frees elements' owned fields: verified 1/1 array and 2/2 str
643
+ allocs/frees). Generic struct arrays work too. Not yet on WASM
644
+ or big32, which report clear errors.
645
+
646
+ - Nested arrays (native): `[[int]]` matrices — literals, `len`,
647
+ `m[i][j]` reads, chained `m[i][j] = v` writes, `for` loops over
648
+ rows, row `push` and row replacement, shared-row mutation
649
+ (`let row = m[i]; row[j] = v;` mutates the matrix), and
650
+ balanced nested frees (verified 3/3 array allocs/frees for a
651
+ 2-row matrix, 3/3 for `[[str]]`). Triple nesting works too.
652
+ big32 reads nested arrays on the Python model (push remains
653
+ unsupported there, as for all arrays); WASM reports a clear
654
+ error.
655
+
656
+ ## 1.0.0 — 26 Oct 2026 — "Market-ready": stability promise, live playground, HTTP server, regex, real packages, packaged extension, honest benchmarks
657
+
658
+ - Stability promise: docs/STABILITY.md — semver for real. 1.x adds,
659
+ never breaks; breaking changes require a major version; deprecations
660
+ get at least one minor release of warning. The promise covers the
661
+ documented language surface, stdlib APIs, the qasida CLI, and the
662
+ package format. It does NOT cover missing features (gaps, not breaks),
663
+ experimental backends (CUDA emit, big32 soft-float internals, the
664
+ self-host prototype), performance characteristics, or error wording.
665
+ - Front door: the MIT LICENSE now lives in the repo root (it was only
666
+ preserved on GitHub's side before). Landing page updated to 1.0.0
667
+ numbers. Repo rename + hosting + GitHub Pages enable remain the
668
+ maintainer's own clicks.
669
+ - Install: re-verified on a clean HOME (install.sh -> qasida 1.0.0,
670
+ demo runs) and a clean pip venv (qasida-pip 1.0.0). PyPI publish
671
+ itself still needs the maintainer's account.
672
+ - Live playground v2: web/playground.html is now a real editor. The
673
+ actual compiler runs under Pyodide (fetched from the repo's main
674
+ branch via jsDelivr), the user's program compiles to WebAssembly
675
+ in-browser, and output comes from the WASM stdout buffer. Four
676
+ examples (hello, fib, sum, dice-with-stdlib-import), each verified
677
+ end to end through the same pipeline the page uses. JS syntax-checked
678
+ with node --check. End-to-end run in a real browser is NOT verified
679
+ here (no browser run was available); the page needs one open to
680
+ confirm Pyodide loading. WASM-subset limits are stated on the page:
681
+ imports work only for subset-safe stdlib files (rand/dates verified;
682
+ files using split/structs/float-printing fail the whole program
683
+ because the backend compiles every imported function).
684
+ - HTTP server: six new builtins (native only) — http_listen,
685
+ http_accept, http_read_request, http_respond, http_respond_status,
686
+ http_close — plus stdlib/http_server.fg (path parsing, serve_n)
687
+ and examples/http_server_demo.fg (routes / -> greeting,
688
+ /health -> ok, else 404). Verified live: curl returned 200/200/404
689
+ with correct bodies and Content-Lengths, server log showed all
690
+ three routes, clean shutdown after 3 requests, 300 bytes total
691
+ (recomputed by hand: 116 + 85 + 99). Limits, stated: one request per
692
+ connection, single read up to 8191 bytes, no TLS, no chunked bodies,
693
+ IPv4 0.0.0.0. Adding a builtin touches FOUR places, not one:
694
+ checker types, infer types, codegen call mapping, and (for str
695
+ results) the fresh-string list — the first build failed on exactly
696
+ this (emitted `void fd`) until infer was updated.
697
+ - Regex: stdlib/regex.fg, a backtracking engine in pure Qasida —
698
+ literals, `.`, `*` `+` `?` with backtracking, classes with ranges
699
+ (a-z/A-Z/0-9 via alphabet-position lookup, since the language has
700
+ no char-to-int conversion), negation, \d \w \s, literal escapes,
701
+ ^ $ anchors; regex_match / regex_find / regex_full_match.
702
+ examples/regex_demo.fg: 36 checks, all pass, including backtracking
703
+ (a+a on "aaa", a*ab on "aab"). NOT supported, matched literally
704
+ instead: groups (...) and alternation | (no closures/function
705
+ values to represent them). Ranges outside the three alphabets never
706
+ match. Worst case is exponential (classic backtracking).
707
+ - Registry packages: packages/ ships seven real packages, each with a
708
+ demo main that checks its own values and a smoke test — units,
709
+ money (integer-paise math, hand-built int-to-string), geometry,
710
+ interest (simple/compound/EMI), roman (1..3999, both directions),
711
+ bases (binary/octal/hex, both directions), dice (on stdlib rand).
712
+ Remote flow verified end to end against a local registry server:
713
+ all seven published, list-remote showed all seven, a fresh consumer
714
+ package add-remote'd units@0.1.0 and ran it (5 km = 3.10685 miles,
715
+ 100 F = 37.7778 C). Public hosting still needs the maintainer's
716
+ VPS/Render/Fly account + domain + HTTPS.
717
+ - VS Code extension: packaged as editors/vscode/forge/forge-1.0.0.vsix
718
+ (verified contents: displayName "Qasida", 1.0.0,
719
+ publisher qasida, updated grammar). Grammar gained the missing
720
+ keywords (enum, extern, spawn, match) and the new builtins. The
721
+ extension is intentionally client-free (grammar + config); the LSP
722
+ server (forge.py lsp) works with any LSP client. Marketplace publish
723
+ needs the maintainer's publisher account.
724
+ - Benchmarks: docs/BENCHMARKS_VS.md + tools/bench_vs/run_bench.py —
725
+ same algorithm in Qasida, Python, Go, Rust, C; medians of 3;
726
+ results verified equal across languages. Qasida is ~31x Python
727
+ on fib(35), ~49x on array_sum, ~259x on matmul 128; in the compiled
728
+ cluster with Go/Rust/C (within ~2-4x of C, trading places with Go
729
+ and Rust run to run on this noisy VM). Two findings kept: (1) the
730
+ first loop task was deleted by Rust/C compilers (closed form),
731
+ which is why the task is now runtime-array data; Qasida safe
732
+ mode does NOT fold it (checks block it), fast mode DOES (0us) —
733
+ mechanism verified both ways. (2) Qasida prints floats at 6
734
+ significant digits, so its matmul checksum displays rounded.
735
+ - CI: .github/workflows/ci.yml verified current (suite + formatter
736
+ + ecosystem example; node is preinstalled on ubuntu-latest, big32
737
+ checks are compile-only). Upload still blocked: token lacks
738
+ workflow scope (403, as before) — needs a token fix or a web-UI
739
+ upload.
740
+ - Gotchas found by this batch (all fixed, all verified after fixing):
741
+ a Qasida fn named `close` collides with libc close() in the
742
+ generated C; the INT_MIN literal overflows (9223372036854775808 >
743
+ i64 max — compute it as 0 - 9223372036854775807 - 1); args()
744
+ excludes the program name; the WASM backend compiles every
745
+ imported function, so one unsupported construct fails the import;
746
+ a demo file named rand.fg shadowed its own stdlib import.
747
+
748
+ ## 0.7.0 — 26 Oct 2026 — "Build everything open": debugger, binary I/O + images, stacked convs, curriculum RNN, big32 structs + soft-float, WASM strings/arrays, fuzzer, big TinyStories run
749
+
750
+ - Source-level debugger: `forge.py build --debug`
751
+ adds `-g` and the code generator emits per-statement
752
+ `#line` directives naming the Qasida file (main
753
+ file AND imported helpers — verified with readelf's
754
+ line table). Without `--debug` the C has no `#line`
755
+ at all. Caveat: -O2 inlining merges addresses, and
756
+ main's prologue maps to the C file (docs/DEBUGGING.md).
757
+ - Binary I/O + images: new builtins `read_bytes` /
758
+ `write_bytes`; `stdlib/image.fg` loads PPM P3 and
759
+ 24-bit uncompressed BMP, grayscales, saves PPM P3.
760
+ Verified: BMP == PPM on the same 2x2 image, gray0 =
761
+ 0.299, gray3 = 1. PNG/JPEG NOT supported (they need
762
+ inflate/DCT) — stated, not hidden.
763
+ - Tape-native im2col (op 21) + stacked convs:
764
+ `cnn_conv2d_tape` lets conv layers stack. Two-conv
765
+ net on 8x8 cross-vs-border: 0.5 -> 1.0. Found by
766
+ running: lr 0.05 oscillates on the deeper net (loss
767
+ frozen at ln 2 with exact gradients); lr 0.01 trains
768
+ it. The demo documents this.
769
+ - Curriculum RNN: `examples/rnn_curriculum_demo.fg`
770
+ stages len 3 -> 5 -> 8 with weight transfer; all
771
+ three reach 100% held-out. The 0.6.0 len-8 wall is
772
+ cracked, not worked around.
773
+ - big32 structs: local struct variables as consecutive
774
+ frame slots (int/bool/str fields), field reads/writes,
775
+ struct copies; params/returns still rejected.
776
+ Verified on the Python model AND Icarus Verilog.
777
+ - big32 soft-float v1: float literals/vars, [float]
778
+ arrays, + - * via forge_fadd/forge_fmul helpers in
779
+ exact 27-bit integer arithmetic with
780
+ round-to-nearest-even. Verified: 12/12 demo checks
781
+ and a 60-case randomized differential test vs
782
+ Python float32, 60/60 on model AND Verilog. Two
783
+ real bugs found and fixed by that fuzzing (the
784
+ subtraction borrow, and the carry-shift sticky
785
+ fold); one test-generator bug found too (pool
786
+ values must be float32-rounded before computing
787
+ expected values). NOT yet: division, ordered
788
+ comparisons, float printing, int<->float casts,
789
+ subnormal fidelity, NaN/Inf.
790
+ - WASM strings + arrays: `str` and flat `[int]` /
791
+ `[float]` / `[bool]` / `[str]` with literals,
792
+ concat, `==`, len, indexing, index-assign, push
793
+ (realloc-by-copy), params/returns, fail/assert.
794
+ One exported memory, bump allocator, no free/GC.
795
+ Verified: demo output byte-identical to native.
796
+ Divergence stated in docs/WASM_STRINGS.md: push
797
+ through a WASM parameter DOES reach the caller
798
+ (native push to a parameter does not).
799
+ - Fuzzer: `tools/fuzz.py` — seeded valid-by-
800
+ construction programs, safe-vs-fast differential,
801
+ 50/50 OK on the default run, 200/200 OK on a
802
+ longer run (seeds 1000-1199). No compiler bugs
803
+ found; corpus dir stays empty until a failure
804
+ appears.
805
+ - Big TinyStories run: 2000 stories, 150,000 words,
806
+ vocab 2000 (UNK 3.7%), 153,744 params, 9000 steps,
807
+ 87.7 ms/step. Held-out ppl 2128.55 -> 651.44.
808
+ Honest result: much better, still NOT fluent —
809
+ greedy output loops on "collecting", sampled
810
+ output is word salad with structure. Fluent
811
+ generation needs far more scale, not another
812
+ small-model run.
813
+ - Correction, carried from the 0.6.0 notes: earlier
814
+ "wasm + big32 suites passed" claims were wrong —
815
+ `tests/run_tests.py` ignores CLI arguments, so
816
+ those runs executed the NATIVE suite twice. The
817
+ suite now has real checks: big32 build checks for
818
+ both demos and a node-based WASM output comparison
819
+ (skipped only when node is absent). WASM/big32
820
+ execution stays verified manually against node and
821
+ the big32 model + Verilog.
822
+
823
+ ## 0.6.0 — 26 Oct 2026 — Ecosystem batch: import dedup, RNN/CNN/classical ML, preprocessing, metrics, CSV, dev libraries
824
+
825
+ Fixed (compiler, the ecosystem blocker):
826
+ - `forge_lang/compiler.py` `load_program` now keeps a
827
+ true visited set instead of clearing it on return.
828
+ Diamond imports used to include a shared file twice
829
+ and fail with "duplicate struct 'Tensor'", which
830
+ forced every library to avoid shared imports and
831
+ made libraries uncombinable. Now nn.fg +
832
+ tensor_autograd.fg (and any other combination)
833
+ compile together; verified by
834
+ examples/import_dedup_demo.fg (tensor loss 0.693147
835
+ trained one Adam step, 1.0 -> 0.99).
836
+
837
+ Added (tensor autograd, ops 17-20):
838
+ - t_maxpool2d, t_sigmoid, t_tanh, t_mse_loss in
839
+ stdlib/tensor_autograd.fg, each backward rule
840
+ checked against finite differences
841
+ (examples/tensor_ops2_demo.fg: sigmoid 6.3e-13,
842
+ tanh 1.2e-11, maxpool routes exactly to argmax
843
+ cells, other cells 0).
844
+
845
+ Added (ML libraries, all verified by demos):
846
+ - stdlib/rnn.fg: LSTM/GRU/plain-RNN cells on the
847
+ tensor tape (out-parameter idiom: cells return
848
+ the tape and write new state ids into an `out`
849
+ array; the new hidden state is also the tape's
850
+ last node). Demo: first-bit memory over 5 steps,
851
+ 0.44 -> 1.0. Honest limit found by running: the
852
+ same task at length 8 stalls at chance from
853
+ random init even with forget-bias init — a known
854
+ LSTM optimisation difficulty, not a library bug
855
+ (all cell ops finite-difference checked; lengths
856
+ 3 and 5 reach 100%).
857
+ - stdlib/cnn.fg: im2col conv + tape maxpool. Demo:
858
+ 8x8 cross-vs-border with noise, 0.5 -> 1.0.
859
+ Limit: conv input must be raw image data (first
860
+ layer); stacking convs needs a tape-native
861
+ im2col op, documented in the file.
862
+ - stdlib/ml_classical.fg: logistic regression
863
+ (tape + inline Adam), k-NN, k-means. Demo:
864
+ purity 1.0, knn 1.0, logreg 1.0 on synthetic 2D.
865
+ - stdlib/preprocess.fg, metrics.fg, csv.fg:
866
+ standardisation, min-max, one-hot, deterministic
867
+ splits, vocab builder; accuracy, confusion,
868
+ precision/recall/F1, MSE/MAE/R2; plain CSV load
869
+ (no quoted commas). Demo: real UCI Iris
870
+ (data/iris.csv, 150 rows) end to end, test acc
871
+ 0.933333, macro F1 0.937322.
872
+ - Tensor checkpoint demo: nn checkpoints round-trip
873
+ a tensor model with loss diff 0.
874
+
875
+ Added (developer libraries):
876
+ - stdlib/test.fg, log.fg, cli.fg, collections.fg
877
+ (checks, leveled logging, CLI parsing, stacks
878
+ and sets), exercised in examples/dev_demo.fg.
879
+
880
+ Docs: docs/ECOSYSTEM.md 0.6.0 section (library
881
+ table, first-ML-project walkthrough, honest
882
+ limits). README Ecosystem section updated.
883
+
884
+ Still NOT done: fluent generation, GPU training
885
+ run (code only), WASM strings/arrays, big32
886
+ floats/structs, source-level debugger, self-hosting
887
+ compiler, registry host, CI upload, repo rename,
888
+ PyPI publish, image/binary data loading, conv
889
+ stacking, long-horizon RNN training.
890
+
891
+ ## 0.5.0 — 26 Oct 2026 — Engine batch: tape freeing, tensor autograd, KV-cache, scaled training
892
+
893
+ Fixed (compiler, the 0.4.0 leak):
894
+ - `forge_lang/codegen.py` now frees a block's variables
895
+ when the block ends (`emit_free_frame`, applied to
896
+ Block, If arms, While and For bodies). Before this,
897
+ every array or struct created inside a loop body leaked
898
+ once per iteration — measured on a tape loop: 1,000
899
+ arrays allocated, 0 freed. After: 1,000 allocated,
900
+ 1,000 freed, and the scalar TinyStories program trains
901
+ all 3 epochs in ONE process (previously OOM-killed
902
+ twice). A subtlety found while fixing: Assign re-adds
903
+ its target to the current frame even when declared
904
+ outside it, so a frame frees only names absent from
905
+ outer frames — otherwise the same value is freed twice
906
+ (caught by a double-free in testing, fixed before ship).
907
+ - `examples/gpt_tinystories.fg` now trains 3 epochs in one
908
+ process by default (resume still works). Single-process
909
+ run 26 Oct 2026: train losses 4.98375, 4.49469, 4.41384;
910
+ held-out loss 6.98368 -> 5.95341, perplexity 1078.88 ->
911
+ 385.06. Note: this differs from 0.4.0's 247.39 because
912
+ the old split-process runs reset Adam's moments every
913
+ epoch — an accidental regulariser. The new number is
914
+ the methodologically cleaner one; both are recorded.
915
+
916
+ Added (tensor autograd):
917
+ - `stdlib/tensor_autograd.fg` — a tensor-level tape: one
918
+ node per tensor op (matmul, add, bias, transpose,
919
+ softmax, causal softmax, GELU, layernorm, mul, scale,
920
+ gather, cross-entropy, ReLU, col-slice, concat-cols,
921
+ reshape), with exact backward rules. Every rule is
922
+ checked against central finite differences in
923
+ `examples/tensor_autograd_demo.fg` (all diffs ~1e-9,
924
+ and the demo fails itself if any diff exceeds 0.01).
925
+ - `stdlib/tgt.fg` — the gpt2 transformer rebuilt on
926
+ tensor autograd (fused QKV, tied head, 12,608 params at
927
+ the small size), plus tensor Adam and grad clipping.
928
+ - `examples/tgt_tinystories.fg` — same data and sizes as
929
+ the scalar run: forward 100 nodes (scalar: 221,844),
930
+ 1500 steps in 6.5 s (4.35 ms/step), held-out loss
931
+ 6.30804 -> 5.64615, perplexity 548.97 -> 283.20.
932
+ Sampled generation is still word salad; greedy still
933
+ collapses (now on <unk>). Fluency is NOT claimed.
934
+
935
+ Added (KV-cache for gpt2):
936
+ - `stdlib/inference_gpt2.fg` — plain-float KV-cache step
937
+ for any gpt2 layout (blocks, heads, separate Q/K/V).
938
+ `examples/inference_gpt2_demo.fg` verifies it against
939
+ full-sequence forward: max logit diff 4.44e-16
940
+ (float rounding only). Generation past the trained
941
+ sequence length clamps positions to seq-1 — a
942
+ documented approximation, not a silent model change.
943
+
944
+ Added (scaled training):
945
+ - `tools/prepare_tinystories.py` gains `--out-dir`
946
+ (default `data`); `data_scaled/` holds 500 stories,
947
+ 75,000 words, 1000-word vocab, UNK 8.5%.
948
+ - `examples/tgt_tinystories_scaled.fg` — 2 blocks,
949
+ 4 heads, d=32, hidden=64, seq=16 words, 49,664 params,
950
+ 1500 strided windows (stride 8) x 3 epochs: train
951
+ 5.45016, 4.94801, 4.86257; held-out (offset 60000)
952
+ loss 7.02007 -> 5.24241, perplexity 1118.87 -> 189.13;
953
+ 117.6 s total, 26.1 ms/step, forward 136 nodes.
954
+ Sampled output is still salad order, with more
955
+ plausible fragments than at the small size.
956
+
957
+ Added (ecosystem, all verified by running):
958
+ - `docs/BENCHMARKS.md` — dot(5000): Qasida 8 µs,
959
+ NumPy 29 µs, Python loops 788 µs; matmul 64x64:
960
+ Qasida 615 µs, NumPy 343 µs (BLAS wins, stated
961
+ plainly), Python 476,501 µs.
962
+ - `web/landing/index.html` — static landing page with
963
+ the verified numbers and honest limits.
964
+ - `setup.py` + `pyproject.toml` + `bin/qasida-pip` —
965
+ `pip install .` verified in a clean venv
966
+ (`qasida-pip --version`, demo runs from another cwd).
967
+ PyPI publication still needs the maintainer's account.
968
+ - `docs/DEBUGGING.md` — gdb-on-emitted-C recipe,
969
+ allocation counters, and the missing piece (see below).
970
+ - `examples/cuda/mlp_train.cu` — GPU SGD trainer for
971
+ XOR using only the verified square-matmul wrapper.
972
+ CODE ONLY, never compiled or run (no nvcc/GPU here);
973
+ needs a Kaggle session with Jayant's token.
974
+ - `examples/cuda/kernel.cu` comment corrected: the
975
+ transformer kernels WERE verified on Kaggle T4 in
976
+ 0.3.0 (the old "not yet run" comment was stale).
977
+
978
+ Still NOT done (stated, not implied):
979
+ - Fluent generation; GPU training run (code exists,
980
+ run needs a Kaggle token); WASM strings/arrays (the
981
+ backend is 259 lines with no linear memory at all —
982
+ needs memory + a bump allocator + string/array ops,
983
+ a backend rewrite, not a patch); big32 floats/structs
984
+ (the core is integer-only, no FPU — a core extension);
985
+ a source-level debugger (AST nodes carry line but not
986
+ file, so `#line` mapping would misattribute stdlib
987
+ code — needs file tracking through the parser);
988
+ self-hosting compiler; public registry host, CI upload
989
+ and repo rename (maintainer's clicks/accounts);
990
+ PyPI publication; Mojo/PyTorch benchmark numbers
991
+ (neither installed here).
992
+
993
+ ## 0.4.0 — 26 Oct 2026 — TinyStories word GPT
994
+
995
+ Added:
996
+ - `tools/prepare_tinystories.py` — downloads the first 200
997
+ stories of roneneldan/TinyStories (train split) via the HF
998
+ datasets-server rows API, cleans them (lowercase, apostrophes
999
+ removed, other non-letters become spaces), and writes
1000
+ `data/tinystories_vocab.txt` (500 words + <unk>), `data/`
1001
+ `tinystories_ids.txt` (24,000 word ids) and a provenance
1002
+ README. UNK rate in the kept words: 14.8% (28.5% at 200
1003
+ words — the reason vocab went to 500).
1004
+ - `examples/gpt_tinystories.fg` — word-level GPT on that data,
1005
+ reusing stdlib/gpt2.fg: 2 blocks, 2 heads, d=16, hidden=32,
1006
+ seq=8 words, 500-word vocab, 12,608 params. Adam lr 0.02,
1007
+ clip 1.0, 500 strided windows (stride 4, first ~2000 words)
1008
+ x 3 epochs. Held-out test (20 windows from word offset
1009
+ 20000, later stories never trained on): loss 6.98368 ->
1010
+ 5.51097, perplexity 1078.88 -> 247.39 (a real 4.4x
1011
+ generalisation gain, not a training-set fit). Epoch
1012
+ training losses: 4.98375, 4.64674 (the third epoch's
1013
+ average was lost when its process was OOM-killed during
1014
+ the eval phase — see below — but its checkpoint is the
1015
+ one evaluated here).
1016
+ - `examples/gpt_tinystories_eval.fg` — eval-only companion:
1017
+ loads the checkpoint and reports test loss + generation
1018
+ in its own process.
1019
+ - `examples/tinystories_load_demo.fg` — suite check that the
1020
+ data files load and parse (words = 24000, vocab = 500).
1021
+
1022
+ Generation (from "once upon a time there was a little",
1023
+ 30 words): greedy still loops ("cake cake cake ...");
1024
+ sampled (temp 0.8, seed 123) gives real TinyStories words
1025
+ in salad order ("some needed smiled kept lot herself toys
1026
+ lot careful feel idea ..."). Honest verdict: upgraded from
1027
+ letter salad to word salad — the perplexity gain is the
1028
+ solid result; fluent sentences are NOT claimed.
1029
+
1030
+ Found by running (the important limitation of this batch):
1031
+ - The native backend retains each training tape's arrays,
1032
+ so one process running 1500 steps x ~221k nodes grows
1033
+ until the VM's OOM killer ends it (killed during epoch
1034
+ 1 of the original single-process run, and again during
1035
+ the eval phase of the 3-epoch run). Training is therefore
1036
+ split into one-epoch processes with checkpoint resume
1037
+ (`qasida run examples/gpt_tinystories.fg`,
1038
+ `... resume`, `... resume final`), and eval runs as its
1039
+ own process. Tape-memory freeing is the open compiler
1040
+ fix for 0.5.0, alongside tensor-level autograd.
1041
+
1042
+ Not yet done: fluent generation (needs far more data,
1043
+ params and steps — OpenMythos 44M on the same dataset took
1044
+ 4,850 steps to reach fluent samples), GPU training loop,
1045
+ tensor-level autograd, KV-cache for the gpt2 layout, public
1046
+ registry host, CI upload, repo rename.
1047
+
1048
+ ## 0.3.0 — 26 Oct 2026 — Scaled GPT + GPU-verified kernels
1049
+
1050
+ Added:
1051
+ - `stdlib/gpt2.fg` — generalised transformer: any blocks, any
1052
+ head count, any vocab/seq/hidden sizes, with a computed param
1053
+ layout (no hard-coded offsets from gpt.fg)
1054
+ - `examples/gpt_scaled.fg` — 2 blocks, 2 heads, d=16, hidden=32,
1055
+ seq=16, 29-char vocab, 5200 params, on a 411-char story:
1056
+ training loss 2.559 -> 2.364 over 3 epochs (200 windows each),
1057
+ held-out perplexity 58.1 -> 53.9 (test windows 320..327).
1058
+ Generation still loops (greedy) / rambles (sampled) — scale
1059
+ is in architecture and evaluation now, not in fluent text.
1060
+ Checkpoint save/load verified (diff ~8e-07, 6-decimal text).
1061
+ - GPU kernels VERIFIED on real hardware: Kaggle notebook v4,
1062
+ 2x Tesla T4, driver 580.178.04, nvcc 12.8.93 — dot 70, matmul
1063
+ 19 22 43 50, embedding 1 0 0 1 1 0, layernorm ±0.999980,
1064
+ attention 1.0/0.0, 0.330238/0.669762, 0.802224/0.197776,
1065
+ half matmul 19 22 43 50 — matching simulation to 6 decimals.
1066
+
1067
+ Fixed in this batch (both found by running, not by reading):
1068
+ - Training diverged to NaN at the larger scale: a softmax
1069
+ probability can underflow to exactly 0, and log(0) poisons
1070
+ the tape. g2_loss now adds 1e-9 before the log.
1071
+ - The fp16 kernel did not compile on the first GPU run:
1072
+ `__half2double` does not exist in CUDA; fixed to
1073
+ `(double)__half2float(...)`. Notebook v3 failed to build;
1074
+ v4 is the verified run.
1075
+
1076
+ Not yet done: fluent generation (needs far more data and
1077
+ params than 5200 on 411 chars), GPU training loop (kernels
1078
+ only so far), multi-layer library packaging, public registry
1079
+ host, CI upload, repo rename.
1080
+
1081
+ ## 0.2.0 — 26 Oct 2026 — Mojo-level ML stack (tensors, autograd, tiny GPT)
1082
+
1083
+ The language gains the pieces that make people use a language for
1084
+ LLM work, at small-model scale. Everything below is verified by
1085
+ the test suite or by a recorded run; the limits are listed, not
1086
+ hidden.
1087
+
1088
+ Added:
1089
+ - `stdlib/tensor.fg` — Tensor (flat row-major + shape), matmul,
1090
+ transpose, reshape, softmax, GELU, argmax (demo: 19 22 43 50)
1091
+ - `stdlib/autograd.fg` — real reverse-mode scalar tape; gradient
1092
+ matches a numeric gradient exactly at printed precision
1093
+ (df/dx 10.0452 vs numeric 10.0452), plus a sqrt node so
1094
+ LayerNorm backward is exact
1095
+ - `stdlib/nn.fg` — Linear, LayerNorm, single-head causal
1096
+ attention, MLP, Adam/AdamW, cosine/step/warmup schedules,
1097
+ gradient clipping, checkpoints (float text, 6 decimals),
1098
+ int8 quantization, greedy/temperature/top-k/top-p sampling,
1099
+ and a new `parse_float` builtin (needed for checkpoint loads)
1100
+ - `stdlib/tokenizer.fg` — character tokenizer + real BPE
1101
+ (23 chars -> 13 tokens on the demo text, round-trips)
1102
+ - `stdlib/dataset.fg` — sliding-window next-token sequences,
1103
+ train/test split, batching, shuffling
1104
+ - `stdlib/gpt.fg` + `examples/tiny_gpt.fg` — a 1-block, 1-head
1105
+ transformer (d=8, hidden=16, tied head, 776 params) trained by
1106
+ autograd + Adam on "hello world hello qasida": loss
1107
+ 2.274 -> 0.360 over 20 epochs (min 0.199 at epoch 16), in ~5 s.
1108
+ Generation is the honest weak point: greedy loops on spaces,
1109
+ temperature sampling gives varied gibberish — a 776-param model
1110
+ on one sentence is a training proof, not a language model.
1111
+ - `stdlib/inference.fg` — KV-cache inference step: step-by-step
1112
+ output matches a full-sequence forward exactly (diff 0);
1113
+ quantized step differs by at most 0.026 on the demo step
1114
+ - `tools/import_torch_weights.py` — imports weights from a text
1115
+ file or (with torch installed elsewhere) a .pt state dict into
1116
+ Qasida functions; text path verified end to end
1117
+ - CUDA: fused attention, LayerNorm, embedding and fp16 matmul
1118
+ kernels added to `examples/cuda/kernel.cu`, verified by
1119
+ `tools/simulate_cuda.py` (attention 1.0/0.0, 0.330/0.670, ...)
1120
+
1121
+ Not yet done, and not claimed:
1122
+ - The new CUDA kernels have NOT run on a real GPU yet (no nvcc
1123
+ here; a Kaggle T4 run is the remaining step, as before)
1124
+ - No torch in this VM, so the .pt branch of the importer is
1125
+ provided but not run here; the text branch is verified
1126
+ - No 1B model, no distributed training, no MLIR compiler — the
1127
+ beachhead is small models that train and run natively
1128
+
1129
+ ## 0.1.0 — 26 Oct 2026 — First Qasida market release
1130
+
1131
+ Formerly Forge v2. The language itself is unchanged in this
1132
+ release; this release is about making it installable and usable
1133
+ by a stranger.
1134
+
1135
+ Added:
1136
+ - `qasida` command (`bin/qasida`) — `qasida run`, `qasida --version`
1137
+ - `qasida --version` / `qasida version` — prints "Qasida 0.1.0"
1138
+ - `scripts/install.sh` — one-command user install, checks python3
1139
+ and cc, symlinks into `~/.local/bin`, verifies with the demo
1140
+ - This changelog
1141
+
1142
+ Included from Forge v2 (all verified by tests, see README.md):
1143
+ - Types int/float/bool/str/[T], structs, enums + match, generics,
1144
+ Option/Result, `?` operator, threads, C FFI, HTTP/HTTPS, file I/O
1145
+ - Safe mode (checked arithmetic, bounds-checked) and fast mode
1146
+ - ML: dot/matmul, linear regression training, MLP XOR training
1147
+ by backprop (loss 0.558973 -> 0.000267766)
1148
+ - Backends: native C, big32 RISC-V (simulation), WASM (int/float/bool),
1149
+ CUDA kernels (verified on Kaggle Tesla T4, dot 70, matmul 19 22 43 50)
1150
+ - Tooling: `qasida pkg`, `qasida fmt`, `qasida lsp`, `qasida repl`, `qasida doc`
1151
+ - Examples: hello, matrix, todo CLI, Teju special, dates/rand,
1152
+ SQL/table/KV demos, high-school guide, web playground, book starter
1153
+ - Dedicated to Tejaswini — Qasida (see DEDICATION.md)
1154
+
1155
+ Known limits in 0.1.0 (honest, not hidden):
1156
+ - No public package registry host yet (server + Dockerfile exist)
1157
+ - WASM: no strings/arrays yet; big32: no floats/structs yet
1158
+ - No debugger, no fuzzing, no self-hosting compiler yet
1159
+ - CI workflow is local only until uploaded via GitHub web UI
1160
+ (token lacks workflow scope)
1161
+ - Repo is still called RED-MOON- on GitHub; renaming it is a
1162
+ web-UI step, and the tool file is still `forge.py` for
1163
+ compatibility — `qasida` is the new market name for it.