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
@@ -0,0 +1,307 @@
1
+ # Runtime ABI evolution
2
+
3
+ This policy separates durable serialized input, generated parser tables, and
4
+ the Ruby runtime API. The current format is the only supported Grammar and
5
+ Automaton IR boundary; the numeric field is a wire discriminator, not a promise
6
+ to read old files.
7
+
8
+ <!-- ibex-runtime-abi-contract:start -->
9
+ ```yaml
10
+ contract_version: 1
11
+ ir:
12
+ grammar:
13
+ current_writer: 1
14
+ readable: [1]
15
+ migrations: []
16
+ preserve_loaded_version: false
17
+ automaton:
18
+ current_writer: 1
19
+ readable: [1]
20
+ migrations: []
21
+ preserve_loaded_version: false
22
+ lexer:
23
+ current_writer: 1
24
+ readable: [1]
25
+ migrations: []
26
+ standalone: true
27
+ embedded_in_grammar: true
28
+ parser_tables:
29
+ current_writer: 6
30
+ readable: [6]
31
+ cst_readable: [6]
32
+ fail_before_input: true
33
+ versions:
34
+ generator: "0.3.0"
35
+ runtime: "0.3.0"
36
+ runtime_dependency: "~> 0.3.0"
37
+ runtime_paths:
38
+ - .github/pull_request_template.md
39
+ - .github/workflows/main.yml
40
+ - Rakefile
41
+ - docs/runtime-abi-evolution.md
42
+ - docs/test-interactions.md
43
+ - tool/quality/runtime_abi.rb
44
+ - tool/quality/runtime_abi/**/*
45
+ - test/quality/runtime_abi*_test.rb
46
+ - test/support/runtime_abi_test_project.rb
47
+ - test/fixtures/runtime_abi/**/*
48
+ - ibex.gemspec
49
+ - ibex-runtime.gemspec
50
+ - lib/ibex/version.rb
51
+ - lib/ibex/runtime.rb
52
+ - lib/ibex/runtime/**/*
53
+ - lib/ibex/runtime/version.rb
54
+ - lib/ibex/tables.rb
55
+ - lib/ibex/tables/**/*
56
+ - sig/ibex/tables.rbs
57
+ - sig/ibex/runtime.rbs
58
+ - sig/ibex/runtime/**/*
59
+ - sig/ibex/tables/**/*
60
+ - lib/ibex/codegen.rb
61
+ - lib/ibex/codegen/**/*
62
+ - sig/ibex/codegen.rbs
63
+ - sig/ibex/codegen/**/*
64
+ - lib/ibex/frontend/generated_parser.rb
65
+ - lib/ibex/ir.rb
66
+ - lib/ibex/ir/**/*
67
+ - sig/ibex/ir.rbs
68
+ - sig/ibex/ir/**/*
69
+ - schema/grammar-ir.schema.json
70
+ - schema/grammar-ir-foundation.schema.json
71
+ - schema/grammar-ir-extensions.schema.json
72
+ - schema/automaton-ir.schema.json
73
+ - schema/automaton-ir-definitions.schema.json
74
+ - schema/lexer-ir-v*.schema.json
75
+ - schema/cst-v*.json
76
+ - test/matrix.yml
77
+ - test/support/matrix_contract.rb
78
+ - test/support/matrix_runner.rb
79
+ - test/tooling/matrix_runner_test.rb
80
+ - tool/quality/golden.rb
81
+ - test/golden/**/*
82
+ assessment:
83
+ states: [compatible, breaking, not_applicable]
84
+ surfaces: [parser_table, grammar_ir, automaton_ir, lexer_ir, runtime_api, embedded_runtime, generation_metadata, cst, test_matrix, policy, none]
85
+ abi_choices: [current_contract, new_table_format, new_ir_version, new_runtime_major, sidecar, none]
86
+ regeneration: [required, not_required, not_applicable]
87
+ required_fields: [state, surfaces, abi_choice, regeneration, rationale, affected_interactions, evidence, tests, verification]
88
+ ```
89
+ <!-- ibex-runtime-abi-contract:end -->
90
+
91
+ The fenced record above is validated against the constants, schemas, gemspecs,
92
+ test declaration, and pull-request policy in this repository. Edit it only as
93
+ part of the implementation change that moves the corresponding boundary.
94
+
95
+ ## IR read, write, migration, and freeze policy
96
+
97
+ | Contract | Current writer | Current reader | Migration | Freeze |
98
+ | --- | ---: | --- | --- | --- |
99
+ | Grammar IR | current format | current format only | none | the current schema is closed; older documents are rejected |
100
+ | Automaton IR | current format | current format only | none | the current schema is closed; older documents are rejected |
101
+ | Lexer IR | schema 1 | schema 1 | none | the closed schema changes only through a new schema |
102
+
103
+ The generator and runtime intentionally share one Grammar and Automaton IR
104
+ format. Older documents are rejected before construction; there is no in-process
105
+ IR migration command or compatibility reader. The current Grammar IR carries a
106
+ required root `parser_contract` whose individual fields
107
+ are either explicit with source locations or explicitly unspecified. Automaton
108
+ IR embeds the current Grammar IR, includes that contract in `grammar_digest`,
109
+ and records `entry_construction` as `shared` or `isolated`. Unknown versions and
110
+ construction values are rejected.
111
+
112
+ An extended root `parser ... end` declaration now writes explicit
113
+ `parser.algorithm` and `parser.entries` members into the current contract. The
114
+ declaration is generator input only: it selects existing construction paths and
115
+ does not add a runtime lookup, generated parser method, action ABI field, or
116
+ parser-table datum. Parser-table format v6 therefore remains the sole writer,
117
+ and declaration-free grammar, generated Ruby, and table golden bytes remain
118
+ unchanged.
119
+
120
+ Resuming from the current Grammar IR resolves explicit contract values through the same
121
+ typed configuration algebra as CLI values; a matching CLI value is accepted and
122
+ a conflicting canonical-generation value fails at the recorded declaration
123
+ location. Explicit analysis or grammar-test algorithm selection is reported as
124
+ noncanonical and never reclassified as canonical generation. Resuming from a constructed Automaton IR rejects
125
+ construction flags because they cannot rebuild the embedded tables. Its manifest
126
+ keeps the grammar contract, embedded construction facts, and effective codegen
127
+ configuration separate. These schema additions do not change parser-table
128
+ format v6 or the runtime action ABI.
129
+
130
+ Lexer IR schema 1 is independently versioned. It can be validated and serialized as
131
+ a standalone `ibex_ir: lexer` document, and Grammar IR can carry the same
132
+ versioned document in its optional `lexer` field. There is no Lexer IR
133
+ migration today. Changing lexer rule meaning or its required shape therefore
134
+ requires Lexer IR v2; changing only parser construction does not.
135
+
136
+ The JSON schemas under `schema/` are the published closed shapes. An optional
137
+ field may be added to a future version, but an existing closed schema is not
138
+ made open to avoid assigning new meaning to an old version.
139
+
140
+ ## Parser-table formats
141
+
142
+ The generator emits format v6, and the runtime recognizes only that current
143
+ format. Older generated tables fail before input so the runtime does not carry
144
+ historical action-ABI branches indefinitely:
145
+
146
+ | Format | Non-CST runtime contract | CST contract | Current writer |
147
+ | ---: | --- | --- | --- |
148
+ | v6 | retains the preceding action contracts | structured CST metadata is accepted | yes |
149
+
150
+ Plain and compact tables are encodings of the same lookup contract, not
151
+ separate ABI versions. A change to compression is format-preserving only when
152
+ every known and unknown token retains the same shift, reduce, accept, or error
153
+ result. Required table shape, action calling convention, marker meaning, or
154
+ runtime lookup meaning requires a new parser-table format.
155
+
156
+ Every pull, `yyparse`, push, finish, and syntax entry starts a parser session by
157
+ validating its table object. A missing or unsupported `format_version`, an
158
+ invalid generated action marker combination, or a legacy/boolean CST shape is
159
+ rejected before the runtime asks a pull lexer for a token or consumes a
160
+ caller-supplied push token. Current generated action marker combinations are
161
+ checked at that boundary. The error directs the application to regenerate.
162
+ Validation cannot undo side effects the caller performed while constructing an
163
+ argument before calling the runtime.
164
+
165
+ Regeneration is required when:
166
+
167
+ - a parser has no table-format version or uses a version the installed runtime
168
+ does not list;
169
+ - any CST-aware parser predates structured format-v6 CST metadata;
170
+ - generated action markers do not satisfy their current calling contract;
171
+ - an embedded parser must receive runtime fixes or a newer runtime ABI; or
172
+ - a release note for a new format explicitly retires an older reader.
173
+
174
+ Non-CST v1-v5 tables are outside the pre-v1 runtime compatibility obligation
175
+ and require regeneration. Applications that need to keep an old generated
176
+ artifact can pin the matching pre-v1 runtime package instead of making the
177
+ current reader retain every historical table branch.
178
+
179
+ ## Generator and runtime versions
180
+
181
+ | Generated artifact | Runtime used | Status |
182
+ | --- | --- | --- |
183
+ | Ibex 0.3.0 non-embedded output (table v6) | `ibex-runtime` 0.3.0 | supported and covered by packaging/runtime tests |
184
+ | Ibex 0.3.0 non-embedded output | a future version admitted by `~> 0.3.0` | dependency resolution permits it; compatibility is an obligation of that future release, not current execution evidence |
185
+ | Ibex 0.3.0 embedded output | runtime sources copied by Ibex 0.3.0 | self-contained and covered by packaging/runtime tests |
186
+ | Ibex 0.2.0 non-embedded output (table v6) | `ibex-runtime` 0.2.0 | supported and covered by packaging/runtime tests |
187
+ | Ibex 0.2.0 non-embedded output | a future version admitted by `~> 0.2.0` | dependency resolution permits it; compatibility is an obligation of that future release, not current execution evidence |
188
+ | Ibex 0.2.0 embedded output | runtime sources copied by Ibex 0.2.0 | self-contained and covered by packaging/runtime tests |
189
+ | old non-CST or CST table v1-v5 | `ibex-runtime` 0.3.0 | rejected before input; regenerate or pin the matching pre-v1 runtime |
190
+ | table v7 or later | `ibex-runtime` 0.3.0 | rejected before input; upgrade the runtime or regenerate to a supported format |
191
+
192
+ `ibex` 0.3.0 declares `ibex-runtime ~> 0.3.0`; in RubyGems terms that admits
193
+ runtime releases from 0.3.0 up to, but not including, 0.4.0. The previous
194
+ 0.2.0 line remains a historical compatibility boundary. The table format is
195
+ still the executable compatibility check. A package requirement alone does not
196
+ prove that an unpublished runtime can execute a generated parser.
197
+
198
+ Normal generated output requires `ibex/runtime`. Embedded output concatenates
199
+ the runtime files named by `Runtime::EmbeddedSource` in dependency order. Thus
200
+ both modes use the same repository sources at generation time. Embedded output
201
+ does not consult an installed runtime and does not acquire later security,
202
+ correctness, or performance fixes: the application that chooses embedding owns
203
+ regeneration and redeployment. Loading embedded and installed copies into one
204
+ process is not a supported upgrade mechanism.
205
+
206
+ ### Syntax-session ABI classification
207
+
208
+ Adding `SyntaxSession` and its syntax-only repair proposal keeps parser-table
209
+ format v6 unchanged and adds methods and immutable result types to the current Ruby runtime API. Existing
210
+ non-embedded generated source remains byte-identical and acquires the API from
211
+ a compatible runtime-package upgrade. Embedded generated source copies runtime
212
+ implementation bytes, so its bytes change and regeneration plus redeployment
213
+ is required to acquire the API or later session correctness fixes. Existing
214
+ embedded parsers that are not regenerated retain their previous parsing
215
+ behavior but do not gain the new façade.
216
+
217
+ The repository contract can represent that combined assessment without
218
+ claiming a table-format bump. The conservative `regeneration: required` value
219
+ applies to the affected embedded artifacts; the rationale records why the
220
+ non-embedded path only needs a runtime upgrade:
221
+
222
+ ```yaml
223
+ state: compatible
224
+ surfaces: [runtime_api, embedded_runtime, cst]
225
+ abi_choice: current_contract
226
+ regeneration: required
227
+ rationale: Table v6 is unchanged and the runtime API is additive; embedded output bytes change and must be regenerated to acquire SyntaxSession.
228
+ affected_interactions: [incremental_cst, syntax_session, embedded_runtime]
229
+ evidence: [lib/ibex/runtime/cst/incremental/relexer.rb, lib/ibex/runtime/cst/incremental/session.rb, lib/ibex/runtime/syntax_session.rb, lib/ibex/runtime/parser.rb, lib/ibex/runtime/embedded_source.rb, test/runtime/syntax_session_test.rb, test/packaging/runtime_gem_test.rb]
230
+ tests: [test/runtime/cst_incremental_test.rb, test/runtime/syntax_session_test.rb, test/packaging/runtime_gem_test.rb]
231
+ verification: [bundle exec rake quality:runtime_abi, bundle exec ruby -Itest test/runtime/cst_incremental_test.rb, bundle exec ruby -Itest test/runtime/syntax_session_test.rb, bundle exec ruby -Itest test/packaging/runtime_gem_test.rb]
232
+ ```
233
+
234
+ ## Sidecar, IR version, or table-format version
235
+
236
+ Choose the boundary by its consumer:
237
+
238
+ - Use a sidecar for optional generation, review, or editor metadata that the
239
+ parser does not need to accept input and whose absence preserves behavior.
240
+ - Use a new Grammar, Automaton, or Lexer IR version when persisted generator
241
+ input changes shape or meaning, even if generated runtime tables do not.
242
+ - Use a new parser-table format when runtime execution needs a required field,
243
+ new action convention, or changed table meaning before or during parsing.
244
+ - Use both IR and table versions when the persisted construction contract and
245
+ the runtime execution contract both change.
246
+
247
+ An optional table field is not automatically safe: if its absence selects new
248
+ behavior or changes execution, it belongs behind a new format. Conversely,
249
+ large diagnostics that never affect execution should not inflate every parser
250
+ table merely to avoid a sidecar.
251
+
252
+ ## Pull-request ABI assessment
253
+
254
+ The pull-request template contains a delimited YAML assessment. CI parses only
255
+ that block and requires the exact declared fields when a changed path matches
256
+ `runtime_paths` above. Free-form prose outside the block is not evidence.
257
+
258
+ `compatible` means the change keeps a current contract or adds a sidecar.
259
+ `breaking` selects a new table format, IR version, or runtime major version. A
260
+ new table format requires regeneration. An IR-only or Ruby-runtime-API break
261
+ must still make an explicit `required`/`not_required` regeneration decision;
262
+ application migration can be required even when parser regeneration is not.
263
+ `not_applicable` is accepted only when no declared runtime-facing path changed.
264
+ Every changed runtime-facing path must appear in `evidence`; additional evidence
265
+ must be a changed path or an existing regression test. `affected_interactions`
266
+ uses ids from the test-interaction contract, and every listed interaction owns
267
+ at least one path in `tests`. `verification` accepts only reviewed repository
268
+ commands and must run the ABI gate plus the owned tests (or the full suite).
269
+ The validator checks these relationships, while reviewers remain responsible
270
+ for judging the rationale and whether all affected surfaces were identified.
271
+ The deterministic rationale screen checks only structure: the value must be a
272
+ non-empty string containing a Unicode letter, and it must not equal the exact
273
+ repository-owned template sentinel after whitespace normalization. It does not
274
+ classify general placeholders, identifiers, repetition, entropy, or semantic
275
+ substance. Japanese, Arabic, and other writing systems are accepted. Reviewers
276
+ must decide whether the rationale actually explains compatibility and whether
277
+ TODO-like text is acceptable in context.
278
+
279
+ The structured choice table is closed:
280
+
281
+ | `abi_choice` | Required state | Required surface | Regeneration |
282
+ | --- | --- | --- | --- |
283
+ | `current_contract` | `compatible` | one or more concrete surfaces | `required` or `not_required` must be decided |
284
+ | `sidecar` | `compatible` | exactly `generation_metadata` | `not_required` |
285
+ | `new_table_format` | `breaking` | includes `parser_table` | `required` |
286
+ | `new_ir_version` | `breaking` | includes `grammar_ir`, `automaton_ir`, or `lexer_ir` | `required` or `not_required` must be decided |
287
+ | `new_runtime_major` | `breaking` | includes `runtime_api` or `embedded_runtime` | `required` or `not_required` must be decided |
288
+ | `none` | only a non-runtime change | `none` | `not_applicable` |
289
+
290
+ Runtime-facing changes cannot use `none` or `not_applicable`. A rationale must
291
+ replace the exact template sentinel and contain a Unicode letter; required human
292
+ review decides whether it is substantive. Verification commands are parsed as
293
+ arguments, not executed by the validator; shell composition, arbitrary
294
+ commands, unowned test files, and evidence-only README links are rejected.
295
+
296
+ Run the contract-only `bundle exec rake quality:runtime_abi` locally.
297
+ Pull-request CI uses a minimal dedicated job to invoke the separate
298
+ `quality:runtime_abi_pr` entry with its event path and name explicitly. That PR
299
+ gate derives the changed path list from
300
+ the event's exact base and head SHAs without GitHub API writes or elevated
301
+ permissions. It parses `runtime_paths` from the exact
302
+ trusted base revision and unions those paths with the head policy, so a pull
303
+ request cannot exempt its own changes merely by shrinking the head contract.
304
+ Only the first explicit addition of this contract can use the fixed bootstrap
305
+ path set. Repository rules must still require this check and review changes to
306
+ the workflow and validator: code running solely from an untrusted head cannot
307
+ defend against deletion or malicious replacement of the gate that launches it.
data/docs/stability.md ADDED
@@ -0,0 +1,234 @@
1
+ ---
2
+ title: Stability policy
3
+ description: Compatibility, promotion, deprecation, and feature-development rules for Ibex.
4
+ ---
5
+
6
+ # Stability, compatibility, and deprecation
7
+
8
+ Ibex separates support level from activation. Opt-in controls do not determine
9
+ maturity: a documented opt-in API can be Stable, Preview, or Experimental.
10
+
11
+ ## Maturity ladder
12
+
13
+ | Level | Activation | Guarantee |
14
+ |---|---|---|
15
+ | Stable | Default compatible mode or a documented stable API | Semantic versioning; compatible-mode behavior remains unchanged |
16
+ | Preview | Feature-specific; compatible/default or explicit as recorded in the maturity audit | Before v1.0: changeable with a migration note; after v1.0: one-minor notice |
17
+ | Experimental | Explicit policy/object or research entry point | May change without notice; budgets and failure modes are part of the experiment |
18
+
19
+ After v1.0, promotion requires representative use in a shadow or gallery
20
+ grammar, feature-specific invariant/property tests, two released versions
21
+ without a specification change, dependent-tool support where applicable, and
22
+ complete public documentation. For the initial v1.0 contract, accepted ADRs,
23
+ versioned benchmark evidence, invariant/property coverage, dependent-tool
24
+ support where applicable, and complete public documentation replace the
25
+ impossible two-prior-release requirement. Only Stable features may be adopted
26
+ by the production self-hosted grammar.
27
+
28
+ Before v1.0, Preview is an evolving product boundary rather than a general
29
+ backward-compatibility promise. A pre-v1 Preview change is allowed when the
30
+ same change includes a release-note or migration note, updated black-box
31
+ regressions, and a refreshed maturity record. Consumers of a Preview feature
32
+ must therefore pin a pre-release or be prepared to migrate. After v1.0,
33
+ Preview receives the one-minor notice described in the deprecation policy.
34
+
35
+ Middle actions are accepted in compatible/default grammar productions and
36
+ therefore remain under the Stable compatibility lock; their Preview row is
37
+ retained only for traceability while its redundant classification is
38
+ redesigned. Most other Preview surfaces require an extended declaration,
39
+ command, or option. The [maturity audit](maturity.md) records activation and
40
+ Stable overlap separately.
41
+
42
+ ## Execution trust is independent of maturity
43
+
44
+ Stable, Preview, and Experimental describe compatibility and promotion, not
45
+ sandbox strength. Static grammar and IR tools do not execute parser actions,
46
+ generated lexer actions, or `header` / `inner` / `footer` sections. Generated
47
+ lexer semantic parses execute parser and lexer actions. Handwritten pull and
48
+ caller-fed semantic parses execute parser actions but do not invoke the
49
+ generated lexer. Generated syntax-only parses suppress parser production
50
+ actions but still execute generated lexer actions. All generated runtime paths
51
+ may load user sections and are trusted application code, not sandboxes.
52
+
53
+ A future nonexecuting syntax profile is a separate product contract. It must
54
+ require a declarative built-in-only lexer and reject all user-code sections;
55
+ neither the Stable batch CST API nor the Experimental incremental API currently
56
+ makes that guarantee. See the [execution trust matrix](../README.md#execution-trust-matrix).
57
+
58
+ ## Feature development budget
59
+
60
+ Feature development is not frozen. A `HOLD` release decision blocks publication
61
+ of that release candidate, not investigation or feature development. The
62
+ following limits keep new work reviewable:
63
+
64
+ - at most three active new Preview development tracks;
65
+ - at most one of those tracks may introduce grammar syntax; and
66
+ - at most five Experimental product features.
67
+
68
+ A development track starts when its first user-visible change is merged and
69
+ ends when the feature becomes Stable or Experimental, or is removed. An
70
+ investigation, an ADR, and an unmerged spike do not consume the budget. An
71
+ existing Preview feature consumes a track only while its specification is being
72
+ changed; promotion work that preserves its specification does not.
73
+
74
+ There is currently one active Preview development track: root declarative
75
+ parser construction. It consumes the one grammar-syntax slot while extending
76
+ the existing Preview IELR and multiple-entry surfaces; it is not a Stable
77
+ promotion. A pull request that starts or ends a track must update this
78
+ statement and the inventory below.
79
+ These limits do not relax the core IR contracts described under
80
+ [Core IR freeze](#core-ir-freeze), but they do permit retiring an unpromoted
81
+ Preview implementation when its maintenance cost exceeds its evidence.
82
+
83
+ ## v1 inventory
84
+
85
+ Stable:
86
+
87
+ - racc-compatible grammar input and generated `do_parse`/`yyparse` runtime;
88
+ - default direct LALR construction, parser tables, recovery callbacks,
89
+ observation events, resource limits, migration checks, and bounded
90
+ counterexample/ambiguity analysis;
91
+ - current core Grammar IR and Automaton IR, independently versioned Lexer IR, table formats, report
92
+ schemas, and their validators;
93
+ - format-v6 Red/Green batch CST parsing, typed syntax views, persistent editing
94
+ and diffing, and the closed `ibex_cst` schema v1 serialization contract.
95
+
96
+ Preview and Experimental:
97
+
98
+ The machine-readable [maturity audit](maturity.md) re-evaluates every current
99
+ feature. All eighteen Preview and both Experimental features remain at their
100
+ current maturity. The canonical summary below is generated from that registry
101
+ and checked against both public documents.
102
+
103
+ <!-- maturity-summary:start -->
104
+ Inventory: **18 Preview, 2 Experimental**. Active new Preview tracks: **1/3** (grammar syntax: **1/1**). Experimental product features: **2/5**.
105
+ Release dependency state: R001 **hold_external**; R002 **pending_exact_revision**; no feature is promoted by this audit.
106
+
107
+ | Stable ID | Feature | Current maturity | Decision | External use | Release gate |
108
+ | --- | --- | --- | --- | --- | --- |
109
+ | `ebnf-groups` | EBNF groups | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
110
+ | `parameterized-rules` | parameterized rules | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
111
+ | `inline-rules` | inline rules | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
112
+ | `middle-actions` | middle actions | Preview | Redesign Preview | not demonstrated | Blocked: R001, R002 |
113
+ | `multiple-entries` | multiple entries | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
114
+ | `canonical-imports` | canonical imports | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
115
+ | `generated-lexers` | generated lexers | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
116
+ | `semantic-locations-types` | semantic locations/types | Preview | Redesign Preview | not demonstrated | Blocked: R001, R002 |
117
+ | `ast-generation` | AST generation | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
118
+ | `grammar-tests` | grammar tests | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
119
+ | `documentation-tooling` | documentation tooling | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
120
+ | `ielr` | IELR | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
121
+ | `lsp` | LSP | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
122
+ | `watch` | watch | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
123
+ | `debug` | debug | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
124
+ | `coverage` | coverage | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
125
+ | `browser-playground` | browser playground | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
126
+ | `action-shadow` | action-shadow | Preview | Keep Preview | not demonstrated | Blocked: R001, R002 |
127
+ | `bounded-repair` | bounded repair | Experimental | Keep Experimental | not demonstrated | Blocked: R001, R002 |
128
+ | `incremental-cst` | incremental CST | Experimental | Keep Experimental | not demonstrated | Blocked: R001, R002 |
129
+ <!-- maturity-summary:end -->
130
+
131
+ The batch CST contract is selected for the initial v1 API under the
132
+ initial-major evidence rule above. The remaining Preview features have not
133
+ completed the normal two-release field period. Repair passed its usefulness
134
+ spike but remains Experimental because two of ten baseline plans were not
135
+ useful and inserted semantic values may be nil.
136
+
137
+ ## Research decisions
138
+
139
+ - The Stage A matrix, golden, reproducibility, schema, adversarial, gallery,
140
+ fuzzing, dependency, and network gates now make feature-off and
141
+ algorithm-crossing regressions reviewable before promotion.
142
+ - Independent verification detects all twenty committed structural table
143
+ faults across every gallery/algorithm/table combination.
144
+ - Bounded grammar comparison distinguishes concrete shortest differences from
145
+ completed searches with no difference and never labels the latter a proof.
146
+ - Conflict repair passed its first fixed twenty-case capability measurement at
147
+ 20/20. The corpus is intentionally described as a regression baseline, not
148
+ a general repair-rate claim.
149
+ - The analysis-only Bison adapter imports and builds five checksum-pinned
150
+ external grammars. Bison-era CRuby production counts match, its one-state
151
+ acceptance-convention delta is explained, and current Lrama-only `%rule`
152
+ structure is reported as incomplete instead of receiving unsafe repairs.
153
+ - IELR passed its correctness/state-bound spike and remains preview while it
154
+ gains field experience. Direct LALR remains the default.
155
+ - Bounded repair passed SP-4 with 8/10 useful plans and remains experimental.
156
+ - GLR and `%dprec`/`%merge` did not enter the product: no delayed-action spike
157
+ met the ≤5% deterministic-overhead and ambiguity-policy gates.
158
+ - Syntax-only incremental parsing entered as experimental after fixed-seed
159
+ structural edits matched fresh Green trees and the representative benchmark
160
+ measured 1.04–2.83x over Stage A and 1.66–4.48x over fresh syntax sessions.
161
+ It remains experimental until it completes the two-release field period.
162
+
163
+ The supported alternatives are canonical LR(1) or IELR for LALR inadequacy,
164
+ bounded ambiguity/counterexample analysis for ambiguous grammars, and
165
+ `--watch` with full deterministic reparsing for editing workflows.
166
+
167
+ ## Core IR contract
168
+
169
+ Grammar IR and Automaton IR each have one current closed format. Their required
170
+ fields, meanings, identity rules, ordering, and validation semantics are
171
+ reviewed as one contract. Older documents are rejected at the load boundary;
172
+ there is no compatibility reader or migration command for either document.
173
+
174
+ Before v1.0, an incompatible change to either current IR is a coordinated
175
+ contract change: update the writer, reader, schemas, fixtures, and downstream
176
+ consumers together. No legacy format is retained only to avoid a pre-release
177
+ breaking change.
178
+
179
+ Additive fields and meaning changes are deliberate schema changes with updated
180
+ evidence. Current schemas remain closed and reject unknown fields.
181
+
182
+ The `x-` namespace is reserved for future experimental data and is not frozen.
183
+ Current closed schemas intentionally reject unknown fields and do not emit
184
+ `x-` data. Introducing an experimental envelope therefore requires a new
185
+ additive schema version; it cannot silently place fields into an existing
186
+ closed document. Promotion moves reviewed data into a documented core field in
187
+ a later schema version.
188
+
189
+ ## Compatibility policy
190
+
191
+ <!-- stable:compatibility-policy:v1 -->
192
+
193
+ Compatible mode is the permanent default. Opt-in extensions, exact lookahead
194
+ defaults, repair, and research algorithms do not silently replace compatible
195
+ behavior. Public migration evidence uses public commands and black-box
196
+ behavior; implementation and generated-source layouts are not compatibility
197
+ surfaces.
198
+
199
+ An undeclared invalid token intentionally calls `on_error` before ordinary yacc
200
+ recovery. This is the documented recommended behavior and is not changed by
201
+ the freeze.
202
+
203
+ Parser-table format v6 is the only runtime table contract and the only table
204
+ writer. Older generated tables fail before token consumption with a
205
+ regeneration instruction; they are not a pre-v1 compatibility obligation.
206
+ The current Grammar IR adds generator-owned parser configuration without changing that
207
+ runtime table contract. The closed `ibex_cst` schema v1 is a versioned
208
+ interchange contract. Additive meaning requires a new schema version; readers
209
+ do not accept unknown fields.
210
+
211
+ ## Evidence is not compatibility
212
+
213
+ Exact source digests and clean-revision bindings establish what an evidence
214
+ record measured. They are audit-integrity requirements, not promises that a
215
+ consumer can execute an old generated artifact or reuse an old working-tree
216
+ capture. Historical evidence remains immutable for auditability; current
217
+ evidence must be regenerated and rebound after a relevant source or policy
218
+ change. A stale-evidence failure therefore means “refresh the measurement,”
219
+ not “preserve the old implementation forever.”
220
+
221
+ ## Deprecation policy
222
+
223
+ After v1.0, a Stable API or syntax first emits a migration warning for at least
224
+ two minor releases. The release notes and documentation must name the first
225
+ warning release, replacement, migration command or procedure, and earliest
226
+ removal release. Automated migration is supplied when practical; policy does
227
+ not promise a command that the product does not provide. Preview features
228
+ receive at least one minor release of notice only after v1.0; before v1.0 the
229
+ release-note and maturity-evidence rule above applies. Experimental features
230
+ may change without notice.
231
+
232
+ The pre-v1 mixed semantic/syntax CST was a Preview contract and is removed
233
+ while selecting the initial stable API. Its parser tables are rejected with a
234
+ regeneration instruction. There are no Stable removals scheduled.
data/docs/status.md ADDED
@@ -0,0 +1,43 @@
1
+ ---
2
+ title: Project status
3
+ description: Human-readable release status, maturity boundaries, and evidence links for Ibex.
4
+ ---
5
+
6
+ # Project status
7
+
8
+ Ibex is pre-1.0. The default compatible mode is the conservative adoption
9
+ baseline, while Preview and Experimental features require explicit activation
10
+ and have feature-specific boundaries.
11
+
12
+ ## Release decision
13
+
14
+ The v1.0 publication decision is currently on hold because the published error
15
+ experience evidence still needs an independent review. This blocks publication
16
+ of that release candidate; it does not freeze feature development. The current
17
+ Grammar IR, Automaton IR, table, report, and runtime contracts remain closed
18
+ and validated while Preview work continues under the stability policy.
19
+
20
+ The complete rationale and evidence limitations are in the [release readiness
21
+ report](release-readiness.md). The [error UX review status](error-ux-review-status-v1.json)
22
+ is the machine-readable record; this page is the human entry point.
23
+
24
+ ## Maturity at a glance
25
+
26
+ - **Stable baseline:** racc-compatible grammar input, default LALR construction,
27
+ current parser/runtime contracts, and format-v6 batch CST.
28
+ - **Preview:** extended grammar syntax, generated lexers, IELR, LSP, watch,
29
+ diagnostics, and the browser playground. These require explicit activation
30
+ or are bounded tools.
31
+ - **Experimental:** syntax-only incremental CST sessions and selected research
32
+ surfaces. They may change without the Stable compatibility promise.
33
+
34
+ Consult [maturity.md](maturity.md) and [stability.md](stability.md) for the
35
+ canonical feature registry, activation mechanism, and promotion requirements.
36
+
37
+ ## Evidence boundaries
38
+
39
+ Repository tests and bounded benchmarks are evidence for the recorded revision,
40
+ not universal performance claims. Comparative statements link to the relevant
41
+ [comparison policy](comparison-policy.md), [workload registry](workloads.md),
42
+ and release artifact. Ibex does not claim to be a sandbox: generated semantic
43
+ parsers execute application Ruby.