agent-os-kernel 1.1.0__py3-none-any.whl → 1.3.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 (1051) hide show
  1. agent_os/__init__.py +66 -4
  2. agent_os/agents_compat.py +286 -0
  3. agent_os/base_agent.py +308 -0
  4. agent_os/cli.py +1079 -19
  5. agent_os/integrations/__init__.py +37 -2
  6. agent_os/integrations/openai_adapter.py +502 -0
  7. agent_os/integrations/semantic_kernel_adapter.py +569 -0
  8. agent_os/stateless.py +349 -0
  9. agent_os_kernel-1.3.0.dist-info/METADATA +676 -0
  10. agent_os_kernel-1.3.0.dist-info/RECORD +1053 -0
  11. {agent_os_kernel-1.1.0.dist-info → agent_os_kernel-1.3.0.dist-info}/entry_points.txt +0 -1
  12. modules/amb/.github/workflows/ci.yml +102 -0
  13. modules/amb/.github/workflows/publish.yml +146 -0
  14. modules/amb/.gitignore +134 -0
  15. modules/amb/CHANGELOG.md +118 -0
  16. modules/amb/CONTRIBUTING.md +141 -0
  17. modules/amb/LICENSE +21 -0
  18. modules/amb/README.md +188 -0
  19. modules/amb/amb_core/__init__.py +175 -0
  20. modules/amb/amb_core/adapters/__init__.py +55 -0
  21. modules/amb/amb_core/adapters/aws_sqs_broker.py +374 -0
  22. modules/amb/amb_core/adapters/azure_servicebus_broker.py +338 -0
  23. modules/amb/amb_core/adapters/kafka_broker.py +258 -0
  24. modules/amb/amb_core/adapters/nats_broker.py +283 -0
  25. modules/amb/amb_core/adapters/rabbitmq_broker.py +233 -0
  26. modules/amb/amb_core/adapters/redis_broker.py +260 -0
  27. modules/amb/amb_core/broker.py +143 -0
  28. modules/amb/amb_core/bus.py +479 -0
  29. modules/amb/amb_core/cloudevents.py +507 -0
  30. modules/amb/amb_core/dlq.py +343 -0
  31. modules/amb/amb_core/hf_utils.py +534 -0
  32. modules/amb/amb_core/memory_broker.py +408 -0
  33. modules/amb/amb_core/models.py +139 -0
  34. modules/amb/amb_core/persistence.py +527 -0
  35. modules/amb/amb_core/schema.py +292 -0
  36. modules/amb/amb_core/tracing.py +356 -0
  37. modules/amb/examples/advanced_features.py +223 -0
  38. modules/amb/examples/backpressure_demo.py +225 -0
  39. modules/amb/examples/basic_usage.py +117 -0
  40. modules/amb/examples/tracing_demo.py +104 -0
  41. modules/amb/experiments/README.md +52 -0
  42. modules/amb/experiments/reproduce_results.py +467 -0
  43. modules/amb/experiments/results.json +324 -0
  44. modules/amb/paper/README.md +40 -0
  45. modules/amb/paper/paper.tex +365 -0
  46. modules/amb/paper/whitepaper.md +377 -0
  47. modules/amb/pyproject.toml +117 -0
  48. modules/amb/tests/__init__.py +1 -0
  49. modules/amb/tests/test_backpressure_priority.py +280 -0
  50. modules/amb/tests/test_bus.py +198 -0
  51. modules/amb/tests/test_cloudevents.py +443 -0
  52. modules/amb/tests/test_features.py +531 -0
  53. modules/amb/tests/test_models.py +74 -0
  54. modules/amb/tests/test_tracing.py +254 -0
  55. modules/atr/.github/workflows/ci.yml +101 -0
  56. modules/atr/.github/workflows/publish.yml +140 -0
  57. modules/atr/.gitignore +134 -0
  58. modules/atr/.pre-commit-config.yaml +37 -0
  59. modules/atr/CHANGELOG.md +39 -0
  60. modules/atr/CONTRIBUTING.md +96 -0
  61. modules/atr/IMPLEMENTATION_SUMMARY.md +143 -0
  62. modules/atr/README.md +180 -0
  63. modules/atr/atr/__init__.py +638 -0
  64. modules/atr/atr/access.py +346 -0
  65. modules/atr/atr/composition.py +643 -0
  66. modules/atr/atr/decorator.py +355 -0
  67. modules/atr/atr/executor.py +382 -0
  68. modules/atr/atr/health.py +555 -0
  69. modules/atr/atr/hf_utils.py +447 -0
  70. modules/atr/atr/injection.py +420 -0
  71. modules/atr/atr/metrics.py +438 -0
  72. modules/atr/atr/policies.py +401 -0
  73. modules/atr/atr/py.typed +2 -0
  74. modules/atr/atr/registry.py +450 -0
  75. modules/atr/atr/schema.py +478 -0
  76. modules/atr/atr/tools/safe/__init__.py +73 -0
  77. modules/atr/atr/tools/safe/calculator.py +380 -0
  78. modules/atr/atr/tools/safe/datetime_tool.py +441 -0
  79. modules/atr/atr/tools/safe/file_reader.py +400 -0
  80. modules/atr/atr/tools/safe/http_client.py +314 -0
  81. modules/atr/atr/tools/safe/json_parser.py +372 -0
  82. modules/atr/atr/tools/safe/text_tool.py +526 -0
  83. modules/atr/atr/tools/safe/toolkit.py +173 -0
  84. modules/atr/docs/PYPI_SETUP.md +113 -0
  85. modules/atr/examples/README.md +27 -0
  86. modules/atr/examples/demo.py +144 -0
  87. modules/atr/examples/sandbox_demo.py +218 -0
  88. modules/atr/experiments/README.md +69 -0
  89. modules/atr/experiments/reproduce_results.py +509 -0
  90. modules/atr/experiments/results/.gitkeep +0 -0
  91. modules/atr/experiments/results/results_20260123_140334.json +71 -0
  92. modules/atr/paper/README.md +36 -0
  93. modules/atr/paper/figures/.gitkeep +0 -0
  94. modules/atr/paper/references.bib +84 -0
  95. modules/atr/paper/structure.tex +293 -0
  96. modules/atr/paper/whitepaper.md +234 -0
  97. modules/atr/pyproject.toml +148 -0
  98. modules/atr/requirements.txt +1 -0
  99. modules/atr/setup.py +30 -0
  100. modules/atr/tests/__init__.py +1 -0
  101. modules/atr/tests/test_decorator.py +317 -0
  102. modules/atr/tests/test_executor.py +245 -0
  103. modules/atr/tests/test_integration_executor.py +184 -0
  104. modules/atr/tests/test_registry.py +312 -0
  105. modules/atr/tests/test_schema.py +182 -0
  106. modules/atr/tests/test_v2_features.py +708 -0
  107. modules/caas/.dockerignore +63 -0
  108. modules/caas/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  109. modules/caas/.github/ISSUE_TEMPLATE/custom.md +10 -0
  110. modules/caas/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  111. modules/caas/.github/workflows/ci.yml +100 -0
  112. modules/caas/.github/workflows/lint.yml +39 -0
  113. modules/caas/.github/workflows/publish-pypi.yml +124 -0
  114. modules/caas/.gitignore +73 -0
  115. modules/caas/.pre-commit-config.yaml +33 -0
  116. modules/caas/CHANGELOG.md +58 -0
  117. modules/caas/CONTRIBUTING.md +346 -0
  118. modules/caas/Dockerfile +41 -0
  119. modules/caas/LICENSE +21 -0
  120. modules/caas/MANIFEST.in +11 -0
  121. modules/caas/README.md +158 -0
  122. modules/caas/benchmarks/README.md +255 -0
  123. modules/caas/benchmarks/create_hf_dataset.py +502 -0
  124. modules/caas/benchmarks/data/sample_corpus/README.md +86 -0
  125. modules/caas/benchmarks/data/sample_corpus/auth_module.py +211 -0
  126. modules/caas/benchmarks/data/sample_corpus/contribution_guide.md +185 -0
  127. modules/caas/benchmarks/data/sample_corpus/remote_work_policy.html +57 -0
  128. modules/caas/benchmarks/hf_dataset/README.md +214 -0
  129. modules/caas/benchmarks/hf_dataset/caas_benchmark_corpus.py +73 -0
  130. modules/caas/benchmarks/hf_dataset/corpus_preview.json +193 -0
  131. modules/caas/benchmarks/results/README.md +66 -0
  132. modules/caas/benchmarks/results/evaluation_2026-01-20.json +121 -0
  133. modules/caas/benchmarks/run_evaluation.py +561 -0
  134. modules/caas/benchmarks/statistical_tests.py +289 -0
  135. modules/caas/benchmarks/verify_sample_corpus.py +83 -0
  136. modules/caas/docker-compose.yml +38 -0
  137. modules/caas/docs/CONTEXT_TRIAD.md +462 -0
  138. modules/caas/docs/CONTRIBUTING.md +346 -0
  139. modules/caas/docs/ETHICS_AND_LIMITATIONS.md +336 -0
  140. modules/caas/docs/HEURISTIC_ROUTER.md +442 -0
  141. modules/caas/docs/IMPLEMENTATION_SUMMARY.md +363 -0
  142. modules/caas/docs/IMPLEMENTATION_SUMMARY_CONTEXT_TRIAD.md +277 -0
  143. modules/caas/docs/IMPLEMENTATION_SUMMARY_HEURISTIC_ROUTER.md +231 -0
  144. modules/caas/docs/IMPLEMENTATION_SUMMARY_METADATA_INJECTION.md +258 -0
  145. modules/caas/docs/IMPLEMENTATION_SUMMARY_PRAGMATIC_TRUTH.md +212 -0
  146. modules/caas/docs/IMPLEMENTATION_SUMMARY_TRUST_GATEWAY.md +319 -0
  147. modules/caas/docs/LAYER_1_PRIMITIVE.md +202 -0
  148. modules/caas/docs/METADATA_INJECTION.md +404 -0
  149. modules/caas/docs/PRAGMATIC_TRUTH.md +431 -0
  150. modules/caas/docs/RELATED_WORK.md +312 -0
  151. modules/caas/docs/RELEASE_CHECKLIST.md +219 -0
  152. modules/caas/docs/RELEASE_GUIDE.md +285 -0
  153. modules/caas/docs/REPRODUCIBILITY.md +386 -0
  154. modules/caas/docs/SLIDING_WINDOW.md +387 -0
  155. modules/caas/docs/STRUCTURE_AWARE_INDEXING.md +158 -0
  156. modules/caas/docs/TESTING.md +259 -0
  157. modules/caas/docs/THREAT_MODEL.md +247 -0
  158. modules/caas/docs/TRUST_GATEWAY.md +575 -0
  159. modules/caas/docs/VFS.md +298 -0
  160. modules/caas/examples/agents/enterprise_security_agent.py +414 -0
  161. modules/caas/examples/agents/intelligent_document_analyzer.py +380 -0
  162. modules/caas/examples/demos/demo.py +309 -0
  163. modules/caas/examples/demos/demo_context_triad.py +225 -0
  164. modules/caas/examples/demos/demo_conversation_manager.py +285 -0
  165. modules/caas/examples/demos/demo_heuristic_router.py +133 -0
  166. modules/caas/examples/demos/demo_metadata_injection.py +198 -0
  167. modules/caas/examples/demos/demo_pragmatic_truth.py +303 -0
  168. modules/caas/examples/demos/demo_structure_aware.py +140 -0
  169. modules/caas/examples/demos/demo_time_decay.py +247 -0
  170. modules/caas/examples/demos/demo_trust_gateway.py +383 -0
  171. modules/caas/examples/multi_agent/README.md +159 -0
  172. modules/caas/examples/multi_agent/research_team.py +369 -0
  173. modules/caas/examples/multi_agent/vfs_collaboration.py +393 -0
  174. modules/caas/examples/usage/auth_module.py +142 -0
  175. modules/caas/examples/usage/usage_example.py +173 -0
  176. modules/caas/experiments/README.md +42 -0
  177. modules/caas/experiments/reproduce_results.py +462 -0
  178. modules/caas/paper/ARXIV_METADATA.md +145 -0
  179. modules/caas/paper/ARXIV_README.md +47 -0
  180. modules/caas/paper/CHECKLIST.md +103 -0
  181. modules/caas/paper/GITHUB_RELEASE_NOTES.md +105 -0
  182. modules/caas/paper/README.md +71 -0
  183. modules/caas/paper/abstract.md +24 -0
  184. modules/caas/paper/arxiv_submission.tar +0 -0
  185. modules/caas/paper/arxiv_submission.zip +0 -0
  186. modules/caas/paper/build_pdf.py +355 -0
  187. modules/caas/paper/experiments.md +149 -0
  188. modules/caas/paper/figures/.gitkeep +0 -0
  189. modules/caas/paper/figures/README.md +237 -0
  190. modules/caas/paper/figures/fig1_system_architecture.png +0 -0
  191. modules/caas/paper/figures/fig1_system_architecture.svg +198 -0
  192. modules/caas/paper/figures/fig2_context_triad.png +0 -0
  193. modules/caas/paper/figures/fig2_context_triad.svg +105 -0
  194. modules/caas/paper/figures/fig3_ablation_results.png +0 -0
  195. modules/caas/paper/figures/fig3_ablation_results.svg +113 -0
  196. modules/caas/paper/figures/fig4_routing_latency.png +0 -0
  197. modules/caas/paper/figures/fig4_routing_latency.svg +97 -0
  198. modules/caas/paper/intro.md +103 -0
  199. modules/caas/paper/latex/figures/fig1_system_architecture.png +0 -0
  200. modules/caas/paper/latex/figures/fig2_context_triad.png +0 -0
  201. modules/caas/paper/latex/figures/fig3_ablation_results.png +0 -0
  202. modules/caas/paper/latex/figures/fig4_routing_latency.png +0 -0
  203. modules/caas/paper/latex/main.tex +468 -0
  204. modules/caas/paper/latex/references.bib +140 -0
  205. modules/caas/paper/method.md +350 -0
  206. modules/caas/paper/outline.md +123 -0
  207. modules/caas/paper/related_work.md +101 -0
  208. modules/caas/paper/tables/.gitkeep +0 -0
  209. modules/caas/paper/tables/results_tables.md +50 -0
  210. modules/caas/pyproject.toml +172 -0
  211. modules/caas/requirements.txt +11 -0
  212. modules/caas/src/caas/__init__.py +232 -0
  213. modules/caas/src/caas/api/__init__.py +7 -0
  214. modules/caas/src/caas/api/server.py +1326 -0
  215. modules/caas/src/caas/caching.py +832 -0
  216. modules/caas/src/caas/cli.py +208 -0
  217. modules/caas/src/caas/conversation.py +221 -0
  218. modules/caas/src/caas/decay.py +118 -0
  219. modules/caas/src/caas/detection/__init__.py +7 -0
  220. modules/caas/src/caas/detection/detector.py +236 -0
  221. modules/caas/src/caas/enrichment.py +127 -0
  222. modules/caas/src/caas/gateway/__init__.py +24 -0
  223. modules/caas/src/caas/gateway/trust_gateway.py +471 -0
  224. modules/caas/src/caas/hf_utils.py +477 -0
  225. modules/caas/src/caas/ingestion/__init__.py +21 -0
  226. modules/caas/src/caas/ingestion/processors.py +251 -0
  227. modules/caas/src/caas/ingestion/structure_parser.py +185 -0
  228. modules/caas/src/caas/models.py +354 -0
  229. modules/caas/src/caas/pragmatic_truth.py +441 -0
  230. modules/caas/src/caas/routing/__init__.py +8 -0
  231. modules/caas/src/caas/routing/heuristic_router.py +242 -0
  232. modules/caas/src/caas/storage/__init__.py +7 -0
  233. modules/caas/src/caas/storage/store.py +450 -0
  234. modules/caas/src/caas/triad.py +472 -0
  235. modules/caas/src/caas/tuning/__init__.py +7 -0
  236. modules/caas/src/caas/tuning/tuner.py +322 -0
  237. modules/caas/src/caas/vfs/__init__.py +12 -0
  238. modules/caas/src/caas/vfs/filesystem.py +450 -0
  239. modules/caas/tests/__init__.py +3 -0
  240. modules/caas/tests/conftest.py +8 -0
  241. modules/caas/tests/test_caching.py +628 -0
  242. modules/caas/tests/test_context_triad.py +385 -0
  243. modules/caas/tests/test_conversation_manager.py +289 -0
  244. modules/caas/tests/test_functionality.py +215 -0
  245. modules/caas/tests/test_heuristic_router.py +370 -0
  246. modules/caas/tests/test_metadata_injection.py +328 -0
  247. modules/caas/tests/test_pragmatic_truth.py +322 -0
  248. modules/caas/tests/test_structure_aware_indexing.py +283 -0
  249. modules/caas/tests/test_time_decay.py +268 -0
  250. modules/caas/tests/test_trust_gateway.py +445 -0
  251. modules/caas/tests/test_vfs.py +298 -0
  252. modules/cmvk/.github/FUNDING.yml +9 -0
  253. modules/cmvk/.github/dependabot.yml +54 -0
  254. modules/cmvk/.github/workflows/ci.yml +205 -0
  255. modules/cmvk/.github/workflows/publish.yml +143 -0
  256. modules/cmvk/.gitignore +147 -0
  257. modules/cmvk/.pre-commit-config.yaml +58 -0
  258. modules/cmvk/CHANGELOG.md +146 -0
  259. modules/cmvk/CITATION.cff +48 -0
  260. modules/cmvk/CONTRIBUTING.md +229 -0
  261. modules/cmvk/Dockerfile +87 -0
  262. modules/cmvk/HF_MODEL_CARD.md +185 -0
  263. modules/cmvk/LICENSE +21 -0
  264. modules/cmvk/README.md +149 -0
  265. modules/cmvk/SECURITY.md +114 -0
  266. modules/cmvk/config/prompts/generator_v1.txt +23 -0
  267. modules/cmvk/config/prompts/verifier_hostile.txt +32 -0
  268. modules/cmvk/config/settings.yaml +40 -0
  269. modules/cmvk/coverage_html/.gitignore +2 -0
  270. modules/cmvk/coverage_html/class_index.html +658 -0
  271. modules/cmvk/coverage_html/coverage_html_cb_188fc9a4.js +735 -0
  272. modules/cmvk/coverage_html/favicon_32_cb_c827f16f.png +0 -0
  273. modules/cmvk/coverage_html/function_index.html +1978 -0
  274. modules/cmvk/coverage_html/index.html +255 -0
  275. modules/cmvk/coverage_html/keybd_closed_cb_900cfef5.png +0 -0
  276. modules/cmvk/coverage_html/status.json +1 -0
  277. modules/cmvk/coverage_html/style_cb_5c747636.css +389 -0
  278. modules/cmvk/coverage_html/z_2c49bd2ed3e01e38___init___py.html +315 -0
  279. modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_audit_py.html +499 -0
  280. modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_benchmarks_py.html +575 -0
  281. modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_constitutional_py.html +1001 -0
  282. modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_hf_utils_py.html +398 -0
  283. modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_metrics_py.html +570 -0
  284. modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_profiles_py.html +397 -0
  285. modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_types_py.html +109 -0
  286. modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_verification_py.html +1053 -0
  287. modules/cmvk/docs/DIAGRAMS.md +325 -0
  288. modules/cmvk/docs/architecture.md +345 -0
  289. modules/cmvk/docs/features.md +308 -0
  290. modules/cmvk/docs/getting_started.md +279 -0
  291. modules/cmvk/docs/innovation_layer.md +377 -0
  292. modules/cmvk/docs/safety.md +281 -0
  293. modules/cmvk/docs/traceability.md +150 -0
  294. modules/cmvk/examples/basic_example.py +62 -0
  295. modules/cmvk/examples/demo_complete_pipeline.py +209 -0
  296. modules/cmvk/examples/demo_innovation_layer.py +197 -0
  297. modules/cmvk/examples/example.py +112 -0
  298. modules/cmvk/examples/model_diversity_comparison.py +110 -0
  299. modules/cmvk/examples/real_api_integration.py +121 -0
  300. modules/cmvk/examples/test_full_pipeline.py +303 -0
  301. modules/cmvk/experiments/FEATURE_2_LATERAL_THINKING.md +187 -0
  302. modules/cmvk/experiments/README.md +216 -0
  303. modules/cmvk/experiments/ablation_runner.py +666 -0
  304. modules/cmvk/experiments/baseline_runner.py +158 -0
  305. modules/cmvk/experiments/blind_spot_benchmark.py +364 -0
  306. modules/cmvk/experiments/datasets/README.md +85 -0
  307. modules/cmvk/experiments/datasets/humaneval_50.json +352 -0
  308. modules/cmvk/experiments/datasets/humaneval_full.json +1150 -0
  309. modules/cmvk/experiments/datasets/humaneval_sample.json +32 -0
  310. modules/cmvk/experiments/datasets/sabotage.json +262 -0
  311. modules/cmvk/experiments/datasets/sample.json +40 -0
  312. modules/cmvk/experiments/demo_with_traces.py +110 -0
  313. modules/cmvk/experiments/efficiency_curve.py +259 -0
  314. modules/cmvk/experiments/experiment_runner.py +243 -0
  315. modules/cmvk/experiments/paper_data_generator.py +183 -0
  316. modules/cmvk/experiments/reproduce_results.py +407 -0
  317. modules/cmvk/experiments/reproducible_runner.py +352 -0
  318. modules/cmvk/experiments/sabotage_stress_test.py +311 -0
  319. modules/cmvk/experiments/test_lateral_thinking.py +116 -0
  320. modules/cmvk/experiments/test_prosecutor.py +41 -0
  321. modules/cmvk/experiments/visualize_results.py +735 -0
  322. modules/cmvk/logs/traces/demo_HumanEval_0_20260121-204900.json +36 -0
  323. modules/cmvk/notebooks/analysis.ipynb +124 -0
  324. modules/cmvk/paper/PAPER.md +561 -0
  325. modules/cmvk/paper/arxiv_checklist.md +230 -0
  326. modules/cmvk/paper/cmvk_neurips.aux +77 -0
  327. modules/cmvk/paper/cmvk_neurips.bbl +81 -0
  328. modules/cmvk/paper/cmvk_neurips.blg +48 -0
  329. modules/cmvk/paper/cmvk_neurips.out +16 -0
  330. modules/cmvk/paper/cmvk_neurips.pdf +0 -0
  331. modules/cmvk/paper/cmvk_neurips.tex +309 -0
  332. modules/cmvk/paper/figures/ablation.png +0 -0
  333. modules/cmvk/paper/figures/ablation.svg +39 -0
  334. modules/cmvk/paper/figures/architecture.png +0 -0
  335. modules/cmvk/paper/figures/architecture.svg +115 -0
  336. modules/cmvk/paper/figures/results_bar.png +0 -0
  337. modules/cmvk/paper/figures/results_bar.svg +70 -0
  338. modules/cmvk/paper/generate_figures.py +383 -0
  339. modules/cmvk/paper/neurips_2024.sty +101 -0
  340. modules/cmvk/paper/references.bib +98 -0
  341. modules/cmvk/paper/structure.tex +200 -0
  342. modules/cmvk/pyproject.toml +189 -0
  343. modules/cmvk/requirements-dev.txt +19 -0
  344. modules/cmvk/requirements.txt +14 -0
  345. modules/cmvk/src/cmvk/__init__.py +216 -0
  346. modules/cmvk/src/cmvk/audit.py +400 -0
  347. modules/cmvk/src/cmvk/benchmarks.py +476 -0
  348. modules/cmvk/src/cmvk/constitutional.py +902 -0
  349. modules/cmvk/src/cmvk/hf_utils.py +299 -0
  350. modules/cmvk/src/cmvk/metrics.py +471 -0
  351. modules/cmvk/src/cmvk/profiles.py +298 -0
  352. modules/cmvk/src/cmvk/py.typed +0 -0
  353. modules/cmvk/src/cmvk/types.py +10 -0
  354. modules/cmvk/src/cmvk/verification.py +954 -0
  355. modules/cmvk/src/cross_model_verification_kernel/__init__.py +91 -0
  356. modules/cmvk/src/cross_model_verification_kernel/__main__.py +10 -0
  357. modules/cmvk/src/cross_model_verification_kernel/agents/__init__.py +16 -0
  358. modules/cmvk/src/cross_model_verification_kernel/agents/base_agent.py +142 -0
  359. modules/cmvk/src/cross_model_verification_kernel/agents/generator_openai.py +223 -0
  360. modules/cmvk/src/cross_model_verification_kernel/agents/verifier_anthropic.py +448 -0
  361. modules/cmvk/src/cross_model_verification_kernel/agents/verifier_gemini.py +481 -0
  362. modules/cmvk/src/cross_model_verification_kernel/cli.py +570 -0
  363. modules/cmvk/src/cross_model_verification_kernel/core/__init__.py +26 -0
  364. modules/cmvk/src/cross_model_verification_kernel/core/graph_memory.py +308 -0
  365. modules/cmvk/src/cross_model_verification_kernel/core/kernel.py +413 -0
  366. modules/cmvk/src/cross_model_verification_kernel/core/trace_logger.py +75 -0
  367. modules/cmvk/src/cross_model_verification_kernel/core/types.py +121 -0
  368. modules/cmvk/src/cross_model_verification_kernel/datasets/__init__.py +20 -0
  369. modules/cmvk/src/cross_model_verification_kernel/datasets/humaneval_loader.py +271 -0
  370. modules/cmvk/src/cross_model_verification_kernel/generator.py +118 -0
  371. modules/cmvk/src/cross_model_verification_kernel/kernel.py +292 -0
  372. modules/cmvk/src/cross_model_verification_kernel/models.py +111 -0
  373. modules/cmvk/src/cross_model_verification_kernel/py.typed +1 -0
  374. modules/cmvk/src/cross_model_verification_kernel/simple_kernel.py +185 -0
  375. modules/cmvk/src/cross_model_verification_kernel/tools/__init__.py +94 -0
  376. modules/cmvk/src/cross_model_verification_kernel/tools/huggingface_upload.py +394 -0
  377. modules/cmvk/src/cross_model_verification_kernel/tools/sandbox.py +159 -0
  378. modules/cmvk/src/cross_model_verification_kernel/tools/statistics.py +468 -0
  379. modules/cmvk/src/cross_model_verification_kernel/tools/visualizer.py +312 -0
  380. modules/cmvk/src/cross_model_verification_kernel/tools/web_search.py +86 -0
  381. modules/cmvk/src/cross_model_verification_kernel/verifier.py +257 -0
  382. modules/cmvk/tests/__init__.py +3 -0
  383. modules/cmvk/tests/conftest.py +61 -0
  384. modules/cmvk/tests/integration/__init__.py +1 -0
  385. modules/cmvk/tests/integration/test_anthropic_verifier.py +269 -0
  386. modules/cmvk/tests/integration/test_integration.py +53 -0
  387. modules/cmvk/tests/integration/test_lateral_thinking_integration.py +199 -0
  388. modules/cmvk/tests/integration/test_lateral_thinking_witness.py +208 -0
  389. modules/cmvk/tests/integration/test_prosecutor_mode.py +131 -0
  390. modules/cmvk/tests/test_constitutional.py +611 -0
  391. modules/cmvk/tests/test_enhanced_features.py +603 -0
  392. modules/cmvk/tests/test_verification.py +255 -0
  393. modules/cmvk/tests/unit/__init__.py +1 -0
  394. modules/cmvk/tests/unit/test_agents.py +64 -0
  395. modules/cmvk/tests/unit/test_cli.py +224 -0
  396. modules/cmvk/tests/unit/test_core.py +126 -0
  397. modules/cmvk/tests/unit/test_humaneval_loader.py +197 -0
  398. modules/cmvk/tests/unit/test_kernel.py +255 -0
  399. modules/cmvk/tests/unit/test_reproducibility.py +160 -0
  400. modules/cmvk/tests/unit/test_trace_logger.py +115 -0
  401. modules/cmvk/tests/unit/test_visualizer.py +218 -0
  402. modules/control-plane/.github/ISSUE_TEMPLATE/bug_report.yml +82 -0
  403. modules/control-plane/.github/ISSUE_TEMPLATE/config.yml +11 -0
  404. modules/control-plane/.github/ISSUE_TEMPLATE/feature_request.yml +104 -0
  405. modules/control-plane/.github/ISSUE_TEMPLATE/question.yml +70 -0
  406. modules/control-plane/.github/ISSUE_TEMPLATE/security_vulnerability.yml +84 -0
  407. modules/control-plane/.github/discussions.yml +73 -0
  408. modules/control-plane/.github/pull_request_template.md +82 -0
  409. modules/control-plane/.github/workflows/publish.yml +146 -0
  410. modules/control-plane/.github/workflows/release.yml +39 -0
  411. modules/control-plane/.github/workflows/tests.yml +58 -0
  412. modules/control-plane/.gitignore +55 -0
  413. modules/control-plane/CHANGELOG.md +203 -0
  414. modules/control-plane/CONTRIBUTING.md +311 -0
  415. modules/control-plane/CONTRIBUTORS.md +88 -0
  416. modules/control-plane/Dockerfile +82 -0
  417. modules/control-plane/LICENSE +21 -0
  418. modules/control-plane/MANIFEST.in +17 -0
  419. modules/control-plane/README.md +1264 -0
  420. modules/control-plane/ROADMAP.md +228 -0
  421. modules/control-plane/SECURITY.md +210 -0
  422. modules/control-plane/SUPPORT.md +106 -0
  423. modules/control-plane/acp-cli.py +212 -0
  424. modules/control-plane/benchmark/README.md +257 -0
  425. modules/control-plane/benchmark/__init__.py +19 -0
  426. modules/control-plane/benchmark/red_team_dataset.py +517 -0
  427. modules/control-plane/benchmark.py +563 -0
  428. modules/control-plane/build_and_publish.sh +130 -0
  429. modules/control-plane/docker-compose.yml +74 -0
  430. modules/control-plane/docs/ABLATION_STUDIES.md +528 -0
  431. modules/control-plane/docs/ADAPTER_GUIDE.md +544 -0
  432. modules/control-plane/docs/ADVANCED_FEATURES.md +543 -0
  433. modules/control-plane/docs/AIOS_COMPARISON.md +296 -0
  434. modules/control-plane/docs/BIBLIOGRAPHY.md +367 -0
  435. modules/control-plane/docs/CASE_STUDIES.md +645 -0
  436. modules/control-plane/docs/DOCKER_DEPLOYMENT.md +184 -0
  437. modules/control-plane/docs/ECOSYSTEM_STATUS.md +98 -0
  438. modules/control-plane/docs/HF_MODEL_CARD.md +168 -0
  439. modules/control-plane/docs/KERNEL_V1_RELEASE.md +454 -0
  440. modules/control-plane/docs/LAYER3_FRAMEWORK.md +227 -0
  441. modules/control-plane/docs/LIMITATIONS.md +523 -0
  442. modules/control-plane/docs/PYPI_PUBLISHING.md +195 -0
  443. modules/control-plane/docs/README.md +58 -0
  444. modules/control-plane/docs/RELATED_WORK.md +319 -0
  445. modules/control-plane/docs/RELEASE_v1.1.0.md +252 -0
  446. modules/control-plane/docs/REPRODUCIBILITY.md +540 -0
  447. modules/control-plane/docs/RESEARCH_FOUNDATION.md +197 -0
  448. modules/control-plane/docs/api/CORE.md +270 -0
  449. modules/control-plane/docs/architecture/architecture.md +120 -0
  450. modules/control-plane/docs/community/ANNOUNCEMENT_TEMPLATES.md +52 -0
  451. modules/control-plane/docs/guides/IMPLEMENTATION.md +225 -0
  452. modules/control-plane/docs/guides/PHILOSOPHY.md +354 -0
  453. modules/control-plane/docs/guides/QUICKSTART.md +217 -0
  454. modules/control-plane/examples/README.md +138 -0
  455. modules/control-plane/examples/a2a_demo.py +410 -0
  456. modules/control-plane/examples/adapter_demo.py +347 -0
  457. modules/control-plane/examples/advanced_features.py +403 -0
  458. modules/control-plane/examples/basic_usage.py +261 -0
  459. modules/control-plane/examples/benchmark_demo.py +186 -0
  460. modules/control-plane/examples/compliance_demo.py +333 -0
  461. modules/control-plane/examples/configuration.py +265 -0
  462. modules/control-plane/examples/getting_started.py +178 -0
  463. modules/control-plane/examples/hibernation_and_time_travel_demo.py +406 -0
  464. modules/control-plane/examples/interactive_tutorial.ipynb +497 -0
  465. modules/control-plane/examples/kernel_interceptor_demo.py +202 -0
  466. modules/control-plane/examples/kernel_v1_demo.py +273 -0
  467. modules/control-plane/examples/langchain_demo.py +281 -0
  468. modules/control-plane/examples/lifecycle_demo.py +724 -0
  469. modules/control-plane/examples/mcp_demo.py +378 -0
  470. modules/control-plane/examples/ml_safety_demo.py +157 -0
  471. modules/control-plane/examples/multimodal_demo.py +347 -0
  472. modules/control-plane/examples/observability_demo.py +370 -0
  473. modules/control-plane/examples/use_cases.py +336 -0
  474. modules/control-plane/experiments/long_horizon_purge.py +235 -0
  475. modules/control-plane/experiments/multi_agent_rag.py +165 -0
  476. modules/control-plane/experiments/reproduce_results.py +667 -0
  477. modules/control-plane/paper/ARXIV_SUBMISSION_INFO.txt +122 -0
  478. modules/control-plane/paper/ETHICS_STATEMENT.md +248 -0
  479. modules/control-plane/paper/PAPER_CHECKLIST.md +72 -0
  480. modules/control-plane/paper/Paper.pdf +0 -0
  481. modules/control-plane/paper/README.md +71 -0
  482. modules/control-plane/paper/appendix.md +152 -0
  483. modules/control-plane/paper/architecture.md +15 -0
  484. modules/control-plane/paper/arxiv/figures/ablation_chart.png +0 -0
  485. modules/control-plane/paper/arxiv/figures/architecture.png +0 -0
  486. modules/control-plane/paper/arxiv/figures/constraint_graphs.png +0 -0
  487. modules/control-plane/paper/arxiv/figures/results_chart.png +0 -0
  488. modules/control-plane/paper/arxiv/main.aux +97 -0
  489. modules/control-plane/paper/arxiv/main.bbl +112 -0
  490. modules/control-plane/paper/arxiv/main.blg +48 -0
  491. modules/control-plane/paper/arxiv/main.out +33 -0
  492. modules/control-plane/paper/arxiv/main.pdf +0 -0
  493. modules/control-plane/paper/arxiv/main.tex +479 -0
  494. modules/control-plane/paper/arxiv/references.bib +234 -0
  495. modules/control-plane/paper/arxiv_submission.tar +0 -0
  496. modules/control-plane/paper/arxiv_submission.zip +0 -0
  497. modules/control-plane/paper/build.sh +68 -0
  498. modules/control-plane/paper/figures/README.md +47 -0
  499. modules/control-plane/paper/figures/ablation_chart.pdf +0 -0
  500. modules/control-plane/paper/figures/ablation_chart.png +0 -0
  501. modules/control-plane/paper/figures/architecture.pdf +0 -0
  502. modules/control-plane/paper/figures/architecture.png +0 -0
  503. modules/control-plane/paper/figures/constraint_graphs.pdf +0 -0
  504. modules/control-plane/paper/figures/constraint_graphs.png +0 -0
  505. modules/control-plane/paper/figures/generate_figures.py +252 -0
  506. modules/control-plane/paper/figures/results_chart.pdf +0 -0
  507. modules/control-plane/paper/figures/results_chart.png +0 -0
  508. modules/control-plane/paper/main.md +273 -0
  509. modules/control-plane/paper/main.tex +214 -0
  510. modules/control-plane/paper/main_arxiv.aux +53 -0
  511. modules/control-plane/paper/main_arxiv.out +17 -0
  512. modules/control-plane/paper/main_arxiv.pdf +0 -0
  513. modules/control-plane/paper/main_arxiv.tex +264 -0
  514. modules/control-plane/paper/references.bib +234 -0
  515. modules/control-plane/pyproject.toml +124 -0
  516. modules/control-plane/reproducibility/ABLATIONS.md +136 -0
  517. modules/control-plane/reproducibility/README.md +288 -0
  518. modules/control-plane/reproducibility/commands.md +467 -0
  519. modules/control-plane/reproducibility/docker_config/Dockerfile +39 -0
  520. modules/control-plane/reproducibility/experiment_configs/purge_config.json +46 -0
  521. modules/control-plane/reproducibility/experiment_configs/rag_config.json +36 -0
  522. modules/control-plane/reproducibility/hardware_specs.md +317 -0
  523. modules/control-plane/reproducibility/requirements_frozen.txt +0 -0
  524. modules/control-plane/reproducibility/run_all_experiments.sh +45 -0
  525. modules/control-plane/reproducibility/seeds.json +106 -0
  526. modules/control-plane/scripts/prepare_pypi.py +46 -0
  527. modules/control-plane/scripts/prepare_release.py +176 -0
  528. modules/control-plane/scripts/upload_dataset_to_hf.py +316 -0
  529. modules/control-plane/setup.py +69 -0
  530. modules/control-plane/src/agent_control_plane/__init__.py +639 -0
  531. modules/control-plane/src/agent_control_plane/a2a_adapter.py +541 -0
  532. modules/control-plane/src/agent_control_plane/adapter.py +415 -0
  533. modules/control-plane/src/agent_control_plane/agent_hibernation.py +364 -0
  534. modules/control-plane/src/agent_control_plane/agent_kernel.py +464 -0
  535. modules/control-plane/src/agent_control_plane/compliance.py +718 -0
  536. modules/control-plane/src/agent_control_plane/constraint_graphs.py +475 -0
  537. modules/control-plane/src/agent_control_plane/control_plane.py +848 -0
  538. modules/control-plane/src/agent_control_plane/example_executors.py +193 -0
  539. modules/control-plane/src/agent_control_plane/execution_engine.py +229 -0
  540. modules/control-plane/src/agent_control_plane/flight_recorder.py +600 -0
  541. modules/control-plane/src/agent_control_plane/governance_layer.py +432 -0
  542. modules/control-plane/src/agent_control_plane/hf_utils.py +561 -0
  543. modules/control-plane/src/agent_control_plane/interfaces/__init__.py +53 -0
  544. modules/control-plane/src/agent_control_plane/interfaces/kernel_interface.py +359 -0
  545. modules/control-plane/src/agent_control_plane/interfaces/plugin_interface.py +495 -0
  546. modules/control-plane/src/agent_control_plane/interfaces/protocol_interfaces.py +385 -0
  547. modules/control-plane/src/agent_control_plane/kernel_space.py +707 -0
  548. modules/control-plane/src/agent_control_plane/langchain_adapter.py +422 -0
  549. modules/control-plane/src/agent_control_plane/lifecycle.py +3111 -0
  550. modules/control-plane/src/agent_control_plane/mcp_adapter.py +517 -0
  551. modules/control-plane/src/agent_control_plane/ml_safety.py +560 -0
  552. modules/control-plane/src/agent_control_plane/multimodal.py +724 -0
  553. modules/control-plane/src/agent_control_plane/mute_agent.py +419 -0
  554. modules/control-plane/src/agent_control_plane/observability.py +785 -0
  555. modules/control-plane/src/agent_control_plane/orchestrator.py +480 -0
  556. modules/control-plane/src/agent_control_plane/plugin_registry.py +748 -0
  557. modules/control-plane/src/agent_control_plane/policy_engine.py +525 -0
  558. modules/control-plane/src/agent_control_plane/shadow_mode.py +307 -0
  559. modules/control-plane/src/agent_control_plane/signals.py +491 -0
  560. modules/control-plane/src/agent_control_plane/supervisor_agents.py +427 -0
  561. modules/control-plane/src/agent_control_plane/time_travel_debugger.py +554 -0
  562. modules/control-plane/src/agent_control_plane/tool_registry.py +350 -0
  563. modules/control-plane/src/agent_control_plane/vfs.py +695 -0
  564. modules/control-plane/tests/README.md +33 -0
  565. modules/control-plane/tests/test_a2a_adapter.py +336 -0
  566. modules/control-plane/tests/test_adapter.py +422 -0
  567. modules/control-plane/tests/test_advanced_features.py +389 -0
  568. modules/control-plane/tests/test_benchmark.py +223 -0
  569. modules/control-plane/tests/test_compliance.py +214 -0
  570. modules/control-plane/tests/test_control_plane.py +295 -0
  571. modules/control-plane/tests/test_hibernation.py +274 -0
  572. modules/control-plane/tests/test_kernel_interception.py +284 -0
  573. modules/control-plane/tests/test_langchain_adapter.py +258 -0
  574. modules/control-plane/tests/test_lifecycle.py +1174 -0
  575. modules/control-plane/tests/test_mcp_adapter.py +293 -0
  576. modules/control-plane/tests/test_ml_safety.py +142 -0
  577. modules/control-plane/tests/test_multimodal.py +317 -0
  578. modules/control-plane/tests/test_new_features.py +435 -0
  579. modules/control-plane/tests/test_observability.py +338 -0
  580. modules/control-plane/tests/test_time_travel.py +387 -0
  581. modules/emk/.github/workflows/ci.yml +105 -0
  582. modules/emk/.github/workflows/publish.yml +144 -0
  583. modules/emk/.gitignore +74 -0
  584. modules/emk/CHANGELOG.md +41 -0
  585. modules/emk/CONTRIBUTING.md +295 -0
  586. modules/emk/IMPLEMENTATION.md +174 -0
  587. modules/emk/LICENSE +21 -0
  588. modules/emk/MANIFEST.in +8 -0
  589. modules/emk/README.md +135 -0
  590. modules/emk/RELEASE_NOTES.md +82 -0
  591. modules/emk/SECURITY.md +52 -0
  592. modules/emk/codecov.yml +39 -0
  593. modules/emk/docs/MEMORY_MANAGEMENT.md +285 -0
  594. modules/emk/emk/__init__.py +106 -0
  595. modules/emk/emk/hf_utils.py +419 -0
  596. modules/emk/emk/indexer.py +144 -0
  597. modules/emk/emk/py.typed +0 -0
  598. modules/emk/emk/schema.py +204 -0
  599. modules/emk/emk/sleep_cycle.py +345 -0
  600. modules/emk/emk/store.py +479 -0
  601. modules/emk/examples/basic_usage.py +123 -0
  602. modules/emk/examples/memory_features_demo.py +154 -0
  603. modules/emk/experiments/README.md +59 -0
  604. modules/emk/experiments/reproduce_results.py +461 -0
  605. modules/emk/experiments/results.json +61 -0
  606. modules/emk/paper/structure.tex +192 -0
  607. modules/emk/paper/whitepaper.md +273 -0
  608. modules/emk/pyproject.toml +91 -0
  609. modules/emk/setup.py +5 -0
  610. modules/emk/tests/test_file_adapter.py +195 -0
  611. modules/emk/tests/test_indexer.py +174 -0
  612. modules/emk/tests/test_init.py +55 -0
  613. modules/emk/tests/test_negative_memory.py +83 -0
  614. modules/emk/tests/test_schema.py +150 -0
  615. modules/emk/tests/test_semantic_rules.py +175 -0
  616. modules/emk/tests/test_sleep_cycle.py +335 -0
  617. modules/emk/tests/test_store_anti_patterns.py +239 -0
  618. modules/iatp/.github/workflows/docker-build.yml +124 -0
  619. modules/iatp/.github/workflows/publish.yml +174 -0
  620. modules/iatp/.github/workflows/python-package.yml +121 -0
  621. modules/iatp/.gitignore +67 -0
  622. modules/iatp/.pre-commit-config.yaml +64 -0
  623. modules/iatp/CHANGELOG.md +120 -0
  624. modules/iatp/Dockerfile +91 -0
  625. modules/iatp/IMPLEMENTATION_SUMMARY.md +218 -0
  626. modules/iatp/MANIFEST.in +9 -0
  627. modules/iatp/README.md +180 -0
  628. modules/iatp/docker/Dockerfile.agent +27 -0
  629. modules/iatp/docker/Dockerfile.sidecar-python +86 -0
  630. modules/iatp/docker/README.md +258 -0
  631. modules/iatp/docker-compose.yml +194 -0
  632. modules/iatp/docs/ARCHITECTURE.md +243 -0
  633. modules/iatp/docs/CLI_GUIDE.md +220 -0
  634. modules/iatp/docs/DEPLOYMENT.md +304 -0
  635. modules/iatp/examples/README.md +132 -0
  636. modules/iatp/examples/backend_agent.py +39 -0
  637. modules/iatp/examples/client.py +168 -0
  638. modules/iatp/examples/demo_attestation_reputation.py +274 -0
  639. modules/iatp/examples/demo_client.py +240 -0
  640. modules/iatp/examples/demo_rbac.py +143 -0
  641. modules/iatp/examples/integration_demo.py +245 -0
  642. modules/iatp/examples/manifests/coder_agent.json +20 -0
  643. modules/iatp/examples/manifests/reviewer_agent.json +19 -0
  644. modules/iatp/examples/manifests/secure_bank.json +14 -0
  645. modules/iatp/examples/manifests/standard_agent.json +14 -0
  646. modules/iatp/examples/manifests/untrusted_honeypot.json +14 -0
  647. modules/iatp/examples/run_secure_bank_sidecar.py +85 -0
  648. modules/iatp/examples/run_sidecar.py +105 -0
  649. modules/iatp/examples/run_untrusted_sidecar.py +77 -0
  650. modules/iatp/examples/secure_bank_agent.py +138 -0
  651. modules/iatp/examples/test_untrusted.py +82 -0
  652. modules/iatp/examples/untrusted_agent.py +119 -0
  653. modules/iatp/experiments/README.md +58 -0
  654. modules/iatp/experiments/cascading_hallucination/README.md +149 -0
  655. modules/iatp/experiments/cascading_hallucination/agent_a_user.py +41 -0
  656. modules/iatp/experiments/cascading_hallucination/agent_b_summarizer.py +54 -0
  657. modules/iatp/experiments/cascading_hallucination/agent_c_database.py +47 -0
  658. modules/iatp/experiments/cascading_hallucination/proof_of_concept.py +290 -0
  659. modules/iatp/experiments/cascading_hallucination/run_experiment.py +226 -0
  660. modules/iatp/experiments/cascading_hallucination/sidecar_c.py +61 -0
  661. modules/iatp/experiments/reproduce_results.py +574 -0
  662. modules/iatp/experiments/results.json +2336 -0
  663. modules/iatp/iatp/__init__.py +164 -0
  664. modules/iatp/iatp/attestation.py +401 -0
  665. modules/iatp/iatp/cli.py +253 -0
  666. modules/iatp/iatp/hf_utils.py +469 -0
  667. modules/iatp/iatp/ipc_pipes.py +578 -0
  668. modules/iatp/iatp/main.py +410 -0
  669. modules/iatp/iatp/models/__init__.py +445 -0
  670. modules/iatp/iatp/policy_engine.py +335 -0
  671. modules/iatp/iatp/py.typed +2 -0
  672. modules/iatp/iatp/recovery.py +319 -0
  673. modules/iatp/iatp/security/__init__.py +268 -0
  674. modules/iatp/iatp/sidecar/__init__.py +517 -0
  675. modules/iatp/iatp/telemetry/__init__.py +162 -0
  676. modules/iatp/iatp/tests/__init__.py +1 -0
  677. modules/iatp/iatp/tests/test_attestation.py +368 -0
  678. modules/iatp/iatp/tests/test_cli.py +129 -0
  679. modules/iatp/iatp/tests/test_models.py +128 -0
  680. modules/iatp/iatp/tests/test_policy_engine.py +345 -0
  681. modules/iatp/iatp/tests/test_recovery.py +279 -0
  682. modules/iatp/iatp/tests/test_security.py +220 -0
  683. modules/iatp/iatp/tests/test_sidecar.py +165 -0
  684. modules/iatp/iatp/tests/test_telemetry.py +173 -0
  685. modules/iatp/paper/BLOG.md +307 -0
  686. modules/iatp/paper/PAPER.md +236 -0
  687. modules/iatp/paper/RFC_SUBMISSION.md +299 -0
  688. modules/iatp/paper/whitepaper.md +369 -0
  689. modules/iatp/proto/README.md +200 -0
  690. modules/iatp/proto/generate_stubs.py +81 -0
  691. modules/iatp/proto/iatp.proto +552 -0
  692. modules/iatp/pyproject.toml +180 -0
  693. modules/iatp/requirements-dev.txt +2 -0
  694. modules/iatp/requirements.txt +6 -0
  695. modules/iatp/setup.py +60 -0
  696. modules/iatp/sidecar/README.md +487 -0
  697. modules/iatp/sidecar/go/Dockerfile +32 -0
  698. modules/iatp/sidecar/go/README.md +237 -0
  699. modules/iatp/sidecar/go/go.mod +8 -0
  700. modules/iatp/sidecar/go/main.go +488 -0
  701. modules/iatp/spec/001-handshake.md +436 -0
  702. modules/iatp/spec/002-reversibility.md +394 -0
  703. modules/iatp/spec/schema/capability_manifest.json +266 -0
  704. modules/iatp/test_integration.py +310 -0
  705. modules/mcp-kernel-server/README.md +261 -0
  706. modules/mcp-kernel-server/pyproject.toml +60 -0
  707. modules/mcp-kernel-server/src/mcp_kernel_server/__init__.py +26 -0
  708. modules/mcp-kernel-server/src/mcp_kernel_server/cli.py +229 -0
  709. modules/mcp-kernel-server/src/mcp_kernel_server/resources.py +215 -0
  710. modules/mcp-kernel-server/src/mcp_kernel_server/server.py +562 -0
  711. modules/mcp-kernel-server/src/mcp_kernel_server/tools.py +1172 -0
  712. modules/mute-agent/.github/workflows/safety_check.yml +45 -0
  713. modules/mute-agent/.gitignore +53 -0
  714. modules/mute-agent/ARCHITECTURE.md +531 -0
  715. modules/mute-agent/BENCHMARK_GUIDE.md +384 -0
  716. modules/mute-agent/COMPLETION_SUMMARY.md +293 -0
  717. modules/mute-agent/EXPERIMENT_SUMMARY.md +318 -0
  718. modules/mute-agent/IMPLEMENTATION_SUMMARY.md +212 -0
  719. modules/mute-agent/LICENSE +21 -0
  720. modules/mute-agent/PHASE3_SUMMARY.md +297 -0
  721. modules/mute-agent/README.md +360 -0
  722. modules/mute-agent/STEEL_MAN_RESULTS.md +353 -0
  723. modules/mute-agent/USAGE.md +505 -0
  724. modules/mute-agent/V2_IMPLEMENTATION_SUMMARY.md +253 -0
  725. modules/mute-agent/V2_STEEL_MAN_IMPLEMENTATION.md +274 -0
  726. modules/mute-agent/VERIFICATION_REPORT.md +435 -0
  727. modules/mute-agent/charts/cost_comparison.png +0 -0
  728. modules/mute-agent/charts/cost_vs_ambiguity.png +0 -0
  729. modules/mute-agent/charts/metrics_comparison.png +0 -0
  730. modules/mute-agent/charts/scenario_breakdown.png +0 -0
  731. modules/mute-agent/charts/trace_attack_blocked.html +140 -0
  732. modules/mute-agent/charts/trace_attack_blocked.png +0 -0
  733. modules/mute-agent/charts/trace_failure.html +140 -0
  734. modules/mute-agent/charts/trace_failure.png +0 -0
  735. modules/mute-agent/charts/trace_success.html +140 -0
  736. modules/mute-agent/charts/trace_success.png +0 -0
  737. modules/mute-agent/examples/__init__.py +1 -0
  738. modules/mute-agent/examples/advanced_example.py +384 -0
  739. modules/mute-agent/examples/graph_debugger_demo.py +241 -0
  740. modules/mute-agent/examples/listener_example.py +297 -0
  741. modules/mute-agent/examples/simple_example.py +242 -0
  742. modules/mute-agent/examples/steel_man_demo.py +297 -0
  743. modules/mute-agent/experiments/README.md +135 -0
  744. modules/mute-agent/experiments/__init__.py +3 -0
  745. modules/mute-agent/experiments/agent_comparison.csv +6 -0
  746. modules/mute-agent/experiments/agent_comparison_50runs.csv +6 -0
  747. modules/mute-agent/experiments/ambiguity_test.py +335 -0
  748. modules/mute-agent/experiments/ambiguity_test_results.csv +31 -0
  749. modules/mute-agent/experiments/ambiguity_test_results_50runs.csv +51 -0
  750. modules/mute-agent/experiments/baseline_agent.py +189 -0
  751. modules/mute-agent/experiments/benchmark.py +402 -0
  752. modules/mute-agent/experiments/demo.py +172 -0
  753. modules/mute-agent/experiments/generate_cost_curve.py +474 -0
  754. modules/mute-agent/experiments/jailbreak_test.py +137 -0
  755. modules/mute-agent/experiments/latent_state_scenario.py +361 -0
  756. modules/mute-agent/experiments/mute_agent_experiment.py +349 -0
  757. modules/mute-agent/experiments/run_extended_experiment.py +40 -0
  758. modules/mute-agent/experiments/run_v2_experiments.py +266 -0
  759. modules/mute-agent/experiments/run_v2_experiments_auto.py +247 -0
  760. modules/mute-agent/experiments/v2_scenarios/README.md +214 -0
  761. modules/mute-agent/experiments/v2_scenarios/__init__.py +4 -0
  762. modules/mute-agent/experiments/v2_scenarios/scenario_1_deep_dependency.py +325 -0
  763. modules/mute-agent/experiments/v2_scenarios/scenario_2_adversarial.py +328 -0
  764. modules/mute-agent/experiments/v2_scenarios/scenario_3_false_positive.py +303 -0
  765. modules/mute-agent/experiments/v2_scenarios/scenario_4_performance.py +319 -0
  766. modules/mute-agent/experiments/visualize.py +400 -0
  767. modules/mute-agent/mute_agent/__init__.py +66 -0
  768. modules/mute-agent/mute_agent/core/__init__.py +1 -0
  769. modules/mute-agent/mute_agent/core/execution_agent.py +164 -0
  770. modules/mute-agent/mute_agent/core/handshake_protocol.py +199 -0
  771. modules/mute-agent/mute_agent/core/reasoning_agent.py +236 -0
  772. modules/mute-agent/mute_agent/knowledge_graph/__init__.py +1 -0
  773. modules/mute-agent/mute_agent/knowledge_graph/graph_elements.py +63 -0
  774. modules/mute-agent/mute_agent/knowledge_graph/multidimensional_graph.py +168 -0
  775. modules/mute-agent/mute_agent/knowledge_graph/subgraph.py +222 -0
  776. modules/mute-agent/mute_agent/listener/__init__.py +41 -0
  777. modules/mute-agent/mute_agent/listener/adapters/__init__.py +29 -0
  778. modules/mute-agent/mute_agent/listener/adapters/base_adapter.py +187 -0
  779. modules/mute-agent/mute_agent/listener/adapters/caas_adapter.py +342 -0
  780. modules/mute-agent/mute_agent/listener/adapters/control_plane_adapter.py +434 -0
  781. modules/mute-agent/mute_agent/listener/adapters/iatp_adapter.py +330 -0
  782. modules/mute-agent/mute_agent/listener/adapters/scak_adapter.py +249 -0
  783. modules/mute-agent/mute_agent/listener/listener.py +608 -0
  784. modules/mute-agent/mute_agent/listener/state_observer.py +434 -0
  785. modules/mute-agent/mute_agent/listener/threshold_config.py +311 -0
  786. modules/mute-agent/mute_agent/super_system/__init__.py +1 -0
  787. modules/mute-agent/mute_agent/super_system/router.py +202 -0
  788. modules/mute-agent/mute_agent/visualization/__init__.py +8 -0
  789. modules/mute-agent/mute_agent/visualization/graph_debugger.py +495 -0
  790. modules/mute-agent/requirements-dev.txt +6 -0
  791. modules/mute-agent/requirements.txt +9 -0
  792. modules/mute-agent/setup.py +64 -0
  793. modules/mute-agent/src/__init__.py +0 -0
  794. modules/mute-agent/src/agents/__init__.py +0 -0
  795. modules/mute-agent/src/agents/baseline_agent.py +524 -0
  796. modules/mute-agent/src/agents/interactive_agent.py +113 -0
  797. modules/mute-agent/src/agents/mute_agent.py +622 -0
  798. modules/mute-agent/src/benchmarks/__init__.py +0 -0
  799. modules/mute-agent/src/benchmarks/evaluator.py +481 -0
  800. modules/mute-agent/src/benchmarks/scenarios.json +985 -0
  801. modules/mute-agent/src/core/__init__.py +0 -0
  802. modules/mute-agent/src/core/mock_state.py +320 -0
  803. modules/mute-agent/src/core/tools.py +441 -0
  804. modules/nexus/__init__.py +49 -0
  805. modules/nexus/arbiter.py +357 -0
  806. modules/nexus/client.py +464 -0
  807. modules/nexus/dmz.py +417 -0
  808. modules/nexus/escrow.py +428 -0
  809. modules/nexus/exceptions.py +284 -0
  810. modules/nexus/registry.py +391 -0
  811. modules/nexus/reputation.py +423 -0
  812. modules/nexus/schemas/__init__.py +49 -0
  813. modules/nexus/schemas/compliance.py +274 -0
  814. modules/nexus/schemas/escrow.py +249 -0
  815. modules/nexus/schemas/manifest.py +223 -0
  816. modules/nexus/schemas/receipt.py +206 -0
  817. modules/observability/README.md +192 -0
  818. modules/observability/alertmanager/alertmanager.yml +116 -0
  819. modules/observability/alerts/agent-os-alerts.yaml +197 -0
  820. modules/observability/docker-compose.yml +128 -0
  821. modules/observability/grafana/dashboards/agent-os-amb.json +448 -0
  822. modules/observability/grafana/dashboards/agent-os-cmvk.json +441 -0
  823. modules/observability/grafana/dashboards/agent-os-overview.json +268 -0
  824. modules/observability/grafana/dashboards/agent-os-performance.json +15 -0
  825. modules/observability/grafana/dashboards/agent-os-safety.json +50 -0
  826. modules/observability/grafana/provisioning/dashboards/dashboards.yml +15 -0
  827. modules/observability/grafana/provisioning/datasources/datasources.yml +33 -0
  828. modules/observability/otel/otel-collector-config.yml +61 -0
  829. modules/observability/prometheus/prometheus.yml +63 -0
  830. modules/observability/pyproject.toml +53 -0
  831. modules/observability/scripts/export_dashboards.py +55 -0
  832. modules/observability/src/agent_os_observability/__init__.py +25 -0
  833. modules/observability/src/agent_os_observability/dashboards.py +896 -0
  834. modules/observability/src/agent_os_observability/metrics.py +396 -0
  835. modules/observability/src/agent_os_observability/server.py +221 -0
  836. modules/observability/src/agent_os_observability/tracer.py +226 -0
  837. modules/primitives/.gitignore +8 -0
  838. modules/primitives/README.md +62 -0
  839. modules/primitives/agent_primitives/__init__.py +22 -0
  840. modules/primitives/agent_primitives/failures.py +82 -0
  841. modules/primitives/agent_primitives/py.typed +0 -0
  842. modules/primitives/pyproject.toml +68 -0
  843. modules/scak/.github/copilot-instructions.md +396 -0
  844. modules/scak/.github/workflows/release.yml +117 -0
  845. modules/scak/.gitignore +32 -0
  846. modules/scak/CHANGELOG.md +173 -0
  847. modules/scak/CITATION.cff +62 -0
  848. modules/scak/CONTRIBUTING.md +429 -0
  849. modules/scak/Dockerfile +58 -0
  850. modules/scak/ENTERPRISE_FEATURES.md +518 -0
  851. modules/scak/IMPLEMENTATION_SUMMARY.md +206 -0
  852. modules/scak/LIMITATIONS.md +565 -0
  853. modules/scak/MANIFEST.in +16 -0
  854. modules/scak/NOVELTY.md +535 -0
  855. modules/scak/README.md +928 -0
  856. modules/scak/RESEARCH.md +670 -0
  857. modules/scak/agent_kernel/__init__.py +66 -0
  858. modules/scak/agent_kernel/analyzer.py +432 -0
  859. modules/scak/agent_kernel/auditor.py +31 -0
  860. modules/scak/agent_kernel/completeness_auditor.py +234 -0
  861. modules/scak/agent_kernel/detector.py +200 -0
  862. modules/scak/agent_kernel/kernel.py +741 -0
  863. modules/scak/agent_kernel/memory_manager.py +82 -0
  864. modules/scak/agent_kernel/models.py +372 -0
  865. modules/scak/agent_kernel/nudge_mechanism.py +260 -0
  866. modules/scak/agent_kernel/outcome_analyzer.py +335 -0
  867. modules/scak/agent_kernel/patcher.py +579 -0
  868. modules/scak/agent_kernel/semantic_analyzer.py +313 -0
  869. modules/scak/agent_kernel/semantic_purge.py +346 -0
  870. modules/scak/agent_kernel/simulator.py +447 -0
  871. modules/scak/agent_kernel/teacher.py +82 -0
  872. modules/scak/agent_kernel/triage.py +149 -0
  873. modules/scak/build_and_publish.ps1 +74 -0
  874. modules/scak/build_and_publish.sh +74 -0
  875. modules/scak/cli.py +471 -0
  876. modules/scak/dashboard.py +462 -0
  877. modules/scak/datasets/DATASET_CARD.md +219 -0
  878. modules/scak/datasets/README.md +143 -0
  879. modules/scak/datasets/gaia_vague_queries/vague_queries.json +262 -0
  880. modules/scak/datasets/hf_upload/README.md +219 -0
  881. modules/scak/datasets/hf_upload/scak_gaia_laziness.jsonl +50 -0
  882. modules/scak/datasets/prepare_hf_datasets.py +145 -0
  883. modules/scak/datasets/red_team/jailbreak_patterns.json +202 -0
  884. modules/scak/docker-compose.yml +99 -0
  885. modules/scak/docs/Adaptive-Memory-Hierarchy.md +319 -0
  886. modules/scak/docs/Data-Contracts-and-Schemas.md +285 -0
  887. modules/scak/docs/Dual-Loop-Architecture.md +344 -0
  888. modules/scak/docs/Enhanced-Features.md +612 -0
  889. modules/scak/docs/LANGCHAIN_INTEGRATION.md +572 -0
  890. modules/scak/docs/README.md +128 -0
  891. modules/scak/docs/Reference-Implementations.md +163 -0
  892. modules/scak/docs/SCAK_V2.md +374 -0
  893. modules/scak/docs/Three-Failure-Types.md +178 -0
  894. modules/scak/examples/basic_example.py +155 -0
  895. modules/scak/examples/circuit_breaker_lazy_eval_demo.py +243 -0
  896. modules/scak/examples/langchain_integration_example.py +339 -0
  897. modules/scak/examples/layer4_demo.py +243 -0
  898. modules/scak/examples/production_features_demo.py +353 -0
  899. modules/scak/examples/quick_demo.py +79 -0
  900. modules/scak/examples/scak_v2_demo.py +252 -0
  901. modules/scak/experiments/README.md +438 -0
  902. modules/scak/experiments/ablation_studies/README.md +192 -0
  903. modules/scak/experiments/ablation_studies/ablation_no_audit.py +116 -0
  904. modules/scak/experiments/ablation_studies/ablation_no_purge.py +133 -0
  905. modules/scak/experiments/chaos_engineering/README.md +332 -0
  906. modules/scak/experiments/context_efficiency_test.py +328 -0
  907. modules/scak/experiments/gaia_benchmark/README.md +208 -0
  908. modules/scak/experiments/laziness_benchmark.py +179 -0
  909. modules/scak/experiments/long_horizon_task_experiment.py +252 -0
  910. modules/scak/experiments/multi_agent_rag_experiment.py +284 -0
  911. modules/scak/experiments/results/ablation_table.md +12 -0
  912. modules/scak/experiments/results/long_horizon.json +36 -0
  913. modules/scak/experiments/results/multi_agent_rag.json +66 -0
  914. modules/scak/experiments/run_comprehensive_ablations.py +332 -0
  915. modules/scak/experiments/test_auditor_patcher_integration.py +251 -0
  916. modules/scak/notebooks/getting_started.ipynb +33 -0
  917. modules/scak/paper/ARXIV_SUBMISSION_METADATA.txt +109 -0
  918. modules/scak/paper/PAPER_CHECKLIST.md +304 -0
  919. modules/scak/paper/Paper.pdf +0 -0
  920. modules/scak/paper/README.md +113 -0
  921. modules/scak/paper/appendix.md +351 -0
  922. modules/scak/paper/arxiv/bibliography.bib +284 -0
  923. modules/scak/paper/arxiv/fig1_ooda_architecture.pdf +0 -0
  924. modules/scak/paper/arxiv/fig2_memory_hierarchy.pdf +0 -0
  925. modules/scak/paper/arxiv/fig3_gaia_results.pdf +0 -0
  926. modules/scak/paper/arxiv/fig4_ablation_heatmap.pdf +0 -0
  927. modules/scak/paper/arxiv/fig5_context_reduction.pdf +0 -0
  928. modules/scak/paper/arxiv/fig6_mttr_boxplot.pdf +0 -0
  929. modules/scak/paper/arxiv/main.aux +103 -0
  930. modules/scak/paper/arxiv/main.bbl +113 -0
  931. modules/scak/paper/arxiv/main.blg +55 -0
  932. modules/scak/paper/arxiv/main.out +31 -0
  933. modules/scak/paper/arxiv/main.pdf +0 -0
  934. modules/scak/paper/arxiv/main.tex +482 -0
  935. modules/scak/paper/arxiv_submission/bibliography.bib +284 -0
  936. modules/scak/paper/arxiv_submission/fig1_ooda_architecture.pdf +0 -0
  937. modules/scak/paper/arxiv_submission/fig2_memory_hierarchy.pdf +0 -0
  938. modules/scak/paper/arxiv_submission/fig3_gaia_results.pdf +0 -0
  939. modules/scak/paper/arxiv_submission/fig4_ablation_heatmap.pdf +0 -0
  940. modules/scak/paper/arxiv_submission/fig5_context_reduction.pdf +0 -0
  941. modules/scak/paper/arxiv_submission/fig6_mttr_boxplot.pdf +0 -0
  942. modules/scak/paper/arxiv_submission/main.aux +103 -0
  943. modules/scak/paper/arxiv_submission/main.bbl +113 -0
  944. modules/scak/paper/arxiv_submission/main.blg +55 -0
  945. modules/scak/paper/arxiv_submission/main.out +31 -0
  946. modules/scak/paper/arxiv_submission/main.pdf +0 -0
  947. modules/scak/paper/arxiv_submission/main.tex +482 -0
  948. modules/scak/paper/arxiv_submission.tar.gz +0 -0
  949. modules/scak/paper/bibliography.bib +284 -0
  950. modules/scak/paper/build.sh +55 -0
  951. modules/scak/paper/figures/README.md +32 -0
  952. modules/scak/paper/figures/fig1_ooda_architecture.md +75 -0
  953. modules/scak/paper/figures/fig1_ooda_architecture.pdf +0 -0
  954. modules/scak/paper/figures/fig1_ooda_architecture.png +0 -0
  955. modules/scak/paper/figures/fig2_memory_hierarchy.md +83 -0
  956. modules/scak/paper/figures/fig2_memory_hierarchy.pdf +0 -0
  957. modules/scak/paper/figures/fig2_memory_hierarchy.png +0 -0
  958. modules/scak/paper/figures/fig3_gaia_results.md +64 -0
  959. modules/scak/paper/figures/fig3_gaia_results.pdf +0 -0
  960. modules/scak/paper/figures/fig3_gaia_results.png +0 -0
  961. modules/scak/paper/figures/fig4_ablation_heatmap.md +64 -0
  962. modules/scak/paper/figures/fig4_ablation_heatmap.pdf +0 -0
  963. modules/scak/paper/figures/fig4_ablation_heatmap.png +0 -0
  964. modules/scak/paper/figures/fig5_context_reduction.md +71 -0
  965. modules/scak/paper/figures/fig5_context_reduction.pdf +0 -0
  966. modules/scak/paper/figures/fig5_context_reduction.png +0 -0
  967. modules/scak/paper/figures/fig6_mttr_boxplot.md +80 -0
  968. modules/scak/paper/figures/fig6_mttr_boxplot.pdf +0 -0
  969. modules/scak/paper/figures/fig6_mttr_boxplot.png +0 -0
  970. modules/scak/paper/figures/generate_figures.py +463 -0
  971. modules/scak/paper/main.aux +103 -0
  972. modules/scak/paper/main.bbl +113 -0
  973. modules/scak/paper/main.blg +55 -0
  974. modules/scak/paper/main.md +192 -0
  975. modules/scak/paper/main.out +31 -0
  976. modules/scak/paper/main.pdf +0 -0
  977. modules/scak/paper/main.tex +482 -0
  978. modules/scak/reproducibility/ABLATIONS.md +225 -0
  979. modules/scak/reproducibility/Dockerfile.reproducibility +34 -0
  980. modules/scak/reproducibility/README.md +421 -0
  981. modules/scak/reproducibility/requirements-pinned.txt +32 -0
  982. modules/scak/reproducibility/run_all_experiments.py +395 -0
  983. modules/scak/reproducibility/seed_control.py +53 -0
  984. modules/scak/reproducibility/statistical_analysis.py +302 -0
  985. modules/scak/requirements.txt +50 -0
  986. modules/scak/setup.py +93 -0
  987. modules/scak/src/__init__.py +124 -0
  988. modules/scak/src/agents/__init__.py +13 -0
  989. modules/scak/src/agents/conflict_resolution.py +732 -0
  990. modules/scak/src/agents/orchestrator.py +761 -0
  991. modules/scak/src/agents/pubsub.py +484 -0
  992. modules/scak/src/agents/shadow_teacher.py +344 -0
  993. modules/scak/src/agents/swarm.py +661 -0
  994. modules/scak/src/agents/worker.py +357 -0
  995. modules/scak/src/integrations/__init__.py +81 -0
  996. modules/scak/src/integrations/cmvk_adapter.py +430 -0
  997. modules/scak/src/integrations/control_plane_adapter.py +601 -0
  998. modules/scak/src/integrations/langchain_integration.py +902 -0
  999. modules/scak/src/interfaces/__init__.py +59 -0
  1000. modules/scak/src/interfaces/llm_clients.py +505 -0
  1001. modules/scak/src/interfaces/openapi_tools.py +611 -0
  1002. modules/scak/src/interfaces/plugin_system.py +605 -0
  1003. modules/scak/src/interfaces/protocols.py +365 -0
  1004. modules/scak/src/interfaces/telemetry.py +464 -0
  1005. modules/scak/src/interfaces/tool_registry.py +547 -0
  1006. modules/scak/src/kernel/__init__.py +100 -0
  1007. modules/scak/src/kernel/auditor.py +305 -0
  1008. modules/scak/src/kernel/circuit_breaker.py +398 -0
  1009. modules/scak/src/kernel/core.py +724 -0
  1010. modules/scak/src/kernel/distributed.py +667 -0
  1011. modules/scak/src/kernel/evolution.py +455 -0
  1012. modules/scak/src/kernel/failover.py +621 -0
  1013. modules/scak/src/kernel/governance.py +710 -0
  1014. modules/scak/src/kernel/governance_v2.py +603 -0
  1015. modules/scak/src/kernel/lazy_evaluator.py +514 -0
  1016. modules/scak/src/kernel/load_testing.py +633 -0
  1017. modules/scak/src/kernel/memory.py +945 -0
  1018. modules/scak/src/kernel/patcher.py +581 -0
  1019. modules/scak/src/kernel/rubric.py +419 -0
  1020. modules/scak/src/kernel/schemas.py +390 -0
  1021. modules/scak/src/kernel/skill_mapper.py +309 -0
  1022. modules/scak/src/kernel/triage.py +149 -0
  1023. modules/scak/src/mocks/__init__.py +99 -0
  1024. modules/scak/tests/__init__.py +1 -0
  1025. modules/scak/tests/test_circuit_breaker.py +403 -0
  1026. modules/scak/tests/test_conflict_resolution.py +287 -0
  1027. modules/scak/tests/test_dual_loop.py +463 -0
  1028. modules/scak/tests/test_enhanced_features.py +421 -0
  1029. modules/scak/tests/test_failover_and_load.py +438 -0
  1030. modules/scak/tests/test_governance.py +185 -0
  1031. modules/scak/tests/test_kernel.py +359 -0
  1032. modules/scak/tests/test_langchain_integration.py +451 -0
  1033. modules/scak/tests/test_lazy_evaluator.py +465 -0
  1034. modules/scak/tests/test_llm_clients.py +122 -0
  1035. modules/scak/tests/test_memory_controller.py +528 -0
  1036. modules/scak/tests/test_orchestrator.py +181 -0
  1037. modules/scak/tests/test_phase3_integration.py +265 -0
  1038. modules/scak/tests/test_pubsub_swarm.py +203 -0
  1039. modules/scak/tests/test_reference_implementations.py +240 -0
  1040. modules/scak/tests/test_rubric.py +363 -0
  1041. modules/scak/tests/test_scak_v2.py +651 -0
  1042. modules/scak/tests/test_skill_mapper.py +217 -0
  1043. modules/scak/tests/test_specific_failures.py +393 -0
  1044. modules/scak/tests/test_tool_registry.py +264 -0
  1045. modules/scak/tests/test_tools_and_plugins.py +303 -0
  1046. modules/scak/tests/test_triage.py +596 -0
  1047. modules/scak/tests/test_write_through.py +319 -0
  1048. agent_os_kernel-1.1.0.dist-info/METADATA +0 -400
  1049. agent_os_kernel-1.1.0.dist-info/RECORD +0 -12
  1050. {agent_os_kernel-1.1.0.dist-info → agent_os_kernel-1.3.0.dist-info}/WHEEL +0 -0
  1051. {agent_os_kernel-1.1.0.dist-info → agent_os_kernel-1.3.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,945 @@
1
+ """
2
+ Memory - Adaptive Memory Hierarchy & Semantic Purge.
3
+
4
+ This module implements the "Adaptive Memory Hierarchy" with deterministic three-tier
5
+ storage, replacing probabilistic RAG-based memory with systematic routing based on
6
+ criticality and frequency.
7
+
8
+ The Three Tiers:
9
+ 1. Tier 1 (Kernel): Safety-critical rules in system_prompt (zero latency)
10
+ 2. Tier 2 (Skill Cache): Tool-specific rules injected conditionally (low latency)
11
+ 3. Tier 3 (Archive): Long-tail wisdom retrieved via semantic search (high latency)
12
+
13
+ Key Components:
14
+ 1. MemoryController: Routes lessons to appropriate tier and constructs dynamic context
15
+ 2. Promotion/Demotion: Hot Tier 3 lessons promoted to Tier 2, cold Tier 1 demoted
16
+ 3. Patch Classifier: Type A vs Type B classification for Semantic Purge
17
+ 4. Semantic Purge: Model upgrade triggered cleanup ("Scale by Subtraction")
18
+
19
+ Promotion Logic:
20
+ - Tier 3 → Tier 2: Retrieved > 5 times in 24 hours (hot path optimization)
21
+
22
+ Demotion Logic:
23
+ - Tier 1 → Tier 2: No triggers in 30 days (keep kernel lean)
24
+ """
25
+
26
+ import logging
27
+ from enum import Enum
28
+ from typing import List, Dict, Optional
29
+ from datetime import datetime, timedelta
30
+ from collections import Counter
31
+ import json
32
+ import re
33
+
34
+ logger = logging.getLogger(__name__)
35
+
36
+ # Import models from agent_kernel for backward compatibility
37
+ import sys
38
+ import os
39
+
40
+ # Add parent directory to path for imports
41
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../..'))
42
+
43
+ from agent_kernel.models import (
44
+ CorrectionPatch, ClassifiedPatch, PatchDecayType,
45
+ CognitiveGlitch, CompletenessAudit
46
+ )
47
+
48
+ # Import from local schemas
49
+ from src.kernel.schemas import Lesson, PatchRequest, MemoryTier
50
+
51
+
52
+ class MockRedisCache:
53
+ """
54
+ Mock Redis cache for Tier 2 (Skill Cache).
55
+ In production, replace with actual Redis client.
56
+ """
57
+
58
+ def __init__(self):
59
+ self.store: Dict[str, List[str]] = {}
60
+
61
+ def rpush(self, key: str, value: str) -> None:
62
+ """Append value to list."""
63
+ if key not in self.store:
64
+ self.store[key] = []
65
+ self.store[key].append(value)
66
+
67
+ def lrange(self, key: str, start: int, end: int) -> List[Dict]:
68
+ """Get list range."""
69
+ if key not in self.store:
70
+ return []
71
+ items = self.store[key][start:end+1] if end >= 0 else self.store[key][start:]
72
+ return [json.loads(item) for item in items]
73
+
74
+ def incr(self, key: str) -> int:
75
+ """Increment counter."""
76
+ if key not in self.store:
77
+ self.store[key] = ["0"]
78
+ count = int(self.store[key][0]) + 1
79
+ self.store[key] = [str(count)]
80
+ return count
81
+
82
+ def get(self, key: str) -> Optional[str]:
83
+ """Get value."""
84
+ if key not in self.store:
85
+ return None
86
+ return self.store[key][0] if self.store[key] else None
87
+
88
+ def delete(self, key: str) -> None:
89
+ """Delete key."""
90
+ if key in self.store:
91
+ del self.store[key]
92
+
93
+ def clear(self) -> None:
94
+ """Clear all keys from cache."""
95
+ self.store.clear()
96
+
97
+ def keys(self, pattern: Optional[str] = None) -> List[str]:
98
+ """
99
+ Get all keys, optionally filtered by pattern.
100
+
101
+ Args:
102
+ pattern: Optional pattern to filter keys (e.g., "skill:*")
103
+
104
+ Returns:
105
+ List of matching keys
106
+ """
107
+ if pattern is None:
108
+ return list(self.store.keys())
109
+
110
+ # Simple pattern matching (only supports "*" wildcard)
111
+ if pattern.endswith("*"):
112
+ prefix = pattern[:-1]
113
+ return [k for k in self.store.keys() if k.startswith(prefix)]
114
+
115
+ return [k for k in self.store.keys() if k == pattern]
116
+
117
+
118
+ class MockVectorStore:
119
+ """
120
+ Mock Vector DB for Tier 3 (Archive).
121
+ In production, replace with Chroma/Pinecone/etc.
122
+ """
123
+
124
+ def __init__(self):
125
+ self.documents: List[Dict] = []
126
+
127
+ def add(self, documents: List[str], metadatas: List[Dict], ids: List[str]) -> None:
128
+ """Add documents to vector store."""
129
+ for doc, meta, doc_id in zip(documents, metadatas, ids):
130
+ self.documents.append({
131
+ "id": doc_id,
132
+ "text": doc,
133
+ "metadata": meta
134
+ })
135
+
136
+ def similarity_search(self, query: str, k: int = 2) -> List[Dict]:
137
+ """
138
+ Mock similarity search using simple keyword matching.
139
+ In production, this would use embeddings and vector similarity.
140
+ """
141
+ query_lower = query.lower()
142
+ scores = []
143
+
144
+ for doc in self.documents:
145
+ # Simple scoring: count matching words
146
+ doc_text = doc["text"].lower()
147
+ query_words = set(query_lower.split())
148
+ doc_words = set(doc_text.split())
149
+ score = len(query_words & doc_words)
150
+
151
+ if score > 0:
152
+ scores.append((score, doc))
153
+
154
+ # Sort by score and return top k
155
+ scores.sort(reverse=True, key=lambda x: x[0])
156
+ return [{"page_content": doc["text"], "metadata": doc["metadata"]}
157
+ for _, doc in scores[:k]]
158
+
159
+
160
+ class MemoryController:
161
+ """
162
+ The systematic router for the Adaptive Memory Hierarchy.
163
+
164
+ This implements deterministic tiering based on criticality and frequency,
165
+ replacing probabilistic RAG-based approaches with systematic rules.
166
+
167
+ Architecture:
168
+ - Tier 1 (Kernel): Safety-critical rules always in system_prompt
169
+ - Tier 2 (Skill Cache): Tool-specific rules injected conditionally
170
+ - Tier 3 (Archive): Long-tail wisdom retrieved on-demand
171
+
172
+ Responsibilities:
173
+ 1. Route new lessons to appropriate tier
174
+ 2. Inject context dynamically based on active tools
175
+ 3. Track retrieval frequency for promotion
176
+ 4. Track usage for demotion (keeping Kernel lean)
177
+ """
178
+
179
+ def __init__(self, vector_store=None, redis_cache=None):
180
+ """
181
+ Initialize MemoryController with storage backends.
182
+
183
+ Args:
184
+ vector_store: Vector DB for Tier 3 (defaults to mock)
185
+ redis_cache: Redis cache for Tier 2 (defaults to mock)
186
+ """
187
+ self.vector_store = vector_store or MockVectorStore()
188
+ self.redis_cache = redis_cache or MockRedisCache()
189
+
190
+ # Tier 1 is loaded from config/code at startup
191
+ self.kernel_rules: List[Lesson] = []
192
+
193
+ # Tracking for promotion/demotion
194
+ self.retrieval_window = timedelta(hours=24)
195
+ self.promotion_threshold = 5 # 5 retrievals in 24h
196
+ self.demotion_window = timedelta(days=30)
197
+
198
+ logger.info("MemoryController initialized with 3-tier architecture")
199
+
200
+ def route_lesson(self, patch: PatchRequest) -> MemoryTier:
201
+ """
202
+ The systematic logic to decide where a new lesson goes.
203
+
204
+ This is the core of "Deterministic Tiering" - no guesswork, just rules:
205
+ 1. Security/Safety → Tier 1 (Kernel)
206
+ 2. Tool-specific syntax → Tier 2 (Skill Cache)
207
+ 3. Business logic/edge cases → Tier 3 (Archive)
208
+
209
+ Args:
210
+ patch: The patch request containing the lesson to route
211
+
212
+ Returns:
213
+ MemoryTier: The tier where this lesson should be stored
214
+ """
215
+ lesson = patch.proposed_lesson
216
+
217
+ # 1. Critical Safety → Tier 1 (Kernel)
218
+ # These must ALWAYS be active (e.g., "Never delete root")
219
+ if lesson.lesson_type == "security":
220
+ logger.info(f"Routing lesson to Tier 1 (security): {lesson.rule_text[:50]}")
221
+ return MemoryTier.TIER_1_KERNEL
222
+
223
+ if patch.diagnosis and "critical" in patch.diagnosis.lower():
224
+ logger.info(f"Routing lesson to Tier 1 (critical failure): {lesson.rule_text[:50]}")
225
+ return MemoryTier.TIER_1_KERNEL
226
+
227
+ # 2. Tool-Specific Syntax → Tier 2 (Skill Cache)
228
+ # Pattern: "tool:sql_query" or "when using <tool>"
229
+ if self._is_tool_specific(lesson):
230
+ tool_name = self._extract_tool_name(lesson.trigger_pattern)
231
+ logger.info(f"Routing lesson to Tier 2 (tool: {tool_name}): {lesson.rule_text[:50]}")
232
+ return MemoryTier.TIER_2_SKILL_CACHE
233
+
234
+ # 3. Everything else (Business logic, edge cases) → Tier 3 (Archive)
235
+ logger.info(f"Routing lesson to Tier 3 (archive): {lesson.rule_text[:50]}")
236
+ return MemoryTier.TIER_3_ARCHIVE
237
+
238
+ def _is_tool_specific(self, lesson: Lesson) -> bool:
239
+ """Check if lesson is tool-specific."""
240
+ trigger = lesson.trigger_pattern.lower()
241
+ rule = lesson.rule_text.lower()
242
+
243
+ # Explicit tool prefix
244
+ if "tool:" in trigger:
245
+ return True
246
+
247
+ # Common tool-related patterns
248
+ tool_indicators = [
249
+ "when using", "with tool", "for tool",
250
+ "sql", "query", "database", "api call",
251
+ "file operation", "http request"
252
+ ]
253
+
254
+ return any(indicator in trigger or indicator in rule
255
+ for indicator in tool_indicators)
256
+
257
+ def _extract_tool_name(self, trigger_pattern: str) -> str:
258
+ """
259
+ Extract tool name from trigger pattern.
260
+
261
+ Examples:
262
+ - "tool:sql_query" → "sql_query"
263
+ - "when using file_reader" → "file_reader"
264
+ """
265
+ # Check for explicit "tool:" prefix
266
+ match = re.search(r'tool:(\w+)', trigger_pattern.lower())
267
+ if match:
268
+ return match.group(1)
269
+
270
+ # Check for "when using <tool>" pattern
271
+ match = re.search(r'when using (\w+)', trigger_pattern.lower())
272
+ if match:
273
+ return match.group(1)
274
+
275
+ # Check for common tool names
276
+ common_tools = ["sql", "api", "file", "http", "database"]
277
+ for tool in common_tools:
278
+ if tool in trigger_pattern.lower():
279
+ return tool
280
+
281
+ return "general"
282
+
283
+ def commit_lesson(self, patch: PatchRequest) -> Dict[str, str]:
284
+ """
285
+ Commit a lesson using Write-Through Architecture.
286
+
287
+ The Write-Through Pattern:
288
+ 1. ALWAYS write to Vector DB (Tier 3) - Permanent storage (Truth)
289
+ 2. CONDITIONALLY write to Redis (Tier 2) - Hot cache (Speed)
290
+ 3. CONDITIONALLY add to Kernel (Tier 1) - Always-active rules
291
+
292
+ This ensures we never "lose" knowledge even if Redis crashes.
293
+ The tier tag in Vector DB determines active tier, but data always
294
+ exists in the permanent store.
295
+
296
+ Args:
297
+ patch: The patch request containing the lesson
298
+
299
+ Returns:
300
+ dict: Status information about the commit
301
+ """
302
+ tier = self.route_lesson(patch)
303
+ lesson = patch.proposed_lesson
304
+
305
+ # Update lesson metadata
306
+ lesson.tier = tier
307
+ lesson.created_at = datetime.now()
308
+
309
+ logger.info(f"💾 Write-Through: Committing '{lesson.rule_text[:50]}...' to {tier.value}")
310
+
311
+ # STEP 1: Always write to Vector DB (permanent storage)
312
+ self.vector_store.add(
313
+ documents=[lesson.rule_text],
314
+ metadatas=[{
315
+ **lesson.model_dump(),
316
+ "active_tier": tier.value # Tag for tier tracking
317
+ }],
318
+ ids=[lesson.id]
319
+ )
320
+ logger.debug(f" ✓ Written to Vector DB (permanent) with active_tier={tier.value}")
321
+
322
+ # STEP 2: Conditionally add to tier-specific storage
323
+ if tier == MemoryTier.TIER_1_KERNEL:
324
+ # Append to kernel rules (in production, write to system_prompt file)
325
+ self.kernel_rules.append(lesson)
326
+ logger.debug(f" ✓ Added to Kernel (always active)")
327
+ return {
328
+ "status": "committed",
329
+ "tier": tier.value,
330
+ "location": "kernel+vector_db",
331
+ "write_through": True
332
+ }
333
+
334
+ elif tier == MemoryTier.TIER_2_SKILL_CACHE:
335
+ # Write to Redis cache for fast access
336
+ tool_name = self._extract_tool_name(lesson.trigger_pattern)
337
+ self.redis_cache.rpush(f"skill:{tool_name}", lesson.model_dump_json())
338
+ logger.debug(f" ✓ Written to Redis cache (tool: {tool_name})")
339
+ return {
340
+ "status": "committed",
341
+ "tier": tier.value,
342
+ "tool": tool_name,
343
+ "location": "redis+vector_db",
344
+ "write_through": True
345
+ }
346
+
347
+ elif tier == MemoryTier.TIER_3_ARCHIVE:
348
+ # Already in Vector DB, no additional storage needed
349
+ logger.debug(f" ✓ Archive-only (Vector DB)")
350
+ return {
351
+ "status": "committed",
352
+ "tier": tier.value,
353
+ "location": "vector_db",
354
+ "write_through": True
355
+ }
356
+
357
+ return {"status": "error", "message": "Unknown tier"}
358
+
359
+ def retrieve_context(
360
+ self,
361
+ current_task: str,
362
+ active_tools: List[str]
363
+ ) -> str:
364
+ """
365
+ Constructs the Dynamic System Prompt using the three-tier hierarchy.
366
+
367
+ This is the "injection efficiency" mechanism that keeps context minimal:
368
+ - Always includes Tier 1 (Kernel) rules
369
+ - Conditionally injects Tier 2 rules (only for active tools)
370
+ - Retrieves Tier 3 rules on-demand (semantic search)
371
+
372
+ Args:
373
+ current_task: The current user task/prompt
374
+ active_tools: List of tools the agent has access to
375
+
376
+ Returns:
377
+ str: The constructed context block to inject into system prompt
378
+ """
379
+ context_block = []
380
+
381
+ # 1. Always add Kernel Rules (Tier 1)
382
+ # These are safety-critical and must always be active
383
+ if self.kernel_rules:
384
+ context_block.append("=== CRITICAL SAFETY RULES ===")
385
+ for rule in self.kernel_rules:
386
+ context_block.append(f"- {rule.rule_text}")
387
+ context_block.append("")
388
+
389
+ # 2. Inject Skill Rules (Tier 2) - ONLY for active tools
390
+ # This is the key optimization: SQL rules only when SQL is available
391
+ for tool in active_tools:
392
+ cached_lessons = self.redis_cache.lrange(f"skill:{tool}", 0, -1)
393
+ if cached_lessons:
394
+ context_block.append(f"=== Guidelines for {tool.upper()} ===")
395
+ for lesson_dict in cached_lessons:
396
+ context_block.append(f"- {lesson_dict['rule_text']}")
397
+ context_block.append("")
398
+
399
+ # 3. RAG Search (Tier 3) - Only if task is complex
400
+ # Only retrieve if the prompt suggests complexity or ambiguity
401
+ if len(current_task.split()) > 5: # Simple heuristic
402
+ relevant_docs = self.vector_store.similarity_search(current_task, k=2)
403
+ if relevant_docs:
404
+ context_block.append("=== Relevant Past Lessons ===")
405
+ for doc in relevant_docs:
406
+ context_block.append(f"- {doc['page_content']}")
407
+ # Track retrieval for promotion logic
408
+ self._track_retrieval(doc['metadata']['id'])
409
+ context_block.append("")
410
+
411
+ return "\n".join(context_block)
412
+
413
+ def _track_retrieval(self, lesson_id: str) -> None:
414
+ """
415
+ Track retrieval count for promotion logic.
416
+
417
+ If a Tier 3 lesson is retrieved > 5 times in 24 hours,
418
+ it should be promoted to Tier 2 (hot path optimization).
419
+ """
420
+ key = f"retrieval:{lesson_id}"
421
+ count = self.redis_cache.incr(key)
422
+
423
+ logger.debug(f"Tracked retrieval for lesson {lesson_id}: {count} times")
424
+
425
+ # Check if promotion threshold reached
426
+ if count >= self.promotion_threshold:
427
+ logger.info(f"🔥 Lesson {lesson_id} is HOT ({count} retrievals) - candidate for promotion")
428
+
429
+ def promote_hot_lessons(self) -> Dict[str, int]:
430
+ """
431
+ Promote frequently retrieved Tier 3 lessons to Tier 2.
432
+
433
+ This is the "hot path optimization" - lessons that are retrieved
434
+ often enough should be moved to the skill cache for faster access.
435
+
436
+ Returns:
437
+ dict: Statistics about promotions
438
+ """
439
+ # In production, this would scan retrieval counters
440
+ # For now, this is a placeholder
441
+ logger.info("🚀 Scanning for hot Tier 3 lessons to promote...")
442
+ return {"promoted_count": 0}
443
+
444
+ def demote_cold_kernel_rules(self) -> Dict[str, int]:
445
+ """
446
+ Demote Tier 1 rules that haven't triggered in 30 days.
447
+
448
+ This keeps the Kernel lean - only truly critical rules stay in Tier 1.
449
+ Rules that aren't being used can be demoted to Tier 2.
450
+
451
+ Returns:
452
+ dict: Statistics about demotions
453
+ """
454
+ now = datetime.now()
455
+ demoted = 0
456
+
457
+ for rule in self.kernel_rules[:]: # Copy list to avoid modification during iteration
458
+ # Check if rule has triggered recently
459
+ if rule.last_triggered_at is None:
460
+ # Never triggered - candidate for demotion
461
+ if (now - rule.created_at) > self.demotion_window:
462
+ logger.info(f"❄️ Demoting cold Tier 1 rule: {rule.rule_text[:50]}")
463
+ self.kernel_rules.remove(rule)
464
+ demoted += 1
465
+ elif (now - rule.last_triggered_at) > self.demotion_window:
466
+ logger.info(f"❄️ Demoting cold Tier 1 rule: {rule.rule_text[:50]}")
467
+ self.kernel_rules.remove(rule)
468
+ demoted += 1
469
+
470
+ logger.info(f"Demoted {demoted} cold Tier 1 rules")
471
+ return {"demoted_count": demoted}
472
+
473
+ def evict_from_cache(self, unused_days: int = 30) -> Dict[str, int]:
474
+ """
475
+ Evict lessons from Redis cache that haven't been used in N days.
476
+
477
+ This implements the "Safe Demotion" pattern:
478
+ 1. Delete from Redis (cache)
479
+ 2. Update active_tier tag in Vector DB to 'archive'
480
+ 3. Lesson remains retrievable via semantic search
481
+
482
+ The Rule: We never "move" data. We just change the tier tag.
483
+ If Redis crashes, we rebuild it from Vector DB. If we need the
484
+ lesson later, RAG finds it in the archive.
485
+
486
+ Args:
487
+ unused_days: Number of days without usage before eviction (default: 30)
488
+
489
+ Returns:
490
+ dict: Statistics about evictions
491
+ """
492
+ logger.info(f"🧹 Evicting unused cache entries (threshold: {unused_days} days)")
493
+
494
+ cutoff_date = datetime.now() - timedelta(days=unused_days)
495
+ evicted = 0
496
+
497
+ # Scan all skill cache keys
498
+ # In production, this would iterate over all Redis keys with pattern "skill:*"
499
+ keys_to_check = []
500
+ if hasattr(self.redis_cache, 'keys'):
501
+ keys_to_check = self.redis_cache.keys('skill:*')
502
+ elif hasattr(self.redis_cache, 'store'):
503
+ keys_to_check = [k for k in self.redis_cache.store.keys() if k.startswith('skill:')]
504
+
505
+ for key in keys_to_check:
506
+ lessons = self.redis_cache.lrange(key, 0, -1)
507
+ updated_lessons = []
508
+
509
+ for lesson_dict in lessons:
510
+ # Check last retrieval time
511
+ last_retrieved = lesson_dict.get('last_retrieved_at')
512
+
513
+ if last_retrieved:
514
+ last_retrieved_dt = self._parse_datetime(last_retrieved)
515
+
516
+ if last_retrieved_dt and last_retrieved_dt < cutoff_date:
517
+ # Evict this lesson
518
+ lesson_id = lesson_dict.get('id')
519
+ logger.debug(f" ❄️ Evicting lesson {lesson_id} from {key}")
520
+ evicted += 1
521
+
522
+ # Update tier tag in Vector DB (safe demotion)
523
+ self._update_tier_tag_in_vector_db(lesson_id, MemoryTier.TIER_3_ARCHIVE)
524
+ else:
525
+ # Keep this lesson
526
+ updated_lessons.append(lesson_dict)
527
+ else:
528
+ # No retrieval time - keep it for now
529
+ updated_lessons.append(lesson_dict)
530
+
531
+ # Update the cache with filtered lessons
532
+ if len(updated_lessons) < len(lessons):
533
+ # Re-populate the key with remaining lessons
534
+ self.redis_cache.delete(key)
535
+ for lesson_dict in updated_lessons:
536
+ self.redis_cache.rpush(key, json.dumps(lesson_dict))
537
+
538
+ logger.info(f"✨ Evicted {evicted} cold cache entries")
539
+ return {"evicted_count": evicted, "threshold_days": unused_days}
540
+
541
+ def _parse_datetime(self, value) -> Optional[datetime]:
542
+ """
543
+ Parse datetime from various formats.
544
+
545
+ Args:
546
+ value: Value to parse (datetime object or ISO string)
547
+
548
+ Returns:
549
+ Optional[datetime]: Parsed datetime or None if parsing fails
550
+ """
551
+ if isinstance(value, datetime):
552
+ return value
553
+ if isinstance(value, str):
554
+ try:
555
+ return datetime.fromisoformat(value)
556
+ except (ValueError, TypeError):
557
+ return None
558
+ return None
559
+
560
+ def _update_tier_tag_in_vector_db(self, lesson_id: str, new_tier: MemoryTier) -> None:
561
+ """
562
+ Update the active_tier tag in Vector DB.
563
+
564
+ This is the "safe demotion" mechanism - we don't delete data,
565
+ we just update its tier classification.
566
+
567
+ Args:
568
+ lesson_id: The lesson ID to update
569
+ new_tier: The new tier to assign
570
+ """
571
+ # In production, this would update the metadata in the vector DB
572
+ # For the mock implementation, we'll update the document metadata
573
+ if hasattr(self.vector_store, 'documents'):
574
+ for doc in self.vector_store.documents:
575
+ if doc['id'] == lesson_id:
576
+ doc['metadata']['active_tier'] = new_tier.value
577
+ logger.debug(f" 📝 Updated {lesson_id} tier tag to {new_tier.value}")
578
+ break
579
+
580
+ def rebuild_cache_from_db(self) -> Dict[str, int]:
581
+ """
582
+ Rebuild Redis cache from Vector DB.
583
+
584
+ This is the disaster recovery mechanism. If Redis crashes or
585
+ is flushed, we can rebuild the Tier 2 cache from the permanent
586
+ Vector DB storage.
587
+
588
+ Process:
589
+ 1. Query Vector DB for all lessons with active_tier='skill_cache'
590
+ 2. Group by tool name
591
+ 3. Repopulate Redis
592
+
593
+ Returns:
594
+ dict: Statistics about rebuild
595
+ """
596
+ logger.info("🔄 Rebuilding cache from Vector DB...")
597
+
598
+ rebuilt_count = 0
599
+ tools_rebuilt = set()
600
+
601
+ # Query Vector DB for Tier 2 lessons
602
+ if hasattr(self.vector_store, 'documents'):
603
+ tier2_docs = [
604
+ doc for doc in self.vector_store.documents
605
+ if doc['metadata'].get('active_tier') == MemoryTier.TIER_2_SKILL_CACHE.value
606
+ ]
607
+
608
+ # Group by tool
609
+ tools: Dict[str, List[Dict]] = {}
610
+ for doc in tier2_docs:
611
+ # Extract tool from trigger_pattern
612
+ trigger = doc['metadata'].get('trigger_pattern', '')
613
+ tool_name = self._extract_tool_name(trigger)
614
+
615
+ if tool_name not in tools:
616
+ tools[tool_name] = []
617
+ tools[tool_name].append(doc['metadata'])
618
+
619
+ # Repopulate Redis
620
+ for tool_name, lessons in tools.items():
621
+ # Clear existing cache for this tool
622
+ self.redis_cache.delete(f"skill:{tool_name}")
623
+
624
+ # Add all lessons
625
+ for lesson_meta in lessons:
626
+ # Convert datetime objects to ISO format strings for JSON serialization
627
+ serialized_meta = self._serialize_metadata(lesson_meta)
628
+ self.redis_cache.rpush(
629
+ f"skill:{tool_name}",
630
+ json.dumps(serialized_meta)
631
+ )
632
+ rebuilt_count += 1
633
+
634
+ tools_rebuilt.add(tool_name)
635
+ logger.debug(f" ✓ Rebuilt {len(lessons)} lessons for tool: {tool_name}")
636
+
637
+ logger.info(f"✨ Cache rebuilt: {rebuilt_count} lessons across {len(tools_rebuilt)} tools")
638
+ return {
639
+ "rebuilt_count": rebuilt_count,
640
+ "tools_rebuilt": len(tools_rebuilt),
641
+ "tool_list": list(tools_rebuilt)
642
+ }
643
+
644
+ def _serialize_metadata(self, metadata: Dict) -> Dict:
645
+ """
646
+ Serialize metadata for JSON storage, converting datetime to ISO format.
647
+
648
+ Args:
649
+ metadata: The metadata dictionary to serialize
650
+
651
+ Returns:
652
+ dict: Serialized metadata with datetime objects converted to strings
653
+ """
654
+ serialized = {}
655
+ for key, value in metadata.items():
656
+ if isinstance(value, datetime):
657
+ serialized[key] = value.isoformat()
658
+ elif isinstance(value, dict):
659
+ serialized[key] = self._serialize_metadata(value)
660
+ elif isinstance(value, list):
661
+ serialized[key] = [
662
+ self._serialize_metadata(item) if isinstance(item, dict) else item
663
+ for item in value
664
+ ]
665
+ else:
666
+ serialized[key] = value
667
+ return serialized
668
+
669
+
670
+ class LessonType(Enum):
671
+ """Types of lessons for lifecycle management."""
672
+ SYNTAX = "syntax" # Expire on model upgrade (e.g. "Output JSON")
673
+ BUSINESS = "business" # Never expire (e.g. "Fiscal year starts Oct")
674
+ ONE_OFF = "one_off" # Delete immediately (Transient error)
675
+
676
+
677
+ class MemoryManager:
678
+ """
679
+ Lesson lifecycle manager implementing Semantic Purge.
680
+
681
+ This is the simplified reference implementation showing the core concept
682
+ of tagging lessons by type so syntax lessons can be deleted on model upgrades.
683
+ """
684
+
685
+ def __init__(self):
686
+ self.vector_store = [] # Simplified in-memory storage
687
+
688
+ def add_lesson(self, lesson_text: str, lesson_type: LessonType, model_version: str = "gpt-4-0125"):
689
+ """
690
+ Add a lesson with lifecycle metadata.
691
+
692
+ Args:
693
+ lesson_text: The lesson content
694
+ lesson_type: Type of lesson (SYNTAX, BUSINESS, or ONE_OFF)
695
+ model_version: Model version when lesson was created
696
+ """
697
+ entry = {
698
+ "text": lesson_text,
699
+ "type": lesson_type,
700
+ "model_version": model_version,
701
+ "created_at": datetime.now()
702
+ }
703
+ self.vector_store.append(entry)
704
+
705
+ def run_upgrade_purge(self, new_model_version: str) -> dict:
706
+ """
707
+ Called when you switch from GPT-4 to GPT-5.
708
+ Deletes all 'SYNTAX' lessons (Type A patches).
709
+
710
+ This is "Scale by Subtraction" - removing complexity, not adding it.
711
+
712
+ Args:
713
+ new_model_version: The new model version
714
+
715
+ Returns:
716
+ dict: Statistics about the purge
717
+ """
718
+ # Filter out SYNTAX lessons
719
+ original_count = len(self.vector_store)
720
+ self.vector_store = [
721
+ entry for entry in self.vector_store
722
+ if entry["type"] != LessonType.SYNTAX
723
+ ]
724
+ purged_count = original_count - len(self.vector_store)
725
+
726
+ logger.info(f"🗑️ Semantic Purge: {purged_count} Type A lessons removed on upgrade to {new_model_version}")
727
+
728
+ return {
729
+ "purged_count": purged_count,
730
+ "retained_count": len(self.vector_store),
731
+ "new_model_version": new_model_version,
732
+ "reduction_percentage": (purged_count / original_count * 100) if original_count > 0 else 0
733
+ }
734
+
735
+ def get_lessons_by_type(self, lesson_type: LessonType) -> List[dict]:
736
+ """
737
+ Get all lessons of a specific type.
738
+
739
+ Args:
740
+ lesson_type: The type of lessons to retrieve
741
+
742
+ Returns:
743
+ list: Lessons matching the type
744
+ """
745
+ return [
746
+ entry for entry in self.vector_store
747
+ if entry["type"] == lesson_type
748
+ ]
749
+
750
+ def get_lesson_count(self) -> dict:
751
+ """Get count of lessons by type."""
752
+ type_counts = Counter(entry["type"] for entry in self.vector_store)
753
+ return dict(type_counts)
754
+
755
+
756
+ class PatchClassifier:
757
+ """
758
+ Classifies patches into Type A (Syntax) vs Type B (Business).
759
+
760
+ This is the "Taxonomy of Lessons" that determines lifecycle.
761
+ Production-grade classifier with sophisticated heuristics.
762
+ """
763
+
764
+ def __init__(self):
765
+ self.syntax_indicators = [
766
+ "output json", "format", "syntax", "parse", "validation error",
767
+ "type mismatch", "parameter type", "limit 10", "use uuid",
768
+ "tool definition", "schema injection", "parameter checking",
769
+ "encoding", "serialization", "casting"
770
+ ]
771
+
772
+ self.business_indicators = [
773
+ "fiscal year", "project", "entity", "business rule", "policy",
774
+ "archived", "deprecated", "does not exist", "negative constraint",
775
+ "company", "organization", "domain", "customer", "workflow",
776
+ "regulation", "compliance", "privacy"
777
+ ]
778
+
779
+ def classify_patch(
780
+ self,
781
+ patch: CorrectionPatch,
782
+ current_model_version: str
783
+ ) -> ClassifiedPatch:
784
+ """
785
+ Classify a patch as Type A or Type B.
786
+
787
+ Args:
788
+ patch: The correction patch to classify
789
+ current_model_version: Current model version (e.g., "gpt-4o", "gpt-5")
790
+
791
+ Returns:
792
+ ClassifiedPatch with decay type and metadata
793
+ """
794
+ logger.info(f"Classifying patch {patch.patch_id}")
795
+
796
+ # Analyze patch content to determine type
797
+ decay_type = self._determine_decay_type(patch)
798
+
799
+ # Determine if should purge on upgrade
800
+ should_purge = (decay_type == PatchDecayType.SYNTAX_CAPABILITY)
801
+
802
+ # Build metadata
803
+ metadata = self._build_decay_metadata(patch, decay_type)
804
+
805
+ classified = ClassifiedPatch(
806
+ base_patch=patch,
807
+ decay_type=decay_type,
808
+ created_at_model_version=current_model_version,
809
+ decay_metadata=metadata,
810
+ should_purge_on_upgrade=should_purge
811
+ )
812
+
813
+ logger.info(f"Classified as {decay_type.value} (purge on upgrade: {should_purge})")
814
+
815
+ return classified
816
+
817
+ def _determine_decay_type(self, patch: CorrectionPatch) -> PatchDecayType:
818
+ """
819
+ Determine if patch is Type A (Syntax) or Type B (Business).
820
+
821
+ Type A - Syntax/Capability (HIGH DECAY):
822
+ - Model-specific issues (JSON formatting, type errors)
823
+ - Tool usage errors (wrong parameter types)
824
+ - Syntax errors, validation issues
825
+ - These are likely fixed in newer model versions
826
+
827
+ Type B - Business/Context (ZERO DECAY):
828
+ - Company-specific rules ("Fiscal year starts in July")
829
+ - Entity existence ("Project_Alpha is deprecated")
830
+ - Policy violations (medical advice restrictions)
831
+ - These are world truths that models can't learn
832
+ """
833
+ # Check diagnosis first (most reliable indicator)
834
+ if patch.diagnosis:
835
+ glitch = patch.diagnosis.cognitive_glitch
836
+
837
+ # Tool misuse is almost always Type A
838
+ if glitch == CognitiveGlitch.TOOL_MISUSE:
839
+ return PatchDecayType.SYNTAX_CAPABILITY
840
+
841
+ # Policy violations are Type B
842
+ if glitch == CognitiveGlitch.POLICY_VIOLATION:
843
+ return PatchDecayType.BUSINESS_CONTEXT
844
+
845
+ # Hallucinations about entities are Type B
846
+ if glitch == CognitiveGlitch.HALLUCINATION:
847
+ return PatchDecayType.BUSINESS_CONTEXT
848
+
849
+ # Analyze patch content
850
+ content_str = str(patch.patch_content).lower()
851
+
852
+ # Count indicators
853
+ syntax_score = sum(1 for ind in self.syntax_indicators if ind in content_str)
854
+ business_score = sum(1 for ind in self.business_indicators if ind in content_str)
855
+
856
+ # Decide based on scores
857
+ if business_score > syntax_score:
858
+ return PatchDecayType.BUSINESS_CONTEXT
859
+ elif syntax_score > 0:
860
+ return PatchDecayType.SYNTAX_CAPABILITY
861
+ else:
862
+ # Default to business context if uncertain
863
+ return PatchDecayType.BUSINESS_CONTEXT
864
+
865
+ def _build_decay_metadata(self, patch: CorrectionPatch, decay_type: PatchDecayType) -> dict:
866
+ """Build metadata for patch lifecycle tracking."""
867
+ return {
868
+ "decay_type": decay_type.value,
869
+ "created_at": datetime.now().isoformat(),
870
+ "failure_type": patch.failure_type.value if hasattr(patch.failure_type, 'value') else str(patch.failure_type),
871
+ "cognitive_glitch": patch.diagnosis.cognitive_glitch.value if patch.diagnosis else None,
872
+ "estimated_tokens": len(str(patch.patch_content).split()) * 1.3 # Rough estimate
873
+ }
874
+
875
+
876
+ class SemanticPurge:
877
+ """
878
+ Orchestrates the Semantic Purge process on model upgrades.
879
+
880
+ This is the "Scale by Subtraction" engine that prevents unbounded growth.
881
+ """
882
+
883
+ def __init__(self):
884
+ self.classifier = PatchClassifier()
885
+ self.memory_manager = MemoryManager()
886
+ self.purge_history: List[dict] = []
887
+
888
+ def execute_purge(
889
+ self,
890
+ patches: List[CorrectionPatch],
891
+ old_model_version: str,
892
+ new_model_version: str
893
+ ) -> dict:
894
+ """
895
+ Execute semantic purge on model upgrade.
896
+
897
+ Args:
898
+ patches: List of patches to evaluate
899
+ old_model_version: Current model version
900
+ new_model_version: Upgraded model version
901
+
902
+ Returns:
903
+ dict: Purge statistics
904
+ """
905
+ logger.info(f"🔄 Starting Semantic Purge: {old_model_version} → {new_model_version}")
906
+
907
+ # Classify all patches
908
+ classified_patches = [
909
+ self.classifier.classify_patch(p, old_model_version)
910
+ for p in patches
911
+ ]
912
+
913
+ # Separate purgeable (Type A) from permanent (Type B)
914
+ purgeable = [p for p in classified_patches if p.should_purge_on_upgrade]
915
+ permanent = [p for p in classified_patches if not p.should_purge_on_upgrade]
916
+
917
+ # Calculate token savings
918
+ tokens_reclaimed = sum(
919
+ p.decay_metadata.get("estimated_tokens", 0)
920
+ for p in purgeable
921
+ )
922
+
923
+ stats = {
924
+ "old_model_version": old_model_version,
925
+ "new_model_version": new_model_version,
926
+ "total_patches": len(patches),
927
+ "purged_count": len(purgeable),
928
+ "retained_count": len(permanent),
929
+ "tokens_reclaimed": int(tokens_reclaimed),
930
+ "reduction_percentage": (len(purgeable) / len(patches) * 100) if patches else 0
931
+ }
932
+
933
+ self.purge_history.append({
934
+ "timestamp": datetime.now(),
935
+ "stats": stats
936
+ })
937
+
938
+ logger.info(f"✨ Purge complete: {stats['purged_count']} Type A patches removed ({stats['reduction_percentage']:.1f}%)")
939
+ logger.info(f"💾 Tokens reclaimed: {stats['tokens_reclaimed']}")
940
+
941
+ return stats
942
+
943
+ def get_purge_history(self) -> List[dict]:
944
+ """Get history of purge operations."""
945
+ return self.purge_history