domainforge 0.13.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 (481) hide show
  1. package/.cargo/config.toml +6 -0
  2. package/.claude/settings.local.json +18 -0
  3. package/.coderabbit.yml +43 -0
  4. package/.codex/skills/release-management/SKILL.md +151 -0
  5. package/.codex/skills/release-management/agents/openai.yaml +4 -0
  6. package/.github/actions/decrypt-secrets/action.yml +121 -0
  7. package/.github/agents/Coder.agent.md +97 -0
  8. package/.github/agents/DeepResearch.agent.md +61 -0
  9. package/.github/chatmodes/tdd.vibepro.chatmode.md +1183 -0
  10. package/.github/copilot-instructions.md +13 -0
  11. package/.github/dependabot.yml +68 -0
  12. package/.github/workflows/README.md +165 -0
  13. package/.github/workflows/ci.yml +335 -0
  14. package/.github/workflows/dependabot-automerge.yml +114 -0
  15. package/.github/workflows/dependency-review.yml +27 -0
  16. package/.github/workflows/deploy.yml +87 -0
  17. package/.github/workflows/prepare-release.yml +168 -0
  18. package/.github/workflows/release-crates.yml +42 -0
  19. package/.github/workflows/release-npm.yml +137 -0
  20. package/.github/workflows/release-please.yml +29 -0
  21. package/.github/workflows/release-pypi.yml +96 -0
  22. package/.gitkeep +1 -0
  23. package/.release-please-manifest.json +5 -0
  24. package/.sea-registry.toml +10 -0
  25. package/.serena/project.yml +133 -0
  26. package/.sops.yaml +10 -0
  27. package/AGENTS.md +216 -0
  28. package/CHANGELOG.md +400 -0
  29. package/CLAUDE.md +62 -0
  30. package/CONTRIBUTING.md +323 -0
  31. package/Cargo.lock +3612 -0
  32. package/Cargo.toml +12 -0
  33. package/LICENSE +201 -0
  34. package/README.md +660 -0
  35. package/README_PYTHON.md +256 -0
  36. package/README_TYPESCRIPT.md +305 -0
  37. package/README_WASM.md +329 -0
  38. package/RELEASE_NOTES.md +41 -0
  39. package/bun.lock +378 -0
  40. package/bunfig.toml +11 -0
  41. package/check_output.txt +83 -0
  42. package/clippy_output.txt +80 -0
  43. package/commitlint.config.cjs +8 -0
  44. package/deny.toml +42 -0
  45. package/devbox.json +14 -0
  46. package/devbox.lock +76 -0
  47. package/docs/RELEASE_PROCESS.md +360 -0
  48. package/docs/diagnostics.md +161 -0
  49. package/docs/doc_guidelines.md +53 -0
  50. package/docs/explanations/README.md +21 -0
  51. package/docs/explanations/architecture-overview.md +109 -0
  52. package/docs/explanations/cross-language-binding-strategy.md +68 -0
  53. package/docs/explanations/graph-store-design.md +47 -0
  54. package/docs/explanations/performance-benchmarks.md +63 -0
  55. package/docs/explanations/policy-evaluation-logic.md +106 -0
  56. package/docs/explanations/semantic-modeling-concepts.md +109 -0
  57. package/docs/explanations/three-valued-logic.md +66 -0
  58. package/docs/explanations/versioning-strategy.md +45 -0
  59. package/docs/governance.md +168 -0
  60. package/docs/how-tos/README.md +46 -0
  61. package/docs/how-tos/ci-cd-validation.md +93 -0
  62. package/docs/how-tos/create-custom-units.md +125 -0
  63. package/docs/how-tos/define-policies.md +119 -0
  64. package/docs/how-tos/export-to-calm.md +110 -0
  65. package/docs/how-tos/export-to-protobuf.md +312 -0
  66. package/docs/how-tos/extend-grammar.md +133 -0
  67. package/docs/how-tos/generate-rdf-turtle.md +106 -0
  68. package/docs/how-tos/import-from-calm.md +114 -0
  69. package/docs/how-tos/import-from-sbvr.md +249 -0
  70. package/docs/how-tos/install-cli.md +126 -0
  71. package/docs/how-tos/parse-sea-files.md +132 -0
  72. package/docs/how-tos/policy-evaluation-modes.md +30 -0
  73. package/docs/how-tos/run-cross-language-tests.md +115 -0
  74. package/docs/how-tos/troubleshoot-napi-builds.md +55 -0
  75. package/docs/how-tos/use-modules-imports.md +285 -0
  76. package/docs/index.md +13 -0
  77. package/docs/plans/canonical-normalizer.md +121 -0
  78. package/docs/plans/cd_improvement.md +112 -0
  79. package/docs/plans/cli-ast.md +29 -0
  80. package/docs/plans/expression-bindings-and-normalizer-integration.md +174 -0
  81. package/docs/plans/protobuf_advanced_features_plan.md +597 -0
  82. package/docs/plans/protobuf_plan.yml +525 -0
  83. package/docs/plans/refactor_dsl_architecture.md +131 -0
  84. package/docs/plans/release-plan.md +163 -0
  85. package/docs/plans/sea_fmt_implementation_plan.md +516 -0
  86. package/docs/playbooks/README.md +18 -0
  87. package/docs/playbooks/adding-new-primitive.md +68 -0
  88. package/docs/playbooks/debugging-parser-failures.md +42 -0
  89. package/docs/playbooks/local-release-preparation.md +139 -0
  90. package/docs/playbooks/migrating-schema-versions.md +43 -0
  91. package/docs/playbooks/onboarding-contributors.md +64 -0
  92. package/docs/playbooks/releasing-beta.md +86 -0
  93. package/docs/playbooks/secret-management.md +64 -0
  94. package/docs/reference/README.md +199 -0
  95. package/docs/reference/ast-json-api.md +427 -0
  96. package/docs/reference/calm-mapping.md +519 -0
  97. package/docs/reference/cli-commands.md +588 -0
  98. package/docs/reference/configuration.md +202 -0
  99. package/docs/reference/error-codes.md +664 -0
  100. package/docs/reference/generated-artifacts-policy.md +53 -0
  101. package/docs/reference/grammar-spec.md +255 -0
  102. package/docs/reference/primitives-api.md +317 -0
  103. package/docs/reference/protobuf-api.md +426 -0
  104. package/docs/reference/python-api.md +485 -0
  105. package/docs/reference/registry.md +50 -0
  106. package/docs/reference/sea-dsl-ai-cheatsheet.yaml +913 -0
  107. package/docs/reference/security-model.md +74 -0
  108. package/docs/reference/typescript-api.md +508 -0
  109. package/docs/reference/wasm-api.md +420 -0
  110. package/docs/semantic-pack-review.md +144 -0
  111. package/docs/semantic-pack-signing.md +234 -0
  112. package/docs/semantic-packs.md +284 -0
  113. package/docs/specs/ADR-001-sea-dsl-semantic-source-of-truth.md +33 -0
  114. package/docs/specs/ADR-002-projection-first-class-construct.md +50 -0
  115. package/docs/specs/ADR-003-protobuf-projection-target.md +51 -0
  116. package/docs/specs/ADR-004-projection-compatibility-semantics.md +57 -0
  117. package/docs/specs/ADR-005-multi-language-support-strategy.md +112 -0
  118. package/docs/specs/ADR-006-error-handling-strategy.md +115 -0
  119. package/docs/specs/ADR-007-policy-evaluation-engine.md +95 -0
  120. package/docs/specs/ADR-008-knowledge-graph-integration.md +90 -0
  121. package/docs/specs/ADR-009-module-resolution-strategy.md +115 -0
  122. package/docs/specs/ADR-010-unit-system.md +106 -0
  123. package/docs/specs/PRD-001-sea-projection-framework.md +155 -0
  124. package/docs/specs/PRD-002-sea-cli-tooling.md +169 -0
  125. package/docs/specs/PRD-003-dsl-core-capabilities.md +275 -0
  126. package/docs/specs/README.md +62 -0
  127. package/docs/specs/SDS-001-protobuf-projection-engine.md +451 -0
  128. package/docs/specs/SDS-002-sea-core-architecture.md +268 -0
  129. package/docs/specs/SDS-003-parser-semantic-graph.md +377 -0
  130. package/docs/specs/SDS-004-policy-engine-design.md +362 -0
  131. package/docs/specs/SDS-005-knowledge-graph-module.md +364 -0
  132. package/docs/specs/SDS-006-calm-integration.md +367 -0
  133. package/docs/specs/SDS-007-sbvr-import.md +347 -0
  134. package/docs/templates/template_explanation.md +14 -0
  135. package/docs/templates/template_howto.md +21 -0
  136. package/docs/templates/template_playbook.md +21 -0
  137. package/docs/templates/template_reference.md +17 -0
  138. package/docs/templates/template_tutorial.md +24 -0
  139. package/docs/tutorials/README.md +12 -0
  140. package/docs/tutorials/first-sea-model.md +85 -0
  141. package/docs/tutorials/getting-started.md +98 -0
  142. package/docs/tutorials/python-binding-quickstart.md +107 -0
  143. package/docs/tutorials/typescript-binding-quickstart.md +91 -0
  144. package/docs/tutorials/wasm-in-browser.md +75 -0
  145. package/domainforge-core/CHANGELOG.md +138 -0
  146. package/domainforge-core/Cargo.toml +101 -0
  147. package/domainforge-core/MIGRATING.md +32 -0
  148. package/domainforge-core/README.md +197 -0
  149. package/domainforge-core/benchmark_results.txt +51 -0
  150. package/domainforge-core/build.rs +6 -0
  151. package/domainforge-core/deny.toml +31 -0
  152. package/domainforge-core/docs/specs/projections/sbvr_kg_mapping.md +43 -0
  153. package/domainforge-core/examples/basic.sea +7 -0
  154. package/domainforge-core/examples/cli/import_export_workflow.sh +38 -0
  155. package/domainforge-core/examples/cli/validate_example.sh +30 -0
  156. package/domainforge-core/examples/evolution_semantics.sea +31 -0
  157. package/domainforge-core/examples/parser_demo.rs +203 -0
  158. package/domainforge-core/grammar/sea.pest +408 -0
  159. package/domainforge-core/schemas/calm-v1.schema.json +170 -0
  160. package/domainforge-core/schemas/shacl/sea_shapes.ttl +19 -0
  161. package/domainforge-core/src/authority/compiler.rs +309 -0
  162. package/domainforge-core/src/authority/environment.rs +203 -0
  163. package/domainforge-core/src/authority/error.rs +164 -0
  164. package/domainforge-core/src/authority/fact_resolver.rs +224 -0
  165. package/domainforge-core/src/authority/mod.rs +25 -0
  166. package/domainforge-core/src/authority/pack.rs +133 -0
  167. package/domainforge-core/src/authority/policy.rs +224 -0
  168. package/domainforge-core/src/authority/resolver.rs +446 -0
  169. package/domainforge-core/src/authority/trace.rs +217 -0
  170. package/domainforge-core/src/authority/transform.rs +168 -0
  171. package/domainforge-core/src/authority/types.rs +617 -0
  172. package/domainforge-core/src/bin/domainforge.rs +25 -0
  173. package/domainforge-core/src/calm/export.rs +538 -0
  174. package/domainforge-core/src/calm/import.rs +1220 -0
  175. package/domainforge-core/src/calm/mod.rs +9 -0
  176. package/domainforge-core/src/calm/models.rs +108 -0
  177. package/domainforge-core/src/calm/sbvr_import.rs +9 -0
  178. package/domainforge-core/src/cli/authority.rs +149 -0
  179. package/domainforge-core/src/cli/format.rs +85 -0
  180. package/domainforge-core/src/cli/import.rs +133 -0
  181. package/domainforge-core/src/cli/mod.rs +64 -0
  182. package/domainforge-core/src/cli/normalize.rs +180 -0
  183. package/domainforge-core/src/cli/pack.rs +904 -0
  184. package/domainforge-core/src/cli/parse.rs +112 -0
  185. package/domainforge-core/src/cli/project.rs +294 -0
  186. package/domainforge-core/src/cli/registry.rs +41 -0
  187. package/domainforge-core/src/cli/test.rs +12 -0
  188. package/domainforge-core/src/cli/validate.rs +195 -0
  189. package/domainforge-core/src/cli/validate_kg.rs +80 -0
  190. package/domainforge-core/src/concept_id.rs +89 -0
  191. package/domainforge-core/src/error/diagnostics.rs +426 -0
  192. package/domainforge-core/src/error/fuzzy.rs +253 -0
  193. package/domainforge-core/src/error/mod.rs +13 -0
  194. package/domainforge-core/src/formatter/comments.rs +223 -0
  195. package/domainforge-core/src/formatter/config.rs +114 -0
  196. package/domainforge-core/src/formatter/mod.rs +22 -0
  197. package/domainforge-core/src/formatter/printer.rs +906 -0
  198. package/domainforge-core/src/graph/mod.rs +858 -0
  199. package/domainforge-core/src/graph/to_ast.rs +66 -0
  200. package/domainforge-core/src/kg.rs +1476 -0
  201. package/domainforge-core/src/kg_import.rs +251 -0
  202. package/domainforge-core/src/lib.rs +203 -0
  203. package/domainforge-core/src/module/mod.rs +1 -0
  204. package/domainforge-core/src/module/resolver.rs +260 -0
  205. package/domainforge-core/src/parser/ast.rs +2919 -0
  206. package/domainforge-core/src/parser/ast_convert.rs +494 -0
  207. package/domainforge-core/src/parser/ast_schema.rs +491 -0
  208. package/domainforge-core/src/parser/error.rs +291 -0
  209. package/domainforge-core/src/parser/lint.rs +39 -0
  210. package/domainforge-core/src/parser/mod.rs +193 -0
  211. package/domainforge-core/src/parser/printer.rs +702 -0
  212. package/domainforge-core/src/parser/profiles.rs +71 -0
  213. package/domainforge-core/src/parser/string_utils.rs +138 -0
  214. package/domainforge-core/src/patterns.rs +68 -0
  215. package/domainforge-core/src/policy/core.rs +1148 -0
  216. package/domainforge-core/src/policy/expression.rs +399 -0
  217. package/domainforge-core/src/policy/mod.rs +18 -0
  218. package/domainforge-core/src/policy/normalize.rs +1028 -0
  219. package/domainforge-core/src/policy/quantifier.rs +940 -0
  220. package/domainforge-core/src/policy/three_valued.rs +140 -0
  221. package/domainforge-core/src/policy/three_valued_microbench.rs +104 -0
  222. package/domainforge-core/src/policy/type_inference.rs +67 -0
  223. package/domainforge-core/src/policy/violation.rs +36 -0
  224. package/domainforge-core/src/primitives/concept_change.rs +61 -0
  225. package/domainforge-core/src/primitives/entity.rs +224 -0
  226. package/domainforge-core/src/primitives/flow.rs +111 -0
  227. package/domainforge-core/src/primitives/instance.rs +93 -0
  228. package/domainforge-core/src/primitives/mapping_contract.rs +50 -0
  229. package/domainforge-core/src/primitives/metric.rs +79 -0
  230. package/domainforge-core/src/primitives/mod.rs +25 -0
  231. package/domainforge-core/src/primitives/projection_contract.rs +50 -0
  232. package/domainforge-core/src/primitives/quantity.rs +56 -0
  233. package/domainforge-core/src/primitives/relation.rs +68 -0
  234. package/domainforge-core/src/primitives/resource.rs +237 -0
  235. package/domainforge-core/src/primitives/resource_instance.rs +88 -0
  236. package/domainforge-core/src/primitives/role.rs +49 -0
  237. package/domainforge-core/src/projection/buf.rs +404 -0
  238. package/domainforge-core/src/projection/contracts.rs +22 -0
  239. package/domainforge-core/src/projection/engine.rs +19 -0
  240. package/domainforge-core/src/projection/mod.rs +16 -0
  241. package/domainforge-core/src/projection/protobuf.rs +3331 -0
  242. package/domainforge-core/src/projection/registry.rs +43 -0
  243. package/domainforge-core/src/python/authority.rs +253 -0
  244. package/domainforge-core/src/python/error.rs +227 -0
  245. package/domainforge-core/src/python/formatter.rs +86 -0
  246. package/domainforge-core/src/python/graph.rs +366 -0
  247. package/domainforge-core/src/python/mod.rs +9 -0
  248. package/domainforge-core/src/python/policy.rs +651 -0
  249. package/domainforge-core/src/python/primitives.rs +796 -0
  250. package/domainforge-core/src/python/registry.rs +98 -0
  251. package/domainforge-core/src/python/semantic_pack.rs +619 -0
  252. package/domainforge-core/src/python/units.rs +96 -0
  253. package/domainforge-core/src/registry/mod.rs +432 -0
  254. package/domainforge-core/src/registry/tests.rs +210 -0
  255. package/domainforge-core/src/sbvr.rs +744 -0
  256. package/domainforge-core/src/semantic_pack/builder.rs +470 -0
  257. package/domainforge-core/src/semantic_pack/canonical_json.rs +184 -0
  258. package/domainforge-core/src/semantic_pack/diagnostics.rs +214 -0
  259. package/domainforge-core/src/semantic_pack/diff.rs +216 -0
  260. package/domainforge-core/src/semantic_pack/mod.rs +31 -0
  261. package/domainforge-core/src/semantic_pack/pack_set.rs +240 -0
  262. package/domainforge-core/src/semantic_pack/resolver.rs +437 -0
  263. package/domainforge-core/src/semantic_pack/review.rs +125 -0
  264. package/domainforge-core/src/semantic_pack/schema.rs +342 -0
  265. package/domainforge-core/src/semantic_pack/signing.rs +105 -0
  266. package/domainforge-core/src/semantic_pack/validator.rs +368 -0
  267. package/domainforge-core/src/semantic_version.rs +140 -0
  268. package/domainforge-core/src/test_utils.rs +12 -0
  269. package/domainforge-core/src/typescript/authority.rs +184 -0
  270. package/domainforge-core/src/typescript/error.rs +146 -0
  271. package/domainforge-core/src/typescript/formatter.rs +76 -0
  272. package/domainforge-core/src/typescript/graph.rs +391 -0
  273. package/domainforge-core/src/typescript/mod.rs +9 -0
  274. package/domainforge-core/src/typescript/policy.rs +564 -0
  275. package/domainforge-core/src/typescript/primitives.rs +784 -0
  276. package/domainforge-core/src/typescript/registry.rs +88 -0
  277. package/domainforge-core/src/typescript/semantic_pack.rs +470 -0
  278. package/domainforge-core/src/typescript/units.rs +76 -0
  279. package/domainforge-core/src/units/mod.rs +462 -0
  280. package/domainforge-core/src/uuid_module.rs +42 -0
  281. package/domainforge-core/src/validation_error.rs +818 -0
  282. package/domainforge-core/src/validation_result.rs +30 -0
  283. package/domainforge-core/src/wasm/authority.rs +192 -0
  284. package/domainforge-core/src/wasm/error.rs +145 -0
  285. package/domainforge-core/src/wasm/formatter.rs +69 -0
  286. package/domainforge-core/src/wasm/graph.rs +471 -0
  287. package/domainforge-core/src/wasm/mod.rs +16 -0
  288. package/domainforge-core/src/wasm/policy.rs +607 -0
  289. package/domainforge-core/src/wasm/primitives.rs +295 -0
  290. package/domainforge-core/src/wasm/semantic_pack.rs +471 -0
  291. package/domainforge-core/src/wasm/units.rs +62 -0
  292. package/domainforge-core/std/aws.sea +6 -0
  293. package/domainforge-core/std/core.sea +6 -0
  294. package/domainforge-core/std/http.sea +27 -0
  295. package/domainforge-core/tests/aggregation_enhanced_tests.rs +162 -0
  296. package/domainforge-core/tests/aggregation_eval_tests.rs +248 -0
  297. package/domainforge-core/tests/aggregation_integration_tests.rs +379 -0
  298. package/domainforge-core/tests/aggregation_parser_tests.rs +92 -0
  299. package/domainforge-core/tests/aggregation_tests.rs +102 -0
  300. package/domainforge-core/tests/authority_conformance_tests.rs +1173 -0
  301. package/domainforge-core/tests/calm_round_trip_tests.rs +283 -0
  302. package/domainforge-core/tests/calm_schema_validation_tests.rs +137 -0
  303. package/domainforge-core/tests/cast_operator_tests.rs +85 -0
  304. package/domainforge-core/tests/cli_binary_check.rs +37 -0
  305. package/domainforge-core/tests/cli_import_tests.rs +291 -0
  306. package/domainforge-core/tests/cli_path_traversal_tests.rs +124 -0
  307. package/domainforge-core/tests/cli_tests.rs +63 -0
  308. package/domainforge-core/tests/diagnostics_tests.rs +203 -0
  309. package/domainforge-core/tests/dimension_unit_tests.rs +80 -0
  310. package/domainforge-core/tests/entity_tests.rs +69 -0
  311. package/domainforge-core/tests/evolution_semantics_tests.rs +157 -0
  312. package/domainforge-core/tests/flow_tests.rs +78 -0
  313. package/domainforge-core/tests/flow_unit_validation_tests.rs +31 -0
  314. package/domainforge-core/tests/graph_integration_tests.rs +218 -0
  315. package/domainforge-core/tests/graph_tests.rs +626 -0
  316. package/domainforge-core/tests/import_parsing_tests.rs +23 -0
  317. package/domainforge-core/tests/instance_integration_tests.rs +98 -0
  318. package/domainforge-core/tests/instance_parsing_tests.rs +58 -0
  319. package/domainforge-core/tests/instance_tests.rs +61 -0
  320. package/domainforge-core/tests/kg_uri_encoding_tests.rs +53 -0
  321. package/domainforge-core/tests/lint_tests.rs +19 -0
  322. package/domainforge-core/tests/metric_tests.rs +143 -0
  323. package/domainforge-core/tests/module_resolution_tests.rs +100 -0
  324. package/domainforge-core/tests/namespace_registry_tests.rs +247 -0
  325. package/domainforge-core/tests/null_handling_tests.rs +26 -0
  326. package/domainforge-core/tests/parser_ast_v3.rs +53 -0
  327. package/domainforge-core/tests/parser_dimension_registry_tests.rs +20 -0
  328. package/domainforge-core/tests/parser_integration_tests.rs +294 -0
  329. package/domainforge-core/tests/parser_metadata_tests.rs +97 -0
  330. package/domainforge-core/tests/parser_resource_domain_only_graph_test.rs +21 -0
  331. package/domainforge-core/tests/parser_resource_limits_tests.rs +122 -0
  332. package/domainforge-core/tests/parser_tests.rs +512 -0
  333. package/domainforge-core/tests/pattern_semantics_tests.rs +87 -0
  334. package/domainforge-core/tests/phase_14_determinism_tests.rs +166 -0
  335. package/domainforge-core/tests/phase_15_validation_error_tests.rs +136 -0
  336. package/domainforge-core/tests/phase_16_unicode_tests.rs +248 -0
  337. package/domainforge-core/tests/phase_17_export_tests.rs +285 -0
  338. package/domainforge-core/tests/phase_17_round_trip_tests.rs +264 -0
  339. package/domainforge-core/tests/policy_tests.rs +635 -0
  340. package/domainforge-core/tests/primitives_integration_tests.rs +151 -0
  341. package/domainforge-core/tests/print_rdf_xml.rs +14 -0
  342. package/domainforge-core/tests/printer_tests.rs +204 -0
  343. package/domainforge-core/tests/profile_tests.rs +35 -0
  344. package/domainforge-core/tests/projection_contracts_tests.rs +154 -0
  345. package/domainforge-core/tests/protobuf_projection_tests.rs +199 -0
  346. package/domainforge-core/tests/quantity_tests.rs +41 -0
  347. package/domainforge-core/tests/rdf_xml_typed_literal_tests.rs +105 -0
  348. package/domainforge-core/tests/registry_schema_tests.rs +33 -0
  349. package/domainforge-core/tests/resource_tests.rs +50 -0
  350. package/domainforge-core/tests/resource_unit_tests.rs +24 -0
  351. package/domainforge-core/tests/roles_relations_tests.rs +61 -0
  352. package/domainforge-core/tests/round_trip_tests.rs +34 -0
  353. package/domainforge-core/tests/runtime_toggle_tests.rs +70 -0
  354. package/domainforge-core/tests/sbvr_fact_schema_tests.rs +60 -0
  355. package/domainforge-core/tests/sbvr_flow_facts_tests.rs +55 -0
  356. package/domainforge-core/tests/sbvr_parsing_tests.rs +53 -0
  357. package/domainforge-core/tests/semantic_pack_alias_resolution.rs +197 -0
  358. package/domainforge-core/tests/semantic_pack_build.rs +302 -0
  359. package/domainforge-core/tests/semantic_pack_consumer_smoke.rs +150 -0
  360. package/domainforge-core/tests/semantic_pack_pack_set.rs +160 -0
  361. package/domainforge-core/tests/semantic_pack_signing.rs +157 -0
  362. package/domainforge-core/tests/semantic_pack_three_valued.rs +250 -0
  363. package/domainforge-core/tests/semantic_pack_validate.rs +196 -0
  364. package/domainforge-core/tests/std_lib_tests.rs +37 -0
  365. package/domainforge-core/tests/temporal_evaluation_tests.rs +159 -0
  366. package/domainforge-core/tests/temporal_semantics_tests.rs +214 -0
  367. package/domainforge-core/tests/three_valued_quantifiers_tests.rs +164 -0
  368. package/domainforge-core/tests/turtle_entity_export_tests.rs +38 -0
  369. package/domainforge-core/tests/turtle_escaping_tests.rs +53 -0
  370. package/domainforge-core/tests/turtle_resource_export_tests.rs +34 -0
  371. package/domainforge-core/tests/type_inference_tests.rs +40 -0
  372. package/domainforge-core/tests/unicode_validation_tests.rs +169 -0
  373. package/domainforge-core/tests/unit_tests.rs +81 -0
  374. package/domainforge-core/tests/validate_tests.rs +38 -0
  375. package/domainforge-core/tests/validation_unit_mismatch_tests.rs +83 -0
  376. package/domainforge-core/tests/wasm_tests.rs +229 -0
  377. package/domainforge-python/CHANGELOG-python.md +12 -0
  378. package/domainforge-python/MIGRATING.md +24 -0
  379. package/domainforge-python/README.md +256 -0
  380. package/domainforge-python/domainforge/__init__.py +95 -0
  381. package/domainforge-python/domainforge/domainforge.pyi +519 -0
  382. package/domainforge-python/pyproject.toml +36 -0
  383. package/domainforge-typescript/CHANGELOG-typescript.md +12 -0
  384. package/domainforge-typescript/LICENSE +201 -0
  385. package/domainforge-typescript/MIGRATING.md +24 -0
  386. package/domainforge-typescript/README.md +305 -0
  387. package/domainforge-typescript/index.d.ts +452 -0
  388. package/domainforge-typescript/index.js +361 -0
  389. package/domainforge-typescript/package.json +60 -0
  390. package/example.js +61 -0
  391. package/examples/browser.html +366 -0
  392. package/examples/namespaces/finance/cashflow.sea +5 -0
  393. package/examples/namespaces/logistics/core.sea +7 -0
  394. package/examples/observability_metrics.sea +38 -0
  395. package/fixtures/semantic_packs/acme_procurement/domain/entities.sea +39 -0
  396. package/fixtures/semantic_packs/acme_procurement/domain/metrics.sea +11 -0
  397. package/fixtures/semantic_packs/acme_procurement/domain/relations.sea +7 -0
  398. package/fixtures/semantic_packs/acme_procurement/domain/resources.sea +9 -0
  399. package/fixtures/semantic_packs/acme_procurement/review/acme.procurement.semantic-review.jsonl +7 -0
  400. package/fixtures/semantic_packs/acme_procurement/tests/ambiguous_vendor_alias.sea +8 -0
  401. package/fixtures/semantic_packs/acme_procurement/tests/deprecated_vendor_alias.sea +8 -0
  402. package/fixtures/semantic_packs/acme_procurement/tests/invalid_relation.sea +3 -0
  403. package/fixtures/semantic_packs/acme_procurement/tests/proposed_concept.sea +8 -0
  404. package/fixtures/semantic_packs/acme_procurement/tests/rejected_concept.sea +8 -0
  405. package/fixtures/semantic_packs/acme_procurement/tests/unit_mismatch.sea +7 -0
  406. package/fixtures/semantic_packs/acme_procurement/tests/unknown_vendor_policy.sea +8 -0
  407. package/fixtures/semantic_packs/acme_procurement/tests/valid_purchase_policy.sea +8 -0
  408. package/index.d.ts +2 -0
  409. package/index.js +8 -0
  410. package/justfile +200 -0
  411. package/lefthook.yml +13 -0
  412. package/lib/validate_native_exports.d.ts +4 -0
  413. package/lib/validate_native_exports.js +12 -0
  414. package/package.json +22 -0
  415. package/pytest.ini +5 -0
  416. package/python/tests/test_registry.py +75 -0
  417. package/python/tests/test_units.py +18 -0
  418. package/release-please-config.json +49 -0
  419. package/requirements-dev.txt +3 -0
  420. package/requirements.txt +3 -0
  421. package/rust-toolchain.toml +3 -0
  422. package/schemas/ast-v1.schema.json +72 -0
  423. package/schemas/ast-v2.schema.json +1200 -0
  424. package/schemas/ast-v3.schema.json +1200 -0
  425. package/schemas/sea-registry.schema.json +45 -0
  426. package/scripts/build-python.sh +37 -0
  427. package/scripts/build-release.sh +279 -0
  428. package/scripts/build-typescript.sh +13 -0
  429. package/scripts/build-wasm.sh +113 -0
  430. package/scripts/bump-version.sh +245 -0
  431. package/scripts/check_unused_test_imports.py +85 -0
  432. package/scripts/ci_tasks.py +379 -0
  433. package/scripts/clear_debug_test.sh +10 -0
  434. package/scripts/create-github-release.sh +262 -0
  435. package/scripts/create-tag.sh +203 -0
  436. package/scripts/find_and_link_test_binary.sh +70 -0
  437. package/scripts/generate-changelog.sh +271 -0
  438. package/scripts/generate-release-notes.sh +205 -0
  439. package/scripts/lint_release_security.py +96 -0
  440. package/scripts/lint_release_workflows.py +82 -0
  441. package/scripts/lint_workflow_gates.py +113 -0
  442. package/scripts/optimized-wasm-build.sh +61 -0
  443. package/scripts/patch_napi_types.py +62 -0
  444. package/scripts/pre-release-check.sh +289 -0
  445. package/scripts/prepare_rust_debug.sh +52 -0
  446. package/scripts/release.sh +373 -0
  447. package/scripts/resolve_rust_binary.py +230 -0
  448. package/scripts/run_commitlint.sh +29 -0
  449. package/scripts/test-all.sh +77 -0
  450. package/scripts/update_launch_program.py +93 -0
  451. package/secrets/README.md +27 -0
  452. package/secrets/secrets.yaml +21 -0
  453. package/test_integration.py +67 -0
  454. package/tests/test_authority.py +328 -0
  455. package/tests/test_ci_tasks.py +143 -0
  456. package/tests/test_expression.py +256 -0
  457. package/tests/test_golden_payment_flow.py +42 -0
  458. package/tests/test_graph.py +127 -0
  459. package/tests/test_instance.py +136 -0
  460. package/tests/test_parser.py +82 -0
  461. package/tests/test_primitives.py +68 -0
  462. package/tests/test_role_relation_parity.py +56 -0
  463. package/tests/test_runtime_toggle.py +156 -0
  464. package/tests/test_semantic_pack.py +639 -0
  465. package/tests/test_three_valued_eval.py +159 -0
  466. package/tsconfig.json +30 -0
  467. package/typescript-tests/advanced.test.ts +165 -0
  468. package/typescript-tests/authority.test.ts +216 -0
  469. package/typescript-tests/expression.test.ts +228 -0
  470. package/typescript-tests/golden-payment-flow.test.ts +51 -0
  471. package/typescript-tests/graph.test.ts +142 -0
  472. package/typescript-tests/native-binding.test.ts +20 -0
  473. package/typescript-tests/primitives.test.ts +88 -0
  474. package/typescript-tests/registry.test.ts +122 -0
  475. package/typescript-tests/role_relation.test.ts +63 -0
  476. package/typescript-tests/runtime_toggle.test.ts +141 -0
  477. package/typescript-tests/semantic-pack.test.ts +556 -0
  478. package/typescript-tests/three_valued_eval.test.ts +135 -0
  479. package/typescript-tests/units.test.ts +36 -0
  480. package/vitest.config.ts +13 -0
  481. package/wasm_demo.html +225 -0
@@ -0,0 +1,57 @@
1
+ # ADR-004: Enforce Projection Compatibility Semantics
2
+
3
+ **Status:** Accepted
4
+ **Date:** 2025-12-14
5
+ **Deciders:** DomainForge Architecture Team
6
+
7
+ ## Context
8
+
9
+ Protobuf and other schema formats require strong backward-compatibility guarantees to avoid breaking agents and services.
10
+
11
+ ## Decision
12
+
13
+ Each `Projection` SHALL declare a compatibility level:
14
+
15
+ | Level | Description |
16
+ | ---------- | -------------------------------------------------------------------- |
17
+ | `additive` | Only new fields may be added. No removals or modifications. |
18
+ | `backward` | Backward-compatible changes allowed. Removed fields become reserved. |
19
+ | `breaking` | Structural changes allowed with explicit version bump. |
20
+
21
+ Projection engines SHALL enforce these rules when generating artifacts.
22
+
23
+ ### Enforcement Rules
24
+
25
+ 1. **Additive Mode**
26
+
27
+ - New fields: ✅ Allowed
28
+ - Field removal: ❌ Rejected
29
+ - Field modification: ❌ Rejected
30
+
31
+ 2. **Backward Mode**
32
+
33
+ - New fields: ✅ Allowed
34
+ - Field removal: ✅ Allowed (becomes `reserved`)
35
+ - Field type changes: ❌ Rejected
36
+
37
+ 3. **Breaking Mode**
38
+ - All changes: ✅ Allowed
39
+ - Requires: Major version increment
40
+
41
+ ## Consequences
42
+
43
+ ### Positive
44
+
45
+ - Safe evolution of runtime contracts.
46
+ - Breaking changes are explicit and auditable.
47
+ - Field numbering and reservations are handled deterministically.
48
+
49
+ ### Negative
50
+
51
+ - Requires tracking schema history for diff operations.
52
+ - May slow down iteration during early development phases.
53
+
54
+ ## Related
55
+
56
+ - [ADR-002: Introduce Projection as a First-Class DSL Construct](./ADR-002-projection-first-class-construct.md)
57
+ - [ADR-003: Add Protobuf as a Projection Target](./ADR-003-protobuf-projection-target.md)
@@ -0,0 +1,112 @@
1
+ # ADR-005: Multi-Language Support Strategy
2
+
3
+ **Status:** Accepted
4
+ **Date:** 2025-12-14
5
+ **Deciders:** DomainForge Architecture Team
6
+
7
+ ## Context
8
+
9
+ DomainForge needs to support multiple runtime environments to maximize adoption:
10
+
11
+ - **Python**: Data scientists, ML engineers, enterprise automation
12
+ - **TypeScript/JavaScript**: Web applications, serverless functions, Node.js backends
13
+ - **WebAssembly (WASM)**: Browser-based tools, edge computing, sandboxed execution
14
+ - **Rust**: High-performance systems, CLI tools, core library consumers
15
+
16
+ Maintaining separate implementations for each language would lead to:
17
+
18
+ - Feature drift between implementations
19
+ - Multiplicative testing burden
20
+ - Inconsistent behavior across platforms
21
+
22
+ ## Decision
23
+
24
+ Implement a **single Rust core** (`domainforge-core`) that exposes bindings to other languages via FFI:
25
+
26
+ | Target | Binding Technology | Feature Flag |
27
+ | ------------------ | ------------------ | ------------ |
28
+ | Python | PyO3 + Maturin | `python` |
29
+ | TypeScript/Node.js | NAPI-RS | `typescript` |
30
+ | WebAssembly | wasm-bindgen | `wasm` |
31
+ | Rust | Native crate | (default) |
32
+
33
+ ### Binding Architecture
34
+
35
+ ```
36
+ ┌─────────────────────────────────────────────────────┐
37
+ │ domainforge-core (Rust) │
38
+ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────────┐ │
39
+ │ │ Parser │ │ Graph │ │ Policy │ │Projection│ │
40
+ │ └─────────┘ └─────────┘ └─────────┘ └──────────┘ │
41
+ └─────────────────────────────────────────────────────┘
42
+ │ │ │
43
+ ┌────┴────┐ ┌────┴────┐ ┌────┴────┐
44
+ │ PyO3 │ │ NAPI-RS │ │ WASM │
45
+ │ Binding │ │ Binding │ │ Binding │
46
+ └────┬────┘ └────┬────┘ └────┬────┘
47
+ │ │ │
48
+ ┌────┴────┐ ┌────┴────┐ ┌────┴────┐
49
+ │ Python │ │ Node │ │ Browser │
50
+ │ domainforge│ │ @sea │ │ @sea │
51
+ └─────────┘ └─────────┘ └─────────┘
52
+ ```
53
+
54
+ ### Binding Wrapper Pattern
55
+
56
+ Each binding module wraps core Rust types with language-idiomatic APIs:
57
+
58
+ ```rust
59
+ // Python binding example (domainforge-core/src/python/primitives.rs)
60
+ #[pyclass]
61
+ pub struct Entity {
62
+ inner: crate::primitives::Entity,
63
+ }
64
+
65
+ #[pymethods]
66
+ impl Entity {
67
+ #[new]
68
+ fn new(name: String, namespace: String) -> Self { /* ... */ }
69
+
70
+ #[getter]
71
+ fn name(&self) -> &str { self.inner.name() }
72
+ }
73
+ ```
74
+
75
+ ## Consequences
76
+
77
+ ### Positive
78
+
79
+ - **Single source of truth**: All semantics defined once in Rust.
80
+ - **Consistent behavior**: All platforms use identical parsing, validation, and projection logic.
81
+ - **Performance**: Core operations run at native speed; only boundary crossing has overhead.
82
+ - **Reduced maintenance**: Bug fixes and features automatically propagate to all bindings.
83
+
84
+ ### Negative
85
+
86
+ - **Rust expertise required**: Contributors must understand Rust for core changes.
87
+ - **FFI complexity**: Each binding layer introduces serialization/deserialization overhead.
88
+ - **Build complexity**: CI must build and test all target platforms.
89
+
90
+ ## Implementation Notes
91
+
92
+ ### Feature Flags
93
+
94
+ Bindings are conditionally compiled via Cargo features:
95
+
96
+ ```toml
97
+ [features]
98
+ python = ["pyo3", "pythonize"]
99
+ typescript = ["napi", "napi-derive"]
100
+ wasm = ["wasm-bindgen", "serde-wasm-bindgen"]
101
+ ```
102
+
103
+ ### Data Serialization
104
+
105
+ - Python: `pythonize` for automatic serde ↔ Python dict conversion
106
+ - TypeScript: `napi` with serde for JSON-like object passing
107
+ - WASM: `serde-wasm-bindgen` for efficient JS object bridging
108
+
109
+ ## Related
110
+
111
+ - [ADR-006: Error Handling Strategy](./ADR-006-error-handling-strategy.md)
112
+ - [SDS-002: SEA Core Architecture](./SDS-002-domainforge-core-architecture.md)
@@ -0,0 +1,115 @@
1
+ # ADR-006: Error Handling Strategy
2
+
3
+ **Status:** Accepted
4
+ **Date:** 2025-12-14
5
+ **Deciders:** DomainForge Architecture Team
6
+
7
+ ## Context
8
+
9
+ SEA-DSL operations can fail in multiple ways:
10
+
11
+ - **Parse errors**: Invalid syntax in `.sea` files
12
+ - **Validation errors**: Semantic violations (e.g., referencing undefined entities)
13
+ - **Policy violations**: Business rule failures during evaluation
14
+ - **Runtime errors**: I/O failures, module resolution issues
15
+
16
+ Errors must:
17
+
18
+ 1. Provide actionable diagnostics (file, line, column, suggestions)
19
+ 2. Cross FFI boundaries cleanly (Rust → Python/TypeScript/WASM)
20
+ 3. Support multiple output formats (human-readable, JSON, LSP)
21
+
22
+ ## Decision
23
+
24
+ ### Error Type Hierarchy
25
+
26
+ ```rust
27
+ // Core validation error with rich diagnostics
28
+ pub struct ValidationError {
29
+ pub code: ErrorCode,
30
+ pub message: String,
31
+ pub range: Option<SourceRange>,
32
+ pub severity: Severity,
33
+ pub suggestions: Vec<String>,
34
+ }
35
+
36
+ // Structured error codes for programmatic handling
37
+ pub enum ErrorCode {
38
+ // Syntax errors (1xxx)
39
+ SyntaxError = 1000,
40
+ UnexpectedToken = 1001,
41
+
42
+ // Semantic errors (2xxx)
43
+ UndefinedEntity = 2000,
44
+ DuplicateDeclaration = 2001,
45
+ TypeMismatch = 2002,
46
+
47
+ // Policy errors (3xxx)
48
+ PolicyViolation = 3000,
49
+ ConstraintFailed = 3001,
50
+
51
+ // Module errors (4xxx)
52
+ ModuleNotFound = 4000,
53
+ CircularImport = 4001,
54
+ }
55
+ ```
56
+
57
+ ### Diagnostic Formatters
58
+
59
+ Multiple output formats via the `DiagnosticFormatter` trait:
60
+
61
+ | Formatter | Use Case | Output |
62
+ | ---------------- | ------------------ | ---------------------------- |
63
+ | `HumanFormatter` | CLI output | Colored, contextual snippets |
64
+ | `JsonFormatter` | CI/automation | Structured JSON array |
65
+ | `LspFormatter` | Editor integration | LSP Diagnostic objects |
66
+
67
+ ### FFI Error Propagation
68
+
69
+ Errors are converted to native exceptions at language boundaries:
70
+
71
+ ```rust
72
+ // Python: Convert to Python exception
73
+ #[pyfunction]
74
+ fn parse(source: &str) -> PyResult<Graph> {
75
+ crate::parse_to_graph(source)
76
+ .map_err(|e| PyValueError::new_err(e.to_string()))
77
+ }
78
+
79
+ // TypeScript: Return Result-like object or throw
80
+ #[napi]
81
+ fn parse(source: String) -> napi::Result<Graph> {
82
+ crate::parse_to_graph(&source)
83
+ .map_err(|e| napi::Error::from_reason(e.to_string()))
84
+ }
85
+ ```
86
+
87
+ ### "Did You Mean?" Suggestions
88
+
89
+ The `fuzzy` module provides Levenshtein-distance-based suggestions:
90
+
91
+ ```rust
92
+ // When entity "Wharehouse" not found, suggest "Warehouse"
93
+ if let Some(suggestion) = fuzzy::did_you_mean("Wharehouse", known_entities) {
94
+ error.suggestions.push(format!("Did you mean '{}'?", suggestion));
95
+ }
96
+ ```
97
+
98
+ ## Consequences
99
+
100
+ ### Positive
101
+
102
+ - **Actionable errors**: Users get file locations and fix suggestions.
103
+ - **Programmatic handling**: Error codes enable automated error categorization.
104
+ - **IDE integration**: LSP formatter enables real-time editor diagnostics.
105
+ - **Cross-platform consistency**: Same error structure across all bindings.
106
+
107
+ ### Negative
108
+
109
+ - **Complexity**: Multiple formatter implementations to maintain.
110
+ - **FFI overhead**: Error details may be lost when converting to simple strings.
111
+
112
+ ## Related
113
+
114
+ - [ADR-005: Multi-Language Support Strategy](./ADR-005-multi-language-support-strategy.md)
115
+ - [SDS-002: SEA Core Architecture](./SDS-002-domainforge-core-architecture.md)
@@ -0,0 +1,95 @@
1
+ # ADR-007: Policy Evaluation Engine
2
+
3
+ **Status:** Accepted
4
+ **Date:** 2025-12-14
5
+ **Deciders:** DomainForge Architecture Team
6
+
7
+ ## Context
8
+
9
+ SEA-DSL policies express business rules as logical expressions over the semantic graph. These policies must:
10
+
11
+ 1. Evaluate efficiently over large graphs (10,000+ entities)
12
+ 2. Support quantified expressions (`forall`, `exists`)
13
+ 3. Handle missing/null data gracefully
14
+ 4. Provide actionable violation reports
15
+
16
+ Traditional two-valued boolean logic (true/false) fails when data is incomplete, leading to false positives or missed violations.
17
+
18
+ ## Decision
19
+
20
+ ### Three-Valued Logic
21
+
22
+ Implement a **three-valued logic** system based on Kleene's strong logic:
23
+
24
+ | Expression | Result |
25
+ | ----------------- | ------- |
26
+ | true AND unknown | unknown |
27
+ | false AND unknown | false |
28
+ | true OR unknown | true |
29
+ | false OR unknown | unknown |
30
+ | NOT unknown | unknown |
31
+
32
+ ```rust
33
+ pub enum TruthValue {
34
+ True,
35
+ False,
36
+ Unknown, // NULL propagation
37
+ }
38
+
39
+ impl TruthValue {
40
+ pub fn and(self, other: TruthValue) -> TruthValue {
41
+ match (self, other) {
42
+ (TruthValue::False, _) | (_, TruthValue::False) => TruthValue::False,
43
+ (TruthValue::Unknown, _) | (_, TruthValue::Unknown) => TruthValue::Unknown,
44
+ _ => TruthValue::True,
45
+ }
46
+ }
47
+ }
48
+ ```
49
+
50
+ ### Quantifier Evaluation
51
+
52
+ Support universal and existential quantifiers over graph collections:
53
+
54
+ ```sea
55
+ // Universal: must hold for ALL matching entities
56
+ Policy all_flows_positive as:
57
+ forall f in Flow: f.quantity > 0
58
+
59
+ // Existential: must hold for AT LEAST ONE entity
60
+ Policy has_active_warehouse as:
61
+ exists e in Entity where e.type = "Warehouse": e.active = true
62
+ ```
63
+
64
+ ### Expression Evaluation
65
+
66
+ Expressions are parsed into an AST and evaluated against the graph:
67
+
68
+ ```rust
69
+ pub enum Expression {
70
+ Literal(Value),
71
+ FieldAccess { object: Box<Expression>, field: String },
72
+ BinaryOp { left: Box<Expression>, op: BinaryOperator, right: Box<Expression> },
73
+ UnaryOp { op: UnaryOperator, operand: Box<Expression> },
74
+ Quantifier { kind: QuantifierKind, variable: String, domain: String, filter: Option<Box<Expression>>, body: Box<Expression> },
75
+ }
76
+ ```
77
+
78
+ ## Consequences
79
+
80
+ ### Positive
81
+
82
+ - **Null-safe**: Missing data doesn't cause false violations
83
+ - **Expressive**: Quantifiers enable complex business rules
84
+ - **Efficient**: Lazy evaluation and short-circuit logic
85
+ - **Debuggable**: Clear violation messages with context
86
+
87
+ ### Negative
88
+
89
+ - **Complexity**: Three-valued logic less intuitive than boolean
90
+ - **Performance**: Quantifier evaluation is O(n) per policy
91
+
92
+ ## Related
93
+
94
+ - [SDS-004: Policy Engine Design](./SDS-004-policy-engine-design.md)
95
+ - [ADR-001: SEA-DSL as Semantic Source of Truth](./ADR-001-sea-dsl-semantic-source-of-truth.md)
@@ -0,0 +1,90 @@
1
+ # ADR-008: Knowledge Graph Integration
2
+
3
+ **Status:** Accepted
4
+ **Date:** 2025-12-14
5
+ **Deciders:** DomainForge Architecture Team
6
+
7
+ ## Context
8
+
9
+ Enterprise systems often maintain knowledge in RDF/OWL knowledge graphs. SEA needs to:
10
+
11
+ 1. Export semantic models to standard RDF formats (Turtle, RDF-XML)
12
+ 2. Import existing knowledge graphs into SEA models
13
+ 3. Validate graph constraints using SHACL shapes
14
+ 4. Enable interoperability with semantic web tooling
15
+
16
+ ## Decision
17
+
18
+ ### RDF Export
19
+
20
+ SEA graphs export to RDF using a canonical vocabulary:
21
+
22
+ | SEA Concept | RDF Mapping |
23
+ | ----------- | ------------------------------------------------------- |
24
+ | Entity | `sea:Entity` instance with `rdfs:label` |
25
+ | Resource | `sea:Resource` instance with `sea:unit` |
26
+ | Flow | `sea:Flow` with `sea:from`, `sea:to`, `sea:hasResource` |
27
+ | Relation | `sea:Relation` with subject/object roles |
28
+
29
+ ### Turtle Format
30
+
31
+ ```turtle
32
+ @prefix sea: <http://domainforge.ai/sea#> .
33
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
34
+
35
+ sea:Warehouse a sea:Entity ;
36
+ rdfs:label "Warehouse" ;
37
+ sea:namespace "logistics" .
38
+
39
+ sea:Camera a sea:Resource ;
40
+ rdfs:label "Camera" ;
41
+ sea:unit "units" .
42
+ ```
43
+
44
+ ### SHACL Validation
45
+
46
+ Generate SHACL shapes from SEA policies and validate imported graphs:
47
+
48
+ ```rust
49
+ pub struct ShaclShape {
50
+ pub target_class: String,
51
+ pub properties: Vec<ShaclProperty>,
52
+ }
53
+
54
+ pub struct ShaclProperty {
55
+ pub path: String,
56
+ pub datatype: Option<String>,
57
+ pub min_count: Option<u32>,
58
+ pub max_count: Option<u32>,
59
+ pub min_exclusive: Option<String>,
60
+ }
61
+ ```
62
+
63
+ ### Bidirectional Round-Trip
64
+
65
+ ```
66
+ SEA Graph
67
+ ↓ to_turtle()
68
+ Turtle/RDF
69
+ ↓ from_turtle()
70
+ SEA Graph (restored)
71
+ ```
72
+
73
+ ## Consequences
74
+
75
+ ### Positive
76
+
77
+ - **Interoperability**: Standard formats enable tool integration
78
+ - **Semantic web**: Leverage existing RDF infrastructure
79
+ - **Validation**: SHACL provides schema-level constraint checking
80
+ - **Portability**: Export models for external consumption
81
+
82
+ ### Negative
83
+
84
+ - **Lossy conversion**: Some SEA semantics may not map perfectly to RDF
85
+ - **Complexity**: RDF parsing adds dependency weight
86
+
87
+ ## Related
88
+
89
+ - [SDS-005: Knowledge Graph Module](./SDS-005-knowledge-graph-module.md)
90
+ - [ADR-001: SEA-DSL as Semantic Source of Truth](./ADR-001-sea-dsl-semantic-source-of-truth.md)
@@ -0,0 +1,115 @@
1
+ # ADR-009: Module Resolution Strategy
2
+
3
+ **Status:** Accepted
4
+ **Date:** 2025-12-14
5
+ **Deciders:** DomainForge Architecture Team
6
+
7
+ ## Context
8
+
9
+ Large SEA models need to be split across multiple files for maintainability. This requires:
10
+
11
+ 1. Import syntax for referencing external SEA files
12
+ 2. Namespace resolution for qualified references
13
+ 3. Standard library of reusable types
14
+ 4. Circular dependency detection
15
+
16
+ ## Decision
17
+
18
+ ### Import Syntax
19
+
20
+ ```sea
21
+ // Relative file import
22
+ import "common/types.sea"
23
+
24
+ // Namespace binding
25
+ import namespace core from "std/core.sea"
26
+
27
+ // Selective import
28
+ import { Customer, Order } from "domain/entities.sea"
29
+ ```
30
+
31
+ ### Namespace Registry
32
+
33
+ A `.sea-registry.toml` file at the project root maps namespace prefixes to file paths:
34
+
35
+ ```toml
36
+ [namespaces]
37
+ core = "domainforge-core/std/core.sea"
38
+ http = "domainforge-core/std/http.sea"
39
+ aws = "domainforge-core/std/aws.sea"
40
+ domain = "src/domain/index.sea"
41
+ ```
42
+
43
+ ### Resolution Algorithm
44
+
45
+ 1. Check if namespace is in registry
46
+ 2. Resolve relative to entry file if not found
47
+ 3. Search standard library paths
48
+ 4. Fail with helpful error message
49
+
50
+ ```rust
51
+ pub struct ModuleResolver {
52
+ registry: NamespaceRegistry,
53
+ loaded: HashMap<PathBuf, Ast>,
54
+ }
55
+
56
+ impl ModuleResolver {
57
+ pub fn resolve(&mut self, import: &ImportSpec, from: &Path) -> Result<Ast, ParseError> {
58
+ // 1. Try registry lookup
59
+ if let Some(path) = self.registry.resolve(&import.namespace) {
60
+ return self.load(path);
61
+ }
62
+
63
+ // 2. Try relative resolution
64
+ let relative = from.parent().unwrap().join(&import.path);
65
+ if relative.exists() {
66
+ return self.load(&relative);
67
+ }
68
+
69
+ // 3. Fail with suggestion
70
+ Err(ParseError::ModuleNotFound { /* ... */ })
71
+ }
72
+ }
73
+ ```
74
+
75
+ ### Circular Dependency Detection
76
+
77
+ Track loading state to detect cycles:
78
+
79
+ ```rust
80
+ enum LoadState {
81
+ Loading, // Currently being parsed
82
+ Loaded(Ast), // Successfully loaded
83
+ }
84
+
85
+ // If we encounter Loading while resolving, it's circular
86
+ ```
87
+
88
+ ### Standard Library
89
+
90
+ Built-in types available via `std:` prefix:
91
+
92
+ | Module | Contents |
93
+ | ---------- | ------------------------------ |
94
+ | `std:core` | Basic types (UUID, Email, URL) |
95
+ | `std:http` | HTTP request/response patterns |
96
+ | `std:aws` | AWS resource types |
97
+
98
+ ## Consequences
99
+
100
+ ### Positive
101
+
102
+ - **Modularity**: Large models split into maintainable files
103
+ - **Reusability**: Standard library provides common patterns
104
+ - **Clarity**: Explicit namespace bindings reduce ambiguity
105
+ - **Safety**: Circular dependencies caught at parse time
106
+
107
+ ### Negative
108
+
109
+ - **Configuration**: Requires `.sea-registry.toml` setup
110
+ - **Complexity**: Resolution logic adds parsing overhead
111
+
112
+ ## Related
113
+
114
+ - [SDS-003: Parser and Semantic Graph](./SDS-003-parser-semantic-graph.md)
115
+ - [ADR-001: SEA-DSL as Semantic Source of Truth](./ADR-001-sea-dsl-semantic-source-of-truth.md)
@@ -0,0 +1,106 @@
1
+ # ADR-010: Unit System
2
+
3
+ **Status:** Accepted
4
+ **Date:** 2025-12-14
5
+ **Deciders:** DomainForge Architecture Team
6
+
7
+ ## Context
8
+
9
+ SEA Resources have associated units of measurement (e.g., "units", "kg", "USD"). The system needs to:
10
+
11
+ 1. Parse unit specifications from DSL source
12
+ 2. Validate unit compatibility in operations
13
+ 3. Support unit conversions where applicable
14
+ 4. Enable dimensional analysis for type safety
15
+
16
+ ## Decision
17
+
18
+ ### Unit Representation
19
+
20
+ ```rust
21
+ pub struct Unit {
22
+ pub symbol: String, // "kg", "USD", "units"
23
+ pub name: String, // "Kilogram", "US Dollar", "Units"
24
+ pub dimension: Dimension, // Mass, Currency, Count
25
+ pub scale: f64, // Conversion factor to base unit
26
+ pub base_symbol: String, // Base unit symbol
27
+ }
28
+
29
+ pub enum Dimension {
30
+ Mass,
31
+ Length,
32
+ Time,
33
+ Currency,
34
+ Count,
35
+ Temperature,
36
+ Custom(String),
37
+ }
38
+ ```
39
+
40
+ ### Unit Parsing
41
+
42
+ ```rust
43
+ pub fn unit_from_string(s: &str) -> Unit {
44
+ match s.to_lowercase().as_str() {
45
+ "units" | "unit" => Unit::count(),
46
+ "kg" | "kilograms" => Unit::mass_kg(),
47
+ "usd" | "dollars" => Unit::currency_usd(),
48
+ // ... more built-in units
49
+ custom => Unit::custom(custom),
50
+ }
51
+ }
52
+ ```
53
+
54
+ ### Conversion Operator
55
+
56
+ The DSL supports explicit unit conversion via the `as` operator:
57
+
58
+ ```sea
59
+ Resource "Response Time" 1000 'ms' as 's' // Converts to 1 second
60
+ ```
61
+
62
+ ### Dimensional Analysis
63
+
64
+ Prevent invalid operations at parse time:
65
+
66
+ ```sea
67
+ // Error: Cannot add Mass and Currency
68
+ Policy invalid as: Weight.value + Price.value > 100
69
+ ```
70
+
71
+ ### Unit Registry
72
+
73
+ Extensible registry for custom units:
74
+
75
+ ```rust
76
+ pub struct UnitRegistry {
77
+ units: HashMap<String, Unit>,
78
+ conversions: HashMap<(String, String), f64>,
79
+ }
80
+
81
+ impl UnitRegistry {
82
+ pub fn convert(&self, value: f64, from: &str, to: &str) -> Option<f64> {
83
+ self.conversions.get(&(from.to_string(), to.to_string()))
84
+ .map(|factor| value * factor)
85
+ }
86
+ }
87
+ ```
88
+
89
+ ## Consequences
90
+
91
+ ### Positive
92
+
93
+ - **Type safety**: Dimensional analysis catches unit errors
94
+ - **Expressiveness**: Natural unit syntax in DSL
95
+ - **Flexibility**: Custom units for domain-specific needs
96
+ - **Interoperability**: Standard units map to external systems
97
+
98
+ ### Negative
99
+
100
+ - **Complexity**: Full dimensional analysis is non-trivial
101
+ - **Limitations**: Not all unit conversions are linear
102
+
103
+ ## Related
104
+
105
+ - [SDS-002: SEA Core Architecture](./SDS-002-domainforge-core-architecture.md)
106
+ - [PRD-003: DSL Core Capabilities](./PRD-003-dsl-core-capabilities.md)