spanforge 1.0.1__tar.gz → 1.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (575) hide show
  1. {spanforge-1.0.1 → spanforge-1.0.2}/.gitignore +2 -0
  2. spanforge-1.0.2/.sf-gate/artifacts/g1_result.json +11 -0
  3. spanforge-1.0.2/.sf-gate/artifacts/gate5_governance_result.json +11 -0
  4. {spanforge-1.0.1 → spanforge-1.0.2}/.sf-gate/artifacts/gate6_trust_result.json +2 -2
  5. {spanforge-1.0.1 → spanforge-1.0.2}/.sf-gate/artifacts/test-gate_result.json +2 -2
  6. {spanforge-1.0.1 → spanforge-1.0.2}/PKG-INFO +56 -22
  7. {spanforge-1.0.1 → spanforge-1.0.2}/README.md +55 -21
  8. {spanforge-1.0.1 → spanforge-1.0.2}/RELEASE.md +1 -1
  9. spanforge-1.0.2/SPANFORGE_COMPLETE_Master_Build_Plan_v6_FULL.md +949 -0
  10. spanforge-1.0.2/artifacts/g1_result.json +11 -0
  11. spanforge-1.0.2/artifacts/gate5_governance_result.json +11 -0
  12. spanforge-1.0.2/artifacts/gate6_trust_result.json +14 -0
  13. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/compliance.md +133 -4
  14. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/exceptions.md +34 -2
  15. spanforge-1.0.2/docs/api/explain.md +200 -0
  16. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/gate.md +15 -13
  17. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/governance.md +45 -0
  18. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/hooks.md +1 -0
  19. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/pii.md +12 -9
  20. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/pipelines.md +23 -23
  21. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/scope.md +34 -0
  22. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/sdk-reference.md +35 -0
  23. spanforge-1.0.2/docs/api/testing_mocks.md +275 -0
  24. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/validate.md +158 -9
  25. {spanforge-1.0.1 → spanforge-1.0.2}/docs/changelog.md +237 -20
  26. {spanforge-1.0.1 → spanforge-1.0.2}/docs/cli.md +427 -52
  27. {spanforge-1.0.1 → spanforge-1.0.2}/docs/configuration.md +61 -0
  28. {spanforge-1.0.1 → spanforge-1.0.2}/docs/ga-release-notes.md +16 -9
  29. {spanforge-1.0.1 → spanforge-1.0.2}/docs/index.md +2 -1
  30. {spanforge-1.0.1 → spanforge-1.0.2}/docs/installation.md +1 -1
  31. {spanforge-1.0.1 → spanforge-1.0.2}/docs/runbook.md +17 -17
  32. {spanforge-1.0.1 → spanforge-1.0.2}/docs/runtime-governance.md +1 -1
  33. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/compliance.md +131 -6
  34. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/export.md +6 -1
  35. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/gate.md +2 -2
  36. spanforge-1.0.2/examples/explain_demo.py +133 -0
  37. spanforge-1.0.2/examples/scope_demo.py +207 -0
  38. spanforge-1.0.2/examples/scope_manifest.yaml +55 -0
  39. spanforge-1.0.2/examples/validate_demo.py +216 -0
  40. {spanforge-1.0.1 → spanforge-1.0.2}/pyproject.toml +8 -1
  41. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/__init__.py +47 -0
  42. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_cli.py +153 -73
  43. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_cli_audit.py +98 -2
  44. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_cli_compliance.py +75 -0
  45. spanforge-1.0.2/src/spanforge/_cli_config.py +583 -0
  46. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_cli_ops.py +42 -2
  47. spanforge-1.0.2/src/spanforge/export/siem.py +214 -0
  48. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/governance.py +80 -2
  49. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/langgraph.py +207 -0
  50. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/__init__.py +145 -122
  51. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/_exceptions.py +34 -0
  52. spanforge-1.0.2/src/spanforge/sdk/dataset_scanner.py +624 -0
  53. spanforge-1.0.2/src/spanforge/sdk/explain.py +730 -0
  54. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/fallback.py +37 -1
  55. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/scope.py +210 -5
  56. spanforge-1.0.2/src/spanforge/sdk/validate.py +683 -0
  57. spanforge-1.0.2/tests/fixtures/clean_dataset/data.jsonl +5 -0
  58. spanforge-1.0.2/tests/fixtures/no_consent_dataset/data.jsonl +5 -0
  59. spanforge-1.0.2/tests/fixtures/pii_dataset/data.jsonl +5 -0
  60. spanforge-1.0.2/tests/test_1e1_siem_langgraph.py +417 -0
  61. spanforge-1.0.2/tests/test_cli_compliance_dataset.py +444 -0
  62. spanforge-1.0.2/tests/test_cli_config_1d1.py +600 -0
  63. spanforge-1.0.2/tests/test_coverage_supplement_1.py +974 -0
  64. spanforge-1.0.2/tests/test_coverage_supplement_2.py +782 -0
  65. spanforge-1.0.2/tests/test_coverage_supplement_3.py +549 -0
  66. spanforge-1.0.2/tests/test_coverage_supplement_4.py +835 -0
  67. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_dataset_scanner.py +27 -19
  68. spanforge-1.0.2/tests/test_sdk_explain.py +553 -0
  69. spanforge-1.0.2/tests/test_sdk_scope.py +603 -0
  70. spanforge-1.0.2/tests/test_sdk_validate.py +521 -0
  71. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_types.py +23 -22
  72. spanforge-1.0.1/cov_calc.py +0 -27
  73. spanforge-1.0.1/cov_out.txt +0 -0
  74. spanforge-1.0.1/docs/api/explain.md +0 -94
  75. spanforge-1.0.1/docs/api/testing_mocks.md +0 -247
  76. spanforge-1.0.1/src/spanforge/sdk/explain.py +0 -273
  77. {spanforge-1.0.1 → spanforge-1.0.2}/.bandit +0 -0
  78. {spanforge-1.0.1 → spanforge-1.0.2}/.gitattributes +0 -0
  79. {spanforge-1.0.1 → spanforge-1.0.2}/.github/CODEOWNERS +0 -0
  80. {spanforge-1.0.1 → spanforge-1.0.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  81. {spanforge-1.0.1 → spanforge-1.0.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  82. {spanforge-1.0.1 → spanforge-1.0.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  83. {spanforge-1.0.1 → spanforge-1.0.2}/.github/ISSUE_TEMPLATE/rfc.yml +0 -0
  84. {spanforge-1.0.1 → spanforge-1.0.2}/.github/pull_request_template.md +0 -0
  85. {spanforge-1.0.1 → spanforge-1.0.2}/.github/workflows/ci.yml +0 -0
  86. {spanforge-1.0.1 → spanforge-1.0.2}/.github/workflows/release.yml +0 -0
  87. {spanforge-1.0.1 → spanforge-1.0.2}/.pre-commit-hooks.yaml +0 -0
  88. {spanforge-1.0.1 → spanforge-1.0.2}/CNAME +0 -0
  89. {spanforge-1.0.1 → spanforge-1.0.2}/CODE_OF_CONDUCT.md +0 -0
  90. {spanforge-1.0.1 → spanforge-1.0.2}/CONFORMANCE.md +0 -0
  91. {spanforge-1.0.1 → spanforge-1.0.2}/LICENSE +0 -0
  92. {spanforge-1.0.1 → spanforge-1.0.2}/MAINTAINERS.md +0 -0
  93. {spanforge-1.0.1 → spanforge-1.0.2}/PRICING.md +0 -0
  94. {spanforge-1.0.1 → spanforge-1.0.2}/SECURITY.md +0 -0
  95. {spanforge-1.0.1 → spanforge-1.0.2}/docker-compose.selfhosted.yml +0 -0
  96. {spanforge-1.0.1 → spanforge-1.0.2}/docs/Makefile +0 -0
  97. {spanforge-1.0.1 → spanforge-1.0.2}/docs/_static/.gitkeep +0 -0
  98. {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-001-immutable-audit-trail.md +0 -0
  99. {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-002-singleton-service-clients.md +0 -0
  100. {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-003-schema-versioning-strategy.md +0 -0
  101. {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-004-local-first-architecture.md +0 -0
  102. {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-005-sandbox-mode.md +0 -0
  103. {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-006-rag-tracing.md +0 -0
  104. {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-007-user-feedback.md +0 -0
  105. {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/ADR-008-sso-scim-oidc.md +0 -0
  106. {spanforge-1.0.1 → spanforge-1.0.2}/docs/adr/README.md +0 -0
  107. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/alert.md +0 -0
  108. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/audit.md +0 -0
  109. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/auto.md +0 -0
  110. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/cache.md +0 -0
  111. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/cec.md +0 -0
  112. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/config.md +0 -0
  113. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/consumer.md +0 -0
  114. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/debug.md +0 -0
  115. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/deprecations.md +0 -0
  116. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/drift.md +0 -0
  117. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/enterprise.md +0 -0
  118. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/eval.md +0 -0
  119. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/event.md +0 -0
  120. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/export.md +0 -0
  121. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/feedback.md +0 -0
  122. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/http.md +0 -0
  123. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/identity.md +0 -0
  124. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/index.md +0 -0
  125. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/integrations.md +0 -0
  126. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/io.md +0 -0
  127. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/lineage.md +0 -0
  128. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/lint.md +0 -0
  129. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/metrics.md +0 -0
  130. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/migrate.md +0 -0
  131. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/models.md +0 -0
  132. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/normalizer.md +0 -0
  133. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/observe.md +0 -0
  134. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/operator.md +0 -0
  135. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/plugins.md +0 -0
  136. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/policy.md +0 -0
  137. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/rag.md +0 -0
  138. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/rbac.md +0 -0
  139. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/redact.md +0 -0
  140. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/regression.md +0 -0
  141. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/schema.md +0 -0
  142. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/secrets.md +0 -0
  143. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/signing.md +0 -0
  144. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/stats.md +0 -0
  145. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/store.md +0 -0
  146. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/stream.md +0 -0
  147. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/testing.md +0 -0
  148. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/trace.md +0 -0
  149. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/trust.md +0 -0
  150. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/types.md +0 -0
  151. {spanforge-1.0.1 → spanforge-1.0.2}/docs/api/ulid.md +0 -0
  152. {spanforge-1.0.1 → spanforge-1.0.2}/docs/competitor-comparison.md +0 -0
  153. {spanforge-1.0.1 → spanforge-1.0.2}/docs/conf.py +0 -0
  154. {spanforge-1.0.1 → spanforge-1.0.2}/docs/contributing.md +0 -0
  155. {spanforge-1.0.1 → spanforge-1.0.2}/docs/demos/enterprise-evidence-demo.md +0 -0
  156. {spanforge-1.0.1 → spanforge-1.0.2}/docs/demos/runtime-governance-demo.md +0 -0
  157. {spanforge-1.0.1 → spanforge-1.0.2}/docs/deployment/air-gapped.md +0 -0
  158. {spanforge-1.0.1 → spanforge-1.0.2}/docs/deployment/kubernetes.md +0 -0
  159. {spanforge-1.0.1 → spanforge-1.0.2}/docs/enterprise-integrations.md +0 -0
  160. {spanforge-1.0.1 → spanforge-1.0.2}/docs/evidence-export.md +0 -0
  161. {spanforge-1.0.1 → spanforge-1.0.2}/docs/integrations/crewai.md +0 -0
  162. {spanforge-1.0.1 → spanforge-1.0.2}/docs/integrations/halluccheck.md +0 -0
  163. {spanforge-1.0.1 → spanforge-1.0.2}/docs/make.bat +0 -0
  164. {spanforge-1.0.1 → spanforge-1.0.2}/docs/migrations/from-langfuse.md +0 -0
  165. {spanforge-1.0.1 → spanforge-1.0.2}/docs/migrations/from-langsmith.md +0 -0
  166. {spanforge-1.0.1 → spanforge-1.0.2}/docs/migrations/from-openllmetry.md +0 -0
  167. {spanforge-1.0.1 → spanforge-1.0.2}/docs/migrations/v5-to-v6.md +0 -0
  168. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/audit.md +0 -0
  169. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/cache.md +0 -0
  170. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/consent.md +0 -0
  171. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/cost.md +0 -0
  172. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/diff.md +0 -0
  173. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/eval.md +0 -0
  174. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/explanation.md +0 -0
  175. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/feedback.md +0 -0
  176. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/fence.md +0 -0
  177. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/guard.md +0 -0
  178. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/hitl.md +0 -0
  179. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/index.md +0 -0
  180. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/model_registry.md +0 -0
  181. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/prompt.md +0 -0
  182. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/redact_ns.md +0 -0
  183. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/retrieval.md +0 -0
  184. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/template.md +0 -0
  185. {spanforge-1.0.1 → spanforge-1.0.2}/docs/namespaces/trace.md +0 -0
  186. {spanforge-1.0.1 → spanforge-1.0.2}/docs/quickstart.md +0 -0
  187. {spanforge-1.0.1 → spanforge-1.0.2}/docs/reference-architectures.md +0 -0
  188. {spanforge-1.0.1 → spanforge-1.0.2}/docs/replay-simulation.md +0 -0
  189. {spanforge-1.0.1 → spanforge-1.0.2}/docs/rfc/adr-index.md +0 -0
  190. {spanforge-1.0.1 → spanforge-1.0.2}/docs/rfc/rfc-0001.md +0 -0
  191. {spanforge-1.0.1 → spanforge-1.0.2}/docs/runtime-governance-contracts.md +0 -0
  192. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/README.md +0 -0
  193. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/envelope.schema.json +0 -0
  194. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/agent-run.schema.json +0 -0
  195. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/agent-step.schema.json +0 -0
  196. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/audit.schema.json +0 -0
  197. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/cache.schema.json +0 -0
  198. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/consent.schema.json +0 -0
  199. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/cost.schema.json +0 -0
  200. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/diff.schema.json +0 -0
  201. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/eval.schema.json +0 -0
  202. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/explanation.schema.json +0 -0
  203. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/fence.schema.json +0 -0
  204. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/guard.schema.json +0 -0
  205. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/hitl.schema.json +0 -0
  206. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/model-registry.schema.json +0 -0
  207. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/prompt.schema.json +0 -0
  208. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/redact.schema.json +0 -0
  209. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/span.schema.json +0 -0
  210. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/payloads/template.schema.json +0 -0
  211. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema/types/common.schema.json +0 -0
  212. {spanforge-1.0.1 → spanforge-1.0.2}/docs/schema-versioning.md +0 -0
  213. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/alert.md +0 -0
  214. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/audit.md +0 -0
  215. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/cache.md +0 -0
  216. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/custom_exporters.md +0 -0
  217. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/debugging.md +0 -0
  218. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/events.md +0 -0
  219. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/feedback.md +0 -0
  220. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/governance.md +0 -0
  221. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/in_memory_state.md +0 -0
  222. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/index.md +0 -0
  223. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/linting.md +0 -0
  224. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/metrics.md +0 -0
  225. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/migration.md +0 -0
  226. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/rag.md +0 -0
  227. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/redaction.md +0 -0
  228. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/signing.md +0 -0
  229. {spanforge-1.0.1 → spanforge-1.0.2}/docs/user_guide/tracing.md +0 -0
  230. {spanforge-1.0.1 → spanforge-1.0.2}/examples/agent_workflow.py +0 -0
  231. {spanforge-1.0.1 → spanforge-1.0.2}/examples/budget_alert.py +0 -0
  232. {spanforge-1.0.1 → spanforge-1.0.2}/examples/docker/Dockerfile +0 -0
  233. {spanforge-1.0.1 → spanforge-1.0.2}/examples/docker/docker-compose.yml +0 -0
  234. {spanforge-1.0.1 → spanforge-1.0.2}/examples/docker/otel-config.yaml +0 -0
  235. {spanforge-1.0.1 → spanforge-1.0.2}/examples/enterprise_evidence_demo.py +0 -0
  236. {spanforge-1.0.1 → spanforge-1.0.2}/examples/gates/gate5_governance.yaml +0 -0
  237. {spanforge-1.0.1 → spanforge-1.0.2}/examples/gates/sf-gate.yaml +0 -0
  238. {spanforge-1.0.1 → spanforge-1.0.2}/examples/langchain_chain.py +0 -0
  239. {spanforge-1.0.1 → spanforge-1.0.2}/examples/multi_agent_rag.py +0 -0
  240. {spanforge-1.0.1 → spanforge-1.0.2}/examples/multi_tenant.py +0 -0
  241. {spanforge-1.0.1 → spanforge-1.0.2}/examples/openai_chat.py +0 -0
  242. {spanforge-1.0.1 → spanforge-1.0.2}/examples/otlp_grafana.py +0 -0
  243. {spanforge-1.0.1 → spanforge-1.0.2}/examples/production_multi_agent.py +0 -0
  244. {spanforge-1.0.1 → spanforge-1.0.2}/examples/runtime_governance_demo.py +0 -0
  245. {spanforge-1.0.1 → spanforge-1.0.2}/examples/secure_pipeline.py +0 -0
  246. {spanforge-1.0.1 → spanforge-1.0.2}/examples/streaming_response.py +0 -0
  247. {spanforge-1.0.1 → spanforge-1.0.2}/examples/testing_mocks_example.py +0 -0
  248. {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/Chart.yaml +0 -0
  249. {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/_helpers.tpl +0 -0
  250. {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/deployment.yaml +0 -0
  251. {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/hpa.yaml +0 -0
  252. {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/networkpolicy.yaml +0 -0
  253. {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/pdb.yaml +0 -0
  254. {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/secret.yaml +0 -0
  255. {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/templates/service.yaml +0 -0
  256. {spanforge-1.0.1 → spanforge-1.0.2}/helm/spanforge/values.yaml +0 -0
  257. {spanforge-1.0.1 → spanforge-1.0.2}/k6/README.md +0 -0
  258. {spanforge-1.0.1 → spanforge-1.0.2}/k6/pii_scan_50rps.js +0 -0
  259. {spanforge-1.0.1 → spanforge-1.0.2}/k6/score_100rps.js +0 -0
  260. {spanforge-1.0.1 → spanforge-1.0.2}/k6/secrets_scan_100rps.js +0 -0
  261. {spanforge-1.0.1 → spanforge-1.0.2}/sonar-project.properties +0 -0
  262. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_ansi.py +0 -0
  263. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_batch_exporter.py +0 -0
  264. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_cli_cost.py +0 -0
  265. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_cli_phase11.py +0 -0
  266. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_hooks.py +0 -0
  267. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_server.py +0 -0
  268. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_span.py +0 -0
  269. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_store.py +0 -0
  270. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_stream.py +0 -0
  271. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_trace.py +0 -0
  272. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/_tracer.py +0 -0
  273. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/actor.py +0 -0
  274. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/alerts.py +0 -0
  275. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/auto.py +0 -0
  276. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/baseline.py +0 -0
  277. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/cache.py +0 -0
  278. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/compliance.py +0 -0
  279. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/config.py +0 -0
  280. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/consent.py +0 -0
  281. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/consumer.py +0 -0
  282. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/core/__init__.py +0 -0
  283. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/core/compliance_mapping.py +0 -0
  284. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/core/dx.py +0 -0
  285. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/cost.py +0 -0
  286. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/debug.py +0 -0
  287. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/deprecations.py +0 -0
  288. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/drift.py +0 -0
  289. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/egress.py +0 -0
  290. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/eval.py +0 -0
  291. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/event.py +0 -0
  292. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/exceptions.py +0 -0
  293. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/explain.py +0 -0
  294. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/__init__.py +0 -0
  295. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/append_only.py +0 -0
  296. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/cloud.py +0 -0
  297. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/datadog.py +0 -0
  298. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/grafana.py +0 -0
  299. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/jsonl.py +0 -0
  300. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/openinference.py +0 -0
  301. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/otel_bridge.py +0 -0
  302. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/otlp.py +0 -0
  303. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/otlp_bridge.py +0 -0
  304. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/redis_backend.py +0 -0
  305. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/siem_schema.py +0 -0
  306. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/siem_splunk.py +0 -0
  307. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/siem_syslog.py +0 -0
  308. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/export/webhook.py +0 -0
  309. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/exporters/__init__.py +0 -0
  310. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/exporters/console.py +0 -0
  311. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/exporters/jsonl.py +0 -0
  312. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/exporters/sqlite.py +0 -0
  313. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/gate.py +0 -0
  314. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/hitl.py +0 -0
  315. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/http.py +0 -0
  316. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/inspect.py +0 -0
  317. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/__init__.py +0 -0
  318. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/_pricing.py +0 -0
  319. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/anthropic.py +0 -0
  320. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/azure_openai.py +0 -0
  321. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/bedrock.py +0 -0
  322. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/crewai.py +0 -0
  323. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/gemini.py +0 -0
  324. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/groq.py +0 -0
  325. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/langchain.py +0 -0
  326. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/llamaindex.py +0 -0
  327. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/ollama.py +0 -0
  328. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/openai.py +0 -0
  329. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/integrations/together.py +0 -0
  330. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/io.py +0 -0
  331. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/lint.py +0 -0
  332. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/metrics.py +0 -0
  333. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/metrics_export.py +0 -0
  334. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/migrate.py +0 -0
  335. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/model_registry.py +0 -0
  336. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/models.py +0 -0
  337. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/__init__.py +0 -0
  338. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/audit.py +0 -0
  339. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/cache.py +0 -0
  340. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/chain.py +0 -0
  341. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/confidence.py +0 -0
  342. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/consent.py +0 -0
  343. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/cost.py +0 -0
  344. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/decision.py +0 -0
  345. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/diff.py +0 -0
  346. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/drift.py +0 -0
  347. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/eval_.py +0 -0
  348. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/feedback.py +0 -0
  349. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/fence.py +0 -0
  350. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/guard.py +0 -0
  351. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/hitl.py +0 -0
  352. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/latency.py +0 -0
  353. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/prompt.py +0 -0
  354. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/redact.py +0 -0
  355. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/retrieval.py +0 -0
  356. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/runtime_governance.py +0 -0
  357. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/template.py +0 -0
  358. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/tool_call.py +0 -0
  359. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/namespaces/trace.py +0 -0
  360. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/normalizer.py +0 -0
  361. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/plugins.py +0 -0
  362. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/presidio_backend.py +0 -0
  363. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/processor.py +0 -0
  364. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/prompt_registry.py +0 -0
  365. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/py.typed +0 -0
  366. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/redact.py +0 -0
  367. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/regression.py +0 -0
  368. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/runtime_policy.py +0 -0
  369. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sampling.py +0 -0
  370. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/schema.py +0 -0
  371. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/schemas/frameworks/frameworks.yaml +0 -0
  372. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/schemas/v1.0/schema.json +0 -0
  373. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/schemas/v2.0/schema.json +0 -0
  374. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/_base.py +0 -0
  375. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/_base.pyi +0 -0
  376. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/_types.py +0 -0
  377. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/alert.py +0 -0
  378. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/alert.pyi +0 -0
  379. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/audit.py +0 -0
  380. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/audit.pyi +0 -0
  381. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/cec.py +0 -0
  382. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/cec.pyi +0 -0
  383. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/config.py +0 -0
  384. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/config.pyi +0 -0
  385. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/enterprise.py +0 -0
  386. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/enterprise.pyi +0 -0
  387. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/feedback.py +0 -0
  388. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/gate.py +0 -0
  389. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/gate.pyi +0 -0
  390. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/identity.py +0 -0
  391. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/identity.pyi +0 -0
  392. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/lineage.py +0 -0
  393. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/observe.py +0 -0
  394. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/observe.pyi +0 -0
  395. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/operator.py +0 -0
  396. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/pii.py +0 -0
  397. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/pii.pyi +0 -0
  398. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/pipelines.py +0 -0
  399. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/pipelines.pyi +0 -0
  400. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/policy.py +0 -0
  401. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/rag.py +0 -0
  402. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/rbac.py +0 -0
  403. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/registry.py +0 -0
  404. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/registry.pyi +0 -0
  405. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/secrets.py +0 -0
  406. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/secrets.pyi +0 -0
  407. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/security.py +0 -0
  408. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/security.pyi +0 -0
  409. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/trust.py +0 -0
  410. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/sdk/trust.pyi +0 -0
  411. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/secrets.py +0 -0
  412. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/signing.py +0 -0
  413. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/stats.py +0 -0
  414. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/stream.py +0 -0
  415. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/testing.py +0 -0
  416. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/testing_mocks.py +0 -0
  417. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/trace.py +0 -0
  418. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/types.py +0 -0
  419. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/ulid.py +0 -0
  420. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/validate.py +0 -0
  421. {spanforge-1.0.1 → spanforge-1.0.2}/src/spanforge/workflow.py +0 -0
  422. {spanforge-1.0.1 → spanforge-1.0.2}/test_agent.jsonl +0 -0
  423. {spanforge-1.0.1 → spanforge-1.0.2}/test_events.jsonl +0 -0
  424. {spanforge-1.0.1 → spanforge-1.0.2}/tests/__init__.py +0 -0
  425. {spanforge-1.0.1 → spanforge-1.0.2}/tests/chaos/README.md +0 -0
  426. {spanforge-1.0.1 → spanforge-1.0.2}/tests/chaos/test_service_unavailability.py +0 -0
  427. {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/__init__.py +0 -0
  428. {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures/chain.json +0 -0
  429. {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures/compliance.json +0 -0
  430. {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures/key_security.json +0 -0
  431. {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures/migration.json +0 -0
  432. {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures/pii.json +0 -0
  433. {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures/signing.json +0 -0
  434. {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/fixtures.json +0 -0
  435. {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/run_conformance.py +0 -0
  436. {spanforge-1.0.1 → spanforge-1.0.2}/tests/conformance/test_conformance.py +0 -0
  437. {spanforge-1.0.1 → spanforge-1.0.2}/tests/conftest.py +0 -0
  438. {spanforge-1.0.1 → spanforge-1.0.2}/tests/integration/__init__.py +0 -0
  439. {spanforge-1.0.1 → spanforge-1.0.2}/tests/integration/test_dx_integration.py +0 -0
  440. {spanforge-1.0.1 → spanforge-1.0.2}/tests/load/README.md +0 -0
  441. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_actor.py +0 -0
  442. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_alerts.py +0 -0
  443. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_ansi.py +0 -0
  444. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_auto.py +0 -0
  445. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_baseline.py +0 -0
  446. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_batch_exporter.py +0 -0
  447. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_benchmarks.py +0 -0
  448. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_budget_alert.py +0 -0
  449. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cache.py +0 -0
  450. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cli.py +0 -0
  451. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cli_audit_module.py +0 -0
  452. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cli_compliance_module.py +0 -0
  453. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cli_cost_module.py +0 -0
  454. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cli_ops_module.py +0 -0
  455. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cli_phase11_module.py +0 -0
  456. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_compliance.py +0 -0
  457. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_compliance_mapping.py +0 -0
  458. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_config_interpolate.py +0 -0
  459. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_consent.py +0 -0
  460. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_consumer.py +0 -0
  461. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cost_event_emission.py +0 -0
  462. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_cost_tracker.py +0 -0
  463. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_costguard_gaps.py +0 -0
  464. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_coverage_gaps.py +0 -0
  465. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_deprecations.py +0 -0
  466. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_drift.py +0 -0
  467. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_e2e_cli.py +0 -0
  468. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_egress_and_normalizer.py +0 -0
  469. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_eval_behaviour_scorer.py +0 -0
  470. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_event.py +0 -0
  471. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_exceptions.py +0 -0
  472. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_explain.py +0 -0
  473. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_cloud.py +0 -0
  474. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_datadog.py +0 -0
  475. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_grafana.py +0 -0
  476. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_jsonl.py +0 -0
  477. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_otel_bridge.py +0 -0
  478. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_otlp.py +0 -0
  479. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_redis_backend.py +0 -0
  480. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_siem_splunk.py +0 -0
  481. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_siem_syslog.py +0 -0
  482. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_export_webhook.py +0 -0
  483. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_feedback.py +0 -0
  484. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_framework_mapper.py +0 -0
  485. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_gate_deep.py +0 -0
  486. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_governance.py +0 -0
  487. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_hitl.py +0 -0
  488. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_http.py +0 -0
  489. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_inspect.py +0 -0
  490. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_integration.py +0 -0
  491. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_integrations.py +0 -0
  492. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_io.py +0 -0
  493. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_lint.py +0 -0
  494. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_migrate.py +0 -0
  495. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_model_registry.py +0 -0
  496. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_models.py +0 -0
  497. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_namespaces.py +0 -0
  498. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_otlp_bridge.py +0 -0
  499. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase0_scale.py +0 -0
  500. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase10_features.py +0 -0
  501. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase10_trust.py +0 -0
  502. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase11_enterprise.py +0 -0
  503. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase11_security.py +0 -0
  504. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase12_dx.py +0 -0
  505. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase1_context_trace.py +0 -0
  506. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase2_observability.py +0 -0
  507. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase3_debug_sampling.py +0 -0
  508. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase4_agent_instrumentation.py +0 -0
  509. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase4_metrics_store.py +0 -0
  510. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase5_console_exporter.py +0 -0
  511. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase5_coverage.py +0 -0
  512. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase5_enterprise_integrations.py +0 -0
  513. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase5_hooks_crewai.py +0 -0
  514. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase6_enterprise_deployment_packaging.py +0 -0
  515. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase6_openai_integration.py +0 -0
  516. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_phase8_release_hardening.py +0 -0
  517. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_plugins.py +0 -0
  518. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_processor_coverage.py +0 -0
  519. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_prompt_registry.py +0 -0
  520. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_properties.py +0 -0
  521. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_public_root_lazy_imports.py +0 -0
  522. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_rag.py +0 -0
  523. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_redact.py +0 -0
  524. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_regression.py +0 -0
  525. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_repo_guardrails.py +0 -0
  526. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_rfc_namespaces.py +0 -0
  527. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_runtime_governance_phase0.py +0 -0
  528. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sampling_coverage.py +0 -0
  529. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_schema.py +0 -0
  530. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_config.py +0 -0
  531. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_coverage_boost.py +0 -0
  532. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_exporters.py +0 -0
  533. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_final_coverage.py +0 -0
  534. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_gap_filler.py +0 -0
  535. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_openai_integration.py +0 -0
  536. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_phase7_integrations.py +0 -0
  537. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_pipelines_deep.py +0 -0
  538. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_precision_coverage.py +0 -0
  539. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_span.py +0 -0
  540. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_stream.py +0 -0
  541. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_tracer.py +0 -0
  542. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sdk_validation_coverage.py +0 -0
  543. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_server.py +0 -0
  544. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf11.py +0 -0
  545. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf12.py +0 -0
  546. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf13.py +0 -0
  547. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf14.py +0 -0
  548. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf15.py +0 -0
  549. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf16.py +0 -0
  550. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf9_config.py +0 -0
  551. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_alert.py +0 -0
  552. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_audit.py +0 -0
  553. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_cec.py +0 -0
  554. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_explain.py +0 -0
  555. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_gate.py +0 -0
  556. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_identity.py +0 -0
  557. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_lineage.py +0 -0
  558. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_observe.py +0 -0
  559. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_operator.py +0 -0
  560. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_pii.py +0 -0
  561. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_policy.py +0 -0
  562. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_policy_integration.py +0 -0
  563. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_policy_phase3.py +0 -0
  564. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_rag.py +0 -0
  565. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_rbac.py +0 -0
  566. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_scope.py +0 -0
  567. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_sf_secrets.py +0 -0
  568. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_signing.py +0 -0
  569. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_stats.py +0 -0
  570. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_stream.py +0 -0
  571. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_trace_decorator.py +0 -0
  572. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_trace_pytest_fixtures.py +0 -0
  573. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_ulid.py +0 -0
  574. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_validate.py +0 -0
  575. {spanforge-1.0.1 → spanforge-1.0.2}/tests/test_workflow.py +0 -0
@@ -198,3 +198,5 @@ cython_debug/
198
198
  /SpanForge_Build_Plan_v1.0.md
199
199
  /HallucCheck_Product_Spec_v6.0.updated.md
200
200
  PRICING.pdf
201
+ /CARD_1A1_GitHub_Marketplace_App.md
202
+ /NEXT_SDK_FEATURES.md
@@ -0,0 +1,11 @@
1
+ {
2
+ "gate_id": "g1",
3
+ "verdict": "PASS",
4
+ "metrics": {
5
+ "score": 0.8
6
+ },
7
+ "timestamp": "2026-05-10T04:00:30.112436+00:00",
8
+ "duration_ms": 0,
9
+ "project_id": "",
10
+ "pipeline_id": "c864b0c2-a124-4b5b-bd30-ceeeecea2ec6"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "gate_id": "gate5_governance",
3
+ "prri_score": 75,
4
+ "verdict": "RED",
5
+ "dimension_breakdown": {},
6
+ "framework": "",
7
+ "policy_file": "",
8
+ "timestamp": "2026-05-10T04:00:30.120052+00:00",
9
+ "allow": false,
10
+ "project_id": "proj-1"
11
+ }
@@ -8,7 +8,7 @@
8
8
  "secrets_detected": false,
9
9
  "secrets_detections_24h": 0,
10
10
  "failures": [],
11
- "timestamp": "2026-05-02T03:44:35.489245+00:00",
12
- "pipeline_id": "69bded98-e2d8-4bf5-8f3f-1de4cc75a790",
11
+ "timestamp": "2026-05-10T04:04:09.036213+00:00",
12
+ "pipeline_id": "d306e1c3-c437-4317-9c71-6532e5cac4a4",
13
13
  "project_id": ""
14
14
  }
@@ -4,8 +4,8 @@
4
4
  "metrics": {
5
5
  "score": 0.95
6
6
  },
7
- "timestamp": "2026-05-02T03:44:21.312559+00:00",
7
+ "timestamp": "2026-05-10T04:03:48.163107+00:00",
8
8
  "duration_ms": 0,
9
9
  "project_id": "",
10
- "pipeline_id": "c94e8b69-1fd7-4c46-90f4-6613a8c97c73"
10
+ "pipeline_id": "91e805b8-09a4-498e-bdde-f3b64e272e54"
11
11
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spanforge
3
- Version: 1.0.1
3
+ Version: 1.0.2
4
4
  Summary: SpanForge — AI lifecycle and governance platform (RFC-0001 SPANFORGE)
5
5
  Project-URL: Homepage, https://github.com/veerarag1973/spanforge
6
6
  Project-URL: Documentation, https://github.com/veerarag1973/spanforge/blob/main/docs/index.md
@@ -118,8 +118,8 @@ Description-Content-Type: text/markdown
118
118
  <a href="https://pypi.org/project/spanforge/"><img src="https://img.shields.io/pypi/v/spanforge?color=4c8cbf&logo=pypi&logoColor=white" alt="PyPI"/></a>
119
119
  <a href="https://www.getspanforge.com/standard"><img src="https://img.shields.io/badge/standard-SpanForge_RFC--0001-4c8cbf" alt="spanforge RFC-0001"/></a>
120
120
  <img src="https://img.shields.io/badge/coverage-91%25-brightgreen" alt="91% test coverage"/>
121
- <img src="https://img.shields.io/badge/tests-6541%20passing-brightgreen" alt="6541 tests"/>
122
- <img src="https://img.shields.io/badge/version-1.0.1-4c8cbf" alt="Version 1.0.1"/>
121
+ <img src="https://img.shields.io/badge/tests-7049%20passing-brightgreen" alt="7049 tests"/>
122
+ <img src="https://img.shields.io/badge/version-1.0.2-4c8cbf" alt="Version 1.0.2"/>
123
123
  <img src="https://img.shields.io/badge/dependencies-zero-brightgreen" alt="Zero dependencies"/>
124
124
  <a href="docs/index.md"><img src="https://img.shields.io/badge/docs-local-4c8cbf" alt="Documentation"/></a>
125
125
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-PolyForm%20NC%201.0-blue" alt="PolyForm Noncommercial 1.0"/></a>
@@ -181,8 +181,12 @@ spanforge.configure() # that's it — you're now compliant-by-default
181
181
  </td>
182
182
  <td width="50%">
183
183
 
184
- ### Privacy & Audit Infrastructure- **Secrets scanning** — 20-pattern registry detects API keys, tokens, private keys; SARIF output; pre-commit hook- **PII redaction** — detect and strip sensitive data before it leaves your app. Includes a Presidio NLP backend (`spanforge[presidio]`) covering 15 entity types (SSN, email, phone, AADHAAR, PAN, UK NI, credit card, IBAN, and more) with ≥ 95% true-positive rate and < 0.5% false-positive rate verified at GA
185
- - **HMAC audit chains** — tamper-evident, blockchain-style event signing- **Audit SDK (`sf-audit`)** — `sf_audit.append()`, schema key registry, T.R.U.S.T. scorecard, GDPR Article 30 RoPA, BYOS cloud routing- **GDPR subject erasure** — right-to-erasure with tombstone events that preserve chain integrity
184
+ ### Privacy & Audit Infrastructure
185
+ - **Secrets scanning** — 20-pattern registry detects API keys, tokens, private keys; SARIF output; pre-commit hook
186
+ - **PII redaction** — detect and strip sensitive data before it leaves your app. Includes a Presidio NLP backend (`spanforge[presidio]`) covering 15 entity types (SSN, email, phone, AADHAAR, PAN, UK NI, credit card, IBAN, and more) with ≥ 95% true-positive rate and < 0.5% false-positive rate verified at GA
187
+ - **HMAC audit chains** — tamper-evident, blockchain-style event signing
188
+ - **Audit SDK (`sf-audit`)** — `sf_audit.append()`, schema key registry, T.R.U.S.T. scorecard, GDPR Article 30 RoPA, BYOS cloud routing
189
+ - **GDPR subject erasure** — right-to-erasure with tombstone events that preserve chain integrity
186
190
  - **Air-gapped deployment** — runs fully offline with zero egress
187
191
 
188
192
  </td>
@@ -194,7 +198,7 @@ spanforge.configure() # that's it — you're now compliant-by-default
194
198
  - **Consent boundary monitoring** — `consent.granted`, `consent.revoked`, `consent.violation` events
195
199
  - **Human-in-the-loop hooks** — `hitl.queued`, `hitl.reviewed`, `hitl.escalated`, `hitl.timeout` events
196
200
  - **Model registry** — register, deprecate, retire models; attestations auto-warn on ungoverned models
197
- - **Explainability tracking** — measure what % of AI decisions have explanations attached
201
+ - **Explainability tracking** — `sf_explain.explain(response, context)` returns a signed `ExplainRecord` with EU AI Act Article 13/14 clause mapping, `decision_drivers`, and HMAC-signed audit entry on every call. `@spanforge.governed` wraps any callable to auto-explain every model response with zero extra code.
198
202
 
199
203
  </td>
200
204
  <td>
@@ -210,7 +214,10 @@ spanforge.configure() # that's it — you're now compliant-by-default
210
214
  - **Auto-instrumentation** — patch OpenAI, Anthropic, LangChain, CrewAI, and more; `@trace_rag` decorator and automatic LlamaIndex/LangChain retriever instrumentation for zero-change RAG tracing
211
215
  - **Async SDK** — every major SDK method now has a non-blocking `*_async()` variant (`scan_async`, `evaluate_async`, `build_bundle_async`, `get_scorecard_async`, `sso_delegate_session_async`) for seamless use in async frameworks
212
216
  - **User feedback REST endpoint** — `POST /v1/feedback` accepts star/thumbs/Likert ratings and free-text comments (SHA-256 hashed); links to T.R.U.S.T. dimensions
213
- - **38 CLI commands** compliance checks, PII scans, secrets scanning, audit-chain verification, event generation, audit log extraction, CEC bundle generation, gap detection, gate policy audit, CI/CD gate pipelines, trust scorecards, config validation, enterprise health, security scanning, doctor diagnostics, all CI-ready
217
+ - **`spanforge config init / validate`** interactive config wizard, schema validation, and connectivity probe for `~/.spanforge/config.yaml`
218
+ - **`spanforge export siem`** — stream CEF or LEEF lines from a JSONL events file to any SIEM via `--format cef|leef`; reads stdin or `--input FILE`
219
+ - **`SpanForgeLangGraphCallback`** — LangChain-compatible callback (`on_chain_start/end`, `on_tool_start/end`, `on_agent_action`) that emits typed SpanForge events; no LangGraph runtime required
220
+ - **39 CLI commands** — compliance checks, PII scans, secrets scanning, audit-chain verification, event generation, audit log extraction, CEC bundle generation, gap detection, gate policy audit, CI/CD gate pipelines, trust scorecards, config validation, enterprise health, security scanning, doctor diagnostics, all CI-ready
214
221
 
215
222
  </td>
216
223
  </tr>
@@ -522,7 +529,7 @@ verdict = sf_gate.evaluate("schema-validation", event.to_dict())
522
529
  print(verdict.verdict) # GateVerdict.PASS
523
530
 
524
531
  # Standalone PRRI evaluation
525
- prri = sf_gate.evaluate_prri(prri_score=28.5)
532
+ prri = sf_gate.evaluate_prri("my-agent", prri_score=28)
526
533
  print(prri.verdict) # PRRIVerdict.GREEN
527
534
 
528
535
  # Composite trust gate — checks HRI rate, PII, and secrets windows
@@ -686,8 +693,8 @@ from spanforge.sdk.pipelines import (
686
693
  result = score_pipeline("The model output to check", model="gpt-4o")
687
694
  print(result.audit_id, result.details)
688
695
 
689
- # Risk pipeline: PRRI evaluation → alert if RED → gate block → CEC bundle
690
- result = risk_pipeline(prri_score=75.0, project_id="my-agent")
696
+ # Risk pipeline: audit PRRI record → alert if RED → optional gate → optional CEC bundle
697
+ result = risk_pipeline({"verdict": "RED", "prri_score": 75.0}, project_id="my-agent")
691
698
  print(result.details["verdict"]) # "RED"
692
699
  ```
693
700
 
@@ -724,7 +731,7 @@ with mock_all_services():
724
731
  sf_audit.append({"score": 0.92}, schema_key="halluccheck.score.v1")
725
732
  assert len(sf_audit.calls) == 1 # inspect recorded calls
726
733
 
727
- prri = sf_gate.evaluate_prri(prri_score=28.5)
734
+ prri = sf_gate.evaluate_prri("my-agent", prri_score=28)
728
735
  assert prri.allow # GREEN by default
729
736
  ```
730
737
 
@@ -922,6 +929,15 @@ await stream.drain(GrafanaLokiExporter(url="http://loki:3100")) # Grafana Lo
922
929
  await stream.drain(CloudExporter(api_key="sf_live_xxx")) # spanforge Cloud
923
930
  await stream.drain(SplunkHECExporter()) # Splunk HEC (env-var config)
924
931
  await stream.drain(SyslogExporter()) # Syslog/CEF (env-var config)
932
+
933
+ # Lightweight CEF/LEEF string formatter (no network, no dependencies)
934
+ from spanforge.export.siem import SIEMExporter
935
+ exporter = SIEMExporter(format="cef")
936
+ for event in events:
937
+ print(exporter.export(event)) # one CEF line per event
938
+
939
+ # Or via CLI
940
+ # spanforge export siem --format leef --input audit.jsonl | logger -n siem.corp.example -P 514
925
941
  ```
926
942
 
927
943
  Fan-out routing for compliance alerting:
@@ -965,6 +981,10 @@ spanforge scan events.jsonl --fail-on-match # CI-gate PII scan
965
981
  spanforge secrets scan <file> # scan file for secrets (exit 0=clean, 1=found)
966
982
  spanforge secrets scan <file> --format sarif # SARIF output for GitHub Code Scanning
967
983
  spanforge secrets scan <file> --redact # print redacted version to stdout
984
+ spanforge secrets set KEY VALUE # store a secret in local secrets store
985
+ spanforge secrets get KEY # retrieve a stored secret
986
+ spanforge secrets list # list stored secret key names
987
+ spanforge secrets delete KEY # remove a stored secret
968
988
 
969
989
  # Event generation
970
990
  spanforge event create --type llm.trace.span.completed --count 10 --format jsonl # generate test events
@@ -974,13 +994,22 @@ spanforge check # 9-step end-to-end health check
974
994
  spanforge check-compat events.json # v2.0 compatibility
975
995
  spanforge validate events.jsonl # JSON Schema validation
976
996
  spanforge validate events.jsonl --report detailed --format json # detailed report
977
- spanforge validate --dataset training.jsonl # scan JSONL training data for PII
978
- spanforge validate --dataset training.jsonl --fail-on-violations # exit 1 if PII/schema issues found
979
- spanforge validate --dataset training.jsonl --required-fields prompt,response --format json # required fields + JSON output
997
+ spanforge validate --dataset training.jsonl # Article 10 compliance scan; exits 1 if any clause fails
998
+ spanforge validate --dataset training.jsonl --output json # machine-readable JSON report
999
+ spanforge validate --dataset training.jsonl --output pdf # PDF report (requires pip install spanforge[compliance])
980
1000
 
981
1001
  # Configuration
982
- spanforge config validate # validate .halluccheck.toml (auto-discover)
983
- spanforge config validate --file path/to.toml # validate specific config file
1002
+ spanforge config init # interactive wizard → ~/.spanforge/config.yaml
1003
+ spanforge config init --non-interactive # write defaults immediately
1004
+ spanforge config init --force # overwrite existing config
1005
+ spanforge config validate # validate ~/.spanforge/config.yaml
1006
+ spanforge config validate --config path/to.yaml --check-connectivity # validate + probe OTLP
1007
+ spanforge config validate --file path/to.toml # validate .halluccheck.toml (legacy)
1008
+
1009
+ # Development
1010
+ spanforge dev reset # wipe local dev state (trace store, audit chain)
1011
+ spanforge dev reset --hard # also delete ~/.spanforge/config.yaml
1012
+ spanforge dev reset --dry-run # list files that would be removed
984
1013
 
985
1014
  # Analysis
986
1015
  spanforge stats events.jsonl # counts, tokens, cost
@@ -1081,7 +1110,7 @@ spanforge/
1081
1110
  +-- _store.py — TraceStore ring buffer
1082
1111
  +-- _hooks.py — HookRegistry (lifecycle hooks)
1083
1112
  +-- _server.py — HTTP server (/traces, /compliance/summary)
1084
- +-- _cli.py ← 38 CLI sub-commands
1113
+ +-- _cli.py ← 39 CLI sub-commands
1085
1114
  +-- workflow.py — Human-in-the-Loop Workflow Engine (CORE-15); WorkflowEngine, WorkflowType, state machine, SLA escalation
1086
1115
  +-- cost.py — CostTracker, BudgetMonitor, @budget_alert
1087
1116
  +-- cache.py — SemanticCache, @cached decorator
@@ -1210,6 +1239,11 @@ spanforge/
1210
1239
  <td><code>SyslogExporter</code> — RFC 5424 and ArcSight CEF exporter over UDP or TCP; severity derived from event type; CEF extension values properly escaped; <code>SyslogExporterError</code> on socket failure</td>
1211
1240
  <td>Security / compliance teams</td>
1212
1241
  </tr>
1242
+ <tr>
1243
+ <td><code>spanforge.export.siem</code></td>
1244
+ <td><code>SIEMExporter</code> — lightweight, network-free CEF v0 and IBM LEEF 2.0 string formatter; flattens envelope + payload fields into extension KV pairs; wired to <code>spanforge export siem</code> CLI</td>
1245
+ <td>Security / compliance teams</td>
1246
+ </tr>
1213
1247
  <tr>
1214
1248
  <td><code>spanforge.stream</code></td>
1215
1249
  <td>Fan-out router — one <code>drain()</code> call reaches multiple backends; Kafka source</td>
@@ -1217,7 +1251,7 @@ spanforge/
1217
1251
  </tr>
1218
1252
  <tr>
1219
1253
  <td><code>spanforge.integrations</code></td>
1220
- <td>Auto-instrumentation for OpenAI, Anthropic, LangChain, LlamaIndex, CrewAI, Groq, Ollama, Together</td>
1254
+ <td>Auto-instrumentation for OpenAI, Anthropic, LangChain, LlamaIndex, CrewAI, Groq, Ollama, Together; <code>SpanForgeLangGraphCallback</code> — 5-hook LangChain-compatible callback for LangGraph workflows</td>
1221
1255
  <td>App developers</td>
1222
1256
  </tr>
1223
1257
  <tr>
@@ -1391,7 +1425,7 @@ spanforge/
1391
1425
  </tr>
1392
1426
  <tr>
1393
1427
  <td><code>spanforge.sdk.gate</code></td>
1394
- <td><code>SFGateClient</code> — <code>evaluate(gate_id, payload) → GateEvaluationResult</code>, <code>evaluate_prri(prri_score) → PRRIResult</code>, <code>run_pipeline(gate_config_path) → GateRunResult</code>, <code>get_artifact(gate_id)</code>, <code>list_artifacts()</code>, <code>purge_artifacts(older_than_days)</code>, <code>get_status() → GateStatusInfo</code>, <code>configure(config)</code>. Six built-in gate executors: <code>schema_validation</code>, <code>dependency_security</code>, <code>secrets_scan</code>, <code>performance_regression</code>, <code>halluccheck_prri</code>, <code>halluccheck_trust</code>. PRRI three-tier verdict (<code>GREEN</code>/<code>AMBER</code>/<code>RED</code>), <code>GateArtifact</code> store with configurable retention, composite trust gate (HRI rate + PII window + secrets window), five exception types. 174 tests, mypy strict + bandit clean. <em>(Phase 8, v2.0.7+)</em></td>
1428
+ <td><code>SFGateClient</code> — <code>evaluate(gate_id, payload) → GateEvaluationResult</code>, <code>evaluate_prri(project_id, *, prri_score) → PRRIResult</code>, <code>run_pipeline(gate_config_path) → GateRunResult</code>, <code>get_artifact(gate_id)</code>, <code>list_artifacts()</code>, <code>purge_artifacts(older_than_days)</code>, <code>get_status() → GateStatusInfo</code>, <code>configure(config)</code>. Six built-in gate executors: <code>schema_validation</code>, <code>dependency_security</code>, <code>secrets_scan</code>, <code>performance_regression</code>, <code>halluccheck_prri</code>, <code>halluccheck_trust</code>. PRRI three-tier verdict (<code>GREEN</code>/<code>AMBER</code>/<code>RED</code>), <code>GateArtifact</code> store with configurable retention, composite trust gate (HRI rate + PII window + secrets window), five exception types. 174 tests, mypy strict + bandit clean. <em>(Phase 8, v2.0.7+)</em></td>
1395
1429
  <td>DevOps / CI / platform teams</td>
1396
1430
  </tr>
1397
1431
  <tr>
@@ -1416,7 +1450,7 @@ spanforge/
1416
1450
  </tr>
1417
1451
  <tr>
1418
1452
  <td><code>spanforge.sdk.pipelines</code></td>
1419
- <td>5 HallucCheck ↔ SpanForge pipeline integrations: <code>score_pipeline(text)</code> (PII → secrets → observe → audit), <code>bias_pipeline(report)</code> (PII → audit → alert → anonymise), <code>monitor_pipeline(event)</code> (observe → alert → OTel export), <code>risk_pipeline(prri_score)</code> (PRRI → alert → gate → CEC), <code>benchmark_pipeline(results)</code> (audit → alert → anonymise). Each returns <code>PipelineResult</code> with audit trail. <em>(Phase 10, v2.0.9+)</em></td>
1453
+ <td>5 HallucCheck ↔ SpanForge pipeline integrations: <code>score_pipeline(text)</code> (PII → secrets → observe → audit), <code>bias_pipeline(bias_report)</code> (PII → audit → alert → anonymise), <code>monitor_pipeline(event)</code> (annotate → alert → OTel export), <code>risk_pipeline(prri_record)</code> (audit → alert if RED optional gate → optional CEC), <code>benchmark_pipeline(run_result)</code> (audit → F1 regression alert → anonymise). Each returns <code>PipelineResult</code> with audit trail. <em>(Phase 10, v2.0.9+)</em></td>
1420
1454
  <td>ML / eval / platform teams</td>
1421
1455
  </tr>
1422
1456
  <td><code>SFCECClient</code> — <code>build_bundle(project_id, date_range, frameworks)</code> assembles a signed ZIP with <code>manifest.json</code>, <code>clause_map.json</code>, <code>chain_proof.json</code>, <code>attestation.json</code>, <code>rfc3161_timestamp.tsr</code>, and 6 NDJSON evidence directories. HMAC-SHA256 manifest signing, BYOS detection. <code>verify_bundle(zip_path)</code> re-verifies HMAC + chain + timestamp. <code>generate_dpa(project_id, controller_details, processor_details)</code> produces a GDPR Article 28 Data Processing Agreement. <code>get_status()</code> returns bundle count, BYOS provider, and last bundle timestamp. Supports all 5 frameworks: <code>eu_ai_act</code>, <code>iso_42001</code>, <code>nist_ai_rmf</code>, <code>iso27001</code>, <code>soc2</code>. 148 tests, 87% coverage, mypy strict + bandit clean. <em>(Phase 5, v2.0.4+)</em></td>
@@ -1434,7 +1468,7 @@ spanforge/
1434
1468
 
1435
1469
  ## Quality
1436
1470
 
1437
- - **5 863 tests** passing (14 skipped) — unit, integration, property-based (Hypothesis), performance benchmarks
1471
+ - **7 049 tests** passing (7 skipped) — unit, integration, property-based (Hypothesis), performance benchmarks
1438
1472
  - **≥ 91% line and branch coverage** — 90% minimum enforced in CI
1439
1473
  - **Zero required dependencies** — entire core runs on Python stdlib
1440
1474
  - **Typed** — full `py.typed` marker; mypy + pyright clean
@@ -1450,7 +1484,7 @@ git clone https://github.com/veerarag1973/spanforge.git
1450
1484
  cd spanforge
1451
1485
  python -m venv .venv && .venv\Scripts\activate
1452
1486
  pip install -e ".[dev]"
1453
- pytest # 5 351 tests
1487
+ pytest # 7 049 tests
1454
1488
  ```
1455
1489
 
1456
1490
  <details>
@@ -14,8 +14,8 @@
14
14
  <a href="https://pypi.org/project/spanforge/"><img src="https://img.shields.io/pypi/v/spanforge?color=4c8cbf&logo=pypi&logoColor=white" alt="PyPI"/></a>
15
15
  <a href="https://www.getspanforge.com/standard"><img src="https://img.shields.io/badge/standard-SpanForge_RFC--0001-4c8cbf" alt="spanforge RFC-0001"/></a>
16
16
  <img src="https://img.shields.io/badge/coverage-91%25-brightgreen" alt="91% test coverage"/>
17
- <img src="https://img.shields.io/badge/tests-6541%20passing-brightgreen" alt="6541 tests"/>
18
- <img src="https://img.shields.io/badge/version-1.0.1-4c8cbf" alt="Version 1.0.1"/>
17
+ <img src="https://img.shields.io/badge/tests-7049%20passing-brightgreen" alt="7049 tests"/>
18
+ <img src="https://img.shields.io/badge/version-1.0.2-4c8cbf" alt="Version 1.0.2"/>
19
19
  <img src="https://img.shields.io/badge/dependencies-zero-brightgreen" alt="Zero dependencies"/>
20
20
  <a href="docs/index.md"><img src="https://img.shields.io/badge/docs-local-4c8cbf" alt="Documentation"/></a>
21
21
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-PolyForm%20NC%201.0-blue" alt="PolyForm Noncommercial 1.0"/></a>
@@ -77,8 +77,12 @@ spanforge.configure() # that's it — you're now compliant-by-default
77
77
  </td>
78
78
  <td width="50%">
79
79
 
80
- ### Privacy & Audit Infrastructure- **Secrets scanning** — 20-pattern registry detects API keys, tokens, private keys; SARIF output; pre-commit hook- **PII redaction** — detect and strip sensitive data before it leaves your app. Includes a Presidio NLP backend (`spanforge[presidio]`) covering 15 entity types (SSN, email, phone, AADHAAR, PAN, UK NI, credit card, IBAN, and more) with ≥ 95% true-positive rate and < 0.5% false-positive rate verified at GA
81
- - **HMAC audit chains** — tamper-evident, blockchain-style event signing- **Audit SDK (`sf-audit`)** — `sf_audit.append()`, schema key registry, T.R.U.S.T. scorecard, GDPR Article 30 RoPA, BYOS cloud routing- **GDPR subject erasure** — right-to-erasure with tombstone events that preserve chain integrity
80
+ ### Privacy & Audit Infrastructure
81
+ - **Secrets scanning** — 20-pattern registry detects API keys, tokens, private keys; SARIF output; pre-commit hook
82
+ - **PII redaction** — detect and strip sensitive data before it leaves your app. Includes a Presidio NLP backend (`spanforge[presidio]`) covering 15 entity types (SSN, email, phone, AADHAAR, PAN, UK NI, credit card, IBAN, and more) with ≥ 95% true-positive rate and < 0.5% false-positive rate verified at GA
83
+ - **HMAC audit chains** — tamper-evident, blockchain-style event signing
84
+ - **Audit SDK (`sf-audit`)** — `sf_audit.append()`, schema key registry, T.R.U.S.T. scorecard, GDPR Article 30 RoPA, BYOS cloud routing
85
+ - **GDPR subject erasure** — right-to-erasure with tombstone events that preserve chain integrity
82
86
  - **Air-gapped deployment** — runs fully offline with zero egress
83
87
 
84
88
  </td>
@@ -90,7 +94,7 @@ spanforge.configure() # that's it — you're now compliant-by-default
90
94
  - **Consent boundary monitoring** — `consent.granted`, `consent.revoked`, `consent.violation` events
91
95
  - **Human-in-the-loop hooks** — `hitl.queued`, `hitl.reviewed`, `hitl.escalated`, `hitl.timeout` events
92
96
  - **Model registry** — register, deprecate, retire models; attestations auto-warn on ungoverned models
93
- - **Explainability tracking** — measure what % of AI decisions have explanations attached
97
+ - **Explainability tracking** — `sf_explain.explain(response, context)` returns a signed `ExplainRecord` with EU AI Act Article 13/14 clause mapping, `decision_drivers`, and HMAC-signed audit entry on every call. `@spanforge.governed` wraps any callable to auto-explain every model response with zero extra code.
94
98
 
95
99
  </td>
96
100
  <td>
@@ -106,7 +110,10 @@ spanforge.configure() # that's it — you're now compliant-by-default
106
110
  - **Auto-instrumentation** — patch OpenAI, Anthropic, LangChain, CrewAI, and more; `@trace_rag` decorator and automatic LlamaIndex/LangChain retriever instrumentation for zero-change RAG tracing
107
111
  - **Async SDK** — every major SDK method now has a non-blocking `*_async()` variant (`scan_async`, `evaluate_async`, `build_bundle_async`, `get_scorecard_async`, `sso_delegate_session_async`) for seamless use in async frameworks
108
112
  - **User feedback REST endpoint** — `POST /v1/feedback` accepts star/thumbs/Likert ratings and free-text comments (SHA-256 hashed); links to T.R.U.S.T. dimensions
109
- - **38 CLI commands** compliance checks, PII scans, secrets scanning, audit-chain verification, event generation, audit log extraction, CEC bundle generation, gap detection, gate policy audit, CI/CD gate pipelines, trust scorecards, config validation, enterprise health, security scanning, doctor diagnostics, all CI-ready
113
+ - **`spanforge config init / validate`** interactive config wizard, schema validation, and connectivity probe for `~/.spanforge/config.yaml`
114
+ - **`spanforge export siem`** — stream CEF or LEEF lines from a JSONL events file to any SIEM via `--format cef|leef`; reads stdin or `--input FILE`
115
+ - **`SpanForgeLangGraphCallback`** — LangChain-compatible callback (`on_chain_start/end`, `on_tool_start/end`, `on_agent_action`) that emits typed SpanForge events; no LangGraph runtime required
116
+ - **39 CLI commands** — compliance checks, PII scans, secrets scanning, audit-chain verification, event generation, audit log extraction, CEC bundle generation, gap detection, gate policy audit, CI/CD gate pipelines, trust scorecards, config validation, enterprise health, security scanning, doctor diagnostics, all CI-ready
110
117
 
111
118
  </td>
112
119
  </tr>
@@ -418,7 +425,7 @@ verdict = sf_gate.evaluate("schema-validation", event.to_dict())
418
425
  print(verdict.verdict) # GateVerdict.PASS
419
426
 
420
427
  # Standalone PRRI evaluation
421
- prri = sf_gate.evaluate_prri(prri_score=28.5)
428
+ prri = sf_gate.evaluate_prri("my-agent", prri_score=28)
422
429
  print(prri.verdict) # PRRIVerdict.GREEN
423
430
 
424
431
  # Composite trust gate — checks HRI rate, PII, and secrets windows
@@ -582,8 +589,8 @@ from spanforge.sdk.pipelines import (
582
589
  result = score_pipeline("The model output to check", model="gpt-4o")
583
590
  print(result.audit_id, result.details)
584
591
 
585
- # Risk pipeline: PRRI evaluation → alert if RED → gate block → CEC bundle
586
- result = risk_pipeline(prri_score=75.0, project_id="my-agent")
592
+ # Risk pipeline: audit PRRI record → alert if RED → optional gate → optional CEC bundle
593
+ result = risk_pipeline({"verdict": "RED", "prri_score": 75.0}, project_id="my-agent")
587
594
  print(result.details["verdict"]) # "RED"
588
595
  ```
589
596
 
@@ -620,7 +627,7 @@ with mock_all_services():
620
627
  sf_audit.append({"score": 0.92}, schema_key="halluccheck.score.v1")
621
628
  assert len(sf_audit.calls) == 1 # inspect recorded calls
622
629
 
623
- prri = sf_gate.evaluate_prri(prri_score=28.5)
630
+ prri = sf_gate.evaluate_prri("my-agent", prri_score=28)
624
631
  assert prri.allow # GREEN by default
625
632
  ```
626
633
 
@@ -818,6 +825,15 @@ await stream.drain(GrafanaLokiExporter(url="http://loki:3100")) # Grafana Lo
818
825
  await stream.drain(CloudExporter(api_key="sf_live_xxx")) # spanforge Cloud
819
826
  await stream.drain(SplunkHECExporter()) # Splunk HEC (env-var config)
820
827
  await stream.drain(SyslogExporter()) # Syslog/CEF (env-var config)
828
+
829
+ # Lightweight CEF/LEEF string formatter (no network, no dependencies)
830
+ from spanforge.export.siem import SIEMExporter
831
+ exporter = SIEMExporter(format="cef")
832
+ for event in events:
833
+ print(exporter.export(event)) # one CEF line per event
834
+
835
+ # Or via CLI
836
+ # spanforge export siem --format leef --input audit.jsonl | logger -n siem.corp.example -P 514
821
837
  ```
822
838
 
823
839
  Fan-out routing for compliance alerting:
@@ -861,6 +877,10 @@ spanforge scan events.jsonl --fail-on-match # CI-gate PII scan
861
877
  spanforge secrets scan <file> # scan file for secrets (exit 0=clean, 1=found)
862
878
  spanforge secrets scan <file> --format sarif # SARIF output for GitHub Code Scanning
863
879
  spanforge secrets scan <file> --redact # print redacted version to stdout
880
+ spanforge secrets set KEY VALUE # store a secret in local secrets store
881
+ spanforge secrets get KEY # retrieve a stored secret
882
+ spanforge secrets list # list stored secret key names
883
+ spanforge secrets delete KEY # remove a stored secret
864
884
 
865
885
  # Event generation
866
886
  spanforge event create --type llm.trace.span.completed --count 10 --format jsonl # generate test events
@@ -870,13 +890,22 @@ spanforge check # 9-step end-to-end health check
870
890
  spanforge check-compat events.json # v2.0 compatibility
871
891
  spanforge validate events.jsonl # JSON Schema validation
872
892
  spanforge validate events.jsonl --report detailed --format json # detailed report
873
- spanforge validate --dataset training.jsonl # scan JSONL training data for PII
874
- spanforge validate --dataset training.jsonl --fail-on-violations # exit 1 if PII/schema issues found
875
- spanforge validate --dataset training.jsonl --required-fields prompt,response --format json # required fields + JSON output
893
+ spanforge validate --dataset training.jsonl # Article 10 compliance scan; exits 1 if any clause fails
894
+ spanforge validate --dataset training.jsonl --output json # machine-readable JSON report
895
+ spanforge validate --dataset training.jsonl --output pdf # PDF report (requires pip install spanforge[compliance])
876
896
 
877
897
  # Configuration
878
- spanforge config validate # validate .halluccheck.toml (auto-discover)
879
- spanforge config validate --file path/to.toml # validate specific config file
898
+ spanforge config init # interactive wizard → ~/.spanforge/config.yaml
899
+ spanforge config init --non-interactive # write defaults immediately
900
+ spanforge config init --force # overwrite existing config
901
+ spanforge config validate # validate ~/.spanforge/config.yaml
902
+ spanforge config validate --config path/to.yaml --check-connectivity # validate + probe OTLP
903
+ spanforge config validate --file path/to.toml # validate .halluccheck.toml (legacy)
904
+
905
+ # Development
906
+ spanforge dev reset # wipe local dev state (trace store, audit chain)
907
+ spanforge dev reset --hard # also delete ~/.spanforge/config.yaml
908
+ spanforge dev reset --dry-run # list files that would be removed
880
909
 
881
910
  # Analysis
882
911
  spanforge stats events.jsonl # counts, tokens, cost
@@ -977,7 +1006,7 @@ spanforge/
977
1006
  +-- _store.py — TraceStore ring buffer
978
1007
  +-- _hooks.py — HookRegistry (lifecycle hooks)
979
1008
  +-- _server.py — HTTP server (/traces, /compliance/summary)
980
- +-- _cli.py ← 38 CLI sub-commands
1009
+ +-- _cli.py ← 39 CLI sub-commands
981
1010
  +-- workflow.py — Human-in-the-Loop Workflow Engine (CORE-15); WorkflowEngine, WorkflowType, state machine, SLA escalation
982
1011
  +-- cost.py — CostTracker, BudgetMonitor, @budget_alert
983
1012
  +-- cache.py — SemanticCache, @cached decorator
@@ -1106,6 +1135,11 @@ spanforge/
1106
1135
  <td><code>SyslogExporter</code> — RFC 5424 and ArcSight CEF exporter over UDP or TCP; severity derived from event type; CEF extension values properly escaped; <code>SyslogExporterError</code> on socket failure</td>
1107
1136
  <td>Security / compliance teams</td>
1108
1137
  </tr>
1138
+ <tr>
1139
+ <td><code>spanforge.export.siem</code></td>
1140
+ <td><code>SIEMExporter</code> — lightweight, network-free CEF v0 and IBM LEEF 2.0 string formatter; flattens envelope + payload fields into extension KV pairs; wired to <code>spanforge export siem</code> CLI</td>
1141
+ <td>Security / compliance teams</td>
1142
+ </tr>
1109
1143
  <tr>
1110
1144
  <td><code>spanforge.stream</code></td>
1111
1145
  <td>Fan-out router — one <code>drain()</code> call reaches multiple backends; Kafka source</td>
@@ -1113,7 +1147,7 @@ spanforge/
1113
1147
  </tr>
1114
1148
  <tr>
1115
1149
  <td><code>spanforge.integrations</code></td>
1116
- <td>Auto-instrumentation for OpenAI, Anthropic, LangChain, LlamaIndex, CrewAI, Groq, Ollama, Together</td>
1150
+ <td>Auto-instrumentation for OpenAI, Anthropic, LangChain, LlamaIndex, CrewAI, Groq, Ollama, Together; <code>SpanForgeLangGraphCallback</code> — 5-hook LangChain-compatible callback for LangGraph workflows</td>
1117
1151
  <td>App developers</td>
1118
1152
  </tr>
1119
1153
  <tr>
@@ -1287,7 +1321,7 @@ spanforge/
1287
1321
  </tr>
1288
1322
  <tr>
1289
1323
  <td><code>spanforge.sdk.gate</code></td>
1290
- <td><code>SFGateClient</code> — <code>evaluate(gate_id, payload) → GateEvaluationResult</code>, <code>evaluate_prri(prri_score) → PRRIResult</code>, <code>run_pipeline(gate_config_path) → GateRunResult</code>, <code>get_artifact(gate_id)</code>, <code>list_artifacts()</code>, <code>purge_artifacts(older_than_days)</code>, <code>get_status() → GateStatusInfo</code>, <code>configure(config)</code>. Six built-in gate executors: <code>schema_validation</code>, <code>dependency_security</code>, <code>secrets_scan</code>, <code>performance_regression</code>, <code>halluccheck_prri</code>, <code>halluccheck_trust</code>. PRRI three-tier verdict (<code>GREEN</code>/<code>AMBER</code>/<code>RED</code>), <code>GateArtifact</code> store with configurable retention, composite trust gate (HRI rate + PII window + secrets window), five exception types. 174 tests, mypy strict + bandit clean. <em>(Phase 8, v2.0.7+)</em></td>
1324
+ <td><code>SFGateClient</code> — <code>evaluate(gate_id, payload) → GateEvaluationResult</code>, <code>evaluate_prri(project_id, *, prri_score) → PRRIResult</code>, <code>run_pipeline(gate_config_path) → GateRunResult</code>, <code>get_artifact(gate_id)</code>, <code>list_artifacts()</code>, <code>purge_artifacts(older_than_days)</code>, <code>get_status() → GateStatusInfo</code>, <code>configure(config)</code>. Six built-in gate executors: <code>schema_validation</code>, <code>dependency_security</code>, <code>secrets_scan</code>, <code>performance_regression</code>, <code>halluccheck_prri</code>, <code>halluccheck_trust</code>. PRRI three-tier verdict (<code>GREEN</code>/<code>AMBER</code>/<code>RED</code>), <code>GateArtifact</code> store with configurable retention, composite trust gate (HRI rate + PII window + secrets window), five exception types. 174 tests, mypy strict + bandit clean. <em>(Phase 8, v2.0.7+)</em></td>
1291
1325
  <td>DevOps / CI / platform teams</td>
1292
1326
  </tr>
1293
1327
  <tr>
@@ -1312,7 +1346,7 @@ spanforge/
1312
1346
  </tr>
1313
1347
  <tr>
1314
1348
  <td><code>spanforge.sdk.pipelines</code></td>
1315
- <td>5 HallucCheck ↔ SpanForge pipeline integrations: <code>score_pipeline(text)</code> (PII → secrets → observe → audit), <code>bias_pipeline(report)</code> (PII → audit → alert → anonymise), <code>monitor_pipeline(event)</code> (observe → alert → OTel export), <code>risk_pipeline(prri_score)</code> (PRRI → alert → gate → CEC), <code>benchmark_pipeline(results)</code> (audit → alert → anonymise). Each returns <code>PipelineResult</code> with audit trail. <em>(Phase 10, v2.0.9+)</em></td>
1349
+ <td>5 HallucCheck ↔ SpanForge pipeline integrations: <code>score_pipeline(text)</code> (PII → secrets → observe → audit), <code>bias_pipeline(bias_report)</code> (PII → audit → alert → anonymise), <code>monitor_pipeline(event)</code> (annotate → alert → OTel export), <code>risk_pipeline(prri_record)</code> (audit → alert if RED optional gate → optional CEC), <code>benchmark_pipeline(run_result)</code> (audit → F1 regression alert → anonymise). Each returns <code>PipelineResult</code> with audit trail. <em>(Phase 10, v2.0.9+)</em></td>
1316
1350
  <td>ML / eval / platform teams</td>
1317
1351
  </tr>
1318
1352
  <td><code>SFCECClient</code> — <code>build_bundle(project_id, date_range, frameworks)</code> assembles a signed ZIP with <code>manifest.json</code>, <code>clause_map.json</code>, <code>chain_proof.json</code>, <code>attestation.json</code>, <code>rfc3161_timestamp.tsr</code>, and 6 NDJSON evidence directories. HMAC-SHA256 manifest signing, BYOS detection. <code>verify_bundle(zip_path)</code> re-verifies HMAC + chain + timestamp. <code>generate_dpa(project_id, controller_details, processor_details)</code> produces a GDPR Article 28 Data Processing Agreement. <code>get_status()</code> returns bundle count, BYOS provider, and last bundle timestamp. Supports all 5 frameworks: <code>eu_ai_act</code>, <code>iso_42001</code>, <code>nist_ai_rmf</code>, <code>iso27001</code>, <code>soc2</code>. 148 tests, 87% coverage, mypy strict + bandit clean. <em>(Phase 5, v2.0.4+)</em></td>
@@ -1330,7 +1364,7 @@ spanforge/
1330
1364
 
1331
1365
  ## Quality
1332
1366
 
1333
- - **5 863 tests** passing (14 skipped) — unit, integration, property-based (Hypothesis), performance benchmarks
1367
+ - **7 049 tests** passing (7 skipped) — unit, integration, property-based (Hypothesis), performance benchmarks
1334
1368
  - **≥ 91% line and branch coverage** — 90% minimum enforced in CI
1335
1369
  - **Zero required dependencies** — entire core runs on Python stdlib
1336
1370
  - **Typed** — full `py.typed` marker; mypy + pyright clean
@@ -1346,7 +1380,7 @@ git clone https://github.com/veerarag1973/spanforge.git
1346
1380
  cd spanforge
1347
1381
  python -m venv .venv && .venv\Scripts\activate
1348
1382
  pip install -e ".[dev]"
1349
- pytest # 5 351 tests
1383
+ pytest # 7 049 tests
1350
1384
  ```
1351
1385
 
1352
1386
  <details>
@@ -1,6 +1,6 @@
1
1
  # spanforge SDK — Release Runbook
2
2
  # PyPI distribution: spanforge | Import: spanforge
3
- # Latest: 1.0.0 — see docs/changelog.md for version history
3
+ # Latest: 1.0.2 — see docs/changelog.md for version history
4
4
  # This file documents the general release process (originally written for 1.0.0).
5
5
  #
6
6
  # STATUS: READY TO PUBLISH