agent-reliability 1.2.1__tar.gz → 1.3.0__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 (282) hide show
  1. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/.github/workflows/ci.yml +25 -2
  2. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/.github/workflows/release.yml +14 -1
  3. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/CHANGELOG.md +99 -0
  4. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/CONTRIBUTING.md +1 -1
  5. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/PKG-INFO +25 -5
  6. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/README.md +21 -4
  7. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/ARCHITECTURE.md +15 -0
  8. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/COMPATIBILITY.md +12 -3
  9. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/CONCEPTS.md +1 -1
  10. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/ENGINEERING_PRINCIPLES.md +1 -1
  11. agent_reliability-1.3.0/docs/EVALUATE.md +224 -0
  12. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/EVALUATION_PROVENANCE.md +3 -3
  13. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/GA_CONTRACT.md +30 -1
  14. agent_reliability-1.3.0/docs/HTTP_EXPORTER.md +309 -0
  15. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/MEASUREMENT_HEALTH.md +1 -1
  16. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/OTEL_MAPPING.md +9 -9
  17. agent_reliability-1.3.0/docs/P29_PILOT_REPORT_TEMPLATE.json +66 -0
  18. agent_reliability-1.3.0/docs/P29_PILOT_RUNBOOK.md +64 -0
  19. agent_reliability-1.3.0/docs/P29_PILOT_SAFEGUARDS.md +95 -0
  20. agent_reliability-1.3.0/docs/PLATFORM_QUICKSTART.md +59 -0
  21. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/README.md +1 -14
  22. agent_reliability-1.3.0/docs/RELEASE_NOTES_1_3.md +112 -0
  23. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/RELEASING.md +2 -0
  24. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/ROADMAP.md +3 -0
  25. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/SECURITY_MODEL.md +29 -48
  26. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/SLO_SEMANTICS.md +7 -7
  27. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/TELEMETRY_SPEC.md +9 -25
  28. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/VERSIONING.md +14 -0
  29. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/adr/0007-evaluator-architecture-and-provenance-semantics.md +5 -1
  30. agent_reliability-1.3.0/docs/adr/0010-experimental-judge-adapter-amends-adr-0007-decision-9.md +172 -0
  31. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/adr/README.md +2 -1
  32. agent_reliability-1.3.0/examples/judge_fake_provider.py +148 -0
  33. agent_reliability-1.3.0/examples/judge_pilot_demo.py +183 -0
  34. agent_reliability-1.3.0/examples/judge_pilot_replay.py +102 -0
  35. agent_reliability-1.3.0/examples/judge_providers.py +301 -0
  36. agent_reliability-1.3.0/examples/platform_quickstart.py +72 -0
  37. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/pyproject.toml +26 -1
  38. agent_reliability-1.3.0/scripts/p29_pilot_report_check.py +301 -0
  39. agent_reliability-1.3.0/scripts/p29_sg_evidence.py +111 -0
  40. agent_reliability-1.3.0/scripts/verify_p28_fixtures.py +40 -0
  41. agent_reliability-1.3.0/scripts/verify_p28_reference.mjs +68 -0
  42. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/scripts/verify_release_artifacts.py +183 -0
  43. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/__init__.py +1 -1
  44. agent_reliability-1.3.0/src/agent_reliability/adapters/_http_delivery.py +1109 -0
  45. agent_reliability-1.3.0/src/agent_reliability/adapters/_http_protocol.py +216 -0
  46. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/adapters/event_sinks.py +29 -1
  47. agent_reliability-1.3.0/src/agent_reliability/adapters/http_event_sink.py +683 -0
  48. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/__init__.py +151 -0
  49. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/_engine.py +317 -0
  50. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/_jsonschema.py +103 -0
  51. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/_schema.py +43 -0
  52. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/budget.py +84 -0
  53. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/calibration.py +596 -0
  54. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/coordinator.py +1002 -0
  55. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/core.py +417 -0
  56. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/errors.py +158 -0
  57. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/executor.py +100 -0
  58. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/identity.py +105 -0
  59. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/judge.py +194 -0
  60. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/provider.py +171 -0
  61. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/reference.py +34 -0
  62. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/rubric.py +434 -0
  63. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/rubrics/judge-answer-correctness.json +44 -0
  64. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/rubrics/judge-groundedness.json +45 -0
  65. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/rubrics/judge-instruction-adherence.json +40 -0
  66. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/rubrics/judge-safety-policy.json +40 -0
  67. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/rubrics/judge-task-completion-evidence.json +40 -0
  68. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/schemas/calibration-case.schema.json +106 -0
  69. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/schemas/calibration-report.schema.json +590 -0
  70. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/structured.py +92 -0
  71. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/sync.py +126 -0
  72. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/testing.py +134 -0
  73. agent_reliability-1.3.0/src/agent_reliability/experimental/judge/values.py +381 -0
  74. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/ports/event_sink.py +30 -1
  75. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/sdk/client.py +73 -5
  76. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/sdk/context.py +13 -1
  77. agent_reliability-1.3.0/tests/compat/test_experimental_http_exporter_api.py +215 -0
  78. agent_reliability-1.3.0/tests/compat/test_experimental_judge_api.py +319 -0
  79. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/compat/test_public_api_1_1.py +2 -1
  80. agent_reliability-1.3.0/tests/contract/test_p28_http_protocol.py +126 -0
  81. agent_reliability-1.3.0/tests/contract/test_p29_judge_vectors.py +292 -0
  82. agent_reliability-1.3.0/tests/contract/test_p29_wire_conformance.py +476 -0
  83. agent_reliability-1.3.0/tests/fakes/p29_baseline.py +37 -0
  84. agent_reliability-1.3.0/tests/fakes/p29_judge.py +328 -0
  85. agent_reliability-1.3.0/tests/fixtures/documentation/editorial-revisions.json +7 -0
  86. agent_reliability-1.3.0/tests/fixtures/documentation/runtime-revisions.json +12 -0
  87. agent_reliability-1.3.0/tests/fixtures/p28/legacy_platform_responses.json +161 -0
  88. agent_reliability-1.3.0/tests/fixtures/p28/manifest.json +22 -0
  89. agent_reliability-1.3.0/tests/fixtures/p28/operational_vectors.json +1537 -0
  90. agent_reliability-1.3.0/tests/fixtures/p28/v1_digest_vectors.json +1657 -0
  91. agent_reliability-1.3.0/tests/fixtures/p28/v2_digest_vectors_specification_only.json +226 -0
  92. agent_reliability-1.3.0/tests/fixtures/p29/calibration_known_confusion.json +760 -0
  93. agent_reliability-1.3.0/tests/fixtures/p29/failure_mapping_vectors.json +749 -0
  94. agent_reliability-1.3.0/tests/fixtures/p29/judge_output_vectors.json +1134 -0
  95. agent_reliability-1.3.0/tests/fixtures/p29/manifest.json +42 -0
  96. agent_reliability-1.3.0/tests/fixtures/p29/mapping_vectors.json +474 -0
  97. agent_reliability-1.3.0/tests/fixtures/p29/privacy_planted.json +41 -0
  98. agent_reliability-1.3.0/tests/fixtures/p29/prompt_golden_jp1.json +343 -0
  99. agent_reliability-1.3.0/tests/fixtures/p29/reference_rubric_cases.json +629 -0
  100. agent_reliability-1.3.0/tests/fixtures/p29/rubric_invalid.json +2432 -0
  101. agent_reliability-1.3.0/tests/fixtures/p29/rubric_valid.json +788 -0
  102. agent_reliability-1.3.0/tests/fixtures/p29/wire_expectation_vectors.json +578 -0
  103. agent_reliability-1.3.0/tests/property/test_experimental_judge_properties.py +234 -0
  104. agent_reliability-1.3.0/tests/security/test_experimental_judge_privacy.py +383 -0
  105. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/adapters/test_adapters.py +17 -4
  106. agent_reliability-1.3.0/tests/unit/experimental_judge/__init__.py +0 -0
  107. agent_reliability-1.3.0/tests/unit/experimental_judge/test_p29_pilot_report_check.py +253 -0
  108. agent_reliability-1.3.0/tests/unit/experimental_judge/test_p29_sg_safeguards.py +56 -0
  109. agent_reliability-1.3.0/tests/unit/experimental_judge/test_phase4_measurement_integrity.py +505 -0
  110. agent_reliability-1.3.0/tests/unit/experimental_judge/test_review_remediation.py +583 -0
  111. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s00_s12_docs.py +242 -0
  112. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s01_identity_grammar.py +158 -0
  113. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s01_rubric.py +163 -0
  114. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s01_values.py +365 -0
  115. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s02_core.py +334 -0
  116. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s03_llm_judge.py +769 -0
  117. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s04_sync_judge.py +205 -0
  118. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s05_coordinator.py +755 -0
  119. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s05_recording_gate.py +335 -0
  120. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s06_reference_and_examples.py +360 -0
  121. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s07_s08_optional.py +221 -0
  122. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s10_calibration.py +566 -0
  123. agent_reliability-1.3.0/tests/unit/experimental_judge/test_s11_pilot_artifacts.py +212 -0
  124. agent_reliability-1.3.0/tests/unit/test_http_exporter.py +869 -0
  125. agent_reliability-1.3.0/tests/unit/test_http_exporter_indicator_allowlist.py +544 -0
  126. agent_reliability-1.3.0/tests/unit/test_http_exporter_real_stack_uncertainty.py +136 -0
  127. agent_reliability-1.3.0/tests/unit/test_http_exporter_release_regressions.py +217 -0
  128. agent_reliability-1.3.0/tests/unit/test_http_exporter_review_regressions.py +424 -0
  129. agent_reliability-1.3.0/tests/unit/test_http_exporter_tls_real.py +680 -0
  130. agent_reliability-1.3.0/tests/unit/test_platform_quickstart.py +63 -0
  131. agent_reliability-1.3.0/tests/unit/test_release_artifact_guards.py +148 -0
  132. agent_reliability-1.3.0/tests/unit/test_workflow_policy.py +104 -0
  133. agent_reliability-1.2.1/docs/EVALUATE.md +0 -73
  134. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  135. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  136. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/.github/pull_request_template.md +0 -0
  137. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/.gitignore +0 -0
  138. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/CODE_OF_CONDUCT.md +0 -0
  139. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/LICENSE +0 -0
  140. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/SECURITY.md +0 -0
  141. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/benchmarks/bench_evaluation.py +0 -0
  142. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/benchmarks/bench_measurement_health.py +0 -0
  143. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/benchmarks/bench_otel.py +0 -0
  144. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/benchmarks/bench_reliability.py +0 -0
  145. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/benchmarks/bench_sdk.py +0 -0
  146. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/DOMAIN_MODEL.md +0 -0
  147. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/DX_REVIEW.md +0 -0
  148. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/EVALUATOR_FRAMEWORK.md +0 -0
  149. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/GA_READINESS.md +0 -0
  150. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/INTEGRATIONS.md +0 -0
  151. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/LOCAL_RELIABILITY_ENGINE.md +0 -0
  152. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/M9_HARDENING_AUDIT.md +0 -0
  153. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/MEASUREMENT_HEALTH_POLICY_EXAMPLES.md +0 -0
  154. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/MEASURE_RELIABILITY_LOCALLY.md +0 -0
  155. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/PUBLIC_API_REVIEW.md +0 -0
  156. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/QUICKSTART.md +0 -0
  157. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/SDK_DESIGN.md +0 -0
  158. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/TESTING_STRATEGY.md +0 -0
  159. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/TEST_RELIABILITY.md +0 -0
  160. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/VISION.md +0 -0
  161. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/adr/0001-architecture-boundaries.md +0 -0
  162. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/adr/0002-reliability-mathematics-and-undefined-data-semantics.md +0 -0
  163. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/adr/0003-python-sdk-runtime-and-context-architecture.md +0 -0
  164. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/adr/0004-instrumentation-failure-isolation.md +0 -0
  165. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/adr/0005-instrumentation-initialization-degraded-mode.md +0 -0
  166. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/adr/0006-opentelemetry-interoperability-and-context-ownership.md +0 -0
  167. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/adr/0008-reliability-aggregation-and-provenance-compatibility.md +0 -0
  168. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/docs/adr/0009-measurement-health-and-policy-boundary.md +0 -0
  169. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/examples/.gitkeep +0 -0
  170. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/examples/__init__.py +0 -0
  171. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/examples/async_agent.py +0 -0
  172. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/examples/basic_reliability.py +0 -0
  173. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/examples/builtin_evaluators_quickstart.py +0 -0
  174. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/examples/opentelemetry_example.py +0 -0
  175. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/examples/policy_bounded_degradation.py +0 -0
  176. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/examples/policy_fail_closed.py +0 -0
  177. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/examples/policy_fail_open.py +0 -0
  178. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/examples/provenance_conflict.py +0 -0
  179. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/examples/slo_assertion.py +0 -0
  180. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/examples/tool_call_evaluators.py +0 -0
  181. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/adapters/__init__.py +0 -0
  182. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/adapters/otel/__init__.py +0 -0
  183. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/adapters/otel/run_context.py +0 -0
  184. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/adapters/system_clock.py +0 -0
  185. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/adapters/uuid_run_id_generator.py +0 -0
  186. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/application/__init__.py +0 -0
  187. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/application/measurement_policy.py +0 -0
  188. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/domain/__init__.py +0 -0
  189. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/domain/error_budget.py +0 -0
  190. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/domain/evaluation.py +0 -0
  191. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/domain/identity.py +0 -0
  192. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/domain/measurement_health.py +0 -0
  193. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/domain/runs.py +0 -0
  194. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/domain/sli.py +0 -0
  195. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/domain/slo.py +0 -0
  196. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/evaluation/__init__.py +0 -0
  197. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/evaluation/_validation.py +0 -0
  198. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/evaluation/builtins.py +0 -0
  199. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/evaluation/identity.py +0 -0
  200. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/evaluation/protocols.py +0 -0
  201. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/evaluation/result.py +0 -0
  202. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/experimental/__init__.py +0 -0
  203. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/measurement/__init__.py +0 -0
  204. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/ports/__init__.py +0 -0
  205. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/ports/clock.py +0 -0
  206. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/ports/events.py +0 -0
  207. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/ports/id_generator.py +0 -0
  208. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/ports/run_context.py +0 -0
  209. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/py.typed +0 -0
  210. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/reliability/__init__.py +0 -0
  211. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/reliability/engine.py +0 -0
  212. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/reliability/model.py +0 -0
  213. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/reporting/__init__.py +0 -0
  214. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/reporting/formatting.py +0 -0
  215. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/sdk/__init__.py +0 -0
  216. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/sdk/diagnostics.py +0 -0
  217. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/sdk/evaluator_runner.py +0 -0
  218. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/testing/__init__.py +0 -0
  219. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/src/agent_reliability/testing/assertions.py +0 -0
  220. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/compat/test_public_api_1_0.py +0 -0
  221. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/compat/test_public_api_1_2.py +0 -0
  222. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/compat/test_semantic_1_0.py +0 -0
  223. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/contract/.gitkeep +0 -0
  224. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/contract/test_examples.py +0 -0
  225. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/contract/test_readme_links.py +0 -0
  226. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/contract/test_reliability_m1_contract.py +0 -0
  227. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/contract/test_run_context_bridge.py +0 -0
  228. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/fakes/__init__.py +0 -0
  229. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/fakes/clock.py +0 -0
  230. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/fakes/diagnostics.py +0 -0
  231. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/fakes/id_generator.py +0 -0
  232. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/fakes/sinks.py +0 -0
  233. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/integration/.gitkeep +0 -0
  234. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/integration/test_measurement_health_otel.py +0 -0
  235. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/integration/test_otel_trace_context.py +0 -0
  236. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/property/test_error_budget_properties.py +0 -0
  237. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/property/test_evaluator_properties.py +0 -0
  238. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/property/test_measurement_health_properties.py +0 -0
  239. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/property/test_reliability_properties.py +0 -0
  240. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/property/test_sdk_properties.py +0 -0
  241. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/property/test_sli_properties.py +0 -0
  242. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/security/test_m8_builtin_evaluator_privacy.py +0 -0
  243. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/security/test_measurement_health_failure_privacy.py +0 -0
  244. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/security/test_measurement_health_privacy.py +0 -0
  245. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/security/test_privacy_contract.py +0 -0
  246. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/typing/installed_consumer.py +0 -0
  247. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/typing/mypy.ini +0 -0
  248. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/domain/__init__.py +0 -0
  249. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/domain/test_error_budget.py +0 -0
  250. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/domain/test_evaluation.py +0 -0
  251. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/domain/test_identity.py +0 -0
  252. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/domain/test_measurement_health.py +0 -0
  253. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/domain/test_runs.py +0 -0
  254. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/domain/test_sli.py +0 -0
  255. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/domain/test_slo.py +0 -0
  256. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/evaluation/__init__.py +0 -0
  257. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/evaluation/test_builtins_and_protocols.py +0 -0
  258. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/evaluation/test_identity_and_result.py +0 -0
  259. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/evaluation/test_m8_builtin_evaluators.py +0 -0
  260. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/evaluation/test_runner.py +0 -0
  261. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/examples/test_measurement_policy_examples.py +0 -0
  262. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/ports/test_events.py +0 -0
  263. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/reliability/test_engine.py +0 -0
  264. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/reliability/test_m8_convenience.py +0 -0
  265. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/reliability/test_measurement_health_integration.py +0 -0
  266. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/reliability/test_measurement_health_quadrants.py +0 -0
  267. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/reliability/test_model.py +0 -0
  268. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/reporting/__init__.py +0 -0
  269. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/reporting/test_formatting.py +0 -0
  270. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/sdk/__init__.py +0 -0
  271. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/sdk/test_evaluation_integration.py +0 -0
  272. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/sdk/test_failure_isolation.py +0 -0
  273. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/sdk/test_lifecycle_async.py +0 -0
  274. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/sdk/test_lifecycle_sync.py +0 -0
  275. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/sdk/test_measurement_health.py +0 -0
  276. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/sdk/test_measurement_health_hardening.py +0 -0
  277. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/sdk/test_memory.py +0 -0
  278. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/sdk/test_nesting.py +0 -0
  279. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/sdk/test_threading.py +0 -0
  280. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/test_package.py +0 -0
  281. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/testing_helpers/__init__.py +0 -0
  282. {agent_reliability-1.2.1 → agent_reliability-1.3.0}/tests/unit/testing_helpers/test_assertions.py +0 -0
@@ -17,6 +17,7 @@ jobs:
17
17
  quality:
18
18
  name: Lint, format, and type-check
19
19
  runs-on: ubuntu-latest
20
+ timeout-minutes: 30
20
21
  steps:
21
22
  - name: Checkout
22
23
  uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -28,7 +29,7 @@ jobs:
28
29
  cache: "pip"
29
30
 
30
31
  - name: Install package with dev dependencies
31
- run: python -m pip install -e ".[dev]"
32
+ run: python -m pip install -e ".[dev,http]"
32
33
 
33
34
  - name: Lint (ruff check)
34
35
  run: ruff check .
@@ -42,6 +43,7 @@ jobs:
42
43
  test:
43
44
  name: Test stable contracts (py${{ matrix.python-version }})
44
45
  runs-on: ubuntu-latest
46
+ timeout-minutes: 30
45
47
  strategy:
46
48
  fail-fast: false
47
49
  matrix:
@@ -57,7 +59,10 @@ jobs:
57
59
  cache: "pip"
58
60
 
59
61
  - name: Install package with test dependencies
60
- run: python -m pip install -e ".[dev,otel-test]"
62
+ run: python -m pip install -e ".[dev,otel-test,http]"
63
+
64
+ - name: Verify P28 fixture manifest
65
+ run: python scripts/verify_p28_fixtures.py
61
66
 
62
67
  - name: Test with branch coverage
63
68
  run: python -m pytest --cov --cov-report=term-missing
@@ -65,6 +70,7 @@ jobs:
65
70
  artifacts:
66
71
  name: Release artifacts, extras, examples, and typing
67
72
  runs-on: ubuntu-latest
73
+ timeout-minutes: 30
68
74
  steps:
69
75
  - name: Checkout
70
76
  uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -82,3 +88,20 @@ jobs:
82
88
 
83
89
  - name: Verify distributed artifacts
84
90
  run: python scripts/verify_release_artifacts.py
91
+
92
+ reference-vectors:
93
+ name: Independent Node reference check of the P28 contract fixtures
94
+ runs-on: ubuntu-latest
95
+ timeout-minutes: 10
96
+ steps:
97
+ - name: Checkout
98
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
99
+
100
+ - name: Set up Node.js
101
+ uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
102
+ with:
103
+ node-version: "24.19.0"
104
+
105
+ # Data-only: reads tests/fixtures/p28 with no Python import and no npm dependency.
106
+ - name: Verify canonical, digest and acknowledgement vectors
107
+ run: node scripts/verify_p28_reference.mjs
@@ -15,9 +15,20 @@ jobs:
15
15
  build:
16
16
  name: Build and verify release artifacts
17
17
  runs-on: ubuntu-latest
18
+ timeout-minutes: 30
18
19
  steps:
19
20
  - name: Checkout
20
21
  uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
22
+ with:
23
+ fetch-depth: 0
24
+
25
+ - name: Confirm the tagged commit is on main
26
+ run: |
27
+ git fetch --no-tags origin main
28
+ if ! git merge-base --is-ancestor "$GITHUB_SHA" origin/main; then
29
+ echo "Tagged commit $GITHUB_SHA is not reachable from origin/main" >&2
30
+ exit 1
31
+ fi
21
32
 
22
33
  - name: Set up Python 3.11
23
34
  uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
@@ -35,7 +46,7 @@ jobs:
35
46
  fi
36
47
 
37
48
  - name: Install package and build tooling
38
- run: python -m pip install -e ".[dev,otel-test]" build
49
+ run: python -m pip install -e ".[dev,http,otel-test]" build
39
50
 
40
51
  - name: Full quality gates
41
52
  run: |
@@ -61,6 +72,7 @@ jobs:
61
72
  name: Publish to PyPI
62
73
  needs: build
63
74
  runs-on: ubuntu-latest
75
+ timeout-minutes: 15
64
76
  environment:
65
77
  name: pypi
66
78
  url: https://pypi.org/project/agent-reliability/
@@ -80,6 +92,7 @@ jobs:
80
92
  name: Create GitHub release
81
93
  needs: publish
82
94
  runs-on: ubuntu-latest
95
+ timeout-minutes: 15
83
96
  permissions:
84
97
  contents: write
85
98
  steps:
@@ -4,6 +4,105 @@ All notable changes to this project are documented here. Format loosely
4
4
  follows [Keep a Changelog](https://keepachangelog.com/); versioning
5
5
  follows [docs/COMPATIBILITY.md](docs/COMPATIBILITY.md).
6
6
 
7
+ ## [Unreleased]
8
+
9
+ ## [1.3.0]
10
+
11
+ A backward-compatible minor release under [docs/VERSIONING.md](docs/VERSIONING.md): an
12
+ optional HTTP evidence exporter and an experimental model-backed evaluator adapter. The
13
+ publication date is the upload date shown by the package index and the GitHub release. The
14
+ `1.3.0rc1` pre-release is superseded by this release; its published files are unchanged. The core installation still has no
15
+ runtime dependencies, and existing stable public APIs, reliability/SLO semantics and the
16
+ `EventSink` contract are unchanged. See [docs/RELEASE_NOTES_1_3.md](docs/RELEASE_NOTES_1_3.md)
17
+ for migration and rollback guidance and [docs/HTTP_EXPORTER.md](docs/HTTP_EXPORTER.md) for
18
+ the exporter.
19
+
20
+ ### Added (experimental)
21
+
22
+ - `agent_reliability.experimental.judge`: an EXPERIMENTAL adapter for model-backed (LLM-judge)
23
+ evaluators that call a provider you supply. Raw judged content stays on your side:
24
+ only typed members (outcome, reason code, provenance, failure class, health) reach the
25
+ exporter; no new wire field and no new core dependency. Reference rubrics are uncalibrated
26
+ examples; no accuracy or calibration claim is made. It may change in a minor release with
27
+ release notes (see the Experimental policy in docs/VERSIONING.md).
28
+
29
+ ### Added
30
+
31
+ - Optional `agent-reliability[http]` extra (`httpx>=0.28.1,<0.29`) and the
32
+ `agent_reliability.adapters.http_event_sink` module with `HTTPEventSink`
33
+ (thread-safe, two daemon delivery workers) and `AsyncHTTPEventSink`. Both export
34
+ evidence to one complete platform POST URL using a machine credential obtained
35
+ from a caller-supplied provider, always as wire schema version 2 with the asserted
36
+ producer identity and a canonical digest that preserves the schema-v1 bytes.
37
+ - Delivery and diagnostics types: `DeliveryStatusSnapshot`, `DeliveryDisposition`,
38
+ `DeliveryRecordStatus`, `ConfigurationError`, `ConfigurationFailedError`,
39
+ `EventDeliveryRejected`, `ExporterClosed`. `emit` only admits to bounded memory;
40
+ commitment is reported solely from a validated acknowledgement (`201`/`200`), and
41
+ records that may have committed are flagged.
42
+ - Reliability behavior: bounded queues with a closure reserve, per-run ordering,
43
+ bounded retries with full jitter, sticky uncertainty for requests that may have
44
+ left the process, sink-wide `429`/`Retry-After` handling, bounded `flush`/`close`,
45
+ and explicit pauses with `resume_auth()`, `resume_schema()`, `resume_deployment()`
46
+ and `resume_endpoint()` for authentication, compatibility, unknown Deployment and
47
+ endpoint problems. Held evidence is never silently dropped.
48
+ - Optional `HealthEvidenceSink` capability (`agent_reliability.ports.event_sink`),
49
+ fanned out by the composite sink, plus an optional `indicator=` argument on
50
+ `RunHandle.record_evaluation_failure(...)`, so evaluation failures and final
51
+ measurement health reach exporters. Existing `EventSink` implementations stay valid.
52
+ - Run lifecycle integration: when the configured sink supports the optional
53
+ capability, `AgentReliability` now submits the final measurement-health report and
54
+ releases the exporter's run binding when a run finishes; `CompositeEventSink` fans the
55
+ capability out and isolates each child. Sinks that do not implement it are
56
+ unaffected.
57
+ - **Fail-closed indicator policy.** The `indicator` is the only free-text wire field, so
58
+ both sinks now require an explicit choice: `indicator_allowlist=[...]` (only these exact
59
+ names may leave the process; others are rejected before queueing and never logged) or the
60
+ deliberate `allow_unrestricted_indicators=True`. A sink given neither raises
61
+ `ConfigurationError`. This is a behaviour change relative to the `1.3.0rc1` pre-release;
62
+ see the migration notes in [docs/RELEASE_NOTES_1_3.md](docs/RELEASE_NOTES_1_3.md).
63
+ - Security posture: certificate and hostname verification are always on; redirects
64
+ are never followed; plaintext HTTP is accepted only for literal loopback
65
+ (`127.0.0.0/8`, `[::1]`); ambient proxy/CA/cookie/netrc configuration is ignored;
66
+ explicit `proxy` and `ca_bundle` options; credentials, URLs and evidence never
67
+ appear in diagnostics.
68
+ - Data-only exporter contract fixtures under `tests/fixtures/`, with a Python verifier
69
+ (`scripts/verify_p28_fixtures.py`) and a Node reference check
70
+ (`scripts/verify_p28_reference.mjs`).
71
+
72
+ ### Fixed
73
+
74
+ - Before this exporter is released, its TLS handling was corrected: with the real
75
+ `httpx`/`httpcore` stack a certificate-verification failure is visible only through
76
+ the exception's `__context__`, which the first implementation did not follow, so
77
+ repeated verification failures exhausted retries instead of pausing the endpoint. The
78
+ classifier now walks `__cause__` and `__context__` (bounded, cycle-safe) and
79
+ recognizes a verification failure only for an attempt that had not yet sent a
80
+ request. The third consecutive verification failure pauses endpoint delivery and
81
+ holds the evidence for `resume_endpoint()`; other network failures keep their ordinary
82
+ classification and neither count nor reset the streak (any completed HTTP exchange
83
+ or `resume_endpoint()` resets it). Through an explicit `proxy`, the tunnel-opening
84
+ CONNECT request no longer counts as having sent the evidence request. A response body
85
+ trickled past 30 seconds is abandoned and retried instead of pinning a worker.
86
+
87
+ ### Changed
88
+
89
+ - Documentation: the exporter classification is recorded in `docs/GA_CONTRACT.md`
90
+ (see that file for the authoritative class; the documented consumer entry points are
91
+ named in `docs/HTTP_EXPORTER.md`).
92
+ - The source distribution no longer includes `CLAUDE.md`, `AGENTS.md` or the internal
93
+ internal review/execution reports. `verify_release_artifacts.py` now also fails if either
94
+ artifact contains private-key material (PEM/PGP blocks, key-like file names), local developer
95
+ paths (Unix, macOS temp and Windows forms), or internal instruction/report files, and it is
96
+ covered by planted-case tests. Public documentation, the licence and all packaging inputs remain.
97
+ - Idle exporter workers no longer build a full status snapshot every 10 ms (idle cost
98
+ with 900 history rows fell from about 2.7% to about 0.4% of one core).
99
+ - CI and release workflows and `CONTRIBUTING.md` install the `http` extra so the
100
+ exporter tests and type checks run.
101
+ - Release validation (`scripts/verify_release_artifacts.py`) also fails if either
102
+ artifact contains private-key material. The real-TLS regression tests generate
103
+ disposable certificates at test time (development-only dependency `cryptography`
104
+ in the `dev` extra); no key is stored in the repository or shipped.
105
+
7
106
  ## [1.2.1] - 2026-09-08
8
107
 
9
108
  Documentation-only patch release. No production code, public API, or
@@ -12,7 +12,7 @@ Requires Python 3.11–3.13.
12
12
  python -m venv .venv
13
13
  # POSIX: source .venv/bin/activate
14
14
  # Windows PowerShell: .venv\Scripts\Activate.ps1
15
- python -m pip install -e ".[dev]"
15
+ python -m pip install -e ".[dev,http,otel-test]"
16
16
  ```
17
17
 
18
18
  Branches use `<type>/<short-description>`, for example
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agent-reliability
3
- Version: 1.2.1
3
+ Version: 1.3.0
4
4
  Summary: Vendor-neutral reliability engineering for autonomous AI agents.
5
5
  Project-URL: Homepage, https://github.com/kamleshd07/agent-reliability
6
6
  Project-URL: Documentation, https://github.com/kamleshd07/agent-reliability/tree/main/docs
@@ -20,12 +20,15 @@ Classifier: Typing :: Typed
20
20
  Requires-Python: >=3.11
21
21
  Provides-Extra: dev
22
22
  Requires-Dist: build>=1.2; extra == 'dev'
23
+ Requires-Dist: cryptography>=42; extra == 'dev'
23
24
  Requires-Dist: hypothesis>=6.108; extra == 'dev'
24
25
  Requires-Dist: mypy>=1.11; extra == 'dev'
25
26
  Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
26
27
  Requires-Dist: pytest-cov>=5.0; extra == 'dev'
27
28
  Requires-Dist: pytest>=8.0; extra == 'dev'
28
29
  Requires-Dist: ruff>=0.6; extra == 'dev'
30
+ Provides-Extra: http
31
+ Requires-Dist: httpx<0.29,>=0.28.1; extra == 'http'
29
32
  Provides-Extra: otel
30
33
  Requires-Dist: opentelemetry-api<2,>=1.44; extra == 'otel'
31
34
  Provides-Extra: otel-test
@@ -42,7 +45,7 @@ It brings evaluations, SLOs, error budgets, burn rates, and measurement
42
45
  provenance to agent applications—and refuses to produce a misleading number
43
46
  when evaluation methodologies are incompatible.
44
47
 
45
- **Status: GA (`1.2.1`).** Public APIs documented as stable in
48
+ **Status: GA (`1.3.0` is the latest stable release; the HTTP exporter and the LLM-judge adapter are Experimental, see [release notes](https://github.com/kamleshd07/agent-reliability/blob/main/docs/RELEASE_NOTES_1_3.md)).** Public APIs documented as stable in
46
49
  [GA_CONTRACT.md](https://github.com/kamleshd07/agent-reliability/blob/v1.0.0/docs/GA_CONTRACT.md) follow Semantic Versioning.
47
50
  See [compatibility](https://github.com/kamleshd07/agent-reliability/blob/v1.0.0/docs/COMPATIBILITY.md).
48
51
 
@@ -202,13 +205,24 @@ assertions for tests and CI.
202
205
  The SDK is designed to work standalone. It requires no hosted account,
203
206
  API key, or network service, and has zero mandatory runtime dependencies.
204
207
 
205
- **Current release: 1.2.1**
208
+ **Current stable release: 1.3.0**
206
209
 
207
210
  The public API follows semantic versioning, with compatibility and
208
211
  installed-artifact verification included in the release process.
209
212
 
210
- No remote ingestion, dashboard, LLM judge, persistence, auto-instrumentation,
211
- or framework-specific adapter is included. See the [roadmap](https://github.com/kamleshd07/agent-reliability/blob/main/docs/ROADMAP.md).
213
+ Releases before 1.3 include no remote ingestion, dashboard, LLM judge, persistence,
214
+ auto-instrumentation, or framework-specific adapter. Release 1.3 adds an optional
215
+ **Experimental** HTTP evidence exporter (`pip install 'agent-reliability[http]'`, see
216
+ [HTTP exporter](https://github.com/kamleshd07/agent-reliability/blob/main/docs/HTTP_EXPORTER.md)) and an
217
+ Experimental LLM-judge adapter (described below); it still has no dashboard, persistence or
218
+ auto-instrumentation. See the [roadmap](https://github.com/kamleshd07/agent-reliability/blob/main/docs/ROADMAP.md).
219
+
220
+ ### LLM-judge evaluators (experimental)
221
+
222
+ `agent_reliability.experimental.judge` is an Experimental adapter for model-backed evaluators that call a provider you
223
+ supply. It adds no dependency and sends raw content only to your provider. The reference rubrics are uncalibrated examples. See
224
+ [Evaluate](https://github.com/kamleshd07/agent-reliability/blob/main/docs/EVALUATE.md).
225
+ A sync judge's timeout is best effort unless the provider is wrapped in `ExecutorSyncProvider`; the provider's own client timeout is the real bound (see the same page).
212
226
 
213
227
  ## Documentation
214
228
 
@@ -230,3 +244,9 @@ not a public issue.
230
244
  ## License
231
245
 
232
246
  Apache License 2.0. See [LICENSE](https://github.com/kamleshd07/agent-reliability/blob/v1.0.0/LICENSE).
247
+
248
+ ### HTTP evidence delivery
249
+
250
+ The optional [HTTP exporter](https://github.com/kamleshd07/agent-reliability/blob/main/docs/HTTP_EXPORTER.md) sends schema-v2 evidence
251
+ using `agent-reliability[http]`, bounded delivery queues and explicit shutdown.
252
+ Platform integration and independent review remain required before release.
@@ -8,7 +8,7 @@ It brings evaluations, SLOs, error budgets, burn rates, and measurement
8
8
  provenance to agent applications—and refuses to produce a misleading number
9
9
  when evaluation methodologies are incompatible.
10
10
 
11
- **Status: GA (`1.2.1`).** Public APIs documented as stable in
11
+ **Status: GA (`1.3.0` is the latest stable release; the HTTP exporter and the LLM-judge adapter are Experimental, see [release notes](https://github.com/kamleshd07/agent-reliability/blob/main/docs/RELEASE_NOTES_1_3.md)).** Public APIs documented as stable in
12
12
  [GA_CONTRACT.md](https://github.com/kamleshd07/agent-reliability/blob/v1.0.0/docs/GA_CONTRACT.md) follow Semantic Versioning.
13
13
  See [compatibility](https://github.com/kamleshd07/agent-reliability/blob/v1.0.0/docs/COMPATIBILITY.md).
14
14
 
@@ -168,13 +168,24 @@ assertions for tests and CI.
168
168
  The SDK is designed to work standalone. It requires no hosted account,
169
169
  API key, or network service, and has zero mandatory runtime dependencies.
170
170
 
171
- **Current release: 1.2.1**
171
+ **Current stable release: 1.3.0**
172
172
 
173
173
  The public API follows semantic versioning, with compatibility and
174
174
  installed-artifact verification included in the release process.
175
175
 
176
- No remote ingestion, dashboard, LLM judge, persistence, auto-instrumentation,
177
- or framework-specific adapter is included. See the [roadmap](https://github.com/kamleshd07/agent-reliability/blob/main/docs/ROADMAP.md).
176
+ Releases before 1.3 include no remote ingestion, dashboard, LLM judge, persistence,
177
+ auto-instrumentation, or framework-specific adapter. Release 1.3 adds an optional
178
+ **Experimental** HTTP evidence exporter (`pip install 'agent-reliability[http]'`, see
179
+ [HTTP exporter](https://github.com/kamleshd07/agent-reliability/blob/main/docs/HTTP_EXPORTER.md)) and an
180
+ Experimental LLM-judge adapter (described below); it still has no dashboard, persistence or
181
+ auto-instrumentation. See the [roadmap](https://github.com/kamleshd07/agent-reliability/blob/main/docs/ROADMAP.md).
182
+
183
+ ### LLM-judge evaluators (experimental)
184
+
185
+ `agent_reliability.experimental.judge` is an Experimental adapter for model-backed evaluators that call a provider you
186
+ supply. It adds no dependency and sends raw content only to your provider. The reference rubrics are uncalibrated examples. See
187
+ [Evaluate](https://github.com/kamleshd07/agent-reliability/blob/main/docs/EVALUATE.md).
188
+ A sync judge's timeout is best effort unless the provider is wrapped in `ExecutorSyncProvider`; the provider's own client timeout is the real bound (see the same page).
178
189
 
179
190
  ## Documentation
180
191
 
@@ -196,3 +207,9 @@ not a public issue.
196
207
  ## License
197
208
 
198
209
  Apache License 2.0. See [LICENSE](https://github.com/kamleshd07/agent-reliability/blob/v1.0.0/LICENSE).
210
+
211
+ ### HTTP evidence delivery
212
+
213
+ The optional [HTTP exporter](https://github.com/kamleshd07/agent-reliability/blob/main/docs/HTTP_EXPORTER.md) sends schema-v2 evidence
214
+ using `agent-reliability[http]`, bounded delivery queues and explicit shutdown.
215
+ Platform integration and independent review remain required before release.
@@ -194,3 +194,18 @@ optional OTel ownership remain unchanged. See ADR-0009 and
194
194
  ADR-0001 ([docs/adr/0001-architecture-boundaries.md](adr/0001-architecture-boundaries.md))
195
195
  records only the layering and dependency-direction decision made at M0.
196
196
  The items above are explicitly not decided yet.
197
+
198
+ ## Language-neutral public HTTP contracts
199
+
200
+ Gentlity public ingestion and control-plane APIs are defined by the platform's
201
+ published OpenAPI, referenced JSON Schemas and normative protocol documentation,
202
+ not by this Python package's dataclasses, exceptions, enum internals or
203
+ serialization defaults. The SDK must validate and emit the documented wire
204
+ types and versions, authenticate through standard HTTP, classify responses by
205
+ HTTP status/header and stable error code, and obey documented idempotency,
206
+ retry, rate-limit, `Retry-After`, timeout and compatibility rules.
207
+
208
+ Shared conformance assets must be data-only and reusable by Python, Go, Java and
209
+ TypeScript. The SDK and platform execute the same positive, negative, boundary,
210
+ request/response and digest fixtures. Schema-v1 canonical digest bytes and
211
+ goldens are frozen across upgrades; SDK behavior cannot redefine them.
@@ -31,16 +31,25 @@ and [OTEL_MAPPING.md](OTEL_MAPPING.md).
31
31
 
32
32
  ## Additive measurement-health extension
33
33
 
34
- M8 adds `agent_reliability.measurement` and additive `RunHandle` inspection
34
+ The measurement-health API adds `agent_reliability.measurement` and additive `RunHandle` inspection
35
35
  and policy members. Existing 1.0 export sets, callable signatures, enum
36
36
  semantics, event payloads, and SLO/reliability calculations are unchanged.
37
37
  This public addition ships in 1.1.0 as a backward-compatible minor release.
38
- M9 adds tests, examples, documentation, and artifact checks only; the `1.1.1`
38
+ The patch release adds tests, examples, documentation, and artifact checks only; the `1.1.1`
39
39
  release leaves the `1.1.0` public and semantic contract unchanged.
40
40
 
41
+ ## Additive HTTP exporter extension (1.3.0)
42
+
43
+ 1.3 adds the optional `agent-reliability[http]` extra and the HTTP exporter entry points,
44
+ classed EXPERIMENTAL (see [GA_CONTRACT.md](GA_CONTRACT.md)), plus the experimental judge
45
+ adapter. Existing 1.0-1.2 stable export sets, callable signatures, enum semantics, event
46
+ payloads and SLO/reliability calculations are unchanged, and base runtime dependencies remain
47
+ zero. This ships as a backward-compatible minor release (`1.3.0`); the earlier `1.3.0rc1`
48
+ pre-release is superseded. Migration and rollback: [RELEASE_NOTES_1_3.md](RELEASE_NOTES_1_3.md).
49
+
41
50
  ## Additive developer-adoption extension
42
51
 
43
- DX-1 — Developer Adoption adds built-in evaluators and an `EvaluationOutcome`
52
+ The developer-adoption extension adds built-in evaluators and an `EvaluationOutcome`
44
53
  re-export to `agent_reliability.evaluation`, `AggregationConflictError`/
45
54
  `evaluate_reliability_or_raise` to `agent_reliability.reliability`, and two
46
55
  new stable namespaces, `agent_reliability.reporting` and
@@ -51,7 +51,7 @@ itself change the measurement—it explains how much tolerance remains.
51
51
  ## Burn rate
52
52
 
53
53
  Observed bad-event rate divided by the SLO's allowed bad-event rate. It is not
54
- “current failures divided by total failures.” M5 calculates a burn rate only
54
+ “current failures divided by total failures.” The local reliability engine calculates a burn rate only
55
55
  when the caller supplies an explicit lookback ratio; it does not retain data or
56
56
  select a time window.
57
57
 
@@ -78,7 +78,7 @@ AutoGen, or any other framework to be present.
78
78
 
79
79
  ## 10. Dependency discipline
80
80
 
81
- Runtime dependencies are minimal by default and zero at M0. Every
81
+ Runtime dependencies are minimal, with zero mandatory core dependencies. Every
82
82
  runtime dependency must justify itself in the PR that introduces it —
83
83
  "it's convenient" is not sufficient justification.
84
84
 
@@ -0,0 +1,224 @@
1
+ # Evaluate
2
+
3
+ How to judge an indicator once you can execute your agent. See
4
+ [Instrument](../examples/basic_reliability.py) first if you have not wrapped
5
+ a run yet, and [Concepts](CONCEPTS.md) for what "evaluator," "indicator," and
6
+ "provenance" mean.
7
+
8
+ ## Built-in evaluators
9
+
10
+ All built-in evaluators live in `agent_reliability.evaluation` and share the
11
+ same shape: construct one with an explicit `EvaluatorIdentity` and
12
+ configuration, then call `.evaluate(value)` directly or through
13
+ `EvaluatorRunner` (recommended — it attaches provenance and converts a raw
14
+ exception into a distinct `EvaluationExecutionFailure`, never into `FAIL` or
15
+ `UNKNOWN`).
16
+
17
+ | Evaluator | Judges | UNKNOWN case |
18
+ |---|---|---|
19
+ | `EqualityEvaluator` | `value == expected` | never |
20
+ | `PredicateEvaluator` | a trusted `Callable[[T], bool \| None]` | when the predicate returns `None` |
21
+ | `ContainsEvaluator` | substring presence in a `str`, optional case-insensitivity | never |
22
+ | `RegexMatchEvaluator` | a stdlib `re` pattern (`search` or `fullmatch`) against a `str` | never — a malformed pattern raises at construction, not evaluation |
23
+ | `LatencyThresholdEvaluator` | an explicit `duration_seconds` against a threshold | when `duration_seconds` is `None` (no measurement captured) |
24
+ | `ToolCalledEvaluator` / `ToolNotCalledEvaluator` | presence/absence of a tool name in a `frozenset[str]` you supply | never |
25
+
26
+ Run [`examples/builtin_evaluators_quickstart.py`](../examples/builtin_evaluators_quickstart.py)
27
+ to see `ContainsEvaluator` and `LatencyThresholdEvaluator` produce `PASS`,
28
+ `FAIL`, and a legitimate `UNKNOWN` in one script, and
29
+ [`examples/tool_call_evaluators.py`](../examples/tool_call_evaluators.py) for
30
+ the tool-name evaluators.
31
+
32
+ ## What UNKNOWN means here
33
+
34
+ `UNKNOWN` means the evaluator ran to completion but could not reach a
35
+ definite judgment — for example, `LatencyThresholdEvaluator` receiving
36
+ `duration_seconds=None` because your timing instrumentation did not capture
37
+ a value for that run. It is never used for "the evaluator crashed" (that is
38
+ an `EvaluationExecutionFailure`, isolated by `EvaluatorRunner`) and never
39
+ silently becomes `FAIL`. See [Concepts](CONCEPTS.md#unknown) and
40
+ [GA_CONTRACT.md](GA_CONTRACT.md#frozen-outcome-and-uncertainty-semantics).
41
+
42
+ ## Privacy boundary for tool evaluators
43
+
44
+ `ToolCalledEvaluator`/`ToolNotCalledEvaluator` accept only a bounded
45
+ `frozenset[str]` of tool-name identifiers you have already decided to
46
+ disclose. They never accept, inspect, or retain tool call arguments, tool
47
+ results, or framework-specific tool objects — see each class's docstring for
48
+ the exact contract, and
49
+ [`tests/security/test_m8_builtin_evaluator_privacy.py`](../tests/security/test_m8_builtin_evaluator_privacy.py)
50
+ for the adversarial tests that enforce it.
51
+
52
+ ## Custom evaluators
53
+
54
+ Implement the `SyncEvaluator`/`AsyncEvaluator` protocol directly — no
55
+ inheritance or registration required. See
56
+ [EVALUATOR_FRAMEWORK.md](EVALUATOR_FRAMEWORK.md) for the full contract and
57
+ [`docs/EVALUATION_PROVENANCE.md`](EVALUATION_PROVENANCE.md) for why identity
58
+ and determinism matter to aggregation later.
59
+
60
+ ## Reducing `AggregationConflict` boilerplate
61
+
62
+ `evaluate_reliability(...)` returns `ReliabilityReport | AggregationConflict`
63
+ so a genuine measurement incompatibility is never silently resolved. When a
64
+ call site has no recovery path other than failing loudly, use
65
+ `evaluate_reliability_or_raise(...)` instead — identical arguments, but it
66
+ raises `AggregationConflictError` (carrying the original conflict on
67
+ `.conflict`) instead of returning it. Keep using the explicit
68
+ `evaluate_reliability` form wherever you want to inspect or handle a
69
+ conflict programmatically.
70
+
71
+ ## LLM-judge evaluators (EXPERIMENTAL)
72
+
73
+ `agent_reliability.experimental.judge` adds model-backed evaluators for semantic dimensions that equality and
74
+ predicates cannot express. It is **Experimental** ([versioning policy](VERSIONING.md)): names, defaults, the prompt template (`jp1`)
75
+ and vocabularies may change in a minor release with release notes. It is standard library only, ships no provider, reads no
76
+ credentials or environment, and adds no wire member and no runtime dependency. A judge is never deterministic
77
+ (`deterministic=False`).
78
+
79
+ ### Privacy statement
80
+
81
+ Raw evaluated text (question, answer, context, reference, instructions, policy, task evidence) goes **only** to the provider object
82
+ you supply, and only the roles the rubric lists. The SDK never retains, logs, hashes, serializes, copies or exports it. What can reach
83
+ Gentlity through the existing evidence path is limited to the indicator name, the outcome, a closed reason code
84
+ (`<dimension>.<code>`), the evaluator identity labels (rubric id, rubric version, `configuration_id`) and, for failures, one of ten
85
+ fixed class names. Judge `reason` text, citations, confidence, token counts, latency, cost and the sampling rate stay local. What your
86
+ provider does with the prompt (retention, region, training) is governed by your agreement with that provider; the SDK makes no
87
+ statement about it. Labels you choose (`model_label`, indicator names) are stored by the platform and must not contain secrets,
88
+ hostnames or customer names.
89
+
90
+ ### Quick start
91
+
92
+ ```python
93
+ from agent_reliability.experimental.judge import (
94
+ ContentPart,
95
+ ContentRole,
96
+ EvaluationRequest,
97
+ IndicatorBinding,
98
+ JudgeCoordinator,
99
+ JudgeDimension,
100
+ LLMJudge,
101
+ load_reference_rubric,
102
+ )
103
+
104
+ judge = LLMJudge(
105
+ rubric=load_reference_rubric("judge-groundedness"),
106
+ provider=my_async_provider, # any JudgeProvider; see examples/judge_providers.py
107
+ model_label="local-llama3-8b-q4", # non-sensitive label, chars [A-Za-z0-9._-]
108
+ )
109
+ coordinator = JudgeCoordinator([IndicatorBinding("groundedness", judge)])
110
+ async with sdk.run(agent_id="support-agent", name="Support", version="1.4.0") as run:
111
+ answer = await agent.answer(question)
112
+ async with coordinator.scope(run) as scope:
113
+ await scope.evaluate(
114
+ "groundedness",
115
+ EvaluationRequest(
116
+ JudgeDimension.GROUNDEDNESS,
117
+ (
118
+ ContentPart(ContentRole.CONTEXT, snippet),
119
+ ContentPart(ContentRole.ANSWER, answer),
120
+ ),
121
+ ),
122
+ )
123
+ print(coordinator.coverage().describe())
124
+ ```
125
+
126
+ A runnable offline version with scripted fake providers is `examples/judge_fake_provider.py`. Use `SyncLLMJudge` and
127
+ `scope.evaluate_sync` for blocking providers (no `asyncio.run` is used anywhere). Evaluations must finish inside the run block:
128
+ the scope drains pending work up to `drain_timeout_seconds` and records `JudgeTimeoutError` evidence for what is unfinished; a late
129
+ evaluation after the run is closed is not supported in V1.
130
+
131
+ ### Meaning of PASS per dimension
132
+
133
+ The five reference rubrics (`judge-answer-correctness`, `judge-groundedness`, `judge-instruction-adherence`, `judge-safety-policy`,
134
+ `judge-task-completion-evidence`) are **uncalibrated examples**: not calibrated by Gentlity, no accuracy claim, domain thresholds are
135
+ yours. Load them with `load_reference_rubric(id)` or copy the JSON and edit it (change `rubric_version` whenever behavior changes).
136
+
137
+ | Dimension (rubric) | PASS means | PASS does not mean |
138
+ |---|---|---|
139
+ | `answer-correctness` (judge-answer-correctness) | no contradiction with the supplied reference and the required facts are present | the answer is correct in general |
140
+ | `groundedness` (judge-groundedness) | every material claim is supported by the supplied context blocks, with at least one citation | the context itself is true |
141
+ | `instruction-adherence` (judge-instruction-adherence) | the checkable items stated in the instructions were followed | unstated expectations were met (deterministic checks are better where possible) |
142
+ | `safety-policy` (judge-safety-policy) | this rubric found no violation of the supplied policy | the answer is safe |
143
+ | `task-completion-evidence` (judge-task-completion-evidence) | the evidence TEXT supports the claim of completion | the business outcome occurred (never an authoritative outcome; a fabricated confirmation passes it by construction; use an outcome expectation for critical journeys) |
144
+
145
+ ### Outcomes, failures and what the platform sees
146
+
147
+ A completed judgment is PASS, FAIL or UNKNOWN (low confidence and judge disagreement are UNKNOWN). Anything else (timeout, provider
148
+ failure, refusal, invalid or oversize output, input over the limit, budget exhausted, queue shed) is an **execution failure**, recorded
149
+ with the class name as `exception_type`, never as an outcome. Failures and UNKNOWN leave the reliability denominator, so reliability must
150
+ be read **beside** the failure rate and the UNKNOWN rate: 99 failed attempts plus one PASS reads as reliability 1.0. The local
151
+ `coordinator.coverage()` report shows attempted, determinate, failed, unknown and unsampled counts together and offers no single "healthy"
152
+ value on purpose. Any failure marks the run's measurement health `UNAVAILABLE`, and the platform's health counts are not
153
+ indicator-scoped, so every indicator in that scope and window shows an unavailable `measurement_state`. Only a window with no determinate
154
+ evidence reaches a gate's `on_no_data`; a partial outage or a high UNKNOWN rate has no gate effect, so set `on_no_data` deliberately
155
+ (BLOCK where an outage must stop deployment). Failure evidence reaches the platform only when the SDK build's `record_evaluation_failure`
156
+ accepts `indicator=` and the sink supports health evidence; otherwise it is local run health only and the coordinator reports "failure
157
+ evidence not delivered".
158
+
159
+ ### Timeouts, blocking providers and shutdown
160
+
161
+ * **Async (`LLMJudge`).** The per-attempt timeout and the total deadline are enforced with `asyncio.timeout`; cancellation propagates and records nothing.
162
+ * **Sync (`SyncLLMJudge`) is best effort.** A blocking call cannot be interrupted from outside. The judge passes the remaining deadline to your provider as `deadline_seconds` and
163
+ classifies an overrun as `JudgeTimeoutError` only *after the call returns*, discarding the late reply. A provider that never returns blocks `evaluate_sync` indefinitely, and the
164
+ scope's drain cannot help in the same thread. **The real bound is your provider's own socket/client timeout**: always set one (the example adapters pass `deadline_seconds` to the HTTP client).
165
+ When you need the deadline enforced regardless, wrap the provider in `ExecutorSyncProvider(inner, max_threads=N)`: the call runs in a bounded daemon helper thread and is abandoned at the deadline
166
+ (the thread itself cannot be killed and lives until the provider returns; beyond `max_threads` calls fail fast with `JudgeProviderUnavailableError`).
167
+ * **Tokens of discarded late replies are not counted.** A reply that arrives after its deadline (or after a drain timeout) is discarded together with its reported usage, so token and cost budgets
168
+ can undercount what the provider billed. The documented overshoot bound applies; treat budgets as guard rails, not as billing.
169
+ * **`jitter` and clocks.** A custom `jitter` callable must return a number in `[0, 1]`; anything else raises `ValueError("jitter must return a number in [0, 1]")`, a programmer error that is not one of the ten failure classes.
170
+
171
+ ### The recording gate: what runs inside it
172
+
173
+ Concurrent judge *execution* is never concurrent *recording*. Every call that hands evidence to the run handle is made while holding the scope's one recording gate. `RunHandle.record_*`
174
+ synchronously invokes your **sink and diagnostic handler inside that gate**, so they **must be non-blocking** (the HTTP exporter's `emit` is); a slow sink delays all recording of the scope.
175
+ A sink or diagnostic handler must not call back into the same `EvaluationScope`: such a re-entrant call raises `RuntimeError` instead of deadlocking. Application code must not record on the same
176
+ handle from another thread while a threaded scope has evaluations in flight.
177
+
178
+ "Recorded" means *handed to the run handle*. The SDK isolates a failing sink, so an evaluation reported as `RECORDED_RESULT` or `RECORDED_FAILURE` may still have been dropped by a sink that
179
+ raised; the coordinator cannot detect that. Watch your sink's own delivery status (for the HTTP exporter, its delivery snapshot) next to the coordinator's `coverage()`.
180
+
181
+ ### Measurement-health safeguards
182
+
183
+ | Safeguard | What to do |
184
+ |---|---|
185
+ | Budget and overload limits | Size budgets and limits so budget exhaustion and overload do not occur (`JudgeBudget`, `JudgeLimits`, `max_pending`, `max_concurrency`); treat any `JudgeBudgetExceededError` or `JudgeOverloadedError` as an incident. Defaults are safe, not fast, and are not benchmarked |
186
+ | Run health | One judge failure sets run health `UNAVAILABLE`, which changes `measurement_state` for every indicator in the scope and window |
187
+ | Coverage monitoring | Read failure rate and UNKNOWN rate beside reliability (`coverage()`; platform reads of failure and UNKNOWN counts) |
188
+ | Scope separation | Do not interpret `measurement_state` of deterministic indicators while judge indicators share their scope and window; consider a separate scope for judge evaluation |
189
+ | Failure alerting | Wire a `JudgeObserver` (or poll `coverage()`) to your own alerting: failures by class, shed, skipped |
190
+ | No-data policy | Set `on_no_data` explicitly; partial outage is not covered |
191
+
192
+ ### Identity and cohorts
193
+
194
+ The wire identity is `name=<rubric_id>`, `version=<rubric_version>`, `configuration_id=<model_label>.jp1.mc-<min_confidence>.rp<repeats>.ct<0|1>`,
195
+ all in the grammar `[A-Za-z0-9._-]` (1-128, alphanumeric ends) that both the SDK and the HTTP exporter accept. A `+`
196
+ (for example `1.0.0+build5`) is accepted by `EvaluatorIdentity` but rejected by the exporter, so evidence for such an identity is never
197
+ delivered; that hazard exists for any evaluator and is not changed here. The platform pools by indicator only: when a rubric or model
198
+ change should start a new cohort, also change the indicator name (for example `groundedness-v2`).
199
+
200
+ ### Vocabulary notes
201
+
202
+ The contract lists `judge_abstained`, `low_confidence` and `judge_disagreement` as always-present unknown codes. The SDK requires `low_confidence` in every rubric and `judge_disagreement` when
203
+ `repeats > 1`; `judge_abstained` is *not* enforced (a rubric may omit it; the reference rubrics include it). `SamplingPolicy.salt` is validated more strictly than the contract's charset
204
+ (alphanumeric first and last character, 1-64 characters of `[A-Za-z0-9._-]`, or empty) so that it can never be rejected by an identity grammar if it is later folded into a label; salts such as `_pilot` are rejected.
205
+ A reply fenced with Windows line endings (`` ```json `` followed by CRLF) is rejected by the strict parser and costs one re-ask.
206
+
207
+ ### Calibration
208
+
209
+ Calibration is a customer-local practice: `run_calibration` over your own labelled dataset with your own provider, producing a
210
+ content-free report. Gentlity receives no dataset, enforces no threshold and publishes no accuracy figure; see the calibration section
211
+ below. Results describe one rubric version, model label and dataset only.
212
+
213
+ ### Local-model walkthrough (manual, not a CI criterion)
214
+
215
+ Prerequisites: a locally running OpenAI-compatible runtime (for example Ollama serving on `127.0.0.1:11434`), a model already pulled by
216
+ you (the SDK never downloads models), Python 3.11+, and this package. Steps: (1) copy `examples/judge_providers.py` next to your code;
217
+ (2) `provider = local_runtime_provider(model="<your model>")`; (3) build `SyncLLMJudge(rubric=load_reference_rubric(...), provider=provider,
218
+ model_label="<non-sensitive label>")`; (4) run a few requests through `JudgeCoordinator` with `evaluate_sync`; (5) read
219
+ `coordinator.coverage().describe()`. Model output is non-deterministic, so the output of this walkthrough is not an acceptance criterion
220
+ and no result of it is a claim about quality.
221
+
222
+ ## Next
223
+
224
+ [Measure reliability locally](MEASURE_RELIABILITY_LOCALLY.md).