spanforge 1.0.1__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.1 → spanforge-1.0.2}/.gitignore +2 -0
- 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.1 → spanforge-1.0.2}/.sf-gate/artifacts/gate6_trust_result.json +2 -2
- {spanforge-1.0.1 → spanforge-1.0.2}/.sf-gate/artifacts/test-gate_result.json +2 -2
- {spanforge-1.0.1 → spanforge-1.0.2}/PKG-INFO +56 -22
- {spanforge-1.0.1 → spanforge-1.0.2}/README.md +55 -21
- {spanforge-1.0.1 → 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.1 → spanforge-1.0.2}/docs/api/compliance.md +133 -4
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/exceptions.md +34 -2
- spanforge-1.0.2/docs/api/explain.md +200 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/gate.md +15 -13
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/governance.md +45 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/hooks.md +1 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/pii.md +12 -9
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/pipelines.md +23 -23
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/scope.md +34 -0
- {spanforge-1.0.1 → 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.1 → spanforge-1.0.2}/docs/api/validate.md +158 -9
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/changelog.md +237 -20
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/cli.md +427 -52
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/configuration.md +61 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/ga-release-notes.md +16 -9
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/index.md +2 -1
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/installation.md +1 -1
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/runbook.md +17 -17
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/runtime-governance.md +1 -1
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/compliance.md +131 -6
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/export.md +6 -1
- {spanforge-1.0.1 → 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.1 → spanforge-1.0.2}/pyproject.toml +8 -1
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/__init__.py +47 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_cli.py +153 -73
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_cli_audit.py +98 -2
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_cli_compliance.py +75 -0
- spanforge-1.0.2/src/spanforge/_cli_config.py +583 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_cli_ops.py +42 -2
- spanforge-1.0.2/src/spanforge/export/siem.py +214 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/governance.py +80 -2
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/langgraph.py +207 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/__init__.py +145 -122
- {spanforge-1.0.1 → 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.1 → spanforge-1.0.2}/src/spanforge/sdk/fallback.py +37 -1
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/scope.py +210 -5
- spanforge-1.0.2/src/spanforge/sdk/validate.py +683 -0
- 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.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.1 → spanforge-1.0.2}/tests/test_dataset_scanner.py +27 -19
- 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.1 → spanforge-1.0.2}/tests/test_types.py +23 -22
- spanforge-1.0.1/cov_calc.py +0 -27
- spanforge-1.0.1/cov_out.txt +0 -0
- spanforge-1.0.1/docs/api/explain.md +0 -94
- spanforge-1.0.1/docs/api/testing_mocks.md +0 -247
- spanforge-1.0.1/src/spanforge/sdk/explain.py +0 -273
- {spanforge-1.0.1 → spanforge-1.0.2}/.bandit +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/.gitattributes +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/.github/CODEOWNERS +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/.github/ISSUE_TEMPLATE/rfc.yml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/.github/pull_request_template.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/.github/workflows/ci.yml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/.github/workflows/release.yml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/.pre-commit-hooks.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/CNAME +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/CODE_OF_CONDUCT.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/CONFORMANCE.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/LICENSE +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/MAINTAINERS.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/PRICING.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/SECURITY.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docker-compose.selfhosted.yml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/Makefile +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/_static/.gitkeep +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-001-immutable-audit-trail.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-002-singleton-service-clients.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-003-schema-versioning-strategy.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-004-local-first-architecture.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-005-sandbox-mode.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-006-rag-tracing.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-007-user-feedback.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-008-sso-scim-oidc.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/README.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/alert.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/audit.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/auto.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/cache.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/cec.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/config.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/consumer.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/debug.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/deprecations.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/drift.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/enterprise.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/eval.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/event.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/export.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/feedback.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/http.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/identity.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/index.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/integrations.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/io.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/lineage.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/lint.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/metrics.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/migrate.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/models.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/normalizer.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/observe.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/operator.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/plugins.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/policy.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/rag.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/rbac.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/redact.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/regression.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/schema.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/secrets.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/signing.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/stats.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/store.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/stream.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/testing.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/trace.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/trust.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/types.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/ulid.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/competitor-comparison.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/conf.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/contributing.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/demos/enterprise-evidence-demo.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/demos/runtime-governance-demo.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/deployment/air-gapped.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/deployment/kubernetes.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/enterprise-integrations.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/evidence-export.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/integrations/crewai.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/integrations/halluccheck.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/make.bat +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/migrations/from-langfuse.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/migrations/from-langsmith.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/migrations/from-openllmetry.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/migrations/v5-to-v6.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/audit.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/cache.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/consent.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/cost.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/diff.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/eval.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/explanation.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/feedback.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/fence.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/guard.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/hitl.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/index.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/model_registry.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/prompt.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/redact_ns.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/retrieval.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/template.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/trace.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/quickstart.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/reference-architectures.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/replay-simulation.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/rfc/adr-index.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/rfc/rfc-0001.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/runtime-governance-contracts.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/README.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/envelope.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/agent-run.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/agent-step.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/audit.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/cache.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/consent.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/cost.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/diff.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/eval.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/explanation.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/fence.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/guard.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/hitl.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/model-registry.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/prompt.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/redact.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/span.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/template.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/types/common.schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema-versioning.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/alert.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/audit.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/cache.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/custom_exporters.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/debugging.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/events.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/feedback.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/governance.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/in_memory_state.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/index.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/linting.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/metrics.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/migration.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/rag.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/redaction.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/signing.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/tracing.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/agent_workflow.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/budget_alert.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/docker/Dockerfile +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/docker/docker-compose.yml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/docker/otel-config.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/enterprise_evidence_demo.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/gates/gate5_governance.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/gates/sf-gate.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/langchain_chain.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/multi_agent_rag.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/multi_tenant.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/openai_chat.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/otlp_grafana.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/production_multi_agent.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/runtime_governance_demo.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/secure_pipeline.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/streaming_response.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/examples/testing_mocks_example.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/Chart.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/_helpers.tpl +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/deployment.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/hpa.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/networkpolicy.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/pdb.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/secret.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/service.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/values.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/k6/README.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/k6/pii_scan_50rps.js +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/k6/score_100rps.js +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/k6/secrets_scan_100rps.js +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/sonar-project.properties +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_ansi.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_batch_exporter.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_cli_cost.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_cli_phase11.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_hooks.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_server.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_span.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_store.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_stream.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_trace.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_tracer.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/actor.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/alerts.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/auto.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/baseline.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/cache.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/compliance.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/config.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/consent.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/consumer.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/core/__init__.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/core/compliance_mapping.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/core/dx.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/cost.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/debug.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/deprecations.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/drift.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/egress.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/eval.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/event.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/exceptions.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/explain.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/__init__.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/append_only.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/cloud.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/datadog.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/grafana.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/jsonl.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/openinference.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/otel_bridge.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/otlp.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/otlp_bridge.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/redis_backend.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/siem_schema.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/siem_splunk.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/siem_syslog.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/webhook.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/exporters/__init__.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/exporters/console.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/exporters/jsonl.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/exporters/sqlite.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/gate.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/hitl.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/http.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/inspect.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/__init__.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/_pricing.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/anthropic.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/azure_openai.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/bedrock.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/crewai.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/gemini.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/groq.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/langchain.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/llamaindex.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/ollama.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/openai.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/together.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/io.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/lint.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/metrics.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/metrics_export.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/migrate.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/model_registry.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/models.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/__init__.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/audit.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/cache.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/chain.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/confidence.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/consent.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/cost.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/decision.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/diff.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/drift.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/eval_.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/feedback.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/fence.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/guard.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/hitl.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/latency.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/prompt.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/redact.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/retrieval.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/runtime_governance.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/template.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/tool_call.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/trace.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/normalizer.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/plugins.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/presidio_backend.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/processor.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/prompt_registry.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/py.typed +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/redact.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/regression.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/runtime_policy.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sampling.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/schema.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/schemas/frameworks/frameworks.yaml +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/schemas/v1.0/schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/schemas/v2.0/schema.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/_base.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/_base.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/_types.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/alert.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/alert.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/audit.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/audit.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/cec.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/cec.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/config.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/config.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/enterprise.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/enterprise.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/feedback.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/gate.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/gate.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/identity.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/identity.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/lineage.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/observe.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/observe.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/operator.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/pii.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/pii.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/pipelines.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/pipelines.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/policy.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/rag.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/rbac.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/registry.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/registry.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/secrets.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/secrets.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/security.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/security.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/trust.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/trust.pyi +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/secrets.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/signing.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/stats.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/stream.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/testing.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/testing_mocks.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/trace.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/types.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/ulid.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/validate.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/workflow.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/test_agent.jsonl +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/test_events.jsonl +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/__init__.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/chaos/README.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/chaos/test_service_unavailability.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/__init__.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures/chain.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures/compliance.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures/key_security.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures/migration.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures/pii.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures/signing.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures.json +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/run_conformance.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/test_conformance.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/conftest.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/integration/__init__.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/integration/test_dx_integration.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/load/README.md +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_actor.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_alerts.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_ansi.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_auto.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_baseline.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_batch_exporter.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_benchmarks.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_budget_alert.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cache.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cli.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cli_audit_module.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cli_compliance_module.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cli_cost_module.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cli_ops_module.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cli_phase11_module.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_compliance.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_compliance_mapping.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_config_interpolate.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_consent.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_consumer.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cost_event_emission.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cost_tracker.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_costguard_gaps.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_coverage_gaps.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_deprecations.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_drift.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_e2e_cli.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_egress_and_normalizer.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_eval_behaviour_scorer.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_event.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_exceptions.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_explain.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_cloud.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_datadog.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_grafana.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_jsonl.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_otel_bridge.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_otlp.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_redis_backend.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_siem_splunk.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_siem_syslog.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_webhook.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_feedback.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_framework_mapper.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_gate_deep.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_governance.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_hitl.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_http.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_inspect.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_integration.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_integrations.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_io.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_lint.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_migrate.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_model_registry.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_models.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_namespaces.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_otlp_bridge.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase0_scale.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase10_features.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase10_trust.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase11_enterprise.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase11_security.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase12_dx.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase1_context_trace.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase2_observability.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase3_debug_sampling.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase4_agent_instrumentation.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase4_metrics_store.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase5_console_exporter.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase5_coverage.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase5_enterprise_integrations.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase5_hooks_crewai.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase6_enterprise_deployment_packaging.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase6_openai_integration.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase8_release_hardening.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_plugins.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_processor_coverage.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_prompt_registry.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_properties.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_public_root_lazy_imports.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_rag.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_redact.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_regression.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_repo_guardrails.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_rfc_namespaces.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_runtime_governance_phase0.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sampling_coverage.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_schema.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_config.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_coverage_boost.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_exporters.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_final_coverage.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_gap_filler.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_openai_integration.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_phase7_integrations.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_pipelines_deep.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_precision_coverage.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_span.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_stream.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_tracer.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_validation_coverage.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_server.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf11.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf12.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf13.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf14.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf15.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf16.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf9_config.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_alert.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_audit.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_cec.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_explain.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_gate.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_identity.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_lineage.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_observe.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_operator.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_pii.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_policy.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_policy_integration.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_policy_phase3.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_rag.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_rbac.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_scope.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_secrets.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_signing.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_stats.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_stream.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_trace_decorator.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_trace_pytest_fixtures.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_ulid.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_validate.py +0 -0
- {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_workflow.py +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"secrets_detected": false,
|
|
9
9
|
"secrets_detections_24h": 0,
|
|
10
10
|
"failures": [],
|
|
11
|
-
"timestamp": "2026-05-
|
|
12
|
-
"pipeline_id": "
|
|
11
|
+
"timestamp": "2026-05-10T04:04:09.036213+00:00",
|
|
12
|
+
"pipeline_id": "d306e1c3-c437-4317-9c71-6532e5cac4a4",
|
|
13
13
|
"project_id": ""
|
|
14
14
|
}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
"metrics": {
|
|
5
5
|
"score": 0.95
|
|
6
6
|
},
|
|
7
|
-
"timestamp": "2026-05-
|
|
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
|
|
@@ -118,8 +118,8 @@ Description-Content-Type: text/markdown
|
|
|
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
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-
|
|
122
|
-
<img src="https://img.shields.io/badge/version-1.0.
|
|
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>
|
|
@@ -181,8 +181,12 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
181
181
|
</td>
|
|
182
182
|
<td width="50%">
|
|
183
183
|
|
|
184
|
-
### Privacy & Audit Infrastructure
|
|
185
|
-
- **
|
|
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
|
|
186
190
|
- **Air-gapped deployment** — runs fully offline with zero egress
|
|
187
191
|
|
|
188
192
|
</td>
|
|
@@ -194,7 +198,7 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
194
198
|
- **Consent boundary monitoring** — `consent.granted`, `consent.revoked`, `consent.violation` events
|
|
195
199
|
- **Human-in-the-loop hooks** — `hitl.queued`, `hitl.reviewed`, `hitl.escalated`, `hitl.timeout` events
|
|
196
200
|
- **Model registry** — register, deprecate, retire models; attestations auto-warn on ungoverned models
|
|
197
|
-
- **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.
|
|
198
202
|
|
|
199
203
|
</td>
|
|
200
204
|
<td>
|
|
@@ -210,7 +214,10 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
210
214
|
- **Auto-instrumentation** — patch OpenAI, Anthropic, LangChain, CrewAI, and more; `@trace_rag` decorator and automatic LlamaIndex/LangChain retriever instrumentation for zero-change RAG tracing
|
|
211
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
|
|
212
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
|
|
213
|
-
-
|
|
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
|
|
214
221
|
|
|
215
222
|
</td>
|
|
216
223
|
</tr>
|
|
@@ -522,7 +529,7 @@ verdict = sf_gate.evaluate("schema-validation", event.to_dict())
|
|
|
522
529
|
print(verdict.verdict) # GateVerdict.PASS
|
|
523
530
|
|
|
524
531
|
# Standalone PRRI evaluation
|
|
525
|
-
prri = sf_gate.evaluate_prri(prri_score=28
|
|
532
|
+
prri = sf_gate.evaluate_prri("my-agent", prri_score=28)
|
|
526
533
|
print(prri.verdict) # PRRIVerdict.GREEN
|
|
527
534
|
|
|
528
535
|
# Composite trust gate — checks HRI rate, PII, and secrets windows
|
|
@@ -686,8 +693,8 @@ from spanforge.sdk.pipelines import (
|
|
|
686
693
|
result = score_pipeline("The model output to check", model="gpt-4o")
|
|
687
694
|
print(result.audit_id, result.details)
|
|
688
695
|
|
|
689
|
-
# Risk pipeline: PRRI
|
|
690
|
-
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")
|
|
691
698
|
print(result.details["verdict"]) # "RED"
|
|
692
699
|
```
|
|
693
700
|
|
|
@@ -724,7 +731,7 @@ with mock_all_services():
|
|
|
724
731
|
sf_audit.append({"score": 0.92}, schema_key="halluccheck.score.v1")
|
|
725
732
|
assert len(sf_audit.calls) == 1 # inspect recorded calls
|
|
726
733
|
|
|
727
|
-
prri = sf_gate.evaluate_prri(prri_score=28
|
|
734
|
+
prri = sf_gate.evaluate_prri("my-agent", prri_score=28)
|
|
728
735
|
assert prri.allow # GREEN by default
|
|
729
736
|
```
|
|
730
737
|
|
|
@@ -922,6 +929,15 @@ await stream.drain(GrafanaLokiExporter(url="http://loki:3100")) # Grafana Lo
|
|
|
922
929
|
await stream.drain(CloudExporter(api_key="sf_live_xxx")) # spanforge Cloud
|
|
923
930
|
await stream.drain(SplunkHECExporter()) # Splunk HEC (env-var config)
|
|
924
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
|
|
925
941
|
```
|
|
926
942
|
|
|
927
943
|
Fan-out routing for compliance alerting:
|
|
@@ -965,6 +981,10 @@ spanforge scan events.jsonl --fail-on-match # CI-gate PII scan
|
|
|
965
981
|
spanforge secrets scan <file> # scan file for secrets (exit 0=clean, 1=found)
|
|
966
982
|
spanforge secrets scan <file> --format sarif # SARIF output for GitHub Code Scanning
|
|
967
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
|
|
968
988
|
|
|
969
989
|
# Event generation
|
|
970
990
|
spanforge event create --type llm.trace.span.completed --count 10 --format jsonl # generate test events
|
|
@@ -974,13 +994,22 @@ spanforge check # 9-step end-to-end health check
|
|
|
974
994
|
spanforge check-compat events.json # v2.0 compatibility
|
|
975
995
|
spanforge validate events.jsonl # JSON Schema validation
|
|
976
996
|
spanforge validate events.jsonl --report detailed --format json # detailed report
|
|
977
|
-
spanforge validate --dataset training.jsonl # scan
|
|
978
|
-
spanforge validate --dataset training.jsonl --
|
|
979
|
-
spanforge validate --dataset training.jsonl --
|
|
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])
|
|
980
1000
|
|
|
981
1001
|
# Configuration
|
|
982
|
-
spanforge config
|
|
983
|
-
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
|
|
984
1013
|
|
|
985
1014
|
# Analysis
|
|
986
1015
|
spanforge stats events.jsonl # counts, tokens, cost
|
|
@@ -1081,7 +1110,7 @@ spanforge/
|
|
|
1081
1110
|
+-- _store.py — TraceStore ring buffer
|
|
1082
1111
|
+-- _hooks.py — HookRegistry (lifecycle hooks)
|
|
1083
1112
|
+-- _server.py — HTTP server (/traces, /compliance/summary)
|
|
1084
|
-
+-- _cli.py ←
|
|
1113
|
+
+-- _cli.py ← 39 CLI sub-commands
|
|
1085
1114
|
+-- workflow.py — Human-in-the-Loop Workflow Engine (CORE-15); WorkflowEngine, WorkflowType, state machine, SLA escalation
|
|
1086
1115
|
+-- cost.py — CostTracker, BudgetMonitor, @budget_alert
|
|
1087
1116
|
+-- cache.py — SemanticCache, @cached decorator
|
|
@@ -1210,6 +1239,11 @@ spanforge/
|
|
|
1210
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>
|
|
1211
1240
|
<td>Security / compliance teams</td>
|
|
1212
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>
|
|
1213
1247
|
<tr>
|
|
1214
1248
|
<td><code>spanforge.stream</code></td>
|
|
1215
1249
|
<td>Fan-out router — one <code>drain()</code> call reaches multiple backends; Kafka source</td>
|
|
@@ -1217,7 +1251,7 @@ spanforge/
|
|
|
1217
1251
|
</tr>
|
|
1218
1252
|
<tr>
|
|
1219
1253
|
<td><code>spanforge.integrations</code></td>
|
|
1220
|
-
<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>
|
|
1221
1255
|
<td>App developers</td>
|
|
1222
1256
|
</tr>
|
|
1223
1257
|
<tr>
|
|
@@ -1391,7 +1425,7 @@ spanforge/
|
|
|
1391
1425
|
</tr>
|
|
1392
1426
|
<tr>
|
|
1393
1427
|
<td><code>spanforge.sdk.gate</code></td>
|
|
1394
|
-
<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>
|
|
1395
1429
|
<td>DevOps / CI / platform teams</td>
|
|
1396
1430
|
</tr>
|
|
1397
1431
|
<tr>
|
|
@@ -1416,7 +1450,7 @@ spanforge/
|
|
|
1416
1450
|
</tr>
|
|
1417
1451
|
<tr>
|
|
1418
1452
|
<td><code>spanforge.sdk.pipelines</code></td>
|
|
1419
|
-
<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>
|
|
1420
1454
|
<td>ML / eval / platform teams</td>
|
|
1421
1455
|
</tr>
|
|
1422
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>
|
|
@@ -1434,7 +1468,7 @@ spanforge/
|
|
|
1434
1468
|
|
|
1435
1469
|
## Quality
|
|
1436
1470
|
|
|
1437
|
-
- **
|
|
1471
|
+
- **7 049 tests** passing (7 skipped) — unit, integration, property-based (Hypothesis), performance benchmarks
|
|
1438
1472
|
- **≥ 91% line and branch coverage** — 90% minimum enforced in CI
|
|
1439
1473
|
- **Zero required dependencies** — entire core runs on Python stdlib
|
|
1440
1474
|
- **Typed** — full `py.typed` marker; mypy + pyright clean
|
|
@@ -1450,7 +1484,7 @@ git clone https://github.com/veerarag1973/spanforge.git
|
|
|
1450
1484
|
cd spanforge
|
|
1451
1485
|
python -m venv .venv && .venv\Scripts\activate
|
|
1452
1486
|
pip install -e ".[dev]"
|
|
1453
|
-
pytest #
|
|
1487
|
+
pytest # 7 049 tests
|
|
1454
1488
|
```
|
|
1455
1489
|
|
|
1456
1490
|
<details>
|
|
@@ -14,8 +14,8 @@
|
|
|
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
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-
|
|
18
|
-
<img src="https://img.shields.io/badge/version-1.0.
|
|
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>
|
|
@@ -77,8 +77,12 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
77
77
|
</td>
|
|
78
78
|
<td width="50%">
|
|
79
79
|
|
|
80
|
-
### Privacy & Audit Infrastructure
|
|
81
|
-
- **
|
|
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
|
|
82
86
|
- **Air-gapped deployment** — runs fully offline with zero egress
|
|
83
87
|
|
|
84
88
|
</td>
|
|
@@ -90,7 +94,7 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
90
94
|
- **Consent boundary monitoring** — `consent.granted`, `consent.revoked`, `consent.violation` events
|
|
91
95
|
- **Human-in-the-loop hooks** — `hitl.queued`, `hitl.reviewed`, `hitl.escalated`, `hitl.timeout` events
|
|
92
96
|
- **Model registry** — register, deprecate, retire models; attestations auto-warn on ungoverned models
|
|
93
|
-
- **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.
|
|
94
98
|
|
|
95
99
|
</td>
|
|
96
100
|
<td>
|
|
@@ -106,7 +110,10 @@ spanforge.configure() # that's it — you're now compliant-by-default
|
|
|
106
110
|
- **Auto-instrumentation** — patch OpenAI, Anthropic, LangChain, CrewAI, and more; `@trace_rag` decorator and automatic LlamaIndex/LangChain retriever instrumentation for zero-change RAG tracing
|
|
107
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
|
|
108
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
|
|
109
|
-
-
|
|
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
|
|
110
117
|
|
|
111
118
|
</td>
|
|
112
119
|
</tr>
|
|
@@ -418,7 +425,7 @@ verdict = sf_gate.evaluate("schema-validation", event.to_dict())
|
|
|
418
425
|
print(verdict.verdict) # GateVerdict.PASS
|
|
419
426
|
|
|
420
427
|
# Standalone PRRI evaluation
|
|
421
|
-
prri = sf_gate.evaluate_prri(prri_score=28
|
|
428
|
+
prri = sf_gate.evaluate_prri("my-agent", prri_score=28)
|
|
422
429
|
print(prri.verdict) # PRRIVerdict.GREEN
|
|
423
430
|
|
|
424
431
|
# Composite trust gate — checks HRI rate, PII, and secrets windows
|
|
@@ -582,8 +589,8 @@ from spanforge.sdk.pipelines import (
|
|
|
582
589
|
result = score_pipeline("The model output to check", model="gpt-4o")
|
|
583
590
|
print(result.audit_id, result.details)
|
|
584
591
|
|
|
585
|
-
# Risk pipeline: PRRI
|
|
586
|
-
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")
|
|
587
594
|
print(result.details["verdict"]) # "RED"
|
|
588
595
|
```
|
|
589
596
|
|
|
@@ -620,7 +627,7 @@ with mock_all_services():
|
|
|
620
627
|
sf_audit.append({"score": 0.92}, schema_key="halluccheck.score.v1")
|
|
621
628
|
assert len(sf_audit.calls) == 1 # inspect recorded calls
|
|
622
629
|
|
|
623
|
-
prri = sf_gate.evaluate_prri(prri_score=28
|
|
630
|
+
prri = sf_gate.evaluate_prri("my-agent", prri_score=28)
|
|
624
631
|
assert prri.allow # GREEN by default
|
|
625
632
|
```
|
|
626
633
|
|
|
@@ -818,6 +825,15 @@ await stream.drain(GrafanaLokiExporter(url="http://loki:3100")) # Grafana Lo
|
|
|
818
825
|
await stream.drain(CloudExporter(api_key="sf_live_xxx")) # spanforge Cloud
|
|
819
826
|
await stream.drain(SplunkHECExporter()) # Splunk HEC (env-var config)
|
|
820
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
|
|
821
837
|
```
|
|
822
838
|
|
|
823
839
|
Fan-out routing for compliance alerting:
|
|
@@ -861,6 +877,10 @@ spanforge scan events.jsonl --fail-on-match # CI-gate PII scan
|
|
|
861
877
|
spanforge secrets scan <file> # scan file for secrets (exit 0=clean, 1=found)
|
|
862
878
|
spanforge secrets scan <file> --format sarif # SARIF output for GitHub Code Scanning
|
|
863
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
|
|
864
884
|
|
|
865
885
|
# Event generation
|
|
866
886
|
spanforge event create --type llm.trace.span.completed --count 10 --format jsonl # generate test events
|
|
@@ -870,13 +890,22 @@ spanforge check # 9-step end-to-end health check
|
|
|
870
890
|
spanforge check-compat events.json # v2.0 compatibility
|
|
871
891
|
spanforge validate events.jsonl # JSON Schema validation
|
|
872
892
|
spanforge validate events.jsonl --report detailed --format json # detailed report
|
|
873
|
-
spanforge validate --dataset training.jsonl # scan
|
|
874
|
-
spanforge validate --dataset training.jsonl --
|
|
875
|
-
spanforge validate --dataset training.jsonl --
|
|
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])
|
|
876
896
|
|
|
877
897
|
# Configuration
|
|
878
|
-
spanforge config
|
|
879
|
-
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
|
|
880
909
|
|
|
881
910
|
# Analysis
|
|
882
911
|
spanforge stats events.jsonl # counts, tokens, cost
|
|
@@ -977,7 +1006,7 @@ spanforge/
|
|
|
977
1006
|
+-- _store.py — TraceStore ring buffer
|
|
978
1007
|
+-- _hooks.py — HookRegistry (lifecycle hooks)
|
|
979
1008
|
+-- _server.py — HTTP server (/traces, /compliance/summary)
|
|
980
|
-
+-- _cli.py ←
|
|
1009
|
+
+-- _cli.py ← 39 CLI sub-commands
|
|
981
1010
|
+-- workflow.py — Human-in-the-Loop Workflow Engine (CORE-15); WorkflowEngine, WorkflowType, state machine, SLA escalation
|
|
982
1011
|
+-- cost.py — CostTracker, BudgetMonitor, @budget_alert
|
|
983
1012
|
+-- cache.py — SemanticCache, @cached decorator
|
|
@@ -1106,6 +1135,11 @@ spanforge/
|
|
|
1106
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>
|
|
1107
1136
|
<td>Security / compliance teams</td>
|
|
1108
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>
|
|
1109
1143
|
<tr>
|
|
1110
1144
|
<td><code>spanforge.stream</code></td>
|
|
1111
1145
|
<td>Fan-out router — one <code>drain()</code> call reaches multiple backends; Kafka source</td>
|
|
@@ -1113,7 +1147,7 @@ spanforge/
|
|
|
1113
1147
|
</tr>
|
|
1114
1148
|
<tr>
|
|
1115
1149
|
<td><code>spanforge.integrations</code></td>
|
|
1116
|
-
<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>
|
|
1117
1151
|
<td>App developers</td>
|
|
1118
1152
|
</tr>
|
|
1119
1153
|
<tr>
|
|
@@ -1287,7 +1321,7 @@ spanforge/
|
|
|
1287
1321
|
</tr>
|
|
1288
1322
|
<tr>
|
|
1289
1323
|
<td><code>spanforge.sdk.gate</code></td>
|
|
1290
|
-
<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>
|
|
1291
1325
|
<td>DevOps / CI / platform teams</td>
|
|
1292
1326
|
</tr>
|
|
1293
1327
|
<tr>
|
|
@@ -1312,7 +1346,7 @@ spanforge/
|
|
|
1312
1346
|
</tr>
|
|
1313
1347
|
<tr>
|
|
1314
1348
|
<td><code>spanforge.sdk.pipelines</code></td>
|
|
1315
|
-
<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>
|
|
1316
1350
|
<td>ML / eval / platform teams</td>
|
|
1317
1351
|
</tr>
|
|
1318
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>
|
|
@@ -1330,7 +1364,7 @@ spanforge/
|
|
|
1330
1364
|
|
|
1331
1365
|
## Quality
|
|
1332
1366
|
|
|
1333
|
-
- **
|
|
1367
|
+
- **7 049 tests** passing (7 skipped) — unit, integration, property-based (Hypothesis), performance benchmarks
|
|
1334
1368
|
- **≥ 91% line and branch coverage** — 90% minimum enforced in CI
|
|
1335
1369
|
- **Zero required dependencies** — entire core runs on Python stdlib
|
|
1336
1370
|
- **Typed** — full `py.typed` marker; mypy + pyright clean
|
|
@@ -1346,7 +1380,7 @@ git clone https://github.com/veerarag1973/spanforge.git
|
|
|
1346
1380
|
cd spanforge
|
|
1347
1381
|
python -m venv .venv && .venv\Scripts\activate
|
|
1348
1382
|
pip install -e ".[dev]"
|
|
1349
|
-
pytest #
|
|
1383
|
+
pytest # 7 049 tests
|
|
1350
1384
|
```
|
|
1351
1385
|
|
|
1352
1386
|
<details>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# spanforge SDK — Release Runbook
|
|
2
2
|
# PyPI distribution: spanforge | Import: spanforge
|
|
3
|
-
# Latest: 1.0.
|
|
3
|
+
# Latest: 1.0.2 — see docs/changelog.md for version history
|
|
4
4
|
# This file documents the general release process (originally written for 1.0.0).
|
|
5
5
|
#
|
|
6
6
|
# STATUS: READY TO PUBLISH
|