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.
Files changed (580) hide show
  1. {spanforge-1.0.3 → spanforge-1.0.4}/.sf-gate/artifacts/gate6_trust_result.json +2 -2
  2. {spanforge-1.0.3 → spanforge-1.0.4}/.sf-gate/artifacts/test-gate_result.json +2 -2
  3. {spanforge-1.0.3 → spanforge-1.0.4}/PKG-INFO +3 -3
  4. {spanforge-1.0.3 → spanforge-1.0.4}/README.md +2 -2
  5. {spanforge-1.0.3 → spanforge-1.0.4}/RELEASE.md +1 -1
  6. {spanforge-1.0.3 → spanforge-1.0.4}/artifacts/g1_result.json +2 -2
  7. {spanforge-1.0.3 → spanforge-1.0.4}/artifacts/gate5_governance_result.json +1 -1
  8. {spanforge-1.0.3 → spanforge-1.0.4}/artifacts/gate6_trust_result.json +2 -2
  9. spanforge-1.0.4/bandit_out.txt +0 -0
  10. {spanforge-1.0.3 → spanforge-1.0.4}/docs/changelog.md +100 -11
  11. {spanforge-1.0.3 → spanforge-1.0.4}/docs/index.md +1 -1
  12. {spanforge-1.0.3 → spanforge-1.0.4}/docs/installation.md +1 -1
  13. spanforge-1.0.4/mypy_out.txt +0 -0
  14. {spanforge-1.0.3 → spanforge-1.0.4}/pyproject.toml +1 -1
  15. spanforge-1.0.4/ruff_out.txt +0 -0
  16. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/baseline.py +87 -0
  17. spanforge-1.0.4/src/spanforge/schemas/__init__.py +96 -0
  18. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/__init__.py +8 -1
  19. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/_exceptions.py +36 -8
  20. spanforge-1.0.4/src/spanforge/sdk/_factory.py +150 -0
  21. spanforge-1.0.4/src/spanforge/sdk/_pipeline_builder.py +221 -0
  22. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/_types.py +121 -112
  23. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/audit.py +137 -9
  24. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/cec.py +96 -0
  25. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/testing.py +168 -0
  26. spanforge-1.0.4/test_full.txt +0 -0
  27. spanforge-1.0.4/test_new.txt +0 -0
  28. spanforge-1.0.4/test_out.txt +0 -0
  29. spanforge-1.0.4/tests/test_next_sdk_features.py +697 -0
  30. {spanforge-1.0.3 → spanforge-1.0.4}/.bandit +0 -0
  31. {spanforge-1.0.3 → spanforge-1.0.4}/.gitattributes +0 -0
  32. {spanforge-1.0.3 → spanforge-1.0.4}/.github/CODEOWNERS +0 -0
  33. {spanforge-1.0.3 → spanforge-1.0.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  34. {spanforge-1.0.3 → spanforge-1.0.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  35. {spanforge-1.0.3 → spanforge-1.0.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  36. {spanforge-1.0.3 → spanforge-1.0.4}/.github/ISSUE_TEMPLATE/rfc.yml +0 -0
  37. {spanforge-1.0.3 → spanforge-1.0.4}/.github/pull_request_template.md +0 -0
  38. {spanforge-1.0.3 → spanforge-1.0.4}/.github/workflows/ci.yml +0 -0
  39. {spanforge-1.0.3 → spanforge-1.0.4}/.github/workflows/release.yml +0 -0
  40. {spanforge-1.0.3 → spanforge-1.0.4}/.gitignore +0 -0
  41. {spanforge-1.0.3 → spanforge-1.0.4}/.pre-commit-hooks.yaml +0 -0
  42. {spanforge-1.0.3 → spanforge-1.0.4}/.sf-gate/artifacts/g1_result.json +0 -0
  43. {spanforge-1.0.3 → spanforge-1.0.4}/.sf-gate/artifacts/gate5_governance_result.json +0 -0
  44. {spanforge-1.0.3 → spanforge-1.0.4}/CNAME +0 -0
  45. {spanforge-1.0.3 → spanforge-1.0.4}/CODE_OF_CONDUCT.md +0 -0
  46. {spanforge-1.0.3 → spanforge-1.0.4}/CONFORMANCE.md +0 -0
  47. {spanforge-1.0.3 → spanforge-1.0.4}/LICENSE +0 -0
  48. {spanforge-1.0.3 → spanforge-1.0.4}/MAINTAINERS.md +0 -0
  49. {spanforge-1.0.3 → spanforge-1.0.4}/PRICING.md +0 -0
  50. {spanforge-1.0.3 → spanforge-1.0.4}/SECURITY.md +0 -0
  51. {spanforge-1.0.3 → spanforge-1.0.4}/SPANFORGE_COMPLETE_Master_Build_Plan_v6_FULL.md +0 -0
  52. {spanforge-1.0.3 → spanforge-1.0.4}/docker-compose.selfhosted.yml +0 -0
  53. {spanforge-1.0.3 → spanforge-1.0.4}/docs/Makefile +0 -0
  54. {spanforge-1.0.3 → spanforge-1.0.4}/docs/_static/.gitkeep +0 -0
  55. {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-001-immutable-audit-trail.md +0 -0
  56. {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-002-singleton-service-clients.md +0 -0
  57. {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-003-schema-versioning-strategy.md +0 -0
  58. {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-004-local-first-architecture.md +0 -0
  59. {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-005-sandbox-mode.md +0 -0
  60. {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-006-rag-tracing.md +0 -0
  61. {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-007-user-feedback.md +0 -0
  62. {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/ADR-008-sso-scim-oidc.md +0 -0
  63. {spanforge-1.0.3 → spanforge-1.0.4}/docs/adr/README.md +0 -0
  64. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/alert.md +0 -0
  65. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/audit.md +0 -0
  66. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/auto.md +0 -0
  67. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/cache.md +0 -0
  68. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/cec.md +0 -0
  69. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/compliance.md +0 -0
  70. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/config.md +0 -0
  71. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/consumer.md +0 -0
  72. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/debug.md +0 -0
  73. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/deprecations.md +0 -0
  74. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/drift.md +0 -0
  75. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/enterprise.md +0 -0
  76. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/eval.md +0 -0
  77. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/event.md +0 -0
  78. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/exceptions.md +0 -0
  79. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/explain.md +0 -0
  80. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/export.md +0 -0
  81. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/feedback.md +0 -0
  82. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/gate.md +0 -0
  83. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/governance.md +0 -0
  84. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/hooks.md +0 -0
  85. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/http.md +0 -0
  86. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/identity.md +0 -0
  87. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/index.md +0 -0
  88. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/integrations.md +0 -0
  89. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/io.md +0 -0
  90. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/lineage.md +0 -0
  91. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/lint.md +0 -0
  92. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/metrics.md +0 -0
  93. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/migrate.md +0 -0
  94. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/models.md +0 -0
  95. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/normalizer.md +0 -0
  96. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/observe.md +0 -0
  97. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/operator.md +0 -0
  98. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/pii.md +0 -0
  99. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/pipelines.md +0 -0
  100. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/plugins.md +0 -0
  101. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/policy.md +0 -0
  102. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/rag.md +0 -0
  103. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/rbac.md +0 -0
  104. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/redact.md +0 -0
  105. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/regression.md +0 -0
  106. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/schema.md +0 -0
  107. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/scope.md +0 -0
  108. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/sdk-reference.md +0 -0
  109. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/secrets.md +0 -0
  110. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/signing.md +0 -0
  111. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/stats.md +0 -0
  112. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/store.md +0 -0
  113. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/stream.md +0 -0
  114. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/testing.md +0 -0
  115. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/testing_mocks.md +0 -0
  116. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/trace.md +0 -0
  117. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/trust.md +0 -0
  118. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/types.md +0 -0
  119. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/ulid.md +0 -0
  120. {spanforge-1.0.3 → spanforge-1.0.4}/docs/api/validate.md +0 -0
  121. {spanforge-1.0.3 → spanforge-1.0.4}/docs/cli.md +0 -0
  122. {spanforge-1.0.3 → spanforge-1.0.4}/docs/competitor-comparison.md +0 -0
  123. {spanforge-1.0.3 → spanforge-1.0.4}/docs/conf.py +0 -0
  124. {spanforge-1.0.3 → spanforge-1.0.4}/docs/configuration.md +0 -0
  125. {spanforge-1.0.3 → spanforge-1.0.4}/docs/contributing.md +0 -0
  126. {spanforge-1.0.3 → spanforge-1.0.4}/docs/demos/enterprise-evidence-demo.md +0 -0
  127. {spanforge-1.0.3 → spanforge-1.0.4}/docs/demos/runtime-governance-demo.md +0 -0
  128. {spanforge-1.0.3 → spanforge-1.0.4}/docs/deployment/air-gapped.md +0 -0
  129. {spanforge-1.0.3 → spanforge-1.0.4}/docs/deployment/kubernetes.md +0 -0
  130. {spanforge-1.0.3 → spanforge-1.0.4}/docs/enterprise-integrations.md +0 -0
  131. {spanforge-1.0.3 → spanforge-1.0.4}/docs/evidence-export.md +0 -0
  132. {spanforge-1.0.3 → spanforge-1.0.4}/docs/ga-release-notes.md +0 -0
  133. {spanforge-1.0.3 → spanforge-1.0.4}/docs/integrations/crewai.md +0 -0
  134. {spanforge-1.0.3 → spanforge-1.0.4}/docs/integrations/halluccheck.md +0 -0
  135. {spanforge-1.0.3 → spanforge-1.0.4}/docs/make.bat +0 -0
  136. {spanforge-1.0.3 → spanforge-1.0.4}/docs/migrations/from-langfuse.md +0 -0
  137. {spanforge-1.0.3 → spanforge-1.0.4}/docs/migrations/from-langsmith.md +0 -0
  138. {spanforge-1.0.3 → spanforge-1.0.4}/docs/migrations/from-openllmetry.md +0 -0
  139. {spanforge-1.0.3 → spanforge-1.0.4}/docs/migrations/v5-to-v6.md +0 -0
  140. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/audit.md +0 -0
  141. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/cache.md +0 -0
  142. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/consent.md +0 -0
  143. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/cost.md +0 -0
  144. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/diff.md +0 -0
  145. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/eval.md +0 -0
  146. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/explanation.md +0 -0
  147. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/feedback.md +0 -0
  148. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/fence.md +0 -0
  149. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/guard.md +0 -0
  150. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/hitl.md +0 -0
  151. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/index.md +0 -0
  152. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/model_registry.md +0 -0
  153. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/prompt.md +0 -0
  154. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/redact_ns.md +0 -0
  155. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/retrieval.md +0 -0
  156. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/template.md +0 -0
  157. {spanforge-1.0.3 → spanforge-1.0.4}/docs/namespaces/trace.md +0 -0
  158. {spanforge-1.0.3 → spanforge-1.0.4}/docs/quickstart.md +0 -0
  159. {spanforge-1.0.3 → spanforge-1.0.4}/docs/reference-architectures.md +0 -0
  160. {spanforge-1.0.3 → spanforge-1.0.4}/docs/replay-simulation.md +0 -0
  161. {spanforge-1.0.3 → spanforge-1.0.4}/docs/rfc/adr-index.md +0 -0
  162. {spanforge-1.0.3 → spanforge-1.0.4}/docs/rfc/rfc-0001.md +0 -0
  163. {spanforge-1.0.3 → spanforge-1.0.4}/docs/runbook.md +0 -0
  164. {spanforge-1.0.3 → spanforge-1.0.4}/docs/runtime-governance-contracts.md +0 -0
  165. {spanforge-1.0.3 → spanforge-1.0.4}/docs/runtime-governance.md +0 -0
  166. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/README.md +0 -0
  167. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/envelope.schema.json +0 -0
  168. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/agent-run.schema.json +0 -0
  169. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/agent-step.schema.json +0 -0
  170. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/audit.schema.json +0 -0
  171. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/cache.schema.json +0 -0
  172. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/consent.schema.json +0 -0
  173. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/cost.schema.json +0 -0
  174. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/diff.schema.json +0 -0
  175. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/eval.schema.json +0 -0
  176. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/explanation.schema.json +0 -0
  177. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/fence.schema.json +0 -0
  178. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/guard.schema.json +0 -0
  179. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/hitl.schema.json +0 -0
  180. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/model-registry.schema.json +0 -0
  181. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/prompt.schema.json +0 -0
  182. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/redact.schema.json +0 -0
  183. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/span.schema.json +0 -0
  184. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/payloads/template.schema.json +0 -0
  185. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema/types/common.schema.json +0 -0
  186. {spanforge-1.0.3 → spanforge-1.0.4}/docs/schema-versioning.md +0 -0
  187. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/alert.md +0 -0
  188. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/audit.md +0 -0
  189. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/cache.md +0 -0
  190. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/compliance.md +0 -0
  191. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/custom_exporters.md +0 -0
  192. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/debugging.md +0 -0
  193. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/events.md +0 -0
  194. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/export.md +0 -0
  195. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/feedback.md +0 -0
  196. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/gate.md +0 -0
  197. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/governance.md +0 -0
  198. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/in_memory_state.md +0 -0
  199. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/index.md +0 -0
  200. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/linting.md +0 -0
  201. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/metrics.md +0 -0
  202. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/migration.md +0 -0
  203. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/rag.md +0 -0
  204. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/redaction.md +0 -0
  205. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/signing.md +0 -0
  206. {spanforge-1.0.3 → spanforge-1.0.4}/docs/user_guide/tracing.md +0 -0
  207. {spanforge-1.0.3 → spanforge-1.0.4}/examples/agent_workflow.py +0 -0
  208. {spanforge-1.0.3 → spanforge-1.0.4}/examples/budget_alert.py +0 -0
  209. {spanforge-1.0.3 → spanforge-1.0.4}/examples/docker/Dockerfile +0 -0
  210. {spanforge-1.0.3 → spanforge-1.0.4}/examples/docker/docker-compose.yml +0 -0
  211. {spanforge-1.0.3 → spanforge-1.0.4}/examples/docker/otel-config.yaml +0 -0
  212. {spanforge-1.0.3 → spanforge-1.0.4}/examples/enterprise_evidence_demo.py +0 -0
  213. {spanforge-1.0.3 → spanforge-1.0.4}/examples/explain_demo.py +0 -0
  214. {spanforge-1.0.3 → spanforge-1.0.4}/examples/gates/gate5_governance.yaml +0 -0
  215. {spanforge-1.0.3 → spanforge-1.0.4}/examples/gates/sf-gate.yaml +0 -0
  216. {spanforge-1.0.3 → spanforge-1.0.4}/examples/langchain_chain.py +0 -0
  217. {spanforge-1.0.3 → spanforge-1.0.4}/examples/multi_agent_rag.py +0 -0
  218. {spanforge-1.0.3 → spanforge-1.0.4}/examples/multi_tenant.py +0 -0
  219. {spanforge-1.0.3 → spanforge-1.0.4}/examples/openai_chat.py +0 -0
  220. {spanforge-1.0.3 → spanforge-1.0.4}/examples/otlp_grafana.py +0 -0
  221. {spanforge-1.0.3 → spanforge-1.0.4}/examples/production_multi_agent.py +0 -0
  222. {spanforge-1.0.3 → spanforge-1.0.4}/examples/runtime_governance_demo.py +0 -0
  223. {spanforge-1.0.3 → spanforge-1.0.4}/examples/scope_demo.py +0 -0
  224. {spanforge-1.0.3 → spanforge-1.0.4}/examples/scope_manifest.yaml +0 -0
  225. {spanforge-1.0.3 → spanforge-1.0.4}/examples/secure_pipeline.py +0 -0
  226. {spanforge-1.0.3 → spanforge-1.0.4}/examples/streaming_response.py +0 -0
  227. {spanforge-1.0.3 → spanforge-1.0.4}/examples/testing_mocks_example.py +0 -0
  228. {spanforge-1.0.3 → spanforge-1.0.4}/examples/validate_demo.py +0 -0
  229. {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/Chart.yaml +0 -0
  230. {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/_helpers.tpl +0 -0
  231. {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/deployment.yaml +0 -0
  232. {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/hpa.yaml +0 -0
  233. {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/networkpolicy.yaml +0 -0
  234. {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/pdb.yaml +0 -0
  235. {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/secret.yaml +0 -0
  236. {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/templates/service.yaml +0 -0
  237. {spanforge-1.0.3 → spanforge-1.0.4}/helm/spanforge/values.yaml +0 -0
  238. {spanforge-1.0.3 → spanforge-1.0.4}/k6/README.md +0 -0
  239. {spanforge-1.0.3 → spanforge-1.0.4}/k6/pii_scan_50rps.js +0 -0
  240. {spanforge-1.0.3 → spanforge-1.0.4}/k6/score_100rps.js +0 -0
  241. {spanforge-1.0.3 → spanforge-1.0.4}/k6/secrets_scan_100rps.js +0 -0
  242. {spanforge-1.0.3 → spanforge-1.0.4}/sonar-project.properties +0 -0
  243. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/__init__.py +0 -0
  244. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_ansi.py +0 -0
  245. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_batch_exporter.py +0 -0
  246. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli.py +0 -0
  247. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli_audit.py +0 -0
  248. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli_compliance.py +0 -0
  249. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli_config.py +0 -0
  250. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli_cost.py +0 -0
  251. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli_ops.py +0 -0
  252. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_cli_phase11.py +0 -0
  253. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_hooks.py +0 -0
  254. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_server.py +0 -0
  255. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_span.py +0 -0
  256. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_store.py +0 -0
  257. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_stream.py +0 -0
  258. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_trace.py +0 -0
  259. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/_tracer.py +0 -0
  260. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/actor.py +0 -0
  261. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/alerts.py +0 -0
  262. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/auto.py +0 -0
  263. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/cache.py +0 -0
  264. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/compliance.py +0 -0
  265. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/config.py +0 -0
  266. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/consent.py +0 -0
  267. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/consumer.py +0 -0
  268. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/core/__init__.py +0 -0
  269. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/core/compliance_mapping.py +0 -0
  270. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/core/dx.py +0 -0
  271. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/cost.py +0 -0
  272. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/debug.py +0 -0
  273. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/deprecations.py +0 -0
  274. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/drift.py +0 -0
  275. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/egress.py +0 -0
  276. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/eval.py +0 -0
  277. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/event.py +0 -0
  278. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/exceptions.py +0 -0
  279. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/explain.py +0 -0
  280. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/__init__.py +0 -0
  281. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/append_only.py +0 -0
  282. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/cloud.py +0 -0
  283. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/datadog.py +0 -0
  284. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/grafana.py +0 -0
  285. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/jsonl.py +0 -0
  286. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/openinference.py +0 -0
  287. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/otel_bridge.py +0 -0
  288. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/otlp.py +0 -0
  289. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/otlp_bridge.py +0 -0
  290. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/redis_backend.py +0 -0
  291. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/siem.py +0 -0
  292. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/siem_schema.py +0 -0
  293. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/siem_splunk.py +0 -0
  294. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/siem_syslog.py +0 -0
  295. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/export/webhook.py +0 -0
  296. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/exporters/__init__.py +0 -0
  297. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/exporters/console.py +0 -0
  298. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/exporters/jsonl.py +0 -0
  299. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/exporters/sqlite.py +0 -0
  300. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/gate.py +0 -0
  301. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/governance.py +0 -0
  302. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/hitl.py +0 -0
  303. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/http.py +0 -0
  304. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/inspect.py +0 -0
  305. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/__init__.py +0 -0
  306. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/_pricing.py +0 -0
  307. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/anthropic.py +0 -0
  308. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/azure_openai.py +0 -0
  309. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/bedrock.py +0 -0
  310. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/crewai.py +0 -0
  311. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/gemini.py +0 -0
  312. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/groq.py +0 -0
  313. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/langchain.py +0 -0
  314. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/langgraph.py +0 -0
  315. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/llamaindex.py +0 -0
  316. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/ollama.py +0 -0
  317. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/openai.py +0 -0
  318. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/integrations/together.py +0 -0
  319. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/io.py +0 -0
  320. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/lint.py +0 -0
  321. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/metrics.py +0 -0
  322. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/metrics_export.py +0 -0
  323. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/migrate.py +0 -0
  324. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/model_registry.py +0 -0
  325. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/models.py +0 -0
  326. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/__init__.py +0 -0
  327. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/audit.py +0 -0
  328. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/cache.py +0 -0
  329. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/chain.py +0 -0
  330. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/confidence.py +0 -0
  331. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/consent.py +0 -0
  332. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/cost.py +0 -0
  333. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/decision.py +0 -0
  334. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/diff.py +0 -0
  335. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/drift.py +0 -0
  336. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/eval_.py +0 -0
  337. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/feedback.py +0 -0
  338. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/fence.py +0 -0
  339. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/guard.py +0 -0
  340. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/hitl.py +0 -0
  341. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/latency.py +0 -0
  342. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/prompt.py +0 -0
  343. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/redact.py +0 -0
  344. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/retrieval.py +0 -0
  345. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/runtime_governance.py +0 -0
  346. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/template.py +0 -0
  347. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/tool_call.py +0 -0
  348. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/namespaces/trace.py +0 -0
  349. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/normalizer.py +0 -0
  350. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/plugins.py +0 -0
  351. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/presidio_backend.py +0 -0
  352. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/processor.py +0 -0
  353. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/prompt_registry.py +0 -0
  354. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/py.typed +0 -0
  355. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/redact.py +0 -0
  356. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/regression.py +0 -0
  357. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/runtime_policy.py +0 -0
  358. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sampling.py +0 -0
  359. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/schema.py +0 -0
  360. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/schemas/frameworks/frameworks.yaml +0 -0
  361. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/schemas/v1.0/schema.json +0 -0
  362. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/schemas/v2.0/schema.json +0 -0
  363. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/_base.py +0 -0
  364. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/_base.pyi +0 -0
  365. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/alert.py +0 -0
  366. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/alert.pyi +0 -0
  367. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/audit.pyi +0 -0
  368. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/cec.pyi +0 -0
  369. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/config.py +0 -0
  370. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/config.pyi +0 -0
  371. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/dataset_scanner.py +0 -0
  372. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/enterprise.py +0 -0
  373. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/enterprise.pyi +0 -0
  374. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/explain.py +0 -0
  375. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/fallback.py +0 -0
  376. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/feedback.py +0 -0
  377. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/gate.py +0 -0
  378. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/gate.pyi +0 -0
  379. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/identity.py +0 -0
  380. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/identity.pyi +0 -0
  381. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/lineage.py +0 -0
  382. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/observe.py +0 -0
  383. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/observe.pyi +0 -0
  384. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/operator.py +0 -0
  385. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/pii.py +0 -0
  386. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/pii.pyi +0 -0
  387. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/pipelines.py +0 -0
  388. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/pipelines.pyi +0 -0
  389. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/policy.py +0 -0
  390. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/rag.py +0 -0
  391. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/rbac.py +0 -0
  392. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/registry.py +0 -0
  393. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/registry.pyi +0 -0
  394. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/scope.py +0 -0
  395. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/secrets.py +0 -0
  396. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/secrets.pyi +0 -0
  397. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/security.py +0 -0
  398. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/security.pyi +0 -0
  399. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/trust.py +0 -0
  400. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/trust.pyi +0 -0
  401. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/sdk/validate.py +0 -0
  402. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/secrets.py +0 -0
  403. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/signing.py +0 -0
  404. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/stats.py +0 -0
  405. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/stream.py +0 -0
  406. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/testing_mocks.py +0 -0
  407. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/trace.py +0 -0
  408. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/types.py +0 -0
  409. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/ulid.py +0 -0
  410. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/validate.py +0 -0
  411. {spanforge-1.0.3 → spanforge-1.0.4}/src/spanforge/workflow.py +0 -0
  412. {spanforge-1.0.3 → spanforge-1.0.4}/test_agent.jsonl +0 -0
  413. {spanforge-1.0.3 → spanforge-1.0.4}/test_events.jsonl +0 -0
  414. {spanforge-1.0.3 → spanforge-1.0.4}/tests/__init__.py +0 -0
  415. {spanforge-1.0.3 → spanforge-1.0.4}/tests/chaos/README.md +0 -0
  416. {spanforge-1.0.3 → spanforge-1.0.4}/tests/chaos/test_service_unavailability.py +0 -0
  417. {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/__init__.py +0 -0
  418. {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures/chain.json +0 -0
  419. {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures/compliance.json +0 -0
  420. {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures/key_security.json +0 -0
  421. {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures/migration.json +0 -0
  422. {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures/pii.json +0 -0
  423. {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures/signing.json +0 -0
  424. {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/fixtures.json +0 -0
  425. {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/run_conformance.py +0 -0
  426. {spanforge-1.0.3 → spanforge-1.0.4}/tests/conformance/test_conformance.py +0 -0
  427. {spanforge-1.0.3 → spanforge-1.0.4}/tests/conftest.py +0 -0
  428. {spanforge-1.0.3 → spanforge-1.0.4}/tests/fixtures/clean_dataset/data.jsonl +0 -0
  429. {spanforge-1.0.3 → spanforge-1.0.4}/tests/fixtures/no_consent_dataset/data.jsonl +0 -0
  430. {spanforge-1.0.3 → spanforge-1.0.4}/tests/fixtures/pii_dataset/data.jsonl +0 -0
  431. {spanforge-1.0.3 → spanforge-1.0.4}/tests/integration/__init__.py +0 -0
  432. {spanforge-1.0.3 → spanforge-1.0.4}/tests/integration/test_dx_integration.py +0 -0
  433. {spanforge-1.0.3 → spanforge-1.0.4}/tests/load/README.md +0 -0
  434. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_1e1_siem_langgraph.py +0 -0
  435. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_actor.py +0 -0
  436. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_alerts.py +0 -0
  437. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_ansi.py +0 -0
  438. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_auto.py +0 -0
  439. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_baseline.py +0 -0
  440. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_batch_exporter.py +0 -0
  441. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_benchmarks.py +0 -0
  442. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_budget_alert.py +0 -0
  443. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cache.py +0 -0
  444. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli.py +0 -0
  445. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_audit_module.py +0 -0
  446. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_compliance_dataset.py +0 -0
  447. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_compliance_module.py +0 -0
  448. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_config_1d1.py +0 -0
  449. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_cost_module.py +0 -0
  450. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_ops_module.py +0 -0
  451. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cli_phase11_module.py +0 -0
  452. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_compliance.py +0 -0
  453. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_compliance_mapping.py +0 -0
  454. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_config_interpolate.py +0 -0
  455. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_consent.py +0 -0
  456. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_consumer.py +0 -0
  457. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cost_event_emission.py +0 -0
  458. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_cost_tracker.py +0 -0
  459. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_costguard_gaps.py +0 -0
  460. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_coverage_gaps.py +0 -0
  461. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_coverage_supplement_1.py +0 -0
  462. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_coverage_supplement_2.py +0 -0
  463. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_coverage_supplement_3.py +0 -0
  464. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_coverage_supplement_4.py +0 -0
  465. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_dataset_scanner.py +0 -0
  466. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_deprecations.py +0 -0
  467. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_drift.py +0 -0
  468. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_e2e_cli.py +0 -0
  469. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_egress_and_normalizer.py +0 -0
  470. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_eval_behaviour_scorer.py +0 -0
  471. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_event.py +0 -0
  472. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_exceptions.py +0 -0
  473. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_explain.py +0 -0
  474. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_cloud.py +0 -0
  475. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_datadog.py +0 -0
  476. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_grafana.py +0 -0
  477. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_jsonl.py +0 -0
  478. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_otel_bridge.py +0 -0
  479. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_otlp.py +0 -0
  480. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_redis_backend.py +0 -0
  481. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_siem_splunk.py +0 -0
  482. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_siem_syslog.py +0 -0
  483. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_export_webhook.py +0 -0
  484. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_feedback.py +0 -0
  485. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_framework_mapper.py +0 -0
  486. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_gate_deep.py +0 -0
  487. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_governance.py +0 -0
  488. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_hitl.py +0 -0
  489. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_http.py +0 -0
  490. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_inspect.py +0 -0
  491. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_integration.py +0 -0
  492. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_integrations.py +0 -0
  493. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_io.py +0 -0
  494. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_lint.py +0 -0
  495. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_migrate.py +0 -0
  496. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_model_registry.py +0 -0
  497. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_models.py +0 -0
  498. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_namespaces.py +0 -0
  499. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_otlp_bridge.py +0 -0
  500. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase0_scale.py +0 -0
  501. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase10_features.py +0 -0
  502. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase10_trust.py +0 -0
  503. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase11_enterprise.py +0 -0
  504. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase11_security.py +0 -0
  505. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase12_dx.py +0 -0
  506. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase1_context_trace.py +0 -0
  507. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase2_observability.py +0 -0
  508. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase3_debug_sampling.py +0 -0
  509. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase4_agent_instrumentation.py +0 -0
  510. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase4_metrics_store.py +0 -0
  511. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase5_console_exporter.py +0 -0
  512. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase5_coverage.py +0 -0
  513. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase5_enterprise_integrations.py +0 -0
  514. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase5_hooks_crewai.py +0 -0
  515. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase6_enterprise_deployment_packaging.py +0 -0
  516. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase6_openai_integration.py +0 -0
  517. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_phase8_release_hardening.py +0 -0
  518. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_plugins.py +0 -0
  519. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_processor_coverage.py +0 -0
  520. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_prompt_registry.py +0 -0
  521. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_properties.py +0 -0
  522. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_public_root_lazy_imports.py +0 -0
  523. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_rag.py +0 -0
  524. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_redact.py +0 -0
  525. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_regression.py +0 -0
  526. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_repo_guardrails.py +0 -0
  527. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_rfc_namespaces.py +0 -0
  528. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_runtime_governance_phase0.py +0 -0
  529. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sampling_coverage.py +0 -0
  530. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_schema.py +0 -0
  531. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_config.py +0 -0
  532. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_coverage_boost.py +0 -0
  533. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_explain.py +0 -0
  534. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_exporters.py +0 -0
  535. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_final_coverage.py +0 -0
  536. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_gap_filler.py +0 -0
  537. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_openai_integration.py +0 -0
  538. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_phase7_integrations.py +0 -0
  539. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_pipelines_deep.py +0 -0
  540. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_precision_coverage.py +0 -0
  541. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_scope.py +0 -0
  542. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_span.py +0 -0
  543. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_stream.py +0 -0
  544. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_tracer.py +0 -0
  545. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_validate.py +0 -0
  546. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sdk_validation_coverage.py +0 -0
  547. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_server.py +0 -0
  548. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf11.py +0 -0
  549. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf12.py +0 -0
  550. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf13.py +0 -0
  551. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf14.py +0 -0
  552. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf15.py +0 -0
  553. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf16.py +0 -0
  554. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf9_config.py +0 -0
  555. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_alert.py +0 -0
  556. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_audit.py +0 -0
  557. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_cec.py +0 -0
  558. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_explain.py +0 -0
  559. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_gate.py +0 -0
  560. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_identity.py +0 -0
  561. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_lineage.py +0 -0
  562. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_observe.py +0 -0
  563. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_operator.py +0 -0
  564. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_pii.py +0 -0
  565. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_policy.py +0 -0
  566. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_policy_integration.py +0 -0
  567. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_policy_phase3.py +0 -0
  568. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_rag.py +0 -0
  569. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_rbac.py +0 -0
  570. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_scope.py +0 -0
  571. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_sf_secrets.py +0 -0
  572. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_signing.py +0 -0
  573. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_stats.py +0 -0
  574. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_stream.py +0 -0
  575. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_trace_decorator.py +0 -0
  576. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_trace_pytest_fixtures.py +0 -0
  577. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_types.py +0 -0
  578. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_ulid.py +0 -0
  579. {spanforge-1.0.3 → spanforge-1.0.4}/tests/test_validate.py +0 -0
  580. {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-10T04:04:09.036213+00:00",
12
- "pipeline_id": "d306e1c3-c437-4317-9c71-6532e5cac4a4",
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-10T04:03:48.163107+00:00",
7
+ "timestamp": "2026-05-19T01:25:42.885005+00:00",
8
8
  "duration_ms": 0,
9
9
  "project_id": "",
10
- "pipeline_id": "91e805b8-09a4-498e-bdde-f3b64e272e54"
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
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-7049%20passing-brightgreen" alt="7049 tests"/>
122
- <img src="https://img.shields.io/badge/version-1.0.2-4c8cbf" alt="Version 1.0.2"/>
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-7049%20passing-brightgreen" alt="7049 tests"/>
18
- <img src="https://img.shields.io/badge/version-1.0.2-4c8cbf" alt="Version 1.0.2"/>
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.2 — see docs/changelog.md for version history
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-10T04:03:56.547201+00:00",
7
+ "timestamp": "2026-05-19T01:26:04.752717+00:00",
8
8
  "duration_ms": 0,
9
9
  "project_id": "",
10
- "pipeline_id": "8d45499c-d333-4145-a102-f3d83feb2cd5"
10
+ "pipeline_id": "d422f0ad-be37-4ced-8502-8b74b493439e"
11
11
  }
@@ -5,7 +5,7 @@
5
5
  "dimension_breakdown": {},
6
6
  "framework": "",
7
7
  "policy_file": "",
8
- "timestamp": "2026-05-10T04:03:56.555914+00:00",
8
+ "timestamp": "2026-05-19T01:26:04.760889+00:00",
9
9
  "allow": false,
10
10
  "project_id": "proj-1"
11
11
  }
@@ -8,7 +8,7 @@
8
8
  "secrets_detected": false,
9
9
  "secrets_detections_24h": 0,
10
10
  "failures": [],
11
- "timestamp": "2026-05-10T04:03:56.559324+00:00",
12
- "pipeline_id": "fe4641af-3a35-4c4c-a874-4fe4f5ca8f4a",
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
- ## [Unreleased]
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.3 — 2026-03-05
2326
+ ## 1.0.2 — 2026-05-10 [Released on PyPI](https://pypi.org/project/spanforge/1.0.2/)
2230
2327
 
2231
- **Version bump**
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.2** — [Changelog](changelog.md) · [![PyPI](https://img.shields.io/pypi/v/spanforge?color=4c8cbf&logo=pypi&logoColor=white)](https://pypi.org/project/spanforge/)
4
+ > Current release: **1.0.4** — [Changelog](changelog.md) · [![PyPI](https://img.shields.io/pypi/v/spanforge?color=4c8cbf&logo=pypi&logoColor=white)](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.2
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.3"
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__(self, secret_types: list[str], count: int = 1) -> None:
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__(self, entity_types: list[str], count: int = 1) -> None:
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):