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.
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.gitignore +5 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/CFA_LLM_Demo.ipynb +5 -0
- cfa_kernel-0.1.9/CFA_LLM_Demo_fixed (1).dbc +0 -0
- cfa_kernel-0.1.9/CFA_LLM_Demo_fixed.dbc +0 -0
- cfa_kernel-0.1.7/CFA_LLM_Demo.ipynb.py → cfa_kernel-0.1.9/CFA_LLM_Demo_fixed.py +116 -63
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/PKG-INFO +2 -2
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/README.md +287 -287
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/pyproject.toml +1 -1
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/__init__.py +1 -1
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/kernel.py +1 -1
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/normalizer/llm.py +6 -3
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/observability/promotion.py +2 -2
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/reporting/engine.py +1 -1
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/api.md +1 -1
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/faq.md +2 -2
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/intro.md +1 -1
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/whitepaper.md +2 -2
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docusaurus.config.ts +1 -1
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/api.md +1 -1
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/intro.md +1 -1
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/whitepaper.md +1 -1
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/src/pages/index.tsx +1 -1
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.gitattributes +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/workflows/ci.yml +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/workflows/deploy-docs.yml +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/workflows/deploy-pypi.yml +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.github/workflows/governance.yml +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.uv-cache/.gitignore +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.uv-cache/.lock +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.uv-cache/CACHEDIR.TAG +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/.uv-cache/sdists-v9/.gitignore +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/CODE_OF_CONDUCT.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/CONTRIBUTING.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/LICENSE +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/MANUAL_TESTING_GUIDE.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/SECURITY.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/cfa_demo_complete.ipynb +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/cfa_demo.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/fiscal_governance.yaml +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/full_pipeline.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/llm_systematizer.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/runtime_gate.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/standalone_governance.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/standalone_lifecycle.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/examples/standalone_resolution.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/integrations/airflow-governance-gate/README.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/integrations/airflow-governance-gate/dags/cfa_governance_gate_demo.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/integrations/airflow-governance-gate/requirements.txt +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/integrations/airflow-governance-gate/src/governance_gate.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/mcp.json +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/policies/compliance-strict-v1.yaml +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/policies/finops-strict-v1.yaml +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/policies/prod-v1.yaml +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/_lazy.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/adapters/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/adapters/autogen.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/adapters/crewai.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/adapters/dspy.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/adapters/langgraph.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/adapters/openai_agents.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/audit/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/audit/context.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/audit/hashing.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/audit/trail.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/backends/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/backends/dbt.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/backends/pyspark.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/backends/sql.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/behavior/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/behavior/llm.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/behavior/spec.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/behavior/systematizer.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/__main__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/_helpers.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/core/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/core/evaluate.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/core/validate.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/formatters.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/governance/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/governance/audit.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/governance/catalog.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/governance/policy.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/governance/rules.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/governance/signature.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/infrastructure/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/infrastructure/backend_list.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/infrastructure/storage.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/project/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/project/init.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/project/lifecycle.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/project/status.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/project/taxonomy.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/reporting/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/reporting/report.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/cli/reporting/serve.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/config.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/codegen.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/conditions.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/phases/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/phases/runner.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/core/planner.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/execution/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/execution/partial.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/execution/state_projection.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/governance/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/lifecycle/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/mcp/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/mcp/__main__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/normalizer/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/normalizer/base.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/observability/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/observability/indices.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/observability/metrics.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/observability/notify.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/observability/otel.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/policy/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/policy/bundle.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/policy/catalog.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/policy/engine.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/reporting/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/reporting/charts.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/resolution/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/runtime/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/runtime/gate.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/sandbox/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/sandbox/executor.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/sandbox/mock.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/sandbox/panic.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/storage/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/testing/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/testing/asserts.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/testing/evaluate.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/testing/fixtures.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/testing/markers.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/types.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/validation/__init__.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/validation/runtime.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/validation/signature.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/src/cfa/validation/static.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/conftest.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_adapters.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_airflow_governance_gate.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_audit_persistent.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_behavior.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_behavior_llm.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_catalog.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_cli_validation.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_codegen.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_config.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_context.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_context_persistent.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_dbt_backend.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_hashing.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_indices.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_integration.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_intensive.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_kernel.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_mcp.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_metrics.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_normalizer.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_normalizer_llm.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_notify.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_otel.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_partial_execution.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_planner.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_policy.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_policy_bundle.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_promotion.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_reporting.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_runtime.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_runtime_validation.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_sandbox.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_serialization.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_signature.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_sql_backend.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_state_projection.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_static_validation.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_storage.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_testing.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_types.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/tests/test_user_journeys.py +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/.gitignore +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/README.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/2019-05-28-first-blog-post.mdx +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/2019-05-29-long-blog-post.mdx +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/2021-08-01-mdx-blog-post.mdx +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/2021-08-26-welcome/index.mdx +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/authors.yml +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/blog/tags.yml +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/architecture-notes.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/backends.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/behavior-spec.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/cli.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/getting-started.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/guide.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/integrations/airflow.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/integrations/langgraph.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/integrations/openai-agents.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/mcp-server.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/policy-bundles.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/docs/reporting.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/code.json +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/architecture-notes.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/backends.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/behavior-spec.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/cli.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/faq.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/getting-started.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/guide.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/integrations/airflow.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/integrations/langgraph.md +0 -0
- {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
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/mcp-server.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/policy-bundles.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/reporting.md +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/package-lock.json +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/package.json +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/sidebars.ts +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/src/components/HomepageFeatures/index.tsx +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/src/components/HomepageFeatures/styles.module.css +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/src/css/custom.css +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/src/pages/index.module.css +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/src/pages/markdown-page.mdx +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/static/.nojekyll +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/static/img/favicon.ico +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/static/img/logo.svg +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/static/img/undraw_docusaurus_mountain.svg +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/static/img/undraw_docusaurus_react.svg +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/static/img/undraw_docusaurus_tree.svg +0 -0
- {cfa_kernel-0.1.7 → cfa_kernel-0.1.9}/website/tsconfig.json +0 -0
|
@@ -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
|
|
Binary file
|
|
@@ -24,28 +24,27 @@
|
|
|
24
24
|
# COMMAND ----------
|
|
25
25
|
|
|
26
26
|
# MAGIC %md
|
|
27
|
-
# MAGIC ## Section
|
|
27
|
+
# MAGIC ## Section 0 — Install
|
|
28
28
|
# MAGIC
|
|
29
|
-
# MAGIC
|
|
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
|
|
35
|
+
# MAGIC ## Section 1 — Setup & Secrets
|
|
37
36
|
# MAGIC
|
|
38
|
-
# MAGIC
|
|
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
|
-
|
|
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 =
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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.
|
|
190
|
+
print("SKIP: no API key configured.")
|
|
180
191
|
else:
|
|
181
|
-
provider =
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
"
|
|
242
|
-
|
|
243
|
-
|
|
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
|
-
|
|
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
|
-
|
|
262
|
+
status = "REJECTED (expected)" if not expect_pass else "REJECTED (unexpected)"
|
|
263
|
+
print(f" {status} | {str(e)[:120]}")
|
|
264
|
+
print()
|
|
249
265
|
|
|
250
|
-
print("
|
|
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
|
-
#
|
|
269
|
-
|
|
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
|
-
|
|
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
|
-
|
|
438
|
-
|
|
439
|
-
|
|
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
|
-
|
|
443
|
-
|
|
444
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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':<
|
|
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:<
|
|
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:<
|
|
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
|
-
|
|
522
|
-
|
|
523
|
-
|
|
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(
|
|
527
|
-
engine = PolicyEngine(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 |
|
|
592
|
-
# MAGIC | Strict Mode |
|
|
593
|
-
# MAGIC | LLM Audit Trail |
|
|
594
|
-
# MAGIC | LLM Systematizer |
|
|
595
|
-
# MAGIC | Full Kernel + LLM |
|
|
596
|
-
# MAGIC | Runtime Gate |
|
|
597
|
-
# MAGIC | Normalizer Comparison |
|
|
598
|
-
# MAGIC | Secret Management |
|
|
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.
|
|
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.
|
|
41
|
+
# CFA v0.1.9
|
|
42
42
|
|
|
43
43
|
[](https://github.com/marquesantero/cfa/actions/workflows/ci.yml)
|
|
44
44
|
[](https://codecov.io/github/marquesantero/cfa)
|