spanforge 1.0.0__tar.gz → 1.0.2__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.
- {spanforge-1.0.0 → spanforge-1.0.2}/.gitignore +4 -1
- spanforge-1.0.2/.sf-gate/artifacts/g1_result.json +11 -0
- spanforge-1.0.2/.sf-gate/artifacts/gate5_governance_result.json +11 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/.sf-gate/artifacts/gate6_trust_result.json +3 -3
- {spanforge-1.0.0 → spanforge-1.0.2}/.sf-gate/artifacts/test-gate_result.json +2 -2
- {spanforge-1.0.0 → spanforge-1.0.2}/PKG-INFO +78 -26
- {spanforge-1.0.0 → spanforge-1.0.2}/README.md +77 -25
- {spanforge-1.0.0 → spanforge-1.0.2}/RELEASE.md +1 -1
- spanforge-1.0.2/SPANFORGE_COMPLETE_Master_Build_Plan_v6_FULL.md +949 -0
- spanforge-1.0.2/artifacts/g1_result.json +11 -0
- spanforge-1.0.2/artifacts/gate5_governance_result.json +11 -0
- spanforge-1.0.2/artifacts/gate6_trust_result.json +14 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/compliance.md +133 -4
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/exceptions.md +34 -2
- spanforge-1.0.2/docs/api/explain.md +200 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/gate.md +15 -13
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/governance.md +45 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/hooks.md +1 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/pii.md +12 -9
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/pipelines.md +23 -23
- spanforge-1.0.2/docs/api/rbac.md +96 -0
- spanforge-1.0.2/docs/api/scope.md +126 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/sdk-reference.md +35 -0
- spanforge-1.0.2/docs/api/testing_mocks.md +275 -0
- spanforge-1.0.2/docs/api/validate.md +387 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/changelog.md +336 -6
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/cli.md +728 -28
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/configuration.md +61 -0
- spanforge-1.0.2/docs/ga-release-notes.md +104 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/index.md +2 -1
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/installation.md +1 -1
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/runbook.md +17 -17
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/runtime-governance.md +17 -9
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/compliance.md +131 -6
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/export.md +6 -1
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/gate.md +2 -2
- spanforge-1.0.2/examples/explain_demo.py +133 -0
- spanforge-1.0.2/examples/scope_demo.py +207 -0
- spanforge-1.0.2/examples/scope_manifest.yaml +55 -0
- spanforge-1.0.2/examples/validate_demo.py +216 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/pyproject.toml +12 -1
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/__init__.py +78 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_cli.py +901 -39
- spanforge-1.0.2/src/spanforge/_cli_audit.py +1595 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_cli_compliance.py +183 -2
- spanforge-1.0.2/src/spanforge/_cli_config.py +583 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_cli_ops.py +506 -5
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/compliance.py +329 -325
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/core/compliance_mapping.py +511 -26
- spanforge-1.0.2/src/spanforge/core/dx.py +214 -0
- spanforge-1.0.2/src/spanforge/export/siem.py +214 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/governance.py +80 -2
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/langgraph.py +207 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/migrate.py +192 -0
- spanforge-1.0.2/src/spanforge/schemas/frameworks/frameworks.yaml +295 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/__init__.py +145 -122
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/_exceptions.py +34 -0
- spanforge-1.0.2/src/spanforge/sdk/dataset_scanner.py +624 -0
- spanforge-1.0.2/src/spanforge/sdk/explain.py +730 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/fallback.py +37 -1
- spanforge-1.0.2/src/spanforge/sdk/rbac.py +550 -0
- spanforge-1.0.2/src/spanforge/sdk/scope.py +585 -0
- spanforge-1.0.2/src/spanforge/sdk/validate.py +683 -0
- spanforge-1.0.2/src/spanforge/validate.py +775 -0
- spanforge-1.0.2/src/spanforge/workflow.py +1366 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/conformance/fixtures/compliance.json +5 -5
- spanforge-1.0.2/tests/fixtures/clean_dataset/data.jsonl +5 -0
- spanforge-1.0.2/tests/fixtures/no_consent_dataset/data.jsonl +5 -0
- spanforge-1.0.2/tests/fixtures/pii_dataset/data.jsonl +5 -0
- spanforge-1.0.2/tests/test_1e1_siem_langgraph.py +417 -0
- spanforge-1.0.2/tests/test_cli_compliance_dataset.py +444 -0
- spanforge-1.0.2/tests/test_cli_config_1d1.py +600 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_compliance_mapping.py +2 -1
- spanforge-1.0.2/tests/test_coverage_supplement_1.py +974 -0
- spanforge-1.0.2/tests/test_coverage_supplement_2.py +782 -0
- spanforge-1.0.2/tests/test_coverage_supplement_3.py +549 -0
- spanforge-1.0.2/tests/test_coverage_supplement_4.py +835 -0
- spanforge-1.0.2/tests/test_dataset_scanner.py +236 -0
- spanforge-1.0.2/tests/test_e2e_cli.py +1141 -0
- spanforge-1.0.2/tests/test_framework_mapper.py +836 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase0_scale.py +1 -0
- spanforge-1.0.2/tests/test_sdk_explain.py +553 -0
- spanforge-1.0.2/tests/test_sdk_scope.py +603 -0
- spanforge-1.0.2/tests/test_sdk_validate.py +521 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_explain.py +78 -1
- spanforge-1.0.2/tests/test_sf_rbac.py +668 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_scope.py +155 -1
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_types.py +23 -22
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_validate.py +187 -0
- spanforge-1.0.2/tests/test_workflow.py +1445 -0
- spanforge-1.0.0/docs/api/explain.md +0 -59
- spanforge-1.0.0/docs/api/rbac.md +0 -43
- spanforge-1.0.0/docs/api/scope.md +0 -51
- spanforge-1.0.0/docs/api/testing_mocks.md +0 -247
- spanforge-1.0.0/docs/api/validate.md +0 -109
- spanforge-1.0.0/docs/ga-release-notes.md +0 -56
- spanforge-1.0.0/src/spanforge/_cli_audit.py +0 -639
- spanforge-1.0.0/src/spanforge/sdk/explain.py +0 -170
- spanforge-1.0.0/src/spanforge/sdk/rbac.py +0 -280
- spanforge-1.0.0/src/spanforge/sdk/scope.py +0 -279
- spanforge-1.0.0/src/spanforge/validate.py +0 -379
- spanforge-1.0.0/tests/test_sf_rbac.py +0 -204
- {spanforge-1.0.0 → spanforge-1.0.2}/.bandit +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/.gitattributes +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/.github/CODEOWNERS +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/.github/ISSUE_TEMPLATE/rfc.yml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/.github/pull_request_template.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/.github/workflows/ci.yml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/.github/workflows/release.yml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/.pre-commit-hooks.yaml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/CNAME +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/CODE_OF_CONDUCT.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/CONFORMANCE.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/LICENSE +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/MAINTAINERS.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/PRICING.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/SECURITY.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docker-compose.selfhosted.yml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/Makefile +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/_static/.gitkeep +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/adr/ADR-001-immutable-audit-trail.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/adr/ADR-002-singleton-service-clients.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/adr/ADR-003-schema-versioning-strategy.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/adr/ADR-004-local-first-architecture.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/adr/ADR-005-sandbox-mode.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/adr/ADR-006-rag-tracing.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/adr/ADR-007-user-feedback.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/adr/ADR-008-sso-scim-oidc.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/adr/README.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/alert.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/audit.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/auto.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/cache.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/cec.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/config.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/consumer.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/debug.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/deprecations.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/drift.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/enterprise.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/eval.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/event.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/export.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/feedback.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/http.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/identity.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/index.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/integrations.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/io.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/lineage.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/lint.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/metrics.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/migrate.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/models.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/normalizer.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/observe.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/operator.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/plugins.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/policy.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/rag.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/redact.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/regression.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/schema.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/secrets.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/signing.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/stats.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/store.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/stream.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/testing.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/trace.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/trust.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/types.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/api/ulid.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/competitor-comparison.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/conf.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/contributing.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/demos/enterprise-evidence-demo.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/demos/runtime-governance-demo.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/deployment/air-gapped.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/deployment/kubernetes.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/enterprise-integrations.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/evidence-export.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/integrations/crewai.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/integrations/halluccheck.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/make.bat +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/migrations/from-langfuse.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/migrations/from-langsmith.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/migrations/from-openllmetry.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/migrations/v5-to-v6.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/audit.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/cache.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/consent.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/cost.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/diff.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/eval.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/explanation.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/feedback.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/fence.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/guard.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/hitl.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/index.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/model_registry.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/prompt.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/redact_ns.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/retrieval.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/template.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/namespaces/trace.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/quickstart.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/reference-architectures.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/replay-simulation.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/rfc/adr-index.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/rfc/rfc-0001.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/runtime-governance-contracts.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/README.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/envelope.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/agent-run.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/agent-step.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/audit.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/cache.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/consent.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/cost.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/diff.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/eval.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/explanation.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/fence.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/guard.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/hitl.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/model-registry.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/prompt.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/redact.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/span.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/payloads/template.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema/types/common.schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/schema-versioning.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/alert.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/audit.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/cache.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/custom_exporters.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/debugging.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/events.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/feedback.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/governance.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/in_memory_state.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/index.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/linting.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/metrics.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/migration.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/rag.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/redaction.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/signing.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/docs/user_guide/tracing.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/agent_workflow.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/budget_alert.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/docker/Dockerfile +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/docker/docker-compose.yml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/docker/otel-config.yaml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/enterprise_evidence_demo.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/gates/gate5_governance.yaml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/gates/sf-gate.yaml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/langchain_chain.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/multi_agent_rag.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/multi_tenant.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/openai_chat.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/otlp_grafana.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/production_multi_agent.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/runtime_governance_demo.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/secure_pipeline.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/streaming_response.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/examples/testing_mocks_example.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/helm/spanforge/Chart.yaml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/helm/spanforge/templates/_helpers.tpl +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/helm/spanforge/templates/deployment.yaml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/helm/spanforge/templates/hpa.yaml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/helm/spanforge/templates/networkpolicy.yaml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/helm/spanforge/templates/pdb.yaml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/helm/spanforge/templates/secret.yaml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/helm/spanforge/templates/service.yaml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/helm/spanforge/values.yaml +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/k6/README.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/k6/pii_scan_50rps.js +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/k6/score_100rps.js +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/k6/secrets_scan_100rps.js +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/sonar-project.properties +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_ansi.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_batch_exporter.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_cli_cost.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_cli_phase11.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_hooks.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_server.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_span.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_store.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_stream.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_trace.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/_tracer.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/actor.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/alerts.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/auto.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/baseline.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/cache.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/config.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/consent.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/consumer.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/core/__init__.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/cost.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/debug.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/deprecations.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/drift.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/egress.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/eval.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/event.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/exceptions.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/explain.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/__init__.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/append_only.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/cloud.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/datadog.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/grafana.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/jsonl.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/openinference.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/otel_bridge.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/otlp.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/otlp_bridge.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/redis_backend.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/siem_schema.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/siem_splunk.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/siem_syslog.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/export/webhook.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/exporters/__init__.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/exporters/console.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/exporters/jsonl.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/exporters/sqlite.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/gate.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/hitl.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/http.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/inspect.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/__init__.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/_pricing.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/anthropic.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/azure_openai.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/bedrock.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/crewai.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/gemini.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/groq.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/langchain.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/llamaindex.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/ollama.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/openai.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/integrations/together.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/io.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/lint.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/metrics.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/metrics_export.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/model_registry.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/models.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/__init__.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/audit.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/cache.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/chain.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/confidence.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/consent.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/cost.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/decision.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/diff.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/drift.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/eval_.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/feedback.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/fence.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/guard.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/hitl.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/latency.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/prompt.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/redact.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/retrieval.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/runtime_governance.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/template.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/tool_call.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/namespaces/trace.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/normalizer.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/plugins.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/presidio_backend.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/processor.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/prompt_registry.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/py.typed +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/redact.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/regression.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/runtime_policy.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sampling.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/schema.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/schemas/v1.0/schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/schemas/v2.0/schema.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/_base.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/_base.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/_types.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/alert.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/alert.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/audit.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/audit.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/cec.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/cec.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/config.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/config.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/enterprise.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/enterprise.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/feedback.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/gate.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/gate.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/identity.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/identity.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/lineage.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/observe.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/observe.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/operator.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/pii.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/pii.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/pipelines.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/pipelines.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/policy.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/rag.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/registry.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/registry.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/secrets.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/secrets.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/security.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/security.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/trust.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/sdk/trust.pyi +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/secrets.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/signing.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/stats.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/stream.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/testing.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/testing_mocks.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/trace.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/types.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/src/spanforge/ulid.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/test_agent.jsonl +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/test_events.jsonl +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/__init__.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/chaos/README.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/chaos/test_service_unavailability.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/conformance/__init__.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/conformance/fixtures/chain.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/conformance/fixtures/key_security.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/conformance/fixtures/migration.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/conformance/fixtures/pii.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/conformance/fixtures/signing.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/conformance/fixtures.json +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/conformance/run_conformance.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/conformance/test_conformance.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/conftest.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/integration/__init__.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/integration/test_dx_integration.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/load/README.md +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_actor.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_alerts.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_ansi.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_auto.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_baseline.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_batch_exporter.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_benchmarks.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_budget_alert.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_cache.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_cli.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_cli_audit_module.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_cli_compliance_module.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_cli_cost_module.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_cli_ops_module.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_cli_phase11_module.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_compliance.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_config_interpolate.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_consent.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_consumer.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_cost_event_emission.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_cost_tracker.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_costguard_gaps.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_coverage_gaps.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_deprecations.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_drift.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_egress_and_normalizer.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_eval_behaviour_scorer.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_event.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_exceptions.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_explain.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_export_cloud.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_export_datadog.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_export_grafana.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_export_jsonl.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_export_otel_bridge.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_export_otlp.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_export_redis_backend.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_export_siem_splunk.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_export_siem_syslog.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_export_webhook.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_feedback.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_gate_deep.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_governance.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_hitl.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_http.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_inspect.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_integration.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_integrations.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_io.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_lint.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_migrate.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_model_registry.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_models.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_namespaces.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_otlp_bridge.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase10_features.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase10_trust.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase11_enterprise.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase11_security.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase12_dx.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase1_context_trace.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase2_observability.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase3_debug_sampling.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase4_agent_instrumentation.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase4_metrics_store.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase5_console_exporter.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase5_coverage.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase5_enterprise_integrations.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase5_hooks_crewai.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase6_enterprise_deployment_packaging.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase6_openai_integration.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_phase8_release_hardening.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_plugins.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_processor_coverage.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_prompt_registry.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_properties.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_public_root_lazy_imports.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_rag.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_redact.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_regression.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_repo_guardrails.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_rfc_namespaces.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_runtime_governance_phase0.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sampling_coverage.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_schema.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_config.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_coverage_boost.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_exporters.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_final_coverage.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_gap_filler.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_openai_integration.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_phase7_integrations.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_pipelines_deep.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_precision_coverage.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_span.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_stream.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_tracer.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sdk_validation_coverage.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_server.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf11.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf12.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf13.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf14.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf15.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf16.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf9_config.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_alert.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_audit.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_cec.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_gate.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_identity.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_lineage.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_observe.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_operator.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_pii.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_policy.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_policy_integration.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_policy_phase3.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_rag.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_sf_secrets.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_signing.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_stats.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_stream.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_trace_decorator.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_trace_pytest_fixtures.py +0 -0
- {spanforge-1.0.0 → spanforge-1.0.2}/tests/test_ulid.py +0 -0
|
@@ -40,6 +40,7 @@ pip-delete-this-directory.txt
|
|
|
40
40
|
ROADMAP_CHECKLIST.md
|
|
41
41
|
FOUNDER_PREP_GUIDE.md
|
|
42
42
|
FOUNDER_PREP_GUIDE.pdf
|
|
43
|
+
PHASE_1_COMPLETE_SPRINT_PLAN.md
|
|
43
44
|
|
|
44
45
|
# Unit test / coverage reports
|
|
45
46
|
htmlcov/
|
|
@@ -196,4 +197,6 @@ cython_debug/
|
|
|
196
197
|
/spanforge-ts-migration.md
|
|
197
198
|
/SpanForge_Build_Plan_v1.0.md
|
|
198
199
|
/HallucCheck_Product_Spec_v6.0.updated.md
|
|
199
|
-
PRICING.pdf
|
|
200
|
+
PRICING.pdf
|
|
201
|
+
/CARD_1A1_GitHub_Marketplace_App.md
|
|
202
|
+
/NEXT_SDK_FEATURES.md
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"secrets_detected": false,
|
|
9
9
|
"secrets_detections_24h": 0,
|
|
10
10
|
"failures": [],
|
|
11
|
-
"timestamp": "2026-
|
|
12
|
-
"pipeline_id": "
|
|
13
|
-
"project_id": "
|
|
11
|
+
"timestamp": "2026-05-10T04:04:09.036213+00:00",
|
|
12
|
+
"pipeline_id": "d306e1c3-c437-4317-9c71-6532e5cac4a4",
|
|
13
|
+
"project_id": ""
|
|
14
14
|
}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
"metrics": {
|
|
5
5
|
"score": 0.95
|
|
6
6
|
},
|
|
7
|
-
"timestamp": "2026-
|
|
7
|
+
"timestamp": "2026-05-10T04:03:48.163107+00:00",
|
|
8
8
|
"duration_ms": 0,
|
|
9
9
|
"project_id": "",
|
|
10
|
-
"pipeline_id": "
|
|
10
|
+
"pipeline_id": "91e805b8-09a4-498e-bdde-f3b64e272e54"
|
|
11
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: spanforge
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.2
|
|
4
4
|
Summary: SpanForge — AI lifecycle and governance platform (RFC-0001 SPANFORGE)
|
|
5
5
|
Project-URL: Homepage, https://github.com/veerarag1973/spanforge
|
|
6
6
|
Project-URL: Documentation, https://github.com/veerarag1973/spanforge/blob/main/docs/index.md
|
|
@@ -117,9 +117,9 @@ Description-Content-Type: text/markdown
|
|
|
117
117
|
<img src="https://img.shields.io/badge/python-3.9%2B-4c8cbf?logo=python&logoColor=white" alt="Python 3.9+"/>
|
|
118
118
|
<a href="https://pypi.org/project/spanforge/"><img src="https://img.shields.io/pypi/v/spanforge?color=4c8cbf&logo=pypi&logoColor=white" alt="PyPI"/></a>
|
|
119
119
|
<a href="https://www.getspanforge.com/standard"><img src="https://img.shields.io/badge/standard-SpanForge_RFC--0001-4c8cbf" alt="spanforge RFC-0001"/></a>
|
|
120
|
-
<img src="https://img.shields.io/badge/coverage-
|
|
121
|
-
<img src="https://img.shields.io/badge/tests-
|
|
122
|
-
<img src="https://img.shields.io/badge/version-1.0.
|
|
120
|
+
<img src="https://img.shields.io/badge/coverage-91%25-brightgreen" alt="91% test coverage"/>
|
|
121
|
+
<img src="https://img.shields.io/badge/tests-7049%20passing-brightgreen" alt="7049 tests"/>
|
|
122
|
+
<img src="https://img.shields.io/badge/version-1.0.2-4c8cbf" alt="Version 1.0.2"/>
|
|
123
123
|
<img src="https://img.shields.io/badge/dependencies-zero-brightgreen" alt="Zero dependencies"/>
|
|
124
124
|
<a href="docs/index.md"><img src="https://img.shields.io/badge/docs-local-4c8cbf" alt="Documentation"/></a>
|
|
125
125
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-PolyForm%20NC%201.0-blue" alt="PolyForm Noncommercial 1.0"/></a>
|
|
@@ -170,7 +170,8 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
170
170
|
- Generate HMAC-signed **evidence packages** with gap analysis
|
|
171
171
|
- Track **consent boundaries**, **HITL oversight**, **model registry** governance, and **explainability** coverage
|
|
172
172
|
- Produce audit-ready attestations with model owner, risk tier, and status metadata
|
|
173
|
-
- **Compliance Evidence Chain (sf-cec)** — signed ZIP bundles with regulatory clause maps, DPA generation, and RFC 3161 timestamps for auditor hand-off
|
|
173
|
+
- **Compliance Evidence Chain (sf-cec)** — signed ZIP bundles with regulatory clause maps, DPA generation, and RFC 3161 timestamps for auditor hand-off; `spanforge audit cec generate` CLI generates CEC bundles without Python code
|
|
174
|
+
- **Human-in-the-Loop Workflow Engine (`spanforge.workflow`)** — approval workflows for gate reviews, policy sign-offs, and escalations; full state machine (PENDING → APPROVED / REJECTED → CLOSED) with SLA auto-escalation and role-based action matrix
|
|
174
175
|
- **Observability SDK (sf-observe)** — span export (OTLP/Datadog/Grafana/Splunk/Elastic), W3C TraceContext, OTel GenAI attrs, sampling strategies, annotation store, and health probes
|
|
175
176
|
- **CI/CD Gate Pipeline (sf-gate)** — evaluate release quality gates (schema, secrets, performance, PRRI, trust), YAML pipeline engine, artifact store, and blocking trust gate to prevent unsafe releases
|
|
176
177
|
- **T.R.U.S.T. Scorecard (sf-trust)** — five-pillar trust dimensions (Transparency · Reliability · UserTrust · Security · Traceability), configurable weights, SVG badge, history time-series, and 5 HallucCheck pipeline integrations (score, bias, monitor, risk, benchmark)
|
|
@@ -180,8 +181,12 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
180
181
|
</td>
|
|
181
182
|
<td width="50%">
|
|
182
183
|
|
|
183
|
-
### Privacy & Audit Infrastructure
|
|
184
|
-
- **
|
|
184
|
+
### Privacy & Audit Infrastructure
|
|
185
|
+
- **Secrets scanning** — 20-pattern registry detects API keys, tokens, private keys; SARIF output; pre-commit hook
|
|
186
|
+
- **PII redaction** — detect and strip sensitive data before it leaves your app. Includes a Presidio NLP backend (`spanforge[presidio]`) covering 15 entity types (SSN, email, phone, AADHAAR, PAN, UK NI, credit card, IBAN, and more) with ≥ 95% true-positive rate and < 0.5% false-positive rate verified at GA
|
|
187
|
+
- **HMAC audit chains** — tamper-evident, blockchain-style event signing
|
|
188
|
+
- **Audit SDK (`sf-audit`)** — `sf_audit.append()`, schema key registry, T.R.U.S.T. scorecard, GDPR Article 30 RoPA, BYOS cloud routing
|
|
189
|
+
- **GDPR subject erasure** — right-to-erasure with tombstone events that preserve chain integrity
|
|
185
190
|
- **Air-gapped deployment** — runs fully offline with zero egress
|
|
186
191
|
|
|
187
192
|
</td>
|
|
@@ -193,7 +198,7 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
193
198
|
- **Consent boundary monitoring** — `consent.granted`, `consent.revoked`, `consent.violation` events
|
|
194
199
|
- **Human-in-the-loop hooks** — `hitl.queued`, `hitl.reviewed`, `hitl.escalated`, `hitl.timeout` events
|
|
195
200
|
- **Model registry** — register, deprecate, retire models; attestations auto-warn on ungoverned models
|
|
196
|
-
- **Explainability tracking** —
|
|
201
|
+
- **Explainability tracking** — `sf_explain.explain(response, context)` returns a signed `ExplainRecord` with EU AI Act Article 13/14 clause mapping, `decision_drivers`, and HMAC-signed audit entry on every call. `@spanforge.governed` wraps any callable to auto-explain every model response with zero extra code.
|
|
197
202
|
|
|
198
203
|
</td>
|
|
199
204
|
<td>
|
|
@@ -209,7 +214,10 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
209
214
|
- **Auto-instrumentation** — patch OpenAI, Anthropic, LangChain, CrewAI, and more; `@trace_rag` decorator and automatic LlamaIndex/LangChain retriever instrumentation for zero-change RAG tracing
|
|
210
215
|
- **Async SDK** — every major SDK method now has a non-blocking `*_async()` variant (`scan_async`, `evaluate_async`, `build_bundle_async`, `get_scorecard_async`, `sso_delegate_session_async`) for seamless use in async frameworks
|
|
211
216
|
- **User feedback REST endpoint** — `POST /v1/feedback` accepts star/thumbs/Likert ratings and free-text comments (SHA-256 hashed); links to T.R.U.S.T. dimensions
|
|
212
|
-
-
|
|
217
|
+
- **`spanforge config init / validate`** — interactive config wizard, schema validation, and connectivity probe for `~/.spanforge/config.yaml`
|
|
218
|
+
- **`spanforge export siem`** — stream CEF or LEEF lines from a JSONL events file to any SIEM via `--format cef|leef`; reads stdin or `--input FILE`
|
|
219
|
+
- **`SpanForgeLangGraphCallback`** — LangChain-compatible callback (`on_chain_start/end`, `on_tool_start/end`, `on_agent_action`) that emits typed SpanForge events; no LangGraph runtime required
|
|
220
|
+
- **39 CLI commands** — compliance checks, PII scans, secrets scanning, audit-chain verification, event generation, audit log extraction, CEC bundle generation, gap detection, gate policy audit, CI/CD gate pipelines, trust scorecards, config validation, enterprise health, security scanning, doctor diagnostics, all CI-ready
|
|
213
221
|
|
|
214
222
|
</td>
|
|
215
223
|
</tr>
|
|
@@ -279,9 +287,9 @@ pip install "spanforge[all]" # everything above
|
|
|
279
287
|
|
|
280
288
|
The GA implementation spine is the runtime-governance control plane:
|
|
281
289
|
|
|
282
|
-
- `sf_explain` for signed runtime explanations
|
|
283
|
-
- `sf_scope` for agent capability enforcement
|
|
284
|
-
- `sf_rbac` for role enforcement on sensitive actions
|
|
290
|
+
- `sf_explain` for signed runtime explanations — now with `ExplainModelType` classification (LLM, RAG, MULTI_AGENT, CLASSIFIER, EMBEDDING), configurable retry, and fail-safe emit
|
|
291
|
+
- `sf_scope` for agent capability enforcement — now with circuit-breaker fail-secure mode and `ACTION_CATEGORIES` dictionary
|
|
292
|
+
- `sf_rbac` for role enforcement on sensitive actions — now with `STANDARD_ROLE_MATRIX` (10 canonical actor types), YAML manifest loading, and JWT claim extraction
|
|
285
293
|
- `sf_rag` for grounding evidence and thresholds
|
|
286
294
|
- `sf_lineage` for provenance capture
|
|
287
295
|
- `sf_policy` for policy activation, replay, simulation, and review
|
|
@@ -521,7 +529,7 @@ verdict = sf_gate.evaluate("schema-validation", event.to_dict())
|
|
|
521
529
|
print(verdict.verdict) # GateVerdict.PASS
|
|
522
530
|
|
|
523
531
|
# Standalone PRRI evaluation
|
|
524
|
-
prri = sf_gate.evaluate_prri(prri_score=28
|
|
532
|
+
prri = sf_gate.evaluate_prri("my-agent", prri_score=28)
|
|
525
533
|
print(prri.verdict) # PRRIVerdict.GREEN
|
|
526
534
|
|
|
527
535
|
# Composite trust gate — checks HRI rate, PII, and secrets windows
|
|
@@ -685,8 +693,8 @@ from spanforge.sdk.pipelines import (
|
|
|
685
693
|
result = score_pipeline("The model output to check", model="gpt-4o")
|
|
686
694
|
print(result.audit_id, result.details)
|
|
687
695
|
|
|
688
|
-
# Risk pipeline: PRRI
|
|
689
|
-
result = risk_pipeline(prri_score
|
|
696
|
+
# Risk pipeline: audit PRRI record → alert if RED → optional gate → optional CEC bundle
|
|
697
|
+
result = risk_pipeline({"verdict": "RED", "prri_score": 75.0}, project_id="my-agent")
|
|
690
698
|
print(result.details["verdict"]) # "RED"
|
|
691
699
|
```
|
|
692
700
|
|
|
@@ -723,7 +731,7 @@ with mock_all_services():
|
|
|
723
731
|
sf_audit.append({"score": 0.92}, schema_key="halluccheck.score.v1")
|
|
724
732
|
assert len(sf_audit.calls) == 1 # inspect recorded calls
|
|
725
733
|
|
|
726
|
-
prri = sf_gate.evaluate_prri(prri_score=28
|
|
734
|
+
prri = sf_gate.evaluate_prri("my-agent", prri_score=28)
|
|
727
735
|
assert prri.allow # GREEN by default
|
|
728
736
|
```
|
|
729
737
|
|
|
@@ -921,6 +929,15 @@ await stream.drain(GrafanaLokiExporter(url="http://loki:3100")) # Grafana Lo
|
|
|
921
929
|
await stream.drain(CloudExporter(api_key="sf_live_xxx")) # spanforge Cloud
|
|
922
930
|
await stream.drain(SplunkHECExporter()) # Splunk HEC (env-var config)
|
|
923
931
|
await stream.drain(SyslogExporter()) # Syslog/CEF (env-var config)
|
|
932
|
+
|
|
933
|
+
# Lightweight CEF/LEEF string formatter (no network, no dependencies)
|
|
934
|
+
from spanforge.export.siem import SIEMExporter
|
|
935
|
+
exporter = SIEMExporter(format="cef")
|
|
936
|
+
for event in events:
|
|
937
|
+
print(exporter.export(event)) # one CEF line per event
|
|
938
|
+
|
|
939
|
+
# Or via CLI
|
|
940
|
+
# spanforge export siem --format leef --input audit.jsonl | logger -n siem.corp.example -P 514
|
|
924
941
|
```
|
|
925
942
|
|
|
926
943
|
Fan-out routing for compliance alerting:
|
|
@@ -939,7 +956,7 @@ await stream.route(
|
|
|
939
956
|
|
|
940
957
|
## CLI
|
|
941
958
|
|
|
942
|
-
|
|
959
|
+
38 commands — all CI-pipeline ready:
|
|
943
960
|
|
|
944
961
|
```bash
|
|
945
962
|
# Compliance
|
|
@@ -955,25 +972,50 @@ spanforge audit-chain events.jsonl # verify chain integrity
|
|
|
955
972
|
spanforge audit erase events.jsonl --subject-id user123 # GDPR erasure
|
|
956
973
|
spanforge audit rotate-key events.jsonl # key rotation
|
|
957
974
|
spanforge audit verify --input events.jsonl # verify integrity
|
|
975
|
+
spanforge audit extract events.jsonl --type llm.trace.span.completed --since 2026-01-01 # filter & extract
|
|
976
|
+
spanforge audit cec generate --project-id my-agent --sign # CEC compliance bundle ZIP
|
|
977
|
+
spanforge audit gap-finder events.jsonl --threshold-minutes 30 # detect time gaps + missing fields
|
|
958
978
|
|
|
959
979
|
# Privacy & Secrets
|
|
960
980
|
spanforge scan events.jsonl --fail-on-match # CI-gate PII scan
|
|
961
981
|
spanforge secrets scan <file> # scan file for secrets (exit 0=clean, 1=found)
|
|
962
982
|
spanforge secrets scan <file> --format sarif # SARIF output for GitHub Code Scanning
|
|
963
983
|
spanforge secrets scan <file> --redact # print redacted version to stdout
|
|
984
|
+
spanforge secrets set KEY VALUE # store a secret in local secrets store
|
|
985
|
+
spanforge secrets get KEY # retrieve a stored secret
|
|
986
|
+
spanforge secrets list # list stored secret key names
|
|
987
|
+
spanforge secrets delete KEY # remove a stored secret
|
|
988
|
+
|
|
989
|
+
# Event generation
|
|
990
|
+
spanforge event create --type llm.trace.span.completed --count 10 --format jsonl # generate test events
|
|
964
991
|
|
|
965
992
|
# Validation
|
|
966
|
-
spanforge check # end-to-end health check
|
|
993
|
+
spanforge check # 9-step end-to-end health check (--verbose for timing)
|
|
967
994
|
spanforge check-compat events.json # v2.0 compatibility
|
|
968
995
|
spanforge validate events.jsonl # JSON Schema validation
|
|
996
|
+
spanforge validate events.jsonl --report detailed --format json # detailed report
|
|
997
|
+
spanforge validate --dataset training.jsonl # Article 10 compliance scan; exits 1 if any clause fails
|
|
998
|
+
spanforge validate --dataset training.jsonl --output json # machine-readable JSON report
|
|
999
|
+
spanforge validate --dataset training.jsonl --output pdf # PDF report (requires pip install spanforge[compliance])
|
|
969
1000
|
|
|
970
1001
|
# Configuration
|
|
971
|
-
spanforge config
|
|
972
|
-
spanforge config
|
|
1002
|
+
spanforge config init # interactive wizard → ~/.spanforge/config.yaml
|
|
1003
|
+
spanforge config init --non-interactive # write defaults immediately
|
|
1004
|
+
spanforge config init --force # overwrite existing config
|
|
1005
|
+
spanforge config validate # validate ~/.spanforge/config.yaml
|
|
1006
|
+
spanforge config validate --config path/to.yaml --check-connectivity # validate + probe OTLP
|
|
1007
|
+
spanforge config validate --file path/to.toml # validate .halluccheck.toml (legacy)
|
|
1008
|
+
|
|
1009
|
+
# Development
|
|
1010
|
+
spanforge dev reset # wipe local dev state (trace store, audit chain)
|
|
1011
|
+
spanforge dev reset --hard # also delete ~/.spanforge/config.yaml
|
|
1012
|
+
spanforge dev reset --dry-run # list files that would be removed
|
|
973
1013
|
|
|
974
1014
|
# Analysis
|
|
975
1015
|
spanforge stats events.jsonl # counts, tokens, cost
|
|
1016
|
+
spanforge stats events.jsonl --group-by model --format json # grouped stats, JSON output
|
|
976
1017
|
spanforge inspect <EVENT_ID> events.jsonl # pretty-print one event
|
|
1018
|
+
spanforge inspect <EVENT_ID> events.jsonl --format csv # CSV export
|
|
977
1019
|
spanforge cost events.jsonl # token spend report
|
|
978
1020
|
spanforge cost run --run-id <id> --input events.jsonl # per-run cost report
|
|
979
1021
|
|
|
@@ -993,6 +1035,7 @@ spanforge gate run gates/ci-pipeline.yaml # run YAML gate pipeline
|
|
|
993
1035
|
spanforge gate run gates/ci-pipeline.yaml --format json # JSON output for CI dashboards
|
|
994
1036
|
spanforge gate evaluate schema-validation --payload event.json # evaluate single gate
|
|
995
1037
|
spanforge gate trust-gate --project-id my-agent # composite trust gate check
|
|
1038
|
+
spanforge gate audit events.jsonl --fail-on-violation # policy audit of gate records (CI gate)
|
|
996
1039
|
|
|
997
1040
|
# T.R.U.S.T. Scorecard
|
|
998
1041
|
spanforge trust scorecard --project-id my-agent # five-pillar trust scorecard (text table)
|
|
@@ -1067,7 +1110,8 @@ spanforge/
|
|
|
1067
1110
|
+-- _store.py — TraceStore ring buffer
|
|
1068
1111
|
+-- _hooks.py — HookRegistry (lifecycle hooks)
|
|
1069
1112
|
+-- _server.py — HTTP server (/traces, /compliance/summary)
|
|
1070
|
-
+-- _cli.py ←
|
|
1113
|
+
+-- _cli.py ← 39 CLI sub-commands
|
|
1114
|
+
+-- workflow.py — Human-in-the-Loop Workflow Engine (CORE-15); WorkflowEngine, WorkflowType, state machine, SLA escalation
|
|
1071
1115
|
+-- cost.py — CostTracker, BudgetMonitor, @budget_alert
|
|
1072
1116
|
+-- cache.py — SemanticCache, @cached decorator
|
|
1073
1117
|
+-- retry.py — @retry, FallbackChain, CircuitBreaker
|
|
@@ -1086,6 +1130,9 @@ spanforge/
|
|
|
1086
1130
|
+-- namespaces/ — Typed payload dataclasses
|
|
1087
1131
|
+-- gate.py — GateRunner YAML pipeline engine, 6 gate executors, artifact store (Phase 8)
|
|
1088
1132
|
+-- sdk/ — Service SDK clients (sf-identity, sf-pii, sf-secrets, sf-audit, sf-cec, sf-observe, sf-alert, sf-gate, sf-trust, sf-enterprise, sf-security)
|
|
1133
|
+
│ +-- explain.py — SFExplainClient – ExplainModelType enum (LLM/RAG/MULTI_AGENT/CLASSIFIER/EMBEDDING), signed explanations, retry+timeout emit (Phase 1B)
|
|
1134
|
+
│ +-- scope.py — SFScopeClient – ACTION_CATEGORIES (5 categories), circuit-breaker fail-secure, resolve_action_category() (Phase 1B)
|
|
1135
|
+
│ +-- rbac.py — SFRBACClient – STANDARD_ROLE_MATRIX (10 actor types), register_actor_from_yaml(), register_actor_from_jwt() (Phase 1C)
|
|
1089
1136
|
│ +-- identity.py — SFIdentityClient – keys, JWT, TOTP, MFA, magic-link
|
|
1090
1137
|
│ +-- pii.py — SFPIIClient – scan, redact, anonymize
|
|
1091
1138
|
│ +-- secrets.py — SFSecretsClient – 20-pattern secret scanning, SARIF output
|
|
@@ -1192,6 +1239,11 @@ spanforge/
|
|
|
1192
1239
|
<td><code>SyslogExporter</code> — RFC 5424 and ArcSight CEF exporter over UDP or TCP; severity derived from event type; CEF extension values properly escaped; <code>SyslogExporterError</code> on socket failure</td>
|
|
1193
1240
|
<td>Security / compliance teams</td>
|
|
1194
1241
|
</tr>
|
|
1242
|
+
<tr>
|
|
1243
|
+
<td><code>spanforge.export.siem</code></td>
|
|
1244
|
+
<td><code>SIEMExporter</code> — lightweight, network-free CEF v0 and IBM LEEF 2.0 string formatter; flattens envelope + payload fields into extension KV pairs; wired to <code>spanforge export siem</code> CLI</td>
|
|
1245
|
+
<td>Security / compliance teams</td>
|
|
1246
|
+
</tr>
|
|
1195
1247
|
<tr>
|
|
1196
1248
|
<td><code>spanforge.stream</code></td>
|
|
1197
1249
|
<td>Fan-out router — one <code>drain()</code> call reaches multiple backends; Kafka source</td>
|
|
@@ -1199,7 +1251,7 @@ spanforge/
|
|
|
1199
1251
|
</tr>
|
|
1200
1252
|
<tr>
|
|
1201
1253
|
<td><code>spanforge.integrations</code></td>
|
|
1202
|
-
<td>Auto-instrumentation for OpenAI, Anthropic, LangChain, LlamaIndex, CrewAI, Groq, Ollama, Together</td>
|
|
1254
|
+
<td>Auto-instrumentation for OpenAI, Anthropic, LangChain, LlamaIndex, CrewAI, Groq, Ollama, Together; <code>SpanForgeLangGraphCallback</code> — 5-hook LangChain-compatible callback for LangGraph workflows</td>
|
|
1203
1255
|
<td>App developers</td>
|
|
1204
1256
|
</tr>
|
|
1205
1257
|
<tr>
|
|
@@ -1373,7 +1425,7 @@ spanforge/
|
|
|
1373
1425
|
</tr>
|
|
1374
1426
|
<tr>
|
|
1375
1427
|
<td><code>spanforge.sdk.gate</code></td>
|
|
1376
|
-
<td><code>SFGateClient</code> — <code>evaluate(gate_id, payload) → GateEvaluationResult</code>, <code>evaluate_prri(prri_score) → PRRIResult</code>, <code>run_pipeline(gate_config_path) → GateRunResult</code>, <code>get_artifact(gate_id)</code>, <code>list_artifacts()</code>, <code>purge_artifacts(older_than_days)</code>, <code>get_status() → GateStatusInfo</code>, <code>configure(config)</code>. Six built-in gate executors: <code>schema_validation</code>, <code>dependency_security</code>, <code>secrets_scan</code>, <code>performance_regression</code>, <code>halluccheck_prri</code>, <code>halluccheck_trust</code>. PRRI three-tier verdict (<code>GREEN</code>/<code>AMBER</code>/<code>RED</code>), <code>GateArtifact</code> store with configurable retention, composite trust gate (HRI rate + PII window + secrets window), five exception types. 174 tests, mypy strict + bandit clean. <em>(Phase 8, v2.0.7+)</em></td>
|
|
1428
|
+
<td><code>SFGateClient</code> — <code>evaluate(gate_id, payload) → GateEvaluationResult</code>, <code>evaluate_prri(project_id, *, prri_score) → PRRIResult</code>, <code>run_pipeline(gate_config_path) → GateRunResult</code>, <code>get_artifact(gate_id)</code>, <code>list_artifacts()</code>, <code>purge_artifacts(older_than_days)</code>, <code>get_status() → GateStatusInfo</code>, <code>configure(config)</code>. Six built-in gate executors: <code>schema_validation</code>, <code>dependency_security</code>, <code>secrets_scan</code>, <code>performance_regression</code>, <code>halluccheck_prri</code>, <code>halluccheck_trust</code>. PRRI three-tier verdict (<code>GREEN</code>/<code>AMBER</code>/<code>RED</code>), <code>GateArtifact</code> store with configurable retention, composite trust gate (HRI rate + PII window + secrets window), five exception types. 174 tests, mypy strict + bandit clean. <em>(Phase 8, v2.0.7+)</em></td>
|
|
1377
1429
|
<td>DevOps / CI / platform teams</td>
|
|
1378
1430
|
</tr>
|
|
1379
1431
|
<tr>
|
|
@@ -1398,7 +1450,7 @@ spanforge/
|
|
|
1398
1450
|
</tr>
|
|
1399
1451
|
<tr>
|
|
1400
1452
|
<td><code>spanforge.sdk.pipelines</code></td>
|
|
1401
|
-
<td>5 HallucCheck ↔ SpanForge pipeline integrations: <code>score_pipeline(text)</code> (PII → secrets → observe → audit), <code>bias_pipeline(
|
|
1453
|
+
<td>5 HallucCheck ↔ SpanForge pipeline integrations: <code>score_pipeline(text)</code> (PII → secrets → observe → audit), <code>bias_pipeline(bias_report)</code> (PII → audit → alert → anonymise), <code>monitor_pipeline(event)</code> (annotate → alert → OTel export), <code>risk_pipeline(prri_record)</code> (audit → alert if RED → optional gate → optional CEC), <code>benchmark_pipeline(run_result)</code> (audit → F1 regression alert → anonymise). Each returns <code>PipelineResult</code> with audit trail. <em>(Phase 10, v2.0.9+)</em></td>
|
|
1402
1454
|
<td>ML / eval / platform teams</td>
|
|
1403
1455
|
</tr>
|
|
1404
1456
|
<td><code>SFCECClient</code> — <code>build_bundle(project_id, date_range, frameworks)</code> assembles a signed ZIP with <code>manifest.json</code>, <code>clause_map.json</code>, <code>chain_proof.json</code>, <code>attestation.json</code>, <code>rfc3161_timestamp.tsr</code>, and 6 NDJSON evidence directories. HMAC-SHA256 manifest signing, BYOS detection. <code>verify_bundle(zip_path)</code> re-verifies HMAC + chain + timestamp. <code>generate_dpa(project_id, controller_details, processor_details)</code> produces a GDPR Article 28 Data Processing Agreement. <code>get_status()</code> returns bundle count, BYOS provider, and last bundle timestamp. Supports all 5 frameworks: <code>eu_ai_act</code>, <code>iso_42001</code>, <code>nist_ai_rmf</code>, <code>iso27001</code>, <code>soc2</code>. 148 tests, 87% coverage, mypy strict + bandit clean. <em>(Phase 5, v2.0.4+)</em></td>
|
|
@@ -1416,7 +1468,7 @@ spanforge/
|
|
|
1416
1468
|
|
|
1417
1469
|
## Quality
|
|
1418
1470
|
|
|
1419
|
-
- **
|
|
1471
|
+
- **7 049 tests** passing (7 skipped) — unit, integration, property-based (Hypothesis), performance benchmarks
|
|
1420
1472
|
- **≥ 91% line and branch coverage** — 90% minimum enforced in CI
|
|
1421
1473
|
- **Zero required dependencies** — entire core runs on Python stdlib
|
|
1422
1474
|
- **Typed** — full `py.typed` marker; mypy + pyright clean
|
|
@@ -1432,7 +1484,7 @@ git clone https://github.com/veerarag1973/spanforge.git
|
|
|
1432
1484
|
cd spanforge
|
|
1433
1485
|
python -m venv .venv && .venv\Scripts\activate
|
|
1434
1486
|
pip install -e ".[dev]"
|
|
1435
|
-
pytest #
|
|
1487
|
+
pytest # 7 049 tests
|
|
1436
1488
|
```
|
|
1437
1489
|
|
|
1438
1490
|
<details>
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
<img src="https://img.shields.io/badge/python-3.9%2B-4c8cbf?logo=python&logoColor=white" alt="Python 3.9+"/>
|
|
14
14
|
<a href="https://pypi.org/project/spanforge/"><img src="https://img.shields.io/pypi/v/spanforge?color=4c8cbf&logo=pypi&logoColor=white" alt="PyPI"/></a>
|
|
15
15
|
<a href="https://www.getspanforge.com/standard"><img src="https://img.shields.io/badge/standard-SpanForge_RFC--0001-4c8cbf" alt="spanforge RFC-0001"/></a>
|
|
16
|
-
<img src="https://img.shields.io/badge/coverage-
|
|
17
|
-
<img src="https://img.shields.io/badge/tests-
|
|
18
|
-
<img src="https://img.shields.io/badge/version-1.0.
|
|
16
|
+
<img src="https://img.shields.io/badge/coverage-91%25-brightgreen" alt="91% test coverage"/>
|
|
17
|
+
<img src="https://img.shields.io/badge/tests-7049%20passing-brightgreen" alt="7049 tests"/>
|
|
18
|
+
<img src="https://img.shields.io/badge/version-1.0.2-4c8cbf" alt="Version 1.0.2"/>
|
|
19
19
|
<img src="https://img.shields.io/badge/dependencies-zero-brightgreen" alt="Zero dependencies"/>
|
|
20
20
|
<a href="docs/index.md"><img src="https://img.shields.io/badge/docs-local-4c8cbf" alt="Documentation"/></a>
|
|
21
21
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-PolyForm%20NC%201.0-blue" alt="PolyForm Noncommercial 1.0"/></a>
|
|
@@ -66,7 +66,8 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
66
66
|
- Generate HMAC-signed **evidence packages** with gap analysis
|
|
67
67
|
- Track **consent boundaries**, **HITL oversight**, **model registry** governance, and **explainability** coverage
|
|
68
68
|
- Produce audit-ready attestations with model owner, risk tier, and status metadata
|
|
69
|
-
- **Compliance Evidence Chain (sf-cec)** — signed ZIP bundles with regulatory clause maps, DPA generation, and RFC 3161 timestamps for auditor hand-off
|
|
69
|
+
- **Compliance Evidence Chain (sf-cec)** — signed ZIP bundles with regulatory clause maps, DPA generation, and RFC 3161 timestamps for auditor hand-off; `spanforge audit cec generate` CLI generates CEC bundles without Python code
|
|
70
|
+
- **Human-in-the-Loop Workflow Engine (`spanforge.workflow`)** — approval workflows for gate reviews, policy sign-offs, and escalations; full state machine (PENDING → APPROVED / REJECTED → CLOSED) with SLA auto-escalation and role-based action matrix
|
|
70
71
|
- **Observability SDK (sf-observe)** — span export (OTLP/Datadog/Grafana/Splunk/Elastic), W3C TraceContext, OTel GenAI attrs, sampling strategies, annotation store, and health probes
|
|
71
72
|
- **CI/CD Gate Pipeline (sf-gate)** — evaluate release quality gates (schema, secrets, performance, PRRI, trust), YAML pipeline engine, artifact store, and blocking trust gate to prevent unsafe releases
|
|
72
73
|
- **T.R.U.S.T. Scorecard (sf-trust)** — five-pillar trust dimensions (Transparency · Reliability · UserTrust · Security · Traceability), configurable weights, SVG badge, history time-series, and 5 HallucCheck pipeline integrations (score, bias, monitor, risk, benchmark)
|
|
@@ -76,8 +77,12 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
76
77
|
</td>
|
|
77
78
|
<td width="50%">
|
|
78
79
|
|
|
79
|
-
### Privacy & Audit Infrastructure
|
|
80
|
-
- **
|
|
80
|
+
### Privacy & Audit Infrastructure
|
|
81
|
+
- **Secrets scanning** — 20-pattern registry detects API keys, tokens, private keys; SARIF output; pre-commit hook
|
|
82
|
+
- **PII redaction** — detect and strip sensitive data before it leaves your app. Includes a Presidio NLP backend (`spanforge[presidio]`) covering 15 entity types (SSN, email, phone, AADHAAR, PAN, UK NI, credit card, IBAN, and more) with ≥ 95% true-positive rate and < 0.5% false-positive rate verified at GA
|
|
83
|
+
- **HMAC audit chains** — tamper-evident, blockchain-style event signing
|
|
84
|
+
- **Audit SDK (`sf-audit`)** — `sf_audit.append()`, schema key registry, T.R.U.S.T. scorecard, GDPR Article 30 RoPA, BYOS cloud routing
|
|
85
|
+
- **GDPR subject erasure** — right-to-erasure with tombstone events that preserve chain integrity
|
|
81
86
|
- **Air-gapped deployment** — runs fully offline with zero egress
|
|
82
87
|
|
|
83
88
|
</td>
|
|
@@ -89,7 +94,7 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
89
94
|
- **Consent boundary monitoring** — `consent.granted`, `consent.revoked`, `consent.violation` events
|
|
90
95
|
- **Human-in-the-loop hooks** — `hitl.queued`, `hitl.reviewed`, `hitl.escalated`, `hitl.timeout` events
|
|
91
96
|
- **Model registry** — register, deprecate, retire models; attestations auto-warn on ungoverned models
|
|
92
|
-
- **Explainability tracking** —
|
|
97
|
+
- **Explainability tracking** — `sf_explain.explain(response, context)` returns a signed `ExplainRecord` with EU AI Act Article 13/14 clause mapping, `decision_drivers`, and HMAC-signed audit entry on every call. `@spanforge.governed` wraps any callable to auto-explain every model response with zero extra code.
|
|
93
98
|
|
|
94
99
|
</td>
|
|
95
100
|
<td>
|
|
@@ -105,7 +110,10 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
105
110
|
- **Auto-instrumentation** — patch OpenAI, Anthropic, LangChain, CrewAI, and more; `@trace_rag` decorator and automatic LlamaIndex/LangChain retriever instrumentation for zero-change RAG tracing
|
|
106
111
|
- **Async SDK** — every major SDK method now has a non-blocking `*_async()` variant (`scan_async`, `evaluate_async`, `build_bundle_async`, `get_scorecard_async`, `sso_delegate_session_async`) for seamless use in async frameworks
|
|
107
112
|
- **User feedback REST endpoint** — `POST /v1/feedback` accepts star/thumbs/Likert ratings and free-text comments (SHA-256 hashed); links to T.R.U.S.T. dimensions
|
|
108
|
-
-
|
|
113
|
+
- **`spanforge config init / validate`** — interactive config wizard, schema validation, and connectivity probe for `~/.spanforge/config.yaml`
|
|
114
|
+
- **`spanforge export siem`** — stream CEF or LEEF lines from a JSONL events file to any SIEM via `--format cef|leef`; reads stdin or `--input FILE`
|
|
115
|
+
- **`SpanForgeLangGraphCallback`** — LangChain-compatible callback (`on_chain_start/end`, `on_tool_start/end`, `on_agent_action`) that emits typed SpanForge events; no LangGraph runtime required
|
|
116
|
+
- **39 CLI commands** — compliance checks, PII scans, secrets scanning, audit-chain verification, event generation, audit log extraction, CEC bundle generation, gap detection, gate policy audit, CI/CD gate pipelines, trust scorecards, config validation, enterprise health, security scanning, doctor diagnostics, all CI-ready
|
|
109
117
|
|
|
110
118
|
</td>
|
|
111
119
|
</tr>
|
|
@@ -175,9 +183,9 @@ pip install "spanforge[all]" # everything above
|
|
|
175
183
|
|
|
176
184
|
The GA implementation spine is the runtime-governance control plane:
|
|
177
185
|
|
|
178
|
-
- `sf_explain` for signed runtime explanations
|
|
179
|
-
- `sf_scope` for agent capability enforcement
|
|
180
|
-
- `sf_rbac` for role enforcement on sensitive actions
|
|
186
|
+
- `sf_explain` for signed runtime explanations — now with `ExplainModelType` classification (LLM, RAG, MULTI_AGENT, CLASSIFIER, EMBEDDING), configurable retry, and fail-safe emit
|
|
187
|
+
- `sf_scope` for agent capability enforcement — now with circuit-breaker fail-secure mode and `ACTION_CATEGORIES` dictionary
|
|
188
|
+
- `sf_rbac` for role enforcement on sensitive actions — now with `STANDARD_ROLE_MATRIX` (10 canonical actor types), YAML manifest loading, and JWT claim extraction
|
|
181
189
|
- `sf_rag` for grounding evidence and thresholds
|
|
182
190
|
- `sf_lineage` for provenance capture
|
|
183
191
|
- `sf_policy` for policy activation, replay, simulation, and review
|
|
@@ -417,7 +425,7 @@ verdict = sf_gate.evaluate("schema-validation", event.to_dict())
|
|
|
417
425
|
print(verdict.verdict) # GateVerdict.PASS
|
|
418
426
|
|
|
419
427
|
# Standalone PRRI evaluation
|
|
420
|
-
prri = sf_gate.evaluate_prri(prri_score=28
|
|
428
|
+
prri = sf_gate.evaluate_prri("my-agent", prri_score=28)
|
|
421
429
|
print(prri.verdict) # PRRIVerdict.GREEN
|
|
422
430
|
|
|
423
431
|
# Composite trust gate — checks HRI rate, PII, and secrets windows
|
|
@@ -581,8 +589,8 @@ from spanforge.sdk.pipelines import (
|
|
|
581
589
|
result = score_pipeline("The model output to check", model="gpt-4o")
|
|
582
590
|
print(result.audit_id, result.details)
|
|
583
591
|
|
|
584
|
-
# Risk pipeline: PRRI
|
|
585
|
-
result = risk_pipeline(prri_score
|
|
592
|
+
# Risk pipeline: audit PRRI record → alert if RED → optional gate → optional CEC bundle
|
|
593
|
+
result = risk_pipeline({"verdict": "RED", "prri_score": 75.0}, project_id="my-agent")
|
|
586
594
|
print(result.details["verdict"]) # "RED"
|
|
587
595
|
```
|
|
588
596
|
|
|
@@ -619,7 +627,7 @@ with mock_all_services():
|
|
|
619
627
|
sf_audit.append({"score": 0.92}, schema_key="halluccheck.score.v1")
|
|
620
628
|
assert len(sf_audit.calls) == 1 # inspect recorded calls
|
|
621
629
|
|
|
622
|
-
prri = sf_gate.evaluate_prri(prri_score=28
|
|
630
|
+
prri = sf_gate.evaluate_prri("my-agent", prri_score=28)
|
|
623
631
|
assert prri.allow # GREEN by default
|
|
624
632
|
```
|
|
625
633
|
|
|
@@ -817,6 +825,15 @@ await stream.drain(GrafanaLokiExporter(url="http://loki:3100")) # Grafana Lo
|
|
|
817
825
|
await stream.drain(CloudExporter(api_key="sf_live_xxx")) # spanforge Cloud
|
|
818
826
|
await stream.drain(SplunkHECExporter()) # Splunk HEC (env-var config)
|
|
819
827
|
await stream.drain(SyslogExporter()) # Syslog/CEF (env-var config)
|
|
828
|
+
|
|
829
|
+
# Lightweight CEF/LEEF string formatter (no network, no dependencies)
|
|
830
|
+
from spanforge.export.siem import SIEMExporter
|
|
831
|
+
exporter = SIEMExporter(format="cef")
|
|
832
|
+
for event in events:
|
|
833
|
+
print(exporter.export(event)) # one CEF line per event
|
|
834
|
+
|
|
835
|
+
# Or via CLI
|
|
836
|
+
# spanforge export siem --format leef --input audit.jsonl | logger -n siem.corp.example -P 514
|
|
820
837
|
```
|
|
821
838
|
|
|
822
839
|
Fan-out routing for compliance alerting:
|
|
@@ -835,7 +852,7 @@ await stream.route(
|
|
|
835
852
|
|
|
836
853
|
## CLI
|
|
837
854
|
|
|
838
|
-
|
|
855
|
+
38 commands — all CI-pipeline ready:
|
|
839
856
|
|
|
840
857
|
```bash
|
|
841
858
|
# Compliance
|
|
@@ -851,25 +868,50 @@ spanforge audit-chain events.jsonl # verify chain integrity
|
|
|
851
868
|
spanforge audit erase events.jsonl --subject-id user123 # GDPR erasure
|
|
852
869
|
spanforge audit rotate-key events.jsonl # key rotation
|
|
853
870
|
spanforge audit verify --input events.jsonl # verify integrity
|
|
871
|
+
spanforge audit extract events.jsonl --type llm.trace.span.completed --since 2026-01-01 # filter & extract
|
|
872
|
+
spanforge audit cec generate --project-id my-agent --sign # CEC compliance bundle ZIP
|
|
873
|
+
spanforge audit gap-finder events.jsonl --threshold-minutes 30 # detect time gaps + missing fields
|
|
854
874
|
|
|
855
875
|
# Privacy & Secrets
|
|
856
876
|
spanforge scan events.jsonl --fail-on-match # CI-gate PII scan
|
|
857
877
|
spanforge secrets scan <file> # scan file for secrets (exit 0=clean, 1=found)
|
|
858
878
|
spanforge secrets scan <file> --format sarif # SARIF output for GitHub Code Scanning
|
|
859
879
|
spanforge secrets scan <file> --redact # print redacted version to stdout
|
|
880
|
+
spanforge secrets set KEY VALUE # store a secret in local secrets store
|
|
881
|
+
spanforge secrets get KEY # retrieve a stored secret
|
|
882
|
+
spanforge secrets list # list stored secret key names
|
|
883
|
+
spanforge secrets delete KEY # remove a stored secret
|
|
884
|
+
|
|
885
|
+
# Event generation
|
|
886
|
+
spanforge event create --type llm.trace.span.completed --count 10 --format jsonl # generate test events
|
|
860
887
|
|
|
861
888
|
# Validation
|
|
862
|
-
spanforge check # end-to-end health check
|
|
889
|
+
spanforge check # 9-step end-to-end health check (--verbose for timing)
|
|
863
890
|
spanforge check-compat events.json # v2.0 compatibility
|
|
864
891
|
spanforge validate events.jsonl # JSON Schema validation
|
|
892
|
+
spanforge validate events.jsonl --report detailed --format json # detailed report
|
|
893
|
+
spanforge validate --dataset training.jsonl # Article 10 compliance scan; exits 1 if any clause fails
|
|
894
|
+
spanforge validate --dataset training.jsonl --output json # machine-readable JSON report
|
|
895
|
+
spanforge validate --dataset training.jsonl --output pdf # PDF report (requires pip install spanforge[compliance])
|
|
865
896
|
|
|
866
897
|
# Configuration
|
|
867
|
-
spanforge config
|
|
868
|
-
spanforge config
|
|
898
|
+
spanforge config init # interactive wizard → ~/.spanforge/config.yaml
|
|
899
|
+
spanforge config init --non-interactive # write defaults immediately
|
|
900
|
+
spanforge config init --force # overwrite existing config
|
|
901
|
+
spanforge config validate # validate ~/.spanforge/config.yaml
|
|
902
|
+
spanforge config validate --config path/to.yaml --check-connectivity # validate + probe OTLP
|
|
903
|
+
spanforge config validate --file path/to.toml # validate .halluccheck.toml (legacy)
|
|
904
|
+
|
|
905
|
+
# Development
|
|
906
|
+
spanforge dev reset # wipe local dev state (trace store, audit chain)
|
|
907
|
+
spanforge dev reset --hard # also delete ~/.spanforge/config.yaml
|
|
908
|
+
spanforge dev reset --dry-run # list files that would be removed
|
|
869
909
|
|
|
870
910
|
# Analysis
|
|
871
911
|
spanforge stats events.jsonl # counts, tokens, cost
|
|
912
|
+
spanforge stats events.jsonl --group-by model --format json # grouped stats, JSON output
|
|
872
913
|
spanforge inspect <EVENT_ID> events.jsonl # pretty-print one event
|
|
914
|
+
spanforge inspect <EVENT_ID> events.jsonl --format csv # CSV export
|
|
873
915
|
spanforge cost events.jsonl # token spend report
|
|
874
916
|
spanforge cost run --run-id <id> --input events.jsonl # per-run cost report
|
|
875
917
|
|
|
@@ -889,6 +931,7 @@ spanforge gate run gates/ci-pipeline.yaml # run YAML gate pipeline
|
|
|
889
931
|
spanforge gate run gates/ci-pipeline.yaml --format json # JSON output for CI dashboards
|
|
890
932
|
spanforge gate evaluate schema-validation --payload event.json # evaluate single gate
|
|
891
933
|
spanforge gate trust-gate --project-id my-agent # composite trust gate check
|
|
934
|
+
spanforge gate audit events.jsonl --fail-on-violation # policy audit of gate records (CI gate)
|
|
892
935
|
|
|
893
936
|
# T.R.U.S.T. Scorecard
|
|
894
937
|
spanforge trust scorecard --project-id my-agent # five-pillar trust scorecard (text table)
|
|
@@ -963,7 +1006,8 @@ spanforge/
|
|
|
963
1006
|
+-- _store.py — TraceStore ring buffer
|
|
964
1007
|
+-- _hooks.py — HookRegistry (lifecycle hooks)
|
|
965
1008
|
+-- _server.py — HTTP server (/traces, /compliance/summary)
|
|
966
|
-
+-- _cli.py ←
|
|
1009
|
+
+-- _cli.py ← 39 CLI sub-commands
|
|
1010
|
+
+-- workflow.py — Human-in-the-Loop Workflow Engine (CORE-15); WorkflowEngine, WorkflowType, state machine, SLA escalation
|
|
967
1011
|
+-- cost.py — CostTracker, BudgetMonitor, @budget_alert
|
|
968
1012
|
+-- cache.py — SemanticCache, @cached decorator
|
|
969
1013
|
+-- retry.py — @retry, FallbackChain, CircuitBreaker
|
|
@@ -982,6 +1026,9 @@ spanforge/
|
|
|
982
1026
|
+-- namespaces/ — Typed payload dataclasses
|
|
983
1027
|
+-- gate.py — GateRunner YAML pipeline engine, 6 gate executors, artifact store (Phase 8)
|
|
984
1028
|
+-- sdk/ — Service SDK clients (sf-identity, sf-pii, sf-secrets, sf-audit, sf-cec, sf-observe, sf-alert, sf-gate, sf-trust, sf-enterprise, sf-security)
|
|
1029
|
+
│ +-- explain.py — SFExplainClient – ExplainModelType enum (LLM/RAG/MULTI_AGENT/CLASSIFIER/EMBEDDING), signed explanations, retry+timeout emit (Phase 1B)
|
|
1030
|
+
│ +-- scope.py — SFScopeClient – ACTION_CATEGORIES (5 categories), circuit-breaker fail-secure, resolve_action_category() (Phase 1B)
|
|
1031
|
+
│ +-- rbac.py — SFRBACClient – STANDARD_ROLE_MATRIX (10 actor types), register_actor_from_yaml(), register_actor_from_jwt() (Phase 1C)
|
|
985
1032
|
│ +-- identity.py — SFIdentityClient – keys, JWT, TOTP, MFA, magic-link
|
|
986
1033
|
│ +-- pii.py — SFPIIClient – scan, redact, anonymize
|
|
987
1034
|
│ +-- secrets.py — SFSecretsClient – 20-pattern secret scanning, SARIF output
|
|
@@ -1088,6 +1135,11 @@ spanforge/
|
|
|
1088
1135
|
<td><code>SyslogExporter</code> — RFC 5424 and ArcSight CEF exporter over UDP or TCP; severity derived from event type; CEF extension values properly escaped; <code>SyslogExporterError</code> on socket failure</td>
|
|
1089
1136
|
<td>Security / compliance teams</td>
|
|
1090
1137
|
</tr>
|
|
1138
|
+
<tr>
|
|
1139
|
+
<td><code>spanforge.export.siem</code></td>
|
|
1140
|
+
<td><code>SIEMExporter</code> — lightweight, network-free CEF v0 and IBM LEEF 2.0 string formatter; flattens envelope + payload fields into extension KV pairs; wired to <code>spanforge export siem</code> CLI</td>
|
|
1141
|
+
<td>Security / compliance teams</td>
|
|
1142
|
+
</tr>
|
|
1091
1143
|
<tr>
|
|
1092
1144
|
<td><code>spanforge.stream</code></td>
|
|
1093
1145
|
<td>Fan-out router — one <code>drain()</code> call reaches multiple backends; Kafka source</td>
|
|
@@ -1095,7 +1147,7 @@ spanforge/
|
|
|
1095
1147
|
</tr>
|
|
1096
1148
|
<tr>
|
|
1097
1149
|
<td><code>spanforge.integrations</code></td>
|
|
1098
|
-
<td>Auto-instrumentation for OpenAI, Anthropic, LangChain, LlamaIndex, CrewAI, Groq, Ollama, Together</td>
|
|
1150
|
+
<td>Auto-instrumentation for OpenAI, Anthropic, LangChain, LlamaIndex, CrewAI, Groq, Ollama, Together; <code>SpanForgeLangGraphCallback</code> — 5-hook LangChain-compatible callback for LangGraph workflows</td>
|
|
1099
1151
|
<td>App developers</td>
|
|
1100
1152
|
</tr>
|
|
1101
1153
|
<tr>
|
|
@@ -1269,7 +1321,7 @@ spanforge/
|
|
|
1269
1321
|
</tr>
|
|
1270
1322
|
<tr>
|
|
1271
1323
|
<td><code>spanforge.sdk.gate</code></td>
|
|
1272
|
-
<td><code>SFGateClient</code> — <code>evaluate(gate_id, payload) → GateEvaluationResult</code>, <code>evaluate_prri(prri_score) → PRRIResult</code>, <code>run_pipeline(gate_config_path) → GateRunResult</code>, <code>get_artifact(gate_id)</code>, <code>list_artifacts()</code>, <code>purge_artifacts(older_than_days)</code>, <code>get_status() → GateStatusInfo</code>, <code>configure(config)</code>. Six built-in gate executors: <code>schema_validation</code>, <code>dependency_security</code>, <code>secrets_scan</code>, <code>performance_regression</code>, <code>halluccheck_prri</code>, <code>halluccheck_trust</code>. PRRI three-tier verdict (<code>GREEN</code>/<code>AMBER</code>/<code>RED</code>), <code>GateArtifact</code> store with configurable retention, composite trust gate (HRI rate + PII window + secrets window), five exception types. 174 tests, mypy strict + bandit clean. <em>(Phase 8, v2.0.7+)</em></td>
|
|
1324
|
+
<td><code>SFGateClient</code> — <code>evaluate(gate_id, payload) → GateEvaluationResult</code>, <code>evaluate_prri(project_id, *, prri_score) → PRRIResult</code>, <code>run_pipeline(gate_config_path) → GateRunResult</code>, <code>get_artifact(gate_id)</code>, <code>list_artifacts()</code>, <code>purge_artifacts(older_than_days)</code>, <code>get_status() → GateStatusInfo</code>, <code>configure(config)</code>. Six built-in gate executors: <code>schema_validation</code>, <code>dependency_security</code>, <code>secrets_scan</code>, <code>performance_regression</code>, <code>halluccheck_prri</code>, <code>halluccheck_trust</code>. PRRI three-tier verdict (<code>GREEN</code>/<code>AMBER</code>/<code>RED</code>), <code>GateArtifact</code> store with configurable retention, composite trust gate (HRI rate + PII window + secrets window), five exception types. 174 tests, mypy strict + bandit clean. <em>(Phase 8, v2.0.7+)</em></td>
|
|
1273
1325
|
<td>DevOps / CI / platform teams</td>
|
|
1274
1326
|
</tr>
|
|
1275
1327
|
<tr>
|
|
@@ -1294,7 +1346,7 @@ spanforge/
|
|
|
1294
1346
|
</tr>
|
|
1295
1347
|
<tr>
|
|
1296
1348
|
<td><code>spanforge.sdk.pipelines</code></td>
|
|
1297
|
-
<td>5 HallucCheck ↔ SpanForge pipeline integrations: <code>score_pipeline(text)</code> (PII → secrets → observe → audit), <code>bias_pipeline(
|
|
1349
|
+
<td>5 HallucCheck ↔ SpanForge pipeline integrations: <code>score_pipeline(text)</code> (PII → secrets → observe → audit), <code>bias_pipeline(bias_report)</code> (PII → audit → alert → anonymise), <code>monitor_pipeline(event)</code> (annotate → alert → OTel export), <code>risk_pipeline(prri_record)</code> (audit → alert if RED → optional gate → optional CEC), <code>benchmark_pipeline(run_result)</code> (audit → F1 regression alert → anonymise). Each returns <code>PipelineResult</code> with audit trail. <em>(Phase 10, v2.0.9+)</em></td>
|
|
1298
1350
|
<td>ML / eval / platform teams</td>
|
|
1299
1351
|
</tr>
|
|
1300
1352
|
<td><code>SFCECClient</code> — <code>build_bundle(project_id, date_range, frameworks)</code> assembles a signed ZIP with <code>manifest.json</code>, <code>clause_map.json</code>, <code>chain_proof.json</code>, <code>attestation.json</code>, <code>rfc3161_timestamp.tsr</code>, and 6 NDJSON evidence directories. HMAC-SHA256 manifest signing, BYOS detection. <code>verify_bundle(zip_path)</code> re-verifies HMAC + chain + timestamp. <code>generate_dpa(project_id, controller_details, processor_details)</code> produces a GDPR Article 28 Data Processing Agreement. <code>get_status()</code> returns bundle count, BYOS provider, and last bundle timestamp. Supports all 5 frameworks: <code>eu_ai_act</code>, <code>iso_42001</code>, <code>nist_ai_rmf</code>, <code>iso27001</code>, <code>soc2</code>. 148 tests, 87% coverage, mypy strict + bandit clean. <em>(Phase 5, v2.0.4+)</em></td>
|
|
@@ -1312,7 +1364,7 @@ spanforge/
|
|
|
1312
1364
|
|
|
1313
1365
|
## Quality
|
|
1314
1366
|
|
|
1315
|
-
- **
|
|
1367
|
+
- **7 049 tests** passing (7 skipped) — unit, integration, property-based (Hypothesis), performance benchmarks
|
|
1316
1368
|
- **≥ 91% line and branch coverage** — 90% minimum enforced in CI
|
|
1317
1369
|
- **Zero required dependencies** — entire core runs on Python stdlib
|
|
1318
1370
|
- **Typed** — full `py.typed` marker; mypy + pyright clean
|
|
@@ -1328,7 +1380,7 @@ git clone https://github.com/veerarag1973/spanforge.git
|
|
|
1328
1380
|
cd spanforge
|
|
1329
1381
|
python -m venv .venv && .venv\Scripts\activate
|
|
1330
1382
|
pip install -e ".[dev]"
|
|
1331
|
-
pytest #
|
|
1383
|
+
pytest # 7 049 tests
|
|
1332
1384
|
```
|
|
1333
1385
|
|
|
1334
1386
|
<details>
|