expressir 1.2.11-aarch64-linux → 2.4.29-aarch64-linux

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 (467) hide show
  1. checksums.yaml +4 -4
  2. data/.cargo/config.toml +3 -0
  3. data/.github/scripts/test_installed_gem.rb +34 -0
  4. data/.github/workflows/codeql.yml +35 -0
  5. data/.github/workflows/docs.yml +99 -0
  6. data/.github/workflows/links.yml +100 -0
  7. data/.github/workflows/native-gems.yml +201 -0
  8. data/.github/workflows/rake.yml +10 -296
  9. data/.github/workflows/release.yml +26 -114
  10. data/.github/workflows/rust-ext.yml +41 -0
  11. data/.github/workflows/stress.yml +36 -0
  12. data/.github/workflows/validate_schemas.yml +48 -0
  13. data/.github/workflows/verify_remarks.yml +33 -0
  14. data/.gitignore +33 -1
  15. data/.rubocop.yml +11 -11
  16. data/.rubocop_todo.yml +297 -0
  17. data/CHANGELOG.md +159 -0
  18. data/Gemfile +15 -1
  19. data/README.adoc +2675 -47
  20. data/Rakefile +34 -10
  21. data/TODO.bugs/01-stale-transformer-autoload.md +39 -0
  22. data/TODO.bugs/02-parser-class-instance-vars.md +36 -0
  23. data/TODO.bugs/03-builder-mutable-state.md +43 -0
  24. data/TODO.bugs/04-formatter-public-send-dispatch.md +53 -0
  25. data/TODO.bugs/05-anonymous-formatter-subclass.md +45 -0
  26. data/TODO.bugs/06-collection-registry-single-source.md +53 -0
  27. data/TODO.bugs/07-require-relative-cleanup.md +42 -0
  28. data/TODO.bugs/08-require-expressir-in-commands.md +34 -0
  29. data/TODO.bugs/09-parser-split.md +53 -0
  30. data/TODO.bugs/10-to-s-override.md +42 -0
  31. data/TODO.bugs/11-parser-class-variables.md +39 -0
  32. data/TODO.bugs/12-marker-modules-vs-registry.md +64 -0
  33. data/TODO.bugs/13-string-literal-scanner-limitation.md +52 -0
  34. data/TODO.bugs/14-model-formatting-leak.md +30 -0
  35. data/TODO.bugs/15-expression-children-macro.md +27 -0
  36. data/TODO.bugs/16-pretty-formatter-duplication.md +28 -0
  37. data/TODO.bugs/17-snake-case-cache-mutable-constant.md +28 -0
  38. data/TODO.bugs/18-const-get-private-constants.md +30 -0
  39. data/TODO.bugs/19-format-methods-public.md +22 -0
  40. data/TODO.bugs/20-coverage-nested-entities-dedup.md +20 -0
  41. data/TODO.bugs/21-operator-tokens-secondary-dispatch.md +21 -0
  42. data/TODO.bugs/22-builder-fast-path-wrappers.md +32 -0
  43. data/TODO.bugs/23-coverage-inverse-maps.md +21 -0
  44. data/TODO.bugs/24-streaming-builder-complexity.md +19 -0
  45. data/TODO.bugs/25-debug-puts-in-production.md +21 -0
  46. data/TODO.bugs/26-generic-entity-children-misplaced.md +21 -0
  47. data/TODO.bugs/27-package-build-god-method.md +19 -0
  48. data/TODO.bugs/28-package-god-class.md +30 -0
  49. data/TODO.bugs/29-validate-ascii-god-class.md +24 -0
  50. data/TODO.bugs/30-unicode-map-extraction.md +19 -0
  51. data/TODO.bugs/README.md +43 -0
  52. data/TODO.max-perf/01-restore-ci-green.md +36 -0
  53. data/TODO.max-perf/02-streaming-parse-path.md +31 -0
  54. data/TODO.max-perf/03-cli-parallel-opt-in.md +27 -0
  55. data/TODO.max-perf/04-benchmark-harness.md +28 -0
  56. data/TODO.max-perf/05-parallel-fidelity-specs.md +22 -0
  57. data/TODO.max-perf/06-builder-cpu-audit.md +41 -0
  58. data/TODO.max-perf/07-upstream-parsanol-roadmap.md +27 -0
  59. data/TODO.max-perf/08-builder-build-perf.md +45 -0
  60. data/TODO.max-perf/09-grammar-cold-start.md +25 -0
  61. data/TODO.max-perf/10-parser-facade-hygiene.md +23 -0
  62. data/TODO.max-perf/11-ci-green-closeout.md +25 -0
  63. data/TODO.max-perf/12-require-boot-profile.md +25 -0
  64. data/TODO.max-perf/13-key-conversion-specs.md +26 -0
  65. data/TODO.max-perf/14-builder-call-handler-audit.md +28 -0
  66. data/TODO.parity-ee/00-overview.md +76 -0
  67. data/TODO.parity-ee/01-annex-g-rule-extraction.md +41 -0
  68. data/TODO.parity-ee/02-eeng-algorithm-inventory.md +8 -0
  69. data/TODO.parity-ee/03-eeng-oracle-harness.md +33 -0
  70. data/TODO.parity-ee/04-shtolo-concatenate.md +44 -0
  71. data/TODO.parity-ee/05-shtolo-longform-flatten.md +53 -0
  72. data/TODO.parity-ee/06-interface-scheduling-parity.md +47 -0
  73. data/TODO.parity-ee/07-semantic-checks-port.md +35 -0
  74. data/TODO.parity-ee/08-pretty-roundtrip-gate.md +27 -0
  75. data/TODO.parity-ee/09-smrl-index-and-listing.md +22 -0
  76. data/TODO.parity-ee/10-interface-dot-graph.md +21 -0
  77. data/TODO.parity-ee/11-import-eeng-tests.md +79 -0
  78. data/TODO.parity-ee/12-full-check-catalog.md +67 -0
  79. data/TODO.parity-ee/13-population-p21.md +54 -0
  80. data/TODO.parity-ee/14-shtolo-completion.md +44 -0
  81. data/TODO.parity-ee/15-part28-xml.md +51 -0
  82. data/TODO.parity-ee/16-compare-patch.md +48 -0
  83. data/TODO.parity-ee/17-official-tests.md +42 -0
  84. data/TODO.parity-ee/18-mim-mapping.md +47 -0
  85. data/TODO.parity-ee/19-architecture.md +97 -0
  86. data/TODO.parity-ee/parity-matrix.md +108 -0
  87. data/TODO.refpath-v2/00-overview.md +64 -0
  88. data/TODO.suma-improvements/00-overview.md +23 -0
  89. data/TODO.suma-improvements/01-prebuilt-platform-gems.md +33 -0
  90. data/TODO.suma-improvements/02-suma-e2e.md +39 -0
  91. data/TODO.suma-improvements/03-item-graph.md +22 -0
  92. data/TODO.suma-improvements/04-compiled-set-default.md +16 -0
  93. data/TODO.suma-improvements/05-validation-in-docs.md +17 -0
  94. data/TODO.suma-improvements/06-memory-remeasure.md +36 -0
  95. data/TODO.suma-improvements/07-part28-xml.md +15 -0
  96. data/TODO.suma-improvements/08-windows-gnu-toolchain.md +15 -0
  97. data/TODO.suma-improvements/09-checker-tranche3.md +13 -0
  98. data/TODO.suma-improvements/10-expressdoc.md +8 -0
  99. data/benchmark/srl_benchmark.rb +458 -0
  100. data/benchmark/srl_native_benchmark.rb +146 -0
  101. data/benchmark/srl_ruby_benchmark.rb +132 -0
  102. data/bin/rspec +2 -1
  103. data/docs/Gemfile +12 -0
  104. data/docs/_config.yml +141 -0
  105. data/docs/_guides/changes/changes-format.adoc +778 -0
  106. data/docs/_guides/changes/importing-eengine.adoc +898 -0
  107. data/docs/_guides/changes/index.adoc +396 -0
  108. data/docs/_guides/changes/programmatic-usage.adoc +1038 -0
  109. data/docs/_guides/changes/validating-changes.adoc +681 -0
  110. data/docs/_guides/cli/benchmark-performance.adoc +834 -0
  111. data/docs/_guides/cli/coverage-analysis.adoc +921 -0
  112. data/docs/_guides/cli/format-schemas.adoc +547 -0
  113. data/docs/_guides/cli/index.adoc +8 -0
  114. data/docs/_guides/cli/managing-changes.adoc +927 -0
  115. data/docs/_guides/cli/validate-ascii.adoc +645 -0
  116. data/docs/_guides/cli/validate-schemas.adoc +534 -0
  117. data/docs/_guides/formatter/formatter-architecture.adoc +401 -0
  118. data/docs/_guides/index.adoc +165 -0
  119. data/docs/_guides/ler/creating-packages.adoc +664 -0
  120. data/docs/_guides/ler/index.adoc +305 -0
  121. data/docs/_guides/ler/loading-packages.adoc +707 -0
  122. data/docs/_guides/ler/package-formats.adoc +748 -0
  123. data/docs/_guides/ler/querying-packages.adoc +826 -0
  124. data/docs/_guides/ler/step-packages.adoc +385 -0
  125. data/docs/_guides/ler/validating-packages.adoc +750 -0
  126. data/docs/_guides/liquid/basic-templates.adoc +813 -0
  127. data/docs/_guides/liquid/documentation-generation.adoc +1042 -0
  128. data/docs/_guides/liquid/drops-reference.adoc +829 -0
  129. data/docs/_guides/liquid/filters-and-tags.adoc +912 -0
  130. data/docs/_guides/liquid/index.adoc +468 -0
  131. data/docs/_guides/manifests/creating-manifests.adoc +483 -0
  132. data/docs/_guides/manifests/index.adoc +307 -0
  133. data/docs/_guides/manifests/resolving-manifests.adoc +557 -0
  134. data/docs/_guides/manifests/validating-manifests.adoc +713 -0
  135. data/docs/_guides/ruby-api/formatting-schemas.adoc +605 -0
  136. data/docs/_guides/ruby-api/index.adoc +257 -0
  137. data/docs/_guides/ruby-api/parsing-files.adoc +421 -0
  138. data/docs/_guides/ruby-api/search-engine.adoc +609 -0
  139. data/docs/_guides/ruby-api/working-with-repository.adoc +577 -0
  140. data/docs/_pages/data-model.adoc +665 -0
  141. data/docs/_pages/express-language.adoc +506 -0
  142. data/docs/_pages/getting-started.adoc +414 -0
  143. data/docs/_pages/index.adoc +116 -0
  144. data/docs/_pages/introduction.adoc +256 -0
  145. data/docs/_pages/ler-packages.adoc +837 -0
  146. data/docs/_pages/parsers.adoc +709 -0
  147. data/docs/_pages/schema-manifests.adoc +431 -0
  148. data/docs/_references/index.adoc +228 -0
  149. data/docs/_tutorials/creating-ler-package.adoc +735 -0
  150. data/docs/_tutorials/documentation-coverage.adoc +795 -0
  151. data/docs/_tutorials/formatting-schemas.adoc +89 -0
  152. data/docs/_tutorials/index.adoc +231 -0
  153. data/docs/_tutorials/liquid-templates.adoc +806 -0
  154. data/docs/_tutorials/parsing-your-first-schema.adoc +522 -0
  155. data/docs/_tutorials/querying-schemas.adoc +751 -0
  156. data/docs/_tutorials/working-with-multiple-schemas.adoc +676 -0
  157. data/docs/index.adoc +242 -0
  158. data/docs/lychee.toml +90 -0
  159. data/examples/demo_ler_usage.sh +86 -0
  160. data/examples/ler/README.md +111 -0
  161. data/examples/ler/simple_example.ler +0 -0
  162. data/examples/ler/simple_schema.exp +33 -0
  163. data/examples/ler_build.rb +75 -0
  164. data/examples/ler_cli.rb +79 -0
  165. data/examples/ler_demo_complete.rb +276 -0
  166. data/examples/ler_query.rb +91 -0
  167. data/examples/ler_query_examples.rb +305 -0
  168. data/examples/ler_stats.rb +81 -0
  169. data/examples/phase3_demo.rb +159 -0
  170. data/examples/query_demo_simple.rb +131 -0
  171. data/exe/expressir +6 -17
  172. data/exe/expressir-format +14 -0
  173. data/exe/{format-test → expressir-format-test} +8 -7
  174. data/expressir.gemspec +50 -37
  175. data/lib/expressir/3.2/expressir_core.so +0 -0
  176. data/lib/expressir/3.3/expressir_core.so +0 -0
  177. data/lib/expressir/3.4/expressir_core.so +0 -0
  178. data/lib/expressir/4.0/expressir_core.so +0 -0
  179. data/lib/expressir/benchmark.rb +310 -0
  180. data/lib/expressir/changes/item_change.rb +20 -0
  181. data/lib/expressir/changes/mapping_change.rb +16 -0
  182. data/lib/expressir/changes/schema_change.rb +85 -0
  183. data/lib/expressir/changes/version_change.rb +26 -0
  184. data/lib/expressir/changes.rb +9 -0
  185. data/lib/expressir/cli.rb +138 -11
  186. data/lib/expressir/commands/base.rb +25 -0
  187. data/lib/expressir/commands/benchmark.rb +59 -0
  188. data/lib/expressir/commands/benchmark_cache.rb +80 -0
  189. data/lib/expressir/commands/changes.rb +34 -0
  190. data/lib/expressir/commands/changes_import_eengine.rb +146 -0
  191. data/lib/expressir/commands/changes_validate.rb +63 -0
  192. data/lib/expressir/commands/check.rb +56 -0
  193. data/lib/expressir/commands/clean.rb +20 -0
  194. data/lib/expressir/commands/coverage.rb +458 -0
  195. data/lib/expressir/commands/expand.rb +26 -0
  196. data/lib/expressir/commands/file_violations.rb +70 -0
  197. data/lib/expressir/commands/fix.rb +33 -0
  198. data/lib/expressir/commands/flatten.rb +29 -0
  199. data/lib/expressir/commands/format.rb +43 -0
  200. data/lib/expressir/commands/manifest.rb +420 -0
  201. data/lib/expressir/commands/mapping_validate.rb +68 -0
  202. data/lib/expressir/commands/non_ascii_character.rb +49 -0
  203. data/lib/expressir/commands/non_ascii_violation_collection.rb +301 -0
  204. data/lib/expressir/commands/package.rb +1222 -0
  205. data/lib/expressir/commands/parity_inputs.rb +160 -0
  206. data/lib/expressir/commands/validate.rb +106 -0
  207. data/lib/expressir/commands/validate_ascii.rb +94 -0
  208. data/lib/expressir/commands/validate_load.rb +91 -0
  209. data/lib/expressir/commands/version.rb +9 -0
  210. data/lib/expressir/commands/xsd.rb +23 -0
  211. data/lib/expressir/commands.rb +30 -0
  212. data/lib/expressir/config.rb +40 -3
  213. data/lib/expressir/coverage.rb +510 -0
  214. data/lib/expressir/eengine/arm_compare_report.rb +23 -0
  215. data/lib/expressir/eengine/changes_section.rb +16 -0
  216. data/lib/expressir/eengine/compare_report.rb +69 -0
  217. data/lib/expressir/eengine/mim_compare_report.rb +23 -0
  218. data/lib/expressir/eengine/modified_object.rb +21 -0
  219. data/lib/expressir/eengine.rb +9 -0
  220. data/lib/expressir/errors.rb +113 -0
  221. data/lib/expressir/express/adoc_hyperlink_formatter.rb +30 -0
  222. data/lib/expressir/express/adoc_source_formatter.rb +12 -0
  223. data/lib/expressir/express/ast_key_converter.rb +114 -0
  224. data/lib/expressir/express/builder.rb +277 -0
  225. data/lib/expressir/express/builder_context.rb +22 -0
  226. data/lib/expressir/express/builder_registry.rb +397 -0
  227. data/lib/expressir/express/builders/attribute_decl_builder.rb +32 -0
  228. data/lib/expressir/express/builders/built_in_builder.rb +75 -0
  229. data/lib/expressir/express/builders/constant_builder.rb +108 -0
  230. data/lib/expressir/express/builders/declaration_builder.rb +20 -0
  231. data/lib/expressir/express/builders/derive_clause_builder.rb +14 -0
  232. data/lib/expressir/express/builders/derived_attr_builder.rb +28 -0
  233. data/lib/expressir/express/builders/domain_rule_builder.rb +21 -0
  234. data/lib/expressir/express/builders/entity_decl_builder.rb +116 -0
  235. data/lib/expressir/express/builders/explicit_attr_builder.rb +49 -0
  236. data/lib/expressir/express/builders/expression_builder.rb +416 -0
  237. data/lib/expressir/express/builders/function_decl_builder.rb +86 -0
  238. data/lib/expressir/express/builders/helpers.rb +148 -0
  239. data/lib/expressir/express/builders/interface_builder.rb +151 -0
  240. data/lib/expressir/express/builders/inverse_attr_builder.rb +43 -0
  241. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +30 -0
  242. data/lib/expressir/express/builders/inverse_clause_builder.rb +14 -0
  243. data/lib/expressir/express/builders/literal_builder.rb +93 -0
  244. data/lib/expressir/express/builders/procedure_decl_builder.rb +82 -0
  245. data/lib/expressir/express/builders/qualifier_builder.rb +102 -0
  246. data/lib/expressir/express/builders/reference_builder.rb +18 -0
  247. data/lib/expressir/express/builders/rule_decl_builder.rb +97 -0
  248. data/lib/expressir/express/builders/schema_body_decl_builder.rb +18 -0
  249. data/lib/expressir/express/builders/schema_decl_builder.rb +56 -0
  250. data/lib/expressir/express/builders/schema_version_builder.rb +34 -0
  251. data/lib/expressir/express/builders/simple_id_builder.rb +17 -0
  252. data/lib/expressir/express/builders/statement_builder.rb +243 -0
  253. data/lib/expressir/express/builders/subtype_constraint_builder.rb +166 -0
  254. data/lib/expressir/express/builders/syntax_builder.rb +30 -0
  255. data/lib/expressir/express/builders/type_builder.rb +238 -0
  256. data/lib/expressir/express/builders/type_decl_builder.rb +26 -0
  257. data/lib/expressir/express/builders/unique_clause_builder.rb +20 -0
  258. data/lib/expressir/express/builders/unique_rule_builder.rb +41 -0
  259. data/lib/expressir/express/builders/where_clause_builder.rb +20 -0
  260. data/lib/expressir/express/builders.rb +55 -0
  261. data/lib/expressir/express/cache.rb +43 -18
  262. data/lib/expressir/express/checker.rb +812 -0
  263. data/lib/expressir/express/concatenator.rb +79 -0
  264. data/lib/expressir/express/core.rb +95 -0
  265. data/lib/expressir/express/error.rb +124 -0
  266. data/lib/expressir/express/formatter.rb +89 -1548
  267. data/lib/expressir/express/formatters/data_types_formatter.rb +362 -0
  268. data/lib/expressir/express/formatters/declarations_formatter.rb +753 -0
  269. data/lib/expressir/express/formatters/expressions_formatter.rb +180 -0
  270. data/lib/expressir/express/formatters/literals_formatter.rb +55 -0
  271. data/lib/expressir/express/formatters/references_formatter.rb +53 -0
  272. data/lib/expressir/express/formatters/remark_formatter.rb +270 -0
  273. data/lib/expressir/express/formatters/remark_item_formatter.rb +28 -0
  274. data/lib/expressir/express/formatters/statements_formatter.rb +272 -0
  275. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +54 -0
  276. data/lib/expressir/express/formatters.rb +22 -0
  277. data/lib/expressir/express/grammar/parser.rb +712 -0
  278. data/lib/expressir/express/grammar.rb +11 -0
  279. data/lib/expressir/express/hyperlink_formatter.rb +4 -5
  280. data/lib/expressir/express/interface_dot.rb +105 -0
  281. data/lib/expressir/express/lazy_repository.rb +211 -0
  282. data/lib/expressir/express/line_map.rb +48 -0
  283. data/lib/expressir/express/listing.rb +174 -0
  284. data/lib/expressir/express/model_traversal.rb +42 -0
  285. data/lib/expressir/express/model_visitor.rb +11 -10
  286. data/lib/expressir/express/node_position_index.rb +342 -0
  287. data/lib/expressir/express/parallel_files.rb +229 -0
  288. data/lib/expressir/express/parser.rb +501 -62
  289. data/lib/expressir/express/pretty_formatter.rb +586 -0
  290. data/lib/expressir/express/pretty_gate.rb +61 -0
  291. data/lib/expressir/express/refs_overlay.rb +47 -0
  292. data/lib/expressir/express/remark_attacher.rb +1098 -0
  293. data/lib/expressir/express/remark_overlay.rb +86 -0
  294. data/lib/expressir/express/remark_scanner.rb +245 -0
  295. data/lib/expressir/express/resolve_references_model_visitor.rb +7 -9
  296. data/lib/expressir/express/schema_block_scanner.rb +137 -0
  297. data/lib/expressir/express/schema_head_formatter.rb +4 -5
  298. data/lib/expressir/express/schema_plain_source_formatter.rb +11 -0
  299. data/lib/expressir/express/schema_source_formatter.rb +15 -0
  300. data/lib/expressir/express/scope_resolver.rb +223 -0
  301. data/lib/expressir/express/self_schema_reference.rb +126 -0
  302. data/lib/expressir/express/shtolo.rb +679 -0
  303. data/lib/expressir/express/smrl_xml.rb +125 -0
  304. data/lib/expressir/express/source_formatter.rb +15 -0
  305. data/lib/expressir/express/streaming_builder.rb +435 -0
  306. data/lib/expressir/express/xsd.rb +259 -0
  307. data/lib/expressir/express.rb +53 -0
  308. data/lib/expressir/liquid.rb +1 -0
  309. data/lib/expressir/manifest/resolver.rb +210 -0
  310. data/lib/expressir/manifest/validator.rb +192 -0
  311. data/lib/expressir/manifest.rb +6 -0
  312. data/lib/expressir/mapping/refpath.rb +857 -0
  313. data/lib/expressir/mapping.rb +253 -0
  314. data/lib/expressir/model/cache.rb +10 -9
  315. data/lib/expressir/model/concerns.rb +42 -0
  316. data/lib/expressir/model/data_types/aggregate.rb +8 -13
  317. data/lib/expressir/model/data_types/array.rb +15 -21
  318. data/lib/expressir/model/data_types/bag.rb +11 -15
  319. data/lib/expressir/model/data_types/binary.rb +9 -12
  320. data/lib/expressir/model/data_types/boolean.rb +7 -2
  321. data/lib/expressir/model/data_types/enumeration.rb +11 -15
  322. data/lib/expressir/model/data_types/enumeration_item.rb +5 -7
  323. data/lib/expressir/model/data_types/generic.rb +6 -8
  324. data/lib/expressir/model/data_types/generic_entity.rb +11 -13
  325. data/lib/expressir/model/data_types/integer.rb +7 -2
  326. data/lib/expressir/model/data_types/list.rb +13 -18
  327. data/lib/expressir/model/data_types/logical.rb +7 -2
  328. data/lib/expressir/model/data_types/number.rb +7 -2
  329. data/lib/expressir/model/data_types/real.rb +7 -9
  330. data/lib/expressir/model/data_types/select.rb +13 -18
  331. data/lib/expressir/model/data_types/set.rb +11 -15
  332. data/lib/expressir/model/data_types/string.rb +9 -12
  333. data/lib/expressir/model/data_types.rb +25 -0
  334. data/lib/expressir/model/declarations/attribute.rb +19 -28
  335. data/lib/expressir/model/declarations/constant.rb +10 -16
  336. data/lib/expressir/model/declarations/derived_attribute.rb +25 -0
  337. data/lib/expressir/model/declarations/entity.rb +39 -30
  338. data/lib/expressir/model/declarations/function.rb +32 -40
  339. data/lib/expressir/model/declarations/informal_proposition_rule.rb +25 -0
  340. data/lib/expressir/model/declarations/interface.rb +25 -16
  341. data/lib/expressir/model/declarations/interface_item.rb +9 -11
  342. data/lib/expressir/model/declarations/interfaced_item.rb +15 -19
  343. data/lib/expressir/model/declarations/inverse_attribute.rb +25 -0
  344. data/lib/expressir/model/declarations/parameter.rb +10 -16
  345. data/lib/expressir/model/declarations/procedure.rb +30 -37
  346. data/lib/expressir/model/declarations/remark_item.rb +11 -11
  347. data/lib/expressir/model/declarations/rule.rb +38 -43
  348. data/lib/expressir/model/declarations/schema.rb +162 -64
  349. data/lib/expressir/model/declarations/schema_version.rb +8 -11
  350. data/lib/expressir/model/declarations/schema_version_item.rb +8 -11
  351. data/lib/expressir/model/declarations/subtype_constraint.rb +14 -22
  352. data/lib/expressir/model/declarations/type.rb +18 -18
  353. data/lib/expressir/model/declarations/unique_rule.rb +8 -13
  354. data/lib/expressir/model/declarations/variable.rb +10 -16
  355. data/lib/expressir/model/declarations/where_rule.rb +8 -13
  356. data/lib/expressir/model/declarations.rb +31 -0
  357. data/lib/expressir/model/dependency_resolver.rb +268 -0
  358. data/lib/expressir/model/exp_file.rb +42 -0
  359. data/lib/expressir/model/expressions/aggregate_initializer.rb +8 -9
  360. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +10 -12
  361. data/lib/expressir/model/expressions/binary_expression.rb +42 -36
  362. data/lib/expressir/model/expressions/entity_constructor.rb +10 -12
  363. data/lib/expressir/model/expressions/function_call.rb +10 -12
  364. data/lib/expressir/model/expressions/interval.rb +18 -23
  365. data/lib/expressir/model/expressions/query_expression.rb +11 -15
  366. data/lib/expressir/model/expressions/unary_expression.rb +13 -15
  367. data/lib/expressir/model/expressions.rb +18 -0
  368. data/lib/expressir/model/identifier.rb +18 -26
  369. data/lib/expressir/model/indexes/entity_index.rb +103 -0
  370. data/lib/expressir/model/indexes/item_graph.rb +185 -0
  371. data/lib/expressir/model/indexes/reference_index.rb +148 -0
  372. data/lib/expressir/model/indexes/type_index.rb +149 -0
  373. data/lib/expressir/model/indexes.rb +12 -0
  374. data/lib/expressir/model/interface_validator.rb +384 -0
  375. data/lib/expressir/model/literals/binary.rb +7 -9
  376. data/lib/expressir/model/literals/integer.rb +7 -9
  377. data/lib/expressir/model/literals/logical.rb +10 -12
  378. data/lib/expressir/model/literals/real.rb +7 -9
  379. data/lib/expressir/model/literals/string.rb +10 -12
  380. data/lib/expressir/model/literals.rb +13 -0
  381. data/lib/expressir/model/model_element.rb +286 -117
  382. data/lib/expressir/model/references/attribute_reference.rb +9 -12
  383. data/lib/expressir/model/references/group_reference.rb +9 -12
  384. data/lib/expressir/model/references/index_reference.rb +11 -15
  385. data/lib/expressir/model/references/simple_reference.rb +11 -14
  386. data/lib/expressir/model/references.rb +12 -0
  387. data/lib/expressir/model/remark_format.rb +17 -0
  388. data/lib/expressir/model/remark_info.rb +92 -0
  389. data/lib/expressir/model/remark_placement.rb +42 -0
  390. data/lib/expressir/model/repository.rb +472 -12
  391. data/lib/expressir/model/repository_validator.rb +293 -0
  392. data/lib/expressir/model/search_engine.rb +551 -0
  393. data/lib/expressir/model/statements/alias.rb +12 -16
  394. data/lib/expressir/model/statements/assignment.rb +12 -11
  395. data/lib/expressir/model/statements/case.rb +31 -14
  396. data/lib/expressir/model/statements/case_action.rb +9 -11
  397. data/lib/expressir/model/statements/compound.rb +10 -8
  398. data/lib/expressir/model/statements/escape.rb +10 -2
  399. data/lib/expressir/model/statements/if.rb +15 -14
  400. data/lib/expressir/model/statements/null.rb +10 -2
  401. data/lib/expressir/model/statements/procedure_call.rb +11 -11
  402. data/lib/expressir/model/statements/repeat.rb +21 -28
  403. data/lib/expressir/model/statements/return.rb +9 -8
  404. data/lib/expressir/model/statements/skip.rb +10 -2
  405. data/lib/expressir/model/statements.rb +20 -0
  406. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +13 -17
  407. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +7 -9
  408. data/lib/expressir/model/supertype_expressions.rb +12 -0
  409. data/lib/expressir/model.rb +38 -78
  410. data/lib/expressir/package/builder.rb +231 -0
  411. data/lib/expressir/package/metadata.rb +79 -0
  412. data/lib/expressir/package/reader.rb +149 -0
  413. data/lib/expressir/package.rb +8 -0
  414. data/lib/expressir/schema_manifest.rb +159 -0
  415. data/lib/expressir/schema_manifest_entry.rb +15 -0
  416. data/lib/expressir/version.rb +6 -1
  417. data/lib/expressir.rb +79 -9
  418. data/lib/tasks/verify_remarks.rake +16 -0
  419. data/rakelib/native.rake +24 -0
  420. data/rakelib/oracle.rake +52 -0
  421. data/rakelib/verify_remarks.rake +16 -0
  422. metadata +431 -129
  423. data/.cross_rubies +0 -20
  424. data/.gitmodules +0 -6
  425. data/.yardopts +0 -11
  426. data/docs/development.md +0 -90
  427. data/exe/format +0 -18
  428. data/exe/generate-parser +0 -51
  429. data/lib/expressir/cli/ui.rb +0 -36
  430. data/lib/expressir/express/2.7/express_parser.so +0 -0
  431. data/lib/expressir/express/3.0/express_parser.so +0 -0
  432. data/lib/expressir/express/3.1/express_parser.so +0 -0
  433. data/lib/expressir/express/3.2/express_parser.so +0 -0
  434. data/lib/expressir/express/visitor.rb +0 -2588
  435. data/lib/expressir/model/data_type.rb +0 -9
  436. data/lib/expressir/model/declaration.rb +0 -9
  437. data/lib/expressir/model/expression.rb +0 -9
  438. data/lib/expressir/model/literal.rb +0 -9
  439. data/lib/expressir/model/reference.rb +0 -9
  440. data/lib/expressir/model/statement.rb +0 -9
  441. data/lib/expressir/model/supertype_expression.rb +0 -9
  442. data/rakelib/antlr4-native.rake +0 -161
  443. data/rakelib/cross-ruby.rake +0 -368
  444. data/spec/acceptance/version_spec.rb +0 -27
  445. data/spec/expressir/express/cache_spec.rb +0 -89
  446. data/spec/expressir/express/formatter_spec.rb +0 -173
  447. data/spec/expressir/express/parser_spec.rb +0 -141
  448. data/spec/expressir/model/model_element_spec.rb +0 -318
  449. data/spec/spec_helper.rb +0 -24
  450. data/spec/support/console_helper.rb +0 -29
  451. data/spec/syntax/multiple.exp +0 -23
  452. data/spec/syntax/multiple.yaml +0 -198
  453. data/spec/syntax/multiple_formatted.exp +0 -71
  454. data/spec/syntax/multiple_hyperlink_formatted.exp +0 -71
  455. data/spec/syntax/multiple_schema_head_hyperlink_formatted.exp +0 -13
  456. data/spec/syntax/remark.exp +0 -193
  457. data/spec/syntax/remark.yaml +0 -471
  458. data/spec/syntax/remark_formatted.exp +0 -228
  459. data/spec/syntax/single.exp +0 -4
  460. data/spec/syntax/single.yaml +0 -18
  461. data/spec/syntax/single_formatted.exp +0 -10
  462. data/spec/syntax/single_formatted.yaml +0 -36
  463. data/spec/syntax/syntax.exp +0 -333
  464. data/spec/syntax/syntax.yaml +0 -3509
  465. data/spec/syntax/syntax_formatted.exp +0 -902
  466. data/spec/syntax/syntax_hyperlink_formatted.exp +0 -902
  467. data/spec/syntax/syntax_schema_head_formatted.exp +0 -18
@@ -0,0 +1,108 @@
1
+ # eeng ↔ expressir parity matrix (2026-09-21)
2
+
3
+ Reference: `~/src/external/exp-engine-engine` (eengine-5.0.20-Beta1).
4
+ Audited files: kernel/{find-declaration,find-entity,find-type,
5
+ resolve-interface,resolve-object,resolve-ref,references,schema-search,
6
+ interfaces,compute-inheritance,supertypes,derive-attrs,
7
+ inverse-attrs,check,compare,dot-graph}.lisp; plugins/p11/{schedule-*
8
+ ,resolve-declaration,cleanup-interface,wo-*}.lisp.
9
+
10
+ ## 1. Name resolution ladder (kernel/find-declaration.lisp:125-172)
11
+
12
+ eeng's schema-scope restriction ladder for `find-declaration`:
13
+
14
+ ```
15
+ nil = :use-from
16
+ :local → own declarations + constants only
17
+ :use-from → :local OR :use-only
18
+ :use-only → walk USE FROM interfaces only, transitively, each in
19
+ :use-from scope (so USE visibility is transitive)
20
+ :all-iface → :local OR all interfaces (USE and REFERENCE), transitively
21
+ cycle guard → *schema-path*: schema already on path ⇒ nil
22
+ ```
23
+
24
+ Per-kind restrictions (`resolve-interface.lisp:30-66`):
25
+ - USE FROM resolves **type + entity only**.
26
+ - REFERENCE FROM resolves constant/entity/function/procedure/type.
27
+ - Unresolved resource ⇒ hard **error** `"Resource '~A' not found"`.
28
+
29
+ **expressir today:** `ModelElement#find` climbs parent scopes through
30
+ `children_by_id`; `Schema#children` = `interfaced_items + safe_children`
31
+ where `interfaced_items` is **single-hop** (own interfaces only, no
32
+ transitivity), and the resolver never errors on unresolved resources.
33
+ Our `find` also treats REFERENCE and USE identically (no visibility
34
+ tiering), and has no cycle guard (schema interface cycles loop until
35
+ the memo fills — the memo makes this safe in practice, not by design).
36
+
37
+ **Gaps:** (a) transitive USE visibility — item visible through a chain
38
+ of USEs is invisible to our single-hop lookup; (b) USE/REFERENCE
39
+ visibility tiering absent; (c) no unresolved-resource diagnostics;
40
+ (d) no cycle guard by construction. Fix tracked in TODO 06.
41
+
42
+ ## 2. Load scheduling (plugins/p11/schedule-*.lisp)
43
+
44
+ eeng: `schedule-load` (two-pass parse), `schedule-interfaces`
45
+ (one method per session kind: double-stepmod keeps trl/ref schema
46
+ sets — schema1/schemata1 = trial, schemata2 = reference), recursing
47
+ per interface symbol → find/load the foreign file via the stepmod
48
+ directory layout, then `schedule-resolve` → `resolve-declaration` per
49
+ schema with `*schema?*` dynamic scope (:trl-schema / :ref-schema).
50
+
51
+ **expressir today:** `from_files` (batch + compiled set), repository
52
+ flat over all files; no trl/ref duality (we never compare two
53
+ specification universes); interface targets located by name at resolve
54
+ time through the repository (single-hop, see §1).
55
+
56
+ **Verdict:** structural difference, not a bug — our repository model
57
+ subsumes their session model for everything except `--compare`
58
+ (two-universe schema comparison, kernel/compare.lisp, unported; TODO
59
+ 07 candidate).
60
+
61
+ ## 3. Entity computations (kernel/compute-inheritance.lisp,
62
+ derive-attrs.lisp, inverse-attrs.lisp, supertypes.lisp,
63
+ explicit-attrs.lisp)
64
+
65
+ eeng **materializes** inherited attributes onto entities:
66
+ explicit attributes from the full supertype closure, derived attrs,
67
+ inverse attrs, subtype/supertype links — used by `--validate`,
68
+ population checks, and SHTOLO's generalized-attribute handling
69
+ (Annex G.2.6 needs exactly these).
70
+
71
+ **expressir today:** nothing materialized; consumers walk the
72
+ supertype closure themselves (our item graph does this for edges, not
73
+ attributes).
74
+
75
+ **Gaps:** inherited-explicit-attribute flattening, derived/inverse
76
+ closures. Needed by 05 (G.2.6 select synthesis) and 07 (checks).
77
+ TODO 05 scope.
78
+
79
+ ## 4. Semantic checks (kernel/check.lisp, 835 lines)
80
+
81
+ check-p11 methods per node type: schema-level (interface resource
82
+ existence, per-kind resolution rules), entity (attribute redeclare
83
+ compatibility, inverse target/entity/inverse-attr existence, derive
84
+ aggregation rules), function/procedure/rule parameters, subtype
85
+ constraints, types. Check severity/notes via check-notes.lisp.
86
+
87
+ **expressir today:** `RepositoryValidator` (interface-level only) +
88
+ `validate ascii` CLI. Gap tracked in TODO 07.
89
+
90
+ ## 5. Writers (plugins/p11/wo-*.lisp)
91
+
92
+ | eeng | semantics | expressir |
93
+ |---|---|---|
94
+ | wo-pretty | normal encoding, 2-space indent | Formatter clean mode — parity specs landed (bug39/40) |
95
+ | wo-flat | `:flat` encoding, downcased symbols, typeof-option banner | 05 (Annex G — note eeng's flat KEEPS 2003 constructs: partial) |
96
+ | wo-list | declaration listing | 09 |
97
+ | wo-smrl-xml | `<concatenated_express_file_content_list>` index for longform/concatenated modes | 09 |
98
+ | wo-lexp | lisp S-expression dump | not planned (internal debugging) |
99
+
100
+ ## 6. Bugs found by this audit
101
+
102
+ - **expressir#373** — Ruby parse path corrupts small USE FROM schemas
103
+ (<~70B, non-monotonic; core path correct). Found by the concatenator
104
+ fixtures; `dependency_resolver_spec` failures on main are the same
105
+ root cause. Fixed by the #371/#370 stack.
106
+ - eeng partial Annex G coverage — documented in
107
+ `spec/fixtures/shtolo/annex-g-rules.md` (eeng is a partial oracle;
108
+ the annex is the contract).
@@ -0,0 +1,64 @@
1
+ # 00 — RefPath v2: ELF 5006 conformance
2
+
3
+ Goal: make `Expressir::Mapping::RefPath` a conforming validator for the
4
+ EXPRESS mapping language specification (ELF 5006:2025,
5
+ `~/src/expresslang/docs/sources/express-mapping/`), so that the WG12
6
+ validation of annotated EXPRESS links (TRThurman PDES proposal,
7
+ expressir 2.4.20+ capability, AP 242 ed5 DIS December 2026) finds
8
+ expressir ready at every reference position.
9
+
10
+ ## Gap matrix (ELF 5006 §8 vs current RefPath)
11
+
12
+ | §8 requirement | status |
13
+ |---|---|
14
+ | entity existence, case-insensitive | done |
15
+ | `<=` / `=>` subtype/supertype, direct or transitive | done |
16
+ | attribute existence for `->` / `<-` (inherited attrs) | done |
17
+ | forward/inverse TYPE compatibility (attr type references target; SELECT membership) | v2 |
18
+ | navigation continuity (running path context) | v2 |
19
+ | constraint: entity in path context; attribute exists; not DERIVED/INVERSE | v2 |
20
+ | constraint value typing (STRING/INTEGER/REAL/NUMBER/BOOLEAN/LOGICAL/ENUMERATION/SELECT table) | v2 |
21
+ | start entity = ARM entity (relaxable for attribute mappings); end entity = MIM/aimelt | v2 |
22
+ | `*>` / `<*` select extension semantics | v2 |
23
+ | `!{...}` negation, `<...>` required path, `||...||` marker, `*...*` tree | v2 (tokenize + semantics) |
24
+ | collect-all-errors | done |
25
+ | structured output (text/JSON/YAML), per-path VALID/INVALID | v2 |
26
+ | case-mismatch warnings (optional) | v2 optional |
27
+
28
+ ## Mapping-model gaps (ae-level fields in the wg12-step corpus)
29
+
30
+ 587 module mapping files; keys beyond the current model:
31
+
32
+ - `rules` — 159 ae entries carry a rules list (a reference position in
33
+ the PDES proposal: "the rules list").
34
+ - `alt_map` — 74 ae entries carry an alternative map ("an alternative
35
+ map" reference position).
36
+
37
+ Both must be modeled with lutaml-model attributes (never hand-rolled
38
+ parsing) and their link/reference positions validated like ae/sc.
39
+
40
+ ## Validation semantics (per §8 + §5/§6)
41
+
42
+ - Running context: the entity a path is "at". `<=`/`=>` move to the
43
+ right-hand entity; `a.attr -> b` requires attr on the current entity
44
+ whose type references b (supertypes and SELECT options count), moves
45
+ to b; `b <- a.attr` same checks, moves to a; `[i]`/`[n]` keep the
46
+ element type as context; a bare name restates or continues the
47
+ context (§6 chaining).
48
+ - Constraints `{e ... e.attr = v}`: e equals the current context entity
49
+ (§8: "at or before the constraint location"); attr exists on e and is
50
+ not DERIVED/INVERSE; v typed per the §8 table (STRING single-quoted,
51
+ INTEGER/REAL/NUMBER unquoted, BOOLEAN TRUE/FALSE, LOGICAL +UNKNOWN,
52
+ ENUMERATION item of the attribute's type, SELECT option match).
53
+ `!{...}` inverts the finding.
54
+ - Start entity: compatible with the ae `entity` (relaxed for aa-level
55
+ paths). End entity: a MIM-declared entity (cross-check `aimelt`).
56
+
57
+ ## Test oracle
58
+
59
+ - `spec/expressir/mapping/refpath_spec.rb` — extend with one example
60
+ per §8 rule (firing + clean negative).
61
+ - Corpus: all 587 module mapping.yaml files; the suma MappingDrift
62
+ baseline (1541 entries) is the pre-v2 reference; v2 must not add
63
+ errors on paths the corpus proves valid, and must explain every new
64
+ error by an ELF 5006 rule.
@@ -0,0 +1,23 @@
1
+ # Suma improvements — integration + expressir roadmap
2
+
3
+ The metanorma ↔ expressir chain via suma: ISO 10303 SMRL schemas → expressir
4
+ parse (compiled set EXSCS1) → LazyRepository + Liquid drops
5
+ (metanorma-plugin-lutaml) → metanorma-iso schema documents. The chain is
6
+ proven piecewise (1307 schemas, 0 failures, warm start 7.8s, live xrefs in
7
+ rendered XML); the items below close the last mile and deepen expressir.
8
+
9
+ | # | item | status |
10
+ |---|------|--------|
11
+ | 01 | prebuilt platform gems (oxidize-rb cross-gem, parsanol pattern) | in flight |
12
+ | 02 | suma full-document E2E on current stack | pending |
13
+ | 03 | ItemGraph — cross-schema subtype/interface graph API | pending |
14
+ | 04 | compiled-set + lazy path as suma default build | pending |
15
+ | 05 | corpus validation surfaced in suma builds | pending |
16
+ | 06 | memory/perf re-measure with binding-by-default | pending |
17
+ | 07 | #276 Part 28 XML — select mapping v2 | pending |
18
+ | 08 | windows gnu toolchain for in-place ext builds | superseded by 01 for CI; kept for local dev |
19
+ | 09 | checker tranche 3 (INVERSE, SELF\ qualifiers) | pending |
20
+ | 10 | #91 EXPRESSdoc (upstream-gated) | parked |
21
+
22
+ Evidence trail: #88/#461 (refpath validation), #462/#467 (ABSTRACT body
23
+ form), v2.4.21–v2.4.24 (binding by default), plugin 0.7.53 + #305/#306.
@@ -0,0 +1,33 @@
1
+ # 01 — Prebuilt platform gems
2
+
3
+ ## Goal
4
+ `gem install expressir` compiles nothing on machines with a prebuilt
5
+ platform gem: the binding binary ships inside per-platform gems
6
+ (`expressir-<ver>-arm64-darwin` etc.), following the parsanol-ruby
7
+ pattern (oxidize-rb cross-gem + RbSys::ExtensionTask).
8
+
9
+ ## Pattern (from ~/src/parsanol/parsanol-ruby)
10
+ - `oxidize-rb/actions/fetch-ci-data@v1` computes supported platforms
11
+ - `oxidize-rb/actions/cross-gem@v1` matrix builds per-platform gems in
12
+ rake-compiler-dock containers (coherent gnu toolchain per target —
13
+ this is what fixes windows)
14
+ - per-platform smoke jobs on REAL runners installing the gem and running
15
+ a smoke script (NATIVE true + parse)
16
+ - source gem still builds via the gemspec (extensions stay declared);
17
+ rubygems prefers a matching platform gem automatically
18
+
19
+ ## expressir implementation
20
+ - `rakelib/native.rake`: `RbSys::ExtensionTask.new("expressir_core")`,
21
+ `ext.lib_dir = "lib/expressir"`, `cross_compiling` callback stages
22
+ `expressir_core.{so,dylib,dll}` into `lib/expressir/` (loads via the
23
+ existing first `require "expressir/expressir_core"` in core.rb)
24
+ - extconf: mingw skip becomes bypassable (`EXPRESSIR_CORE_FORCE=1` set in
25
+ the cross-gem container, where cargo gnu matches the mingw-ucrt ruby)
26
+ - `.github/workflows/native-gems.yml`: ci-data + cross-gem matrix +
27
+ smoke jobs + source gem + `gem push` on tag (RUBYGEMS_API_KEY secret)
28
+ - `.github/scripts/test_installed_gem.rb`: smoke script
29
+
30
+ ## Acceptance
31
+ - workflow green across platforms with smoke jobs passing
32
+ - a platform gem installs cargo-less and reports NATIVE true
33
+ - source-gem install path unchanged (2.4.21 behavior)
@@ -0,0 +1,39 @@
1
+ # 02 — Suma full-document E2E on the current stack
2
+
3
+ ## Goal
4
+ One clean E2E run of an actual suma document build with expressir 2.4.24 +
5
+ metanorma-plugin-lutaml 0.7.53 + current metanorma gems, rendering a real
6
+ ISO 10303 module document to XML.
7
+
8
+ ## Why now
9
+ The earlier full-render was blocked by the metanorma-document/relaton
10
+ 0.2.x skew; that ecosystem has moved (metanorma-document 0.5.1, relaton
11
+ 3.0 pre-alpha). The expressir side is proven current.
12
+
13
+ ## Steps
14
+ - locate the suma build entry (~/src/mn/iso-10303 suma config or the
15
+ metanorma-iso document that renders schema pages)
16
+ - bundle with current metanorma; render one module doc end to end
17
+ - capture XML diffs vs the last good render; if the relaton skew
18
+ persists, name the exact unresolved constraint
19
+
20
+ ## Acceptance
21
+ - a rendered module document, or a one-line statement of the precise
22
+ upstream blocker with the failing constraint
23
+
24
+ ## Result: DONE (2026-09-27)
25
+
26
+ The upstream blocker has cleared. On the iso-10303 ladder (user's
27
+ Gemfile WIP + suma from path + relaton prereleases with the rubyzip-3
28
+ fix now on rubygems — the fix/rubyzip-3 git pins were dropped as
29
+ obsolete):
30
+
31
+ bundle exec suma build srl-smol.yml # one-part SMOL collection
32
+ # => Compiling schema collection... Compiling complete collection...
33
+ # => SMOL-EXIT=0
34
+
35
+ Artifacts: 286 files in _site/ — real ISO document XML (flavor iso,
36
+ schema content present), schema-doc pages, presentation XML. The stale
37
+ sums pin was the rubygems suma 0.1.11 (expressir ~> 2.1, metanorma-cli
38
+ 0.0.3 → broken 2019 stack); suma from source (metanorma ~> 2.3 line)
39
+ resolves cleanly.
@@ -0,0 +1,22 @@
1
+ # 03 — ItemGraph
2
+
3
+ ## Goal
4
+ Cross-schema graph API over a parsed repository: subtype edges, interface
5
+ (USE FROM/REFERENCE FROM) edges, transitive queries — feeding suma doc
6
+ generation (hyperlink coverage, "used by" sections, dependency diagrams).
7
+
8
+ ## Evidence
9
+ SMRL full-set load proved the data: 37.7k subtype edges, 5.5k interface
10
+ edges over 1307 schemas (TODO.memory SMRL notes). The class is the
11
+ documented remaining gap.
12
+
13
+ ## Shape
14
+ - `Expressir::Model::ItemGraph` built from a Repository (or a
15
+ LazyRepository hydrated once)
16
+ - `subtypes(id)`, `supertypes(id)`, `used_by(id)`, `uses(id)`,
17
+ `transitive_subtypes(id)` — downcased-id keyed, cycle-safe
18
+ - built once per repository; O(V+E)
19
+
20
+ ## Acceptance
21
+ - specs over a multi-schema fixture (diamond subtyping, mutual USE FROM)
22
+ - SMRL smoke: edge counts match the recorded 37.7k/5.5k within tolerance
@@ -0,0 +1,16 @@
1
+ # 04 — Compiled-set + lazy path as the suma default build
2
+
3
+ ## Goal
4
+ suma builds parse the SMRL once into an EXSCS1 artifact and all document
5
+ renders hydrate per schema from it (warm start 7.8s vs 12s cold), instead
6
+ of eager-parsing on every build.
7
+
8
+ ## Steps
9
+ - locate the suma/rake build entry that calls Parser.from_files
10
+ - switch to `Parser.from_files(files, compiled_set:)` then
11
+ `LazyRepository.new(set)`
12
+ - keep an escape hatch (env) for debugging with eager parse
13
+
14
+ ## Acceptance
15
+ - a suma build log showing one artifact build + per-page hydration
16
+ - rendered output byte-identical to the eager path
@@ -0,0 +1,17 @@
1
+ # 05 — Corpus validation surfaced in suma builds
2
+
3
+ ## Goal
4
+ The expressir validation layers (mapping_validate incl. refpath
5
+ resolution — which found 2 genuine corpus drifts in a 60-module sweep)
6
+ run as part of suma builds, reporting per-module drift in the build log
7
+ (and optionally in published output).
8
+
9
+ ## Steps
10
+ - wire `expressir mapping_validate` over each module's mapping.yaml in
11
+ the suma build loop
12
+ - aggregate a drift report artifact; non-zero exit only on NEW drift vs
13
+ a committed baseline file
14
+
15
+ ## Acceptance
16
+ - baseline for the 2 known drifts; a build with a synthetic new drift
17
+ fails with the module/location in the message
@@ -0,0 +1,36 @@
1
+ # 06 — Memory/perf re-measure with binding-by-default
2
+
3
+ ## Goal
4
+ The recorded profile ("50x memory ratio not achieved", pure-Ruby parse
5
+ dominating) predates binding-by-default. Consumers now get the Rust
6
+ parse path automatically; re-measure and refresh the story.
7
+
8
+ ## Steps
9
+ - rerun the memory harness (TODO.memory methodology) with
10
+ NATIVE_AVAILABLE true on the same fixtures
11
+ - record ratio vs the 50x target; note remaining hot spots
12
+ - update TODO.memory notes + the perf memory file
13
+
14
+ ## Acceptance
15
+ - fresh numbers committed alongside the old ones, with the parse
16
+ backend identified per measurement
17
+
18
+ ## Results (2026-09-27, ruby 3.4.8, 227KB synthetic / 4000 entities)
19
+
20
+ | path | parse time | RSS delta | after GC |
21
+ |------|-----------|-----------|----------|
22
+ | Rust binding (NATIVE_AVAILABLE) | 7.7s | 348 MB | 387 MB |
23
+ | pure-Ruby (use_native: false) | 7.5s | 307 MB | 353 MB |
24
+
25
+ Both paths hydrate the full lutaml-model object tree, which dominates
26
+ the delta — the native parse itself is not the differentiator at this
27
+ size (arena overhead is offset by wire-hash materialization). The
28
+ binding's memory advantage in the field comes from the compiled-set
29
+ path (hydrate per file / warm start 7.8s), not from a lower per-parse
30
+ floor. Ratio ~1.5 MB/KB of source on both paths — consistent with the
31
+ older "~600x for large files" observation: the object MODEL is the
32
+ cost driver, which is exactly what M2 laziness addresses.
33
+
34
+ Old "50x memory ratio target" concern: RETIRED as the wrong metric for
35
+ the binding; per-page hydration (LazyRepository) is the delivered
36
+ mechanism for bounded memory at render time.
@@ -0,0 +1,15 @@
1
+ # 07 — Part 28 XML: select mapping v2 (#276)
2
+
3
+ ## Goal
4
+ Full ISO 10303-28 EXPRESS-to-XML beyond the v1 skeleton
5
+ (lib/expressir/express/xsd.rb): proper SELECT mapping (currently
6
+ xs:anyType), aggregate/optional fidelity, schema-level structure.
7
+
8
+ ## Steps
9
+ - ISO 10303-28 mapping rules for SELECT types (union/member semantics)
10
+ - apply on top of xsd.rb's element/complexType generation
11
+ - validate generated XSDs against the ISO 10303-28 conformance examples
12
+
13
+ ## Acceptance
14
+ - a select-typed attribute renders per the standard (not xs:anyType)
15
+ - the v1 examples still generate unchanged except where v2 improves them
@@ -0,0 +1,15 @@
1
+ # 08 — Windows gnu toolchain for in-place ext builds
2
+
3
+ ## Goal
4
+ Local windows source installs and windows CI in-place builds compile the
5
+ binding: rustup gnu target (`x86_64-pc-windows-gnu`) matching the mingw
6
+ ruby, so extconf's guard can be lifted there.
7
+
8
+ ## Status
9
+ Superseded for CI by 01 (cross-gem containers carry coherent toolchains;
10
+ platform gems ship prebuilt). Kept for developers hacking on windows
11
+ checkouts directly.
12
+
13
+ ## Acceptance
14
+ - a windows machine with the gnu target builds the ext via extconf
15
+ without EXPRESSIR_CORE_FORCE
@@ -0,0 +1,13 @@
1
+ # 09 — Checker tranche 3 + SHTOLO completion
2
+
3
+ ## Goal
4
+ Remaining eengine-parity checks: INVERSE-family rules and SELF\ qualifier
5
+ validation (tranche 3), then the leftover SHTOLO longform items
6
+ (TODO.parity-ee/14).
7
+
8
+ ## Gate
9
+ Grammar support for INVERSE-scoped references and SELF\ qualified
10
+ refs — verify against the current grammar after recent fixes.
11
+
12
+ ## Acceptance
13
+ - each new check has a fixture that fires it + a clean-corpus negative
@@ -0,0 +1,8 @@
1
+ # 10 — EXPRESSdoc (#91, upstream-gated)
2
+
3
+ ## Goal
4
+ Support the upcoming EXPRESSdoc format.
5
+
6
+ ## Status
7
+ Parked on annotated-express#94 (upstream). Revisit when that lands;
8
+ expressir's side is the remark/annotation model already in place.