spanforge 1.0.3__tar.gz → 1.0.4__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.3 → spanforge-1.0.4}/.sf-gate/artifacts/gate6_trust_result.json +2 -2
- {spanforge-1.0.3 → spanforge-1.0.4}/.sf-gate/artifacts/test-gate_result.json +2 -2
- {spanforge-1.0.3 → spanforge-1.0.4}/PKG-INFO +3 -3
- {spanforge-1.0.3 → spanforge-1.0.4}/README.md +2 -2
- {spanforge-1.0.3 → spanforge-1.0.4}/RELEASE.md +1 -1
- {spanforge-1.0.3 → spanforge-1.0.4}/artifacts/g1_result.json +2 -2
- {spanforge-1.0.3 → spanforge-1.0.4}/artifacts/gate5_governance_result.json +1 -1
- {spanforge-1.0.3 → spanforge-1.0.4}/artifacts/gate6_trust_result.json +2 -2
- spanforge-1.0.4/bandit_out.txt +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/changelog.md +100 -11
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/index.md +1 -1
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/installation.md +1 -1
- spanforge-1.0.4/mypy_out.txt +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/pyproject.toml +1 -1
- spanforge-1.0.4/ruff_out.txt +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/baseline.py +87 -0
- spanforge-1.0.4/src/spanforge/schemas/__init__.py +96 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/__init__.py +8 -1
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/_exceptions.py +36 -8
- spanforge-1.0.4/src/spanforge/sdk/_factory.py +150 -0
- spanforge-1.0.4/src/spanforge/sdk/_pipeline_builder.py +221 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/_types.py +121 -112
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/audit.py +137 -9
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/cec.py +96 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/testing.py +168 -0
- spanforge-1.0.4/test_full.txt +0 -0
- spanforge-1.0.4/test_new.txt +0 -0
- spanforge-1.0.4/test_out.txt +0 -0
- spanforge-1.0.4/tests/test_next_sdk_features.py +697 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.bandit +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.gitattributes +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.github/CODEOWNERS +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.github/ISSUE_TEMPLATE/rfc.yml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.github/pull_request_template.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.github/workflows/ci.yml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.github/workflows/release.yml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.gitignore +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.pre-commit-hooks.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.sf-gate/artifacts/g1_result.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/.sf-gate/artifacts/gate5_governance_result.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/CNAME +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/CODE_OF_CONDUCT.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/CONFORMANCE.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/LICENSE +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/MAINTAINERS.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/PRICING.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/SECURITY.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/SPANFORGE_COMPLETE_Master_Build_Plan_v6_FULL.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docker-compose.selfhosted.yml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/Makefile +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/_static/.gitkeep +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-001-immutable-audit-trail.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-002-singleton-service-clients.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-003-schema-versioning-strategy.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-004-local-first-architecture.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-005-sandbox-mode.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-006-rag-tracing.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-007-user-feedback.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-008-sso-scim-oidc.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/README.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/alert.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/audit.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/auto.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/cache.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/cec.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/compliance.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/config.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/consumer.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/debug.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/deprecations.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/drift.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/enterprise.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/eval.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/event.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/exceptions.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/explain.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/export.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/feedback.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/gate.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/governance.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/hooks.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/http.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/identity.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/index.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/integrations.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/io.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/lineage.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/lint.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/metrics.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/migrate.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/models.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/normalizer.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/observe.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/operator.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/pii.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/pipelines.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/plugins.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/policy.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/rag.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/rbac.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/redact.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/regression.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/schema.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/scope.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/sdk-reference.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/secrets.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/signing.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/stats.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/store.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/stream.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/testing.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/testing_mocks.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/trace.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/trust.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/types.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/ulid.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/validate.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/cli.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/competitor-comparison.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/conf.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/configuration.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/contributing.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/demos/enterprise-evidence-demo.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/demos/runtime-governance-demo.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/deployment/air-gapped.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/deployment/kubernetes.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/enterprise-integrations.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/evidence-export.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/ga-release-notes.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/integrations/crewai.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/integrations/halluccheck.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/make.bat +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/migrations/from-langfuse.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/migrations/from-langsmith.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/migrations/from-openllmetry.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/migrations/v5-to-v6.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/audit.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/cache.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/consent.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/cost.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/diff.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/eval.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/explanation.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/feedback.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/fence.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/guard.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/hitl.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/index.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/model_registry.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/prompt.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/redact_ns.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/retrieval.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/template.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/trace.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/quickstart.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/reference-architectures.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/replay-simulation.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/rfc/adr-index.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/rfc/rfc-0001.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/runbook.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/runtime-governance-contracts.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/runtime-governance.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/README.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/envelope.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/agent-run.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/agent-step.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/audit.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/cache.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/consent.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/cost.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/diff.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/eval.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/explanation.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/fence.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/guard.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/hitl.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/model-registry.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/prompt.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/redact.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/span.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/template.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/types/common.schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema-versioning.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/alert.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/audit.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/cache.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/compliance.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/custom_exporters.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/debugging.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/events.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/export.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/feedback.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/gate.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/governance.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/in_memory_state.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/index.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/linting.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/metrics.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/migration.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/rag.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/redaction.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/signing.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/tracing.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/agent_workflow.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/budget_alert.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/docker/Dockerfile +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/docker/docker-compose.yml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/docker/otel-config.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/enterprise_evidence_demo.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/explain_demo.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/gates/gate5_governance.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/gates/sf-gate.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/langchain_chain.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/multi_agent_rag.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/multi_tenant.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/openai_chat.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/otlp_grafana.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/production_multi_agent.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/runtime_governance_demo.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/scope_demo.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/scope_manifest.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/secure_pipeline.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/streaming_response.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/testing_mocks_example.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/examples/validate_demo.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/Chart.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/_helpers.tpl +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/deployment.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/hpa.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/networkpolicy.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/pdb.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/secret.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/service.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/values.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/k6/README.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/k6/pii_scan_50rps.js +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/k6/score_100rps.js +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/k6/secrets_scan_100rps.js +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/sonar-project.properties +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/__init__.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_ansi.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_batch_exporter.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli_audit.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli_compliance.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli_config.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli_cost.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli_ops.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli_phase11.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_hooks.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_server.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_span.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_store.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_stream.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_trace.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_tracer.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/actor.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/alerts.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/auto.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/cache.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/compliance.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/config.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/consent.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/consumer.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/core/__init__.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/core/compliance_mapping.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/core/dx.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/cost.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/debug.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/deprecations.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/drift.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/egress.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/eval.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/event.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/exceptions.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/explain.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/__init__.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/append_only.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/cloud.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/datadog.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/grafana.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/jsonl.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/openinference.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/otel_bridge.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/otlp.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/otlp_bridge.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/redis_backend.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/siem.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/siem_schema.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/siem_splunk.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/siem_syslog.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/webhook.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/exporters/__init__.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/exporters/console.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/exporters/jsonl.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/exporters/sqlite.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/gate.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/governance.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/hitl.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/http.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/inspect.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/__init__.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/_pricing.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/anthropic.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/azure_openai.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/bedrock.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/crewai.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/gemini.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/groq.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/langchain.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/langgraph.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/llamaindex.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/ollama.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/openai.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/together.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/io.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/lint.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/metrics.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/metrics_export.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/migrate.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/model_registry.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/models.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/__init__.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/audit.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/cache.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/chain.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/confidence.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/consent.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/cost.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/decision.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/diff.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/drift.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/eval_.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/feedback.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/fence.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/guard.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/hitl.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/latency.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/prompt.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/redact.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/retrieval.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/runtime_governance.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/template.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/tool_call.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/trace.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/normalizer.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/plugins.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/presidio_backend.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/processor.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/prompt_registry.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/py.typed +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/redact.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/regression.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/runtime_policy.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sampling.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/schema.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/schemas/frameworks/frameworks.yaml +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/schemas/v1.0/schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/schemas/v2.0/schema.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/_base.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/_base.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/alert.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/alert.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/audit.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/cec.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/config.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/config.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/dataset_scanner.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/enterprise.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/enterprise.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/explain.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/fallback.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/feedback.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/gate.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/gate.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/identity.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/identity.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/lineage.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/observe.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/observe.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/operator.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/pii.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/pii.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/pipelines.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/pipelines.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/policy.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/rag.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/rbac.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/registry.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/registry.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/scope.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/secrets.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/secrets.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/security.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/security.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/trust.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/trust.pyi +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/validate.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/secrets.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/signing.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/stats.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/stream.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/testing_mocks.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/trace.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/types.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/ulid.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/validate.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/workflow.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/test_agent.jsonl +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/test_events.jsonl +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/__init__.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/chaos/README.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/chaos/test_service_unavailability.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/__init__.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures/chain.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures/compliance.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures/key_security.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures/migration.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures/pii.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures/signing.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures.json +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/run_conformance.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/test_conformance.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/conftest.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/fixtures/clean_dataset/data.jsonl +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/fixtures/no_consent_dataset/data.jsonl +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/fixtures/pii_dataset/data.jsonl +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/integration/__init__.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/integration/test_dx_integration.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/load/README.md +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_1e1_siem_langgraph.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_actor.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_alerts.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_ansi.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_auto.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_baseline.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_batch_exporter.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_benchmarks.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_budget_alert.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cache.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_audit_module.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_compliance_dataset.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_compliance_module.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_config_1d1.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_cost_module.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_ops_module.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_phase11_module.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_compliance.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_compliance_mapping.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_config_interpolate.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_consent.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_consumer.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cost_event_emission.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cost_tracker.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_costguard_gaps.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_coverage_gaps.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_coverage_supplement_1.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_coverage_supplement_2.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_coverage_supplement_3.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_coverage_supplement_4.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_dataset_scanner.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_deprecations.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_drift.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_e2e_cli.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_egress_and_normalizer.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_eval_behaviour_scorer.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_event.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_exceptions.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_explain.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_cloud.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_datadog.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_grafana.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_jsonl.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_otel_bridge.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_otlp.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_redis_backend.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_siem_splunk.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_siem_syslog.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_webhook.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_feedback.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_framework_mapper.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_gate_deep.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_governance.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_hitl.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_http.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_inspect.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_integration.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_integrations.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_io.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_lint.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_migrate.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_model_registry.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_models.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_namespaces.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_otlp_bridge.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase0_scale.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase10_features.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase10_trust.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase11_enterprise.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase11_security.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase12_dx.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase1_context_trace.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase2_observability.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase3_debug_sampling.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase4_agent_instrumentation.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase4_metrics_store.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase5_console_exporter.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase5_coverage.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase5_enterprise_integrations.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase5_hooks_crewai.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase6_enterprise_deployment_packaging.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase6_openai_integration.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase8_release_hardening.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_plugins.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_processor_coverage.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_prompt_registry.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_properties.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_public_root_lazy_imports.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_rag.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_redact.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_regression.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_repo_guardrails.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_rfc_namespaces.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_runtime_governance_phase0.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sampling_coverage.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_schema.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_config.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_coverage_boost.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_explain.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_exporters.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_final_coverage.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_gap_filler.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_openai_integration.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_phase7_integrations.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_pipelines_deep.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_precision_coverage.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_scope.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_span.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_stream.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_tracer.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_validate.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_validation_coverage.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_server.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf11.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf12.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf13.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf14.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf15.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf16.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf9_config.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_alert.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_audit.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_cec.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_explain.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_gate.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_identity.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_lineage.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_observe.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_operator.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_pii.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_policy.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_policy_integration.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_policy_phase3.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_rag.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_rbac.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_scope.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_secrets.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_signing.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_stats.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_stream.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_trace_decorator.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_trace_pytest_fixtures.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_types.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_ulid.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_validate.py +0 -0
- {spanforge-1.0.3 → spanforge-1.0.4}/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-19T01:26:18.801481+00:00",
|
|
12
|
+
"pipeline_id": "4f0fecb2-3f5b-47d8-91d9-af4732add7d7",
|
|
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-19T01:25:42.885005+00:00",
|
|
8
8
|
"duration_ms": 0,
|
|
9
9
|
"project_id": "",
|
|
10
|
-
"pipeline_id": "
|
|
10
|
+
"pipeline_id": "9aa2ff1b-3ba1-4e3c-828e-521a8e28db2f"
|
|
11
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: spanforge
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.4
|
|
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-7095%20passing-brightgreen" alt="7095 tests"/>
|
|
122
|
+
<img src="https://img.shields.io/badge/version-1.0.4-4c8cbf" alt="Version 1.0.4"/>
|
|
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-MIT-blue" alt="MIT License"/></a>
|
|
@@ -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-7095%20passing-brightgreen" alt="7095 tests"/>
|
|
18
|
+
<img src="https://img.shields.io/badge/version-1.0.4-4c8cbf" alt="Version 1.0.4"/>
|
|
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-MIT-blue" alt="MIT License"/></a>
|
|
@@ -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.4 — 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
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
"metrics": {
|
|
5
5
|
"score": 0.8
|
|
6
6
|
},
|
|
7
|
-
"timestamp": "2026-05-
|
|
7
|
+
"timestamp": "2026-05-19T01:26:04.752717+00:00",
|
|
8
8
|
"duration_ms": 0,
|
|
9
9
|
"project_id": "",
|
|
10
|
-
"pipeline_id": "
|
|
10
|
+
"pipeline_id": "d422f0ad-be37-4ced-8502-8b74b493439e"
|
|
11
11
|
}
|
|
@@ -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-19T01:26:04.764375+00:00",
|
|
12
|
+
"pipeline_id": "4d484d6e-c4d8-4c58-9b14-0deb40c5fd53",
|
|
13
13
|
"project_id": "proj-1"
|
|
14
14
|
}
|
|
Binary file
|
|
@@ -6,7 +6,104 @@ this project adheres to [Semantic Versioning](https://semver.org/).
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## 1.0.4 — 2026-05-19
|
|
10
|
+
|
|
11
|
+
**SDK Developer-Experience Enhancements (10 features) · Code Quality · Bug Fix**
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **`SFClientFactory`** (`spanforge.sdk._factory`) — single factory that vends all 8 SpanForge
|
|
16
|
+
clients (`pii`, `secrets`, `audit`, `cec`, `gate`, `observe`, `alert`, `identity`) from one
|
|
17
|
+
`SFClientConfig`. Lazy `@property` instantiation with `from_env()` classmethod. Eliminates
|
|
18
|
+
repetitive per-client boilerplate in application setup.
|
|
19
|
+
|
|
20
|
+
- **`SFPipeline`** (`spanforge.sdk._pipeline_builder`) — composable middleware builder.
|
|
21
|
+
Chain any callable or SpanForge client (resolved via `scan` / `check` / `evaluate` / `emit` /
|
|
22
|
+
`append` / `publish` entry-point lookup) using `.add_stage()`. `.run(payload)` returns an
|
|
23
|
+
`SFPipelineResult` dataclass with `success`, `payload`, `errors`, `outputs`, `elapsed_ms`.
|
|
24
|
+
Supports `fail_fast=True` mode. Exported as `SFPipeline`, `SFPipelineResult`,
|
|
25
|
+
`PipelineStageError` from `spanforge.sdk`.
|
|
26
|
+
|
|
27
|
+
- **`SFCompositeAuditSink`** (`spanforge.sdk.audit`) — fan-out audit sink that writes to an
|
|
28
|
+
in-memory `AuditStream` and a remote `SFAuditClient` simultaneously. In-memory write is always
|
|
29
|
+
attempted; remote write failure is suppressed when `fail_silent=True` (default), returning a
|
|
30
|
+
synthetic `AuditAppendResult(backend="local")`. Raises on failure when `fail_silent=False`.
|
|
31
|
+
Exported from `spanforge.sdk`.
|
|
32
|
+
|
|
33
|
+
- **`spanforge.schemas` constants module** — 12 canonical schema key string constants:
|
|
34
|
+
`TRACE_V1`, `PII_V1`, `SECRETS_V1`, `AUDIT_V1`, `CONSENT_V1`, `SCORE_V1`, `BIAS_V1`,
|
|
35
|
+
`PRRI_V1`, `DRIFT_V1`, `GATE_V1`, `TRUST_V1`, `ALERT_V1`. Eliminates typos and enables IDE
|
|
36
|
+
auto-complete everywhere a `schema_key` argument is accepted.
|
|
37
|
+
|
|
38
|
+
- **`spanforge.testing` mock factories** — 8 zero-argument factory functions: `fake_pii_client`,
|
|
39
|
+
`fake_secrets_client`, `fake_audit_client`, `fake_cec_client`, `fake_gate_client`,
|
|
40
|
+
`fake_observe_client`, `fake_alert_client`, `fake_identity_client`. Each returns a
|
|
41
|
+
pre-configured mock client ready for use in unit tests without network or credentials.
|
|
42
|
+
All exported from `spanforge.testing.__all__`.
|
|
43
|
+
|
|
44
|
+
- **`SFCECClient.export_local(path, *, project_id="")`** (`spanforge.sdk.cec`) — exports the
|
|
45
|
+
in-memory compliance evidence chain to a local NDJSON file. Output includes one JSON record per
|
|
46
|
+
evidence item plus a HMAC-signed manifest line (`schema: spanforge.cec.local.v1`). Accepts
|
|
47
|
+
`str` or `pathlib.Path`; creates parent directories automatically. Returns `ExportResult`.
|
|
48
|
+
Raises `SFCECExportError` on `OSError`.
|
|
49
|
+
|
|
50
|
+
- **`PIIEntity.entity_type` property** (`spanforge.sdk._types`) — backward-compatible alias for
|
|
51
|
+
`PIIEntity.type`. Enables code that uses the more descriptive `.entity_type` attribute name
|
|
52
|
+
without breaking any existing `.type` usage.
|
|
53
|
+
|
|
54
|
+
- **TSC-criterion labels on exceptions** — `SFError.__init__` gains an optional
|
|
55
|
+
`tsc_criterion: str` keyword; the value is stored as `SFError.tsc_criterion`. Four subclasses
|
|
56
|
+
set SOC 2 TSC defaults: `SFPIIBlockedError` → `"CC6.6"`, `SFSecretsBlockedError` → `"CC6.7"`,
|
|
57
|
+
`SFGateEvaluationError` → `"CC7.2"`, `SFGateTrustFailedError` → `"CC7.4"`. Lets exception
|
|
58
|
+
handlers route directly to the relevant compliance criterion.
|
|
59
|
+
|
|
60
|
+
- **`BehaviouralBaseline.fit(observations, *, window_seconds=86400.0)`** (`spanforge.baseline`)
|
|
61
|
+
— fits a `BehaviouralBaseline` instance in-place from an iterable of raw observation dicts.
|
|
62
|
+
Each dict may contain any combination of `token_count`, `latency_ms`, `operation`,
|
|
63
|
+
`confidence_score`, `decision_type`, `tool_name` keys. Updates `tokens`, `latency_by_operation`,
|
|
64
|
+
`confidence_by_type`, `tool_rate_per_hour`, `decision_rate_per_hour`, `event_count`,
|
|
65
|
+
`window_seconds`, and `recorded_at`. Accepts generators (consumed once).
|
|
66
|
+
|
|
67
|
+
- **`py.typed` PEP 561 marker** — `src/spanforge/py.typed` confirmed present; the package is
|
|
68
|
+
fully typed and recognized by mypy, pyright, and other type checkers with no extra configuration.
|
|
69
|
+
|
|
70
|
+
### Fixed
|
|
71
|
+
|
|
72
|
+
- **`fake_gate_client()` bug** — `GateEvaluationResult` was constructed with non-existent fields
|
|
73
|
+
(`score`, `details`, `artifacts`). Corrected to the actual signature (`metrics`, `artifact_url`,
|
|
74
|
+
`duration_ms: int`). The function now works correctly in tests.
|
|
75
|
+
|
|
76
|
+
### Tests
|
|
77
|
+
|
|
78
|
+
- **`tests/test_next_sdk_features.py`** — 66 new targeted tests covering all 10 SDK features
|
|
79
|
+
across 9 test classes (`TestSchemaConstants`, `TestSFClientFactory`, `TestSFPipeline`,
|
|
80
|
+
`TestSFCompositeAuditSink`, `TestExportLocal`, `TestPIIEntityAlias`, `TestTSCExceptions`,
|
|
81
|
+
`TestBehaviouralBaselineFit`, `TestTestingFactories`).
|
|
82
|
+
- **Total:** 7095 passing, 8 skipped · **Coverage:** 91.32% (threshold: 90% ✅)
|
|
83
|
+
|
|
84
|
+
### Code Quality
|
|
85
|
+
|
|
86
|
+
- `ruff check` — zero violations across all new and modified source files.
|
|
87
|
+
- `mypy` — zero type errors across all new and modified source files.
|
|
88
|
+
- `bandit` — zero security issues (4 485 lines scanned).
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 1.0.3 — 2026-05-10 [Released on PyPI](https://pypi.org/project/spanforge/1.0.3/)
|
|
93
|
+
|
|
94
|
+
**License change to MIT + version bump**
|
|
95
|
+
|
|
96
|
+
- **Version bumped** from `1.0.2` → `1.0.3` in `pyproject.toml`.
|
|
97
|
+
- **License changed** from PolyForm Noncommercial 1.0.0 to the **MIT License** — spanforge is now free for all use, including commercial.
|
|
98
|
+
- Updated `LICENSE` file with full MIT text.
|
|
99
|
+
- Updated `pyproject.toml` classifier to `License :: OSI Approved :: MIT License`.
|
|
100
|
+
- Updated all license references across: `README.md`, `PRICING.md`, `FOUNDER_PREP_GUIDE.md`, `docs/contributing.md`, `docs/rfc/rfc-0001.md`, `docs/changelog.md`, `docs/index.md`, `docs/installation.md`, `RELEASE.md`.
|
|
101
|
+
- No functional code changes — metadata and documentation only.
|
|
102
|
+
- **Tests:** 7049 passing, 7 skipped · **Coverage:** 91%
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 1.0.2 — 2026-05-10 [Released on PyPI](https://pypi.org/project/spanforge/1.0.2/)
|
|
10
107
|
|
|
11
108
|
### Added — Integration & Exporter Finalization (CARD 1E-1 · GROUP 1E · 2026-05-10)
|
|
12
109
|
|
|
@@ -2226,17 +2323,9 @@ backward-compatible unless noted; no existing public API was removed.
|
|
|
2226
2323
|
|
|
2227
2324
|
---
|
|
2228
2325
|
|
|
2229
|
-
## 1.0.
|
|
2326
|
+
## 1.0.2 — 2026-05-10 [Released on PyPI](https://pypi.org/project/spanforge/1.0.2/)
|
|
2230
2327
|
|
|
2231
|
-
**
|
|
2232
|
-
|
|
2233
|
-
- Updated version references in `docs/index.md` and `docs/changelog.md` to match `pyproject.toml`.
|
|
2234
|
-
|
|
2235
|
-
---
|
|
2236
|
-
|
|
2237
|
-
## 1.0.2 — 2026-03-04
|
|
2238
|
-
|
|
2239
|
-
**Packaging fix**
|
|
2328
|
+
**Integration & exporter finalization + config/secrets CLI (CARD 1E-1, CARD 1D-1)**
|
|
2240
2329
|
|
|
2241
2330
|
- Added PyPI badge (links to `https://pypi.org/project/spanforge/`) to README, docs index, and installation page.
|
|
2242
2331
|
- Fixed remaining relative spanforge Standard link in `docs/index.md`.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Documentation Index
|
|
2
2
|
|
|
3
3
|
> **spanforge** (`spanforge`) — The reference implementation of the [spanforge Standard](https://www.getspanforge.com/standard) (RFC-0001), the open event-schema standard for compliance and governance of agentic AI systems.
|
|
4
|
-
> Current release: **1.0.
|
|
4
|
+
> Current release: **1.0.4** — [Changelog](changelog.md) · [](https://pypi.org/project/spanforge/)
|
|
5
5
|
|
|
6
6
|
This index links to every documentation page in this folder.
|
|
7
7
|
|
|
@@ -69,7 +69,7 @@ all optional extras.
|
|
|
69
69
|
|
|
70
70
|
```python
|
|
71
71
|
import spanforge # pip install spanforge → import spanforge
|
|
72
|
-
print(spanforge.__version__) # 1.0.
|
|
72
|
+
print(spanforge.__version__) # 1.0.3
|
|
73
73
|
print(spanforge.SCHEMA_VERSION) # 2.0
|
|
74
74
|
|
|
75
75
|
from spanforge import Event, EventType
|
|
Binary file
|
|
@@ -7,7 +7,7 @@ build-backend = "hatchling.build"
|
|
|
7
7
|
# ---------------------------------------------------------------------------
|
|
8
8
|
[project]
|
|
9
9
|
name = "spanforge"
|
|
10
|
-
version = "1.0.
|
|
10
|
+
version = "1.0.4"
|
|
11
11
|
description = "SpanForge — AI lifecycle and governance platform (RFC-0001 SPANFORGE)"
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
license = { text = "MIT" }
|
|
Binary file
|
|
@@ -333,3 +333,90 @@ class BehaviouralBaseline:
|
|
|
333
333
|
def load(cls, path: str | pathlib.Path) -> BehaviouralBaseline:
|
|
334
334
|
"""Load a baseline previously saved with :meth:`save`."""
|
|
335
335
|
return cls.from_json(pathlib.Path(path).read_text(encoding="utf-8"))
|
|
336
|
+
|
|
337
|
+
def fit(
|
|
338
|
+
self,
|
|
339
|
+
observations: Iterable[dict[str, Any]],
|
|
340
|
+
*,
|
|
341
|
+
window_seconds: float = 86400.0,
|
|
342
|
+
) -> None:
|
|
343
|
+
"""Fit the baseline from raw observation dicts, mutating this instance.
|
|
344
|
+
|
|
345
|
+
An alternative to :meth:`from_events` for callers that already have
|
|
346
|
+
pre-aggregated or synthetic observations rather than full
|
|
347
|
+
:class:`~spanforge.event.Event` objects.
|
|
348
|
+
|
|
349
|
+
Each dict in *observations* may contain any combination of:
|
|
350
|
+
|
|
351
|
+
- ``token_count`` (int | float): total tokens for an LLM call
|
|
352
|
+
- ``latency_ms`` (float): operation latency in milliseconds
|
|
353
|
+
- ``operation`` (str): operation name for latency grouping (default ``"default"``)
|
|
354
|
+
- ``confidence_score`` (float): model confidence in ``[0.0, 1.0]``
|
|
355
|
+
- ``decision_type`` (str): decision category for confidence grouping
|
|
356
|
+
- ``tool_name`` (str): tool name; increments per-tool invocation rate
|
|
357
|
+
|
|
358
|
+
Keys that are absent or ``None`` are silently skipped.
|
|
359
|
+
|
|
360
|
+
Args:
|
|
361
|
+
observations: Iterable of observation dicts (consumed once).
|
|
362
|
+
window_seconds: Traffic window used as the rate denominator
|
|
363
|
+
(default 86 400 s = 24 h).
|
|
364
|
+
|
|
365
|
+
Example::
|
|
366
|
+
|
|
367
|
+
baseline = BehaviouralBaseline.load("baseline.json")
|
|
368
|
+
baseline.fit(
|
|
369
|
+
[
|
|
370
|
+
{"token_count": 512, "latency_ms": 230.0, "operation": "chat"},
|
|
371
|
+
{"confidence_score": 0.91, "decision_type": "accept"},
|
|
372
|
+
{"tool_name": "web_search"},
|
|
373
|
+
],
|
|
374
|
+
window_seconds=3600.0,
|
|
375
|
+
)
|
|
376
|
+
baseline.save("baseline.json")
|
|
377
|
+
"""
|
|
378
|
+
token_samples: list[float] = []
|
|
379
|
+
confidence_samples: dict[str, list[float]] = {}
|
|
380
|
+
latency_samples: dict[str, list[float]] = {}
|
|
381
|
+
tool_counts: dict[str, int] = {}
|
|
382
|
+
decision_counts: dict[str, int] = {}
|
|
383
|
+
count = 0
|
|
384
|
+
|
|
385
|
+
for obs in observations:
|
|
386
|
+
count += 1
|
|
387
|
+
tc = obs.get("token_count")
|
|
388
|
+
if tc is not None:
|
|
389
|
+
token_samples.append(float(tc))
|
|
390
|
+
|
|
391
|
+
lat = obs.get("latency_ms")
|
|
392
|
+
if lat is not None:
|
|
393
|
+
op = str(obs.get("operation", "default"))
|
|
394
|
+
latency_samples.setdefault(op, []).append(float(lat))
|
|
395
|
+
|
|
396
|
+
cs = obs.get("confidence_score")
|
|
397
|
+
if cs is not None:
|
|
398
|
+
dt = str(obs.get("decision_type", "default"))
|
|
399
|
+
confidence_samples.setdefault(dt, []).append(float(cs))
|
|
400
|
+
|
|
401
|
+
tn = obs.get("tool_name")
|
|
402
|
+
if tn is not None:
|
|
403
|
+
tool_counts[str(tn)] = tool_counts.get(str(tn), 0) + 1
|
|
404
|
+
|
|
405
|
+
if obs.get("decision_type") is not None:
|
|
406
|
+
dt = str(obs["decision_type"])
|
|
407
|
+
decision_counts[dt] = decision_counts.get(dt, 0) + 1
|
|
408
|
+
|
|
409
|
+
hours = (window_seconds / 3600.0) if window_seconds > 0 else 1.0
|
|
410
|
+
|
|
411
|
+
self.tokens = DistributionStats.from_samples(token_samples)
|
|
412
|
+
self.confidence_by_type = {
|
|
413
|
+
k: DistributionStats.from_samples(v) for k, v in confidence_samples.items()
|
|
414
|
+
}
|
|
415
|
+
self.latency_by_operation = {
|
|
416
|
+
k: DistributionStats.from_samples(v) for k, v in latency_samples.items()
|
|
417
|
+
}
|
|
418
|
+
self.tool_rate_per_hour = {k: v / hours for k, v in tool_counts.items()}
|
|
419
|
+
self.decision_rate_per_hour = {k: v / hours for k, v in decision_counts.items()}
|
|
420
|
+
self.event_count = count
|
|
421
|
+
self.window_seconds = window_seconds
|
|
422
|
+
self.recorded_at = datetime.datetime.now(datetime.timezone.utc).isoformat()
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""spanforge.schemas — Canonical schema key constants (DX-008).
|
|
2
|
+
|
|
3
|
+
Use these string constants everywhere you pass a ``schema_key`` argument
|
|
4
|
+
to :meth:`~spanforge.sdk.audit.SFAuditClient.append`,
|
|
5
|
+
:meth:`~spanforge.sdk.cec.SFCECClient.build_bundle`, or any other
|
|
6
|
+
SpanForge API that accepts a schema key. They eliminate typos, enable
|
|
7
|
+
IDE auto-complete, and ensure your code stays in sync with schema
|
|
8
|
+
versioning changes.
|
|
9
|
+
|
|
10
|
+
Usage::
|
|
11
|
+
|
|
12
|
+
from spanforge.schemas import TRACE_V1, AUDIT_V1, PII_V1
|
|
13
|
+
|
|
14
|
+
sf_audit.append(record, schema_key=AUDIT_V1)
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"ALERT_V1",
|
|
21
|
+
"AUDIT_V1",
|
|
22
|
+
"BIAS_V1",
|
|
23
|
+
"CONSENT_V1",
|
|
24
|
+
"DRIFT_V1",
|
|
25
|
+
"GATE_V1",
|
|
26
|
+
"PII_V1",
|
|
27
|
+
"PRRI_V1",
|
|
28
|
+
"SCORE_V1",
|
|
29
|
+
"SECRETS_V1",
|
|
30
|
+
"TRACE_V1",
|
|
31
|
+
"TRUST_V1",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
# ---------------------------------------------------------------------------
|
|
35
|
+
# Core trace / telemetry
|
|
36
|
+
# ---------------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
#: Schema key for OpenTelemetry-compatible LLM trace spans.
|
|
39
|
+
TRACE_V1: str = "spanforge.trace.v1"
|
|
40
|
+
|
|
41
|
+
# ---------------------------------------------------------------------------
|
|
42
|
+
# PII & secrets
|
|
43
|
+
# ---------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
#: Schema key for Presidio-backed PII scan and redaction records.
|
|
46
|
+
PII_V1: str = "spanforge.pii.v1"
|
|
47
|
+
|
|
48
|
+
#: Schema key for sf-secrets scanning records.
|
|
49
|
+
SECRETS_V1: str = "spanforge.secrets.v1"
|
|
50
|
+
|
|
51
|
+
# ---------------------------------------------------------------------------
|
|
52
|
+
# Audit chain
|
|
53
|
+
# ---------------------------------------------------------------------------
|
|
54
|
+
|
|
55
|
+
#: Schema key for general-purpose audit records written by sf-audit.
|
|
56
|
+
AUDIT_V1: str = "spanforge.audit.v1"
|
|
57
|
+
|
|
58
|
+
#: Schema key for DPDP / GDPR consent records (subject + purpose pairs).
|
|
59
|
+
CONSENT_V1: str = "spanforge.consent.v1"
|
|
60
|
+
|
|
61
|
+
# ---------------------------------------------------------------------------
|
|
62
|
+
# Compliance Evidence Chain (HallucCheck scoring artefacts)
|
|
63
|
+
# ---------------------------------------------------------------------------
|
|
64
|
+
|
|
65
|
+
#: Schema key for HallucCheck hallucination-score evidence records.
|
|
66
|
+
SCORE_V1: str = "halluccheck.score.v1"
|
|
67
|
+
|
|
68
|
+
#: Schema key for HallucCheck bias-scan evidence records.
|
|
69
|
+
BIAS_V1: str = "halluccheck.bias.v1"
|
|
70
|
+
|
|
71
|
+
#: Schema key for PRRI (Protected & Restricted Representation Index) records.
|
|
72
|
+
PRRI_V1: str = "halluccheck.prri.v1"
|
|
73
|
+
|
|
74
|
+
#: Schema key for behavioural-drift detection event records.
|
|
75
|
+
DRIFT_V1: str = "halluccheck.drift.v1"
|
|
76
|
+
|
|
77
|
+
# ---------------------------------------------------------------------------
|
|
78
|
+
# Gate
|
|
79
|
+
# ---------------------------------------------------------------------------
|
|
80
|
+
|
|
81
|
+
#: Schema key for CI/CD gate evaluation result records.
|
|
82
|
+
GATE_V1: str = "halluccheck.gate.v1"
|
|
83
|
+
|
|
84
|
+
# ---------------------------------------------------------------------------
|
|
85
|
+
# Trust
|
|
86
|
+
# ---------------------------------------------------------------------------
|
|
87
|
+
|
|
88
|
+
#: Schema key for trust-scorecard computation records.
|
|
89
|
+
TRUST_V1: str = "spanforge.trust.v1"
|
|
90
|
+
|
|
91
|
+
# ---------------------------------------------------------------------------
|
|
92
|
+
# Alerting
|
|
93
|
+
# ---------------------------------------------------------------------------
|
|
94
|
+
|
|
95
|
+
#: Schema key for sf-alert routed alert records.
|
|
96
|
+
ALERT_V1: str = "spanforge.alert.v1"
|
|
@@ -189,7 +189,7 @@ from spanforge.sdk._types import (
|
|
|
189
189
|
TrustStatusInfo,
|
|
190
190
|
)
|
|
191
191
|
from spanforge.sdk.alert import SFAlertClient
|
|
192
|
-
from spanforge.sdk.audit import SFAuditClient
|
|
192
|
+
from spanforge.sdk.audit import SFAuditClient, SFCompositeAuditSink
|
|
193
193
|
from spanforge.sdk.cec import SFCECClient
|
|
194
194
|
from spanforge.sdk.config import (
|
|
195
195
|
SFConfigBlock,
|
|
@@ -244,6 +244,8 @@ from spanforge.sdk.secrets import SFSecretsClient
|
|
|
244
244
|
from spanforge.sdk.validate import SFValidateClient, ValidateStatusInfo, ValidationResult, Violation
|
|
245
245
|
from spanforge.sdk.security import SFSecurityClient
|
|
246
246
|
from spanforge.sdk.trust import SFTrustClient
|
|
247
|
+
from spanforge.sdk._factory import SFClientFactory
|
|
248
|
+
from spanforge.sdk._pipeline_builder import SFPipeline, SFPipelineResult, PipelineStageError
|
|
247
249
|
from spanforge.secrets import SecretHit, SecretsScanResult
|
|
248
250
|
|
|
249
251
|
__all__ = [
|
|
@@ -335,6 +337,8 @@ __all__ = [
|
|
|
335
337
|
"SFCECExportError",
|
|
336
338
|
"SFCECVerifyError",
|
|
337
339
|
"SFClientConfig",
|
|
340
|
+
"SFClientFactory",
|
|
341
|
+
"SFCompositeAuditSink",
|
|
338
342
|
# Phase 9 — Integration Config & Local Fallback
|
|
339
343
|
"SFConfigBlock",
|
|
340
344
|
"SFConfigError",
|
|
@@ -380,6 +384,9 @@ __all__ = [
|
|
|
380
384
|
"SFPolicyClient",
|
|
381
385
|
# Phase 10 — T.R.U.S.T. Scorecard & HallucCheck Contract
|
|
382
386
|
"SFPipelineError",
|
|
387
|
+
"SFPipeline",
|
|
388
|
+
"SFPipelineResult",
|
|
389
|
+
"PipelineStageError",
|
|
383
390
|
"SFQuotaExceededError",
|
|
384
391
|
"SFRBACClient",
|
|
385
392
|
"SFRateLimitError",
|
|
@@ -85,8 +85,29 @@ class SFError(Exception):
|
|
|
85
85
|
All public-facing SDK exceptions derive from this class, enabling callers
|
|
86
86
|
to write a single broad ``except SFError`` guard as a safety net while
|
|
87
87
|
still being able to catch specific sub-types for targeted handling.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
*args: Forwarded to :class:`Exception`.
|
|
91
|
+
tsc_criterion: Optional SOC 2 / ISO 27001 Trust Services Criterion that
|
|
92
|
+
this error maps to (e.g. ``"CC6.6"``, ``"CC7.2"``).
|
|
93
|
+
Set by SDK clients so callers can map failures directly
|
|
94
|
+
to their compliance framework without a hand-written lookup.
|
|
95
|
+
|
|
96
|
+
Example::
|
|
97
|
+
|
|
98
|
+
try:
|
|
99
|
+
sf_pii.scan_text(text)
|
|
100
|
+
except SFPIIError as exc:
|
|
101
|
+
print(exc.tsc_criterion) # "CC6.6"
|
|
88
102
|
"""
|
|
89
103
|
|
|
104
|
+
#: SOC 2 / ISO 27001 criterion label — empty string when not applicable.
|
|
105
|
+
tsc_criterion: str
|
|
106
|
+
|
|
107
|
+
def __init__(self, *args: object, tsc_criterion: str = "") -> None:
|
|
108
|
+
super().__init__(*args)
|
|
109
|
+
self.tsc_criterion = tsc_criterion
|
|
110
|
+
|
|
90
111
|
|
|
91
112
|
# ---------------------------------------------------------------------------
|
|
92
113
|
# Authentication errors
|
|
@@ -404,13 +425,16 @@ class SFSecretsBlockedError(SFSecretsError):
|
|
|
404
425
|
)
|
|
405
426
|
"""
|
|
406
427
|
|
|
407
|
-
def __init__(
|
|
428
|
+
def __init__(
|
|
429
|
+
self, secret_types: list[str], count: int = 1, *, tsc_criterion: str = "CC6.7"
|
|
430
|
+
) -> None:
|
|
408
431
|
self.secret_types = secret_types
|
|
409
432
|
self.count = count
|
|
410
433
|
types_str = ", ".join(repr(t) for t in secret_types) if secret_types else "(unknown)"
|
|
411
434
|
super().__init__(
|
|
412
435
|
f"Secrets scan blocked: {count} secret(s) detected of type(s) {types_str}. "
|
|
413
|
-
"Remove the secret and rotate credentials before continuing."
|
|
436
|
+
"Remove the secret and rotate credentials before continuing.",
|
|
437
|
+
tsc_criterion=tsc_criterion,
|
|
414
438
|
)
|
|
415
439
|
|
|
416
440
|
|
|
@@ -445,14 +469,17 @@ class SFPIIBlockedError(SFPIIError):
|
|
|
445
469
|
count: Number of blocking hits.
|
|
446
470
|
"""
|
|
447
471
|
|
|
448
|
-
def __init__(
|
|
472
|
+
def __init__(
|
|
473
|
+
self, entity_types: list[str], count: int = 1, *, tsc_criterion: str = "CC6.6"
|
|
474
|
+
) -> None:
|
|
449
475
|
self.entity_types = entity_types
|
|
450
476
|
self.count = count
|
|
451
477
|
types_str = ", ".join(repr(t) for t in entity_types) if entity_types else "(unknown)"
|
|
452
478
|
super().__init__(
|
|
453
479
|
f"PII detected ({count} entity/entities of type(s) {types_str}) — "
|
|
454
480
|
"pipeline action 'block' prevents scoring. "
|
|
455
|
-
"Remove PII from the input or change the pipeline pii_action to 'flag' or 'redact'."
|
|
481
|
+
"Remove PII from the input or change the pipeline pii_action to 'flag' or 'redact'.",
|
|
482
|
+
tsc_criterion=tsc_criterion,
|
|
456
483
|
)
|
|
457
484
|
|
|
458
485
|
|
|
@@ -772,14 +799,15 @@ class SFGateEvaluationError(SFGateError):
|
|
|
772
799
|
|
|
773
800
|
Args:
|
|
774
801
|
detail: Human-readable description of the failure.
|
|
802
|
+
tsc_criterion: SOC 2 criterion. Defaults to ``"CC7.2"``.
|
|
775
803
|
|
|
776
804
|
Attributes:
|
|
777
805
|
detail: The detail message passed at construction time.
|
|
778
806
|
"""
|
|
779
807
|
|
|
780
|
-
def __init__(self, detail: str) -> None:
|
|
808
|
+
def __init__(self, detail: str, *, tsc_criterion: str = "CC7.2") -> None:
|
|
781
809
|
self.detail = detail
|
|
782
|
-
super().__init__(f"Gate evaluation failed: {detail}")
|
|
810
|
+
super().__init__(f"Gate evaluation failed: {detail}", tsc_criterion=tsc_criterion)
|
|
783
811
|
|
|
784
812
|
|
|
785
813
|
class SFGatePipelineError(SFGateError):
|
|
@@ -819,9 +847,9 @@ class SFGateTrustFailedError(SFGateError):
|
|
|
819
847
|
failures: The failure reasons passed at construction time.
|
|
820
848
|
"""
|
|
821
849
|
|
|
822
|
-
def __init__(self, failures: list[str]) -> None:
|
|
850
|
+
def __init__(self, failures: list[str], *, tsc_criterion: str = "CC7.4") -> None:
|
|
823
851
|
self.failures = failures
|
|
824
|
-
super().__init__("Trust gate failed: " + "; ".join(failures))
|
|
852
|
+
super().__init__("Trust gate failed: " + "; ".join(failures), tsc_criterion=tsc_criterion)
|
|
825
853
|
|
|
826
854
|
|
|
827
855
|
class SFGateSchemaError(SFGateError):
|