spanforge 1.0.2__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.2 → spanforge-1.0.4}/.sf-gate/artifacts/gate6_trust_result.json +2 -2
- {spanforge-1.0.2 → spanforge-1.0.4}/.sf-gate/artifacts/test-gate_result.json +2 -2
- spanforge-1.0.4/LICENSE +21 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/PKG-INFO +13 -16
- {spanforge-1.0.2 → spanforge-1.0.4}/PRICING.md +5 -5
- {spanforge-1.0.2 → spanforge-1.0.4}/README.md +10 -13
- {spanforge-1.0.2 → spanforge-1.0.4}/RELEASE.md +1 -1
- {spanforge-1.0.2 → spanforge-1.0.4}/artifacts/g1_result.json +2 -2
- {spanforge-1.0.2 → spanforge-1.0.4}/artifacts/gate5_governance_result.json +1 -1
- {spanforge-1.0.2 → spanforge-1.0.4}/artifacts/gate6_trust_result.json +2 -2
- spanforge-1.0.4/bandit_out.txt +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/changelog.md +100 -11
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/contributing.md +2 -2
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/index.md +1 -1
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/installation.md +1 -1
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/rfc/rfc-0001.md +1 -1
- spanforge-1.0.4/mypy_out.txt +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/pyproject.toml +3 -3
- spanforge-1.0.4/ruff_out.txt +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/baseline.py +87 -0
- spanforge-1.0.4/src/spanforge/schemas/__init__.py +96 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/__init__.py +8 -1
- {spanforge-1.0.2 → 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.2 → spanforge-1.0.4}/src/spanforge/sdk/_types.py +121 -112
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/audit.py +137 -9
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/cec.py +96 -0
- {spanforge-1.0.2 → 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.2/LICENSE +0 -128
- {spanforge-1.0.2 → spanforge-1.0.4}/.bandit +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.gitattributes +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.github/CODEOWNERS +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.github/ISSUE_TEMPLATE/rfc.yml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.github/pull_request_template.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.github/workflows/ci.yml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.github/workflows/release.yml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.gitignore +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.pre-commit-hooks.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.sf-gate/artifacts/g1_result.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/.sf-gate/artifacts/gate5_governance_result.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/CNAME +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/CODE_OF_CONDUCT.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/CONFORMANCE.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/MAINTAINERS.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/SECURITY.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/SPANFORGE_COMPLETE_Master_Build_Plan_v6_FULL.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docker-compose.selfhosted.yml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/Makefile +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/_static/.gitkeep +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/adr/ADR-001-immutable-audit-trail.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/adr/ADR-002-singleton-service-clients.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/adr/ADR-003-schema-versioning-strategy.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/adr/ADR-004-local-first-architecture.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/adr/ADR-005-sandbox-mode.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/adr/ADR-006-rag-tracing.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/adr/ADR-007-user-feedback.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/adr/ADR-008-sso-scim-oidc.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/adr/README.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/alert.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/audit.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/auto.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/cache.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/cec.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/compliance.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/config.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/consumer.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/debug.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/deprecations.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/drift.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/enterprise.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/eval.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/event.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/exceptions.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/explain.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/export.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/feedback.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/gate.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/governance.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/hooks.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/http.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/identity.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/index.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/integrations.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/io.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/lineage.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/lint.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/metrics.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/migrate.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/models.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/normalizer.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/observe.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/operator.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/pii.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/pipelines.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/plugins.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/policy.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/rag.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/rbac.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/redact.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/regression.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/schema.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/scope.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/sdk-reference.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/secrets.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/signing.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/stats.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/store.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/stream.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/testing.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/testing_mocks.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/trace.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/trust.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/types.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/ulid.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/api/validate.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/cli.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/competitor-comparison.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/conf.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/configuration.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/demos/enterprise-evidence-demo.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/demos/runtime-governance-demo.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/deployment/air-gapped.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/deployment/kubernetes.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/enterprise-integrations.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/evidence-export.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/ga-release-notes.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/integrations/crewai.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/integrations/halluccheck.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/make.bat +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/migrations/from-langfuse.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/migrations/from-langsmith.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/migrations/from-openllmetry.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/migrations/v5-to-v6.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/audit.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/cache.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/consent.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/cost.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/diff.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/eval.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/explanation.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/feedback.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/fence.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/guard.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/hitl.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/index.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/model_registry.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/prompt.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/redact_ns.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/retrieval.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/template.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/namespaces/trace.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/quickstart.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/reference-architectures.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/replay-simulation.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/rfc/adr-index.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/runbook.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/runtime-governance-contracts.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/runtime-governance.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/README.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/envelope.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/agent-run.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/agent-step.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/audit.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/cache.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/consent.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/cost.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/diff.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/eval.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/explanation.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/fence.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/guard.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/hitl.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/model-registry.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/prompt.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/redact.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/span.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/payloads/template.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema/types/common.schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/schema-versioning.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/alert.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/audit.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/cache.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/compliance.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/custom_exporters.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/debugging.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/events.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/export.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/feedback.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/gate.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/governance.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/in_memory_state.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/index.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/linting.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/metrics.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/migration.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/rag.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/redaction.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/signing.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/docs/user_guide/tracing.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/agent_workflow.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/budget_alert.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/docker/Dockerfile +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/docker/docker-compose.yml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/docker/otel-config.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/enterprise_evidence_demo.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/explain_demo.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/gates/gate5_governance.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/gates/sf-gate.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/langchain_chain.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/multi_agent_rag.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/multi_tenant.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/openai_chat.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/otlp_grafana.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/production_multi_agent.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/runtime_governance_demo.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/scope_demo.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/scope_manifest.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/secure_pipeline.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/streaming_response.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/testing_mocks_example.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/examples/validate_demo.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/helm/spanforge/Chart.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/helm/spanforge/templates/_helpers.tpl +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/helm/spanforge/templates/deployment.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/helm/spanforge/templates/hpa.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/helm/spanforge/templates/networkpolicy.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/helm/spanforge/templates/pdb.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/helm/spanforge/templates/secret.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/helm/spanforge/templates/service.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/helm/spanforge/values.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/k6/README.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/k6/pii_scan_50rps.js +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/k6/score_100rps.js +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/k6/secrets_scan_100rps.js +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/sonar-project.properties +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/__init__.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_ansi.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_batch_exporter.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_cli.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_cli_audit.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_cli_compliance.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_cli_config.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_cli_cost.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_cli_ops.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_cli_phase11.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_hooks.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_server.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_span.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_store.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_stream.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_trace.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/_tracer.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/actor.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/alerts.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/auto.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/cache.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/compliance.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/config.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/consent.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/consumer.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/core/__init__.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/core/compliance_mapping.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/core/dx.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/cost.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/debug.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/deprecations.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/drift.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/egress.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/eval.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/event.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/exceptions.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/explain.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/__init__.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/append_only.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/cloud.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/datadog.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/grafana.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/jsonl.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/openinference.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/otel_bridge.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/otlp.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/otlp_bridge.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/redis_backend.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/siem.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/siem_schema.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/siem_splunk.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/siem_syslog.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/export/webhook.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/exporters/__init__.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/exporters/console.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/exporters/jsonl.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/exporters/sqlite.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/gate.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/governance.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/hitl.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/http.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/inspect.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/__init__.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/_pricing.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/anthropic.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/azure_openai.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/bedrock.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/crewai.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/gemini.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/groq.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/langchain.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/langgraph.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/llamaindex.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/ollama.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/openai.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/integrations/together.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/io.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/lint.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/metrics.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/metrics_export.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/migrate.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/model_registry.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/models.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/__init__.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/audit.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/cache.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/chain.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/confidence.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/consent.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/cost.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/decision.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/diff.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/drift.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/eval_.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/feedback.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/fence.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/guard.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/hitl.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/latency.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/prompt.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/redact.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/retrieval.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/runtime_governance.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/template.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/tool_call.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/namespaces/trace.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/normalizer.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/plugins.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/presidio_backend.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/processor.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/prompt_registry.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/py.typed +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/redact.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/regression.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/runtime_policy.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sampling.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/schema.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/schemas/frameworks/frameworks.yaml +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/schemas/v1.0/schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/schemas/v2.0/schema.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/_base.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/_base.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/alert.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/alert.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/audit.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/cec.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/config.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/config.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/dataset_scanner.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/enterprise.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/enterprise.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/explain.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/fallback.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/feedback.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/gate.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/gate.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/identity.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/identity.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/lineage.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/observe.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/observe.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/operator.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/pii.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/pii.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/pipelines.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/pipelines.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/policy.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/rag.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/rbac.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/registry.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/registry.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/scope.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/secrets.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/secrets.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/security.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/security.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/trust.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/trust.pyi +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/sdk/validate.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/secrets.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/signing.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/stats.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/stream.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/testing_mocks.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/trace.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/types.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/ulid.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/validate.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/src/spanforge/workflow.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/test_agent.jsonl +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/test_events.jsonl +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/__init__.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/chaos/README.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/chaos/test_service_unavailability.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/conformance/__init__.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/conformance/fixtures/chain.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/conformance/fixtures/compliance.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/conformance/fixtures/key_security.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/conformance/fixtures/migration.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/conformance/fixtures/pii.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/conformance/fixtures/signing.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/conformance/fixtures.json +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/conformance/run_conformance.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/conformance/test_conformance.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/conftest.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/fixtures/clean_dataset/data.jsonl +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/fixtures/no_consent_dataset/data.jsonl +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/fixtures/pii_dataset/data.jsonl +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/integration/__init__.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/integration/test_dx_integration.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/load/README.md +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_1e1_siem_langgraph.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_actor.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_alerts.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_ansi.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_auto.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_baseline.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_batch_exporter.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_benchmarks.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_budget_alert.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_cache.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_cli.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_cli_audit_module.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_cli_compliance_dataset.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_cli_compliance_module.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_cli_config_1d1.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_cli_cost_module.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_cli_ops_module.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_cli_phase11_module.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_compliance.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_compliance_mapping.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_config_interpolate.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_consent.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_consumer.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_cost_event_emission.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_cost_tracker.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_costguard_gaps.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_coverage_gaps.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_coverage_supplement_1.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_coverage_supplement_2.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_coverage_supplement_3.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_coverage_supplement_4.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_dataset_scanner.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_deprecations.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_drift.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_e2e_cli.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_egress_and_normalizer.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_eval_behaviour_scorer.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_event.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_exceptions.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_explain.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_export_cloud.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_export_datadog.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_export_grafana.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_export_jsonl.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_export_otel_bridge.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_export_otlp.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_export_redis_backend.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_export_siem_splunk.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_export_siem_syslog.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_export_webhook.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_feedback.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_framework_mapper.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_gate_deep.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_governance.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_hitl.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_http.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_inspect.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_integration.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_integrations.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_io.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_lint.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_migrate.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_model_registry.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_models.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_namespaces.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_otlp_bridge.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase0_scale.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase10_features.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase10_trust.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase11_enterprise.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase11_security.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase12_dx.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase1_context_trace.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase2_observability.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase3_debug_sampling.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase4_agent_instrumentation.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase4_metrics_store.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase5_console_exporter.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase5_coverage.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase5_enterprise_integrations.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase5_hooks_crewai.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase6_enterprise_deployment_packaging.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase6_openai_integration.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_phase8_release_hardening.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_plugins.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_processor_coverage.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_prompt_registry.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_properties.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_public_root_lazy_imports.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_rag.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_redact.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_regression.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_repo_guardrails.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_rfc_namespaces.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_runtime_governance_phase0.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sampling_coverage.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_schema.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_config.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_coverage_boost.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_explain.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_exporters.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_final_coverage.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_gap_filler.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_openai_integration.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_phase7_integrations.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_pipelines_deep.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_precision_coverage.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_scope.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_span.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_stream.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_tracer.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_validate.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sdk_validation_coverage.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_server.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf11.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf12.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf13.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf14.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf15.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf16.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf9_config.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_alert.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_audit.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_cec.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_explain.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_gate.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_identity.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_lineage.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_observe.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_operator.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_pii.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_policy.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_policy_integration.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_policy_phase3.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_rag.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_rbac.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_scope.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_sf_secrets.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_signing.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_stats.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_stream.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_trace_decorator.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_trace_pytest_fixtures.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_types.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_ulid.py +0 -0
- {spanforge-1.0.2 → spanforge-1.0.4}/tests/test_validate.py +0 -0
- {spanforge-1.0.2 → 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
|
}
|
spanforge-1.0.4/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 viswanathanstartup
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -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
|
|
@@ -8,12 +8,12 @@ Project-URL: Source, https://github.com/veerarag1973/spanforge
|
|
|
8
8
|
Project-URL: Bug Tracker, https://github.com/veerarag1973/spanforge/issues
|
|
9
9
|
Project-URL: Changelog, https://github.com/veerarag1973/spanforge/blob/main/docs/changelog.md
|
|
10
10
|
Author: viswanathanstartup
|
|
11
|
-
License:
|
|
11
|
+
License: MIT
|
|
12
12
|
License-File: LICENSE
|
|
13
13
|
Keywords: agentic-ai,ai-compliance,ai-lifecycle,events,governance,llm,opentelemetry,schema,spanforge
|
|
14
14
|
Classifier: Development Status :: 5 - Production/Stable
|
|
15
15
|
Classifier: Intended Audience :: Developers
|
|
16
|
-
Classifier: License ::
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
17
|
Classifier: Programming Language :: Python :: 3
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.9
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.10
|
|
@@ -118,13 +118,12 @@ 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
|
-
<a href="LICENSE"><img src="https://img.shields.io/badge/license-
|
|
126
|
-
<img src="https://img.shields.io/badge/free%20for-
|
|
127
|
-
<a href="https://getspanforge.com/pricing"><img src="https://img.shields.io/badge/commercial%20use-license%20required-orange" alt="Commercial use requires a license"/></a>
|
|
125
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT License"/></a>
|
|
126
|
+
<img src="https://img.shields.io/badge/free%20for-any%20use-brightgreen" alt="Free for any use"/>
|
|
128
127
|
</p>
|
|
129
128
|
|
|
130
129
|
---
|
|
@@ -143,13 +142,13 @@ You might think compliance is a later problem — something to worry about when
|
|
|
143
142
|
|
|
144
143
|
- **You'll hit it sooner than you think.** The first B2B customer, the first SaaS sign-up from an EU user, the first healthcare or fintech pilot — they'll ask "how do you govern your AI?" If you have no answer, you lose the deal.
|
|
145
144
|
- **Retrofitting is expensive.** Adding audit trails, PII scrubbing, and signed evidence chains to an existing system takes weeks. Adding them with spanforge from day one takes minutes.
|
|
146
|
-
- **It's zero-cost to start.** The entire SDK is
|
|
145
|
+
- **It's zero-cost to start.** The entire SDK is MIT-licensed, zero dependencies, and works in-memory with no infrastructure. You don't pay anything until you need hosted storage.
|
|
147
146
|
- **It de-risks you personally.** GDPR fines apply to individuals running services, not just corporations. PII redaction and tamper-proof logs are your protection too.
|
|
148
147
|
|
|
149
148
|
In short: spanforge is the `logging` import you should have added on day one — except it also signs your audit trail and maps it to the regulations that will eventually matter to you.
|
|
150
149
|
|
|
151
150
|
```python
|
|
152
|
-
pip install spanforge #
|
|
151
|
+
pip install spanforge # MIT licensed, zero deps
|
|
153
152
|
```
|
|
154
153
|
|
|
155
154
|
```python
|
|
@@ -1539,14 +1538,12 @@ Contributions welcome — see the [Contributing Guide](docs/contributing.md). Al
|
|
|
1539
1538
|
|
|
1540
1539
|
## License
|
|
1541
1540
|
|
|
1542
|
-
**[
|
|
1541
|
+
**[MIT License](LICENSE)**
|
|
1543
1542
|
|
|
1544
|
-
- ✅ Free for
|
|
1545
|
-
-
|
|
1543
|
+
- ✅ Free for any use — personal, research, education, open-source, and commercial.
|
|
1544
|
+
- ✅ No restrictions on distribution, modification, or sublicensing.
|
|
1546
1545
|
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
> Enterprise features (SSO, air-gapped deployment, dedicated support, SLAs) are available in **SpanForge Enterprise** — a separate commercial product.
|
|
1546
|
+
> Enterprise features (SSO, air-gapped deployment, dedicated support, SLAs) are available in **SpanForge Enterprise** — contact **sriram@getspanforge.com** | [getspanforge.com/pricing](https://getspanforge.com/pricing).
|
|
1550
1547
|
|
|
1551
1548
|
---
|
|
1552
1549
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# spanforge Pricing
|
|
2
2
|
|
|
3
|
-
spanforge is source
|
|
3
|
+
spanforge is open-source software released under the [MIT License](https://opensource.org/licenses/MIT). The core library is and always will be **free for any use**, including commercial.
|
|
4
4
|
|
|
5
5
|
The paid tiers described below are for **hosted services, commercial support, and enterprise add-ons** built on top of the open-source library.
|
|
6
6
|
|
|
@@ -10,8 +10,8 @@ The paid tiers described below are for **hosted services, commercial support, an
|
|
|
10
10
|
|
|
11
11
|
| | **Community** | **Cloud** | **Cloud Team** | **Compliance** |
|
|
12
12
|
|---|---|---|---|---|
|
|
13
|
-
| **Price** | Free (
|
|
14
|
-
| **License** |
|
|
13
|
+
| **Price** | Free (MIT) | $29 / month flat | $99 / month flat | $299 / month flat |
|
|
14
|
+
| **License** | MIT | MIT + Cloud ToS | MIT + Cloud ToS | MIT + Enterprise Agreement |
|
|
15
15
|
| **Core SDK** | ✅ All features | ✅ All features | ✅ All features | ✅ All features |
|
|
16
16
|
| **HMAC signing** | ✅ | ✅ | ✅ | ✅ |
|
|
17
17
|
| **PII redaction** | ✅ | ✅ | ✅ | ✅ |
|
|
@@ -41,8 +41,8 @@ The paid tiers described below are for **hosted services, commercial support, an
|
|
|
41
41
|
|
|
42
42
|
## Community (Free)
|
|
43
43
|
|
|
44
|
-
- Full SDK under
|
|
45
|
-
-
|
|
44
|
+
- Full SDK under MIT License — free for any use including commercial
|
|
45
|
+
- Paid tiers are for hosted services, managed storage, compliance tooling, and enterprise support — contact [team@getspanforge.com](mailto:team@getspanforge.com)
|
|
46
46
|
- 97-file test suite, 6,109+ tests, 90%+ coverage
|
|
47
47
|
- Local SPA trace viewer (`spanforge serve` / `spanforge ui`)
|
|
48
48
|
- GitHub Issues, GitHub Discussions, SECURITY.md responsible-disclosure
|
|
@@ -14,13 +14,12 @@
|
|
|
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
|
-
<a href="LICENSE"><img src="https://img.shields.io/badge/license-
|
|
22
|
-
<img src="https://img.shields.io/badge/free%20for-
|
|
23
|
-
<a href="https://getspanforge.com/pricing"><img src="https://img.shields.io/badge/commercial%20use-license%20required-orange" alt="Commercial use requires a license"/></a>
|
|
21
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT License"/></a>
|
|
22
|
+
<img src="https://img.shields.io/badge/free%20for-any%20use-brightgreen" alt="Free for any use"/>
|
|
24
23
|
</p>
|
|
25
24
|
|
|
26
25
|
---
|
|
@@ -39,13 +38,13 @@ You might think compliance is a later problem — something to worry about when
|
|
|
39
38
|
|
|
40
39
|
- **You'll hit it sooner than you think.** The first B2B customer, the first SaaS sign-up from an EU user, the first healthcare or fintech pilot — they'll ask "how do you govern your AI?" If you have no answer, you lose the deal.
|
|
41
40
|
- **Retrofitting is expensive.** Adding audit trails, PII scrubbing, and signed evidence chains to an existing system takes weeks. Adding them with spanforge from day one takes minutes.
|
|
42
|
-
- **It's zero-cost to start.** The entire SDK is
|
|
41
|
+
- **It's zero-cost to start.** The entire SDK is MIT-licensed, zero dependencies, and works in-memory with no infrastructure. You don't pay anything until you need hosted storage.
|
|
43
42
|
- **It de-risks you personally.** GDPR fines apply to individuals running services, not just corporations. PII redaction and tamper-proof logs are your protection too.
|
|
44
43
|
|
|
45
44
|
In short: spanforge is the `logging` import you should have added on day one — except it also signs your audit trail and maps it to the regulations that will eventually matter to you.
|
|
46
45
|
|
|
47
46
|
```python
|
|
48
|
-
pip install spanforge #
|
|
47
|
+
pip install spanforge # MIT licensed, zero deps
|
|
49
48
|
```
|
|
50
49
|
|
|
51
50
|
```python
|
|
@@ -1435,14 +1434,12 @@ Contributions welcome — see the [Contributing Guide](docs/contributing.md). Al
|
|
|
1435
1434
|
|
|
1436
1435
|
## License
|
|
1437
1436
|
|
|
1438
|
-
**[
|
|
1437
|
+
**[MIT License](LICENSE)**
|
|
1439
1438
|
|
|
1440
|
-
- ✅ Free for
|
|
1441
|
-
-
|
|
1439
|
+
- ✅ Free for any use — personal, research, education, open-source, and commercial.
|
|
1440
|
+
- ✅ No restrictions on distribution, modification, or sublicensing.
|
|
1442
1441
|
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
> Enterprise features (SSO, air-gapped deployment, dedicated support, SLAs) are available in **SpanForge Enterprise** — a separate commercial product.
|
|
1442
|
+
> Enterprise features (SSO, air-gapped deployment, dedicated support, SLAs) are available in **SpanForge Enterprise** — contact **sriram@getspanforge.com** | [getspanforge.com/pricing](https://getspanforge.com/pricing).
|
|
1446
1443
|
|
|
1447
1444
|
---
|
|
1448
1445
|
|
|
@@ -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`.
|
|
@@ -201,5 +201,5 @@ Before opening a PR, confirm:
|
|
|
201
201
|
|
|
202
202
|
## License
|
|
203
203
|
|
|
204
|
-
spanforge is released under the [
|
|
205
|
-
By contributing you agree that your contributions will be licensed under the
|
|
204
|
+
spanforge is released under the [MIT License](https://opensource.org/licenses/MIT). Contributions are accepted under the same license.
|
|
205
|
+
By contributing you agree that your contributions will be licensed under the MIT License.
|
|
@@ -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
|
|
@@ -137,4 +137,4 @@ All changes to this RFC go through the RFC amendment process:
|
|
|
137
137
|
|
|
138
138
|
## License
|
|
139
139
|
|
|
140
|
-
This RFC and the SPANFORGE schema are published under the [
|
|
140
|
+
This RFC and the SPANFORGE schema are published under the [MIT License](../../LICENSE).
|
|
Binary file
|
|
@@ -7,16 +7,16 @@ 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
|
-
license = { text = "
|
|
13
|
+
license = { text = "MIT" }
|
|
14
14
|
authors = [{ name = "viswanathanstartup" }]
|
|
15
15
|
keywords = ["llm", "spanforge", "ai-compliance", "opentelemetry", "agentic-ai", "governance", "ai-lifecycle", "schema", "events"]
|
|
16
16
|
classifiers = [
|
|
17
17
|
"Development Status :: 5 - Production/Stable",
|
|
18
18
|
"Intended Audience :: Developers",
|
|
19
|
-
"License ::
|
|
19
|
+
"License :: OSI Approved :: MIT License",
|
|
20
20
|
"Programming Language :: Python :: 3",
|
|
21
21
|
"Programming Language :: Python :: 3.9",
|
|
22
22
|
"Programming Language :: Python :: 3.10",
|
|
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"
|