truassure 1.0.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 (231) hide show
  1. truassure-1.0.0/.gitignore +231 -0
  2. truassure-1.0.0/LICENSE +21 -0
  3. truassure-1.0.0/PKG-INFO +377 -0
  4. truassure-1.0.0/README.md +323 -0
  5. truassure-1.0.0/SUT/README.md +38 -0
  6. truassure-1.0.0/SUT/chat-assistant/README.md +37 -0
  7. truassure-1.0.0/SUT/chat-assistant/tests/conftest.py +38 -0
  8. truassure-1.0.0/SUT/chat-assistant/tests/fakes.py +61 -0
  9. truassure-1.0.0/SUT/chat-assistant/tests/test_backend.py +235 -0
  10. truassure-1.0.0/SUT/chat-assistant/tests/test_cli.py +192 -0
  11. truassure-1.0.0/SUT/chat-assistant/tests/test_db_errors.py +421 -0
  12. truassure-1.0.0/SUT/chat-assistant/tests/test_engine.py +149 -0
  13. truassure-1.0.0/SUT/chat-assistant/tests/test_engine_more.py +115 -0
  14. truassure-1.0.0/SUT/chat-assistant/tests/test_mcp_http.py +55 -0
  15. truassure-1.0.0/SUT/chat-assistant/tests/test_mcp_server.py +47 -0
  16. truassure-1.0.0/SUT/chat-assistant/tests/test_mcp_server_more.py +145 -0
  17. truassure-1.0.0/SUT/chat-assistant/tests/test_persona1.py +251 -0
  18. truassure-1.0.0/SUT/chat-assistant/tests/test_persona2.py +452 -0
  19. truassure-1.0.0/SUT/chat-assistant/tests/test_rest_api.py +100 -0
  20. truassure-1.0.0/SUT/chat-assistant/tests/test_transactions.py +238 -0
  21. truassure-1.0.0/SUT/chat-assistant/tests/test_transports_more.py +308 -0
  22. truassure-1.0.0/SUT/chat-assistant/tests/test_web.py +219 -0
  23. truassure-1.0.0/SUT/chat-assistant/tests/test_web_more.py +193 -0
  24. truassure-1.0.0/SUT/claims-agent/README.md +81 -0
  25. truassure-1.0.0/SUT/claims-agent/tests/conftest.py +20 -0
  26. truassure-1.0.0/SUT/claims-agent/tests/test_agent.py +173 -0
  27. truassure-1.0.0/SUT/claims-agent/tests/test_backend.py +104 -0
  28. truassure-1.0.0/SUT/claims-agent/tests/test_defects_and_telemetry.py +142 -0
  29. truassure-1.0.0/SUT/claims-agent/tests/test_service.py +99 -0
  30. truassure-1.0.0/SUT/claims-agent/tests/test_tools_server.py +151 -0
  31. truassure-1.0.0/SUT/common/harbor_llm/tests/conftest.py +125 -0
  32. truassure-1.0.0/SUT/common/harbor_llm/tests/test_factory.py +294 -0
  33. truassure-1.0.0/SUT/common/harbor_llm/tests/test_providers.py +389 -0
  34. truassure-1.0.0/SUT/multi-agent-desk/README.md +106 -0
  35. truassure-1.0.0/SUT/multi-agent-desk/tests/conftest.py +56 -0
  36. truassure-1.0.0/SUT/multi-agent-desk/tests/test_agents.py +175 -0
  37. truassure-1.0.0/SUT/multi-agent-desk/tests/test_defects.py +102 -0
  38. truassure-1.0.0/SUT/multi-agent-desk/tests/test_identity_backend.py +122 -0
  39. truassure-1.0.0/SUT/multi-agent-desk/tests/test_services_http.py +245 -0
  40. truassure-1.0.0/docs/README.md +8 -0
  41. truassure-1.0.0/docs/brief/BRIEF.md +119 -0
  42. truassure-1.0.0/docs/brief/prompt.txt +123 -0
  43. truassure-1.0.0/docs/client/TruAssure-Client-Overview.html +286 -0
  44. truassure-1.0.0/docs/demo/TruAssure-Demo-Runbook.html +761 -0
  45. truassure-1.0.0/docs/planning/PLAN.md +622 -0
  46. truassure-1.0.0/pilots/calibration/README.md +24 -0
  47. truassure-1.0.0/pilots/claims/README.md +70 -0
  48. truassure-1.0.0/pilots/desk/README.md +65 -0
  49. truassure-1.0.0/pyproject.toml +125 -0
  50. truassure-1.0.0/src/truassure/__init__.py +5 -0
  51. truassure-1.0.0/src/truassure/adapters/__init__.py +4 -0
  52. truassure-1.0.0/src/truassure/adapters/_files.py +76 -0
  53. truassure-1.0.0/src/truassure/adapters/_identity.py +55 -0
  54. truassure-1.0.0/src/truassure/adapters/drivers/__init__.py +1 -0
  55. truassure-1.0.0/src/truassure/adapters/drivers/chat_ws.py +182 -0
  56. truassure-1.0.0/src/truassure/adapters/drivers/http_task.py +203 -0
  57. truassure-1.0.0/src/truassure/adapters/graders/__init__.py +1 -0
  58. truassure-1.0.0/src/truassure/adapters/graders/artifact_tests.py +121 -0
  59. truassure-1.0.0/src/truassure/adapters/graders/consistency_rules.py +105 -0
  60. truassure-1.0.0/src/truassure/adapters/graders/llm_rubric.py +132 -0
  61. truassure-1.0.0/src/truassure/adapters/observers/__init__.py +1 -0
  62. truassure-1.0.0/src/truassure/adapters/observers/a2a_tap.py +278 -0
  63. truassure-1.0.0/src/truassure/adapters/observers/mcp_proxy.py +346 -0
  64. truassure-1.0.0/src/truassure/adapters/observers/otel_genai.py +141 -0
  65. truassure-1.0.0/src/truassure/adapters/observers/otel_receiver.py +79 -0
  66. truassure-1.0.0/src/truassure/adapters/observers/proxy_log.py +115 -0
  67. truassure-1.0.0/src/truassure/adapters/state/__init__.py +1 -0
  68. truassure-1.0.0/src/truassure/adapters/state/filetree.py +93 -0
  69. truassure-1.0.0/src/truassure/adapters/state/git.py +146 -0
  70. truassure-1.0.0/src/truassure/adapters/state/sqlite.py +126 -0
  71. truassure-1.0.0/src/truassure/core/__init__.py +5 -0
  72. truassure-1.0.0/src/truassure/core/__main__.py +3 -0
  73. truassure-1.0.0/src/truassure/core/calibration.py +163 -0
  74. truassure-1.0.0/src/truassure/core/catalog/__init__.py +69 -0
  75. truassure-1.0.0/src/truassure/core/catalog/schema/scenario.schema.json +391 -0
  76. truassure-1.0.0/src/truassure/core/ci.py +151 -0
  77. truassure-1.0.0/src/truassure/core/cli.py +744 -0
  78. truassure-1.0.0/src/truassure/core/codes.py +136 -0
  79. truassure-1.0.0/src/truassure/core/compare.py +344 -0
  80. truassure-1.0.0/src/truassure/core/compiler.py +278 -0
  81. truassure-1.0.0/src/truassure/core/console.py +298 -0
  82. truassure-1.0.0/src/truassure/core/envfile.py +53 -0
  83. truassure-1.0.0/src/truassure/core/governance/__init__.py +2 -0
  84. truassure-1.0.0/src/truassure/core/governance/defects.py +134 -0
  85. truassure-1.0.0/src/truassure/core/governance/gate.py +170 -0
  86. truassure-1.0.0/src/truassure/core/governance/junit.py +102 -0
  87. truassure-1.0.0/src/truassure/core/governance/packs.py +98 -0
  88. truassure-1.0.0/src/truassure/core/matching.py +75 -0
  89. truassure-1.0.0/src/truassure/core/model.py +490 -0
  90. truassure-1.0.0/src/truassure/core/naming.py +20 -0
  91. truassure-1.0.0/src/truassure/core/protocols.py +110 -0
  92. truassure-1.0.0/src/truassure/core/registry.py +72 -0
  93. truassure-1.0.0/src/truassure/core/reliability.py +101 -0
  94. truassure-1.0.0/src/truassure/core/report.py +565 -0
  95. truassure-1.0.0/src/truassure/core/robustness.py +151 -0
  96. truassure-1.0.0/src/truassure/core/runlock.py +104 -0
  97. truassure-1.0.0/src/truassure/core/runner.py +444 -0
  98. truassure-1.0.0/src/truassure/core/scorecard/__init__.py +897 -0
  99. truassure-1.0.0/src/truassure/core/scorecard/catalogue.yaml +127 -0
  100. truassure-1.0.0/src/truassure/core/security.py +109 -0
  101. truassure-1.0.0/src/truassure/core/serde.py +31 -0
  102. truassure-1.0.0/src/truassure/core/stages/__init__.py +27 -0
  103. truassure-1.0.0/src/truassure/core/stages/evaluate.py +703 -0
  104. truassure-1.0.0/src/truassure/core/stages/expectations.py +142 -0
  105. truassure-1.0.0/src/truassure/core/stats.py +112 -0
  106. truassure-1.0.0/src/truassure/core/store.py +136 -0
  107. truassure-1.0.0/src/truassure/mcp_server.py +205 -0
  108. truassure-1.0.0/src/truassure/profiles/__init__.py +1 -0
  109. truassure-1.0.0/src/truassure/profiles/conversational/__init__.py +1 -0
  110. truassure-1.0.0/src/truassure/profiles/conversational/approvals.py +50 -0
  111. truassure-1.0.0/src/truassure/profiles/conversational/codes_map.py +85 -0
  112. truassure-1.0.0/src/truassure/profiles/conversational/live.py +90 -0
  113. truassure-1.0.0/src/truassure/profiles/conversational/replay.py +211 -0
  114. truassure-1.0.0/src/truassure/profiles/conversational/trace.py +42 -0
  115. truassure-1.0.0/src/truassure/profiles/conversational/translator.py +203 -0
  116. truassure-1.0.0/src/truassure/profiles/task/__init__.py +86 -0
  117. truassure-1.0.0/src/truassure/profiles/task/live.py +96 -0
  118. truassure-1.0.0/src/truassure/profiles/workflow/__init__.py +69 -0
  119. truassure-1.0.0/src/truassure/profiles/workflow/live.py +60 -0
  120. truassure-1.0.0/src/truassure/py.typed +0 -0
  121. truassure-1.0.0/src/truassure/testing/__init__.py +1 -0
  122. truassure-1.0.0/src/truassure/testing/contract.py +299 -0
  123. truassure-1.0.0/src/truassure/testing/fakes.py +310 -0
  124. truassure-1.0.0/src/truassure/testing/scripted.py +331 -0
  125. truassure-1.0.0/tests/conftest.py +7 -0
  126. truassure-1.0.0/tests/contract/test_contract.py +192 -0
  127. truassure-1.0.0/tests/e2e/test_a2a_tap.py +331 -0
  128. truassure-1.0.0/tests/e2e/test_chat_driver.py +458 -0
  129. truassure-1.0.0/tests/e2e/test_console.py +144 -0
  130. truassure-1.0.0/tests/e2e/test_governance_cli.py +83 -0
  131. truassure-1.0.0/tests/e2e/test_mcp_proxy.py +341 -0
  132. truassure-1.0.0/tests/e2e/test_mcp_server.py +165 -0
  133. truassure-1.0.0/tests/e2e/test_runlevel_cli.py +236 -0
  134. truassure-1.0.0/tests/e2e/test_runner.py +373 -0
  135. truassure-1.0.0/tests/e2e/tests_support_env.py +37 -0
  136. truassure-1.0.0/tests/fixtures/catalogs/conversational.yaml +30 -0
  137. truassure-1.0.0/tests/fixtures/catalogs/e2e_demo.yaml +54 -0
  138. truassure-1.0.0/tests/fixtures/catalogs/suite_catalog_mini.yaml +40 -0
  139. truassure-1.0.0/tests/fixtures/catalogs/task.yaml +36 -0
  140. truassure-1.0.0/tests/fixtures/catalogs/workflow.yaml +24 -0
  141. truassure-1.0.0/tests/golden/reference/corpus/catalogs/1d4ad8f.json.gz +0 -0
  142. truassure-1.0.0/tests/golden/reference/corpus/catalogs/3da167f.json.gz +0 -0
  143. truassure-1.0.0/tests/golden/reference/corpus/catalogs/4dca78b.json.gz +0 -0
  144. truassure-1.0.0/tests/golden/reference/corpus/catalogs/53e1679.json.gz +0 -0
  145. truassure-1.0.0/tests/golden/reference/corpus/catalogs/5d80d14.json.gz +0 -0
  146. truassure-1.0.0/tests/golden/reference/corpus/catalogs/6312b87.json.gz +0 -0
  147. truassure-1.0.0/tests/golden/reference/corpus/catalogs/8a147b3.json.gz +0 -0
  148. truassure-1.0.0/tests/golden/reference/corpus/catalogs/8d58872.json.gz +0 -0
  149. truassure-1.0.0/tests/golden/reference/corpus/catalogs/a9b2b28.json.gz +0 -0
  150. truassure-1.0.0/tests/golden/reference/corpus/catalogs/ccdf7e6.json.gz +0 -0
  151. truassure-1.0.0/tests/golden/reference/corpus/catalogs/e1f5bc5.json.gz +0 -0
  152. truassure-1.0.0/tests/golden/reference/corpus/manifest.json +535 -0
  153. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261103-213908.json.gz +0 -0
  154. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261103-213951.json.gz +0 -0
  155. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-103911.json.gz +0 -0
  156. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-114836.json.gz +0 -0
  157. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-121919.json.gz +0 -0
  158. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-123010.json.gz +0 -0
  159. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-124432.json.gz +0 -0
  160. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-132408.json.gz +0 -0
  161. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-134209.json.gz +0 -0
  162. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-140815.json.gz +0 -0
  163. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-142851.json.gz +0 -0
  164. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-160955.json.gz +0 -0
  165. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-173323.json.gz +0 -0
  166. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-141852.json.gz +0 -0
  167. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-142540.json.gz +0 -0
  168. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-142747.json.gz +0 -0
  169. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-143134.json.gz +0 -0
  170. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-144222.json.gz +0 -0
  171. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-144604.json.gz +0 -0
  172. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-144731.json.gz +0 -0
  173. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-160933.json.gz +0 -0
  174. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-161320.json.gz +0 -0
  175. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-162123.json.gz +0 -0
  176. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-165536.json.gz +0 -0
  177. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-170513.json.gz +0 -0
  178. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-171241.json.gz +0 -0
  179. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-121321.json.gz +0 -0
  180. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-131625.json.gz +0 -0
  181. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-131859.json.gz +0 -0
  182. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-162831.json.gz +0 -0
  183. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-171542.json.gz +0 -0
  184. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-173220.json.gz +0 -0
  185. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-195324.json.gz +0 -0
  186. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-201301.json.gz +0 -0
  187. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-222552.json.gz +0 -0
  188. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-223647.json.gz +0 -0
  189. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-223804.json.gz +0 -0
  190. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-232315.json.gz +0 -0
  191. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-232803.json.gz +0 -0
  192. truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-233344.json.gz +0 -0
  193. truassure-1.0.0/tests/golden/reference/primitives.json +816 -0
  194. truassure-1.0.0/tests/golden/reference/runlevel.json.gz +0 -0
  195. truassure-1.0.0/tests/golden/test_reference_primitives.py +42 -0
  196. truassure-1.0.0/tests/golden/test_regression_gate.py +97 -0
  197. truassure-1.0.0/tests/golden/test_report_size.py +42 -0
  198. truassure-1.0.0/tests/golden/test_runlevel_gate.py +357 -0
  199. truassure-1.0.0/tests/pilots/claims_stack.py +151 -0
  200. truassure-1.0.0/tests/pilots/desk_stack.py +119 -0
  201. truassure-1.0.0/tests/pilots/test_claims_defects.py +80 -0
  202. truassure-1.0.0/tests/pilots/test_claims_parity.py +45 -0
  203. truassure-1.0.0/tests/pilots/test_claims_pilot.py +64 -0
  204. truassure-1.0.0/tests/pilots/test_desk_pilot.py +138 -0
  205. truassure-1.0.0/tests/unit/test_approvals.py +50 -0
  206. truassure-1.0.0/tests/unit/test_calibration.py +233 -0
  207. truassure-1.0.0/tests/unit/test_catalog_schema.py +105 -0
  208. truassure-1.0.0/tests/unit/test_cli_and_registry.py +63 -0
  209. truassure-1.0.0/tests/unit/test_cli_errors.py +62 -0
  210. truassure-1.0.0/tests/unit/test_compiler.py +95 -0
  211. truassure-1.0.0/tests/unit/test_conversational_replay.py +146 -0
  212. truassure-1.0.0/tests/unit/test_core_imports.py +69 -0
  213. truassure-1.0.0/tests/unit/test_entry_points_and_fakes.py +104 -0
  214. truassure-1.0.0/tests/unit/test_envfile.py +56 -0
  215. truassure-1.0.0/tests/unit/test_matching.py +40 -0
  216. truassure-1.0.0/tests/unit/test_model.py +99 -0
  217. truassure-1.0.0/tests/unit/test_otel_and_git.py +266 -0
  218. truassure-1.0.0/tests/unit/test_runlock.py +80 -0
  219. truassure-1.0.0/tests/unit/test_scorecard_governance.py +399 -0
  220. truassure-1.0.0/tests/unit/test_stages_more.py +190 -0
  221. truassure-1.0.0/tests/unit/test_stages_ported.py +304 -0
  222. truassure-1.0.0/tests/unit/test_stats_store_security.py +238 -0
  223. truassure-1.0.0/tests/unit/test_synthetic_episodes.py +587 -0
  224. truassure-1.0.0/tests/unit/test_task_adapters.py +423 -0
  225. truassure-1.0.0/tests/unit/test_translator.py +75 -0
  226. truassure-1.0.0/tests/unit/test_translator_edges.py +96 -0
  227. truassure-1.0.0/tools/check_core_imports.py +92 -0
  228. truassure-1.0.0/tools/make_golden.py +156 -0
  229. truassure-1.0.0/tools/make_reference_corpus.py +404 -0
  230. truassure-1.0.0/tools/make_reference_runlevel.py +269 -0
  231. truassure-1.0.0/tools/wheel_smoke.py +64 -0
@@ -0,0 +1,231 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ *.lcov
51
+ .hypothesis/
52
+ .pytest_cache/
53
+ cover/
54
+
55
+ # Translations
56
+ *.mo
57
+ *.pot
58
+
59
+ # Django stuff:
60
+ *.log
61
+ local_settings.py
62
+ db.sqlite3
63
+ db.sqlite3-journal
64
+
65
+ # Flask stuff:
66
+ instance/
67
+ .webassets-cache
68
+
69
+ # Scrapy stuff:
70
+ .scrapy
71
+
72
+ # Sphinx documentation
73
+ docs/_build/
74
+
75
+ # PyBuilder
76
+ .pybuilder/
77
+ target/
78
+
79
+ # Jupyter Notebook
80
+ .ipynb_checkpoints
81
+
82
+ # IPython
83
+ profile_default/
84
+ ipython_config.py
85
+
86
+ # pyenv
87
+ # For a library or package, you might want to ignore these files since the code is
88
+ # intended to run in multiple environments; otherwise, check them in:
89
+ # .python-version
90
+
91
+ # pipenv
92
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
93
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
94
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
95
+ # install all needed dependencies.
96
+ # Pipfile.lock
97
+
98
+ # uv
99
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
100
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
101
+ # commonly ignored for libraries.
102
+ # uv.lock
103
+
104
+ # poetry
105
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
106
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
107
+ # commonly ignored for libraries.
108
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
109
+ # poetry.lock
110
+ # poetry.toml
111
+
112
+ # pdm
113
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
114
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
115
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
116
+ # pdm.lock
117
+ # pdm.toml
118
+ .pdm-python
119
+ .pdm-build/
120
+
121
+ # pixi
122
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
123
+ # pixi.lock
124
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
125
+ # in the .venv directory. It is recommended not to include this directory in version control.
126
+ .pixi/*
127
+ !.pixi/config.toml
128
+
129
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
130
+ __pypackages__/
131
+
132
+ # Celery stuff
133
+ celerybeat-schedule*
134
+ celerybeat.pid
135
+
136
+ # Redis
137
+ *.rdb
138
+ *.aof
139
+ *.pid
140
+
141
+ # RabbitMQ
142
+ mnesia/
143
+ rabbitmq/
144
+ rabbitmq-data/
145
+
146
+ # ActiveMQ
147
+ activemq-data/
148
+
149
+ # SageMath parsed files
150
+ *.sage.py
151
+
152
+ # Environments
153
+ .env
154
+ .envrc
155
+ .venv
156
+ env/
157
+ venv/
158
+ ENV/
159
+ env.bak/
160
+ venv.bak/
161
+
162
+ # Spyder project settings
163
+ .spyderproject
164
+ .spyproject
165
+
166
+ # Rope project settings
167
+ .ropeproject
168
+
169
+ # mkdocs/Zensical documentation
170
+ /site
171
+
172
+ # mypy
173
+ .mypy_cache/
174
+ .dmypy.json
175
+ dmypy.json
176
+
177
+ # Pyre type checker
178
+ .pyre/
179
+
180
+ # pytype static type analyzer
181
+ .pytype/
182
+
183
+ # Cython debug symbols
184
+ cython_debug/
185
+
186
+ # PyCharm
187
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
188
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
189
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
190
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
191
+ # .idea/
192
+
193
+ # Abstra
194
+ # Abstra is an AI-powered process automation framework.
195
+ # Ignore directories containing user credentials, local state, and settings.
196
+ # Learn more at https://abstra.io/docs
197
+ .abstra/
198
+
199
+ # Visual Studio Code
200
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore that
201
+ # can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
202
+ # and can be added to the global gitignore or merged into this file. However, if you prefer, you
203
+ # could uncomment the following to ignore the entire vscode folder
204
+ # .vscode/
205
+ # Temporary file for partial code execution
206
+ tempCodeRunnerFile.py
207
+
208
+ # Ruff stuff:
209
+ .ruff_cache/
210
+
211
+ # PyPI configuration file
212
+ .pypirc
213
+
214
+ # Marimo
215
+ marimo/_static/
216
+ marimo/_lsp/
217
+ __marimo__/
218
+
219
+ # Streamlit
220
+ .streamlit/secrets.toml
221
+
222
+ # --- TruAssure ---
223
+ .env*
224
+ !.env.example
225
+ ta_runs/
226
+ tests/golden/_inputs/
227
+ *.local.yaml
228
+ # SUT runtime data (databases, generated letters) - created by tests and local runs
229
+ SUT/**/data/
230
+ SUT/**/letters/
231
+ *.db
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Shan Konduru
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,377 @@
1
+ Metadata-Version: 2.5
2
+ Name: truassure
3
+ Version: 1.0.0
4
+ Summary: TruAssure: black-box, evidence-based quality engineering for AI agents (chat, task and multi-agent).
5
+ Author: Shan Konduru
6
+ License-Expression: MIT
7
+ License-File: LICENSE
8
+ Classifier: Development Status :: 5 - Production/Stable
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Topic :: Software Development :: Quality Assurance
13
+ Classifier: Topic :: Software Development :: Testing
14
+ Classifier: Typing :: Typed
15
+ Requires-Python: >=3.11
16
+ Requires-Dist: jsonschema>=4.21
17
+ Requires-Dist: pyyaml>=6.0
18
+ Provides-Extra: anthropic
19
+ Requires-Dist: anthropic>=0.40; extra == 'anthropic'
20
+ Provides-Extra: azure
21
+ Requires-Dist: openai>=1.40; extra == 'azure'
22
+ Provides-Extra: chat
23
+ Requires-Dist: websockets>=12; extra == 'chat'
24
+ Provides-Extra: dev
25
+ Requires-Dist: build>=1.2; extra == 'dev'
26
+ Requires-Dist: fastapi>=0.115; extra == 'dev'
27
+ Requires-Dist: httpx>=0.27; extra == 'dev'
28
+ Requires-Dist: langgraph>=0.2; extra == 'dev'
29
+ Requires-Dist: mcp>=2.3; extra == 'dev'
30
+ Requires-Dist: mypy>=1.11; extra == 'dev'
31
+ Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
32
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
33
+ Requires-Dist: pytest>=8.0; extra == 'dev'
34
+ Requires-Dist: ruff>=0.6; extra == 'dev'
35
+ Requires-Dist: starlette>=0.37; extra == 'dev'
36
+ Requires-Dist: types-jsonschema>=4.21; extra == 'dev'
37
+ Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
38
+ Requires-Dist: uvicorn>=0.30; extra == 'dev'
39
+ Requires-Dist: websockets>=12; extra == 'dev'
40
+ Provides-Extra: langgraph
41
+ Requires-Dist: langgraph>=0.2; extra == 'langgraph'
42
+ Provides-Extra: mcp
43
+ Requires-Dist: mcp>=2.3; extra == 'mcp'
44
+ Provides-Extra: otel
45
+ Requires-Dist: starlette>=0.37; extra == 'otel'
46
+ Requires-Dist: uvicorn>=0.30; extra == 'otel'
47
+ Provides-Extra: postgres
48
+ Requires-Dist: psycopg[binary]>=3.2; extra == 'postgres'
49
+ Provides-Extra: proxy
50
+ Requires-Dist: httpx>=0.27; extra == 'proxy'
51
+ Requires-Dist: starlette>=0.37; extra == 'proxy'
52
+ Requires-Dist: uvicorn>=0.30; extra == 'proxy'
53
+ Description-Content-Type: text/markdown
54
+
55
+ # TruAssure: Enterprise Agentic Quality Engineering Accelerator
56
+
57
+ TruAssure is a black-box, evidence-based quality engineering framework for AI agents of any kind:
58
+ conversational assistants, coded task agents (LangGraph, OpenAI Agents SDK, custom loops), agentic
59
+ applications and multi-agent orchestrations.
60
+
61
+ For each run it answers questions without relying on the agent's own account of itself:
62
+
63
+ - Did the agent understand the task?
64
+ - Did it plan sensibly?
65
+ - Did it take only allowed and correct actions?
66
+ - Did it leave the environment in the right end state?
67
+ - Did it report truthfully what it did?
68
+
69
+ It also checks whether the agent behaves reliably (pass^k), robustly (input perturbations, injected faults)
70
+ and the same way across deployments (parity).
71
+
72
+ > **Status: pre-alpha, phase 2 of 6 done.**
73
+ > - **Core engine:** episode runner, evidence store, five-stage evaluation with the evidence seams, Wilson
74
+ > ranges, and `ta run|show|report|gc`.
75
+ > - **Regression gate:** TruAssure reproduces the reference verdicts on 4,221 stored chat turns.
76
+ > - **Live runs:** it drives the real chat assistant on Docker (`SUT/`) through its chat channel.
77
+ >
78
+ > See [Validated on](#validated-on) for what has been checked and how.
79
+ > [docs/planning/PLAN.md](docs/planning/PLAN.md) has the full plan and [docs/brief/BRIEF.md](docs/brief/BRIEF.md)
80
+ > the original brief.
81
+
82
+ ## How it judges an agent
83
+
84
+ - **Episode:** a task given to an agent in a prepared environment, run until it finishes, times out or runs
85
+ out of budget.
86
+ - **Checkpoint:** a point where the episode is judged. A chat has one per user turn; a task agent usually has
87
+ one at the end.
88
+
89
+ Each checkpoint gets a verdict at five stages, and records the first stage that failed:
90
+
91
+ | # | Stage | Question |
92
+ |---|---|---|
93
+ | 1 | Goal | What did the agent decide the task was (an intent, a routing decision)? |
94
+ | 2 | Plan | Were the steps, handoffs, loops, termination and approvals sensible? |
95
+ | 3 | Action | Was every action correct, authorised and given the right arguments? |
96
+ | 4 | End state | Is the database, file tree, git repository or SaaS system right afterwards? |
97
+ | 5 | Output | Is the reply, artifact or pull request right, and consistent with what was actually done? |
98
+
99
+ TruAssure gathers evidence from independent sources and keeps each source apart:
100
+
101
+ - the agent's own trace;
102
+ - an observer at the action boundary (an MCP or REST recording proxy, OpenTelemetry GenAI spans, or an
103
+ agent-to-agent tap);
104
+ - before and after snapshots of the system of record;
105
+ - the agent's outputs.
106
+
107
+ It cross-checks these sources against each other through the evidence seams:
108
+
109
+ - **SE-01** trace vs observer
110
+ - **SE-02** authorisation vs state
111
+ - **SE-03** silent write
112
+ - **SE-04** phantom success
113
+ - **SE-05** output vs action
114
+ - **SE-06** deployment parity
115
+ - **SE-07** identity propagation, a TruAssure extension that is not counted among the catalogue's 71 types
116
+
117
+ A grader that can't reach a verdict reports *not evaluated*, which counts as a failure, never a pass.
118
+
119
+ Every failure carries a structured code (for example `ACTION.FORBIDDEN_CALLED` or `SE-03.SILENT_WRITE`, listed
120
+ in [`codes.py`](src/truassure/core/codes.py)), so severity rules, the scorecard and release gates can match on
121
+ codes rather than message text.
122
+
123
+ An agent that exposes no trace of its own can still be tested ("black-box mode"). In that mode its actions
124
+ come from the observers only, and the goal stage reports *not evaluated*.
125
+
126
+ ## Layout
127
+
128
+ ```
129
+ src/truassure/
130
+ core/ model, Protocols, catalog + JSON Schema, compiler, runner, stages/, stats, store, security,
131
+ runlock, report, CLI; run-level analysis: reliability (pass^k), robustness, compare (parity),
132
+ scorecard/ (the test-type catalogue), governance/ (defects, JUnit, packs, release gate),
133
+ calibration, ci (pipeline templates). Imports only stdlib, PyYAML, jsonschema
134
+ adapters/ drivers, observers, state, graders (framework-specific code lives here)
135
+ profiles/ conversational (incl. the suite-catalog translator), task, workflow
136
+ testing/ fakes of every Protocol, the contract-suite harness, and a scripted agent for offline runs
137
+ tests/ unit/ contract/ golden/ e2e/ pilots/
138
+ pilots/ the pilot catalogs (claims/: pilot 1, desk/: pilot 2) and the grader calibration set
139
+ tools/ check_core_imports.py (the core layering rule, an allow-list)
140
+ make_golden.py, make_reference_corpus.py, make_reference_runlevel.py (reference outputs
141
+ from the source functions, for the regression gate; dev-only)
142
+ scripts/ setup / test / lint, smoke-chat, pilot-claims, pilot-desk, as .bat and .sh pairs
143
+ docs/ brief/ (original brief and prompt) planning/ (PLAN.md)
144
+ ```
145
+
146
+ ## Quick start
147
+
148
+ **Start here:**
149
+
150
+ - **Demo runbook:** [`docs/demo/TruAssure-Demo-Runbook.html`](docs/demo/TruAssure-Demo-Runbook.html), a self-contained
151
+ page that walks through every feature, step by step, with expected output.
152
+ - **Client overview:** [`docs/client/TruAssure-Client-Overview.html`](docs/client/TruAssure-Client-Overview.html),
153
+ covering features, business value and use cases.
154
+ - **One script for everything:** `scripts\truassure-ops.bat` (Windows) or `sh scripts/truassure-ops.sh`.
155
+ - `setup`: every virtual environment.
156
+ - `lint`, `test-all`, `test-sut all`: TruAssure's and each SUT's tests.
157
+ - `deploy all`, `status`, `launch all`: the SUTs on Docker Desktop.
158
+ - `pilots`: the live runs.
159
+ - `demo`: an offline tour.
160
+ - `console`: browse runs, reports, comparisons and gates in the browser.
161
+ - `mcp`: serve TruAssure to an AI assistant over MCP.
162
+ - `build`: build the wheel and smoke-test it in a clean venv.
163
+ - `help`: every command.
164
+ - **Launchers:** `scripts\launch-console.bat` (the console over `ta_runs`), `scripts\launch-demo.bat` (the
165
+ offline demo, then the console over its runs) and `scripts\launch-mcp.bat` (the MCP server), each with a
166
+ `.sh` twin.
167
+
168
+ ```bat
169
+ scripts\setup.bat :: or: sh scripts/setup.sh
170
+ scripts\test.bat -q :: tests + the 95% line-and-branch coverage gate
171
+ scripts\lint.bat :: ruff, ruff format --check, mypy --strict, core import rule
172
+ ```
173
+
174
+ The CLI is `truassure`, with `ta` as a short alias:
175
+
176
+ ```bat
177
+ ta --version
178
+ ta validate tests\fixtures\catalogs\task.yaml
179
+ ta translate C:\myprojects\tool-calling-chatbot\qa\test_catalog.yaml --yaml -o catalog.yaml
180
+
181
+ :: run a catalog against an environment (here: the built-in scripted demo agent)
182
+ ta run tests\fixtures\catalogs\e2e_demo.yaml --env truassure.testing.scripted:demo_environment --perturbations all --repeats 3
183
+ ta show :: list runs
184
+ ta show latest :: one run: per-case stages, result, Wilson range, reasons
185
+ ta report latest :: write the run's self-contained HTML report
186
+ ta gc --days 30 :: retention: delete runs older than 30 days
187
+
188
+ :: run-level analysis and governance
189
+ ta compare A B :: checkpoint by checkpoint; across deployments, parity against a noise floor (SE-06)
190
+ ta defects latest :: the defect list (severity by failure code), defects.json and .csv
191
+ ta junit latest --flaky skip --baseline <run> :: JUnit XML for CI; only regressions fail with a baseline
192
+ ta scorecard latest :: the run against the 71-type catalogue (measured only with evidence)
193
+ ta pack claims.intake :: a capability pack: ready / not ready
194
+ ta gate latest --policy truassure-gate.yaml :: the release gate; exit 1 when a rule fails
195
+ ta calibrate pilots\calibration\harbor-consistency.yaml --grader <module:Class> :: CE-02: Cohen's kappa
196
+ ta init --ci github --catalog <catalog> --env <factory> :: a pipeline that runs, reports and gates
197
+
198
+ :: browse and automate
199
+ ta console --open :: local console on 127.0.0.1 with a one-time URL token
200
+ ta mcp :: MCP server over stdio: one tool per command (install the 'mcp' extra)
201
+ ```
202
+
203
+ **The report** (`ta report`) is one HTML file with everything inlined. It fetches nothing, so it works offline
204
+ and can be attached to a ticket. Its tabs are Overview (pass rates, first failing stage, pass^k decay,
205
+ robustness), Cases, Episodes, Scorecard, Defects, and Comparison and gate. For task and workflow episodes,
206
+ the Episodes tab sets what the agent reported beside what the independent sources (the proxy, spans, tap and
207
+ state diffs) recorded, with every checkpoint's verdict. Links such as `report.html#tab=episodes&case=ID` open a
208
+ case directly. The largest corpus run's report is about 0.4 MB.
209
+
210
+ **The console** (`ta console`) lists the runs in a folder and opens their reports, defect lists, scorecards and
211
+ gate verdicts; it also compares any two runs. It listens on `127.0.0.1` (another address needs
212
+ `--allow-remote`) and prints a URL with a random token. The first visit trades the token for an HttpOnly,
213
+ SameSite=Strict cookie, and every request without one is refused. It reads stored runs; it never starts one.
214
+
215
+ **The MCP server** (`ta mcp`) gives an AI assistant one tool per CLI command (`validate`, `translate`, `run`,
216
+ `show`, `report`, `compare`, `defects`, `junit`, `scorecard`, `pack`, `gate`, `calibrate`, `init`, `gc`).
217
+ Each tool's input schema is generated from the command's own arguments, so the two cannot drift; a test checks
218
+ they match. The long-running services (`proxy`, `otel`, `a2a`, `console`, `mcp`) are not tools. Every result
219
+ says that quoted agent evidence is data, not instructions. To add it to an MCP client:
220
+
221
+ ```json
222
+ { "mcpServers": { "truassure": { "command": "ta", "args": ["mcp"] } } }
223
+ ```
224
+
225
+ Every run's summary also carries its pass^k decay and its robustness across perturbations.
226
+
227
+ `--env` names a factory function (`package.module:function`) that returns an `Environment` for each worker:
228
+ the driver for your agent, its observers, its state adapters and an optional grader. The factory module can
229
+ sit in the current folder. Runs go to `./ta_runs`, or `$TA_RUNS_DIR`. `ta` reads settings and secrets from
230
+ the nearest `.env`, and real environment variables always win.
231
+
232
+ **Adapters available so far:**
233
+ - drivers: the chat driver (`adapters/drivers/chat_ws.py`; install the `chat` extra) and the HTTP task driver
234
+ (`adapters/drivers/http_task.py`; one POST per event or task);
235
+ - the recording MCP proxy, `ta proxy` (`adapters/observers/mcp_proxy.py`; install the `proxy` extra), and its
236
+ observer (`adapters/observers/proxy_log.py`), which also injects faults;
237
+ - the agent-to-agent tap, `ta a2a` (`adapters/observers/a2a_tap.py`): an HTTP relay in front of the agents that
238
+ receive handoffs, or an in-process hook for a message bus. It records each handoff with the member and permissions
239
+ read from the identity token, and injects agent faults. The MCP proxy reads identity tokens too
240
+ (`--identity-header`);
241
+ - the OpenTelemetry GenAI observer (`adapters/observers/otel_genai.py`; `execute_tool` spans from OTLP/JSON) and
242
+ an OTLP/HTTP receiver, `ta otel` (`adapters/observers/otel_receiver.py`; install the `otel` extra);
243
+ - state: SQLite (`adapters/state/sqlite.py`; read-only snapshots, row diffs, SQL checks), a file tree
244
+ (`adapters/state/filetree.py`; content-hash diffs, file checks) and git (`adapters/state/git.py`; refs and
245
+ working tree, branch, commit and message checks);
246
+ - the artifact grader (`adapters/graders/artifact_tests.py`; content checks, a Python test or a command);
247
+ - ready live environments: the chat assistant (`truassure.profiles.conversational.live:environment`), the
248
+ claims agent (`truassure.profiles.task.live:environment`) and the member desk
249
+ (`truassure.profiles.workflow.live:environment`).
250
+
251
+ Every run records the hash of `core/` it was judged with (`run.json`, `core`).
252
+ `ta run` exits 0 when every case passes, 1 when any case fails or is flaky, 2 on bad input, and 3 when the
253
+ environment is locked by another run. Add masking rules with `--mask LABEL=REGEX` (repeatable).
254
+
255
+ ## Catalogs
256
+
257
+ Scenarios are written in YAML and validated by
258
+ [`scenario.schema.json`](src/truassure/core/catalog/schema/scenario.schema.json) (JSON Schema Draft 2020-12).
259
+ Each scenario names a profile, and each profile has its own rules:
260
+
261
+ - **conversational:** has `checkpoints`, each with a `prompt`.
262
+ - **task:** has an `event` or `task` input, plus `expect`.
263
+ - **workflow:** adds `agents`, a `principal` and the expected `handoffs`.
264
+
265
+ Keys starting with `x-` are allowed for your own extensions. See [`tests/fixtures/catalogs/`](tests/fixtures/catalogs)
266
+ for an example of each profile.
267
+
268
+ `ta translate` converts a suite catalog (suites -> cases, one chat per suite) to this format. It doesn't drop anything silently: keys it can't
269
+ map are kept under `source.unmapped`. It never copies passwords.
270
+
271
+ ## Validated on
272
+
273
+ | Pilot | What it proves | Status |
274
+ |---|---|---|
275
+ | 3 · regression gate | Same verdicts as the reference verdicts stored with the sandbox runs | **passed:** 4,221 of 4,221 turns in 40 runs (stdio, HTTP and REST transports), and every run's per-case results and Wilson ranges |
276
+ | 1 · task agent | Generic core on an event-driven agent with no chat | **passed:** the 15-scenario catalog passes offline (20 of 20 episodes); each of 6 planted defects fires the right code at the right stage; live, it finds real agent defects (below) |
277
+ | 2 · multi-agent | Handoffs, identity propagation, cascading failure (SS-09) | **passed:** the 12-scenario catalog passes offline (15 of 15 episodes); each of 5 planted defects fires the right code at the right stage; pilots 1 and 2 pass on the same core hash (each run records it); live, it finds real defects (below) |
278
+ | 3 · run level (phase 5) | Same run-level results as the reference, on the same corpus | **passed:** 225 checks: pass^k, robustness, defect severities, JUnit decisions (every flaky mode, and with a baseline), every scorecard row of all 40 runs, and 19 run comparisons with their parity verdicts |
279
+ | 1 · parity (SE-06) | Two builds of the claims agent (plain loop, LangGraph) judged against a noise floor | **passed:** judged "holds" offline, and live on Azure (15 checkpoints; the one difference was within run-to-run noise) |
280
+ | report (phase 6) | Self-contained, offline HTML for the largest corpus run | **passed:** about 0.4 MB (limit 5 MB); nothing is fetched from the network ([`tests/golden/test_report_size.py`](tests/golden/test_report_size.py)) |
281
+ | MCP server (phase 6) | One tool per CLI command, driven by a real MCP client | **passed:** the tool inventory and every tool's arguments equal the CLI's ([`tests/e2e/test_mcp_server.py`](tests/e2e/test_mcp_server.py)) |
282
+ | wheel (phase 6) | `python -m build`, then the wheel alone in a clean venv | **passed** on Windows and Linux in CI ([`tools/wheel_smoke.py`](tools/wheel_smoke.py)): console scripts, packaged schema and catalogue, an offline run, report, gate and the MCP tool list |
283
+
284
+ **How the regression gate works**
285
+ - [`tools/make_reference_corpus.py`](tools/make_reference_corpus.py) turns the source project's stored
286
+ conversational runs into a corpus in [`tests/golden/reference/corpus`](tests/golden/reference/corpus). The
287
+ corpus is trimmed to what evaluation and run-level analysis read, masked, and about 1.1 MB.
288
+ - A run is admitted only if the reference code reproduces every one of its stored verdicts from those exact
289
+ inputs.
290
+ - TruAssure then has to give the same pass/fail, first failing stage, per-stage status, check counts and failure
291
+ codes on every turn ([`tests/golden/test_regression_gate.py`](tests/golden/test_regression_gate.py)).
292
+ - 11 runs were excluded because they had been judged against catalog edits that were never committed. The
293
+ [manifest](tests/golden/reference/corpus/manifest.json) lists each one with its reason.
294
+ - Run level: [`tools/make_reference_runlevel.py`](tools/make_reference_runlevel.py) runs the source's run-level
295
+ functions on the same corpus; [`tests/golden/test_runlevel_gate.py`](tests/golden/test_runlevel_gate.py) rebuilds
296
+ each run from TruAssure's own verdicts and must reproduce every result. The only allowed difference: types
297
+ TruAssure measures beyond the reference (AT-02, AT-06, AT-08, SS-03, SS-09, PO-03, CE-02) read "not run" where
298
+ the reference said "planned".
299
+
300
+ **Live smoke run** (`scripts\smoke-chat.bat <catalog> SRI GREET PRIVACY`): TruAssure drove the chat assistant
301
+ on Docker Desktop, with Azure OpenAI as the assistant's model.
302
+ - 22 of 23 checkpoints passed.
303
+ - The one failure was real agent behaviour: the assistant told a customer they had no policies without
304
+ looking them up first.
305
+ - The chat assistant has no tool-traffic observer, so the trace-vs-observer seam is not checked there.
306
+
307
+ **Pilot 1, the claims agent** ([`pilots/claims`](pilots/claims)): TruAssure drives the agent through its event API
308
+ and watches it through the recording proxy, the agent's OpenTelemetry GenAI spans, the claims database and the
309
+ letters folder.
310
+ - Offline (the scripted model, the whole stack in-process): all 20 episodes pass (15 scenarios, plus 5 perturbed
311
+ variants).
312
+ - Buggy build (`CLAIMS_DEFECTS`): six planted defects (silent write, phantom success, forbidden action, loop
313
+ past budget, an artifact that fails its tests, a trace that leaves calls out) each fail their scenario at the
314
+ planted stage with the planted code, offline. Live with Azure, the silent write and the trace omission fire
315
+ `SE-03` and `SE-01` (proxy and spans) the same way.
316
+ - Live (`scripts\pilot-claims.bat`, Docker Desktop, Azure OpenAI gpt-4.1), three full runs. Every failure
317
+ is real agent behaviour (in the third run, which also read the spans, they agreed with the agent's trace on
318
+ every episode):
319
+ - when the approval fails (tool error) or times out, it still writes the approval letter (every run);
320
+ - asked to approve $2,500 on a $1,800 claim, it approves $1,800 on its own instead of refusing (every run);
321
+ - for a claim already under review it sometimes also sends an acknowledgement letter, where the procedure
322
+ says to add a note only (2 of 3 runs).
323
+
324
+ **Pilot 2, the member desk** ([`pilots/desk`](pilots/desk)): TruAssure drives the triage agent, and watches the
325
+ three agents through the A2A tap (handoffs), the MCP proxy (tool calls), both reading the identity token on the
326
+ wire, and the desk database.
327
+ - Offline: all 15 episodes pass (12 scenarios, plus 3 perturbed variants). Five planted defects fail their
328
+ scenario at the planted stage with the planted code:
329
+ - handoff order: `PLAN.HANDOFF_ORDER`;
330
+ - a failure handed on: `PLAN.FAILURE_CASCADED`;
331
+ - a hop for another member: `SE-07.PRINCIPAL_MISMATCH`;
332
+ - no permission narrowing: `SE-07.PERMISSIONS_WIDENED`;
333
+ - a hidden hop: `PLAN.HANDOFF_MISSING` plus `SE-01`.
334
+
335
+ Live, the three agent-side defects fire the same codes.
336
+ - Live (`scripts\pilot-desk.bat`, Azure OpenAI gpt-4.1), two full runs. Every failure is agent behaviour:
337
+ - when billing fails, it still hands off to claims (SS-09) and opens no case, and triage tells the member "a
338
+ case has been opened" and gives the claim amount (both runs, in at least one of the two billing-failure
339
+ scenarios);
340
+ - when claims fails inside a two-part question, triage tells the member a case was opened when no agent opened
341
+ one (both runs);
342
+ - triage drops the amounts its specialists reported ("your balance and due date have been provided"): every
343
+ run on the two-part question, and 2 of 3 phrasings of the billing question in the first run.
344
+
345
+ **Grader calibration (CE-02)** on a labelled set of 24 output-vs-action items
346
+ ([`pilots/calibration`](pilots/calibration)):
347
+ - The deterministic rules grader scores kappa 0.75 (agreement 0.875). It misses only what needs reading for meaning:
348
+ a denied record described anyway, a change claimed with no action, an approved amount stated as paid.
349
+ - The LLM grader (Azure OpenAI gpt-4.1) scored kappa 1.0, then 0.833 twice, over three runs. When it erred, it
350
+ missed a case "opened" with no action and policy numbers no action returned. Within a run, grading twice gave the
351
+ same verdicts.
352
+
353
+ Also checked:
354
+ - The ported primitives (`wilson`, `mentions`, `value_match`, `args_match`) give the same results as
355
+ the original source functions on the inputs in [the reference outputs](tests/golden/reference/primitives.json).
356
+ - The reference evaluation cases, expressed in the generic model, pass, including the per-stage check counts.
357
+ - 59 synthetic episodes (52 planted with one defect each, covering every stage check, seam and workflow check; 7
358
+ clean): every planted one fails at exactly the planted stage with the planted code; the clean ones pass.
359
+ - The translator converts the full Harbor Mutual sandbox catalog (93 cases) to a catalog that passes schema validation
360
+ (a test that runs when the catalog is present on the machine).
361
+
362
+ ## Security defaults
363
+
364
+ - **In place:** PII is masked before any evidence is written. The default rules cover email addresses,
365
+ phone numbers and secret-named fields (password, token, API key, authorization). You can add your own
366
+ regex rules. Masking never changes the values that verdicts are computed on. `ta gc` applies retention.
367
+ - **Listeners:** the proxy, tap, OTel receiver and console bind to `127.0.0.1` by default; another address needs
368
+ `--allow-remote`. Their control endpoints need a token (`TA_PROXY_TOKEN`, `TA_OTEL_TOKEN` and the sandbox tokens; the
369
+ console makes its own per start). Secrets come only from the environment or `.env`, and are never printed.
370
+ - **MCP:** tool results are marked as untrusted data, because they can quote what an agent said.
371
+ - **Releases:** `.github/workflows/release.yml` publishes to PyPI with trusted publishing (no stored token),
372
+ only when a GitHub Release is published, through the `pypi` environment. Nothing has been published.
373
+
374
+ ## Licence
375
+
376
+ MIT © 2026 Shan Konduru. All names and data in demos and fixtures belong to the fictitious company
377
+ *Harbor Mutual*.