ibex 0.1.0 → 0.3.0

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 (603) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +89 -123
  3. data/docs/architecture.md +477 -31
  4. data/docs/bison-import.md +103 -0
  5. data/docs/comparison-policy.md +127 -0
  6. data/docs/configuration-model.md +59 -0
  7. data/docs/configuration-report.md +28 -0
  8. data/docs/conflict-explanation-reviews/v1/records/README.md +28 -0
  9. data/docs/conflict-explanation-study.md +62 -0
  10. data/docs/construction-profiling.md +157 -0
  11. data/docs/cst-migration.md +106 -0
  12. data/docs/cst.md +237 -0
  13. data/docs/decisions/0000-template.md +24 -0
  14. data/docs/decisions/0001-separate-ir-pipeline.md +34 -0
  15. data/docs/decisions/0002-opaque-user-code-boundary.md +32 -0
  16. data/docs/decisions/0003-self-hosted-grammar-frontend.md +32 -0
  17. data/docs/decisions/0004-shared-semantic-and-lossless-source-model.md +33 -0
  18. data/docs/decisions/0005-contained-grammar-composition.md +34 -0
  19. data/docs/decisions/0006-bounded-structural-grammar-lowering.md +32 -0
  20. data/docs/decisions/0007-shared-parser-construction-pipeline.md +33 -0
  21. data/docs/decisions/0008-versioned-runtime-package-boundary.md +36 -0
  22. data/docs/decisions/0009-isolated-parser-sessions.md +34 -0
  23. data/docs/decisions/0010-committed-runtime-observation.md +34 -0
  24. data/docs/decisions/0011-versioned-semantic-action-boundary.md +37 -0
  25. data/docs/decisions/0012-bounded-nonexecuting-analysis.md +37 -0
  26. data/docs/decisions/0013-transactional-generation-publication.md +37 -0
  27. data/docs/decisions/0014-versioned-generated-lexer.md +35 -0
  28. data/docs/decisions/0015-worker-isolated-browser-analysis.md +32 -0
  29. data/docs/decisions/0016-red-green-concrete-syntax.md +34 -0
  30. data/docs/decisions/0017-persistent-syntax-artifacts.md +35 -0
  31. data/docs/decisions/0018-conservative-incremental-syntax-reuse.md +38 -0
  32. data/docs/decisions/0019-runtime-syntax-session-boundary.md +51 -0
  33. data/docs/decisions/0020-grammar-ir-parser-contract.md +65 -0
  34. data/docs/decisions/0021-data-only-parser-table-sidecar.md +50 -0
  35. data/docs/decisions/0022-manifest-bound-verification-report.md +77 -0
  36. data/docs/decisions/0023-syntax-only-repair-results.md +48 -0
  37. data/docs/decisions/0024-direct-ielr-construction.md +42 -0
  38. data/docs/decisions/README.md +74 -0
  39. data/docs/declarative-configuration.md +262 -0
  40. data/docs/development.md +306 -0
  41. data/docs/direct-ielr-decision.md +120 -0
  42. data/docs/direct-multi-entry-decision.md +82 -0
  43. data/docs/editor-setup.md +26 -0
  44. data/docs/error-ux-review-rubric-v1.md +117 -0
  45. data/docs/error-ux-reviews/v1/records/README.md +22 -0
  46. data/docs/error-ux-round2-review-status-v1.json +27 -0
  47. data/docs/error-ux-round2-reviews/v1/records/README.md +30 -0
  48. data/docs/error-ux-round2-v1.json +1581 -0
  49. data/docs/error-ux-round2.md +111 -0
  50. data/docs/error-ux.md +114 -0
  51. data/docs/getting-started.md +80 -0
  52. data/docs/grammar-reference.md +629 -18
  53. data/docs/ielr-design.md +43 -0
  54. data/docs/ielr.md +92 -0
  55. data/docs/ja/bison-import.md +51 -0
  56. data/docs/ja/stable-api.md +53 -0
  57. data/docs/lexer-construction-profile.md +109 -0
  58. data/docs/lexer-migration.md +56 -0
  59. data/docs/maturity.md +128 -0
  60. data/docs/project-site-strategy.md +54 -0
  61. data/docs/racc-migration-evidence.md +45 -0
  62. data/docs/racc-migration.md +45 -6
  63. data/docs/release-readiness.md +221 -0
  64. data/docs/repair-semantics.md +123 -0
  65. data/docs/runtime-abi-evolution.md +307 -0
  66. data/docs/stability.md +234 -0
  67. data/docs/status.md +43 -0
  68. data/docs/syntax-sessions.md +183 -0
  69. data/docs/table-artifact.md +125 -0
  70. data/docs/test-interactions.md +219 -0
  71. data/docs/verification-report.md +137 -0
  72. data/docs/verifier-trust-boundary.md +199 -0
  73. data/docs/workloads.md +132 -0
  74. data/examples/README.md +60 -0
  75. data/examples/calculator.y +44 -0
  76. data/examples/csv.y +32 -0
  77. data/examples/ini.y +70 -0
  78. data/examples/json.y +48 -0
  79. data/examples/tiny_language.y +75 -0
  80. data/lib/ibex/analysis/digraph.rb +128 -0
  81. data/lib/ibex/analysis/sets.rb +5 -4
  82. data/lib/ibex/analysis.rb +1 -0
  83. data/lib/ibex/artifact_set.rb +63 -0
  84. data/lib/ibex/bison_import/importer.rb +516 -0
  85. data/lib/ibex/bison_import/tokenizer.rb +260 -0
  86. data/lib/ibex/bison_import.rb +200 -0
  87. data/lib/ibex/bounded_subprocess.rb +171 -0
  88. data/lib/ibex/cli/ambiguity.rb +75 -0
  89. data/lib/ibex/cli/analysis.rb +134 -0
  90. data/lib/ibex/cli/bison_import.rb +121 -0
  91. data/lib/ibex/cli/config.rb +128 -0
  92. data/lib/ibex/cli/counterexample_options.rb +6 -2
  93. data/lib/ibex/cli/coverage.rb +173 -0
  94. data/lib/ibex/cli/debug.rb +106 -0
  95. data/lib/ibex/cli/diagnostics.rb +136 -0
  96. data/lib/ibex/cli/documentation.rb +70 -0
  97. data/lib/ibex/cli/equiv.rb +169 -0
  98. data/lib/ibex/cli/error_messages.rb +184 -0
  99. data/lib/ibex/cli/explain.rb +85 -0
  100. data/lib/ibex/cli/fix.rb +203 -0
  101. data/lib/ibex/cli/formatting.rb +387 -0
  102. data/lib/ibex/cli/fuzz.rb +200 -0
  103. data/lib/ibex/cli/fuzz_regressions.rb +145 -0
  104. data/lib/ibex/cli/generation_artifacts.rb +189 -0
  105. data/lib/ibex/cli/generation_error_messages.rb +39 -0
  106. data/lib/ibex/cli/grammar_tests.rb +140 -0
  107. data/lib/ibex/cli/ir_tools.rb +128 -0
  108. data/lib/ibex/cli/lsp.rb +33 -0
  109. data/lib/ibex/cli/outputs.rb +133 -23
  110. data/lib/ibex/cli/racc_migration.rb +87 -0
  111. data/lib/ibex/cli/reduce.rb +202 -0
  112. data/lib/ibex/cli/reduce_reporting.rb +71 -0
  113. data/lib/ibex/cli/samples.rb +118 -0
  114. data/lib/ibex/cli/verify.rb +116 -0
  115. data/lib/ibex/cli/watch.rb +104 -0
  116. data/lib/ibex/cli.rb +825 -55
  117. data/lib/ibex/codegen/action_locations.rb +103 -0
  118. data/lib/ibex/codegen/action_method_source.rb +209 -0
  119. data/lib/ibex/codegen/action_source.rb +119 -0
  120. data/lib/ibex/codegen/ambiguity.rb +174 -0
  121. data/lib/ibex/codegen/cst_metadata.rb +171 -0
  122. data/lib/ibex/codegen/documentation.rb +170 -0
  123. data/lib/ibex/codegen/explain.rb +380 -0
  124. data/lib/ibex/codegen/generated_action_abi.rb +293 -0
  125. data/lib/ibex/codegen/html.rb +94 -10
  126. data/lib/ibex/codegen/mermaid.rb +43 -0
  127. data/lib/ibex/codegen/railroad.rb +197 -0
  128. data/lib/ibex/codegen/railroad_documentation.rb +59 -0
  129. data/lib/ibex/codegen/rbs.rb +331 -2
  130. data/lib/ibex/codegen/report.rb +67 -15
  131. data/lib/ibex/codegen/ruby.rb +305 -66
  132. data/lib/ibex/codegen/ruby_actions.rb +146 -0
  133. data/lib/ibex/codegen/ruby_ast.rb +121 -0
  134. data/lib/ibex/codegen/ruby_error_messages.rb +28 -0
  135. data/lib/ibex/codegen/ruby_lexer.rb +83 -0
  136. data/lib/ibex/codegen/ruby_syntax.rb +96 -0
  137. data/lib/ibex/codegen/ruby_table_metadata.rb +57 -0
  138. data/lib/ibex/codegen/ruby_value_printers.rb +56 -0
  139. data/lib/ibex/codegen/symbol_labels.rb +1 -1
  140. data/lib/ibex/configuration/analysis_grammar.rb +35 -0
  141. data/lib/ibex/configuration/explanation.rb +421 -0
  142. data/lib/ibex/configuration/inspector.rb +232 -0
  143. data/lib/ibex/configuration.rb +580 -0
  144. data/lib/ibex/coverage/collector.rb +198 -0
  145. data/lib/ibex/coverage/event_stream.rb +103 -0
  146. data/lib/ibex/coverage/report.rb +267 -0
  147. data/lib/ibex/coverage/runtime_event_validator.rb +169 -0
  148. data/lib/ibex/coverage.rb +13 -0
  149. data/lib/ibex/delta_reducer.rb +99 -0
  150. data/lib/ibex/diff.rb +140 -0
  151. data/lib/ibex/equiv/machine.rb +135 -0
  152. data/lib/ibex/equiv.rb +373 -0
  153. data/lib/ibex/error_messages/parser.rb +159 -0
  154. data/lib/ibex/error_messages/parser_v2.rb +198 -0
  155. data/lib/ibex/error_messages/renderer.rb +65 -0
  156. data/lib/ibex/error_messages/sentence_search.rb +196 -0
  157. data/lib/ibex/error_messages/update.rb +169 -0
  158. data/lib/ibex/error_messages.rb +165 -0
  159. data/lib/ibex/fix.rb +557 -0
  160. data/lib/ibex/frontend/ast.rb +166 -7
  161. data/lib/ibex/frontend/bootstrap_parser.rb +40 -4
  162. data/lib/ibex/frontend/diagnostic.rb +81 -0
  163. data/lib/ibex/frontend/diagnostic_recovery.rb +268 -0
  164. data/lib/ibex/frontend/dsl.rb +66 -7
  165. data/lib/ibex/frontend/formatter.rb +453 -0
  166. data/lib/ibex/frontend/generated_parser.rb +644 -190
  167. data/lib/ibex/frontend/generated_parser_base.rb +170 -32
  168. data/lib/ibex/frontend/generated_parser_includes.rb +51 -0
  169. data/lib/ibex/frontend/generated_parser_metadata.rb +61 -0
  170. data/lib/ibex/frontend/generated_parser_parameters.rb +60 -0
  171. data/lib/ibex/frontend/generation.rb +33 -0
  172. data/lib/ibex/frontend/lexer.rb +162 -10
  173. data/lib/ibex/frontend/lexer_recovery.rb +84 -0
  174. data/lib/ibex/frontend/parser/declarations.rb +262 -11
  175. data/lib/ibex/frontend/parser/parameters.rb +82 -0
  176. data/lib/ibex/frontend/parser/rules.rb +43 -6
  177. data/lib/ibex/frontend/parser.rb +182 -4
  178. data/lib/ibex/frontend/parser_configuration_support.rb +56 -0
  179. data/lib/ibex/frontend/regenerator.rb +27 -1
  180. data/lib/ibex/frontend/resolution.rb +70 -0
  181. data/lib/ibex/frontend/resolver.rb +217 -0
  182. data/lib/ibex/frontend/rule_documentation.rb +104 -0
  183. data/lib/ibex/frontend/source_cursor.rb +133 -9
  184. data/lib/ibex/frontend/source_document.rb +229 -0
  185. data/lib/ibex/frontend/source_loader.rb +150 -0
  186. data/lib/ibex/frontend/source_span.rb +89 -0
  187. data/lib/ibex/frontend/token_adapter/declaration_document_state.rb +47 -0
  188. data/lib/ibex/frontend/token_adapter/declaration_lexer_state.rb +83 -0
  189. data/lib/ibex/frontend/token_adapter/declaration_state.rb +244 -22
  190. data/lib/ibex/frontend/token_adapter/delimiter_tracker.rb +8 -2
  191. data/lib/ibex/frontend/token_adapter/rule_state.rb +60 -2
  192. data/lib/ibex/frontend/token_adapter.rb +18 -3
  193. data/lib/ibex/frontend.rb +14 -2
  194. data/lib/ibex/fuzz.rb +219 -0
  195. data/lib/ibex/generation_input.rb +57 -0
  196. data/lib/ibex/generation_manifest.rb +211 -0
  197. data/lib/ibex/generation_transaction.rb +261 -0
  198. data/lib/ibex/generation_transaction_recovery.rb +109 -0
  199. data/lib/ibex/generation_transaction_validation.rb +196 -0
  200. data/lib/ibex/grammar_tests.rb +206 -0
  201. data/lib/ibex/ir/automaton_ir.rb +86 -11
  202. data/lib/ibex/ir/grammar_ir.rb +170 -26
  203. data/lib/ibex/ir/lexer_ir.rb +76 -0
  204. data/lib/ibex/ir/parser_contract.rb +135 -0
  205. data/lib/ibex/ir/serialize.rb +268 -50
  206. data/lib/ibex/ir/validator/automaton.rb +375 -0
  207. data/lib/ibex/ir/validator/base.rb +147 -0
  208. data/lib/ibex/ir/validator/grammar.rb +634 -0
  209. data/lib/ibex/ir/validator/lexer.rb +113 -0
  210. data/lib/ibex/ir/validator.rb +63 -0
  211. data/lib/ibex/ir.rb +71 -5
  212. data/lib/ibex/lalr/build_metrics.rb +71 -0
  213. data/lib/ibex/lalr/builder.rb +514 -52
  214. data/lib/ibex/lalr/conflict.rb +1 -0
  215. data/lib/ibex/lalr/conflict_search.rb +26 -9
  216. data/lib/ibex/lalr/counterexample.rb +38 -18
  217. data/lib/ibex/lalr/direct_lookaheads.rb +289 -0
  218. data/lib/ibex/lalr/goto_follows.rb +229 -0
  219. data/lib/ibex/lalr/ielr/annotator.rb +214 -0
  220. data/lib/ibex/lalr/ielr/bits.rb +28 -0
  221. data/lib/ibex/lalr/ielr/inadequacy.rb +47 -0
  222. data/lib/ibex/lalr/ielr/item_lookaheads.rb +78 -0
  223. data/lib/ibex/lalr/ielr/pipeline.rb +75 -0
  224. data/lib/ibex/lalr/ielr/split_stability.rb +78 -0
  225. data/lib/ibex/lalr/ielr/split_state.rb +20 -0
  226. data/lib/ibex/lalr/ielr/state_splitter.rb +258 -0
  227. data/lib/ibex/lalr/ielr_partition.rb +166 -0
  228. data/lib/ibex/lalr/inadequacy_report.rb +50 -0
  229. data/lib/ibex/lalr/lookahead_propagation.rb +111 -0
  230. data/lib/ibex/lalr/lr0_collection.rb +121 -0
  231. data/lib/ibex/lalr/on_error_reductions.rb +74 -0
  232. data/lib/ibex/lalr/unreachable_states.rb +80 -0
  233. data/lib/ibex/lalr.rb +59 -1
  234. data/lib/ibex/location.rb +129 -0
  235. data/lib/ibex/lsp/document_handlers.rb +68 -0
  236. data/lib/ibex/lsp/document_store.rb +264 -0
  237. data/lib/ibex/lsp/document_store_diagnostics.rb +44 -0
  238. data/lib/ibex/lsp/document_store_validation.rb +61 -0
  239. data/lib/ibex/lsp/initialization_handlers.rb +80 -0
  240. data/lib/ibex/lsp/navigation_handlers.rb +70 -0
  241. data/lib/ibex/lsp/parser_configuration_assistance.rb +149 -0
  242. data/lib/ibex/lsp/position_codec.rb +113 -0
  243. data/lib/ibex/lsp/protocol_error.rb +33 -0
  244. data/lib/ibex/lsp/request_handlers.rb +46 -0
  245. data/lib/ibex/lsp/request_support.rb +94 -0
  246. data/lib/ibex/lsp/server.rb +148 -0
  247. data/lib/ibex/lsp/symbol_index.rb +241 -0
  248. data/lib/ibex/lsp/symbol_index_builder.rb +277 -0
  249. data/lib/ibex/lsp/symbol_index_precedence_references.rb +44 -0
  250. data/lib/ibex/lsp/symbol_index_source_queries.rb +61 -0
  251. data/lib/ibex/lsp/symbol_occurrence.rb +23 -0
  252. data/lib/ibex/lsp/transport.rb +128 -0
  253. data/lib/ibex/lsp/workspace.rb +128 -0
  254. data/lib/ibex/lsp/workspace_analyzer.rb +199 -0
  255. data/lib/ibex/lsp.rb +33 -0
  256. data/lib/ibex/messages/en.yml +28 -0
  257. data/lib/ibex/messages/ja.yml +28 -0
  258. data/lib/ibex/messages.rb +68 -0
  259. data/lib/ibex/metrics.rb +175 -0
  260. data/lib/ibex/normalize/declarations.rb +142 -7
  261. data/lib/ibex/normalize/diagnostics.rb +94 -24
  262. data/lib/ibex/normalize/expander.rb +64 -59
  263. data/lib/ibex/normalize/expression.rb +63 -40
  264. data/lib/ibex/normalize/grammar_builder.rb +26 -0
  265. data/lib/ibex/normalize/inline_expansion.rb +465 -0
  266. data/lib/ibex/normalize/inline_validation.rb +174 -0
  267. data/lib/ibex/normalize/lexer.rb +131 -0
  268. data/lib/ibex/normalize/named_references.rb +60 -0
  269. data/lib/ibex/normalize/nodes.rb +46 -0
  270. data/lib/ibex/normalize/parameter_ebnf_lowering.rb +70 -0
  271. data/lib/ibex/normalize/parameter_lowering.rb +143 -0
  272. data/lib/ibex/normalize/parameter_substitution.rb +125 -0
  273. data/lib/ibex/normalize/parameter_validation.rb +140 -0
  274. data/lib/ibex/normalize/parameters.rb +226 -0
  275. data/lib/ibex/normalize/parser_configuration.rb +70 -0
  276. data/lib/ibex/normalize/recovery_declarations.rb +84 -0
  277. data/lib/ibex/normalize.rb +172 -17
  278. data/lib/ibex/racc_migration/checker.rb +122 -0
  279. data/lib/ibex/racc_migration/harness.rb +177 -0
  280. data/lib/ibex/racc_migration/report.rb +97 -0
  281. data/lib/ibex/racc_migration.rb +12 -0
  282. data/lib/ibex/rake_task.rb +116 -0
  283. data/lib/ibex/samples.rb +216 -0
  284. data/lib/ibex/table_artifact/builder.rb +266 -0
  285. data/lib/ibex/table_artifact/cst_projection.rb +70 -0
  286. data/lib/ibex/table_artifact/document.rb +39 -0
  287. data/lib/ibex/table_artifact/executor.rb +187 -0
  288. data/lib/ibex/table_artifact/serializer.rb +57 -0
  289. data/lib/ibex/table_artifact/validator/metadata.rb +179 -0
  290. data/lib/ibex/table_artifact/validator/support.rb +86 -0
  291. data/lib/ibex/table_artifact/validator/tables.rb +238 -0
  292. data/lib/ibex/table_artifact/validator.rb +253 -0
  293. data/lib/ibex/table_artifact.rb +88 -0
  294. data/lib/ibex/table_simulation/result.rb +55 -0
  295. data/lib/ibex/table_simulation/simulator.rb +253 -0
  296. data/lib/ibex/table_simulation/step.rb +62 -0
  297. data/lib/ibex/table_simulation/text.rb +31 -0
  298. data/lib/ibex/table_simulation.rb +13 -0
  299. data/lib/ibex/tables.rb +22 -69
  300. data/lib/ibex/verifiable_generation_bundle.rb +86 -0
  301. data/lib/ibex/verification_report/builder.rb +159 -0
  302. data/lib/ibex/verification_report/canonical_ir.rb +123 -0
  303. data/lib/ibex/verification_report/logical_path.rb +68 -0
  304. data/lib/ibex/verification_report/validator.rb +329 -0
  305. data/lib/ibex/verification_report.rb +69 -0
  306. data/lib/ibex/verify/action_correspondence.rb +138 -0
  307. data/lib/ibex/verify/language_witness.rb +295 -0
  308. data/lib/ibex/verify/reference_collection.rb +190 -0
  309. data/lib/ibex/verify/result.rb +73 -0
  310. data/lib/ibex/verify/verifier.rb +598 -0
  311. data/lib/ibex/verify.rb +15 -0
  312. data/lib/ibex/version.rb +1 -1
  313. data/lib/ibex/watch/runner.rb +181 -0
  314. data/lib/ibex/watch/source_snapshot.rb +98 -0
  315. data/lib/ibex/watch.rb +11 -0
  316. data/lib/ibex.rb +35 -1
  317. data/schema/automaton-ir-definitions.schema.json +401 -0
  318. data/schema/automaton-ir.schema.json +65 -0
  319. data/schema/benchmark-v1.schema.json +212 -0
  320. data/schema/benchmark-v2.schema.json +61 -0
  321. data/schema/bison-import-v1.schema.json +106 -0
  322. data/schema/conflict-explanation-review-v1.schema.json +196 -0
  323. data/schema/conflict-explanation-study-v1.schema.json +528 -0
  324. data/schema/construction-profile-v1.schema.json +779 -0
  325. data/schema/cst-v1.json +170 -0
  326. data/schema/diff-v1.schema.json +41 -0
  327. data/schema/direct-ielr-decision-v1.schema.json +200 -0
  328. data/schema/equiv-v1.schema.json +64 -0
  329. data/schema/error-ux-review-v1.schema.json +609 -0
  330. data/schema/error-ux-round2-review-v1.schema.json +191 -0
  331. data/schema/error-ux-round2-v1.schema.json +519 -0
  332. data/schema/error-ux-v1.schema.json +258 -0
  333. data/schema/explain-v1.schema.json +495 -0
  334. data/schema/fix-v1.schema.json +64 -0
  335. data/schema/fix-v2.schema.json +66 -0
  336. data/schema/fix-v3.schema.json +101 -0
  337. data/schema/frontend-diagnostics-v1.schema.json +154 -0
  338. data/schema/fuzz-regression-v1.schema.json +79 -0
  339. data/schema/fuzz-v1.schema.json +114 -0
  340. data/schema/generation-manifest-v1.schema.json +115 -0
  341. data/schema/grammar-ir-extensions.schema.json +734 -0
  342. data/schema/grammar-ir-foundation.schema.json +426 -0
  343. data/schema/grammar-ir.schema.json +271 -0
  344. data/schema/ielr-benchmark-v1.schema.json +85 -0
  345. data/schema/lexer-ir-v1.schema.json +215 -0
  346. data/schema/lexer-profile-v1.schema.json +491 -0
  347. data/schema/metrics-v1.schema.json +60 -0
  348. data/schema/migration-check-v1.schema.json +60 -0
  349. data/schema/performance-comparison-v1.schema.json +395 -0
  350. data/schema/public-performance-comparison-v1.schema.json +506 -0
  351. data/schema/public-performance-profile-v1.schema.json +360 -0
  352. data/schema/reduce-v1.schema.json +22 -0
  353. data/schema/reduce-v2.schema.json +63 -0
  354. data/schema/runtime-coverage-v1.schema.json +86 -0
  355. data/schema/runtime-event-v1.schema.json +308 -0
  356. data/schema/table-artifact-v1.schema.json +377 -0
  357. data/schema/table-simulation-v1.schema.json +70 -0
  358. data/schema/verification-report-v1.schema.json +222 -0
  359. data/schema/verify-v1.schema.json +42 -0
  360. data/sig/ibex/analysis/digraph.rbs +19 -0
  361. data/sig/ibex/artifact_set.rbs +37 -0
  362. data/sig/ibex/bison_import/importer.rbs +140 -0
  363. data/sig/ibex/bison_import/tokenizer.rbs +91 -0
  364. data/sig/ibex/bison_import.rbs +95 -0
  365. data/sig/ibex/bounded_subprocess.rbs +76 -0
  366. data/sig/ibex/cli/ambiguity.rbs +28 -0
  367. data/sig/ibex/cli/analysis.rbs +43 -0
  368. data/sig/ibex/cli/bison_import.rbs +32 -0
  369. data/sig/ibex/cli/config.rbs +35 -0
  370. data/sig/ibex/cli/counterexample_options.rbs +2 -0
  371. data/sig/ibex/cli/coverage.rbs +53 -0
  372. data/sig/ibex/cli/debug.rbs +28 -0
  373. data/sig/ibex/cli/diagnostics.rbs +51 -0
  374. data/sig/ibex/cli/documentation.rbs +29 -0
  375. data/sig/ibex/cli/equiv.rbs +49 -0
  376. data/sig/ibex/cli/error_messages.rbs +63 -0
  377. data/sig/ibex/cli/explain.rbs +31 -0
  378. data/sig/ibex/cli/fix.rbs +53 -0
  379. data/sig/ibex/cli/formatting.rbs +107 -0
  380. data/sig/ibex/cli/fuzz.rbs +47 -0
  381. data/sig/ibex/cli/fuzz_regressions.rbs +40 -0
  382. data/sig/ibex/cli/generation_artifacts.rbs +69 -0
  383. data/sig/ibex/cli/generation_error_messages.rbs +19 -0
  384. data/sig/ibex/cli/grammar_tests.rbs +48 -0
  385. data/sig/ibex/cli/ir_tools.rbs +39 -0
  386. data/sig/ibex/cli/lsp.rbs +14 -0
  387. data/sig/ibex/cli/outputs.rbs +26 -3
  388. data/sig/ibex/cli/racc_migration.rbs +30 -0
  389. data/sig/ibex/cli/reduce.rbs +60 -0
  390. data/sig/ibex/cli/reduce_reporting.rbs +27 -0
  391. data/sig/ibex/cli/samples.rbs +38 -0
  392. data/sig/ibex/cli/verify.rbs +28 -0
  393. data/sig/ibex/cli/watch.rbs +43 -0
  394. data/sig/ibex/cli.rbs +182 -9
  395. data/sig/ibex/codegen/action_locations.rbs +45 -0
  396. data/sig/ibex/codegen/action_method_source.rbs +65 -0
  397. data/sig/ibex/codegen/action_source.rbs +50 -0
  398. data/sig/ibex/codegen/ambiguity.rbs +60 -0
  399. data/sig/ibex/codegen/cst_metadata.rbs +59 -0
  400. data/sig/ibex/codegen/documentation.rbs +50 -0
  401. data/sig/ibex/codegen/explain.rbs +105 -0
  402. data/sig/ibex/codegen/generated_action_abi.rbs +105 -0
  403. data/sig/ibex/codegen/html.rbs +18 -2
  404. data/sig/ibex/codegen/mermaid.rbs +16 -0
  405. data/sig/ibex/codegen/railroad.rbs +82 -0
  406. data/sig/ibex/codegen/railroad_documentation.rbs +31 -0
  407. data/sig/ibex/codegen/rbs.rbs +86 -4
  408. data/sig/ibex/codegen/report.rbs +16 -8
  409. data/sig/ibex/codegen/ruby.rbs +105 -28
  410. data/sig/ibex/codegen/ruby_actions.rbs +54 -0
  411. data/sig/ibex/codegen/ruby_ast.rbs +34 -0
  412. data/sig/ibex/codegen/ruby_error_messages.rbs +16 -0
  413. data/sig/ibex/codegen/ruby_lexer.rbs +25 -0
  414. data/sig/ibex/codegen/ruby_syntax.rbs +27 -0
  415. data/sig/ibex/codegen/ruby_table_metadata.rbs +26 -0
  416. data/sig/ibex/codegen/ruby_value_printers.rbs +28 -0
  417. data/sig/ibex/configuration/analysis_grammar.rbs +13 -0
  418. data/sig/ibex/configuration/explanation.rbs +195 -0
  419. data/sig/ibex/configuration/inspector.rbs +53 -0
  420. data/sig/ibex/configuration.rbs +242 -0
  421. data/sig/ibex/coverage/collector.rbs +78 -0
  422. data/sig/ibex/coverage/event_stream.rbs +44 -0
  423. data/sig/ibex/coverage/report.rbs +102 -0
  424. data/sig/ibex/coverage/runtime_event_validator.rbs +70 -0
  425. data/sig/ibex/coverage.rbs +7 -0
  426. data/sig/ibex/delta_reducer.rbs +38 -0
  427. data/sig/ibex/diff.rbs +47 -0
  428. data/sig/ibex/equiv/machine.rbs +54 -0
  429. data/sig/ibex/equiv.rbs +129 -0
  430. data/sig/ibex/error_messages/parser.rbs +58 -0
  431. data/sig/ibex/error_messages/parser_v2.rbs +67 -0
  432. data/sig/ibex/error_messages/renderer.rbs +23 -0
  433. data/sig/ibex/error_messages/sentence_search.rbs +80 -0
  434. data/sig/ibex/error_messages/update.rbs +43 -0
  435. data/sig/ibex/error_messages.rbs +85 -0
  436. data/sig/ibex/fix.rbs +138 -0
  437. data/sig/ibex/frontend/ast.rbs +237 -22
  438. data/sig/ibex/frontend/bootstrap_parser.rbs +13 -0
  439. data/sig/ibex/frontend/diagnostic.rbs +53 -0
  440. data/sig/ibex/frontend/diagnostic_recovery.rbs +98 -0
  441. data/sig/ibex/frontend/dsl.rbs +33 -4
  442. data/sig/ibex/frontend/formatter.rbs +143 -0
  443. data/sig/ibex/frontend/generated_parser.rbs +228 -68
  444. data/sig/ibex/frontend/generated_parser_base.rbs +65 -12
  445. data/sig/ibex/frontend/generated_parser_includes.rbs +23 -0
  446. data/sig/ibex/frontend/generated_parser_metadata.rbs +23 -0
  447. data/sig/ibex/frontend/generated_parser_parameters.rbs +24 -0
  448. data/sig/ibex/frontend/generation.rbs +6 -0
  449. data/sig/ibex/frontend/lexer.rbs +49 -2
  450. data/sig/ibex/frontend/lexer_recovery.rbs +25 -0
  451. data/sig/ibex/frontend/parser/declarations.rbs +57 -0
  452. data/sig/ibex/frontend/parser/parameters.rbs +28 -0
  453. data/sig/ibex/frontend/parser/rules.rbs +3 -0
  454. data/sig/ibex/frontend/parser.rbs +66 -0
  455. data/sig/ibex/frontend/parser_configuration_support.rbs +27 -0
  456. data/sig/ibex/frontend/regenerator.rbs +11 -0
  457. data/sig/ibex/frontend/resolution.rbs +34 -0
  458. data/sig/ibex/frontend/resolver.rbs +91 -0
  459. data/sig/ibex/frontend/rule_documentation.rbs +42 -0
  460. data/sig/ibex/frontend/source_cursor.rbs +38 -5
  461. data/sig/ibex/frontend/source_document.rbs +119 -0
  462. data/sig/ibex/frontend/source_loader.rbs +66 -0
  463. data/sig/ibex/frontend/source_span.rbs +56 -0
  464. data/sig/ibex/frontend/token_adapter/declaration_document_state.rbs +21 -0
  465. data/sig/ibex/frontend/token_adapter/declaration_lexer_state.rbs +27 -0
  466. data/sig/ibex/frontend/token_adapter/declaration_state.rbs +83 -3
  467. data/sig/ibex/frontend/token_adapter/rule_state.rbs +20 -0
  468. data/sig/ibex/frontend/token_adapter.rbs +11 -2
  469. data/sig/ibex/frontend.rbs +1 -1
  470. data/sig/ibex/fuzz.rbs +71 -0
  471. data/sig/ibex/generation_input.rbs +37 -0
  472. data/sig/ibex/generation_manifest.rbs +70 -0
  473. data/sig/ibex/generation_transaction.rbs +82 -0
  474. data/sig/ibex/generation_transaction_recovery.rbs +36 -0
  475. data/sig/ibex/generation_transaction_validation.rbs +65 -0
  476. data/sig/ibex/grammar_tests.rbs +93 -0
  477. data/sig/ibex/ir/automaton_ir.rbs +35 -10
  478. data/sig/ibex/ir/grammar_ir.rbs +96 -22
  479. data/sig/ibex/ir/lexer_ir.rbs +57 -0
  480. data/sig/ibex/ir/parser_contract.rbs +69 -0
  481. data/sig/ibex/ir/serialize.rbs +75 -23
  482. data/sig/ibex/ir/validator/automaton.rbs +112 -0
  483. data/sig/ibex/ir/validator/base.rbs +69 -0
  484. data/sig/ibex/ir/validator/grammar.rbs +195 -0
  485. data/sig/ibex/ir/validator/lexer.rbs +37 -0
  486. data/sig/ibex/ir/validator.rbs +16 -0
  487. data/sig/ibex/ir.rbs +45 -5
  488. data/sig/ibex/lalr/build_metrics.rbs +60 -0
  489. data/sig/ibex/lalr/builder.rbs +150 -19
  490. data/sig/ibex/lalr/conflict_search.rbs +12 -5
  491. data/sig/ibex/lalr/counterexample.rbs +20 -14
  492. data/sig/ibex/lalr/direct_lookaheads.rbs +93 -0
  493. data/sig/ibex/lalr/goto_follows.rbs +89 -0
  494. data/sig/ibex/lalr/ielr/annotator.rbs +67 -0
  495. data/sig/ibex/lalr/ielr/bits.rbs +14 -0
  496. data/sig/ibex/lalr/ielr/inadequacy.rbs +24 -0
  497. data/sig/ibex/lalr/ielr/item_lookaheads.rbs +35 -0
  498. data/sig/ibex/lalr/ielr/pipeline.rbs +17 -0
  499. data/sig/ibex/lalr/ielr/split_stability.rbs +27 -0
  500. data/sig/ibex/lalr/ielr/split_state.rbs +14 -0
  501. data/sig/ibex/lalr/ielr/state_splitter.rbs +76 -0
  502. data/sig/ibex/lalr/ielr_partition.rbs +71 -0
  503. data/sig/ibex/lalr/inadequacy_report.rbs +21 -0
  504. data/sig/ibex/lalr/lookahead_propagation.rbs +38 -0
  505. data/sig/ibex/lalr/lr0_collection.rbs +50 -0
  506. data/sig/ibex/lalr/on_error_reductions.rbs +22 -0
  507. data/sig/ibex/lalr/unreachable_states.rbs +25 -0
  508. data/sig/ibex/lalr.rbs +17 -1
  509. data/sig/ibex/location.rbs +67 -0
  510. data/sig/ibex/lsp/document_handlers.rbs +24 -0
  511. data/sig/ibex/lsp/document_store.rbs +94 -0
  512. data/sig/ibex/lsp/document_store_diagnostics.rbs +20 -0
  513. data/sig/ibex/lsp/document_store_validation.rbs +26 -0
  514. data/sig/ibex/lsp/initialization_handlers.rbs +30 -0
  515. data/sig/ibex/lsp/navigation_handlers.rbs +33 -0
  516. data/sig/ibex/lsp/parser_configuration_assistance.rbs +49 -0
  517. data/sig/ibex/lsp/position_codec.rbs +44 -0
  518. data/sig/ibex/lsp/protocol_error.rbs +32 -0
  519. data/sig/ibex/lsp/request_handlers.rbs +26 -0
  520. data/sig/ibex/lsp/request_support.rbs +40 -0
  521. data/sig/ibex/lsp/server.rbs +55 -0
  522. data/sig/ibex/lsp/symbol_index.rbs +77 -0
  523. data/sig/ibex/lsp/symbol_index_builder.rbs +88 -0
  524. data/sig/ibex/lsp/symbol_index_precedence_references.rbs +18 -0
  525. data/sig/ibex/lsp/symbol_index_source_queries.rbs +26 -0
  526. data/sig/ibex/lsp/symbol_occurrence.rbs +31 -0
  527. data/sig/ibex/lsp/transport.rbs +47 -0
  528. data/sig/ibex/lsp/workspace.rbs +42 -0
  529. data/sig/ibex/lsp/workspace_analyzer.rbs +69 -0
  530. data/sig/ibex/lsp.rbs +7 -0
  531. data/sig/ibex/messages.rbs +26 -0
  532. data/sig/ibex/metrics.rbs +50 -0
  533. data/sig/ibex/normalize/declarations.rbs +31 -0
  534. data/sig/ibex/normalize/diagnostics.rbs +13 -4
  535. data/sig/ibex/normalize/expander.rbs +22 -16
  536. data/sig/ibex/normalize/expression.rbs +11 -9
  537. data/sig/ibex/normalize/grammar_builder.rbs +11 -0
  538. data/sig/ibex/normalize/inline_expansion.rbs +129 -0
  539. data/sig/ibex/normalize/inline_validation.rbs +40 -0
  540. data/sig/ibex/normalize/lexer.rbs +37 -0
  541. data/sig/ibex/normalize/named_references.rbs +20 -0
  542. data/sig/ibex/normalize/nodes.rbs +14 -0
  543. data/sig/ibex/normalize/parameter_ebnf_lowering.rbs +33 -0
  544. data/sig/ibex/normalize/parameter_lowering.rbs +35 -0
  545. data/sig/ibex/normalize/parameter_substitution.rbs +42 -0
  546. data/sig/ibex/normalize/parameter_validation.rbs +44 -0
  547. data/sig/ibex/normalize/parameters.rbs +51 -0
  548. data/sig/ibex/normalize/parser_configuration.rbs +23 -0
  549. data/sig/ibex/normalize/recovery_declarations.rbs +24 -0
  550. data/sig/ibex/normalize.rbs +129 -18
  551. data/sig/ibex/racc_migration/checker.rbs +36 -0
  552. data/sig/ibex/racc_migration/harness.rbs +16 -0
  553. data/sig/ibex/racc_migration/report.rbs +55 -0
  554. data/sig/ibex/racc_migration.rbs +8 -0
  555. data/sig/ibex/rake_task.rbs +51 -0
  556. data/sig/ibex/samples.rbs +60 -0
  557. data/sig/ibex/table_artifact/builder.rbs +93 -0
  558. data/sig/ibex/table_artifact/cst_projection.rbs +20 -0
  559. data/sig/ibex/table_artifact/document.rbs +27 -0
  560. data/sig/ibex/table_artifact/executor.rbs +66 -0
  561. data/sig/ibex/table_artifact/serializer.rbs +25 -0
  562. data/sig/ibex/table_artifact/validator/metadata.rbs +52 -0
  563. data/sig/ibex/table_artifact/validator/support.rbs +46 -0
  564. data/sig/ibex/table_artifact/validator/tables.rbs +63 -0
  565. data/sig/ibex/table_artifact/validator.rbs +66 -0
  566. data/sig/ibex/table_artifact.rbs +32 -0
  567. data/sig/ibex/table_simulation/result.rbs +36 -0
  568. data/sig/ibex/table_simulation/simulator.rbs +98 -0
  569. data/sig/ibex/table_simulation/step.rbs +42 -0
  570. data/sig/ibex/table_simulation/text.rbs +14 -0
  571. data/sig/ibex/table_simulation.rbs +7 -0
  572. data/sig/ibex/tables.rbs +10 -35
  573. data/sig/ibex/verifiable_generation_bundle.rbs +24 -0
  574. data/sig/ibex/verification_report/builder.rbs +53 -0
  575. data/sig/ibex/verification_report/canonical_ir.rbs +41 -0
  576. data/sig/ibex/verification_report/logical_path.rbs +34 -0
  577. data/sig/ibex/verification_report/validator.rbs +114 -0
  578. data/sig/ibex/verification_report.rbs +44 -0
  579. data/sig/ibex/verify/action_correspondence.rbs +50 -0
  580. data/sig/ibex/verify/language_witness.rbs +112 -0
  581. data/sig/ibex/verify/reference_collection.rbs +63 -0
  582. data/sig/ibex/verify/result.rbs +52 -0
  583. data/sig/ibex/verify/verifier.rbs +170 -0
  584. data/sig/ibex/verify.rbs +6 -0
  585. data/sig/ibex/watch/runner.rbs +58 -0
  586. data/sig/ibex/watch/source_snapshot.rbs +46 -0
  587. data/sig/ibex/watch.rbs +7 -0
  588. data/sig/ibex.rbs +2 -0
  589. metadata +524 -19
  590. data/.rubocop.yml +0 -43
  591. data/CHANGELOG.md +0 -30
  592. data/Rakefile +0 -25
  593. data/Steepfile +0 -10
  594. data/docs/compat-notes.md +0 -37
  595. data/docs/lexer-coverage.md +0 -14
  596. data/docs/phase10-extensions.md +0 -27
  597. data/gemfiles/Gemfile +0 -7
  598. data/gemfiles/Gemfile.lock +0 -98
  599. data/lib/ibex/frontend/grammar.y +0 -156
  600. data/lib/ibex/runtime/parser.rb +0 -360
  601. data/lib/ibex/runtime.rb +0 -8
  602. data/sig/ibex/runtime/parser.rbs +0 -167
  603. data/sig/ibex/runtime.rbs +0 -6
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: Migrating from racc
3
+ description: Move a racc grammar to Ibex with explicit compatibility checks and runtime boundaries.
4
+ ---
5
+
1
6
  # Migrating from racc
2
7
 
3
8
  Ibex targets grammar-file compatibility, generated parser public API compatibility, and the main racc CLI options. It does not
@@ -5,11 +10,14 @@ copy racc's internal table arrays, internal method names, native runtime, or gen
5
10
 
6
11
  ## Typical migration
7
12
 
8
- 1. Run `ibex -o parser.rb grammar.y` in place of `racc -o parser.rb grammar.y`.
9
- 2. Change the generated-file runtime dependency from deployment packaging only; application calls to `do_parse`, `yyparse`,
13
+ 1. Run `ibex migrate-check grammar.y` and resolve any errors. Use `--format=json` for CI.
14
+ 2. Generate a reviewable parity harness with `ibex migrate-harness -o migration_harness.rb grammar.y`, add explicit token
15
+ cases, and run it inside an isolation boundary appropriate for the grammar code.
16
+ 3. Run `ibex -o parser.rb grammar.y` in place of `racc -o parser.rb grammar.y`.
17
+ 4. Change the generated-file runtime dependency from deployment packaging only; application calls to `do_parse`, `yyparse`,
10
18
  `next_token`, `on_error`, `token_to_str`, `yyerror`, `yyerrok`, and `yyaccept` remain the same.
11
- 3. Use `-E` if the generated parser must be a single file with no installed Ibex gem.
12
- 4. Keep the default `--mode=racc` until intentionally adopting EBNF or names. Extended grammars can make that choice locally by
19
+ 5. Use `-E` if the generated parser must be a single file with no installed Ibex gem.
20
+ 6. Keep the default `--mode=default` until intentionally adopting EBNF or names. Extended grammars can make that choice locally by
13
21
  placing `pragma extended` immediately after their class header instead of requiring `--mode=extended` at each invocation.
14
22
 
15
23
  ## CLI mapping
@@ -23,6 +31,7 @@ copy racc's internal table arrays, internal method names, native runtime, or gen
23
31
  | `-E`, `--embedded` | Embed the Pure Ruby runtime |
24
32
  | `-F`, `--frozen` | Accepted; Ibex always emits frozen-string magic comments |
25
33
  | `--rbs[=FILE]` | Ibex extension; emit a generated parser signature |
34
+ | `--action-source[=FILE]` | Ibex extension; emit a non-executable Steep shadow of semantic methods |
26
35
  | `--warnings=all,error` | Ibex extension; display or promote structured grammar diagnostics |
27
36
  | `--line-convert-all`, `-l` | Map header/inner/footer too, or disable all source mapping |
28
37
  | `-a` | Generate methods for implicit actions |
@@ -34,6 +43,38 @@ copy racc's internal table arrays, internal method names, native runtime, or gen
34
43
  Ibex defaults to `<input>.rb`; racc 1.8.1 was observed to default to `<input>.tab.rb`. Use `-o` for portable scripts.
35
44
  By default, semantic actions and `inner` methods report grammar-file lines while `header` and `footer` retain generated-file
36
45
  lines. `--line-convert-all` maps every user-code section; `-l` maps none. The mapping is retained through IR JSON resumption.
46
+ For static action checking, combine `--rbs --action-source`; configure the generated `.rbs` and `.actions.rb` in the
47
+ application's Steep target, and run Steep separately. The shadow is check-only input and must not replace or be required by the
48
+ runtime parser.
49
+
50
+ `migrate-check` never executes semantic actions or `header`/`inner`/`footer` code. `migrate-harness` also only writes source. The
51
+ generated harness is the explicit execution step: after reviewed cases are added, it invokes both generators and executes both
52
+ generated parsers in bounded child processes. This is not a sandbox; use a container or VM for untrusted grammar code. See
53
+ [ADR 0012](decisions/0012-bounded-nonexecuting-analysis.md).
54
+
55
+ ## Compatibility baseline
56
+
57
+ The repository probes and their exact reproduction commands are recorded in
58
+ [`racc-migration-evidence.md`](racc-migration-evidence.md). That matrix is an
59
+ internal evidence index: it distinguishes self-authored black-box coverage
60
+ from the separately pinned public-gem migration suites and does not turn either
61
+ set into a claim of third-party adoption or performance parity.
62
+
63
+ The compatibility claims above were checked on 2026-07-22 against racc 1.8.1 using only its public documentation, `racc --help`,
64
+ and black-box execution. Ibex does not inspect racc implementation files or generated source. Self-authored probes compare
65
+ observable results for arithmetic precedence, empty rules, string tokens, `convert`, `no_result_var`, inline actions,
66
+ dangling-else `expect`, error recovery, source-line conversion, and a generated 500-production grammar.
67
+
68
+ Precedence-resolved conflicts remain visible in Automaton IR but are excluded from the CLI conflict count and `expect`. Error
69
+ recovery probes compare result values and the public `on_error` arguments. These tests skip when the `racc` executable is absent.
70
+
71
+ Application-defined parser initializers do not have to call `super`; the runtime completes its isolated session state on first
72
+ use while retaining application-owned instance variables. During parsing, the historical `@vstack` and `@racc_vstack` names
73
+ both refer to the live semantic-value stack for read compatibility. They are internal aliases: applications may inspect them
74
+ while tokenizing but must not mutate, replace, or retain them across parser sessions.
75
+
76
+ An unqualified `ParseError` in a parser method or semantic action resolves through `Runtime::Parser`, so application actions can
77
+ keep their existing explicit rejection path. Structured failures remain available as `Ibex::Runtime::ParseError`.
37
78
 
38
79
  ## Known differences
39
80
 
@@ -43,5 +84,3 @@ lines. `--line-convert-all` maps every user-code section; `-l` maps none. The ma
43
84
  unknown lookahead through `on_error` first, then recovers if the callback returns. Declared invalid tokens match in the
44
85
  black-box recovery probe.
45
86
  - `require "racc/parser"` replacement and previously generated racc parser table compatibility are out of scope.
46
-
47
- See [compatibility observations](compat-notes.md) for the tested version and probe set.
@@ -0,0 +1,221 @@
1
+ ---
2
+ title: Release readiness
3
+ description: Outcome-based release evidence, limitations, and the current publication decision.
4
+ ---
5
+
6
+ # v1.0 readiness report
7
+
8
+ This is the outcome-based v1.0 decision required by the project design. It
9
+ records evidence current through 2026-08-08. Performance measurements used
10
+ Ruby 4.0.0 on `arm64-darwin24`. Passing the implementation checklist is not
11
+ sufficient for a stable release.
12
+
13
+ ## Decision
14
+
15
+ **HOLD v1.0.** Compatibility behavior, scale construction, semantic-value
16
+ signatures, and the repository compatibility suite have evidence. The exact
17
+ formal public performance rerun is now recorded for the measured revision
18
+ below. The published ten-case error comparison has not received independent
19
+ third-party review. Its machine-readable
20
+ [`R001` status](error-ux-review-status-v1.json) is
21
+ `HOLD / awaiting_independent_review`; the linked status leads to the complete
22
+ rubric, closed record schema, immutable evidence identity, and imported-record
23
+ registry.
24
+
25
+ <!-- r001-review-status:start -->
26
+ R001: `HOLD` — [`awaiting_independent_review`](error-ux-review-status-v1.json).
27
+ <!-- r001-review-status:end -->
28
+
29
+ Feature development is not frozen. The open release gate blocks publication of
30
+ v1.0, not feature development. New work remains subject to the feature budgets,
31
+ maturity rules, compatibility checks, and exact-revision release gates
32
+ documented by the project. The current Grammar IR and Automaton IR contracts
33
+ remain closed and validated; before v1.0, incompatible changes are coordinated
34
+ with their writers, readers, schemas, fixtures, and downstream consumers.
35
+
36
+ The format-v6 batch Red/Green CST has been selected as part of the initial
37
+ Stable v1 API. Its syntax-only incremental layer remains Experimental. Other
38
+ Preview and Experimental features may continue to ship in prereleases without
39
+ promotion; before v1.0, those surfaces can change between prereleases when the
40
+ release notes, migration note, regressions, and maturity evidence are updated.
41
+ The release lock applies to Stable declarations and versioned persisted
42
+ contracts, not to every Preview implementation detail or evidence capture.
43
+
44
+ ## KPI result
45
+
46
+ | KPI | Result | Evidence |
47
+ |---|---|---|
48
+ | Three public-gem migrations | Pass with documented adapters | Namae, BCDice, and Nokogiri behavior suites below |
49
+ | Hundreds-of-productions scale | Pass | 501 productions, 503 states, 125.008 ms average complete build |
50
+ | Ten-case error UX comparison | Partial | 10/10 snapshots and 8/10 useful repairs are public; independent review is missing |
51
+ | Public generator/runtime performance baseline | Pass at measured revision | Direct formal ten-run result artifact is published below; the historical projection remains retained separately |
52
+ | Semantic-value RBS and typed ratchet | Pass | Generated reduction signatures include declared RHS/LHS types; the 2026-08-08 evidence revision measured whole-library Steep at 88.4% typed |
53
+ | Compatibility suite unbeaten | Pass at the measured revision | Current black-box, self-host, IR, property, and runtime suites are green |
54
+ | Release basis | Pass without publication | Stable declaration diff is 0 across 48 locked files; both gems build byte-identically under two environments |
55
+
56
+ ## Public-gem migration evidence
57
+
58
+ Only public grammar files, public commands, and observable test results were
59
+ used. Neither racc implementation files nor generated source were inspected.
60
+ Each repository was cloned at the recorded revision:
61
+
62
+ | Project | Revision and grammar | Static check | Behavior result |
63
+ |---|---|---|---|
64
+ | Namae | [`d33875a`](https://github.com/berkmancenter/namae/commit/d33875aaf1fc420a8dfe946a3b29cc3e19710061), `lib/namae/parser.y` | compatible | 151 RSpec examples, 85 Cucumber scenarios, 198 steps |
65
+ | BCDice | [`21b4a03`](https://github.com/bcdice/BCDice/commit/21b4a03789bf2080ad41aaf31299b609ee7bda86), `lib/bcdice/command/parser.y` | compatible; runtime-constant warning | 25 tests, 103 assertions |
66
+ | Nokogiri | [`04a4c29`](https://github.com/sparklemotion/nokogiri/commit/04a4c29c6a605ad40a78f4ce343ced0832a1805c), `lib/nokogiri/css/parser.y` | compatible; runtime-constant warning | 6 tests, 14 assertions |
67
+
68
+ Namae generated and ran as one embedded file. The other two grammars contain a
69
+ user header whose superclass is named `Racc::Parser`. Their PoCs preload this
70
+ explicit migration adapter before loading the generated parser:
71
+
72
+ ```ruby
73
+ require "ibex/runtime"
74
+
75
+ module Racc
76
+ Parser = Ibex::Runtime::Parser
77
+ end
78
+ ```
79
+
80
+ This is the adapter recommended by `ibex migrate-check`; it does not load or
81
+ execute the racc runtime. The PoCs uncovered and fixed three compatibility
82
+ gaps: an omitted `end` before a user-code section, an application initializer
83
+ that omits `super` plus historical value-stack reads, and an unqualified
84
+ `ParseError`.
85
+
86
+ ## Formal Pure Ruby performance comparison
87
+
88
+ <!-- comparative-evidence:racc-public-performance-2026-07-31:start -->
89
+ At clean Ibex revision 984d4ae7a1c96db4c71e3077669842b7bbc3b4ea, the readiness
90
+ projection for three pinned workloads on Ruby 4.0.0, arm64-darwin24, with YJIT disabled
91
+ records slower cold generation and new-instance runtime than Racc 1.8.1's Ruby backend;
92
+ the direct formal result artifact is absent, so this is evidence-pending and non-publishable
93
+ as a comparative claim.
94
+
95
+ Evidence record ID: `racc-public-performance-2026-07-31`. Its complete scope,
96
+ evidence paths, missing artifact, and limitations are registered in
97
+ [`claims.yml`](claims.yml) under the [comparison policy](comparison-policy.md).
98
+ CPU model, kernel release, and processor count were not retained in this
99
+ readiness projection. Host CPU and host OS were also not recorded as separate
100
+ fields. The measurements below do not describe the current checkout.
101
+
102
+ The historical readiness projection says the measurement was collected on
103
+ 2026-07-31 from clean revision
104
+ `984d4ae7a1c96db4c71e3077669842b7bbc3b4ea` with ten
105
+ alternating isolated runs per implementation, 50 warm-up workloads, 250
106
+ measured workloads, and 10,000 bootstrap samples. Each workload parses the
107
+ five fixed public inputs. Ruby 4.0.0 ran with YJIT disabled; Racc 1.8.1 was
108
+ forced to its Ruby backend and every worker verified the selected runtime.
109
+ Ratios below are Ibex divided by Racc; time cells include the bootstrap 95%
110
+ interval. The harness's `target_met` field marks absolute parity when the
111
+ interval's upper bound is no greater than 1.0. That field is diagnostic:
112
+ v1.0 requires publication of measurements and their conditions, while a
113
+ future performance gate may reject only a relative regression measured under
114
+ an identical environment and configuration.
115
+
116
+ | Project | Cold generation time | Reuse time | Reuse allocations | New-instance time | New-instance allocations | Generated bytes |
117
+ |---|---:|---:|---:|---:|---:|---:|
118
+ | Namae | 1.238x [1.184, 1.272] | 0.985x [0.966, 1.032] | 0.849x | 1.194x [1.157, 1.248] | 1.190x | 0.862x |
119
+ | BCDice command | 1.329x [1.278, 1.420] | 1.052x [1.008, 1.075] | 0.666x | 1.373x [1.326, 1.415] | 1.103x | 0.981x |
120
+ | Nokogiri CSS | 1.309x [1.277, 1.343] | 0.985x [0.963, 1.029] | 0.662x | 1.186x [1.149, 1.255] | 1.051x | 0.937x |
121
+
122
+ Result values and ordered result sequences are equivalent in every runtime
123
+ row. The measured parser-time medians in milliseconds per parse were
124
+ 0.039443/0.040048 (Ibex/Racc) for Namae reuse,
125
+ 0.020925/0.019897 for BCDice reuse, and
126
+ 0.024892/0.025280 for Nokogiri reuse. The corresponding new-instance medians
127
+ were 0.048234/0.040413, 0.027523/0.020044, and 0.030420/0.025642.
128
+
129
+ The results deliberately retain the unfavorable rows: cold generation is
130
+ 23.8–32.9% slower, and new-instance parsing is 18.6–37.3% slower. Reuse point
131
+ estimates range from 1.5% faster to 5.2% slower. Ibex allocates fewer objects
132
+ for every reuse workload, while new-instance allocation ratios remain
133
+ 1.051–1.190x. Generated output is smaller for all three grammars. These values
134
+ are a release baseline, not portable scores or an assertion of parity.
135
+ <!-- comparative-evidence:racc-public-performance-2026-07-31:end -->
136
+
137
+ ## Exact-revision formal rerun
138
+
139
+ <!-- comparative-claim:racc-public-performance-2026-08-08:start -->
140
+ At clean Ibex revision 26e94ce631bf5c075ecbca0205a34a8c231c31d9, on Ruby 4.0.0,
141
+ arm64-darwin24, with YJIT disabled, the direct formal comparison of the pinned
142
+ Namae, BCDice command, and Nokogiri CSS workloads against Racc 1.8.1 produced
143
+ equivalent result sequences; Ibex recorded slower cold generation and new-instance
144
+ parsing, fewer reuse allocations, and smaller generated output in every workload.
145
+
146
+ | Project | Cold generation ratio | Reuse time ratio | Reuse allocations ratio | New-instance time ratio | New-instance allocations ratio | Generated bytes ratio |
147
+ |---|---:|---:|---:|---:|---:|---:|
148
+ | Namae | 1.317830 | 0.996320 | 0.854462 | 1.209687 | 1.207559 | 0.861519 |
149
+ | BCDice command | 1.309690 | 1.010467 | 0.675012 | 1.331780 | 1.129299 | 0.981449 |
150
+ | Nokogiri CSS | 1.288118 | 0.994802 | 0.670484 | 1.193522 | 1.074838 | 0.936806 |
151
+
152
+ The complete formal result is [`2026-08-08-8c9cef999d09-ruby-4.0.0-arm64-darwin24.json`](../benchmark/results/public/2026-08-08-8c9cef999d09-ruby-4.0.0-arm64-darwin24.json). It records ten alternating isolated runs per implementation and scenario, 50 warm-up workloads, 250 measured workloads, five behavior probes, 10,000 bootstrap samples, exact public checkout revisions, and equivalent result and result-sequence digests.
153
+ <!-- comparative-claim:racc-public-performance-2026-08-08:end -->
154
+
155
+ ## Scale evidence
156
+
157
+ Run:
158
+
159
+ ```sh
160
+ benchmark/scale.rb --rules 500 --iterations 3
161
+ ```
162
+
163
+ The reproducible synthetic chain shares its grammar shape with the 500-rule
164
+ black-box compatibility test. The measured report contains 501 productions,
165
+ 503 direct-LALR construction states, 503 final states, no conflicts, and
166
+ 41,332 bytes of compact generated Ruby. Three complete parse-to-codegen builds
167
+ averaged 125.008 ms with a 122.742–127.002 ms range. The Automaton IR digest
168
+ was `fe0e2f0c9bf16e7aa22a7ebcea40b229fedbb573f83af37596b76e0b989c3338`.
169
+
170
+ This synthetic result establishes the requested scale bound. The 139-production
171
+ representative grammar remains the realistic workload, so neither result is
172
+ presented as a substitute for an application-specific benchmark.
173
+
174
+ ## Error UX and type evidence
175
+
176
+ [`error-ux.md`](error-ux.md) and its versioned JSON publish the same ten
177
+ malformed JSON inputs against the public racc callback. Eight selected repairs
178
+ were assessed useful. A maintainer assessment is not independent review; at
179
+ least one external reviewer must record a review of the cases and usefulness
180
+ labels before this KPI passes. Reviewers use the versioned
181
+ [`independent rubric`](error-ux-review-rubric-v1.md), generate a draft with the
182
+ exact checkout and environment identity, set all structured consent fields, and
183
+ publish the final permalink-free payload at a full-SHA blob URL. Maintainers
184
+ import the exact bytes and register publication provenance separately, without
185
+ rewriting. Ordinary CI validates the offline kit; the release gate performs
186
+ fail-closed blob checks and requires the source owner, GitHub API author,
187
+ publisher, and reviewer logins to agree. This establishes only GitHub namespace
188
+ control and account metadata, not cryptographic identity or a signature. The
189
+ gate remains intentionally failing while the public status is HOLD.
190
+
191
+ The 2026-07-31 evidence snapshot recorded 23,517 typed calls and 2,946
192
+ untyped calls out of 26,463, or 88.9% typed. Generated parser RBS refines
193
+ declared terminal, nonterminal, RHS tuple, and reduction result types. Untyped
194
+ values remain explicit at undeclared grammar symbols, decoded JSON, dynamic
195
+ table cells, and opaque application Ruby boundaries. The current repository
196
+ result is maintained in the generated type-statistics block in `README.md`.
197
+
198
+ ## Release-basis evidence
199
+
200
+ `bundle exec rake release:reproducible` compares 47 normalized Stable RBS
201
+ declaration files with the v0.2.0 baseline. The current result has zero
202
+ differences; the installed-Gem embedded-source helper is an internal packaging
203
+ implementation and is outside that public lock. The task also builds both
204
+ gems twice under distinct locale, timezone, and frozen-string settings and
205
+ requires byte-identical artifacts. SHA-256 digests are emitted for the exact
206
+ candidate revision rather than recorded as if the current HOLD revision were
207
+ a release.
208
+
209
+ No release signing credential is stored in this repository. A signature or
210
+ provenance attestation must be supplied by a protected external release
211
+ environment after the outcome gates pass; an unsigned local test key would not
212
+ establish publisher identity.
213
+
214
+ ## Actions required to release v1.0
215
+
216
+ 1. Obtain and publish an independent review of the ten error cases using the
217
+ R001 rubric, then import the record byte-for-byte with its immutable
218
+ permalink and consent. Preserve disagreements separately from the normative
219
+ maintainer assessment.
220
+ 2. Re-run every compatibility, IR, type, benchmark, and site gate on the exact
221
+ release revision.
@@ -0,0 +1,123 @@
1
+ # Existing bounded repair semantics
2
+
3
+ Ibex bounded repair is an opt-in Experimental runtime facility. Assign an
4
+ immutable `Ibex::Runtime::RepairPolicy` before starting a parser session. With
5
+ no policy, parsing does not search or prefetch for repairs and existing error
6
+ recovery is unchanged.
7
+
8
+ ## Search state and bounds
9
+
10
+ `RepairSearch` runs Dijkstra search over configurations containing:
11
+
12
+ - a copied LR state stack;
13
+ - the buffered-input index;
14
+ - consecutive successful shifts;
15
+ - accumulated edit cost and ordered edits;
16
+ - whether that configuration has reached the proof goal.
17
+
18
+ Insertion, deletion, and replacement are the only edits. The default costs are
19
+ 1, 1, and 2, with maximum cost 3. Search also has independent defaults of 5,000
20
+ simulated configurations, 8 lookahead tokens, 3 proof shifts, and stack depth
21
+ 256. Every policy number is positive and proof shifts cannot exceed lookahead.
22
+
23
+ The queue orders configurations lexicographically by:
24
+
25
+ 1. total cost;
26
+ 2. semantic-value risk;
27
+ 3. ordered edit keys `(input position, delete|insert|replace rank, token id)`;
28
+ 4. goal before non-goal;
29
+ 5. more successful shifts;
30
+ 6. earlier buffered-input index;
31
+ 7. LR state stack.
32
+
33
+ Word-like token names add semantic-value risk; punctuation does not. This is a
34
+ deterministic tie-break, not a claim that punctuation edits are correct.
35
+ Candidate inserted/replacement token IDs are ordered and exclude EOF and the
36
+ reserved `error` token. A plan succeeds after the configured consecutive
37
+ shifts or accept.
38
+
39
+ Search simulates table actions and reductions on integer state stacks only. It
40
+ does not call semantic actions, `on_error`, `on_repair`, lexer actions, or
41
+ runtime observers. Reduction-stack cycles, excess stack depth, excess cost,
42
+ and excess configuration count stop a path. Pull parsing may read ahead to the
43
+ lookahead bound. An incomplete push prefix yields the internal `NEED_INPUT`
44
+ sentinel and waits for more input.
45
+
46
+ The compatibility `RepairSearch#search` projection still returns the legacy
47
+ `RepairPlan | NEED_INPUT | nil` shape. The additive `search_result` method
48
+ retains a frozen typed outcome (`:selected`, `:need_input`, `:exhausted`, or
49
+ `:not_found`) for syntax tooling, so bounded exhaustion is not confused with a
50
+ complete search that found no plan.
51
+
52
+ ## Selection, hooks, and replay
53
+
54
+ On a reported syntax error, the runtime captures the error context and CST
55
+ error, publishes the runtime `error` event, and calls `on_error`. If search
56
+ selected a plan, `on_repair(plan)` is called next. If either hook raises, its
57
+ exception propagates before edited tokens are applied.
58
+
59
+ After both hooks return, the runtime rebuilds the buffered token prefix:
60
+
61
+ | Edit | Replay token value | Replay location | CST effect |
62
+ | --- | --- | --- | --- |
63
+ | insert | `nil` | location at the insertion point | missing token |
64
+ | delete | absent from replay | original source retained separately | skipped/error trivia |
65
+ | replace | original token value | original token location | error-marked replacement |
66
+
67
+ The rebuilt prefix then passes through ordinary shift/reduce/accept handling.
68
+ Committed semantic actions and observers therefore run normally; speculative
69
+ search never runs them. Replay emits normal parser events and does not invent a
70
+ `recover` event for the selected repair. The original syntax error remains a
71
+ diagnostic even if replay accepts.
72
+
73
+ Inserted `nil` and a replacement's retained value are compatibility mechanics,
74
+ not evidence of user intent. A syntactically accepted repair can still be
75
+ semantically unsafe.
76
+
77
+ ## Syntax-only editor proposals
78
+
79
+ `SyntaxSession#repair` is a separate Experimental boundary for callers that
80
+ need byte edits rather than semantic replay. It runs the same bounded search
81
+ on a fresh private parser, captures absolute source ranges, resolves source
82
+ spelling only from caller-provided text or conservative punctuation literals,
83
+ and validates the applied bytes with a fresh syntax session. Production actions
84
+ and the application's `on_repair` callback do not run, and the result has no
85
+ semantic `value`. The originating session remains unchanged.
86
+
87
+ `SyntaxRepairResult` distinguishes `:accepted`, `:progress`, and `:rejected`
88
+ from bounded `:exhausted` and `:not_found` outcomes and selected-but-unavailable
89
+ cases such as missing token spelling or multiple repair segments. Accepted
90
+ results require a diagnostic-free fresh parse consuming all edited bytes. For
91
+ error results, `updated_source` keeps the exact bytes while the CST may expose
92
+ only the consumed prefix under the existing error CST contract. See [E002
93
+ syntax-only repair](investigations/E002-syntax-only-repair-result.md) and
94
+ [ADR 0023](decisions/0023-syntax-only-repair-results.md).
95
+
96
+ ## CST and source ownership
97
+
98
+ CST parsing retains the original source bytes. Insertions are represented by
99
+ missing nodes, replacements carry an error flag, and deleted token bytes are
100
+ preserved as skipped-token trivia rather than silently disappearing. These
101
+ representations are part of the existing CST error-path contract, not a text
102
+ edit API. `RepairPlan#position` is a buffered token index, not a source-byte
103
+ offset.
104
+
105
+ ## Executable coverage
106
+
107
+ <!-- repair-semantics:coverage:start -->
108
+ | Concept | Executable evidence |
109
+ | --- | --- |
110
+ | policy-and-default-off | `test/runtime/repair_test.rb` |
111
+ | dijkstra-priority-and-outcomes | `test/runtime/repair_characterization_test.rb` |
112
+ | typed-search-outcomes | `test/runtime/repair_characterization_test.rb` |
113
+ | values-locations-and-replay | `test/runtime/repair_test.rb` |
114
+ | hooks-actions-and-observers | `test/runtime/repair_test.rb` |
115
+ | pull-and-push-bounds | `test/runtime/repair_test.rb` |
116
+ | cst-representation | `test/codegen/cst_test.rb` |
117
+ | cst-source-fidelity | `test/runtime/cst_fidelity_property_test.rb` |
118
+ | syntax-only-repair-projection | `test/runtime/syntax_repair_test.rb` |
119
+ <!-- repair-semantics:coverage:end -->
120
+
121
+ The H003 [round-two evidence](error-ux-round2.md) records exact selected plans
122
+ and fresh reparses but keeps external usefulness judgments on HOLD. Neither
123
+ that evidence nor this characterization promotes bounded repair to Stable.