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