clm-kernel 0.0.0__py3-none-any.whl

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 (333) hide show
  1. clm/__init__.py +230 -0
  2. clm/__main__.py +25 -0
  3. clm/cross_cutting/__init__.py +50 -0
  4. clm/cross_cutting/_test_runner.py +36 -0
  5. clm/cross_cutting/async_utils.py +25 -0
  6. clm/cross_cutting/cel_builder.py +123 -0
  7. clm/cross_cutting/cel_converter.py +697 -0
  8. clm/cross_cutting/cel_engine.py +252 -0
  9. clm/cross_cutting/cel_ops.py +72 -0
  10. clm/cross_cutting/cel_ops_db.py +157 -0
  11. clm/cross_cutting/cel_ops_files.py +99 -0
  12. clm/cross_cutting/cel_ops_state.py +71 -0
  13. clm/cross_cutting/cel_ops_strings.py +64 -0
  14. clm/cross_cutting/cel_resolver.py +63 -0
  15. clm/cross_cutting/cel_slices.py +56 -0
  16. clm/cross_cutting/cel_store.py +330 -0
  17. clm/cross_cutting/clm_logger.py +140 -0
  18. clm/cross_cutting/config/__init__.py +155 -0
  19. clm/cross_cutting/config/config_constants.py +392 -0
  20. clm/cross_cutting/config/env_parameters.py +90 -0
  21. clm/cross_cutting/config/logging.py +378 -0
  22. clm/cross_cutting/config/settings.py +504 -0
  23. clm/cross_cutting/context.py +5 -0
  24. clm/cross_cutting/domain_models.py +55 -0
  25. clm/cross_cutting/domain_types.py +61 -0
  26. clm/cross_cutting/effects.py +67 -0
  27. clm/cross_cutting/errors.py +153 -0
  28. clm/cross_cutting/governance.py +331 -0
  29. clm/cross_cutting/guards.py +41 -0
  30. clm/cross_cutting/mcard.py +321 -0
  31. clm/cross_cutting/native.py +185 -0
  32. clm/cross_cutting/observability.py +289 -0
  33. clm/cross_cutting/pcard.py +434 -0
  34. clm/cross_cutting/registry.py +71 -0
  35. clm/cross_cutting/resources.py +84 -0
  36. clm/cross_cutting/secrets.py +44 -0
  37. clm/cross_cutting/subprocess_utils.py +118 -0
  38. clm/cross_cutting/telemetry.py +164 -0
  39. clm/cross_cutting/testing/__init__.py +8 -0
  40. clm/cross_cutting/testing/comparator.py +187 -0
  41. clm/cross_cutting/testing/datasets.py +87 -0
  42. clm/cross_cutting/timeutil.py +20 -0
  43. clm/cross_cutting/types/new_type_check.py +0 -0
  44. clm/cross_cutting/utils/__init__.py +1 -0
  45. clm/cross_cutting/utils/url_safety.py +50 -0
  46. clm/cross_cutting/vcard.py +560 -0
  47. clm/cross_cutting/writer.py +118 -0
  48. clm/layer0/README.md +50 -0
  49. clm/layer0/__init__.py +223 -0
  50. clm/layer0/algebra.py +60 -0
  51. clm/layer0/algebra_baldwin.py +133 -0
  52. clm/layer0/algebra_baldwin_generators.py +36 -0
  53. clm/layer0/algebra_equivalence.py +262 -0
  54. clm/layer0/algebra_ingest.py +306 -0
  55. clm/layer0/algebra_manifest_io.py +156 -0
  56. clm/layer0/assembler.py +481 -0
  57. clm/layer0/cel/__init__.py +23 -0
  58. clm/layer0/cel_eval.py +491 -0
  59. clm/layer0/codec.py +106 -0
  60. clm/layer0/context.py +122 -0
  61. clm/layer0/db.py +160 -0
  62. clm/layer0/exceptions.py +73 -0
  63. clm/layer0/fibration.py +106 -0
  64. clm/layer0/gates.py +50 -0
  65. clm/layer0/hash.py +80 -0
  66. clm/layer0/loader.py +826 -0
  67. clm/layer0/math_utils.py +163 -0
  68. clm/layer0/mcard.py +96 -0
  69. clm/layer0/model/__init__.py +0 -0
  70. clm/layer0/model/action.py +223 -0
  71. clm/layer0/model/card.py +280 -0
  72. clm/layer0/model/card_triad.py +427 -0
  73. clm/layer0/model/compatibility.py +60 -0
  74. clm/layer0/model/dictionary.py +46 -0
  75. clm/layer0/model/dots.py +331 -0
  76. clm/layer0/model/event_producer.py +88 -0
  77. clm/layer0/model/g_time.py +89 -0
  78. clm/layer0/model/handle.py +163 -0
  79. clm/layer0/model/hash/__init__.py +6 -0
  80. clm/layer0/model/hash/algorithms/__init__.py +3 -0
  81. clm/layer0/model/hash/algorithms/custom_hash.py +7 -0
  82. clm/layer0/model/hash/algorithms/local_sha256.py +178 -0
  83. clm/layer0/model/hash/constants.py +53 -0
  84. clm/layer0/model/hash/enums.py +60 -0
  85. clm/layer0/model/hash/validator.py +307 -0
  86. clm/layer0/model/interpreter.py +275 -0
  87. clm/layer0/model/pagination.py +45 -0
  88. clm/layer0/model/pcard.py +716 -0
  89. clm/layer0/model/schema.py +44 -0
  90. clm/layer0/model/utils/__init__.py +1 -0
  91. clm/layer0/model/utils/content_analyzer.py +152 -0
  92. clm/layer0/model/validators/__init__.py +1 -0
  93. clm/layer0/model/validators/base_validator.py +44 -0
  94. clm/layer0/model/validators/binary_validator.py +66 -0
  95. clm/layer0/model/validators/text_validator.py +82 -0
  96. clm/layer0/model/validators/validation_registry.py +49 -0
  97. clm/layer0/model/vcard.py +823 -0
  98. clm/layer0/model/vcard_ext/__init__.py +39 -0
  99. clm/layer0/model/vcard_ext/core.py +60 -0
  100. clm/layer0/model/vcard_ext/network.py +23 -0
  101. clm/layer0/model/vcard_ext/observability.py +63 -0
  102. clm/layer0/model/vcard_ext/storage.py +60 -0
  103. clm/layer0/model/vcard_ext/vendors.py +211 -0
  104. clm/layer0/model/vcard_sandwich.py +119 -0
  105. clm/layer0/model/vcard_vocabulary.py +463 -0
  106. clm/layer0/model/workflow.py +274 -0
  107. clm/layer0/narrative.py +431 -0
  108. clm/layer0/ontology/collection.py +125 -0
  109. clm/layer0/parser.py +429 -0
  110. clm/layer0/relations.py +73 -0
  111. clm/layer0/rule_evaluator.py +251 -0
  112. clm/layer0/schema/__init__.py +38 -0
  113. clm/layer0/schema/ddl.py +97 -0
  114. clm/layer0/templates/abstract.yaml +99 -0
  115. clm/layer0/templates/balanced.yaml +253 -0
  116. clm/layer0/templates/concrete.yaml +172 -0
  117. clm/layer0/type_registry.py +223 -0
  118. clm/layer0/types.py +204 -0
  119. clm/layer0/utils.py +886 -0
  120. clm/layer0/verifier_core.py +262 -0
  121. clm/layer1/__init__.py +31 -0
  122. clm/layer1/action_dispatcher.py +275 -0
  123. clm/layer1/adapter_registry.py +233 -0
  124. clm/layer1/algebra_baldwin_generators.py +192 -0
  125. clm/layer1/arrow_compiler.py +525 -0
  126. clm/layer1/batch_processor.py +152 -0
  127. clm/layer1/cel/__init__.py +27 -0
  128. clm/layer1/cel/builder.py +173 -0
  129. clm/layer1/engine.py +759 -0
  130. clm/layer1/engine_async.py +89 -0
  131. clm/layer1/eval_callback.py +49 -0
  132. clm/layer1/gate_composer.py +229 -0
  133. clm/layer1/hoare_sandwich.py +298 -0
  134. clm/layer1/identity_guard.py +348 -0
  135. clm/layer1/matrix.py +138 -0
  136. clm/layer1/neural_runtime.py +221 -0
  137. clm/layer1/operations/__init__.py +123 -0
  138. clm/layer1/operations/augment.py +156 -0
  139. clm/layer1/operations/base.py +109 -0
  140. clm/layer1/operations/builtins.py +338 -0
  141. clm/layer1/operations/dispatch.py +144 -0
  142. clm/layer1/operations/exclude.py +107 -0
  143. clm/layer1/operations/handle.py +197 -0
  144. clm/layer1/operations/identity.py +139 -0
  145. clm/layer1/operations/invert.py +66 -0
  146. clm/layer1/operations/loader.py +116 -0
  147. clm/layer1/operations/manipulators/__init__.py +23 -0
  148. clm/layer1/operations/manipulators/document.py +211 -0
  149. clm/layer1/operations/manipulators/media.py +134 -0
  150. clm/layer1/operations/manipulators/structured.py +159 -0
  151. clm/layer1/operations/manipulators/tabular.py +334 -0
  152. clm/layer1/operations/port.py +65 -0
  153. clm/layer1/operations/services.py +529 -0
  154. clm/layer1/operations/split.py +117 -0
  155. clm/layer1/operations/substitute.py +75 -0
  156. clm/layer1/petri.py +1052 -0
  157. clm/layer1/pocketflow_orchestrator.py +408 -0
  158. clm/layer1/pocketflow_scheduler.py +519 -0
  159. clm/layer1/protocols.py +197 -0
  160. clm/layer1/runtime_adapter.py +718 -0
  161. clm/layer1/runtimes/__init__.py +71 -0
  162. clm/layer1/runtimes/_generated_assertions.py +125 -0
  163. clm/layer1/runtimes/_generated_types.py +42 -0
  164. clm/layer1/runtimes/base.py +265 -0
  165. clm/layer1/runtimes/binary.py +101 -0
  166. clm/layer1/runtimes/factory.py +203 -0
  167. clm/layer1/runtimes/javascript.py +321 -0
  168. clm/layer1/runtimes/javascript_runtime.js +33 -0
  169. clm/layer1/runtimes/js_scripts/isomorphism.mjs +22 -0
  170. clm/layer1/runtimes/js_scripts/loader.mjs +52 -0
  171. clm/layer1/runtimes/lambda_calc.py +126 -0
  172. clm/layer1/runtimes/python.py +288 -0
  173. clm/layer1/runtimes/python_runtime.py +41 -0
  174. clm/layer1/runtimes/script.py +114 -0
  175. clm/layer1/sandbox.py +334 -0
  176. clm/layer1/savepoint_guard.py +136 -0
  177. clm/layer1/sparse_net.py +122 -0
  178. clm/layer1/spec_tester.py +165 -0
  179. clm/layer1/store.py +295 -0
  180. clm/layer1/test_runner.py +498 -0
  181. clm/layer1/type_inspector.py +166 -0
  182. clm/layer1/verifier.py +772 -0
  183. clm/layer1/vm.py +91 -0
  184. clm/layer2/__init__.py +78 -0
  185. clm/layer2/card_collection.py +678 -0
  186. clm/layer2/classifier.py +479 -0
  187. clm/layer2/engine/__init__.py +1 -0
  188. clm/layer2/engine/abstract_sql_engine.py +320 -0
  189. clm/layer2/engine/base.py +193 -0
  190. clm/layer2/engine/duckdb_engine.py +576 -0
  191. clm/layer2/engine/sqlite_engine.py +518 -0
  192. clm/layer2/fiber/__init__.py +31 -0
  193. clm/layer2/fiber/context.py +89 -0
  194. clm/layer2/fiber/disposable.py +163 -0
  195. clm/layer2/fiber/fiber.py +125 -0
  196. clm/layer2/fiber/hoare.py +191 -0
  197. clm/layer2/file_io.py +376 -0
  198. clm/layer2/file_registrar.py +77 -0
  199. clm/layer2/ingest.py +202 -0
  200. clm/layer2/lineage.py +322 -0
  201. clm/layer2/mcard_fs.py +262 -0
  202. clm/layer2/merkle.py +11 -0
  203. clm/layer2/mime.py +244 -0
  204. clm/layer2/mime_detector.py +245 -0
  205. clm/layer2/private_collection.py +118 -0
  206. clm/layer2/shared_store.py +11 -0
  207. clm/layer2/storage/__init__.py +190 -0
  208. clm/layer2/storage/db_bitemporal.py +141 -0
  209. clm/layer2/storage/db_driver.py +331 -0
  210. clm/layer2/storage/db_hyperlinks.py +214 -0
  211. clm/layer2/storage/db_pool.py +139 -0
  212. clm/layer2/storage/db_repository.py +229 -0
  213. clm/layer2/storage/savepoint.py +78 -0
  214. clm/layer2/storage/sqlite_wal.py +74 -0
  215. clm/layer2/tridb.py +245 -0
  216. clm/layer2/vcard_receipt.py +71 -0
  217. clm/layer2/vfs.py +17 -0
  218. clm/layer3/__init__.py +141 -0
  219. clm/layer3/agency/__init__.py +19 -0
  220. clm/layer3/agency/config.py +220 -0
  221. clm/layer3/agency/providers/__init__.py +15 -0
  222. clm/layer3/agency/providers/base.py +91 -0
  223. clm/layer3/agency/providers/mlc_llm.py +169 -0
  224. clm/layer3/agency/providers/ollama.py +203 -0
  225. clm/layer3/agency/router.py +71 -0
  226. clm/layer3/agency/runtime.py +524 -0
  227. clm/layer3/gateway.py +353 -0
  228. clm/layer3/open_interpreter_adapter.py +159 -0
  229. clm/layer3/rag/__init__.py +70 -0
  230. clm/layer3/rag/cli.py +228 -0
  231. clm/layer3/rag/config.py +153 -0
  232. clm/layer3/rag/embeddings/__init__.py +16 -0
  233. clm/layer3/rag/embeddings/base.py +79 -0
  234. clm/layer3/rag/embeddings/ollama.py +211 -0
  235. clm/layer3/rag/embeddings/vision.py +290 -0
  236. clm/layer3/rag/engine.py +276 -0
  237. clm/layer3/rag/graph/__init__.py +22 -0
  238. clm/layer3/rag/graph/community.py +198 -0
  239. clm/layer3/rag/graph/engine.py +433 -0
  240. clm/layer3/rag/graph/extractor.py +255 -0
  241. clm/layer3/rag/graph/schema.py +115 -0
  242. clm/layer3/rag/graph/store.py +641 -0
  243. clm/layer3/rag/indexer.py +333 -0
  244. clm/layer3/rag/llm_providers.json +52 -0
  245. clm/layer3/rag/semantic_versioning.py +313 -0
  246. clm/layer3/rag/vector/__init__.py +28 -0
  247. clm/layer3/rag/vector/handle_vector_store.py +749 -0
  248. clm/layer3/rag/vector/schema.py +151 -0
  249. clm/layer3/rag/vector/store.py +632 -0
  250. clm/layer3/reticulum/__init__.py +55 -0
  251. clm/layer3/reticulum/bridge.py +74 -0
  252. clm/layer3/reticulum/daemon.py +88 -0
  253. clm/layer3/reticulum/discovery.py +164 -0
  254. clm/layer3/reticulum/identity.py +107 -0
  255. clm/layer3/reticulum/media.py +148 -0
  256. clm/layer3/reticulum/transport.py +133 -0
  257. clm/layer3/satori/__init__.py +209 -0
  258. clm/layer3/satori/alpha_conversion.py +168 -0
  259. clm/layer3/satori/beta_reduction.py +359 -0
  260. clm/layer3/satori/continuation.py +38 -0
  261. clm/layer3/satori/eta_conversion.py +205 -0
  262. clm/layer3/satori/free_variables.py +163 -0
  263. clm/layer3/satori/io_effects.py +370 -0
  264. clm/layer3/satori/lambda_runtime.py +726 -0
  265. clm/layer3/satori/lambda_term.py +230 -0
  266. clm/layer3/satori/sheaf_audit.py +261 -0
  267. clm/layer3/satori/speech_act.py +279 -0
  268. clm/layer4/README.md +9 -0
  269. clm/layer4/__init__.py +67 -0
  270. clm/layer4/_sovereign_executor.py +580 -0
  271. clm/layer4/action_commands.py +719 -0
  272. clm/layer4/api.py +236 -0
  273. clm/layer4/bootstrap/__init__.py +13 -0
  274. clm/layer4/bootstrap/bootstrapper.py +118 -0
  275. clm/layer4/bootstrap/cleanup.py +44 -0
  276. clm/layer4/bootstrap/clm_hooks.py +49 -0
  277. clm/layer4/bootstrap/genesis.py +77 -0
  278. clm/layer4/bootstrap/injection.py +125 -0
  279. clm/layer4/cli.py +549 -0
  280. clm/layer4/collection_manager.py +553 -0
  281. clm/layer4/commands/__init__.py +81 -0
  282. clm/layer4/commands/action_cmd.py +42 -0
  283. clm/layer4/commands/check_cmd.py +82 -0
  284. clm/layer4/commands/envelope.py +73 -0
  285. clm/layer4/commands/evaluate_cmd.py +224 -0
  286. clm/layer4/commands/mcard_cmd.py +24 -0
  287. clm/layer4/commands/petri_cmd.py +92 -0
  288. clm/layer4/commands/tridb_cmd.py +319 -0
  289. clm/layer4/commands/version_cmd.py +27 -0
  290. clm/layer4/diff_commands.py +167 -0
  291. clm/layer4/eoa_sponsor.py +232 -0
  292. clm/layer4/events.py +69 -0
  293. clm/layer4/flux_gateway.py +133 -0
  294. clm/layer4/gateway.py +91 -0
  295. clm/layer4/loader.py +307 -0
  296. clm/layer4/mcard_commands.py +166 -0
  297. clm/layer4/membrane.py +273 -0
  298. clm/layer4/navigation.py +50 -0
  299. clm/layer4/protocol/protocol_entry_python.py +108 -0
  300. clm/layer4/protocol/python_sync.py +126 -0
  301. clm/layer4/runner.py +150 -0
  302. clm/layer4/satori.py +262 -0
  303. clm/layer4/server/python_sync_client.py +150 -0
  304. clm/layer4/server/python_sync_server.py +139 -0
  305. clm/layer4/server/service_api.py +315 -0
  306. clm/layer4/server/start_servers.py +107 -0
  307. clm/layer4/server/stop_servers.py +24 -0
  308. clm/layer4/simulated_optimization_fix.py +0 -0
  309. clm/layer4/storage.py +463 -0
  310. clm/layer4/tridb_admin.py +268 -0
  311. clm/layer4/websocket/test_ws_client.py +104 -0
  312. clm/layer4/websocket/test_ws_server.py +138 -0
  313. clm/layer4/websocket/ws_server_local.py +160 -0
  314. clm/layer5/__init__.py +51 -0
  315. clm/layer5/async_batch_writer.py +133 -0
  316. clm/layer5/learning.py +276 -0
  317. clm/layer5/telemetry_hook.py +107 -0
  318. clm/layer5/type_lattice.py +238 -0
  319. clm/py.typed +0 -0
  320. clm/schemas/__init__.py +652 -0
  321. clm/schemas/abstract_face_schema.yaml +77 -0
  322. clm/schemas/cel_schema.yaml +416 -0
  323. clm/schemas/lifecycle/__init__.py +45 -0
  324. clm/schemas/lifecycle/models.py +123 -0
  325. clm/schemas/lifecycle/service.py +364 -0
  326. clm/schemas/mcard_schema.sql +192 -0
  327. clm/schemas/mcard_vector_schema.sql +283 -0
  328. clm/schemas/mlp-context-v1.json +91 -0
  329. clm_kernel-0.0.0.dist-info/METADATA +121 -0
  330. clm_kernel-0.0.0.dist-info/RECORD +333 -0
  331. clm_kernel-0.0.0.dist-info/WHEEL +4 -0
  332. clm_kernel-0.0.0.dist-info/entry_points.txt +3 -0
  333. clm_kernel-0.0.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,163 @@
1
+ """Mathematical utility functions for the CLM Petri Net runtime."""
2
+
3
+
4
+ def math_gcd(a: int, b: int) -> int:
5
+ """
6
+ Computes the greatest common divisor of two integers.
7
+ """
8
+ a = abs(a)
9
+ b = abs(b)
10
+ while b > 0:
11
+ a, b = b, a % b
12
+ return a
13
+
14
+ def math_lcm(a: int, b: int) -> int:
15
+ """
16
+ Computes the least common multiple of two integers.
17
+ """
18
+ if a == 0 or b == 0:
19
+ return 0
20
+ return abs(a * b) // math_gcd(a, b)
21
+
22
+ def solve_nullspace(matrix: list[list[int]], rows: int, cols: int, transpose: bool = False) -> list[list[int]]:
23
+ """
24
+ Solves for the rational nullspace of a matrix.
25
+
26
+ Args:
27
+ matrix (List[List[int]]): The matrix to evaluate.
28
+ rows (int): The number of rows.
29
+ cols (int): The number of columns.
30
+ transpose (bool): True if the matrix should be transposed before solving.
31
+
32
+ Returns:
33
+ List[List[int]]: A basis for the nullspace.
34
+ """
35
+ work_rows, work_cols = (cols, rows) if transpose else (rows, cols)
36
+ if work_rows == 0 or work_cols == 0:
37
+ return []
38
+
39
+ a_mat = [[0] * work_cols for _ in range(work_rows)]
40
+ for r in range(work_rows):
41
+ for c in range(work_cols):
42
+ if transpose:
43
+ if c < len(matrix) and r < len(matrix[c]):
44
+ a_mat[r][c] = matrix[c][r]
45
+ else:
46
+ if r < len(matrix) and c < len(matrix[r]):
47
+ a_mat[r][c] = matrix[r][c]
48
+
49
+ pivot_row = [-1] * work_cols
50
+ is_free = [True] * work_cols
51
+
52
+ p = 0
53
+ c = 0
54
+ while c < work_cols and p < work_rows:
55
+ pr = p
56
+ found = False
57
+ while pr < work_rows:
58
+ if a_mat[pr][c] != 0:
59
+ found = True
60
+ break
61
+ pr += 1
62
+
63
+ if not found:
64
+ c += 1
65
+ continue
66
+
67
+ if pr != p:
68
+ a_mat[p], a_mat[pr] = a_mat[pr], a_mat[p]
69
+
70
+ pivot = a_mat[p][c]
71
+ is_free[c] = False
72
+ pivot_row[c] = p
73
+
74
+ for i in range(work_rows):
75
+ if i != p:
76
+ val_i = a_mat[i][c]
77
+ if val_i != 0:
78
+ g = math_gcd(pivot, val_i)
79
+ factor_p = val_i // g
80
+ factor_i = pivot // g
81
+
82
+ for j in range(work_cols):
83
+ a_mat[i][j] = factor_i * a_mat[i][j] - factor_p * a_mat[p][j]
84
+
85
+ # Simplify row i
86
+ r_gcd = 0
87
+ for j in range(work_cols):
88
+ r_gcd = math_gcd(r_gcd, a_mat[i][j])
89
+ if r_gcd > 1:
90
+ for j in range(work_cols):
91
+ a_mat[i][j] //= r_gcd
92
+
93
+ # Simplify pivot row
94
+ p_gcd = 0
95
+ for j in range(work_cols):
96
+ p_gcd = math_gcd(p_gcd, a_mat[p][j])
97
+ if p_gcd > 1:
98
+ for j in range(work_cols):
99
+ a_mat[p][j] //= p_gcd
100
+
101
+ p += 1
102
+ c += 1
103
+
104
+ # Back-Substitution & Basis Generation
105
+ basis_vectors = []
106
+ for f in range(work_cols):
107
+ if is_free[f]:
108
+ num_vec = [0] * work_cols
109
+ den_vec = [1] * work_cols
110
+
111
+ for j in range(work_cols):
112
+ if is_free[j]:
113
+ if j == f:
114
+ num_vec[j] = 1
115
+ den_vec[j] = 1
116
+ else:
117
+ num_vec[j] = 0
118
+ den_vec[j] = 1
119
+ else:
120
+ pr = pivot_row[j]
121
+ a_pr_j = a_mat[pr][j]
122
+ a_pr_f = a_mat[pr][f]
123
+
124
+ num = -a_pr_f
125
+ den = a_pr_j
126
+ if den < 0:
127
+ num = -num
128
+ den = -den
129
+ g = math_gcd(num, den)
130
+ num_vec[j] = num // g
131
+ den_vec[j] = den // g
132
+
133
+ # Find LCM of denominators
134
+ lcm = 1
135
+ for j in range(work_cols):
136
+ lcm = math_lcm(lcm, den_vec[j])
137
+
138
+ # Multiply by LCM to get integer vector
139
+ int_vec = [0] * work_cols
140
+ for j in range(work_cols):
141
+ int_vec[j] = num_vec[j] * (lcm // den_vec[j])
142
+
143
+ # Simplify vector by dividing by overall GCD
144
+ vec_gcd = 0
145
+ for j in range(work_cols):
146
+ vec_gcd = math_gcd(vec_gcd, int_vec[j])
147
+ if vec_gcd > 1:
148
+ for j in range(work_cols):
149
+ int_vec[j] //= vec_gcd
150
+
151
+ # Normalize direction
152
+ all_non_positive = True
153
+ for j in range(work_cols):
154
+ if int_vec[j] > 0:
155
+ all_non_positive = False
156
+ break
157
+ if all_non_positive:
158
+ for j in range(work_cols):
159
+ int_vec[j] = -int_vec[j]
160
+
161
+ basis_vectors.append(int_vec)
162
+
163
+ return basis_vectors
clm/layer0/mcard.py ADDED
@@ -0,0 +1,96 @@
1
+ """Layer 0: Stateless Kenotic MCard Data Entity.
2
+
3
+ Canonical Path: kernel/scripts/clm/layer0/mcard.py
4
+ Parity: Rust `src/layer0/mcard.rs`, TypeScript `src/layer0/mcard.ts`
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from dataclasses import dataclass, field
10
+ from typing import Any
11
+
12
+ from clm.layer0.codec import canonical_json
13
+ from clm.layer0.hash import compute_blake3, verify_hash
14
+
15
+
16
+ @dataclass(frozen=True)
17
+ class MCardPayload:
18
+ kind: str # 'Scalar', 'Text', 'Binary', 'Structured', 'Uri'
19
+ value: Any
20
+
21
+
22
+ @dataclass
23
+ class MCard:
24
+ uri: str
25
+ hash: str
26
+ payload: MCardPayload
27
+ author: str
28
+ sequence: int = 0
29
+ metadata: dict[str, Any] = field(default_factory=dict)
30
+
31
+ def to_canonical_bytes(self) -> bytes:
32
+ return to_canonical_bytes(self)
33
+
34
+ def verify_integrity(self) -> bool:
35
+ return verify_mcard_integrity(self)
36
+
37
+
38
+ def payload_to_bytes(payload: MCardPayload) -> bytes:
39
+ """Serializes payload to deterministic bytes for cryptographic hashing."""
40
+ kind = payload.kind
41
+ if kind == "Text":
42
+ return payload.value.encode("utf-8")
43
+ elif kind == "Binary":
44
+ data = payload.value.get("data") if isinstance(payload.value, dict) else payload.value
45
+ return data if isinstance(data, bytes) else bytes(data)
46
+ elif kind in ("Scalar", "Structured"):
47
+ return canonical_json(payload.value).encode("utf-8")
48
+ elif kind == "Uri":
49
+ return payload.value.encode("utf-8")
50
+ else:
51
+ return str(payload.value).encode("utf-8")
52
+
53
+
54
+ def create_mcard(
55
+ uri: str,
56
+ payload: MCardPayload,
57
+ author: str,
58
+ sequence: int = 0,
59
+ metadata: dict[str, Any] | None = None,
60
+ ) -> MCard:
61
+ """Constructs a new immutable MCard, computing its BLAKE3 hash from payload."""
62
+ payload_bytes = payload_to_bytes(payload)
63
+ h = compute_blake3(payload_bytes)
64
+ return MCard(
65
+ uri=uri,
66
+ hash=h,
67
+ payload=payload,
68
+ author=author,
69
+ sequence=sequence,
70
+ metadata=metadata if metadata is not None else {},
71
+ )
72
+
73
+
74
+ def verify_mcard_integrity(card: MCard) -> bool:
75
+ """Verifies that the MCard hash matches its underlying payload."""
76
+ payload_bytes = payload_to_bytes(card.payload)
77
+ return verify_hash(payload_bytes, card.hash)
78
+
79
+
80
+ def to_canonical_bytes(card: MCard) -> bytes:
81
+ """Serializes the entire MCard into canonical JSON UTF-8 bytes."""
82
+ card_dict = {
83
+ "uri": card.uri,
84
+ "hash": card.hash,
85
+ "payload": {
86
+ "kind": card.payload.kind,
87
+ "value": card.payload.value if card.payload.kind != "Binary" else {
88
+ "mime_type": card.payload.value.get("mime_type", "application/octet-stream"),
89
+ "data": list(card.payload.value.get("data", b"")),
90
+ },
91
+ },
92
+ "metadata": card.metadata,
93
+ "author": card.author,
94
+ "sequence": card.sequence,
95
+ }
96
+ return canonical_json(card_dict).encode("utf-8")
File without changes
@@ -0,0 +1,223 @@
1
+ """Declarative Action Manifest Domain Models (Sprint 392 / DEL-392-01).
2
+
3
+ Implements Pydantic V2 domain models for canonical CLM Action specifications (clm.action.v1).
4
+ An Action represents a temporal morphism (the C face of the Operational Triad)
5
+ operating on spatial carrier MCards (A face) and bracketed by Hoare invariants (B face).
6
+
7
+ Zero dependencies on Layer 1 through Layer 5.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import json
13
+ from pathlib import Path
14
+ from typing import Any, Literal
15
+
16
+ import yaml
17
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
18
+
19
+ ActionFormat = Literal[
20
+ "csv",
21
+ "json",
22
+ "yaml",
23
+ "markdown",
24
+ "text",
25
+ "binary",
26
+ "media",
27
+ "image",
28
+ "audio",
29
+ "model3d",
30
+ ]
31
+
32
+ BaldwinOperator = Literal[
33
+ "split",
34
+ "substitute",
35
+ "augment",
36
+ "exclude",
37
+ "invert",
38
+ "port",
39
+ "custom",
40
+ ]
41
+
42
+ ActionRuntime = Literal[
43
+ "builtin",
44
+ "python",
45
+ "cel",
46
+ "shell",
47
+ "wasm",
48
+ ]
49
+
50
+
51
+ class ActionMetadata(BaseModel):
52
+ """Metadata block identifying the Action and its algebraic role in CLM."""
53
+
54
+ model_config = ConfigDict(frozen=True, extra="forbid")
55
+
56
+ type: Literal["action", "pcard_action"] = "action"
57
+ name: str = Field(..., pattern=r"^[a-z0-9_\-]+$")
58
+ description: str | None = None
59
+ face: Literal["C", "concrete_impl"] = "C"
60
+ operator: BaldwinOperator
61
+ author: str = "did:clm:system"
62
+
63
+
64
+ class ActionInput(BaseModel):
65
+ """Specification of an input MCard bound to the Action."""
66
+
67
+ model_config = ConfigDict(frozen=True, extra="forbid")
68
+
69
+ name: str
70
+ uri: str | None = None
71
+ format: ActionFormat | None = None
72
+ required: bool = True
73
+ description: str | None = None
74
+
75
+
76
+ class ActionPrecondition(BaseModel):
77
+ """Precondition invariant rule (V_pre Gate) verified before Action execution."""
78
+
79
+ model_config = ConfigDict(frozen=True, extra="forbid")
80
+
81
+ invariant: str
82
+ rule: str
83
+ schema_ref: str | None = None
84
+ description: str | None = None
85
+
86
+
87
+ class ActionOperation(BaseModel):
88
+ """Algebraic operation definition specifying the Baldwin operator and parameters."""
89
+
90
+ model_config = ConfigDict(frozen=True, extra="forbid")
91
+
92
+ operator: BaldwinOperator
93
+ strategy: str | None = None
94
+ parameters: dict[str, Any] = Field(default_factory=dict)
95
+ runtime: ActionRuntime = "builtin"
96
+
97
+
98
+ class ActionPostcondition(BaseModel):
99
+ """Postcondition invariant rule (V_post Witness) verified before committing output."""
100
+
101
+ model_config = ConfigDict(frozen=True, extra="forbid")
102
+
103
+ invariant: str
104
+ rule: str
105
+ schema_ref: str | None = None
106
+ description: str | None = None
107
+
108
+
109
+ class ActionOutput(BaseModel):
110
+ """Specification of an output MCard emitted by the Action."""
111
+
112
+ model_config = ConfigDict(frozen=True, extra="forbid")
113
+
114
+ name: str
115
+ handle: str | None = None
116
+ format: ActionFormat | None = None
117
+ description: str | None = None
118
+
119
+
120
+ class ActionManifest(BaseModel):
121
+ """Canonical Declarative Action Manifest (clm.action.v1).
122
+
123
+ Encapsulates inputs, Hoare preconditions (V_pre), Baldwin algebraic operation,
124
+ Hoare postconditions (V_post), and outputs.
125
+ """
126
+
127
+ model_config = ConfigDict(frozen=True, extra="forbid")
128
+
129
+ version: Literal["1.0", "1.0.0"] = "1.0"
130
+ clm: ActionMetadata
131
+ inputs: list[ActionInput] = Field(..., min_length=1)
132
+ preconditions: list[ActionPrecondition] = Field(default_factory=list)
133
+ operation: ActionOperation
134
+ postconditions: list[ActionPostcondition] = Field(default_factory=list)
135
+ outputs: list[ActionOutput] = Field(..., min_length=1)
136
+
137
+ @field_validator("operation")
138
+ @classmethod
139
+ def validate_operator_congruence(cls, v: ActionOperation, info: Any) -> ActionOperation:
140
+ """Validate that clm.operator and operation.operator are congruent."""
141
+ clm_meta = info.data.get("clm")
142
+ if clm_meta and isinstance(clm_meta, ActionMetadata):
143
+ if clm_meta.operator != v.operator:
144
+ raise ValueError(
145
+ f"Operator mismatch: clm.operator='{clm_meta.operator}' != operation.operator='{v.operator}'"
146
+ )
147
+ return v
148
+
149
+ @classmethod
150
+ def from_dict(cls, data: dict[str, Any]) -> ActionManifest:
151
+ """Parse an ActionManifest from a Python dictionary."""
152
+ return cls(**data)
153
+
154
+ @classmethod
155
+ def from_yaml(cls, yaml_content: str | Path) -> ActionManifest:
156
+ """Parse an ActionManifest from a YAML string or file path."""
157
+ if isinstance(yaml_content, Path):
158
+ return cls.from_yaml_file(yaml_content)
159
+ if isinstance(yaml_content, str):
160
+ # If it's a short string without newlines that points to an existing file
161
+ if "\n" not in yaml_content and len(yaml_content) < 260:
162
+ try:
163
+ p = Path(yaml_content)
164
+ if p.is_file():
165
+ return cls.from_yaml_file(p)
166
+ except OSError:
167
+ pass
168
+ data = yaml.safe_load(yaml_content)
169
+ if not isinstance(data, dict):
170
+ raise ValueError("YAML content does not represent a valid dictionary")
171
+ return cls(**data)
172
+ raise TypeError(f"Expected str or Path, got {type(yaml_content)}")
173
+
174
+ @classmethod
175
+ def from_yaml_file(cls, path: str | Path) -> ActionManifest:
176
+ """Parse an ActionManifest from a YAML file path."""
177
+ p = Path(path)
178
+ raw = p.read_text(encoding="utf-8")
179
+ data = yaml.safe_load(raw)
180
+ if not isinstance(data, dict):
181
+ raise ValueError(f"File {path} does not contain a valid YAML dictionary")
182
+ return cls(**data)
183
+
184
+ @classmethod
185
+ def from_json(cls, json_content: str | Path) -> ActionManifest:
186
+ """Parse an ActionManifest from a JSON string or file path."""
187
+ if isinstance(json_content, Path):
188
+ return cls.from_json_file(json_content)
189
+ if isinstance(json_content, str):
190
+ if "\n" not in json_content and not json_content.strip().startswith("{") and len(json_content) < 260:
191
+ try:
192
+ p = Path(json_content)
193
+ if p.is_file():
194
+ return cls.from_json_file(p)
195
+ except OSError:
196
+ pass
197
+ data = json.loads(json_content)
198
+ if not isinstance(data, dict):
199
+ raise ValueError("JSON content does not represent a valid dictionary")
200
+ return cls(**data)
201
+ raise TypeError(f"Expected str or Path, got {type(json_content)}")
202
+
203
+ @classmethod
204
+ def from_json_file(cls, path: str | Path) -> ActionManifest:
205
+ """Parse an ActionManifest from a JSON file path."""
206
+ p = Path(path)
207
+ raw = p.read_text(encoding="utf-8")
208
+ data = json.loads(raw)
209
+ if not isinstance(data, dict):
210
+ raise ValueError(f"File {path} does not contain a valid JSON dictionary")
211
+ return cls(**data)
212
+
213
+ def to_dict(self) -> dict[str, Any]:
214
+ """Convert manifest to Python dictionary."""
215
+ return self.model_dump(exclude_none=True)
216
+
217
+ def to_yaml(self) -> str:
218
+ """Convert manifest to YAML string."""
219
+ return yaml.dump(self.to_dict(), sort_keys=False)
220
+
221
+ def to_json(self, indent: int = 2) -> str:
222
+ """Convert manifest to formatted JSON string."""
223
+ return json.dumps(self.to_dict(), indent=indent)