cfa-kernel 0.1.7__tar.gz → 0.1.9__tar.gz

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 (236) hide show
  1. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.gitignore +5 -0
  2. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/CFA_LLM_Demo.ipynb +5 -0
  3. cfa_kernel-0.1.9/CFA_LLM_Demo_fixed (1).dbc +0 -0
  4. cfa_kernel-0.1.9/CFA_LLM_Demo_fixed.dbc +0 -0
  5. cfa_kernel-0.1.7/CFA_LLM_Demo.ipynb.py → cfa_kernel-0.1.9/CFA_LLM_Demo_fixed.py +116 -63
  6. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/PKG-INFO +2 -2
  7. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/README.md +287 -287
  8. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/pyproject.toml +1 -1
  9. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/__init__.py +1 -1
  10. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/kernel.py +1 -1
  11. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/normalizer/llm.py +6 -3
  12. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/observability/promotion.py +2 -2
  13. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/reporting/engine.py +1 -1
  14. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/api.md +1 -1
  15. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/faq.md +2 -2
  16. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/intro.md +1 -1
  17. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/whitepaper.md +2 -2
  18. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docusaurus.config.ts +1 -1
  19. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/api.md +1 -1
  20. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/intro.md +1 -1
  21. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/whitepaper.md +1 -1
  22. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/src/pages/index.tsx +1 -1
  23. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.gitattributes +0 -0
  24. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  25. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  26. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  27. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/workflows/ci.yml +0 -0
  28. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/workflows/deploy-docs.yml +0 -0
  29. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/workflows/deploy-pypi.yml +0 -0
  30. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/workflows/governance.yml +0 -0
  31. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.uv-cache/.gitignore +0 -0
  32. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.uv-cache/.lock +0 -0
  33. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.uv-cache/CACHEDIR.TAG +0 -0
  34. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.uv-cache/sdists-v9/.gitignore +0 -0
  35. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/CODE_OF_CONDUCT.md +0 -0
  36. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/CONTRIBUTING.md +0 -0
  37. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/LICENSE +0 -0
  38. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/MANUAL_TESTING_GUIDE.md +0 -0
  39. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/SECURITY.md +0 -0
  40. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/cfa_demo_complete.ipynb +0 -0
  41. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/cfa_demo.py +0 -0
  42. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/fiscal_governance.yaml +0 -0
  43. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/full_pipeline.py +0 -0
  44. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/llm_systematizer.py +0 -0
  45. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/runtime_gate.py +0 -0
  46. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/standalone_governance.py +0 -0
  47. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/standalone_lifecycle.py +0 -0
  48. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/standalone_resolution.py +0 -0
  49. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/integrations/airflow-governance-gate/README.md +0 -0
  50. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/integrations/airflow-governance-gate/dags/cfa_governance_gate_demo.py +0 -0
  51. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/integrations/airflow-governance-gate/requirements.txt +0 -0
  52. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/integrations/airflow-governance-gate/src/governance_gate.py +0 -0
  53. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/mcp.json +0 -0
  54. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/policies/compliance-strict-v1.yaml +0 -0
  55. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/policies/finops-strict-v1.yaml +0 -0
  56. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/policies/prod-v1.yaml +0 -0
  57. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/_lazy.py +0 -0
  58. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/adapters/__init__.py +0 -0
  59. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/adapters/autogen.py +0 -0
  60. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/adapters/crewai.py +0 -0
  61. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/adapters/dspy.py +0 -0
  62. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/adapters/langgraph.py +0 -0
  63. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/adapters/openai_agents.py +0 -0
  64. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/audit/__init__.py +0 -0
  65. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/audit/context.py +0 -0
  66. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/audit/hashing.py +0 -0
  67. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/audit/trail.py +0 -0
  68. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/backends/__init__.py +0 -0
  69. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/backends/dbt.py +0 -0
  70. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/backends/pyspark.py +0 -0
  71. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/backends/sql.py +0 -0
  72. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/behavior/__init__.py +0 -0
  73. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/behavior/llm.py +0 -0
  74. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/behavior/spec.py +0 -0
  75. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/behavior/systematizer.py +0 -0
  76. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/__init__.py +0 -0
  77. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/__main__.py +0 -0
  78. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/_helpers.py +0 -0
  79. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/core/__init__.py +0 -0
  80. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/core/evaluate.py +0 -0
  81. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/core/validate.py +0 -0
  82. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/formatters.py +0 -0
  83. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/governance/__init__.py +0 -0
  84. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/governance/audit.py +0 -0
  85. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/governance/catalog.py +0 -0
  86. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/governance/policy.py +0 -0
  87. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/governance/rules.py +0 -0
  88. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/governance/signature.py +0 -0
  89. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/infrastructure/__init__.py +0 -0
  90. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/infrastructure/backend_list.py +0 -0
  91. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/infrastructure/storage.py +0 -0
  92. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/project/__init__.py +0 -0
  93. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/project/init.py +0 -0
  94. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/project/lifecycle.py +0 -0
  95. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/project/status.py +0 -0
  96. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/project/taxonomy.py +0 -0
  97. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/reporting/__init__.py +0 -0
  98. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/reporting/report.py +0 -0
  99. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/reporting/serve.py +0 -0
  100. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/config.py +0 -0
  101. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/__init__.py +0 -0
  102. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/codegen.py +0 -0
  103. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/conditions.py +0 -0
  104. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/phases/__init__.py +0 -0
  105. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/phases/runner.py +0 -0
  106. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/planner.py +0 -0
  107. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/execution/__init__.py +0 -0
  108. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/execution/partial.py +0 -0
  109. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/execution/state_projection.py +0 -0
  110. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/governance/__init__.py +0 -0
  111. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/lifecycle/__init__.py +0 -0
  112. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/mcp/__init__.py +0 -0
  113. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/mcp/__main__.py +0 -0
  114. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/normalizer/__init__.py +0 -0
  115. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/normalizer/base.py +0 -0
  116. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/observability/__init__.py +0 -0
  117. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/observability/indices.py +0 -0
  118. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/observability/metrics.py +0 -0
  119. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/observability/notify.py +0 -0
  120. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/observability/otel.py +0 -0
  121. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/policy/__init__.py +0 -0
  122. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/policy/bundle.py +0 -0
  123. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/policy/catalog.py +0 -0
  124. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/policy/engine.py +0 -0
  125. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/reporting/__init__.py +0 -0
  126. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/reporting/charts.py +0 -0
  127. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/resolution/__init__.py +0 -0
  128. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/runtime/__init__.py +0 -0
  129. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/runtime/gate.py +0 -0
  130. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/sandbox/__init__.py +0 -0
  131. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/sandbox/executor.py +0 -0
  132. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/sandbox/mock.py +0 -0
  133. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/sandbox/panic.py +0 -0
  134. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/storage/__init__.py +0 -0
  135. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/testing/__init__.py +0 -0
  136. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/testing/asserts.py +0 -0
  137. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/testing/evaluate.py +0 -0
  138. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/testing/fixtures.py +0 -0
  139. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/testing/markers.py +0 -0
  140. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/types.py +0 -0
  141. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/validation/__init__.py +0 -0
  142. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/validation/runtime.py +0 -0
  143. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/validation/signature.py +0 -0
  144. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/validation/static.py +0 -0
  145. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/conftest.py +0 -0
  146. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_adapters.py +0 -0
  147. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_airflow_governance_gate.py +0 -0
  148. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_audit_persistent.py +0 -0
  149. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_behavior.py +0 -0
  150. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_behavior_llm.py +0 -0
  151. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_catalog.py +0 -0
  152. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_cli_validation.py +0 -0
  153. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_codegen.py +0 -0
  154. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_config.py +0 -0
  155. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_context.py +0 -0
  156. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_context_persistent.py +0 -0
  157. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_dbt_backend.py +0 -0
  158. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_hashing.py +0 -0
  159. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_indices.py +0 -0
  160. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_integration.py +0 -0
  161. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_intensive.py +0 -0
  162. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_kernel.py +0 -0
  163. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_mcp.py +0 -0
  164. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_metrics.py +0 -0
  165. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_normalizer.py +0 -0
  166. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_normalizer_llm.py +0 -0
  167. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_notify.py +0 -0
  168. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_otel.py +0 -0
  169. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_partial_execution.py +0 -0
  170. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_planner.py +0 -0
  171. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_policy.py +0 -0
  172. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_policy_bundle.py +0 -0
  173. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_promotion.py +0 -0
  174. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_reporting.py +0 -0
  175. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_runtime.py +0 -0
  176. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_runtime_validation.py +0 -0
  177. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_sandbox.py +0 -0
  178. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_serialization.py +0 -0
  179. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_signature.py +0 -0
  180. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_sql_backend.py +0 -0
  181. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_state_projection.py +0 -0
  182. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_static_validation.py +0 -0
  183. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_storage.py +0 -0
  184. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_testing.py +0 -0
  185. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_types.py +0 -0
  186. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_user_journeys.py +0 -0
  187. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/.gitignore +0 -0
  188. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/README.md +0 -0
  189. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/2019-05-28-first-blog-post.mdx +0 -0
  190. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/2019-05-29-long-blog-post.mdx +0 -0
  191. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/2021-08-01-mdx-blog-post.mdx +0 -0
  192. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
  193. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/2021-08-26-welcome/index.mdx +0 -0
  194. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/authors.yml +0 -0
  195. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/tags.yml +0 -0
  196. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/architecture-notes.md +0 -0
  197. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/backends.md +0 -0
  198. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/behavior-spec.md +0 -0
  199. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/cli.md +0 -0
  200. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/getting-started.md +0 -0
  201. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/guide.md +0 -0
  202. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/integrations/airflow.md +0 -0
  203. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/integrations/langgraph.md +0 -0
  204. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/integrations/openai-agents.md +0 -0
  205. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/mcp-server.md +0 -0
  206. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/policy-bundles.md +0 -0
  207. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/reporting.md +0 -0
  208. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/code.json +0 -0
  209. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/architecture-notes.md +0 -0
  210. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/backends.md +0 -0
  211. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/behavior-spec.md +0 -0
  212. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/cli.md +0 -0
  213. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/faq.md +0 -0
  214. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/getting-started.md +0 -0
  215. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/guide.md +0 -0
  216. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/integrations/airflow.md +0 -0
  217. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/integrations/langgraph.md +0 -0
  218. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/integrations/openai-agents.md +0 -0
  219. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/mcp-server.md +0 -0
  220. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/policy-bundles.md +0 -0
  221. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/reporting.md +0 -0
  222. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/package-lock.json +0 -0
  223. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/package.json +0 -0
  224. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/sidebars.ts +0 -0
  225. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/src/components/HomepageFeatures/index.tsx +0 -0
  226. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/src/components/HomepageFeatures/styles.module.css +0 -0
  227. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/src/css/custom.css +0 -0
  228. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/src/pages/index.module.css +0 -0
  229. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/src/pages/markdown-page.mdx +0 -0
  230. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/static/.nojekyll +0 -0
  231. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/static/img/favicon.ico +0 -0
  232. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/static/img/logo.svg +0 -0
  233. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/static/img/undraw_docusaurus_mountain.svg +0 -0
  234. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/static/img/undraw_docusaurus_react.svg +0 -0
  235. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/static/img/undraw_docusaurus_tree.svg +0 -0
  236. {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/tsconfig.json +0 -0
@@ -70,3 +70,8 @@ website/.docusaurus/
70
70
  cfa_test_results_*/
71
71
  test_battery.py
72
72
  uv.lock
73
+
74
+ CFA_LLM_Demo.dbc
75
+ CFA_LLM_Demo.html
76
+ CFA_LLM_Demo.py
77
+ CFA_LLM_Demo.ipynb.py
@@ -145,27 +145,32 @@
145
145
  "source": [
146
146
  "CATALOG = {\n",
147
147
  " 'nfe_bronze': {\n",
148
+ " 'classification': 'internal',\n",
148
149
  " 'type': 'delta', 'layer': 'bronze', 'size_gb': 50,\n",
149
150
  " 'partition_by': ['processing_date'], 'pii': False,\n",
150
151
  " 'description': 'Notas Fiscais Eletronicas brutas',\n",
151
152
  " },\n",
152
153
  " 'clientes_bronze': {\n",
154
+ " 'classification': 'sensitive',\n",
153
155
  " 'type': 'delta', 'layer': 'bronze', 'size_gb': 10,\n",
154
156
  " 'partition_by': ['processing_date'], 'pii': True,\n",
155
157
  " 'pii_columns': ['cpf', 'nome', 'endereco'],\n",
156
158
  " 'description': 'Dados cadastrais com CPF e endereco',\n",
157
159
  " },\n",
158
160
  " 'vendas_bronze': {\n",
161
+ " 'classification': 'high_volume',\n",
159
162
  " 'type': 'delta', 'layer': 'bronze', 'size_gb': 2000,\n",
160
163
  " 'pii': False,\n",
161
164
  " 'description': 'Registros de transacoes de venda',\n",
162
165
  " },\n",
163
166
  " 'fornecedores_bronze': {\n",
167
+ " 'classification': 'internal',\n",
164
168
  " 'type': 'delta', 'layer': 'bronze', 'size_gb': 10,\n",
165
169
  " 'pii': False,\n",
166
170
  " 'description': 'Cadastro de fornecedores',\n",
167
171
  " },\n",
168
172
  " 'vendas_gold_agregado': {\n",
173
+ " 'classification': 'high_volume',\n",
169
174
  " 'type': 'delta', 'layer': 'gold', 'size_gb': 500,\n",
170
175
  " 'pii': False,\n",
171
176
  " 'description': 'Agregados de vendas para BI',\n",
Binary file
@@ -24,28 +24,27 @@
24
24
  # COMMAND ----------
25
25
 
26
26
  # MAGIC %md
27
- # MAGIC ## Section 1Setup & Secrets
27
+ # MAGIC ## Section 0Install
28
28
  # MAGIC
29
- # MAGIC API key read from Databricks Secret Scope `cfa-secrets/deepseek-key`.
30
- # MAGIC Falls back to `DEEPSEEK_API_KEY` env var for local testing.
29
+ # MAGIC Run this cell first to install dependencies.
31
30
  # MAGIC
32
31
 
33
32
  # COMMAND ----------
34
33
 
35
34
  # MAGIC %md
36
- # MAGIC ## Section 0Install
35
+ # MAGIC ## Section 1Setup & Secrets
37
36
  # MAGIC
38
- # MAGIC Run this cell first to install dependencies.
37
+ # MAGIC API key read from Databricks Secret Scope `cfa-secrets/openai-key` or `cfa-secrets/deepseek-key`.
38
+ # MAGIC Falls back to `OPENAI_API_KEY` / `DEEPSEEK_API_KEY` env vars for local testing.
39
39
  # MAGIC
40
40
 
41
41
  # COMMAND ----------
42
42
 
43
43
  # MAGIC %pip install -q cfa-kernel[all] openai
44
- # MAGIC
45
44
 
46
45
  # COMMAND ----------
47
46
 
48
- dbutils.library.restartPython()
47
+ # MAGIC %restart_python
49
48
 
50
49
  # COMMAND ----------
51
50
 
@@ -83,7 +82,7 @@ DEEPSEEK_KEY = _try_secret("deepseek-key") or os.environ.get("DEEPSEEK_API_KEY")
83
82
  # Auto-select: prefer OpenAI (better reachability from Azure), fallback to DeepSeek
84
83
  if OPENAI_KEY:
85
84
  LLM_MODEL = "gpt-4o-mini"
86
- LLM_BASE_URL = "api.openai.com"
85
+ LLM_BASE_URL = None # default api.openai.com
87
86
  LLM_API_KEY = OPENAI_KEY
88
87
  print(f"Using OpenAI ({LLM_MODEL})")
89
88
  elif DEEPSEEK_KEY:
@@ -127,28 +126,37 @@ def make_provider():
127
126
  CATALOG = {
128
127
  'nfe_bronze': {
129
128
  'type': 'delta', 'layer': 'bronze', 'size_gb': 50,
129
+ 'classification': 'high_volume',
130
130
  'partition_by': ['processing_date'], 'pii': False,
131
+ 'pii_columns': [],
131
132
  'description': 'Notas Fiscais Eletronicas brutas',
132
133
  },
133
134
  'clientes_bronze': {
134
135
  'type': 'delta', 'layer': 'bronze', 'size_gb': 10,
136
+ 'classification': 'sensitive',
135
137
  'partition_by': ['processing_date'], 'pii': True,
136
138
  'pii_columns': ['cpf', 'nome', 'endereco'],
137
139
  'description': 'Dados cadastrais com CPF e endereco',
138
140
  },
139
141
  'vendas_bronze': {
140
142
  'type': 'delta', 'layer': 'bronze', 'size_gb': 2000,
141
- 'pii': False,
143
+ 'classification': 'high_volume',
144
+ 'partition_by': ['data_venda'], 'pii': False,
145
+ 'pii_columns': [],
142
146
  'description': 'Registros de transacoes de venda',
143
147
  },
144
148
  'fornecedores_bronze': {
145
149
  'type': 'delta', 'layer': 'bronze', 'size_gb': 10,
146
- 'pii': False,
150
+ 'classification': 'internal',
151
+ 'partition_by': ['updated_at'], 'pii': False,
152
+ 'pii_columns': [],
147
153
  'description': 'Cadastro de fornecedores',
148
154
  },
149
155
  'vendas_gold_agregado': {
150
156
  'type': 'delta', 'layer': 'gold', 'size_gb': 500,
151
- 'pii': False,
157
+ 'classification': 'internal',
158
+ 'partition_by': ['data_venda'], 'pii': False,
159
+ 'pii_columns': [],
152
160
  'description': 'Agregados de vendas para BI',
153
161
  },
154
162
  }
@@ -157,6 +165,9 @@ from cfa.policy.catalog import validate_catalog
157
165
  result = validate_catalog(CATALOG)
158
166
  print(f"Catalog valid: {result.valid}")
159
167
  print(f" {len(CATALOG)} datasets registered")
168
+ print(" Classifications: nfe_bronze=high_volume, clientes_bronze=sensitive,")
169
+ print(" vendas_bronze=high_volume, fornecedores_bronze=internal,")
170
+ print(" vendas_gold_agregado=internal")
160
171
  for msg in result.messages:
161
172
  print(f" {msg}")
162
173
 
@@ -176,18 +187,14 @@ for msg in result.messages:
176
187
  # COMMAND ----------
177
188
 
178
189
  if not HAS_LLM:
179
- print("SKIP: no API key configured. Set DEEPSEEK_API_KEY or Databricks secret.")
190
+ print("SKIP: no API key configured.")
180
191
  else:
181
- provider = OpenAILMProvider(
182
- model="deepseek-chat",
183
- base_url="https://api.deepseek.com",
184
- temperature=0.0,
185
- )
192
+ provider = make_provider()
186
193
  llm_backend = LLMNormalizerBackend(provider=provider, strict=False)
187
194
  normalizer = IntentNormalizer(backend=llm_backend)
188
195
 
189
196
  print("=" * 55)
190
- print("LLM NORMALIZER Semantic Resolution")
197
+ print("LLM NORMALIZER -- Semantic Resolution")
191
198
  print("=" * 55)
192
199
 
193
200
  intents = [
@@ -197,13 +204,13 @@ else:
197
204
  ]
198
205
 
199
206
  for raw in intents:
200
- print(f"\nIntent: \"{raw}\"")
207
+ print(f'\nIntent: "{raw}"')
201
208
  res = normalizer.normalize(raw, {}, CATALOG)
202
209
  sig = res.signature
203
210
  print(f" Domain : {sig.domain}")
204
211
  print(f" Intent : {sig.intent}")
205
212
  print(f" Target layer : {sig.target_layer}")
206
- ds_names = [d.get('name', '?') for d in sig.datasets]
213
+ ds_names = [d.name for d in sig.datasets]
207
214
  print(f" Datasets : {ds_names}")
208
215
  print(f" Confidence : {res.confidence_score:.2f}")
209
216
  print(f" Ambiguity : {res.ambiguity_level}")
@@ -235,19 +242,28 @@ else:
235
242
  print("=" * 55)
236
243
  print("STRICT MODE — Catalog-grounded LLM")
237
244
  print("=" * 55)
245
+ print(" strict=True: LLM output validated against catalog.")
246
+ print(" Hallucinated datasets or invalid classifications raise ValueError.")
247
+ print()
238
248
 
239
- for raw in [
240
- "Join NFe with Clientes anonymize CPF persist to Silver",
241
- "Full scan vendas without partition to Gold",
242
- ]:
243
- print(f"\nIntent: \"{raw}\"")
249
+ test_cases = [
250
+ # (intent, expect_pass)
251
+ ("Join NFe with Clientes anonymize CPF persist to Silver", True),
252
+ ("Full scan vendas without partition to Gold", False),
253
+ ]
254
+
255
+ for raw, expect_pass in test_cases:
256
+ print(f"Intent: \"{raw}\"")
244
257
  try:
245
258
  res = sn.normalize(raw, {}, CATALOG)
246
- print(f" PASSED | confidence={res.confidence_score:.2f} layer={res.signature.target_layer}")
259
+ status = "PASSED " if expect_pass else "UNEXPECTED PASS"
260
+ print(f" {status} | confidence={res.confidence_score:.2f} layer={res.signature.target_layer}")
247
261
  except ValueError as e:
248
- print(f" REJECTED | {str(e)[:120]}")
262
+ status = "REJECTED (expected)" if not expect_pass else "REJECTED (unexpected)"
263
+ print(f" {status} | {str(e)[:120]}")
264
+ print()
249
265
 
250
- print("\nStrict mode demo complete")
266
+ print("Strict mode demo complete")
251
267
 
252
268
 
253
269
  # COMMAND ----------
@@ -265,8 +281,14 @@ else:
265
281
  if not HAS_LLM:
266
282
  print("SKIP: no API key available")
267
283
  else:
268
- # The 'sb' backend from section 4 already recorded calls
269
- records = sb.audit_records
284
+ # 'sb' is the strict backend created in Section 4.
285
+ # Guard against running this cell out of order.
286
+ try:
287
+ records = sb.audit_records
288
+ except NameError:
289
+ print("NOTE: 'sb' not found — run Section 4 first, or re-run from Section 1.")
290
+ records = []
291
+
270
292
  print("=" * 55)
271
293
  print("LLM AUDIT TRAIL — Tamper-evident LLM calls")
272
294
  print("=" * 55)
@@ -376,7 +398,9 @@ if not HAS_LLM:
376
398
  print("SKIP: no API key available")
377
399
  else:
378
400
  provider = make_provider()
379
- backend = LLMNormalizerBackend(provider=provider, strict=True)
401
+ # strict=False: LLM resolves intent semantically; catalog used for grounding
402
+ # but validation errors do not block execution (strict mode is for S4 demo only)
403
+ backend = LLMNormalizerBackend(provider=provider, strict=False)
380
404
 
381
405
  kernel = KernelOrchestrator(
382
406
  catalog=CATALOG,
@@ -406,7 +430,12 @@ else:
406
430
  print(f" -> Replans : {len(result.replan_history)}")
407
431
  if result.generated_code and result.generated_code.code:
408
432
  lines = result.generated_code.code.splitlines()
409
- print(f" -> Code gen : {len(lines)} lines {result.generated_code.language}")
433
+ print(f" -> Code gen : {len(lines)} lines ({result.generated_code.language})")
434
+ preview = [l for l in lines if l.strip()][:6]
435
+ for line in preview:
436
+ print(f" {line}")
437
+ if len(lines) > 6:
438
+ print(f" ... ({len(lines) - 6} more lines)")
410
439
  except Exception as e:
411
440
  print(f" -> BLOCKED : {type(e).__name__} | {str(e)[:100]}")
412
441
 
@@ -430,25 +459,43 @@ else:
430
459
 
431
460
  # COMMAND ----------
432
461
 
462
+ import traceback
433
463
  print("=" * 55)
434
464
  print("RUNTIME GATE")
435
465
  print("=" * 55)
436
466
 
437
- gate = RuntimeGate(
438
- catalog=CATALOG,
439
- policy_rules=rules if rules is not None else None,
440
- )
467
+ # Guard: 'rules' is set by Section 6 (LLM Systematizer).
468
+ # If that section was skipped or failed, fall back to default rules gracefully.
469
+ try:
470
+ _rules = rules
471
+ except NameError:
472
+ _rules = None
473
+
474
+ if _rules is None:
475
+ print("NOTE: LLM-generated rules not available (Section 6 skipped or no API key).")
476
+ print(" Using default CFA policy rules instead.")
477
+ else:
478
+ print(f" Using {len(_rules)} LLM-generated rules from Section 6")
441
479
 
442
- result = gate.validate("Join NFe with Clientes and persist to Silver")
443
- print(f" validate() -> state={result.state.value} passed={result.passed}")
444
- print(f" gate_id={result.gate_id} execution_id={result.execution_id[:8]}...")
480
+ try:
481
+ gate = RuntimeGate(
482
+ catalog=CATALOG,
483
+ policy_rules=_rules,
484
+ )
485
+
486
+ result = gate.validate("Join NFe with Clientes and persist to Silver")
487
+ print(f" validate() -> state={result.state.value} passed={result.passed}")
488
+ print(f" gate_id={result.gate_id} execution_id={result.execution_id[:8]}...")
445
489
 
446
- @gate.guard("aggregate sales data with PII protected")
447
- def my_pipeline():
448
- return "pipeline executed"
490
+ @gate.guard("aggregate sales data with PII protected")
491
+ def my_pipeline():
492
+ return "pipeline executed"
449
493
 
450
- print(f" @gate.guard -> {my_pipeline()}")
451
- print("\nRuntime Gate demo complete")
494
+ print(f" @gate.guard -> {my_pipeline()}")
495
+ print("\nRuntime Gate demo complete")
496
+ except Exception as e:
497
+ print(f" RUNTIME GATE FAILED: {type(e).__name__}")
498
+ traceback.print_exc()
452
499
 
453
500
 
454
501
  # COMMAND ----------
@@ -470,9 +517,10 @@ rule_norm = IntentNormalizer(backend=RuleBasedNormalizerBackend())
470
517
  llm_norm = None
471
518
  if HAS_LLM:
472
519
  provider = make_provider()
473
- llm_norm = IntentNormalizer(backend=LLMNormalizerBackend(provider=provider, strict=True))
520
+ # strict=False for comparison — we want to see the LLM output, not block it
521
+ llm_norm = IntentNormalizer(backend=LLMNormalizerBackend(provider=provider, strict=False))
474
522
 
475
- header = f"{'Intent':<50s} | {'Method':<12s} | {'Domain':<10s} | {'Layer':<8s} | {'Confidence':>10s}"
523
+ header = f"{'Intent':<50s} | {'Method':<12s} | {'Domain':<14s} | {'Layer':<8s} | {'Confidence':>10s}"
476
524
  print(header)
477
525
  print("-" * len(header))
478
526
 
@@ -484,22 +532,21 @@ for raw in [
484
532
  # Rule-based
485
533
  rb = rule_norm.normalize(raw, {}, CATALOG)
486
534
  sig_rb = rb.signature
487
- print(f"{raw[:47]:<50s} | {'rule-based':<12s} | {sig_rb.domain:<10s} | {sig_rb.target_layer:<8s} | {rb.confidence_score:>9.2f}")
535
+ print(f"{raw[:47]:<50s} | {'rule-based':<12s} | {sig_rb.domain:<14s} | {str(sig_rb.target_layer):<8s} | {rb.confidence_score:>9.2f}")
488
536
  # LLM
489
537
  if llm_norm is not None:
490
538
  try:
491
539
  llm = llm_norm.normalize(raw, {}, CATALOG)
492
540
  sig_llm = llm.signature
493
- print(f"{'':50s} | {'LLM':<12s} | {sig_llm.domain:<10s} | {sig_llm.target_layer:<8s} | {llm.confidence_score:>9.2f}")
541
+ print(f"{'':50s} | {'LLM':<12s} | {sig_llm.domain:<14s} | {str(sig_llm.target_layer):<8s} | {llm.confidence_score:>9.2f}")
494
542
  except Exception as e:
495
- print(f"{'':50s} | {'LLM':<12s} | ERROR: {type(e).__name__}")
543
+ print(f"{'':50s} | {'LLM':<12s} | ERROR: {type(e).__name__}: {str(e)[:60]}")
496
544
  else:
497
545
  print(f"{'':50s} | {'LLM':<12s} | (no API key)")
498
546
  print()
499
547
 
500
548
  print("Normalizer comparison complete")
501
549
 
502
-
503
550
  # COMMAND ----------
504
551
 
505
552
  # MAGIC %md
@@ -518,13 +565,19 @@ print("=" * 55)
518
565
  print("POLICY ENGINE WITH LLM-GENERATED RULES")
519
566
  print("=" * 55)
520
567
 
521
- if rules is None:
522
- print("SKIP: rules not available (LLM Systematizer requires API key)")
523
- print(" Using default policy rules instead.")
568
+ # Guard: 'rules' is set by Section 6 (LLM Systematizer).
569
+ try:
570
+ _rules_s10 = rules
571
+ except NameError:
572
+ _rules_s10 = None
573
+
574
+ if _rules_s10 is None:
575
+ print("NOTE: LLM-generated rules not available (Section 6 skipped or no API key).")
576
+ print(" Using default CFA policy rules instead.")
524
577
  engine = PolicyEngine() # default rules
525
578
  else:
526
- print(f" Using {len(rules)} LLM-generated rules from Section 6")
527
- engine = PolicyEngine(rules=rules)
579
+ print(f" Using {len(_rules_s10)} LLM-generated rules from Section 6")
580
+ engine = PolicyEngine(rules=_rules_s10)
528
581
 
529
582
  # --- Safe signature ---
530
583
  sig_safe = StateSignature(
@@ -588,14 +641,14 @@ print("\nLLM-rules PolicyEngine complete")
588
641
  # MAGIC
589
642
  # MAGIC | LLM Feature | Status | Notes |
590
643
  # MAGIC |---|---|---|
591
- # MAGIC | LLM Normalizer | \\u2713 | Semantic intent resolution via DeepSeek |
592
- # MAGIC | Strict Mode | \\u2713 | LLM output validated against catalog |
593
- # MAGIC | LLM Audit Trail | \\u2713 | Every call SHA-256 traceable |
594
- # MAGIC | LLM Systematizer | \\u2713 | NL → BehaviorSpec → PolicyRules |
595
- # MAGIC | Full Kernel + LLM | \\u2713 | End-to-end with LLM normalizer |
596
- # MAGIC | Runtime Gate | \\u2713 | Guard with LLM-generated policy rules |
597
- # MAGIC | Normalizer Comparison | \\u2713 | Rule-based vs LLM side-by-side |
598
- # MAGIC | Secret Management | \\u2713 | Databricks Secret Scope `cfa-secrets` |
644
+ # MAGIC | LLM Normalizer | | Semantic intent resolution via DeepSeek/OpenAI |
645
+ # MAGIC | Strict Mode | | LLM output validated against catalog |
646
+ # MAGIC | LLM Audit Trail | | Every call SHA-256 traceable |
647
+ # MAGIC | LLM Systematizer | | NL → BehaviorSpec → PolicyRules |
648
+ # MAGIC | Full Kernel + LLM | | End-to-end with LLM normalizer |
649
+ # MAGIC | Runtime Gate | | Guard with LLM-generated policy rules |
650
+ # MAGIC | Normalizer Comparison | | Rule-based vs LLM side-by-side |
651
+ # MAGIC | Secret Management | | Databricks Secret Scope `cfa-secrets` |
599
652
  # MAGIC
600
653
  # MAGIC **Key differences from rule-based:**
601
654
  # MAGIC
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cfa-kernel
3
- Version: 0.1.7
3
+ Version: 0.1.9
4
4
  Summary: CFA — Governed execution for AI agents and data systems
5
5
  Project-URL: Homepage, https://marquesantero.github.io/cfa/
6
6
  Project-URL: Repository, https://github.com/marquesantero/cfa
@@ -38,7 +38,7 @@ Provides-Extra: yaml
38
38
  Requires-Dist: pyyaml>=6.0; extra == 'yaml'
39
39
  Description-Content-Type: text/markdown
40
40
 
41
- # CFA v0.1.7
41
+ # CFA v0.1.9
42
42
 
43
43
  [![CI](https://github.com/marquesantero/cfa/actions/workflows/ci.yml/badge.svg)](https://github.com/marquesantero/cfa/actions/workflows/ci.yml)
44
44
  [![codecov](https://codecov.io/github/marquesantero/cfa/graph/badge.svg?token=P5NFQBZGYT)](https://codecov.io/github/marquesantero/cfa)