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,348 @@
1
+ """
2
+ Layer 1: Identity-First Zeroth Guard (DV-373-02).
3
+
4
+ Enforces the Agentic Closure Theorem and Type Lattice root constraint:
5
+ No action can occur in the CLM without verified cryptographic authorship.
6
+ Every transition enforces a zeroth guard: V_identity = verifyIdentity(AgentDid).
7
+
8
+ Supports:
9
+ - EOA: Externally Owned Agent (Ed25519 DID key, e.g. did:key:z6M...)
10
+ - CA: Contract Account / Multi-Sig (e.g. did:pkc:ca:..., did:clm:...)
11
+ - Genesis Agent DID: did:key:z6MkhaXgBZDvotDkL5257faiz48Z8x28xhr554x4tp4MaEBx
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import logging
17
+ import re
18
+ import time
19
+ import uuid
20
+ from dataclasses import dataclass, field
21
+ from typing import Any, Literal
22
+
23
+ import yaml
24
+
25
+ from clm.layer1.arrow_compiler import VCardGuard
26
+
27
+ GENESIS_AGENT_DID = "did:key:z6MkhaXgBZDvotDkL5257faiz48Z8x28xhr554x4tp4MaEBx"
28
+
29
+ # Regular expressions for valid DIDs
30
+ # W3C did:key with base58btc Multicodec ed25519-pub (starts with z6M)
31
+ _EOA_DID_REGEX = re.compile(r"^did:key:z6M[1-9A-HJ-NP-Za-km-z]{40,60}$")
32
+ _CA_DID_REGEX = re.compile(r"^did:(pkc:ca|clm):[a-zA-Z0-9_\-\.:]+$")
33
+
34
+ AgentClass = Literal["EOA", "CA", "UNKNOWN"]
35
+ AgentType = Literal["eoa", "ca"]
36
+
37
+
38
+ def classify_agent_did(did: str) -> AgentClass:
39
+ """Classifies a DID as an Externally Owned Agent (EOA) or Contract Account (CA)."""
40
+ if not did or not isinstance(did, str):
41
+ return "UNKNOWN"
42
+ if did == GENESIS_AGENT_DID or _EOA_DID_REGEX.match(did):
43
+ return "EOA"
44
+ if _CA_DID_REGEX.match(did) or did.startswith("did:pkc:ca:") or did.startswith("did:clm:"):
45
+ return "CA"
46
+ return "UNKNOWN"
47
+
48
+
49
+ def verify_identity(did: str | None) -> bool:
50
+ """Verifies that a DID is cryptographically valid and authorizable."""
51
+ if not did:
52
+ return False
53
+ agent_class = classify_agent_did(did)
54
+ return agent_class in ("EOA", "CA")
55
+
56
+
57
+ class IdentityVerificationError(Exception):
58
+ """Raised when an identity zeroth guard fails (T ∧ V_identity = ⊥)."""
59
+ pass
60
+
61
+
62
+ def assert_identity_gate(did: str | None) -> None:
63
+ """Enforces the zeroth guard.
64
+
65
+ Raises IdentityVerificationError if did is missing or invalid.
66
+ """
67
+ if not verify_identity(did):
68
+ raise IdentityVerificationError(
69
+ f"V_identity check failed: DID '{did}' is not a valid EOA or CA authorization (T ∧ V_identity = ⊥)"
70
+ )
71
+
72
+
73
+ def create_identity_zeroth_guard(agent_did: str | None = None) -> VCardGuard:
74
+ """Returns a VCardGuard checking the Zeroth Identity condition."""
75
+ target_did = agent_did or GENESIS_AGENT_DID
76
+ return VCardGuard(
77
+ name="V_identity_zeroth_guard",
78
+ predicate=lambda _: verify_identity(target_did),
79
+ error_message=f"Zeroth guard failed for DID '{target_did}'",
80
+ )
81
+
82
+
83
+ # ─────────────────────────────────────────────────────────────────────────────
84
+ # W3C Agent Identity Schemas (EOA & CA Duality)
85
+ # ─────────────────────────────────────────────────────────────────────────────
86
+
87
+
88
+ @dataclass
89
+ class VerificationMethod:
90
+ """W3C standard verification method for declaring public keys."""
91
+
92
+ id: str
93
+ type: str
94
+ controller: str
95
+ publicKeyBase58: str
96
+
97
+
98
+ @dataclass
99
+ class AgentIdentity:
100
+ """Base class for all Agents in the system."""
101
+
102
+ did: str
103
+ agent_type: AgentType
104
+
105
+ def to_dict(self) -> dict[str, Any]:
106
+ raise NotImplementedError("Subclasses must implement to_dict")
107
+
108
+ def to_yaml(self) -> str:
109
+ return yaml.safe_dump(self.to_dict(), default_flow_style=False)
110
+
111
+
112
+ @dataclass
113
+ class EOAAgent(AgentIdentity):
114
+ """Externally Owned Agent (EOA)."""
115
+
116
+ agent_type: Literal["eoa"] = "eoa"
117
+ verification_methods: list[VerificationMethod] = field(default_factory=list)
118
+
119
+ def validate(self) -> None:
120
+ if not self.did.startswith("did:pkc:eoa:") and not self.did.startswith("did:key:"):
121
+ raise ValueError(f"EOA Data Schema Violation: Invalid EOA DID structure: {self.did}")
122
+ if len(self.verification_methods) == 0:
123
+ raise ValueError("EOA Data Schema Violation: At least one VerificationMethod is required for an EOA.")
124
+
125
+ def to_dict(self) -> dict[str, Any]:
126
+ return {
127
+ "did": self.did,
128
+ "agent_type": self.agent_type,
129
+ "verification_methods": [
130
+ {
131
+ "id": p.id,
132
+ "type": p.type,
133
+ "controller": p.controller,
134
+ "publicKeyBase58": p.publicKeyBase58,
135
+ }
136
+ for p in self.verification_methods
137
+ ],
138
+ }
139
+
140
+
141
+ @dataclass
142
+ class ContractAgent(AgentIdentity):
143
+ """Contract Agent (CA)."""
144
+
145
+ agent_type: Literal["ca"] = "ca"
146
+ bound_clm_hash: str | None = None
147
+ controller_did: str | None = None
148
+
149
+ def validate(self) -> None:
150
+ if not self.did.startswith("did:pkc:ca:") and not self.did.startswith("did:clm:"):
151
+ raise ValueError(f"CA Data Schema Violation: Invalid CA DID structure: {self.did}")
152
+ if not self.bound_clm_hash:
153
+ raise ValueError("CA Data Schema Violation: ContractAgent MUST have a bound_clm_hash")
154
+
155
+ def to_dict(self) -> dict[str, Any]:
156
+ return {
157
+ "did": self.did,
158
+ "agent_type": self.agent_type,
159
+ "bound_clm_hash": self.bound_clm_hash,
160
+ "controller_did": self.controller_did,
161
+ }
162
+
163
+
164
+ def parse_identity(data_dict: dict[str, Any]) -> AgentIdentity:
165
+ """Parses a dictionary into typed EOA or CA schemas."""
166
+ agent_type = data_dict.get("agent_type")
167
+ if agent_type == "eoa":
168
+ methods = data_dict.get("verification_methods", [])
169
+ v_methods = [
170
+ VerificationMethod(
171
+ id=m["id"],
172
+ type=m["type"],
173
+ controller=m["controller"],
174
+ publicKeyBase58=m["publicKeyBase58"],
175
+ )
176
+ for m in methods
177
+ ]
178
+ agent = EOAAgent(did=data_dict["did"], verification_methods=v_methods)
179
+ agent.validate()
180
+ return agent
181
+ elif agent_type == "ca":
182
+ agent = ContractAgent(
183
+ did=data_dict["did"],
184
+ bound_clm_hash=data_dict.get("bound_clm_hash"),
185
+ controller_did=data_dict.get("controller_did"),
186
+ )
187
+ agent.validate()
188
+ return agent
189
+ raise ValueError(f"Unknown agent type mapping: {agent_type}")
190
+
191
+
192
+ # ─────────────────────────────────────────────────────────────────────────────
193
+ # PCard Identity State Machine & Lineage
194
+ # ─────────────────────────────────────────────────────────────────────────────
195
+
196
+
197
+ @dataclass
198
+ class PCardState:
199
+ """State of a PCard Identity at a specific point in time."""
200
+
201
+ version: int
202
+ head: str
203
+ previous: str | None = None
204
+ timestamp: float = field(default_factory=time.time)
205
+
206
+
207
+ @dataclass
208
+ class PCardContract:
209
+ """Contract rules governing the PCard's evolution."""
210
+
211
+ upgradability: str = "uups"
212
+ rules: list[str] = field(default_factory=list)
213
+
214
+
215
+ @dataclass
216
+ class PCardMetadata:
217
+ """Metadata for the PCard Identity."""
218
+
219
+ id: str
220
+ owner: str
221
+ created_at: float = field(default_factory=time.time)
222
+ description: str | None = None
223
+
224
+
225
+ class PCardIdentity:
226
+ """Represents the persistent evolutionary identity of a Cubical Logic Model."""
227
+
228
+ def __init__(
229
+ self, metadata: PCardMetadata, state: PCardState, contract: PCardContract
230
+ ) -> None:
231
+ self.metadata = metadata
232
+ self.state = state
233
+ self.contract = contract
234
+ self.logger = logging.getLogger(__name__)
235
+
236
+ @classmethod
237
+ def create_genesis(
238
+ cls,
239
+ snapshot_hash: str,
240
+ owner: str,
241
+ pcard_id: str | None = None,
242
+ description: str | None = None,
243
+ ) -> "PCardIdentity":
244
+ pcard_id = pcard_id or str(uuid.uuid4())
245
+ metadata = PCardMetadata(id=pcard_id, owner=owner, description=description)
246
+ state = PCardState(version=1, head=snapshot_hash, previous=None)
247
+ contract = PCardContract()
248
+ return cls(metadata, state, contract)
249
+
250
+ def upgrade(self, new_snapshot_hash: str) -> None:
251
+ new_state = PCardState(
252
+ version=self.state.version + 1,
253
+ head=new_snapshot_hash,
254
+ previous=self.state.head,
255
+ )
256
+ self.state = new_state
257
+ self.logger.info(
258
+ f"PCard {self.metadata.id} upgraded to version {self.state.version}"
259
+ )
260
+
261
+ def fork(self, owner: str, description: str | None = None) -> "PCardIdentity":
262
+ new_id = str(uuid.uuid4())
263
+ metadata = PCardMetadata(
264
+ id=new_id,
265
+ owner=owner,
266
+ description=description or f"Fork of {self.metadata.id}",
267
+ )
268
+ state = PCardState(
269
+ version=1,
270
+ head=self.state.head,
271
+ previous=None,
272
+ )
273
+ contract = PCardContract()
274
+ self.logger.info(f"PCard {self.metadata.id} forked to {new_id}")
275
+ return PCardIdentity(metadata, state, contract)
276
+
277
+ def to_dict(self) -> dict[str, Any]:
278
+ return {
279
+ "type": "PCard",
280
+ "metadata": {
281
+ "id": self.metadata.id,
282
+ "owner": self.metadata.owner,
283
+ "created_at": self.metadata.created_at,
284
+ "description": self.metadata.description,
285
+ },
286
+ "state": {
287
+ "version": self.state.version,
288
+ "head": self.state.head,
289
+ "previous": self.state.previous,
290
+ "timestamp": self.state.timestamp,
291
+ },
292
+ "contract": {
293
+ "upgradability": self.contract.upgradability,
294
+ "rules": self.contract.rules,
295
+ },
296
+ }
297
+
298
+ def to_yaml(self) -> str:
299
+ return yaml.safe_dump(self.to_dict(), default_flow_style=False)
300
+
301
+ @classmethod
302
+ def from_yaml(cls, yaml_content: str) -> "PCardIdentity":
303
+ data = yaml.safe_load(yaml_content)
304
+ if data.get("type") != "PCard":
305
+ raise ValueError("Invalid YAML: type must be 'PCard'")
306
+
307
+ metadata_data = data.get("metadata", {})
308
+ metadata = PCardMetadata(
309
+ id=metadata_data.get("id"),
310
+ owner=metadata_data.get("owner"),
311
+ created_at=metadata_data.get("created_at", time.time()),
312
+ description=metadata_data.get("description"),
313
+ )
314
+ state_data = data.get("state", {})
315
+ state = PCardState(
316
+ version=state_data.get("version"),
317
+ head=state_data.get("head"),
318
+ previous=state_data.get("previous"),
319
+ timestamp=state_data.get("timestamp", time.time()),
320
+ )
321
+ contract_data = data.get("contract", {})
322
+ contract = PCardContract(
323
+ upgradability=contract_data.get("upgradability", "uups"),
324
+ rules=contract_data.get("rules", []),
325
+ )
326
+ return cls(metadata, state, contract)
327
+
328
+
329
+ __all__ = [
330
+ "GENESIS_AGENT_DID",
331
+ "AgentClass",
332
+ "AgentType",
333
+ "classify_agent_did",
334
+ "verify_identity",
335
+ "IdentityVerificationError",
336
+ "assert_identity_gate",
337
+ "create_identity_zeroth_guard",
338
+ "VerificationMethod",
339
+ "AgentIdentity",
340
+ "EOAAgent",
341
+ "ContractAgent",
342
+ "parse_identity",
343
+ "PCardState",
344
+ "PCardContract",
345
+ "PCardMetadata",
346
+ "PCardIdentity",
347
+ ]
348
+
clm/layer1/matrix.py ADDED
@@ -0,0 +1,138 @@
1
+ """Layer 1: Integer Incidence Matrix & P-Invariant Nullspace Analysis.
2
+
3
+ Canonical Path: kernel/scripts/clm/layer1/matrix.py
4
+ Parity: Rust `src/layer1/matrix.rs`, TypeScript `src/layer1/matrix.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.math_utils import math_gcd, math_lcm, solve_nullspace
13
+ from clm.layer0.types import PolynomialTerm, PrimeHash
14
+ from clm.layer1.sparse_net import PrecomputedInvariants, SparseIncidenceMatrix
15
+
16
+ __all__ = [
17
+ "math_gcd",
18
+ "math_lcm",
19
+ "solve_nullspace",
20
+ "IncidenceMatrix",
21
+ "PolynomialStructure",
22
+ "SparseIncidenceMatrix",
23
+ "PrecomputedInvariants",
24
+ ]
25
+
26
+
27
+
28
+ class IncidenceMatrix:
29
+ """Integer Incidence Matrix D = D^+ - D^- for a Petri Net topology."""
30
+
31
+ def __init__(
32
+ self,
33
+ places: list[str],
34
+ transitions: list[str],
35
+ d_minus: list[list[int]],
36
+ d_plus: list[list[int]],
37
+ d: list[list[int]],
38
+ ) -> None:
39
+ self.places = places
40
+ self.transitions = transitions
41
+ self.d_minus = d_minus
42
+ self.d_plus = d_plus
43
+ self.d = d
44
+
45
+ @classmethod
46
+ def from_topology(cls, topo: dict[str, Any]) -> IncidenceMatrix:
47
+ """Constructs an IncidenceMatrix from a Petri net topology definition."""
48
+ places = [p["id"] for p in topo.get("places", [])]
49
+ transitions = [t["id"] for t in topo.get("transitions", [])]
50
+
51
+ place_to_idx = {pid: i for i, pid in enumerate(places)}
52
+
53
+ num_p = len(places)
54
+ num_t = len(transitions)
55
+
56
+ d_minus = [[0] * num_t for _ in range(num_p)]
57
+ d_plus = [[0] * num_t for _ in range(num_p)]
58
+
59
+ for j, t in enumerate(topo.get("transitions", [])):
60
+ for inp in t.get("inputs", []):
61
+ if inp in place_to_idx:
62
+ d_minus[place_to_idx[inp]][j] += 1
63
+ for outp in t.get("outputs", []):
64
+ if outp in place_to_idx:
65
+ d_plus[place_to_idx[outp]][j] += 1
66
+
67
+ d = [[0] * num_t for _ in range(num_p)]
68
+ for r in range(num_p):
69
+ for c in range(num_t):
70
+ d[r][c] = d_plus[r][c] - d_minus[r][c]
71
+
72
+ return cls(places, transitions, d_minus, d_plus, d)
73
+
74
+ def p_invariants(self) -> list[list[int]]:
75
+ """Solves x^T * D = 0^T for the rational/integer P-invariant basis."""
76
+ return solve_nullspace(self.d, len(self.places), len(self.transitions), transpose=True)
77
+
78
+ def verify_invariant(self, weights: list[int]) -> bool:
79
+ """Verifies if a weight vector x satisfies x^T * D = 0^T."""
80
+ if len(weights) != len(self.places):
81
+ return False
82
+ for t in range(len(self.transitions)):
83
+ s = sum(weights[p] * self.d[p][t] for p in range(len(self.places)))
84
+ if s != 0:
85
+ return False
86
+ return True
87
+
88
+
89
+ @dataclass
90
+ class PolynomialStructure:
91
+ """Represents the polynomial structure of a PCard (Layer 1).
92
+
93
+ F(X) = Sum(A_i * X^{B_i}) + C
94
+
95
+ Where:
96
+ - A_i: Abstract Specifications (Coefficients)
97
+ - B_i: Balanced Expectations (Exponents)
98
+ - C: Concrete Implementation (Constant/Base)
99
+ """
100
+
101
+ terms: list[PolynomialTerm] = field(default_factory=list)
102
+ constant: PrimeHash | None = None
103
+
104
+ def add_term(self, abstract_hash: str, balanced_hash: str) -> None:
105
+ """Add a term (A * X^B) to the polynomial."""
106
+ self.terms.append(
107
+ PolynomialTerm(
108
+ coefficient=PrimeHash(abstract_hash),
109
+ exponent=PrimeHash(balanced_hash),
110
+ )
111
+ )
112
+
113
+ def set_constant(self, concrete_hash: str) -> None:
114
+ """Set the constant term (C) - the Concrete Implementation."""
115
+ self.constant = PrimeHash(concrete_hash)
116
+
117
+ def compose(self, other: "PolynomialStructure") -> "PolynomialStructure":
118
+ """Compose this polynomial with another: (F * G)(X)."""
119
+ new_poly = PolynomialStructure()
120
+ new_poly.terms.extend(self.terms)
121
+ new_poly.terms.extend(other.terms)
122
+ new_poly.constant = other.constant or self.constant
123
+ return new_poly
124
+
125
+ def to_dict(self) -> dict[str, Any]:
126
+ """Convert to dictionary representation."""
127
+ return {
128
+ "terms": [
129
+ {
130
+ "coefficient": str(t.coefficient),
131
+ "exponent": str(t.exponent),
132
+ "weight": t.weight,
133
+ }
134
+ for t in self.terms
135
+ ],
136
+ "constant": str(self.constant) if self.constant else None,
137
+ }
138
+