runglet 0.3.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 (274) hide show
  1. runglet-0.3.0/CHANGELOG.md +82 -0
  2. runglet-0.3.0/CONTRIBUTING.md +27 -0
  3. runglet-0.3.0/LICENSE +14 -0
  4. runglet-0.3.0/MANIFEST.in +6 -0
  5. runglet-0.3.0/PKG-INFO +308 -0
  6. runglet-0.3.0/README.md +271 -0
  7. runglet-0.3.0/pyproject.toml +100 -0
  8. runglet-0.3.0/setup.cfg +4 -0
  9. runglet-0.3.0/src/runglet/__init__.py +3 -0
  10. runglet-0.3.0/src/runglet/__main__.py +5 -0
  11. runglet-0.3.0/src/runglet/analysis.py +134 -0
  12. runglet-0.3.0/src/runglet/authoring.py +783 -0
  13. runglet-0.3.0/src/runglet/backends/__init__.py +1 -0
  14. runglet-0.3.0/src/runglet/backends/fatek/__init__.py +329 -0
  15. runglet-0.3.0/src/runglet/backends/fatek/allocation.py +726 -0
  16. runglet-0.3.0/src/runglet/backends/fatek/atomic_lowering.py +387 -0
  17. runglet-0.3.0/src/runglet/backends/fatek/bindings.py +65 -0
  18. runglet-0.3.0/src/runglet/backends/fatek/capabilities.py +288 -0
  19. runglet-0.3.0/src/runglet/backends/fatek/control_lowering.py +478 -0
  20. runglet-0.3.0/src/runglet/backends/fatek/fun30.py +190 -0
  21. runglet-0.3.0/src/runglet/backends/fatek/fun30_differential.py +372 -0
  22. runglet-0.3.0/src/runglet/backends/fatek/fun30_evidence.py +234 -0
  23. runglet-0.3.0/src/runglet/backends/fatek/fun30_logic_evidence.py +1012 -0
  24. runglet-0.3.0/src/runglet/backends/fatek/fun30_lowering.py +1277 -0
  25. runglet-0.3.0/src/runglet/backends/fatek/fun30_relay_ir.py +526 -0
  26. runglet-0.3.0/src/runglet/backends/fatek/fun30_vendor_evidence.py +1031 -0
  27. runglet-0.3.0/src/runglet/backends/fatek/fun30_wrapper.py +186 -0
  28. runglet-0.3.0/src/runglet/backends/fatek/network_executor.py +147 -0
  29. runglet-0.3.0/src/runglet/backends/fatek/network_ir.py +424 -0
  30. runglet-0.3.0/src/runglet/backends/fatek/network_lowering.py +667 -0
  31. runglet-0.3.0/src/runglet/backends/fatek/runtime_protocol.py +724 -0
  32. runglet-0.3.0/src/runglet/backends/fatek/trace_map.py +266 -0
  33. runglet-0.3.0/src/runglet/backends/fatek/verification.py +205 -0
  34. runglet-0.3.0/src/runglet/build_manifest.py +240 -0
  35. runglet-0.3.0/src/runglet/cli.py +2636 -0
  36. runglet-0.3.0/src/runglet/command_analysis.py +93 -0
  37. runglet-0.3.0/src/runglet/compiler.py +103 -0
  38. runglet-0.3.0/src/runglet/context_pack.py +222 -0
  39. runglet-0.3.0/src/runglet/control/__init__.py +32 -0
  40. runglet-0.3.0/src/runglet/control/generated_pid.py +555 -0
  41. runglet-0.3.0/src/runglet/control/relay_ir.py +1203 -0
  42. runglet-0.3.0/src/runglet/diagnostics.py +124 -0
  43. runglet-0.3.0/src/runglet/float32.py +43 -0
  44. runglet-0.3.0/src/runglet/frontend/__init__.py +1 -0
  45. runglet-0.3.0/src/runglet/frontend/ast.py +530 -0
  46. runglet-0.3.0/src/runglet/frontend/ast_builder.py +865 -0
  47. runglet-0.3.0/src/runglet/frontend/cst.py +59 -0
  48. runglet-0.3.0/src/runglet/frontend/formatter.py +627 -0
  49. runglet-0.3.0/src/runglet/frontend/grammar_v0_2.py +491 -0
  50. runglet-0.3.0/src/runglet/frontend/grammar_v0_3.py +74 -0
  51. runglet-0.3.0/src/runglet/frontend/parser.py +25 -0
  52. runglet-0.3.0/src/runglet/frontend/resolver.py +502 -0
  53. runglet-0.3.0/src/runglet/frontend/source.py +237 -0
  54. runglet-0.3.0/src/runglet/hil/__init__.py +65 -0
  55. runglet-0.3.0/src/runglet/hil/bench.py +643 -0
  56. runglet-0.3.0/src/runglet/hil/checkout.py +575 -0
  57. runglet-0.3.0/src/runglet/hil/recorder.py +632 -0
  58. runglet-0.3.0/src/runglet/interpreter/__init__.py +12 -0
  59. runglet-0.3.0/src/runglet/interpreter/atomic.py +323 -0
  60. runglet-0.3.0/src/runglet/interpreter/sequential.py +183 -0
  61. runglet-0.3.0/src/runglet/lsp/__init__.py +5 -0
  62. runglet-0.3.0/src/runglet/lsp/__main__.py +6 -0
  63. runglet-0.3.0/src/runglet/lsp/server.py +1567 -0
  64. runglet-0.3.0/src/runglet/program_check.py +1241 -0
  65. runglet-0.3.0/src/runglet/py.typed +1 -0
  66. runglet-0.3.0/src/runglet/range_analysis.py +685 -0
  67. runglet-0.3.0/src/runglet/relay_ir/__init__.py +29 -0
  68. runglet-0.3.0/src/runglet/relay_ir/float32.py +78 -0
  69. runglet-0.3.0/src/runglet/relay_ir/inspection.py +214 -0
  70. runglet-0.3.0/src/runglet/relay_ir/lowering.py +1158 -0
  71. runglet-0.3.0/src/runglet/relay_ir/models.py +330 -0
  72. runglet-0.3.0/src/runglet/representability.py +86 -0
  73. runglet-0.3.0/src/runglet/resources/__init__.py +1 -0
  74. runglet-0.3.0/src/runglet/resources/docs/adr/0007-target-native-fun30-for-initial-pid-delivery.md +83 -0
  75. runglet-0.3.0/src/runglet/resources/docs/language/authoring-card.md +100 -0
  76. runglet-0.3.0/src/runglet/resources/docs/language/diagnostics.md +113 -0
  77. runglet-0.3.0/src/runglet/resources/examples/patterns/README.md +10 -0
  78. runglet-0.3.0/src/runglet/resources/examples/patterns/core/fault-interlock-arbitration.rung +94 -0
  79. runglet-0.3.0/src/runglet/resources/examples/patterns/core/signal-and-timer.rung +37 -0
  80. runglet-0.3.0/src/runglet/resources/examples/patterns/core/value-defaults-and-hold.rung +70 -0
  81. runglet-0.3.0/src/runglet/resources/examples/patterns/core/writable-memory.rung +61 -0
  82. runglet-0.3.0/src/runglet/resources/examples/patterns/native-fun30/README.md +9 -0
  83. runglet-0.3.0/src/runglet/resources/examples/starter/starter.rung +66 -0
  84. runglet-0.3.0/src/runglet/resources/fixtures/control/split-range-fun30-v0.2/controller.rung +216 -0
  85. runglet-0.3.0/src/runglet/resources/schemas/authoring-context-v0.1.schema.json +67 -0
  86. runglet-0.3.0/src/runglet/resources/schemas/authoring-context-v0.2.schema.json +67 -0
  87. runglet-0.3.0/src/runglet/resources/schemas/check-report-v0.1.schema.json +119 -0
  88. runglet-0.3.0/src/runglet/resources/schemas/check-report-v0.2.schema.json +44 -0
  89. runglet-0.3.0/src/runglet/resources/schemas/inspect-report-v0.1.schema.json +227 -0
  90. runglet-0.3.0/src/runglet/resources/schemas/inspect-report-v0.2.schema.json +97 -0
  91. runglet-0.3.0/src/runglet/resources/schemas/scaffold-v0.1.schema.json +64 -0
  92. runglet-0.3.0/src/runglet/resources/schemas/scaffold-v0.2.schema.json +61 -0
  93. runglet-0.3.0/src/runglet/resources/spec/grammar/runglet-v0.2.ebnf +249 -0
  94. runglet-0.3.0/src/runglet/resources/spec/grammar/runglet-v0.2.vocabulary.json +217 -0
  95. runglet-0.3.0/src/runglet/resources/spec/grammar/runglet-v0.3.ebnf +253 -0
  96. runglet-0.3.0/src/runglet/resources/spec/grammar/runglet-v0.3.vocabulary.json +217 -0
  97. runglet-0.3.0/src/runglet/scaffold.py +387 -0
  98. runglet-0.3.0/src/runglet/scenarios/__init__.py +101 -0
  99. runglet-0.3.0/src/runglet/scenarios/coverage.py +238 -0
  100. runglet-0.3.0/src/runglet/scenarios/differential.py +729 -0
  101. runglet-0.3.0/src/runglet/scenarios/fatek_reset.py +289 -0
  102. runglet-0.3.0/src/runglet/scenarios/mutation.py +120 -0
  103. runglet-0.3.0/src/runglet/scenarios/runner.py +280 -0
  104. runglet-0.3.0/src/runglet/scenarios/trace.py +352 -0
  105. runglet-0.3.0/src/runglet/type_checker.py +387 -0
  106. runglet-0.3.0/src/runglet/types.py +218 -0
  107. runglet-0.3.0/src/runglet/winpro/__init__.py +111 -0
  108. runglet-0.3.0/src/runglet/winpro/canvas.py +1092 -0
  109. runglet-0.3.0/src/runglet/winpro/canvas_controller.py +5452 -0
  110. runglet-0.3.0/src/runglet/winpro/canvas_mcp.py +1918 -0
  111. runglet-0.3.0/src/runglet/winpro/flaui_client.py +186 -0
  112. runglet-0.3.0/src/runglet/winpro/fun30_acceptance.py +208 -0
  113. runglet-0.3.0/src/runglet/winpro/fun30_automation.py +929 -0
  114. runglet-0.3.0/src/runglet/winpro/fun30_coverage.py +180 -0
  115. runglet-0.3.0/src/runglet/winpro/fun30_export_verification.py +506 -0
  116. runglet-0.3.0/src/runglet/winpro/fun30_gap_evidence.py +368 -0
  117. runglet-0.3.0/src/runglet/winpro/fun30_logic_campaign.py +486 -0
  118. runglet-0.3.0/src/runglet/winpro/handoff.py +299 -0
  119. runglet-0.3.0/src/runglet/winpro/ldr.py +2234 -0
  120. runglet-0.3.0/src/runglet/winpro/ldr_coverage.py +103 -0
  121. runglet-0.3.0/src/runglet/winpro/manual_artifact.py +138 -0
  122. runglet-0.3.0/src/runglet/winpro/pdw.py +146 -0
  123. runglet-0.3.0/src/runglet.egg-info/PKG-INFO +308 -0
  124. runglet-0.3.0/src/runglet.egg-info/SOURCES.txt +272 -0
  125. runglet-0.3.0/src/runglet.egg-info/dependency_links.txt +1 -0
  126. runglet-0.3.0/src/runglet.egg-info/entry_points.txt +5 -0
  127. runglet-0.3.0/src/runglet.egg-info/requires.txt +12 -0
  128. runglet-0.3.0/src/runglet.egg-info/top_level.txt +1 -0
  129. runglet-0.3.0/tests/test_analysis.py +159 -0
  130. runglet-0.3.0/tests/test_ast_builder.py +161 -0
  131. runglet-0.3.0/tests/test_atomic_interpreter.py +175 -0
  132. runglet-0.3.0/tests/test_authoring.py +690 -0
  133. runglet-0.3.0/tests/test_authoring_schemas_v02.py +151 -0
  134. runglet-0.3.0/tests/test_build_manifest.py +194 -0
  135. runglet-0.3.0/tests/test_cli.py +1928 -0
  136. runglet-0.3.0/tests/test_command_analysis.py +135 -0
  137. runglet-0.3.0/tests/test_compound_high_address.py +144 -0
  138. runglet-0.3.0/tests/test_conditional_numeric_move.py +176 -0
  139. runglet-0.3.0/tests/test_conditional_numeric_output.py +138 -0
  140. runglet-0.3.0/tests/test_control_gain_types.py +118 -0
  141. runglet-0.3.0/tests/test_control_loop_frontend.py +278 -0
  142. runglet-0.3.0/tests/test_demo_chamber.py +404 -0
  143. runglet-0.3.0/tests/test_demo_requirements.py +110 -0
  144. runglet-0.3.0/tests/test_diagnostics.py +87 -0
  145. runglet-0.3.0/tests/test_differential_runner.py +336 -0
  146. runglet-0.3.0/tests/test_distribution_metadata.py +46 -0
  147. runglet-0.3.0/tests/test_eight_branch_singletons_high_address.py +133 -0
  148. runglet-0.3.0/tests/test_eight_branch_widths_1_1_1_1_1_1_1_3_high_address.py +142 -0
  149. runglet-0.3.0/tests/test_execution_profile_boundaries_spec.py +53 -0
  150. runglet-0.3.0/tests/test_fatek_address_allocator.py +351 -0
  151. runglet-0.3.0/tests/test_fatek_allocation_schema.py +143 -0
  152. runglet-0.3.0/tests/test_fatek_atomic_lowering.py +389 -0
  153. runglet-0.3.0/tests/test_fatek_bindings.py +96 -0
  154. runglet-0.3.0/tests/test_fatek_capability_schema.py +95 -0
  155. runglet-0.3.0/tests/test_fatek_condition_simplifier.py +123 -0
  156. runglet-0.3.0/tests/test_fatek_control_lowering.py +573 -0
  157. runglet-0.3.0/tests/test_fatek_differential_suite.py +93 -0
  158. runglet-0.3.0/tests/test_fatek_fun30.py +119 -0
  159. runglet-0.3.0/tests/test_fatek_fun30_allocation.py +154 -0
  160. runglet-0.3.0/tests/test_fatek_fun30_differential.py +77 -0
  161. runglet-0.3.0/tests/test_fatek_fun30_evidence.py +152 -0
  162. runglet-0.3.0/tests/test_fatek_fun30_fixture_bundle.py +70 -0
  163. runglet-0.3.0/tests/test_fatek_fun30_logic_evidence.py +399 -0
  164. runglet-0.3.0/tests/test_fatek_fun30_lowering.py +548 -0
  165. runglet-0.3.0/tests/test_fatek_fun30_mutations.py +329 -0
  166. runglet-0.3.0/tests/test_fatek_fun30_relay_ir.py +184 -0
  167. runglet-0.3.0/tests/test_fatek_fun30_vendor_evidence.py +411 -0
  168. runglet-0.3.0/tests/test_fatek_fun30_wrapper.py +249 -0
  169. runglet-0.3.0/tests/test_fatek_network_executor.py +180 -0
  170. runglet-0.3.0/tests/test_fatek_network_ir.py +405 -0
  171. runglet-0.3.0/tests/test_fatek_network_ir_schema.py +82 -0
  172. runglet-0.3.0/tests/test_fatek_network_lowering.py +506 -0
  173. runglet-0.3.0/tests/test_fatek_reset.py +132 -0
  174. runglet-0.3.0/tests/test_fatek_runtime_protocol.py +402 -0
  175. runglet-0.3.0/tests/test_fatek_target_profile.py +54 -0
  176. runglet-0.3.0/tests/test_fatek_trace_map.py +164 -0
  177. runglet-0.3.0/tests/test_fatek_verification.py +126 -0
  178. runglet-0.3.0/tests/test_fault_lowering.py +120 -0
  179. runglet-0.3.0/tests/test_five_branch_singletons_high_address.py +130 -0
  180. runglet-0.3.0/tests/test_five_branch_widths_1_1_2_2_3_high_address.py +137 -0
  181. runglet-0.3.0/tests/test_float32_relay_ir.py +142 -0
  182. runglet-0.3.0/tests/test_formatter.py +246 -0
  183. runglet-0.3.0/tests/test_four_branch_singletons_high_address.py +135 -0
  184. runglet-0.3.0/tests/test_four_branch_widths_1_2_3_3_high_address.py +142 -0
  185. runglet-0.3.0/tests/test_frontend_parser.py +247 -0
  186. runglet-0.3.0/tests/test_generated_pid.py +430 -0
  187. runglet-0.3.0/tests/test_generated_pid_relay_ir.py +262 -0
  188. runglet-0.3.0/tests/test_hil_bench.py +157 -0
  189. runglet-0.3.0/tests/test_hil_checkout.py +208 -0
  190. runglet-0.3.0/tests/test_hil_recorder.py +428 -0
  191. runglet-0.3.0/tests/test_inspection.py +79 -0
  192. runglet-0.3.0/tests/test_int32_register_move.py +387 -0
  193. runglet-0.3.0/tests/test_interlock_lowering.py +111 -0
  194. runglet-0.3.0/tests/test_language_examples_docs.py +508 -0
  195. runglet-0.3.0/tests/test_language_spec.py +88 -0
  196. runglet-0.3.0/tests/test_lsp_server.py +1085 -0
  197. runglet-0.3.0/tests/test_memory_update_frontend.py +262 -0
  198. runglet-0.3.0/tests/test_memory_update_integration.py +594 -0
  199. runglet-0.3.0/tests/test_memory_update_semantics.py +623 -0
  200. runglet-0.3.0/tests/test_memory_update_tooling.py +174 -0
  201. runglet-0.3.0/tests/test_mixed_high_address.py +139 -0
  202. runglet-0.3.0/tests/test_mutation.py +66 -0
  203. runglet-0.3.0/tests/test_nested_high_address.py +137 -0
  204. runglet-0.3.0/tests/test_nested_unequal_high_address.py +132 -0
  205. runglet-0.3.0/tests/test_nested_width3_high_address.py +140 -0
  206. runglet-0.3.0/tests/test_nine_branch_widths_1_1_1_1_1_1_1_1_3_high_address.py +143 -0
  207. runglet-0.3.0/tests/test_parser_spike.py +48 -0
  208. runglet-0.3.0/tests/test_property_based_toolchain.py +140 -0
  209. runglet-0.3.0/tests/test_relay_ir_lowering.py +176 -0
  210. runglet-0.3.0/tests/test_relay_ir_schema.py +105 -0
  211. runglet-0.3.0/tests/test_relay_ir_v02_schema.py +87 -0
  212. runglet-0.3.0/tests/test_release_workflows.py +79 -0
  213. runglet-0.3.0/tests/test_representability.py +88 -0
  214. runglet-0.3.0/tests/test_resolver.py +377 -0
  215. runglet-0.3.0/tests/test_rising_numeric_hold.py +179 -0
  216. runglet-0.3.0/tests/test_scaffold.py +291 -0
  217. runglet-0.3.0/tests/test_scenario_lowering.py +119 -0
  218. runglet-0.3.0/tests/test_scenario_runner.py +169 -0
  219. runglet-0.3.0/tests/test_semantic_coverage.py +129 -0
  220. runglet-0.3.0/tests/test_semantic_ids_spec.py +53 -0
  221. runglet-0.3.0/tests/test_sequential_executor.py +162 -0
  222. runglet-0.3.0/tests/test_sequential_scan_spec.py +52 -0
  223. runglet-0.3.0/tests/test_seven_branch_singletons_high_address.py +132 -0
  224. runglet-0.3.0/tests/test_seven_branch_widths_1_1_1_1_1_1_3_high_address.py +141 -0
  225. runglet-0.3.0/tests/test_signal_semantics.py +309 -0
  226. runglet-0.3.0/tests/test_six_branch_singletons_high_address.py +131 -0
  227. runglet-0.3.0/tests/test_six_branch_widths_1_1_1_1_2_3_high_address.py +138 -0
  228. runglet-0.3.0/tests/test_snapshot_atomic_spec.py +49 -0
  229. runglet-0.3.0/tests/test_source_reader.py +67 -0
  230. runglet-0.3.0/tests/test_temporal_lowering.py +111 -0
  231. runglet-0.3.0/tests/test_three_branch_dual_width3_high_address.py +141 -0
  232. runglet-0.3.0/tests/test_three_branch_equal_high_address.py +144 -0
  233. runglet-0.3.0/tests/test_three_branch_high_address.py +139 -0
  234. runglet-0.3.0/tests/test_three_branch_series_width3_high_address.py +145 -0
  235. runglet-0.3.0/tests/test_three_branch_singletons_high_address.py +134 -0
  236. runglet-0.3.0/tests/test_three_branch_singletons_width3_high_address.py +135 -0
  237. runglet-0.3.0/tests/test_three_branch_width3_high_address.py +140 -0
  238. runglet-0.3.0/tests/test_three_branch_widths_2_3_3_high_address.py +146 -0
  239. runglet-0.3.0/tests/test_three_branch_widths_3_3_3_high_address.py +147 -0
  240. runglet-0.3.0/tests/test_timer_lowering.py +110 -0
  241. runglet-0.3.0/tests/test_trace.py +148 -0
  242. runglet-0.3.0/tests/test_type_checker.py +121 -0
  243. runglet-0.3.0/tests/test_type_system_spec.py +49 -0
  244. runglet-0.3.0/tests/test_types.py +86 -0
  245. runglet-0.3.0/tests/test_vscode_language_assets.py +167 -0
  246. runglet-0.3.0/tests/test_vscode_snippets.py +57 -0
  247. runglet-0.3.0/tests/test_windows_authoring_packaging.py +63 -0
  248. runglet-0.3.0/tests/test_windows_canvas_acceptance.py +68 -0
  249. runglet-0.3.0/tests/test_windows_canvas_bootstrap.py +60 -0
  250. runglet-0.3.0/tests/test_windows_existing_project_export.py +33 -0
  251. runglet-0.3.0/tests/test_windows_flaui_probe.py +79 -0
  252. runglet-0.3.0/tests/test_windows_fun30_acceptance.py +640 -0
  253. runglet-0.3.0/tests/test_windows_ldr_experiment.py +90 -0
  254. runglet-0.3.0/tests/test_windows_ldr_mcp_acceptance.py +149 -0
  255. runglet-0.3.0/tests/test_winpro_canvas.py +1056 -0
  256. runglet-0.3.0/tests/test_winpro_canvas_controller.py +3907 -0
  257. runglet-0.3.0/tests/test_winpro_canvas_mcp.py +1281 -0
  258. runglet-0.3.0/tests/test_winpro_flaui_client.py +152 -0
  259. runglet-0.3.0/tests/test_winpro_fun30_acceptance.py +114 -0
  260. runglet-0.3.0/tests/test_winpro_fun30_automation.py +380 -0
  261. runglet-0.3.0/tests/test_winpro_fun30_coverage.py +104 -0
  262. runglet-0.3.0/tests/test_winpro_fun30_evidence.py +125 -0
  263. runglet-0.3.0/tests/test_winpro_fun30_export_verification.py +132 -0
  264. runglet-0.3.0/tests/test_winpro_fun30_gap_evidence.py +292 -0
  265. runglet-0.3.0/tests/test_winpro_fun30_logic_campaign.py +193 -0
  266. runglet-0.3.0/tests/test_winpro_golden_project.py +31 -0
  267. runglet-0.3.0/tests/test_winpro_handoff.py +199 -0
  268. runglet-0.3.0/tests/test_winpro_int32_comparison_scenarios.py +62 -0
  269. runglet-0.3.0/tests/test_winpro_ldr.py +3248 -0
  270. runglet-0.3.0/tests/test_winpro_ldr_coverage.py +108 -0
  271. runglet-0.3.0/tests/test_winpro_manual_artifact.py +183 -0
  272. runglet-0.3.0/tests/test_winpro_mixed_parallel_scenarios.py +56 -0
  273. runglet-0.3.0/tests/test_winpro_pdw.py +84 -0
  274. runglet-0.3.0/tests/test_winpro_wrapper_function_evidence.py +89 -0
@@ -0,0 +1,82 @@
1
+ # Changelog
2
+
3
+ All notable user-facing changes to Runglet are documented here.
4
+
5
+ Runglet follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Release
6
+ artifacts use the version exposed by `runglet --version`.
7
+
8
+ ## [0.3.0] - 2026-07-27
9
+
10
+ ### Added
11
+
12
+ - Declarative snapshot-atomic writable memory with mandatory HOLD/value defaults,
13
+ ordered `VALUE ... WHEN` cases, one-scan commit visibility, and shared diagnostics.
14
+ - Guard-refined integer and fixed-point representability proof for memory update
15
+ expressions.
16
+ - Offline reference-interpreter and FATEK current/shadow Network-IR equivalence for
17
+ volatile writable state.
18
+
19
+ ### Changed
20
+
21
+ - Published language specification 0.3 and v0.2 machine-output successors for check,
22
+ inspect, authoring-context, and scaffold reports while retaining historical
23
+ contracts.
24
+ - Added writable-memory authoring guidance, checked examples, stable-ID/source-map
25
+ rules, and VS Code assets.
26
+
27
+ ### Safety
28
+
29
+ - FATEK snapshot-atomic deployment remains unsupported. This release adds no new LDR
30
+ encoding claim, external HMI/network write, WinPro contact, or PLC authorization.
31
+
32
+ ## [0.2.0] - 2026-07-27
33
+
34
+ First packaged Runglet 0.2 authoring release.
35
+
36
+ ### Added
37
+
38
+ - Contributor-focused language server and VS Code authoring experience with shared
39
+ compiler diagnostics, formatting, contextual completion, navigation, snippets,
40
+ matching-block support, and offline compiler commands.
41
+ - Checked LLM authoring context, examples, project initialization, inspection, and
42
+ deterministic scenario workflows.
43
+ - Standalone Windows `runglet.exe` and `runglet-lsp.exe` bundle with the matching
44
+ versioned VSIX and no system Python or PowerShell dependency.
45
+ - Tag-driven GitHub Releases containing the wheel, source archive, Windows bundle,
46
+ VSIX, and SHA-256 checksums.
47
+
48
+ ### Changed
49
+
50
+ - The Python package and CLI release version now align with language specification
51
+ `0.2.0`; the VS Code extension retains its independent version.
52
+
53
+ ### Safety
54
+
55
+ - Offline authoring and release packaging do not contact WinProLadder, a PLC, HIL, or
56
+ production equipment.
57
+
58
+ ## [0.0.1] - 2026-07-26
59
+
60
+ Initial alpha release.
61
+
62
+ ### Added
63
+
64
+ - The Runglet 0.2 language frontend, canonical formatter, diagnostics, inspection,
65
+ Relay IR lowering, deterministic scenario runner, and language server.
66
+ - Package-backed `runglet init` scaffolding with generated `AGENTS.md`, a checked
67
+ starter program, and a hash-bound manifest.
68
+ - Offline authoring context and versioned machine-readable schemas.
69
+ - Progressive CLI help with `new`, `fmt`, `ctx`, and `test` aliases.
70
+ - One-level `hil`, `winpro`, and `fatek` specialist namespaces with hidden legacy
71
+ command compatibility.
72
+ - FATEK target planning, WinPro evidence tooling, and explicitly authorized isolated
73
+ bench workflows.
74
+
75
+ ### Safety
76
+
77
+ - Authoring, checking, formatting, inspection, LSP, and scenario execution remain
78
+ offline and do not authorize access to WinProLadder, a PLC, or production equipment.
79
+
80
+ [0.3.0]: https://github.com/vedit/Runglet/releases/tag/v0.3.0
81
+ [0.2.0]: https://github.com/vedit/Runglet/releases/tag/v0.2.0
82
+ [0.0.1]: https://github.com/vedit/Runglet/releases/tag/v0.0.1
@@ -0,0 +1,27 @@
1
+ # Contributing
2
+
3
+ ## Required checks
4
+
5
+ Before submitting a change, run:
6
+
7
+ ```shell
8
+ uv run ruff format --check .
9
+ uv run ruff check .
10
+ uv run mypy
11
+ uv run pytest --cov
12
+ ```
13
+
14
+ ## Compiler rules
15
+
16
+ - Keep the AST and Relay IR fully typed. Do not use untyped dictionaries as semantic nodes.
17
+ - Prefer frozen data models and pure transformation passes.
18
+ - Preserve deterministic ordering, serialization, diagnostics, and generated IDs.
19
+ - Add positive and negative tests for language behavior.
20
+ - Treat observable semantic changes as specification changes and record them in an ADR.
21
+ - Never add a direct path that downloads to or starts a physical PLC without an explicit human gate.
22
+
23
+ ## LLM-generated contributions
24
+
25
+ LLM-generated code is reviewed as untrusted external code. The task owner must understand and be able to explain it. Safety-significant compiler, backend, and deployment changes require an independent human reviewer. Tests must establish behavior; generated prose or apparent plausibility is not evidence of correctness.
26
+
27
+ The ADR workflow and template are documented in `docs/adr/README.md`.
runglet-0.3.0/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+ Runglet Proprietary License
2
+
3
+ Copyright (c) 2026 Runglet contributors. All rights reserved.
4
+
5
+ This software and its accompanying documentation are proprietary. No permission is
6
+ granted to use, copy, modify, distribute, sublicense, sell, or create derivative works
7
+ from this software except under a separate written agreement with the copyright
8
+ holder.
9
+
10
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
11
+ INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
12
+ PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE
13
+ LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY ARISING FROM, OUT OF, OR IN
14
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,6 @@
1
+ include CHANGELOG.md
2
+ include CONTRIBUTING.md
3
+ include LICENSE
4
+ include README.md
5
+ recursive-include src/runglet/resources *.ebnf *.json *.md *.rung
6
+ include src/runglet/py.typed
runglet-0.3.0/PKG-INFO ADDED
@@ -0,0 +1,308 @@
1
+ Metadata-Version: 2.4
2
+ Name: runglet
3
+ Version: 0.3.0
4
+ Summary: Intent-oriented industrial control language and Relay IR toolchain
5
+ Author: Runglet contributors
6
+ License-Expression: LicenseRef-Proprietary
7
+ Project-URL: Homepage, https://github.com/vedit/Runglet
8
+ Project-URL: Repository, https://github.com/vedit/Runglet
9
+ Project-URL: Documentation, https://github.com/vedit/Runglet/tree/master/docs
10
+ Project-URL: Issues, https://github.com/vedit/Runglet/issues
11
+ Project-URL: Changelog, https://github.com/vedit/Runglet/blob/master/CHANGELOG.md
12
+ Keywords: compiler,industrial-control,language-server,ladder-logic,plc
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: Manufacturing
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Software Development :: Compilers
21
+ Classifier: Typing :: Typed
22
+ Requires-Python: >=3.12
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Requires-Dist: lark==1.3.1
26
+ Requires-Dist: lsprotocol==2025.0.0
27
+ Requires-Dist: pygls==2.1.1
28
+ Provides-Extra: dev
29
+ Requires-Dist: coverage==7.10.1; extra == "dev"
30
+ Requires-Dist: hypothesis==6.136.7; extra == "dev"
31
+ Requires-Dist: mypy==1.17.0; extra == "dev"
32
+ Requires-Dist: pyinstaller==6.21.0; extra == "dev"
33
+ Requires-Dist: pytest==8.4.1; extra == "dev"
34
+ Requires-Dist: pytest-cov==6.2.1; extra == "dev"
35
+ Requires-Dist: ruff==0.12.3; extra == "dev"
36
+ Dynamic: license-file
37
+
38
+ # Runglet
39
+
40
+ Runglet is a block-based, intent-oriented language for industrial control. It lowers into a typed, canonical Relay IR that can be interpreted, tested, and compiled for PLC targets.
41
+
42
+ The initial backend targets FATEK FBs controllers through WinProLadder 3.32. The initial physical verification target is an isolated FBs-20MCR2-AC test panel; no pressure vessel, oxygen-enriched environment, final chamber actuators, or human occupancy is in scope.
43
+
44
+ Runglet is alpha software. Its offline compiler and authoring workflow are usable, but
45
+ target-specific delivery remains evidence-gated and is not production-ready.
46
+
47
+ Language 0.3 adds declarative writable `MEMORY`: an optional snapshot-atomic `UPDATE`
48
+ block calculates one typed next value from the current scan snapshot and commits it at
49
+ the scan boundary. Guarded integer and fixed-point updates fail closed when range or
50
+ resolution safety cannot be proven.
51
+
52
+ ## Install
53
+
54
+ Runglet requires Python 3.12 or later. For the isolated command-line application:
55
+
56
+ ```shell
57
+ pipx install runglet
58
+ ```
59
+
60
+ To install it into an existing Python environment:
61
+
62
+ ```shell
63
+ python -m pip install runglet
64
+ ```
65
+
66
+ The distribution is currently proprietary; see
67
+ [LICENSE](https://github.com/vedit/Runglet/blob/master/LICENSE) before use.
68
+
69
+ For Windows authoring without a Python installation, CI also produces a portable
70
+ `runglet-authoring-*-windows-*.zip`. It contains native launchers for both
71
+ `runglet.exe` and `runglet-lsp.exe`, their shared private runtime, and the matching
72
+ VS Code extension. Extract the complete archive, add its `bin` directory to the user
73
+ `PATH`, and install `vscode\runglet-vscode.vsix`. The executables launch directly and
74
+ do not use PowerShell. See
75
+ [`packaging/windows/README.md`](https://github.com/vedit/Runglet/blob/master/packaging/windows/README.md).
76
+
77
+ Tagged builds are available from
78
+ [GitHub Releases](https://github.com/vedit/Runglet/releases). Each `vVERSION` release
79
+ provides the Python wheel and source archive, the standalone Windows authoring ZIP, the
80
+ matching versioned VSIX, and `SHA256SUMS`.
81
+
82
+ ## Installed package quick start
83
+
84
+ Create a checked, offline, single-file authoring workspace without a repository
85
+ checkout:
86
+
87
+ ```shell
88
+ runglet init my-controller --name my_controller
89
+ cd my-controller
90
+ runglet authoring-context --profile core --format markdown
91
+ runglet format src/main.rung --check
92
+ runglet check src/main.rung
93
+ runglet suite src/main.rung --scan-period-ms 10
94
+ ```
95
+
96
+ Common interactive aliases are `new` for `init`, `fmt` for `format`, `ctx` for
97
+ `authoring-context`, and `test` for `suite`. Run `runglet help --all` for the complete
98
+ tool catalog or `runglet help COMMAND` for focused usage.
99
+
100
+ Specialist tools use one namespace level: `runglet hil COMMAND`,
101
+ `runglet winpro COMMAND`, and `runglet fatek COMMAND`. Run each namespace with
102
+ `--help` to list its actions. The earlier flat `hil-*`, `winpro-*`, and `fatek-*`
103
+ spellings remain accepted as compatibility aliases but are omitted from help.
104
+
105
+ The scaffold includes `AGENTS.md` and `CLAUDE.md` entrypoints, portable Codex and Claude
106
+ skills, a machine-readable installed-version capability declaration, a canonical starter
107
+ with passing scenarios, and a hash-bound scaffold manifest. Initialization refuses to
108
+ merge or overwrite existing files. It never contacts WinProLadder, a PLC, or the network.
109
+
110
+ ## Development
111
+
112
+ Prerequisites:
113
+
114
+ - Python 3.12
115
+ - `uv`
116
+
117
+ Install the locked development environment:
118
+
119
+ ```shell
120
+ uv sync --extra dev --locked
121
+ ```
122
+
123
+ Run all local checks:
124
+
125
+ ```shell
126
+ uv run ruff format --check .
127
+ uv run ruff check .
128
+ uv run mypy
129
+ uv run pytest --cov
130
+ ```
131
+
132
+ Run the CLI:
133
+
134
+ ```shell
135
+ uv run runglet --version
136
+ ```
137
+
138
+ Start a productive offline authoring loop with the minimal example:
139
+
140
+ ```shell
141
+ uv run runglet check examples/starter/starter.rung
142
+ uv run runglet format examples/starter/starter.rung --check
143
+ uv run runglet build examples/starter/starter.rung --output build/starter
144
+ uv run runglet suite examples/starter/starter.rung --scan-period-ms 10
145
+ ```
146
+
147
+ `check` runs the same syntax, resolution, type, ownership, and command validation as
148
+ the language server without invoking a backend. `format --write` applies canonical
149
+ source layout. `build` adds Relay IR lowering and creates canonical source, Relay IR,
150
+ and a deterministic hash-bound manifest in a new directory. See the
151
+ [diagnostics guide](https://github.com/vedit/Runglet/blob/master/docs/language/diagnostics.md)
152
+ for codes and exit behavior. The compact
153
+ [authoring card](https://github.com/vedit/Runglet/blob/master/docs/language/authoring-card.md)
154
+ and checked
155
+ [`examples/patterns`](https://github.com/vedit/Runglet/tree/master/examples/patterns)
156
+ are the preferred starting context for both
157
+ human and LLM-authored Runglet.
158
+
159
+ The checked writable-state pattern is
160
+ [`examples/patterns/core/writable-memory.rung`](https://github.com/vedit/Runglet/blob/master/examples/patterns/core/writable-memory.rung).
161
+ Bare `MEMORY` remains a self-holding declaration for v0.2 compatibility; add an
162
+ `UPDATE` block only under `SNAPSHOT_ATOMIC`.
163
+
164
+ Machine-facing authoring interfaces are deterministic and offline:
165
+
166
+ ```shell
167
+ uv run runglet inspect examples/starter/starter.rung --json
168
+ uv run runglet authoring-context --profile core --format markdown
169
+ ```
170
+
171
+ The Python environment also installs `runglet-lsp`. The internal contributor VSIX under
172
+ [`editors/vscode`](https://github.com/vedit/Runglet/tree/master/editors/vscode)
173
+ prefers that workspace `.venv`, but also carries a
174
+ version-locked Python runtime for ordinary non-repository folders. It never uses
175
+ PowerShell or installs global packages. The server supplies diagnostics, safe fixes,
176
+ formatting, symbols, hover, completion, and same-file navigation. Its bounded command
177
+ palette directly exposes saved-source `check`, backend-neutral `build`, embedded
178
+ scenario `suite`, and one-scenario `trace` tasks. Checked declaration snippets, server
179
+ status, semantic occurrence highlights, and matching-block navigation complete the
180
+ small single-file authoring loop. The extension does not expose target, WinPro, FATEK
181
+ runtime, or PLC commands.
182
+
183
+ The repository workspace explicitly associates `*.rung` with the `runglet` language.
184
+ After installing the VSIX, reload VS Code once. To verify the entire editor surface,
185
+ run **Tasks: Run Test Task** → **Runglet: Verify Editor Integration**, or use:
186
+
187
+ ```shell
188
+ cd editors/vscode
189
+ npm ci
190
+ npm run verify
191
+ ```
192
+
193
+ Build and smoke the same standalone Windows preview locally with:
194
+
195
+ ```powershell
196
+ uv sync --extra dev --locked
197
+ cd editors/vscode
198
+ npm ci
199
+ cd ../..
200
+ uv run python scripts/windows/build-authoring-preview.py
201
+ ```
202
+
203
+ The result is written below `dist/windows/`. The smoke test invokes the frozen CLI and
204
+ stdio language server themselves, including project initialization, checking,
205
+ inspection, scenarios, build output, UTF-16 LSP initialization, and clean shutdown.
206
+
207
+ That check covers the language association and assets, direct server/compiler
208
+ discovery, the offline compiler task, diagnostics, formatting, completion, hover,
209
+ definition, references and highlights, matching-block navigation, status reporting,
210
+ missing-server recovery, and post-start server crash recovery without contacting
211
+ WinPro or a PLC.
212
+
213
+ Generate the reviewable paired-FUN30 initial-delivery plan (no PLC download or run).
214
+ ADR-0007 selects this explicit native integer contract first; the generated binary32
215
+ implementation remains a portable follow-on and comparison oracle:
216
+
217
+ ```shell
218
+ uv run runglet check fixtures/control/split-range-fun30-v0.2/controller.rung
219
+ uv run runglet format fixtures/control/split-range-fun30-v0.2/controller.rung --check
220
+ uv run runglet winpro fun30-plan \
221
+ fixtures/control/split-range-fun30-v0.2/controller.rung \
222
+ --profile profiles/fatek/fbs-20mcr2-ac.json \
223
+ --allocation-policy profiles/fatek/fbs-20mcr2-ac-allocation.json \
224
+ --config fixtures/control/split-range-fun30-v0.2/fun30-plan.json \
225
+ --output build/fun30-plan
226
+ ```
227
+
228
+ After filling a copy of `vendor-trace-template.json` from a WinPro simulator capture,
229
+ verify its plan identity, field contract, scan ordering, and first arithmetic divergence:
230
+
231
+ ```shell
232
+ uv run runglet winpro fun30-verify-trace \
233
+ fixtures/control/split-range-fun30-v0.2/controller.rung \
234
+ build/fun30-vendor-capture.json \
235
+ --profile profiles/fatek/fbs-20mcr2-ac.json \
236
+ --allocation-policy profiles/fatek/fbs-20mcr2-ac-allocation.json \
237
+ --config fixtures/control/split-range-fun30-v0.2/fun30-plan.json
238
+ ```
239
+
240
+ The native fixture is a complete, canonical single-file program. `check` applies
241
+ resolution, integer type, ownership, and command-completeness validation; the plan
242
+ command repeats those checks before invoking the explicit target-native lowering path.
243
+ Generic `build` remains the backend-neutral Relay IR path and does not lower native
244
+ FUN30 declarations.
245
+
246
+ The emitted `parameters.json` records the mandatory native language contract, requested
247
+ and realized tuning for both directions, exact quantization errors, documented native
248
+ parameter ranges, and the ordered FUN30 PR table layout. `wrapper-relay-ir.json` is the
249
+ integer-only, executable Relay IR for compiler-owned direction, dwell, override, and
250
+ routing behavior; the vendor FUN30 outputs and error flags remain explicit boundaries.
251
+ `wrapper-differential.json` records stable-ID alignment across the independent oracle,
252
+ source Relay IR, and FATEK Network IR without claiming vendor timer execution.
253
+ `direction-project.ldr` is the evidence-bounded 64-record PID direction, parameter-table,
254
+ and paired-core artifact; its provenance explicitly excludes the remaining control and
255
+ routing wrapper. `vendor-trace-template.json` binds both native cores and their parameter
256
+ tables to ten required simulator cases per direction, with raw observations for all seven
257
+ private working registers; it remains `not_captured` until checked WinPro evidence is
258
+ supplied. `wrapper-emission-coverage.json` accounts for all 32 planned ladder network
259
+ IDs: the accepted artifact covers 17 of 29 source networks plus signed-error
260
+ materialization, while 12 source networks and two derived core-enable snapshots remain
261
+ as 26 staged control/routing steps. `evidence-manifest.json` binds all four source inputs
262
+ and twelve generated
263
+ artifacts by SHA-256. It records the four completed offline gates and leaves WinPro
264
+ lifecycle, vendor arithmetic/timer, simulator, review, and bench gates explicitly `not_verified`;
265
+ therefore the emitted candidate is not promotion-ready.
266
+ Exact native tuning and target configuration are currently supplied by the checked
267
+ `fun30-plan.json` contract, with tuning realization recorded in `parameters.json`;
268
+ unifying those values with general source parameter sets remains later language work.
269
+
270
+ Run the complete bench-only demonstration suite with human-readable semantic coverage:
271
+
272
+ ```shell
273
+ uv run runglet suite fixtures/demo-chamber-v0.1/demo.rung --scan-period-ms 10
274
+ ```
275
+
276
+ Use `--json` for a canonical machine-readable scenario and coverage report. Run the
277
+ checked mutation campaign with:
278
+
279
+ ```shell
280
+ uv run runglet mutate fixtures/demo-chamber-v0.1/demo.rung \
281
+ --manifest fixtures/demo-chamber-v0.1/mutations.json \
282
+ --scan-period-ms 10
283
+ ```
284
+
285
+ The demonstration is an exact-scan reference-runtime proof over normalized Boolean
286
+ test points and dummy commands. It is not a production chamber program, safety
287
+ function, physical deployment authorization, or compliance argument.
288
+
289
+ For the isolated-bench workflow, validate the design and generate the unexecuted manual
290
+ checkout first:
291
+
292
+ ```shell
293
+ uv run runglet hil bench-check hil/bench-panel-v0.1.json
294
+ uv run runglet hil checkout-plan hil/bench-panel-v0.1.json \
295
+ --output build/hil/manual-io-checkout.json
296
+ ```
297
+
298
+ After qualified assembly/review and local authorization, `runglet hil observe` can append
299
+ read-only status and X0-X6/Y0-Y3 samples under manual stimulus control. It exposes no
300
+ physical write option and does not authorize energization. See
301
+ [`docs/hil/read-only-recorder-v0.1.md`](https://github.com/vedit/Runglet/blob/master/docs/hil/read-only-recorder-v0.1.md).
302
+
303
+ Project architecture and milestones are documented in `IMPLEMENTATION_PLAN.md`,
304
+ `DESIGN_DECISIONS.md`, and `TASK_BREAKDOWN.md`. The current usable workflow and
305
+ ordered delivery gaps are summarized in
306
+ [`docs/language/readiness.md`](https://github.com/vedit/Runglet/blob/master/docs/language/readiness.md).
307
+ For a clean Codex and WinProLadder move to another Windows machine, follow the
308
+ [`bare-metal Windows handoff`](https://github.com/vedit/Runglet/blob/master/docs/bare-metal-windows-handoff.md).