techrevati-runtime 0.4.0__tar.gz → 0.5.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 (286) hide show
  1. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/.github/workflows/ci.yml +40 -15
  2. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/.github/workflows/codeql.yml +2 -2
  3. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/.github/workflows/docs.yml +8 -8
  4. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/.github/workflows/release.yml +11 -11
  5. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/.pre-commit-config.yaml +2 -2
  6. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/CHANGELOG.md +97 -0
  7. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/PKG-INFO +18 -17
  8. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/README.md +1 -1
  9. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/orchestrator.md +3 -0
  10. techrevati_runtime-0.5.0/docs/api/otel.md +64 -0
  11. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/changelog.md +97 -0
  12. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/production-readiness.md +1 -1
  13. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/remote-ci-validation.md +3 -3
  14. techrevati_runtime-0.5.0/docs/eu-ai-act/audit-log.md +146 -0
  15. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/eu-ai-act/conformity-checklist.md +5 -0
  16. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/eu-ai-act/cybersecurity.md +18 -3
  17. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/eu-ai-act/human-oversight.md +31 -2
  18. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/eu-ai-act/incident-reporting.md +5 -0
  19. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/index.md +1 -1
  20. techrevati_runtime-0.5.0/docs/migrating-from-0.4.x.md +140 -0
  21. techrevati_runtime-0.5.0/docs/open-items.md +25 -0
  22. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/agent-events.md +7 -2
  23. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/circuit-breaker.md +13 -1
  24. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/durability-postgres.md +15 -5
  25. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/durability.md +38 -0
  26. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/governance.md +24 -1
  27. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/hooks.md +8 -3
  28. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/lifecycle.md +6 -0
  29. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/mcp.md +20 -8
  30. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/memory.md +12 -0
  31. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/orchestrator.md +68 -0
  32. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/permissions.md +17 -0
  33. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/pilot-profile.md +2 -4
  34. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/policy.md +5 -0
  35. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/rate-limiting.md +18 -0
  36. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/retry.md +6 -2
  37. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/routing.md +3 -0
  38. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/streaming.md +4 -0
  39. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/typed-outputs.md +5 -1
  40. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/usage-tracking.md +5 -1
  41. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/mkdocs.yml +2 -0
  42. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/pyproject.toml +17 -16
  43. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_public_api.py +5 -0
  44. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_python_support.py +1 -1
  45. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_remote_ci_validation.py +4 -4
  46. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/__init__.py +10 -0
  47. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/_internal.py +56 -10
  48. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/agent_events.py +101 -5
  49. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/agent_lifecycle.py +20 -0
  50. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/checkpoint.py +102 -96
  51. techrevati_runtime-0.5.0/src/techrevati/runtime/circuit_breaker.py +389 -0
  52. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/compliance/__init__.py +4 -0
  53. techrevati_runtime-0.5.0/src/techrevati/runtime/compliance/audit_log.py +1207 -0
  54. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/compliance/cybersecurity.py +86 -24
  55. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/compliance/human_oversight.py +241 -36
  56. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/compliance/incidents.py +51 -13
  57. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/compliance/kit.py +34 -2
  58. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/data/pricing.json +3 -1
  59. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/governance.py +110 -2
  60. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/guardrails.py +168 -34
  61. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/hooks.py +52 -9
  62. techrevati_runtime-0.5.0/src/techrevati/runtime/mcp.py +272 -0
  63. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/memory.py +59 -23
  64. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/orchestrator.py +1072 -228
  65. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/otel.py +338 -45
  66. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/output_spec.py +25 -5
  67. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/permissions.py +127 -28
  68. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/persistence.py +23 -19
  69. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/policy_engine.py +85 -12
  70. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/rate_limit.py +145 -27
  71. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/retry_policy.py +58 -25
  72. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/routing.py +5 -1
  73. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/scheduler.py +5 -3
  74. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/streaming.py +14 -6
  75. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/usage_tracking.py +91 -45
  76. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/compliance/test_kit_integration.py +1 -1
  77. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_async_orchestrator.py +6 -2
  78. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_checkpoint.py +5 -6
  79. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_guardrails.py +6 -2
  80. techrevati_runtime-0.5.0/tests/test_mcp_real.py +234 -0
  81. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_orchestrator.py +6 -2
  82. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_permissions.py +2 -2
  83. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_property_retry_policy.py +34 -4
  84. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_python_support.py +3 -2
  85. techrevati_runtime-0.5.0/tests/test_regress_compliance.py +2230 -0
  86. techrevati_runtime-0.5.0/tests/test_regress_integrations.py +666 -0
  87. techrevati_runtime-0.5.0/tests/test_regress_orchestrator.py +1235 -0
  88. techrevati_runtime-0.5.0/tests/test_regress_resilience.py +1151 -0
  89. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_remote_ci_validation.py +5 -5
  90. techrevati_runtime-0.4.0/docs/api/otel.md +0 -33
  91. techrevati_runtime-0.4.0/docs/eu-ai-act/audit-log.md +0 -62
  92. techrevati_runtime-0.4.0/src/techrevati/runtime/circuit_breaker.py +0 -315
  93. techrevati_runtime-0.4.0/src/techrevati/runtime/compliance/audit_log.py +0 -531
  94. techrevati_runtime-0.4.0/src/techrevati/runtime/mcp.py +0 -165
  95. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/.github/ISSUE_TEMPLATE/bug.md +0 -0
  96. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  97. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/.github/codeql/codeql-config.yml +0 -0
  98. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/.github/dependabot.yml +0 -0
  99. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/.gitignore +0 -0
  100. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/CODEOWNERS +0 -0
  101. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/CONTRIBUTING.md +0 -0
  102. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/LICENSE +0 -0
  103. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/SECURITY.md +0 -0
  104. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/agent_events.md +0 -0
  105. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/agent_lifecycle.md +0 -0
  106. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/checkpoint.md +0 -0
  107. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/circuit_breaker.md +0 -0
  108. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/governance.md +0 -0
  109. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/guardrails.md +0 -0
  110. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/handoffs.md +0 -0
  111. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/hooks.md +0 -0
  112. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/mcp.md +0 -0
  113. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/memory.md +0 -0
  114. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/output_spec.md +0 -0
  115. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/permissions.md +0 -0
  116. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/persistence.md +0 -0
  117. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/pilot.md +0 -0
  118. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/policy_engine.md +0 -0
  119. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/quality_gate.md +0 -0
  120. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/rate_limit.md +0 -0
  121. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/retry_policy.md +0 -0
  122. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/routing.md +0 -0
  123. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/scheduler.md +0 -0
  124. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/sinks.md +0 -0
  125. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/streaming.md +0 -0
  126. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/api/usage_tracking.md +0 -0
  127. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/final-diff-review.md +0 -0
  128. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/guard-calibration.md +0 -0
  129. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/index.md +0 -0
  130. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/pilot-dry-run.md +0 -0
  131. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/pilot-evidence-template.md +0 -0
  132. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/pilot-execution.md +0 -0
  133. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/pilot-operations-runbook.md +0 -0
  134. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/private-rc-publication.md +0 -0
  135. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/rc-inventory.md +0 -0
  136. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/rc-readiness-summary.md +0 -0
  137. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/rc-review-handoff.md +0 -0
  138. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/rollback-execution.md +0 -0
  139. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/rollback-proof-checklist.md +0 -0
  140. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/security-review.md +0 -0
  141. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/stable-promotion.md +0 -0
  142. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/compliance/staging-manifest.md +0 -0
  143. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/consuming-as-a-library.md +0 -0
  144. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/eu-ai-act/index.md +0 -0
  145. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/eu-ai-act/risk-management.md +0 -0
  146. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/eu-ai-act/transparency.md +0 -0
  147. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/getting-started.md +0 -0
  148. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/migrating-from-0.0.x.md +0 -0
  149. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/migrating-from-0.1.x.md +0 -0
  150. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/migrating-from-0.3.x.md +0 -0
  151. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/durability-redis.md +0 -0
  152. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/patterns/quality-gate.md +0 -0
  153. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/styles/runtime.css +0 -0
  154. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs/tutorials/end-to-end.md +0 -0
  155. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs_theme/404.html +0 -0
  156. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/docs_theme/main.html +0 -0
  157. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/examples/durable_agent.py +0 -0
  158. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/examples/parallel_tools.py +0 -0
  159. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/examples/pricing.json +0 -0
  160. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/examples/tiny_agent.py +0 -0
  161. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_changelog.py +0 -0
  162. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_ci_guardrails.py +0 -0
  163. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_dependency_vulnerabilities.py +0 -0
  164. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_distribution.py +0 -0
  165. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_docs_public_api.py +0 -0
  166. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_docs_publication.py +0 -0
  167. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_final_diff_review.py +0 -0
  168. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_guard_calibration.py +0 -0
  169. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_maintenance.py +0 -0
  170. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_module_coverage.py +0 -0
  171. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_operations_runbook.py +0 -0
  172. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_package_policy.py +0 -0
  173. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_pilot_dry_run.py +0 -0
  174. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_pilot_evidence.py +0 -0
  175. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_pilot_execution.py +0 -0
  176. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_precommit_config.py +0 -0
  177. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_private_rc_publication.py +0 -0
  178. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_public_branding.py +0 -0
  179. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_rc_readiness.py +0 -0
  180. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_rc_review_handoff.py +0 -0
  181. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_release_evidence.py +0 -0
  182. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_release_tag.py +0 -0
  183. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_release_workflow.py +0 -0
  184. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_repo_hygiene.py +0 -0
  185. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_rollback_execution.py +0 -0
  186. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_secret_leaks.py +0 -0
  187. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_security_patterns.py +0 -0
  188. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_security_review.py +0 -0
  189. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_source_hygiene.py +0 -0
  190. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_stable_promotion.py +0 -0
  191. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_staging_manifest.py +0 -0
  192. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_toolchain_pins.py +0 -0
  193. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_version_consistency.py +0 -0
  194. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_workflow_hardening.py +0 -0
  195. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/check_workflow_pinning.py +0 -0
  196. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/install_toolchain.py +0 -0
  197. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/mkdocs_hooks/remove_generator_meta.py +0 -0
  198. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/scripts/release_preflight.py +0 -0
  199. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/__init__.py +0 -0
  200. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/_classify.py +0 -0
  201. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/compliance/risk_registry.py +0 -0
  202. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/compliance/transparency.py +0 -0
  203. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/handoffs.py +0 -0
  204. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/pilot.py +0 -0
  205. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/py.typed +0 -0
  206. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/quality_gate.py +0 -0
  207. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/src/techrevati/runtime/sinks.py +0 -0
  208. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/__init__.py +0 -0
  209. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/compliance/test_audit_log.py +0 -0
  210. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/compliance/test_audit_session_wiring.py +0 -0
  211. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/compliance/test_cybersecurity.py +0 -0
  212. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/compliance/test_human_oversight.py +0 -0
  213. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/compliance/test_incidents.py +0 -0
  214. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/compliance/test_risk_registry.py +0 -0
  215. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/compliance/test_transparency.py +0 -0
  216. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/conftest.py +0 -0
  217. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_agent_events.py +0 -0
  218. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_agent_lifecycle.py +0 -0
  219. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_async_circuit_breaker.py +0 -0
  220. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_async_guardrails.py +0 -0
  221. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_checkpoint_steps.py +0 -0
  222. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_ci_guardrails.py +0 -0
  223. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_circuit_breaker.py +0 -0
  224. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_classify.py +0 -0
  225. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_dependency_vulnerabilities.py +0 -0
  226. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_distribution.py +0 -0
  227. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_docs_public_api.py +0 -0
  228. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_docs_publication.py +0 -0
  229. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_examples.py +0 -0
  230. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_final_diff_review.py +0 -0
  231. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_governance.py +0 -0
  232. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_governance_events.py +0 -0
  233. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_governance_integration.py +0 -0
  234. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_guard_calibration.py +0 -0
  235. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_handoffs.py +0 -0
  236. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_hooks.py +0 -0
  237. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_maintenance.py +0 -0
  238. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_max_iterations.py +0 -0
  239. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_mcp.py +0 -0
  240. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_memory.py +0 -0
  241. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_operations_runbook.py +0 -0
  242. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_otel.py +0 -0
  243. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_otel_atexit_cleanup.py +0 -0
  244. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_otel_genai_messages.py +0 -0
  245. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_otel_nesting.py +0 -0
  246. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_output_spec.py +0 -0
  247. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_package_metadata.py +0 -0
  248. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_package_policy.py +0 -0
  249. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_pattern_and_prompt_injection_guardrails.py +0 -0
  250. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_pilot.py +0 -0
  251. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_pilot_dry_run.py +0 -0
  252. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_pilot_evidence.py +0 -0
  253. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_pilot_execution.py +0 -0
  254. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_policy_engine.py +0 -0
  255. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_precommit_config.py +0 -0
  256. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_private_rc_publication.py +0 -0
  257. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_property_circuit_breaker.py +0 -0
  258. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_public_api.py +0 -0
  259. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_quality_gate.py +0 -0
  260. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_rate_limit.py +0 -0
  261. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_rc_readiness.py +0 -0
  262. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_rc_review_handoff.py +0 -0
  263. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_register_pricing_on_conflict.py +0 -0
  264. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_release_evidence.py +0 -0
  265. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_release_guards.py +0 -0
  266. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_release_workflow.py +0 -0
  267. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_repo_hygiene.py +0 -0
  268. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_retry_policy.py +0 -0
  269. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_rollback_execution.py +0 -0
  270. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_routing.py +0 -0
  271. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_s0_regressions.py +0 -0
  272. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_s5_scheduler_persistence_async_policy.py +0 -0
  273. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_s5_usage_limits_and_caching.py +0 -0
  274. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_secret_leaks.py +0 -0
  275. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_security_patterns.py +0 -0
  276. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_security_review.py +0 -0
  277. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_sinks.py +0 -0
  278. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_source_hygiene.py +0 -0
  279. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_stable_promotion.py +0 -0
  280. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_staging_manifest.py +0 -0
  281. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_step_retries.py +0 -0
  282. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_streaming.py +0 -0
  283. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_taskgroup_parallel_tools.py +0 -0
  284. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_usage_tracking.py +0 -0
  285. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_workflow_hardening.py +0 -0
  286. {techrevati_runtime-0.4.0 → techrevati_runtime-0.5.0}/tests/test_workflow_pinning.py +0 -0
@@ -21,17 +21,17 @@ jobs:
21
21
  strategy:
22
22
  fail-fast: false
23
23
  matrix:
24
- python-version: ['3.11', '3.12', '3.13']
24
+ python-version: ['3.11', '3.12', '3.13', '3.14']
25
25
 
26
26
  steps:
27
- # actions/checkout v4
28
- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
27
+ # actions/checkout v7
28
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
29
29
  with:
30
30
  persist-credentials: false
31
31
 
32
32
  - name: Set up Python ${{ matrix.python-version }}
33
- # actions/setup-python v5
34
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
33
+ # actions/setup-python v7
34
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0
35
35
  with:
36
36
  python-version: ${{ matrix.python-version }}
37
37
  cache: pip
@@ -185,17 +185,17 @@ jobs:
185
185
  strategy:
186
186
  fail-fast: false
187
187
  matrix:
188
- python-version: ['3.11', '3.12', '3.13']
188
+ python-version: ['3.11', '3.12', '3.13', '3.14']
189
189
 
190
190
  steps:
191
- # actions/checkout v4
192
- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
191
+ # actions/checkout v7
192
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
193
193
  with:
194
194
  persist-credentials: false
195
195
 
196
196
  - name: Set up Python ${{ matrix.python-version }}
197
- # actions/setup-python v5
198
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
197
+ # actions/setup-python v7
198
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0
199
199
  with:
200
200
  python-version: ${{ matrix.python-version }}
201
201
 
@@ -223,6 +223,31 @@ jobs:
223
223
  print(f'techrevati-runtime {runtime.__version__}')
224
224
  "
225
225
 
226
+ mcp-sdk-2:
227
+ name: MCP SDK 2.x adapter
228
+ runs-on: ubuntu-latest
229
+ timeout-minutes: 10
230
+
231
+ steps:
232
+ # actions/checkout v7
233
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
234
+ with:
235
+ persist-credentials: false
236
+
237
+ - name: Set up Python
238
+ # actions/setup-python v7
239
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0
240
+ with:
241
+ python-version: '3.13'
242
+
243
+ - name: Test the adapter against a real 2.x SDK
244
+ # The dev extra pins 1.x, so without this job the 2.x branch of the
245
+ # adapter would have no coverage.
246
+ run: |
247
+ python -m pip install --upgrade pip
248
+ pip install -e . "mcp>=2,<3" pytest==9.2.0 pytest-asyncio==1.4.1.post1
249
+ python -m pytest tests/test_mcp_real.py tests/test_mcp.py -p no:cacheprovider
250
+
226
251
  zero-deps-smoke:
227
252
  name: Zero-deps smoke on Python ${{ matrix.python-version }}
228
253
  runs-on: ubuntu-latest
@@ -231,17 +256,17 @@ jobs:
231
256
  strategy:
232
257
  fail-fast: false
233
258
  matrix:
234
- python-version: ['3.11', '3.12', '3.13']
259
+ python-version: ['3.11', '3.12', '3.13', '3.14']
235
260
 
236
261
  steps:
237
- # actions/checkout v4
238
- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
262
+ # actions/checkout v7
263
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
239
264
  with:
240
265
  persist-credentials: false
241
266
 
242
267
  - name: Set up Python ${{ matrix.python-version }}
243
- # actions/setup-python v5
244
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
268
+ # actions/setup-python v7
269
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0
245
270
  with:
246
271
  python-version: ${{ matrix.python-version }}
247
272
 
@@ -30,8 +30,8 @@ jobs:
30
30
  language: [python]
31
31
 
32
32
  steps:
33
- # actions/checkout v4
34
- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
33
+ # actions/checkout v7
34
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
35
35
  with:
36
36
  persist-credentials: false
37
37
 
@@ -20,14 +20,14 @@ jobs:
20
20
  timeout-minutes: 10
21
21
 
22
22
  steps:
23
- # actions/checkout v4
24
- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
23
+ # actions/checkout v7
24
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
25
25
  with:
26
26
  persist-credentials: false
27
27
 
28
28
  - name: Set up Python
29
- # actions/setup-python v5
30
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
29
+ # actions/setup-python v7
30
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0
31
31
  with:
32
32
  python-version: '3.11'
33
33
 
@@ -55,14 +55,14 @@ jobs:
55
55
  contents: write
56
56
 
57
57
  steps:
58
- # actions/checkout v4
59
- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
58
+ # actions/checkout v7
59
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
60
60
  with:
61
61
  persist-credentials: false
62
62
 
63
63
  - name: Set up Python
64
- # actions/setup-python v5
65
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
64
+ # actions/setup-python v7
65
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0
66
66
  with:
67
67
  python-version: '3.11'
68
68
 
@@ -24,17 +24,17 @@ jobs:
24
24
  strategy:
25
25
  fail-fast: false
26
26
  matrix:
27
- python-version: ['3.11', '3.12', '3.13']
27
+ python-version: ['3.11', '3.12', '3.13', '3.14']
28
28
 
29
29
  steps:
30
- # actions/checkout v4
31
- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
30
+ # actions/checkout v7
31
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
32
32
  with:
33
33
  persist-credentials: false
34
34
 
35
35
  - name: Set up Python ${{ matrix.python-version }}
36
- # actions/setup-python v5
37
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
36
+ # actions/setup-python v7
37
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0
38
38
  with:
39
39
  python-version: ${{ matrix.python-version }}
40
40
  cache: pip
@@ -192,14 +192,14 @@ jobs:
192
192
  id-token: write
193
193
 
194
194
  steps:
195
- # actions/checkout v4
196
- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
195
+ # actions/checkout v7
196
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
197
197
  with:
198
198
  persist-credentials: false
199
199
 
200
200
  - name: Set up Python
201
- # actions/setup-python v5
202
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
201
+ # actions/setup-python v7
202
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0
203
203
  with:
204
204
  python-version: '3.11'
205
205
 
@@ -263,9 +263,9 @@ jobs:
263
263
  run: python scripts/check_release_evidence.py dist
264
264
 
265
265
  - name: Create release
266
- # softprops/action-gh-release v2.6.2 — the durable evidence record is
266
+ # softprops/action-gh-release v3.0.4 — the durable evidence record is
267
267
  # created before any index push, so a publish failure cannot lose it.
268
- uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65
268
+ uses: softprops/action-gh-release@8a0cd651e5b2365bd640854a3fa5dfc70e4875f3
269
269
  with:
270
270
  prerelease: ${{ contains(github.ref_name, 'rc') || contains(github.ref_name, 'dev') }}
271
271
  generate_release_notes: true
@@ -1,6 +1,6 @@
1
1
  repos:
2
2
  - repo: https://github.com/astral-sh/ruff-pre-commit
3
- rev: v0.15.17
3
+ rev: v0.17.4
4
4
  hooks:
5
5
  - id: ruff
6
6
  args: [--fix]
@@ -16,7 +16,7 @@ repos:
16
16
  - id: check-merge-conflict
17
17
 
18
18
  - repo: https://github.com/pre-commit/mirrors-mypy
19
- rev: v2.1.0
19
+ rev: v2.4.1
20
20
  hooks:
21
21
  - id: mypy
22
22
  additional_dependencies: []
@@ -2,6 +2,103 @@
2
2
 
3
3
  Author: Techrevati doo
4
4
 
5
+ ## 0.5.0 - 2026-11-06
6
+
7
+ The hardening line: every defect below was reproduced by an executed proof before
8
+ it was fixed. See [Migrating from 0.4.x](migrating-from-0.4.x.md) for what changes
9
+ for existing callers.
10
+
11
+ Added:
12
+
13
+ - `run_tool` / `arun_tool` accept `args`, `timeout` (`ToolTimeoutError`), and
14
+ `idempotency_key`, which replays a completed tool call instead of repeating its
15
+ side effect (at-least-once).
16
+ - `MaxRepeatedToolCallsLimit` stops an agent repeating the same tool call.
17
+ - `run_turn_with_fallback` / `arun_turn_with_fallback` drive `provider_router`.
18
+ - `arun_turn_stream(idempotency_key=...)`.
19
+ - `session(handoff=...)` / `asession(handoff=...)` run on the worker a `Handoff`
20
+ reserved.
21
+ - `agent.turn.completed` / `agent.turn.failed` events, `chat` spans,
22
+ `OpenTelemetryMetricsSink`, and the `gen_ai.client.inference.usage.*` counters.
23
+ - MCP Python SDK 2.x support alongside 1.x, plus a per-call `timeout`.
24
+ - Audit log `tip()`, `ChainTip`, and `verify_chain(expected_tip=...)`.
25
+ - `AgentRegistry.evict_terminal()`, `TokenBucket.debit()`.
26
+ - Audit purge markers, signed under the sink's key.
27
+ - `AgentSession(audit_fail_closed=True)` refuses further actions with
28
+ `AuditWriteError` once the audit log cannot be written.
29
+ - Python 3.14 support.
30
+
31
+ Fixed, security and audit integrity:
32
+
33
+ - Two audit writers on one SQLite file could wedge it and silently lose every later
34
+ record. Appends are now atomic and writers serialize into one chain.
35
+ - Quadratic regular expressions in `PromptInjectionGuardrail` and `RedactPIIHook` let
36
+ untrusted content stall the event loop.
37
+ - Prompt-injection and pattern guardrails were bypassed by any structured output,
38
+ because `str()` escaped the newlines their patterns match on.
39
+ - A role name differing by case or an invisible character bypassed its deny list.
40
+ - Async policy conditions always matched under `And` / `Or` and in sync `evaluate`.
41
+ - The human-oversight gate accepted replayed, stale, spoofed, and invalid decisions,
42
+ and did not enforce its timeout on a hanging queue.
43
+ - The oversight trail omitted the reason and action, and recorded nothing if a queue
44
+ raised. The compliance kit's log now receives oversight events.
45
+ - Unserializable event content dropped audit records while the action proceeded, and
46
+ could suppress incident notification. Hashes of existing records are unchanged.
47
+ - A deleted audit tail was not detected on a live sink.
48
+ - Tampered rows crashed verification rather than reporting invalid. CSV export did
49
+ not escape timestamps. Purge compared timestamp strings across UTC offsets.
50
+ - PII redaction skipped tuples, sets, dict keys, and bytes, and missed standard base64
51
+ keys and JWT headers. Combined patterns lost backreferences.
52
+
53
+ Fixed, accounting and durability:
54
+
55
+ - A turn that crossed a budget or usage limit, or whose `after_model` hook failed, was
56
+ missing from the checkpoint and from governance cost, so the retry paid again and
57
+ `MaxBudgetLimit` could never trip.
58
+ - A replayed turn did not restore its spend, so a restart reset the budget.
59
+ - Usage above a rate-limit bucket's capacity raised after the model call and lost the
60
+ turn.
61
+ - Usage passed without `model=` was discarded, which disabled `UsageLimits`.
62
+ - A failed SQLite write left a transaction open: every later write failed and reads
63
+ went stale until restart (`SqliteSaver`, `SqliteEventSink`, `SqliteUsageSink`).
64
+ - Concurrent cold starts of a new SQLite file crashed with `IntegrityError`.
65
+ - JSON-valid state with a lone surrogate failed on `SqliteSaver` and aborted the turn.
66
+ - Pricing prefixes had no name boundary: `gpt-4` priced `gpt-4o-mini` and suppressed
67
+ the missing-price warning.
68
+ - Cache writes could cost $0 on a tiered model. Float sums could falsely exceed a
69
+ budget at its exact boundary.
70
+
71
+ Fixed, runtime behaviour:
72
+
73
+ - `arun_turn_stream(timeout=)` cancelled the consumer's task, even after the consumer
74
+ had left the stream, because the timeout scope spanned a `yield`.
75
+ - A hung half-open probe blocked the circuit indefinitely, a stale probe result could
76
+ close it, and it could stay half-open under sustained load despite successes.
77
+ - Context-overflow errors containing a token count such as `14290` were classified as
78
+ rate limits, and digits inside identifiers as HTTP statuses.
79
+ - Duplicate names in a router's `exclude` made every router return `None`.
80
+ - A timed-out `pause_for_input` stranded the worker and made session exit raise.
81
+ - `run_turn(timeout=)` lost context variables, including tracing context, in its
82
+ worker thread. A `TimeoutError` raised by user code was reported as the deadline.
83
+ - Compaction identified messages by object identity, so a reused instance defeated
84
+ both limits, and it could delete the newest message.
85
+ - `JsonOutputSpec` leaked `RecursionError` and `ValueError`, and accepted `NaN`.
86
+ - Orphan spans were lost under a batch processor at exit. `OpenTelemetrySink.shutdown()`
87
+ closes them explicitly.
88
+ - `execute_tool` spans lacked `gen_ai.tool.name`, tool spans stayed open after a
89
+ post-guardrail block or cancellation, and cache tokens never reached metrics.
90
+ - Runtime exceptions did not survive `pickle` or `copy`.
91
+ - `mkdocs build` failed with current `pymdown-extensions`; `mkdocstrings` is updated.
92
+
93
+ Changed:
94
+
95
+ - **Breaking:** `default_allow_unknown_roles` now defaults to `False`, so a role with no
96
+ config is denied.
97
+ - A turn timeout now counts as a circuit-breaker failure, so a provider that hangs
98
+ opens the circuit.
99
+ - Toolchain updated (ruff 0.17, mypy 2.4, pytest 9.2, hypothesis, OpenTelemetry 1.45,
100
+ and pinned actions for checkout, setup-python, and the release publisher).
101
+
5
102
  ## 0.4.0 - 2026-06-20
6
103
 
7
104
  The EU AI Act compliance line.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: techrevati-runtime
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Summary: Async-aware runtime primitives for multi-step LLM agent loops.
5
5
  Author: Techrevati doo
6
6
  License-Expression: MIT
@@ -13,33 +13,34 @@ Classifier: License :: OSI Approved :: MIT License
13
13
  Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Programming Language :: Python :: 3.14
16
17
  Classifier: Topic :: Software Development :: Libraries
17
18
  Classifier: Typing :: Typed
18
19
  Requires-Python: >=3.11
19
20
  Provides-Extra: audit
20
- Requires-Dist: pip-audit==2.10.0; extra == 'audit'
21
+ Requires-Dist: pip-audit==2.10.1; extra == 'audit'
21
22
  Provides-Extra: build
22
23
  Requires-Dist: build==1.5.0; extra == 'build'
23
24
  Requires-Dist: twine==6.2.0; extra == 'build'
24
25
  Provides-Extra: dev
25
- Requires-Dist: hypothesis==6.155.2; extra == 'dev'
26
- Requires-Dist: mcp==1.27.2; extra == 'dev'
27
- Requires-Dist: mypy==2.1.0; extra == 'dev'
28
- Requires-Dist: opentelemetry-api==1.42.1; extra == 'dev'
29
- Requires-Dist: opentelemetry-sdk==1.42.1; extra == 'dev'
30
- Requires-Dist: opentelemetry-semantic-conventions==0.63b1; extra == 'dev'
31
- Requires-Dist: pytest-asyncio==1.4.0; extra == 'dev'
26
+ Requires-Dist: hypothesis==6.170.15; extra == 'dev'
27
+ Requires-Dist: mcp==1.30.0; extra == 'dev'
28
+ Requires-Dist: mypy==2.4.1; extra == 'dev'
29
+ Requires-Dist: opentelemetry-api==1.45.2; extra == 'dev'
30
+ Requires-Dist: opentelemetry-sdk==1.45.2; extra == 'dev'
31
+ Requires-Dist: opentelemetry-semantic-conventions==0.66b2; extra == 'dev'
32
+ Requires-Dist: pytest-asyncio==1.4.1.post1; extra == 'dev'
32
33
  Requires-Dist: pytest-cov==7.1.0; extra == 'dev'
33
- Requires-Dist: pytest-randomly==4.1.0; extra == 'dev'
34
- Requires-Dist: pytest==9.1.0; extra == 'dev'
35
- Requires-Dist: ruff==0.15.17; extra == 'dev'
34
+ Requires-Dist: pytest-randomly==5.0.0; extra == 'dev'
35
+ Requires-Dist: pytest==9.2.0; extra == 'dev'
36
+ Requires-Dist: ruff==0.17.4; extra == 'dev'
36
37
  Provides-Extra: docs
37
38
  Requires-Dist: mkdocs==1.6.1; extra == 'docs'
38
- Requires-Dist: mkdocstrings-python==2.0.4; extra == 'docs'
39
- Requires-Dist: mkdocstrings[python]==1.0.4; extra == 'docs'
40
- Requires-Dist: ruff==0.15.17; extra == 'docs'
39
+ Requires-Dist: mkdocstrings-python==2.0.10; extra == 'docs'
40
+ Requires-Dist: mkdocstrings[python]==1.0.8; extra == 'docs'
41
+ Requires-Dist: ruff==0.17.4; extra == 'docs'
41
42
  Provides-Extra: mcp
42
- Requires-Dist: mcp<2,>=1.0; extra == 'mcp'
43
+ Requires-Dist: mcp<3,>=1.10; extra == 'mcp'
43
44
  Provides-Extra: otel
44
45
  Requires-Dist: opentelemetry-api<2,>=1.27; extra == 'otel'
45
46
  Requires-Dist: opentelemetry-sdk<2,>=1.27; extra == 'otel'
@@ -64,7 +65,7 @@ budget enforcement, role-based tool gating, guardrails, handoffs, policy
64
65
  evaluation, checkpointing, rate limiting, streaming, hooks, and telemetry
65
66
  integration.
66
67
 
67
- The package is currently `0.4.0`. The `0.x`
68
+ The package is currently `0.5.0`. The `0.x`
68
69
  API surface is still unstable, so pin exact versions when you depend on a
69
70
  specific behavior.
70
71
 
@@ -8,7 +8,7 @@ budget enforcement, role-based tool gating, guardrails, handoffs, policy
8
8
  evaluation, checkpointing, rate limiting, streaming, hooks, and telemetry
9
9
  integration.
10
10
 
11
- The package is currently `0.4.0`. The `0.x`
11
+ The package is currently `0.5.0`. The `0.x`
12
12
  API surface is still unstable, so pin exact versions when you depend on a
13
13
  specific behavior.
14
14
 
@@ -7,5 +7,8 @@
7
7
  - AsyncOrchestrationSession
8
8
  - AgentSession
9
9
  - PermissionDeniedError
10
+ - AuditWriteError
11
+ - ToolTimeoutError
10
12
  - TurnTimeoutError
13
+ - DEFAULT_FAILOVER_SCENARIOS
11
14
  - MaxIterationsExceededError
@@ -0,0 +1,64 @@
1
+ # Telemetry Integration
2
+
3
+ Requires `pip install 'techrevati-runtime[otel]'`.
4
+
5
+ `OpenTelemetrySink` keeps one parent span open for the agent or phase
6
+ lifecycle. Tool calls open child spans under that parent, and
7
+ tool-scoped failures close only the tool span. Terminal session
8
+ failures still close the parent span.
9
+
10
+ Event details are omitted from spans by default because callers may put prompt
11
+ fragments, tool arguments, or exception text into `AgentEvent.detail`. Use
12
+ `OpenTelemetrySink(include_event_detail=True)` only after detail values are
13
+ sanitized and telemetry retention is approved.
14
+
15
+ ## GenAI semantic conventions
16
+
17
+ The sink emits OpenTelemetry GenAI semantic-convention signals:
18
+
19
+ - **Spans** carry `gen_ai.operation.name`, `gen_ai.provider.name`, and
20
+ `gen_ai.agent.name`. An `invoke_agent {role}` span nests under the open
21
+ `invoke_workflow` span of its phase, when there is one. Tool calls are
22
+ `execute_tool {tool}` children with `gen_ai.tool.name` (concurrent calls to the
23
+ same tool each get their own span via a per-key LIFO stack). Model turns are
24
+ `chat {model}` client spans backdated by the measured duration.
25
+ - **Token metrics** (`OpenTelemetryUsageSink`):
26
+ `gen_ai.client.inference.usage.input_tokens` (including cached tokens),
27
+ `.output_tokens`, `.cache_read.input_tokens` and `.cache_write.input_tokens`
28
+ counters, plus a `techrevati.cost.usd` counter (no standard GenAI cost metric
29
+ exists yet).
30
+ - **Legacy token metric**: the conventions have removed `gen_ai.client.token.usage`.
31
+ It stays on by default so existing dashboards keep working; turn it off with
32
+ `OpenTelemetryUsageSink(emit_legacy_token_metric=False)` once they read the
33
+ counters.
34
+ - **Duration metrics** (`OpenTelemetryMetricsSink`, an event sink):
35
+ `gen_ai.client.inference.duration` and `gen_ai.execute_tool.duration` histograms
36
+ in seconds, with `error.type` on failure. The conventions' bucket boundaries are
37
+ applied as an advisory on OpenTelemetry API versions that support it; older ones
38
+ use the SDK's default buckets.
39
+ - **Message bodies**: if a caller places `gen_ai.input.messages` /
40
+ `gen_ai.output.messages` in `AgentEvent.data`, they are emitted as span events
41
+ of the same name — but only when `include_event_detail=True`, since message
42
+ content is sensitive. The runtime does not own the model call, so it never
43
+ fabricates these; they appear only when the caller supplies them.
44
+
45
+ These conventions now live in the
46
+ [`semantic-conventions-genai`](https://github.com/open-telemetry/semantic-conventions-genai)
47
+ repository and are still marked *Development*, so names can change.
48
+
49
+ Two required attributes cannot be known exactly by the runtime:
50
+
51
+ - `gen_ai.provider.name`: the runtime does not make the model call. Pass the real
52
+ provider as `provider_name`; the default `techrevati` only marks the data's source.
53
+ - `gen_ai.token.modality`: always `unknown`, as the conventions require when
54
+ `UsageSnapshot` does not split tokens by modality.
55
+
56
+ ## Process exit
57
+
58
+ Spans still open at normal interpreter exit are ended with
59
+ `error.type=abrupt_termination`. That hook does not run on a default SIGTERM,
60
+ `os._exit` or a hard crash, and a span ended there only reaches the exporter if the
61
+ `TracerProvider` shuts down afterwards, so create the provider before the first
62
+ sink. For SIGTERM, or a provider created later, call `sink.shutdown()` yourself.
63
+
64
+ ::: techrevati.runtime.otel
@@ -2,6 +2,103 @@
2
2
 
3
3
  Author: Techrevati doo
4
4
 
5
+ ## 0.5.0 - 2026-11-06
6
+
7
+ The hardening line: every defect below was reproduced by an executed proof before
8
+ it was fixed. See [Migrating from 0.4.x](migrating-from-0.4.x.md) for what changes
9
+ for existing callers.
10
+
11
+ Added:
12
+
13
+ - `run_tool` / `arun_tool` accept `args`, `timeout` (`ToolTimeoutError`), and
14
+ `idempotency_key`, which replays a completed tool call instead of repeating its
15
+ side effect (at-least-once).
16
+ - `MaxRepeatedToolCallsLimit` stops an agent repeating the same tool call.
17
+ - `run_turn_with_fallback` / `arun_turn_with_fallback` drive `provider_router`.
18
+ - `arun_turn_stream(idempotency_key=...)`.
19
+ - `session(handoff=...)` / `asession(handoff=...)` run on the worker a `Handoff`
20
+ reserved.
21
+ - `agent.turn.completed` / `agent.turn.failed` events, `chat` spans,
22
+ `OpenTelemetryMetricsSink`, and the `gen_ai.client.inference.usage.*` counters.
23
+ - MCP Python SDK 2.x support alongside 1.x, plus a per-call `timeout`.
24
+ - Audit log `tip()`, `ChainTip`, and `verify_chain(expected_tip=...)`.
25
+ - `AgentRegistry.evict_terminal()`, `TokenBucket.debit()`.
26
+ - Audit purge markers, signed under the sink's key.
27
+ - `AgentSession(audit_fail_closed=True)` refuses further actions with
28
+ `AuditWriteError` once the audit log cannot be written.
29
+ - Python 3.14 support.
30
+
31
+ Fixed, security and audit integrity:
32
+
33
+ - Two audit writers on one SQLite file could wedge it and silently lose every later
34
+ record. Appends are now atomic and writers serialize into one chain.
35
+ - Quadratic regular expressions in `PromptInjectionGuardrail` and `RedactPIIHook` let
36
+ untrusted content stall the event loop.
37
+ - Prompt-injection and pattern guardrails were bypassed by any structured output,
38
+ because `str()` escaped the newlines their patterns match on.
39
+ - A role name differing by case or an invisible character bypassed its deny list.
40
+ - Async policy conditions always matched under `And` / `Or` and in sync `evaluate`.
41
+ - The human-oversight gate accepted replayed, stale, spoofed, and invalid decisions,
42
+ and did not enforce its timeout on a hanging queue.
43
+ - The oversight trail omitted the reason and action, and recorded nothing if a queue
44
+ raised. The compliance kit's log now receives oversight events.
45
+ - Unserializable event content dropped audit records while the action proceeded, and
46
+ could suppress incident notification. Hashes of existing records are unchanged.
47
+ - A deleted audit tail was not detected on a live sink.
48
+ - Tampered rows crashed verification rather than reporting invalid. CSV export did
49
+ not escape timestamps. Purge compared timestamp strings across UTC offsets.
50
+ - PII redaction skipped tuples, sets, dict keys, and bytes, and missed standard base64
51
+ keys and JWT headers. Combined patterns lost backreferences.
52
+
53
+ Fixed, accounting and durability:
54
+
55
+ - A turn that crossed a budget or usage limit, or whose `after_model` hook failed, was
56
+ missing from the checkpoint and from governance cost, so the retry paid again and
57
+ `MaxBudgetLimit` could never trip.
58
+ - A replayed turn did not restore its spend, so a restart reset the budget.
59
+ - Usage above a rate-limit bucket's capacity raised after the model call and lost the
60
+ turn.
61
+ - Usage passed without `model=` was discarded, which disabled `UsageLimits`.
62
+ - A failed SQLite write left a transaction open: every later write failed and reads
63
+ went stale until restart (`SqliteSaver`, `SqliteEventSink`, `SqliteUsageSink`).
64
+ - Concurrent cold starts of a new SQLite file crashed with `IntegrityError`.
65
+ - JSON-valid state with a lone surrogate failed on `SqliteSaver` and aborted the turn.
66
+ - Pricing prefixes had no name boundary: `gpt-4` priced `gpt-4o-mini` and suppressed
67
+ the missing-price warning.
68
+ - Cache writes could cost $0 on a tiered model. Float sums could falsely exceed a
69
+ budget at its exact boundary.
70
+
71
+ Fixed, runtime behaviour:
72
+
73
+ - `arun_turn_stream(timeout=)` cancelled the consumer's task, even after the consumer
74
+ had left the stream, because the timeout scope spanned a `yield`.
75
+ - A hung half-open probe blocked the circuit indefinitely, a stale probe result could
76
+ close it, and it could stay half-open under sustained load despite successes.
77
+ - Context-overflow errors containing a token count such as `14290` were classified as
78
+ rate limits, and digits inside identifiers as HTTP statuses.
79
+ - Duplicate names in a router's `exclude` made every router return `None`.
80
+ - A timed-out `pause_for_input` stranded the worker and made session exit raise.
81
+ - `run_turn(timeout=)` lost context variables, including tracing context, in its
82
+ worker thread. A `TimeoutError` raised by user code was reported as the deadline.
83
+ - Compaction identified messages by object identity, so a reused instance defeated
84
+ both limits, and it could delete the newest message.
85
+ - `JsonOutputSpec` leaked `RecursionError` and `ValueError`, and accepted `NaN`.
86
+ - Orphan spans were lost under a batch processor at exit. `OpenTelemetrySink.shutdown()`
87
+ closes them explicitly.
88
+ - `execute_tool` spans lacked `gen_ai.tool.name`, tool spans stayed open after a
89
+ post-guardrail block or cancellation, and cache tokens never reached metrics.
90
+ - Runtime exceptions did not survive `pickle` or `copy`.
91
+ - `mkdocs build` failed with current `pymdown-extensions`; `mkdocstrings` is updated.
92
+
93
+ Changed:
94
+
95
+ - **Breaking:** `default_allow_unknown_roles` now defaults to `False`, so a role with no
96
+ config is denied.
97
+ - A turn timeout now counts as a circuit-breaker failure, so a provider that hangs
98
+ opens the circuit.
99
+ - Toolchain updated (ruff 0.17, mypy 2.4, pytest 9.2, hypothesis, OpenTelemetry 1.45,
100
+ and pinned actions for checkout, setup-python, and the release publisher).
101
+
5
102
  ## 0.4.0 - 2026-06-20
6
103
 
7
104
  The EU AI Act compliance line.
@@ -50,7 +50,7 @@ At plan creation, the runtime is already significantly hardened:
50
50
  - Runtime package name: `techrevati-runtime`.
51
51
  - Current release-candidate version: `0.3.0rc1`.
52
52
  - Runtime dependency policy: zero required runtime dependencies.
53
- - Supported Python versions: 3.11, 3.12, and 3.13.
53
+ - Supported Python versions: 3.11, 3.12, 3.13, and 3.14.
54
54
  - Existing gates cover lint, formatting, strict typing, tests, coverage,
55
55
  package metadata, docs, branding, CI hardening, workflow pinning, release
56
56
  checks, public API checks, full-scope source hygiene for source, scripts,
@@ -57,9 +57,9 @@ and must be collected again.
57
57
 
58
58
  The remote CI run must include:
59
59
 
60
- - test matrix for Python 3.11, 3.12, and 3.13,
61
- - build matrix for Python 3.11, 3.12, and 3.13,
62
- - zero-dependency wheel smoke for Python 3.11, 3.12, and 3.13,
60
+ - test matrix for Python 3.11, 3.12, 3.13, and 3.14,
61
+ - build matrix for Python 3.11, 3.12, 3.13, and 3.14,
62
+ - zero-dependency wheel smoke for Python 3.11, 3.12, 3.13, and 3.14,
63
63
  - lint, format, strict typing, and full tests,
64
64
  - total and per-module coverage gates,
65
65
  - all verify-time guard scripts,