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,165 @@
1
+ """
2
+ Specification Tester for the Polynomial Type Runtime.
3
+
4
+ Isolates testing and validation capabilities that match PCards against
5
+ their defined `balanced` expectations (e.g. unit tests encoded inside the PCard).
6
+ """
7
+
8
+ from typing import Any
9
+
10
+ import yaml
11
+
12
+ from clm.layer0.model.card import MCard
13
+ from clm.layer1.engine import PTREngine
14
+
15
+
16
+ class SpecTester:
17
+ """Evaluates balanced tests defined in a PCard's CLM."""
18
+
19
+ def __init__(self, engine: PTREngine):
20
+ self.engine = engine
21
+ self.collection = engine.collection
22
+
23
+ def run_balanced_tests(
24
+ self, pcard_hash: str, context: dict[str, Any] | None = None
25
+ ) -> dict[str, Any]:
26
+ """Run all test cases defined in the PCard's balanced dimension."""
27
+ pcard = self.collection.get(pcard_hash)
28
+ if not pcard:
29
+ raise ValueError(f"PCard not found: {pcard_hash}")
30
+
31
+ pcard_content = pcard.get_content().decode("utf-8")
32
+ pcard_data = yaml.safe_load(pcard_content)
33
+
34
+ balanced = pcard_data.get("confirmation", pcard_data.get("balanced", {}))
35
+ test_cases = balanced.get("test_cases", [])
36
+
37
+ results = {"total": len(test_cases), "passed": 0, "failed": 0, "details": []}
38
+
39
+ for i, test_case in enumerate(test_cases):
40
+ description = test_case.get("description", f"Test Case #{i + 1}")
41
+
42
+ given = test_case.get("assumption", test_case.get("given", {}))
43
+ expected = test_case.get("confirmation", test_case.get("then", {}))
44
+
45
+ input_val = given
46
+ if isinstance(given, dict) and "input" in given:
47
+ input_val = given["input"]
48
+ elif isinstance(given, dict) and len(given) == 1:
49
+ input_val = list(given.values())[0]
50
+
51
+ when = test_case.get("behavior", test_case.get("when", {}))
52
+ test_context = when.get("params", {})
53
+
54
+ full_context = (context or {}).copy()
55
+ full_context.update(test_context)
56
+
57
+ if isinstance(input_val, str):
58
+ target_content = input_val.encode("utf-8")
59
+ else:
60
+ import json
61
+
62
+ target_content = json.dumps(input_val).encode("utf-8")
63
+
64
+ target = MCard(target_content)
65
+ self.collection.add(target)
66
+
67
+ try:
68
+ result = self.engine.execute_pcard(
69
+ pcard_hash, target.hash, context=full_context
70
+ )
71
+
72
+ passed = True
73
+ failure_reason = ""
74
+ actual = result.output
75
+
76
+ for key, expected_val in expected.items():
77
+ if key == "epsilon":
78
+ continue
79
+
80
+ actual_val = actual
81
+ if isinstance(actual, dict) and key in actual:
82
+ actual_val = actual[key]
83
+ elif isinstance(actual, int | float | str) and key in [
84
+ "result",
85
+ "sine_value",
86
+ "value",
87
+ ]:
88
+ actual_val = actual
89
+
90
+ if isinstance(expected_val, int | float) and isinstance(
91
+ actual_val, int | float
92
+ ):
93
+ epsilon = float(expected.get("epsilon", 0))
94
+ if abs(actual_val - expected_val) > epsilon:
95
+ passed = False
96
+ failure_reason = f"Expected {key}={expected_val} (epsilon={epsilon}), got {actual_val}"
97
+ break
98
+ elif isinstance(expected_val, dict) and isinstance(
99
+ actual_val, dict
100
+ ):
101
+
102
+ def check_subset(exp, act, path=""):
103
+ for k, v in exp.items():
104
+ if k not in act:
105
+ return False, f"Missing key '{path}{k}'"
106
+
107
+ if isinstance(v, dict) and isinstance(act[k], dict):
108
+ sub_ok, sub_reason = check_subset(
109
+ v, act[k], f"{path}{k}."
110
+ )
111
+ if not sub_ok:
112
+ return False, sub_reason
113
+ elif v != act[k]:
114
+ return (
115
+ False,
116
+ f"Value mismatch at '{path}{k}': expected {v}, got {act[k]}",
117
+ )
118
+ return True, ""
119
+
120
+ subset_ok, subset_reason = check_subset(
121
+ expected_val, actual_val
122
+ )
123
+ if not subset_ok:
124
+ passed = False
125
+ failure_reason = f"Dict mismatch for {key}: {subset_reason}"
126
+ break
127
+ elif actual_val != expected_val:
128
+ passed = False
129
+ failure_reason = (
130
+ f"Expected {key}={expected_val}, got {actual_val}"
131
+ )
132
+ break
133
+
134
+ if passed:
135
+ results["passed"] += 1
136
+ status = "PASSED"
137
+ else:
138
+ results["failed"] += 1
139
+ status = "FAILED"
140
+
141
+ results["details"].append(
142
+ {
143
+ "id": i + 1,
144
+ "description": description,
145
+ "status": status,
146
+ "input": input_val,
147
+ "expected": expected,
148
+ "actual": actual,
149
+ "reason": failure_reason,
150
+ }
151
+ )
152
+
153
+ except Exception as e:
154
+ results["failed"] += 1
155
+ results["details"].append(
156
+ {
157
+ "id": i + 1,
158
+ "description": description,
159
+ "status": "ERROR",
160
+ "input": input_val,
161
+ "error": str(e),
162
+ }
163
+ )
164
+
165
+ return results
clm/layer1/store.py ADDED
@@ -0,0 +1,295 @@
1
+ """PTR Shared Store - Standardized data contract for PCard execution.
2
+
3
+ Canonical Path: kernel/scripts/clm/layer1/store.py
4
+ Parity: TypeScript `mcard-js/src/ptr/core/SharedStore.ts`
5
+
6
+ Based on PocketFlow's Shared Store pattern, this module provides a formalized
7
+ data structure for communication between PCards in the PTR execution pipeline.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from dataclasses import dataclass, field, replace
13
+ from typing import Any
14
+
15
+
16
+ @dataclass
17
+ class PTRSharedStore:
18
+ """Standardized shared store for PTR execution.
19
+
20
+ All nodes (PCards) agree upon this data contract for communication.
21
+ Replaces ad-hoc context dictionaries with typed, validated fields.
22
+
23
+ Layers:
24
+ - Identity: Zero-Trust routing and caller verification
25
+ - Content: PCard and target artifacts
26
+ - Execution: Runtime inputs, outputs, and configuration
27
+ - Verification: VCard proofs and validation results
28
+ - Observability: Metrics, timing, and correctness tracking
29
+ """
30
+
31
+ # =========================================================================
32
+ # IDENTITY LAYER - Zero-Trust routing and authentication
33
+ # =========================================================================
34
+ caller_identity_hash: str | None = None
35
+ """DID or hash of the calling identity for AuthZ/AuthN checks."""
36
+
37
+ agent_identities: Any = field(default=None, repr=False)
38
+ """CardCollection reference to agent_identities.db for Zero-Trust routing."""
39
+
40
+ # =========================================================================
41
+ # CONTENT LAYER - PCard and target artifacts
42
+ # =========================================================================
43
+ pcard: Any = field(default=None, repr=False)
44
+ """The PCard (Polynomial Card) being executed."""
45
+
46
+ target: Any = field(default=None, repr=False)
47
+ """The target MCard the PCard operates upon."""
48
+
49
+ pcard_hash: str | None = None
50
+ """Content-addressed hash of the PCard."""
51
+
52
+ target_hash: str | None = None
53
+ """Content-addressed hash of the target."""
54
+
55
+ # =========================================================================
56
+ # EXECUTION LAYER - Runtime inputs, outputs, and configuration
57
+ # =========================================================================
58
+ inputs: dict[str, Any] = field(default_factory=dict)
59
+ """Input parameters for execution (replaces raw context dict)."""
60
+
61
+ outputs: dict[str, Any] = field(default_factory=dict)
62
+ """Output results from execution."""
63
+
64
+ runtime_config: dict[str, Any] = field(default_factory=dict)
65
+ """Runtime configuration (timeouts, language, sandbox settings, etc.)."""
66
+
67
+ # =========================================================================
68
+ # VERIFICATION LAYER - VCard proofs and validation
69
+ # =========================================================================
70
+ v_pre: Any = field(default=None, repr=False)
71
+ """Pre-condition VCard (verification before execution)."""
72
+
73
+ v_post: Any = field(default=None, repr=False)
74
+ """Post-condition VCard (verification after execution)."""
75
+
76
+ verification_result: Any = field(default=None, repr=False)
77
+ """Result from CLMVerifier.validate() or similar."""
78
+
79
+ # =========================================================================
80
+ # OBSERVABILITY LAYER - Metrics, timing, and correctness
81
+ # =========================================================================
82
+ execution_time_ms: int = 0
83
+ """Total execution time in milliseconds."""
84
+
85
+ alignment_score: float | None = None
86
+ """Directional alignment score (if enabled)."""
87
+
88
+ invariants_preserved: bool = True
89
+ """Whether all correctness invariants were preserved."""
90
+
91
+ # =========================================================================
92
+ # TRI-DATABASE TOPOLOGY - Four-Database context (§Key Arch Principles #4)
93
+ # =========================================================================
94
+ tri_db: Any = field(default=None, repr=False)
95
+ """TriDatabase reference — soul-bound SSOT for the agency.
96
+ Carries the complete Who/What/How cognitive mapping."""
97
+
98
+ data_plane_hash: str | None = None
99
+ """Current Data Plane input hash — bits-to-hash guarantee (§1.1 Data Plane)."""
100
+
101
+ control_plane_phase: str | None = None
102
+ """Current PTR lifecycle phase: prep/exec/post/await (§1.1 Control Plane)."""
103
+
104
+ chl_temporal: Any = field(default=None, repr=False)
105
+ """Active CHL temporal dimension (CHLTemporal instance).
106
+ Tracks Design/Compile/Execute time per §1.5."""
107
+
108
+ retry_count: int = 0
109
+ """Number of retries attempted (for retry mechanism)."""
110
+
111
+ # =========================================================================
112
+ # GOVERNANCE TELEMETRY LAYER (Token Arithmetics)
113
+ # Computed during prep→exec→post lifecycle per Architecture §03 Token Arithmetics
114
+ # and Specifications §04 §2.5 Type-Based Possibility Arithmetics
115
+ # =========================================================================
116
+ possibility_magnitude: float | None = None
117
+ """M(B^A) = |B|^|A| — total combinatorial possibility space."""
118
+
119
+ governance_narrowing: float | None = None
120
+ """N = 1 - |B'|^|A'| / |B|^|A| — policy restrictiveness ratio."""
121
+
122
+ epiplexity_yield: float | None = None
123
+ """E = S_T / M — structured knowledge per possibility (using alignment_score as S_T)."""
124
+
125
+ product_dependency_count: int | None = None
126
+ """Pi = |A1 × A2 × ... × An| — concurrent precondition count."""
127
+
128
+ # =========================================================================
129
+ # LEGACY COMPATIBILITY - Support dict-style access
130
+ # =========================================================================
131
+
132
+ def __getitem__(self, key: str) -> Any:
133
+ """Enable dict-style access for backward compatibility."""
134
+ if hasattr(self, key):
135
+ return getattr(self, key)
136
+ # Fallback to inputs dict for arbitrary keys
137
+ if key in self.inputs:
138
+ return self.inputs[key]
139
+ raise KeyError(f"'{key}' not found in store attributes or inputs")
140
+
141
+ def __setitem__(self, key: str, value: Any) -> None:
142
+ """Enable dict-style assignment for backward compatibility."""
143
+ if hasattr(self, key) and not key.startswith("_"):
144
+ setattr(self, key, value)
145
+ else:
146
+ # Store arbitrary keys in inputs dict
147
+ self.inputs[key] = value
148
+
149
+ def get(self, key: str, default: Any = None) -> Any:
150
+ """Dict-style .get() method for backward compatibility."""
151
+ try:
152
+ return self[key]
153
+ except KeyError:
154
+ return default
155
+
156
+ def to_dict(self) -> dict[str, Any]:
157
+ """Convert store to dictionary (for serialization)."""
158
+ result = {
159
+ # Identity
160
+ "caller_identity_hash": self.caller_identity_hash,
161
+ "agent_identities": self.agent_identities,
162
+ # Content
163
+ "pcard_hash": self.pcard_hash,
164
+ "target_hash": self.target_hash,
165
+ # Execution
166
+ "inputs": self.inputs,
167
+ "outputs": self.outputs,
168
+ "runtime_config": self.runtime_config,
169
+ # Verification
170
+ "verification_result": self.verification_result,
171
+ # Observability
172
+ "execution_time_ms": self.execution_time_ms,
173
+ "alignment_score": self.alignment_score,
174
+ "invariants_preserved": self.invariants_preserved,
175
+ "retry_count": self.retry_count,
176
+ # Governance telemetry
177
+ "possibility_magnitude": self.possibility_magnitude,
178
+ "governance_narrowing": self.governance_narrowing,
179
+ "epiplexity_yield": self.epiplexity_yield,
180
+ "product_dependency_count": self.product_dependency_count,
181
+ }
182
+ # Tri-Database topology (only include when set)
183
+ if self.data_plane_hash is not None:
184
+ result["data_plane_hash"] = self.data_plane_hash
185
+ if self.control_plane_phase is not None:
186
+ result["control_plane_phase"] = self.control_plane_phase
187
+ if self.chl_temporal is not None:
188
+ result["chl_temporal"] = (
189
+ self.chl_temporal.to_dict()
190
+ if hasattr(self.chl_temporal, "to_dict")
191
+ else self.chl_temporal
192
+ )
193
+ return result
194
+
195
+ @classmethod
196
+ def from_dict(cls, data: dict[str, Any]) -> PTRSharedStore:
197
+ """Create store from dictionary (for deserialization)."""
198
+ # Extract known fields
199
+ known_fields = {
200
+ "caller_identity_hash",
201
+ "agent_identities",
202
+ "pcard_hash",
203
+ "target_hash",
204
+ "inputs",
205
+ "outputs",
206
+ "runtime_config",
207
+ "verification_result",
208
+ "execution_time_ms",
209
+ "alignment_score",
210
+ "invariants_preserved",
211
+ "retry_count",
212
+ # Tri-Database topology fields
213
+ "tri_db",
214
+ "data_plane_hash",
215
+ "control_plane_phase",
216
+ "chl_temporal",
217
+ # Governance telemetry fields
218
+ "possibility_magnitude",
219
+ "governance_narrowing",
220
+ "epiplexity_yield",
221
+ "product_dependency_count",
222
+ }
223
+
224
+ store_data = {k: v for k, v in data.items() if k in known_fields}
225
+
226
+ # Unknown fields go into inputs
227
+ unknown_fields = {k: v for k, v in data.items() if k not in known_fields}
228
+ if unknown_fields:
229
+ store_data.setdefault("inputs", {}).update(unknown_fields)
230
+
231
+ return cls(**store_data)
232
+
233
+ def merge_inputs(self, additional: dict[str, Any]) -> PTRSharedStore:
234
+ """Return new store with merged inputs (immutable update pattern)."""
235
+ new_inputs = {**self.inputs, **additional}
236
+ return replace(self, inputs=new_inputs)
237
+
238
+ def with_outputs(self, outputs: dict[str, Any]) -> PTRSharedStore:
239
+ """Return new store with outputs set (immutable update pattern)."""
240
+ return replace(self, outputs=outputs)
241
+
242
+
243
+ def create_store_from_context(
244
+ context: dict[str, Any],
245
+ pcard: Any | None = None,
246
+ target: Any | None = None,
247
+ agent_identities: Any | None = None,
248
+ ) -> PTRSharedStore:
249
+ """Create a PTRSharedStore from a legacy context dictionary.
250
+
251
+ This helper enables gradual migration from dict-based context to typed store.
252
+
253
+ Args:
254
+ context: Legacy context dictionary
255
+ pcard: PCard instance (if available)
256
+ target: Target MCard instance (if available)
257
+ agent_identities: Identity space collection (if available)
258
+
259
+ Returns:
260
+ PTRSharedStore with context data properly partitioned
261
+ """
262
+ known_mapping = {
263
+ "caller_identity_hash": "caller_identity_hash",
264
+ "pcard_hash": "pcard_hash",
265
+ "target_hash": "target_hash",
266
+ "execution_time_ms": "execution_time_ms",
267
+ "alignment_score": "alignment_score",
268
+ "invariants_preserved": "invariants_preserved",
269
+ }
270
+
271
+ store_kwargs: dict[str, Any] = {}
272
+ remaining_context = dict(context) # Copy
273
+
274
+ for context_key, store_key in known_mapping.items():
275
+ if context_key in remaining_context:
276
+ store_kwargs[store_key] = remaining_context.pop(context_key)
277
+
278
+ # Handle boolean string conversion for invariants_preserved
279
+ if "invariants_preserved" in store_kwargs:
280
+ val = store_kwargs["invariants_preserved"]
281
+ if isinstance(val, str):
282
+ store_kwargs["invariants_preserved"] = val.lower() == "true"
283
+
284
+ # Add object references
285
+ store_kwargs["pcard"] = pcard
286
+ store_kwargs["target"] = target
287
+ store_kwargs["agent_identities"] = agent_identities
288
+
289
+ # Remaining context goes into inputs
290
+ store_kwargs["inputs"] = remaining_context
291
+
292
+ return PTRSharedStore(**store_kwargs)
293
+
294
+
295
+ __all__ = ["PTRSharedStore", "create_store_from_context"]